diff options
Diffstat (limited to 'cc/layer_tree_host_impl_unittest.cc')
-rw-r--r-- | cc/layer_tree_host_impl_unittest.cc | 137 |
1 files changed, 131 insertions, 6 deletions
diff --git a/cc/layer_tree_host_impl_unittest.cc b/cc/layer_tree_host_impl_unittest.cc index b6a3195..459ab4bb 100644 --- a/cc/layer_tree_host_impl_unittest.cc +++ b/cc/layer_tree_host_impl_unittest.cc @@ -4505,8 +4505,8 @@ TEST_P(LayerTreeHostImplTest, maskLayerWithScaling) ASSERT_EQ(1u, frame.renderPasses[0]->quad_list.size()); ASSERT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->material); const RenderPassDrawQuad* renderPassQuad = RenderPassDrawQuad::MaterialCast(frame.renderPasses[0]->quad_list[0]); - EXPECT_EQ(renderPassQuad->rect.ToString(), gfx::Rect(0, 0, 100, 100).ToString()); - EXPECT_EQ(renderPassQuad->mask_uv_rect.ToString(), gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString()); + EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), renderPassQuad->rect.ToString()); + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), renderPassQuad->mask_uv_rect.ToString()); m_hostImpl->drawLayers(frame); m_hostImpl->didDrawAllLayers(frame); @@ -4528,8 +4528,8 @@ TEST_P(LayerTreeHostImplTest, maskLayerWithScaling) ASSERT_EQ(1u, frame.renderPasses[0]->quad_list.size()); ASSERT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->material); const RenderPassDrawQuad* renderPassQuad = RenderPassDrawQuad::MaterialCast(frame.renderPasses[0]->quad_list[0]); - EXPECT_EQ(renderPassQuad->rect.ToString(), gfx::Rect(0, 0, 200, 200).ToString()); - EXPECT_EQ(renderPassQuad->mask_uv_rect.ToString(), gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString()); + EXPECT_EQ(gfx::Rect(0, 0, 200, 200).ToString(), renderPassQuad->rect.ToString()); + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), renderPassQuad->mask_uv_rect.ToString()); m_hostImpl->drawLayers(frame); m_hostImpl->didDrawAllLayers(frame); @@ -4552,8 +4552,133 @@ TEST_P(LayerTreeHostImplTest, maskLayerWithScaling) ASSERT_EQ(1u, frame.renderPasses[0]->quad_list.size()); ASSERT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->material); const RenderPassDrawQuad* renderPassQuad = RenderPassDrawQuad::MaterialCast(frame.renderPasses[0]->quad_list[0]); - EXPECT_EQ(renderPassQuad->rect.ToString(), gfx::Rect(0, 0, 200, 200).ToString()); - EXPECT_EQ(renderPassQuad->mask_uv_rect.ToString(), gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString()); + EXPECT_EQ(gfx::Rect(0, 0, 200, 200).ToString(), renderPassQuad->rect.ToString()); + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), renderPassQuad->mask_uv_rect.ToString()); + + m_hostImpl->drawLayers(frame); + m_hostImpl->didDrawAllLayers(frame); + } +} + +TEST_P(LayerTreeHostImplTest, maskLayerWithDifferentBounds) +{ + // The mask layer has bounds 100x100 but is attached to a layer with bounds 50x50. + + scoped_ptr<LayerImpl> scopedRoot = LayerImpl::create(m_hostImpl->activeTree(), 1); + LayerImpl* root = scopedRoot.get(); + m_hostImpl->activeTree()->SetRootLayer(scopedRoot.Pass()); + + scoped_ptr<LayerImpl> scopedContentLayer = LayerImpl::create(m_hostImpl->activeTree(), 3); + LayerImpl* contentLayer = scopedContentLayer.get(); + root->addChild(scopedContentLayer.Pass()); + + scoped_ptr<FakeMaskLayerImpl> scopedMaskLayer = FakeMaskLayerImpl::create(m_hostImpl->activeTree(), 4); + FakeMaskLayerImpl* maskLayer = scopedMaskLayer.get(); + contentLayer->setMaskLayer(scopedMaskLayer.PassAs<LayerImpl>()); + + gfx::Size rootSize(100, 100); + root->setBounds(rootSize); + root->setContentBounds(rootSize); + root->setPosition(gfx::PointF()); + root->setAnchorPoint(gfx::PointF()); + + gfx::Size layerSize(50, 50); + contentLayer->setBounds(layerSize); + contentLayer->setContentBounds(layerSize); + contentLayer->setPosition(gfx::PointF()); + contentLayer->setAnchorPoint(gfx::PointF()); + contentLayer->setDrawsContent(true); + + gfx::Size maskSize(100, 100); + maskLayer->setBounds(maskSize); + maskLayer->setContentBounds(maskSize); + maskLayer->setPosition(gfx::PointF()); + maskLayer->setAnchorPoint(gfx::PointF()); + maskLayer->setDrawsContent(true); + + + // Check that the mask fills the surface. + float deviceScaleFactor = 1.f; + m_hostImpl->setViewportSize(rootSize, rootSize); + m_hostImpl->setDeviceScaleFactor(deviceScaleFactor); + { + LayerTreeHostImpl::FrameData frame; + EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); + + ASSERT_EQ(1u, frame.renderPasses.size()); + ASSERT_EQ(1u, frame.renderPasses[0]->quad_list.size()); + ASSERT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->material); + const RenderPassDrawQuad* renderPassQuad = RenderPassDrawQuad::MaterialCast(frame.renderPasses[0]->quad_list[0]); + EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), renderPassQuad->rect.ToString()); + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), renderPassQuad->mask_uv_rect.ToString()); + + m_hostImpl->drawLayers(frame); + m_hostImpl->didDrawAllLayers(frame); + } + + + // Applying a DSF should change the render surface size, but won't affect + // which part of the mask is used. + deviceScaleFactor = 2.f; + gfx::Size deviceViewport(gfx::ToFlooredSize(gfx::ScaleSize(rootSize, deviceScaleFactor))); + m_hostImpl->setViewportSize(rootSize, deviceViewport); + m_hostImpl->setDeviceScaleFactor(deviceScaleFactor); + m_hostImpl->setNeedsUpdateDrawProperties(); + { + LayerTreeHostImpl::FrameData frame; + EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); + + ASSERT_EQ(1u, frame.renderPasses.size()); + ASSERT_EQ(1u, frame.renderPasses[0]->quad_list.size()); + ASSERT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->material); + const RenderPassDrawQuad* renderPassQuad = RenderPassDrawQuad::MaterialCast(frame.renderPasses[0]->quad_list[0]); + EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), renderPassQuad->rect.ToString()); + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), renderPassQuad->mask_uv_rect.ToString()); + + m_hostImpl->drawLayers(frame); + m_hostImpl->didDrawAllLayers(frame); + } + + + // Applying an equivalent content scale on the content layer and the mask + // should still result in the same part of the mask being used. + gfx::Size layerSizeLarge(gfx::ToRoundedSize(gfx::ScaleSize(layerSize, deviceScaleFactor))); + contentLayer->setContentBounds(layerSizeLarge); + contentLayer->setContentsScale(deviceScaleFactor, deviceScaleFactor); + gfx::Size maskSizeLarge(gfx::ToRoundedSize(gfx::ScaleSize(maskSize, deviceScaleFactor))); + maskLayer->setContentBounds(maskSizeLarge); + maskLayer->setContentsScale(deviceScaleFactor, deviceScaleFactor); + m_hostImpl->setNeedsUpdateDrawProperties(); + { + LayerTreeHostImpl::FrameData frame; + EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); + + ASSERT_EQ(1u, frame.renderPasses.size()); + ASSERT_EQ(1u, frame.renderPasses[0]->quad_list.size()); + ASSERT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->material); + const RenderPassDrawQuad* renderPassQuad = RenderPassDrawQuad::MaterialCast(frame.renderPasses[0]->quad_list[0]); + EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), renderPassQuad->rect.ToString()); + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), renderPassQuad->mask_uv_rect.ToString()); + + m_hostImpl->drawLayers(frame); + m_hostImpl->didDrawAllLayers(frame); + } + + // Applying a different contents scale to the mask layer will still result + // in the mask covering the owning layer. + maskLayer->setContentBounds(maskSize); + maskLayer->setContentsScale(deviceScaleFactor, deviceScaleFactor); + m_hostImpl->setNeedsUpdateDrawProperties(); + { + LayerTreeHostImpl::FrameData frame; + EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); + + ASSERT_EQ(1u, frame.renderPasses.size()); + ASSERT_EQ(1u, frame.renderPasses[0]->quad_list.size()); + ASSERT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->material); + const RenderPassDrawQuad* renderPassQuad = RenderPassDrawQuad::MaterialCast(frame.renderPasses[0]->quad_list[0]); + EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), renderPassQuad->rect.ToString()); + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), renderPassQuad->mask_uv_rect.ToString()); m_hostImpl->drawLayers(frame); m_hostImpl->didDrawAllLayers(frame); |