Chromium Code Reviews| 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 "core/html/Float32ImageData.h" | 7 #include "core/html/Float32ImageData.h" |
| 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" |
| 11 #include "core/offscreencanvas/OffscreenCanvas.h" | 11 #include "core/offscreencanvas/OffscreenCanvas.h" |
| 12 #include "platform/graphics/skia/SkiaUtils.h" | 12 #include "platform/graphics/skia/SkiaUtils.h" |
| 13 #include "platform/image-decoders/ImageDecoder.h" | 13 #include "platform/image-decoders/ImageDecoder.h" |
| 14 #include "third_party/skia/include/core/SkCanvas.h" | 14 #include "third_party/skia/include/core/SkCanvas.h" |
| 15 #include "third_party/skia/include/core/SkImageInfo.h" | 15 #include "third_party/skia/include/core/SkImageInfo.h" |
| 16 #include "third_party/skia/include/core/SkSurface.h" | 16 #include "third_party/skia/include/core/SkSurface.h" |
| 17 #include "wtf/CheckedNumeric.h" | 17 #include "wtf/CheckedNumeric.h" |
| 18 #include "wtf/PtrUtil.h" | 18 #include "wtf/PtrUtil.h" |
| 19 #include "wtf/RefPtr.h" | 19 #include "wtf/RefPtr.h" |
| 20 #include <memory> | 20 #include <memory> |
| 21 | 21 |
| 22 namespace blink { | 22 namespace blink { |
| 23 | 23 |
| 24 static const char* imageOrientationFlipY = "flipY"; | 24 const char* const kImageOrientationFlipY = "flipY"; |
|
dcheng
2017/01/26 19:27:51
Nit: constexpr char kImageOrientationFlip = "...";
zakerinasab1
2017/01/26 20:48:42
Done.
| |
| 25 static const char* imageBitmapOptionNone = "none"; | 25 const char* const kImageBitmapOptionNone = "none"; |
| 26 const char* const kImageBitmapOptionDefault = "default"; | |
| 27 const char* const kImageBitmapOptionPremultiply = "premultiply"; | |
| 28 const char* const kImageBitmapOptionResizeQualityHigh = "high"; | |
| 29 const char* const kImageBitmapOptionResizeQualityMedium = "medium"; | |
| 30 const char* const kImageBitmapOptionResizeQualityPixelated = "pixelated"; | |
| 31 const char* const kSRGBImageBitmapColorSpaceConversion = "srgb"; | |
| 32 const char* const kLinearRGBImageBitmapColorSpaceConversion = "linear-rgb"; | |
| 26 | 33 |
| 27 namespace { | 34 namespace { |
| 28 | 35 |
| 29 struct ParsedOptions { | 36 struct ParsedOptions { |
| 30 bool flipY = false; | 37 bool flipY = false; |
| 31 bool premultiplyAlpha = true; | 38 bool premultiplyAlpha = true; |
| 32 bool shouldScaleInput = false; | 39 bool shouldScaleInput = false; |
| 33 unsigned resizeWidth = 0; | 40 unsigned resizeWidth = 0; |
| 34 unsigned resizeHeight = 0; | 41 unsigned resizeHeight = 0; |
| 35 IntRect cropRect; | 42 IntRect cropRect; |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 49 return IntRect(std::min(rect.x(), rect.maxX()), | 56 return IntRect(std::min(rect.x(), rect.maxX()), |
| 50 std::min(rect.y(), rect.maxY()), | 57 std::min(rect.y(), rect.maxY()), |
| 51 std::max(rect.width(), -rect.width()), | 58 std::max(rect.width(), -rect.width()), |
| 52 std::max(rect.height(), -rect.height())); | 59 std::max(rect.height(), -rect.height())); |
| 53 } | 60 } |
| 54 | 61 |
| 55 ParsedOptions parseOptions(const ImageBitmapOptions& options, | 62 ParsedOptions parseOptions(const ImageBitmapOptions& options, |
| 56 Optional<IntRect> cropRect, | 63 Optional<IntRect> cropRect, |
| 57 IntSize sourceSize) { | 64 IntSize sourceSize) { |
| 58 ParsedOptions parsedOptions; | 65 ParsedOptions parsedOptions; |
| 59 if (options.imageOrientation() == imageOrientationFlipY) { | 66 if (options.imageOrientation() == kImageOrientationFlipY) { |
| 60 parsedOptions.flipY = true; | 67 parsedOptions.flipY = true; |
| 61 } else { | 68 } else { |
| 62 parsedOptions.flipY = false; | 69 parsedOptions.flipY = false; |
| 63 DCHECK(options.imageOrientation() == imageBitmapOptionNone); | 70 DCHECK(options.imageOrientation() == kImageBitmapOptionNone); |
| 64 } | 71 } |
| 65 if (options.premultiplyAlpha() == imageBitmapOptionNone) { | 72 if (options.premultiplyAlpha() == kImageBitmapOptionNone) { |
| 66 parsedOptions.premultiplyAlpha = false; | 73 parsedOptions.premultiplyAlpha = false; |
| 67 } else { | 74 } else { |
| 68 parsedOptions.premultiplyAlpha = true; | 75 parsedOptions.premultiplyAlpha = true; |
| 69 DCHECK(options.premultiplyAlpha() == "default" || | 76 DCHECK(options.premultiplyAlpha() == kImageBitmapOptionDefault || |
| 70 options.premultiplyAlpha() == "premultiply"); | 77 options.premultiplyAlpha() == kImageBitmapOptionPremultiply); |
| 71 } | 78 } |
| 72 | 79 |
| 73 if (options.colorSpaceConversion() != imageBitmapOptionNone) { | 80 if (options.colorSpaceConversion() != kImageBitmapOptionNone) { |
| 74 if (!RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() || | 81 if (!RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled() || |
| 75 !RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) { | 82 !RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) { |
| 76 DCHECK_EQ(options.colorSpaceConversion(), "default"); | 83 DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault); |
| 77 if (RuntimeEnabledFeatures::colorCorrectRenderingDefaultModeEnabled()) { | 84 if (RuntimeEnabledFeatures::colorCorrectRenderingDefaultModeEnabled()) { |
| 78 parsedOptions.dstColorSpace = ColorBehavior::globalTargetColorSpace(); | 85 parsedOptions.dstColorSpace = ColorBehavior::globalTargetColorSpace(); |
| 79 parsedOptions.dstColorType = SkColorType::kN32_SkColorType; | 86 parsedOptions.dstColorType = SkColorType::kN32_SkColorType; |
| 80 } | 87 } |
| 81 } else { | 88 } else { |
| 82 if (options.colorSpaceConversion() == "default" || | 89 if (options.colorSpaceConversion() == kImageBitmapOptionDefault || |
| 83 options.colorSpaceConversion() == "srgb") { | 90 options.colorSpaceConversion() == |
| 91 kSRGBImageBitmapColorSpaceConversion) { | |
| 84 parsedOptions.dstColorSpace = | 92 parsedOptions.dstColorSpace = |
| 85 SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); | 93 SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); |
| 86 parsedOptions.dstColorType = SkColorType::kN32_SkColorType; | 94 parsedOptions.dstColorType = SkColorType::kN32_SkColorType; |
| 87 } else if (options.colorSpaceConversion() == "linear-rgb") { | 95 } else if (options.colorSpaceConversion() == |
| 96 kLinearRGBImageBitmapColorSpaceConversion) { | |
| 88 parsedOptions.dstColorSpace = | 97 parsedOptions.dstColorSpace = |
| 89 SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); | 98 SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); |
| 90 parsedOptions.dstColorType = SkColorType::kRGBA_F16_SkColorType; | 99 parsedOptions.dstColorType = SkColorType::kRGBA_F16_SkColorType; |
| 91 } else { | 100 } else { |
| 92 NOTREACHED() | 101 NOTREACHED() |
| 93 << "Invalid ImageBitmap creation attribute colorSpaceConversion: " | 102 << "Invalid ImageBitmap creation attribute colorSpaceConversion: " |
| 94 << options.colorSpaceConversion(); | 103 << options.colorSpaceConversion(); |
| 95 } | 104 } |
| 96 } | 105 } |
| 97 } | 106 } |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 122 } | 131 } |
| 123 if (static_cast<int>(parsedOptions.resizeWidth) == | 132 if (static_cast<int>(parsedOptions.resizeWidth) == |
| 124 parsedOptions.cropRect.width() && | 133 parsedOptions.cropRect.width() && |
| 125 static_cast<int>(parsedOptions.resizeHeight) == | 134 static_cast<int>(parsedOptions.resizeHeight) == |
| 126 parsedOptions.cropRect.height()) { | 135 parsedOptions.cropRect.height()) { |
| 127 parsedOptions.shouldScaleInput = false; | 136 parsedOptions.shouldScaleInput = false; |
| 128 return parsedOptions; | 137 return parsedOptions; |
| 129 } | 138 } |
| 130 parsedOptions.shouldScaleInput = true; | 139 parsedOptions.shouldScaleInput = true; |
| 131 | 140 |
| 132 if (options.resizeQuality() == "high") | 141 if (options.resizeQuality() == kImageBitmapOptionResizeQualityHigh) |
| 133 parsedOptions.resizeQuality = kHigh_SkFilterQuality; | 142 parsedOptions.resizeQuality = kHigh_SkFilterQuality; |
| 134 else if (options.resizeQuality() == "medium") | 143 else if (options.resizeQuality() == kImageBitmapOptionResizeQualityMedium) |
| 135 parsedOptions.resizeQuality = kMedium_SkFilterQuality; | 144 parsedOptions.resizeQuality = kMedium_SkFilterQuality; |
| 136 else if (options.resizeQuality() == "pixelated") | 145 else if (options.resizeQuality() == kImageBitmapOptionResizeQualityPixelated) |
| 137 parsedOptions.resizeQuality = kNone_SkFilterQuality; | 146 parsedOptions.resizeQuality = kNone_SkFilterQuality; |
| 138 else | 147 else |
| 139 parsedOptions.resizeQuality = kLow_SkFilterQuality; | 148 parsedOptions.resizeQuality = kLow_SkFilterQuality; |
| 140 return parsedOptions; | 149 return parsedOptions; |
| 141 } | 150 } |
| 142 | 151 |
| 143 bool dstBufferSizeHasOverflow(const ParsedOptions& options) { | 152 bool dstBufferSizeHasOverflow(const ParsedOptions& options) { |
| 144 CheckedNumeric<unsigned> totalBytes = options.cropRect.width(); | 153 CheckedNumeric<unsigned> totalBytes = options.cropRect.width(); |
| 145 totalBytes *= options.cropRect.height(); | 154 totalBytes *= options.cropRect.height(); |
| 146 totalBytes *= SkColorTypeBytesPerPixel(options.latestColorType); | 155 totalBytes *= SkColorTypeBytesPerPixel(options.latestColorType); |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 550 ImageBitmap::ImageBitmap(HTMLImageElement* image, | 559 ImageBitmap::ImageBitmap(HTMLImageElement* image, |
| 551 Optional<IntRect> cropRect, | 560 Optional<IntRect> cropRect, |
| 552 Document* document, | 561 Document* document, |
| 553 const ImageBitmapOptions& options) { | 562 const ImageBitmapOptions& options) { |
| 554 RefPtr<Image> input = image->cachedImage()->getImage(); | 563 RefPtr<Image> input = image->cachedImage()->getImage(); |
| 555 ParsedOptions parsedOptions = | 564 ParsedOptions parsedOptions = |
| 556 parseOptions(options, cropRect, image->bitmapSourceSize()); | 565 parseOptions(options, cropRect, image->bitmapSourceSize()); |
| 557 if (dstBufferSizeHasOverflow(parsedOptions)) | 566 if (dstBufferSizeHasOverflow(parsedOptions)) |
| 558 return; | 567 return; |
| 559 | 568 |
| 560 if (options.colorSpaceConversion() == imageBitmapOptionNone) { | 569 if (options.colorSpaceConversion() == kImageBitmapOptionNone) { |
| 561 m_image = cropImageAndApplyColorSpaceConversion( | 570 m_image = cropImageAndApplyColorSpaceConversion( |
| 562 input.get(), parsedOptions, PremultiplyAlpha, ColorBehavior::ignore()); | 571 input.get(), parsedOptions, PremultiplyAlpha, ColorBehavior::ignore()); |
| 563 } else { | 572 } else { |
| 564 m_image = cropImageAndApplyColorSpaceConversion( | 573 m_image = cropImageAndApplyColorSpaceConversion( |
| 565 input.get(), parsedOptions, PremultiplyAlpha, | 574 input.get(), parsedOptions, PremultiplyAlpha, |
| 566 ColorBehavior::transformToGlobalTarget()); | 575 ColorBehavior::transformToGlobalTarget()); |
| 567 } | 576 } |
| 568 | 577 |
| 569 if (!m_image) | 578 if (!m_image) |
| 570 return; | 579 return; |
| (...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1144 void ImageBitmap::adjustDrawRects(FloatRect* srcRect, | 1153 void ImageBitmap::adjustDrawRects(FloatRect* srcRect, |
| 1145 FloatRect* dstRect) const {} | 1154 FloatRect* dstRect) const {} |
| 1146 | 1155 |
| 1147 FloatSize ImageBitmap::elementSize(const FloatSize&) const { | 1156 FloatSize ImageBitmap::elementSize(const FloatSize&) const { |
| 1148 return FloatSize(width(), height()); | 1157 return FloatSize(width(), height()); |
| 1149 } | 1158 } |
| 1150 | 1159 |
| 1151 DEFINE_TRACE(ImageBitmap) {} | 1160 DEFINE_TRACE(ImageBitmap) {} |
| 1152 | 1161 |
| 1153 } // namespace blink | 1162 } // namespace blink |
| OLD | NEW |