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

Side by Side Diff: third_party/WebKit/Source/core/frame/ImageBitmap.cpp

Issue 2893243003: color: Add ColorCanvasExtensions runtime flag (Closed)
Patch Set: Update webkit_unit_tests to use new flags 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/frame/ImageBitmap.h" 5 #include "core/frame/ImageBitmap.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include "core/html/HTMLCanvasElement.h" 8 #include "core/html/HTMLCanvasElement.h"
9 #include "core/html/HTMLVideoElement.h" 9 #include "core/html/HTMLVideoElement.h"
10 #include "core/html/ImageData.h" 10 #include "core/html/ImageData.h"
(...skipping 26 matching lines...) Expand all
37 37
38 struct ParsedOptions { 38 struct ParsedOptions {
39 bool flip_y = false; 39 bool flip_y = false;
40 bool premultiply_alpha = true; 40 bool premultiply_alpha = true;
41 bool should_scale_input = false; 41 bool should_scale_input = false;
42 unsigned resize_width = 0; 42 unsigned resize_width = 0;
43 unsigned resize_height = 0; 43 unsigned resize_height = 0;
44 IntRect crop_rect; 44 IntRect crop_rect;
45 SkFilterQuality resize_quality = kLow_SkFilterQuality; 45 SkFilterQuality resize_quality = kLow_SkFilterQuality;
46 CanvasColorParams color_params; 46 CanvasColorParams color_params;
47 bool color_correct_rendering_enabled = false; 47 bool color_canvas_extensions_enabled = false;
48 bool use_global_target_color_space = false;
49 }; 48 };
50 49
51 ParsedOptions DefaultOptions() { 50 ParsedOptions DefaultOptions() {
52 return ParsedOptions(); 51 return ParsedOptions();
53 } 52 }
54 53
55 // The following two functions are helpers used in cropImage 54 // The following two functions are helpers used in cropImage
56 static inline IntRect NormalizeRect(const IntRect& rect) { 55 static inline IntRect NormalizeRect(const IntRect& rect) {
57 return IntRect(std::min(rect.X(), rect.MaxX()), 56 return IntRect(std::min(rect.X(), rect.MaxX()),
58 std::min(rect.Y(), rect.MaxY()), 57 std::min(rect.Y(), rect.MaxY()),
(...skipping 13 matching lines...) Expand all
72 } 71 }
73 if (options.premultiplyAlpha() == kImageBitmapOptionNone) { 72 if (options.premultiplyAlpha() == kImageBitmapOptionNone) {
74 parsed_options.premultiply_alpha = false; 73 parsed_options.premultiply_alpha = false;
75 } else { 74 } else {
76 parsed_options.premultiply_alpha = true; 75 parsed_options.premultiply_alpha = true;
77 DCHECK(options.premultiplyAlpha() == kImageBitmapOptionDefault || 76 DCHECK(options.premultiplyAlpha() == kImageBitmapOptionDefault ||
78 options.premultiplyAlpha() == kImageBitmapOptionPremultiply); 77 options.premultiplyAlpha() == kImageBitmapOptionPremultiply);
79 } 78 }
80 79
81 if (options.colorSpaceConversion() != kImageBitmapOptionNone) { 80 if (options.colorSpaceConversion() != kImageBitmapOptionNone) {
82 parsed_options.color_correct_rendering_enabled = 81 parsed_options.color_canvas_extensions_enabled =
83 RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() && 82 RuntimeEnabledFeatures::colorCanvasExtensionsEnabled();
84 RuntimeEnabledFeatures::colorCorrectRenderingEnabled(); 83 if (!parsed_options.color_canvas_extensions_enabled) {
85 if (!parsed_options.color_correct_rendering_enabled) {
86 DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault); 84 DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault);
87 if (RuntimeEnabledFeatures::colorCorrectRenderingDefaultModeEnabled()) {
88 parsed_options.use_global_target_color_space = true;
89 }
90 } else { 85 } else {
91 if (options.colorSpaceConversion() == kImageBitmapOptionDefault || 86 if (options.colorSpaceConversion() == kImageBitmapOptionDefault ||
92 options.colorSpaceConversion() == 87 options.colorSpaceConversion() ==
93 kSRGBImageBitmapColorSpaceConversion) { 88 kSRGBImageBitmapColorSpaceConversion) {
94 parsed_options.color_params.SetCanvasColorSpace(kSRGBCanvasColorSpace); 89 parsed_options.color_params.SetCanvasColorSpace(kSRGBCanvasColorSpace);
95 } else if (options.colorSpaceConversion() == 90 } else if (options.colorSpaceConversion() ==
96 kLinearRGBImageBitmapColorSpaceConversion) { 91 kLinearRGBImageBitmapColorSpaceConversion) {
97 parsed_options.color_params.SetCanvasColorSpace(kSRGBCanvasColorSpace); 92 parsed_options.color_params.SetCanvasColorSpace(kSRGBCanvasColorSpace);
98 parsed_options.color_params.SetCanvasPixelFormat(kF16CanvasPixelFormat); 93 parsed_options.color_params.SetCanvasPixelFormat(kF16CanvasPixelFormat);
99 } else if (options.colorSpaceConversion() == 94 } else if (options.colorSpaceConversion() ==
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 RefPtr<Uint8Array> dst_pixels = CopySkImageData(input, info); 295 RefPtr<Uint8Array> dst_pixels = CopySkImageData(input, info);
301 if (!dst_pixels) 296 if (!dst_pixels)
302 return nullptr; 297 return nullptr;
303 return NewSkImageFromRaster( 298 return NewSkImageFromRaster(
304 info, std::move(dst_pixels), 299 info, std::move(dst_pixels),
305 static_cast<unsigned>(input->width()) * info.bytesPerPixel()); 300 static_cast<unsigned>(input->width()) * info.bytesPerPixel());
306 } 301 }
307 302
308 static void ApplyColorSpaceConversion(sk_sp<SkImage>& image, 303 static void ApplyColorSpaceConversion(sk_sp<SkImage>& image,
309 ParsedOptions& options) { 304 ParsedOptions& options) {
310 if (!options.color_correct_rendering_enabled && 305 if (!options.color_canvas_extensions_enabled)
311 !options.use_global_target_color_space)
312 return; 306 return;
313 307
314 sk_sp<SkColorSpace> dst_color_space = nullptr; 308 sk_sp<SkColorSpace> dst_color_space = nullptr;
315 SkColorType dst_color_type = kN32_SkColorType; 309 SkColorType dst_color_type = kN32_SkColorType;
316 if (options.use_global_target_color_space) { 310 dst_color_space = options.color_params.GetSkColorSpace();
317 dst_color_space = ColorBehavior::GlobalTargetColorSpace().ToSkColorSpace(); 311 dst_color_type = options.color_params.GetSkColorType();
318 } else {
319 dst_color_space = options.color_params.GetSkColorSpace();
320 dst_color_type = options.color_params.GetSkColorType();
321 }
322 if (SkColorSpace::Equals(image->colorSpace(), dst_color_space.get())) 312 if (SkColorSpace::Equals(image->colorSpace(), dst_color_space.get()))
323 return; 313 return;
324 314
325 SkImageInfo dst_info = 315 SkImageInfo dst_info =
326 SkImageInfo::Make(image->width(), image->height(), dst_color_type, 316 SkImageInfo::Make(image->width(), image->height(), dst_color_type,
327 image->alphaType(), dst_color_space); 317 image->alphaType(), dst_color_space);
328 318
329 size_t size = image->width() * image->height() * dst_info.bytesPerPixel(); 319 size_t size = image->width() * image->height() * dst_info.bytesPerPixel();
330 sk_sp<SkData> dst_data = SkData::MakeUninitialized(size); 320 sk_sp<SkData> dst_data = SkData::MakeUninitialized(size);
331 if (dst_data->size() != size) 321 if (dst_data->size() != size)
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 537
548 if (!image_) 538 if (!image_)
549 return; 539 return;
550 // In the case where the source image is lazy-decoded, m_image may not be in 540 // In the case where the source image is lazy-decoded, m_image may not be in
551 // a decoded state, we trigger it here. 541 // a decoded state, we trigger it here.
552 sk_sp<SkImage> sk_image = image_->ImageForCurrentFrame(); 542 sk_sp<SkImage> sk_image = image_->ImageForCurrentFrame();
553 SkPixmap pixmap; 543 SkPixmap pixmap;
554 if (!sk_image->isTextureBacked() && !sk_image->peekPixels(&pixmap)) { 544 if (!sk_image->isTextureBacked() && !sk_image->peekPixels(&pixmap)) {
555 sk_sp<SkColorSpace> dst_color_space = nullptr; 545 sk_sp<SkColorSpace> dst_color_space = nullptr;
556 SkColorType dst_color_type = kN32_SkColorType; 546 SkColorType dst_color_type = kN32_SkColorType;
557 if (parsed_options.use_global_target_color_space) { 547 if (parsed_options.color_canvas_extensions_enabled) {
558 dst_color_space =
559 ColorBehavior::GlobalTargetColorSpace().ToSkColorSpace();
560 } else if (parsed_options.color_correct_rendering_enabled) {
561 dst_color_space = parsed_options.color_params.GetSkColorSpace(); 548 dst_color_space = parsed_options.color_params.GetSkColorSpace();
562 dst_color_type = parsed_options.color_params.GetSkColorType(); 549 dst_color_type = parsed_options.color_params.GetSkColorType();
563 } 550 }
564 SkImageInfo image_info = 551 SkImageInfo image_info =
565 SkImageInfo::Make(sk_image->width(), sk_image->height(), dst_color_type, 552 SkImageInfo::Make(sk_image->width(), sk_image->height(), dst_color_type,
566 kPremul_SkAlphaType, dst_color_space); 553 kPremul_SkAlphaType, dst_color_space);
567 sk_sp<SkSurface> surface = SkSurface::MakeRaster(image_info); 554 sk_sp<SkSurface> surface = SkSurface::MakeRaster(image_info);
568 surface->getCanvas()->drawImage(sk_image, 0, 0); 555 surface->getCanvas()->drawImage(sk_image, 0, 0);
569 image_ = StaticBitmapImage::Create(surface->makeImageSnapshot()); 556 image_ = StaticBitmapImage::Create(surface->makeImageSnapshot());
570 } 557 }
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 } else { 855 } else {
869 image_ = StaticBitmapImage::Create(sk_image); 856 image_ = StaticBitmapImage::Create(sk_image);
870 } 857 }
871 if (!image_) 858 if (!image_)
872 return; 859 return;
873 image_->SetPremultiplied(parsed_options.premultiply_alpha); 860 image_->SetPremultiplied(parsed_options.premultiply_alpha);
874 return; 861 return;
875 } 862 }
876 863
877 CanvasColorParams canvas_color_params; 864 CanvasColorParams canvas_color_params;
878 if (RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() && 865 if (RuntimeEnabledFeatures::colorCanvasExtensionsEnabled()) {
879 RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) {
880 ImageDataColorSettings color_settings; 866 ImageDataColorSettings color_settings;
881 data->getColorSettings(color_settings); 867 data->getColorSettings(color_settings);
882 CanvasColorSpace canvas_color_space = 868 CanvasColorSpace canvas_color_space =
883 ImageData::GetCanvasColorSpace(color_settings.colorSpace()); 869 ImageData::GetCanvasColorSpace(color_settings.colorSpace());
884 CanvasPixelFormat canvas_pixel_format = kRGBA8CanvasPixelFormat; 870 CanvasPixelFormat canvas_pixel_format = kRGBA8CanvasPixelFormat;
885 if (ImageData::GetImageDataStorageFormat(color_settings.storageFormat()) != 871 if (ImageData::GetImageDataStorageFormat(color_settings.storageFormat()) !=
886 kUint8ClampedArrayStorageFormat) { 872 kUint8ClampedArrayStorageFormat) {
887 canvas_pixel_format = kF16CanvasPixelFormat; 873 canvas_pixel_format = kF16CanvasPixelFormat;
888 } 874 }
889 canvas_color_params = 875 canvas_color_params =
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 void ImageBitmap::AdjustDrawRects(FloatRect* src_rect, 1115 void ImageBitmap::AdjustDrawRects(FloatRect* src_rect,
1130 FloatRect* dst_rect) const {} 1116 FloatRect* dst_rect) const {}
1131 1117
1132 FloatSize ImageBitmap::ElementSize(const FloatSize&) const { 1118 FloatSize ImageBitmap::ElementSize(const FloatSize&) const {
1133 return FloatSize(width(), height()); 1119 return FloatSize(width(), height());
1134 } 1120 }
1135 1121
1136 DEFINE_TRACE(ImageBitmap) {} 1122 DEFINE_TRACE(ImageBitmap) {}
1137 1123
1138 } // namespace blink 1124 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/VirtualTestSuites ('k') | third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698