Commit 81697054 authored by Christopher Cameron's avatar Christopher Cameron Committed by Commit Bot

Replace ImageData::GetSkImageInfo with ImageData::GetSkPixmap

Several callsites only use ImageData::GetSkImageInfo in the process
of retrieving all of the relevant information to construct a SkPixmap.

TBR=yiyx,fserb

Bug: 1150969
Change-Id: I3a44bcb8ab357559f4f16d749b5abf8b69136f4b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2552999Reviewed-by: default avatarccameron <ccameron@chromium.org>
Commit-Queue: ccameron <ccameron@chromium.org>
Cr-Commit-Position: refs/heads/master@{#829914}
parent 63deb6f7
...@@ -271,13 +271,6 @@ ImageDataColorSettings* CanvasColorParamsToImageDataColorSettings( ...@@ -271,13 +271,6 @@ ImageDataColorSettings* CanvasColorParamsToImageDataColorSettings(
return color_settings; return color_settings;
} }
ImageData* ImageData::Create(const IntSize& size,
const CanvasColorParams& color_params) {
ImageDataColorSettings* color_settings =
CanvasColorParamsToImageDataColorSettings(color_params);
return ImageData::Create(size, color_settings);
}
ImageData* ImageData::Create(const IntSize& size, ImageData* ImageData::Create(const IntSize& size,
CanvasColorSpace color_space, CanvasColorSpace color_space,
ImageDataStorageFormat storage_format) { ImageDataStorageFormat storage_format) {
...@@ -332,7 +325,8 @@ ImageData* ImageData::Create(scoped_refptr<StaticBitmapImage> image, ...@@ -332,7 +325,8 @@ ImageData* ImageData::Create(scoped_refptr<StaticBitmapImage> image,
} }
} }
ImageData* image_data = Create(image->Size(), color_params); ImageData* image_data = Create(
image->Size(), CanvasColorParamsToImageDataColorSettings(color_params));
if (!image_data) if (!image_data)
return nullptr; return nullptr;
...@@ -667,7 +661,13 @@ ImageDataStorageFormat ImageData::GetImageDataStorageFormat( ...@@ -667,7 +661,13 @@ ImageDataStorageFormat ImageData::GetImageDataStorageFormat(
return kUint8ClampedArrayStorageFormat; return kUint8ClampedArrayStorageFormat;
} }
ImageDataStorageFormat ImageData::GetImageDataStorageFormat() { CanvasColorSpace ImageData::GetCanvasColorSpace() const {
if (!RuntimeEnabledFeatures::CanvasColorManagementEnabled())
return CanvasColorSpace::kSRGB;
return CanvasColorSpaceFromName(color_settings_->colorSpace());
}
ImageDataStorageFormat ImageData::GetImageDataStorageFormat() const {
if (data_u16_) if (data_u16_)
return kUint16ArrayStorageFormat; return kUint16ArrayStorageFormat;
if (data_f32_) if (data_f32_)
...@@ -782,15 +782,17 @@ CanvasColorParams ImageData::GetCanvasColorParams() { ...@@ -782,15 +782,17 @@ CanvasColorParams ImageData::GetCanvasColorParams() {
kNonOpaque); kNonOpaque);
} }
SkImageInfo ImageData::GetSkImageInfo() { SkPixmap ImageData::GetSkPixmap() const {
SkColorType color_type = kN32_SkColorType; SkColorType color_type = kRGBA_8888_SkColorType;
if (data_u16_) { if (data_u16_) {
color_type = kR16G16B16A16_unorm_SkColorType; color_type = kR16G16B16A16_unorm_SkColorType;
} else if (data_f32_) { } else if (data_f32_) {
color_type = kRGBA_F32_SkColorType; color_type = kRGBA_F32_SkColorType;
} }
return SkImageInfo::Make(width(), height(), color_type, SkImageInfo info =
kUnpremul_SkAlphaType); SkImageInfo::Make(width(), height(), color_type, kUnpremul_SkAlphaType,
CanvasColorSpaceToSkColorSpace(GetCanvasColorSpace()));
return SkPixmap(info, BufferBase()->Data(), info.minRowBytes());
} }
bool ImageData::ImageDataInCanvasColorSettings( bool ImageData::ImageDataInCanvasColorSettings(
...@@ -836,7 +838,8 @@ bool ImageData::ImageDataInCanvasColorSettings( ...@@ -836,7 +838,8 @@ bool ImageData::ImageDataInCanvasColorSettings(
skcms_ICCProfile* src_profile_ptr = nullptr; skcms_ICCProfile* src_profile_ptr = nullptr;
skcms_ICCProfile* dst_profile_ptr = nullptr; skcms_ICCProfile* dst_profile_ptr = nullptr;
skcms_ICCProfile src_profile, dst_profile; skcms_ICCProfile src_profile, dst_profile;
GetCanvasColorParams().GetSkColorSpace()->toProfile(&src_profile); CanvasColorSpaceToSkColorSpace(GetCanvasColorSpace())
->toProfile(&src_profile);
canvas_color_params.GetSkColorSpace()->toProfile(&dst_profile); canvas_color_params.GetSkColorSpace()->toProfile(&dst_profile);
// If the profiles are similar, we better leave them as nullptr, since // If the profiles are similar, we better leave them as nullptr, since
// skcms_Transform() only checks for profile pointer equality for the fast // skcms_Transform() only checks for profile pointer equality for the fast
......
...@@ -71,7 +71,6 @@ class CORE_EXPORT ImageData final : public ScriptWrappable, ...@@ -71,7 +71,6 @@ class CORE_EXPORT ImageData final : public ScriptWrappable,
public: public:
static ImageData* Create(const IntSize&, static ImageData* Create(const IntSize&,
const ImageDataColorSettings* = nullptr); const ImageDataColorSettings* = nullptr);
static ImageData* Create(const IntSize&, const CanvasColorParams&);
static ImageData* Create(const IntSize&, static ImageData* Create(const IntSize&,
CanvasColorSpace, CanvasColorSpace,
ImageDataStorageFormat); ImageDataStorageFormat);
...@@ -127,7 +126,6 @@ class CORE_EXPORT ImageData final : public ScriptWrappable, ...@@ -127,7 +126,6 @@ class CORE_EXPORT ImageData final : public ScriptWrappable,
ImageData* CropRect(const IntRect&, bool flip_y = false); ImageData* CropRect(const IntRect&, bool flip_y = false);
ImageDataStorageFormat GetImageDataStorageFormat();
static String CanvasColorSpaceName(CanvasColorSpace); static String CanvasColorSpaceName(CanvasColorSpace);
static ImageDataStorageFormat GetImageDataStorageFormat(const String&); static ImageDataStorageFormat GetImageDataStorageFormat(const String&);
static unsigned StorageFormatBytesPerPixel(const String&); static unsigned StorageFormatBytesPerPixel(const String&);
...@@ -148,7 +146,11 @@ class CORE_EXPORT ImageData final : public ScriptWrappable, ...@@ -148,7 +146,11 @@ class CORE_EXPORT ImageData final : public ScriptWrappable,
DOMArrayBufferBase* BufferBase() const; DOMArrayBufferBase* BufferBase() const;
CanvasColorParams GetCanvasColorParams(); CanvasColorParams GetCanvasColorParams();
SkImageInfo GetSkImageInfo(); CanvasColorSpace GetCanvasColorSpace() const;
ImageDataStorageFormat GetImageDataStorageFormat() const;
// Return an SkPixmap that references this data directly.
SkPixmap GetSkPixmap() const;
// DataU8ColorType param specifies if the converted pixels in uint8 pixel // DataU8ColorType param specifies if the converted pixels in uint8 pixel
// format should respect the "native" 32bit ARGB format of Skia's blitters. // format should respect the "native" 32bit ARGB format of Skia's blitters.
......
...@@ -1905,7 +1905,7 @@ void BaseRenderingContext2D::putImageData(ImageData* data, ...@@ -1905,7 +1905,7 @@ void BaseRenderingContext2D::putImageData(ImageData* data,
// in sRGB color space and use uint8 pixel storage format. We use RGBA pixel // in sRGB color space and use uint8 pixel storage format. We use RGBA pixel
// order for both ImageData and CanvasResourceProvider, therefore no // order for both ImageData and CanvasResourceProvider, therefore no
// additional swizzling is needed. // additional swizzling is needed.
SkImageInfo data_info = data->GetSkImageInfo(); SkPixmap data_pixmap = data->GetSkPixmap();
CanvasColorParams data_color_params = data->GetCanvasColorParams(); CanvasColorParams data_color_params = data->GetCanvasColorParams();
CanvasColorParams context_color_params = CanvasColorParams( CanvasColorParams context_color_params = CanvasColorParams(
GetCanvas2DColorParams().ColorSpace(), PixelFormat(), kNonOpaque); GetCanvas2DColorParams().ColorSpace(), PixelFormat(), kNonOpaque);
...@@ -1913,30 +1913,28 @@ void BaseRenderingContext2D::putImageData(ImageData* data, ...@@ -1913,30 +1913,28 @@ void BaseRenderingContext2D::putImageData(ImageData* data,
if (data_color_params.ColorSpace() != context_color_params.ColorSpace() || if (data_color_params.ColorSpace() != context_color_params.ColorSpace() ||
data_color_params.PixelFormat() != context_color_params.PixelFormat() || data_color_params.PixelFormat() != context_color_params.PixelFormat() ||
PixelFormat() == CanvasPixelFormat::kF16) { PixelFormat() == CanvasPixelFormat::kF16) {
size_t data_length; SkImageInfo converted_info = data_pixmap.info();
if (!base::CheckMul(data->Size().Area(), converted_info =
context_color_params.BytesPerPixel()) converted_info.makeColorType(GetCanvas2DColorParams().GetSkColorType());
.AssignIfValid(&data_length)) { converted_info = converted_info.makeColorSpace(
GetCanvas2DColorParams().GetSkColorSpace());
if (converted_info.colorType() == kN32_SkColorType)
converted_info = converted_info.makeColorType(kRGBA_8888_SkColorType);
const size_t converted_data_bytes = converted_info.computeMinByteSize();
const size_t converted_row_bytes = converted_info.minRowBytes();
if (SkImageInfo::ByteSizeOverflowed(converted_data_bytes))
return; return;
} std::unique_ptr<uint8_t[]> converted_pixels(
std::unique_ptr<uint8_t[]> converted_pixels(new uint8_t[data_length]); new uint8_t[converted_data_bytes]);
if (data_pixmap.readPixels(converted_info, converted_pixels.get(),
if (data->ImageDataInCanvasColorSettings( converted_row_bytes)) {
GetCanvas2DColorParams().ColorSpace(), PixelFormat(), PutByteArray(
converted_pixels.get(), kRGBAColorType)) { SkPixmap(converted_info, converted_pixels.get(), converted_row_bytes),
SkImageInfo converted_info = data_info; source_rect, IntPoint(dest_offset));
converted_info = converted_info.makeColorType(
GetCanvas2DColorParams().GetSkColorType());
converted_info = converted_info.makeColorSpace(
GetCanvas2DColorParams().GetSkColorSpace());
PutByteArray(SkPixmap(converted_info, converted_pixels.get(),
converted_info.minRowBytes()),
source_rect, IntPoint(dest_offset));
} }
} else { } else {
PutByteArray(SkPixmap(data_info, data->BufferBase()->Data(), PutByteArray(data_pixmap, source_rect, IntPoint(dest_offset));
data_info.minRowBytes()),
source_rect, IntPoint(dest_offset));
} }
if (!IsPaint2D()) { if (!IsPaint2D()) {
......
...@@ -119,18 +119,21 @@ ScriptPromise ShapeDetector::DetectShapesOnImageData( ...@@ -119,18 +119,21 @@ ScriptPromise ShapeDetector::DetectShapesOnImageData(
return promise; return promise;
} }
SkPixmap image_data_pixmap = image_data->GetSkPixmap();
SkBitmap sk_bitmap; SkBitmap sk_bitmap;
SkImageInfo sk_image_info = image_data->GetSkImageInfo(); if (!sk_bitmap.tryAllocPixels(image_data_pixmap.info(),
if (!sk_bitmap.tryAllocPixels(sk_image_info, sk_image_info.minRowBytes())) { image_data_pixmap.rowBytes())) {
resolver->Reject(MakeGarbageCollected<DOMException>( resolver->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kInvalidStateError, DOMExceptionCode::kInvalidStateError,
"Failed to allocate pixels for current frame.")); "Failed to allocate pixels for current frame."));
return promise; return promise;
} }
if (!sk_bitmap.writePixels(image_data_pixmap, 0, 0)) {
size_t byte_size = sk_bitmap.computeByteSize(); resolver->Reject(MakeGarbageCollected<DOMException>(
CHECK_EQ(byte_size, image_data->BufferBase()->ByteLength()); DOMExceptionCode::kInvalidStateError,
memcpy(sk_bitmap.getPixels(), image_data->BufferBase()->Data(), byte_size); "Failed to copy pixels for current frame."));
return promise;
}
return DoDetect(resolver, std::move(sk_bitmap)); return DoDetect(resolver, std::move(sk_bitmap));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment