Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(899)

Unified Diff: third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp

Issue 2771813003: Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData (Closed)
Patch Set: Unit test added Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
index 15e865745b7ee9132c25e35a5e7ef7e1f0fef61d..4ceada226b4acdee72db4c5734bfa47316c1c7cf 100644
--- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
@@ -1526,7 +1526,29 @@ ImageData* BaseRenderingContext2D::createImageData(
if (size.height() < 1)
size.setHeight(1);
- ImageData* result = ImageData::create(size);
+ ImageData* result = nullptr;
+ if (RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() &&
+ RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) {
+ ImageDataColorSettings colorSettings;
+ colorSettings.setColorSpace(renderingContext()->colorSpaceAsString());
Justin Novosad 2017/03/27 19:43:48 Hmmm... so createImageData inherits the setting fr
zakerinasab 2017/03/30 17:56:11 I'll do.
+ switch (renderingContext()->pixelFormat()) {
+ case kRGBA8CanvasPixelFormat:
+ colorSettings.setStorageFormat(kUint8ClampedArrayStorageFormatName);
+ break;
+ case kF16CanvasPixelFormat:
+ colorSettings.setStorageFormat(kFloat32ArrayStorageFormatName);
+ break;
+ case kRGB10A2CanvasPixelFormat:
+ case kRGBA12CanvasPixelFormat:
+ default:
+ NOTREACHED();
+ }
+ LOG(ERROR) << "In createImageData: " << colorSettings.colorSpace() << ", "
+ << colorSettings.storageFormat();
+ result = ImageData::create(size, &colorSettings);
+ } else {
+ result = ImageData::create(size);
+ }
if (!result)
exceptionState.throwRangeError("Out of memory at ImageData creation");
return result;
@@ -1538,6 +1560,8 @@ ImageData* BaseRenderingContext2D::getImageData(
double sw,
double sh,
ExceptionState& exceptionState) const {
+ LOG(ERROR) << renderingContext()->colorSpaceAsString();
+ LOG(ERROR) << renderingContext()->pixelFormatAsString();
Justin Novosad 2017/03/27 19:43:48 I See a lot of error logging in this file that loo
zakerinasab 2017/03/30 17:56:11 This was a work in progress. Removed now.
m_usageCounters.numGetImageDataCalls++;
m_usageCounters.areaGetImageDataCalls += sw * sh;
if (!originClean())
@@ -1589,10 +1613,38 @@ ImageData* BaseRenderingContext2D::getImageData(
timer.emplace(scopedUsCounterCPU);
}
+ ImageDataColorSettings colorSettings;
+ LOG(ERROR) << "Default: " << colorSettings.colorSpace() << ", "
+ << colorSettings.storageFormat();
+ bool canvasIsColorManaged =
+ RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() &&
+ RuntimeEnabledFeatures::colorCorrectRenderingEnabled();
+ if (canvasIsColorManaged) {
+ colorSettings.setColorSpace(renderingContext()->colorSpaceAsString());
+ switch (renderingContext()->pixelFormat()) {
+ case kRGBA8CanvasPixelFormat:
+ colorSettings.setStorageFormat(kUint8ClampedArrayStorageFormatName);
+ break;
+ case kF16CanvasPixelFormat:
+ colorSettings.setStorageFormat(kFloat32ArrayStorageFormatName);
+ break;
+ case kRGB10A2CanvasPixelFormat:
+ case kRGBA12CanvasPixelFormat:
+ default:
+ NOTREACHED();
+ }
+ LOG(ERROR) << "Set: " << colorSettings.colorSpace() << ", "
+ << colorSettings.storageFormat();
+ }
+
IntRect imageDataRect = enclosingIntRect(logicalRect);
ImageBuffer* buffer = imageBuffer();
if (!buffer || isContextLost()) {
- ImageData* result = ImageData::create(imageDataRect.size());
+ ImageData* result = nullptr;
+ if (canvasIsColorManaged)
+ result = ImageData::create(imageDataRect.size(), &colorSettings);
+ else
+ result = ImageData::create(imageDataRect.size());
if (!result)
exceptionState.throwRangeError("Out of memory at ImageData creation");
return result;
@@ -1604,7 +1656,46 @@ ImageData* BaseRenderingContext2D::getImageData(
return nullptr;
}
- DOMArrayBuffer* arrayBuffer = DOMArrayBuffer::create(contents);
+ DOMArrayBuffer* arrayBuffer = nullptr;
+ DOMArrayBufferView* arrayBufferView = nullptr;
+ DOMFloat32Array* dataArray = nullptr;
+
+ LOG(ERROR) << "HERE";
+ if (canvasIsColorManaged) {
+ LOG(ERROR) << "Canvas is color managed";
+ ImageDataStorageFormat storageFormat =
+ ImageData::getImageDataStorageFormat(colorSettings.storageFormat());
+ switch (storageFormat) {
+ case kUint8ClampedArrayStorageFormat:
+ arrayBuffer = DOMArrayBuffer::create(contents);
+ return ImageData::create(
+ imageDataRect.size(),
+ DOMUint8ClampedArray::create(arrayBuffer, 0,
+ arrayBuffer->byteLength()));
+ break;
+ case kUint16ArrayStorageFormat:
+ NOTREACHED();
+ break;
+ case kFloat32ArrayStorageFormat:
+ LOG(ERROR) << "kFloat32ArrayStorageFormat";
+ arrayBufferView = ImageData::
+ convertPixelsFromCanvasPixelFormatToImageDataStorageFormat(
+ contents, renderingContext()->pixelFormat(), storageFormat);
+ LOG(ERROR) << (void*)(arrayBufferView);
+ LOG(ERROR) << arrayBufferView->byteLength();
+ LOG(ERROR) << arrayBufferView->typeSize();
+ dataArray = const_cast<DOMFloat32Array*>(
+ static_cast<const DOMFloat32Array*>(arrayBufferView));
+ return ImageData::create(imageDataRect.size(), arrayBufferView,
+ &colorSettings);
+ default:
+ NOTREACHED();
+ }
+ return nullptr;
+ }
+ LOG(ERROR) << "NOT color managed canvas";
+
+ arrayBuffer = DOMArrayBuffer::create(contents);
return ImageData::create(
imageDataRect.size(),
DOMUint8ClampedArray::create(arrayBuffer, 0, arrayBuffer->byteLength()));
@@ -1683,10 +1774,16 @@ void BaseRenderingContext2D::putImageData(ImageData* data,
checkOverdraw(destRect, 0, CanvasRenderingContext2DState::NoImage,
UntransformedUnclippedFill);
- buffer->putByteArray(Unmultiplied, data->data()->data(),
- IntSize(data->width(), data->height()), sourceRect,
- IntPoint(destOffset));
-
+ unsigned char* source = data->data()->data();
+ if (RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() &&
+ RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) {
+ source = data->getImageDataInCanvasColorSettings(
+ renderingContext()->colorSpace(), renderingContext()->pixelFormat());
+ } else {
+ buffer->putByteArray(Unmultiplied, source,
+ IntSize(data->width(), data->height()), sourceRect,
+ IntPoint(destOffset));
+ }
didDraw(destRect);
}

Powered by Google App Engine
This is Rietveld 408576698