| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "core/paint/PaintPropertyTreeBuilder.h" | 5 #include "core/paint/PaintPropertyTreeBuilder.h" |
| 6 | 6 |
| 7 #include "core/dom/DOMNodeIds.h" | 7 #include "core/dom/DOMNodeIds.h" |
| 8 #include "core/frame/FrameView.h" | 8 #include "core/frame/FrameView.h" |
| 9 #include "core/frame/LocalFrame.h" | 9 #include "core/frame/LocalFrame.h" |
| 10 #include "core/frame/Settings.h" | 10 #include "core/frame/Settings.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 context.currentEffect = EffectPaintPropertyNode::root(); | 31 context.currentEffect = EffectPaintPropertyNode::root(); |
| 32 context.inputClipOfCurrentEffect = ClipPaintPropertyNode::root(); | 32 context.inputClipOfCurrentEffect = ClipPaintPropertyNode::root(); |
| 33 context.current.transform = context.absolutePosition.transform = | 33 context.current.transform = context.absolutePosition.transform = |
| 34 context.fixedPosition.transform = TransformPaintPropertyNode::root(); | 34 context.fixedPosition.transform = TransformPaintPropertyNode::root(); |
| 35 context.current.scroll = context.absolutePosition.scroll = | 35 context.current.scroll = context.absolutePosition.scroll = |
| 36 context.fixedPosition.scroll = ScrollPaintPropertyNode::root(); | 36 context.fixedPosition.scroll = ScrollPaintPropertyNode::root(); |
| 37 return context; | 37 return context; |
| 38 } | 38 } |
| 39 | 39 |
| 40 // True if a new property was created, false if an existing one was updated. | 40 // True if a new property was created, false if an existing one was updated. |
| 41 bool updatePreTranslation(FrameView& frameView, | 41 static bool updatePreTranslation( |
| 42 PassRefPtr<const TransformPaintPropertyNode> parent, | 42 FrameView& frameView, |
| 43 const TransformationMatrix& matrix, | 43 PassRefPtr<const TransformPaintPropertyNode> parent, |
| 44 const FloatPoint3D& origin) { | 44 const TransformationMatrix& matrix, |
| 45 const FloatPoint3D& origin) { |
| 45 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); | 46 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); |
| 46 if (auto* existingPreTranslation = frameView.preTranslation()) { | 47 if (auto* existingPreTranslation = frameView.preTranslation()) { |
| 47 existingPreTranslation->update(std::move(parent), matrix, origin); | 48 existingPreTranslation->update(std::move(parent), matrix, origin); |
| 48 return false; | 49 return false; |
| 49 } | 50 } |
| 50 frameView.setPreTranslation( | 51 frameView.setPreTranslation( |
| 51 TransformPaintPropertyNode::create(std::move(parent), matrix, origin)); | 52 TransformPaintPropertyNode::create(std::move(parent), matrix, origin)); |
| 52 return true; | 53 return true; |
| 53 } | 54 } |
| 54 | 55 |
| 55 // True if a new property was created, false if an existing one was updated. | 56 // True if a new property was created, false if an existing one was updated. |
| 56 bool updateContentClip( | 57 static bool updateContentClip( |
| 57 FrameView& frameView, | 58 FrameView& frameView, |
| 58 PassRefPtr<const ClipPaintPropertyNode> parent, | 59 PassRefPtr<const ClipPaintPropertyNode> parent, |
| 59 PassRefPtr<const TransformPaintPropertyNode> localTransformSpace, | 60 PassRefPtr<const TransformPaintPropertyNode> localTransformSpace, |
| 60 const FloatRoundedRect& clipRect) { | 61 const FloatRoundedRect& clipRect) { |
| 61 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); | 62 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); |
| 62 if (auto* existingContentClip = frameView.contentClip()) { | 63 if (auto* existingContentClip = frameView.contentClip()) { |
| 63 existingContentClip->update(std::move(parent), | 64 existingContentClip->update(std::move(parent), |
| 64 std::move(localTransformSpace), clipRect); | 65 std::move(localTransformSpace), clipRect); |
| 65 return false; | 66 return false; |
| 66 } | 67 } |
| 67 frameView.setContentClip(ClipPaintPropertyNode::create( | 68 frameView.setContentClip(ClipPaintPropertyNode::create( |
| 68 std::move(parent), std::move(localTransformSpace), clipRect)); | 69 std::move(parent), std::move(localTransformSpace), clipRect)); |
| 69 return true; | 70 return true; |
| 70 } | 71 } |
| 71 | 72 |
| 72 // True if a new property was created, false if an existing one was updated. | 73 // True if a new property was created, false if an existing one was updated. |
| 73 bool updateScrollTranslation( | 74 static bool updateScrollTranslation( |
| 74 FrameView& frameView, | 75 FrameView& frameView, |
| 75 PassRefPtr<const TransformPaintPropertyNode> parent, | 76 PassRefPtr<const TransformPaintPropertyNode> parent, |
| 76 const TransformationMatrix& matrix, | 77 const TransformationMatrix& matrix, |
| 77 const FloatPoint3D& origin) { | 78 const FloatPoint3D& origin) { |
| 78 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); | 79 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); |
| 79 if (auto* existingScrollTranslation = frameView.scrollTranslation()) { | 80 if (auto* existingScrollTranslation = frameView.scrollTranslation()) { |
| 80 existingScrollTranslation->update(std::move(parent), matrix, origin); | 81 existingScrollTranslation->update(std::move(parent), matrix, origin); |
| 81 return false; | 82 return false; |
| 82 } | 83 } |
| 83 frameView.setScrollTranslation( | 84 frameView.setScrollTranslation( |
| 84 TransformPaintPropertyNode::create(std::move(parent), matrix, origin)); | 85 TransformPaintPropertyNode::create(std::move(parent), matrix, origin)); |
| 85 return true; | 86 return true; |
| 86 } | 87 } |
| 87 | 88 |
| 88 // True if a new property was created or a main thread scrolling reason changed | 89 // True if a new property was created or a main thread scrolling reason changed |
| 89 // (which can affect descendants), false if an existing one was updated. | 90 // (which can affect descendants), false if an existing one was updated. |
| 90 bool updateScroll(FrameView& frameView, | 91 static bool updateScroll( |
| 91 PassRefPtr<const ScrollPaintPropertyNode> parent, | 92 FrameView& frameView, |
| 92 PassRefPtr<const TransformPaintPropertyNode> scrollOffset, | 93 PassRefPtr<const ScrollPaintPropertyNode> parent, |
| 93 const IntSize& clip, | 94 PassRefPtr<const TransformPaintPropertyNode> scrollOffset, |
| 94 const IntSize& bounds, | 95 const IntSize& clip, |
| 95 bool userScrollableHorizontal, | 96 const IntSize& bounds, |
| 96 bool userScrollableVertical, | 97 bool userScrollableHorizontal, |
| 97 MainThreadScrollingReasons mainThreadScrollingReasons) { | 98 bool userScrollableVertical, |
| 99 MainThreadScrollingReasons mainThreadScrollingReasons) { |
| 98 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); | 100 DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); |
| 99 if (auto* existingScroll = frameView.scroll()) { | 101 if (auto* existingScroll = frameView.scroll()) { |
| 100 auto existingReasons = existingScroll->mainThreadScrollingReasons(); | 102 auto existingReasons = existingScroll->mainThreadScrollingReasons(); |
| 101 existingScroll->update(std::move(parent), std::move(scrollOffset), clip, | 103 existingScroll->update(std::move(parent), std::move(scrollOffset), clip, |
| 102 bounds, userScrollableHorizontal, | 104 bounds, userScrollableHorizontal, |
| 103 userScrollableVertical, mainThreadScrollingReasons); | 105 userScrollableVertical, mainThreadScrollingReasons); |
| 104 return existingReasons != mainThreadScrollingReasons; | 106 return existingReasons != mainThreadScrollingReasons; |
| 105 } | 107 } |
| 106 frameView.setScroll(ScrollPaintPropertyNode::create( | 108 frameView.setScroll(ScrollPaintPropertyNode::create( |
| 107 std::move(parent), std::move(scrollOffset), clip, bounds, | 109 std::move(parent), std::move(scrollOffset), clip, bounds, |
| 108 userScrollableHorizontal, userScrollableVertical, | 110 userScrollableHorizontal, userScrollableVertical, |
| 109 mainThreadScrollingReasons)); | 111 mainThreadScrollingReasons)); |
| 110 return true; | 112 return true; |
| 111 } | 113 } |
| 112 | 114 |
| 113 MainThreadScrollingReasons mainThreadScrollingReasons( | 115 static MainThreadScrollingReasons mainThreadScrollingReasons( |
| 114 const FrameView& frameView, | 116 const FrameView& frameView, |
| 115 MainThreadScrollingReasons ancestorReasons) { | 117 MainThreadScrollingReasons ancestorReasons) { |
| 116 auto reasons = ancestorReasons; | 118 auto reasons = ancestorReasons; |
| 117 if (!frameView.frame().settings()->getThreadedScrollingEnabled()) | 119 if (!frameView.frame().settings()->getThreadedScrollingEnabled()) |
| 118 reasons |= MainThreadScrollingReason::kThreadedScrollingDisabled; | 120 reasons |= MainThreadScrollingReason::kThreadedScrollingDisabled; |
| 119 if (frameView.hasBackgroundAttachmentFixedObjects()) | 121 if (frameView.hasBackgroundAttachmentFixedObjects()) |
| 120 reasons |= MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects; | 122 reasons |= MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects; |
| 121 return reasons; | 123 return reasons; |
| 122 } | 124 } |
| 123 | 125 |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 // Transform origin has no effect without a transform or motion path. | 342 // Transform origin has no effect without a transform or motion path. |
| 341 if (!style.hasTransform()) | 343 if (!style.hasTransform()) |
| 342 return FloatPoint3D(); | 344 return FloatPoint3D(); |
| 343 FloatSize borderBoxSize(box.size()); | 345 FloatSize borderBoxSize(box.size()); |
| 344 return FloatPoint3D( | 346 return FloatPoint3D( |
| 345 floatValueForLength(style.transformOriginX(), borderBoxSize.width()), | 347 floatValueForLength(style.transformOriginX(), borderBoxSize.width()), |
| 346 floatValueForLength(style.transformOriginY(), borderBoxSize.height()), | 348 floatValueForLength(style.transformOriginY(), borderBoxSize.height()), |
| 347 style.transformOriginZ()); | 349 style.transformOriginZ()); |
| 348 } | 350 } |
| 349 | 351 |
| 350 namespace { | 352 static CompositorElementId createDomNodeBasedCompositorElementId( |
| 351 | |
| 352 CompositorElementId createDomNodeBasedCompositorElementId( | |
| 353 const LayoutObject& object) { | 353 const LayoutObject& object) { |
| 354 return createCompositorElementId(DOMNodeIds::idForNode(object.node()), | 354 return createCompositorElementId(DOMNodeIds::idForNode(object.node()), |
| 355 CompositorSubElementId::Primary); | 355 CompositorSubElementId::Primary); |
| 356 } | 356 } |
| 357 | 357 |
| 358 } // namespace | |
| 359 | |
| 360 void PaintPropertyTreeBuilder::updateTransform( | 358 void PaintPropertyTreeBuilder::updateTransform( |
| 361 const LayoutObject& object, | 359 const LayoutObject& object, |
| 362 PaintPropertyTreeBuilderContext& context) { | 360 PaintPropertyTreeBuilderContext& context) { |
| 363 if (object.isSVGChild()) { | 361 if (object.isSVGChild()) { |
| 364 updateTransformForNonRootSVG(object, context); | 362 updateTransformForNonRootSVG(object, context); |
| 365 return; | 363 return; |
| 366 } | 364 } |
| 367 | 365 |
| 368 if (object.needsPaintPropertyUpdate() || context.forceSubtreeUpdate) { | 366 if (object.needsPaintPropertyUpdate() || context.forceSubtreeUpdate) { |
| 369 const ComputedStyle& style = object.styleRef(); | 367 const ComputedStyle& style = object.styleRef(); |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 if (properties && properties->svgLocalToBorderBoxTransform()) { | 735 if (properties && properties->svgLocalToBorderBoxTransform()) { |
| 738 context.current.transform = properties->svgLocalToBorderBoxTransform(); | 736 context.current.transform = properties->svgLocalToBorderBoxTransform(); |
| 739 context.current.shouldFlattenInheritedTransform = false; | 737 context.current.shouldFlattenInheritedTransform = false; |
| 740 context.current.renderingContextId = 0; | 738 context.current.renderingContextId = 0; |
| 741 } | 739 } |
| 742 // The paint offset is included in |transformToBorderBox| so SVG does not need | 740 // The paint offset is included in |transformToBorderBox| so SVG does not need |
| 743 // to handle paint offset internally. | 741 // to handle paint offset internally. |
| 744 context.current.paintOffset = LayoutPoint(); | 742 context.current.paintOffset = LayoutPoint(); |
| 745 } | 743 } |
| 746 | 744 |
| 747 MainThreadScrollingReasons mainThreadScrollingReasons( | 745 static MainThreadScrollingReasons mainThreadScrollingReasons( |
| 748 const LayoutObject& object, | 746 const LayoutObject& object, |
| 749 MainThreadScrollingReasons ancestorReasons) { | 747 MainThreadScrollingReasons ancestorReasons) { |
| 750 // The current main thread scrolling reasons implementation only changes | 748 // The current main thread scrolling reasons implementation only changes |
| 751 // reasons at frame boundaries, so we can early-out when not at a LayoutView. | 749 // reasons at frame boundaries, so we can early-out when not at a LayoutView. |
| 752 // TODO(pdr): Need to find a solution to the style-related main thread | 750 // TODO(pdr): Need to find a solution to the style-related main thread |
| 753 // scrolling reasons such as opacity and transform which violate this. | 751 // scrolling reasons such as opacity and transform which violate this. |
| 754 if (!object.isLayoutView()) | 752 if (!object.isLayoutView()) |
| 755 return ancestorReasons; | 753 return ancestorReasons; |
| 756 return mainThreadScrollingReasons(*object.frameView(), ancestorReasons); | 754 return mainThreadScrollingReasons(*object.frameView(), ancestorReasons); |
| 757 } | 755 } |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 991 updateOverflowClip(object, context); | 989 updateOverflowClip(object, context); |
| 992 updatePerspective(object, context); | 990 updatePerspective(object, context); |
| 993 updateSvgLocalToBorderBoxTransform(object, context); | 991 updateSvgLocalToBorderBoxTransform(object, context); |
| 994 updateScrollAndScrollTranslation(object, context); | 992 updateScrollAndScrollTranslation(object, context); |
| 995 updateOutOfFlowContext(object, context); | 993 updateOutOfFlowContext(object, context); |
| 996 | 994 |
| 997 context.forceSubtreeUpdate |= object.subtreeNeedsPaintPropertyUpdate(); | 995 context.forceSubtreeUpdate |= object.subtreeNeedsPaintPropertyUpdate(); |
| 998 } | 996 } |
| 999 | 997 |
| 1000 } // namespace blink | 998 } // namespace blink |
| OLD | NEW |