Commit 9a05882d authored by Reza.Zakerinasab's avatar Reza.Zakerinasab Committed by Commit Bot

Fix the crash in ImageDataInCanvasColorSettings

Passing an ImageData that is created from U16/F32 data but does not
have a color settings to ImageDataInCanvasColorSettings results
in a crash. This change temporarily fixes this until the proper color
space (extended-srgb) is provided.

Bug: 779419
Change-Id: I491fa86f53b73473cba514512e64de69db49fc91
Reviewed-on: https://chromium-review.googlesource.com/743804Reviewed-by: default avatarFernando Serboncini <fserb@chromium.org>
Reviewed-by: default avatarJustin Novosad <junov@chromium.org>
Commit-Queue: Mohammad Reza Zakerinasab <zakerinasab@chromium.org>
Cr-Commit-Position: refs/heads/master@{#512565}
parent 41e6d26e
...@@ -18,8 +18,8 @@ function checkDataTypeAgainstStorageFormat(data, storageFormat) { ...@@ -18,8 +18,8 @@ function checkDataTypeAgainstStorageFormat(data, storageFormat) {
} }
function checkColorSettings(colorSettings, colorSpace, storageFormat) { function checkColorSettings(colorSettings, colorSpace, storageFormat) {
assert_equals(colorSpace, colorSettings.colorSpace); assert_equals(colorSettings.colorSpace, colorSpace);
assert_equals(storageFormat, colorSettings.storageFormat); assert_equals(colorSettings.storageFormat, storageFormat);
} }
function runTest(colorSettings, expectedColorSettings) { function runTest(colorSettings, expectedColorSettings) {
...@@ -48,9 +48,9 @@ function runTest(colorSettings, expectedColorSettings) { ...@@ -48,9 +48,9 @@ function runTest(colorSettings, expectedColorSettings) {
} }
var testScenarios = [ var testScenarios = [
["Test default color settings: {undefined, undefined} -> {legacy-srgb, uint8}", {}, {colorSpace: "legacy-srgb", storageFormat: "uint8"}], ["Test default color settings: {undefined, undefined} -> {srgb, uint8}", {}, {colorSpace: "srgb", storageFormat: "uint8"}],
["Test default color space: {undefined, float32} -> {legacy-srgb, float32}", {storageFormat: "float32"}, {colorSpace: "legacy-srgb", storageFormat: "float32"}], ["Test default color space: {undefined, float32} -> {srgb, float32}", {storageFormat: "float32"}, {colorSpace: "srgb", storageFormat: "float32"}],
["Test default storage format: {srgb, undefined} -> {srgb, uint8}", {colorSpace: "srgb"}, {colorSpace: "srgb", storageFormat: "uint8"}], ["Test default storage format: {srgb, undefined} -> {srgb, uint8}", {colorSpace: "srgb"}, {colorSpace: "srgb", storageFormat: "uint8"}],
["Test color settings: {srgb, uint8}", {colorSpace: "srgb", storageFormat: "uint8"}, {colorSpace: "srgb", storageFormat: "uint8"}], ["Test color settings: {srgb, uint8}", {colorSpace: "srgb", storageFormat: "uint8"}, {colorSpace: "srgb", storageFormat: "uint8"}],
......
<!DOCTYPE HTML>
<script src="../../../../../resources/testharness.js"></script>
<script src="../../../../../resources/testharnessreport.js"></script>
<script>
test(function() {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d',
{})
var dataLinearRGB = new Float32Array(4);
var imageData = ctx.createImageData(dataLinearRGB, 1, 1,
{});
ctx.putImageData(imageData, 5, 5);
var data = ctx.getImageData(5,5,1,1).dataUnion;
}, "Putting a float-32 ImageData with no color settings on a context 2D should not crash.");
test(function() {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d',
{})
var dataLinearRGB = new Uint16Array(4);
var imageData = ctx.createImageData(dataLinearRGB, 1, 1,
{});
ctx.putImageData(imageData, 5, 5);
var data = ctx.getImageData(5,5,1,1).dataUnion;
}, "Putting a uint-16 ImageData with no color settings on a context 2D should not crash.");
</script>
\ No newline at end of file
...@@ -733,7 +733,7 @@ bool ImageData::ImageDataInCanvasColorSettings( ...@@ -733,7 +733,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
if (canvas_pixel_format == kF16CanvasPixelFormat) if (canvas_pixel_format == kF16CanvasPixelFormat)
dst_color_format = SkColorSpaceXform::ColorFormat::kRGBA_F16_ColorFormat; dst_color_format = SkColorSpaceXform::ColorFormat::kRGBA_F16_ColorFormat;
if (!src_color_space.get() && !dst_color_space.get()) { if (!src_color_space.get() && !dst_color_space.get() && data_) {
memcpy(converted_pixels.get(), data_->Data(), data_->length()); memcpy(converted_pixels.get(), data_->Data(), data_->length());
return true; return true;
} }
...@@ -785,6 +785,13 @@ ImageData::ImageData(const IntSize& size, ...@@ -785,6 +785,13 @@ ImageData::ImageData(const IntSize& size,
ImageDataStorageFormat storage_format = ImageDataStorageFormat storage_format =
GetImageDataStorageFormat(color_settings_.storageFormat()); GetImageDataStorageFormat(color_settings_.storageFormat());
// TODO (zakerinasab): crbug.com/779570
// The default color space for ImageData with U16/F32 data should be
// extended-srgb color space. It is temporarily set to linear-rgb, which is
// not correct, but fixes crbug.com/779419.
if (color_settings_.colorSpace() == kLegacyCanvasColorSpaceName)
color_settings_.setColorSpace(kSRGBCanvasColorSpaceName);
switch (storage_format) { switch (storage_format) {
case kUint8ClampedArrayStorageFormat: case kUint8ClampedArrayStorageFormat:
DCHECK(data->GetType() == DCHECK(data->GetType() ==
......
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