diff options
Diffstat (limited to 'cc')
-rw-r--r-- | cc/CCLayerTreeHostCommonTest.cpp | 103 |
1 files changed, 85 insertions, 18 deletions
diff --git a/cc/CCLayerTreeHostCommonTest.cpp b/cc/CCLayerTreeHostCommonTest.cpp index b56763e..f073976 100644 --- a/cc/CCLayerTreeHostCommonTest.cpp +++ b/cc/CCLayerTreeHostCommonTest.cpp @@ -51,29 +51,31 @@ void setLayerPropertiesForTesting(CCLayerImpl* layer, const WebTransformationMat layer->setContentBounds(bounds); } -void executeCalculateDrawTransformsAndVisibility(LayerChromium* rootLayer) +void executeCalculateDrawTransformsAndVisibility(LayerChromium* rootLayer, float deviceScaleFactor = 1) { WebTransformationMatrix identityMatrix; Vector<RefPtr<LayerChromium> > dummyRenderSurfaceLayerList; int dummyMaxTextureSize = 512; + IntSize deviceViewportSize = IntSize(rootLayer->bounds().width() * deviceScaleFactor, rootLayer->bounds().height() * deviceScaleFactor); // We are probably not testing what is intended if the rootLayer bounds are empty. ASSERT(!rootLayer->bounds().isEmpty()); - CCLayerTreeHostCommon::calculateDrawTransforms(rootLayer, rootLayer->bounds(), 1, dummyMaxTextureSize, dummyRenderSurfaceLayerList); + CCLayerTreeHostCommon::calculateDrawTransforms(rootLayer, deviceViewportSize, deviceScaleFactor, dummyMaxTextureSize, dummyRenderSurfaceLayerList); CCLayerTreeHostCommon::calculateVisibleRects(dummyRenderSurfaceLayerList); } -void executeCalculateDrawTransformsAndVisibility(CCLayerImpl* rootLayer) +void executeCalculateDrawTransformsAndVisibility(CCLayerImpl* rootLayer, float deviceScaleFactor = 1) { // Note: this version skips layer sorting. WebTransformationMatrix identityMatrix; Vector<CCLayerImpl*> dummyRenderSurfaceLayerList; int dummyMaxTextureSize = 512; + IntSize deviceViewportSize = IntSize(rootLayer->bounds().width() * deviceScaleFactor, rootLayer->bounds().height() * deviceScaleFactor); // We are probably not testing what is intended if the rootLayer bounds are empty. ASSERT(!rootLayer->bounds().isEmpty()); - CCLayerTreeHostCommon::calculateDrawTransforms(rootLayer, rootLayer->bounds(), 1, 0, dummyMaxTextureSize, dummyRenderSurfaceLayerList); + CCLayerTreeHostCommon::calculateDrawTransforms(rootLayer, deviceViewportSize, deviceScaleFactor, 0, dummyMaxTextureSize, dummyRenderSurfaceLayerList); CCLayerTreeHostCommon::calculateVisibleRects(dummyRenderSurfaceLayerList); } @@ -123,6 +125,20 @@ public: virtual bool drawsContent() const OVERRIDE { return true; } }; +class MockContentLayerChromiumClient : public ContentLayerChromiumClient { +public: + MockContentLayerChromiumClient() { } + virtual ~MockContentLayerChromiumClient() { } + virtual void paintContents(SkCanvas*, const IntRect& clip, FloatRect& opaque) OVERRIDE { } +}; + +PassRefPtr<ContentLayerChromium> createDrawableContentLayerChromium(ContentLayerChromiumClient* delegate) +{ + RefPtr<ContentLayerChromium> toReturn = ContentLayerChromium::create(delegate); + toReturn->setIsDrawable(true); + return toReturn.release(); +} + TEST(CCLayerTreeHostCommonTest, verifyTransformsForNoOpLayer) { // Sanity check: For layers positioned at zero, with zero size, @@ -2220,6 +2236,71 @@ TEST(CCLayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsWithTransfor EXPECT_RECT_EQ(unclippedSurfaceContent, child1->drawableContentRect()); } +TEST(CCLayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsInHighDPI) +{ + MockContentLayerChromiumClient client; + + RefPtr<LayerChromium> root = LayerChromium::create(); + RefPtr<ContentLayerChromium> renderSurface1 = createDrawableContentLayerChromium(&client); + RefPtr<ContentLayerChromium> renderSurface2 = createDrawableContentLayerChromium(&client); + RefPtr<ContentLayerChromium> child1 = createDrawableContentLayerChromium(&client); + RefPtr<ContentLayerChromium> child2 = createDrawableContentLayerChromium(&client); + RefPtr<ContentLayerChromium> child3 = createDrawableContentLayerChromium(&client); + root->addChild(renderSurface1); + renderSurface1->addChild(renderSurface2); + renderSurface2->addChild(child1); + renderSurface2->addChild(child2); + renderSurface2->addChild(child3); + + WebTransformationMatrix identityMatrix; + setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); + setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(5, 5), IntSize(3, 4), false); + setLayerPropertiesForTesting(renderSurface2.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(5, 5), IntSize(7, 13), false); + setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(5, 5), IntSize(50, 50), false); + setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(75, 75), IntSize(50, 50), false); + setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(125, 125), IntSize(50, 50), false); + + const double deviceScaleFactor = 2; + root->setContentsScale(deviceScaleFactor); + renderSurface1->setContentsScale(deviceScaleFactor); + renderSurface2->setContentsScale(deviceScaleFactor); + child1->setContentsScale(deviceScaleFactor); + child2->setContentsScale(deviceScaleFactor); + child3->setContentsScale(deviceScaleFactor); + + root->setMasksToBounds(true); + renderSurface1->setForceRenderSurface(true); + renderSurface2->setForceRenderSurface(true); + executeCalculateDrawTransformsAndVisibility(root.get(), deviceScaleFactor); + + ASSERT_TRUE(renderSurface1->renderSurface()); + ASSERT_TRUE(renderSurface2->renderSurface()); + + // DrawableContentRects for all layers and surfaces are scaled by deviceScaleFactor. + EXPECT_RECT_EQ(IntRect(0, 0, 200, 200), root->renderSurface()->drawableContentRect()); + EXPECT_RECT_EQ(IntRect(0, 0, 200, 200), root->drawableContentRect()); + EXPECT_RECT_EQ(IntRect(10, 10, 190, 190), renderSurface1->renderSurface()->drawableContentRect()); + + // renderSurface2 lives in the "unclipped universe" of renderSurface1, and + // is only implicitly clipped by renderSurface1. + EXPECT_RECT_EQ(IntRect(10, 10, 350, 350), renderSurface2->renderSurface()->drawableContentRect()); + + EXPECT_RECT_EQ(IntRect(10, 10, 100, 100), child1->drawableContentRect()); + EXPECT_RECT_EQ(IntRect(150, 150, 100, 100), child2->drawableContentRect()); + EXPECT_RECT_EQ(IntRect(250, 250, 100, 100), child3->drawableContentRect()); + + // The root layer does not actually draw content of its own. + EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), root->visibleContentRect()); + + // All layer visibleContentRects are expressed in content space of each + // layer, so they are also scaled by the deviceScaleFactor. + EXPECT_RECT_EQ(IntRect(0, 0, 6, 8), renderSurface1->visibleContentRect()); + EXPECT_RECT_EQ(IntRect(0, 0, 14, 26), renderSurface2->visibleContentRect()); + EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), child1->visibleContentRect()); + EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), child2->visibleContentRect()); + EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), child3->visibleContentRect()); +} + TEST(CCLayerTreeHostCommonTest, verifyBackFaceCullingWithoutPreserves3d) { // Verify the behavior of back-face culling when there are no preserve-3d layers. Note @@ -3340,20 +3421,6 @@ TEST(CCLayerTreeHostCommonTest, verifyHitTestingForMultipleLayerLists) EXPECT_EQ(4, resultLayer->id()); } -class MockContentLayerChromiumClient : public ContentLayerChromiumClient { -public: - MockContentLayerChromiumClient() { } - virtual ~MockContentLayerChromiumClient() { } - virtual void paintContents(SkCanvas*, const IntRect& clip, FloatRect& opaque) OVERRIDE { } -}; - -PassRefPtr<ContentLayerChromium> createDrawableContentLayerChromium(ContentLayerChromiumClient* delegate) -{ - RefPtr<ContentLayerChromium> toReturn = ContentLayerChromium::create(delegate); - toReturn->setIsDrawable(true); - return toReturn.release(); -} - TEST(CCLayerTreeHostCommonTest, verifyLayerTransformsInHighDPI) { // Verify draw and screen space transforms of layers not in a surface. |