OLD | NEW |
---|---|
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 | 5 |
6 #include "config.h" | 6 #include "config.h" |
7 | 7 |
8 #include "CCLayerTreeHostCommon.h" | 8 #include "CCLayerTreeHostCommon.h" |
9 | 9 |
10 #include "CCLayerImpl.h" | 10 #include "CCLayerImpl.h" |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
326 // The adjustment allows us to continue using the scrollCompensation on the next surface. | 326 // The adjustment allows us to continue using the scrollCompensation on the next surface. |
327 // Step 1 (right-most in the math): transform from the new surface to the o riginal ancestor surface | 327 // Step 1 (right-most in the math): transform from the new surface to the o riginal ancestor surface |
328 // Step 2: apply the scroll compensation | 328 // Step 2: apply the scroll compensation |
329 // Step 3: transform back to the new surface. | 329 // Step 3: transform back to the new surface. |
330 if (layer->renderSurface() && !nextScrollCompensationMatrix.isIdentity()) | 330 if (layer->renderSurface() && !nextScrollCompensationMatrix.isIdentity()) |
331 nextScrollCompensationMatrix = layer->renderSurface()->drawTransform().i nverse() * nextScrollCompensationMatrix * layer->renderSurface()->drawTransform( ); | 331 nextScrollCompensationMatrix = layer->renderSurface()->drawTransform().i nverse() * nextScrollCompensationMatrix * layer->renderSurface()->drawTransform( ); |
332 | 332 |
333 return nextScrollCompensationMatrix; | 333 return nextScrollCompensationMatrix; |
334 } | 334 } |
335 | 335 |
336 // There is no contentsScale on impl thread. | |
337 static inline void updateLayerContentsScale(CCLayerImpl*, const WebTransformatio nMatrix&, float, float) { } | |
338 | |
339 static inline void updateLayerContentsScale(LayerChromium* layer, const WebTrans formationMatrix& combinedTransform, float deviceScaleFactor, float pageScaleFact or) | |
340 { | |
341 float cssScale = layer->initialCssScale(); | |
342 if (!cssScale) { | |
343 WebTransformationMatrix flatTransform = combinedTransform; | |
enne (OOO)
2012/10/02 19:13:18
Do you want the combinedTransform here or the scre
| |
344 CCMathUtil::flattenTransformTo2d(flatTransform); | |
345 | |
346 bool clipped; | |
347 FloatPoint origin = CCMathUtil::mapPoint(flatTransform, FloatPoint(0, 0) , clipped); | |
348 FloatPoint xScale = CCMathUtil::mapPoint(flatTransform, FloatPoint(1, 0) , clipped); | |
349 FloatPoint yScale = CCMathUtil::mapPoint(flatTransform, FloatPoint(0, 1) , clipped); | |
350 float combinedScale = fmaxf(CCMathUtil::distanceBetweenPoints(xScale, or igin), CCMathUtil::distanceBetweenPoints(yScale, origin)); | |
351 cssScale = combinedScale / deviceScaleFactor; | |
352 if (!layer->boundsContainPageScale()) | |
353 cssScale /= pageScaleFactor; | |
354 layer->setInitialCssScale(cssScale); | |
355 } | |
356 | |
357 float contentsScale = cssScale * deviceScaleFactor; | |
358 if (!layer->boundsContainPageScale()) | |
359 contentsScale *= pageScaleFactor; | |
360 layer->setContentsScale(contentsScale); | |
361 | |
362 LayerChromium* maskLayer = layer->maskLayer(); | |
363 if (maskLayer) | |
364 maskLayer->setContentsScale(contentsScale); | |
365 | |
366 LayerChromium* replicaMaskLayer = layer->replicaLayer() ? layer->replicaLaye r()->maskLayer() : 0; | |
367 if (replicaMaskLayer) | |
368 replicaMaskLayer->setContentsScale(contentsScale); | |
369 } | |
370 | |
336 // Should be called just before the recursive calculateDrawTransformsInternal(). | 371 // Should be called just before the recursive calculateDrawTransformsInternal(). |
337 template<typename LayerType, typename LayerList> | 372 template<typename LayerType, typename LayerList> |
338 void setupRootLayerAndSurfaceForRecursion(LayerType* rootLayer, LayerList& rende rSurfaceLayerList, const IntSize& deviceViewportSize) | 373 void setupRootLayerAndSurfaceForRecursion(LayerType* rootLayer, LayerList& rende rSurfaceLayerList, const IntSize& deviceViewportSize) |
339 { | 374 { |
340 if (!rootLayer->renderSurface()) | 375 if (!rootLayer->renderSurface()) |
341 rootLayer->createRenderSurface(); | 376 rootLayer->createRenderSurface(); |
342 | 377 |
343 rootLayer->renderSurface()->setContentRect(IntRect(IntPoint::zero(), deviceV iewportSize)); | 378 rootLayer->renderSurface()->setContentRect(IntRect(IntPoint::zero(), deviceV iewportSize)); |
344 rootLayer->renderSurface()->clearLayerLists(); | 379 rootLayer->renderSurface()->clearLayerLists(); |
345 | 380 |
346 ASSERT(renderSurfaceLayerList.isEmpty()); | 381 ASSERT(renderSurfaceLayerList.isEmpty()); |
347 renderSurfaceLayerList.append(rootLayer); | 382 renderSurfaceLayerList.append(rootLayer); |
348 } | 383 } |
349 | 384 |
350 // Recursively walks the layer tree starting at the given node and computes all the | 385 // Recursively walks the layer tree starting at the given node and computes all the |
351 // necessary transformations, clipRects, render surfaces, etc. | 386 // necessary transformations, clipRects, render surfaces, etc. |
352 template<typename LayerType, typename LayerList, typename RenderSurfaceType, typ ename LayerSorter> | 387 template<typename LayerType, typename LayerList, typename RenderSurfaceType, typ ename LayerSorter> |
353 static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay er, const WebTransformationMatrix& parentMatrix, | 388 static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay er, const WebTransformationMatrix& parentMatrix, |
354 const WebTransformationMatrix& fullHierarchyMatrix, const WebTransformationM atrix& currentScrollCompensationMatrix, | 389 const WebTransformationMatrix& fullHierarchyMatrix, const WebTransformationM atrix& currentScrollCompensationMatrix, |
355 const IntRect& clipRectFromAncestor, bool ancestorClipsSubtree, | 390 const IntRect& clipRectFromAncestor, bool ancestorClipsSubtree, |
356 RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceL ayerList, LayerList& layerList, | 391 RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceL ayerList, LayerList& layerList, |
357 LayerSorter* layerSorter, int maxTextureSize, float deviceScaleFactor, IntRe ct& drawableContentRectOfSubtree) | 392 LayerSorter* layerSorter, int maxTextureSize, float deviceScaleFactor, float pageScaleFactor, IntRect& drawableContentRectOfSubtree) |
enne (OOO)
2012/10/02 19:13:18
How about an input struct to this function?
| |
358 { | 393 { |
359 // This function computes the new matrix transformations recursively for thi s | 394 // This function computes the new matrix transformations recursively for thi s |
360 // layer and all its descendants. It also computes the appropriate render su rfaces. | 395 // layer and all its descendants. It also computes the appropriate render su rfaces. |
361 // Some important points to remember: | 396 // Some important points to remember: |
362 // | 397 // |
363 // 0. Here, transforms are notated in Matrix x Vector order, and in words we describe what | 398 // 0. Here, transforms are notated in Matrix x Vector order, and in words we describe what |
364 // the transform does from left to right. | 399 // the transform does from left to right. |
365 // | 400 // |
366 // 1. In our terminology, the "layer origin" refers to the top-left corner o f a layer, and the | 401 // 1. In our terminology, the "layer origin" refers to the top-left corner o f a layer, and the |
367 // positive Y-axis points downwards. This interpretation is valid because the orthographic | 402 // positive Y-axis points downwards. This interpretation is valid because the orthographic |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
480 WebTransformationMatrix combinedTransform = parentMatrix; | 515 WebTransformationMatrix combinedTransform = parentMatrix; |
481 combinedTransform.multiply(layerLocalTransform); | 516 combinedTransform.multiply(layerLocalTransform); |
482 | 517 |
483 if (layer->fixedToContainerLayer()) { | 518 if (layer->fixedToContainerLayer()) { |
484 // Special case: this layer is a composited fixed-position layer; we nee d to | 519 // Special case: this layer is a composited fixed-position layer; we nee d to |
485 // explicitly compensate for all ancestors' nonzero scrollDeltas to keep this layer | 520 // explicitly compensate for all ancestors' nonzero scrollDeltas to keep this layer |
486 // fixed correctly. | 521 // fixed correctly. |
487 combinedTransform = currentScrollCompensationMatrix * combinedTransform; | 522 combinedTransform = currentScrollCompensationMatrix * combinedTransform; |
488 } | 523 } |
489 | 524 |
525 // The layer's contentsSize is determined from the combinedTransform, which then informs the | |
526 // layer's drawTransform. | |
527 updateLayerContentsScale(layer, combinedTransform, deviceScaleFactor, pageSc aleFactor); | |
528 | |
490 // The drawTransform that gets computed below is effectively the layer's dra wTransform, unless | 529 // The drawTransform that gets computed below is effectively the layer's dra wTransform, unless |
491 // the layer itself creates a renderSurface. In that case, the renderSurface re-parents the transforms. | 530 // the layer itself creates a renderSurface. In that case, the renderSurface re-parents the transforms. |
492 WebTransformationMatrix drawTransform = combinedTransform; | 531 WebTransformationMatrix drawTransform = combinedTransform; |
493 // M[draw] = M[parent] * LT * Tr[anchor2center] * Tr[center2origin] | 532 // M[draw] = M[parent] * LT * Tr[anchor2center] * Tr[center2origin] |
494 drawTransform.translate(-layer->bounds().width() / 2.0, -layer->bounds().hei ght() / 2.0); | 533 drawTransform.translate(-layer->bounds().width() / 2.0, -layer->bounds().hei ght() / 2.0); |
495 if (!layer->contentBounds().isEmpty() && !layer->bounds().isEmpty()) { | 534 if (!layer->contentBounds().isEmpty() && !layer->bounds().isEmpty()) { |
496 // M[draw] = M[parent] * LT * Tr[anchor2origin] * S[layer2content] | 535 // M[draw] = M[parent] * LT * Tr[anchor2origin] * S[layer2content] |
497 drawTransform.scaleNonUniform(layer->bounds().width() / static_cast<doub le>(layer->contentBounds().width()), | 536 drawTransform.scaleNonUniform(layer->bounds().width() / static_cast<doub le>(layer->contentBounds().width()), |
498 layer->bounds().height() / static_cast<dou ble>(layer->contentBounds().height())); | 537 layer->bounds().height() / static_cast<dou ble>(layer->contentBounds().height())); |
499 } | 538 } |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
640 descendants.append(layer); | 679 descendants.append(layer); |
641 | 680 |
642 WebTransformationMatrix nextScrollCompensationMatrix = computeScrollCompensa tionMatrixForChildren(layer, parentMatrix, currentScrollCompensationMatrix);; | 681 WebTransformationMatrix nextScrollCompensationMatrix = computeScrollCompensa tionMatrixForChildren(layer, parentMatrix, currentScrollCompensationMatrix);; |
643 | 682 |
644 IntRect accumulatedDrawableContentRectOfChildren; | 683 IntRect accumulatedDrawableContentRectOfChildren; |
645 for (size_t i = 0; i < layer->children().size(); ++i) { | 684 for (size_t i = 0; i < layer->children().size(); ++i) { |
646 LayerType* child = CCLayerTreeHostCommon::getChildAsRawPtr(layer->childr en(), i); | 685 LayerType* child = CCLayerTreeHostCommon::getChildAsRawPtr(layer->childr en(), i); |
647 IntRect drawableContentRectOfChildSubtree; | 686 IntRect drawableContentRectOfChildSubtree; |
648 calculateDrawTransformsInternal<LayerType, LayerList, RenderSurfaceType, LayerSorter>(child, rootLayer, sublayerMatrix, nextHierarchyMatrix, nextScrollC ompensationMatrix, | 687 calculateDrawTransformsInternal<LayerType, LayerList, RenderSurfaceType, LayerSorter>(child, rootLayer, sublayerMatrix, nextHierarchyMatrix, nextScrollC ompensationMatrix, |
649 clipRectForSubtree, subtreeShouldBeClipped, nearestAncestorThatMov esPixels, | 688 clipRectForSubtree, subtreeShouldBeClipped, nearestAncestorThatMov esPixels, |
650 renderSurfaceLayerList, descendants, layerSorter, maxTextureSize, deviceScaleFactor, drawableContentRectOfChildSubtree); | 689 renderSurfaceLayerList, descendants, layerSorter, maxTextureSize, deviceScaleFactor, pageScaleFactor, drawableContentRectOfChildSubtree); |
651 if (!drawableContentRectOfChildSubtree.isEmpty()) { | 690 if (!drawableContentRectOfChildSubtree.isEmpty()) { |
652 accumulatedDrawableContentRectOfChildren.unite(drawableContentRectOf ChildSubtree); | 691 accumulatedDrawableContentRectOfChildren.unite(drawableContentRectOf ChildSubtree); |
653 if (child->renderSurface()) | 692 if (child->renderSurface()) |
654 descendants.append(child); | 693 descendants.append(child); |
655 } | 694 } |
656 } | 695 } |
657 | 696 |
658 // Compute the total drawableContentRect for this subtree (the rect is in ta rgetSurface space) | 697 // Compute the total drawableContentRect for this subtree (the rect is in ta rgetSurface space) |
659 IntRect localDrawableContentRectOfSubtree = accumulatedDrawableContentRectOf Children; | 698 IntRect localDrawableContentRectOfSubtree = accumulatedDrawableContentRectOf Children; |
660 if (layer->drawsContent()) | 699 if (layer->drawsContent()) |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
775 LayerType* replicaMaskLayer = it->replicaLayer() ? it->replicaLayer( )->maskLayer() : 0; | 814 LayerType* replicaMaskLayer = it->replicaLayer() ? it->replicaLayer( )->maskLayer() : 0; |
776 if (replicaMaskLayer) | 815 if (replicaMaskLayer) |
777 replicaMaskLayer->setVisibleContentRect(IntRect(IntPoint(), it-> contentBounds())); | 816 replicaMaskLayer->setVisibleContentRect(IntRect(IntPoint(), it-> contentBounds())); |
778 } else if (it.representsItself()) { | 817 } else if (it.representsItself()) { |
779 IntRect visibleContentRect = calculateVisibleContentRect(*it); | 818 IntRect visibleContentRect = calculateVisibleContentRect(*it); |
780 it->setVisibleContentRect(visibleContentRect); | 819 it->setVisibleContentRect(visibleContentRect); |
781 } | 820 } |
782 } | 821 } |
783 } | 822 } |
784 | 823 |
785 void CCLayerTreeHostCommon::calculateDrawTransforms(LayerChromium* rootLayer, co nst IntSize& deviceViewportSize, float deviceScaleFactor, int maxTextureSize, Ve ctor<RefPtr<LayerChromium> >& renderSurfaceLayerList) | 824 void CCLayerTreeHostCommon::calculateDrawTransforms(LayerChromium* rootLayer, co nst IntSize& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, int maxTextureSize, Vector<RefPtr<LayerChromium> >& renderSurfaceLayerList) |
786 { | 825 { |
787 IntRect totalDrawableContentRect; | 826 IntRect totalDrawableContentRect; |
788 WebTransformationMatrix identityMatrix; | 827 WebTransformationMatrix identityMatrix; |
789 WebTransformationMatrix deviceScaleTransform; | 828 WebTransformationMatrix deviceScaleTransform; |
790 deviceScaleTransform.scale(deviceScaleFactor); | 829 deviceScaleTransform.scale(deviceScaleFactor); |
791 | 830 |
792 setupRootLayerAndSurfaceForRecursion<LayerChromium, Vector<RefPtr<LayerChrom ium> > >(rootLayer, renderSurfaceLayerList, deviceViewportSize); | 831 setupRootLayerAndSurfaceForRecursion<LayerChromium, Vector<RefPtr<LayerChrom ium> > >(rootLayer, renderSurfaceLayerList, deviceViewportSize); |
793 | 832 |
794 cc::calculateDrawTransformsInternal<LayerChromium, Vector<RefPtr<LayerChromi um> >, RenderSurfaceChromium, void>(rootLayer, rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, | 833 cc::calculateDrawTransformsInternal<LayerChromium, Vector<RefPtr<LayerChromi um> >, RenderSurfaceChromium, void>(rootLayer, rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, |
795 rootLayer->renderSurface()->contentRect (), true, 0, renderSurfaceLayerList, | 834 rootLayer->renderSurface()->contentRect(), t rue, 0, renderSurfaceLayerList, |
796 rootLayer->renderSurface()->layerList() , 0, maxTextureSize, deviceScaleFactor, totalDrawableContentRect); | 835 rootLayer->renderSurface()->layerList(), 0, maxTextureSize, deviceScaleFactor, pageScaleFactor, totalDrawableContentRect); |
797 } | 836 } |
798 | 837 |
799 void CCLayerTreeHostCommon::calculateDrawTransforms(CCLayerImpl* rootLayer, cons t IntSize& deviceViewportSize, float deviceScaleFactor, CCLayerSorter* layerSort er, int maxTextureSize, Vector<CCLayerImpl*>& renderSurfaceLayerList) | 838 void CCLayerTreeHostCommon::calculateDrawTransforms(CCLayerImpl* rootLayer, cons t IntSize& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, C CLayerSorter* layerSorter, int maxTextureSize, Vector<CCLayerImpl*>& renderSurfa ceLayerList) |
800 { | 839 { |
801 IntRect totalDrawableContentRect; | 840 IntRect totalDrawableContentRect; |
802 WebTransformationMatrix identityMatrix; | 841 WebTransformationMatrix identityMatrix; |
803 WebTransformationMatrix deviceScaleTransform; | 842 WebTransformationMatrix deviceScaleTransform; |
804 deviceScaleTransform.scale(deviceScaleFactor); | 843 deviceScaleTransform.scale(deviceScaleFactor); |
805 | 844 |
806 setupRootLayerAndSurfaceForRecursion<CCLayerImpl, Vector<CCLayerImpl*> >(roo tLayer, renderSurfaceLayerList, deviceViewportSize); | 845 setupRootLayerAndSurfaceForRecursion<CCLayerImpl, Vector<CCLayerImpl*> >(roo tLayer, renderSurfaceLayerList, deviceViewportSize); |
807 | 846 |
808 cc::calculateDrawTransformsInternal<CCLayerImpl, Vector<CCLayerImpl*>, CCRen derSurface, CCLayerSorter>(rootLayer, rootLayer, deviceScaleTransform, identityM atrix, identityMatrix, | 847 cc::calculateDrawTransformsInternal<CCLayerImpl, Vector<CCLayerImpl*>, CCRen derSurface, CCLayerSorter>(rootLayer, rootLayer, deviceScaleTransform, identityM atrix, identityMatrix, |
809 rootLayer->renderSurface()->contentRect(), true, 0, renderSurfaceLayerList, | 848 rootLayer->renderSurface()->contentRect(), true, 0, r enderSurfaceLayerList, |
810 rootLayer->renderSurface()->layerList(), layerSo rter, maxTextureSize, deviceScaleFactor, totalDrawableContentRect); | 849 rootLayer->renderSurface()->layerList(), layerSorter, maxTextureSize, deviceScaleFactor, pageScaleFactor, totalDrawableContentRect); |
811 } | 850 } |
812 | 851 |
813 void CCLayerTreeHostCommon::calculateVisibleRects(Vector<RefPtr<LayerChromium> > & renderSurfaceLayerList) | 852 void CCLayerTreeHostCommon::calculateVisibleRects(Vector<RefPtr<LayerChromium> > & renderSurfaceLayerList) |
814 { | 853 { |
815 calculateVisibleRectsInternal<LayerChromium, Vector<RefPtr<LayerChromium> >, RenderSurfaceChromium>(renderSurfaceLayerList); | 854 calculateVisibleRectsInternal<LayerChromium, Vector<RefPtr<LayerChromium> >, RenderSurfaceChromium>(renderSurfaceLayerList); |
816 } | 855 } |
817 | 856 |
818 void CCLayerTreeHostCommon::calculateVisibleRects(Vector<CCLayerImpl*>& renderSu rfaceLayerList) | 857 void CCLayerTreeHostCommon::calculateVisibleRects(Vector<CCLayerImpl*>& renderSu rfaceLayerList) |
819 { | 858 { |
820 calculateVisibleRectsInternal<CCLayerImpl, Vector<CCLayerImpl*>, CCRenderSur face>(renderSurfaceLayerList); | 859 calculateVisibleRectsInternal<CCLayerImpl, Vector<CCLayerImpl*>, CCRenderSur face>(renderSurfaceLayerList); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
885 | 924 |
886 foundLayer = currentLayer; | 925 foundLayer = currentLayer; |
887 break; | 926 break; |
888 } | 927 } |
889 | 928 |
890 // This can potentially return 0, which means the viewportPoint did not succ essfully hit test any layers, not even the root layer. | 929 // This can potentially return 0, which means the viewportPoint did not succ essfully hit test any layers, not even the root layer. |
891 return foundLayer; | 930 return foundLayer; |
892 } | 931 } |
893 | 932 |
894 } // namespace cc | 933 } // namespace cc |
OLD | NEW |