summaryrefslogtreecommitdiffstats
path: root/cc/layer_tree_host_impl_unittest.cc
diff options
context:
space:
mode:
authordanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-17 03:44:55 +0000
committerdanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-17 03:44:55 +0000
commit8611f01f36a713d0260e11670f24403be7294b7c (patch)
treee1c56b09d08dcf2d48a8f1bc7081811d7d4ef92c /cc/layer_tree_host_impl_unittest.cc
parent6646043896e02173e61c1d20df278d56577cce08 (diff)
downloadchromium_src-8611f01f36a713d0260e11670f24403be7294b7c.zip
chromium_src-8611f01f36a713d0260e11670f24403be7294b7c.tar.gz
chromium_src-8611f01f36a713d0260e11670f24403be7294b7c.tar.bz2
cc: Clarify the uvRect used for RenderSurfaces and support masks with different bounds.
The texture coords for the mask layer go from 0.0 to 1.0, so there is no need to scale between the size of the mask texture and the render surface texture. The uv rect is there to scale between the unclipped render surface coordinates and the clipped render surface texture. So make this explicit in the code. This remove the mask layer's content size completely from the equations. Tests: cc_unittests:LayerTreeHostImplTest.maskLayerWithDifferentBounds R=piman BUG=170076 Review URL: https://chromiumcodereview.appspot.com/11968007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@177337 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/layer_tree_host_impl_unittest.cc')
-rw-r--r--cc/layer_tree_host_impl_unittest.cc137
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);