Commit 56bd680c authored by Christopher Cameron's avatar Christopher Cameron Committed by Commit Bot

Update ImageBitmap to use SkPixmap::readPixels

The helper function ImageData::ImageDataInCanvasColorSettings is used
to convert between pixel formats and color spaces, using SkCMS. A
simpler and more robust way to do this is to call SkPixmap::readPixels,
specifying the desired format.

ImageBitmap::ImageBitmap does this to create a bitmap from ImageData.

R=yiyix
TBR=fserb

Bug: 1150969
Change-Id: I23e37d74d0a3519fafc9860e6b932a8fdb1a0e4c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2551225
Commit-Queue: ccameron <ccameron@chromium.org>
Reviewed-by: default avatarYi Xu <yiyix@chromium.org>
Cr-Commit-Position: refs/heads/master@{#829964}
parent 02de3d5b
......@@ -784,32 +784,25 @@ ImageBitmap::ImageBitmap(ImageData* data,
}
// Copy / color convert the pixels
size_t image_pixels_size;
if (!base::CheckMul(parsed_options.color_params.BytesPerPixel(),
static_cast<unsigned>(src_rect.Width()),
static_cast<unsigned>(src_rect.Height()))
.AssignIfValid(&image_pixels_size)) {
SkImageInfo info = SkImageInfo::Make(
src_rect.Width(), src_rect.Height(),
parsed_options.color_params.GetSkColorType(),
parsed_options.premultiply_alpha ? kPremul_SkAlphaType
: kUnpremul_SkAlphaType,
parsed_options.color_params.GetSkColorSpace());
size_t image_pixels_size = info.computeMinByteSize();
if (SkImageInfo::ByteSizeOverflowed(image_pixels_size))
return;
}
sk_sp<SkData> image_pixels = TryAllocateSkData(image_pixels_size);
if (!image_pixels)
return;
if (!data->ImageDataInCanvasColorSettings(
parsed_options.color_params.ColorSpace(),
parsed_options.color_params.PixelFormat(),
static_cast<unsigned char*>(image_pixels->writable_data()),
kN32ColorType, &src_rect,
parsed_options.premultiply_alpha ? kPremultiplyAlpha
: kUnpremultiplyAlpha))
if (!data->GetSkPixmap().readPixels(info, image_pixels->writable_data(),
info.minRowBytes(), src_rect.X(),
src_rect.Y())) {
return;
}
// Create Image object
SkImageInfo info = SkImageInfo::Make(
src_rect.Width(), src_rect.Height(),
parsed_options.color_params.GetSkColorType(),
parsed_options.premultiply_alpha ? kPremul_SkAlphaType
: kUnpremul_SkAlphaType,
parsed_options.color_params.GetSkColorSpace());
image_ = StaticBitmapImage::Create(std::move(image_pixels), info);
if (!image_)
return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment