Index: cc/CCLayerTreeHostCommon.cpp |
diff --git a/cc/CCLayerTreeHostCommon.cpp b/cc/CCLayerTreeHostCommon.cpp |
index d60d43c0930631c4e7b40bcb53bf1ec85b11c05d..a644f39c5598da63a8644f37d3ea79541abe7b7b 100644 |
--- a/cc/CCLayerTreeHostCommon.cpp |
+++ b/cc/CCLayerTreeHostCommon.cpp |
@@ -325,6 +325,31 @@ WebTransformationMatrix computeScrollCompensationMatrixForChildren(CCLayerImpl* |
return nextScrollCompensationMatrix; |
} |
+// There is no contentsScale on impl thread. |
+static inline void updateLayerContentsScale(CCLayerImpl*, float, float) { } |
+ |
+static inline void updateLayerContentsScale(LayerChromium* layer, float combinedScale, float pageScaleFactor) |
+{ |
+ if (layer->transformIsAnimating()) |
+ return; |
+ |
+ float contentsScale = combinedScale; |
+ |
+ // FIXME: Remove this when pageScaleFactor is applied in the compositor and becomes part of the parentTransform during the tree walk. |
+ if (!layer->boundsContainPageScale()) |
+ contentsScale *= pageScaleFactor; |
+ |
+ layer->setContentsScale(contentsScale); |
+ |
+ LayerChromium* maskLayer = layer->maskLayer(); |
+ if (maskLayer) |
+ maskLayer->setContentsScale(contentsScale); |
+ |
+ LayerChromium* replicaMaskLayer = layer->replicaLayer() ? layer->replicaLayer()->maskLayer() : 0; |
+ if (replicaMaskLayer) |
+ replicaMaskLayer->setContentsScale(contentsScale); |
+} |
+ |
// Should be called just before the recursive calculateDrawTransformsInternal(). |
template<typename LayerType, typename LayerList> |
void setupRootLayerAndSurfaceForRecursion(LayerType* rootLayer, LayerList& renderSurfaceLayerList, const IntSize& deviceViewportSize) |
@@ -346,7 +371,7 @@ static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay |
const WebTransformationMatrix& fullHierarchyMatrix, const WebTransformationMatrix& currentScrollCompensationMatrix, |
const IntRect& clipRectFromAncestor, bool ancestorClipsSubtree, |
RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceLayerList, LayerList& layerList, |
- LayerSorter* layerSorter, int maxTextureSize, float deviceScaleFactor, IntRect& drawableContentRectOfSubtree) |
+ LayerSorter* layerSorter, int maxTextureSize, float deviceScaleFactor, float pageScaleFactor, IntRect& drawableContentRectOfSubtree) |
{ |
// This function computes the new matrix transformations recursively for this |
// layer and all its descendants. It also computes the appropriate render surfaces. |
@@ -479,6 +504,21 @@ static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay |
combinedTransform = currentScrollCompensationMatrix * combinedTransform; |
} |
+ // The layer's contentsSize is determined from the combinedTransform, which then informs the |
+ // layer's drawTransform. |
+ float combinedScale = 1; |
+ if (!layer->transformIsAnimating()) { |
+ WebTransformationMatrix flatTransform = combinedTransform; |
+ CCMathUtil::flattenTransformTo2d(flatTransform); |
+ |
+ bool clipped; |
+ FloatPoint origin = CCMathUtil::mapPoint(flatTransform, FloatPoint(0, 0), clipped); |
+ FloatPoint xScale = CCMathUtil::mapPoint(flatTransform, FloatPoint(1, 0), clipped); |
+ FloatPoint yScale = CCMathUtil::mapPoint(flatTransform, FloatPoint(0, 1), clipped); |
+ combinedScale = fmaxf(CCMathUtil::distanceBetweenPoints(xScale, origin), CCMathUtil::distanceBetweenPoints(yScale, origin)); |
+ } |
+ updateLayerContentsScale(layer, combinedScale, pageScaleFactor); |
+ |
// The drawTransform that gets computed below is effectively the layer's drawTransform, unless |
// the layer itself creates a renderSurface. In that case, the renderSurface re-parents the transforms. |
WebTransformationMatrix drawTransform = combinedTransform; |
@@ -639,7 +679,7 @@ static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay |
IntRect drawableContentRectOfChildSubtree; |
calculateDrawTransformsInternal<LayerType, LayerList, RenderSurfaceType, LayerSorter>(child, rootLayer, sublayerMatrix, nextHierarchyMatrix, nextScrollCompensationMatrix, |
clipRectForSubtree, subtreeShouldBeClipped, nearestAncestorThatMovesPixels, |
- renderSurfaceLayerList, descendants, layerSorter, maxTextureSize, deviceScaleFactor, drawableContentRectOfChildSubtree); |
+ renderSurfaceLayerList, descendants, layerSorter, maxTextureSize, deviceScaleFactor, pageScaleFactor, drawableContentRectOfChildSubtree); |
if (!drawableContentRectOfChildSubtree.isEmpty()) { |
accumulatedDrawableContentRectOfChildren.unite(drawableContentRectOfChildSubtree); |
if (child->renderSurface()) |
@@ -773,7 +813,7 @@ static void calculateVisibleRectsInternal(const LayerList& renderSurfaceLayerLis |
} |
} |
-void CCLayerTreeHostCommon::calculateDrawTransforms(LayerChromium* rootLayer, const IntSize& deviceViewportSize, float deviceScaleFactor, int maxTextureSize, Vector<RefPtr<LayerChromium> >& renderSurfaceLayerList) |
+void CCLayerTreeHostCommon::calculateDrawTransforms(LayerChromium* rootLayer, const IntSize& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, int maxTextureSize, Vector<RefPtr<LayerChromium> >& renderSurfaceLayerList) |
{ |
IntRect totalDrawableContentRect; |
WebTransformationMatrix identityMatrix; |
@@ -783,11 +823,11 @@ void CCLayerTreeHostCommon::calculateDrawTransforms(LayerChromium* rootLayer, co |
setupRootLayerAndSurfaceForRecursion<LayerChromium, Vector<RefPtr<LayerChromium> > >(rootLayer, renderSurfaceLayerList, deviceViewportSize); |
cc::calculateDrawTransformsInternal<LayerChromium, Vector<RefPtr<LayerChromium> >, RenderSurfaceChromium, void>(rootLayer, rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, |
- rootLayer->renderSurface()->contentRect(), true, 0, renderSurfaceLayerList, |
- rootLayer->renderSurface()->layerList(), 0, maxTextureSize, deviceScaleFactor, totalDrawableContentRect); |
+ rootLayer->renderSurface()->contentRect(), true, 0, renderSurfaceLayerList, |
+ rootLayer->renderSurface()->layerList(), 0, maxTextureSize, deviceScaleFactor, pageScaleFactor, totalDrawableContentRect); |
} |
-void CCLayerTreeHostCommon::calculateDrawTransforms(CCLayerImpl* rootLayer, const IntSize& deviceViewportSize, float deviceScaleFactor, CCLayerSorter* layerSorter, int maxTextureSize, Vector<CCLayerImpl*>& renderSurfaceLayerList) |
+void CCLayerTreeHostCommon::calculateDrawTransforms(CCLayerImpl* rootLayer, const IntSize& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, CCLayerSorter* layerSorter, int maxTextureSize, Vector<CCLayerImpl*>& renderSurfaceLayerList) |
{ |
IntRect totalDrawableContentRect; |
WebTransformationMatrix identityMatrix; |
@@ -797,8 +837,8 @@ void CCLayerTreeHostCommon::calculateDrawTransforms(CCLayerImpl* rootLayer, cons |
setupRootLayerAndSurfaceForRecursion<CCLayerImpl, Vector<CCLayerImpl*> >(rootLayer, renderSurfaceLayerList, deviceViewportSize); |
cc::calculateDrawTransformsInternal<CCLayerImpl, Vector<CCLayerImpl*>, CCRenderSurface, CCLayerSorter>(rootLayer, rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, |
- rootLayer->renderSurface()->contentRect(), true, 0, renderSurfaceLayerList, |
- rootLayer->renderSurface()->layerList(), layerSorter, maxTextureSize, deviceScaleFactor, totalDrawableContentRect); |
+ rootLayer->renderSurface()->contentRect(), true, 0, renderSurfaceLayerList, |
+ rootLayer->renderSurface()->layerList(), layerSorter, maxTextureSize, deviceScaleFactor, pageScaleFactor, totalDrawableContentRect); |
} |
void CCLayerTreeHostCommon::calculateVisibleRects(Vector<RefPtr<LayerChromium> >& renderSurfaceLayerList) |