Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(507)

Unified Diff: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp

Issue 1865093004: Add a transform paint property for local SVG transforms (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: dcheck that SVG does not scroll and describe it in a comment Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 0f4ce55544b5ed642f8c6538ac0f7e952678d8da..39ca33400060edddafec5d0d5570e38735727415 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
@@ -177,18 +177,6 @@ static FloatPoint3D transformOrigin(const LayoutBox& box)
static PassRefPtr<TransformPaintPropertyNode> createTransformIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
{
- if (object.isSVG() && !object.isSVGRoot()) {
- const AffineTransform& transform = object.localToSVGParentTransform();
- 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;
@@ -204,6 +192,22 @@ static PassRefPtr<TransformPaintPropertyNode> createTransformIfNeeded(const Layo
return newTransformNodeForTransform.release();
}
+static PassRefPtr<TransformPaintPropertyNode> createSvgLocalTransformIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
+{
+ if (!object.isSVG())
+ return nullptr;
+
+ const AffineTransform& transform = object.localToSVGParentTransform();
+ if (transform.isIdentity())
+ return nullptr;
+
+ // SVG's transform origin is baked into the localToSVGParentTransform so we use 0's for the origin.
+ RefPtr<TransformPaintPropertyNode> newTransformNodeForTransform = TransformPaintPropertyNode::create(
+ transform, FloatPoint3D(0, 0, 0), context.currentTransform);
+ context.currentTransform = newTransformNodeForTransform.get();
+ return newTransformNodeForTransform.release();
+}
+
static PassRefPtr<EffectPaintPropertyNode> createEffectIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
{
const ComputedStyle& style = object.styleRef();
@@ -331,6 +335,7 @@ static PassRefPtr<TransformPaintPropertyNode> createScrollTranslationIfNeeded(co
static void updateOutOfFlowContext(const LayoutObject& object, PaintPropertyTreeBuilderContext& context, ClipPaintPropertyNode* newClipNodeForCSSClip, RefPtr<ClipPaintPropertyNode>& newClipNodeForCSSClipFixedPosition)
{
+ // TODO(pdr): Always create an SVG transform for the root and remove this paint offset quirk.
// At the html->svg boundary (see: createPaintOffsetTranslationIfNeeded) the currentTransform is
// up-to-date for all children of the svg root element. Additionally, inside SVG, all positioning
// uses transforms. Therefore, we only need to check createdNewTransform and isSVGRoot() to
@@ -400,11 +405,16 @@ void PaintPropertyTreeBuilder::walk(LayoutObject& object, const PaintPropertyTre
// TODO(trchen): Insert flattening transform here, as specified by
// http://www.w3.org/TR/css3-transforms/#transform-style-property
RefPtr<TransformPaintPropertyNode> newTransformNodeForPerspective = createPerspectiveIfNeeded(object, localContext);
+ RefPtr<TransformPaintPropertyNode> newTransformNodeForSvgLocalTransform = createSvgLocalTransformIfNeeded(object, localContext);
RefPtr<TransformPaintPropertyNode> newTransformNodeForScrollTranslation = createScrollTranslationIfNeeded(object, localContext);
RefPtr<ClipPaintPropertyNode> newClipNodeForCSSClipFixedPosition;
updateOutOfFlowContext(object, localContext, newClipNodeForCSSClip.get(), newClipNodeForCSSClipFixedPosition);
- if (newTransformNodeForPaintOffsetTranslation || newTransformNodeForTransform || newEffectNode || newClipNodeForCSSClip || newClipNodeForCSSClipFixedPosition || newClipNodeForOverflowClip || newTransformNodeForPerspective || newTransformNodeForScrollTranslation || newTransformNodeForScrollbarPaintOffset || newRecordedContext) {
+ DCHECK(!newTransformNodeForSvgLocalTransform || !newTransformNodeForScrollTranslation)
+ << "SVG elements cannot have scroll translation";
+
+ // TODO(pdr): Refactor this to use a less massive if statement.
+ if (newTransformNodeForPaintOffsetTranslation || newTransformNodeForTransform || newEffectNode || newClipNodeForCSSClip || newClipNodeForCSSClipFixedPosition || newClipNodeForOverflowClip || newTransformNodeForPerspective || newTransformNodeForSvgLocalTransform || newTransformNodeForScrollTranslation || newTransformNodeForScrollbarPaintOffset || newRecordedContext) {
OwnPtr<ObjectPaintProperties> updatedPaintProperties = ObjectPaintProperties::create(
newTransformNodeForPaintOffsetTranslation.release(),
newTransformNodeForTransform.release(),
@@ -413,6 +423,7 @@ void PaintPropertyTreeBuilder::walk(LayoutObject& object, const PaintPropertyTre
newClipNodeForCSSClipFixedPosition.release(),
newClipNodeForOverflowClip.release(),
newTransformNodeForPerspective.release(),
+ newTransformNodeForSvgLocalTransform.release(),
newTransformNodeForScrollTranslation.release(),
newTransformNodeForScrollbarPaintOffset.release(),
newRecordedContext.release());

Powered by Google App Engine
This is Rietveld 408576698