Bug 807563 - Update the overflow areas of all preserve-3d children when the transform changes. r=roc

This commit is contained in:
Matt Woodrow 2012-11-05 12:12:05 +13:00
parent ecdc83dbd2
commit 1e525216af
3 changed files with 10 additions and 6 deletions

View File

@ -7805,6 +7805,7 @@ DoApplyRenderingChangeToTree(nsIFrame* aFrame,
}
if (aChange & nsChangeHint_UpdateTransformLayer) {
aFrame->MarkLayersActive(nsChangeHint_UpdateTransformLayer);
aFrame->AddStateBits(NS_FRAME_TRANSFORM_CHANGED);
// If we're not already going to do an invalidating paint, see
// if we can get away with only updating the transform on a
// layer for this frame, and not scheduling an invalidating

View File

@ -6984,12 +6984,10 @@ nsIFrame::FinishAndStoreOverflow(nsOverflowAreas& aOverflowAreas,
nsRect& o = aOverflowAreas.Overflow(otype);
o = nsDisplayTransform::TransformRect(o, this, nsPoint(0, 0), &newBounds);
}
if (sizeChanged) {
if (Preserves3DChildren()) {
ComputePreserve3DChildrenOverflow(aOverflowAreas, newBounds);
} else if (ChildrenHavePerspective()) {
RecomputePerspectiveChildrenOverflow(this->GetStyleContext(), &newBounds);
}
if ((sizeChanged || HasAnyStateBits(NS_FRAME_TRANSFORM_CHANGED)) && Preserves3DChildren()) {
ComputePreserve3DChildrenOverflow(aOverflowAreas, newBounds);
} else if (sizeChanged && ChildrenHavePerspective()) {
RecomputePerspectiveChildrenOverflow(this->GetStyleContext(), &newBounds);
}
} else {
Properties().Delete(nsIFrame::PreTransformOverflowAreasProperty());
@ -6998,6 +6996,7 @@ nsIFrame::FinishAndStoreOverflow(nsOverflowAreas& aOverflowAreas,
RecomputePerspectiveChildrenOverflow(this->GetStyleContext(), &newBounds);
}
}
RemoveStateBits(NS_FRAME_TRANSFORM_CHANGED);
bool anyOverflowChanged;

View File

@ -252,6 +252,10 @@ typedef uint64_t nsFrameState;
// This bit acts as a loop flag for recursive paint server drawing.
#define NS_FRAME_DRAWING_AS_PAINTSERVER NS_FRAME_STATE_BIT(33)
// Marks the frame as having a changed transform between processing
// nsChangeHint_UpdateTransformLayer and calling FinishAndStoreOverflow.
#define NS_FRAME_TRANSFORM_CHANGED NS_FRAME_STATE_BIT(34)
// Frame is a display root and the retained layer tree needs to be updated
// at the next paint via display list construction.
// Only meaningful for display roots, so we don't really need a global state