Commit d1b52ef7 authored by yiyix's avatar yiyix Committed by Chromium LUCI CQ

Change createImageData to use imageData color setting

In the initial implementation, if createImageData(ImageData) is called,
image will be convert to image data using the image setting of the
canvas. I updated the default behavior to use the original color setting
from the imageData.

Bug:1118182

Change-Id: I8ed5932faa1678969825a958852b309492b52c1c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2582891Reviewed-by: default avatarccameron <ccameron@chromium.org>
Commit-Queue: Yi Xu <yiyix@chromium.org>
Cr-Commit-Position: refs/heads/master@{#836403}
parent eff5ce7f
...@@ -1565,21 +1565,11 @@ bool BaseRenderingContext2D::ComputeDirtyRect( ...@@ -1565,21 +1565,11 @@ bool BaseRenderingContext2D::ComputeDirtyRect(
return true; return true;
} }
ImageDataColorSettings*
BaseRenderingContext2D::GetColorSettingsAsImageDataColorSettings() const {
ImageDataColorSettings* color_settings = ImageDataColorSettings::Create();
color_settings->setColorSpace(ColorSpaceAsString());
if (PixelFormat() == CanvasPixelFormat::kF16)
color_settings->setStorageFormat(kFloat32ArrayStorageFormatName);
return color_settings;
}
ImageData* BaseRenderingContext2D::createImageData( ImageData* BaseRenderingContext2D::createImageData(
ImageData* image_data, ImageData* image_data,
ExceptionState& exception_state) const { ExceptionState& exception_state) const {
ImageData* result = nullptr; ImageData* result = nullptr;
ImageDataColorSettings* color_settings = ImageDataColorSettings* color_settings = image_data->getColorSettings();
GetColorSettingsAsImageDataColorSettings();
result = ImageData::Create(image_data->Size(), color_settings); result = ImageData::Create(image_data->Size(), color_settings);
if (!result) if (!result)
exception_state.ThrowRangeError("Out of memory at ImageData creation"); exception_state.ThrowRangeError("Out of memory at ImageData creation");
......
...@@ -491,8 +491,6 @@ class MODULES_EXPORT BaseRenderingContext2D : public GarbageCollectedMixin, ...@@ -491,8 +491,6 @@ class MODULES_EXPORT BaseRenderingContext2D : public GarbageCollectedMixin,
// such as tainting from a filter applied to the canvas. // such as tainting from a filter applied to the canvas.
void SetOriginTaintedByContent(); void SetOriginTaintedByContent();
ImageDataColorSettings* GetColorSettingsAsImageDataColorSettings() const;
void PutByteArray(const SkPixmap& source, void PutByteArray(const SkPixmap& source,
const IntRect& source_rect, const IntRect& source_rect,
const IntPoint& dest_point); const IntPoint& dest_point);
......
...@@ -6,16 +6,11 @@ ...@@ -6,16 +6,11 @@
var xWidth = xHeight = 10; var xWidth = xHeight = 10;
function checkImageData(canvasColorSettings, imageData) { function checkImageData(expectedColorSettings, imageData) {
var imageDataColorSettings = imageData.getColorSettings(); var imageDataColorSettings = imageData.getColorSettings();
assert_equals(canvasColorSettings.colorSpace, imageDataColorSettings.colorSpace); assert_equals(expectedColorSettings.colorSpace, imageDataColorSettings.colorSpace);
if (canvasColorSettings.pixelFormat == "uint8") { assert_equals(expectedColorSettings.storageFormat, imageDataColorSettings.storageFormat);
assert_equals("uint8", imageDataColorSettings.storageFormat); assert_equals(imageData.data.length, 4 * xWidth * xHeight);
assert_equals(imageData.data.length, 4 * xWidth * xHeight);
} else {
assert_equals("float32", imageDataColorSettings.storageFormat);
assert_equals(imageData.data.length, 4 * xWidth * xHeight);
}
} }
// Test createImageData when the canvas is color managed // Test createImageData when the canvas is color managed
...@@ -26,10 +21,10 @@ function runTestCreateImageData(canvasColorSettings, imageSetting) { ...@@ -26,10 +21,10 @@ function runTestCreateImageData(canvasColorSettings, imageSetting) {
aCanvas.height = xHeight; aCanvas.height = xHeight;
var ctx = aCanvas.getContext('2d', canvasColorSettings); var ctx = aCanvas.getContext('2d', canvasColorSettings);
var imageData = ctx.createImageData(xWidth, xHeight, imageSetting); var imageData = ctx.createImageData(xWidth, xHeight, imageSetting);
checkImageData(canvasColorSettings, imageData); checkImageData(imageSetting, imageData);
imageData = ctx.createImageData(helperImageData); imageData = ctx.createImageData(helperImageData);
checkImageData(canvasColorSettings, imageData); checkImageData(imageData.getColorSettings(), imageData);
} }
var testScenariosCreateImageData = [ var testScenariosCreateImageData = [
...@@ -58,7 +53,7 @@ function runTestGetImageData(canvasColorSettings, imageSetting) { ...@@ -58,7 +53,7 @@ function runTestGetImageData(canvasColorSettings, imageSetting) {
aCanvas.height = xHeight; aCanvas.height = xHeight;
var ctx = aCanvas.getContext('2d', canvasColorSettings); var ctx = aCanvas.getContext('2d', canvasColorSettings);
var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting); var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting);
checkImageData(canvasColorSettings, imageData); checkImageData(imageSetting, imageData);
} }
var testScenariosGetImageData = [ var testScenariosGetImageData = [
......
...@@ -39,14 +39,12 @@ function testPixels(actualData, expectedPixels, tolerance) ...@@ -39,14 +39,12 @@ function testPixels(actualData, expectedPixels, tolerance)
} }
} }
function checkImageDataColorSettings(canvasColorSettings, imageData) { function checkImageDataColorSettings(expectColorSetting, imageData) {
var imageDataColorSettings = imageData.getColorSettings(); var imageDataColorSettings = imageData.getColorSettings();
assert_equals(canvasColorSettings.colorSpace, assert_equals(expectColorSetting.colorSpace,
imageDataColorSettings.colorSpace); imageDataColorSettings.colorSpace);
if (canvasColorSettings.pixelFormat == "uint8") assert_equals(expectColorSetting.storageFormat,
assert_equals("uint8", imageDataColorSettings.storageFormat); imageDataColorSettings.storageFormat);
else
assert_equals("float32", imageDataColorSettings.storageFormat);
} }
function checkImageDataColorValues(canvasColorSettings, imageData, isBlank = '', function checkImageDataColorValues(canvasColorSettings, imageData, isBlank = '',
...@@ -133,7 +131,7 @@ function runTestCreateImageDataWH(canvasColorSettings, imageSetting) { ...@@ -133,7 +131,7 @@ function runTestCreateImageDataWH(canvasColorSettings, imageSetting) {
var canvas = initializeColorManagedCanvas(canvasColorSettings); var canvas = initializeColorManagedCanvas(canvasColorSettings);
var ctx = canvas.getContext('2d'); var ctx = canvas.getContext('2d');
var imageData = ctx.createImageData(xWidth, xHeight, imageSetting); var imageData = ctx.createImageData(xWidth, xHeight, imageSetting);
checkImageDataColorSettings(canvasColorSettings, imageData); checkImageDataColorSettings(imageSetting, imageData);
} }
var testScenariosCreateImageDataWH = []; var testScenariosCreateImageDataWH = [];
...@@ -164,7 +162,7 @@ function runTestGetImageDataXYWH(canvasColorSettings, imageSetting) { ...@@ -164,7 +162,7 @@ function runTestGetImageDataXYWH(canvasColorSettings, imageSetting) {
var canvas = initializeColorManagedCanvas(canvasColorSettings); var canvas = initializeColorManagedCanvas(canvasColorSettings);
var ctx = canvas.getContext('2d'); var ctx = canvas.getContext('2d');
var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting); var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting);
checkImageDataColorSettings(canvasColorSettings, imageData); checkImageDataColorSettings(imageSetting, imageData);
checkImageDataColorValues(canvasColorSettings, imageData); checkImageDataColorValues(canvasColorSettings, imageData);
} }
...@@ -201,7 +199,7 @@ function runTestPutImageDataDxDy(canvasColorSettings, imageData, imageSetting) { ...@@ -201,7 +199,7 @@ function runTestPutImageDataDxDy(canvasColorSettings, imageData, imageSetting) {
pixelFormat: canvasColorSettings.pixelFormat}); pixelFormat: canvasColorSettings.pixelFormat});
ctx.putImageData(imageData, xWidth/2, xHeight/2); ctx.putImageData(imageData, xWidth/2, xHeight/2);
var ctxImageData = ctx.getImageData(xWidth/2, xHeight/2, xWidth, xHeight, imageSetting); var ctxImageData = ctx.getImageData(xWidth/2, xHeight/2, xWidth, xHeight, imageSetting);
checkImageDataColorSettings(canvasColorSettings, ctxImageData); checkImageDataColorSettings(imageSetting, ctxImageData);
checkImageDataColorValues(canvasColorSettings, ctxImageData, 'noBlank', checkImageDataColorValues(canvasColorSettings, ctxImageData, 'noBlank',
xWidth, xHeight, 'isWCG_U8toSRGB_U8'); xWidth, xHeight, 'isWCG_U8toSRGB_U8');
} }
...@@ -244,7 +242,7 @@ function runTestCreateImageDataFromImageData(canvasColorSettings, imageData) { ...@@ -244,7 +242,7 @@ function runTestCreateImageDataFromImageData(canvasColorSettings, imageData) {
{colorSpace: canvasColorSettings.colorSpace, {colorSpace: canvasColorSettings.colorSpace,
pixelFormat: canvasColorSettings.pixelFormat}); pixelFormat: canvasColorSettings.pixelFormat});
var ctxImageData = ctx.createImageData(imageData); var ctxImageData = ctx.createImageData(imageData);
checkImageDataColorSettings(canvasColorSettings, ctxImageData); checkImageDataColorSettings(imageData.getColorSettings(), ctxImageData);
checkImageDataColorValues(canvasColorSettings, ctxImageData, 'isBlank'); checkImageDataColorValues(canvasColorSettings, ctxImageData, 'isBlank');
} }
......
...@@ -6,16 +6,11 @@ ...@@ -6,16 +6,11 @@
var xWidth = xHeight = 10; var xWidth = xHeight = 10;
function checkImageData(canvasColorSettings, imageData) { function checkImageData(expectedColorSetting, imageData) {
var imageDataColorSettings = imageData.getColorSettings(); var imageDataColorSettings = imageData.getColorSettings();
assert_equals(canvasColorSettings.colorSpace, imageDataColorSettings.colorSpace); assert_equals(expectedColorSetting.colorSpace, imageDataColorSettings.colorSpace);
if (canvasColorSettings.pixelFormat == "uint8") { assert_equals(expectedColorSetting.storageFormat, imageDataColorSettings.storageFormat);
assert_equals("uint8", imageDataColorSettings.storageFormat); assert_equals(imageData.data.length, 4 * xWidth * xHeight);
assert_equals(imageData.data.length, 4 * xWidth * xHeight);
} else {
assert_equals("float32", imageDataColorSettings.storageFormat);
assert_equals(imageData.data.length, 4 * xWidth * xHeight);
}
} }
function getImageSetting(canvasColorSettings) { function getImageSetting(canvasColorSettings) {
...@@ -38,10 +33,10 @@ function runTestCreateImageData(canvasColorSettings) { ...@@ -38,10 +33,10 @@ function runTestCreateImageData(canvasColorSettings) {
var ctx = aCanvas.getContext('2d', canvasColorSettings); var ctx = aCanvas.getContext('2d', canvasColorSettings);
var imageSetting = getImageSetting(canvasColorSettings); var imageSetting = getImageSetting(canvasColorSettings);
var imageData = ctx.createImageData(xWidth, xHeight, imageSetting); var imageData = ctx.createImageData(xWidth, xHeight, imageSetting);
checkImageData(canvasColorSettings, imageData); checkImageData(imageSetting, imageData);
imageData = ctx.createImageData(helperImageData); imageData = ctx.createImageData(helperImageData);
checkImageData(canvasColorSettings, imageData); checkImageData(helperImageData.getColorSettings(), imageData);
} }
var testScenariosCreateImageData = [ var testScenariosCreateImageData = [
...@@ -65,7 +60,7 @@ function runTestGetImageData(canvasColorSettings) { ...@@ -65,7 +60,7 @@ function runTestGetImageData(canvasColorSettings) {
var ctx = aCanvas.getContext('2d', canvasColorSettings); var ctx = aCanvas.getContext('2d', canvasColorSettings);
var imageSetting = getImageSetting(canvasColorSettings); var imageSetting = getImageSetting(canvasColorSettings);
var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting); var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting);
checkImageData(canvasColorSettings, imageData); checkImageData(imageSetting, imageData);
} }
var testScenariosGetImageData = [ var testScenariosGetImageData = [
......
...@@ -68,9 +68,9 @@ function getImageSetting(canvasColorSettings) { ...@@ -68,9 +68,9 @@ function getImageSetting(canvasColorSettings) {
return imageSetting; return imageSetting;
} }
function checkImageDataColorSettings(canvasColorSettings, imageData) { function checkImageDataColorSettings(expectedColorSetting, imageData) {
var imageDataColorSettings = imageData.getColorSettings(); var imageDataColorSettings = imageData.getColorSettings();
assert_equals(canvasColorSettings.colorSpace, assert_equals(expectedColorSetting.colorSpace,
imageDataColorSettings.colorSpace); imageDataColorSettings.colorSpace);
// According to the proposal for canvas color management // According to the proposal for canvas color management
// (github.com/WICG/canvas-color-space/blob/master/CanvasColorSpaceProposal.md), // (github.com/WICG/canvas-color-space/blob/master/CanvasColorSpaceProposal.md),
...@@ -78,10 +78,8 @@ function checkImageDataColorSettings(canvasColorSettings, imageData) { ...@@ -78,10 +78,8 @@ function checkImageDataColorSettings(canvasColorSettings, imageData) {
// However, the current implementation in Chromium only supports "uint8" and // However, the current implementation in Chromium only supports "uint8" and
// "float16", which are mapped to "uint8" and "float32" storage formats for // "float16", which are mapped to "uint8" and "float32" storage formats for
// ImageData, respectively. // ImageData, respectively.
if (canvasColorSettings.pixelFormat == "uint8") assert_equals(expectedColorSetting.storageFormat,
assert_equals("uint8", imageDataColorSettings.storageFormat); imageDataColorSettings.storageFormat);
else
assert_equals("float32", imageDataColorSettings.storageFormat);
} }
function checkImageDataColorValues(canvasColorSettings, imageData, isBlank = '', function checkImageDataColorValues(canvasColorSettings, imageData, isBlank = '',
...@@ -226,7 +224,7 @@ function runTestCreateImageDataWH(canvasColorSettings) { ...@@ -226,7 +224,7 @@ function runTestCreateImageDataWH(canvasColorSettings) {
var ctx = canvas.getContext('2d'); var ctx = canvas.getContext('2d');
var imageSetting = getImageSetting(canvasColorSettings) var imageSetting = getImageSetting(canvasColorSettings)
var imageData = ctx.createImageData(xWidth, xHeight, imageSetting); var imageData = ctx.createImageData(xWidth, xHeight, imageSetting);
checkImageDataColorSettings(canvasColorSettings, imageData); checkImageDataColorSettings(imageSetting, imageData);
} }
var testScenariosCreateImageDataWH = []; var testScenariosCreateImageDataWH = [];
...@@ -249,7 +247,7 @@ function runTestGetImageDataXYWH(canvasColorSettings) { ...@@ -249,7 +247,7 @@ function runTestGetImageDataXYWH(canvasColorSettings) {
var ctx = canvas.getContext('2d'); var ctx = canvas.getContext('2d');
var imageSetting = getImageSetting(canvasColorSettings) var imageSetting = getImageSetting(canvasColorSettings)
var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting); var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting);
checkImageDataColorSettings(canvasColorSettings, imageData); checkImageDataColorSettings(imageSetting, imageData);
checkImageDataColorValues(canvasColorSettings, imageData); checkImageDataColorValues(canvasColorSettings, imageData);
} }
...@@ -278,7 +276,7 @@ function runTestPutImageDataDxDy(canvasColorSettings, imageData) { ...@@ -278,7 +276,7 @@ function runTestPutImageDataDxDy(canvasColorSettings, imageData) {
var imageSetting = getImageSetting(canvasColorSettings); var imageSetting = getImageSetting(canvasColorSettings);
ctx.putImageData(imageData, xWidth/2, xHeight/2); ctx.putImageData(imageData, xWidth/2, xHeight/2);
var ctxImageData = ctx.getImageData(xWidth/2, xHeight/2, xWidth, xHeight, imageSetting); var ctxImageData = ctx.getImageData(xWidth/2, xHeight/2, xWidth, xHeight, imageSetting);
checkImageDataColorSettings(canvasColorSettings, ctxImageData); checkImageDataColorSettings(imageSetting, ctxImageData);
checkImageDataColorValues(canvasColorSettings, ctxImageData, 'noBlank', checkImageDataColorValues(canvasColorSettings, ctxImageData, 'noBlank',
xWidth, xHeight, 'isWCG_U8toSRGB_U8'); xWidth, xHeight, 'isWCG_U8toSRGB_U8');
} }
...@@ -311,7 +309,7 @@ function runTestCreateImageDataFromImageData(canvasColorSettings, imageData) { ...@@ -311,7 +309,7 @@ function runTestCreateImageDataFromImageData(canvasColorSettings, imageData) {
{colorSpace: canvasColorSettings.colorSpace, {colorSpace: canvasColorSettings.colorSpace,
pixelFormat: canvasColorSettings.pixelFormat}); pixelFormat: canvasColorSettings.pixelFormat});
var ctxImageData = ctx.createImageData(imageData); var ctxImageData = ctx.createImageData(imageData);
checkImageDataColorSettings(canvasColorSettings, ctxImageData); checkImageDataColorSettings(imageData.getColorSettings(), ctxImageData);
checkImageDataColorValues(canvasColorSettings, ctxImageData, 'isBlank'); checkImageDataColorValues(canvasColorSettings, ctxImageData, 'isBlank');
} }
......
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