Chromium Code Reviews| Index: components/user_manager/user_image/user_image.cc |
| diff --git a/components/user_manager/user_image/user_image.cc b/components/user_manager/user_image/user_image.cc |
| index 0fb41f9d064ce3cb261f0f59cc1f64a824ce5652..76b5a08d08544d1e9f1da8f2c968f945caa94cbc 100644 |
| --- a/components/user_manager/user_image/user_image.cc |
| +++ b/components/user_manager/user_image/user_image.cc |
| @@ -8,6 +8,8 @@ |
| #include "base/trace_event/trace_event.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| #include "ui/gfx/codec/jpeg_codec.h" |
| +#include "ui/gfx/codec/png_codec.h" |
| +#include "ui/gfx/geometry/size.h" |
| namespace user_manager { |
| @@ -20,39 +22,63 @@ const int kDefaultEncodingQuality = 90; |
| // static |
| scoped_refptr<base::RefCountedBytes> UserImage::Encode( |
| - const SkBitmap& bitmap) { |
| + const SkBitmap& bitmap, |
| + ImageFormat image_format) { |
| TRACE_EVENT2("oobe", "UserImage::Encode", |
| "width", bitmap.width(), "height", bitmap.height()); |
| SkAutoLockPixels lock_bitmap(bitmap); |
| std::vector<unsigned char> output; |
| - if (gfx::JPEGCodec::Encode( |
| - reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)), |
| - gfx::JPEGCodec::FORMAT_SkBitmap, |
| - bitmap.width(), |
| - bitmap.height(), |
| - bitmap.width() * bitmap.bytesPerPixel(), |
| - kDefaultEncodingQuality, &output)) { |
| - return base::RefCountedBytes::TakeVector(&output); |
| + if (image_format == FORMAT_JPEG) { |
| + if (gfx::JPEGCodec::Encode( |
| + reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)), |
|
achuithb
2016/11/30 00:26:48
Does it make sense to have a temporary for this po
satorux1
2016/12/01 07:43:36
good idea. done
|
| + gfx::JPEGCodec::FORMAT_SkBitmap, |
| + bitmap.width(), |
| + bitmap.height(), |
| + bitmap.width() * bitmap.bytesPerPixel(), |
| + kDefaultEncodingQuality, &output)) { |
| + return base::RefCountedBytes::TakeVector(&output); |
| + } |
| + } else if (image_format == FORMAT_PNG) { |
| + if (gfx::PNGCodec::Encode( |
| + reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)), |
| + gfx::PNGCodec::FORMAT_SkBitmap, |
| + gfx::Size(bitmap.width(), bitmap.height()), |
| + bitmap.width() * bitmap.bytesPerPixel(), |
| + false, // discard_transparency |
| + std::vector<gfx::PNGCodec::Comment>(), &output)) { |
| + return base::RefCountedBytes::TakeVector(&output); |
| + } |
| } else { |
| - return nullptr; |
| + LOG(FATAL) << "Invalid image format: " << image_format; |
| } |
| + return nullptr; |
| } |
| // static |
| std::unique_ptr<UserImage> UserImage::CreateAndEncode( |
| - const gfx::ImageSkia& image) { |
| + const gfx::ImageSkia& image, |
| + ImageFormat image_format) { |
| if (image.isNull()) |
| return base::WrapUnique(new UserImage); |
| - scoped_refptr<base::RefCountedBytes> image_bytes = Encode(*image.bitmap()); |
| + scoped_refptr<base::RefCountedBytes> image_bytes = Encode(*image.bitmap(), |
| + image_format); |
| if (image_bytes) { |
| - std::unique_ptr<UserImage> result(new UserImage(image, image_bytes)); |
| + std::unique_ptr<UserImage> result( |
| + new UserImage(image, image_bytes, image_format)); |
| result->MarkAsSafe(); |
| return result; |
| } |
| return base::WrapUnique(new UserImage(image)); |
| } |
| +// static |
| +UserImage::ImageFormat UserImage::ChooseImageFormat(const SkBitmap& bitmap) { |
| + if (SkBitmap::ComputeIsOpaque(bitmap)) |
|
achuithb
2016/11/30 00:26:48
Ternary operator is more compact here, but up to y
satorux1
2016/12/01 07:43:36
Done.
|
| + return FORMAT_JPEG; |
| + return FORMAT_PNG; |
| +} |
| + |
| UserImage::UserImage() { |
| } |
| @@ -61,9 +87,11 @@ UserImage::UserImage(const gfx::ImageSkia& image) |
| } |
| UserImage::UserImage(const gfx::ImageSkia& image, |
| - scoped_refptr<base::RefCountedBytes> image_bytes) |
| + scoped_refptr<base::RefCountedBytes> image_bytes, |
| + ImageFormat image_format) |
| : image_(image), |
| - image_bytes_(image_bytes) { |
| + image_bytes_(image_bytes), |
| + image_format_(image_format) { |
| } |
| UserImage::~UserImage() {} |