From 944645a6ad0b736f9e488378c72a3ad026ff38d4 Mon Sep 17 00:00:00 2001 From: Robert O'Callahan Date: Thu, 3 Oct 2013 08:34:24 -0400 Subject: [PATCH] Bug 923193. Make transform-origin on SVG elements use the SVG bbox as the reference rectangle. r=heycam --HG-- extra : rebase_source : 7c8d1b42a09b9389d082195edd0c683e2dc7e12e --- layout/base/nsDisplayList.cpp | 10 ++++++---- layout/reftests/transform/reftest.list | 2 ++ .../reftests/transform/transform-origin-svg-1-ref.svg | 3 +++ layout/reftests/transform/transform-origin-svg-1a.svg | 6 ++++++ layout/reftests/transform/transform-origin-svg-1b.svg | 7 +++++++ 5 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 layout/reftests/transform/transform-origin-svg-1-ref.svg create mode 100644 layout/reftests/transform/transform-origin-svg-1a.svg create mode 100644 layout/reftests/transform/transform-origin-svg-1b.svg diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index b2ca198db29..3a0a6a1ffe4 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -3829,8 +3829,9 @@ nsDisplayTransform::GetFrameBoundsForTransform(const nsIFrame* aFrame) NS_PRECONDITION(aFrame, "Can't get the bounds of a nonexistent frame!"); if (aFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT) { - // TODO: SVG needs to define what percentage translations resolve against. - return nsRect(); + gfxRect bbox = nsSVGUtils::GetBBox(const_cast(aFrame)); + return nsLayoutUtils::RoundGfxRectToAppRect(bbox, + aFrame->PresContext()->AppUnitsPerCSSPixel()) - aFrame->GetPosition(); } return nsRect(nsPoint(0, 0), aFrame->GetSize()); @@ -3846,8 +3847,9 @@ nsDisplayTransform::GetFrameBoundsForTransform(const nsIFrame* aFrame) nsRect result; if (aFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT) { - // TODO: SVG needs to define what percentage translations resolve against. - return result; + gfxRect bbox = nsSVGUtils::GetBBox(const_cast(aFrame)); + return nsLayoutUtils::RoundGfxRectToAppRect(bbox, + aFrame->PresContext()->AppUnitsPerCSSPixel()) - aFrame->GetPosition(); } /* Iterate through the continuation list, unioning together all the diff --git a/layout/reftests/transform/reftest.list b/layout/reftests/transform/reftest.list index 468aa2b2b5a..6926689701b 100644 --- a/layout/reftests/transform/reftest.list +++ b/layout/reftests/transform/reftest.list @@ -124,3 +124,5 @@ skip-if(B2G) fails-if(Android) fuzzy-if(cocoaWidget,1,2) == stresstest-1.html st == table-2b.html table-2-ref.html # Bug 722463 == inline-1a.html inline-1-ref.html +== transform-origin-svg-1a.svg transform-origin-svg-1-ref.svg +== transform-origin-svg-1b.svg transform-origin-svg-1-ref.svg diff --git a/layout/reftests/transform/transform-origin-svg-1-ref.svg b/layout/reftests/transform/transform-origin-svg-1-ref.svg new file mode 100644 index 00000000000..191ca90410c --- /dev/null +++ b/layout/reftests/transform/transform-origin-svg-1-ref.svg @@ -0,0 +1,3 @@ + + + diff --git a/layout/reftests/transform/transform-origin-svg-1a.svg b/layout/reftests/transform/transform-origin-svg-1a.svg new file mode 100644 index 00000000000..da94ad39291 --- /dev/null +++ b/layout/reftests/transform/transform-origin-svg-1a.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/layout/reftests/transform/transform-origin-svg-1b.svg b/layout/reftests/transform/transform-origin-svg-1b.svg new file mode 100644 index 00000000000..4478318600e --- /dev/null +++ b/layout/reftests/transform/transform-origin-svg-1b.svg @@ -0,0 +1,7 @@ + + + + +