| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "modules/canvas2d/CanvasRenderingContext2D.h" | 5 #include "modules/canvas2d/CanvasRenderingContext2D.h" |
| 6 | 6 |
| 7 #include "core/dom/Document.h" | 7 #include "core/dom/Document.h" |
| 8 #include "core/frame/FrameView.h" | 8 #include "core/frame/FrameView.h" |
| 9 #include "core/frame/ImageBitmap.h" | 9 #include "core/frame/ImageBitmap.h" |
| 10 #include "core/html/HTMLCanvasElement.h" | 10 #include "core/html/HTMLCanvasElement.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 #include "third_party/skia/include/core/SkColorSpaceXform.h" | 28 #include "third_party/skia/include/core/SkColorSpaceXform.h" |
| 29 #include "third_party/skia/include/core/SkImage.h" | 29 #include "third_party/skia/include/core/SkImage.h" |
| 30 #include "third_party/skia/include/core/SkSurface.h" | 30 #include "third_party/skia/include/core/SkSurface.h" |
| 31 #include "wtf/PtrUtil.h" | 31 #include "wtf/PtrUtil.h" |
| 32 #include <memory> | 32 #include <memory> |
| 33 | 33 |
| 34 using ::testing::Mock; | 34 using ::testing::Mock; |
| 35 | 35 |
| 36 namespace blink { | 36 namespace blink { |
| 37 | 37 |
| 38 namespace { |
| 39 |
| 40 gfx::ColorSpace AdobeRGBColorSpace() { |
| 41 return gfx::ColorSpace(gfx::ColorSpace::PrimaryID::ADOBE_RGB, |
| 42 gfx::ColorSpace::TransferID::GAMMA22); |
| 43 } |
| 44 |
| 45 } // namespace |
| 46 |
| 38 enum BitmapOpacity { OpaqueBitmap, TransparentBitmap }; | 47 enum BitmapOpacity { OpaqueBitmap, TransparentBitmap }; |
| 39 | 48 |
| 40 class FakeImageSource : public CanvasImageSource { | 49 class FakeImageSource : public CanvasImageSource { |
| 41 public: | 50 public: |
| 42 FakeImageSource(IntSize, BitmapOpacity); | 51 FakeImageSource(IntSize, BitmapOpacity); |
| 43 | 52 |
| 44 PassRefPtr<Image> getSourceImageForCanvas(SourceImageStatus*, | 53 PassRefPtr<Image> getSourceImageForCanvas(SourceImageStatus*, |
| 45 AccelerationHint, | 54 AccelerationHint, |
| 46 SnapshotReason, | 55 SnapshotReason, |
| 47 const FloatSize&) const override; | 56 const FloatSize&) const override; |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 void CanvasRenderingContext2DTest::TearDown() { | 217 void CanvasRenderingContext2DTest::TearDown() { |
| 209 ThreadState::current()->collectGarbage( | 218 ThreadState::current()->collectGarbage( |
| 210 BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); | 219 BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); |
| 211 replaceMemoryCacheForTesting(m_globalMemoryCache.release()); | 220 replaceMemoryCacheForTesting(m_globalMemoryCache.release()); |
| 212 } | 221 } |
| 213 | 222 |
| 214 PassRefPtr<Canvas2DLayerBridge> CanvasRenderingContext2DTest::makeBridge( | 223 PassRefPtr<Canvas2DLayerBridge> CanvasRenderingContext2DTest::makeBridge( |
| 215 std::unique_ptr<FakeWebGraphicsContext3DProvider> provider, | 224 std::unique_ptr<FakeWebGraphicsContext3DProvider> provider, |
| 216 const IntSize& size, | 225 const IntSize& size, |
| 217 Canvas2DLayerBridge::AccelerationMode accelerationMode) { | 226 Canvas2DLayerBridge::AccelerationMode accelerationMode) { |
| 218 return adoptRef(new Canvas2DLayerBridge(std::move(provider), size, 0, | 227 return adoptRef(new Canvas2DLayerBridge( |
| 219 NonOpaque, accelerationMode, nullptr, | 228 std::move(provider), size, 0, NonOpaque, accelerationMode, |
| 220 kN32_SkColorType)); | 229 gfx::ColorSpace::CreateSRGB(), false, kN32_SkColorType)); |
| 221 } | 230 } |
| 222 | 231 |
| 223 //============================================================================ | 232 //============================================================================ |
| 224 | 233 |
| 225 class FakeAcceleratedImageBufferSurfaceForTesting | 234 class FakeAcceleratedImageBufferSurfaceForTesting |
| 226 : public UnacceleratedImageBufferSurface { | 235 : public UnacceleratedImageBufferSurface { |
| 227 public: | 236 public: |
| 228 FakeAcceleratedImageBufferSurfaceForTesting(const IntSize& size, | 237 FakeAcceleratedImageBufferSurfaceForTesting(const IntSize& size, |
| 229 OpacityMode mode) | 238 OpacityMode mode) |
| 230 : UnacceleratedImageBufferSurface(size, mode), m_isAccelerated(true) {} | 239 : UnacceleratedImageBufferSurface(size, mode), m_isAccelerated(true) {} |
| (...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 | 1144 |
| 1136 EXPECT_EQ(0, getCurrentGPUMemoryUsage()); | 1145 EXPECT_EQ(0, getCurrentGPUMemoryUsage()); |
| 1137 EXPECT_EQ(0, getGlobalGPUMemoryUsage()); | 1146 EXPECT_EQ(0, getGlobalGPUMemoryUsage()); |
| 1138 EXPECT_EQ(0u, getGlobalAcceleratedImageBufferCount()); | 1147 EXPECT_EQ(0u, getGlobalAcceleratedImageBufferCount()); |
| 1139 } | 1148 } |
| 1140 | 1149 |
| 1141 TEST_F(CanvasRenderingContext2DTest, | 1150 TEST_F(CanvasRenderingContext2DTest, |
| 1142 LegacyColorSpaceUsesGlobalTargetColorBehavior) { | 1151 LegacyColorSpaceUsesGlobalTargetColorBehavior) { |
| 1143 // Set the global target color space to something distinctly recognizable (not | 1152 // Set the global target color space to something distinctly recognizable (not |
| 1144 // srgb) | 1153 // srgb) |
| 1145 sk_sp<SkColorSpace> savedGlobalTargetColorSpace = | 1154 gfx::ColorSpace savedGlobalTargetColorSpace = |
| 1146 ColorBehavior::globalTargetColorSpace(); | 1155 ColorBehavior::globalTargetColorSpace(); |
| 1147 ColorBehavior::setGlobalTargetColorSpaceForTesting( | 1156 ColorBehavior::setGlobalTargetColorSpaceForTesting(AdobeRGBColorSpace()); |
| 1148 SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named)); | |
| 1149 bool savedColorCorrectRenderingEnabled = | 1157 bool savedColorCorrectRenderingEnabled = |
| 1150 RuntimeEnabledFeatures::colorCorrectRenderingEnabled(); | 1158 RuntimeEnabledFeatures::colorCorrectRenderingEnabled(); |
| 1151 | 1159 |
| 1152 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled(false); | 1160 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled(false); |
| 1153 createContext(NonOpaque, "legacy-srgb"); | 1161 createContext(NonOpaque, "legacy-srgb"); |
| 1154 ColorBehavior behavior = context2d()->drawImageColorBehavior(); | 1162 ColorBehavior behavior = context2d()->drawImageColorBehavior(); |
| 1155 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); | 1163 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); |
| 1156 EXPECT_TRUE( | 1164 EXPECT_TRUE(ColorBehavior::globalTargetColorSpace() == |
| 1157 SkColorSpace::Equals(ColorBehavior::globalTargetColorSpace().get(), | 1165 behavior.targetColorSpace()); |
| 1158 behavior.targetColorSpace().get())); | |
| 1159 | 1166 |
| 1160 // Restore global state to avoid interfering with other tests | 1167 // Restore global state to avoid interfering with other tests |
| 1161 ColorBehavior::setGlobalTargetColorSpaceForTesting( | 1168 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1162 savedGlobalTargetColorSpace); | 1169 savedGlobalTargetColorSpace); |
| 1163 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled( | 1170 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled( |
| 1164 savedColorCorrectRenderingEnabled); | 1171 savedColorCorrectRenderingEnabled); |
| 1165 } | 1172 } |
| 1166 | 1173 |
| 1167 TEST_F(CanvasRenderingContext2DTest, | 1174 TEST_F(CanvasRenderingContext2DTest, |
| 1168 LegacyColorSpaceUsesSRGBWhenColorCorrectRenderingEnabled) { | 1175 LegacyColorSpaceUsesSRGBWhenColorCorrectRenderingEnabled) { |
| 1169 // Set the global target color space to something distinctly recognizable (not | 1176 // Set the global target color space to something distinctly recognizable (not |
| 1170 // srgb) | 1177 // srgb) |
| 1171 sk_sp<SkColorSpace> savedGlobalTargetColorSpace = | 1178 gfx::ColorSpace savedGlobalTargetColorSpace = |
| 1172 ColorBehavior::globalTargetColorSpace(); | 1179 ColorBehavior::globalTargetColorSpace(); |
| 1173 ColorBehavior::setGlobalTargetColorSpaceForTesting( | 1180 ColorBehavior::setGlobalTargetColorSpaceForTesting(AdobeRGBColorSpace()); |
| 1174 SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named)); | |
| 1175 bool savedColorCorrectRenderingEnabled = | 1181 bool savedColorCorrectRenderingEnabled = |
| 1176 RuntimeEnabledFeatures::colorCorrectRenderingEnabled(); | 1182 RuntimeEnabledFeatures::colorCorrectRenderingEnabled(); |
| 1177 | 1183 |
| 1178 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled(true); | 1184 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled(true); |
| 1179 createContext(NonOpaque, "legacy-srgb"); | 1185 createContext(NonOpaque, "legacy-srgb"); |
| 1180 ColorBehavior behavior = context2d()->drawImageColorBehavior(); | 1186 ColorBehavior behavior = context2d()->drawImageColorBehavior(); |
| 1181 sk_sp<SkColorSpace> srgbColorSpace = | |
| 1182 SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); | |
| 1183 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); | 1187 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); |
| 1184 EXPECT_TRUE(SkColorSpace::Equals(srgbColorSpace.get(), | 1188 EXPECT_TRUE(gfx::ColorSpace::CreateSRGB() == behavior.targetColorSpace()); |
| 1185 behavior.targetColorSpace().get())); | |
| 1186 | 1189 |
| 1187 // Restore global state to avoid interfering with other tests | 1190 // Restore global state to avoid interfering with other tests |
| 1188 ColorBehavior::setGlobalTargetColorSpaceForTesting( | 1191 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1189 savedGlobalTargetColorSpace); | 1192 savedGlobalTargetColorSpace); |
| 1190 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled( | 1193 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled( |
| 1191 savedColorCorrectRenderingEnabled); | 1194 savedColorCorrectRenderingEnabled); |
| 1192 } | 1195 } |
| 1193 | 1196 |
| 1194 TEST_F(CanvasRenderingContext2DTest, | 1197 TEST_F(CanvasRenderingContext2DTest, |
| 1195 SRGBColorSpaceUsesTransformToSRGBColorBehavior) { | 1198 SRGBColorSpaceUsesTransformToSRGBColorBehavior) { |
| 1196 // Set the global target color space to something distinctly recognizable (not | 1199 // Set the global target color space to something distinctly recognizable (not |
| 1197 // srgb) | 1200 // srgb) |
| 1198 sk_sp<SkColorSpace> savedGlobalTargetColorSpace = | 1201 gfx::ColorSpace savedGlobalTargetColorSpace = |
| 1199 ColorBehavior::globalTargetColorSpace(); | 1202 ColorBehavior::globalTargetColorSpace(); |
| 1200 ColorBehavior::setGlobalTargetColorSpaceForTesting( | 1203 ColorBehavior::setGlobalTargetColorSpaceForTesting(AdobeRGBColorSpace()); |
| 1201 SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named)); | |
| 1202 | 1204 |
| 1203 createContext(NonOpaque, "srgb"); | 1205 createContext(NonOpaque, "srgb"); |
| 1204 ColorBehavior behavior = context2d()->drawImageColorBehavior(); | 1206 ColorBehavior behavior = context2d()->drawImageColorBehavior(); |
| 1205 sk_sp<SkColorSpace> srgbColorSpace = | |
| 1206 SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); | |
| 1207 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); | 1207 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); |
| 1208 EXPECT_TRUE(SkColorSpace::Equals(srgbColorSpace.get(), | 1208 EXPECT_TRUE(gfx::ColorSpace::CreateSRGB() == behavior.targetColorSpace()); |
| 1209 behavior.targetColorSpace().get())); | |
| 1210 | 1209 |
| 1211 // Restore global state to avoid interfering with other tests | 1210 // Restore global state to avoid interfering with other tests |
| 1212 ColorBehavior::setGlobalTargetColorSpaceForTesting( | 1211 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1213 savedGlobalTargetColorSpace); | 1212 savedGlobalTargetColorSpace); |
| 1214 } | 1213 } |
| 1215 | 1214 |
| 1216 TEST_F(CanvasRenderingContext2DTest, | 1215 TEST_F(CanvasRenderingContext2DTest, |
| 1217 LinearRGBColorSpaceUsesTransformToLinearSRGBColorBehavior) { | 1216 LinearRGBColorSpaceUsesTransformToLinearSRGBColorBehavior) { |
| 1218 // Set the global target color space to something distinctly recognizable (not | 1217 // Set the global target color space to something distinctly recognizable (not |
| 1219 // srgb) | 1218 // srgb) |
| 1220 sk_sp<SkColorSpace> savedGlobalTargetColorSpace = | 1219 gfx::ColorSpace savedGlobalTargetColorSpace = |
| 1221 ColorBehavior::globalTargetColorSpace(); | 1220 ColorBehavior::globalTargetColorSpace(); |
| 1222 ColorBehavior::setGlobalTargetColorSpaceForTesting( | 1221 ColorBehavior::setGlobalTargetColorSpaceForTesting(AdobeRGBColorSpace()); |
| 1223 SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named)); | |
| 1224 | 1222 |
| 1225 createContext(NonOpaque, "linear-rgb"); | 1223 createContext(NonOpaque, "linear-rgb"); |
| 1226 ColorBehavior behavior = context2d()->drawImageColorBehavior(); | 1224 ColorBehavior behavior = context2d()->drawImageColorBehavior(); |
| 1227 sk_sp<SkColorSpace> linearSrgbColorSpace = | |
| 1228 SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); | |
| 1229 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); | 1225 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); |
| 1230 EXPECT_TRUE(SkColorSpace::Equals(linearSrgbColorSpace.get(), | 1226 EXPECT_TRUE(gfx::ColorSpace::CreateSCRGBLinear() == |
| 1231 behavior.targetColorSpace().get())); | 1227 behavior.targetColorSpace()); |
| 1232 | 1228 |
| 1233 // Restore global state to avoid interfering with other tests | 1229 // Restore global state to avoid interfering with other tests |
| 1234 ColorBehavior::setGlobalTargetColorSpaceForTesting( | 1230 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1235 savedGlobalTargetColorSpace); | 1231 savedGlobalTargetColorSpace); |
| 1236 } | 1232 } |
| 1237 | 1233 |
| 1238 enum class ColorSpaceConversion : uint8_t { | 1234 enum class ColorSpaceConversion : uint8_t { |
| 1239 NONE = 0, | 1235 NONE = 0, |
| 1240 DEFAULT_NOT_COLOR_CORRECTED = 1, | 1236 DEFAULT_NOT_COLOR_CORRECTED = 1, |
| 1241 DEFAULT_COLOR_CORRECTED = 2, | 1237 DEFAULT_COLOR_CORRECTED = 2, |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1317 SkImage* convertedImage = | 1313 SkImage* convertedImage = |
| 1318 imageBitmap->bitmapImage() | 1314 imageBitmap->bitmapImage() |
| 1319 ->imageForCurrentFrame(ColorBehavior::ignore()) | 1315 ->imageForCurrentFrame(ColorBehavior::ignore()) |
| 1320 .get(); | 1316 .get(); |
| 1321 | 1317 |
| 1322 switch (colorSpaceConversion) { | 1318 switch (colorSpaceConversion) { |
| 1323 case ColorSpaceConversion::NONE: | 1319 case ColorSpaceConversion::NONE: |
| 1324 NOTREACHED(); | 1320 NOTREACHED(); |
| 1325 break; | 1321 break; |
| 1326 case ColorSpaceConversion::DEFAULT_NOT_COLOR_CORRECTED: | 1322 case ColorSpaceConversion::DEFAULT_NOT_COLOR_CORRECTED: |
| 1327 colorSpace = ColorBehavior::globalTargetColorSpace(); | 1323 colorSpace = ColorBehavior::globalTargetColorSpace().ToSkColorSpace(); |
| 1328 colorFormat = colorFormat32; | 1324 colorFormat = colorFormat32; |
| 1329 break; | 1325 break; |
| 1330 case ColorSpaceConversion::DEFAULT_COLOR_CORRECTED: | 1326 case ColorSpaceConversion::DEFAULT_COLOR_CORRECTED: |
| 1331 case ColorSpaceConversion::SRGB: | 1327 case ColorSpaceConversion::SRGB: |
| 1332 colorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); | 1328 colorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); |
| 1333 colorFormat = colorFormat32; | 1329 colorFormat = colorFormat32; |
| 1334 break; | 1330 break; |
| 1335 case ColorSpaceConversion::LINEAR_RGB: | 1331 case ColorSpaceConversion::LINEAR_RGB: |
| 1336 colorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); | 1332 colorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); |
| 1337 colorType = SkColorType::kRGBA_F16_SkColorType; | 1333 colorType = SkColorType::kRGBA_F16_SkColorType; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1365 | 1361 |
| 1366 RuntimeEnabledFeatures::setExperimentalCanvasFeaturesEnabled( | 1362 RuntimeEnabledFeatures::setExperimentalCanvasFeaturesEnabled( |
| 1367 experimentalCanvasFeaturesRuntimeFlag); | 1363 experimentalCanvasFeaturesRuntimeFlag); |
| 1368 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled( | 1364 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled( |
| 1369 colorCorrectRenderingRuntimeFlag); | 1365 colorCorrectRenderingRuntimeFlag); |
| 1370 RuntimeEnabledFeatures::setColorCorrectRenderingDefaultModeEnabled( | 1366 RuntimeEnabledFeatures::setColorCorrectRenderingDefaultModeEnabled( |
| 1371 colorCorrectRenderingDefaultModeRuntimeFlag); | 1367 colorCorrectRenderingDefaultModeRuntimeFlag); |
| 1372 } | 1368 } |
| 1373 | 1369 |
| 1374 } // namespace blink | 1370 } // namespace blink |
| OLD | NEW |