Bug 722603 - Part 2: Use cached transform as much as possible (r=roc).

This commit is contained in:
Matt Woodrow 2012-02-14 01:12:49 -08:00
parent 11c4f62cb8
commit 77b2ac0b85
2 changed files with 36 additions and 19 deletions

View File

@ -2656,11 +2656,12 @@ bool nsDisplayTransform::ComputeVisibility(nsDisplayListBuilder *aBuilder,
* think that it's painting in its original rectangular coordinate space.
* If we can't untransform, take the entire overflow rect */
nsRect untransformedVisibleRect;
float factor = nsPresContext::AppUnitsPerCSSPixel();
if (ShouldPrerenderTransformedContent(aBuilder, mFrame) ||
!UntransformRect(mVisibleRect,
mFrame,
aBuilder->ToReferenceFrame(mFrame),
&untransformedVisibleRect))
!UntransformRectMatrix(mVisibleRect,
GetTransform(factor),
factor,
&untransformedVisibleRect))
{
untransformedVisibleRect = mFrame->GetVisualOverflowRectRelativeToSelf() +
aBuilder->ToReferenceFrame(mFrame);
@ -2797,7 +2798,8 @@ nsRegion nsDisplayTransform::GetOpaqueRegion(nsDisplayListBuilder *aBuilder,
*aForceTransparentSurface = false;
}
nsRect untransformedVisible;
if (!UntransformRect(mVisibleRect, mFrame, ToReferenceFrame(), &untransformedVisible)) {
float factor = nsPresContext::AppUnitsPerCSSPixel();
if (!UntransformRectMatrix(mVisibleRect, GetTransform(factor), factor, &untransformedVisible)) {
return nsRegion();
}
@ -2820,7 +2822,8 @@ nsRegion nsDisplayTransform::GetOpaqueRegion(nsDisplayListBuilder *aBuilder,
bool nsDisplayTransform::IsUniform(nsDisplayListBuilder *aBuilder, nscolor* aColor)
{
nsRect untransformedVisible;
if (!UntransformRect(mVisibleRect, mFrame, ToReferenceFrame(), &untransformedVisible)) {
float factor = nsPresContext::AppUnitsPerCSSPixel();
if (!UntransformRectMatrix(mVisibleRect, GetTransform(factor), factor, &untransformedVisible)) {
return false;
}
const gfx3DMatrix& matrix = GetTransform(nsPresContext::AppUnitsPerCSSPixel());
@ -2914,6 +2917,27 @@ nsRect nsDisplayTransform::TransformRectOut(const nsRect &aUntransformedBounds,
factor);
}
bool nsDisplayTransform::UntransformRectMatrix(const nsRect &aUntransformedBounds,
const gfx3DMatrix& aMatrix,
float aFactor,
nsRect *aOutRect)
{
if (aMatrix.IsSingular())
return false;
gfxRect result(NSAppUnitsToFloatPixels(aUntransformedBounds.x, aFactor),
NSAppUnitsToFloatPixels(aUntransformedBounds.y, aFactor),
NSAppUnitsToFloatPixels(aUntransformedBounds.width, aFactor),
NSAppUnitsToFloatPixels(aUntransformedBounds.height, aFactor));
/* We want to untransform the matrix, so invert the transformation first! */
result = aMatrix.Inverse().ProjectRectBounds(result);
*aOutRect = nsLayoutUtils::RoundGfxRectToAppRect(result, aFactor);
return true;
}
bool nsDisplayTransform::UntransformRect(const nsRect &aUntransformedBounds,
const nsIFrame* aFrame,
const nsPoint &aOrigin,
@ -2926,20 +2950,8 @@ bool nsDisplayTransform::UntransformRect(const nsRect &aUntransformedBounds,
*/
float factor = nsPresContext::AppUnitsPerCSSPixel();
gfx3DMatrix matrix = GetResultingTransformMatrix(aFrame, aOrigin, factor, nsnull);
if (matrix.IsSingular())
return false;
gfxRect result(NSAppUnitsToFloatPixels(aUntransformedBounds.x, factor),
NSAppUnitsToFloatPixels(aUntransformedBounds.y, factor),
NSAppUnitsToFloatPixels(aUntransformedBounds.width, factor),
NSAppUnitsToFloatPixels(aUntransformedBounds.height, factor));
/* We want to untransform the matrix, so invert the transformation first! */
result = matrix.Inverse().ProjectRectBounds(result);
*aOutRect = nsLayoutUtils::RoundGfxRectToAppRect(result, factor);
return true;
return UntransformRectMatrix(aUntransformedBounds, matrix, factor, aOutRect);
}
nsDisplaySVGEffects::nsDisplaySVGEffects(nsDisplayListBuilder* aBuilder,

View File

@ -2175,6 +2175,11 @@ public:
const nsIFrame* aFrame,
const nsPoint &aOrigin,
nsRect* aOutRect);
static bool UntransformRectMatrix(const nsRect &aUntransformedBounds,
const gfx3DMatrix& aMatrix,
float aFactor,
nsRect* aOutRect);
/**
* Returns the bounds of a frame as defined for resolving percentage