summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/html/canvas/image_data.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/html/canvas/image_data.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/html/canvas/image_data.cc209
1 files changed, 101 insertions, 108 deletions
diff --git a/chromium/third_party/blink/renderer/core/html/canvas/image_data.cc b/chromium/third_party/blink/renderer/core/html/canvas/image_data.cc
index 50256d97b59..eb28b745ed9 100644
--- a/chromium/third_party/blink/renderer/core/html/canvas/image_data.cc
+++ b/chromium/third_party/blink/renderer/core/html/canvas/image_data.cc
@@ -29,10 +29,10 @@
#include "third_party/blink/renderer/core/html/canvas/image_data.h"
#include "base/sys_byteorder.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_image_bitmap_options.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_uint8_clamped_array.h"
#include "third_party/blink/renderer/core/dom/dom_exception.h"
#include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
-#include "third_party/blink/renderer/core/imagebitmap/image_bitmap_options.h"
#include "third_party/blink/renderer/platform/graphics/color_behavior.h"
#include "third_party/skia/include/third_party/skcms/skcms.h"
#include "v8/include/v8.h"
@@ -56,7 +56,7 @@ bool ImageData::ValidateConstructorArguments(
const IntSize* size,
const unsigned& width,
const unsigned& height,
- const DOMArrayBufferView* data,
+ const NotShared<DOMArrayBufferView> data,
const ImageDataColorSettings* color_settings,
ExceptionState* exception_state) {
// We accept all the combinations of colorSpace and storageFormat in an
@@ -163,23 +163,26 @@ bool ImageData::ValidateConstructorArguments(
return true;
}
-DOMArrayBufferView* ImageData::AllocateAndValidateDataArray(
+NotShared<DOMArrayBufferView> ImageData::AllocateAndValidateDataArray(
const unsigned& length,
ImageDataStorageFormat storage_format,
ExceptionState* exception_state) {
if (!length)
- return nullptr;
+ return NotShared<DOMArrayBufferView>();
- DOMArrayBufferView* data_array = nullptr;
+ NotShared<DOMArrayBufferView> data_array;
switch (storage_format) {
case kUint8ClampedArrayStorageFormat:
- data_array = DOMUint8ClampedArray::CreateOrNull(length);
+ data_array = NotShared<DOMArrayBufferView>(
+ DOMUint8ClampedArray::CreateOrNull(length));
break;
case kUint16ArrayStorageFormat:
- data_array = DOMUint16Array::CreateOrNull(length);
+ data_array =
+ NotShared<DOMArrayBufferView>(DOMUint16Array::CreateOrNull(length));
break;
case kFloat32ArrayStorageFormat:
- data_array = DOMFloat32Array::CreateOrNull(length);
+ data_array =
+ NotShared<DOMArrayBufferView>(DOMFloat32Array::CreateOrNull(length));
break;
default:
NOTREACHED();
@@ -191,62 +194,51 @@ DOMArrayBufferView* ImageData::AllocateAndValidateDataArray(
expected_size != data_array->byteLengthAsSizeT())) {
if (exception_state)
exception_state->ThrowRangeError("Out of memory at ImageData creation");
- return nullptr;
+ return NotShared<DOMArrayBufferView>();
}
return data_array;
}
-DOMUint8ClampedArray* ImageData::AllocateAndValidateUint8ClampedArray(
+NotShared<DOMUint8ClampedArray> ImageData::AllocateAndValidateUint8ClampedArray(
const unsigned& length,
ExceptionState* exception_state) {
- DOMArrayBufferView* buffer_view = AllocateAndValidateDataArray(
+ NotShared<DOMUint8ClampedArray> buffer_view;
+ buffer_view = AllocateAndValidateDataArray(
length, kUint8ClampedArrayStorageFormat, exception_state);
- if (!buffer_view)
- return nullptr;
- DOMUint8ClampedArray* u8_array = const_cast<DOMUint8ClampedArray*>(
- static_cast<const DOMUint8ClampedArray*>(buffer_view));
- DCHECK(u8_array);
- return u8_array;
+ return buffer_view;
}
-DOMUint16Array* ImageData::AllocateAndValidateUint16Array(
+NotShared<DOMUint16Array> ImageData::AllocateAndValidateUint16Array(
const unsigned& length,
ExceptionState* exception_state) {
- DOMArrayBufferView* buffer_view = AllocateAndValidateDataArray(
- length, kUint16ArrayStorageFormat, exception_state);
- if (!buffer_view)
- return nullptr;
- DOMUint16Array* u16_array = const_cast<DOMUint16Array*>(
- static_cast<const DOMUint16Array*>(buffer_view));
- DCHECK(u16_array);
- return u16_array;
+ NotShared<DOMUint16Array> buffer_view;
+ buffer_view = AllocateAndValidateDataArray(length, kUint16ArrayStorageFormat,
+ exception_state);
+ return buffer_view;
}
-DOMFloat32Array* ImageData::AllocateAndValidateFloat32Array(
+NotShared<DOMFloat32Array> ImageData::AllocateAndValidateFloat32Array(
const unsigned& length,
ExceptionState* exception_state) {
- DOMArrayBufferView* buffer_view = AllocateAndValidateDataArray(
- length, kFloat32ArrayStorageFormat, exception_state);
- if (!buffer_view)
- return nullptr;
- DOMFloat32Array* f32_array = const_cast<DOMFloat32Array*>(
- static_cast<const DOMFloat32Array*>(buffer_view));
- DCHECK(f32_array);
- return f32_array;
+ NotShared<DOMFloat32Array> buffer_view;
+ buffer_view = AllocateAndValidateDataArray(length, kFloat32ArrayStorageFormat,
+ exception_state);
+ return buffer_view;
}
ImageData* ImageData::Create(const IntSize& size,
const ImageDataColorSettings* color_settings) {
- if (!ImageData::ValidateConstructorArguments(kParamSize, &size, 0, 0, nullptr,
- color_settings))
+ if (!ValidateConstructorArguments(kParamSize, &size, 0, 0,
+ NotShared<DOMArrayBufferView>(),
+ color_settings))
return nullptr;
ImageDataStorageFormat storage_format = kUint8ClampedArrayStorageFormat;
if (color_settings) {
storage_format =
ImageData::GetImageDataStorageFormat(color_settings->storageFormat());
}
- DOMArrayBufferView* data_array =
+ NotShared<DOMArrayBufferView> data_array =
AllocateAndValidateDataArray(4 * static_cast<unsigned>(size.Width()) *
static_cast<unsigned>(size.Height()),
storage_format);
@@ -322,12 +314,10 @@ ImageData* ImageData::Create(const IntSize& size,
ImageData* ImageData::Create(const IntSize& size,
NotShared<DOMArrayBufferView> data_array,
const ImageDataColorSettings* color_settings) {
- if (!ImageData::ValidateConstructorArguments(kParamSize | kParamData, &size,
- 0, 0, data_array.View(),
- color_settings))
+ if (!ImageData::ValidateConstructorArguments(
+ kParamSize | kParamData, &size, 0, 0, data_array, color_settings))
return nullptr;
- return MakeGarbageCollected<ImageData>(size, data_array.View(),
- color_settings);
+ return MakeGarbageCollected<ImageData>(size, data_array, color_settings);
}
static SkImageInfo GetImageInfo(scoped_refptr<StaticBitmapImage> image) {
@@ -373,7 +363,7 @@ ImageData* ImageData::Create(scoped_refptr<StaticBitmapImage> image,
if (!area.IsValid())
return nullptr;
// Create image data with f32 storage
- DOMFloat32Array* f32_array =
+ NotShared<DOMFloat32Array> f32_array =
ImageData::AllocateAndValidateFloat32Array(area.ValueOrDie(), nullptr);
if (!f32_array)
return nullptr;
@@ -382,20 +372,20 @@ ImageData* ImageData::Create(scoped_refptr<StaticBitmapImage> image,
image_info.minRowBytes(), 0, 0);
ImageDataColorSettings* color_settings =
CanvasColorParamsToImageDataColorSettings(color_params);
- return Create(image->Size(), NotShared<blink::DOMArrayBufferView>(f32_array),
- color_settings);
+ return Create(image->Size(), f32_array, color_settings);
}
ImageData* ImageData::Create(unsigned width,
unsigned height,
ExceptionState& exception_state) {
- if (!ImageData::ValidateConstructorArguments(kParamWidth | kParamHeight,
- nullptr, width, height, nullptr,
- nullptr, &exception_state))
+ if (!ImageData::ValidateConstructorArguments(
+ kParamWidth | kParamHeight, nullptr, width, height,
+ NotShared<DOMArrayBufferView>(), nullptr, &exception_state))
return nullptr;
- DOMArrayBufferView* byte_array = AllocateAndValidateDataArray(
- 4 * width * height, kUint8ClampedArrayStorageFormat, &exception_state);
+ NotShared<DOMUint8ClampedArray> byte_array =
+ AllocateAndValidateUint8ClampedArray(4 * width * height,
+ &exception_state);
return byte_array ? MakeGarbageCollected<ImageData>(IntSize(width, height),
byte_array)
: nullptr;
@@ -405,13 +395,13 @@ ImageData* ImageData::Create(NotShared<DOMUint8ClampedArray> data,
unsigned width,
ExceptionState& exception_state) {
if (!ImageData::ValidateConstructorArguments(kParamData | kParamWidth,
- nullptr, width, 0, data.View(),
- nullptr, &exception_state))
+ nullptr, width, 0, data, nullptr,
+ &exception_state))
return nullptr;
unsigned height =
- base::checked_cast<unsigned>(data.View()->lengthAsSizeT()) / (width * 4);
- return MakeGarbageCollected<ImageData>(IntSize(width, height), data.View());
+ base::checked_cast<unsigned>(data->lengthAsSizeT()) / (width * 4);
+ return MakeGarbageCollected<ImageData>(IntSize(width, height), data);
}
ImageData* ImageData::Create(NotShared<DOMUint8ClampedArray> data,
@@ -419,11 +409,11 @@ ImageData* ImageData::Create(NotShared<DOMUint8ClampedArray> data,
unsigned height,
ExceptionState& exception_state) {
if (!ImageData::ValidateConstructorArguments(
- kParamData | kParamWidth | kParamHeight, nullptr, width, height,
- data.View(), nullptr, &exception_state))
+ kParamData | kParamWidth | kParamHeight, nullptr, width, height, data,
+ nullptr, &exception_state))
return nullptr;
- return MakeGarbageCollected<ImageData>(IntSize(width, height), data.View());
+ return MakeGarbageCollected<ImageData>(IntSize(width, height), data);
}
ImageData* ImageData::CreateImageData(
@@ -432,13 +422,13 @@ ImageData* ImageData::CreateImageData(
const ImageDataColorSettings* color_settings,
ExceptionState& exception_state) {
if (!ImageData::ValidateConstructorArguments(
- kParamWidth | kParamHeight, nullptr, width, height, nullptr,
- color_settings, &exception_state))
+ kParamWidth | kParamHeight, nullptr, width, height,
+ NotShared<DOMArrayBufferView>(), color_settings, &exception_state))
return nullptr;
ImageDataStorageFormat storage_format =
ImageData::GetImageDataStorageFormat(color_settings->storageFormat());
- DOMArrayBufferView* buffer_view = AllocateAndValidateDataArray(
+ NotShared<DOMArrayBufferView> buffer_view = AllocateAndValidateDataArray(
4 * width * height, storage_format, &exception_state);
if (!buffer_view)
@@ -453,7 +443,7 @@ ImageData* ImageData::CreateImageData(ImageDataArray& data,
unsigned height,
ImageDataColorSettings* color_settings,
ExceptionState& exception_state) {
- DOMArrayBufferView* buffer_view = nullptr;
+ NotShared<DOMArrayBufferView> buffer_view;
// When pixels data is provided, we need to override the storage format of
// ImageDataColorSettings with the one that matches the data type of the
@@ -461,13 +451,13 @@ ImageData* ImageData::CreateImageData(ImageDataArray& data,
String storage_format_name;
if (data.IsUint8ClampedArray()) {
- buffer_view = data.GetAsUint8ClampedArray().View();
+ buffer_view = data.GetAsUint8ClampedArray();
storage_format_name = kUint8ClampedArrayStorageFormatName;
} else if (data.IsUint16Array()) {
- buffer_view = data.GetAsUint16Array().View();
+ buffer_view = data.GetAsUint16Array();
storage_format_name = kUint16ArrayStorageFormatName;
} else if (data.IsFloat32Array()) {
- buffer_view = data.GetAsFloat32Array().View();
+ buffer_view = data.GetAsFloat32Array();
storage_format_name = kFloat32ArrayStorageFormatName;
} else {
NOTREACHED();
@@ -495,8 +485,8 @@ ImageData* ImageData::CreateForTest(const IntSize& size) {
data_size.ValueOrDie() > v8::TypedArray::kMaxLength)
return nullptr;
- DOMUint8ClampedArray* byte_array =
- DOMUint8ClampedArray::CreateOrNull(data_size.ValueOrDie());
+ NotShared<DOMUint8ClampedArray> byte_array(
+ DOMUint8ClampedArray::CreateOrNull(data_size.ValueOrDie()));
if (!byte_array)
return nullptr;
@@ -507,7 +497,7 @@ ImageData* ImageData::CreateForTest(const IntSize& size) {
// to be validated on the call site.
ImageData* ImageData::CreateForTest(
const IntSize& size,
- DOMArrayBufferView* buffer_view,
+ NotShared<DOMArrayBufferView> buffer_view,
const ImageDataColorSettings* color_settings) {
return MakeGarbageCollected<ImageData>(size, buffer_view, color_settings);
}
@@ -527,7 +517,7 @@ ImageData* ImageData::CropRect(const IntRect& crop_rect, bool flip_y) {
return nullptr;
unsigned data_size = 4 * dst_rect.Width() * dst_rect.Height();
- DOMArrayBufferView* buffer_view = AllocateAndValidateDataArray(
+ NotShared<DOMArrayBufferView> buffer_view = AllocateAndValidateDataArray(
data_size,
ImageData::GetImageDataStorageFormat(color_settings_->storageFormat()));
if (!buffer_view)
@@ -562,15 +552,16 @@ ImageData* ImageData::CropRect(const IntRect& crop_rect, bool flip_y) {
ScriptPromise ImageData::CreateImageBitmap(ScriptState* script_state,
EventTarget& event_target,
base::Optional<IntRect> crop_rect,
- const ImageBitmapOptions* options) {
+ const ImageBitmapOptions* options,
+ ExceptionState& exception_state) {
if (BufferBase()->IsDetached()) {
- return ScriptPromise::RejectWithDOMException(
- script_state, MakeGarbageCollected<DOMException>(
- DOMExceptionCode::kInvalidStateError,
- "The source data has been detached."));
+ exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+ "The source data has been detached.");
+ return ScriptPromise();
}
return ImageBitmapSource::FulfillImageBitmap(
- script_state, ImageBitmap::Create(this, crop_rect, options));
+ script_state, MakeGarbageCollected<ImageBitmap>(this, crop_rect, options),
+ exception_state);
}
v8::Local<v8::Object> ImageData::AssociateWithWrapper(
@@ -685,19 +676,19 @@ unsigned ImageData::StorageFormatDataSize(
return 1;
}
-DOMArrayBufferView*
+NotShared<DOMArrayBufferView>
ImageData::ConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat(
ArrayBufferContents& content,
CanvasPixelFormat pixel_format,
ImageDataStorageFormat storage_format) {
if (!content.DataLength())
- return nullptr;
+ return NotShared<DOMArrayBufferView>();
- if (pixel_format == CanvasPixelFormat::kRGBA8 &&
+ if (pixel_format == CanvasColorParams::GetNativeCanvasPixelFormat() &&
storage_format == kUint8ClampedArrayStorageFormat) {
DOMArrayBuffer* array_buffer = DOMArrayBuffer::Create(content);
- return DOMUint8ClampedArray::Create(array_buffer, 0,
- array_buffer->ByteLengthAsSizeT());
+ return NotShared<DOMArrayBufferView>(DOMUint8ClampedArray::Create(
+ array_buffer, 0, array_buffer->ByteLengthAsSizeT()));
}
skcms_PixelFormat src_format = skcms_PixelFormat_RGBA_8888;
@@ -709,10 +700,10 @@ ImageData::ConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat(
skcms_AlphaFormat alpha_format = skcms_AlphaFormat_Unpremul;
if (storage_format == kUint8ClampedArrayStorageFormat) {
- DOMUint8ClampedArray* u8_array =
+ NotShared<DOMUint8ClampedArray> u8_array =
AllocateAndValidateUint8ClampedArray(num_pixels * 4);
if (!u8_array)
- return nullptr;
+ return NotShared<DOMArrayBufferView>();
bool data_transform_successful = skcms_Transform(
content.Data(), src_format, alpha_format, nullptr, u8_array->Data(),
skcms_PixelFormat_RGBA_8888, alpha_format, nullptr, num_pixels);
@@ -721,9 +712,10 @@ ImageData::ConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat(
}
if (storage_format == kUint16ArrayStorageFormat) {
- DOMUint16Array* u16_array = AllocateAndValidateUint16Array(num_pixels * 4);
+ NotShared<DOMUint16Array> u16_array =
+ AllocateAndValidateUint16Array(num_pixels * 4);
if (!u16_array)
- return nullptr;
+ return NotShared<DOMArrayBufferView>();
bool data_transform_successful = skcms_Transform(
content.Data(), src_format, alpha_format, nullptr, u16_array->Data(),
skcms_PixelFormat_RGBA_16161616LE, alpha_format, nullptr, num_pixels);
@@ -731,9 +723,10 @@ ImageData::ConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat(
return u16_array;
}
- DOMFloat32Array* f32_array = AllocateAndValidateFloat32Array(num_pixels * 4);
+ NotShared<DOMFloat32Array> f32_array =
+ AllocateAndValidateFloat32Array(num_pixels * 4);
if (!f32_array)
- return nullptr;
+ return NotShared<DOMArrayBufferView>();
bool data_transform_successful = skcms_Transform(
content.Data(), src_format, alpha_format, nullptr, f32_array->Data(),
skcms_PixelFormat_RGBA_ffff, alpha_format, nullptr, num_pixels);
@@ -756,11 +749,12 @@ CanvasColorParams ImageData::GetCanvasColorParams() {
return CanvasColorParams();
CanvasColorSpace color_space =
ImageData::GetCanvasColorSpace(color_settings_->colorSpace());
- CanvasPixelFormat pixel_format = CanvasPixelFormat::kRGBA8;
- if (color_settings_->storageFormat() != kUint8ClampedArrayStorageFormatName)
- pixel_format = CanvasPixelFormat::kF16;
- return CanvasColorParams(color_space, pixel_format, kNonOpaque,
- CanvasForceRGBA::kNotForced);
+ return CanvasColorParams(
+ color_space,
+ color_settings_->storageFormat() != kUint8ClampedArrayStorageFormatName
+ ? CanvasPixelFormat::kF16
+ : CanvasColorParams::GetNativeCanvasPixelFormat(),
+ kNonOpaque);
}
bool ImageData::ImageDataInCanvasColorSettings(
@@ -774,8 +768,7 @@ bool ImageData::ImageDataInCanvasColorSettings(
return false;
CanvasColorParams canvas_color_params =
- CanvasColorParams(canvas_color_space, canvas_pixel_format, kNonOpaque,
- CanvasForceRGBA::kNotForced);
+ CanvasColorParams(canvas_color_space, canvas_pixel_format, kNonOpaque);
unsigned char* src_data = static_cast<unsigned char*>(BufferBase()->Data());
@@ -788,13 +781,16 @@ bool ImageData::ImageDataInCanvasColorSettings(
src_pixel_format = skcms_PixelFormat_RGBA_ffff;
skcms_PixelFormat dst_pixel_format = skcms_PixelFormat_RGBA_8888;
- if (canvas_pixel_format == CanvasPixelFormat::kRGBA8 &&
- u8_color_type == kN32ColorType &&
- kN32_SkColorType == kBGRA_8888_SkColorType) {
- dst_pixel_format = skcms_PixelFormat_BGRA_8888;
- } else if (canvas_pixel_format == CanvasPixelFormat::kF16) {
+ if (canvas_pixel_format == CanvasPixelFormat::kF16) {
dst_pixel_format = skcms_PixelFormat_RGBA_hhhh;
}
+#if SK_PMCOLOR_BYTE_ORDER(B, G, R, A)
+ else if (canvas_pixel_format ==
+ CanvasColorParams::GetNativeCanvasPixelFormat() &&
+ u8_color_type == kN32ColorType) {
+ dst_pixel_format = skcms_PixelFormat_BGRA_8888;
+ }
+#endif
skcms_AlphaFormat src_alpha_format = skcms_AlphaFormat_Unpremul;
skcms_AlphaFormat dst_alpha_format = skcms_AlphaFormat_Unpremul;
@@ -863,16 +859,16 @@ void ImageData::Trace(Visitor* visitor) {
}
ImageData::ImageData(const IntSize& size,
- DOMArrayBufferView* data,
+ NotShared<DOMArrayBufferView> data,
const ImageDataColorSettings* color_settings)
: size_(size), color_settings_(ImageDataColorSettings::Create()) {
DCHECK_GE(size.Width(), 0);
DCHECK_GE(size.Height(), 0);
DCHECK(data);
- data_ = nullptr;
- data_u16_ = nullptr;
- data_f32_ = nullptr;
+ data_.Clear();
+ data_u16_.Clear();
+ data_f32_.Clear();
if (color_settings) {
color_settings_->setColorSpace(color_settings->colorSpace());
@@ -891,8 +887,7 @@ ImageData::ImageData(const IntSize& size,
case kUint8ClampedArrayStorageFormat:
DCHECK(data->GetType() ==
DOMArrayBufferView::ViewType::kTypeUint8Clamped);
- data_ = const_cast<DOMUint8ClampedArray*>(
- static_cast<const DOMUint8ClampedArray*>(data));
+ data_ = data;
DCHECK(data_);
data_union_.SetUint8ClampedArray(data_);
SECURITY_CHECK(
@@ -902,8 +897,7 @@ ImageData::ImageData(const IntSize& size,
case kUint16ArrayStorageFormat:
DCHECK(data->GetType() == DOMArrayBufferView::ViewType::kTypeUint16);
- data_u16_ =
- const_cast<DOMUint16Array*>(static_cast<const DOMUint16Array*>(data));
+ data_u16_ = data;
DCHECK(data_u16_);
data_union_.SetUint16Array(data_u16_);
SECURITY_CHECK(
@@ -913,8 +907,7 @@ ImageData::ImageData(const IntSize& size,
case kFloat32ArrayStorageFormat:
DCHECK(data->GetType() == DOMArrayBufferView::ViewType::kTypeFloat32);
- data_f32_ = const_cast<DOMFloat32Array*>(
- static_cast<const DOMFloat32Array*>(data));
+ data_f32_ = data;
DCHECK(data_f32_);
data_union_.SetFloat32Array(data_f32_);
SECURITY_CHECK(