author | Robert O'Callahan <robert@ocallahan.org> |
Fri, 09 Nov 2012 18:14:14 -0500 | |
changeset 113429 | 85793c93543aabf86d2003139a6fb1b19eb1d8a4 |
parent 113428 | 76e6feedd0d6ab359ba04ccc94b8356ef646d22a |
child 113430 | 12182f4817cf2c65f35d5820b759c83b15d9ee47 |
push id | 18151 |
push user | rocallahan@mozilla.com |
push date | Fri, 16 Nov 2012 00:03:18 +0000 |
treeherder | mozilla-inbound@e8c599817e97 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | mattwoodrow |
bugs | 810470 |
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/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -2309,43 +2309,16 @@ ContainerState::InvalidateForLayerChange } if (!combined.IsEmpty()) { InvalidatePostTransformRegion(newThebesLayer, combined.ScaleToOutsidePixels(data->mXScale, data->mYScale, mAppUnitsPerDevPixel), GetTranslationForThebesLayer(newThebesLayer)); } } -bool -FrameLayerBuilder::NeedToInvalidateFixedDisplayItem(nsDisplayListBuilder* aBuilder, - nsDisplayItem* aItem) -{ - if (!aItem->ShouldFixToViewport(aBuilder)) { - return true; - } - - nsRefPtr<LayerManager> layerManager; - nsIFrame* referenceFrame = aBuilder->RootReferenceFrame(); - NS_ASSERTION(referenceFrame == nsLayoutUtils::GetDisplayRootFrame(referenceFrame), - "Reference frame must be a display root for us to use the layer manager"); - nsIWidget* window = referenceFrame->GetNearestWidget(); - if (window) { - layerManager = window->GetLayerManager(); - } - - if (layerManager) { - DisplayItemData* data = GetDisplayItemDataForManager(aItem, layerManager); - if (data) { - return false; - } - } - - return true; -} - void FrameLayerBuilder::AddThebesDisplayItem(ThebesLayer* aLayer, nsDisplayItem* aItem, const Clip& aClip, nsIFrame* aContainerLayerFrame, LayerState aLayerState, const nsPoint& aTopLeft, nsAutoPtr<nsDisplayItemGeometry> aGeometry)
--- a/layout/base/FrameLayerBuilder.h +++ b/layout/base/FrameLayerBuilder.h @@ -317,26 +317,16 @@ public: * Destroy any stored LayerManagerDataProperty and the associated data for * aFrame. */ static void DestroyDisplayItemDataFor(nsIFrame* aFrame); LayerManager* GetRetainingLayerManager() { return mRetainingManager; } /** - * Returns true if the given item (which we assume here is - * background-attachment:fixed) needs to be repainted as we scroll in its - * document. - * Returns false if it doesn't need to be repainted because the layer system - * is ensuring its fixed-ness for us. - */ - static bool NeedToInvalidateFixedDisplayItem(nsDisplayListBuilder* aBuilder, - nsDisplayItem* aItem); - - /** * Returns true if the given display item was rendered during the previous * paint. Returns false otherwise. */ static bool HasRetainedDataFor(nsIFrame* aFrame, uint32_t aDisplayItemKey); class DisplayItemData; typedef void (*DisplayItemDataCallback)(nsIFrame *aFrame, DisplayItemData* aItem);
--- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -1666,66 +1666,16 @@ CanScrollWithBlitting(nsIFrame* aFrame) return false; } if (nsLayoutUtils::IsPopup(f)) break; } return true; } -static void -InvalidateFixedBackgroundFramesFromList(nsDisplayListBuilder* aBuilder, - nsIFrame* aMovingFrame, - const nsDisplayList& aList) -{ - for (nsDisplayItem* item = aList.GetBottom(); item; item = item->GetAbove()) { - nsDisplayList* sublist = item->GetSameCoordinateSystemChildren(); - if (sublist) { - InvalidateFixedBackgroundFramesFromList(aBuilder, aMovingFrame, *sublist); - continue; - } - nsIFrame* f = item->GetUnderlyingFrame(); - if (f && - item->IsVaryingRelativeToMovingFrame(aBuilder, aMovingFrame)) { - if (FrameLayerBuilder::NeedToInvalidateFixedDisplayItem(aBuilder, item)) { - // FrameLayerBuilder does not take care of scrolling this one - f->InvalidateFrame(); - } - } - } -} - -static void -InvalidateFixedBackgroundFrames(nsIFrame* aRootFrame, - nsIFrame* aMovingFrame, - const nsRect& aUpdateRect) -{ - if (!aMovingFrame->PresContext()->MayHaveFixedBackgroundFrames()) - return; - - NS_ASSERTION(aRootFrame != aMovingFrame, - "The root frame shouldn't be the one that's moving, that makes no sense"); - - // Build the 'after' display list over the whole area of interest. - nsDisplayListBuilder builder(aRootFrame, nsDisplayListBuilder::OTHER, true); - builder.EnterPresShell(aRootFrame, aUpdateRect); - nsDisplayList list; - nsresult rv = - aRootFrame->BuildDisplayListForStackingContext(&builder, aUpdateRect, &list); - builder.LeavePresShell(aRootFrame, aUpdateRect); - if (NS_FAILED(rv)) - return; - - nsRegion visibleRegion(aUpdateRect); - list.ComputeVisibilityForRoot(&builder, &visibleRegion); - - InvalidateFixedBackgroundFramesFromList(&builder, aMovingFrame, list); - list.DeleteAll(); -} - bool nsGfxScrollFrameInner::IsIgnoringViewportClipping() const { if (!mIsRoot) return false; nsSubDocumentFrame* subdocFrame = static_cast<nsSubDocumentFrame*> (nsLayoutUtils::GetCrossDocParentFrame(mOuter->PresContext()->PresShell()->GetRootFrame())); return subdocFrame && !subdocFrame->ShouldClipSubdocument(); } @@ -1791,41 +1741,28 @@ void nsGfxScrollFrameInner::ScrollVisual // scroll frame of a content document, then IsAlwaysActive() // will return true from now on and MarkInactive() won't // have any effect. mHasBeenScrolled = true; AdjustViews(mScrolledFrame); // We need to call this after fixing up the view positions // to be consistent with the frame hierarchy. - bool invalidate = false; bool canScrollWithBlitting = CanScrollWithBlitting(mOuter); mOuter->RemoveStateBits(NS_SCROLLFRAME_INVALIDATE_CONTENTS_ON_SCROLL); if (IsScrollingActive()) { if (!canScrollWithBlitting) { MarkInactive(); - } else { - invalidate = true; } } if (canScrollWithBlitting) { MarkActive(); } mOuter->SchedulePaint(); - - if (invalidate) { - nsIFrame* displayRoot = nsLayoutUtils::GetDisplayRootFrame(mOuter); - nsRect update = - GetScrollPortRect() + mOuter->GetOffsetToCrossDoc(displayRoot); - nsRect displayRootUpdate = update.ConvertAppUnitsRoundOut( - mOuter->PresContext()->AppUnitsPerDevPixel(), - displayRoot->PresContext()->AppUnitsPerDevPixel()); - InvalidateFixedBackgroundFrames(displayRoot, mScrolledFrame, displayRootUpdate); - } } /** * Return an appunit value close to aDesired and between aLower and aUpper * such that (aDesired - aCurrent)*aRes/aAppUnitsPerPixel is an integer (or * as close as we can get modulo rounding to appunits). If that * can't be done, just returns aDesired. */