author | Matt Woodrow <mwoodrow@mozilla.com> |
Mon, 05 Nov 2012 12:12:05 +1300 | |
changeset 112286 | 92cdd367285d6e1633b33a37197bfcc3b2e43352 |
parent 112285 | 5a5775d8c49887ea2ebfde1224e71298bab94754 |
child 112287 | f1760425256bf673f9c39ac9da4d7a6d5d423882 |
push id | 23809 |
push user | emorley@mozilla.com |
push date | Mon, 05 Nov 2012 15:24:12 +0000 |
treeherder | mozilla-central@358c9830d166 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | roc |
bugs | 807563 |
milestone | 19.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -7800,16 +7800,17 @@ DoApplyRenderingChangeToTree(nsIFrame* a if (aChange & nsChangeHint_UpdateOpacityLayer) { // FIXME/bug 796697: we can get away with empty transactions for // opacity updates in many cases. needInvalidatingPaint = true; aFrame->MarkLayersActive(nsChangeHint_UpdateOpacityLayer); } 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 // paint. if (!needInvalidatingPaint) { needInvalidatingPaint |= !aFrame->TryUpdateTransformOnly(); } }
--- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -6979,30 +6979,29 @@ nsIFrame::FinishAndStoreOverflow(nsOverf * ensured us we'll use. */ nsRect newBounds(nsPoint(0, 0), aNewSize); // Transform affects both overflow areas. NS_FOR_FRAME_OVERFLOW_TYPES(otype) { 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()); if (ChildrenHavePerspective() && sizeChanged) { nsRect newBounds(nsPoint(0, 0), aNewSize); RecomputePerspectiveChildrenOverflow(this->GetStyleContext(), &newBounds); } } + RemoveStateBits(NS_FRAME_TRANSFORM_CHANGED); bool anyOverflowChanged; if (aOverflowAreas != nsOverflowAreas(bounds, bounds)) { anyOverflowChanged = SetOverflowAreas(aOverflowAreas); } else { anyOverflowChanged = ClearOverflowRects(); }
--- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -247,16 +247,20 @@ typedef uint64_t nsFrameState; // TEXT_FORCE_TRIM_WHITESPACE. That's OK because we only check the // NS_FRAME_IS_PUSHED_FLOAT bit on frames which we already know are // out-of-flow. #define NS_FRAME_IS_PUSHED_FLOAT NS_FRAME_STATE_BIT(32) // 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 // bit; we could free up this bit with a little extra complexity. #define NS_FRAME_UPDATE_LAYER_TREE NS_FRAME_STATE_BIT(36) // Frame can accept absolutely positioned children. #define NS_FRAME_HAS_ABSPOS_CHILDREN NS_FRAME_STATE_BIT(37)