Chromium Code Reviews| 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 04079d830f31481b29bd36686aac7c6bbd082ebe..7186f01b94aaf03f8e3f37a4d9e731696ce99703 100644 |
| --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
| +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
| @@ -79,21 +79,26 @@ void PaintPropertyTreeBuilder::walk(FrameView& frameView, const PaintPropertyTre |
| walk(*layoutView, localContext); |
| } |
| -static void deriveBorderBoxFromContainerContext(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context) |
| +static void deriveBorderBoxFromContainerContext(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
| { |
| + if (!object.isBoxModelObject()) |
| + return; |
| + |
| + const LayoutBoxModelObject& boxModelObject = toLayoutBoxModelObject(object); |
| + |
| // TODO(trchen): There is some insanity going on with tables. Double check results. |
| switch (object.styleRef().position()) { |
| case StaticPosition: |
| break; |
| case RelativePosition: |
| - context.paintOffset += object.offsetForInFlowPosition(); |
| + context.paintOffset += boxModelObject.offsetForInFlowPosition(); |
| break; |
| case AbsolutePosition: |
| context.currentTransform = context.transformForOutOfFlowPositioned; |
| context.paintOffset = context.paintOffsetForOutOfFlowPositioned; |
| break; |
| case StickyPosition: |
| - context.paintOffset += object.offsetForInFlowPosition(); |
| + context.paintOffset += boxModelObject.offsetForInFlowPosition(); |
| break; |
| case FixedPosition: |
| context.currentTransform = context.transformForFixedPositioned; |
| @@ -102,14 +107,20 @@ static void deriveBorderBoxFromContainerContext(const LayoutBoxModelObject& obje |
| default: |
| ASSERT_NOT_REACHED(); |
| } |
| - if (object.isBox()) |
| - context.paintOffset += toLayoutBox(object).locationOffset(); |
| + if (boxModelObject.isBox()) |
| + context.paintOffset += toLayoutBox(boxModelObject).locationOffset(); |
| } |
| -static PassRefPtr<TransformPaintPropertyNode> createPaintOffsetTranslationIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context) |
| +static PassRefPtr<TransformPaintPropertyNode> createPaintOffsetTranslationIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
| { |
| - // TODO(trchen): Eliminate PaintLayer dependency. |
| - bool shouldCreatePaintOffsetTranslationNode = object.layer() && object.layer()->paintsWithTransform(GlobalPaintNormalPhase); |
| + bool shouldCreatePaintOffsetTranslationNode = false; |
| + if (object.isSVGRoot()) { |
| + // SVG doesn't use paint offset internally so emit a paint offset at the html->svg boundary. |
| + shouldCreatePaintOffsetTranslationNode = true; |
| + } else if (object.isBoxModelObject()) { |
| + // TODO(trchen): Eliminate PaintLayer dependency. |
| + shouldCreatePaintOffsetTranslationNode = toLayoutBoxModelObject(object).layer() && toLayoutBoxModelObject(object).layer()->paintsWithTransform(GlobalPaintNormalPhase); |
|
jbroman
2015/11/20 19:09:20
nit: extract toLayoutBoxModelObject(object).layer(
pdr.
2015/11/20 19:33:41
I actually refactored this slightly differently so
jbroman
2015/11/20 19:53:40
...which is exactly what I asked you to do?
|
| + } |
| if (context.paintOffset == LayoutPoint() || !shouldCreatePaintOffsetTranslationNode) |
| return nullptr; |
| @@ -134,8 +145,20 @@ static FloatPoint3D transformOrigin(const LayoutBox& box) |
| style.transformOriginZ()); |
| } |
| -static PassRefPtr<TransformPaintPropertyNode> createTransformIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context) |
| +static PassRefPtr<TransformPaintPropertyNode> createTransformIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
| { |
| + if (object.isSVG() && !object.isSVGRoot()) { |
| + const AffineTransform& transform = object.localToParentTransform(); |
| + if (transform.isIdentity()) |
| + return nullptr; |
| + |
| + // SVG's transform origin is baked into the localToParentTransform. |
| + RefPtr<TransformPaintPropertyNode> newTransformNodeForTransform = TransformPaintPropertyNode::create( |
| + transform, FloatPoint3D(0, 0, 0), context.currentTransform); |
| + context.currentTransform = newTransformNodeForTransform.get(); |
| + return newTransformNodeForTransform.release(); |
| + } |
| + |
| const ComputedStyle& style = object.styleRef(); |
| if (!object.isBox() || !style.hasTransform()) |
| return nullptr; |
| @@ -151,10 +174,10 @@ static PassRefPtr<TransformPaintPropertyNode> createTransformIfNeeded(const Layo |
| return newTransformNodeForTransform.release(); |
| } |
| -static PassRefPtr<EffectPaintPropertyNode> createEffectIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context) |
| +static PassRefPtr<EffectPaintPropertyNode> createEffectIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
| { |
| const ComputedStyle& style = object.styleRef(); |
| - if (!object.isBox() || !style.hasOpacity()) |
| + if (!style.hasOpacity()) |
| return nullptr; |
| RefPtr<EffectPaintPropertyNode> newEffectNode = EffectPaintPropertyNode::create(style.opacity(), context.currentEffect); |
| context.currentEffect = newEffectNode.get(); |
| @@ -170,7 +193,7 @@ static FloatPoint perspectiveOrigin(const LayoutBox& box) |
| floatValueForLength(style.perspectiveOriginY(), borderBoxSize.height())); |
| } |
| -static PassRefPtr<TransformPaintPropertyNode> createPerspectiveIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context) |
| +static PassRefPtr<TransformPaintPropertyNode> createPerspectiveIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
| { |
| const ComputedStyle& style = object.styleRef(); |
| if (!object.isBox() || !style.hasPerspective()) |
| @@ -183,12 +206,12 @@ static PassRefPtr<TransformPaintPropertyNode> createPerspectiveIfNeeded(const La |
| return newTransformNodeForPerspective.release(); |
| } |
| -static PassRefPtr<TransformPaintPropertyNode> createScrollTranslationIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context) |
| +static PassRefPtr<TransformPaintPropertyNode> createScrollTranslationIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
| { |
| - if (!object.hasOverflowClip()) |
| + if (!object.isBoxModelObject() || !object.hasOverflowClip()) |
| return nullptr; |
| - PaintLayer* layer = object.layer(); |
| + PaintLayer* layer = toLayoutBoxModelObject(object).layer(); |
| ASSERT(layer); |
| DoubleSize scrollOffset = layer->scrollableArea()->scrollOffset(); |
| if (scrollOffset.isZero() && !layer->scrollsOverflow()) |
| @@ -201,7 +224,7 @@ static PassRefPtr<TransformPaintPropertyNode> createScrollTranslationIfNeeded(co |
| return newTransformNodeForScrollTranslation.release(); |
| } |
| -static void updateOutOfFlowContext(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context) |
| +static void updateOutOfFlowContext(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
| { |
| const ComputedStyle& style = object.styleRef(); |
| bool hasTransform = object.isBox() && style.hasTransform(); |
| @@ -215,10 +238,8 @@ static void updateOutOfFlowContext(const LayoutBoxModelObject& object, PaintProp |
| } |
| } |
| -void PaintPropertyTreeBuilder::walk(LayoutBoxModelObject& object, const PaintPropertyTreeBuilderContext& context) |
| +void PaintPropertyTreeBuilder::walk(LayoutObject& object, const PaintPropertyTreeBuilderContext& context) |
| { |
| - ASSERT(object.isBox() != object.isLayoutInline()); // Either or. |
| - |
| PaintPropertyTreeBuilderContext localContext(context); |
| deriveBorderBoxFromContainerContext(object, localContext); |
| @@ -243,15 +264,9 @@ void PaintPropertyTreeBuilder::walk(LayoutBoxModelObject& object, const PaintPro |
| // TODO(trchen): Walk subframes for LayoutFrame. |
| - // TODO(trchen): Implement SVG walk. |
| - if (object.isSVGRoot()) { |
| - return; |
| - } |
| - |
| for (LayoutObject* child = object.slowFirstChild(); child; child = child->nextSibling()) { |
| - if (child->isText()) |
| - continue; |
| - walk(toLayoutBoxModelObject(*child), localContext); |
| + if (child->isBoxModelObject() || child->isSVG()) |
| + walk(*child, localContext); |
| } |
| } |