Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(637)

Unified Diff: cc/trees/layer_tree_host_common.cc

Issue 12552004: Support bottom-right anchored fixed-position elements during a pinch gesture (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move [Web]LayerPositionConstraint conversion to glue Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/layers/layer_position_constraint.cc ('k') | cc/trees/layer_tree_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_common.cc
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index 770a408f7982ef0cf9ac5f55bc443acac955e182..d128c347401fa1f1e58b43997c61e2e7472671cd 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -316,6 +316,65 @@ static bool subtreeShouldRenderToSeparateSurface(LayerType* layer, bool axisAlig
return false;
}
+static LayerImpl* nextTargetSurface(LayerImpl* layer)
+{
+ return layer->parent() ? layer->parent()->render_target() : 0;
+}
+
+void applyPositionAdjustment(Layer*, Layer*, const gfx::Transform&, gfx::Transform*) { }
+void applyPositionAdjustment(LayerImpl* layer, LayerImpl* container, const gfx::Transform& scrollCompensation, gfx::Transform* combinedTransform)
+{
+ if (layer->position_constraint().is_fixed_position()) {
+ // Special case: this layer is a composited fixed-position layer; we need to
+ // explicitly compensate for all ancestors' nonzero scrollDeltas to keep this layer
+ // fixed correctly.
+ // Note carefully: this is Concat, not Preconcat (currentScrollCompensation * combinedTransform).
+ combinedTransform->ConcatTransform(scrollCompensation);
+
+ // For right-edge or bottom-edge anchored fixed position layers,
+ // the layer should relocate itself if the container changes its size.
+ bool fixedToRightEdge = layer->position_constraint().is_fixed_to_right_edge();
+ bool fixedToBottomEdge = layer->position_constraint().is_fixed_to_bottom_edge();
+ gfx::Vector2dF positionOffset = container ? container->fixed_container_size_delta() : gfx::Vector2dF();
+ positionOffset.set_x(fixedToRightEdge ? positionOffset.x() : 0);
+ positionOffset.set_y(fixedToBottomEdge ? positionOffset.y() : 0);
+ if (positionOffset.IsZero())
+ return;
+
+ // To apply bottom-right anchor compensation in the container's layer space,
+ // the following steps need to be done:
+ // Step 1a. transform from target surface space to the container's target surface space
+ // Step 1b. transform from container's target surface space to the container's layer space
+ // Step 2. apply the compensation
+ // Step 3. transform back to target surface space
+
+ gfx::Transform targetSurfaceSpaceToContainerLayerSpace;
+
+ // Step 1a
+ LayerImpl* containerTargetSurface = container ? container->render_target() : 0;
+ for (LayerImpl* currentTargetSurface = nextTargetSurface(layer);
+ currentTargetSurface && currentTargetSurface != containerTargetSurface;
+ currentTargetSurface = nextTargetSurface(currentTargetSurface)) {
+ targetSurfaceSpaceToContainerLayerSpace.ConcatTransform(currentTargetSurface->render_surface()->draw_transform());
+ }
+
+ // Step 1b
+ gfx::Transform containerTargetSurfaceSpaceToContainerLayerSpace;
+ if (container && container->draw_transform().GetInverse(&containerTargetSurfaceSpaceToContainerLayerSpace))
+ targetSurfaceSpaceToContainerLayerSpace.ConcatTransform(containerTargetSurfaceSpaceToContainerLayerSpace);
+
+ combinedTransform->ConcatTransform(targetSurfaceSpaceToContainerLayerSpace);
+
+ // Step 2
+ combinedTransform->Translate(positionOffset.x(), positionOffset.y());
shawnsingh 2013/03/22 04:42:11 This Translate is applied the same way as PreConca
+
+ // Step 3
+ gfx::Transform containerLayerSpaceTotargetSurfaceSpace;
+ if (targetSurfaceSpaceToContainerLayerSpace.GetInverse(&containerLayerSpaceTotargetSurfaceSpace))
+ combinedTransform->ConcatTransform(containerLayerSpaceTotargetSurfaceSpace);
+ }
+}
+
gfx::Transform computeScrollCompensationForThisLayer(LayerImpl* scrollingLayer, const gfx::Transform& parentMatrix)
{
// For every layer that has non-zero scrollDelta, we have to compute a transform that can undo the
@@ -553,7 +612,7 @@ static void roundTranslationComponents(gfx::Transform* transform)
// necessary transformations, clipRects, render surfaces, etc.
template<typename LayerType, typename LayerList, typename RenderSurfaceType>
static void calculateDrawPropertiesInternal(LayerType* layer, const gfx::Transform& parentMatrix,
- const gfx::Transform& fullHierarchyMatrix, const gfx::Transform& currentScrollCompensationMatrix,
+ const gfx::Transform& fullHierarchyMatrix, const gfx::Transform& currentScrollCompensationMatrix, LayerType* currentFixedContainer,
const gfx::Rect& clipRectFromAncestor, const gfx::Rect& clipRectFromAncestorInDescendantSpace, bool ancestorClipsSubtree,
RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceLayerList, LayerList& layerList,
LayerSorter* layerSorter, int maxTextureSize, float deviceScaleFactor, float pageScaleFactor, bool subtreeCanUseLCDText,
@@ -709,13 +768,8 @@ static void calculateDrawPropertiesInternal(LayerType* layer, const gfx::Transfo
roundTranslationComponents(&combinedTransform);
}
- if (layer->fixed_to_container_layer()) {
- // Special case: this layer is a composited fixed-position layer; we need to
- // explicitly compensate for all ancestors' nonzero scrollDeltas to keep this layer
- // fixed correctly.
- // Note carefully: this is Concat, not Preconcat (currentScrollCompensation * combinedTransform).
- combinedTransform.ConcatTransform(currentScrollCompensationMatrix);
- }
+ // Apply adjustment from position constraints.
+ applyPositionAdjustment(layer, currentFixedContainer, currentScrollCompensationMatrix, &combinedTransform);
// 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.
@@ -898,12 +952,13 @@ static void calculateDrawPropertiesInternal(LayerType* layer, const gfx::Transfo
descendants.push_back(layer);
gfx::Transform nextScrollCompensationMatrix = computeScrollCompensationMatrixForChildren(layer, parentMatrix, currentScrollCompensationMatrix);;
shawnsingh 2013/03/22 04:42:11 computeScrollCompensationMatrixForChildren is the
+ LayerType* nextFixedContainer = layer->is_container_for_fixed_position_layers() ? layer : currentFixedContainer;
gfx::Rect accumulatedDrawableContentRectOfChildren;
for (size_t i = 0; i < layer->children().size(); ++i) {
LayerType* child = LayerTreeHostCommon::getChildAsRawPtr(layer->children(), i);
gfx::Rect drawableContentRectOfChildSubtree;
- calculateDrawPropertiesInternal<LayerType, LayerList, RenderSurfaceType>(child, sublayerMatrix, nextHierarchyMatrix, nextScrollCompensationMatrix,
+ calculateDrawPropertiesInternal<LayerType, LayerList, RenderSurfaceType>(child, sublayerMatrix, nextHierarchyMatrix, nextScrollCompensationMatrix, nextFixedContainer,
clipRectForSubtree, clipRectForSubtreeInDescendantSpace, subtreeShouldBeClipped, nearestAncestorThatMovesPixels,
renderSurfaceLayerList, descendants, layerSorter, maxTextureSize, deviceScaleFactor, pageScaleFactor,
subtreeCanUseLCDText, drawableContentRectOfChildSubtree, updateTilePriorities);
@@ -1046,7 +1101,7 @@ void LayerTreeHostCommon::calculateDrawProperties(Layer* rootLayer, const gfx::S
preCalculateMetaInformation<Layer>(rootLayer);
calculateDrawPropertiesInternal<Layer, std::vector<scoped_refptr<Layer> >, RenderSurface>(
- rootLayer, deviceScaleTransform, identityMatrix, identityMatrix,
+ rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, 0,
deviceViewportRect, deviceViewportRect, subtreeShouldBeClipped, 0, renderSurfaceLayerList,
dummyLayerList, 0, maxTextureSize,
deviceScaleFactor, pageScaleFactor, canUseLCDText, totalDrawableContentRect,
@@ -1076,7 +1131,7 @@ void LayerTreeHostCommon::calculateDrawProperties(LayerImpl* rootLayer, const gf
preCalculateMetaInformation<LayerImpl>(rootLayer);
calculateDrawPropertiesInternal<LayerImpl, std::vector<LayerImpl*>, RenderSurfaceImpl>(
- rootLayer, deviceScaleTransform, identityMatrix, identityMatrix,
+ rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, 0,
deviceViewportRect, deviceViewportRect, subtreeShouldBeClipped, 0, renderSurfaceLayerList,
dummyLayerList, &layerSorter, maxTextureSize,
deviceScaleFactor, pageScaleFactor, canUseLCDText, totalDrawableContentRect,
« no previous file with comments | « cc/layers/layer_position_constraint.cc ('k') | cc/trees/layer_tree_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698