| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/trees/draw_property_utils.h" | 5 #include "cc/trees/draw_property_utils.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 EffectNode* effect_node = | 47 EffectNode* effect_node = |
| 48 layer->layer_tree_impl()->property_trees()->effect_tree.Node( | 48 layer->layer_tree_impl()->property_trees()->effect_tree.Node( |
| 49 layer->effect_tree_index()); | 49 layer->effect_tree_index()); |
| 50 if (effect_node->owner_id != layer->id()) | 50 if (effect_node->owner_id != layer->id()) |
| 51 return; | 51 return; |
| 52 DCHECK_EQ(effect_node->mask_layer_id, -1) << "layer: " << layer->id(); | 52 DCHECK_EQ(effect_node->mask_layer_id, -1) << "layer: " << layer->id(); |
| 53 DCHECK_EQ(effect_node->replica_layer_id, -1) << "layer: " << layer->id(); | 53 DCHECK_EQ(effect_node->replica_layer_id, -1) << "layer: " << layer->id(); |
| 54 DCHECK(effect_node->background_filters.IsEmpty()); | 54 DCHECK(effect_node->background_filters.IsEmpty()); |
| 55 } | 55 } |
| 56 | 56 |
| 57 void VerifySublayerScalesMatch(const int effect_node_id, | 57 void VerifySurfaceContentsScalesMatch(const int target_effect_id, |
| 58 const int target_transform_id, | 58 const int target_transform_id, |
| 59 const EffectTree& effect_tree, | 59 const EffectTree& effect_tree, |
| 60 const TransformTree& transform_tree) { | 60 const TransformTree& transform_tree) { |
| 61 const TransformNode* target_transform_node = | 61 const TransformNode* target_transform_node = |
| 62 transform_tree.Node(target_transform_id); | 62 transform_tree.Node(target_transform_id); |
| 63 const EffectNode* effect_node = effect_tree.Node(effect_node_id); | 63 const EffectNode* target_effect_node = effect_tree.Node(target_effect_id); |
| 64 const EffectNode* target_effect_node = | 64 DCHECK(target_transform_node->surface_contents_scale == |
| 65 effect_node->has_render_surface | 65 target_effect_node->surface_contents_scale) |
| 66 ? effect_node | 66 << " surface contents scale from transform tree: " |
| 67 : effect_tree.Node(effect_node->target_id); | 67 << target_transform_node->surface_contents_scale.ToString() |
| 68 DCHECK(target_transform_node->sublayer_scale == | 68 << " surface contents scale from effect tree: " |
| 69 target_effect_node->sublayer_scale) | 69 << target_effect_node->surface_contents_scale.ToString(); |
| 70 << " sublayer scale from transform tree: " | |
| 71 << target_transform_node->sublayer_scale.ToString() | |
| 72 << " sublayer scale from effect tree: " | |
| 73 << target_effect_node->sublayer_scale.ToString(); | |
| 74 } | 70 } |
| 75 #endif | 71 #endif |
| 76 | 72 |
| 73 static const EffectNode* ContentsTargetEffectNode( |
| 74 const int effect_tree_index, |
| 75 const EffectTree& effect_tree) { |
| 76 const EffectNode* effect_node = effect_tree.Node(effect_tree_index); |
| 77 return effect_node->has_render_surface |
| 78 ? effect_node |
| 79 : effect_tree.Node(effect_node->target_id); |
| 80 } |
| 81 |
| 77 template <typename LayerType> | 82 template <typename LayerType> |
| 78 bool ComputeClipRectInTargetSpace(const LayerType* layer, | 83 bool ComputeClipRectInTargetSpace(const LayerType* layer, |
| 79 const ClipNode* clip_node, | 84 const ClipNode* clip_node, |
| 80 const TransformTree& transform_tree, | 85 const TransformTree& transform_tree, |
| 81 const EffectTree& effect_tree, | 86 const EffectTree& effect_tree, |
| 82 int target_node_id, | 87 int target_node_id, |
| 83 gfx::RectF* clip_rect_in_target_space) { | 88 gfx::RectF* clip_rect_in_target_space) { |
| 84 DCHECK(layer->clip_tree_index() == clip_node->id); | 89 DCHECK(layer->clip_tree_index() == clip_node->id); |
| 85 DCHECK(clip_node->target_transform_id != target_node_id); | 90 DCHECK(clip_node->target_transform_id != target_node_id); |
| 86 | 91 |
| 87 gfx::Transform clip_to_target; | 92 gfx::Transform clip_to_target; |
| 88 if (clip_node->target_transform_id > target_node_id) { | 93 if (clip_node->target_transform_id > target_node_id) { |
| 89 // In this case, layer has a scroll parent. We need to keep the scale | 94 // In this case, layer has a scroll parent. We need to keep the scale |
| 90 // at the layer's target but remove the scale at the scroll parent's | 95 // at the layer's target but remove the scale at the scroll parent's |
| 91 // target. | 96 // target. |
| 92 if (transform_tree.ComputeTransform(clip_node->target_transform_id, | 97 if (transform_tree.ComputeTransform(clip_node->target_transform_id, |
| 93 target_node_id, &clip_to_target)) { | 98 target_node_id, &clip_to_target)) { |
| 94 // We don't have to apply sublayer scale when target is root. | 99 // We don't have to apply surface contents scale when target is root. |
| 95 if (target_node_id != 0) { | 100 if (target_node_id != 0) { |
| 96 PostConcatSublayerScale(layer->effect_tree_index(), effect_tree, | 101 const EffectNode* target_effect_node = |
| 97 &clip_to_target); | 102 ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree); |
| 103 PostConcatSurfaceContentsScale(target_effect_node, &clip_to_target); |
| 98 #if DCHECK_IS_ON() | 104 #if DCHECK_IS_ON() |
| 99 VerifySublayerScalesMatch(layer->effect_tree_index(), target_node_id, | 105 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), |
| 100 effect_tree, transform_tree); | 106 target_node_id, effect_tree, |
| 107 transform_tree); |
| 101 #endif | 108 #endif |
| 102 } | 109 } |
| 103 | 110 |
| 104 const TransformNode* source_node = | 111 const EffectNode* source_node = |
| 105 transform_tree.Node(clip_node->target_transform_id); | 112 effect_tree.Node(clip_node->target_effect_id); |
| 106 if (source_node->sublayer_scale.x() != 0.f && | 113 ConcatInverseSurfaceContentsScale(source_node, &clip_to_target); |
| 107 source_node->sublayer_scale.y() != 0.f) | 114 #if DCHECK_IS_ON() |
| 108 clip_to_target.Scale(1.0f / source_node->sublayer_scale.x(), | 115 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, |
| 109 1.0f / source_node->sublayer_scale.y()); | 116 clip_node->target_transform_id, |
| 117 effect_tree, transform_tree); |
| 118 #endif |
| 110 *clip_rect_in_target_space = MathUtil::MapClippedRect( | 119 *clip_rect_in_target_space = MathUtil::MapClippedRect( |
| 111 clip_to_target, clip_node->clip_in_target_space); | 120 clip_to_target, clip_node->clip_in_target_space); |
| 112 } else { | 121 } else { |
| 113 return false; | 122 return false; |
| 114 } | 123 } |
| 115 } else { | 124 } else { |
| 116 if (transform_tree.ComputeTransform(clip_node->target_transform_id, | 125 if (transform_tree.ComputeTransform(clip_node->target_transform_id, |
| 117 target_node_id, &clip_to_target)) { | 126 target_node_id, &clip_to_target)) { |
| 118 *clip_rect_in_target_space = MathUtil::ProjectClippedRect( | 127 *clip_rect_in_target_space = MathUtil::ProjectClippedRect( |
| 119 clip_to_target, clip_node->clip_in_target_space); | 128 clip_to_target, clip_node->clip_in_target_space); |
| 120 } else { | 129 } else { |
| 121 return false; | 130 return false; |
| 122 } | 131 } |
| 123 } | 132 } |
| 124 return true; | 133 return true; |
| 125 } | 134 } |
| 126 | 135 |
| 127 struct ConditionalClip { | 136 struct ConditionalClip { |
| 128 bool is_clipped; | 137 bool is_clipped; |
| 129 gfx::RectF clip_rect; | 138 gfx::RectF clip_rect; |
| 130 }; | 139 }; |
| 131 | 140 |
| 132 static ConditionalClip ComputeTargetRectInLocalSpace( | 141 static ConditionalClip ComputeTargetRectInLocalSpace( |
| 133 gfx::RectF rect, | 142 gfx::RectF rect, |
| 134 const TransformTree& transform_tree, | 143 const TransformTree& transform_tree, |
| 144 const EffectTree& effect_tree, |
| 135 int current_transform_id, | 145 int current_transform_id, |
| 136 int target_transform_id) { | 146 int target_transform_id, |
| 147 const int current_effect_id) { |
| 137 gfx::Transform current_to_target; | 148 gfx::Transform current_to_target; |
| 138 if (!transform_tree.ComputeTransformWithSourceSublayerScale( | 149 bool success = transform_tree.ComputeTransform( |
| 139 current_transform_id, target_transform_id, ¤t_to_target)) | 150 current_transform_id, target_transform_id, ¤t_to_target); |
| 151 if (!success) |
| 140 // If transform is not invertible, cannot apply clip. | 152 // If transform is not invertible, cannot apply clip. |
| 141 return ConditionalClip{false, gfx::RectF()}; | 153 return ConditionalClip{false, gfx::RectF()}; |
| 154 const EffectNode* current_effect_node = effect_tree.Node(current_effect_id); |
| 155 ConcatInverseSurfaceContentsScale(current_effect_node, ¤t_to_target); |
| 142 | 156 |
| 143 if (current_transform_id > target_transform_id) | 157 if (current_transform_id > target_transform_id) |
| 144 return ConditionalClip{true, // is_clipped. | 158 return ConditionalClip{true, // is_clipped. |
| 145 MathUtil::MapClippedRect(current_to_target, rect)}; | 159 MathUtil::MapClippedRect(current_to_target, rect)}; |
| 146 | 160 |
| 147 return ConditionalClip{true, // is_clipped. | 161 return ConditionalClip{true, // is_clipped. |
| 148 MathUtil::ProjectClippedRect(current_to_target, rect)}; | 162 MathUtil::ProjectClippedRect(current_to_target, rect)}; |
| 149 } | 163 } |
| 150 | 164 |
| 151 static ConditionalClip ComputeLocalRectInTargetSpace( | 165 static ConditionalClip ComputeLocalRectInTargetSpace( |
| 152 gfx::RectF rect, | 166 gfx::RectF rect, |
| 153 const TransformTree& transform_tree, | 167 const TransformTree& transform_tree, |
| 154 const EffectTree& effect_tree, | 168 const EffectTree& effect_tree, |
| 155 int current_transform_id, | 169 int current_transform_id, |
| 156 int target_transform_id, | 170 int target_transform_id, |
| 157 int target_effect_id) { | 171 int target_effect_id) { |
| 158 gfx::Transform current_to_target; | 172 gfx::Transform current_to_target; |
| 159 if (!transform_tree.ComputeTransform(current_transform_id, | 173 if (!transform_tree.ComputeTransform(current_transform_id, |
| 160 target_transform_id, ¤t_to_target)) | 174 target_transform_id, ¤t_to_target)) |
| 161 // If transform is not invertible, cannot apply clip. | 175 // If transform is not invertible, cannot apply clip. |
| 162 return ConditionalClip{false, gfx::RectF()}; | 176 return ConditionalClip{false, gfx::RectF()}; |
| 163 // We don't have to apply sublayer scale when target is root. | 177 // We don't have to apply surface contents scale when target is root. |
| 164 if (target_transform_id != 0) { | 178 if (target_transform_id != 0) { |
| 165 PostConcatSublayerScale(target_effect_id, effect_tree, ¤t_to_target); | 179 const EffectNode* target_effect_node = effect_tree.Node(target_effect_id); |
| 180 PostConcatSurfaceContentsScale(target_effect_node, ¤t_to_target); |
| 166 #if DCHECK_IS_ON() | 181 #if DCHECK_IS_ON() |
| 167 VerifySublayerScalesMatch(target_effect_id, target_transform_id, | 182 VerifySurfaceContentsScalesMatch(target_effect_id, target_transform_id, |
| 168 effect_tree, transform_tree); | 183 effect_tree, transform_tree); |
| 169 #endif | 184 #endif |
| 170 } | 185 } |
| 171 | 186 |
| 172 if (current_transform_id > target_transform_id) | 187 if (current_transform_id > target_transform_id) |
| 173 return ConditionalClip{true, // is_clipped. | 188 return ConditionalClip{true, // is_clipped. |
| 174 MathUtil::MapClippedRect(current_to_target, rect)}; | 189 MathUtil::MapClippedRect(current_to_target, rect)}; |
| 175 | 190 |
| 176 return ConditionalClip{true, // is_clipped. | 191 return ConditionalClip{true, // is_clipped. |
| 177 MathUtil::ProjectClippedRect(current_to_target, rect)}; | 192 MathUtil::ProjectClippedRect(current_to_target, rect)}; |
| 178 } | 193 } |
| 179 | 194 |
| 180 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node, | 195 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node, |
| 181 const TransformTree& transform_tree, | 196 const TransformTree& transform_tree, |
| 182 const EffectTree& effect_tree, | 197 const EffectTree& effect_tree, |
| 183 int target_transform_id, | 198 int target_transform_id, |
| 184 int target_effect_id) { | 199 int target_effect_id) { |
| 185 if (clip_node->transform_id != target_transform_id) | 200 if (clip_node->transform_id != target_transform_id) |
| 186 return ComputeLocalRectInTargetSpace(clip_node->clip, transform_tree, | 201 return ComputeLocalRectInTargetSpace(clip_node->clip, transform_tree, |
| 187 effect_tree, clip_node->transform_id, | 202 effect_tree, clip_node->transform_id, |
| 188 target_transform_id, target_effect_id); | 203 target_transform_id, target_effect_id); |
| 189 | 204 |
| 190 gfx::RectF current_clip = clip_node->clip; | 205 gfx::RectF current_clip = clip_node->clip; |
| 191 gfx::Vector2dF sublayer_scale = | 206 gfx::Vector2dF surface_contents_scale = |
| 192 transform_tree.Node(target_transform_id)->sublayer_scale; | 207 effect_tree.Node(target_effect_id)->surface_contents_scale; |
| 193 if (sublayer_scale.x() > 0 && sublayer_scale.y() > 0) | 208 if (surface_contents_scale.x() > 0 && surface_contents_scale.y() > 0) |
| 194 current_clip.Scale(sublayer_scale.x(), sublayer_scale.y()); | 209 current_clip.Scale(surface_contents_scale.x(), surface_contents_scale.y()); |
| 195 return ConditionalClip{true /* is_clipped */, current_clip}; | 210 return ConditionalClip{true /* is_clipped */, current_clip}; |
| 196 } | 211 } |
| 197 | 212 |
| 198 static ConditionalClip ComputeAccumulatedClip( | 213 static ConditionalClip ComputeAccumulatedClip( |
| 199 const ClipTree& clip_tree, | 214 const ClipTree& clip_tree, |
| 200 int local_clip_id, | 215 int local_clip_id, |
| 201 const EffectTree& effect_tree, | 216 const EffectTree& effect_tree, |
| 202 int target_id, | 217 int target_id, |
| 203 const TransformTree& transform_tree) { | 218 const TransformTree& transform_tree) { |
| 204 const ClipNode* clip_node = clip_tree.Node(local_clip_id); | 219 const ClipNode* clip_node = clip_tree.Node(local_clip_id); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); | 382 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); |
| 368 continue; | 383 continue; |
| 369 } | 384 } |
| 370 | 385 |
| 371 gfx::RectF accumulated_clip_in_copy_request_space = | 386 gfx::RectF accumulated_clip_in_copy_request_space = |
| 372 accumulated_clip_rect.clip_rect; | 387 accumulated_clip_rect.clip_rect; |
| 373 | 388 |
| 374 const EffectNode* copy_request_effect_node = | 389 const EffectNode* copy_request_effect_node = |
| 375 effect_tree.Node(effect_ancestor_with_copy_request); | 390 effect_tree.Node(effect_ancestor_with_copy_request); |
| 376 ConditionalClip clip_in_layer_space = ComputeTargetRectInLocalSpace( | 391 ConditionalClip clip_in_layer_space = ComputeTargetRectInLocalSpace( |
| 377 accumulated_clip_in_copy_request_space, transform_tree, | 392 accumulated_clip_in_copy_request_space, transform_tree, effect_tree, |
| 378 copy_request_effect_node->transform_id, | 393 copy_request_effect_node->transform_id, layer->transform_tree_index(), |
| 379 layer->transform_tree_index()); | 394 copy_request_effect_node->id); |
| 380 | 395 |
| 381 if (clip_in_layer_space.is_clipped) { | 396 if (clip_in_layer_space.is_clipped) { |
| 382 gfx::RectF clip_rect = clip_in_layer_space.clip_rect; | 397 gfx::RectF clip_rect = clip_in_layer_space.clip_rect; |
| 383 clip_rect.Offset(-layer->offset_to_transform_parent()); | 398 clip_rect.Offset(-layer->offset_to_transform_parent()); |
| 384 gfx::Rect visible_rect = gfx::ToEnclosingRect(clip_rect); | 399 gfx::Rect visible_rect = gfx::ToEnclosingRect(clip_rect); |
| 385 visible_rect.Intersect(gfx::Rect(layer_bounds)); | 400 visible_rect.Intersect(gfx::Rect(layer_bounds)); |
| 386 layer->set_visible_layer_rect(visible_rect); | 401 layer->set_visible_layer_rect(visible_rect); |
| 387 } else { | 402 } else { |
| 388 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); | 403 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); |
| 389 } | 404 } |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 layer_content_bounds_in_target_space); | 499 layer_content_bounds_in_target_space); |
| 485 if (combined_clip_rect_in_target_space.IsEmpty()) { | 500 if (combined_clip_rect_in_target_space.IsEmpty()) { |
| 486 layer->set_visible_layer_rect(gfx::Rect()); | 501 layer->set_visible_layer_rect(gfx::Rect()); |
| 487 continue; | 502 continue; |
| 488 } | 503 } |
| 489 | 504 |
| 490 gfx::Transform target_to_layer; | 505 gfx::Transform target_to_layer; |
| 491 if (transform_node->ancestors_are_invertible) { | 506 if (transform_node->ancestors_are_invertible) { |
| 492 target_to_layer = transform_tree.FromTarget(transform_node->id); | 507 target_to_layer = transform_tree.FromTarget(transform_node->id); |
| 493 } else { | 508 } else { |
| 494 if (!transform_tree.ComputeTransformWithSourceSublayerScale( | 509 bool success = transform_tree.ComputeTransform( |
| 495 target_node_id, transform_node->id, &target_to_layer)) { | 510 target_node_id, transform_node->id, &target_to_layer); |
| 511 if (!success) { |
| 496 // An animated singular transform may become non-singular during the | 512 // An animated singular transform may become non-singular during the |
| 497 // animation, so we still need to compute a visible rect. In this | 513 // animation, so we still need to compute a visible rect. In this |
| 498 // situation, we treat the entire layer as visible. | 514 // situation, we treat the entire layer as visible. |
| 499 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); | 515 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); |
| 500 continue; | 516 continue; |
| 501 } | 517 } |
| 518 if (target_node_id != 0) { |
| 519 const EffectNode* target_effect_node = |
| 520 ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree); |
| 521 ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_layer); |
| 522 #if DCHECK_IS_ON() |
| 523 VerifySurfaceContentsScalesMatch(target_effect_node->id, target_node_id, |
| 524 effect_tree, transform_tree); |
| 525 #endif |
| 526 } |
| 502 } | 527 } |
| 503 | |
| 504 gfx::Transform target_to_content; | 528 gfx::Transform target_to_content; |
| 505 target_to_content.Translate(-layer->offset_to_transform_parent().x(), | 529 target_to_content.Translate(-layer->offset_to_transform_parent().x(), |
| 506 -layer->offset_to_transform_parent().y()); | 530 -layer->offset_to_transform_parent().y()); |
| 507 target_to_content.PreconcatTransform(target_to_layer); | 531 target_to_content.PreconcatTransform(target_to_layer); |
| 508 | 532 |
| 509 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 533 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
| 510 target_to_content, combined_clip_rect_in_target_space)); | 534 target_to_content, combined_clip_rect_in_target_space)); |
| 511 visible_rect.Intersect(gfx::Rect(layer_bounds)); | 535 visible_rect.Intersect(gfx::Rect(layer_bounds)); |
| 512 layer->set_visible_layer_rect(visible_rect); | 536 layer->set_visible_layer_rect(visible_rect); |
| 513 } | 537 } |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 } | 717 } |
| 694 } | 718 } |
| 695 } | 719 } |
| 696 | 720 |
| 697 static void ResetIfHasNanCoordinate(gfx::RectF* rect) { | 721 static void ResetIfHasNanCoordinate(gfx::RectF* rect) { |
| 698 if (std::isnan(rect->x()) || std::isnan(rect->y()) || | 722 if (std::isnan(rect->x()) || std::isnan(rect->y()) || |
| 699 std::isnan(rect->right()) || std::isnan(rect->bottom())) | 723 std::isnan(rect->right()) || std::isnan(rect->bottom())) |
| 700 *rect = gfx::RectF(); | 724 *rect = gfx::RectF(); |
| 701 } | 725 } |
| 702 | 726 |
| 703 void PostConcatSublayerScale(const int effect_node_id, | 727 void PostConcatSurfaceContentsScale(const EffectNode* effect_node, |
| 704 const EffectTree& effect_tree, | 728 gfx::Transform* transform) { |
| 705 gfx::Transform* transform) { | 729 DCHECK(effect_node->has_render_surface); |
| 706 // TODO(jaydasika): This function should not compute target effect node id. It | 730 transform->matrix().postScale(effect_node->surface_contents_scale.x(), |
| 707 // should receive it from callers. | 731 effect_node->surface_contents_scale.y(), 1.f); |
| 708 const EffectNode* effect_node = effect_tree.Node(effect_node_id); | |
| 709 const EffectNode* target_effect_node = | |
| 710 effect_node->has_render_surface | |
| 711 ? effect_node | |
| 712 : effect_tree.Node(effect_node->target_id); | |
| 713 transform->matrix().postScale(target_effect_node->sublayer_scale.x(), | |
| 714 target_effect_node->sublayer_scale.y(), 1.f); | |
| 715 } | 732 } |
| 716 | 733 |
| 717 void ConcatInverseSublayerScale(const int effect_node_id, | 734 void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node, |
| 718 const EffectTree& effect_tree, | 735 gfx::Transform* transform) { |
| 719 gfx::Transform* transform) { | 736 DCHECK(effect_node->has_render_surface); |
| 720 const EffectNode* effect_node = effect_tree.Node(effect_node_id); | 737 if (effect_node->surface_contents_scale.x() != 0.0 && |
| 721 if (effect_node->sublayer_scale.x() != 0.0 && | 738 effect_node->surface_contents_scale.y() != 0.0) |
| 722 effect_node->sublayer_scale.y() != 0.0) | 739 transform->Scale(1.0 / effect_node->surface_contents_scale.x(), |
| 723 transform->Scale(1.0 / effect_node->sublayer_scale.x(), | 740 1.0 / effect_node->surface_contents_scale.y()); |
| 724 1.0 / effect_node->sublayer_scale.y()); | |
| 725 } | 741 } |
| 726 | 742 |
| 727 void ComputeClips(ClipTree* clip_tree, | 743 void ComputeClips(ClipTree* clip_tree, |
| 728 const TransformTree& transform_tree, | 744 const TransformTree& transform_tree, |
| 729 const EffectTree& effect_tree, | 745 const EffectTree& effect_tree, |
| 730 bool non_root_surfaces_enabled) { | 746 bool non_root_surfaces_enabled) { |
| 731 if (!clip_tree->needs_update()) | 747 if (!clip_tree->needs_update()) |
| 732 return; | 748 return; |
| 733 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { | 749 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { |
| 734 ClipNode* clip_node = clip_tree->Node(i); | 750 ClipNode* clip_node = clip_tree->Node(i); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 761 gfx::RectF parent_combined_clip_in_target_space = | 777 gfx::RectF parent_combined_clip_in_target_space = |
| 762 parent_clip_node->combined_clip_in_target_space; | 778 parent_clip_node->combined_clip_in_target_space; |
| 763 gfx::RectF parent_clip_in_target_space = | 779 gfx::RectF parent_clip_in_target_space = |
| 764 parent_clip_node->clip_in_target_space; | 780 parent_clip_node->clip_in_target_space; |
| 765 if (parent_target_transform_node && | 781 if (parent_target_transform_node && |
| 766 parent_target_transform_node->id != clip_node->target_transform_id && | 782 parent_target_transform_node->id != clip_node->target_transform_id && |
| 767 non_root_surfaces_enabled) { | 783 non_root_surfaces_enabled) { |
| 768 success &= transform_tree.ComputeTransform( | 784 success &= transform_tree.ComputeTransform( |
| 769 parent_target_transform_node->id, clip_node->target_transform_id, | 785 parent_target_transform_node->id, clip_node->target_transform_id, |
| 770 &parent_to_current); | 786 &parent_to_current); |
| 771 // We don't have to apply sublayer scale when target is root. | 787 // We don't have to apply surface contents scale when target is root. |
| 772 if (clip_node->target_transform_id != 0) { | 788 if (clip_node->target_transform_id != 0) { |
| 773 PostConcatSublayerScale(clip_node->target_effect_id, effect_tree, | 789 const EffectNode* target_effect_node = |
| 774 &parent_to_current); | 790 effect_tree.Node(clip_node->target_effect_id); |
| 791 PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current); |
| 775 #if DCHECK_IS_ON() | 792 #if DCHECK_IS_ON() |
| 776 VerifySublayerScalesMatch(clip_node->target_effect_id, | 793 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, |
| 777 clip_node->target_transform_id, effect_tree, | 794 clip_node->target_transform_id, |
| 778 transform_tree); | 795 effect_tree, transform_tree); |
| 779 #endif | 796 #endif |
| 780 } | 797 } |
| 781 if (parent_target_transform_node->sublayer_scale.x() > 0 && | 798 if (parent_clip_node->target_transform_id != 0) { |
| 782 parent_target_transform_node->sublayer_scale.y() > 0) | 799 const EffectNode* parent_target_effect_node = |
| 783 parent_to_current.Scale( | 800 effect_tree.Node(parent_clip_node->target_effect_id); |
| 784 1.f / parent_target_transform_node->sublayer_scale.x(), | 801 ConcatInverseSurfaceContentsScale(parent_target_effect_node, |
| 785 1.f / parent_target_transform_node->sublayer_scale.y()); | 802 &parent_to_current); |
| 803 #if DCHECK_IS_ON() |
| 804 VerifySurfaceContentsScalesMatch(parent_clip_node->target_effect_id, |
| 805 parent_clip_node->target_transform_id, |
| 806 effect_tree, transform_tree); |
| 807 #endif |
| 808 } |
| 786 // If we can't compute a transform, it's because we had to use the inverse | 809 // If we can't compute a transform, it's because we had to use the inverse |
| 787 // of a singular transform. We won't draw in this case, so there's no need | 810 // of a singular transform. We won't draw in this case, so there's no need |
| 788 // to compute clips. | 811 // to compute clips. |
| 789 if (!success) | 812 if (!success) |
| 790 continue; | 813 continue; |
| 791 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect( | 814 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect( |
| 792 parent_to_current, parent_clip_node->combined_clip_in_target_space); | 815 parent_to_current, parent_clip_node->combined_clip_in_target_space); |
| 793 parent_clip_in_target_space = MathUtil::ProjectClippedRect( | 816 parent_clip_in_target_space = MathUtil::ProjectClippedRect( |
| 794 parent_to_current, parent_clip_node->clip_in_target_space); | 817 parent_to_current, parent_clip_node->clip_in_target_space); |
| 795 } | 818 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 835 | 858 |
| 836 if (!non_root_surfaces_enabled) { | 859 if (!non_root_surfaces_enabled) { |
| 837 source_to_target = transform_tree.ToScreen(clip_node->transform_id); | 860 source_to_target = transform_tree.ToScreen(clip_node->transform_id); |
| 838 } else if (transform_tree.ContentTargetId(transform_node->id) == | 861 } else if (transform_tree.ContentTargetId(transform_node->id) == |
| 839 clip_node->target_transform_id) { | 862 clip_node->target_transform_id) { |
| 840 source_to_target = transform_tree.ToTarget(clip_node->transform_id); | 863 source_to_target = transform_tree.ToTarget(clip_node->transform_id); |
| 841 } else { | 864 } else { |
| 842 success = transform_tree.ComputeTransform( | 865 success = transform_tree.ComputeTransform( |
| 843 transform_node->id, clip_node->target_transform_id, | 866 transform_node->id, clip_node->target_transform_id, |
| 844 &source_to_target); | 867 &source_to_target); |
| 845 // We don't have to apply sublayer scale when target is root. | 868 // We don't have to apply surface contents scale when target is root. |
| 846 if (clip_node->target_transform_id != 0) { | 869 if (clip_node->target_transform_id != 0) { |
| 847 PostConcatSublayerScale(clip_node->target_effect_id, effect_tree, | 870 const EffectNode* target_effect_node = |
| 848 &source_to_target); | 871 effect_tree.Node(clip_node->target_effect_id); |
| 872 PostConcatSurfaceContentsScale(target_effect_node, &source_to_target); |
| 849 #if DCHECK_IS_ON() | 873 #if DCHECK_IS_ON() |
| 850 VerifySublayerScalesMatch(clip_node->target_effect_id, | 874 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, |
| 851 clip_node->target_transform_id, effect_tree, | 875 clip_node->target_transform_id, |
| 852 transform_tree); | 876 effect_tree, transform_tree); |
| 853 #endif | 877 #endif |
| 854 } | 878 } |
| 855 // source_to_target computation should be successful as target is an | 879 // source_to_target computation should be successful as target is an |
| 856 // ancestor of the transform node. | 880 // ancestor of the transform node. |
| 857 DCHECK(success); | 881 DCHECK(success); |
| 858 } | 882 } |
| 859 | 883 |
| 860 gfx::RectF source_clip_in_target_space = | 884 gfx::RectF source_clip_in_target_space = |
| 861 MathUtil::MapClippedRect(source_to_target, clip_node->clip); | 885 MathUtil::MapClippedRect(source_to_target, clip_node->clip); |
| 862 | 886 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 997 } | 1021 } |
| 998 | 1022 |
| 999 static void VerifyDrawTransformsMatch(LayerImpl* layer, | 1023 static void VerifyDrawTransformsMatch(LayerImpl* layer, |
| 1000 PropertyTrees* property_trees) { | 1024 PropertyTrees* property_trees) { |
| 1001 const int source_id = layer->transform_tree_index(); | 1025 const int source_id = layer->transform_tree_index(); |
| 1002 int destination_id = FindTargetTransformTreeIndexFromEffectTree( | 1026 int destination_id = FindTargetTransformTreeIndexFromEffectTree( |
| 1003 property_trees->effect_tree, layer->effect_tree_index()); | 1027 property_trees->effect_tree, layer->effect_tree_index()); |
| 1004 gfx::Transform draw_transform; | 1028 gfx::Transform draw_transform; |
| 1005 property_trees->transform_tree.ComputeTransform(source_id, destination_id, | 1029 property_trees->transform_tree.ComputeTransform(source_id, destination_id, |
| 1006 &draw_transform); | 1030 &draw_transform); |
| 1007 // We don't have to apply sublayer scale when target is root. | 1031 // We don't have to apply surface contents scale when target is root. |
| 1008 if (destination_id != 0) { | 1032 if (destination_id != 0) { |
| 1009 PostConcatSublayerScale(layer->effect_tree_index(), | 1033 const EffectNode* target_effect_node = ContentsTargetEffectNode( |
| 1010 property_trees->effect_tree, &draw_transform); | 1034 layer->effect_tree_index(), property_trees->effect_tree); |
| 1035 PostConcatSurfaceContentsScale(target_effect_node, &draw_transform); |
| 1011 #if DCHECK_IS_ON() | 1036 #if DCHECK_IS_ON() |
| 1012 VerifySublayerScalesMatch(layer->effect_tree_index(), destination_id, | 1037 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), destination_id, |
| 1013 property_trees->effect_tree, | 1038 property_trees->effect_tree, |
| 1014 property_trees->transform_tree); | 1039 property_trees->transform_tree); |
| 1015 #endif | 1040 #endif |
| 1016 } | 1041 } |
| 1017 if (layer->should_flatten_transform_from_property_tree()) | 1042 if (layer->should_flatten_transform_from_property_tree()) |
| 1018 draw_transform.FlattenTo2d(); | 1043 draw_transform.FlattenTo2d(); |
| 1019 draw_transform.Translate(layer->offset_to_transform_parent().x(), | 1044 draw_transform.Translate(layer->offset_to_transform_parent().x(), |
| 1020 layer->offset_to_transform_parent().y()); | 1045 layer->offset_to_transform_parent().y()); |
| 1021 DCHECK(draw_transform.ApproximatelyEqual( | 1046 DCHECK(draw_transform.ApproximatelyEqual( |
| 1022 DrawTransform(layer, property_trees->transform_tree))) | 1047 DrawTransform(layer, property_trees->transform_tree))) |
| 1023 << " layer: " << layer->id() << " source transform id: " << source_id | 1048 << " layer: " << layer->id() << " source transform id: " << source_id |
| 1024 << " destination transform id: " << destination_id | 1049 << " destination transform id: " << destination_id |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1037 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; | 1062 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; |
| 1038 property_trees->transform_tree.set_needs_update(true); | 1063 property_trees->transform_tree.set_needs_update(true); |
| 1039 } | 1064 } |
| 1040 if (property_trees->transform_tree.needs_update()) { | 1065 if (property_trees->transform_tree.needs_update()) { |
| 1041 property_trees->clip_tree.set_needs_update(true); | 1066 property_trees->clip_tree.set_needs_update(true); |
| 1042 property_trees->effect_tree.set_needs_update(true); | 1067 property_trees->effect_tree.set_needs_update(true); |
| 1043 } | 1068 } |
| 1044 UpdateRenderTarget(&property_trees->effect_tree, | 1069 UpdateRenderTarget(&property_trees->effect_tree, |
| 1045 property_trees->non_root_surfaces_enabled); | 1070 property_trees->non_root_surfaces_enabled); |
| 1046 ComputeTransforms(&property_trees->transform_tree); | 1071 ComputeTransforms(&property_trees->transform_tree); |
| 1047 // Computation of clips uses sublayer scale which is updated while computing | 1072 // Computation of clips uses surface contents scale which is updated while |
| 1048 // effects. So, ComputeEffects should be before ComputeClips. | 1073 // computing effects. So, ComputeEffects should be before ComputeClips. |
| 1049 ComputeEffects(&property_trees->effect_tree); | 1074 ComputeEffects(&property_trees->effect_tree); |
| 1050 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, | 1075 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, |
| 1051 property_trees->effect_tree, can_render_to_separate_surface); | 1076 property_trees->effect_tree, can_render_to_separate_surface); |
| 1052 | 1077 |
| 1053 FindLayersThatNeedUpdates(root_layer->layer_tree_impl(), | 1078 FindLayersThatNeedUpdates(root_layer->layer_tree_impl(), |
| 1054 property_trees->transform_tree, | 1079 property_trees->transform_tree, |
| 1055 property_trees->effect_tree, visible_layer_list); | 1080 property_trees->effect_tree, visible_layer_list); |
| 1056 CalculateClipRects<LayerImpl>(*visible_layer_list, property_trees->clip_tree, | 1081 CalculateClipRects<LayerImpl>(*visible_layer_list, property_trees->clip_tree, |
| 1057 property_trees->transform_tree, | 1082 property_trees->transform_tree, |
| 1058 property_trees->effect_tree, | 1083 property_trees->effect_tree, |
| 1059 can_render_to_separate_surface); | 1084 can_render_to_separate_surface); |
| 1060 CalculateVisibleRects<LayerImpl>( | 1085 CalculateVisibleRects<LayerImpl>( |
| 1061 *visible_layer_list, property_trees->clip_tree, | 1086 *visible_layer_list, property_trees->clip_tree, |
| 1062 property_trees->transform_tree, property_trees->effect_tree, | 1087 property_trees->transform_tree, property_trees->effect_tree, |
| 1063 can_render_to_separate_surface); | 1088 can_render_to_separate_surface); |
| 1064 } | 1089 } |
| 1065 | 1090 |
| 1066 void UpdatePropertyTrees(PropertyTrees* property_trees, | 1091 void UpdatePropertyTrees(PropertyTrees* property_trees, |
| 1067 bool can_render_to_separate_surface) { | 1092 bool can_render_to_separate_surface) { |
| 1068 if (property_trees->non_root_surfaces_enabled != | 1093 if (property_trees->non_root_surfaces_enabled != |
| 1069 can_render_to_separate_surface) { | 1094 can_render_to_separate_surface) { |
| 1070 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; | 1095 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; |
| 1071 property_trees->transform_tree.set_needs_update(true); | 1096 property_trees->transform_tree.set_needs_update(true); |
| 1072 } | 1097 } |
| 1073 if (property_trees->transform_tree.needs_update()) { | 1098 if (property_trees->transform_tree.needs_update()) { |
| 1074 property_trees->clip_tree.set_needs_update(true); | 1099 property_trees->clip_tree.set_needs_update(true); |
| 1075 property_trees->effect_tree.set_needs_update(true); | 1100 property_trees->effect_tree.set_needs_update(true); |
| 1076 } | 1101 } |
| 1077 ComputeTransforms(&property_trees->transform_tree); | 1102 ComputeTransforms(&property_trees->transform_tree); |
| 1078 // Computation of clips uses sublayer scale which is updated while computing | 1103 // Computation of clips uses surface contents scale which is updated while |
| 1079 // effects. So, ComputeEffects should be before ComputeClips. | 1104 // computing effects. So, ComputeEffects should be before ComputeClips. |
| 1080 ComputeEffects(&property_trees->effect_tree); | 1105 ComputeEffects(&property_trees->effect_tree); |
| 1081 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, | 1106 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, |
| 1082 property_trees->effect_tree, can_render_to_separate_surface); | 1107 property_trees->effect_tree, can_render_to_separate_surface); |
| 1083 } | 1108 } |
| 1084 | 1109 |
| 1085 void ComputeVisibleRectsForTesting(PropertyTrees* property_trees, | 1110 void ComputeVisibleRectsForTesting(PropertyTrees* property_trees, |
| 1086 bool can_render_to_separate_surface, | 1111 bool can_render_to_separate_surface, |
| 1087 LayerList* update_layer_list) { | 1112 LayerList* update_layer_list) { |
| 1088 CalculateVisibleRects<Layer>(*update_layer_list, property_trees->clip_tree, | 1113 CalculateVisibleRects<Layer>(*update_layer_list, property_trees->clip_tree, |
| 1089 property_trees->transform_tree, | 1114 property_trees->transform_tree, |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 !IsRootLayer(layer) && layer->has_render_surface(); | 1195 !IsRootLayer(layer) && layer->has_render_surface(); |
| 1171 if (!owns_non_root_surface) { | 1196 if (!owns_non_root_surface) { |
| 1172 // If you're not the root, or you don't own a surface, you need to apply | 1197 // If you're not the root, or you don't own a surface, you need to apply |
| 1173 // your local offset. | 1198 // your local offset. |
| 1174 xform = tree.ToTarget(layer->transform_tree_index()); | 1199 xform = tree.ToTarget(layer->transform_tree_index()); |
| 1175 if (layer->should_flatten_transform_from_property_tree()) | 1200 if (layer->should_flatten_transform_from_property_tree()) |
| 1176 xform.FlattenTo2d(); | 1201 xform.FlattenTo2d(); |
| 1177 xform.Translate(layer->offset_to_transform_parent().x(), | 1202 xform.Translate(layer->offset_to_transform_parent().x(), |
| 1178 layer->offset_to_transform_parent().y()); | 1203 layer->offset_to_transform_parent().y()); |
| 1179 } else { | 1204 } else { |
| 1180 // Surfaces need to apply their sublayer scale. | 1205 // Surfaces need to apply their surface contents scale. |
| 1181 xform.Scale(node->sublayer_scale.x(), node->sublayer_scale.y()); | 1206 xform.Scale(node->surface_contents_scale.x(), |
| 1207 node->surface_contents_scale.y()); |
| 1182 } | 1208 } |
| 1183 return xform; | 1209 return xform; |
| 1184 } | 1210 } |
| 1185 | 1211 |
| 1186 static void SetSurfaceDrawTransform(const TransformTree& transform_tree, | 1212 static void SetSurfaceDrawTransform(const TransformTree& transform_tree, |
| 1187 const EffectTree& effect_tree, | 1213 const EffectTree& effect_tree, |
| 1188 RenderSurfaceImpl* render_surface) { | 1214 RenderSurfaceImpl* render_surface) { |
| 1189 const TransformNode* transform_node = | 1215 const TransformNode* transform_node = |
| 1190 transform_tree.Node(render_surface->TransformTreeIndex()); | 1216 transform_tree.Node(render_surface->TransformTreeIndex()); |
| 1191 const EffectNode* effect_node = | 1217 const EffectNode* effect_node = |
| 1192 effect_tree.Node(render_surface->EffectTreeIndex()); | 1218 effect_tree.Node(render_surface->EffectTreeIndex()); |
| 1193 // The draw transform of root render surface is identity tranform. | 1219 // The draw transform of root render surface is identity tranform. |
| 1194 if (transform_node->id == 1) { | 1220 if (transform_node->id == 1) { |
| 1195 render_surface->SetDrawTransform(gfx::Transform()); | 1221 render_surface->SetDrawTransform(gfx::Transform()); |
| 1196 return; | 1222 return; |
| 1197 } | 1223 } |
| 1198 | 1224 |
| 1199 gfx::Transform render_surface_transform; | 1225 gfx::Transform render_surface_transform; |
| 1200 const TransformNode* target_transform_node = | 1226 const TransformNode* target_transform_node = |
| 1201 transform_tree.Node(transform_tree.TargetId(transform_node->id)); | 1227 transform_tree.Node(transform_tree.TargetId(transform_node->id)); |
| 1202 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id, | 1228 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id, |
| 1203 &render_surface_transform); | 1229 &render_surface_transform); |
| 1204 // We don't have to apply sublayer scale when target is root. | 1230 // We don't have to apply surface contents scale when target is root. |
| 1205 if (target_transform_node->id != 0) { | 1231 if (target_transform_node->id != 0) { |
| 1206 PostConcatSublayerScale(effect_node->target_id, effect_tree, | 1232 const EffectNode* target_effect_node = |
| 1207 &render_surface_transform); | 1233 effect_tree.Node(effect_node->target_id); |
| 1234 PostConcatSurfaceContentsScale(target_effect_node, |
| 1235 &render_surface_transform); |
| 1208 #if DCHECK_IS_ON() | 1236 #if DCHECK_IS_ON() |
| 1209 VerifySublayerScalesMatch(effect_node->target_id, target_transform_node->id, | 1237 VerifySurfaceContentsScalesMatch(effect_node->target_id, |
| 1210 effect_tree, transform_tree); | 1238 target_transform_node->id, effect_tree, |
| 1239 transform_tree); |
| 1211 #endif | 1240 #endif |
| 1212 } | 1241 } |
| 1213 | 1242 |
| 1214 DCHECK(transform_node->sublayer_scale == effect_node->sublayer_scale); | 1243 ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform); |
| 1215 if (effect_node->sublayer_scale.x() != 0.0 && | 1244 #if DCHECK_IS_ON() |
| 1216 effect_node->sublayer_scale.y() != 0.0) | 1245 VerifySurfaceContentsScalesMatch(effect_node->id, transform_node->id, |
| 1217 render_surface_transform.Scale(1.0 / effect_node->sublayer_scale.x(), | 1246 effect_tree, transform_tree); |
| 1218 1.0 / effect_node->sublayer_scale.y()); | 1247 #endif |
| 1219 render_surface->SetDrawTransform(render_surface_transform); | 1248 render_surface->SetDrawTransform(render_surface_transform); |
| 1220 } | 1249 } |
| 1221 | 1250 |
| 1222 static void SetSurfaceIsClipped(const ClipNode* clip_node, | 1251 static void SetSurfaceIsClipped(const ClipNode* clip_node, |
| 1223 RenderSurfaceImpl* render_surface) { | 1252 RenderSurfaceImpl* render_surface) { |
| 1224 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id) | 1253 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id) |
| 1225 << "we now create clip node for every render surface"; | 1254 << "we now create clip node for every render surface"; |
| 1226 | 1255 |
| 1227 render_surface->SetIsClipped(clip_node->target_is_clipped); | 1256 render_surface->SetIsClipped(clip_node->target_is_clipped); |
| 1228 } | 1257 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1252 const bool success = transform_tree.ComputeTransform( | 1281 const bool success = transform_tree.ComputeTransform( |
| 1253 parent_clip_node->target_transform_id, | 1282 parent_clip_node->target_transform_id, |
| 1254 transform_tree.TargetId(transform_node->id), | 1283 transform_tree.TargetId(transform_node->id), |
| 1255 &clip_parent_target_to_target); | 1284 &clip_parent_target_to_target); |
| 1256 | 1285 |
| 1257 if (!success) { | 1286 if (!success) { |
| 1258 render_surface->SetClipRect(gfx::Rect()); | 1287 render_surface->SetClipRect(gfx::Rect()); |
| 1259 return; | 1288 return; |
| 1260 } | 1289 } |
| 1261 | 1290 |
| 1262 // We don't have to apply sublayer scale when target is root. | 1291 // We don't have to apply surface contents scale when target is root. |
| 1263 if (transform_tree.TargetId(transform_node->id) != 0) { | 1292 if (transform_tree.TargetId(transform_node->id) != 0) { |
| 1264 PostConcatSublayerScale(render_surface->EffectTreeIndex(), effect_tree, | 1293 const EffectNode* effect_node = |
| 1265 &clip_parent_target_to_target); | 1294 effect_tree.Node(render_surface->EffectTreeIndex()); |
| 1295 PostConcatSurfaceContentsScale(effect_node, &clip_parent_target_to_target); |
| 1266 #if DCHECK_IS_ON() | 1296 #if DCHECK_IS_ON() |
| 1267 VerifySublayerScalesMatch(render_surface->EffectTreeIndex(), | 1297 VerifySurfaceContentsScalesMatch( |
| 1268 transform_tree.TargetId(transform_node->id), | 1298 render_surface->EffectTreeIndex(), |
| 1269 effect_tree, transform_tree); | 1299 transform_tree.TargetId(transform_node->id), effect_tree, |
| 1300 transform_tree); |
| 1270 #endif | 1301 #endif |
| 1271 } | 1302 } |
| 1272 | 1303 |
| 1273 DCHECK_LT(parent_clip_node->target_transform_id, | 1304 DCHECK_LT(parent_clip_node->target_transform_id, |
| 1274 transform_tree.TargetId(transform_node->id)); | 1305 transform_tree.TargetId(transform_node->id)); |
| 1275 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 1306 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
| 1276 clip_parent_target_to_target, parent_clip_node->clip_in_target_space))); | 1307 clip_parent_target_to_target, parent_clip_node->clip_in_target_space))); |
| 1277 } | 1308 } |
| 1278 | 1309 |
| 1279 template <typename LayerType> | 1310 template <typename LayerType> |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1341 | 1372 |
| 1342 static gfx::Transform ReplicaToSurfaceTransform( | 1373 static gfx::Transform ReplicaToSurfaceTransform( |
| 1343 const RenderSurfaceImpl* render_surface, | 1374 const RenderSurfaceImpl* render_surface, |
| 1344 const TransformTree& tree) { | 1375 const TransformTree& tree) { |
| 1345 gfx::Transform replica_to_surface; | 1376 gfx::Transform replica_to_surface; |
| 1346 if (!render_surface->HasReplica()) | 1377 if (!render_surface->HasReplica()) |
| 1347 return replica_to_surface; | 1378 return replica_to_surface; |
| 1348 const LayerImpl* replica_layer = render_surface->ReplicaLayer(); | 1379 const LayerImpl* replica_layer = render_surface->ReplicaLayer(); |
| 1349 const TransformNode* surface_transform_node = | 1380 const TransformNode* surface_transform_node = |
| 1350 tree.Node(render_surface->TransformTreeIndex()); | 1381 tree.Node(render_surface->TransformTreeIndex()); |
| 1351 replica_to_surface.Scale(surface_transform_node->sublayer_scale.x(), | 1382 replica_to_surface.Scale(surface_transform_node->surface_contents_scale.x(), |
| 1352 surface_transform_node->sublayer_scale.y()); | 1383 surface_transform_node->surface_contents_scale.y()); |
| 1353 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(), | 1384 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(), |
| 1354 replica_layer->offset_to_transform_parent().y()); | 1385 replica_layer->offset_to_transform_parent().y()); |
| 1355 gfx::Transform replica_transform_node_to_surface; | 1386 gfx::Transform replica_transform_node_to_surface; |
| 1356 tree.ComputeTransform(replica_layer->transform_tree_index(), | 1387 tree.ComputeTransform(replica_layer->transform_tree_index(), |
| 1357 render_surface->TransformTreeIndex(), | 1388 render_surface->TransformTreeIndex(), |
| 1358 &replica_transform_node_to_surface); | 1389 &replica_transform_node_to_surface); |
| 1359 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface); | 1390 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface); |
| 1360 if (surface_transform_node->sublayer_scale.x() != 0 && | 1391 if (surface_transform_node->surface_contents_scale.x() != 0 && |
| 1361 surface_transform_node->sublayer_scale.y() != 0) { | 1392 surface_transform_node->surface_contents_scale.y() != 0) { |
| 1362 replica_to_surface.Scale(1.0 / surface_transform_node->sublayer_scale.x(), | 1393 replica_to_surface.Scale( |
| 1363 1.0 / surface_transform_node->sublayer_scale.y()); | 1394 1.0 / surface_transform_node->surface_contents_scale.x(), |
| 1395 1.0 / surface_transform_node->surface_contents_scale.y()); |
| 1364 } | 1396 } |
| 1365 return replica_to_surface; | 1397 return replica_to_surface; |
| 1366 } | 1398 } |
| 1367 | 1399 |
| 1368 void ComputeLayerDrawProperties(LayerImpl* layer, | 1400 void ComputeLayerDrawProperties(LayerImpl* layer, |
| 1369 const PropertyTrees* property_trees) { | 1401 const PropertyTrees* property_trees) { |
| 1370 const TransformNode* transform_node = | 1402 const TransformNode* transform_node = |
| 1371 property_trees->transform_tree.Node(layer->transform_tree_index()); | 1403 property_trees->transform_tree.Node(layer->transform_tree_index()); |
| 1372 const ClipNode* clip_node = | 1404 const ClipNode* clip_node = |
| 1373 property_trees->clip_tree.Node(layer->clip_tree_index()); | 1405 property_trees->clip_tree.Node(layer->clip_tree_index()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1414 void ComputeSurfaceDrawProperties(const PropertyTrees* property_trees, | 1446 void ComputeSurfaceDrawProperties(const PropertyTrees* property_trees, |
| 1415 RenderSurfaceImpl* render_surface) { | 1447 RenderSurfaceImpl* render_surface) { |
| 1416 const ClipNode* clip_node = | 1448 const ClipNode* clip_node = |
| 1417 property_trees->clip_tree.Node(render_surface->ClipTreeIndex()); | 1449 property_trees->clip_tree.Node(render_surface->ClipTreeIndex()); |
| 1418 | 1450 |
| 1419 SetSurfaceIsClipped(clip_node, render_surface); | 1451 SetSurfaceIsClipped(clip_node, render_surface); |
| 1420 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface); | 1452 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface); |
| 1421 SetSurfaceDrawTransform(property_trees->transform_tree, | 1453 SetSurfaceDrawTransform(property_trees->transform_tree, |
| 1422 property_trees->effect_tree, render_surface); | 1454 property_trees->effect_tree, render_surface); |
| 1423 render_surface->SetScreenSpaceTransform( | 1455 render_surface->SetScreenSpaceTransform( |
| 1424 property_trees->transform_tree.ToScreenSpaceTransformWithoutSublayerScale( | 1456 property_trees->transform_tree |
| 1425 render_surface->TransformTreeIndex())); | 1457 .ToScreenSpaceTransformWithoutSurfaceContentsScale( |
| 1458 render_surface->TransformTreeIndex())); |
| 1426 | 1459 |
| 1427 if (render_surface->HasReplica()) { | 1460 if (render_surface->HasReplica()) { |
| 1428 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform( | 1461 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform( |
| 1429 render_surface, property_trees->transform_tree); | 1462 render_surface, property_trees->transform_tree); |
| 1430 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() * | 1463 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() * |
| 1431 replica_to_surface); | 1464 replica_to_surface); |
| 1432 render_surface->SetReplicaScreenSpaceTransform( | 1465 render_surface->SetReplicaScreenSpaceTransform( |
| 1433 render_surface->screen_space_transform() * replica_to_surface); | 1466 render_surface->screen_space_transform() * replica_to_surface); |
| 1434 } else { | 1467 } else { |
| 1435 render_surface->SetReplicaDrawTransform(gfx::Transform()); | 1468 render_surface->SetReplicaDrawTransform(gfx::Transform()); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1536 void UpdateElasticOverscroll(PropertyTrees* property_trees, | 1569 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
| 1537 const Layer* overscroll_elasticity_layer, | 1570 const Layer* overscroll_elasticity_layer, |
| 1538 const gfx::Vector2dF& elastic_overscroll) { | 1571 const gfx::Vector2dF& elastic_overscroll) { |
| 1539 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1572 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
| 1540 elastic_overscroll); | 1573 elastic_overscroll); |
| 1541 } | 1574 } |
| 1542 | 1575 |
| 1543 } // namespace draw_property_utils | 1576 } // namespace draw_property_utils |
| 1544 | 1577 |
| 1545 } // namespace cc | 1578 } // namespace cc |
| OLD | NEW |