| 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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 HTMLCanvasElement& canvasElement() const { return *m_canvasElement; } | 80 HTMLCanvasElement& canvasElement() const { return *m_canvasElement; } |
| 81 CanvasRenderingContext2D* context2d() const { return static_cast<CanvasRende
ringContext2D*>(canvasElement().renderingContext()); } | 81 CanvasRenderingContext2D* context2d() const { return static_cast<CanvasRende
ringContext2D*>(canvasElement().renderingContext()); } |
| 82 intptr_t getGlobalGPUMemoryUsage() const { return ImageBuffer::getGlobalGPUM
emoryUsage(); } | 82 intptr_t getGlobalGPUMemoryUsage() const { return ImageBuffer::getGlobalGPUM
emoryUsage(); } |
| 83 intptr_t getCurrentGPUMemoryUsage() const { return canvasElement().buffer()-
>getGPUMemoryUsage(); } | 83 intptr_t getCurrentGPUMemoryUsage() const { return canvasElement().buffer()-
>getGPUMemoryUsage(); } |
| 84 | 84 |
| 85 void createContext(OpacityMode); | 85 void createContext(OpacityMode); |
| 86 void TearDown(); | 86 void TearDown(); |
| 87 | 87 |
| 88 private: | 88 private: |
| 89 OwnPtr<DummyPageHolder> m_dummyPageHolder; | 89 OwnPtr<DummyPageHolder> m_dummyPageHolder; |
| 90 RefPtrWillBePersistent<HTMLDocument> m_document; | 90 Persistent<HTMLDocument> m_document; |
| 91 RefPtrWillBePersistent<HTMLCanvasElement> m_canvasElement; | 91 Persistent<HTMLCanvasElement> m_canvasElement; |
| 92 Persistent<MemoryCache> m_globalMemoryCache; | 92 Persistent<MemoryCache> m_globalMemoryCache; |
| 93 | 93 |
| 94 class WrapGradients final : public NoBaseWillBeGarbageCollectedFinalized<Wra
pGradients> { | 94 class WrapGradients final : public GarbageCollectedFinalized<WrapGradients>
{ |
| 95 public: | 95 public: |
| 96 static PassOwnPtrWillBeRawPtr<WrapGradients> create() | 96 static RawPtr<WrapGradients> create() |
| 97 { | 97 { |
| 98 return adoptPtrWillBeNoop(new WrapGradients); | 98 return adoptPtrWillBeNoop(new WrapGradients); |
| 99 } | 99 } |
| 100 | 100 |
| 101 DEFINE_INLINE_TRACE() | 101 DEFINE_INLINE_TRACE() |
| 102 { | 102 { |
| 103 visitor->trace(m_opaqueGradient); | 103 visitor->trace(m_opaqueGradient); |
| 104 visitor->trace(m_alphaGradient); | 104 visitor->trace(m_alphaGradient); |
| 105 } | 105 } |
| 106 | 106 |
| 107 StringOrCanvasGradientOrCanvasPattern m_opaqueGradient; | 107 StringOrCanvasGradientOrCanvasPattern m_opaqueGradient; |
| 108 StringOrCanvasGradientOrCanvasPattern m_alphaGradient; | 108 StringOrCanvasGradientOrCanvasPattern m_alphaGradient; |
| 109 }; | 109 }; |
| 110 | 110 |
| 111 // TODO(Oilpan): avoid tedious part-object wrapper by supporting on-heap ::t
esting::Tests. | 111 // TODO(Oilpan): avoid tedious part-object wrapper by supporting on-heap ::t
esting::Tests. |
| 112 OwnPtrWillBePersistent<WrapGradients> m_wrapGradients; | 112 Persistent<WrapGradients> m_wrapGradients; |
| 113 | 113 |
| 114 protected: | 114 protected: |
| 115 // Pre-canned objects for testing | 115 // Pre-canned objects for testing |
| 116 Persistent<ImageData> m_fullImageData; | 116 Persistent<ImageData> m_fullImageData; |
| 117 Persistent<ImageData> m_partialImageData; | 117 Persistent<ImageData> m_partialImageData; |
| 118 FakeImageSource m_opaqueBitmap; | 118 FakeImageSource m_opaqueBitmap; |
| 119 FakeImageSource m_alphaBitmap; | 119 FakeImageSource m_alphaBitmap; |
| 120 | 120 |
| 121 StringOrCanvasGradientOrCanvasPattern& opaqueGradient() { return m_wrapGradi
ents->m_opaqueGradient; } | 121 StringOrCanvasGradientOrCanvasPattern& opaqueGradient() { return m_wrapGradi
ents->m_opaqueGradient; } |
| 122 StringOrCanvasGradientOrCanvasPattern& alphaGradient() { return m_wrapGradie
nts->m_alphaGradient; } | 122 StringOrCanvasGradientOrCanvasPattern& alphaGradient() { return m_wrapGradie
nts->m_alphaGradient; } |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 EXPECT_TRUE(canvasElement().shouldBeDirectComposited()); | 439 EXPECT_TRUE(canvasElement().shouldBeDirectComposited()); |
| 440 } | 440 } |
| 441 | 441 |
| 442 TEST_F(CanvasRenderingContext2DTest, NoLayerPromotionUnderImageSizeRatioLimit) | 442 TEST_F(CanvasRenderingContext2DTest, NoLayerPromotionUnderImageSizeRatioLimit) |
| 443 { | 443 { |
| 444 createContext(NonOpaque); | 444 createContext(NonOpaque); |
| 445 OwnPtr<RecordingImageBufferSurface> surface = adoptPtr(new RecordingImageBuf
ferSurface(IntSize(10, 10), MockSurfaceFactory::create(MockSurfaceFactory::Expec
tNoFallback), NonOpaque)); | 445 OwnPtr<RecordingImageBufferSurface> surface = adoptPtr(new RecordingImageBuf
ferSurface(IntSize(10, 10), MockSurfaceFactory::create(MockSurfaceFactory::Expec
tNoFallback), NonOpaque)); |
| 446 canvasElement().createImageBufferUsingSurfaceForTesting(surface.release()); | 446 canvasElement().createImageBufferUsingSurfaceForTesting(surface.release()); |
| 447 | 447 |
| 448 NonThrowableExceptionState exceptionState; | 448 NonThrowableExceptionState exceptionState; |
| 449 RefPtrWillBeRawPtr<Element> sourceCanvasElement = document().createElement("
canvas", exceptionState); | 449 RawPtr<Element> sourceCanvasElement = document().createElement("canvas", exc
eptionState); |
| 450 EXPECT_FALSE(exceptionState.hadException()); | 450 EXPECT_FALSE(exceptionState.hadException()); |
| 451 HTMLCanvasElement* sourceCanvas = static_cast<HTMLCanvasElement*>(sourceCanv
asElement.get()); | 451 HTMLCanvasElement* sourceCanvas = static_cast<HTMLCanvasElement*>(sourceCanv
asElement.get()); |
| 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 RefPtrWillBeRawPtr<ImageBitmap> sourceImageBitmap = ImageBitmap::create(sour
ceCanvas, IntRect(IntPoint(0, 0), sourceSize), defaultOptions); | 458 RawPtr<ImageBitmap> sourceImageBitmap = ImageBitmap::create(sourceCanvas, In
tRect(IntPoint(0, 0), sourceSize), defaultOptions); |
| 459 | 459 |
| 460 context2d()->drawImage(sourceImageBitmap.get(), 0, 0, 1, 1, 0, 0, 1, 1, exce
ptionState); | 460 context2d()->drawImage(sourceImageBitmap.get(), 0, 0, 1, 1, 0, 0, 1, 1, exce
ptionState); |
| 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 RefPtrWillBeRawPtr<Element> sourceCanvasElement = document().createElement("
canvas", exceptionState); | 473 RawPtr<Element> sourceCanvasElement = document().createElement("canvas", exc
eptionState); |
| 474 EXPECT_FALSE(exceptionState.hadException()); | 474 EXPECT_FALSE(exceptionState.hadException()); |
| 475 HTMLCanvasElement* sourceCanvas = static_cast<HTMLCanvasElement*>(sourceCanv
asElement.get()); | 475 HTMLCanvasElement* sourceCanvas = static_cast<HTMLCanvasElement*>(sourceCanv
asElement.get()); |
| 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 RefPtrWillBeRawPtr<ImageBitmap> sourceImageBitmap = ImageBitmap::create(sour
ceCanvas, IntRect(IntPoint(0, 0), sourceSize), defaultOptions); | 482 RawPtr<ImageBitmap> sourceImageBitmap = ImageBitmap::create(sourceCanvas, In
tRect(IntPoint(0, 0), sourceSize), defaultOptions); |
| 483 | 483 |
| 484 context2d()->drawImage(sourceImageBitmap.get(), 0, 0, 1, 1, 0, 0, 1, 1, exce
ptionState); | 484 context2d()->drawImage(sourceImageBitmap.get(), 0, 0, 1, 1, 0, 0, 1, 1, exce
ptionState); |
| 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); |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 createContext(NonOpaque); | 653 createContext(NonOpaque); |
| 654 OwnPtr<RecordingImageBufferSurface> surface = adoptPtr(new RecordingImageBuf
ferSurface(IntSize(10, 10), MockSurfaceFactory::create(MockSurfaceFactory::Expec
tNoFallback), NonOpaque)); | 654 OwnPtr<RecordingImageBufferSurface> surface = adoptPtr(new RecordingImageBuf
ferSurface(IntSize(10, 10), MockSurfaceFactory::create(MockSurfaceFactory::Expec
tNoFallback), NonOpaque)); |
| 655 canvasElement().createImageBufferUsingSurfaceForTesting(surface.release()); | 655 canvasElement().createImageBufferUsingSurfaceForTesting(surface.release()); |
| 656 | 656 |
| 657 context2d()->fillText("Text", 0, 5); | 657 context2d()->fillText("Text", 0, 5); |
| 658 } | 658 } |
| 659 | 659 |
| 660 TEST_F(CanvasRenderingContext2DTest, ImageResourceLifetime) | 660 TEST_F(CanvasRenderingContext2DTest, ImageResourceLifetime) |
| 661 { | 661 { |
| 662 NonThrowableExceptionState nonThrowableExceptionState; | 662 NonThrowableExceptionState nonThrowableExceptionState; |
| 663 RefPtrWillBeRawPtr<Element> canvasElement = document().createElement("canvas
", nonThrowableExceptionState); | 663 RawPtr<Element> canvasElement = document().createElement("canvas", nonThrowa
bleExceptionState); |
| 664 EXPECT_FALSE(nonThrowableExceptionState.hadException()); | 664 EXPECT_FALSE(nonThrowableExceptionState.hadException()); |
| 665 HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(canvasElement.ge
t()); | 665 HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(canvasElement.ge
t()); |
| 666 canvas->setHeight(40); | 666 canvas->setHeight(40); |
| 667 canvas->setWidth(40); | 667 canvas->setWidth(40); |
| 668 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapDerived = nullptr; | 668 RawPtr<ImageBitmap> imageBitmapDerived = nullptr; |
| 669 { | 669 { |
| 670 const ImageBitmapOptions defaultOptions; | 670 const ImageBitmapOptions defaultOptions; |
| 671 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapFromCanvas = ImageBitmap::cre
ate(canvas, IntRect(0, 0, canvas->width(), canvas->height()), defaultOptions); | 671 RawPtr<ImageBitmap> imageBitmapFromCanvas = ImageBitmap::create(canvas,
IntRect(0, 0, canvas->width(), canvas->height()), defaultOptions); |
| 672 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), In
tRect(0, 0, 20, 20), defaultOptions); | 672 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), In
tRect(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(imageSource, 0, 0, exceptionState); |
| 680 } | 680 } |
| 681 | 681 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after 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 |