Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(866)

Unified Diff: third_party/WebKit/Source/core/frame/ImageBitmap.cpp

Issue 2522693002: Color correct ImageBitmap(HTMLImageElement*) constructor (Closed)
Patch Set: Removing ImageDecoder::globalTargetColorSpace() calls for now Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/frame/ImageBitmap.cpp
diff --git a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
index c1cb64a471998ea3f1508f3306a180c6237de77a..6fed8520ca204c25a33fa372d382910cec182fea 100644
--- a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
+++ b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
@@ -31,10 +31,9 @@ struct ParsedOptions {
unsigned resizeHeight = 0;
IntRect cropRect;
SkFilterQuality resizeQuality = kLow_SkFilterQuality;
- // This value should be changed in the future when we support
- // createImageBitmap with higher bit depth, in the parseOptions() function.
- // For now, it is always 4.
int bytesPerPixel = 4;
+ sk_sp<SkColorSpace> dstColorSpace = nullptr;
+ SkColorType dstColorType = SkColorType::kUnknown_SkColorType;
};
// The following two functions are helpers used in cropImage
@@ -63,6 +62,33 @@ ParsedOptions parseOptions(const ImageBitmapOptions& options,
options.premultiplyAlpha() == "premultiply");
}
+ if (options.colorSpaceConversion() != "none") {
+ if (!RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() ||
+ !RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) {
+ DCHECK_EQ(options.colorSpaceConversion(), "default");
+ //parsedOptions.dstColorSpace = ImageDecoder::globalTargetColorSpace();
zakerinasab 2016/11/24 20:13:42 @ccameron Can you take a look at this? When I do t
xidachen 2016/11/24 20:27:31 I am fine with setting this to SkColorSpace::MakeN
zakerinasab 2016/11/24 20:51:12 Done.
+ parsedOptions.dstColorSpace =
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
+ parsedOptions.dstColorType = SkColorType::kN32_SkColorType;
+ } else {
+ if (options.colorSpaceConversion() == "default" ||
+ options.colorSpaceConversion() == "srgb") {
+ parsedOptions.dstColorSpace =
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
+ parsedOptions.dstColorType = SkColorType::kN32_SkColorType;
+ } else if (options.colorSpaceConversion() == "linear-rgb") {
+ parsedOptions.bytesPerPixel = 8;
+ parsedOptions.dstColorSpace =
+ SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named);
+ parsedOptions.dstColorType = SkColorType::kRGBA_F16_SkColorType;
+ } else {
+ NOTREACHED()
+ << "Invalid ImageBitmap creation attribute colorSpaceConversion: "
+ << options.colorSpaceConversion();
+ }
+ }
+ }
+
int sourceWidth = sourceSize.width();
int sourceHeight = sourceSize.height();
if (!cropRect) {
@@ -232,6 +258,20 @@ static sk_sp<SkImage> unPremulSkImageToPremul(SkImage* input) {
static_cast<unsigned>(input->width()) * info.bytesPerPixel());
}
+static sk_sp<SkImage> applyColorSpaceConversion(
+ sk_sp<SkImage> image,
+ const ParsedOptions& parsedOptions) {
+ if (!parsedOptions.dstColorSpace)
+ return image;
+
+ SkImageInfo imageInfo = SkImageInfo::Make(
+ image->width(), image->height(), parsedOptions.dstColorType,
+ image->alphaType(), parsedOptions.dstColorSpace);
+ sk_sp<SkSurface> surface = SkSurface::MakeRaster(imageInfo);
+ surface->getCanvas()->drawImage(image, 0, 0);
+ return surface->makeImageSnapshot();
+}
+
sk_sp<SkImage> ImageBitmap::getSkImageFromDecoder(
std::unique_ptr<ImageDecoder> decoder) {
if (!decoder->frameCount())
@@ -322,6 +362,9 @@ static PassRefPtr<StaticBitmapImage> cropImage(
if (parsedOptions.cropRect == srcRect && !parsedOptions.shouldScaleInput) {
sk_sp<SkImage> croppedSkImage = skiaImage->makeSubset(srcRect);
+ if (parsedOptions.dstColorSpace) {
+ croppedSkImage = applyColorSpaceConversion(croppedSkImage, parsedOptions);
+ }
if (parsedOptions.flipY)
return StaticBitmapImage::create(flipSkImageVertically(
croppedSkImage.get(), parsedOptions.premultiplyAlpha
@@ -368,6 +411,8 @@ static PassRefPtr<StaticBitmapImage> cropImage(
surface->getCanvas()->drawImage(skiaImage, dstLeft, dstTop);
}
skiaImage = surface->makeImageSnapshot();
+ if (parsedOptions.dstColorSpace)
+ skiaImage = applyColorSpaceConversion(skiaImage, parsedOptions);
if (parsedOptions.premultiplyAlpha) {
if (imageFormat == DontPremultiplyAlpha)
@@ -388,13 +433,10 @@ ImageBitmap::ImageBitmap(HTMLImageElement* image,
if (dstBufferSizeHasOverflow(parsedOptions))
return;
- if (options.colorSpaceConversion() == "none") {
- m_image = cropImage(input.get(), parsedOptions, PremultiplyAlpha,
- ImageDecoder::ColorSpaceIgnored);
- } else {
- m_image = cropImage(input.get(), parsedOptions, PremultiplyAlpha,
- ImageDecoder::ColorSpaceApplied);
- }
+ m_image =
+ cropImage(input.get(), parsedOptions, PremultiplyAlpha,
+ parsedOptions.dstColorSpace ? ImageDecoder::ColorSpaceApplied
+ : ImageDecoder::ColorSpaceIgnored);
if (!m_image)
return;
// In the case where the source image is lazy-decoded, m_image may not be in

Powered by Google App Engine
This is Rietveld 408576698