blob: 1732c2b027b1e420242fbb3a3f445052a16d9bc1 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h"
#include "build/build_config.h"
namespace blink {
namespace {
SerializedColorSpace SerializeColorSpace(CanvasColorSpace color_space) {
switch (color_space) {
case CanvasColorSpace::kSRGB:
return SerializedColorSpace::kSRGB;
case CanvasColorSpace::kRec2020:
return SerializedColorSpace::kRec2020;
case CanvasColorSpace::kP3:
return SerializedColorSpace::kP3;
}
NOTREACHED();
return SerializedColorSpace::kSRGB;
}
CanvasColorSpace DeserializeColorSpace(
SerializedColorSpace serialized_color_space) {
switch (serialized_color_space) {
case SerializedColorSpace::kLegacyObsolete:
case SerializedColorSpace::kSRGB:
return CanvasColorSpace::kSRGB;
case SerializedColorSpace::kRec2020:
return CanvasColorSpace::kRec2020;
case SerializedColorSpace::kP3:
return CanvasColorSpace::kP3;
}
NOTREACHED();
return CanvasColorSpace::kSRGB;
}
} // namespace
////////////////////////////////////////////////////////////////////////////////
// SerializedImageDataSettings
SerializedImageDataSettings::SerializedImageDataSettings(
CanvasColorSpace color_space,
ImageDataStorageFormat storage_format)
: color_space_(SerializeColorSpace(color_space)) {
switch (storage_format) {
case kUint8ClampedArrayStorageFormat:
storage_format_ = SerializedImageDataStorageFormat::kUint8Clamped;
break;
case kUint16ArrayStorageFormat:
storage_format_ = SerializedImageDataStorageFormat::kUint16;
break;
case kFloat32ArrayStorageFormat:
storage_format_ = SerializedImageDataStorageFormat::kFloat32;
break;
}
}
SerializedImageDataSettings::SerializedImageDataSettings(
SerializedColorSpace color_space,
SerializedImageDataStorageFormat storage_format)
: color_space_(color_space), storage_format_(storage_format) {}
CanvasColorSpace SerializedImageDataSettings::GetColorSpace() const {
return DeserializeColorSpace(color_space_);
}
ImageDataStorageFormat SerializedImageDataSettings::GetStorageFormat() const {
switch (storage_format_) {
case SerializedImageDataStorageFormat::kUint8Clamped:
return kUint8ClampedArrayStorageFormat;
case SerializedImageDataStorageFormat::kUint16:
return kUint16ArrayStorageFormat;
case SerializedImageDataStorageFormat::kFloat32:
return kFloat32ArrayStorageFormat;
}
NOTREACHED();
return kUint8ClampedArrayStorageFormat;
}
ImageDataSettings* SerializedImageDataSettings::GetImageDataSettings() const {
ImageDataSettings* settings = ImageDataSettings::Create();
switch (DeserializeColorSpace(color_space_)) {
case CanvasColorSpace::kSRGB:
settings->setColorSpace(kSRGBCanvasColorSpaceName);
break;
case CanvasColorSpace::kRec2020:
settings->setColorSpace(kRec2020CanvasColorSpaceName);
break;
case CanvasColorSpace::kP3:
settings->setColorSpace(kP3CanvasColorSpaceName);
break;
}
switch (storage_format_) {
case SerializedImageDataStorageFormat::kUint8Clamped:
settings->setStorageFormat(kUint8ClampedArrayStorageFormatName);
break;
case SerializedImageDataStorageFormat::kUint16:
settings->setStorageFormat(kUint16ArrayStorageFormatName);
break;
case SerializedImageDataStorageFormat::kFloat32:
settings->setStorageFormat(kFloat32ArrayStorageFormatName);
break;
}
return settings;
}
////////////////////////////////////////////////////////////////////////////////
// SerializedImageBitmapSettings
SerializedImageBitmapSettings::SerializedImageBitmapSettings() = default;
SerializedImageBitmapSettings::SerializedImageBitmapSettings(SkImageInfo info) {
color_space_ =
SerializeColorSpace(CanvasColorSpaceFromSkColorSpace(info.colorSpace()));
switch (info.colorType()) {
default:
case kRGBA_8888_SkColorType:
pixel_format_ = SerializedPixelFormat::kRGBA8;
break;
case kBGRA_8888_SkColorType:
pixel_format_ = SerializedPixelFormat::kBGRA8;
break;
case kRGB_888x_SkColorType:
pixel_format_ = SerializedPixelFormat::kRGBX8;
break;
case kRGBA_F16_SkColorType:
pixel_format_ = SerializedPixelFormat::kF16;
break;
}
switch (info.alphaType()) {
case kUnknown_SkAlphaType:
case kPremul_SkAlphaType:
opacity_mode_ = SerializedOpacityMode::kNonOpaque;
is_premultiplied_ = true;
break;
case kUnpremul_SkAlphaType:
opacity_mode_ = SerializedOpacityMode::kNonOpaque;
is_premultiplied_ = false;
break;
case kOpaque_SkAlphaType:
opacity_mode_ = SerializedOpacityMode::kOpaque;
is_premultiplied_ = true;
break;
}
}
SerializedImageBitmapSettings::SerializedImageBitmapSettings(
SerializedColorSpace color_space,
SerializedPixelFormat pixel_format,
SerializedOpacityMode opacity_mode,
uint32_t is_premultiplied)
: color_space_(color_space),
pixel_format_(pixel_format),
opacity_mode_(opacity_mode),
is_premultiplied_(is_premultiplied) {}
SkImageInfo SerializedImageBitmapSettings::GetSkImageInfo(
uint32_t width,
uint32_t height) const {
sk_sp<SkColorSpace> sk_color_space =
CanvasColorSpaceToSkColorSpace(DeserializeColorSpace(color_space_));
SkColorType sk_color_type = kRGBA_8888_SkColorType;
switch (pixel_format_) {
case SerializedPixelFormat::kNative8_LegacyObsolete:
sk_color_type = kN32_SkColorType;
break;
case SerializedPixelFormat::kRGBA8:
sk_color_type = kRGBA_8888_SkColorType;
break;
case SerializedPixelFormat::kBGRA8:
sk_color_type = kBGRA_8888_SkColorType;
break;
case SerializedPixelFormat::kRGBX8:
sk_color_type = kRGB_888x_SkColorType;
break;
case SerializedPixelFormat::kF16:
sk_color_type = kRGBA_F16_SkColorType;
break;
}
SkAlphaType sk_alpha_type = kPremul_SkAlphaType;
if (opacity_mode_ == SerializedOpacityMode::kOpaque) {
sk_alpha_type = kOpaque_SkAlphaType;
} else if (is_premultiplied_) {
sk_alpha_type = kPremul_SkAlphaType;
} else {
sk_alpha_type = kUnpremul_SkAlphaType;
}
blink::OpacityMode opacity_mode = blink::kNonOpaque;
if (opacity_mode_ == SerializedOpacityMode::kOpaque)
opacity_mode = blink::kOpaque;
return SkImageInfo::Make(width, height, sk_color_type, sk_alpha_type,
std::move(sk_color_space));
}
} // namespace blink