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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 EffectNode* effect_node = | 46 EffectNode* effect_node = |
47 layer->layer_tree_impl()->property_trees()->effect_tree.Node( | 47 layer->layer_tree_impl()->property_trees()->effect_tree.Node( |
48 layer->effect_tree_index()); | 48 layer->effect_tree_index()); |
49 if (effect_node->owner_id != layer->id()) | 49 if (effect_node->owner_id != layer->id()) |
50 return; | 50 return; |
51 DCHECK_EQ(effect_node->mask_layer_id, EffectTree::kInvalidNodeId) | 51 DCHECK_EQ(effect_node->mask_layer_id, EffectTree::kInvalidNodeId) |
52 << "layer: " << layer->id(); | 52 << "layer: " << layer->id(); |
53 DCHECK(effect_node->filters.IsEmpty()); | 53 DCHECK(effect_node->filters.IsEmpty()); |
54 DCHECK(effect_node->background_filters.IsEmpty()); | 54 DCHECK(effect_node->background_filters.IsEmpty()); |
55 } | 55 } |
56 | |
57 void VerifySurfaceContentsScalesMatch(const int target_effect_id, | |
58 const int target_transform_id, | |
59 const EffectTree& effect_tree, | |
60 const TransformTree& transform_tree) { | |
61 if (target_effect_id == EffectTree::kInvalidNodeId) { | |
62 // This can happen when PaintArtifactCompositor builds property trees as it | |
63 // doesn't set effect ids on clip nodes. | |
64 return; | |
65 } | |
66 const TransformNode* target_transform_node = | |
67 transform_tree.Node(target_transform_id); | |
68 const EffectNode* target_effect_node = effect_tree.Node(target_effect_id); | |
69 DCHECK(target_transform_node->surface_contents_scale == | |
70 target_effect_node->surface_contents_scale) | |
71 << " surface contents scale from transform tree: " | |
72 << target_transform_node->surface_contents_scale.ToString() | |
73 << " surface contents scale from effect tree: " | |
74 << target_effect_node->surface_contents_scale.ToString(); | |
75 } | |
76 #endif | 56 #endif |
77 | 57 |
78 static const EffectNode* ContentsTargetEffectNode( | 58 static const EffectNode* ContentsTargetEffectNode( |
79 const int effect_tree_index, | 59 const int effect_tree_index, |
80 const EffectTree& effect_tree) { | 60 const EffectTree& effect_tree) { |
81 const EffectNode* effect_node = effect_tree.Node(effect_tree_index); | 61 const EffectNode* effect_node = effect_tree.Node(effect_tree_index); |
82 return effect_node->render_surface ? effect_node | 62 return effect_node->render_surface ? effect_node |
83 : effect_tree.Node(effect_node->target_id); | 63 : effect_tree.Node(effect_node->target_id); |
84 } | 64 } |
85 | 65 |
(...skipping 13 matching lines...) Expand all Loading... |
99 // We use the local clip for clip rect calculation and combined clip for | 79 // We use the local clip for clip rect calculation and combined clip for |
100 // visible rect calculation. | 80 // visible rect calculation. |
101 gfx::RectF clip_from_clip_node = | 81 gfx::RectF clip_from_clip_node = |
102 for_visible_rect_calculation ? clip_node->combined_clip_in_target_space | 82 for_visible_rect_calculation ? clip_node->combined_clip_in_target_space |
103 : clip_node->clip_in_target_space; | 83 : clip_node->clip_in_target_space; |
104 | 84 |
105 if (clip_node->target_transform_id > target_node_id) { | 85 if (clip_node->target_transform_id > target_node_id) { |
106 // In this case, layer has a scroll parent. We need to keep the scale | 86 // In this case, layer has a scroll parent. We need to keep the scale |
107 // at the layer's target but remove the scale at the scroll parent's | 87 // at the layer's target but remove the scale at the scroll parent's |
108 // target. | 88 // target. |
109 if (property_trees->ComputeTransformToTarget(clip_node->target_transform_id, | 89 if (property_trees->GetToTarget(clip_node->target_transform_id, |
110 target_effect_node->id, | 90 target_effect_node->id, &clip_to_target)) { |
111 &clip_to_target)) { | |
112 PostConcatSurfaceContentsScale(target_effect_node, &clip_to_target); | |
113 #if DCHECK_IS_ON() | |
114 const TransformTree& transform_tree = property_trees->transform_tree; | |
115 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), | |
116 target_node_id, effect_tree, | |
117 transform_tree); | |
118 #endif | |
119 | |
120 const EffectNode* source_node = | 91 const EffectNode* source_node = |
121 effect_tree.Node(clip_node->target_effect_id); | 92 effect_tree.Node(clip_node->target_effect_id); |
122 ConcatInverseSurfaceContentsScale(source_node, &clip_to_target); | 93 ConcatInverseSurfaceContentsScale(source_node, &clip_to_target); |
123 #if DCHECK_IS_ON() | |
124 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, | |
125 clip_node->target_transform_id, | |
126 effect_tree, transform_tree); | |
127 #endif | |
128 *clip_rect_in_target_space = | 94 *clip_rect_in_target_space = |
129 MathUtil::MapClippedRect(clip_to_target, clip_from_clip_node); | 95 MathUtil::MapClippedRect(clip_to_target, clip_from_clip_node); |
130 } else { | 96 } else { |
131 return false; | 97 return false; |
132 } | 98 } |
133 } else { | 99 } else { |
134 if (property_trees->ComputeTransformFromTarget( | 100 if (property_trees->ComputeTransformFromTarget( |
135 target_node_id, clip_node->target_effect_id, &clip_to_target)) { | 101 target_node_id, clip_node->target_effect_id, &clip_to_target)) { |
136 *clip_rect_in_target_space = | 102 *clip_rect_in_target_space = |
137 MathUtil::ProjectClippedRect(clip_to_target, clip_from_clip_node); | 103 MathUtil::ProjectClippedRect(clip_to_target, clip_from_clip_node); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 MathUtil::ProjectClippedRect(target_to_local, rect)}; | 137 MathUtil::ProjectClippedRect(target_to_local, rect)}; |
172 } | 138 } |
173 | 139 |
174 static ConditionalClip ComputeLocalRectInTargetSpace( | 140 static ConditionalClip ComputeLocalRectInTargetSpace( |
175 gfx::RectF rect, | 141 gfx::RectF rect, |
176 const PropertyTrees* property_trees, | 142 const PropertyTrees* property_trees, |
177 int current_transform_id, | 143 int current_transform_id, |
178 int target_transform_id, | 144 int target_transform_id, |
179 int target_effect_id) { | 145 int target_effect_id) { |
180 gfx::Transform current_to_target; | 146 gfx::Transform current_to_target; |
181 if (!property_trees->ComputeTransformToTarget( | 147 if (!property_trees->GetToTarget(current_transform_id, target_effect_id, |
182 current_transform_id, target_effect_id, ¤t_to_target)) { | 148 ¤t_to_target)) { |
183 // If transform is not invertible, cannot apply clip. | 149 // If transform is not invertible, cannot apply clip. |
184 return ConditionalClip{false, gfx::RectF()}; | 150 return ConditionalClip{false, gfx::RectF()}; |
185 } | 151 } |
186 const EffectTree& effect_tree = property_trees->effect_tree; | |
187 const EffectNode* target_effect_node = effect_tree.Node(target_effect_id); | |
188 PostConcatSurfaceContentsScale(target_effect_node, ¤t_to_target); | |
189 #if DCHECK_IS_ON() | |
190 const TransformTree& transform_tree = property_trees->transform_tree; | |
191 VerifySurfaceContentsScalesMatch(target_effect_id, target_transform_id, | |
192 effect_tree, transform_tree); | |
193 #endif | |
194 | 152 |
195 if (current_transform_id > target_transform_id) | 153 if (current_transform_id > target_transform_id) |
196 return ConditionalClip{true, // is_clipped. | 154 return ConditionalClip{true, // is_clipped. |
197 MathUtil::MapClippedRect(current_to_target, rect)}; | 155 MathUtil::MapClippedRect(current_to_target, rect)}; |
198 | 156 |
199 return ConditionalClip{true, // is_clipped. | 157 return ConditionalClip{true, // is_clipped. |
200 MathUtil::ProjectClippedRect(current_to_target, rect)}; | 158 MathUtil::ProjectClippedRect(current_to_target, rect)}; |
201 } | 159 } |
202 | 160 |
203 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node, | 161 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node, |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 &combined_clip_rect_in_target_space)) { | 441 &combined_clip_rect_in_target_space)) { |
484 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); | 442 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); |
485 continue; | 443 continue; |
486 } | 444 } |
487 } else { | 445 } else { |
488 combined_clip_rect_in_target_space = | 446 combined_clip_rect_in_target_space = |
489 clip_node->combined_clip_in_target_space; | 447 clip_node->combined_clip_in_target_space; |
490 } | 448 } |
491 | 449 |
492 // The clip rect should be intersected with layer rect in target space. | 450 // The clip rect should be intersected with layer rect in target space. |
493 gfx::Transform content_to_target = transform_tree.ToTarget( | 451 gfx::Transform content_to_target; |
494 transform_node->id, layer->render_target_effect_tree_index()); | 452 property_trees->GetToTarget(transform_node->id, |
| 453 layer->render_target_effect_tree_index(), |
| 454 &content_to_target); |
495 content_to_target.Translate(layer->offset_to_transform_parent().x(), | 455 content_to_target.Translate(layer->offset_to_transform_parent().x(), |
496 layer->offset_to_transform_parent().y()); | 456 layer->offset_to_transform_parent().y()); |
497 gfx::Rect layer_content_rect = gfx::Rect(layer_bounds); | 457 gfx::Rect layer_content_rect = gfx::Rect(layer_bounds); |
498 gfx::RectF layer_content_bounds_in_target_space = MathUtil::MapClippedRect( | 458 gfx::RectF layer_content_bounds_in_target_space = MathUtil::MapClippedRect( |
499 content_to_target, gfx::RectF(layer_content_rect)); | 459 content_to_target, gfx::RectF(layer_content_rect)); |
500 // If the layer is fully contained within the clip, treat it as fully | 460 // If the layer is fully contained within the clip, treat it as fully |
501 // visible. | 461 // visible. |
502 if (!layer_content_bounds_in_target_space.IsEmpty() && | 462 if (!layer_content_bounds_in_target_space.IsEmpty() && |
503 combined_clip_rect_in_target_space.Contains( | 463 combined_clip_rect_in_target_space.Contains( |
504 layer_content_bounds_in_target_space)) { | 464 layer_content_bounds_in_target_space)) { |
505 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); | 465 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); |
506 continue; | 466 continue; |
507 } | 467 } |
508 | 468 |
509 combined_clip_rect_in_target_space.Intersect( | 469 combined_clip_rect_in_target_space.Intersect( |
510 layer_content_bounds_in_target_space); | 470 layer_content_bounds_in_target_space); |
511 if (combined_clip_rect_in_target_space.IsEmpty()) { | 471 if (combined_clip_rect_in_target_space.IsEmpty()) { |
512 layer->set_visible_layer_rect(gfx::Rect()); | 472 layer->set_visible_layer_rect(gfx::Rect()); |
513 continue; | 473 continue; |
514 } | 474 } |
515 | 475 |
516 gfx::Transform target_to_layer; | 476 gfx::Transform target_to_layer; |
517 if (transform_node->ancestors_are_invertible) { | 477 if (transform_node->ancestors_are_invertible) { |
518 target_to_layer = transform_tree.FromTarget( | 478 property_trees->GetFromTarget(transform_node->id, |
519 transform_node->id, layer->render_target_effect_tree_index()); | 479 layer->render_target_effect_tree_index(), |
| 480 &target_to_layer); |
520 } else { | 481 } else { |
521 const EffectNode* target_effect_node = | 482 const EffectNode* target_effect_node = |
522 ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree); | 483 ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree); |
523 bool success = property_trees->ComputeTransformFromTarget( | 484 bool success = property_trees->ComputeTransformFromTarget( |
524 transform_node->id, target_effect_node->id, &target_to_layer); | 485 transform_node->id, target_effect_node->id, &target_to_layer); |
525 if (!success) { | 486 if (!success) { |
526 // An animated singular transform may become non-singular during the | 487 // An animated singular transform may become non-singular during the |
527 // animation, so we still need to compute a visible rect. In this | 488 // animation, so we still need to compute a visible rect. In this |
528 // situation, we treat the entire layer as visible. | 489 // situation, we treat the entire layer as visible. |
529 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); | 490 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); |
530 continue; | 491 continue; |
531 } | 492 } |
532 ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_layer); | 493 ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_layer); |
533 #if DCHECK_IS_ON() | |
534 VerifySurfaceContentsScalesMatch(target_effect_node->id, target_node_id, | |
535 effect_tree, transform_tree); | |
536 #endif | |
537 } | 494 } |
538 gfx::Transform target_to_content; | 495 gfx::Transform target_to_content; |
539 target_to_content.Translate(-layer->offset_to_transform_parent().x(), | 496 target_to_content.Translate(-layer->offset_to_transform_parent().x(), |
540 -layer->offset_to_transform_parent().y()); | 497 -layer->offset_to_transform_parent().y()); |
541 target_to_content.PreconcatTransform(target_to_layer); | 498 target_to_content.PreconcatTransform(target_to_layer); |
542 | 499 |
543 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 500 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
544 target_to_content, combined_clip_rect_in_target_space)); | 501 target_to_content, combined_clip_rect_in_target_space)); |
545 visible_rect.Intersect(gfx::Rect(layer_bounds)); | 502 visible_rect.Intersect(gfx::Rect(layer_bounds)); |
546 layer->set_visible_layer_rect(visible_rect); | 503 layer->set_visible_layer_rect(visible_rect); |
547 } | 504 } |
548 } | 505 } |
549 | 506 |
550 static bool HasSingularTransform(int transform_tree_index, | 507 static bool HasSingularTransform(int transform_tree_index, |
551 const TransformTree& tree) { | 508 const TransformTree& tree) { |
552 const TransformNode* node = tree.Node(transform_tree_index); | 509 const TransformNode* node = tree.Node(transform_tree_index); |
553 return !node->is_invertible || !node->ancestors_are_invertible; | 510 return !node->is_invertible || !node->ancestors_are_invertible; |
554 } | 511 } |
555 | 512 |
556 template <typename LayerType> | 513 template <typename LayerType> |
557 static int TransformTreeIndexForBackfaceVisibility(LayerType* layer, | 514 static int TransformTreeIndexForBackfaceVisibility(LayerType* layer, |
558 const TransformTree& tree) { | 515 const TransformTree& tree) { |
559 if (!layer->use_parent_backface_visibility()) | 516 if (!layer->use_parent_backface_visibility()) |
560 return layer->transform_tree_index(); | 517 return layer->transform_tree_index(); |
561 const TransformNode* node = tree.Node(layer->transform_tree_index()); | 518 const TransformNode* node = tree.Node(layer->transform_tree_index()); |
562 return layer->id() == node->owner_id ? tree.parent(node)->id : node->id; | 519 return layer->id() == node->owner_id ? tree.parent(node)->id : node->id; |
563 } | 520 } |
564 | 521 |
565 static bool IsTargetSpaceTransformBackFaceVisible(Layer* layer, | 522 static bool IsTargetSpaceTransformBackFaceVisible( |
566 int transform_tree_index, | 523 Layer* layer, |
567 const TransformTree& tree) { | 524 int transform_tree_index, |
| 525 const PropertyTrees* property_trees) { |
568 // We do not skip back face invisible layers on main thread as target space | 526 // We do not skip back face invisible layers on main thread as target space |
569 // transform will not be available here. | 527 // transform will not be available here. |
570 return false; | 528 return false; |
571 } | 529 } |
572 | 530 |
573 static bool IsTargetSpaceTransformBackFaceVisible(LayerImpl* layer, | 531 static bool IsTargetSpaceTransformBackFaceVisible( |
574 int transform_tree_index, | 532 LayerImpl* layer, |
575 const TransformTree& tree) { | 533 int transform_tree_index, |
576 return tree | 534 const PropertyTrees* property_trees) { |
577 .ToTarget(transform_tree_index, layer->render_target_effect_tree_index()) | 535 gfx::Transform to_target; |
578 .IsBackFaceVisible(); | 536 property_trees->GetToTarget(transform_tree_index, |
| 537 layer->render_target_effect_tree_index(), |
| 538 &to_target); |
| 539 return to_target.IsBackFaceVisible(); |
579 } | 540 } |
580 | 541 |
581 template <typename LayerType> | 542 template <typename LayerType> |
582 static bool IsLayerBackFaceVisible(LayerType* layer, | 543 static bool IsLayerBackFaceVisible(LayerType* layer, |
583 int transform_tree_index, | 544 int transform_tree_index, |
584 const TransformTree& tree) { | 545 const PropertyTrees* property_trees) { |
585 const TransformNode* node = tree.Node(transform_tree_index); | 546 const TransformNode* node = |
| 547 property_trees->transform_tree.Node(transform_tree_index); |
586 return layer->use_local_transform_for_backface_visibility() | 548 return layer->use_local_transform_for_backface_visibility() |
587 ? node->local.IsBackFaceVisible() | 549 ? node->local.IsBackFaceVisible() |
588 : IsTargetSpaceTransformBackFaceVisible( | 550 : IsTargetSpaceTransformBackFaceVisible( |
589 layer, transform_tree_index, tree); | 551 layer, transform_tree_index, property_trees); |
590 } | 552 } |
591 | 553 |
592 static inline bool TransformToScreenIsKnown(Layer* layer, | 554 static inline bool TransformToScreenIsKnown(Layer* layer, |
593 int transform_tree_index, | 555 int transform_tree_index, |
594 const TransformTree& tree) { | 556 const TransformTree& tree) { |
595 const TransformNode* node = tree.Node(transform_tree_index); | 557 const TransformNode* node = tree.Node(transform_tree_index); |
596 return !node->to_screen_is_potentially_animated; | 558 return !node->to_screen_is_potentially_animated; |
597 } | 559 } |
598 | 560 |
599 static inline bool TransformToScreenIsKnown(LayerImpl* layer, | 561 static inline bool TransformToScreenIsKnown(LayerImpl* layer, |
600 int transform_tree_index, | 562 int transform_tree_index, |
601 const TransformTree& tree) { | 563 const TransformTree& tree) { |
602 return true; | 564 return true; |
603 } | 565 } |
604 | 566 |
605 template <typename LayerType> | 567 template <typename LayerType> |
606 static bool LayerNeedsUpdateInternal(LayerType* layer, | 568 static bool LayerNeedsUpdateInternal(LayerType* layer, |
607 bool layer_is_drawn, | 569 bool layer_is_drawn, |
608 const TransformTree& tree) { | 570 const PropertyTrees* property_trees) { |
609 // Layers can be skipped if any of these conditions are met. | 571 // Layers can be skipped if any of these conditions are met. |
610 // - is not drawn due to it or one of its ancestors being hidden (or having | 572 // - is not drawn due to it or one of its ancestors being hidden (or having |
611 // no copy requests). | 573 // no copy requests). |
612 // - does not draw content. | 574 // - does not draw content. |
613 // - is transparent. | 575 // - is transparent. |
614 // - has empty bounds | 576 // - has empty bounds |
615 // - the layer is not double-sided, but its back face is visible. | 577 // - the layer is not double-sided, but its back face is visible. |
616 // | 578 // |
617 // Some additional conditions need to be computed at a later point after the | 579 // Some additional conditions need to be computed at a later point after the |
618 // recursion is finished. | 580 // recursion is finished. |
619 // - the intersection of render_surface content and layer clip_rect is empty | 581 // - the intersection of render_surface content and layer clip_rect is empty |
620 // - the visible_layer_rect is empty | 582 // - the visible_layer_rect is empty |
621 // | 583 // |
622 // Note, if the layer should not have been drawn due to being fully | 584 // Note, if the layer should not have been drawn due to being fully |
623 // transparent, we would have skipped the entire subtree and never made it | 585 // transparent, we would have skipped the entire subtree and never made it |
624 // into this function, so it is safe to omit this check here. | 586 // into this function, so it is safe to omit this check here. |
625 if (!layer_is_drawn) | 587 if (!layer_is_drawn) |
626 return false; | 588 return false; |
627 | 589 |
628 if (!layer->DrawsContent() || layer->bounds().IsEmpty()) | 590 if (!layer->DrawsContent() || layer->bounds().IsEmpty()) |
629 return false; | 591 return false; |
630 | 592 |
631 // The layer should not be drawn if (1) it is not double-sided and (2) the | 593 // The layer should not be drawn if (1) it is not double-sided and (2) the |
632 // back of the layer is known to be facing the screen. | 594 // back of the layer is known to be facing the screen. |
| 595 const TransformTree& tree = property_trees->transform_tree; |
633 if (layer->should_check_backface_visibility()) { | 596 if (layer->should_check_backface_visibility()) { |
634 int backface_transform_id = | 597 int backface_transform_id = |
635 TransformTreeIndexForBackfaceVisibility(layer, tree); | 598 TransformTreeIndexForBackfaceVisibility(layer, tree); |
636 // A layer with singular transform is not drawn. So, we can assume that its | 599 // A layer with singular transform is not drawn. So, we can assume that its |
637 // backface is not visible. | 600 // backface is not visible. |
638 if (TransformToScreenIsKnown(layer, backface_transform_id, tree) && | 601 if (TransformToScreenIsKnown(layer, backface_transform_id, tree) && |
639 !HasSingularTransform(backface_transform_id, tree) && | 602 !HasSingularTransform(backface_transform_id, tree) && |
640 IsLayerBackFaceVisible(layer, backface_transform_id, tree)) | 603 IsLayerBackFaceVisible(layer, backface_transform_id, property_trees)) |
641 return false; | 604 return false; |
642 } | 605 } |
643 | 606 |
644 return true; | 607 return true; |
645 } | 608 } |
646 | 609 |
647 void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl, | 610 void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl, |
648 const TransformTree& transform_tree, | 611 const PropertyTrees* property_trees, |
649 const EffectTree& effect_tree, | |
650 std::vector<LayerImpl*>* visible_layer_list) { | 612 std::vector<LayerImpl*>* visible_layer_list) { |
| 613 const TransformTree& transform_tree = property_trees->transform_tree; |
| 614 const EffectTree& effect_tree = property_trees->effect_tree; |
| 615 |
651 for (auto* layer_impl : *layer_tree_impl) { | 616 for (auto* layer_impl : *layer_tree_impl) { |
652 bool layer_is_drawn = | 617 bool layer_is_drawn = |
653 effect_tree.Node(layer_impl->effect_tree_index())->is_drawn; | 618 effect_tree.Node(layer_impl->effect_tree_index())->is_drawn; |
654 | 619 |
655 if (!IsRootLayer(layer_impl) && | 620 if (!IsRootLayer(layer_impl) && |
656 LayerShouldBeSkipped(layer_impl, layer_is_drawn, transform_tree, | 621 LayerShouldBeSkipped(layer_impl, layer_is_drawn, transform_tree, |
657 effect_tree)) | 622 effect_tree)) |
658 continue; | 623 continue; |
659 | 624 |
660 if (LayerNeedsUpdate(layer_impl, layer_is_drawn, transform_tree)) | 625 if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees)) |
661 visible_layer_list->push_back(layer_impl); | 626 visible_layer_list->push_back(layer_impl); |
662 } | 627 } |
663 } | 628 } |
664 | 629 |
665 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, | 630 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, |
666 bool non_root_surfaces_enabled, | 631 bool non_root_surfaces_enabled, |
667 LayerImpl* layer) { | 632 LayerImpl* layer) { |
668 if (!non_root_surfaces_enabled) { | 633 if (!non_root_surfaces_enabled) { |
669 layer->SetHasRenderSurface(IsRootLayer(layer)); | 634 layer->SetHasRenderSurface(IsRootLayer(layer)); |
670 return; | 635 return; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 | 675 |
711 bool LayerShouldBeSkipped(Layer* layer, | 676 bool LayerShouldBeSkipped(Layer* layer, |
712 bool layer_is_drawn, | 677 bool layer_is_drawn, |
713 const TransformTree& transform_tree, | 678 const TransformTree& transform_tree, |
714 const EffectTree& effect_tree) { | 679 const EffectTree& effect_tree) { |
715 return LayerShouldBeSkippedInternal(layer, layer_is_drawn, transform_tree, | 680 return LayerShouldBeSkippedInternal(layer, layer_is_drawn, transform_tree, |
716 effect_tree); | 681 effect_tree); |
717 } | 682 } |
718 | 683 |
719 void FindLayersThatNeedUpdates(LayerTree* layer_tree, | 684 void FindLayersThatNeedUpdates(LayerTree* layer_tree, |
720 const TransformTree& transform_tree, | 685 const PropertyTrees* property_trees, |
721 const EffectTree& effect_tree, | |
722 LayerList* update_layer_list) { | 686 LayerList* update_layer_list) { |
| 687 const TransformTree& transform_tree = property_trees->transform_tree; |
| 688 const EffectTree& effect_tree = property_trees->effect_tree; |
723 for (auto* layer : *layer_tree) { | 689 for (auto* layer : *layer_tree) { |
724 bool layer_is_drawn = | 690 bool layer_is_drawn = |
725 effect_tree.Node(layer->effect_tree_index())->is_drawn; | 691 effect_tree.Node(layer->effect_tree_index())->is_drawn; |
726 | 692 |
727 if (!IsRootLayer(layer) && | 693 if (!IsRootLayer(layer) && |
728 LayerShouldBeSkipped(layer, layer_is_drawn, transform_tree, | 694 LayerShouldBeSkipped(layer, layer_is_drawn, transform_tree, |
729 effect_tree)) | 695 effect_tree)) |
730 continue; | 696 continue; |
731 | 697 |
732 if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree)) { | 698 if (LayerNeedsUpdate(layer, layer_is_drawn, property_trees)) { |
733 update_layer_list->push_back(layer); | 699 update_layer_list->push_back(layer); |
734 } | 700 } |
735 | 701 |
736 // Append mask layers to the update layer list. They don't have valid | 702 // Append mask layers to the update layer list. They don't have valid |
737 // visible rects, so need to get added after the above calculation. | 703 // visible rects, so need to get added after the above calculation. |
738 if (Layer* mask_layer = layer->mask_layer()) | 704 if (Layer* mask_layer = layer->mask_layer()) |
739 update_layer_list->push_back(mask_layer); | 705 update_layer_list->push_back(mask_layer); |
740 } | 706 } |
741 } | 707 } |
742 | 708 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 parent_clip_node->clip_in_target_space; | 774 parent_clip_node->clip_in_target_space; |
809 if (parent_target_transform_node && | 775 if (parent_target_transform_node && |
810 parent_target_transform_node->id != clip_node->target_transform_id && | 776 parent_target_transform_node->id != clip_node->target_transform_id && |
811 non_root_surfaces_enabled) { | 777 non_root_surfaces_enabled) { |
812 success &= property_trees->ComputeTransformFromTarget( | 778 success &= property_trees->ComputeTransformFromTarget( |
813 clip_node->target_transform_id, parent_clip_node->target_effect_id, | 779 clip_node->target_transform_id, parent_clip_node->target_effect_id, |
814 &parent_to_current); | 780 &parent_to_current); |
815 const EffectNode* target_effect_node = | 781 const EffectNode* target_effect_node = |
816 effect_tree.Node(clip_node->target_effect_id); | 782 effect_tree.Node(clip_node->target_effect_id); |
817 PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current); | 783 PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current); |
818 #if DCHECK_IS_ON() | |
819 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, | |
820 clip_node->target_transform_id, | |
821 effect_tree, transform_tree); | |
822 #endif | |
823 const EffectNode* parent_target_effect_node = | 784 const EffectNode* parent_target_effect_node = |
824 effect_tree.Node(parent_clip_node->target_effect_id); | 785 effect_tree.Node(parent_clip_node->target_effect_id); |
825 ConcatInverseSurfaceContentsScale(parent_target_effect_node, | 786 ConcatInverseSurfaceContentsScale(parent_target_effect_node, |
826 &parent_to_current); | 787 &parent_to_current); |
827 #if DCHECK_IS_ON() | |
828 VerifySurfaceContentsScalesMatch(parent_clip_node->target_effect_id, | |
829 parent_clip_node->target_transform_id, | |
830 effect_tree, transform_tree); | |
831 #endif | |
832 // If we can't compute a transform, it's because we had to use the inverse | 788 // If we can't compute a transform, it's because we had to use the inverse |
833 // of a singular transform. We won't draw in this case, so there's no need | 789 // of a singular transform. We won't draw in this case, so there's no need |
834 // to compute clips. | 790 // to compute clips. |
835 if (!success) | 791 if (!success) |
836 continue; | 792 continue; |
837 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect( | 793 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect( |
838 parent_to_current, parent_clip_node->combined_clip_in_target_space); | 794 parent_to_current, parent_clip_node->combined_clip_in_target_space); |
839 parent_clip_in_target_space = MathUtil::ProjectClippedRect( | 795 parent_clip_in_target_space = MathUtil::ProjectClippedRect( |
840 parent_to_current, parent_clip_node->clip_in_target_space); | 796 parent_to_current, parent_clip_node->clip_in_target_space); |
841 } | 797 } |
842 // Only nodes affected by ancestor clips will have their clip adjusted due | 798 // Only nodes affected by ancestor clips will have their clip adjusted due |
843 // to intersecting with an ancestor clip. But, we still need to propagate | 799 // to intersecting with an ancestor clip. But, we still need to propagate |
844 // the combined clip to our children because if they are clipped, they may | 800 // the combined clip to our children because if they are clipped, they may |
845 // need to clip using our parent clip and if we don't propagate it here, | 801 // need to clip using our parent clip and if we don't propagate it here, |
846 // it will be lost. | 802 // it will be lost. |
847 if (clip_node->resets_clip && non_root_surfaces_enabled) { | 803 if (clip_node->resets_clip && non_root_surfaces_enabled) { |
848 if (clip_node->clip_type == ClipNode::ClipType::APPLIES_LOCAL_CLIP) { | 804 if (clip_node->clip_type == ClipNode::ClipType::APPLIES_LOCAL_CLIP) { |
849 clip_node->clip_in_target_space = MathUtil::MapClippedRect( | 805 gfx::Transform to_target; |
850 transform_tree.ToTarget(clip_node->transform_id, | 806 property_trees->GetToTarget(clip_node->transform_id, |
851 clip_node->target_effect_id), | 807 clip_node->target_effect_id, &to_target); |
852 clip_node->clip); | 808 clip_node->clip_in_target_space = |
| 809 MathUtil::MapClippedRect(to_target, clip_node->clip); |
853 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space); | 810 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space); |
854 clip_node->combined_clip_in_target_space = | 811 clip_node->combined_clip_in_target_space = |
855 gfx::IntersectRects(clip_node->clip_in_target_space, | 812 gfx::IntersectRects(clip_node->clip_in_target_space, |
856 parent_combined_clip_in_target_space); | 813 parent_combined_clip_in_target_space); |
857 } else { | 814 } else { |
858 DCHECK(!clip_node->target_is_clipped); | 815 DCHECK(!clip_node->target_is_clipped); |
859 DCHECK(!clip_node->layers_are_clipped); | 816 DCHECK(!clip_node->layers_are_clipped); |
860 clip_node->combined_clip_in_target_space = | 817 clip_node->combined_clip_in_target_space = |
861 parent_combined_clip_in_target_space; | 818 parent_combined_clip_in_target_space; |
862 } | 819 } |
(...skipping 16 matching lines...) Expand all Loading... |
879 // it to an empty rect. | 836 // it to an empty rect. |
880 clip_node->clip_in_target_space = gfx::RectF(); | 837 clip_node->clip_in_target_space = gfx::RectF(); |
881 } | 838 } |
882 } else { | 839 } else { |
883 gfx::Transform source_to_target; | 840 gfx::Transform source_to_target; |
884 | 841 |
885 if (!non_root_surfaces_enabled) { | 842 if (!non_root_surfaces_enabled) { |
886 source_to_target = transform_tree.ToScreen(clip_node->transform_id); | 843 source_to_target = transform_tree.ToScreen(clip_node->transform_id); |
887 } else if (transform_tree.ContentTargetId(transform_node->id) == | 844 } else if (transform_tree.ContentTargetId(transform_node->id) == |
888 clip_node->target_transform_id) { | 845 clip_node->target_transform_id) { |
889 source_to_target = transform_tree.ToTarget(clip_node->transform_id, | 846 property_trees->GetToTarget(clip_node->transform_id, |
890 clip_node->target_effect_id); | 847 clip_node->target_effect_id, |
| 848 &source_to_target); |
891 } else { | 849 } else { |
892 success = property_trees->ComputeTransformToTarget( | 850 success = property_trees->GetToTarget( |
893 transform_node->id, clip_node->target_effect_id, &source_to_target); | 851 transform_node->id, clip_node->target_effect_id, &source_to_target); |
894 const EffectNode* target_effect_node = | |
895 effect_tree.Node(clip_node->target_effect_id); | |
896 PostConcatSurfaceContentsScale(target_effect_node, &source_to_target); | |
897 #if DCHECK_IS_ON() | |
898 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, | |
899 clip_node->target_transform_id, | |
900 effect_tree, transform_tree); | |
901 #endif | |
902 // source_to_target computation should be successful as target is an | 852 // source_to_target computation should be successful as target is an |
903 // ancestor of the transform node. | 853 // ancestor of the transform node. |
904 DCHECK(success); | 854 DCHECK(success); |
905 } | 855 } |
906 | 856 |
907 gfx::RectF source_clip_in_target_space = | 857 gfx::RectF source_clip_in_target_space = |
908 MathUtil::MapClippedRect(source_to_target, clip_node->clip); | 858 MathUtil::MapClippedRect(source_to_target, clip_node->clip); |
909 | 859 |
910 // With surfaces disabled, the only case where we use only the local clip | 860 // With surfaces disabled, the only case where we use only the local clip |
911 // for layer clipping is the case where no non-viewport ancestor node | 861 // for layer clipping is the case where no non-viewport ancestor node |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1026 << " layer: " << layer->id() << " clip id: " << layer->clip_tree_index() | 976 << " layer: " << layer->id() << " clip id: " << layer->clip_tree_index() |
1027 << " layer clip: " << layer->clip_rect().ToString() << " v.s. " | 977 << " layer clip: " << layer->clip_rect().ToString() << " v.s. " |
1028 << gfx::ToEnclosingRect(accumulated_clip).ToString() | 978 << gfx::ToEnclosingRect(accumulated_clip).ToString() |
1029 << " and clip node clip: " | 979 << " and clip node clip: " |
1030 << gfx::ToEnclosingRect( | 980 << gfx::ToEnclosingRect( |
1031 clip_tree->Node(layer->clip_tree_index())->clip_in_target_space) | 981 clip_tree->Node(layer->clip_tree_index())->clip_in_target_space) |
1032 .ToString(); | 982 .ToString(); |
1033 } | 983 } |
1034 } | 984 } |
1035 | 985 |
1036 static int FindTargetTransformTreeIndexFromEffectTree( | |
1037 const EffectTree& effect_tree, | |
1038 const int effect_tree_index) { | |
1039 const EffectNode* node = effect_tree.Node(effect_tree_index); | |
1040 if (node->has_render_surface) | |
1041 return node->transform_id; | |
1042 node = effect_tree.Node(node->target_id); | |
1043 return node->transform_id; | |
1044 } | |
1045 | |
1046 static void VerifyDrawTransformsMatch(LayerImpl* layer, | |
1047 PropertyTrees* property_trees) { | |
1048 const int source_id = layer->transform_tree_index(); | |
1049 int destination_id = FindTargetTransformTreeIndexFromEffectTree( | |
1050 property_trees->effect_tree, layer->effect_tree_index()); | |
1051 const EffectNode* target_effect_node = ContentsTargetEffectNode( | |
1052 layer->effect_tree_index(), property_trees->effect_tree); | |
1053 gfx::Transform draw_transform; | |
1054 property_trees->ComputeTransformToTarget(source_id, target_effect_node->id, | |
1055 &draw_transform); | |
1056 PostConcatSurfaceContentsScale(target_effect_node, &draw_transform); | |
1057 #if DCHECK_IS_ON() | |
1058 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), destination_id, | |
1059 property_trees->effect_tree, | |
1060 property_trees->transform_tree); | |
1061 #endif | |
1062 if (layer->should_flatten_transform_from_property_tree()) | |
1063 draw_transform.FlattenTo2d(); | |
1064 draw_transform.Translate(layer->offset_to_transform_parent().x(), | |
1065 layer->offset_to_transform_parent().y()); | |
1066 DCHECK(draw_transform.ApproximatelyEqual(DrawTransform( | |
1067 layer, property_trees->transform_tree, property_trees->effect_tree))) | |
1068 << " layer: " << layer->id() << " source transform id: " << source_id | |
1069 << " destination transform id: " << destination_id | |
1070 << " draw transform from transform tree: " | |
1071 << DrawTransform(layer, property_trees->transform_tree, | |
1072 property_trees->effect_tree) | |
1073 .ToString() | |
1074 << " v.s." << draw_transform.ToString(); | |
1075 } | |
1076 | |
1077 static void ComputeVisibleRectsInternal( | 986 static void ComputeVisibleRectsInternal( |
1078 LayerImpl* root_layer, | 987 LayerImpl* root_layer, |
1079 PropertyTrees* property_trees, | 988 PropertyTrees* property_trees, |
1080 bool can_render_to_separate_surface, | 989 bool can_render_to_separate_surface, |
1081 std::vector<LayerImpl*>* visible_layer_list) { | 990 std::vector<LayerImpl*>* visible_layer_list) { |
1082 if (property_trees->non_root_surfaces_enabled != | 991 if (property_trees->non_root_surfaces_enabled != |
1083 can_render_to_separate_surface) { | 992 can_render_to_separate_surface) { |
1084 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; | 993 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; |
1085 property_trees->transform_tree.set_needs_update(true); | 994 property_trees->transform_tree.set_needs_update(true); |
1086 } | 995 } |
1087 if (property_trees->transform_tree.needs_update()) { | 996 if (property_trees->transform_tree.needs_update()) { |
1088 property_trees->clip_tree.set_needs_update(true); | 997 property_trees->clip_tree.set_needs_update(true); |
1089 property_trees->effect_tree.set_needs_update(true); | 998 property_trees->effect_tree.set_needs_update(true); |
1090 } | 999 } |
1091 UpdateRenderTarget(&property_trees->effect_tree, | 1000 UpdateRenderTarget(&property_trees->effect_tree, |
1092 property_trees->non_root_surfaces_enabled); | 1001 property_trees->non_root_surfaces_enabled); |
1093 ComputeTransforms(&property_trees->transform_tree); | 1002 ComputeTransforms(&property_trees->transform_tree); |
1094 // Computation of clips uses surface contents scale which is updated while | 1003 // Computation of clips uses surface contents scale which is updated while |
1095 // computing effects. So, ComputeEffects should be before ComputeClips. | 1004 // computing effects. So, ComputeEffects should be before ComputeClips. |
1096 ComputeEffects(&property_trees->effect_tree); | 1005 ComputeEffects(&property_trees->effect_tree); |
1097 ComputeClips(property_trees, can_render_to_separate_surface); | 1006 ComputeClips(property_trees, can_render_to_separate_surface); |
1098 | 1007 |
1099 FindLayersThatNeedUpdates(root_layer->layer_tree_impl(), | 1008 FindLayersThatNeedUpdates(root_layer->layer_tree_impl(), property_trees, |
1100 property_trees->transform_tree, | 1009 visible_layer_list); |
1101 property_trees->effect_tree, visible_layer_list); | |
1102 CalculateClipRects(*visible_layer_list, property_trees, | 1010 CalculateClipRects(*visible_layer_list, property_trees, |
1103 can_render_to_separate_surface); | 1011 can_render_to_separate_surface); |
1104 CalculateVisibleRects(*visible_layer_list, property_trees, | 1012 CalculateVisibleRects(*visible_layer_list, property_trees, |
1105 can_render_to_separate_surface); | 1013 can_render_to_separate_surface); |
1106 } | 1014 } |
1107 | 1015 |
1108 void UpdatePropertyTrees(PropertyTrees* property_trees, | 1016 void UpdatePropertyTrees(PropertyTrees* property_trees, |
1109 bool can_render_to_separate_surface) { | 1017 bool can_render_to_separate_surface) { |
1110 if (property_trees->non_root_surfaces_enabled != | 1018 if (property_trees->non_root_surfaces_enabled != |
1111 can_render_to_separate_surface) { | 1019 can_render_to_separate_surface) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1148 | 1056 |
1149 void VerifyClipTreeCalculations(const LayerImplList& layer_list, | 1057 void VerifyClipTreeCalculations(const LayerImplList& layer_list, |
1150 PropertyTrees* property_trees) { | 1058 PropertyTrees* property_trees) { |
1151 if (property_trees->non_root_surfaces_enabled) { | 1059 if (property_trees->non_root_surfaces_enabled) { |
1152 ComputeClipsWithEffectTree(property_trees); | 1060 ComputeClipsWithEffectTree(property_trees); |
1153 } | 1061 } |
1154 for (auto* layer : layer_list) | 1062 for (auto* layer : layer_list) |
1155 ComputeLayerClipRect(property_trees, layer); | 1063 ComputeLayerClipRect(property_trees, layer); |
1156 } | 1064 } |
1157 | 1065 |
1158 void VerifyTransformTreeCalculations(const LayerImplList& layer_list, | |
1159 PropertyTrees* property_trees) { | |
1160 for (auto* layer : layer_list) | |
1161 VerifyDrawTransformsMatch(layer, property_trees); | |
1162 } | |
1163 | |
1164 void ComputeVisibleRects(LayerImpl* root_layer, | 1066 void ComputeVisibleRects(LayerImpl* root_layer, |
1165 PropertyTrees* property_trees, | 1067 PropertyTrees* property_trees, |
1166 bool can_render_to_separate_surface, | 1068 bool can_render_to_separate_surface, |
1167 LayerImplList* visible_layer_list) { | 1069 LayerImplList* visible_layer_list) { |
1168 for (auto* layer : *root_layer->layer_tree_impl()) { | 1070 for (auto* layer : *root_layer->layer_tree_impl()) { |
1169 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, | 1071 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, |
1170 can_render_to_separate_surface, layer); | 1072 can_render_to_separate_surface, layer); |
1171 EffectNode* node = | 1073 EffectNode* node = |
1172 property_trees->effect_tree.Node(layer->effect_tree_index()); | 1074 property_trees->effect_tree.Node(layer->effect_tree_index()); |
1173 if (node->owner_id == layer->id()) | 1075 if (node->owner_id == layer->id()) |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1232 DCHECK(layer->visible_layer_rect() == visible_rect_dynamic) | 1134 DCHECK(layer->visible_layer_rect() == visible_rect_dynamic) |
1233 << " layer: " << layer->id() << " clip id: " << layer->clip_tree_index() | 1135 << " layer: " << layer->id() << " clip id: " << layer->clip_tree_index() |
1234 << " visible rect cached: " << layer->visible_layer_rect().ToString() | 1136 << " visible rect cached: " << layer->visible_layer_rect().ToString() |
1235 << " v.s. " | 1137 << " v.s. " |
1236 << " visible rect dynamic: " << visible_rect_dynamic.ToString(); | 1138 << " visible rect dynamic: " << visible_rect_dynamic.ToString(); |
1237 } | 1139 } |
1238 } | 1140 } |
1239 | 1141 |
1240 bool LayerNeedsUpdate(Layer* layer, | 1142 bool LayerNeedsUpdate(Layer* layer, |
1241 bool layer_is_drawn, | 1143 bool layer_is_drawn, |
1242 const TransformTree& tree) { | 1144 const PropertyTrees* property_trees) { |
1243 return LayerNeedsUpdateInternal(layer, layer_is_drawn, tree); | 1145 return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees); |
1244 } | 1146 } |
1245 | 1147 |
1246 bool LayerNeedsUpdate(LayerImpl* layer, | 1148 bool LayerNeedsUpdate(LayerImpl* layer, |
1247 bool layer_is_drawn, | 1149 bool layer_is_drawn, |
1248 const TransformTree& tree) { | 1150 const PropertyTrees* property_trees) { |
1249 return LayerNeedsUpdateInternal(layer, layer_is_drawn, tree); | 1151 return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees); |
1250 } | 1152 } |
1251 | 1153 |
1252 gfx::Transform DrawTransform(const LayerImpl* layer, | 1154 gfx::Transform DrawTransform(const LayerImpl* layer, |
1253 const TransformTree& transform_tree, | 1155 const TransformTree& transform_tree, |
1254 const EffectTree& effect_tree) { | 1156 const EffectTree& effect_tree) { |
1255 // TransformTree::ToTarget computes transform between the layer's transform | 1157 // TransformTree::ToTarget computes transform between the layer's transform |
1256 // node and surface's transform node and scales it by the surface's content | 1158 // node and surface's transform node and scales it by the surface's content |
1257 // scale. | 1159 // scale. |
1258 gfx::Transform xform = | 1160 gfx::Transform xform; |
1259 transform_tree.property_trees()->non_root_surfaces_enabled | 1161 if (transform_tree.property_trees()->non_root_surfaces_enabled) |
1260 ? transform_tree.ToTarget(layer->transform_tree_index(), | 1162 transform_tree.property_trees()->GetToTarget( |
1261 layer->render_target_effect_tree_index()) | 1163 layer->transform_tree_index(), layer->render_target_effect_tree_index(), |
1262 : transform_tree.ToScreen(layer->transform_tree_index()); | 1164 &xform); |
| 1165 else |
| 1166 xform = transform_tree.ToScreen(layer->transform_tree_index()); |
1263 if (layer->should_flatten_transform_from_property_tree()) | 1167 if (layer->should_flatten_transform_from_property_tree()) |
1264 xform.FlattenTo2d(); | 1168 xform.FlattenTo2d(); |
1265 xform.Translate(layer->offset_to_transform_parent().x(), | 1169 xform.Translate(layer->offset_to_transform_parent().x(), |
1266 layer->offset_to_transform_parent().y()); | 1170 layer->offset_to_transform_parent().y()); |
1267 return xform; | 1171 return xform; |
1268 } | 1172 } |
1269 | 1173 |
1270 static void SetSurfaceDrawTransform(const PropertyTrees* property_trees, | 1174 static void SetSurfaceDrawTransform(const PropertyTrees* property_trees, |
1271 RenderSurfaceImpl* render_surface) { | 1175 RenderSurfaceImpl* render_surface) { |
1272 const TransformTree& transform_tree = property_trees->transform_tree; | 1176 const TransformTree& transform_tree = property_trees->transform_tree; |
1273 const EffectTree& effect_tree = property_trees->effect_tree; | 1177 const EffectTree& effect_tree = property_trees->effect_tree; |
1274 const TransformNode* transform_node = | 1178 const TransformNode* transform_node = |
1275 transform_tree.Node(render_surface->TransformTreeIndex()); | 1179 transform_tree.Node(render_surface->TransformTreeIndex()); |
1276 const EffectNode* effect_node = | 1180 const EffectNode* effect_node = |
1277 effect_tree.Node(render_surface->EffectTreeIndex()); | 1181 effect_tree.Node(render_surface->EffectTreeIndex()); |
1278 // The draw transform of root render surface is identity tranform. | 1182 // The draw transform of root render surface is identity tranform. |
1279 if (transform_node->id == 1) { | 1183 if (transform_node->id == 1) { |
1280 render_surface->SetDrawTransform(gfx::Transform()); | 1184 render_surface->SetDrawTransform(gfx::Transform()); |
1281 return; | 1185 return; |
1282 } | 1186 } |
1283 | 1187 |
1284 gfx::Transform render_surface_transform; | 1188 gfx::Transform render_surface_transform; |
1285 const EffectNode* target_effect_node = | 1189 const EffectNode* target_effect_node = |
1286 effect_tree.Node(effect_node->target_id); | 1190 effect_tree.Node(effect_node->target_id); |
1287 property_trees->ComputeTransformToTarget( | 1191 property_trees->GetToTarget(transform_node->id, target_effect_node->id, |
1288 transform_node->id, target_effect_node->id, &render_surface_transform); | 1192 &render_surface_transform); |
1289 PostConcatSurfaceContentsScale(target_effect_node, &render_surface_transform); | |
1290 #if DCHECK_IS_ON() | |
1291 const TransformNode* target_transform_node = | |
1292 transform_tree.Node(transform_tree.TargetId(transform_node->id)); | |
1293 VerifySurfaceContentsScalesMatch(effect_node->target_id, | |
1294 target_transform_node->id, effect_tree, | |
1295 transform_tree); | |
1296 #endif | |
1297 | 1193 |
1298 ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform); | 1194 ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform); |
1299 #if DCHECK_IS_ON() | |
1300 VerifySurfaceContentsScalesMatch(effect_node->id, transform_node->id, | |
1301 effect_tree, transform_tree); | |
1302 #endif | |
1303 render_surface->SetDrawTransform(render_surface_transform); | 1195 render_surface->SetDrawTransform(render_surface_transform); |
1304 } | 1196 } |
1305 | 1197 |
1306 static void SetSurfaceIsClipped(const ClipNode* clip_node, | 1198 static void SetSurfaceIsClipped(const ClipNode* clip_node, |
1307 RenderSurfaceImpl* render_surface) { | 1199 RenderSurfaceImpl* render_surface) { |
1308 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id) | 1200 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id) |
1309 << "we now create clip node for every render surface"; | 1201 << "we now create clip node for every render surface"; |
1310 | 1202 |
1311 render_surface->SetIsClipped(clip_node->target_is_clipped); | 1203 render_surface->SetIsClipped(clip_node->target_is_clipped); |
1312 } | 1204 } |
(...skipping 17 matching lines...) Expand all Loading... |
1330 return; | 1222 return; |
1331 } | 1223 } |
1332 | 1224 |
1333 // In this case, the clip child has reset the clip node for subtree and hence | 1225 // In this case, the clip child has reset the clip node for subtree and hence |
1334 // the parent clip node's clip rect is in clip parent's target space and not | 1226 // the parent clip node's clip rect is in clip parent's target space and not |
1335 // our target space. We need to transform it to our target space. | 1227 // our target space. We need to transform it to our target space. |
1336 gfx::Transform clip_parent_target_to_target; | 1228 gfx::Transform clip_parent_target_to_target; |
1337 const EffectNode* effect_node = | 1229 const EffectNode* effect_node = |
1338 effect_tree.Node(render_surface->EffectTreeIndex()); | 1230 effect_tree.Node(render_surface->EffectTreeIndex()); |
1339 int target_effect_id = effect_node->target_id; | 1231 int target_effect_id = effect_node->target_id; |
1340 const bool success = property_trees->ComputeTransformToTarget( | 1232 const bool success = property_trees->GetToTarget( |
1341 parent_clip_node->target_transform_id, target_effect_id, | 1233 parent_clip_node->target_transform_id, target_effect_id, |
1342 &clip_parent_target_to_target); | 1234 &clip_parent_target_to_target); |
1343 | 1235 |
1344 if (!success) { | 1236 if (!success) { |
1345 render_surface->SetClipRect(gfx::Rect()); | 1237 render_surface->SetClipRect(gfx::Rect()); |
1346 return; | 1238 return; |
1347 } | 1239 } |
1348 | 1240 |
1349 PostConcatSurfaceContentsScale(effect_node, &clip_parent_target_to_target); | |
1350 #if DCHECK_IS_ON() | |
1351 VerifySurfaceContentsScalesMatch(render_surface->EffectTreeIndex(), | |
1352 transform_tree.TargetId(transform_node->id), | |
1353 effect_tree, transform_tree); | |
1354 #endif | |
1355 | |
1356 DCHECK_LT(parent_clip_node->target_transform_id, | 1241 DCHECK_LT(parent_clip_node->target_transform_id, |
1357 transform_tree.TargetId(transform_node->id)); | 1242 transform_tree.TargetId(transform_node->id)); |
1358 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 1243 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
1359 clip_parent_target_to_target, parent_clip_node->clip_in_target_space))); | 1244 clip_parent_target_to_target, parent_clip_node->clip_in_target_space))); |
1360 } | 1245 } |
1361 | 1246 |
1362 template <typename LayerType> | 1247 template <typename LayerType> |
1363 static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer, | 1248 static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer, |
1364 const TransformTree& tree) { | 1249 const TransformTree& tree) { |
1365 gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(), | 1250 gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(), |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1576 void UpdateElasticOverscroll(PropertyTrees* property_trees, | 1461 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
1577 const Layer* overscroll_elasticity_layer, | 1462 const Layer* overscroll_elasticity_layer, |
1578 const gfx::Vector2dF& elastic_overscroll) { | 1463 const gfx::Vector2dF& elastic_overscroll) { |
1579 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1464 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
1580 elastic_overscroll); | 1465 elastic_overscroll); |
1581 } | 1466 } |
1582 | 1467 |
1583 } // namespace draw_property_utils | 1468 } // namespace draw_property_utils |
1584 | 1469 |
1585 } // namespace cc | 1470 } // namespace cc |
OLD | NEW |