| 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/fetch/MemoryCache.h" | 8 #include "core/fetch/MemoryCache.h" |
| 9 #include "core/frame/FrameView.h" | 9 #include "core/frame/FrameView.h" |
| 10 #include "core/frame/ImageBitmap.h" | 10 #include "core/frame/ImageBitmap.h" |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 intptr_t getGlobalGPUMemoryUsage() const { | 100 intptr_t getGlobalGPUMemoryUsage() const { |
| 101 return ImageBuffer::getGlobalGPUMemoryUsage(); | 101 return ImageBuffer::getGlobalGPUMemoryUsage(); |
| 102 } | 102 } |
| 103 unsigned getGlobalAcceleratedImageBufferCount() const { | 103 unsigned getGlobalAcceleratedImageBufferCount() const { |
| 104 return ImageBuffer::getGlobalAcceleratedImageBufferCount(); | 104 return ImageBuffer::getGlobalAcceleratedImageBufferCount(); |
| 105 } | 105 } |
| 106 intptr_t getCurrentGPUMemoryUsage() const { | 106 intptr_t getCurrentGPUMemoryUsage() const { |
| 107 return canvasElement().buffer()->getGPUMemoryUsage(); | 107 return canvasElement().buffer()->getGPUMemoryUsage(); |
| 108 } | 108 } |
| 109 | 109 |
| 110 void createContext(OpacityMode); | 110 void createContext(OpacityMode, String colorSpace = String()); |
| 111 void TearDown(); | 111 void TearDown(); |
| 112 void unrefCanvas(); | 112 void unrefCanvas(); |
| 113 PassRefPtr<Canvas2DLayerBridge> makeBridge( | 113 PassRefPtr<Canvas2DLayerBridge> makeBridge( |
| 114 std::unique_ptr<FakeWebGraphicsContext3DProvider>, | 114 std::unique_ptr<FakeWebGraphicsContext3DProvider>, |
| 115 const IntSize&, | 115 const IntSize&, |
| 116 Canvas2DLayerBridge::AccelerationMode); | 116 Canvas2DLayerBridge::AccelerationMode); |
| 117 | 117 |
| 118 private: | 118 private: |
| 119 std::unique_ptr<DummyPageHolder> m_dummyPageHolder; | 119 std::unique_ptr<DummyPageHolder> m_dummyPageHolder; |
| 120 Persistent<Document> m_document; | 120 Persistent<Document> m_document; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 151 StringOrCanvasGradientOrCanvasPattern& alphaGradient() { | 151 StringOrCanvasGradientOrCanvasPattern& alphaGradient() { |
| 152 return m_wrapGradients->m_alphaGradient; | 152 return m_wrapGradients->m_alphaGradient; |
| 153 } | 153 } |
| 154 }; | 154 }; |
| 155 | 155 |
| 156 CanvasRenderingContext2DTest::CanvasRenderingContext2DTest() | 156 CanvasRenderingContext2DTest::CanvasRenderingContext2DTest() |
| 157 : m_wrapGradients(WrapGradients::create()), | 157 : m_wrapGradients(WrapGradients::create()), |
| 158 m_opaqueBitmap(IntSize(10, 10), OpaqueBitmap), | 158 m_opaqueBitmap(IntSize(10, 10), OpaqueBitmap), |
| 159 m_alphaBitmap(IntSize(10, 10), TransparentBitmap) {} | 159 m_alphaBitmap(IntSize(10, 10), TransparentBitmap) {} |
| 160 | 160 |
| 161 void CanvasRenderingContext2DTest::createContext(OpacityMode opacityMode) { | 161 void CanvasRenderingContext2DTest::createContext(OpacityMode opacityMode, |
| 162 String colorSpace) { |
| 162 String canvasType("2d"); | 163 String canvasType("2d"); |
| 163 CanvasContextCreationAttributes attributes; | 164 CanvasContextCreationAttributes attributes; |
| 164 attributes.setAlpha(opacityMode == NonOpaque); | 165 attributes.setAlpha(opacityMode == NonOpaque); |
| 166 if (!colorSpace.isEmpty()) |
| 167 attributes.setColorSpace(colorSpace); |
| 165 m_canvasElement->getCanvasRenderingContext(canvasType, attributes); | 168 m_canvasElement->getCanvasRenderingContext(canvasType, attributes); |
| 166 } | 169 } |
| 167 | 170 |
| 168 void CanvasRenderingContext2DTest::SetUp() { | 171 void CanvasRenderingContext2DTest::SetUp() { |
| 169 Page::PageClients pageClients; | 172 Page::PageClients pageClients; |
| 170 fillWithEmptyClients(pageClients); | 173 fillWithEmptyClients(pageClients); |
| 171 m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600), &pageClients); | 174 m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600), &pageClients); |
| 172 m_document = &m_dummyPageHolder->document(); | 175 m_document = &m_dummyPageHolder->document(); |
| 173 m_document->documentElement()->setInnerHTML( | 176 m_document->documentElement()->setInnerHTML( |
| 174 "<body><canvas id='c'></canvas></body>"); | 177 "<body><canvas id='c'></canvas></body>"); |
| (...skipping 989 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 canvasElement().buffer()->disableAcceleration(); | 1167 canvasElement().buffer()->disableAcceleration(); |
| 1165 EXPECT_FALSE(canvasElement().buffer()->isAccelerated()); | 1168 EXPECT_FALSE(canvasElement().buffer()->isAccelerated()); |
| 1166 | 1169 |
| 1167 context->fillRect(10, 10, 100, 100); | 1170 context->fillRect(10, 10, 100, 100); |
| 1168 | 1171 |
| 1169 EXPECT_EQ(0, getCurrentGPUMemoryUsage()); | 1172 EXPECT_EQ(0, getCurrentGPUMemoryUsage()); |
| 1170 EXPECT_EQ(0, getGlobalGPUMemoryUsage()); | 1173 EXPECT_EQ(0, getGlobalGPUMemoryUsage()); |
| 1171 EXPECT_EQ(0u, getGlobalAcceleratedImageBufferCount()); | 1174 EXPECT_EQ(0u, getGlobalAcceleratedImageBufferCount()); |
| 1172 } | 1175 } |
| 1173 | 1176 |
| 1177 TEST_F(CanvasRenderingContext2DTest, |
| 1178 LegacyColorSpaceUsesGlobalTargetColorBehavior) { |
| 1179 // Set the global target color space to something distinctly recognizable (not |
| 1180 // srgb) |
| 1181 sk_sp<SkColorSpace> savedGlobalTargetColorSpace = |
| 1182 ColorBehavior::globalTargetColorSpace(); |
| 1183 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1184 SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named)); |
| 1185 bool savedColorCorrectRenderingEnabled = |
| 1186 RuntimeEnabledFeatures::colorCorrectRenderingEnabled(); |
| 1187 |
| 1188 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled(false); |
| 1189 createContext(NonOpaque, "legacy-srgb"); |
| 1190 ColorBehavior behavior = context2d()->drawImageColorBehavior(); |
| 1191 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); |
| 1192 EXPECT_TRUE( |
| 1193 SkColorSpace::Equals(ColorBehavior::globalTargetColorSpace().get(), |
| 1194 behavior.targetColorSpace().get())); |
| 1195 |
| 1196 // Restore global state to avoid interfering with other tests |
| 1197 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1198 savedGlobalTargetColorSpace); |
| 1199 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled( |
| 1200 savedColorCorrectRenderingEnabled); |
| 1201 } |
| 1202 |
| 1203 TEST_F(CanvasRenderingContext2DTest, |
| 1204 LegacyColorSpaceUsesSRGBWhenColorCorrectRenderingEnabled) { |
| 1205 // Set the global target color space to something distinctly recognizable (not |
| 1206 // srgb) |
| 1207 sk_sp<SkColorSpace> savedGlobalTargetColorSpace = |
| 1208 ColorBehavior::globalTargetColorSpace(); |
| 1209 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1210 SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named)); |
| 1211 bool savedColorCorrectRenderingEnabled = |
| 1212 RuntimeEnabledFeatures::colorCorrectRenderingEnabled(); |
| 1213 |
| 1214 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled(true); |
| 1215 createContext(NonOpaque, "legacy-srgb"); |
| 1216 ColorBehavior behavior = context2d()->drawImageColorBehavior(); |
| 1217 sk_sp<SkColorSpace> srgbColorSpace = |
| 1218 SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); |
| 1219 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); |
| 1220 EXPECT_TRUE(SkColorSpace::Equals(srgbColorSpace.get(), |
| 1221 behavior.targetColorSpace().get())); |
| 1222 |
| 1223 // Restore global state to avoid interfering with other tests |
| 1224 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1225 savedGlobalTargetColorSpace); |
| 1226 RuntimeEnabledFeatures::setColorCorrectRenderingEnabled( |
| 1227 savedColorCorrectRenderingEnabled); |
| 1228 } |
| 1229 |
| 1230 TEST_F(CanvasRenderingContext2DTest, |
| 1231 SRGBColorSpaceUsesTransformToSRGBColorBehavior) { |
| 1232 // Set the global target color space to something distinctly recognizable (not |
| 1233 // srgb) |
| 1234 sk_sp<SkColorSpace> savedGlobalTargetColorSpace = |
| 1235 ColorBehavior::globalTargetColorSpace(); |
| 1236 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1237 SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named)); |
| 1238 |
| 1239 createContext(NonOpaque, "srgb"); |
| 1240 ColorBehavior behavior = context2d()->drawImageColorBehavior(); |
| 1241 sk_sp<SkColorSpace> srgbColorSpace = |
| 1242 SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); |
| 1243 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); |
| 1244 EXPECT_TRUE(SkColorSpace::Equals(srgbColorSpace.get(), |
| 1245 behavior.targetColorSpace().get())); |
| 1246 |
| 1247 // Restore global state to avoid interfering with other tests |
| 1248 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1249 savedGlobalTargetColorSpace); |
| 1250 } |
| 1251 |
| 1252 TEST_F(CanvasRenderingContext2DTest, |
| 1253 LinearRGBColorSpaceUsesTransformToLinearSRGBColorBehavior) { |
| 1254 // Set the global target color space to something distinctly recognizable (not |
| 1255 // srgb) |
| 1256 sk_sp<SkColorSpace> savedGlobalTargetColorSpace = |
| 1257 ColorBehavior::globalTargetColorSpace(); |
| 1258 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1259 SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named)); |
| 1260 |
| 1261 createContext(NonOpaque, "linear-rgb"); |
| 1262 ColorBehavior behavior = context2d()->drawImageColorBehavior(); |
| 1263 sk_sp<SkColorSpace> linearSrgbColorSpace = |
| 1264 SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); |
| 1265 EXPECT_TRUE(behavior.isTransformToTargetColorSpace()); |
| 1266 EXPECT_TRUE(SkColorSpace::Equals(linearSrgbColorSpace.get(), |
| 1267 behavior.targetColorSpace().get())); |
| 1268 |
| 1269 // Restore global state to avoid interfering with other tests |
| 1270 ColorBehavior::setGlobalTargetColorSpaceForTesting( |
| 1271 savedGlobalTargetColorSpace); |
| 1272 } |
| 1273 |
| 1174 } // namespace blink | 1274 } // namespace blink |
| OLD | NEW |