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

Side by Side Diff: cc/trees/draw_property_utils.cc

Issue 2032213002: cc: Put to_target and to_screen behind an accessor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Put target_id behind accessor Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | cc/trees/property_tree.h » ('j') | cc/trees/property_tree.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 combined_clip_rect_in_target_space = clip_rect_in_target_space; 160 combined_clip_rect_in_target_space = clip_rect_in_target_space;
161 } 161 }
162 162
163 if (!clip_rect_in_target_space.IsEmpty()) { 163 if (!clip_rect_in_target_space.IsEmpty()) {
164 layer->set_clip_rect(clip_rect_in_target_space); 164 layer->set_clip_rect(clip_rect_in_target_space);
165 } else { 165 } else {
166 layer->set_clip_rect(gfx::Rect()); 166 layer->set_clip_rect(gfx::Rect());
167 } 167 }
168 168
169 // The clip rect should be intersected with layer rect in target space. 169 // The clip rect should be intersected with layer rect in target space.
170 gfx::Transform content_to_target = non_root_surfaces_enabled 170 gfx::Transform content_to_target =
171 ? transform_node->data.to_target 171 non_root_surfaces_enabled
172 : transform_node->data.to_screen; 172 ? transform_tree.ToTarget(layer->transform_tree_index())
173 : transform_tree.ToScreen(layer->transform_tree_index());
173 174
174 content_to_target.Translate(layer->offset_to_transform_parent().x(), 175 content_to_target.Translate(layer->offset_to_transform_parent().x(),
175 layer->offset_to_transform_parent().y()); 176 layer->offset_to_transform_parent().y());
176 gfx::Rect layer_content_rect = gfx::Rect(layer_bounds); 177 gfx::Rect layer_content_rect = gfx::Rect(layer_bounds);
177 gfx::Rect layer_content_bounds_in_target_space = 178 gfx::Rect layer_content_bounds_in_target_space =
178 MathUtil::MapEnclosingClippedRect(content_to_target, 179 MathUtil::MapEnclosingClippedRect(content_to_target,
179 layer_content_rect); 180 layer_content_rect);
180 combined_clip_rect_in_target_space.Intersect( 181 combined_clip_rect_in_target_space.Intersect(
181 layer_content_bounds_in_target_space); 182 layer_content_bounds_in_target_space);
182 if (combined_clip_rect_in_target_space.IsEmpty()) { 183 if (combined_clip_rect_in_target_space.IsEmpty()) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 return layer->id() == node->owner_id ? tree.parent(node)->id : node->id; 246 return layer->id() == node->owner_id ? tree.parent(node)->id : node->id;
246 } 247 }
247 248
248 template <typename LayerType> 249 template <typename LayerType>
249 static bool IsLayerBackFaceVisible(LayerType* layer, 250 static bool IsLayerBackFaceVisible(LayerType* layer,
250 int transform_tree_index, 251 int transform_tree_index,
251 const TransformTree& tree) { 252 const TransformTree& tree) {
252 const TransformNode* node = tree.Node(transform_tree_index); 253 const TransformNode* node = tree.Node(transform_tree_index);
253 return layer->use_local_transform_for_backface_visibility() 254 return layer->use_local_transform_for_backface_visibility()
254 ? node->data.local.IsBackFaceVisible() 255 ? node->data.local.IsBackFaceVisible()
255 : node->data.to_target.IsBackFaceVisible(); 256 : tree.ToTarget(transform_tree_index).IsBackFaceVisible();
256 } 257 }
257 258
258 static inline bool TransformToScreenIsKnown(Layer* layer, 259 static inline bool TransformToScreenIsKnown(Layer* layer,
259 int transform_tree_index, 260 int transform_tree_index,
260 const TransformTree& tree) { 261 const TransformTree& tree) {
261 const TransformNode* node = tree.Node(transform_tree_index); 262 const TransformNode* node = tree.Node(transform_tree_index);
262 return !node->data.to_screen_is_potentially_animated; 263 return !node->data.to_screen_is_potentially_animated;
263 } 264 }
264 265
265 static inline bool TransformToScreenIsKnown(LayerImpl* layer, 266 static inline bool TransformToScreenIsKnown(LayerImpl* layer,
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 parent_to_current, parent_clip_node->data.clip_in_target_space); 479 parent_to_current, parent_clip_node->data.clip_in_target_space);
479 } 480 }
480 // Only nodes affected by ancestor clips will have their clip adjusted due 481 // Only nodes affected by ancestor clips will have their clip adjusted due
481 // to intersecting with an ancestor clip. But, we still need to propagate 482 // to intersecting with an ancestor clip. But, we still need to propagate
482 // the combined clip to our children because if they are clipped, they may 483 // the combined clip to our children because if they are clipped, they may
483 // need to clip using our parent clip and if we don't propagate it here, 484 // need to clip using our parent clip and if we don't propagate it here,
484 // it will be lost. 485 // it will be lost.
485 if (clip_node->data.resets_clip && non_root_surfaces_enabled) { 486 if (clip_node->data.resets_clip && non_root_surfaces_enabled) {
486 if (clip_node->data.applies_local_clip) { 487 if (clip_node->data.applies_local_clip) {
487 clip_node->data.clip_in_target_space = MathUtil::MapClippedRect( 488 clip_node->data.clip_in_target_space = MathUtil::MapClippedRect(
488 transform_node->data.to_target, clip_node->data.clip); 489 transform_tree.ToTarget(clip_node->data.transform_id),
490 clip_node->data.clip);
489 ResetIfHasNanCoordinate(&clip_node->data.clip_in_target_space); 491 ResetIfHasNanCoordinate(&clip_node->data.clip_in_target_space);
490 clip_node->data.combined_clip_in_target_space = 492 clip_node->data.combined_clip_in_target_space =
491 gfx::IntersectRects(clip_node->data.clip_in_target_space, 493 gfx::IntersectRects(clip_node->data.clip_in_target_space,
492 parent_combined_clip_in_target_space); 494 parent_combined_clip_in_target_space);
493 } else { 495 } else {
494 DCHECK(!clip_node->data.target_is_clipped); 496 DCHECK(!clip_node->data.target_is_clipped);
495 DCHECK(!clip_node->data.layers_are_clipped); 497 DCHECK(!clip_node->data.layers_are_clipped);
496 clip_node->data.combined_clip_in_target_space = 498 clip_node->data.combined_clip_in_target_space =
497 parent_combined_clip_in_target_space; 499 parent_combined_clip_in_target_space;
498 } 500 }
(...skipping 12 matching lines...) Expand all
511 } else { 513 } else {
512 // Render Surface applies clip and the owning layer itself applies 514 // Render Surface applies clip and the owning layer itself applies
513 // no clip. So, clip_in_target_space is not used and hence we can set 515 // no clip. So, clip_in_target_space is not used and hence we can set
514 // it to an empty rect. 516 // it to an empty rect.
515 clip_node->data.clip_in_target_space = gfx::RectF(); 517 clip_node->data.clip_in_target_space = gfx::RectF();
516 } 518 }
517 } else { 519 } else {
518 gfx::Transform source_to_target; 520 gfx::Transform source_to_target;
519 521
520 if (!non_root_surfaces_enabled) { 522 if (!non_root_surfaces_enabled) {
521 source_to_target = transform_node->data.to_screen; 523 source_to_target =
524 transform_tree.ToScreen(clip_node->data.transform_id);
522 } else if (transform_node->data.content_target_id == 525 } else if (transform_node->data.content_target_id ==
523 clip_node->data.target_id) { 526 clip_node->data.target_id) {
524 source_to_target = transform_node->data.to_target; 527 source_to_target =
528 transform_tree.ToTarget(clip_node->data.transform_id);
525 } else { 529 } else {
526 success = transform_tree.ComputeTransformWithDestinationSublayerScale( 530 success = transform_tree.ComputeTransformWithDestinationSublayerScale(
527 transform_node->id, clip_node->data.target_id, &source_to_target); 531 transform_node->id, clip_node->data.target_id, &source_to_target);
528 // source_to_target computation should be successful as target is an 532 // source_to_target computation should be successful as target is an
529 // ancestor of the transform node. 533 // ancestor of the transform node.
530 DCHECK(success); 534 DCHECK(success);
531 } 535 }
532 536
533 gfx::RectF source_clip_in_target_space = 537 gfx::RectF source_clip_in_target_space =
534 MathUtil::MapClippedRect(source_to_target, clip_node->data.clip); 538 MathUtil::MapClippedRect(source_to_target, clip_node->data.clip);
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 873
870 gfx::Transform DrawTransform(const LayerImpl* layer, 874 gfx::Transform DrawTransform(const LayerImpl* layer,
871 const TransformTree& tree) { 875 const TransformTree& tree) {
872 const TransformNode* node = tree.Node(layer->transform_tree_index()); 876 const TransformNode* node = tree.Node(layer->transform_tree_index());
873 gfx::Transform xform; 877 gfx::Transform xform;
874 const bool owns_non_root_surface = 878 const bool owns_non_root_surface =
875 !IsRootLayer(layer) && layer->has_render_surface(); 879 !IsRootLayer(layer) && layer->has_render_surface();
876 if (!owns_non_root_surface) { 880 if (!owns_non_root_surface) {
877 // If you're not the root, or you don't own a surface, you need to apply 881 // If you're not the root, or you don't own a surface, you need to apply
878 // your local offset. 882 // your local offset.
879 xform = node->data.to_target; 883 xform = tree.ToTarget(layer->transform_tree_index());
880 if (layer->should_flatten_transform_from_property_tree()) 884 if (layer->should_flatten_transform_from_property_tree())
881 xform.FlattenTo2d(); 885 xform.FlattenTo2d();
882 xform.Translate(layer->offset_to_transform_parent().x(), 886 xform.Translate(layer->offset_to_transform_parent().x(),
883 layer->offset_to_transform_parent().y()); 887 layer->offset_to_transform_parent().y());
884 } else { 888 } else {
885 // Surfaces need to apply their sublayer scale. 889 // Surfaces need to apply their sublayer scale.
886 xform.Scale(node->data.sublayer_scale.x(), node->data.sublayer_scale.y()); 890 xform.Scale(node->data.sublayer_scale.x(), node->data.sublayer_scale.y());
887 } 891 }
888 return xform; 892 return xform;
889 } 893 }
890 894
891 static void SetSurfaceDrawTransform(const TransformTree& tree, 895 static void SetSurfaceDrawTransform(const TransformTree& tree,
892 RenderSurfaceImpl* render_surface) { 896 RenderSurfaceImpl* render_surface) {
893 const TransformNode* node = tree.Node(render_surface->TransformTreeIndex()); 897 const TransformNode* node = tree.Node(render_surface->TransformTreeIndex());
894 // The draw transform of root render surface is identity tranform. 898 // The draw transform of root render surface is identity tranform.
895 if (node->id == 1) { 899 if (node->id == 1) {
896 render_surface->SetDrawTransform(gfx::Transform()); 900 render_surface->SetDrawTransform(gfx::Transform());
897 return; 901 return;
898 } 902 }
899 903
900 gfx::Transform render_surface_transform; 904 gfx::Transform render_surface_transform;
901 const TransformNode* target_node = tree.Node(node->data.target_id); 905 const TransformNode* target_node = tree.Node(tree.TargetId(node->id));
902 tree.ComputeTransformWithDestinationSublayerScale(node->id, target_node->id, 906 tree.ComputeTransformWithDestinationSublayerScale(node->id, target_node->id,
903 &render_surface_transform); 907 &render_surface_transform);
904 if (node->data.sublayer_scale.x() != 0.0 && 908 if (node->data.sublayer_scale.x() != 0.0 &&
905 node->data.sublayer_scale.y() != 0.0) 909 node->data.sublayer_scale.y() != 0.0)
906 render_surface_transform.Scale(1.0 / node->data.sublayer_scale.x(), 910 render_surface_transform.Scale(1.0 / node->data.sublayer_scale.x(),
907 1.0 / node->data.sublayer_scale.y()); 911 1.0 / node->data.sublayer_scale.y());
908 render_surface->SetDrawTransform(render_surface_transform); 912 render_surface->SetDrawTransform(render_surface_transform);
909 } 913 }
910 914
911 static void SetSurfaceIsClipped(const ClipNode* clip_node, 915 static void SetSurfaceIsClipped(const ClipNode* clip_node,
912 RenderSurfaceImpl* render_surface) { 916 RenderSurfaceImpl* render_surface) {
913 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id) 917 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id)
914 << "we now create clip node for every render surface"; 918 << "we now create clip node for every render surface";
915 919
916 render_surface->SetIsClipped(clip_node->data.target_is_clipped); 920 render_surface->SetIsClipped(clip_node->data.target_is_clipped);
917 } 921 }
918 922
919 static void SetSurfaceClipRect(const ClipNode* parent_clip_node, 923 static void SetSurfaceClipRect(const ClipNode* parent_clip_node,
920 const TransformTree& transform_tree, 924 const TransformTree& transform_tree,
921 RenderSurfaceImpl* render_surface) { 925 RenderSurfaceImpl* render_surface) {
922 if (!render_surface->is_clipped()) { 926 if (!render_surface->is_clipped()) {
923 render_surface->SetClipRect(gfx::Rect()); 927 render_surface->SetClipRect(gfx::Rect());
924 return; 928 return;
925 } 929 }
926 930
927 const TransformNode* transform_node = 931 const TransformNode* transform_node =
928 transform_tree.Node(render_surface->TransformTreeIndex()); 932 transform_tree.Node(render_surface->TransformTreeIndex());
929 if (transform_node->data.target_id == parent_clip_node->data.target_id) { 933 if (transform_tree.TargetId(transform_node->id) ==
934 parent_clip_node->data.target_id) {
930 render_surface->SetClipRect( 935 render_surface->SetClipRect(
931 gfx::ToEnclosingRect(parent_clip_node->data.clip_in_target_space)); 936 gfx::ToEnclosingRect(parent_clip_node->data.clip_in_target_space));
932 return; 937 return;
933 } 938 }
934 939
935 // In this case, the clip child has reset the clip node for subtree and hence 940 // In this case, the clip child has reset the clip node for subtree and hence
936 // the parent clip node's clip rect is in clip parent's target space and not 941 // the parent clip node's clip rect is in clip parent's target space and not
937 // our target space. We need to transform it to our target space. 942 // our target space. We need to transform it to our target space.
938 gfx::Transform clip_parent_target_to_target; 943 gfx::Transform clip_parent_target_to_target;
939 const bool success = 944 const bool success =
940 transform_tree.ComputeTransformWithDestinationSublayerScale( 945 transform_tree.ComputeTransformWithDestinationSublayerScale(
941 parent_clip_node->data.target_id, transform_node->data.target_id, 946 parent_clip_node->data.target_id,
947 transform_tree.TargetId(transform_node->id),
942 &clip_parent_target_to_target); 948 &clip_parent_target_to_target);
943 949
944 if (!success) { 950 if (!success) {
945 render_surface->SetClipRect(gfx::Rect()); 951 render_surface->SetClipRect(gfx::Rect());
946 return; 952 return;
947 } 953 }
948 954
949 DCHECK_LT(parent_clip_node->data.target_id, transform_node->data.target_id); 955 DCHECK_LT(parent_clip_node->data.target_id,
956 transform_tree.TargetId(transform_node->id));
950 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( 957 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
951 clip_parent_target_to_target, 958 clip_parent_target_to_target,
952 parent_clip_node->data.clip_in_target_space))); 959 parent_clip_node->data.clip_in_target_space)));
953 } 960 }
954 961
955 template <typename LayerType> 962 template <typename LayerType>
956 static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer, 963 static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer,
957 const TransformNode* node) { 964 const TransformTree& tree) {
958 gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(), 965 gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(),
959 layer->offset_to_transform_parent().y()); 966 layer->offset_to_transform_parent().y());
960 gfx::Transform ssxform = node->data.to_screen; 967 gfx::Transform ssxform = tree.ToScreen(layer->transform_tree_index());
961 xform.ConcatTransform(ssxform); 968 xform.ConcatTransform(ssxform);
962 if (layer->should_flatten_transform_from_property_tree()) 969 if (layer->should_flatten_transform_from_property_tree())
963 xform.FlattenTo2d(); 970 xform.FlattenTo2d();
964 return xform; 971 return xform;
965 } 972 }
966 973
967 gfx::Transform ScreenSpaceTransform(const Layer* layer, 974 gfx::Transform ScreenSpaceTransform(const Layer* layer,
968 const TransformTree& tree) { 975 const TransformTree& tree) {
969 return ScreenSpaceTransformInternal(layer, 976 return ScreenSpaceTransformInternal(layer, tree);
970 tree.Node(layer->transform_tree_index()));
971 } 977 }
972 978
973 gfx::Transform ScreenSpaceTransform(const LayerImpl* layer, 979 gfx::Transform ScreenSpaceTransform(const LayerImpl* layer,
974 const TransformTree& tree) { 980 const TransformTree& tree) {
975 return ScreenSpaceTransformInternal(layer, 981 return ScreenSpaceTransformInternal(layer, tree);
976 tree.Node(layer->transform_tree_index()));
977 } 982 }
978 983
979 static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) { 984 static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) {
980 if (!layer->render_target()) 985 if (!layer->render_target())
981 return 0.f; 986 return 0.f;
982 987
983 const EffectNode* target_node = 988 const EffectNode* target_node =
984 tree.Node(layer->render_target()->EffectTreeIndex()); 989 tree.Node(layer->render_target()->EffectTreeIndex());
985 const EffectNode* node = tree.Node(layer->effect_tree_index()); 990 const EffectNode* node = tree.Node(layer->effect_tree_index());
986 if (node == target_node) 991 if (node == target_node)
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 bool layers_always_allowed_lcd_text, 1079 bool layers_always_allowed_lcd_text,
1075 bool can_use_lcd_text) { 1080 bool can_use_lcd_text) {
1076 const TransformNode* transform_node = 1081 const TransformNode* transform_node =
1077 property_trees->transform_tree.Node(layer->transform_tree_index()); 1082 property_trees->transform_tree.Node(layer->transform_tree_index());
1078 const EffectNode* effect_node = 1083 const EffectNode* effect_node =
1079 property_trees->effect_tree.Node(layer->effect_tree_index()); 1084 property_trees->effect_tree.Node(layer->effect_tree_index());
1080 const ClipNode* clip_node = 1085 const ClipNode* clip_node =
1081 property_trees->clip_tree.Node(layer->clip_tree_index()); 1086 property_trees->clip_tree.Node(layer->clip_tree_index());
1082 1087
1083 layer->draw_properties().screen_space_transform = 1088 layer->draw_properties().screen_space_transform =
1084 ScreenSpaceTransformInternal(layer, transform_node); 1089 ScreenSpaceTransformInternal(layer, property_trees->transform_tree);
1085 if (property_trees->non_root_surfaces_enabled) { 1090 if (property_trees->non_root_surfaces_enabled) {
1086 layer->draw_properties().target_space_transform = 1091 layer->draw_properties().target_space_transform =
1087 DrawTransform(layer, property_trees->transform_tree); 1092 DrawTransform(layer, property_trees->transform_tree);
1088 } else { 1093 } else {
1089 layer->draw_properties().target_space_transform = 1094 layer->draw_properties().target_space_transform =
1090 layer->draw_properties().screen_space_transform; 1095 layer->draw_properties().screen_space_transform;
1091 } 1096 }
1092 layer->draw_properties().screen_space_transform_is_animating = 1097 layer->draw_properties().screen_space_transform_is_animating =
1093 transform_node->data.to_screen_is_potentially_animated; 1098 transform_node->data.to_screen_is_potentially_animated;
1094 if (layer->layer_tree_impl() 1099 if (layer->layer_tree_impl()
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1246 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1251 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1247 const Layer* overscroll_elasticity_layer, 1252 const Layer* overscroll_elasticity_layer,
1248 const gfx::Vector2dF& elastic_overscroll) { 1253 const gfx::Vector2dF& elastic_overscroll) {
1249 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1254 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1250 elastic_overscroll); 1255 elastic_overscroll);
1251 } 1256 }
1252 1257
1253 } // namespace draw_property_utils 1258 } // namespace draw_property_utils
1254 1259
1255 } // namespace cc 1260 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/trees/property_tree.h » ('j') | cc/trees/property_tree.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698