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