OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |