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, ...@@ -744,7 +744,7 @@ void ImageData::SwizzleIfNeeded(DataU8ColorType u8_color_type,
bool ImageData::ImageDataInCanvasColorSettings( bool ImageData::ImageDataInCanvasColorSettings(
CanvasColorSpace canvas_color_space, CanvasColorSpace canvas_color_space,
CanvasPixelFormat canvas_pixel_format, CanvasPixelFormat canvas_pixel_format,
std::unique_ptr<uint8_t[]>& converted_pixels, unsigned char* converted_pixels,
DataU8ColorType u8_color_type, DataU8ColorType u8_color_type,
const IntRect* src_rect) { const IntRect* src_rect) {
if (!data_ && !data_u16_ && !data_f32_) if (!data_ && !data_u16_ && !data_f32_)
...@@ -768,8 +768,7 @@ bool ImageData::ImageDataInCanvasColorSettings( ...@@ -768,8 +768,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
if (crop_rect) { if (crop_rect) {
unsigned char* src_data = unsigned char* src_data =
static_cast<unsigned char*>(BufferBase()->Data()); static_cast<unsigned char*>(BufferBase()->Data());
unsigned char* dst_data = unsigned char* dst_data = static_cast<unsigned char*>(converted_pixels);
static_cast<unsigned char*>(converted_pixels.get());
int src_index = (crop_rect->X() + crop_rect->Y() * width()) * 4; int src_index = (crop_rect->X() + crop_rect->Y() * width()) * 4;
int dst_index = 0; int dst_index = 0;
int src_row_stride = width() * 4; int src_row_stride = width() * 4;
...@@ -780,7 +779,7 @@ bool ImageData::ImageDataInCanvasColorSettings( ...@@ -780,7 +779,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
dst_index += dst_row_stride; dst_index += dst_row_stride;
} }
} else { } else {
memcpy(converted_pixels.get(), data_->Data(), data_->length()); memcpy(converted_pixels, data_->Data(), data_->length());
} }
SwizzleIfNeeded(u8_color_type, crop_rect); SwizzleIfNeeded(u8_color_type, crop_rect);
return true; return true;
...@@ -815,8 +814,7 @@ bool ImageData::ImageDataInCanvasColorSettings( ...@@ -815,8 +814,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
if (crop_rect) { if (crop_rect) {
unsigned char* src_data = static_cast<unsigned char*>(BufferBase()->Data()); unsigned char* src_data = static_cast<unsigned char*>(BufferBase()->Data());
unsigned char* dst_data = unsigned char* dst_data = static_cast<unsigned char*>(converted_pixels);
static_cast<unsigned char*>(converted_pixels.get());
int src_data_type_size = int src_data_type_size =
ImageData::StorageFormatDataSize(color_settings_.storageFormat()); ImageData::StorageFormatDataSize(color_settings_.storageFormat());
int dst_pixel_size = dst_color_params.BytesPerPixel(); int dst_pixel_size = dst_color_params.BytesPerPixel();
...@@ -837,7 +835,7 @@ bool ImageData::ImageDataInCanvasColorSettings( ...@@ -837,7 +835,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
dst_index += dst_row_stride; dst_index += dst_row_stride;
} }
} else { } 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(), src_color_format, src_data, size_.Area(),
SkAlphaType::kUnpremul_SkAlphaType); SkAlphaType::kUnpremul_SkAlphaType);
} }
......
...@@ -140,7 +140,7 @@ class CORE_EXPORT ImageData final : public ScriptWrappable, ...@@ -140,7 +140,7 @@ class CORE_EXPORT ImageData final : public ScriptWrappable,
// used to create an ImageBitmap, kN32ColorType should be used. // used to create an ImageBitmap, kN32ColorType should be used.
bool ImageDataInCanvasColorSettings(CanvasColorSpace, bool ImageDataInCanvasColorSettings(CanvasColorSpace,
CanvasPixelFormat, CanvasPixelFormat,
std::unique_ptr<uint8_t[]>&, unsigned char* converted_pixels,
DataU8ColorType, DataU8ColorType,
const IntRect* = nullptr); const IntRect* = nullptr);
......
...@@ -245,7 +245,7 @@ TEST_F(ImageDataTest, TestGetImageDataInCanvasColorSettings) { ...@@ -245,7 +245,7 @@ TEST_F(ImageDataTest, TestGetImageDataInCanvasColorSettings) {
// Convert the image data to the color settings of the canvas. // Convert the image data to the color settings of the canvas.
EXPECT_TRUE(image_data->ImageDataInCanvasColorSettings( EXPECT_TRUE(image_data->ImageDataInCanvasColorSettings(
canvas_color_spaces[k], canvas_pixel_formats[k], 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 // Compare the converted pixels
ColorCorrectionTestUtils::CompareColorCorrectedPixels( ColorCorrectionTestUtils::CompareColorCorrectedPixels(
......
...@@ -134,6 +134,7 @@ class CORE_EXPORT ImageBitmap final : public ScriptWrappable, ...@@ -134,6 +134,7 @@ class CORE_EXPORT ImageBitmap final : public ScriptWrappable,
bool premultiply_alpha = true; bool premultiply_alpha = true;
bool should_scale_input = false; bool should_scale_input = false;
bool has_color_space_conversion = false; bool has_color_space_conversion = false;
bool source_is_unpremul = false;
unsigned resize_width = 0; unsigned resize_width = 0;
unsigned resize_height = 0; unsigned resize_height = 0;
IntRect crop_rect; IntRect crop_rect;
......
...@@ -1757,8 +1757,9 @@ void BaseRenderingContext2D::putImageData(ImageData* data, ...@@ -1757,8 +1757,9 @@ void BaseRenderingContext2D::putImageData(ImageData* data,
unsigned data_length = unsigned data_length =
data->Size().Area() * context_color_params.BytesPerPixel(); data->Size().Area() * context_color_params.BytesPerPixel();
std::unique_ptr<uint8_t[]> converted_pixels(new uint8_t[data_length]); std::unique_ptr<uint8_t[]> converted_pixels(new uint8_t[data_length]);
if (data->ImageDataInCanvasColorSettings( if (data->ImageDataInCanvasColorSettings(ColorSpace(), PixelFormat(),
ColorSpace(), PixelFormat(), converted_pixels, kRGBAColorType)) { converted_pixels.get(),
kRGBAColorType)) {
buffer->PutByteArray(converted_pixels.get(), buffer->PutByteArray(converted_pixels.get(),
IntSize(data->width(), data->height()), source_rect, IntSize(data->width(), data->height()), source_rect,
IntPoint(dest_offset)); 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