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

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

Issue 2105673003: cc: Compute animation scale on demand (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compile error Created 4 years, 5 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
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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 node_and_ancestors_are_flat(true), 172 node_and_ancestors_are_flat(true),
173 node_and_ancestors_have_only_integer_translation(true), 173 node_and_ancestors_have_only_integer_translation(true),
174 scrolls(false), 174 scrolls(false),
175 needs_sublayer_scale(false), 175 needs_sublayer_scale(false),
176 affected_by_inner_viewport_bounds_delta_x(false), 176 affected_by_inner_viewport_bounds_delta_x(false),
177 affected_by_inner_viewport_bounds_delta_y(false), 177 affected_by_inner_viewport_bounds_delta_y(false),
178 affected_by_outer_viewport_bounds_delta_x(false), 178 affected_by_outer_viewport_bounds_delta_x(false),
179 affected_by_outer_viewport_bounds_delta_y(false), 179 affected_by_outer_viewport_bounds_delta_y(false),
180 in_subtree_of_page_scale_layer(false), 180 in_subtree_of_page_scale_layer(false),
181 transform_changed(false), 181 transform_changed(false),
182 post_local_scale_factor(1.0f), 182 post_local_scale_factor(1.0f) {}
183 local_maximum_animation_target_scale(0.f),
184 local_starting_animation_scale(0.f),
185 combined_maximum_animation_target_scale(0.f),
186 combined_starting_animation_scale(0.f) {}
187 183
188 TransformNodeData::TransformNodeData(const TransformNodeData& other) = default; 184 TransformNodeData::TransformNodeData(const TransformNodeData& other) = default;
189 185
190 TransformNodeData::~TransformNodeData() { 186 TransformNodeData::~TransformNodeData() {
191 } 187 }
192 188
193 bool TransformNodeData::operator==(const TransformNodeData& other) const { 189 bool TransformNodeData::operator==(const TransformNodeData& other) const {
194 return pre_local == other.pre_local && local == other.local && 190 return pre_local == other.pre_local && local == other.local &&
195 post_local == other.post_local && to_parent == other.to_parent && 191 post_local == other.post_local && to_parent == other.to_parent &&
196 source_node_id == other.source_node_id && 192 source_node_id == other.source_node_id &&
(...skipping 21 matching lines...) Expand all
218 affected_by_inner_viewport_bounds_delta_y == 214 affected_by_inner_viewport_bounds_delta_y ==
219 other.affected_by_inner_viewport_bounds_delta_y && 215 other.affected_by_inner_viewport_bounds_delta_y &&
220 affected_by_outer_viewport_bounds_delta_x == 216 affected_by_outer_viewport_bounds_delta_x ==
221 other.affected_by_outer_viewport_bounds_delta_x && 217 other.affected_by_outer_viewport_bounds_delta_x &&
222 affected_by_outer_viewport_bounds_delta_y == 218 affected_by_outer_viewport_bounds_delta_y ==
223 other.affected_by_outer_viewport_bounds_delta_y && 219 other.affected_by_outer_viewport_bounds_delta_y &&
224 in_subtree_of_page_scale_layer == 220 in_subtree_of_page_scale_layer ==
225 other.in_subtree_of_page_scale_layer && 221 other.in_subtree_of_page_scale_layer &&
226 transform_changed == other.transform_changed && 222 transform_changed == other.transform_changed &&
227 post_local_scale_factor == other.post_local_scale_factor && 223 post_local_scale_factor == other.post_local_scale_factor &&
228 local_maximum_animation_target_scale ==
229 other.local_maximum_animation_target_scale &&
230 local_starting_animation_scale ==
231 other.local_starting_animation_scale &&
232 combined_maximum_animation_target_scale ==
233 other.combined_maximum_animation_target_scale &&
234 combined_starting_animation_scale ==
235 other.combined_starting_animation_scale &&
236 sublayer_scale == other.sublayer_scale && 224 sublayer_scale == other.sublayer_scale &&
237 scroll_offset == other.scroll_offset && 225 scroll_offset == other.scroll_offset &&
238 scroll_snap == other.scroll_snap && 226 scroll_snap == other.scroll_snap &&
239 source_offset == other.source_offset && 227 source_offset == other.source_offset &&
240 source_to_parent == other.source_to_parent; 228 source_to_parent == other.source_to_parent;
241 } 229 }
242 230
243 void TransformNodeData::update_pre_local_transform( 231 void TransformNodeData::update_pre_local_transform(
244 const gfx::Point3F& transform_origin) { 232 const gfx::Point3F& transform_origin) {
245 pre_local.MakeIdentity(); 233 pre_local.MakeIdentity();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 data->set_affected_by_inner_viewport_bounds_delta_y( 287 data->set_affected_by_inner_viewport_bounds_delta_y(
300 affected_by_inner_viewport_bounds_delta_y); 288 affected_by_inner_viewport_bounds_delta_y);
301 data->set_affected_by_outer_viewport_bounds_delta_x( 289 data->set_affected_by_outer_viewport_bounds_delta_x(
302 affected_by_outer_viewport_bounds_delta_x); 290 affected_by_outer_viewport_bounds_delta_x);
303 data->set_affected_by_outer_viewport_bounds_delta_y( 291 data->set_affected_by_outer_viewport_bounds_delta_y(
304 affected_by_outer_viewport_bounds_delta_y); 292 affected_by_outer_viewport_bounds_delta_y);
305 293
306 data->set_in_subtree_of_page_scale_layer(in_subtree_of_page_scale_layer); 294 data->set_in_subtree_of_page_scale_layer(in_subtree_of_page_scale_layer);
307 data->set_transform_changed(transform_changed); 295 data->set_transform_changed(transform_changed);
308 data->set_post_local_scale_factor(post_local_scale_factor); 296 data->set_post_local_scale_factor(post_local_scale_factor);
309 data->set_local_maximum_animation_target_scale(
310 local_maximum_animation_target_scale);
311 data->set_local_starting_animation_scale(local_starting_animation_scale);
312 data->set_combined_maximum_animation_target_scale(
313 combined_maximum_animation_target_scale);
314 data->set_combined_starting_animation_scale(
315 combined_starting_animation_scale);
316 297
317 Vector2dFToProto(sublayer_scale, data->mutable_sublayer_scale()); 298 Vector2dFToProto(sublayer_scale, data->mutable_sublayer_scale());
318 ScrollOffsetToProto(scroll_offset, data->mutable_scroll_offset()); 299 ScrollOffsetToProto(scroll_offset, data->mutable_scroll_offset());
319 Vector2dFToProto(scroll_snap, data->mutable_scroll_snap()); 300 Vector2dFToProto(scroll_snap, data->mutable_scroll_snap());
320 Vector2dFToProto(source_offset, data->mutable_source_offset()); 301 Vector2dFToProto(source_offset, data->mutable_source_offset());
321 Vector2dFToProto(source_to_parent, data->mutable_source_to_parent()); 302 Vector2dFToProto(source_to_parent, data->mutable_source_to_parent());
322 } 303 }
323 304
324 void TransformNodeData::FromProtobuf(const proto::TreeNode& proto) { 305 void TransformNodeData::FromProtobuf(const proto::TreeNode& proto) {
325 DCHECK(proto.has_transform_node_data()); 306 DCHECK(proto.has_transform_node_data());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 affected_by_inner_viewport_bounds_delta_y = 342 affected_by_inner_viewport_bounds_delta_y =
362 data.affected_by_inner_viewport_bounds_delta_y(); 343 data.affected_by_inner_viewport_bounds_delta_y();
363 affected_by_outer_viewport_bounds_delta_x = 344 affected_by_outer_viewport_bounds_delta_x =
364 data.affected_by_outer_viewport_bounds_delta_x(); 345 data.affected_by_outer_viewport_bounds_delta_x();
365 affected_by_outer_viewport_bounds_delta_y = 346 affected_by_outer_viewport_bounds_delta_y =
366 data.affected_by_outer_viewport_bounds_delta_y(); 347 data.affected_by_outer_viewport_bounds_delta_y();
367 348
368 in_subtree_of_page_scale_layer = data.in_subtree_of_page_scale_layer(); 349 in_subtree_of_page_scale_layer = data.in_subtree_of_page_scale_layer();
369 transform_changed = data.transform_changed(); 350 transform_changed = data.transform_changed();
370 post_local_scale_factor = data.post_local_scale_factor(); 351 post_local_scale_factor = data.post_local_scale_factor();
371 local_maximum_animation_target_scale =
372 data.local_maximum_animation_target_scale();
373 local_starting_animation_scale = data.local_starting_animation_scale();
374 combined_maximum_animation_target_scale =
375 data.combined_maximum_animation_target_scale();
376 combined_starting_animation_scale = data.combined_starting_animation_scale();
377 352
378 sublayer_scale = ProtoToVector2dF(data.sublayer_scale()); 353 sublayer_scale = ProtoToVector2dF(data.sublayer_scale());
379 scroll_offset = ProtoToScrollOffset(data.scroll_offset()); 354 scroll_offset = ProtoToScrollOffset(data.scroll_offset());
380 scroll_snap = ProtoToVector2dF(data.scroll_snap()); 355 scroll_snap = ProtoToVector2dF(data.scroll_snap());
381 source_offset = ProtoToVector2dF(data.source_offset()); 356 source_offset = ProtoToVector2dF(data.source_offset());
382 source_to_parent = ProtoToVector2dF(data.source_to_parent()); 357 source_to_parent = ProtoToVector2dF(data.source_to_parent());
383 } 358 }
384 359
385 void TransformNodeData::AsValueInto( 360 void TransformNodeData::AsValueInto(
386 base::trace_event::TracedValue* value) const { 361 base::trace_event::TracedValue* value) const {
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 706
732 void TransformTree::clear() { 707 void TransformTree::clear() {
733 PropertyTree<TransformNode>::clear(); 708 PropertyTree<TransformNode>::clear();
734 709
735 nodes_affected_by_inner_viewport_bounds_delta_.clear(); 710 nodes_affected_by_inner_viewport_bounds_delta_.clear();
736 nodes_affected_by_outer_viewport_bounds_delta_.clear(); 711 nodes_affected_by_outer_viewport_bounds_delta_.clear();
737 cached_data_.clear(); 712 cached_data_.clear();
738 cached_data_.push_back(TransformCachedNodeData()); 713 cached_data_.push_back(TransformCachedNodeData());
739 } 714 }
740 715
716 void TransformTree::set_needs_update(bool needs_update) {
717 if (needs_update && !PropertyTree::needs_update())
718 property_trees()->UpdateCachedNumber();
jaydasika 2016/06/28 23:08:40 Should be invalidate the cache as soon as we set_n
sunxd 2016/06/30 15:29:43 Hmm, that depends on whether we get animation scal
719 PropertyTree::set_needs_update(needs_update);
720 }
721
741 bool TransformTree::ComputeTransform(int source_id, 722 bool TransformTree::ComputeTransform(int source_id,
742 int dest_id, 723 int dest_id,
743 gfx::Transform* transform) const { 724 gfx::Transform* transform) const {
744 transform->MakeIdentity(); 725 transform->MakeIdentity();
745 726
746 if (source_id == dest_id) 727 if (source_id == dest_id)
747 return true; 728 return true;
748 729
749 if (source_id > dest_id) { 730 if (source_id > dest_id) {
750 return CombineTransformsBetween(source_id, dest_id, transform); 731 return CombineTransformsBetween(source_id, dest_id, transform);
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1053 if (!target_space_transform.GetInverse(&from_target)) 1034 if (!target_space_transform.GetInverse(&from_target))
1054 node->data.ancestors_are_invertible = false; 1035 node->data.ancestors_are_invertible = false;
1055 SetToTarget(node->id, target_space_transform); 1036 SetToTarget(node->id, target_space_transform);
1056 SetFromTarget(node->id, from_target); 1037 SetFromTarget(node->id, from_target);
1057 } 1038 }
1058 1039
1059 void TransformTree::UpdateAnimationProperties(TransformNode* node, 1040 void TransformTree::UpdateAnimationProperties(TransformNode* node,
1060 TransformNode* parent_node) { 1041 TransformNode* parent_node) {
1061 bool ancestor_is_animating = false; 1042 bool ancestor_is_animating = false;
1062 bool ancestor_is_animating_scale = false; 1043 bool ancestor_is_animating_scale = false;
1063 float ancestor_maximum_target_scale = 0.f;
1064 float ancestor_starting_animation_scale = 0.f;
1065 if (parent_node) { 1044 if (parent_node) {
1066 ancestor_is_animating = parent_node->data.to_screen_is_potentially_animated; 1045 ancestor_is_animating = parent_node->data.to_screen_is_potentially_animated;
1067 ancestor_is_animating_scale = 1046 ancestor_is_animating_scale =
1068 parent_node->data.to_screen_has_scale_animation; 1047 parent_node->data.to_screen_has_scale_animation;
1069 ancestor_maximum_target_scale =
1070 parent_node->data.combined_maximum_animation_target_scale;
1071 ancestor_starting_animation_scale =
1072 parent_node->data.combined_starting_animation_scale;
1073 } 1048 }
1074 node->data.to_screen_is_potentially_animated = 1049 node->data.to_screen_is_potentially_animated =
1075 node->data.has_potential_animation || ancestor_is_animating; 1050 node->data.has_potential_animation || ancestor_is_animating;
1076 node->data.to_screen_has_scale_animation = 1051 node->data.to_screen_has_scale_animation =
1077 !node->data.has_only_translation_animations || 1052 !node->data.has_only_translation_animations ||
1078 ancestor_is_animating_scale; 1053 ancestor_is_animating_scale;
1079
1080 // Once we've failed to compute a maximum animated scale at an ancestor, we
1081 // continue to fail.
1082 bool failed_at_ancestor =
jaydasika 2016/06/28 23:08:40 Can we move comments to GetAnimationScales ?
sunxd 2016/06/30 15:29:44 Done.
1083 ancestor_is_animating_scale && ancestor_maximum_target_scale == 0.f;
1084
1085 // Computing maximum animated scale in the presence of non-scale/translation
1086 // transforms isn't supported.
1087 bool failed_for_non_scale_or_translation =
1088 !ToTarget(node->id).IsScaleOrTranslation();
1089
1090 // We don't attempt to accumulate animation scale from multiple nodes with
1091 // scale animations, because of the risk of significant overestimation. For
1092 // example, one node might be increasing scale from 1 to 10 at the same time
1093 // as another node is decreasing scale from 10 to 1. Naively combining these
1094 // scales would produce a scale of 100.
1095 bool failed_for_multiple_scale_animations =
1096 ancestor_is_animating_scale &&
1097 !node->data.has_only_translation_animations;
1098
1099 if (failed_at_ancestor || failed_for_non_scale_or_translation ||
1100 failed_for_multiple_scale_animations) {
1101 node->data.combined_maximum_animation_target_scale = 0.f;
1102 node->data.combined_starting_animation_scale = 0.f;
1103
1104 // This ensures that descendants know we've failed to compute a maximum
1105 // animated scale.
1106 node->data.to_screen_has_scale_animation = true;
1107 return;
1108 }
1109
1110 if (!node->data.to_screen_has_scale_animation) {
1111 node->data.combined_maximum_animation_target_scale = 0.f;
1112 node->data.combined_starting_animation_scale = 0.f;
1113 return;
1114 }
1115
1116 // At this point, we know exactly one of this node or an ancestor is animating
1117 // scale.
1118 if (node->data.has_only_translation_animations) {
1119 // An ancestor is animating scale.
1120 gfx::Vector2dF local_scales =
1121 MathUtil::ComputeTransform2dScaleComponents(node->data.local, 0.f);
1122 float max_local_scale = std::max(local_scales.x(), local_scales.y());
1123 node->data.combined_maximum_animation_target_scale =
1124 max_local_scale * ancestor_maximum_target_scale;
1125 node->data.combined_starting_animation_scale =
1126 max_local_scale * ancestor_starting_animation_scale;
1127 return;
1128 }
1129
1130 if (node->data.local_starting_animation_scale == 0.f ||
1131 node->data.local_maximum_animation_target_scale == 0.f) {
1132 node->data.combined_maximum_animation_target_scale = 0.f;
1133 node->data.combined_starting_animation_scale = 0.f;
1134 return;
1135 }
1136
1137 gfx::Vector2dF ancestor_scales =
1138 parent_node ? MathUtil::ComputeTransform2dScaleComponents(
1139 ToTarget(parent_node->id), 0.f)
1140 : gfx::Vector2dF(1.f, 1.f);
1141 float max_ancestor_scale = std::max(ancestor_scales.x(), ancestor_scales.y());
1142 node->data.combined_maximum_animation_target_scale =
1143 max_ancestor_scale * node->data.local_maximum_animation_target_scale;
1144 node->data.combined_starting_animation_scale =
1145 max_ancestor_scale * node->data.local_starting_animation_scale;
1146 } 1054 }
1147 1055
1148 void TransformTree::UndoSnapping(TransformNode* node) { 1056 void TransformTree::UndoSnapping(TransformNode* node) {
1149 // to_parent transform has the scroll snap from previous frame baked in. 1057 // to_parent transform has the scroll snap from previous frame baked in.
1150 // We need to undo it and use the un-snapped transform to compute current 1058 // We need to undo it and use the un-snapped transform to compute current
1151 // target and screen space transforms. 1059 // target and screen space transforms.
1152 node->data.to_parent.Translate(-node->data.scroll_snap.x(), 1060 node->data.to_parent.Translate(-node->data.scroll_snap.x(),
1153 -node->data.scroll_snap.y()); 1061 -node->data.scroll_snap.y());
1154 } 1062 }
1155 1063
(...skipping 986 matching lines...) Expand 10 before | Expand all | Expand 10 after
2142 } 2050 }
2143 2051
2144 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( 2052 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits(
2145 gfx::ScrollOffset offset, 2053 gfx::ScrollOffset offset,
2146 ScrollNode* scroll_node) const { 2054 ScrollNode* scroll_node) const {
2147 offset.SetToMin(MaxScrollOffset(scroll_node->id)); 2055 offset.SetToMin(MaxScrollOffset(scroll_node->id));
2148 offset.SetToMax(gfx::ScrollOffset()); 2056 offset.SetToMax(gfx::ScrollOffset());
2149 return offset; 2057 return offset;
2150 } 2058 }
2151 2059
2060 PropertyTreesCachedData::PropertyTreesCachedData()
2061 : property_tree_update_number(0) {
2062 animation_scales.clear();
2063 }
2064
2065 PropertyTreesCachedData::~PropertyTreesCachedData() {}
2066
2152 PropertyTrees::PropertyTrees() 2067 PropertyTrees::PropertyTrees()
2153 : needs_rebuild(true), 2068 : needs_rebuild(true),
2154 non_root_surfaces_enabled(true), 2069 non_root_surfaces_enabled(true),
2155 changed(false), 2070 changed(false),
2156 full_tree_damaged(false), 2071 full_tree_damaged(false),
2157 sequence_number(0), 2072 sequence_number(0),
2158 is_main_thread(true), 2073 is_main_thread(true),
2159 is_active(false) { 2074 is_active(false) {
2160 transform_tree.SetPropertyTrees(this); 2075 transform_tree.SetPropertyTrees(this);
2161 effect_tree.SetPropertyTrees(this); 2076 effect_tree.SetPropertyTrees(this);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2204 inner_viewport_container_bounds_delta_ = 2119 inner_viewport_container_bounds_delta_ =
2205 from.inner_viewport_container_bounds_delta(); 2120 from.inner_viewport_container_bounds_delta();
2206 outer_viewport_container_bounds_delta_ = 2121 outer_viewport_container_bounds_delta_ =
2207 from.outer_viewport_container_bounds_delta(); 2122 from.outer_viewport_container_bounds_delta();
2208 inner_viewport_scroll_bounds_delta_ = 2123 inner_viewport_scroll_bounds_delta_ =
2209 from.inner_viewport_scroll_bounds_delta(); 2124 from.inner_viewport_scroll_bounds_delta();
2210 transform_tree.SetPropertyTrees(this); 2125 transform_tree.SetPropertyTrees(this);
2211 effect_tree.SetPropertyTrees(this); 2126 effect_tree.SetPropertyTrees(this);
2212 clip_tree.SetPropertyTrees(this); 2127 clip_tree.SetPropertyTrees(this);
2213 scroll_tree.SetPropertyTrees(this); 2128 scroll_tree.SetPropertyTrees(this);
2129 ResetCachedData();
2214 return *this; 2130 return *this;
2215 } 2131 }
2216 2132
2217 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const { 2133 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const {
2218 // TODO(khushalsagar): Add support for sending diffs when serializaing 2134 // TODO(khushalsagar): Add support for sending diffs when serializaing
2219 // property trees. See crbug/555370. 2135 // property trees. See crbug/555370.
2220 transform_tree.ToProtobuf(proto->mutable_transform_tree()); 2136 transform_tree.ToProtobuf(proto->mutable_transform_tree());
2221 effect_tree.ToProtobuf(proto->mutable_effect_tree()); 2137 effect_tree.ToProtobuf(proto->mutable_effect_tree());
2222 clip_tree.ToProtobuf(proto->mutable_clip_tree()); 2138 clip_tree.ToProtobuf(proto->mutable_clip_tree());
2223 scroll_tree.ToProtobuf(proto->mutable_scroll_tree()); 2139 scroll_tree.ToProtobuf(proto->mutable_scroll_tree());
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
2386 clip_tree.AsValueInto(value.get()); 2302 clip_tree.AsValueInto(value.get());
2387 value->EndDictionary(); 2303 value->EndDictionary();
2388 2304
2389 value->BeginDictionary("scroll_tree"); 2305 value->BeginDictionary("scroll_tree");
2390 scroll_tree.AsValueInto(value.get()); 2306 scroll_tree.AsValueInto(value.get());
2391 value->EndDictionary(); 2307 value->EndDictionary();
2392 2308
2393 return value; 2309 return value;
2394 } 2310 }
2395 2311
2312 CombinedAnimationScale PropertyTrees::GetAnimationScales(
2313 int transform_node_id,
2314 LayerTreeImpl* layer_tree_impl) {
2315 if (cached_data_.animation_scales[transform_node_id].update_number !=
2316 cached_data_.property_tree_update_number) {
2317 TransformNode* node = transform_tree.Node(transform_node_id);
2318 TransformNode* parent_node = transform_tree.parent(node);
2319 bool ancestor_is_animating_scale = false;
2320 float ancestor_maximum_target_scale = 0.f;
2321 float ancestor_starting_animation_scale = 0.f;
2322 if (parent_node) {
2323 ancestor_is_animating_scale =
2324 parent_node->data.to_screen_has_scale_animation;
2325 CombinedAnimationScale combined_animation_scale = GetAnimationScales(
2326 transform_tree.Node(transform_node_id)->parent_id, layer_tree_impl);
2327 ancestor_maximum_target_scale =
2328 combined_animation_scale.maximum_animation_scale;
2329 ancestor_starting_animation_scale =
2330 combined_animation_scale.starting_animation_scale;
2331 }
2332
2333 bool failed_at_ancestor =
2334 ancestor_is_animating_scale && ancestor_maximum_target_scale == 0.f;
2335 bool failed_for_non_scale_or_translation =
2336 !transform_tree.ToTarget(transform_node_id).IsScaleOrTranslation();
2337 bool failed_for_multiple_scale_animations =
2338 ancestor_is_animating_scale &&
2339 !node->data.has_only_translation_animations;
2340
2341 if (failed_at_ancestor || failed_for_non_scale_or_translation ||
2342 failed_for_multiple_scale_animations) {
2343 node->data.to_screen_has_scale_animation = true;
2344 cached_data_.animation_scales[transform_node_id]
2345 .combined_maximum_animation_target_scale = 0.f;
2346 cached_data_.animation_scales[transform_node_id]
2347 .combined_starting_animation_scale = 0.f;
2348 } else if (!node->data.to_screen_has_scale_animation) {
2349 cached_data_.animation_scales[transform_node_id]
2350 .combined_maximum_animation_target_scale = 0.f;
2351 cached_data_.animation_scales[transform_node_id]
2352 .combined_starting_animation_scale = 0.f;
2353 } else if (node->data.has_only_translation_animations) {
2354 gfx::Vector2dF local_scales =
2355 MathUtil::ComputeTransform2dScaleComponents(node->data.local, 0.f);
2356 float max_local_scale = std::max(local_scales.x(), local_scales.y());
2357 cached_data_.animation_scales[transform_node_id]
2358 .combined_maximum_animation_target_scale =
2359 max_local_scale * ancestor_maximum_target_scale;
2360 cached_data_.animation_scales[transform_node_id]
2361 .combined_starting_animation_scale =
2362 max_local_scale * ancestor_starting_animation_scale;
2363 } else {
2364 LayerImpl* layer_impl = layer_tree_impl->LayerById(node->owner_id);
2365 layer_tree_impl->MaximumTargetScale(
2366 layer_impl, &cached_data_.animation_scales[transform_node_id]
2367 .local_maximum_animation_target_scale);
2368 layer_tree_impl->AnimationStartScale(
2369 layer_impl, &cached_data_.animation_scales[transform_node_id]
2370 .local_starting_animation_scale);
2371 gfx::Vector2dF local_scales =
2372 MathUtil::ComputeTransform2dScaleComponents(node->data.local, 0.f);
2373 float max_local_scale = std::max(local_scales.x(), local_scales.y());
2374
2375 if (cached_data_.animation_scales[transform_node_id]
2376 .local_starting_animation_scale == 0.f ||
2377 cached_data_.animation_scales[transform_node_id]
2378 .local_maximum_animation_target_scale == 0.f) {
2379 cached_data_.animation_scales[transform_node_id]
2380 .combined_maximum_animation_target_scale =
2381 max_local_scale * ancestor_maximum_target_scale;
2382 cached_data_.animation_scales[transform_node_id]
2383 .combined_starting_animation_scale =
2384 max_local_scale * ancestor_starting_animation_scale;
2385 } else {
2386 gfx::Vector2dF ancestor_scales =
2387 parent_node ? MathUtil::ComputeTransform2dScaleComponents(
2388 transform_tree.ToTarget(parent_node->id), 0.f)
2389 : gfx::Vector2dF(1.f, 1.f);
2390 float max_ancestor_scale =
2391 std::max(ancestor_scales.x(), ancestor_scales.y());
2392 cached_data_.animation_scales[transform_node_id]
2393 .combined_maximum_animation_target_scale =
2394 max_ancestor_scale *
2395 cached_data_.animation_scales[transform_node_id]
2396 .local_maximum_animation_target_scale;
2397 cached_data_.animation_scales[transform_node_id]
2398 .combined_starting_animation_scale =
2399 max_ancestor_scale *
2400 cached_data_.animation_scales[transform_node_id]
2401 .local_starting_animation_scale;
2402 }
2403 }
2404 cached_data_.animation_scales[transform_node_id].update_number =
2405 cached_data_.property_tree_update_number;
2406 }
2407 return CombinedAnimationScale(cached_data_.animation_scales[transform_node_id]
2408 .combined_maximum_animation_target_scale,
2409 cached_data_.animation_scales[transform_node_id]
2410 .combined_starting_animation_scale);
2411 }
2412
2413 void PropertyTrees::SetAnimationScalesForTesting(
2414 int transform_id,
2415 float maximum_animation_scale,
2416 float starting_animation_scale) {
2417 cached_data_.animation_scales[transform_id]
2418 .combined_maximum_animation_target_scale = maximum_animation_scale;
2419 cached_data_.animation_scales[transform_id]
2420 .combined_starting_animation_scale = starting_animation_scale;
2421 cached_data_.animation_scales[transform_id].update_number =
2422 cached_data_.property_tree_update_number;
2423 }
2424
2425 void PropertyTrees::ResetCachedData() {
2426 cached_data_.property_tree_update_number = 0;
2427 cached_data_.animation_scales = std::vector<AnimationScaleData>(
2428 transform_tree.nodes().size(), AnimationScaleData());
2429 }
2430
2431 void PropertyTrees::UpdateCachedNumber() {
2432 cached_data_.property_tree_update_number++;
2433 }
2434
jaydasika 2016/06/28 23:08:40 Add cached_data_ to PropertyTrees::operator==
sunxd 2016/06/30 15:29:43 I think cached_data_ should be considered separate
2396 } // namespace cc 2435 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698