| Index: cc/layer_tree_host_common_unittest.cc
|
| diff --git a/cc/layer_tree_host_common_unittest.cc b/cc/layer_tree_host_common_unittest.cc
|
| index 21b323a5335bb56a09296517743588bdd48d11f4..ce0861709ac9b84017bb963d56d2b874d6c46ca1 100644
|
| --- a/cc/layer_tree_host_common_unittest.cc
|
| +++ b/cc/layer_tree_host_common_unittest.cc
|
| @@ -142,6 +142,12 @@ scoped_refptr<ContentLayer> createDrawableContentLayer(ContentLayerClient* deleg
|
| return toReturn;
|
| }
|
|
|
| +#define EXPECT_CONTENTS_SCALE_EQ(expected, layer) \
|
| + do { \
|
| + EXPECT_FLOAT_EQ(expected, layer->contentsScaleX()); \
|
| + EXPECT_FLOAT_EQ(expected, layer->contentsScaleY()); \
|
| + } while (false)
|
| +
|
| TEST(LayerTreeHostCommonTest, verifyTransformsForNoOpLayer)
|
| {
|
| // Sanity check: For layers positioned at zero, with zero size,
|
| @@ -2967,8 +2973,9 @@ TEST(LayerTreeHostCommonTest, verifyHitTestingForSingleLayerWithScaledContents)
|
| scoped_ptr<LayerImpl> testLayer = LayerImpl::create(12345);
|
| setLayerPropertiesForTesting(testLayer.get(), identityMatrix, identityMatrix, anchor, position, bounds, false);
|
|
|
| - // override contentBounds
|
| + // override contentBounds and contentsScale
|
| testLayer->setContentBounds(IntSize(100, 100));
|
| + testLayer->setContentsScale(2, 2);
|
|
|
| testLayer->setDrawsContent(true);
|
| root->addChild(testLayer.Pass());
|
| @@ -3461,7 +3468,9 @@ class NoScaleContentLayer : public ContentLayer
|
| public:
|
| static scoped_refptr<NoScaleContentLayer> create(ContentLayerClient* client) { return make_scoped_refptr(new NoScaleContentLayer(client)); }
|
|
|
| - virtual bool needsContentsScale() const OVERRIDE { return false; }
|
| + virtual IntSize contentBounds() const OVERRIDE { return bounds(); }
|
| + virtual float contentsScaleX() const OVERRIDE { return 1.0; }
|
| + virtual float contentsScaleY() const OVERRIDE { return 1.0; }
|
|
|
| protected:
|
| explicit NoScaleContentLayer(ContentLayerClient* client) : ContentLayer(client) { }
|
| @@ -3501,9 +3510,9 @@ TEST(LayerTreeHostCommonTest, verifyLayerTransformsInHighDPI)
|
|
|
| LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(), deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, renderSurfaceLayerList);
|
|
|
| - EXPECT_EQ(deviceScaleFactor * pageScaleFactor, parent->contentsScale());
|
| - EXPECT_EQ(deviceScaleFactor * pageScaleFactor, child->contentsScale());
|
| - EXPECT_EQ(1, childNoScale->contentsScale());
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor, parent);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor, child);
|
| + EXPECT_CONTENTS_SCALE_EQ(1, childNoScale);
|
|
|
| EXPECT_EQ(1u, renderSurfaceLayerList.size());
|
|
|
| @@ -3550,6 +3559,83 @@ TEST(LayerTreeHostCommonTest, verifyLayerTransformsInHighDPI)
|
| EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildNoScaleTransform, childNoScale->screenSpaceTransform());
|
| }
|
|
|
| +TEST(LayerTreeHostCommonTest, verifyLayerTransformsInHighDPIAccurateScaleZeroChildPosition)
|
| +{
|
| + // Verify draw and screen space transforms of layers not in a surface.
|
| + MockContentLayerClient delegate;
|
| + WebTransformationMatrix identityMatrix;
|
| +
|
| + scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate);
|
| + setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(133, 133), true);
|
| +
|
| + scoped_refptr<ContentLayer> child = createDrawableContentLayer(&delegate);
|
| + setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(13, 13), true);
|
| +
|
| + scoped_refptr<NoScaleContentLayer> childNoScale = createNoScaleDrawableContentLayer(&delegate);
|
| + setLayerPropertiesForTesting(childNoScale.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(13, 13), true);
|
| +
|
| + parent->addChild(child);
|
| + parent->addChild(childNoScale);
|
| +
|
| + std::vector<scoped_refptr<Layer> > renderSurfaceLayerList;
|
| + int dummyMaxTextureSize = 512;
|
| +
|
| + const float deviceScaleFactor = 1.7f;
|
| + const float pageScaleFactor = 1;
|
| +
|
| + LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(), deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, renderSurfaceLayerList);
|
| +
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor, parent);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor, child);
|
| + EXPECT_CONTENTS_SCALE_EQ(1, childNoScale);
|
| +
|
| + EXPECT_EQ(1u, renderSurfaceLayerList.size());
|
| +
|
| + // Verify parent transforms
|
| + WebTransformationMatrix expectedParentTransform;
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expectedParentTransform, parent->screenSpaceTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expectedParentTransform, parent->drawTransform());
|
| +
|
| + // Verify results of transformed parent rects
|
| + FloatRect parentContentBounds(FloatPoint(), FloatSize(parent->contentBounds()));
|
| +
|
| + FloatRect parentDrawRect = MathUtil::mapClippedRect(parent->drawTransform(), parentContentBounds);
|
| + FloatRect parentScreenSpaceRect = MathUtil::mapClippedRect(parent->screenSpaceTransform(), parentContentBounds);
|
| +
|
| + FloatRect expectedParentDrawRect(FloatPoint(), parent->bounds());
|
| + expectedParentDrawRect.scale(deviceScaleFactor);
|
| + expectedParentDrawRect.setWidth(ceil(expectedParentDrawRect.width()));
|
| + expectedParentDrawRect.setHeight(ceil(expectedParentDrawRect.height()));
|
| + EXPECT_FLOAT_RECT_EQ(expectedParentDrawRect, parentDrawRect);
|
| + EXPECT_FLOAT_RECT_EQ(expectedParentDrawRect, parentScreenSpaceRect);
|
| +
|
| + // Verify child transforms
|
| + WebTransformationMatrix expectedChildTransform;
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildTransform, child->drawTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildTransform, child->screenSpaceTransform());
|
| +
|
| + // Verify results of transformed child rects
|
| + FloatRect childContentBounds(FloatPoint(), FloatSize(child->contentBounds()));
|
| +
|
| + FloatRect childDrawRect = MathUtil::mapClippedRect(child->drawTransform(), childContentBounds);
|
| + FloatRect childScreenSpaceRect = MathUtil::mapClippedRect(child->screenSpaceTransform(), childContentBounds);
|
| +
|
| + FloatRect expectedChildDrawRect(FloatPoint(), child->bounds());
|
| + expectedChildDrawRect.scale(deviceScaleFactor);
|
| + expectedChildDrawRect.setWidth(ceil(expectedChildDrawRect.width()));
|
| + expectedChildDrawRect.setHeight(ceil(expectedChildDrawRect.height()));
|
| + EXPECT_FLOAT_RECT_EQ(expectedChildDrawRect, childDrawRect);
|
| + EXPECT_FLOAT_RECT_EQ(expectedChildDrawRect, childScreenSpaceRect);
|
| +
|
| + // Verify childNoScale transforms
|
| + WebTransformationMatrix expectedChildNoScaleTransform = child->drawTransform();
|
| + // All transforms operate on content rects. The child's content rect
|
| + // incorporates device scale, but the childNoScale does not; add it here.
|
| + expectedChildNoScaleTransform.scale(deviceScaleFactor);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildNoScaleTransform, childNoScale->drawTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildNoScaleTransform, childNoScale->screenSpaceTransform());
|
| +}
|
| +
|
| TEST(LayerTreeHostCommonTest, verifyContentsScale)
|
| {
|
| MockContentLayerClient delegate;
|
| @@ -3600,10 +3686,10 @@ TEST(LayerTreeHostCommonTest, verifyContentsScale)
|
|
|
| LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(), deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, renderSurfaceLayerList);
|
|
|
| - EXPECT_FLOAT_EQ(deviceScaleFactor * initialParentScale, parent->contentsScale());
|
| - EXPECT_FLOAT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale, childScale->contentsScale());
|
| - EXPECT_FLOAT_EQ(1, childNoScale->contentsScale());
|
| - EXPECT_FLOAT_EQ(deviceScaleFactor * pageScaleFactor * fixedRasterScale, childNoAutoScale->contentsScale());
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * initialParentScale, parent);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale, childScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(1, childNoScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * fixedRasterScale, childNoAutoScale);
|
|
|
| // The parent is scaled up and shouldn't need to scale during draw. The child that can scale its contents should
|
| // also not need to scale during draw. The other should.
|
| @@ -3623,9 +3709,9 @@ TEST(LayerTreeHostCommonTest, verifyContentsScale)
|
| renderSurfaceLayerList.clear();
|
| LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(), deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, renderSurfaceLayerList);
|
|
|
| - EXPECT_FLOAT_EQ(deviceScaleFactor * initialParentScale, parent->contentsScale());
|
| - EXPECT_FLOAT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale, childScale->contentsScale());
|
| - EXPECT_FLOAT_EQ(1, childNoScale->contentsScale());
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * initialParentScale, parent);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale, childScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(1, childNoScale);
|
|
|
| // But if the deviceScaleFactor or pageScaleFactor changes, then it should be updated, but using the initial transform.
|
| deviceScaleFactor = 2.25;
|
| @@ -3639,10 +3725,10 @@ TEST(LayerTreeHostCommonTest, verifyContentsScale)
|
| renderSurfaceLayerList.clear();
|
| LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(), deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, renderSurfaceLayerList);
|
|
|
| - EXPECT_FLOAT_EQ(deviceScaleFactor * initialParentScale, parent->contentsScale());
|
| - EXPECT_FLOAT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale, childScale->contentsScale());
|
| - EXPECT_FLOAT_EQ(1, childNoScale->contentsScale());
|
| - EXPECT_FLOAT_EQ(deviceScaleFactor * pageScaleFactor * fixedRasterScale, childNoAutoScale->contentsScale());
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * initialParentScale, parent);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale, childScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(1, childNoScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * fixedRasterScale, childNoAutoScale);
|
| }
|
|
|
| TEST(LayerTreeHostCommonTest, verifyContentsScaleForSurfaces)
|
| @@ -3725,17 +3811,17 @@ TEST(LayerTreeHostCommonTest, verifyContentsScaleForSurfaces)
|
|
|
| LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(), deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, renderSurfaceLayerList);
|
|
|
| - EXPECT_EQ(deviceScaleFactor * initialParentScale, parent->contentsScale());
|
| - EXPECT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale, surfaceScale->contentsScale());
|
| - EXPECT_EQ(1, surfaceNoScale->contentsScale());
|
| - EXPECT_EQ(deviceScaleFactor * pageScaleFactor * fixedRasterScale, surfaceNoAutoScale->contentsScale());
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * initialParentScale, parent);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale, surfaceScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(1, surfaceNoScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * fixedRasterScale, surfaceNoAutoScale);
|
|
|
| - EXPECT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale * initialChildScale, surfaceScaleChildScale->contentsScale());
|
| - EXPECT_EQ(1, surfaceScaleChildNoScale->contentsScale());
|
| - EXPECT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale * initialChildScale, surfaceNoScaleChildScale->contentsScale());
|
| - EXPECT_EQ(1, surfaceNoScaleChildNoScale->contentsScale());
|
| - EXPECT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale * initialChildScale, surfaceNoAutoScaleChildScale->contentsScale());
|
| - EXPECT_EQ(1, surfaceNoAutoScaleChildNoScale->contentsScale());
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale * initialChildScale, surfaceScaleChildScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(1, surfaceScaleChildNoScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale * initialChildScale, surfaceNoScaleChildScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(1, surfaceNoScaleChildNoScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * initialChildScale * initialChildScale, surfaceNoAutoScaleChildScale);
|
| + EXPECT_CONTENTS_SCALE_EQ(1, surfaceNoAutoScaleChildNoScale);
|
|
|
| // The parent is scaled up and shouldn't need to scale during draw.
|
| EXPECT_FLOAT_EQ(1, parent->drawTransform().m11());
|
| @@ -3870,6 +3956,71 @@ TEST(LayerTreeHostCommonTest, verifyRenderSurfaceTransformsInHighDPI)
|
| expectedReplicaScreenSpaceTransform.setM41(6);
|
| expectedReplicaScreenSpaceTransform.setM42(6);
|
| EXPECT_TRANSFORMATION_MATRIX_EQ(expectedReplicaScreenSpaceTransform, child->renderSurface()->replicaScreenSpaceTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expectedReplicaScreenSpaceTransform, child->renderSurface()->replicaScreenSpaceTransform());
|
| +}
|
| +
|
| +TEST(LayerTreeHostCommonTest, verifyRenderSurfaceTransformsInHighDPIAccurateScaleZeroPosition)
|
| +{
|
| + MockContentLayerClient delegate;
|
| + WebTransformationMatrix identityMatrix;
|
| +
|
| + scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate);
|
| + setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(33, 31), true);
|
| +
|
| + scoped_refptr<ContentLayer> child = createDrawableContentLayer(&delegate);
|
| + setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(13, 11), true);
|
| +
|
| + WebTransformationMatrix replicaTransform;
|
| + replicaTransform.scaleNonUniform(1, -1);
|
| + scoped_refptr<ContentLayer> replica = createDrawableContentLayer(&delegate);
|
| + setLayerPropertiesForTesting(replica.get(), replicaTransform, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(13, 11), true);
|
| +
|
| + // This layer should end up in the same surface as child, with the same draw
|
| + // and screen space transforms.
|
| + scoped_refptr<ContentLayer> duplicateChildNonOwner = createDrawableContentLayer(&delegate);
|
| + setLayerPropertiesForTesting(duplicateChildNonOwner.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(13, 11), true);
|
| +
|
| + parent->addChild(child);
|
| + child->addChild(duplicateChildNonOwner);
|
| + child->setReplicaLayer(replica.get());
|
| +
|
| + std::vector<scoped_refptr<Layer> > renderSurfaceLayerList;
|
| + int dummyMaxTextureSize = 512;
|
| +
|
| + const float deviceScaleFactor = 1.7f;
|
| + parent->setContentsScale(deviceScaleFactor);
|
| + child->setContentsScale(deviceScaleFactor);
|
| + duplicateChildNonOwner->setContentsScale(deviceScaleFactor);
|
| + replica->setContentsScale(deviceScaleFactor);
|
| +
|
| + LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(), deviceScaleFactor, 1, dummyMaxTextureSize, renderSurfaceLayerList);
|
| +
|
| + // We should have two render surfaces. The root's render surface and child's
|
| + // render surface (it needs one because it has a replica layer).
|
| + EXPECT_EQ(2u, renderSurfaceLayerList.size());
|
| +
|
| + WebTransformationMatrix identityTransform;
|
| +
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(identityTransform, parent->screenSpaceTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(identityTransform, parent->drawTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(identityTransform, child->drawTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(identityTransform, child->screenSpaceTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(identityTransform, duplicateChildNonOwner->drawTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(identityTransform, duplicateChildNonOwner->screenSpaceTransform());
|
| + EXPECT_RECT_EQ(child->drawableContentRect(), duplicateChildNonOwner->drawableContentRect());
|
| + EXPECT_EQ(child->contentBounds(), duplicateChildNonOwner->contentBounds());
|
| +
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(identityTransform, child->renderSurface()->drawTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(identityTransform, child->renderSurface()->drawTransform());
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(identityTransform, child->renderSurface()->screenSpaceTransform());
|
| +
|
| + WebTransformationMatrix expectedReplicaDrawTransform;
|
| + expectedReplicaDrawTransform.setM22(-1);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expectedReplicaDrawTransform, child->renderSurface()->replicaDrawTransform());
|
| +
|
| + WebTransformationMatrix expectedReplicaScreenSpaceTransform;
|
| + expectedReplicaScreenSpaceTransform.setM22(-1);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expectedReplicaScreenSpaceTransform, child->renderSurface()->replicaScreenSpaceTransform());
|
| }
|
|
|
| TEST(LayerTreeHostCommonTest, verifySubtreeSearch)
|
|
|