Bug 1355675 Part 1: Add optional inCSSUnits parameters to GetTransformMatrix and GetTransformToAncestor.
MozReview-Commit-ID: EA5uqeoUWE3
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -2667,29 +2667,31 @@ nsLayoutUtils::PostTranslate(Matrix4x4&
if (aRounded) {
gfxOrigin.x = NS_round(gfxOrigin.x);
gfxOrigin.y = NS_round(gfxOrigin.y);
}
aTransform.PostTranslate(gfxOrigin);
}
Matrix4x4
-nsLayoutUtils::GetTransformToAncestor(nsIFrame *aFrame, const nsIFrame *aAncestor)
+nsLayoutUtils::GetTransformToAncestor(nsIFrame *aFrame,
+ const nsIFrame *aAncestor,
+ bool aInCSSUnits)
{
nsIFrame* parent;
Matrix4x4 ctm;
if (aFrame == aAncestor) {
return ctm;
}
- ctm = aFrame->GetTransformMatrix(aAncestor, &parent);
+ ctm = aFrame->GetTransformMatrix(aAncestor, &parent, aInCSSUnits);
while (parent && parent != aAncestor) {
if (!parent->Extend3DContext()) {
ctm.ProjectTo2D();
}
- ctm = ctm * parent->GetTransformMatrix(aAncestor, &parent);
+ ctm = ctm * parent->GetTransformMatrix(aAncestor, &parent, aInCSSUnits);
}
return ctm;
}
gfxSize
nsLayoutUtils::GetTransformToAncestorScale(nsIFrame* aFrame)
{
Matrix4x4 transform = GetTransformToAncestor(aFrame,
--- a/layout/base/nsLayoutUtils.h
+++ b/layout/base/nsLayoutUtils.h
@@ -844,19 +844,22 @@ public:
const nsRect& aRect,
const nsIFrame* aAncestor,
bool* aPreservesAxisAlignedRectangles = nullptr,
mozilla::Maybe<Matrix4x4>* aMatrixCache = nullptr);
/**
* Gets the transform for aFrame relative to aAncestor. Pass null for
- * aAncestor to go up to the root frame.
+ * aAncestor to go up to the root frame. aInCSSUnits set to true will
+ * return CSS units, set to false (the default) will return App units.
*/
- static Matrix4x4 GetTransformToAncestor(nsIFrame *aFrame, const nsIFrame *aAncestor);
+ static Matrix4x4 GetTransformToAncestor(nsIFrame *aFrame,
+ const nsIFrame *aAncestor,
+ bool aInCSSUnits = false);
/**
* Gets the scale factors of the transform for aFrame relative to the root
* frame if this transform is 2D, or the identity scale factors otherwise.
*/
static gfxSize GetTransformToAncestorScale(nsIFrame* aFrame);
/**
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -6297,31 +6297,33 @@ nsIFrame::GetNearestWidget(nsPoint& aOff
nsIWidget* widget =
GetClosestView(&offsetToView)->GetNearestWidget(&offsetToWidget);
aOffset = offsetToView + offsetToWidget;
return widget;
}
Matrix4x4
nsIFrame::GetTransformMatrix(const nsIFrame* aStopAtAncestor,
- nsIFrame** aOutAncestor)
+ nsIFrame** aOutAncestor,
+ bool aInCSSUnits)
{
NS_PRECONDITION(aOutAncestor, "Need a place to put the ancestor!");
/* If we're transformed, we want to hand back the combination
* transform/translate matrix that will apply our current transform, then
* shift us to our parent.
*/
if (IsTransformed()) {
/* Compute the delta to the parent, which we need because we are converting
* coordinates to our parent.
*/
NS_ASSERTION(nsLayoutUtils::GetCrossDocParentFrame(this),
"Cannot transform the viewport frame!");
- int32_t scaleFactor = PresContext()->AppUnitsPerDevPixel();
+ int32_t scaleFactor = (aInCSSUnits ? PresContext()->AppUnitsPerCSSPixel()
+ : PresContext()->AppUnitsPerDevPixel());
Matrix4x4 result = nsDisplayTransform::GetResultingTransformMatrix(this,
nsPoint(0,0), scaleFactor,
nsDisplayTransform::INCLUDE_PERSPECTIVE|nsDisplayTransform::OFFSET_BY_ORIGIN,
nullptr);
*aOutAncestor = nsLayoutUtils::GetCrossDocParentFrame(this);
nsPoint delta = GetOffsetToCrossDoc(*aOutAncestor);
/* Combine the raw transform with a translation to our parent. */
@@ -6396,17 +6398,18 @@ nsIFrame::GetTransformMatrix(const nsIFr
}
NS_ASSERTION(*aOutAncestor, "Somehow ended up with a null ancestor...?");
/* Translate from this frame to our ancestor, if it exists. That's the
* entire transform, so we're done.
*/
nsPoint delta = GetOffsetToCrossDoc(*aOutAncestor);
- int32_t scaleFactor = PresContext()->AppUnitsPerDevPixel();
+ int32_t scaleFactor = (aInCSSUnits ? PresContext()->AppUnitsPerCSSPixel()
+ : PresContext()->AppUnitsPerDevPixel());
return Matrix4x4::Translation(NSAppUnitsToFloatPixels(delta.x, scaleFactor),
NSAppUnitsToFloatPixels(delta.y, scaleFactor),
0.0f);
}
static void InvalidateRenderingObservers(nsIFrame* aFrame)
{
nsSVGEffects::InvalidateDirectRenderingObservers(aFrame);
--- a/layout/generic/nsIFrame.h
+++ b/layout/generic/nsIFrame.h
@@ -2731,17 +2731,18 @@ public:
* this frame is not a root frame, then *aOutAncestor will be in the same
* document as this frame. If this frame IsTransformed(), then *aOutAncestor
* will be the parent frame (if not preserve-3d) or the nearest non-transformed
* ancestor (if preserve-3d).
* @return A Matrix4x4 that converts points in this frame's coordinate space
* into points in aOutAncestor's coordinate space.
*/
Matrix4x4 GetTransformMatrix(const nsIFrame* aStopAtAncestor,
- nsIFrame **aOutAncestor);
+ nsIFrame **aOutAncestor,
+ bool aInCSSUnits = false);
/**
* Bit-flags to pass to IsFrameOfType()
*/
enum {
eMathML = 1 << 0,
eSVG = 1 << 1,
eSVGForeignObject = 1 << 2,