Commit ec67cae3 authored by Reza.Zakerinasab's avatar Reza.Zakerinasab Committed by Commit Bot

With {premultiplyAlpha: "none"} ImageBitmap should avoid premul code path

When premultiplyAlpha is set to "none" in ImageBitmapOptions, we should never pass through premul
format in color managed ImageBitmap code.

Bug: 781908, 785313
Change-Id: I3a2fc1664dd57530bdc31694c5f9d61e95a9501b
Reviewed-on: https://chromium-review.googlesource.com/759116
Commit-Queue: Mohammad Reza Zakerinasab <zakerinasab@chromium.org>
Reviewed-by: default avatarJustin Novosad <junov@chromium.org>
Reviewed-by: default avatarFernando Serboncini <fserb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#517858}
parent 0f874ace
......@@ -744,7 +744,7 @@ void ImageData::SwizzleIfNeeded(DataU8ColorType u8_color_type,
bool ImageData::ImageDataInCanvasColorSettings(
CanvasColorSpace canvas_color_space,
CanvasPixelFormat canvas_pixel_format,
std::unique_ptr<uint8_t[]>& converted_pixels,
unsigned char* converted_pixels,
DataU8ColorType u8_color_type,
const IntRect* src_rect) {
if (!data_ && !data_u16_ && !data_f32_)
......@@ -768,8 +768,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
if (crop_rect) {
unsigned char* src_data =
static_cast<unsigned char*>(BufferBase()->Data());
unsigned char* dst_data =
static_cast<unsigned char*>(converted_pixels.get());
unsigned char* dst_data = static_cast<unsigned char*>(converted_pixels);
int src_index = (crop_rect->X() + crop_rect->Y() * width()) * 4;
int dst_index = 0;
int src_row_stride = width() * 4;
......@@ -780,7 +779,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
dst_index += dst_row_stride;
}
} else {
memcpy(converted_pixels.get(), data_->Data(), data_->length());
memcpy(converted_pixels, data_->Data(), data_->length());
}
SwizzleIfNeeded(u8_color_type, crop_rect);
return true;
......@@ -815,8 +814,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
if (crop_rect) {
unsigned char* src_data = static_cast<unsigned char*>(BufferBase()->Data());
unsigned char* dst_data =
static_cast<unsigned char*>(converted_pixels.get());
unsigned char* dst_data = static_cast<unsigned char*>(converted_pixels);
int src_data_type_size =
ImageData::StorageFormatDataSize(color_settings_.storageFormat());
int dst_pixel_size = dst_color_params.BytesPerPixel();
......@@ -837,7 +835,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
dst_index += dst_row_stride;
}
} else {
conversion_result = xform->apply(dst_color_format, converted_pixels.get(),
conversion_result = xform->apply(dst_color_format, converted_pixels,
src_color_format, src_data, size_.Area(),
SkAlphaType::kUnpremul_SkAlphaType);
}
......
......@@ -140,7 +140,7 @@ class CORE_EXPORT ImageData final : public ScriptWrappable,
// used to create an ImageBitmap, kN32ColorType should be used.
bool ImageDataInCanvasColorSettings(CanvasColorSpace,
CanvasPixelFormat,
std::unique_ptr<uint8_t[]>&,
unsigned char* converted_pixels,
DataU8ColorType,
const IntRect* = nullptr);
......
......@@ -245,7 +245,7 @@ TEST_F(ImageDataTest, TestGetImageDataInCanvasColorSettings) {
// Convert the image data to the color settings of the canvas.
EXPECT_TRUE(image_data->ImageDataInCanvasColorSettings(
canvas_color_spaces[k], canvas_pixel_formats[k],
pixels_converted_in_image_data, kRGBAColorType));
pixels_converted_in_image_data.get(), kRGBAColorType));
// Compare the converted pixels
ColorCorrectionTestUtils::CompareColorCorrectedPixels(
......
......@@ -134,6 +134,7 @@ class CORE_EXPORT ImageBitmap final : public ScriptWrappable,
bool premultiply_alpha = true;
bool should_scale_input = false;
bool has_color_space_conversion = false;
bool source_is_unpremul = false;
unsigned resize_width = 0;
unsigned resize_height = 0;
IntRect crop_rect;
......
......@@ -1757,8 +1757,9 @@ void BaseRenderingContext2D::putImageData(ImageData* data,
unsigned data_length =
data->Size().Area() * context_color_params.BytesPerPixel();
std::unique_ptr<uint8_t[]> converted_pixels(new uint8_t[data_length]);
if (data->ImageDataInCanvasColorSettings(
ColorSpace(), PixelFormat(), converted_pixels, kRGBAColorType)) {
if (data->ImageDataInCanvasColorSettings(ColorSpace(), PixelFormat(),
converted_pixels.get(),
kRGBAColorType)) {
buffer->PutByteArray(converted_pixels.get(),
IntSize(data->width(), data->height()), source_rect,
IntPoint(dest_offset));
......
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