| Index: third_party/WebKit/Source/core/html/ImageDataTest.cpp
|
| diff --git a/third_party/WebKit/Source/core/html/ImageDataTest.cpp b/third_party/WebKit/Source/core/html/ImageDataTest.cpp
|
| index 1cc60e0590e85dccb135c8a7f98d6990f4c9ff6b..1fec53c833a4798068a85a077fc79a3a02b1ac0d 100644
|
| --- a/third_party/WebKit/Source/core/html/ImageDataTest.cpp
|
| +++ b/third_party/WebKit/Source/core/html/ImageDataTest.cpp
|
| @@ -250,15 +250,18 @@ bool ConvertPixelsToColorSpaceAndPixelFormatForTest(
|
|
|
| sk_sp<SkColorSpace> src_sk_color_space = nullptr;
|
| if (u8_array) {
|
| - src_sk_color_space = ImageData::GetSkColorSpaceForTest(
|
| - src_color_space, kRGBA8CanvasPixelFormat);
|
| + src_sk_color_space =
|
| + CanvasColorParams(src_color_space, kRGBA8CanvasPixelFormat)
|
| + .GetSkColorSpaceForSkSurfaces();
|
| } else {
|
| - src_sk_color_space = ImageData::GetSkColorSpaceForTest(
|
| - src_color_space, kF16CanvasPixelFormat);
|
| + src_sk_color_space =
|
| + CanvasColorParams(src_color_space, kF16CanvasPixelFormat)
|
| + .GetSkColorSpaceForSkSurfaces();
|
| }
|
|
|
| sk_sp<SkColorSpace> dst_sk_color_space =
|
| - ImageData::GetSkColorSpaceForTest(dst_color_space, dst_pixel_format);
|
| + CanvasColorParams(dst_color_space, dst_pixel_format)
|
| + .GetSkColorSpaceForSkSurfaces();
|
|
|
| // When the input dataArray is in Uint16, we normally should convert the
|
| // values from Little Endian to Big Endian before passing the buffer to
|
| @@ -400,5 +403,233 @@ TEST_F(ImageDataTest, TestGetImageDataInCanvasColorSettings) {
|
| delete[] f32_pixels;
|
| }
|
|
|
| +// This test examines ImageData::MakeCopy()
|
| +TEST_F(ImageDataTest, TestMakeCopy) {
|
| + const int num_image_data_storage_formats = 3;
|
| + ImageDataStorageFormat image_data_storage_formats[] = {
|
| + kUint8ClampedArrayStorageFormat, kUint16ArrayStorageFormat,
|
| + kFloat32ArrayStorageFormat,
|
| + };
|
| + String image_data_storage_format_names[] = {
|
| + kUint8ClampedArrayStorageFormatName, kUint16ArrayStorageFormatName,
|
| + kFloat32ArrayStorageFormatName,
|
| + };
|
| +
|
| + // Source pixels
|
| + unsigned width = 2;
|
| + unsigned height = 2;
|
| + unsigned data_length = width * height * 4;
|
| + uint8_t* u8_pixels = new uint8_t[data_length];
|
| + uint16_t* u16_pixels = new uint16_t[data_length];
|
| + float* f32_pixels = new float[data_length];
|
| +
|
| + // Fill the pixels with numbers related to their positions
|
| + unsigned set_value = 0;
|
| + unsigned index = 0;
|
| + for (unsigned i = 0; i < height; i++)
|
| + for (unsigned j = 0; j < width; j++)
|
| + for (unsigned k = 0; k < 4; k++) {
|
| + index = i * width * 4 + j * 4 + k;
|
| + set_value = (i + 1) * (j + 1) * (k + 1);
|
| + u8_pixels[index] = set_value % 255;
|
| + u16_pixels[index] = (set_value * 257) % 65535;
|
| + f32_pixels[index] = (set_value % 255) / 255.0f;
|
| + }
|
| +
|
| + // Create ImageData objects
|
| + DOMArrayBufferView* data_array = nullptr;
|
| +
|
| + DOMUint8ClampedArray* data_u8 =
|
| + DOMUint8ClampedArray::Create(u8_pixels, data_length);
|
| + DCHECK(data_u8);
|
| + EXPECT_EQ(data_length, data_u8->length());
|
| + DOMUint16Array* data_u16 = DOMUint16Array::Create(u16_pixels, data_length);
|
| + DCHECK(data_u16);
|
| + EXPECT_EQ(data_length, data_u16->length());
|
| + DOMFloat32Array* data_f32 = DOMFloat32Array::Create(f32_pixels, data_length);
|
| + DCHECK(data_f32);
|
| + EXPECT_EQ(data_length, data_f32->length());
|
| +
|
| + ImageData* image_data = nullptr;
|
| + ImageData* copy_image_data = nullptr;
|
| +
|
| + for (int i = 0; i < num_image_data_storage_formats; i++) {
|
| + if (image_data_storage_formats[i] == kUint8ClampedArrayStorageFormat)
|
| + data_array = static_cast<DOMArrayBufferView*>(data_u8);
|
| + else if (image_data_storage_formats[i] == kUint16ArrayStorageFormat)
|
| + data_array = static_cast<DOMArrayBufferView*>(data_u16);
|
| + else
|
| + data_array = static_cast<DOMArrayBufferView*>(data_f32);
|
| +
|
| + ImageDataColorSettings color_settings;
|
| + color_settings.setStorageFormat(image_data_storage_format_names[i]);
|
| + image_data = ImageData::CreateForTest(IntSize(width, height), data_array,
|
| + &color_settings);
|
| + copy_image_data = image_data->MakeCopy();
|
| + EXPECT_TRUE(copy_image_data->Size() == image_data->Size());
|
| + EXPECT_TRUE(ImageData::CompareImageDataColorSettingsForTest(copy_image_data,
|
| + image_data));
|
| +
|
| + int data_size =
|
| + image_data->Size().Width() * image_data->Size().Height() * 4 *
|
| + ImageData::StorageFormatDataSize(color_settings.storageFormat());
|
| +
|
| + if (image_data_storage_formats[i] == kUint8ClampedArrayStorageFormat) {
|
| + EXPECT_TRUE(std::memcmp(image_data->data()->Data(),
|
| + copy_image_data->data()->Data(), data_size) == 0);
|
| + } else if (image_data_storage_formats[i] == kUint16ArrayStorageFormat) {
|
| + EXPECT_TRUE(
|
| + std::memcmp(
|
| + image_data->dataUnion().getAsUint16Array().View()->Data(),
|
| + copy_image_data->dataUnion().getAsUint16Array().View()->Data(),
|
| + data_size) == 0);
|
| + } else {
|
| + EXPECT_TRUE(
|
| + std::memcmp(
|
| + image_data->dataUnion().getAsFloat32Array().View()->Data(),
|
| + copy_image_data->dataUnion().getAsFloat32Array().View()->Data(),
|
| + data_size) == 0);
|
| + }
|
| + }
|
| +
|
| + delete[] u8_pixels;
|
| + delete[] u16_pixels;
|
| + delete[] f32_pixels;
|
| +}
|
| +
|
| +// This test examines ImageData::MakeSubset()
|
| +TEST_F(ImageDataTest, TestMakeSubset) {
|
| + const int num_image_data_storage_formats = 3;
|
| + ImageDataStorageFormat image_data_storage_formats[] = {
|
| + kUint8ClampedArrayStorageFormat, kUint16ArrayStorageFormat,
|
| + kFloat32ArrayStorageFormat,
|
| + };
|
| + String image_data_storage_format_names[] = {
|
| + kUint8ClampedArrayStorageFormatName, kUint16ArrayStorageFormatName,
|
| + kFloat32ArrayStorageFormatName,
|
| + };
|
| +
|
| + // Source pixels
|
| + unsigned width = 40;
|
| + unsigned height = 40;
|
| + unsigned data_length = width * height * 4;
|
| + uint8_t* u8_pixels = new uint8_t[data_length];
|
| + uint16_t* u16_pixels = new uint16_t[data_length];
|
| + float* f32_pixels = new float[data_length];
|
| +
|
| + // Test scenarios
|
| + const int num_test_cases = 8;
|
| + const IntRect crop_test_cases[8] = {
|
| + IntRect(1, 2, 1, 2), IntRect(10, 10, 20, 20), IntRect(10, 10, 40, 40),
|
| + IntRect(0, 0, 10, 10), IntRect(0, 0, 10, 0), IntRect(0, 0, 0, 10),
|
| + IntRect(10, 0, 10, 10), IntRect(0, 10, 10, 10),
|
| + };
|
| +
|
| + // Fill the pixels with numbers related to their positions
|
| + unsigned set_value = 0;
|
| + unsigned expected_value = 0;
|
| + float fexpected_value = 0;
|
| + unsigned index = 0;
|
| + for (unsigned i = 0; i < height; i++)
|
| + for (unsigned j = 0; j < width; j++)
|
| + for (unsigned k = 0; k < 4; k++) {
|
| + index = i * width * 4 + j * 4 + k;
|
| + set_value = (i + 1) * (j + 1) * (k + 1);
|
| + u8_pixels[index] = set_value % 255;
|
| + u16_pixels[index] = (set_value * 257) % 65535;
|
| + f32_pixels[index] = (set_value % 255) / 255.0f;
|
| + }
|
| +
|
| + // Create ImageData objects
|
| + DOMArrayBufferView* data_array = nullptr;
|
| +
|
| + DOMUint8ClampedArray* data_u8 =
|
| + DOMUint8ClampedArray::Create(u8_pixels, data_length);
|
| + DCHECK(data_u8);
|
| + EXPECT_EQ(data_length, data_u8->length());
|
| + DOMUint16Array* data_u16 = DOMUint16Array::Create(u16_pixels, data_length);
|
| + DCHECK(data_u16);
|
| + EXPECT_EQ(data_length, data_u16->length());
|
| + DOMFloat32Array* data_f32 = DOMFloat32Array::Create(f32_pixels, data_length);
|
| + DCHECK(data_f32);
|
| + EXPECT_EQ(data_length, data_f32->length());
|
| +
|
| + ImageData* image_data = nullptr;
|
| + ImageData* cropped_image_data = nullptr;
|
| +
|
| + bool test_passed = true;
|
| + for (int i = 0; i < num_image_data_storage_formats; i++) {
|
| + if (image_data_storage_formats[i] == kUint8ClampedArrayStorageFormat)
|
| + data_array = static_cast<DOMArrayBufferView*>(data_u8);
|
| + else if (image_data_storage_formats[i] == kUint16ArrayStorageFormat)
|
| + data_array = static_cast<DOMArrayBufferView*>(data_u16);
|
| + else
|
| + data_array = static_cast<DOMArrayBufferView*>(data_f32);
|
| +
|
| + ImageDataColorSettings color_settings;
|
| + color_settings.setStorageFormat(image_data_storage_format_names[i]);
|
| + image_data = ImageData::CreateForTest(IntSize(width, height), data_array,
|
| + &color_settings);
|
| + for (int j = 0; j < num_test_cases; j++) {
|
| + // Test the size of the cropped image data
|
| + IntRect src_rect(IntPoint(), image_data->Size());
|
| + IntRect crop_rect = Intersection(src_rect, crop_test_cases[j]);
|
| +
|
| + cropped_image_data = image_data->MakeSubset(crop_test_cases[j]);
|
| + if (crop_rect.IsEmpty()) {
|
| + EXPECT_FALSE(cropped_image_data);
|
| + continue;
|
| + }
|
| + EXPECT_TRUE(cropped_image_data->Size() == crop_rect.Size());
|
| +
|
| + // Test the content
|
| + for (int k = 0; k < crop_rect.Height(); k++)
|
| + for (int m = 0; m < crop_rect.Width(); m++)
|
| + for (int n = 0; n < 4; n++) {
|
| + index = k * cropped_image_data->Size().Width() * 4 + m * 4 + n;
|
| + expected_value =
|
| + (k + crop_rect.X() + 1) * (m + crop_rect.Y() + 1) * (n + 1);
|
| + if (image_data_storage_formats[i] ==
|
| + kUint8ClampedArrayStorageFormat)
|
| + expected_value %= 255;
|
| + else if (image_data_storage_formats[i] == kUint16ArrayStorageFormat)
|
| + expected_value = (expected_value * 257) % 65535;
|
| + else
|
| + fexpected_value = (expected_value % 255) / 255.0f;
|
| +
|
| + if (image_data_storage_formats[i] ==
|
| + kUint8ClampedArrayStorageFormat) {
|
| + if (cropped_image_data->data()->Data()[index] != expected_value) {
|
| + test_passed = false;
|
| + break;
|
| + }
|
| + } else if (image_data_storage_formats[i] ==
|
| + kUint16ArrayStorageFormat) {
|
| + if (cropped_image_data->dataUnion()
|
| + .getAsUint16Array()
|
| + .View()
|
| + ->Data()[index] != expected_value) {
|
| + test_passed = false;
|
| + break;
|
| + }
|
| + } else {
|
| + if (cropped_image_data->dataUnion()
|
| + .getAsFloat32Array()
|
| + .View()
|
| + ->Data()[index] != fexpected_value) {
|
| + test_passed = false;
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + EXPECT_TRUE(test_passed);
|
| + }
|
| + }
|
| +
|
| + delete[] u8_pixels;
|
| + delete[] u16_pixels;
|
| + delete[] f32_pixels;
|
| +}
|
| +
|
| } // namspace
|
| } // namespace blink
|
|
|