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 #include "cc/layer_tree_host_common.h" | 5 #include "cc/layer_tree_host_common.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "cc/layer.h" | 9 #include "cc/layer.h" |
10 #include "cc/layer_impl.h" | 10 #include "cc/layer_impl.h" |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
500 bool animatingTransformToScreen = animatingTransformToTarget; | 500 bool animatingTransformToScreen = animatingTransformToTarget; |
501 if (layer->parent()) { | 501 if (layer->parent()) { |
502 animatingTransformToTarget |= layer->parent()->drawTransformIsAnimating( ); | 502 animatingTransformToTarget |= layer->parent()->drawTransformIsAnimating( ); |
503 animatingTransformToScreen |= layer->parent()->screenSpaceTransformIsAni mating(); | 503 animatingTransformToScreen |= layer->parent()->screenSpaceTransformIsAni mating(); |
504 } | 504 } |
505 | 505 |
506 gfx::Size bounds = layer->bounds(); | 506 gfx::Size bounds = layer->bounds(); |
507 gfx::PointF anchorPoint = layer->anchorPoint(); | 507 gfx::PointF anchorPoint = layer->anchorPoint(); |
508 gfx::PointF position = layer->position() - layer->scrollDelta(); | 508 gfx::PointF position = layer->position() - layer->scrollDelta(); |
509 | 509 |
510 gfx::Transform layerLocalTransform; | 510 gfx::Transform combinedTransform = layer->implTransform() * parentMatrix; |
511 // LT = Tr[origin] * Tr[origin2anchor] | 511 // LT = Tr[origin] * Tr[origin2anchor] |
512 layerLocalTransform.Translate3d(position.x() + anchorPoint.x() * bounds.widt h(), position.y() + anchorPoint.y() * bounds.height(), layer->anchorPointZ()); | 512 combinedTransform.Translate3d(position.x() + anchorPoint.x() * bounds.width( ), position.y() + anchorPoint.y() * bounds.height(), layer->anchorPointZ()); |
513 // LT = Tr[origin] * Tr[origin2anchor] * M[layer] | 513 // LT = Tr[origin] * Tr[origin2anchor] * M[layer] |
514 layerLocalTransform.PreconcatTransform(layer->transform()); | 514 combinedTransform.PreconcatTransform(layer->transform()); |
515 // LT = Tr[origin] * Tr[origin2anchor] * M[layer] * Tr[anchor2origin] | 515 // LT = Tr[origin] * Tr[origin2anchor] * M[layer] * Tr[anchor2origin] |
516 layerLocalTransform.Translate3d(-anchorPoint.x() * bounds.width(), -anchorPo int.y() * bounds.height(), -layer->anchorPointZ()); | 516 combinedTransform.Translate3d(-anchorPoint.x() * bounds.width(), -anchorPoin t.y() * bounds.height(), -layer->anchorPointZ()); |
517 | |
518 gfx::Transform combinedTransform = parentMatrix; | |
519 combinedTransform.PreconcatTransform(layerLocalTransform); | |
520 | 517 |
521 // The layer's contentsSize is determined from the combinedTransform, which then informs the | 518 // The layer's contentsSize is determined from the combinedTransform, which then informs the |
522 // layer's drawTransform. | 519 // layer's drawTransform. |
523 updateLayerContentsScale(layer, combinedTransform, deviceScaleFactor, pageSc aleFactor, animatingTransformToScreen); | 520 updateLayerContentsScale(layer, combinedTransform, deviceScaleFactor, pageSc aleFactor, animatingTransformToScreen); |
524 | 521 |
525 // If there is a tranformation from the impl thread then it should be at the | |
526 // start of the combinedTransform, but we don't want it to affect the conten tsScale. | |
danakj
2012/12/03 18:24:40
implTransform should not affect the contentsScale.
shawnsingh
2012/12/03 19:37:06
Yes, I was planning to ask you about this before l
danakj
2012/12/03 19:56:28
updateLayerContentsScale wants the combinedTransfo
| |
527 combinedTransform = layer->implTransform() * combinedTransform; | |
528 | |
529 if (layer->fixedToContainerLayer()) { | 522 if (layer->fixedToContainerLayer()) { |
530 // Special case: this layer is a composited fixed-position layer; we nee d to | 523 // Special case: this layer is a composited fixed-position layer; we nee d to |
531 // explicitly compensate for all ancestors' nonzero scrollDeltas to keep this layer | 524 // explicitly compensate for all ancestors' nonzero scrollDeltas to keep this layer |
532 // fixed correctly. | 525 // fixed correctly. |
533 combinedTransform = currentScrollCompensationMatrix * combinedTransform; | 526 combinedTransform = currentScrollCompensationMatrix * combinedTransform; |
534 } | 527 } |
535 | 528 |
536 // 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 |
537 // 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. |
538 gfx::Transform drawTransform = combinedTransform; | 531 gfx::Transform drawTransform = combinedTransform; |
(...skipping 20 matching lines...) Expand all Loading... | |
559 // Check back-face visibility before continuing with this surface and it s subtree | 552 // Check back-face visibility before continuing with this surface and it s subtree |
560 if (!layer->doubleSided() && transformToParentIsKnown(layer) && isSurfac eBackFaceVisible(layer, combinedTransform)) | 553 if (!layer->doubleSided() && transformToParentIsKnown(layer) && isSurfac eBackFaceVisible(layer, combinedTransform)) |
561 return; | 554 return; |
562 | 555 |
563 if (!layer->renderSurface()) | 556 if (!layer->renderSurface()) |
564 layer->createRenderSurface(); | 557 layer->createRenderSurface(); |
565 | 558 |
566 RenderSurfaceType* renderSurface = layer->renderSurface(); | 559 RenderSurfaceType* renderSurface = layer->renderSurface(); |
567 renderSurface->clearLayerLists(); | 560 renderSurface->clearLayerLists(); |
568 | 561 |
569 // The owning layer's draw transform has a scale from content to layer s pace which we need to undo and | 562 // The owning layer's draw transform has a scale from content to layer |
570 // replace with a scale from the surface's subtree into layer space. | 563 // space which do not want; so here we use the combinedTransform |
571 drawTransform.Scale(layer->contentsScaleX(), layer->contentsScaleY()); | 564 // instead of the drawTransform. However, we do need to add a different |
572 drawTransform.Scale(1 / renderSurfaceSublayerScale.x(), 1 / renderSurfac eSublayerScale.y()); | 565 // scale factor that accounts for the surface's pixel dimensions. |
573 renderSurface->setDrawTransform(drawTransform); | 566 combinedTransform.Scale(1 / renderSurfaceSublayerScale.x(), 1 / renderSu rfaceSublayerScale.y()); |
567 renderSurface->setDrawTransform(combinedTransform); | |
574 | 568 |
575 // The origin of the new surface is the upper left corner of the layer. | 569 // The owning layer's transform was re-parented by the surface, so the l ayer's new drawTransform |
570 // only needs to scale the layer to surface space. | |
576 gfx::Transform layerDrawTransform; | 571 gfx::Transform layerDrawTransform; |
577 layerDrawTransform.Scale(renderSurfaceSublayerScale.x(), renderSurfaceSu blayerScale.y()); | 572 layerDrawTransform.Scale(renderSurfaceSublayerScale.x() / layer->content sScaleX(), renderSurfaceSublayerScale.y() / layer->contentsScaleY()); |
578 layerDrawTransform.Scale(1.0 / layer->contentsScaleX(), 1.0 / layer->con tentsScaleY()); | |
579 layer->setDrawTransform(layerDrawTransform); | 573 layer->setDrawTransform(layerDrawTransform); |
580 | 574 |
581 // Inside the surface's subtree, we scale everything to the owning layer 's scale. | 575 // Inside the surface's subtree, we scale everything to the owning layer 's scale. |
582 // The sublayer matrix transforms centered layer rects into target | 576 // The sublayer matrix transforms centered layer rects into target |
583 // surface content space. | 577 // surface content space. |
584 sublayerMatrix.MakeIdentity(); | 578 DCHECK(sublayerMatrix.IsIdentity()); |
585 sublayerMatrix.Scale(renderSurfaceSublayerScale.x(), renderSurfaceSublay erScale.y()); | 579 sublayerMatrix.Scale(renderSurfaceSublayerScale.x(), renderSurfaceSublay erScale.y()); |
586 | 580 |
587 // The opacity value is moved from the layer to its surface, so that the entire subtree properly inherits opacity. | 581 // The opacity value is moved from the layer to its surface, so that the entire subtree properly inherits opacity. |
588 renderSurface->setDrawOpacity(drawOpacity); | 582 renderSurface->setDrawOpacity(drawOpacity); |
589 renderSurface->setDrawOpacityIsAnimating(drawOpacityIsAnimating); | 583 renderSurface->setDrawOpacityIsAnimating(drawOpacityIsAnimating); |
590 layer->setDrawOpacity(1); | 584 layer->setDrawOpacity(1); |
591 layer->setDrawOpacityIsAnimating(false); | 585 layer->setDrawOpacityIsAnimating(false); |
592 | 586 |
593 renderSurface->setTargetSurfaceTransformsAreAnimating(animatingTransform ToTarget); | 587 renderSurface->setTargetSurfaceTransformsAreAnimating(animatingTransform ToTarget); |
594 renderSurface->setScreenSpaceTransformsAreAnimating(animatingTransformTo Screen); | 588 renderSurface->setScreenSpaceTransformsAreAnimating(animatingTransformTo Screen); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
662 clipRectForSubtree.Intersect(rectInTargetSpace); | 656 clipRectForSubtree.Intersect(rectInTargetSpace); |
663 } else | 657 } else |
664 clipRectForSubtree = rectInTargetSpace; | 658 clipRectForSubtree = rectInTargetSpace; |
665 } | 659 } |
666 | 660 |
667 // Flatten to 2D if the layer doesn't preserve 3D. | 661 // Flatten to 2D if the layer doesn't preserve 3D. |
668 if (!layer->preserves3D()) | 662 if (!layer->preserves3D()) |
669 MathUtil::flattenTransformTo2d(sublayerMatrix); | 663 MathUtil::flattenTransformTo2d(sublayerMatrix); |
670 | 664 |
671 // Apply the sublayer transform at the center of the layer. | 665 // Apply the sublayer transform at the center of the layer. |
672 sublayerMatrix.Translate(0.5 * bounds.width(), 0.5 * bounds.height()); | 666 if (!layer->sublayerTransform().IsIdentity()) { |
673 sublayerMatrix.PreconcatTransform(layer->sublayerTransform()); | 667 sublayerMatrix.Translate(0.5 * bounds.width(), 0.5 * bounds.height()); |
674 sublayerMatrix.Translate(-0.5 * bounds.width(), -0.5 * bounds.height()); | 668 sublayerMatrix.PreconcatTransform(layer->sublayerTransform()); |
669 sublayerMatrix.Translate(-0.5 * bounds.width(), -0.5 * bounds.height()); | |
670 } | |
675 | 671 |
676 LayerList& descendants = (layer->renderSurface() ? layer->renderSurface()->l ayerList() : layerList); | 672 LayerList& descendants = (layer->renderSurface() ? layer->renderSurface()->l ayerList() : layerList); |
677 | 673 |
678 // Any layers that are appended after this point are in the layer's subtree and should be included in the sorting process. | 674 // Any layers that are appended after this point are in the layer's subtree and should be included in the sorting process. |
679 unsigned sortingStartIndex = descendants.size(); | 675 unsigned sortingStartIndex = descendants.size(); |
680 | 676 |
681 if (!layerShouldBeSkipped(layer)) | 677 if (!layerShouldBeSkipped(layer)) |
682 descendants.push_back(layer); | 678 descendants.push_back(layer); |
683 | 679 |
684 gfx::Transform nextScrollCompensationMatrix = computeScrollCompensationMatri xForChildren(layer, parentMatrix, currentScrollCompensationMatrix);; | 680 gfx::Transform nextScrollCompensationMatrix = computeScrollCompensationMatri xForChildren(layer, parentMatrix, currentScrollCompensationMatrix);; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
754 clippedContentRect.set_height(std::min(clippedContentRect.height(), maxT extureSize)); | 750 clippedContentRect.set_height(std::min(clippedContentRect.height(), maxT extureSize)); |
755 | 751 |
756 if (clippedContentRect.IsEmpty()) | 752 if (clippedContentRect.IsEmpty()) |
757 renderSurface->clearLayerLists(); | 753 renderSurface->clearLayerLists(); |
758 | 754 |
759 renderSurface->setContentRect(clippedContentRect); | 755 renderSurface->setContentRect(clippedContentRect); |
760 | 756 |
761 // The owning layer's screenSpaceTransform has a scale from content to l ayer space which we need to undo and | 757 // The owning layer's screenSpaceTransform has a scale from content to l ayer space which we need to undo and |
762 // replace with a scale from the surface's subtree into layer space. | 758 // replace with a scale from the surface's subtree into layer space. |
763 gfx::Transform screenSpaceTransform = layer->screenSpaceTransform(); | 759 gfx::Transform screenSpaceTransform = layer->screenSpaceTransform(); |
764 screenSpaceTransform.Scale(layer->contentsScaleX(), layer->contentsScale Y()); | 760 screenSpaceTransform.Scale(layer->contentsScaleX() / renderSurfaceSublay erScale.x(), layer->contentsScaleY() / renderSurfaceSublayerScale.y()); |
765 screenSpaceTransform.Scale(1 / renderSurfaceSublayerScale.x(), 1 / rende rSurfaceSublayerScale.y()); | |
766 renderSurface->setScreenSpaceTransform(screenSpaceTransform); | 761 renderSurface->setScreenSpaceTransform(screenSpaceTransform); |
767 | 762 |
768 if (layer->replicaLayer()) { | 763 if (layer->replicaLayer()) { |
769 gfx::Transform surfaceOriginToReplicaOriginTransform; | 764 gfx::Transform surfaceOriginToReplicaOriginTransform; |
770 surfaceOriginToReplicaOriginTransform.Scale(renderSurfaceSublayerSca le.x(), renderSurfaceSublayerScale.y()); | 765 surfaceOriginToReplicaOriginTransform.Scale(renderSurfaceSublayerSca le.x(), renderSurfaceSublayerScale.y()); |
771 surfaceOriginToReplicaOriginTransform.Translate(layer->replicaLayer( )->position().x() + layer->replicaLayer()->anchorPoint().x() * bounds.width(), | 766 surfaceOriginToReplicaOriginTransform.Translate(layer->replicaLayer( )->position().x() + layer->replicaLayer()->anchorPoint().x() * bounds.width(), |
772 layer->replicaLayer( )->position().y() + layer->replicaLayer()->anchorPoint().y() * bounds.height()); | 767 layer->replicaLayer( )->position().y() + layer->replicaLayer()->anchorPoint().y() * bounds.height()); |
773 surfaceOriginToReplicaOriginTransform.PreconcatTransform(layer->repl icaLayer()->transform()); | 768 surfaceOriginToReplicaOriginTransform.PreconcatTransform(layer->repl icaLayer()->transform()); |
774 surfaceOriginToReplicaOriginTransform.Translate(-layer->replicaLayer ()->anchorPoint().x() * bounds.width(), -layer->replicaLayer()->anchorPoint().y( ) * bounds.height()); | 769 surfaceOriginToReplicaOriginTransform.Translate(-layer->replicaLayer ()->anchorPoint().x() * bounds.width(), -layer->replicaLayer()->anchorPoint().y( ) * bounds.height()); |
775 surfaceOriginToReplicaOriginTransform.Scale(1 / renderSurfaceSublaye rScale.x(), 1 / renderSurfaceSublayerScale.y()); | 770 surfaceOriginToReplicaOriginTransform.Scale(1 / renderSurfaceSublaye rScale.x(), 1 / renderSurfaceSublayerScale.y()); |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
993 | 988 |
994 foundLayer = currentLayer; | 989 foundLayer = currentLayer; |
995 break; | 990 break; |
996 } | 991 } |
997 | 992 |
998 // This can potentially return 0, which means the screenSpacePoint did not s uccessfully hit test any layers, not even the root layer. | 993 // This can potentially return 0, which means the screenSpacePoint did not s uccessfully hit test any layers, not even the root layer. |
999 return foundLayer; | 994 return foundLayer; |
1000 } | 995 } |
1001 | 996 |
1002 } // namespace cc | 997 } // namespace cc |
OLD | NEW |