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

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

Issue 2924373002: color: Convert BitmapImage to sRGB ahead of time (Closed)
Patch Set: Add scale bits Created 3 years, 6 months 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 fac34953d2aa09bc9ed0cb8c96fe37fe4f8d33ec..16984c24f7742418f24966159a97d4406e3ee9e0 100644
--- a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
+++ b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
@@ -16,6 +16,7 @@
#include "platform/wtf/PtrUtil.h"
#include "platform/wtf/RefPtr.h"
#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkColorSpaceXformCanvas.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkSurface.h"
@@ -45,6 +46,7 @@ struct ParsedOptions {
SkFilterQuality resize_quality = kLow_SkFilterQuality;
CanvasColorParams color_params;
bool color_canvas_extensions_enabled = false;
+ bool convert_to_srgb = false;
Justin Novosad 2017/06/09 14:08:34 This new member is confusing IMHO because it poten
ccameron 2017/06/09 17:01:33 I removed this and replaced it with "color_params.
};
ParsedOptions DefaultOptions() {
@@ -78,8 +80,16 @@ ParsedOptions ParseOptions(const ImageBitmapOptions& options,
}
if (options.colorSpaceConversion() != kImageBitmapOptionNone) {
- parsed_options.color_canvas_extensions_enabled =
- RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled();
+ if (RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled()) {
+ parsed_options.color_canvas_extensions_enabled = true;
+ } else {
+ // When canvas color extensions are not enabled, all images may be
+ // converted ahead of time to sRGB, since that is what their destination
+ // will always be sRGB.
+ parsed_options.convert_to_srgb =
+ RuntimeEnabledFeatures::ColorCorrectRenderingEnabled();
+ }
+
if (!parsed_options.color_canvas_extensions_enabled) {
DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault);
} else {
@@ -302,6 +312,10 @@ static sk_sp<SkImage> UnPremulSkImageToPremul(
static void ApplyColorSpaceConversion(sk_sp<SkImage>& image,
ParsedOptions& options) {
+ if (options.convert_to_srgb) {
+ image = image->makeColorSpace(SkColorSpace::MakeSRGB(),
+ SkTransferFunctionBehavior::kIgnore);
+ }
if (!options.color_canvas_extensions_enabled)
return;
@@ -480,6 +494,14 @@ static PassRefPtr<StaticBitmapImage> CropImageAndApplyColorSpaceConversion(
if (src_rect.IsEmpty())
return StaticBitmapImage::Create(surface->makeImageSnapshot());
+ SkCanvas* canvas = surface->getCanvas();
+ std::unique_ptr<SkCanvas> color_transform_canvas;
+ if (parsed_options.convert_to_srgb) {
+ color_transform_canvas =
+ SkCreateColorSpaceXformCanvas(canvas, SkColorSpace::MakeSRGB());
+ canvas = color_transform_canvas.get();
+ }
+
SkScalar dst_left = std::min(0, -parsed_options.crop_rect.X());
SkScalar dst_top = std::min(0, -parsed_options.crop_rect.Y());
if (parsed_options.crop_rect.X() < 0)
@@ -487,8 +509,8 @@ static PassRefPtr<StaticBitmapImage> CropImageAndApplyColorSpaceConversion(
if (parsed_options.crop_rect.Y() < 0)
dst_top = -parsed_options.crop_rect.Y();
if (parsed_options.flip_y) {
- surface->getCanvas()->translate(0, surface->height());
- surface->getCanvas()->scale(1, -1);
+ canvas->translate(0, surface->height());
+ canvas->scale(1, -1);
}
if (parsed_options.should_scale_input) {
SkRect draw_src_rect = SkRect::MakeXYWH(
@@ -498,10 +520,9 @@ static PassRefPtr<StaticBitmapImage> CropImageAndApplyColorSpaceConversion(
parsed_options.resize_height);
SkPaint paint;
paint.setFilterQuality(parsed_options.resize_quality);
- surface->getCanvas()->drawImageRect(skia_image, draw_src_rect,
- draw_dst_rect, &paint);
+ canvas->drawImageRect(skia_image, draw_src_rect, draw_dst_rect, &paint);
} else {
- surface->getCanvas()->drawImage(skia_image, dst_left, dst_top);
+ canvas->drawImage(skia_image, dst_left, dst_top);
}
skia_image = surface->makeImageSnapshot();
ApplyColorSpaceConversion(skia_image, parsed_options);
@@ -552,7 +573,14 @@ ImageBitmap::ImageBitmap(ImageElementBase* image,
SkImageInfo::Make(sk_image->width(), sk_image->height(), dst_color_type,
kPremul_SkAlphaType, dst_color_space);
Justin Novosad 2017/06/09 14:08:34 We should just tweak the dst_color_space used here
ccameron 2017/06/09 17:01:33 Updated this to still use the xform canvas, but to
sk_sp<SkSurface> surface = SkSurface::MakeRaster(image_info);
- surface->getCanvas()->drawImage(sk_image, 0, 0);
+ SkCanvas* canvas = surface->getCanvas();
+ std::unique_ptr<SkCanvas> color_transform_canvas;
+ if (parsed_options.convert_to_srgb) {
+ color_transform_canvas =
+ SkCreateColorSpaceXformCanvas(canvas, SkColorSpace::MakeSRGB());
+ canvas = color_transform_canvas.get();
+ }
+ canvas->drawImage(sk_image, 0, 0);
image_ = StaticBitmapImage::Create(surface->makeImageSnapshot());
}
if (!image_)
@@ -912,7 +940,14 @@ ImageBitmap::ImageBitmap(ImageData* data,
paint.setFilterQuality(parsed_options.resize_quality);
SkRect dst_draw_rect = SkRect::MakeWH(parsed_options.resize_width,
parsed_options.resize_height);
- surface->getCanvas()->drawImageRect(sk_image, dst_draw_rect, &paint);
+ SkCanvas* canvas = surface->getCanvas();
+ std::unique_ptr<SkCanvas> color_transform_canvas;
+ if (parsed_options.convert_to_srgb) {
+ color_transform_canvas =
+ SkCreateColorSpaceXformCanvas(canvas, SkColorSpace::MakeSRGB());
+ canvas = color_transform_canvas.get();
+ }
+ canvas->drawImageRect(sk_image, dst_draw_rect, &paint);
sk_image = surface->makeImageSnapshot();
}
ApplyColorSpaceConversion(sk_image, parsed_options);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698