1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/login/users/avatar/user_image.h" 6 7#include "base/debug/trace_event.h" 8#include "third_party/skia/include/core/SkBitmap.h" 9#include "ui/gfx/codec/jpeg_codec.h" 10 11namespace chromeos { 12 13namespace { 14 15// Default quality for encoding user images. 16const int kDefaultEncodingQuality = 90; 17 18bool IsAnimatedImage(const UserImage::RawImage& data) { 19 const char kGIFStamp[] = "GIF"; 20 const size_t kGIFStampLength = sizeof(kGIFStamp) - 1; 21 22 if (data.size() >= kGIFStampLength && 23 memcmp(&data[0], kGIFStamp, kGIFStampLength) == 0) { 24 return true; 25 } 26 return false; 27} 28 29bool EncodeImageSkia(const gfx::ImageSkia& image, 30 std::vector<unsigned char>* output) { 31 TRACE_EVENT2("oobe", "EncodeImageSkia", 32 "width", image.width(), "height", image.height()); 33 if (image.isNull()) 34 return false; 35 const SkBitmap& bitmap = *image.bitmap(); 36 SkAutoLockPixels lock_image(bitmap); 37 return gfx::JPEGCodec::Encode( 38 reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)), 39 gfx::JPEGCodec::FORMAT_SkBitmap, 40 bitmap.width(), 41 bitmap.height(), 42 bitmap.width() * bitmap.bytesPerPixel(), 43 kDefaultEncodingQuality, output); 44} 45 46} // namespace 47 48// static 49UserImage UserImage::CreateAndEncode(const gfx::ImageSkia& image) { 50 RawImage raw_image; 51 if (EncodeImageSkia(image, &raw_image)) { 52 UserImage result(image, raw_image); 53 result.MarkAsSafe(); 54 return result; 55 } 56 return UserImage(image); 57} 58 59UserImage::UserImage() 60 : has_raw_image_(false), 61 has_animated_image_(false), 62 is_safe_format_(false) { 63} 64 65UserImage::UserImage(const gfx::ImageSkia& image) 66 : image_(image), 67 has_raw_image_(false), 68 has_animated_image_(false), 69 is_safe_format_(false) { 70} 71 72UserImage::UserImage(const gfx::ImageSkia& image, 73 const RawImage& raw_image) 74 : image_(image), 75 has_raw_image_(false), 76 has_animated_image_(false), 77 is_safe_format_(false) { 78 if (IsAnimatedImage(raw_image)) { 79 has_animated_image_ = true; 80 animated_image_ = raw_image; 81 if (EncodeImageSkia(image_, &raw_image_)) { 82 has_raw_image_ = true; 83 MarkAsSafe(); 84 } 85 } else { 86 has_raw_image_ = true; 87 raw_image_ = raw_image; 88 } 89} 90 91UserImage::~UserImage() {} 92 93void UserImage::DiscardRawImage() { 94 RawImage().swap(raw_image_); // Clear |raw_image_|. 95} 96 97void UserImage::MarkAsSafe() { 98 is_safe_format_ = true; 99} 100 101} // namespace chromeos 102