| Index: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
|
| index 5ef29d21c236c621e46de7ae06bc55782fb3617d..1a2ac756ebe0ce1ecfac18df0090bdcd735442e3 100644
|
| --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
|
| @@ -76,32 +76,6 @@ void PaintPropertyTreeBuilder::buildTreeNodes(FrameView& frameView, PaintPropert
|
| context.fixedPosition.transform = frameView.preTranslation();
|
| }
|
|
|
| -template <typename PropertyNode, void (ObjectPaintProperties::*Setter)(PassRefPtr<PropertyNode>)>
|
| -void PaintPropertyTreeBuilder::clearPaintProperty(const LayoutObject& object)
|
| -{
|
| - if (ObjectPaintProperties* existingProperties = object.objectPaintProperties())
|
| - (existingProperties->*Setter)(nullptr);
|
| -}
|
| -
|
| -template <
|
| - typename PropertyNode,
|
| - PropertyNode* (ObjectPaintProperties::*Getter)() const,
|
| - void (ObjectPaintProperties::*Setter)(PassRefPtr<PropertyNode>),
|
| - typename... Args>
|
| -void PaintPropertyTreeBuilder::updateOrCreatePaintProperty(const LayoutObject& object, const PaintPropertyTreeBuilderContext& context, PropertyNode*& contextProperty, const Args&... args)
|
| -{
|
| - ObjectPaintProperties* existingProperties = object.objectPaintProperties();
|
| - PropertyNode* existingPropertyNode = existingProperties ? (existingProperties->*Getter)() : nullptr;
|
| - if (existingPropertyNode) {
|
| - existingPropertyNode->update(contextProperty, args...);
|
| - contextProperty = existingPropertyNode;
|
| - } else {
|
| - RefPtr<PropertyNode> newPropertyNode = PropertyNode::create(contextProperty, args...);
|
| - contextProperty = newPropertyNode.get();
|
| - (object.getMutableForPainting().ensureObjectPaintProperties().*Setter)(newPropertyNode.release());
|
| - }
|
| -}
|
| -
|
| void PaintPropertyTreeBuilder::updatePaintOffsetTranslation(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| {
|
| if (object.isBoxModelObject() && context.current.paintOffset != LayoutPoint()) {
|
| @@ -116,14 +90,16 @@ void PaintPropertyTreeBuilder::updatePaintOffsetTranslation(const LayoutObject&
|
| IntPoint roundedPaintOffset = roundedIntPoint(context.current.paintOffset);
|
| LayoutPoint fractionalPaintOffset = LayoutPoint(context.current.paintOffset - roundedPaintOffset);
|
|
|
| - updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::paintOffsetTranslation, &ObjectPaintProperties::setPaintOffsetTranslation>(
|
| - object, context, context.current.transform, TransformationMatrix().translate(roundedPaintOffset.x(), roundedPaintOffset.y()), FloatPoint3D(),
|
| + context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdatePaintOffsetTranslation(
|
| + context.current.transform, TransformationMatrix().translate(roundedPaintOffset.x(), roundedPaintOffset.y()), FloatPoint3D(),
|
| context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
|
| context.current.paintOffset = fractionalPaintOffset;
|
| return;
|
| }
|
| }
|
| - clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setPaintOffsetTranslation>(object);
|
| +
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearPaintOffsetTranslation();
|
| }
|
|
|
| static FloatPoint3D transformOrigin(const LayoutBox& box)
|
| @@ -149,8 +125,8 @@ void PaintPropertyTreeBuilder::updateTransform(const LayoutObject& object, Paint
|
| const AffineTransform& transform = object.isSVGForeignObject() ? object.localSVGTransform() : object.localToSVGParentTransform();
|
| if (!transform.isIdentity()) {
|
| // The origin is included in the local transform, so leave origin empty.
|
| - updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::transform, &ObjectPaintProperties::setTransform>(
|
| - object, context, context.current.transform, TransformationMatrix(transform), FloatPoint3D());
|
| + context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateTransform(
|
| + context.current.transform, TransformationMatrix(transform), FloatPoint3D());
|
| context.current.renderingContextID = 0;
|
| context.current.shouldFlattenInheritedTransform = false;
|
| return;
|
| @@ -179,25 +155,28 @@ void PaintPropertyTreeBuilder::updateTransform(const LayoutObject& object, Paint
|
| childrenFlattenInheritedTransform = false;
|
| }
|
|
|
| - updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::transform, &ObjectPaintProperties::setTransform>(
|
| - object, context, context.current.transform, matrix, origin, flattensInheritedTransform, renderingContextID);
|
| + context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateTransform(
|
| + context.current.transform, matrix, origin, flattensInheritedTransform, renderingContextID);
|
| context.current.renderingContextID = renderingContextIDForChildren;
|
| context.current.shouldFlattenInheritedTransform = childrenFlattenInheritedTransform;
|
| return;
|
| }
|
| }
|
| - clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setTransform>(object);
|
| +
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearTransform();
|
| }
|
|
|
| void PaintPropertyTreeBuilder::updateEffect(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| {
|
| if (!object.styleRef().hasOpacity()) {
|
| - clearPaintProperty<EffectPaintPropertyNode, &ObjectPaintProperties::setEffect>(object);
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearEffect();
|
| return;
|
| }
|
|
|
| - updateOrCreatePaintProperty<EffectPaintPropertyNode, &ObjectPaintProperties::effect, &ObjectPaintProperties::setEffect>(
|
| - object, context, context.currentEffect, object.styleRef().opacity());
|
| + context.currentEffect = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateEffect(
|
| + context.currentEffect, object.styleRef().opacity());
|
| }
|
|
|
| void PaintPropertyTreeBuilder::updateCssClip(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| @@ -209,11 +188,13 @@ void PaintPropertyTreeBuilder::updateCssClip(const LayoutObject& object, PaintPr
|
| // at updateOutOfFlowContext() step.
|
| DCHECK(object.canContainAbsolutePositionObjects());
|
| LayoutRect clipRect = toLayoutBox(object).clipRect(context.current.paintOffset);
|
| - updateOrCreatePaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::cssClip, &ObjectPaintProperties::setCssClip>(
|
| - object, context, context.current.clip, context.current.transform, FloatRoundedRect(FloatRect(clipRect)));
|
| + context.current.clip = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateCssClip(
|
| + context.current.clip, context.current.transform, FloatRoundedRect(FloatRect(clipRect)));
|
| return;
|
| }
|
| - clearPaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::setCssClip>(object);
|
| +
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearCssClip();
|
| }
|
|
|
| void PaintPropertyTreeBuilder::updateLocalBorderBoxContext(const LayoutObject& object, const PaintPropertyTreeBuilderContext& context)
|
| @@ -237,16 +218,15 @@ void PaintPropertyTreeBuilder::updateScrollbarPaintOffset(const LayoutObject& ob
|
| if (PaintLayerScrollableArea* scrollableArea = toLayoutBoxModelObject(object).getScrollableArea()) {
|
| if (scrollableArea->horizontalScrollbar() || scrollableArea->verticalScrollbar()) {
|
| auto paintOffset = TransformationMatrix().translate(roundedPaintOffset.x(), roundedPaintOffset.y());
|
| - // Make a copy of context.current.transform because we don't want to set the scrollbarPaintOffset node
|
| - // as the current transform.
|
| - TransformPaintPropertyNode* parentTransform = context.current.transform;
|
| - updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::scrollbarPaintOffset, &ObjectPaintProperties::setScrollbarPaintOffset>(
|
| - object, context, parentTransform, paintOffset, FloatPoint3D());
|
| + object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateScrollbarPaintOffset(
|
| + context.current.transform, paintOffset, FloatPoint3D());
|
| return;
|
| }
|
| }
|
| }
|
| - clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setScrollbarPaintOffset>(object);
|
| +
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearScrollbarPaintOffset();
|
| }
|
|
|
| void PaintPropertyTreeBuilder::updateOverflowClip(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| @@ -265,7 +245,8 @@ void PaintPropertyTreeBuilder::updateOverflowClip(const LayoutObject& object, Pa
|
| } else if (box.hasOverflowClip()) {
|
| clipRect = box.overflowClipRect(context.current.paintOffset);
|
| } else {
|
| - clearPaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::setOverflowClip>(object);
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearOverflowClip();
|
| return;
|
| }
|
|
|
| @@ -278,8 +259,8 @@ void PaintPropertyTreeBuilder::updateOverflowClip(const LayoutObject& object, Pa
|
| context.current.clip = borderRadiusClip.get();
|
| }
|
|
|
| - updateOrCreatePaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::overflowClip, &ObjectPaintProperties::setOverflowClip>(
|
| - object, context, context.current.clip, context.current.transform, FloatRoundedRect(FloatRect(clipRect)));
|
| + context.current.clip = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateOverflowClip(
|
| + context.current.clip, context.current.transform, FloatRoundedRect(FloatRect(clipRect)));
|
| }
|
|
|
| static FloatPoint perspectiveOrigin(const LayoutBox& box)
|
| @@ -295,7 +276,8 @@ void PaintPropertyTreeBuilder::updatePerspective(const LayoutObject& object, Pai
|
| {
|
| const ComputedStyle& style = object.styleRef();
|
| if (!object.isBox() || !style.hasPerspective()) {
|
| - clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setPerspective>(object);
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearPerspective();
|
| return;
|
| }
|
|
|
| @@ -304,8 +286,8 @@ void PaintPropertyTreeBuilder::updatePerspective(const LayoutObject& object, Pai
|
| // transform nodes do.
|
| TransformationMatrix matrix = TransformationMatrix().applyPerspective(style.perspective());
|
| FloatPoint3D origin = perspectiveOrigin(toLayoutBox(object)) + toLayoutSize(context.current.paintOffset);
|
| - updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::perspective, &ObjectPaintProperties::setPerspective>(
|
| - object, context, context.current.transform, matrix, origin, context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
|
| + context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdatePerspective(
|
| + context.current.transform, matrix, origin, context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
|
| context.current.shouldFlattenInheritedTransform = false;
|
| }
|
|
|
| @@ -321,12 +303,13 @@ void PaintPropertyTreeBuilder::updateSvgLocalToBorderBoxTransform(const LayoutOb
|
| context.current.paintOffset = LayoutPoint();
|
|
|
| if (transformToBorderBox.isIdentity()) {
|
| - clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setSvgLocalToBorderBoxTransform>(object);
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearSvgLocalToBorderBoxTransform();
|
| return;
|
| }
|
|
|
| - updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::svgLocalToBorderBoxTransform, &ObjectPaintProperties::setSvgLocalToBorderBoxTransform>(
|
| - object, context, context.current.transform, transformToBorderBox, FloatPoint3D());
|
| + context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateSvgLocalToBorderBoxTransform(
|
| + context.current.transform, transformToBorderBox, FloatPoint3D());
|
| context.current.shouldFlattenInheritedTransform = false;
|
| context.current.renderingContextID = 0;
|
| }
|
| @@ -340,13 +323,15 @@ void PaintPropertyTreeBuilder::updateScrollTranslation(const LayoutObject& objec
|
|
|
| if (!scrollOffset.isZero() || layer->scrollsOverflow()) {
|
| TransformationMatrix matrix = TransformationMatrix().translate(-scrollOffset.width(), -scrollOffset.height());
|
| - updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::scrollTranslation, &ObjectPaintProperties::setScrollTranslation>(
|
| - object, context, context.current.transform, matrix, FloatPoint3D(), context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
|
| + context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateScrollTranslation(
|
| + context.current.transform, matrix, FloatPoint3D(), context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
|
| context.current.shouldFlattenInheritedTransform = false;
|
| return;
|
| }
|
| }
|
| - clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setScrollTranslation>(object);
|
| +
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearScrollTranslation();
|
| }
|
|
|
| void PaintPropertyTreeBuilder::updateOutOfFlowContext(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| @@ -360,25 +345,27 @@ void PaintPropertyTreeBuilder::updateOutOfFlowContext(const LayoutObject& object
|
| // paint properties for rootLayerScrolls.
|
| if (!object.isLayoutView() && object.canContainFixedPositionObjects()) {
|
| context.fixedPosition = context.current;
|
| - } else if (object.objectPaintProperties() && object.objectPaintProperties()->cssClip()) {
|
| + } else if (object.getMutableForPainting().objectPaintProperties() && object.objectPaintProperties()->cssClip()) {
|
| // CSS clip applies to all descendants, even if this object is not a containing block
|
| // ancestor of the descendant. It is okay for absolute-position descendants because
|
| // having CSS clip implies being absolute position container. However for fixed-position
|
| // descendants we need to insert the clip here if we are not a containing block ancestor
|
| // of them.
|
| - auto* cssClip = object.objectPaintProperties()->cssClip();
|
| + auto* cssClip = object.getMutableForPainting().objectPaintProperties()->cssClip();
|
|
|
| // Before we actually create anything, check whether in-flow context and fixed-position
|
| // context has exactly the same clip. Reuse if possible.
|
| if (context.fixedPosition.clip == cssClip->parent()) {
|
| context.fixedPosition.clip = cssClip;
|
| } else {
|
| - updateOrCreatePaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::cssClipFixedPosition, &ObjectPaintProperties::setCssClipFixedPosition>(
|
| - object, context, context.fixedPosition.clip, const_cast<TransformPaintPropertyNode*>(cssClip->localTransformSpace()), cssClip->clipRect());
|
| + context.fixedPosition.clip = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateCssClipFixedPosition(
|
| + context.fixedPosition.clip, const_cast<TransformPaintPropertyNode*>(cssClip->localTransformSpace()), cssClip->clipRect());
|
| return;
|
| }
|
| }
|
| - clearPaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::setCssClipFixedPosition>(object);
|
| +
|
| + if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
|
| + properties->clearCssClipFixedPosition();
|
| }
|
|
|
| static void deriveBorderBoxFromContainerContext(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
|
|