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> |
| 8 |
7 #include "cc/layer.h" | 9 #include "cc/layer.h" |
8 #include "cc/layer_impl.h" | 10 #include "cc/layer_impl.h" |
9 #include "cc/layer_iterator.h" | 11 #include "cc/layer_iterator.h" |
10 #include "cc/layer_sorter.h" | 12 #include "cc/layer_sorter.h" |
11 #include "cc/math_util.h" | 13 #include "cc/math_util.h" |
12 #include "cc/render_surface.h" | 14 #include "cc/render_surface.h" |
13 #include "cc/render_surface_impl.h" | 15 #include "cc/render_surface_impl.h" |
14 #include "ui/gfx/point_conversions.h" | 16 #include "ui/gfx/point_conversions.h" |
15 #include "ui/gfx/rect_conversions.h" | 17 #include "ui/gfx/rect_conversions.h" |
16 #include <algorithm> | 18 #include "ui/gfx/transform.h" |
17 #include <public/WebTransformationMatrix.h> | |
18 | 19 |
19 using WebKit::WebTransformationMatrix; | 20 using gfx::Transform; |
20 | 21 |
21 namespace cc { | 22 namespace cc { |
22 | 23 |
23 ScrollAndScaleSet::ScrollAndScaleSet() | 24 ScrollAndScaleSet::ScrollAndScaleSet() |
24 { | 25 { |
25 } | 26 } |
26 | 27 |
27 ScrollAndScaleSet::~ScrollAndScaleSet() | 28 ScrollAndScaleSet::~ScrollAndScaleSet() |
28 { | 29 { |
29 } | 30 } |
30 | 31 |
31 gfx::Rect LayerTreeHostCommon::calculateVisibleRect(const gfx::Rect& targetSurfa
ceRect, const gfx::Rect& layerBoundRect, const WebTransformationMatrix& transfor
m) | 32 gfx::Rect LayerTreeHostCommon::calculateVisibleRect(const gfx::Rect& targetSurfa
ceRect, const gfx::Rect& layerBoundRect, const Transform& transform) |
32 { | 33 { |
33 // Is this layer fully contained within the target surface? | 34 // Is this layer fully contained within the target surface? |
34 gfx::Rect layerInSurfaceSpace = MathUtil::mapClippedRect(transform, layerBou
ndRect); | 35 gfx::Rect layerInSurfaceSpace = MathUtil::mapClippedRect(transform, layerBou
ndRect); |
35 if (targetSurfaceRect.Contains(layerInSurfaceSpace)) | 36 if (targetSurfaceRect.Contains(layerInSurfaceSpace)) |
36 return layerBoundRect; | 37 return layerBoundRect; |
37 | 38 |
38 // If the layer doesn't fill up the entire surface, then find the part of | 39 // If the layer doesn't fill up the entire surface, then find the part of |
39 // the surface rect where the layer could be visible. This avoids trying to | 40 // the surface rect where the layer could be visible. This avoids trying to |
40 // project surface rect points that are behind the projection point. | 41 // project surface rect points that are behind the projection point. |
41 gfx::Rect minimalSurfaceRect = targetSurfaceRect; | 42 gfx::Rect minimalSurfaceRect = targetSurfaceRect; |
42 minimalSurfaceRect.Intersect(layerInSurfaceSpace); | 43 minimalSurfaceRect.Intersect(layerInSurfaceSpace); |
43 | 44 |
44 // Project the corners of the target surface rect into the layer space. | 45 // Project the corners of the target surface rect into the layer space. |
45 // This bounding rectangle may be larger than it needs to be (being | 46 // This bounding rectangle may be larger than it needs to be (being |
46 // axis-aligned), but is a reasonable filter on the space to consider. | 47 // axis-aligned), but is a reasonable filter on the space to consider. |
47 // Non-invertible transforms will create an empty rect here. | 48 // Non-invertible transforms will create an empty rect here. |
48 const WebTransformationMatrix surfaceToLayer = transform.inverse(); | 49 const Transform surfaceToLayer = MathUtil::inverse(transform); |
49 gfx::Rect layerRect = gfx::ToEnclosingRect(MathUtil::projectClippedRect(surf
aceToLayer, gfx::RectF(minimalSurfaceRect))); | 50 gfx::Rect layerRect = gfx::ToEnclosingRect(MathUtil::projectClippedRect(surf
aceToLayer, gfx::RectF(minimalSurfaceRect))); |
50 layerRect.Intersect(layerBoundRect); | 51 layerRect.Intersect(layerBoundRect); |
51 return layerRect; | 52 return layerRect; |
52 } | 53 } |
53 | 54 |
54 template <typename LayerType> | 55 template <typename LayerType> |
55 static inline bool isRootLayer(LayerType* layer) | 56 static inline bool isRootLayer(LayerType* layer) |
56 { | 57 { |
57 return !layer->parent(); | 58 return !layer->parent(); |
58 } | 59 } |
(...skipping 20 matching lines...) Expand all Loading... |
79 | 80 |
80 template<typename LayerType> | 81 template<typename LayerType> |
81 static bool isLayerBackFaceVisible(LayerType* layer) | 82 static bool isLayerBackFaceVisible(LayerType* layer) |
82 { | 83 { |
83 // The current W3C spec on CSS transforms says that backface visibility shou
ld be | 84 // The current W3C spec on CSS transforms says that backface visibility shou
ld be |
84 // determined differently depending on whether the layer is in a "3d renderi
ng | 85 // determined differently depending on whether the layer is in a "3d renderi
ng |
85 // context" or not. For Chromium code, we can determine whether we are in a
3d | 86 // context" or not. For Chromium code, we can determine whether we are in a
3d |
86 // rendering context by checking if the parent preserves 3d. | 87 // rendering context by checking if the parent preserves 3d. |
87 | 88 |
88 if (layerIsInExisting3DRenderingContext(layer)) | 89 if (layerIsInExisting3DRenderingContext(layer)) |
89 return layer->drawTransform().isBackFaceVisible(); | 90 return MathUtil::isBackFaceVisible(layer->drawTransform()); |
90 | 91 |
91 // In this case, either the layer establishes a new 3d rendering context, or
is not in | 92 // In this case, either the layer establishes a new 3d rendering context, or
is not in |
92 // a 3d rendering context at all. | 93 // a 3d rendering context at all. |
93 return layer->transform().isBackFaceVisible(); | 94 return MathUtil::isBackFaceVisible(layer->transform()); |
94 } | 95 } |
95 | 96 |
96 template<typename LayerType> | 97 template<typename LayerType> |
97 static bool isSurfaceBackFaceVisible(LayerType* layer, const WebTransformationMa
trix& drawTransform) | 98 static bool isSurfaceBackFaceVisible(LayerType* layer, const Transform& drawTran
sform) |
98 { | 99 { |
99 if (layerIsInExisting3DRenderingContext(layer)) | 100 if (layerIsInExisting3DRenderingContext(layer)) |
100 return drawTransform.isBackFaceVisible(); | 101 return MathUtil::isBackFaceVisible(drawTransform); |
101 | 102 |
102 if (isRootLayerOfNewRenderingContext(layer)) | 103 if (isRootLayerOfNewRenderingContext(layer)) |
103 return layer->transform().isBackFaceVisible(); | 104 return MathUtil::isBackFaceVisible(layer->transform()); |
104 | 105 |
105 // If the renderSurface is not part of a new or existing rendering context,
then the | 106 // If the renderSurface is not part of a new or existing rendering context,
then the |
106 // layers that contribute to this surface will decide back-face visibility f
or themselves. | 107 // layers that contribute to this surface will decide back-face visibility f
or themselves. |
107 return false; | 108 return false; |
108 } | 109 } |
109 | 110 |
110 template<typename LayerType> | 111 template<typename LayerType> |
111 static inline bool layerClipsSubtree(LayerType* layer) | 112 static inline bool layerClipsSubtree(LayerType* layer) |
112 { | 113 { |
113 return layer->masksToBounds() || layer->maskLayer(); | 114 return layer->masksToBounds() || layer->maskLayer(); |
(...skipping 10 matching lines...) Expand all Loading... |
124 | 125 |
125 gfx::Rect targetSurfaceClipRect; | 126 gfx::Rect targetSurfaceClipRect; |
126 | 127 |
127 // First, compute visible bounds in target surface space. | 128 // First, compute visible bounds in target surface space. |
128 if (layer->renderTarget()->renderSurface()->clipRect().IsEmpty()) | 129 if (layer->renderTarget()->renderSurface()->clipRect().IsEmpty()) |
129 targetSurfaceClipRect = layer->drawableContentRect(); | 130 targetSurfaceClipRect = layer->drawableContentRect(); |
130 else { | 131 else { |
131 // In this case the target surface does clip layers that contribute to i
t. So, we | 132 // In this case the target surface does clip layers that contribute to i
t. So, we |
132 // have convert the current surface's clipRect from its ancestor surface
space to | 133 // have convert the current surface's clipRect from its ancestor surface
space to |
133 // the current surface space. | 134 // the current surface space. |
134 targetSurfaceClipRect = gfx::ToEnclosingRect(MathUtil::projectClippedRec
t(layer->renderTarget()->renderSurface()->drawTransform().inverse(), layer->rend
erTarget()->renderSurface()->clipRect())); | 135 targetSurfaceClipRect = gfx::ToEnclosingRect(MathUtil::projectClippedRec
t(MathUtil::inverse(layer->renderTarget()->renderSurface()->drawTransform()), la
yer->renderTarget()->renderSurface()->clipRect())); |
135 targetSurfaceClipRect.Intersect(layer->drawableContentRect()); | 136 targetSurfaceClipRect.Intersect(layer->drawableContentRect()); |
136 } | 137 } |
137 | 138 |
138 if (targetSurfaceClipRect.IsEmpty()) | 139 if (targetSurfaceClipRect.IsEmpty()) |
139 return gfx::Rect(); | 140 return gfx::Rect(); |
140 | 141 |
141 return LayerTreeHostCommon::calculateVisibleRect(targetSurfaceClipRect, gfx:
:Rect(gfx::Point(), layer->contentBounds()), layer->drawTransform()); | 142 return LayerTreeHostCommon::calculateVisibleRect(targetSurfaceClipRect, gfx:
:Rect(gfx::Point(), layer->contentBounds()), layer->drawTransform()); |
142 } | 143 } |
143 | 144 |
144 static bool isScaleOrTranslation(const WebTransformationMatrix& m) | 145 static bool isScaleOrTranslation(const Transform& m) |
145 { | 146 { |
146 return !m.m12() && !m.m13() && !m.m14() | 147 return !m.matrix().getDouble(1, 0) && !m.matrix().getDouble(2, 0) && !m.matr
ix().getDouble(3, 0) |
147 && !m.m21() && !m.m23() && !m.m24() | 148 && !m.matrix().getDouble(0, 1) && !m.matrix().getDouble(2, 1) && !m.m
atrix().getDouble(3, 1) |
148 && !m.m31() && !m.m32() && !m.m43() | 149 && !m.matrix().getDouble(0, 2) && !m.matrix().getDouble(1, 2) && !m.m
atrix().getDouble(2, 3) |
149 && m.m44(); | 150 && m.matrix().getDouble(3, 3); |
150 } | 151 } |
151 | 152 |
152 static inline bool transformToParentIsKnown(LayerImpl*) | 153 static inline bool transformToParentIsKnown(LayerImpl*) |
153 { | 154 { |
154 return true; | 155 return true; |
155 } | 156 } |
156 | 157 |
157 static inline bool transformToParentIsKnown(Layer* layer) | 158 static inline bool transformToParentIsKnown(Layer* layer) |
158 { | 159 { |
159 return !layer->transformIsAnimating(); | 160 return !layer->transformIsAnimating(); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 if (layerClipsSubtree(layer) && !axisAlignedWithRespectToParent && descendan
tDrawsContent) | 259 if (layerClipsSubtree(layer) && !axisAlignedWithRespectToParent && descendan
tDrawsContent) |
259 return true; | 260 return true; |
260 | 261 |
261 // If the layer has opacity != 1 and does not have a preserves-3d transform
style. | 262 // If the layer has opacity != 1 and does not have a preserves-3d transform
style. |
262 if (layer->opacity() != 1 && !layer->preserves3D() && descendantDrawsContent
) | 263 if (layer->opacity() != 1 && !layer->preserves3D() && descendantDrawsContent
) |
263 return true; | 264 return true; |
264 | 265 |
265 return false; | 266 return false; |
266 } | 267 } |
267 | 268 |
268 WebTransformationMatrix computeScrollCompensationForThisLayer(LayerImpl* scrolli
ngLayer, const WebTransformationMatrix& parentMatrix) | 269 Transform computeScrollCompensationForThisLayer(LayerImpl* scrollingLayer, const
Transform& parentMatrix) |
269 { | 270 { |
270 // For every layer that has non-zero scrollDelta, we have to compute a trans
form that can undo the | 271 // For every layer that has non-zero scrollDelta, we have to compute a trans
form that can undo the |
271 // scrollDelta translation. In particular, we want this matrix to premultipl
y a fixed-position layer's | 272 // scrollDelta translation. In particular, we want this matrix to premultipl
y a fixed-position layer's |
272 // parentMatrix, so we design this transform in three steps as follows. The
steps described here apply | 273 // parentMatrix, so we design this transform in three steps as follows. The
steps described here apply |
273 // from right-to-left, so Step 1 would be the right-most matrix: | 274 // from right-to-left, so Step 1 would be the right-most matrix: |
274 // | 275 // |
275 // Step 1. transform from target surface space to the exact space where
scrollDelta is actually applied. | 276 // Step 1. transform from target surface space to the exact space where
scrollDelta is actually applied. |
276 // -- this is inverse of the matrix in step 3 | 277 // -- this is inverse of the matrix in step 3 |
277 // Step 2. undo the scrollDelta | 278 // Step 2. undo the scrollDelta |
278 // -- this is just a translation by scrollDelta. | 279 // -- this is just a translation by scrollDelta. |
279 // Step 3. transform back to target surface space. | 280 // Step 3. transform back to target surface space. |
280 // -- this transform is the "partialLayerOriginTransform" = (paren
tMatrix * scale(layer->pageScaleDelta())); | 281 // -- this transform is the "partialLayerOriginTransform" = (paren
tMatrix * scale(layer->pageScaleDelta())); |
281 // | 282 // |
282 // These steps create a matrix that both start and end in targetSurfaceSpace
. So this matrix can | 283 // These steps create a matrix that both start and end in targetSurfaceSpace
. So this matrix can |
283 // pre-multiply any fixed-position layer's drawTransform to undo the scrollD
eltas -- as long as | 284 // pre-multiply any fixed-position layer's drawTransform to undo the scrollD
eltas -- as long as |
284 // that fixed position layer is fixed onto the same renderTarget as this scr
ollingLayer. | 285 // that fixed position layer is fixed onto the same renderTarget as this scr
ollingLayer. |
285 // | 286 // |
286 | 287 |
287 WebTransformationMatrix partialLayerOriginTransform = parentMatrix; | 288 Transform partialLayerOriginTransform = parentMatrix; |
288 partialLayerOriginTransform.multiply(scrollingLayer->implTransform()); | 289 partialLayerOriginTransform.PreconcatTransform(scrollingLayer->implTransform
()); |
289 | 290 |
290 WebTransformationMatrix scrollCompensationForThisLayer = partialLayerOriginT
ransform; // Step 3 | 291 Transform scrollCompensationForThisLayer = partialLayerOriginTransform; // S
tep 3 |
291 scrollCompensationForThisLayer.translate(scrollingLayer->scrollDelta().x(),
scrollingLayer->scrollDelta().y()); // Step 2 | 292 scrollCompensationForThisLayer.PreconcatTranslate(scrollingLayer->scrollDelt
a().x(), scrollingLayer->scrollDelta().y()); // Step 2 |
292 scrollCompensationForThisLayer.multiply(partialLayerOriginTransform.inverse(
)); // Step 1 | 293 scrollCompensationForThisLayer.PreconcatTransform(MathUtil::inverse(partialL
ayerOriginTransform)); // Step 1 |
293 return scrollCompensationForThisLayer; | 294 return scrollCompensationForThisLayer; |
294 } | 295 } |
295 | 296 |
296 WebTransformationMatrix computeScrollCompensationMatrixForChildren(Layer* curren
tLayer, const WebTransformationMatrix& currentParentMatrix, const WebTransformat
ionMatrix& currentScrollCompensation) | 297 Transform computeScrollCompensationMatrixForChildren(Layer* currentLayer, const
Transform& currentParentMatrix, const Transform& currentScrollCompensation) |
297 { | 298 { |
298 // The main thread (i.e. Layer) does not need to worry about scroll compensa
tion. | 299 // The main thread (i.e. Layer) does not need to worry about scroll compensa
tion. |
299 // So we can just return an identity matrix here. | 300 // So we can just return an identity matrix here. |
300 return WebTransformationMatrix(); | 301 return Transform(); |
301 } | 302 } |
302 | 303 |
303 WebTransformationMatrix computeScrollCompensationMatrixForChildren(LayerImpl* la
yer, const WebTransformationMatrix& parentMatrix, const WebTransformationMatrix&
currentScrollCompensationMatrix) | 304 Transform computeScrollCompensationMatrixForChildren(LayerImpl* layer, const Tra
nsform& parentMatrix, const Transform& currentScrollCompensationMatrix) |
304 { | 305 { |
305 // "Total scroll compensation" is the transform needed to cancel out all scr
ollDelta translations that | 306 // "Total scroll compensation" is the transform needed to cancel out all scr
ollDelta translations that |
306 // occurred since the nearest container layer, even if there are renderSurfa
ces in-between. | 307 // occurred since the nearest container layer, even if there are renderSurfa
ces in-between. |
307 // | 308 // |
308 // There are some edge cases to be aware of, that are not explicit in the co
de: | 309 // There are some edge cases to be aware of, that are not explicit in the co
de: |
309 // - A layer that is both a fixed-position and container should not be its
own container, instead, that means | 310 // - A layer that is both a fixed-position and container should not be its
own container, instead, that means |
310 // it is fixed to an ancestor, and is a container for any fixed-position
descendants. | 311 // it is fixed to an ancestor, and is a container for any fixed-position
descendants. |
311 // - A layer that is a fixed-position container and has a renderSurface sho
uld behave the same as a container | 312 // - A layer that is a fixed-position container and has a renderSurface sho
uld behave the same as a container |
312 // without a renderSurface, the renderSurface is irrelevant in that case. | 313 // without a renderSurface, the renderSurface is irrelevant in that case. |
313 // - A layer that does not have an explicit container is simply fixed to th
e viewport. | 314 // - A layer that does not have an explicit container is simply fixed to th
e viewport. |
314 // (i.e. the root renderSurface.) | 315 // (i.e. the root renderSurface.) |
315 // - If the fixed-position layer has its own renderSurface, then the render
Surface is | 316 // - If the fixed-position layer has its own renderSurface, then the render
Surface is |
316 // the one who gets fixed. | 317 // the one who gets fixed. |
317 // | 318 // |
318 // This function needs to be called AFTER layers create their own renderSurf
aces. | 319 // This function needs to be called AFTER layers create their own renderSurf
aces. |
319 // | 320 // |
320 | 321 |
321 // Avoid the overheads (including stack allocation and matrix initialization
/copy) if we know that the scroll compensation doesn't need to be reset or adjus
ted. | 322 // Avoid the overheads (including stack allocation and matrix initialization
/copy) if we know that the scroll compensation doesn't need to be reset or adjus
ted. |
322 if (!layer->isContainerForFixedPositionLayers() && layer->scrollDelta().IsZe
ro() && !layer->renderSurface()) | 323 if (!layer->isContainerForFixedPositionLayers() && layer->scrollDelta().IsZe
ro() && !layer->renderSurface()) |
323 return currentScrollCompensationMatrix; | 324 return currentScrollCompensationMatrix; |
324 | 325 |
325 // Start as identity matrix. | 326 // Start as identity matrix. |
326 WebTransformationMatrix nextScrollCompensationMatrix; | 327 Transform nextScrollCompensationMatrix; |
327 | 328 |
328 // If this layer is not a container, then it inherits the existing scroll co
mpensations. | 329 // If this layer is not a container, then it inherits the existing scroll co
mpensations. |
329 if (!layer->isContainerForFixedPositionLayers()) | 330 if (!layer->isContainerForFixedPositionLayers()) |
330 nextScrollCompensationMatrix = currentScrollCompensationMatrix; | 331 nextScrollCompensationMatrix = currentScrollCompensationMatrix; |
331 | 332 |
332 // If the current layer has a non-zero scrollDelta, then we should compute i
ts local scrollCompensation | 333 // If the current layer has a non-zero scrollDelta, then we should compute i
ts local scrollCompensation |
333 // and accumulate it to the nextScrollCompensationMatrix. | 334 // and accumulate it to the nextScrollCompensationMatrix. |
334 if (!layer->scrollDelta().IsZero()) { | 335 if (!layer->scrollDelta().IsZero()) { |
335 WebTransformationMatrix scrollCompensationForThisLayer = computeScrollCo
mpensationForThisLayer(layer, parentMatrix); | 336 Transform scrollCompensationForThisLayer = computeScrollCompensationForT
hisLayer(layer, parentMatrix); |
336 nextScrollCompensationMatrix.multiply(scrollCompensationForThisLayer); | 337 nextScrollCompensationMatrix.PreconcatTransform(scrollCompensationForThi
sLayer); |
337 } | 338 } |
338 | 339 |
339 // If the layer created its own renderSurface, we have to adjust nextScrollC
ompensationMatrix. | 340 // If the layer created its own renderSurface, we have to adjust nextScrollC
ompensationMatrix. |
340 // The adjustment allows us to continue using the scrollCompensation on the
next surface. | 341 // The adjustment allows us to continue using the scrollCompensation on the
next surface. |
341 // Step 1 (right-most in the math): transform from the new surface to the o
riginal ancestor surface | 342 // Step 1 (right-most in the math): transform from the new surface to the o
riginal ancestor surface |
342 // Step 2: apply the scroll compensation | 343 // Step 2: apply the scroll compensation |
343 // Step 3: transform back to the new surface. | 344 // Step 3: transform back to the new surface. |
344 if (layer->renderSurface() && !nextScrollCompensationMatrix.isIdentity()) | 345 if (layer->renderSurface() && !nextScrollCompensationMatrix.IsIdentity()) |
345 nextScrollCompensationMatrix = layer->renderSurface()->drawTransform().i
nverse() * nextScrollCompensationMatrix * layer->renderSurface()->drawTransform(
); | 346 nextScrollCompensationMatrix = MathUtil::inverse(layer->renderSurface()-
>drawTransform()) * nextScrollCompensationMatrix * layer->renderSurface()->drawT
ransform(); |
346 | 347 |
347 return nextScrollCompensationMatrix; | 348 return nextScrollCompensationMatrix; |
348 } | 349 } |
349 | 350 |
350 // There is no contentsScale on impl thread. | 351 // There is no contentsScale on impl thread. |
351 static inline void updateLayerContentsScale(LayerImpl*, const WebTransformationM
atrix&, float, float, bool) { } | 352 static inline void updateLayerContentsScale(LayerImpl*, const Transform&, float,
float, bool) { } |
352 | 353 |
353 static inline void updateLayerContentsScale(Layer* layer, const WebTransformatio
nMatrix& combinedTransform, float deviceScaleFactor, float pageScaleFactor, bool
animatingTransformToScreen) | 354 static inline void updateLayerContentsScale(Layer* layer, const Transform& combi
nedTransform, float deviceScaleFactor, float pageScaleFactor, bool animatingTran
sformToScreen) |
354 { | 355 { |
355 float rasterScale = layer->rasterScale(); | 356 float rasterScale = layer->rasterScale(); |
356 if (!rasterScale) { | 357 if (!rasterScale) { |
357 rasterScale = 1; | 358 rasterScale = 1; |
358 | 359 |
359 if (!animatingTransformToScreen && layer->automaticallyComputeRasterScal
e()) { | 360 if (!animatingTransformToScreen && layer->automaticallyComputeRasterScal
e()) { |
360 gfx::Vector2dF transformScale = MathUtil::computeTransform2dScaleCom
ponents(combinedTransform); | 361 gfx::Vector2dF transformScale = MathUtil::computeTransform2dScaleCom
ponents(combinedTransform); |
361 float combinedScale = std::max(transformScale.x(), transformScale.y(
)); | 362 float combinedScale = std::max(transformScale.x(), transformScale.y(
)); |
362 rasterScale = combinedScale / deviceScaleFactor; | 363 rasterScale = combinedScale / deviceScaleFactor; |
363 if (!layer->boundsContainPageScale()) | 364 if (!layer->boundsContainPageScale()) |
(...skipping 16 matching lines...) Expand all Loading... |
380 maskLayer->setContentsScale(contentsScale); | 381 maskLayer->setContentsScale(contentsScale); |
381 | 382 |
382 Layer* replicaMaskLayer = layer->replicaLayer() ? layer->replicaLayer()->mas
kLayer() : 0; | 383 Layer* replicaMaskLayer = layer->replicaLayer() ? layer->replicaLayer()->mas
kLayer() : 0; |
383 if (replicaMaskLayer) | 384 if (replicaMaskLayer) |
384 replicaMaskLayer->setContentsScale(contentsScale); | 385 replicaMaskLayer->setContentsScale(contentsScale); |
385 } | 386 } |
386 | 387 |
387 // Recursively walks the layer tree starting at the given node and computes all
the | 388 // Recursively walks the layer tree starting at the given node and computes all
the |
388 // necessary transformations, clipRects, render surfaces, etc. | 389 // necessary transformations, clipRects, render surfaces, etc. |
389 template<typename LayerType, typename LayerList, typename RenderSurfaceType, typ
ename LayerSorter> | 390 template<typename LayerType, typename LayerList, typename RenderSurfaceType, typ
ename LayerSorter> |
390 static void calculateDrawTransformsInternal(LayerType* layer, const WebTransform
ationMatrix& parentMatrix, | 391 static void calculateDrawTransformsInternal(LayerType* layer, const Transform& p
arentMatrix, |
391 const WebTransformationMatrix& fullHierarchyMatrix, const WebTransformationM
atrix& currentScrollCompensationMatrix, | 392 const Transform& fullHierarchyMatrix, const Transform& currentScrollCompensa
tionMatrix, |
392 const gfx::Rect& clipRectFromAncestor, bool ancestorClipsSubtree, | 393 const gfx::Rect& clipRectFromAncestor, bool ancestorClipsSubtree, |
393 RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceL
ayerList, LayerList& layerList, | 394 RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceL
ayerList, LayerList& layerList, |
394 LayerSorter* layerSorter, int maxTextureSize, float deviceScaleFactor, float
pageScaleFactor, gfx::Rect& drawableContentRectOfSubtree) | 395 LayerSorter* layerSorter, int maxTextureSize, float deviceScaleFactor, float
pageScaleFactor, gfx::Rect& drawableContentRectOfSubtree) |
395 { | 396 { |
396 // This function computes the new matrix transformations recursively for thi
s | 397 // This function computes the new matrix transformations recursively for thi
s |
397 // layer and all its descendants. It also computes the appropriate render su
rfaces. | 398 // layer and all its descendants. It also computes the appropriate render su
rfaces. |
398 // Some important points to remember: | 399 // Some important points to remember: |
399 // | 400 // |
400 // 0. Here, transforms are notated in Matrix x Vector order, and in words we
describe what | 401 // 0. Here, transforms are notated in Matrix x Vector order, and in words we
describe what |
401 // the transform does from left to right. | 402 // the transform does from left to right. |
402 // | 403 // |
403 // 1. In our terminology, the "layer origin" refers to the top-left corner o
f a layer, and the | 404 // 1. In our terminology, the "layer origin" refers to the top-left corner o
f a layer, and the |
404 // positive Y-axis points downwards. This interpretation is valid because
the orthographic | 405 // positive Y-axis points downwards. This interpretation is valid because
the orthographic |
405 // projection applied at draw time flips the Y axis appropriately. | 406 // projection applied at draw time flips the Y axis appropriately. |
406 // | 407 // |
407 // 2. The anchor point, when given as a PointF object, is specified in "unit
layer space", | 408 // 2. The anchor point, when given as a PointF object, is specified in "unit
layer space", |
408 // where the bounds of the layer map to [0, 1]. However, as a WebTransfor
mationMatrix object, | 409 // where the bounds of the layer map to [0, 1]. However, as a Transform o
bject, |
409 // the transform to the anchor point is specified in "layer space", where
the bounds | 410 // the transform to the anchor point is specified in "layer space", where
the bounds |
410 // of the layer map to [bounds.width(), bounds.height()]. | 411 // of the layer map to [bounds.width(), bounds.height()]. |
411 // | 412 // |
412 // 3. Definition of various transforms used: | 413 // 3. Definition of various transforms used: |
413 // M[parent] is the parent matrix, with respect to the nearest render
surface, passed down recursively. | 414 // M[parent] is the parent matrix, with respect to the nearest render
surface, passed down recursively. |
414 // M[root] is the full hierarchy, with respect to the root, passed do
wn recursively. | 415 // M[root] is the full hierarchy, with respect to the root, passed do
wn recursively. |
415 // Tr[origin] is the translation matrix from the parent's origin to t
his layer's origin. | 416 // Tr[origin] is the translation matrix from the parent's origin to t
his layer's origin. |
416 // Tr[origin2anchor] is the translation from the layer's origin to it
s anchor point | 417 // Tr[origin2anchor] is the translation from the layer's origin to it
s anchor point |
417 // Tr[origin2center] is the translation from the layer's origin to it
s center | 418 // Tr[origin2center] is the translation from the layer's origin to it
s center |
418 // M[layer] is the layer's matrix (applied at the anchor point) | 419 // M[layer] is the layer's matrix (applied at the anchor point) |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 bool animatingTransformToScreen = animatingTransformToTarget; | 497 bool animatingTransformToScreen = animatingTransformToTarget; |
497 if (layer->parent()) { | 498 if (layer->parent()) { |
498 animatingTransformToTarget |= layer->parent()->drawTransformIsAnimating(
); | 499 animatingTransformToTarget |= layer->parent()->drawTransformIsAnimating(
); |
499 animatingTransformToScreen |= layer->parent()->screenSpaceTransformIsAni
mating(); | 500 animatingTransformToScreen |= layer->parent()->screenSpaceTransformIsAni
mating(); |
500 } | 501 } |
501 | 502 |
502 gfx::Size bounds = layer->bounds(); | 503 gfx::Size bounds = layer->bounds(); |
503 gfx::PointF anchorPoint = layer->anchorPoint(); | 504 gfx::PointF anchorPoint = layer->anchorPoint(); |
504 gfx::PointF position = layer->position() - layer->scrollDelta(); | 505 gfx::PointF position = layer->position() - layer->scrollDelta(); |
505 | 506 |
506 WebTransformationMatrix layerLocalTransform; | 507 Transform layerLocalTransform; |
507 // LT = Tr[origin] * Tr[origin2anchor] | 508 // LT = Tr[origin] * Tr[origin2anchor] |
508 layerLocalTransform.translate3d(position.x() + anchorPoint.x() * bounds.widt
h(), position.y() + anchorPoint.y() * bounds.height(), layer->anchorPointZ()); | 509 layerLocalTransform.PreconcatTranslate3d(position.x() + anchorPoint.x() * bo
unds.width(), position.y() + anchorPoint.y() * bounds.height(), layer->anchorPoi
ntZ()); |
509 // LT = Tr[origin] * Tr[origin2anchor] * M[layer] | 510 // LT = Tr[origin] * Tr[origin2anchor] * M[layer] |
510 layerLocalTransform.multiply(layer->transform()); | 511 layerLocalTransform.PreconcatTransform(layer->transform()); |
511 // LT = Tr[origin] * Tr[origin2anchor] * M[layer] * Tr[anchor2origin] | 512 // LT = Tr[origin] * Tr[origin2anchor] * M[layer] * Tr[anchor2origin] |
512 layerLocalTransform.translate3d(-anchorPoint.x() * bounds.width(), -anchorPo
int.y() * bounds.height(), -layer->anchorPointZ()); | 513 layerLocalTransform.PreconcatTranslate3d(-anchorPoint.x() * bounds.width(),
-anchorPoint.y() * bounds.height(), -layer->anchorPointZ()); |
513 | 514 |
514 WebTransformationMatrix combinedTransform = parentMatrix; | 515 Transform combinedTransform = parentMatrix; |
515 combinedTransform.multiply(layerLocalTransform); | 516 combinedTransform.PreconcatTransform(layerLocalTransform); |
516 | 517 |
517 // 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 |
518 // layer's drawTransform. | 519 // layer's drawTransform. |
519 updateLayerContentsScale(layer, combinedTransform, deviceScaleFactor, pageSc
aleFactor, animatingTransformToScreen); | 520 updateLayerContentsScale(layer, combinedTransform, deviceScaleFactor, pageSc
aleFactor, animatingTransformToScreen); |
520 | 521 |
521 // If there is a tranformation from the impl thread then it should be at the | 522 // If there is a tranformation from the impl thread then it should be at the |
522 // start of the combinedTransform, but we don't want it to affect the conten
tsScale. | 523 // start of the combinedTransform, but we don't want it to affect the conten
tsScale. |
523 combinedTransform = layer->implTransform() * combinedTransform; | 524 combinedTransform = layer->implTransform() * combinedTransform; |
524 | 525 |
525 if (layer->fixedToContainerLayer()) { | 526 if (layer->fixedToContainerLayer()) { |
526 // Special case: this layer is a composited fixed-position layer; we nee
d to | 527 // Special case: this layer is a composited fixed-position layer; we nee
d to |
527 // explicitly compensate for all ancestors' nonzero scrollDeltas to keep
this layer | 528 // explicitly compensate for all ancestors' nonzero scrollDeltas to keep
this layer |
528 // fixed correctly. | 529 // fixed correctly. |
529 combinedTransform = currentScrollCompensationMatrix * combinedTransform; | 530 combinedTransform = currentScrollCompensationMatrix * combinedTransform; |
530 } | 531 } |
531 | 532 |
532 // The drawTransform that gets computed below is effectively the layer's dra
wTransform, unless | 533 // The drawTransform that gets computed below is effectively the layer's dra
wTransform, unless |
533 // the layer itself creates a renderSurface. In that case, the renderSurface
re-parents the transforms. | 534 // the layer itself creates a renderSurface. In that case, the renderSurface
re-parents the transforms. |
534 WebTransformationMatrix drawTransform = combinedTransform; | 535 Transform drawTransform = combinedTransform; |
535 // M[draw] = M[parent] * LT * S[layer2content] | 536 // M[draw] = M[parent] * LT * S[layer2content] |
536 drawTransform.scaleNonUniform(1.0 / layer->contentsScaleX(), 1.0 / layer->co
ntentsScaleY()); | 537 drawTransform.PreconcatScale(1.0 / layer->contentsScaleX(), 1.0 / layer->con
tentsScaleY()); |
537 | 538 |
538 // layerScreenSpaceTransform represents the transform between root layer's "
screen space" and local content space. | 539 // layerScreenSpaceTransform represents the transform between root layer's "
screen space" and local content space. |
539 WebTransformationMatrix layerScreenSpaceTransform = fullHierarchyMatrix; | 540 Transform layerScreenSpaceTransform = fullHierarchyMatrix; |
540 if (!layer->preserves3D()) | 541 if (!layer->preserves3D()) |
541 MathUtil::flattenTransformTo2d(layerScreenSpaceTransform); | 542 MathUtil::flattenTransformTo2d(layerScreenSpaceTransform); |
542 layerScreenSpaceTransform.multiply(drawTransform); | 543 layerScreenSpaceTransform.PreconcatTransform(drawTransform); |
543 layer->setScreenSpaceTransform(layerScreenSpaceTransform); | 544 layer->setScreenSpaceTransform(layerScreenSpaceTransform); |
544 | 545 |
545 gfx::RectF contentRect(gfx::PointF(), layer->contentBounds()); | 546 gfx::RectF contentRect(gfx::PointF(), layer->contentBounds()); |
546 | 547 |
547 // fullHierarchyMatrix is the matrix that transforms objects between screen
space (except projection matrix) and the most recent RenderSurfaceImpl's space. | 548 // fullHierarchyMatrix is the matrix that transforms objects between screen
space (except projection matrix) and the most recent RenderSurfaceImpl's space. |
548 // nextHierarchyMatrix will only change if this layer uses a new RenderSurfa
ceImpl, otherwise remains the same. | 549 // nextHierarchyMatrix will only change if this layer uses a new RenderSurfa
ceImpl, otherwise remains the same. |
549 WebTransformationMatrix nextHierarchyMatrix = fullHierarchyMatrix; | 550 Transform nextHierarchyMatrix = fullHierarchyMatrix; |
550 WebTransformationMatrix sublayerMatrix; | 551 Transform sublayerMatrix; |
551 | 552 |
552 gfx::Vector2dF renderSurfaceSublayerScale = MathUtil::computeTransform2dScal
eComponents(combinedTransform); | 553 gfx::Vector2dF renderSurfaceSublayerScale = MathUtil::computeTransform2dScal
eComponents(combinedTransform); |
553 | 554 |
554 if (subtreeShouldRenderToSeparateSurface(layer, isScaleOrTranslation(combine
dTransform))) { | 555 if (subtreeShouldRenderToSeparateSurface(layer, isScaleOrTranslation(combine
dTransform))) { |
555 // Check back-face visibility before continuing with this surface and it
s subtree | 556 // Check back-face visibility before continuing with this surface and it
s subtree |
556 if (!layer->doubleSided() && transformToParentIsKnown(layer) && isSurfac
eBackFaceVisible(layer, combinedTransform)) | 557 if (!layer->doubleSided() && transformToParentIsKnown(layer) && isSurfac
eBackFaceVisible(layer, combinedTransform)) |
557 return; | 558 return; |
558 | 559 |
559 if (!layer->renderSurface()) | 560 if (!layer->renderSurface()) |
560 layer->createRenderSurface(); | 561 layer->createRenderSurface(); |
561 | 562 |
562 RenderSurfaceType* renderSurface = layer->renderSurface(); | 563 RenderSurfaceType* renderSurface = layer->renderSurface(); |
563 renderSurface->clearLayerLists(); | 564 renderSurface->clearLayerLists(); |
564 | 565 |
565 // The owning layer's draw transform has a scale from content to layer s
pace which we need to undo and | 566 // The owning layer's draw transform has a scale from content to layer s
pace which we need to undo and |
566 // replace with a scale from the surface's subtree into layer space. | 567 // replace with a scale from the surface's subtree into layer space. |
567 drawTransform.scaleNonUniform(layer->contentsScaleX(), layer->contentsSc
aleY()); | 568 drawTransform.PreconcatScale(layer->contentsScaleX(), layer->contentsSca
leY()); |
568 drawTransform.scaleNonUniform(1 / renderSurfaceSublayerScale.x(), 1 / re
nderSurfaceSublayerScale.y()); | 569 drawTransform.PreconcatScale(1 / renderSurfaceSublayerScale.x(), 1 / ren
derSurfaceSublayerScale.y()); |
569 renderSurface->setDrawTransform(drawTransform); | 570 renderSurface->setDrawTransform(drawTransform); |
570 | 571 |
571 // The origin of the new surface is the upper left corner of the layer. | 572 // The origin of the new surface is the upper left corner of the layer. |
572 WebTransformationMatrix layerDrawTransform; | 573 Transform layerDrawTransform; |
573 layerDrawTransform.scaleNonUniform(renderSurfaceSublayerScale.x(), rende
rSurfaceSublayerScale.y()); | 574 layerDrawTransform.PreconcatScale(renderSurfaceSublayerScale.x(), render
SurfaceSublayerScale.y()); |
574 layerDrawTransform.scaleNonUniform(1.0 / layer->contentsScaleX(), 1.0 /
layer->contentsScaleY()); | 575 layerDrawTransform.PreconcatScale(1.0 / layer->contentsScaleX(), 1.0 / l
ayer->contentsScaleY()); |
575 layer->setDrawTransform(layerDrawTransform); | 576 layer->setDrawTransform(layerDrawTransform); |
576 | 577 |
577 // Inside the surface's subtree, we scale everything to the owning layer
's scale. | 578 // Inside the surface's subtree, we scale everything to the owning layer
's scale. |
578 // The sublayer matrix transforms centered layer rects into target | 579 // The sublayer matrix transforms centered layer rects into target |
579 // surface content space. | 580 // surface content space. |
580 sublayerMatrix.makeIdentity(); | 581 sublayerMatrix.matrix().setIdentity(); |
581 sublayerMatrix.scaleNonUniform(renderSurfaceSublayerScale.x(), renderSur
faceSublayerScale.y()); | 582 sublayerMatrix.PreconcatScale(renderSurfaceSublayerScale.x(), renderSurf
aceSublayerScale.y()); |
582 | 583 |
583 // The opacity value is moved from the layer to its surface, so that the
entire subtree properly inherits opacity. | 584 // The opacity value is moved from the layer to its surface, so that the
entire subtree properly inherits opacity. |
584 renderSurface->setDrawOpacity(drawOpacity); | 585 renderSurface->setDrawOpacity(drawOpacity); |
585 renderSurface->setDrawOpacityIsAnimating(drawOpacityIsAnimating); | 586 renderSurface->setDrawOpacityIsAnimating(drawOpacityIsAnimating); |
586 layer->setDrawOpacity(1); | 587 layer->setDrawOpacity(1); |
587 layer->setDrawOpacityIsAnimating(false); | 588 layer->setDrawOpacityIsAnimating(false); |
588 | 589 |
589 renderSurface->setTargetSurfaceTransformsAreAnimating(animatingTransform
ToTarget); | 590 renderSurface->setTargetSurfaceTransformsAreAnimating(animatingTransform
ToTarget); |
590 renderSurface->setScreenSpaceTransformsAreAnimating(animatingTransformTo
Screen); | 591 renderSurface->setScreenSpaceTransformsAreAnimating(animatingTransformTo
Screen); |
591 animatingTransformToTarget = false; | 592 animatingTransformToTarget = false; |
592 layer->setDrawTransformIsAnimating(animatingTransformToTarget); | 593 layer->setDrawTransformIsAnimating(animatingTransformToTarget); |
593 layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen); | 594 layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen); |
594 | 595 |
595 // Update the aggregate hierarchy matrix to include the transform of the | 596 // Update the aggregate hierarchy matrix to include the transform of the |
596 // newly created RenderSurfaceImpl. | 597 // newly created RenderSurfaceImpl. |
597 nextHierarchyMatrix.multiply(renderSurface->drawTransform()); | 598 nextHierarchyMatrix.PreconcatTransform(renderSurface->drawTransform()); |
598 | 599 |
599 // The new renderSurface here will correctly clip the entire subtree. So
, we do | 600 // The new renderSurface here will correctly clip the entire subtree. So
, we do |
600 // not need to continue propagating the clipping state further down the
tree. This | 601 // not need to continue propagating the clipping state further down the
tree. This |
601 // way, we can avoid transforming clipRects from ancestor target surface
space to | 602 // way, we can avoid transforming clipRects from ancestor target surface
space to |
602 // current target surface space that could cause more w < 0 headaches. | 603 // current target surface space that could cause more w < 0 headaches. |
603 subtreeShouldBeClipped = false; | 604 subtreeShouldBeClipped = false; |
604 | 605 |
605 if (layer->maskLayer()) { | 606 if (layer->maskLayer()) { |
606 layer->maskLayer()->setRenderTarget(layer); | 607 layer->maskLayer()->setRenderTarget(layer); |
607 layer->maskLayer()->setVisibleContentRect(gfx::Rect(gfx::Point(), la
yer->contentBounds())); | 608 layer->maskLayer()->setVisibleContentRect(gfx::Rect(gfx::Point(), la
yer->contentBounds())); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 clipRectForSubtree.Intersect(rectInTargetSpace); | 659 clipRectForSubtree.Intersect(rectInTargetSpace); |
659 } else | 660 } else |
660 clipRectForSubtree = rectInTargetSpace; | 661 clipRectForSubtree = rectInTargetSpace; |
661 } | 662 } |
662 | 663 |
663 // Flatten to 2D if the layer doesn't preserve 3D. | 664 // Flatten to 2D if the layer doesn't preserve 3D. |
664 if (!layer->preserves3D()) | 665 if (!layer->preserves3D()) |
665 MathUtil::flattenTransformTo2d(sublayerMatrix); | 666 MathUtil::flattenTransformTo2d(sublayerMatrix); |
666 | 667 |
667 // Apply the sublayer transform at the center of the layer. | 668 // Apply the sublayer transform at the center of the layer. |
668 sublayerMatrix.translate(0.5 * bounds.width(), 0.5 * bounds.height()); | 669 sublayerMatrix.PreconcatTranslate(0.5 * bounds.width(), 0.5 * bounds.height(
)); |
669 sublayerMatrix.multiply(layer->sublayerTransform()); | 670 sublayerMatrix.PreconcatTransform(layer->sublayerTransform()); |
670 sublayerMatrix.translate(-0.5 * bounds.width(), -0.5 * bounds.height()); | 671 sublayerMatrix.PreconcatTranslate(-0.5 * bounds.width(), -0.5 * bounds.heigh
t()); |
671 | 672 |
672 LayerList& descendants = (layer->renderSurface() ? layer->renderSurface()->l
ayerList() : layerList); | 673 LayerList& descendants = (layer->renderSurface() ? layer->renderSurface()->l
ayerList() : layerList); |
673 | 674 |
674 // Any layers that are appended after this point are in the layer's subtree
and should be included in the sorting process. | 675 // Any layers that are appended after this point are in the layer's subtree
and should be included in the sorting process. |
675 unsigned sortingStartIndex = descendants.size(); | 676 unsigned sortingStartIndex = descendants.size(); |
676 | 677 |
677 if (!layerShouldBeSkipped(layer)) | 678 if (!layerShouldBeSkipped(layer)) |
678 descendants.push_back(layer); | 679 descendants.push_back(layer); |
679 | 680 |
680 WebTransformationMatrix nextScrollCompensationMatrix = computeScrollCompensa
tionMatrixForChildren(layer, parentMatrix, currentScrollCompensationMatrix);; | 681 Transform nextScrollCompensationMatrix = computeScrollCompensationMatrixForC
hildren(layer, parentMatrix, currentScrollCompensationMatrix);; |
681 | 682 |
682 gfx::Rect accumulatedDrawableContentRectOfChildren; | 683 gfx::Rect accumulatedDrawableContentRectOfChildren; |
683 for (size_t i = 0; i < layer->children().size(); ++i) { | 684 for (size_t i = 0; i < layer->children().size(); ++i) { |
684 LayerType* child = LayerTreeHostCommon::getChildAsRawPtr(layer->children
(), i); | 685 LayerType* child = LayerTreeHostCommon::getChildAsRawPtr(layer->children
(), i); |
685 gfx::Rect drawableContentRectOfChildSubtree; | 686 gfx::Rect drawableContentRectOfChildSubtree; |
686 calculateDrawTransformsInternal<LayerType, LayerList, RenderSurfaceType,
LayerSorter>(child, sublayerMatrix, nextHierarchyMatrix, nextScrollCompensation
Matrix, | 687 calculateDrawTransformsInternal<LayerType, LayerList, RenderSurfaceType,
LayerSorter>(child, sublayerMatrix, nextHierarchyMatrix, nextScrollCompensation
Matrix, |
687
clipRectForSubtree, subtreeShouldBeClipped, nearestAncestorThatMov
esPixels, | 688
clipRectForSubtree, subtreeShouldBeClipped, nearestAncestorThatMov
esPixels, |
688
renderSurfaceLayerList, descendants, layerSorter, maxTextureSize,
deviceScaleFactor, pageScaleFactor, drawableContentRectOfChildSubtree); | 689
renderSurfaceLayerList, descendants, layerSorter, maxTextureSize,
deviceScaleFactor, pageScaleFactor, drawableContentRectOfChildSubtree); |
689 if (!drawableContentRectOfChildSubtree.IsEmpty()) { | 690 if (!drawableContentRectOfChildSubtree.IsEmpty()) { |
690 accumulatedDrawableContentRectOfChildren.Union(drawableContentRectOf
ChildSubtree); | 691 accumulatedDrawableContentRectOfChildren.Union(drawableContentRectOf
ChildSubtree); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 clippedContentRect.set_width(std::min(clippedContentRect.width(), maxTex
tureSize)); | 750 clippedContentRect.set_width(std::min(clippedContentRect.width(), maxTex
tureSize)); |
750 clippedContentRect.set_height(std::min(clippedContentRect.height(), maxT
extureSize)); | 751 clippedContentRect.set_height(std::min(clippedContentRect.height(), maxT
extureSize)); |
751 | 752 |
752 if (clippedContentRect.IsEmpty()) | 753 if (clippedContentRect.IsEmpty()) |
753 renderSurface->clearLayerLists(); | 754 renderSurface->clearLayerLists(); |
754 | 755 |
755 renderSurface->setContentRect(clippedContentRect); | 756 renderSurface->setContentRect(clippedContentRect); |
756 | 757 |
757 // The owning layer's screenSpaceTransform has a scale from content to l
ayer space which we need to undo and | 758 // The owning layer's screenSpaceTransform has a scale from content to l
ayer space which we need to undo and |
758 // replace with a scale from the surface's subtree into layer space. | 759 // replace with a scale from the surface's subtree into layer space. |
759 WebTransformationMatrix screenSpaceTransform = layer->screenSpaceTransfo
rm(); | 760 Transform screenSpaceTransform = layer->screenSpaceTransform(); |
760 screenSpaceTransform.scaleNonUniform(layer->contentsScaleX(), layer->con
tentsScaleY()); | 761 screenSpaceTransform.PreconcatScale(layer->contentsScaleX(), layer->cont
entsScaleY()); |
761 screenSpaceTransform.scaleNonUniform(1 / renderSurfaceSublayerScale.x(),
1 / renderSurfaceSublayerScale.y()); | 762 screenSpaceTransform.PreconcatScale(1 / renderSurfaceSublayerScale.x(),
1 / renderSurfaceSublayerScale.y()); |
762 renderSurface->setScreenSpaceTransform(screenSpaceTransform); | 763 renderSurface->setScreenSpaceTransform(screenSpaceTransform); |
763 | 764 |
764 if (layer->replicaLayer()) { | 765 if (layer->replicaLayer()) { |
765 WebTransformationMatrix surfaceOriginToReplicaOriginTransform; | 766 Transform surfaceOriginToReplicaOriginTransform; |
766 surfaceOriginToReplicaOriginTransform.scaleNonUniform(renderSurfaceS
ublayerScale.x(), renderSurfaceSublayerScale.y()); | 767 surfaceOriginToReplicaOriginTransform.PreconcatScale(renderSurfaceSu
blayerScale.x(), renderSurfaceSublayerScale.y()); |
767 surfaceOriginToReplicaOriginTransform.translate(layer->replicaLayer(
)->position().x() + layer->replicaLayer()->anchorPoint().x() * bounds.width(), | 768 surfaceOriginToReplicaOriginTransform.PreconcatTranslate(layer->repl
icaLayer()->position().x() + layer->replicaLayer()->anchorPoint().x() * bounds.w
idth(), |
768 layer->replicaLayer(
)->position().y() + layer->replicaLayer()->anchorPoint().y() * bounds.height()); | 769 layer->replicaLayer(
)->position().y() + layer->replicaLayer()->anchorPoint().y() * bounds.height()); |
769 surfaceOriginToReplicaOriginTransform.multiply(layer->replicaLayer()
->transform()); | 770 surfaceOriginToReplicaOriginTransform.PreconcatTransform(layer->repl
icaLayer()->transform()); |
770 surfaceOriginToReplicaOriginTransform.translate(-layer->replicaLayer
()->anchorPoint().x() * bounds.width(), -layer->replicaLayer()->anchorPoint().y(
) * bounds.height()); | 771 surfaceOriginToReplicaOriginTransform.PreconcatTranslate(-layer->rep
licaLayer()->anchorPoint().x() * bounds.width(), -layer->replicaLayer()->anchorP
oint().y() * bounds.height()); |
771 surfaceOriginToReplicaOriginTransform.scaleNonUniform(1 / renderSurf
aceSublayerScale.x(), 1 / renderSurfaceSublayerScale.y()); | 772 surfaceOriginToReplicaOriginTransform.PreconcatScale(1 / renderSurfa
ceSublayerScale.x(), 1 / renderSurfaceSublayerScale.y()); |
772 | 773 |
773 // Compute the replica's "originTransform" that maps from the replic
a's origin space to the target surface origin space. | 774 // Compute the replica's "originTransform" that maps from the replic
a's origin space to the target surface origin space. |
774 WebTransformationMatrix replicaOriginTransform = layer->renderSurfac
e()->drawTransform() * surfaceOriginToReplicaOriginTransform; | 775 Transform replicaOriginTransform = layer->renderSurface()->drawTrans
form() * surfaceOriginToReplicaOriginTransform; |
775 renderSurface->setReplicaDrawTransform(replicaOriginTransform); | 776 renderSurface->setReplicaDrawTransform(replicaOriginTransform); |
776 | 777 |
777 // Compute the replica's "screenSpaceTransform" that maps from the r
eplica's origin space to the screen's origin space. | 778 // Compute the replica's "screenSpaceTransform" that maps from the r
eplica's origin space to the screen's origin space. |
778 WebTransformationMatrix replicaScreenSpaceTransform = layer->renderS
urface()->screenSpaceTransform() * surfaceOriginToReplicaOriginTransform; | 779 Transform replicaScreenSpaceTransform = layer->renderSurface()->scre
enSpaceTransform() * surfaceOriginToReplicaOriginTransform; |
779 renderSurface->setReplicaScreenSpaceTransform(replicaScreenSpaceTran
sform); | 780 renderSurface->setReplicaScreenSpaceTransform(replicaScreenSpaceTran
sform); |
780 } | 781 } |
781 | 782 |
782 // If a render surface has no layer list, then it and none of its childr
en needed to get drawn. | 783 // If a render surface has no layer list, then it and none of its childr
en needed to get drawn. |
783 if (!layer->renderSurface()->layerList().size()) { | 784 if (!layer->renderSurface()->layerList().size()) { |
784 // FIXME: Originally we asserted that this layer was already at the
end of the | 785 // FIXME: Originally we asserted that this layer was already at the
end of the |
785 // list, and only needed to remove that layer. For now, we re
move the | 786 // list, and only needed to remove that layer. For now, we re
move the |
786 // entire subtree of surfaces to fix a crash bug. The root ca
use is | 787 // entire subtree of surfaces to fix a crash bug. The root ca
use is |
787 // https://bugs.webkit.org/show_bug.cgi?id=74147 and we shoul
d be able | 788 // https://bugs.webkit.org/show_bug.cgi?id=74147 and we shoul
d be able |
788 // to put the original assert after fixing that. | 789 // to put the original assert after fixing that. |
(...skipping 23 matching lines...) Expand all Loading... |
812 else | 813 else |
813 drawableContentRectOfSubtree = localDrawableContentRectOfSubtree; | 814 drawableContentRectOfSubtree = localDrawableContentRectOfSubtree; |
814 | 815 |
815 if (layer->hasContributingDelegatedRenderPasses()) | 816 if (layer->hasContributingDelegatedRenderPasses()) |
816 layer->renderTarget()->renderSurface()->addContributingDelegatedRenderPa
ssLayer(layer); | 817 layer->renderTarget()->renderSurface()->addContributingDelegatedRenderPa
ssLayer(layer); |
817 } | 818 } |
818 | 819 |
819 void LayerTreeHostCommon::calculateDrawTransforms(Layer* rootLayer, const gfx::S
ize& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, int max
TextureSize, std::vector<scoped_refptr<Layer> >& renderSurfaceLayerList) | 820 void LayerTreeHostCommon::calculateDrawTransforms(Layer* rootLayer, const gfx::S
ize& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, int max
TextureSize, std::vector<scoped_refptr<Layer> >& renderSurfaceLayerList) |
820 { | 821 { |
821 gfx::Rect totalDrawableContentRect; | 822 gfx::Rect totalDrawableContentRect; |
822 WebTransformationMatrix identityMatrix; | 823 Transform identityMatrix; |
823 WebTransformationMatrix deviceScaleTransform; | 824 Transform deviceScaleTransform; |
824 deviceScaleTransform.scale(deviceScaleFactor); | 825 deviceScaleTransform.PreconcatScale(deviceScaleFactor, deviceScaleFactor); |
825 std::vector<scoped_refptr<Layer> > dummyLayerList; | 826 std::vector<scoped_refptr<Layer> > dummyLayerList; |
826 | 827 |
827 // The root layer's renderSurface should receive the deviceViewport as the i
nitial clipRect. | 828 // The root layer's renderSurface should receive the deviceViewport as the i
nitial clipRect. |
828 bool subtreeShouldBeClipped = true; | 829 bool subtreeShouldBeClipped = true; |
829 gfx::Rect deviceViewportRect(gfx::Point(), deviceViewportSize); | 830 gfx::Rect deviceViewportRect(gfx::Point(), deviceViewportSize); |
830 | 831 |
831 // This function should have received a root layer. | 832 // This function should have received a root layer. |
832 DCHECK(isRootLayer(rootLayer)); | 833 DCHECK(isRootLayer(rootLayer)); |
833 | 834 |
834 cc::calculateDrawTransformsInternal<Layer, std::vector<scoped_refptr<Layer>
>, RenderSurface, void>( | 835 cc::calculateDrawTransformsInternal<Layer, std::vector<scoped_refptr<Layer>
>, RenderSurface, void>( |
835 rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, | 836 rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, |
836 deviceViewportRect, subtreeShouldBeClipped, 0, renderSurfaceLayerList, | 837 deviceViewportRect, subtreeShouldBeClipped, 0, renderSurfaceLayerList, |
837 dummyLayerList, 0, maxTextureSize, | 838 dummyLayerList, 0, maxTextureSize, |
838 deviceScaleFactor, pageScaleFactor, totalDrawableContentRect); | 839 deviceScaleFactor, pageScaleFactor, totalDrawableContentRect); |
839 | 840 |
840 // The dummy layer list should not have been used. | 841 // The dummy layer list should not have been used. |
841 DCHECK(dummyLayerList.size() == 0); | 842 DCHECK(dummyLayerList.size() == 0); |
842 // A root layer renderSurface should always exist after calculateDrawTransfo
rms. | 843 // A root layer renderSurface should always exist after calculateDrawTransfo
rms. |
843 DCHECK(rootLayer->renderSurface()); | 844 DCHECK(rootLayer->renderSurface()); |
844 } | 845 } |
845 | 846 |
846 void LayerTreeHostCommon::calculateDrawTransforms(LayerImpl* rootLayer, const gf
x::Size& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, Lay
erSorter* layerSorter, int maxTextureSize, std::vector<LayerImpl*>& renderSurfac
eLayerList) | 847 void LayerTreeHostCommon::calculateDrawTransforms(LayerImpl* rootLayer, const gf
x::Size& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, Lay
erSorter* layerSorter, int maxTextureSize, std::vector<LayerImpl*>& renderSurfac
eLayerList) |
847 { | 848 { |
848 gfx::Rect totalDrawableContentRect; | 849 gfx::Rect totalDrawableContentRect; |
849 WebTransformationMatrix identityMatrix; | 850 Transform identityMatrix; |
850 WebTransformationMatrix deviceScaleTransform; | 851 Transform deviceScaleTransform; |
851 deviceScaleTransform.scale(deviceScaleFactor); | 852 deviceScaleTransform.PreconcatScale(deviceScaleFactor, deviceScaleFactor); |
852 std::vector<LayerImpl*> dummyLayerList; | 853 std::vector<LayerImpl*> dummyLayerList; |
853 | 854 |
854 // The root layer's renderSurface should receive the deviceViewport as the i
nitial clipRect. | 855 // The root layer's renderSurface should receive the deviceViewport as the i
nitial clipRect. |
855 bool subtreeShouldBeClipped = true; | 856 bool subtreeShouldBeClipped = true; |
856 gfx::Rect deviceViewportRect(gfx::Point(), deviceViewportSize); | 857 gfx::Rect deviceViewportRect(gfx::Point(), deviceViewportSize); |
857 | 858 |
858 // This function should have received a root layer. | 859 // This function should have received a root layer. |
859 DCHECK(isRootLayer(rootLayer)); | 860 DCHECK(isRootLayer(rootLayer)); |
860 | 861 |
861 cc::calculateDrawTransformsInternal<LayerImpl, std::vector<LayerImpl*>, Rend
erSurfaceImpl, LayerSorter>( | 862 cc::calculateDrawTransformsInternal<LayerImpl, std::vector<LayerImpl*>, Rend
erSurfaceImpl, LayerSorter>( |
862 rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, | 863 rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, |
863 deviceViewportRect, subtreeShouldBeClipped, 0, renderSurfaceLayerList, | 864 deviceViewportRect, subtreeShouldBeClipped, 0, renderSurfaceLayerList, |
864 dummyLayerList, layerSorter, maxTextureSize, | 865 dummyLayerList, layerSorter, maxTextureSize, |
865 deviceScaleFactor, pageScaleFactor, totalDrawableContentRect); | 866 deviceScaleFactor, pageScaleFactor, totalDrawableContentRect); |
866 | 867 |
867 // The dummy layer list should not have been used. | 868 // The dummy layer list should not have been used. |
868 DCHECK(dummyLayerList.size() == 0); | 869 DCHECK(dummyLayerList.size() == 0); |
869 // A root layer renderSurface should always exist after calculateDrawTransfo
rms. | 870 // A root layer renderSurface should always exist after calculateDrawTransfo
rms. |
870 DCHECK(rootLayer->renderSurface()); | 871 DCHECK(rootLayer->renderSurface()); |
871 } | 872 } |
872 | 873 |
873 static bool pointHitsRect(const gfx::PointF& screenSpacePoint, const WebTransfor
mationMatrix& localSpaceToScreenSpaceTransform, gfx::RectF localSpaceRect) | 874 static bool pointHitsRect(const gfx::PointF& screenSpacePoint, const Transform&
localSpaceToScreenSpaceTransform, gfx::RectF localSpaceRect) |
874 { | 875 { |
875 // If the transform is not invertible, then assume that this point doesn't h
it this rect. | 876 // If the transform is not invertible, then assume that this point doesn't h
it this rect. |
876 if (!localSpaceToScreenSpaceTransform.isInvertible()) | 877 if (!localSpaceToScreenSpaceTransform.IsInvertible()) |
877 return false; | 878 return false; |
878 | 879 |
879 // Transform the hit test point from screen space to the local space of the
given rect. | 880 // Transform the hit test point from screen space to the local space of the
given rect. |
880 bool clipped = false; | 881 bool clipped = false; |
881 gfx::PointF hitTestPointInLocalSpace = MathUtil::projectPoint(localSpaceToSc
reenSpaceTransform.inverse(), screenSpacePoint, clipped); | 882 gfx::PointF hitTestPointInLocalSpace = MathUtil::projectPoint(MathUtil::inve
rse(localSpaceToScreenSpaceTransform), screenSpacePoint, clipped); |
882 | 883 |
883 // If projectPoint could not project to a valid value, then we assume that t
his point doesn't hit this rect. | 884 // If projectPoint could not project to a valid value, then we assume that t
his point doesn't hit this rect. |
884 if (clipped) | 885 if (clipped) |
885 return false; | 886 return false; |
886 | 887 |
887 return localSpaceRect.Contains(hitTestPointInLocalSpace); | 888 return localSpaceRect.Contains(hitTestPointInLocalSpace); |
888 } | 889 } |
889 | 890 |
890 static bool pointHitsRegion(gfx::PointF screenSpacePoint, const WebTransformatio
nMatrix& screenSpaceTransform, const Region& layerSpaceRegion, float layerConten
tScaleX, float layerContentScaleY) | 891 static bool pointHitsRegion(gfx::PointF screenSpacePoint, const Transform& scree
nSpaceTransform, const Region& layerSpaceRegion, float layerContentScaleX, float
layerContentScaleY) |
891 { | 892 { |
892 // If the transform is not invertible, then assume that this point doesn't h
it this region. | 893 // If the transform is not invertible, then assume that this point doesn't h
it this region. |
893 if (!screenSpaceTransform.isInvertible()) | 894 if (!screenSpaceTransform.IsInvertible()) |
894 return false; | 895 return false; |
895 | 896 |
896 // Transform the hit test point from screen space to the local space of the
given region. | 897 // Transform the hit test point from screen space to the local space of the
given region. |
897 bool clipped = false; | 898 bool clipped = false; |
898 gfx::PointF hitTestPointInContentSpace = MathUtil::projectPoint(screenSpaceT
ransform.inverse(), screenSpacePoint, clipped); | 899 gfx::PointF hitTestPointInContentSpace = MathUtil::projectPoint(MathUtil::in
verse(screenSpaceTransform), screenSpacePoint, clipped); |
899 gfx::PointF hitTestPointInLayerSpace = gfx::ScalePoint(hitTestPointInContent
Space, 1 / layerContentScaleX, 1 / layerContentScaleY); | 900 gfx::PointF hitTestPointInLayerSpace = gfx::ScalePoint(hitTestPointInContent
Space, 1 / layerContentScaleX, 1 / layerContentScaleY); |
900 | 901 |
901 // If projectPoint could not project to a valid value, then we assume that t
his point doesn't hit this region. | 902 // If projectPoint could not project to a valid value, then we assume that t
his point doesn't hit this region. |
902 if (clipped) | 903 if (clipped) |
903 return false; | 904 return false; |
904 | 905 |
905 return layerSpaceRegion.Contains(gfx::ToRoundedPoint(hitTestPointInLayerSpac
e)); | 906 return layerSpaceRegion.Contains(gfx::ToRoundedPoint(hitTestPointInLayerSpac
e)); |
906 } | 907 } |
907 | 908 |
908 static bool pointIsClippedBySurfaceOrClipRect(const gfx::PointF& screenSpacePoin
t, LayerImpl* layer) | 909 static bool pointIsClippedBySurfaceOrClipRect(const gfx::PointF& screenSpacePoin
t, LayerImpl* layer) |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
987 | 988 |
988 foundLayer = currentLayer; | 989 foundLayer = currentLayer; |
989 break; | 990 break; |
990 } | 991 } |
991 | 992 |
992 // 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. |
993 return foundLayer; | 994 return foundLayer; |
994 } | 995 } |
995 | 996 |
996 } // namespace cc | 997 } // namespace cc |
OLD | NEW |