OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 #include "platform/animation/TimingFunction.h" | 66 #include "platform/animation/TimingFunction.h" |
67 #include "platform/wtf/HashSet.h" | 67 #include "platform/wtf/HashSet.h" |
68 #include "public/platform/Platform.h" | 68 #include "public/platform/Platform.h" |
69 | 69 |
70 namespace blink { | 70 namespace blink { |
71 | 71 |
72 using PropertySet = HashSet<CSSPropertyID>; | 72 using PropertySet = HashSet<CSSPropertyID>; |
73 | 73 |
74 namespace { | 74 namespace { |
75 | 75 |
76 static StringKeyframeEffectModel* CreateKeyframeEffectModel( | 76 StringKeyframeEffectModel* CreateKeyframeEffectModel( |
77 StyleResolver* resolver, | 77 StyleResolver* resolver, |
78 const Element* animating_element, | 78 const Element* animating_element, |
79 Element& element, | 79 Element& element, |
80 const ComputedStyle* style, | 80 const ComputedStyle* style, |
81 const ComputedStyle* parent_style, | 81 const ComputedStyle* parent_style, |
82 const AtomicString& name, | 82 const AtomicString& name, |
83 TimingFunction* default_timing_function, | 83 TimingFunction* default_timing_function, |
84 size_t animation_index) { | 84 size_t animation_index) { |
85 // When the animating element is null, use its parent for scoping purposes. | 85 // When the animating element is null, use its parent for scoping purposes. |
86 const Element* element_for_scoping = | 86 const Element* element_for_scoping = |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 | 203 |
204 bool CSSAnimations::IsTransitionAnimationForInspector( | 204 bool CSSAnimations::IsTransitionAnimationForInspector( |
205 const Animation& animation) const { | 205 const Animation& animation) const { |
206 for (const auto& it : transitions_) { | 206 for (const auto& it : transitions_) { |
207 if (it.value.animation->SequenceNumber() == animation.SequenceNumber()) | 207 if (it.value.animation->SequenceNumber() == animation.SequenceNumber()) |
208 return true; | 208 return true; |
209 } | 209 } |
210 return false; | 210 return false; |
211 } | 211 } |
212 | 212 |
213 static const KeyframeEffectModelBase* GetKeyframeEffectModelBase( | 213 namespace { |
| 214 |
| 215 const KeyframeEffectModelBase* GetKeyframeEffectModelBase( |
214 const AnimationEffectReadOnly* effect) { | 216 const AnimationEffectReadOnly* effect) { |
215 if (!effect) | 217 if (!effect) |
216 return nullptr; | 218 return nullptr; |
217 const EffectModel* model = nullptr; | 219 const EffectModel* model = nullptr; |
218 if (effect->IsKeyframeEffectReadOnly()) | 220 if (effect->IsKeyframeEffectReadOnly()) |
219 model = ToKeyframeEffectReadOnly(effect)->Model(); | 221 model = ToKeyframeEffectReadOnly(effect)->Model(); |
220 else if (effect->IsInertEffect()) | 222 else if (effect->IsInertEffect()) |
221 model = ToInertEffect(effect)->Model(); | 223 model = ToInertEffect(effect)->Model(); |
222 if (!model || !model->IsKeyframeEffectModel()) | 224 if (!model || !model->IsKeyframeEffectModel()) |
223 return nullptr; | 225 return nullptr; |
224 return ToKeyframeEffectModelBase(model); | 226 return ToKeyframeEffectModelBase(model); |
225 } | 227 } |
226 | 228 |
| 229 } // namespace |
| 230 |
227 void CSSAnimations::CalculateCompositorAnimationUpdate( | 231 void CSSAnimations::CalculateCompositorAnimationUpdate( |
228 CSSAnimationUpdate& update, | 232 CSSAnimationUpdate& update, |
229 const Element* animating_element, | 233 const Element* animating_element, |
230 Element& element, | 234 Element& element, |
231 const ComputedStyle& style, | 235 const ComputedStyle& style, |
232 const ComputedStyle* parent_style, | 236 const ComputedStyle* parent_style, |
233 bool was_viewport_resized) { | 237 bool was_viewport_resized) { |
234 ElementAnimations* element_animations = | 238 ElementAnimations* element_animations = |
235 animating_element ? animating_element->GetElementAnimations() : nullptr; | 239 animating_element ? animating_element->GetElementAnimations() : nullptr; |
236 | 240 |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 for (const auto& entry : transitions_) { | 946 for (const auto& entry : transitions_) { |
943 entry.value.animation->cancel(); | 947 entry.value.animation->cancel(); |
944 entry.value.animation->Update(kTimingUpdateOnDemand); | 948 entry.value.animation->Update(kTimingUpdateOnDemand); |
945 } | 949 } |
946 | 950 |
947 running_animations_.clear(); | 951 running_animations_.clear(); |
948 transitions_.clear(); | 952 transitions_.clear(); |
949 ClearPendingUpdate(); | 953 ClearPendingUpdate(); |
950 } | 954 } |
951 | 955 |
952 static bool IsCustomPropertyHandle(const PropertyHandle& property) { | 956 namespace { |
| 957 |
| 958 bool IsCustomPropertyHandle(const PropertyHandle& property) { |
953 return property.IsCSSCustomProperty(); | 959 return property.IsCSSCustomProperty(); |
954 } | 960 } |
955 | 961 |
956 // TODO(alancutter): CSS properties and presentation attributes may have | 962 // TODO(alancutter): CSS properties and presentation attributes may have |
957 // identical effects. By grouping them in the same set we introduce a bug where | 963 // identical effects. By grouping them in the same set we introduce a bug where |
958 // arbitrary hash iteration will determine the order the apply in and thus which | 964 // arbitrary hash iteration will determine the order the apply in and thus which |
959 // one "wins". We should be more deliberate about the order of application in | 965 // one "wins". We should be more deliberate about the order of application in |
960 // the case of effect collisions. | 966 // the case of effect collisions. |
961 // Example: Both 'color' and 'svg-color' set the color on ComputedStyle but are | 967 // Example: Both 'color' and 'svg-color' set the color on ComputedStyle but are |
962 // considered distinct properties in the ActiveInterpolationsMap. | 968 // considered distinct properties in the ActiveInterpolationsMap. |
963 static bool IsStandardPropertyHandle(const PropertyHandle& property) { | 969 bool IsStandardPropertyHandle(const PropertyHandle& property) { |
964 return (property.IsCSSProperty() && !property.IsCSSCustomProperty()) || | 970 return (property.IsCSSProperty() && !property.IsCSSCustomProperty()) || |
965 property.IsPresentationAttribute(); | 971 property.IsPresentationAttribute(); |
966 } | 972 } |
967 | 973 |
968 static void AdoptActiveAnimationInterpolations( | 974 void AdoptActiveAnimationInterpolations( |
969 EffectStack* effect_stack, | 975 EffectStack* effect_stack, |
970 CSSAnimationUpdate& update, | 976 CSSAnimationUpdate& update, |
971 const HeapVector<Member<const InertEffect>>* new_animations, | 977 const HeapVector<Member<const InertEffect>>* new_animations, |
972 const HeapHashSet<Member<const Animation>>* suppressed_animations) { | 978 const HeapHashSet<Member<const Animation>>* suppressed_animations) { |
973 ActiveInterpolationsMap custom_interpolations( | 979 ActiveInterpolationsMap custom_interpolations( |
974 EffectStack::ActiveInterpolations( | 980 EffectStack::ActiveInterpolations( |
975 effect_stack, new_animations, suppressed_animations, | 981 effect_stack, new_animations, suppressed_animations, |
976 KeyframeEffectReadOnly::kDefaultPriority, IsCustomPropertyHandle)); | 982 KeyframeEffectReadOnly::kDefaultPriority, IsCustomPropertyHandle)); |
977 update.AdoptActiveInterpolationsForCustomAnimations(custom_interpolations); | 983 update.AdoptActiveInterpolationsForCustomAnimations(custom_interpolations); |
978 | 984 |
979 ActiveInterpolationsMap standard_interpolations( | 985 ActiveInterpolationsMap standard_interpolations( |
980 EffectStack::ActiveInterpolations( | 986 EffectStack::ActiveInterpolations( |
981 effect_stack, new_animations, suppressed_animations, | 987 effect_stack, new_animations, suppressed_animations, |
982 KeyframeEffectReadOnly::kDefaultPriority, IsStandardPropertyHandle)); | 988 KeyframeEffectReadOnly::kDefaultPriority, IsStandardPropertyHandle)); |
983 update.AdoptActiveInterpolationsForStandardAnimations( | 989 update.AdoptActiveInterpolationsForStandardAnimations( |
984 standard_interpolations); | 990 standard_interpolations); |
985 } | 991 } |
986 | 992 |
| 993 } // namespace |
| 994 |
987 void CSSAnimations::CalculateAnimationActiveInterpolations( | 995 void CSSAnimations::CalculateAnimationActiveInterpolations( |
988 CSSAnimationUpdate& update, | 996 CSSAnimationUpdate& update, |
989 const Element* animating_element) { | 997 const Element* animating_element) { |
990 ElementAnimations* element_animations = | 998 ElementAnimations* element_animations = |
991 animating_element ? animating_element->GetElementAnimations() : nullptr; | 999 animating_element ? animating_element->GetElementAnimations() : nullptr; |
992 EffectStack* effect_stack = | 1000 EffectStack* effect_stack = |
993 element_animations ? &element_animations->GetEffectStack() : nullptr; | 1001 element_animations ? &element_animations->GetEffectStack() : nullptr; |
994 | 1002 |
995 if (update.NewAnimations().IsEmpty() && | 1003 if (update.NewAnimations().IsEmpty() && |
996 update.SuppressedAnimations().IsEmpty()) { | 1004 update.SuppressedAnimations().IsEmpty()) { |
997 AdoptActiveAnimationInterpolations(effect_stack, update, nullptr, nullptr); | 1005 AdoptActiveAnimationInterpolations(effect_stack, update, nullptr, nullptr); |
998 return; | 1006 return; |
999 } | 1007 } |
1000 | 1008 |
1001 HeapVector<Member<const InertEffect>> new_effects; | 1009 HeapVector<Member<const InertEffect>> new_effects; |
1002 for (const auto& new_animation : update.NewAnimations()) | 1010 for (const auto& new_animation : update.NewAnimations()) |
1003 new_effects.push_back(new_animation.effect); | 1011 new_effects.push_back(new_animation.effect); |
1004 | 1012 |
1005 // Animations with updates use a temporary InertEffect for the current frame. | 1013 // Animations with updates use a temporary InertEffect for the current frame. |
1006 for (const auto& updated_animation : update.AnimationsWithUpdates()) | 1014 for (const auto& updated_animation : update.AnimationsWithUpdates()) |
1007 new_effects.push_back(updated_animation.effect); | 1015 new_effects.push_back(updated_animation.effect); |
1008 | 1016 |
1009 AdoptActiveAnimationInterpolations(effect_stack, update, &new_effects, | 1017 AdoptActiveAnimationInterpolations(effect_stack, update, &new_effects, |
1010 &update.SuppressedAnimations()); | 1018 &update.SuppressedAnimations()); |
1011 } | 1019 } |
1012 | 1020 |
1013 static EffectStack::PropertyHandleFilter PropertyFilter( | 1021 namespace { |
| 1022 |
| 1023 EffectStack::PropertyHandleFilter PropertyFilter( |
1014 CSSAnimations::PropertyPass property_pass) { | 1024 CSSAnimations::PropertyPass property_pass) { |
1015 if (property_pass == CSSAnimations::PropertyPass::kCustom) { | 1025 if (property_pass == CSSAnimations::PropertyPass::kCustom) { |
1016 return IsCustomPropertyHandle; | 1026 return IsCustomPropertyHandle; |
1017 } | 1027 } |
1018 DCHECK_EQ(property_pass, CSSAnimations::PropertyPass::kStandard); | 1028 DCHECK_EQ(property_pass, CSSAnimations::PropertyPass::kStandard); |
1019 return IsStandardPropertyHandle; | 1029 return IsStandardPropertyHandle; |
1020 } | 1030 } |
1021 | 1031 |
| 1032 } // namespace |
| 1033 |
1022 void CSSAnimations::CalculateTransitionActiveInterpolations( | 1034 void CSSAnimations::CalculateTransitionActiveInterpolations( |
1023 CSSAnimationUpdate& update, | 1035 CSSAnimationUpdate& update, |
1024 PropertyPass property_pass, | 1036 PropertyPass property_pass, |
1025 const Element* animating_element) { | 1037 const Element* animating_element) { |
1026 ElementAnimations* element_animations = | 1038 ElementAnimations* element_animations = |
1027 animating_element ? animating_element->GetElementAnimations() : nullptr; | 1039 animating_element ? animating_element->GetElementAnimations() : nullptr; |
1028 EffectStack* effect_stack = | 1040 EffectStack* effect_stack = |
1029 element_animations ? &element_animations->GetEffectStack() : nullptr; | 1041 element_animations ? &element_animations->GetEffectStack() : nullptr; |
1030 | 1042 |
1031 ActiveInterpolationsMap active_interpolations_for_transitions; | 1043 ActiveInterpolationsMap active_interpolations_for_transitions; |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1249 IsCustomPropertyHandle); | 1261 IsCustomPropertyHandle); |
1250 } | 1262 } |
1251 | 1263 |
1252 DEFINE_TRACE(CSSAnimations) { | 1264 DEFINE_TRACE(CSSAnimations) { |
1253 visitor->Trace(transitions_); | 1265 visitor->Trace(transitions_); |
1254 visitor->Trace(pending_update_); | 1266 visitor->Trace(pending_update_); |
1255 visitor->Trace(running_animations_); | 1267 visitor->Trace(running_animations_); |
1256 } | 1268 } |
1257 | 1269 |
1258 } // namespace blink | 1270 } // namespace blink |
OLD | NEW |