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

Unified Diff: third_party/WebKit/Source/core/html/ImageData.cpp

Issue 2555213002: Implement color management for ImageData (Closed)
Patch Set: Addressing comments. Created 4 years 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/core/html/ImageData.cpp
diff --git a/third_party/WebKit/Source/core/html/ImageData.cpp b/third_party/WebKit/Source/core/html/ImageData.cpp
index 32726d5aef74e76fa1f9a1d4a83ba2c63ad13014..3a8be83671c153d4b45774fdb548699f63f3001e 100644
--- a/third_party/WebKit/Source/core/html/ImageData.cpp
+++ b/third_party/WebKit/Source/core/html/ImageData.cpp
@@ -99,6 +99,39 @@ ImageData* ImageData::create(unsigned width,
return new ImageData(IntSize(width, height), byteArray);
}
+ImageData* ImageData::create(unsigned width,
+ unsigned height,
+ String colorSpace,
+ ExceptionState& exceptionState) {
+ if (!width || !height) {
+ exceptionState.throwDOMException(
+ IndexSizeError, String::format("The source %s is zero or not a number.",
+ width ? "height" : "width"));
+ return nullptr;
+ }
+
+ CheckedNumeric<unsigned> dataSize = 4;
+ dataSize *= width;
+ dataSize *= height;
+ if (!dataSize.IsValid() || static_cast<int>(width) < 0 ||
+ static_cast<int>(height) < 0) {
+ exceptionState.throwDOMException(
+ IndexSizeError,
+ "The requested image size exceeds the supported range.");
+ return nullptr;
+ }
+
+ DOMUint8ClampedArray* byteArray =
+ DOMUint8ClampedArray::createOrNull(dataSize.ValueOrDie());
+ if (!byteArray) {
+ exceptionState.throwDOMException(V8Error,
Justin Novosad 2016/12/08 20:58:59 this should be V8RangeError
zakerinasab 2016/12/08 22:13:52 Fixed for this and similar occurrences.
+ "Out of memory at ImageData creation");
+ return nullptr;
+ }
+
+ return new ImageData(IntSize(width, height), byteArray, colorSpace);
+}
+
bool ImageData::validateConstructorArguments(DOMUint8ClampedArray* data,
unsigned width,
unsigned& lengthInPixels,
@@ -131,6 +164,23 @@ bool ImageData::validateConstructorArguments(DOMUint8ClampedArray* data,
return true;
}
+bool ImageData::validateConstructorArguments(DOMUint8ClampedArray* data,
+ unsigned width,
+ unsigned& lengthInPixels,
+ String colorSpace,
+ ExceptionState& exceptionState) {
+ if (colorSpace != kLegacyImageDataColorSpaceName &&
+ colorSpace != kSRGBImageDataColorSpaceName) {
+ exceptionState.throwDOMException(NotSupportedError,
+ "The input color space is not supported "
+ "in Uint8ClampedArraye-backed image "
+ "data.");
+ return false;
+ }
+ return validateConstructorArguments(data, width, lengthInPixels,
+ exceptionState);
+}
+
ImageData* ImageData::create(DOMUint8ClampedArray* data,
unsigned width,
ExceptionState& exceptionState) {
@@ -167,6 +217,55 @@ ImageData* ImageData::create(DOMUint8ClampedArray* data,
return new ImageData(IntSize(width, height), data);
}
+ImageData* ImageData::create(DOMUint8ClampedArray* data,
+ unsigned width,
+ unsigned height,
+ String colorSpace,
+ ExceptionState& exceptionState) {
+ unsigned lengthInPixels = 0;
+ if (!validateConstructorArguments(data, width, lengthInPixels, colorSpace,
+ exceptionState)) {
+ DCHECK(exceptionState.hadException());
+ return nullptr;
+ }
+ DCHECK_GT(lengthInPixels, 0u);
+ DCHECK_GT(width, 0u);
+ if (height != lengthInPixels / width) {
+ exceptionState.throwDOMException(
+ IndexSizeError,
+ "The input data byte length is not equal to (4 * width * height).");
+ return nullptr;
+ }
+ return new ImageData(IntSize(width, height), data, colorSpace);
+}
+
+ImageDataColorSpace ImageData::getImageDataColorSpace(String colorSpaceName) {
+ if (colorSpaceName == kLegacyImageDataColorSpaceName)
+ return kLegacyImageDataColorSpace;
+ if (colorSpaceName == kSRGBImageDataColorSpaceName)
+ return kSRGBImageDataColorSpace;
+ if (colorSpaceName == kLinearRGBImageDataColorSpaceName)
+ return kLinearRGBImageDataColorSpace;
+ NOTREACHED();
+ return kLegacyImageDataColorSpace;
+}
+
+String ImageData::getImageDataColorSpaceName(ImageDataColorSpace colorSpace) {
+ switch (colorSpace) {
+ case kLegacyImageDataColorSpace:
+ return kLegacyImageDataColorSpaceName;
+ case kSRGBImageDataColorSpace:
+ return kSRGBImageDataColorSpaceName;
+ case kLinearRGBImageDataColorSpace:
+ return kLinearRGBImageDataColorSpaceName;
+ }
+ NOTREACHED();
+ return String();
+}
+
+// TODO(zakerinasab): Fix this when ImageBitmap color correction code is landed.
+// Tip: If the source Image Data has a color space, createImageBitmap must
+// respect this color space even when no color space tag is passed to it.
ScriptPromise ImageData::createImageBitmap(ScriptState* scriptState,
EventTarget& eventTarget,
Optional<IntRect> cropRect,
@@ -211,8 +310,12 @@ v8::Local<v8::Object> ImageData::associateWithWrapper(
return wrapper;
}
-ImageData::ImageData(const IntSize& size, DOMUint8ClampedArray* byteArray)
- : m_size(size), m_data(byteArray) {
+ImageData::ImageData(const IntSize& size,
+ DOMUint8ClampedArray* byteArray,
+ String colorSpaceName)
+ : m_size(size),
+ m_colorSpace(getImageDataColorSpace(colorSpaceName)),
+ m_data(byteArray) {
DCHECK_GE(size.width(), 0);
DCHECK_GE(size.height(), 0);
SECURITY_CHECK(static_cast<unsigned>(size.width() * size.height() * 4) <=

Powered by Google App Engine
This is Rietveld 408576698