Index: Source/core/html/ImageData.cpp |
diff --git a/Source/core/html/ImageData.cpp b/Source/core/html/ImageData.cpp |
index bcba908180f35739d9b4140b77e6a1d7968b8a86..936945ce417a628c97d933008605aa30286ce03b 100644 |
--- a/Source/core/html/ImageData.cpp |
+++ b/Source/core/html/ImageData.cpp |
@@ -29,6 +29,10 @@ |
#include "config.h" |
#include "core/html/ImageData.h" |
+#include "RuntimeEnabledFeatures.h" |
+#include "bindings/v8/ExceptionState.h" |
+#include "core/dom/ExceptionCode.h" |
+ |
namespace WebCore { |
PassRefPtr<ImageData> ImageData::create(const IntSize& size) |
@@ -57,6 +61,69 @@ PassRefPtr<ImageData> ImageData::create(const IntSize& size, PassRefPtr<Uint8Cla |
return adoptRef(new ImageData(size, byteArray)); |
} |
+PassRefPtr<ImageData> ImageData::create(unsigned width, unsigned height, ExceptionState& exceptionState) |
+{ |
+ if (!RuntimeEnabledFeatures::imageDataConstructorEnabled()) { |
+ exceptionState.throwTypeError("Illegal constructor"); |
+ return nullptr; |
+ } |
+ if (!width || !height) { |
+ exceptionState.throwDOMException(IndexSizeError, String::format("The source %s is zero or not a number.", width ? "height" : "width")); |
+ return nullptr; |
+ } |
+ |
+ Checked<unsigned, RecordOverflow> dataSize = 4; |
+ dataSize *= width; |
+ dataSize *= height; |
+ if (dataSize.hasOverflowed()) { |
+ exceptionState.throwDOMException(IndexSizeError, "The requested image size exceeds the supported range."); |
+ return nullptr; |
+ } |
+ |
+ RefPtr<ImageData> imageData = adoptRef(new ImageData(IntSize(width, height))); |
+ imageData->data()->zeroFill(); |
+ return imageData.release(); |
+} |
+ |
+PassRefPtr<ImageData> ImageData::create(Uint8ClampedArray* data, unsigned width, unsigned height, ExceptionState& exceptionState) |
+{ |
+ if (!RuntimeEnabledFeatures::imageDataConstructorEnabled()) { |
+ exceptionState.throwTypeError("Illegal constructor"); |
+ return nullptr; |
+ } |
+ if (!data) { |
+ exceptionState.throwTypeError("Expected a Uint8ClampedArray as first argument."); |
+ return nullptr; |
+ } |
+ if (!width) { |
+ exceptionState.throwDOMException(IndexSizeError, "The source width is zero or not a number."); |
+ return nullptr; |
+ } |
+ |
+ unsigned length = data->length(); |
+ if (!length) { |
+ exceptionState.throwDOMException(IndexSizeError, "The input data has a zero byte length."); |
+ return nullptr; |
+ } |
+ if (length % 4) { |
+ exceptionState.throwDOMException(IndexSizeError, "The input data byte length is not a multiple of 4."); |
+ return nullptr; |
+ } |
+ length /= 4; |
+ if (length % width) { |
+ exceptionState.throwDOMException(IndexSizeError, "The input data byte length is not a multiple of (4 * width)."); |
+ return nullptr; |
+ } |
+ if (!height) { |
+ height = length / width; |
+ } else if (height != length / width) { |
+ exceptionState.throwDOMException(IndexSizeError, "The input data byte length is not equal to (4 * width * height)."); |
+ return nullptr; |
+ } |
+ |
+ return adoptRef(new ImageData(IntSize(width, height), data)); |
+} |
+ |
ImageData::ImageData(const IntSize& size) |
: m_size(size) |
, m_data(Uint8ClampedArray::createUninitialized(size.width() * size.height() * 4)) |