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 1540c0f06011a2a59462e399d2bae459ee9cafb7..5ef29d21c236c621e46de7ae06bc55782fb3617d 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
@@ -68,6 +68,8 @@ void PaintPropertyTreeBuilder::buildTreeNodes(FrameView& frameView, PaintPropert |
context.current.transform = frameView.scrollTranslation(); |
context.current.paintOffset = LayoutPoint(); |
context.current.clip = frameView.contentClip(); |
+ context.current.renderingContextID = 0; |
+ context.current.shouldFlattenInheritedTransform = true; |
context.absolutePosition = context.current; |
context.containerForAbsolutePosition = nullptr; |
context.fixedPosition = context.current; |
@@ -115,7 +117,8 @@ void PaintPropertyTreeBuilder::updatePaintOffsetTranslation(const LayoutObject& |
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()); |
+ object, context, context.current.transform, TransformationMatrix().translate(roundedPaintOffset.x(), roundedPaintOffset.y()), FloatPoint3D(), |
+ context.current.shouldFlattenInheritedTransform, context.current.renderingContextID); |
context.current.paintOffset = fractionalPaintOffset; |
return; |
} |
@@ -148,17 +151,38 @@ void PaintPropertyTreeBuilder::updateTransform(const LayoutObject& object, Paint |
// 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.renderingContextID = 0; |
+ context.current.shouldFlattenInheritedTransform = false; |
return; |
} |
} else { |
const ComputedStyle& style = object.styleRef(); |
- if (object.isBox() && style.hasTransform()) { |
+ if (object.isBox() && (style.hasTransform() || style.preserves3D())) { |
TransformationMatrix matrix; |
style.applyTransform(matrix, toLayoutBox(object).size(), ComputedStyle::ExcludeTransformOrigin, |
ComputedStyle::IncludeMotionPath, ComputedStyle::IncludeIndependentTransformProperties); |
FloatPoint3D origin = transformOrigin(toLayoutBox(object)); |
+ |
+ unsigned renderingContextID = context.current.renderingContextID; |
+ unsigned renderingContextIDForChildren = 0; |
+ bool flattensInheritedTransform = context.current.shouldFlattenInheritedTransform; |
+ bool childrenFlattenInheritedTransform = true; |
+ |
+ // TODO(trchen): transform-style should only be respected if a PaintLayer is |
+ // created. |
+ if (style.preserves3D()) { |
+ // If a node with transform-style: preserve-3d does not exist in an |
+ // existing rendering context, it establishes a new one. |
+ if (!renderingContextID) |
+ renderingContextID = PtrHash<const LayoutObject>::hash(&object); |
+ renderingContextIDForChildren = renderingContextID; |
+ childrenFlattenInheritedTransform = false; |
+ } |
+ |
updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::transform, &ObjectPaintProperties::setTransform>( |
- object, context, context.current.transform, matrix, origin); |
+ object, context, context.current.transform, matrix, origin, flattensInheritedTransform, renderingContextID); |
+ context.current.renderingContextID = renderingContextIDForChildren; |
+ context.current.shouldFlattenInheritedTransform = childrenFlattenInheritedTransform; |
return; |
} |
} |
@@ -275,9 +299,14 @@ void PaintPropertyTreeBuilder::updatePerspective(const LayoutObject& object, Pai |
return; |
} |
+ // The perspective node must not flatten (else nothing will get |
+ // perspective), but it should still extend the rendering context as most |
+ // 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, TransformationMatrix().applyPerspective(style.perspective()), origin); |
+ object, context, context.current.transform, matrix, origin, context.current.shouldFlattenInheritedTransform, context.current.renderingContextID); |
+ context.current.shouldFlattenInheritedTransform = false; |
} |
void PaintPropertyTreeBuilder::updateSvgLocalToBorderBoxTransform(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
@@ -298,6 +327,8 @@ void PaintPropertyTreeBuilder::updateSvgLocalToBorderBoxTransform(const LayoutOb |
updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::svgLocalToBorderBoxTransform, &ObjectPaintProperties::setSvgLocalToBorderBoxTransform>( |
object, context, context.current.transform, transformToBorderBox, FloatPoint3D()); |
+ context.current.shouldFlattenInheritedTransform = false; |
+ context.current.renderingContextID = 0; |
} |
void PaintPropertyTreeBuilder::updateScrollTranslation(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
@@ -310,7 +341,8 @@ 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()); |
+ object, context, context.current.transform, matrix, FloatPoint3D(), context.current.shouldFlattenInheritedTransform, context.current.renderingContextID); |
+ context.current.shouldFlattenInheritedTransform = false; |
return; |
} |
} |
@@ -412,8 +444,6 @@ void PaintPropertyTreeBuilder::buildTreeNodes(const LayoutObject& object, PaintP |
updateLocalBorderBoxContext(object, context); |
updateScrollbarPaintOffset(object, context); |
updateOverflowClip(object, context); |
- // TODO(trchen): Insert flattening transform here, as specified by |
- // http://www.w3.org/TR/css3-transforms/#transform-style-property |
updatePerspective(object, context); |
updateSvgLocalToBorderBoxTransform(object, context); |
updateScrollTranslation(object, context); |