Changeset 183454 in webkit
- Timestamp:
- Apr 27, 2015, 9:59:48 PM (10 years ago)
- Location:
- trunk
- Files:
-
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r183450 r183454 1 2015-04-25 Simon Fraser <simon.fraser@apple.com> 2 3 Eliminate styleDidChange with StyleDifferenceEqual when updates are actually necessary 4 https://bugs.webkit.org/show_bug.cgi?id=144198 5 6 Reviewed by Darin Adler, Antti Koivisto. 7 8 New test that detects whether a "hardware" animation is firing the style recalc 9 timer on every frame, which happened during development of this patch. 10 11 * compositing/animation/no-style-recalc-during-accelerated-animation-expected.txt: Added. 12 * compositing/animation/no-style-recalc-during-accelerated-animation.html: Added. 13 1 14 2015-04-27 Benjamin Poulain <bpoulain@apple.com> 2 15 -
trunk/Source/WebCore/ChangeLog
r183452 r183454 1 2015-04-25 Simon Fraser <simon.fraser@apple.com> 2 3 Eliminate styleDidChange with StyleDifferenceEqual when updates are actually necessary 4 https://bugs.webkit.org/show_bug.cgi?id=144198 5 6 Reviewed by Darin Adler, Antti Koivisto. 7 8 SyntheticStyleChange style recalcs are triggered for cases where behavior depends 9 on state which is outside of RenderStyle; this includes triggering compositing for 10 animations, for video and canvas, and for iframes with composited content. 11 12 In these cases, we'd run through RenderElement::setStyle() and its fan-out, but 13 with diff == StyleDifferenceEqual, and so be unable to determine if there 14 is actual work to be done. 15 16 This patch enforces the contract that the diff is never StyleDifferenceEqual if 17 compositing or other work has to happen from setStyle(). This is achieved by 18 passing in a 'hasSideEffects' flag, which causes the diff to become at least 19 StyleDifferenceRecompositeLayer. 20 21 RenderLayerCompositor::layerStyleChanged() can now safely early return 22 if the diff is equal. Future patches will reduce redundant work even more. 23 24 Test: compositing/animation/no-style-recalc-during-accelerated-animation.html 25 26 * page/animation/AnimationBase.h: 27 (WebCore::AnimationBase::animate): Returns a bool now if the state changed. 28 (WebCore::AnimationBase::state): 29 * page/animation/AnimationController.cpp: 30 (WebCore::AnimationController::updateAnimations): bool out param which indicates 31 whether any animations changed state. 32 * page/animation/AnimationController.h: 33 * page/animation/CompositeAnimation.cpp: 34 (WebCore::CompositeAnimation::animate): If any transitions or animations changed 35 state, set the animationStateChanged out param to true. 36 * page/animation/CompositeAnimation.h: 37 * page/animation/ImplicitAnimation.cpp: 38 (WebCore::ImplicitAnimation::animate): Return true if the state changed. 39 * page/animation/ImplicitAnimation.h: 40 * page/animation/KeyframeAnimation.cpp: 41 (WebCore::KeyframeAnimation::animate): Return true if the state changed. 42 * page/animation/KeyframeAnimation.h: 43 * rendering/RenderElement.cpp: 44 (WebCore::RenderElement::adjustStyleDifference): We may enter here now with diff 45 != StyleDifferenceEqual, but still need to do the check to see if layers changed. 46 (WebCore::RenderElement::initializeStyle): When setting style for the first time, 47 don't use StyleDifferenceEqual. 48 (WebCore::RenderElement::setStyle): Additional flag to indicate whether this style 49 change involves side effects. If the diff is equal but the flag is set, change 50 the diff to StyleDifferenceRecompositeLayer (the "lowest" non-zero diff). 51 * rendering/RenderElement.h: 52 (WebCore::RenderElement::setAnimatableStyle): Pass true to setStyle() if hasSideEffects 53 is true, or if animation state changed. 54 * rendering/RenderLayer.cpp: 55 (WebCore::RenderLayer::styleChanged): Pass the diff down. 56 * rendering/RenderLayerCompositor.cpp: 57 (WebCore::RenderLayerCompositor::layerStyleChanged): Return if the diff is equal. 58 * rendering/RenderLayerCompositor.h: 59 * rendering/style/RenderStyleConstants.h: StyleDifferenceNewStyle is used when 60 setting style for the first time. 61 * style/StyleResolveTree.cpp: 62 (WebCore::Style::createRendererIfNeeded): Provide animationsChanged bool (which is unused). 63 (WebCore::Style::resolveLocal): If the style change is synthetic, set the flag that 64 says there are side-effects. 65 1 66 2015-04-27 Michael Catanzaro <mcatanzaro@igalia.com> 2 67 -
trunk/Source/WebCore/page/animation/AnimationBase.h
r183364 r183454 136 136 double progress(double scale, double offset, const TimingFunction*) const; 137 137 138 virtual void animate(CompositeAnimation*, RenderElement*, const RenderStyle* /*currentStyle*/, RenderStyle* /*targetStyle*/, RefPtr<RenderStyle>& /*animatedStyle*/) = 0; 138 // Returns true if the animation state changed. 139 virtual bool animate(CompositeAnimation*, RenderElement*, const RenderStyle* /*currentStyle*/, RenderStyle* /*targetStyle*/, RefPtr<RenderStyle>& /*animatedStyle*/) = 0; 139 140 virtual void getAnimatedStyle(RefPtr<RenderStyle>& /*animatedStyle*/) = 0; 140 141 … … 233 234 234 235 bool isAccelerated() const { return m_isAccelerated; } 236 AnimationState state() const { return m_animationState; } 235 237 236 238 static void setNeedsStyleRecalc(Element*); -
trunk/Source/WebCore/page/animation/AnimationController.cpp
r183364 r183454 569 569 } 570 570 571 Ref<RenderStyle> AnimationController::updateAnimations(RenderElement& renderer, Ref<RenderStyle>&& newStyle) 572 { 573 // Don't do anything if we're in the cache 571 bool AnimationController::updateAnimations(RenderElement& renderer, RenderStyle& newStyle, Ref<RenderStyle>& animatedStyle) 572 { 573 RenderStyle* oldStyle = renderer.hasInitializedStyle() ? &renderer.style() : nullptr; 574 if ((!oldStyle || (!oldStyle->animations() && !oldStyle->transitions())) && (!newStyle.animations() && !newStyle.transitions())) 575 return false; 576 574 577 if (renderer.document().inPageCache()) 575 return WTF::move(newStyle); 576 577 RenderStyle* oldStyle = renderer.hasInitializedStyle() ? &renderer.style() : nullptr; 578 579 if ((!oldStyle || (!oldStyle->animations() && !oldStyle->transitions())) && (!newStyle.get().animations() && !newStyle.get().transitions())) 580 return WTF::move(newStyle); 578 return false; 581 579 582 580 // Don't run transitions when printing. 583 581 if (renderer.view().printing()) 584 return WTF::move(newStyle);582 return false; 585 583 586 584 // Fetch our current set of implicit animations from a hashtable. We then compare them … … 592 590 ASSERT(renderer.element()); 593 591 594 Ref<RenderStyle> newStyleBeforeAnimation(WTF::move(newStyle));595 596 592 CompositeAnimation& rendererAnimations = m_data->ensureCompositeAnimation(renderer); 597 auto blendedStyle = rendererAnimations.animate(renderer, oldStyle, newStyleBeforeAnimation);598 599 if (renderer.parent() || newStyle BeforeAnimation->animations() || (oldStyle && oldStyle->animations())) {593 bool animationStateChanged = rendererAnimations.animate(renderer, oldStyle, newStyle, animatedStyle); 594 595 if (renderer.parent() || newStyle.animations() || (oldStyle && oldStyle->animations())) { 600 596 m_data->updateAnimationTimerForRenderer(renderer); 601 597 #if ENABLE(REQUEST_ANIMATION_FRAME) … … 604 600 } 605 601 606 if ( blendedStyle.ptr() != newStyleBeforeAnimation.ptr()) {602 if (animatedStyle.ptr() != &newStyle) { 607 603 // If the animations/transitions change opacity or transform, we need to update 608 604 // the style to impose the stacking rules. Note that this is also 609 605 // done in StyleResolver::adjustRenderStyle(). 610 if ( blendedStyle.get().hasAutoZIndex() && (blendedStyle.get().opacity() < 1.0f || blendedStyle.get().hasTransform()))611 blendedStyle.get().setZIndex(0);612 } 613 return blendedStyle;606 if (animatedStyle.get().hasAutoZIndex() && (animatedStyle.get().opacity() < 1.0f || animatedStyle.get().hasTransform())) 607 animatedStyle.get().setZIndex(0); 608 } 609 return animationStateChanged; 614 610 } 615 611 -
trunk/Source/WebCore/page/animation/AnimationController.h
r183295 r183454 50 50 51 51 void cancelAnimations(RenderElement&); 52 Ref<RenderStyle> updateAnimations(RenderElement&, Ref<RenderStyle>&& newStyle);52 bool updateAnimations(RenderElement&, RenderStyle& newStyle, Ref<RenderStyle>& animatedStyle); 53 53 PassRefPtr<RenderStyle> getAnimatedStyleForRenderer(RenderElement&); 54 54 -
trunk/Source/WebCore/page/animation/CompositeAnimation.cpp
r183364 r183454 298 298 } 299 299 300 Ref<RenderStyle> CompositeAnimation::animate(RenderElement& renderer, RenderStyle* currentStyle, RenderStyle& targetStyle) 301 { 302 RefPtr<RenderStyle> resultStyle; 303 300 bool CompositeAnimation::animate(RenderElement& renderer, RenderStyle* currentStyle, RenderStyle& targetStyle, Ref<RenderStyle>& blendedStyle) 301 { 304 302 // We don't do any transitions if we don't have a currentStyle (on startup). 305 303 updateTransitions(&renderer, currentStyle, &targetStyle); … … 307 305 m_keyframeAnimations.checkConsistency(); 308 306 307 RefPtr<RenderStyle> animatedStyle; 308 bool animationStateChanged = false; 309 309 310 if (currentStyle) { 310 311 // Now that we have transition objects ready, let them know about the new goal state. We want them 311 312 // to fill in a RenderStyle*& only if needed. 312 if (!m_transitions.isEmpty()) {313 for (auto& transition : m_transitions.values())314 transition->animate(this, &renderer, currentStyle, &targetStyle, resultStyle);313 for (auto& transition : m_transitions.values()) { 314 if (transition->animate(this, &renderer, currentStyle, &targetStyle, animatedStyle)) 315 animationStateChanged = true; 315 316 } 316 317 } … … 320 321 for (auto& name : m_keyframeAnimationOrderMap) { 321 322 RefPtr<KeyframeAnimation> keyframeAnim = m_keyframeAnimations.get(name); 322 if (keyframeAnim) 323 keyframeAnim->animate(this, &renderer, currentStyle, &targetStyle, resultStyle); 324 } 325 326 if (resultStyle) 327 return resultStyle.releaseNonNull(); 328 329 return targetStyle; 323 if (keyframeAnim && keyframeAnim->animate(this, &renderer, currentStyle, &targetStyle, animatedStyle)) 324 animationStateChanged = true; 325 } 326 327 if (animatedStyle) 328 blendedStyle = animatedStyle.releaseNonNull(); 329 else 330 blendedStyle = targetStyle; 331 332 return animationStateChanged; 330 333 } 331 334 -
trunk/Source/WebCore/page/animation/CompositeAnimation.h
r183364 r183454 57 57 void clearRenderer(); 58 58 59 Ref<RenderStyle> animate(RenderElement&, RenderStyle* currentStyle, RenderStyle& targetStyle);59 bool animate(RenderElement&, RenderStyle* currentStyle, RenderStyle& targetStyle, Ref<RenderStyle>& blendedStyle); 60 60 PassRefPtr<RenderStyle> getAnimatedStyle() const; 61 61 bool computeExtentOfTransformAnimation(LayoutRect&) const; -
trunk/Source/WebCore/page/animation/ImplicitAnimation.cpp
r183364 r183454 61 61 } 62 62 63 voidImplicitAnimation::animate(CompositeAnimation*, RenderElement*, const RenderStyle*, RenderStyle* targetStyle, RefPtr<RenderStyle>& animatedStyle)63 bool ImplicitAnimation::animate(CompositeAnimation*, RenderElement*, const RenderStyle*, RenderStyle* targetStyle, RefPtr<RenderStyle>& animatedStyle) 64 64 { 65 65 // If we get this far and the animation is done, it means we are cleaning up a just finished animation. 66 66 // So just return. Everything is already all cleaned up. 67 67 if (postActive()) 68 return; 68 return false; 69 70 AnimationState oldState = state(); 69 71 70 72 // Reset to start the transition if we are new … … 80 82 // FIXME: we also need to detect cases where we have to software animate for other reasons, 81 83 // such as a child using inheriting the transform. https://bugs.webkit.org/show_bug.cgi?id=23902 82 if (!needsAnim) 84 if (!needsAnim) { 83 85 // If we are running an accelerated animation, set a flag in the style which causes the style 84 86 // to compare as different to any other style. This ensures that changes to the property 85 87 // that is animating are correctly detected during the animation (e.g. when a transition 86 88 // gets interrupted). 89 // FIXME: still need this hack? 87 90 animatedStyle->setIsRunningAcceleratedAnimation(); 91 } 88 92 89 93 // Fire the start timeout if needed 90 94 fireAnimationEventsIfNeeded(); 95 return state() != oldState; 91 96 } 92 97 -
trunk/Source/WebCore/page/animation/ImplicitAnimation.h
r183364 r183454 55 55 virtual void endAnimation() override; 56 56 57 virtual voidanimate(CompositeAnimation*, RenderElement*, const RenderStyle* currentStyle, RenderStyle* targetStyle, RefPtr<RenderStyle>& animatedStyle) override;57 virtual bool animate(CompositeAnimation*, RenderElement*, const RenderStyle* currentStyle, RenderStyle* targetStyle, RefPtr<RenderStyle>& animatedStyle) override; 58 58 virtual void getAnimatedStyle(RefPtr<RenderStyle>& animatedStyle) override; 59 59 virtual void reset(RenderStyle* to); -
trunk/Source/WebCore/page/animation/KeyframeAnimation.cpp
r183364 r183454 119 119 } 120 120 121 voidKeyframeAnimation::animate(CompositeAnimation* compositeAnimation, RenderElement*, const RenderStyle*, RenderStyle* targetStyle, RefPtr<RenderStyle>& animatedStyle)121 bool KeyframeAnimation::animate(CompositeAnimation* compositeAnimation, RenderElement*, const RenderStyle*, RenderStyle* targetStyle, RefPtr<RenderStyle>& animatedStyle) 122 122 { 123 123 // Fire the start timeout if needed … … 133 133 if (!animatedStyle) 134 134 animatedStyle = const_cast<RenderStyle*>(targetStyle); 135 return ;135 return false; 136 136 } 137 137 … … 142 142 // through to the style blend so that we get the fromStyle. 143 143 if (waitingToStart() && m_animation->delay() > 0 && !m_animation->fillsBackwards()) 144 return ;144 return false; 145 145 146 146 // If we have no keyframes, don't animate. 147 147 if (!m_keyframes.size()) { 148 148 updateStateMachine(AnimationStateInput::EndAnimation, -1); 149 return; 150 } 149 return false; 150 } 151 152 AnimationState oldState = state(); 151 153 152 154 // Run a cycle of animation. … … 169 171 // to indicate it. This can be used to make sure we get an updated 170 172 // style for hit testing, etc. 173 // FIXME: still need this? 171 174 animatedStyle->setIsRunningAcceleratedAnimation(); 172 175 } 176 177 return state() != oldState; 173 178 } 174 179 -
trunk/Source/WebCore/page/animation/KeyframeAnimation.h
r183364 r183454 46 46 } 47 47 48 virtual voidanimate(CompositeAnimation*, RenderElement*, const RenderStyle* currentStyle, RenderStyle* targetStyle, RefPtr<RenderStyle>& animatedStyle) override;48 virtual bool animate(CompositeAnimation*, RenderElement*, const RenderStyle* currentStyle, RenderStyle* targetStyle, RefPtr<RenderStyle>& animatedStyle) override; 49 49 virtual void getAnimatedStyle(RefPtr<RenderStyle>&) override; 50 50 -
trunk/Source/WebCore/rendering/RenderElement.cpp
r183160 r183454 297 297 // style changing, since it depends on whether we decide to composite these elements. When the 298 298 // layer status of one of these elements changes, we need to force a layout. 299 if (diff == StyleDifferenceEqual&& isRenderLayerModelObject()) {299 if (diff < StyleDifferenceLayout && isRenderLayerModelObject()) { 300 300 if (hasLayer() != downcast<RenderLayerModelObject>(*this).requiresLayer()) 301 301 diff = StyleDifferenceLayout; … … 367 367 void RenderElement::initializeStyle() 368 368 { 369 styleWillChange(StyleDifference Equal, style());369 styleWillChange(StyleDifferenceNewStyle, style()); 370 370 371 371 m_hasInitializedStyle = true; … … 386 386 view().setMaximalOutlineSize(std::max(theme().platformFocusRingMaxWidth(), static_cast<int>(m_style->outlineSize()))); 387 387 388 styleDidChange(StyleDifference Equal, nullptr);388 styleDidChange(StyleDifferenceNewStyle, nullptr); 389 389 390 390 // We shouldn't have any text children that would need styleDidChange at this point. … … 395 395 } 396 396 397 void RenderElement::setStyle(Ref<RenderStyle>&& style )397 void RenderElement::setStyle(Ref<RenderStyle>&& style, StyleDifference minimalStyleDifference) 398 398 { 399 399 // FIXME: Should change RenderView so it can use initializeStyle too. … … 409 409 ASSERT(!isEmbeddedObject()); 410 410 ASSERT(!isCanvas()); 411 ASSERT(minimalStyleDifference == StyleDifferenceEqual); 411 412 return; 412 413 } … … 416 417 if (m_hasInitializedStyle) 417 418 diff = m_style->diff(style.get(), contextSensitiveProperties); 419 420 diff = std::max(diff, minimalStyleDifference); 418 421 419 422 diff = adjustStyleDifference(diff, contextSensitiveProperties); -
trunk/Source/WebCore/rendering/RenderElement.h
r181691 r183454 45 45 void initializeStyle(); 46 46 47 void setStyle(Ref<RenderStyle>&&); 47 // Calling with minimalStyleDifference > StyleDifferenceEqual indicates that 48 // out-of-band state (e.g. animations) requires that styleDidChange processing 49 // continue even if the style isn't different from the current style. 50 void setStyle(Ref<RenderStyle>&&, StyleDifference minimalStyleDifference = StyleDifferenceEqual); 51 48 52 // Called to update a style that is allowed to trigger animations. 49 void setAnimatableStyle(Ref<RenderStyle>&& );53 void setAnimatableStyle(Ref<RenderStyle>&&, StyleDifference minimalStyleDifference); 50 54 51 55 // The pseudo element style can be cached or uncached. Use the cached method if the pseudo element doesn't respect 52 56 // any pseudo classes (and therefore has no concept of changing state). 53 RenderStyle* getCachedPseudoStyle(PseudoId, RenderStyle* parentStyle = 0) const;54 PassRefPtr<RenderStyle> getUncachedPseudoStyle(const PseudoStyleRequest&, RenderStyle* parentStyle = 0, RenderStyle* ownStyle = 0) const;57 RenderStyle* getCachedPseudoStyle(PseudoId, RenderStyle* parentStyle = nullptr) const; 58 PassRefPtr<RenderStyle> getUncachedPseudoStyle(const PseudoStyleRequest&, RenderStyle* parentStyle = nullptr, RenderStyle* ownStyle = nullptr) const; 55 59 56 60 // This is null for anonymous renderers. … … 89 93 90 94 virtual bool isChildAllowed(const RenderObject&, const RenderStyle&) const { return true; } 91 virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0);92 virtual void addChildIgnoringContinuation(RenderObject* newChild, RenderObject* beforeChild = 0) { return addChild(newChild, beforeChild); }95 virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = nullptr); 96 virtual void addChildIgnoringContinuation(RenderObject* newChild, RenderObject* beforeChild = nullptr) { return addChild(newChild, beforeChild); } 93 97 virtual void removeChild(RenderObject&); 94 98 … … 323 327 }; 324 328 325 inline void RenderElement::setAnimatableStyle(Ref<RenderStyle>&& style) 326 { 327 setStyle(animation().updateAnimations(*this, WTF::move(style))); 329 inline void RenderElement::setAnimatableStyle(Ref<RenderStyle>&& style, StyleDifference minimalStyleDifference) 330 { 331 Ref<RenderStyle> animatedStyle = WTF::move(style); 332 if (animation().updateAnimations(*this, animatedStyle, animatedStyle)) 333 minimalStyleDifference = std::max(minimalStyleDifference, StyleDifferenceRecompositeLayer); 334 335 setStyle(WTF::move(animatedStyle), minimalStyleDifference); 328 336 } 329 337 -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r183364 r183454 6694 6694 updateNeedsCompositedScrolling(); 6695 6695 6696 compositor().layerStyleChanged( *this, oldStyle);6696 compositor().layerStyleChanged(diff, *this, oldStyle); 6697 6697 6698 6698 updateOrRemoveFilterEffectRenderer(); -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r183314 r183454 916 916 } 917 917 918 void RenderLayerCompositor::layerStyleChanged(RenderLayer& layer, const RenderStyle* oldStyle) 919 { 918 void RenderLayerCompositor::layerStyleChanged(StyleDifference diff, RenderLayer& layer, const RenderStyle* oldStyle) 919 { 920 if (diff == StyleDifferenceEqual) 921 return; 922 920 923 const RenderStyle& newStyle = layer.renderer().style(); 921 924 if (updateLayerCompositingState(layer) || (oldStyle && styleChangeRequiresLayerRebuild(layer, *oldStyle, newStyle))) -
trunk/Source/WebCore/rendering/RenderLayerCompositor.h
r182985 r183454 172 172 void layerWillBeRemoved(RenderLayer& parent, RenderLayer& child); 173 173 174 void layerStyleChanged( RenderLayer&, const RenderStyle* oldStyle);174 void layerStyleChanged(StyleDifference, RenderLayer&, const RenderStyle* oldStyle); 175 175 176 176 static bool canCompositeClipPath(const RenderLayer&); -
trunk/Source/WebCore/rendering/style/RenderStyle.h
r183399 r183454 1064 1064 AnimationList* animations() { return rareNonInheritedData->m_animations.get(); } 1065 1065 AnimationList* transitions() { return rareNonInheritedData->m_transitions.get(); } 1066 1067 bool hasAnimationsOrTransitions() const { return rareNonInheritedData->hasAnimationsOrTransitions(); } 1066 1068 1067 1069 AnimationList& ensureAnimations(); -
trunk/Source/WebCore/rendering/style/RenderStyleConstants.h
r183304 r183454 56 56 StyleDifferenceSimplifiedLayout, 57 57 StyleDifferenceSimplifiedLayoutAndPositionedMovement, 58 StyleDifferenceLayout 58 StyleDifferenceLayout, 59 StyleDifferenceNewStyle 59 60 }; 60 61 -
trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.h
r182613 r183454 100 100 bool hasOpacity() const { return opacity < 1; } 101 101 102 bool hasAnimationsOrTransitions() const { return m_animations || m_transitions; } 103 102 104 float opacity; 103 105 -
trunk/Source/WebCore/style/StyleResolveTree.cpp
r183160 r183454 202 202 // FIXME: There's probably a better way to factor this. 203 203 // This just does what setAnimatedStyle() does, except with setStyleInternal() instead of setStyle(). 204 newRenderer->setStyleInternal(newRenderer->animation().updateAnimations(*newRenderer, newRenderer->style())); 204 Ref<RenderStyle> animatedStyle = newRenderer->style(); 205 newRenderer->animation().updateAnimations(*newRenderer, animatedStyle, animatedStyle); 206 newRenderer->setStyleInternal(WTF::move(animatedStyle)); 205 207 206 208 newRenderer->initializeStyle(); … … 631 633 if (RenderElement* renderer = current.renderer()) { 632 634 if (localChange != NoChange || pseudoStyleCacheIsInvalid(renderer, newStyle.get()) || (inheritedChange == Force && renderer->requiresForcedStyleRecalcPropagation()) || current.styleChangeType() == SyntheticStyleChange) 633 renderer->setAnimatableStyle(*newStyle );635 renderer->setAnimatableStyle(*newStyle, current.styleChangeType() == SyntheticStyleChange ? StyleDifferenceRecompositeLayer : StyleDifferenceEqual); 634 636 else if (current.needsStyleRecalc()) { 635 637 // Although no change occurred, we use the new style so that the cousin style sharing code won't get
Note:
See TracChangeset
for help on using the changeset viewer.