| 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..23c763ff7334af53e18f996c5554335b64efb5a2 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,62 @@ 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);
|
| + auto* bitmap_data = reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0));
|
| + if (image_format == FORMAT_JPEG) {
|
| + if (gfx::JPEGCodec::Encode(
|
| + bitmap_data,
|
| + 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(
|
| + bitmap_data,
|
| + 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) {
|
| + return SkBitmap::ComputeIsOpaque(bitmap) ? FORMAT_JPEG : FORMAT_PNG;
|
| +}
|
| +
|
| UserImage::UserImage() {
|
| }
|
|
|
| @@ -61,9 +86,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() {}
|
|
|