| 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/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/ImageBitmap.h" | 9 #include "core/frame/ImageBitmap.h" |
| 10 #include "core/html/HTMLCanvasElement.h" | 10 #include "core/html/HTMLCanvasElement.h" |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 TEST_OVERDRAW_2(1, translate(1, 1), clearRect(-1, -1, 10, 10)); | 318 TEST_OVERDRAW_2(1, translate(1, 1), clearRect(-1, -1, 10, 10)); |
| 319 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("destination-in")), cl
earRect(0, 0, 10, 10)); // composite op ignored | 319 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("destination-in")), cl
earRect(0, 0, 10, 10)); // composite op ignored |
| 320 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), clearRect(0, 0, 10, 10)); | 320 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), clearRect(0, 0, 10, 10)); |
| 321 } | 321 } |
| 322 | 322 |
| 323 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithDrawImage) | 323 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithDrawImage) |
| 324 { | 324 { |
| 325 createContext(NonOpaque); | 325 createContext(NonOpaque); |
| 326 NonThrowableExceptionState exceptionState; | 326 NonThrowableExceptionState exceptionState; |
| 327 | 327 |
| 328 TEST_OVERDRAW_1(1, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, ex
ceptionState)); | 328 TEST_OVERDRAW_1(1, drawImage(canvasElement().getExecutionContext(), &m_opaqu
eBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); |
| 329 EXPECT_FALSE(exceptionState.hadException()); | 329 EXPECT_FALSE(exceptionState.hadException()); |
| 330 TEST_OVERDRAW_1(1, drawImage(&m_opaqueBitmap, 0, 0, 1, 1, 0, 0, 10, 10, exce
ptionState)); | 330 TEST_OVERDRAW_1(1, drawImage(canvasElement().getExecutionContext(), &m_opaqu
eBitmap, 0, 0, 1, 1, 0, 0, 10, 10, exceptionState)); |
| 331 EXPECT_FALSE(exceptionState.hadException()); | 331 EXPECT_FALSE(exceptionState.hadException()); |
| 332 TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), drawImage(&m_opaqueBitmap, 0, 0, 10
, 10, 0, 0, 10, 10, exceptionState)); | 332 TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), drawImage(canvasElement().getExecut
ionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); |
| 333 EXPECT_FALSE(exceptionState.hadException()); | 333 EXPECT_FALSE(exceptionState.hadException()); |
| 334 TEST_OVERDRAW_1(0, drawImage(&m_alphaBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exc
eptionState)); | 334 TEST_OVERDRAW_1(0, drawImage(canvasElement().getExecutionContext(), &m_alpha
Bitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); |
| 335 EXPECT_FALSE(exceptionState.hadException()); | 335 EXPECT_FALSE(exceptionState.hadException()); |
| 336 TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), drawImage(&m_alphaBitmap, 0, 0, 10,
10, 0, 0, 10, 10, exceptionState)); | 336 TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), drawImage(canvasElement().getExecut
ionContext(), &m_alphaBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); |
| 337 EXPECT_FALSE(exceptionState.hadException()); | 337 EXPECT_FALSE(exceptionState.hadException()); |
| 338 TEST_OVERDRAW_1(0, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, ex
ceptionState)); | 338 TEST_OVERDRAW_1(0, drawImage(canvasElement().getExecutionContext(), &m_opaqu
eBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState)); |
| 339 EXPECT_FALSE(exceptionState.hadException()); | 339 EXPECT_FALSE(exceptionState.hadException()); |
| 340 TEST_OVERDRAW_1(0, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 9, 9, exce
ptionState)); | 340 TEST_OVERDRAW_1(0, drawImage(canvasElement().getExecutionContext(), &m_opaqu
eBitmap, 0, 0, 10, 10, 0, 0, 9, 9, exceptionState)); |
| 341 EXPECT_FALSE(exceptionState.hadException()); | 341 EXPECT_FALSE(exceptionState.hadException()); |
| 342 TEST_OVERDRAW_1(1, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 11, 11, ex
ceptionState)); | 342 TEST_OVERDRAW_1(1, drawImage(canvasElement().getExecutionContext(), &m_opaqu
eBitmap, 0, 0, 10, 10, 0, 0, 11, 11, exceptionState)); |
| 343 EXPECT_FALSE(exceptionState.hadException()); | 343 EXPECT_FALSE(exceptionState.hadException()); |
| 344 TEST_OVERDRAW_2(1, translate(-1, 0), drawImage(&m_opaqueBitmap, 0, 0, 10, 10
, 1, 0, 10, 10, exceptionState)); | 344 TEST_OVERDRAW_2(1, translate(-1, 0), drawImage(canvasElement().getExecutionC
ontext(), &m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState)); |
| 345 EXPECT_FALSE(exceptionState.hadException()); | 345 EXPECT_FALSE(exceptionState.hadException()); |
| 346 TEST_OVERDRAW_2(0, translate(-1, 0), drawImage(&m_opaqueBitmap, 0, 0, 10, 10
, 0, 0, 10, 10, exceptionState)); | 346 TEST_OVERDRAW_2(0, translate(-1, 0), drawImage(canvasElement().getExecutionC
ontext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); |
| 347 EXPECT_FALSE(exceptionState.hadException()); | 347 EXPECT_FALSE(exceptionState.hadException()); |
| 348 TEST_OVERDRAW_2(0, setFillStyle(opaqueGradient()), drawImage(&m_alphaBitmap,
0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage | 348 TEST_OVERDRAW_2(0, setFillStyle(opaqueGradient()), drawImage(canvasElement()
.getExecutionContext(), &m_alphaBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionSta
te)); // fillStyle ignored by drawImage |
| 349 EXPECT_FALSE(exceptionState.hadException()); | 349 EXPECT_FALSE(exceptionState.hadException()); |
| 350 TEST_OVERDRAW_2(1, setFillStyle(alphaGradient()), drawImage(&m_opaqueBitmap,
0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage | 350 TEST_OVERDRAW_2(1, setFillStyle(alphaGradient()), drawImage(canvasElement().
getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionSta
te)); // fillStyle ignored by drawImage |
| 351 EXPECT_FALSE(exceptionState.hadException()); | 351 EXPECT_FALSE(exceptionState.hadException()); |
| 352 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("copy")), drawImage(&m
_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState)); | 352 TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("copy")), drawImage(ca
nvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10
, exceptionState)); |
| 353 EXPECT_FALSE(exceptionState.hadException()); | 353 EXPECT_FALSE(exceptionState.hadException()); |
| 354 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), drawImage(&m_opaqueBitmap, 0, 0
, 10, 10, 0, 0, 10, 10, exceptionState)); | 354 TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), drawImage(canvasElement().getEx
ecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); |
| 355 EXPECT_FALSE(exceptionState.hadException()); | 355 EXPECT_FALSE(exceptionState.hadException()); |
| 356 } | 356 } |
| 357 | 357 |
| 358 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithPutImageData) | 358 TEST_F(CanvasRenderingContext2DTest, detectOverdrawWithPutImageData) |
| 359 { | 359 { |
| 360 createContext(NonOpaque); | 360 createContext(NonOpaque); |
| 361 NonThrowableExceptionState exceptionState; | 361 NonThrowableExceptionState exceptionState; |
| 362 | 362 |
| 363 // Test putImageData | 363 // Test putImageData |
| 364 TEST_OVERDRAW_1(1, putImageData(m_fullImageData.get(), 0, 0, exceptionState)
); | 364 TEST_OVERDRAW_1(1, putImageData(m_fullImageData.get(), 0, 0, exceptionState)
); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 EXPECT_FALSE(exceptionState.hadException()); | 450 EXPECT_FALSE(exceptionState.hadException()); |
| 451 HTMLCanvasElement* sourceCanvas = static_cast<HTMLCanvasElement*>(sourceCanv
asElement); | 451 HTMLCanvasElement* sourceCanvas = static_cast<HTMLCanvasElement*>(sourceCanv
asElement); |
| 452 IntSize sourceSize(10, 10 * ExpensiveCanvasHeuristicParameters::ExpensiveIma
geSizeRatio); | 452 IntSize sourceSize(10, 10 * ExpensiveCanvasHeuristicParameters::ExpensiveIma
geSizeRatio); |
| 453 OwnPtr<UnacceleratedImageBufferSurface> sourceSurface = adoptPtr(new Unaccel
eratedImageBufferSurface(sourceSize, NonOpaque)); | 453 OwnPtr<UnacceleratedImageBufferSurface> sourceSurface = adoptPtr(new Unaccel
eratedImageBufferSurface(sourceSize, NonOpaque)); |
| 454 sourceCanvas->createImageBufferUsingSurfaceForTesting(sourceSurface.release(
)); | 454 sourceCanvas->createImageBufferUsingSurfaceForTesting(sourceSurface.release(
)); |
| 455 | 455 |
| 456 const ImageBitmapOptions defaultOptions; | 456 const ImageBitmapOptions defaultOptions; |
| 457 // Go through an ImageBitmap to avoid triggering a display list fallback | 457 // Go through an ImageBitmap to avoid triggering a display list fallback |
| 458 ImageBitmap* sourceImageBitmap = ImageBitmap::create(sourceCanvas, IntRect(I
ntPoint(0, 0), sourceSize), defaultOptions); | 458 ImageBitmap* sourceImageBitmap = ImageBitmap::create(sourceCanvas, IntRect(I
ntPoint(0, 0), sourceSize), defaultOptions); |
| 459 | 459 |
| 460 context2d()->drawImage(sourceImageBitmap, 0, 0, 1, 1, 0, 0, 1, 1, exceptionS
tate); | 460 context2d()->drawImage(canvasElement().getExecutionContext(), sourceImageBit
map, 0, 0, 1, 1, 0, 0, 1, 1, exceptionState); |
| 461 EXPECT_FALSE(exceptionState.hadException()); | 461 EXPECT_FALSE(exceptionState.hadException()); |
| 462 | 462 |
| 463 EXPECT_FALSE(canvasElement().shouldBeDirectComposited()); | 463 EXPECT_FALSE(canvasElement().shouldBeDirectComposited()); |
| 464 } | 464 } |
| 465 | 465 |
| 466 TEST_F(CanvasRenderingContext2DTest, LayerPromotionOverImageSizeRatioLimit) | 466 TEST_F(CanvasRenderingContext2DTest, LayerPromotionOverImageSizeRatioLimit) |
| 467 { | 467 { |
| 468 createContext(NonOpaque); | 468 createContext(NonOpaque); |
| 469 OwnPtr<RecordingImageBufferSurface> surface = adoptPtr(new RecordingImageBuf
ferSurface(IntSize(10, 10), MockSurfaceFactory::create(MockSurfaceFactory::Expec
tNoFallback), NonOpaque)); | 469 OwnPtr<RecordingImageBufferSurface> surface = adoptPtr(new RecordingImageBuf
ferSurface(IntSize(10, 10), MockSurfaceFactory::create(MockSurfaceFactory::Expec
tNoFallback), NonOpaque)); |
| 470 canvasElement().createImageBufferUsingSurfaceForTesting(surface.release()); | 470 canvasElement().createImageBufferUsingSurfaceForTesting(surface.release()); |
| 471 | 471 |
| 472 NonThrowableExceptionState exceptionState; | 472 NonThrowableExceptionState exceptionState; |
| 473 Element* sourceCanvasElement = document().createElement("canvas", exceptionS
tate); | 473 Element* sourceCanvasElement = document().createElement("canvas", exceptionS
tate); |
| 474 EXPECT_FALSE(exceptionState.hadException()); | 474 EXPECT_FALSE(exceptionState.hadException()); |
| 475 HTMLCanvasElement* sourceCanvas = static_cast<HTMLCanvasElement*>(sourceCanv
asElement); | 475 HTMLCanvasElement* sourceCanvas = static_cast<HTMLCanvasElement*>(sourceCanv
asElement); |
| 476 IntSize sourceSize(10, 10 * ExpensiveCanvasHeuristicParameters::ExpensiveIma
geSizeRatio + 1); | 476 IntSize sourceSize(10, 10 * ExpensiveCanvasHeuristicParameters::ExpensiveIma
geSizeRatio + 1); |
| 477 OwnPtr<UnacceleratedImageBufferSurface> sourceSurface = adoptPtr(new Unaccel
eratedImageBufferSurface(sourceSize, NonOpaque)); | 477 OwnPtr<UnacceleratedImageBufferSurface> sourceSurface = adoptPtr(new Unaccel
eratedImageBufferSurface(sourceSize, NonOpaque)); |
| 478 sourceCanvas->createImageBufferUsingSurfaceForTesting(sourceSurface.release(
)); | 478 sourceCanvas->createImageBufferUsingSurfaceForTesting(sourceSurface.release(
)); |
| 479 | 479 |
| 480 const ImageBitmapOptions defaultOptions; | 480 const ImageBitmapOptions defaultOptions; |
| 481 // Go through an ImageBitmap to avoid triggering a display list fallback | 481 // Go through an ImageBitmap to avoid triggering a display list fallback |
| 482 ImageBitmap* sourceImageBitmap = ImageBitmap::create(sourceCanvas, IntRect(I
ntPoint(0, 0), sourceSize), defaultOptions); | 482 ImageBitmap* sourceImageBitmap = ImageBitmap::create(sourceCanvas, IntRect(I
ntPoint(0, 0), sourceSize), defaultOptions); |
| 483 | 483 |
| 484 context2d()->drawImage(sourceImageBitmap, 0, 0, 1, 1, 0, 0, 1, 1, exceptionS
tate); | 484 context2d()->drawImage(canvasElement().getExecutionContext(), sourceImageBit
map, 0, 0, 1, 1, 0, 0, 1, 1, exceptionState); |
| 485 EXPECT_FALSE(exceptionState.hadException()); | 485 EXPECT_FALSE(exceptionState.hadException()); |
| 486 | 486 |
| 487 EXPECT_TRUE(canvasElement().shouldBeDirectComposited()); | 487 EXPECT_TRUE(canvasElement().shouldBeDirectComposited()); |
| 488 } | 488 } |
| 489 | 489 |
| 490 TEST_F(CanvasRenderingContext2DTest, NoLayerPromotionUnderExpensivePathPointCoun
t) | 490 TEST_F(CanvasRenderingContext2DTest, NoLayerPromotionUnderExpensivePathPointCoun
t) |
| 491 { | 491 { |
| 492 createContext(NonOpaque); | 492 createContext(NonOpaque); |
| 493 OwnPtr<RecordingImageBufferSurface> surface = adoptPtr(new RecordingImageBuf
ferSurface(IntSize(10, 10), MockSurfaceFactory::create(MockSurfaceFactory::Expec
tNoFallback), NonOpaque)); | 493 OwnPtr<RecordingImageBufferSurface> surface = adoptPtr(new RecordingImageBuf
ferSurface(IntSize(10, 10), MockSurfaceFactory::create(MockSurfaceFactory::Expec
tNoFallback), NonOpaque)); |
| 494 canvasElement().createImageBufferUsingSurfaceForTesting(surface.release()); | 494 canvasElement().createImageBufferUsingSurfaceForTesting(surface.release()); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 { | 669 { |
| 670 const ImageBitmapOptions defaultOptions; | 670 const ImageBitmapOptions defaultOptions; |
| 671 ImageBitmap* imageBitmapFromCanvas = ImageBitmap::create(canvas, IntRect
(0, 0, canvas->width(), canvas->height()), defaultOptions); | 671 ImageBitmap* imageBitmapFromCanvas = ImageBitmap::create(canvas, IntRect
(0, 0, canvas->width(), canvas->height()), defaultOptions); |
| 672 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas, IntRect(
0, 0, 20, 20), defaultOptions); | 672 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas, IntRect(
0, 0, 20, 20), defaultOptions); |
| 673 } | 673 } |
| 674 CanvasContextCreationAttributes attributes; | 674 CanvasContextCreationAttributes attributes; |
| 675 CanvasRenderingContext2D* context = static_cast<CanvasRenderingContext2D*>(c
anvas->getCanvasRenderingContext("2d", attributes)); | 675 CanvasRenderingContext2D* context = static_cast<CanvasRenderingContext2D*>(c
anvas->getCanvasRenderingContext("2d", attributes)); |
| 676 TrackExceptionState exceptionState; | 676 TrackExceptionState exceptionState; |
| 677 CanvasImageSourceUnion imageSource; | 677 CanvasImageSourceUnion imageSource; |
| 678 imageSource.setImageBitmap(imageBitmapDerived); | 678 imageSource.setImageBitmap(imageBitmapDerived); |
| 679 context->drawImage(imageSource, 0, 0, exceptionState); | 679 context->drawImage(canvas->getExecutionContext(), imageSource, 0, 0, excepti
onState); |
| 680 } | 680 } |
| 681 | 681 |
| 682 TEST_F(CanvasRenderingContext2DTest, GPUMemoryUpdateForAcceleratedCanvas) | 682 TEST_F(CanvasRenderingContext2DTest, GPUMemoryUpdateForAcceleratedCanvas) |
| 683 { | 683 { |
| 684 createContext(NonOpaque); | 684 createContext(NonOpaque); |
| 685 | 685 |
| 686 OwnPtr<FakeAcceleratedImageBufferSurfaceForTesting> fakeAccelerateSurface =
adoptPtr(new FakeAcceleratedImageBufferSurfaceForTesting(IntSize(10, 10), NonOpa
que)); | 686 OwnPtr<FakeAcceleratedImageBufferSurfaceForTesting> fakeAccelerateSurface =
adoptPtr(new FakeAcceleratedImageBufferSurfaceForTesting(IntSize(10, 10), NonOpa
que)); |
| 687 FakeAcceleratedImageBufferSurfaceForTesting* fakeAccelerateSurfacePtr = fake
AccelerateSurface.get(); | 687 FakeAcceleratedImageBufferSurfaceForTesting* fakeAccelerateSurfacePtr = fake
AccelerateSurface.get(); |
| 688 canvasElement().createImageBufferUsingSurfaceForTesting(fakeAccelerateSurfac
e.release()); | 688 canvasElement().createImageBufferUsingSurfaceForTesting(fakeAccelerateSurfac
e.release()); |
| 689 // 800 = 10 * 10 * 4 * 2 where 10*10 is canvas size, 4 is num of bytes per p
ixel per buffer, | 689 // 800 = 10 * 10 * 4 * 2 where 10*10 is canvas size, 4 is num of bytes per p
ixel per buffer, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 713 canvasElement().setSize(IntSize(20, 20)); | 713 canvasElement().setSize(IntSize(20, 20)); |
| 714 Mock::VerifyAndClearExpectations(fakeAccelerateSurfacePtr); | 714 Mock::VerifyAndClearExpectations(fakeAccelerateSurfacePtr); |
| 715 EXPECT_EQ(400, getGlobalGPUMemoryUsage()); | 715 EXPECT_EQ(400, getGlobalGPUMemoryUsage()); |
| 716 | 716 |
| 717 // Tear down the second image buffer | 717 // Tear down the second image buffer |
| 718 imageBuffer2.clear(); | 718 imageBuffer2.clear(); |
| 719 EXPECT_EQ(0, getGlobalGPUMemoryUsage()); | 719 EXPECT_EQ(0, getGlobalGPUMemoryUsage()); |
| 720 } | 720 } |
| 721 | 721 |
| 722 } // namespace blink | 722 } // namespace blink |
| OLD | NEW |