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..a8f38436c8a03481a379a56aea0e1beeb63f1694 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,21 @@ 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. |
+ PaintLayer* layer = toLayoutBoxModelObject(object).layer(); |
+ shouldCreatePaintOffsetTranslationNode = layer && layer->paintsWithTransform(GlobalPaintNormalPhase); |
+ } |
if (context.paintOffset == LayoutPoint() || !shouldCreatePaintOffsetTranslationNode) |
return nullptr; |
@@ -134,8 +146,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 +175,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 +194,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 +207,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 +225,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 +239,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 +265,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); |
} |
} |