| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/fetch/MemoryCache.h" | 7 #include "core/fetch/MemoryCache.h" |
| 8 #include "core/frame/FrameView.h" | 8 #include "core/frame/FrameView.h" |
| 9 #include "core/frame/Settings.h" | 9 #include "core/frame/Settings.h" |
| 10 #include "core/html/HTMLCanvasElement.h" | 10 #include "core/html/HTMLCanvasElement.h" |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 EXPECT_TRUE(context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseRender
ingContext2D::FillText] > 0.0); | 183 EXPECT_TRUE(context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseRender
ingContext2D::FillText] > 0.0); |
| 184 EXPECT_TRUE(context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseRender
ingContext2D::StrokeText] == 0.0); | 184 EXPECT_TRUE(context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseRender
ingContext2D::StrokeText] == 0.0); |
| 185 | 185 |
| 186 | 186 |
| 187 | 187 |
| 188 // create gradient | 188 // create gradient |
| 189 CanvasGradient* gradient; | 189 CanvasGradient* gradient; |
| 190 gradient = context2d()->createLinearGradient(0, 0, 100, 100); | 190 gradient = context2d()->createLinearGradient(0, 0, 100, 100); |
| 191 context2d()->setFillStyle(StringOrCanvasGradientOrCanvasPattern::fromCanvasG
radient(gradient)); | 191 context2d()->setFillStyle(StringOrCanvasGradientOrCanvasPattern::fromCanvasG
radient(gradient)); |
| 192 context2d()->fillRect(10, 10, 100, 20); | 192 context2d()->fillRect(10, 10, 100, 20); |
| 193 EXPECT_EQ(1, context2d()->getUsage().numGradients); | 193 EXPECT_EQ(1, context2d()->getUsage().numLinearGradients); |
| 194 EXPECT_NEAR(100 * 20, context2d()->getUsage().boundingBoxAreaFillType[BaseRe
nderingContext2D::LinearGradientFillType], 1.0); | 194 EXPECT_NEAR(100 * 20, context2d()->getUsage().boundingBoxAreaFillType[BaseRe
nderingContext2D::LinearGradientFillType], 1.0); |
| 195 | 195 |
| 196 NonThrowableExceptionState exceptionState; | 196 NonThrowableExceptionState exceptionState; |
| 197 gradient = context2d()->createRadialGradient(0, 0, 100, 100, 200, 200, excep
tionState); | 197 gradient = context2d()->createRadialGradient(0, 0, 100, 100, 200, 200, excep
tionState); |
| 198 context2d()->setFillStyle(StringOrCanvasGradientOrCanvasPattern::fromCanvasG
radient(gradient)); | 198 context2d()->setFillStyle(StringOrCanvasGradientOrCanvasPattern::fromCanvasG
radient(gradient)); |
| 199 context2d()->fillRect(10, 10, 100, 20); | 199 context2d()->fillRect(10, 10, 100, 20); |
| 200 EXPECT_EQ(2, context2d()->getUsage().numGradients); | 200 EXPECT_EQ(1, context2d()->getUsage().numLinearGradients); |
| 201 EXPECT_EQ(1, context2d()->getUsage().numRadialGradients); |
| 201 EXPECT_NEAR(100 * 20, context2d()->getUsage().boundingBoxAreaFillType[BaseRe
nderingContext2D::RadialGradientFillType], 1.0); | 202 EXPECT_NEAR(100 * 20, context2d()->getUsage().boundingBoxAreaFillType[BaseRe
nderingContext2D::RadialGradientFillType], 1.0); |
| 202 | 203 |
| 203 // create pattern | 204 // create pattern |
| 204 NonThrowableExceptionState exceptionState2; | 205 NonThrowableExceptionState exceptionState2; |
| 205 ExecutionContext* execCtx = canvasElement().getExecutionContext(); | 206 ExecutionContext* execCtx = canvasElement().getExecutionContext(); |
| 206 CanvasPattern* canvasPattern = context2d()->createPattern(execCtx, &m_opaque
Bitmap, "repeat-x", exceptionState2); | 207 CanvasPattern* canvasPattern = context2d()->createPattern(execCtx, &m_opaque
Bitmap, "repeat-x", exceptionState2); |
| 207 StringOrCanvasGradientOrCanvasPattern pattern = StringOrCanvasGradientOrCanv
asPattern::fromCanvasPattern(canvasPattern); | 208 StringOrCanvasGradientOrCanvasPattern pattern = StringOrCanvasGradientOrCanv
asPattern::fromCanvasPattern(canvasPattern); |
| 208 context2d()->setFillStyle(pattern); | 209 context2d()->setFillStyle(pattern); |
| 209 context2d()->fillRect(10, 10, 200, 100); | 210 context2d()->fillRect(10, 10, 200, 100); |
| 210 EXPECT_EQ(1, context2d()->getUsage().numPatterns); | 211 EXPECT_EQ(1, context2d()->getUsage().numPatterns); |
| 211 EXPECT_NEAR(200 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR
enderingContext2D::PatternFillType], 1.0); | 212 EXPECT_NEAR(200 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR
enderingContext2D::PatternFillType], 1.0); |
| 212 | 213 |
| 213 // Other fill method | 214 // Other fill method |
| 214 context2d()->fill(Path2D::create("Hello World!!!")); | 215 context2d()->fill(Path2D::create("Hello World!!!")); |
| 215 EXPECT_EQ(numReps * 2 + 1, context2d()->getUsage().numDrawCalls[BaseRenderin
gContext2D::FillPath]); | 216 EXPECT_EQ(numReps * 2 + 1, context2d()->getUsage().numDrawCalls[BaseRenderin
gContext2D::FillPath]); |
| 216 | 217 |
| 217 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St
rokePath]); | 218 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St
rokePath]); |
| 218 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St
rokeText]); | 219 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St
rokeText]); |
| 219 EXPECT_EQ(0, context2d()->getUsage().numPutImageDataCalls); | 220 EXPECT_EQ(0, context2d()->getUsage().numPutImageDataCalls); |
| 220 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr
awImage]); | 221 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr
awSVGImage]); |
| 222 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr
awPNGImage]); |
| 221 EXPECT_EQ(0, context2d()->getUsage().numGetImageDataCalls); | 223 EXPECT_EQ(0, context2d()->getUsage().numGetImageDataCalls); |
| 222 } | 224 } |
| 223 | 225 |
| 224 TEST_F(CanvasRenderingContextUsageTrackingTest, StrokeTracking) | 226 TEST_F(CanvasRenderingContextUsageTrackingTest, StrokeTracking) |
| 225 { | 227 { |
| 226 createContext(NonOpaque); | 228 createContext(NonOpaque); |
| 227 | 229 |
| 228 int numReps = 100; | 230 int numReps = 100; |
| 229 for (int i = 0; i < numReps; i++) { | 231 for (int i = 0; i < numReps; i++) { |
| 230 context2d()->strokeRect(10, 10, 100, 100); | 232 context2d()->strokeRect(10, 10, 100, 100); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 250 EXPECT_NEAR(static_cast<double>(numReps * (100 * 100) * 2), context2d()-
>getUsage().boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokeRect], 1.0); | 252 EXPECT_NEAR(static_cast<double>(numReps * (100 * 100) * 2), context2d()-
>getUsage().boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokeRect], 1.0); |
| 251 EXPECT_NEAR(static_cast<double>(numReps * (2*100 + 2*100) * 2), context2d()-
>getUsage().boundingBoxPerimeterDrawCalls[BaseRenderingContext2D::StrokeRect], 1
.0); | 253 EXPECT_NEAR(static_cast<double>(numReps * (2*100 + 2*100) * 2), context2d()-
>getUsage().boundingBoxPerimeterDrawCalls[BaseRenderingContext2D::StrokeRect], 1
.0); |
| 252 EXPECT_NEAR(static_cast<double>(numReps * (3 * 3)), context2d()->getUsage().
boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokePath], 1.0); | 254 EXPECT_NEAR(static_cast<double>(numReps * (3 * 3)), context2d()->getUsage().
boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokePath], 1.0); |
| 253 EXPECT_NEAR(static_cast<double>(numReps * (2*3 + 2*3)), context2d()->getUsag
e().boundingBoxPerimeterDrawCalls[BaseRenderingContext2D::StrokePath], 1.0); | 255 EXPECT_NEAR(static_cast<double>(numReps * (2*3 + 2*3)), context2d()->getUsag
e().boundingBoxPerimeterDrawCalls[BaseRenderingContext2D::StrokePath], 1.0); |
| 254 | 256 |
| 255 // create gradient | 257 // create gradient |
| 256 CanvasGradient* gradient; | 258 CanvasGradient* gradient; |
| 257 gradient = context2d()->createLinearGradient(0, 0, 100, 100); | 259 gradient = context2d()->createLinearGradient(0, 0, 100, 100); |
| 258 context2d()->setStrokeStyle(StringOrCanvasGradientOrCanvasPattern::fromCanva
sGradient(gradient)); | 260 context2d()->setStrokeStyle(StringOrCanvasGradientOrCanvasPattern::fromCanva
sGradient(gradient)); |
| 259 context2d()->strokeRect(10, 10, 100, 100); | 261 context2d()->strokeRect(10, 10, 100, 100); |
| 260 EXPECT_EQ(1, context2d()->getUsage().numGradients); | 262 EXPECT_EQ(1, context2d()->getUsage().numLinearGradients); |
| 261 EXPECT_NEAR(100 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR
enderingContext2D::LinearGradientFillType], 1.0); | 263 EXPECT_NEAR(100 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR
enderingContext2D::LinearGradientFillType], 1.0); |
| 262 | 264 |
| 263 // create pattern | 265 // create pattern |
| 264 NonThrowableExceptionState exceptionState; | 266 NonThrowableExceptionState exceptionState; |
| 265 ExecutionContext* execCtx = canvasElement().getExecutionContext(); | 267 ExecutionContext* execCtx = canvasElement().getExecutionContext(); |
| 266 CanvasPattern* canvasPattern = context2d()->createPattern(execCtx, &m_opaque
Bitmap, "repeat-x", exceptionState); | 268 CanvasPattern* canvasPattern = context2d()->createPattern(execCtx, &m_opaque
Bitmap, "repeat-x", exceptionState); |
| 267 StringOrCanvasGradientOrCanvasPattern pattern = StringOrCanvasGradientOrCanv
asPattern::fromCanvasPattern(canvasPattern); | 269 StringOrCanvasGradientOrCanvasPattern pattern = StringOrCanvasGradientOrCanv
asPattern::fromCanvasPattern(canvasPattern); |
| 268 context2d()->setStrokeStyle(pattern); | 270 context2d()->setStrokeStyle(pattern); |
| 269 context2d()->strokeRect(10, 10, 100, 100); | 271 context2d()->strokeRect(10, 10, 100, 100); |
| 270 EXPECT_EQ(1, context2d()->getUsage().numPatterns); | 272 EXPECT_EQ(1, context2d()->getUsage().numPatterns); |
| 271 EXPECT_NEAR(100 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR
enderingContext2D::PatternFillType], 1.0); | 273 EXPECT_NEAR(100 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR
enderingContext2D::PatternFillType], 1.0); |
| 272 | 274 |
| 273 // Other stroke method | 275 // Other stroke method |
| 274 context2d()->stroke(Path2D::create("Hello World!!!")); | 276 context2d()->stroke(Path2D::create("Hello World!!!")); |
| 275 EXPECT_EQ(numReps + 1, context2d()->getUsage().numDrawCalls[BaseRenderingCon
text2D::StrokePath]); | 277 EXPECT_EQ(numReps + 1, context2d()->getUsage().numDrawCalls[BaseRenderingCon
text2D::StrokePath]); |
| 276 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llPath]); | 278 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llPath]); |
| 277 EXPECT_EQ(0, context2d()->getUsage().numNonConvexFillPathCalls); | 279 EXPECT_EQ(0, context2d()->getUsage().numNonConvexFillPathCalls); |
| 278 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llText]); | 280 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llText]); |
| 279 EXPECT_EQ(0, context2d()->getUsage().numPutImageDataCalls); | 281 EXPECT_EQ(0, context2d()->getUsage().numPutImageDataCalls); |
| 280 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr
awImage]); | 282 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr
awSVGImage]); |
| 283 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr
awPNGImage]); |
| 281 EXPECT_EQ(0, context2d()->getUsage().numGetImageDataCalls); | 284 EXPECT_EQ(0, context2d()->getUsage().numGetImageDataCalls); |
| 282 } | 285 } |
| 283 | 286 |
| 284 TEST_F(CanvasRenderingContextUsageTrackingTest, ImageTracking) | 287 TEST_F(CanvasRenderingContextUsageTrackingTest, ImageTracking) |
| 285 { | 288 { |
| 286 // Testing draw, put, get and filters | 289 // Testing draw, put, get and filters |
| 287 createContext(NonOpaque); | 290 createContext(NonOpaque); |
| 288 NonThrowableExceptionState exceptionState; | 291 NonThrowableExceptionState exceptionState; |
| 289 | 292 |
| 290 int numReps = 5; | 293 int numReps = 5; |
| 291 int imgWidth = 100; | 294 int imgWidth = 100; |
| 292 int imgHeight = 200; | 295 int imgHeight = 200; |
| 293 for (int i = 0; i < numReps; i++) { | 296 for (int i = 0; i < numReps; i++) { |
| 294 context2d()->putImageData(m_fullImageData.get(), 0, 0, exceptionState); | 297 context2d()->putImageData(m_fullImageData.get(), 0, 0, exceptionState); |
| 295 context2d()->drawImage(canvasElement().getExecutionContext(), &m_opaqueB
itmap, 0, 0, 1, 1, 0, 0, imgWidth, imgHeight, exceptionState); | 298 context2d()->drawImage(canvasElement().getExecutionContext(), &m_opaqueB
itmap, 0, 0, 1, 1, 0, 0, imgWidth, imgHeight, exceptionState); |
| 296 context2d()->getImageData(0, 0, 10, 100, exceptionState); | 299 context2d()->getImageData(0, 0, 10, 100, exceptionState); |
| 297 } | 300 } |
| 298 | 301 |
| 299 EXPECT_NEAR(numReps * imgWidth * imgHeight, context2d()->getUsage().bounding
BoxAreaDrawCalls[BaseRenderingContext2D::DrawImage], 0.1); | 302 EXPECT_NEAR(numReps * imgWidth * imgHeight, context2d()->getUsage().bounding
BoxAreaDrawCalls[BaseRenderingContext2D::DrawPNGImage], 0.1); |
| 300 EXPECT_NEAR(numReps * (2*imgWidth + 2*imgHeight), context2d()->getUsage().bo
undingBoxPerimeterDrawCalls[BaseRenderingContext2D::DrawImage], 0.1); | 303 EXPECT_NEAR(numReps * (2*imgWidth + 2*imgHeight), context2d()->getUsage().bo
undingBoxPerimeterDrawCalls[BaseRenderingContext2D::DrawPNGImage], 0.1); |
| 304 |
| 305 EXPECT_NEAR(0.0, context2d()->getUsage().boundingBoxAreaDrawCalls[BaseRender
ingContext2D::DrawSVGImage], 0.1); |
| 306 EXPECT_NEAR(0.0, context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseR
enderingContext2D::DrawSVGImage], 0.1); |
| 301 | 307 |
| 302 context2d()->setFilter("blur(5px)"); | 308 context2d()->setFilter("blur(5px)"); |
| 303 context2d()->drawImage(canvasElement().getExecutionContext(), &m_opaqueBitma
p, 0, 0, 1, 1, 0, 0, 10, 10, exceptionState); | 309 context2d()->drawImage(canvasElement().getExecutionContext(), &m_opaqueBitma
p, 0, 0, 1, 1, 0, 0, 10, 10, exceptionState); |
| 304 | 310 |
| 305 EXPECT_EQ(numReps, context2d()->getUsage().numPutImageDataCalls); | 311 EXPECT_EQ(numReps, context2d()->getUsage().numPutImageDataCalls); |
| 306 EXPECT_NE(0, context2d()->getUsage().areaPutImageDataCalls); | 312 EXPECT_NE(0, context2d()->getUsage().areaPutImageDataCalls); |
| 307 EXPECT_NEAR(numReps * m_fullImageData.get()->width() * m_fullImageData.get()
->height(), context2d()->getUsage().areaPutImageDataCalls, 0.1); | 313 EXPECT_NEAR(numReps * m_fullImageData.get()->width() * m_fullImageData.get()
->height(), context2d()->getUsage().areaPutImageDataCalls, 0.1); |
| 308 | 314 |
| 309 EXPECT_EQ(numReps + 1, context2d()->getUsage().numDrawCalls[BaseRenderingCon
text2D::DrawImage]); | 315 EXPECT_EQ(numReps + 1, context2d()->getUsage().numDrawCalls[BaseRenderingCon
text2D::DrawPNGImage]); |
| 310 EXPECT_EQ(numReps, context2d()->getUsage().numGetImageDataCalls); | 316 EXPECT_EQ(numReps, context2d()->getUsage().numGetImageDataCalls); |
| 311 | 317 |
| 312 EXPECT_EQ(1, context2d()->getUsage().numFilters); | 318 EXPECT_EQ(1, context2d()->getUsage().numFilters); |
| 313 EXPECT_NEAR(numReps * 10 * 100, context2d()->getUsage().areaGetImageDataCall
s, 0.1); | 319 EXPECT_NEAR(numReps * 10 * 100, context2d()->getUsage().areaGetImageDataCall
s, 0.1); |
| 314 | 320 |
| 315 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llPath]); | 321 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llPath]); |
| 316 EXPECT_EQ(0, context2d()->getUsage().numNonConvexFillPathCalls); | 322 EXPECT_EQ(0, context2d()->getUsage().numNonConvexFillPathCalls); |
| 317 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llText]); | 323 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llText]); |
| 318 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St
rokePath]); | 324 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St
rokePath]); |
| 319 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St
rokeText]); | 325 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St
rokeText]); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llRect]); | 491 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi
llRect]); |
| 486 | 492 |
| 487 for (int i = 0; i < numReps; i++) { | 493 for (int i = 0; i < numReps; i++) { |
| 488 context2d()->fillRect(10, 10, 100, 100); | 494 context2d()->fillRect(10, 10, 100, 100); |
| 489 } | 495 } |
| 490 EXPECT_EQ(numReps, context2d()->getUsage().numDrawCalls[BaseRenderingContext
2D::FillRect]); | 496 EXPECT_EQ(numReps, context2d()->getUsage().numDrawCalls[BaseRenderingContext
2D::FillRect]); |
| 491 } | 497 } |
| 492 | 498 |
| 493 } // namespace UsageTrackingTests | 499 } // namespace UsageTrackingTests |
| 494 } // namespace blink | 500 } // namespace blink |
| OLD | NEW |