From 612325227f4147514e7e16e5ca8d81f960d74fdd Mon Sep 17 00:00:00 2001 From: Csoregi Natalia Date: Mon, 15 Apr 2019 18:15:49 +0300 Subject: [PATCH] Backed out 8 changesets (bug 1526972) for causing crashes (bug 1544406). a=backout Backed out changeset 815543d81a1d (bug 1526972) Backed out changeset a895c9028b31 (bug 1526972) Backed out changeset 2ea2f8533078 (bug 1526972) Backed out changeset 2fb940b13971 (bug 1526972) Backed out changeset 8543b9d46521 (bug 1526972) Backed out changeset ddd57e437228 (bug 1526972) Backed out changeset 54b14df56e6f (bug 1526972) Backed out changeset a59f06022a95 (bug 1526972) --- layout/generic/TextOverflow.cpp | 2 +- layout/generic/ViewportFrame.cpp | 7 +- layout/generic/nsBulletFrame.cpp | 2 +- layout/generic/nsFrame.cpp | 9 +- layout/generic/nsGfxScrollFrame.cpp | 6 - layout/generic/nsPageFrame.cpp | 8 +- layout/generic/nsSubDocumentFrame.cpp | 3 +- layout/ipc/RenderFrame.cpp | 5 + layout/ipc/RenderFrame.h | 4 +- .../painting/RetainedDisplayListBuilder.cpp | 52 ++-- layout/painting/RetainedDisplayListHelpers.h | 6 +- layout/painting/nsDisplayList.cpp | 137 ++------- layout/painting/nsDisplayList.h | 273 +++++++++--------- layout/svg/SVGTextFrame.cpp | 2 +- layout/xul/nsTextBoxFrame.cpp | 2 +- layout/xul/tree/nsTreeBodyFrame.cpp | 2 +- 16 files changed, 193 insertions(+), 327 deletions(-) diff --git a/layout/generic/TextOverflow.cpp b/layout/generic/TextOverflow.cpp index c123e3044a7c..6c4ef5dff218 100644 --- a/layout/generic/TextOverflow.cpp +++ b/layout/generic/TextOverflow.cpp @@ -218,7 +218,7 @@ static void PaintTextShadowCallback(gfxContext* aCtx, nsPoint aShadowOffset, void nsDisplayTextOverflowMarker::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) { DrawTargetAutoDisableSubpixelAntialiasing disable(aCtx->GetDrawTarget(), - IsSubpixelAADisabled()); + mDisableSubpixelAA); nscolor foregroundColor = nsLayoutUtils::GetColor(mFrame, &nsStyleText::mWebkitTextFillColor); diff --git a/layout/generic/ViewportFrame.cpp b/layout/generic/ViewportFrame.cpp index 0aa792179a9a..4b846a1b2c56 100644 --- a/layout/generic/ViewportFrame.cpp +++ b/layout/generic/ViewportFrame.cpp @@ -106,11 +106,8 @@ static void BuildDisplayListForTopLayerFrame(nsDisplayListBuilder* aBuilder, asrSetter.SetCurrentActiveScrolledRoot( savedOutOfFlowData->mContainingBlockActiveScrolledRoot); } - // This function jumps into random frames that may not be descendants of - // aBuilder->mCurrentFrame, so aBuilder->mInInvalidSubtree is unrelated. - // Request recalculation of mInInvalidSubtree. nsDisplayListBuilder::AutoBuildingDisplayList buildingForChild( - aBuilder, aFrame, visible, dirty, nsDisplayListBuilder::RIIS_YES); + aBuilder, aFrame, visible, dirty); nsDisplayList list; aFrame->BuildDisplayListForStackingContext(aBuilder, &list); @@ -156,10 +153,8 @@ void ViewportFrame::BuildDisplayListForTopLayer(nsDisplayListBuilder* aBuilder, nsIFrame* backdropFrame = static_cast(backdropPh)->GetOutOfFlowFrame(); MOZ_ASSERT(backdropFrame); - BuildDisplayListForTopLayerFrame(aBuilder, backdropFrame, aList); } - BuildDisplayListForTopLayerFrame(aBuilder, frame, aList); } } diff --git a/layout/generic/nsBulletFrame.cpp b/layout/generic/nsBulletFrame.cpp index 89884044fb4d..5311f6d097f7 100644 --- a/layout/generic/nsBulletFrame.cpp +++ b/layout/generic/nsBulletFrame.cpp @@ -646,7 +646,7 @@ void nsDisplayBullet::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) { } ImgDrawResult result = static_cast(mFrame)->PaintBullet( - *aCtx, ToReferenceFrame(), GetPaintRect(), flags, IsSubpixelAADisabled()); + *aCtx, ToReferenceFrame(), GetPaintRect(), flags, mDisableSubpixelAA); nsDisplayBulletGeometry::UpdateDrawResult(this, result); } diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 9c25786c9a64..ffc0a16c65d2 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -3807,15 +3807,8 @@ void nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, NS_ASSERTION(!isStackingContext || pseudoStackingContext, "Stacking contexts must also be pseudo-stacking-contexts"); - // nsBlockFrame paints pushed floats directly, rather than through their - // placeholder, which is why we force a recallculation of InInvalidSubtree - // state. - auto recalcInInvalidSubtree = - (child->GetStateBits() & NS_FRAME_IS_PUSHED_FLOAT) - ? nsDisplayListBuilder::RIIS_YES - : nsDisplayListBuilder::RIIS_NO; nsDisplayListBuilder::AutoBuildingDisplayList buildingForChild( - aBuilder, child, visible, dirty, recalcInInvalidSubtree); + aBuilder, child, visible, dirty); DisplayListClipState::AutoClipMultiple clipState(aBuilder); nsDisplayListBuilder::AutoCurrentActiveScrolledRootSetter asrSetter(aBuilder); CheckForApzAwareEventHandlers(aBuilder, child); diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index ca07bca3c764..8cd8811ba111 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -3764,12 +3764,6 @@ void ScrollFrameHelper::MaybeAddTopLayerItems(nsDisplayListBuilder* aBuilder, nsDisplayList topLayerList; viewportFrame->BuildDisplayListForTopLayer(aBuilder, &topLayerList); if (!topLayerList.IsEmpty()) { - // This function jumps into random frames that may not be descendants of - // aBuilder->mCurrentFrame, so aBuilder->mInInvalidSubtree is unrelated. - // Request recalculation of mInInvalidSubtree. - nsDisplayListBuilder::AutoBuildingDisplayList buildingDisplayList( - aBuilder, viewportFrame, nsDisplayListBuilder::RIIS_YES); - // Wrap the whole top layer in a single item with maximum z-index, // and append it at the very end, so that it stays at the topmost. nsDisplayWrapList* wrapList = MakeDisplayItem( diff --git a/layout/generic/nsPageFrame.cpp b/layout/generic/nsPageFrame.cpp index 4f8b8120caf8..931911419794 100644 --- a/layout/generic/nsPageFrame.cpp +++ b/layout/generic/nsPageFrame.cpp @@ -457,7 +457,7 @@ class nsDisplayHeaderFooter final : public nsDisplayItem { MOZ_ASSERT(pageFrame, "We should have an nsPageFrame"); #endif static_cast(mFrame)->PaintHeaderFooter( - *aCtx, ToReferenceFrame(), IsSubpixelAADisabled()); + *aCtx, ToReferenceFrame(), mDisableSubpixelAA); } NS_DISPLAY_DECL_NAME("HeaderFooter", TYPE_HEADER_FOOTER) @@ -524,12 +524,8 @@ void nsPageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, while ((page = GetNextPage(page)) != nullptr) { nsRect childVisible = visibleRect + child->GetOffsetTo(page); - // This function jumps into random frames that may not be descendants of - // aBuilder->mCurrentFrame, so aBuilder->mInInvalidSubtree is unrelated. - // Request recalculation of mInInvalidSubtree. nsDisplayListBuilder::AutoBuildingDisplayList buildingForChild( - aBuilder, page, childVisible, childVisible, - nsDisplayListBuilder::RIIS_YES); + aBuilder, page, childVisible, childVisible); BuildDisplayListForExtraPage(aBuilder, this, page, &content); } diff --git a/layout/generic/nsSubDocumentFrame.cpp b/layout/generic/nsSubDocumentFrame.cpp index a06939aa5a71..d6551c49ec96 100644 --- a/layout/generic/nsSubDocumentFrame.cpp +++ b/layout/generic/nsSubDocumentFrame.cpp @@ -435,7 +435,7 @@ void nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, needsOwnLayer = true; } - if (subdocRootFrame && aBuilder->IsRetainingDisplayList()) { + if (aBuilder->IsRetainingDisplayList()) { // Caret frame changed, rebuild the entire subdoc. // We could just invalidate the old and new frame // areas and save some work here. RetainedDisplayListBuilder @@ -443,7 +443,6 @@ void nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // subdocs in advance. if (mPreviousCaret != aBuilder->GetCaretFrame()) { dirty = visible; - aBuilder->MarkFrameModifiedDuringBuilding(subdocRootFrame); aBuilder->RebuildAllItemsInCurrentSubtree(); // Mark the old caret frame as invalid so that we remove the // old nsDisplayCaret. We don't mark the current frame as invalid diff --git a/layout/ipc/RenderFrame.cpp b/layout/ipc/RenderFrame.cpp index 5b41e385af41..79d50aaa11cb 100644 --- a/layout/ipc/RenderFrame.cpp +++ b/layout/ipc/RenderFrame.cpp @@ -195,6 +195,11 @@ mozilla::LayerState nsDisplayRemote::GetLayerState( return mozilla::LAYER_ACTIVE_FORCE; } +bool nsDisplayRemote::HasDeletedFrame() const { + // RenderFrame might change without invalidating nsSubDocumentFrame. + return !GetFrameLoader() || nsDisplayItem::HasDeletedFrame(); +} + already_AddRefed nsDisplayRemote::BuildLayer( nsDisplayListBuilder* aBuilder, LayerManager* aManager, const ContainerLayerParameters& aContainerParameters) { diff --git a/layout/ipc/RenderFrame.h b/layout/ipc/RenderFrame.h index 5ce0e69a936b..954d4674e0af 100644 --- a/layout/ipc/RenderFrame.h +++ b/layout/ipc/RenderFrame.h @@ -90,8 +90,6 @@ class RenderFrame final { * nsFrameLoader) into its parent frame's layer tree. */ class nsDisplayRemote final : public nsDisplayItem { - friend class nsDisplayItem; - typedef mozilla::dom::TabId TabId; typedef mozilla::gfx::Matrix4x4 Matrix4x4; typedef mozilla::layers::EventRegionsOverride EventRegionsOverride; @@ -105,6 +103,8 @@ class nsDisplayRemote final : public nsDisplayItem { public: nsDisplayRemote(nsDisplayListBuilder* aBuilder, nsSubDocumentFrame* aFrame); + bool HasDeletedFrame() const override; + LayerState GetLayerState( nsDisplayListBuilder* aBuilder, LayerManager* aManager, const ContainerLayerParameters& aParameters) override; diff --git a/layout/painting/RetainedDisplayListBuilder.cpp b/layout/painting/RetainedDisplayListBuilder.cpp index 6b49c7bead32..700a9b51c14f 100644 --- a/layout/painting/RetainedDisplayListBuilder.cpp +++ b/layout/painting/RetainedDisplayListBuilder.cpp @@ -141,10 +141,11 @@ bool RetainedDisplayListBuilder::PreProcessDisplayList( MOZ_RELEASE_ASSERT(aList->mOldItems.IsEmpty()); while (nsDisplayItem* item = aList->RemoveBottom()) { #ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED - item->SetMergedPreProcessed(false, true); + item->mMergedItem = false; + item->mPreProcessedItem = true; #endif - if (!item->CanBeReused() || item->HasDeletedFrame()) { + if (item->HasDeletedFrame() || !item->CanBeReused()) { size_t i = aList->mOldItems.Length(); aList->mOldItems.AppendElement(OldItemInfo(nullptr)); item->Destroy(&mBuilder); @@ -213,9 +214,10 @@ void RetainedDisplayListBuilder::IncrementSubDocPresShellPaintCount( mBuilder.IncrementPresShellPaintCount(presShell); } -bool AnyContentAncestorModified(nsIFrame* aFrame, nsIFrame* aStopAtFrame) { - nsIFrame* f = aFrame; - while (f) { +static bool AnyContentAncestorModified(nsIFrame* aFrame, + nsIFrame* aStopAtFrame = nullptr) { + for (nsIFrame* f = aFrame; f; + f = nsLayoutUtils::GetParentOrPlaceholderForCrossDoc(f)) { if (f->IsFrameModified()) { return true; } @@ -223,12 +225,6 @@ bool AnyContentAncestorModified(nsIFrame* aFrame, nsIFrame* aStopAtFrame) { if (aStopAtFrame && f == aStopAtFrame) { break; } - - if (f->GetStateBits() & NS_FRAME_IS_PUSHED_FLOAT) { - f = f->GetParent(); - } else { - f = nsLayoutUtils::GetParentOrPlaceholderForCrossDoc(f); - } } return false; @@ -279,14 +275,6 @@ static void UpdateASR(nsDisplayItem* aItem, wrapList->UpdateHitTestInfoActiveScrolledRoot(*asr); } -OldItemInfo::OldItemInfo(nsDisplayItem* aItem) - : mItem(aItem), mUsed(false), mDiscarded(false) { - if (mItem) { - // Clear cached modified frame state when adding an item to the old list. - mItem->SetModifiedFrame(false); - } -} - void OldItemInfo::AddedMatchToMergedList(RetainedDisplayListBuilder* aBuilder, MergedListIndex aIndex) { AddedToMergedList(aIndex); @@ -304,7 +292,7 @@ void OldItemInfo::Discard(RetainedDisplayListBuilder* aBuilder, } bool OldItemInfo::IsChanged() { - return !mItem || !mItem->CanBeReused() || mItem->HasDeletedFrame(); + return !mItem || mItem->HasDeletedFrame() || !mItem->CanBeReused(); } /** @@ -319,14 +307,14 @@ bool OldItemInfo::IsChanged() { class MergeState { public: MergeState(RetainedDisplayListBuilder* aBuilder, - RetainedDisplayList& aOldList, nsDisplayItem* aOuterItem) + RetainedDisplayList& aOldList, uint32_t aOuterKey) : mBuilder(aBuilder), mOldList(&aOldList), mOldItems(std::move(aOldList.mOldItems)), mOldDAG( std::move(*reinterpret_cast*>( &aOldList.mDAG))), - mOuterItem(aOuterItem), + mOuterKey(aOuterKey), mResultIsModified(false) { mMergedDAG.EnsureCapacityFor(mOldDAG); MOZ_RELEASE_ASSERT(mOldItems.Length() == mOldDAG.Length()); @@ -335,9 +323,7 @@ class MergeState { Maybe ProcessItemFromNewList( nsDisplayItem* aNewItem, const Maybe& aPreviousItem) { OldListIndex oldIndex; - MOZ_DIAGNOSTIC_ASSERT(aNewItem->HasModifiedFrame() == - HasModifiedFrame(aNewItem)); - if (!aNewItem->HasModifiedFrame() && + if (!HasModifiedFrame(aNewItem) && HasMatchingItemInOldList(aNewItem, &oldIndex)) { nsDisplayItem* oldItem = mOldItems[oldIndex.val].mItem; MOZ_DIAGNOSTIC_ASSERT(oldItem->GetPerFrameKey() == @@ -477,11 +463,10 @@ class MergeState { aItem->Frame()->GetProperty(nsIFrame::DisplayItems()); // Look for an item that matches aItem's frame and per-frame-key, but isn't // the same item. - uint32_t outerKey = mOuterItem ? mOuterItem->GetPerFrameKey() : 0; for (nsDisplayItem* i : *items) { if (i != aItem && i->Frame() == aItem->Frame() && i->GetPerFrameKey() == aItem->GetPerFrameKey()) { - if (i->GetOldListIndex(mOldList, outerKey, aOutIndex)) { + if (i->GetOldListIndex(mOldList, mOuterKey, aOutIndex)) { return true; } } @@ -490,8 +475,7 @@ class MergeState { } bool HasModifiedFrame(nsDisplayItem* aItem) { - nsIFrame* stopFrame = mOuterItem ? mOuterItem->Frame() : nullptr; - return AnyContentAncestorModified(aItem->FrameForInvalidation(), stopFrame); + return AnyContentAncestorModified(aItem->FrameForInvalidation()); } void UpdateContainerASR(nsDisplayItem* aItem) { @@ -512,11 +496,12 @@ class MergeState { for (nsDisplayItem* i : *items) { if (i->Frame() == aItem->Frame() && i->GetPerFrameKey() == aItem->GetPerFrameKey()) { - MOZ_DIAGNOSTIC_ASSERT(!i->IsMergedItem()); + MOZ_DIAGNOSTIC_ASSERT(!i->mMergedItem); } } - aItem->SetMergedPreProcessed(true, false); + aItem->mMergedItem = true; + aItem->mPreProcessedItem = false; #endif mMergedItems.AppendToTop(aItem); @@ -634,7 +619,7 @@ class MergeState { // and assert when we try swap the contents nsDisplayList mMergedItems; DirectedAcyclicGraph mMergedDAG; - nsDisplayItem* mOuterItem; + uint32_t mOuterKey; bool mResultIsModified; }; @@ -656,7 +641,8 @@ bool RetainedDisplayListBuilder::MergeDisplayLists( nsDisplayItem* aOuterItem) { AUTO_PROFILER_LABEL_CATEGORY_PAIR(GRAPHICS_DisplayListMerging); - MergeState merge(this, *aOldList, aOuterItem); + MergeState merge(this, *aOldList, + aOuterItem ? aOuterItem->GetPerFrameKey() : 0); Maybe previousItemIndex; while (nsDisplayItem* item = aNewList->RemoveBottom()) { diff --git a/layout/painting/RetainedDisplayListHelpers.h b/layout/painting/RetainedDisplayListHelpers.h index 22b506bcfa6d..274f470b0337 100644 --- a/layout/painting/RetainedDisplayListHelpers.h +++ b/layout/painting/RetainedDisplayListHelpers.h @@ -139,7 +139,8 @@ struct RetainedDisplayListBuilder; class nsDisplayItem; struct OldItemInfo { - explicit OldItemInfo(nsDisplayItem* aItem); + explicit OldItemInfo(nsDisplayItem* aItem) + : mItem(aItem), mUsed(false), mDiscarded(false) {} void AddedToMergedList(MergedListIndex aIndex) { MOZ_ASSERT(!IsUsed()); @@ -168,7 +169,4 @@ struct OldItemInfo { nsTArray mDirectPredecessors; }; -bool AnyContentAncestorModified(nsIFrame* aFrame, - nsIFrame* aStopAtFrame = nullptr); - #endif // RETAINEDDISPLAYLISTHELPERS_H_ diff --git a/layout/painting/nsDisplayList.cpp b/layout/painting/nsDisplayList.cpp index 98aef6991fbd..ba88bf605c1b 100644 --- a/layout/painting/nsDisplayList.cpp +++ b/layout/painting/nsDisplayList.cpp @@ -101,7 +101,6 @@ #include "mozilla/layers/WebRenderLayerManager.h" #include "mozilla/layers/WebRenderMessages.h" #include "mozilla/layers/WebRenderScrollData.h" -#include "mozilla/layout/RenderFrame.h" using namespace mozilla; using namespace mozilla::layers; @@ -136,7 +135,7 @@ void AssertUniqueItem(nsDisplayItem* aItem) { for (nsDisplayItem* i : *items) { if (i != aItem && !i->HasDeletedFrame() && i->Frame() == aItem->Frame() && i->GetPerFrameKey() == aItem->GetPerFrameKey()) { - if (i->IsPreProcessedItem()) { + if (i->mPreProcessedItem) { continue; } MOZ_DIAGNOSTIC_ASSERT(false, "Duplicate display item!"); @@ -3172,9 +3171,18 @@ nsDisplayItem::nsDisplayItem(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame) nsDisplayItem::nsDisplayItem(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, const ActiveScrolledRoot* aActiveScrolledRoot) : mFrame(aFrame), - mItemFlags(), mActiveScrolledRoot(aActiveScrolledRoot), - mAnimatedGeometryRoot(nullptr) { + mAnimatedGeometryRoot(nullptr), + mForceNotVisible(aBuilder->IsBuildingInvisibleItems()), + mDisableSubpixelAA(false), + mReusedItem(false), + mPaintRectValid(false), + mCanBeReused(true) +#ifdef MOZ_DUMP_PAINTING + , + mPainted(false) +#endif +{ MOZ_COUNT_CTOR(nsDisplayItem); if (aBuilder->IsRetainingDisplayList()) { mFrame->AddDisplayItem(this); @@ -3200,12 +3208,9 @@ nsDisplayItem::nsDisplayItem(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, SetBuildingRect(visible); const nsStyleDisplay* disp = mFrame->StyleDisplay(); - if (mFrame->BackfaceIsHidden(disp)) { - mItemFlags += ItemFlag::BackfaceHidden; - } - if (mFrame->Combines3DTransformWithAncestors(disp)) { - mItemFlags += ItemFlag::Combines3DTransformWithAncestors; - } + mBackfaceIsHidden = mFrame->BackfaceIsHidden(disp); + mCombines3DTransformWithAncestors = + mFrame->Combines3DTransformWithAncestors(disp); } /* static */ @@ -3221,24 +3226,6 @@ bool nsDisplayItem::ForceActiveLayers() { return sForce; } -bool nsDisplayItem::HasModifiedFrame() const { - return mItemFlags.contains(ItemFlag::ModifiedFrame); -} - -void nsDisplayItem::SetModifiedFrame(bool aModified) { - if (aModified) { - mItemFlags += ItemFlag::ModifiedFrame; - } else { - mItemFlags -= ItemFlag::ModifiedFrame; - } -} - -bool nsDisplayItem::HasDeletedFrame() const { - return mItemFlags.contains(ItemFlag::DeletedFrame) || - (GetType() == DisplayItemType::TYPE_REMOTE && - !static_cast(this)->GetFrameLoader()); -} - int32_t nsDisplayItem::ZIndex() const { return mFrame->ZIndex(); } bool nsDisplayItem::ComputeVisibility(nsDisplayListBuilder* aBuilder, @@ -3249,7 +3236,7 @@ bool nsDisplayItem::ComputeVisibility(nsDisplayListBuilder* aBuilder, bool nsDisplayItem::RecomputeVisibility(nsDisplayListBuilder* aBuilder, nsRegion* aVisibleRegion) { - if (ForceNotVisible() && !GetSameCoordinateSystemChildren()) { + if (mForceNotVisible && !GetSameCoordinateSystemChildren()) { // mForceNotVisible wants to ensure that this display item doesn't render // anything itself. If this item has contents, then we obviously want to // render those, so we don't need this check in that case. @@ -3314,8 +3301,6 @@ void nsDisplayItem::FuseClipChainUpTo(nsDisplayListBuilder* aBuilder, } } -void nsDisplayItem::SetDeletedFrame() { mItemFlags += ItemFlag::DeletedFrame; } - bool nsDisplayItem::ShouldUseAdvancedLayer(LayerManager* aManager, PrefFunc aFunc) const { return CanUseAdvancedLayer(aManager) ? aFunc() : false; @@ -6713,10 +6698,13 @@ nsIFrame* nsDisplaySubDocument::FrameForInvalidation() const { return mSubDocFrame ? mSubDocFrame : mFrame; } +bool nsDisplaySubDocument::HasDeletedFrame() const { + return !mSubDocFrame || nsDisplayItem::HasDeletedFrame(); +} + void nsDisplaySubDocument::RemoveFrame(nsIFrame* aFrame) { if (aFrame == mSubDocFrame) { mSubDocFrame = nullptr; - SetDeletedFrame(); } nsDisplayItem::RemoveFrame(aFrame); } @@ -8956,7 +8944,7 @@ void nsDisplayText::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) { AUTO_PROFILER_LABEL("nsDisplayText::Paint", GRAPHICS); DrawTargetAutoDisableSubpixelAntialiasing disable(aCtx->GetDrawTarget(), - IsSubpixelAADisabled()); + mDisableSubpixelAA); RenderToContext(aCtx, aBuilder); } @@ -10284,86 +10272,3 @@ PaintTelemetry::AutoRecord::~AutoRecord() { } } // namespace mozilla - -#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED -static nsIFrame* GetSelfOrPlaceholderFor(nsIFrame* aFrame) { - if (aFrame->GetStateBits() & NS_FRAME_IS_PUSHED_FLOAT) { - return aFrame; - } - - if ((aFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW) && - !aFrame->GetPrevInFlow()) { - return aFrame->GetPlaceholderFrame(); - } - - return aFrame; -} - -static nsIFrame* GetAncestorFor(nsIFrame* aFrame) { - nsIFrame* f = GetSelfOrPlaceholderFor(aFrame); - MOZ_ASSERT(f); - return nsLayoutUtils::GetCrossDocParentFrame(f); -} -#endif - -nsDisplayListBuilder::AutoBuildingDisplayList::AutoBuildingDisplayList( - nsDisplayListBuilder* aBuilder, nsIFrame* aForChild, - const nsRect& aVisibleRect, const nsRect& aDirtyRect, - const bool aIsTransformed, RecalcInInvalidSubtree aRecalcInvalidSubtree) - : mBuilder(aBuilder), - mPrevFrame(aBuilder->mCurrentFrame), - mPrevReferenceFrame(aBuilder->mCurrentReferenceFrame), - mPrevHitTestArea(aBuilder->mHitTestArea), - mPrevHitTestInfo(aBuilder->mHitTestInfo), - mPrevOffset(aBuilder->mCurrentOffsetToReferenceFrame), - mPrevVisibleRect(aBuilder->mVisibleRect), - mPrevDirtyRect(aBuilder->mDirtyRect), - mPrevAGR(aBuilder->mCurrentAGR), - mPrevAncestorHasApzAwareEventHandler( - aBuilder->mAncestorHasApzAwareEventHandler), - mPrevBuildingInvisibleItems(aBuilder->mBuildingInvisibleItems), - mPrevInInvalidSubtree(aBuilder->mInInvalidSubtree) { -#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED - // Validate that aForChild is being visited from it's parent frame if - // recalculation of mInInvalidSubtree isn't requested. - const nsIFrame* ancestor = GetAncestorFor(aForChild); - MOZ_DIAGNOSTIC_ASSERT(aRecalcInvalidSubtree == - nsDisplayListBuilder::RIIS_YES || - aForChild == mPrevFrame || ancestor == mPrevFrame); -#endif - - if (aIsTransformed) { - aBuilder->mCurrentOffsetToReferenceFrame = nsPoint(); - aBuilder->mCurrentReferenceFrame = aForChild; - } else if (aBuilder->mCurrentFrame == aForChild->GetParent()) { - aBuilder->mCurrentOffsetToReferenceFrame += aForChild->GetPosition(); - } else { - aBuilder->mCurrentReferenceFrame = aBuilder->FindReferenceFrameFor( - aForChild, &aBuilder->mCurrentOffsetToReferenceFrame); - } - - bool isAsync; - mCurrentAGRState = aBuilder->IsAnimatedGeometryRoot(aForChild, isAsync); - - if (aBuilder->mCurrentFrame == aForChild->GetParent()) { - if (mCurrentAGRState == AGR_YES) { - aBuilder->mCurrentAGR = - aBuilder->WrapAGRForFrame(aForChild, isAsync, aBuilder->mCurrentAGR); - } - } else if (aBuilder->mCurrentFrame != aForChild) { - aBuilder->mCurrentAGR = aBuilder->FindAnimatedGeometryRootFor(aForChild); - } - - MOZ_ASSERT(nsLayoutUtils::IsAncestorFrameCrossDoc( - aBuilder->RootReferenceFrame(), *aBuilder->mCurrentAGR)); - if (!aRecalcInvalidSubtree) { - aBuilder->mInInvalidSubtree = aBuilder->mInInvalidSubtree || - aForChild->IsFrameModified(); - } else { - aBuilder->mInInvalidSubtree = AnyContentAncestorModified(aForChild); - } - aBuilder->mCurrentFrame = aForChild; - aBuilder->mVisibleRect = aVisibleRect; - aBuilder->mDirtyRect = - aBuilder->mInInvalidSubtree ? aVisibleRect : aDirtyRect; -} diff --git a/layout/painting/nsDisplayList.h b/layout/painting/nsDisplayList.h index f16db23157e7..f31e60dce9d2 100644 --- a/layout/painting/nsDisplayList.h +++ b/layout/painting/nsDisplayList.h @@ -441,11 +441,6 @@ class nsDisplayListBuilder { typedef mozilla::gfx::Matrix4x4 Matrix4x4; typedef mozilla::Maybe MaybeScrollDirection; - /** - * Does InInvalidSubtree need to recalculated? - */ - enum RecalcInInvalidSubtree { RIIS_NO, RIIS_YES }; - /** * @param aReferenceFrame the frame at the root of the subtree; its origin * is the origin of the reference coordinate system for this display list @@ -1137,25 +1132,59 @@ class nsDisplayListBuilder { class AutoBuildingDisplayList { public: AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* aForChild, - RecalcInInvalidSubtree aRecalcInvalidSubtree) - : AutoBuildingDisplayList( - aBuilder, aForChild, aBuilder->GetVisibleRect(), - aBuilder->GetDirtyRect(), aForChild->IsTransformed(), - aRecalcInvalidSubtree) {} - - AutoBuildingDisplayList( - nsDisplayListBuilder* aBuilder, nsIFrame* aForChild, - const nsRect& aVisibleRect, const nsRect& aDirtyRect, - RecalcInInvalidSubtree aRecalcInvalidSubtree = RIIS_NO) + const nsRect& aVisibleRect, + const nsRect& aDirtyRect) : AutoBuildingDisplayList(aBuilder, aForChild, aVisibleRect, aDirtyRect, - aForChild->IsTransformed(), - aRecalcInvalidSubtree) {} + aForChild->IsTransformed()) {} - AutoBuildingDisplayList( - nsDisplayListBuilder* aBuilder, nsIFrame* aForChild, - const nsRect& aVisibleRect, const nsRect& aDirtyRect, - const bool aIsTransformed, - RecalcInInvalidSubtree aRecalcInvalidSubtree = RIIS_NO); + AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* aForChild, + const nsRect& aVisibleRect, + const nsRect& aDirtyRect, const bool aIsTransformed) + : mBuilder(aBuilder), + mPrevFrame(aBuilder->mCurrentFrame), + mPrevReferenceFrame(aBuilder->mCurrentReferenceFrame), + mPrevHitTestArea(aBuilder->mHitTestArea), + mPrevHitTestInfo(aBuilder->mHitTestInfo), + mPrevOffset(aBuilder->mCurrentOffsetToReferenceFrame), + mPrevVisibleRect(aBuilder->mVisibleRect), + mPrevDirtyRect(aBuilder->mDirtyRect), + mPrevAGR(aBuilder->mCurrentAGR), + mPrevAncestorHasApzAwareEventHandler( + aBuilder->mAncestorHasApzAwareEventHandler), + mPrevBuildingInvisibleItems(aBuilder->mBuildingInvisibleItems), + mPrevInInvalidSubtree(aBuilder->mInInvalidSubtree) { + if (aIsTransformed) { + aBuilder->mCurrentOffsetToReferenceFrame = nsPoint(); + aBuilder->mCurrentReferenceFrame = aForChild; + } else if (aBuilder->mCurrentFrame == aForChild->GetParent()) { + aBuilder->mCurrentOffsetToReferenceFrame += aForChild->GetPosition(); + } else { + aBuilder->mCurrentReferenceFrame = aBuilder->FindReferenceFrameFor( + aForChild, &aBuilder->mCurrentOffsetToReferenceFrame); + } + + bool isAsync; + mCurrentAGRState = aBuilder->IsAnimatedGeometryRoot(aForChild, isAsync); + + if (aBuilder->mCurrentFrame == aForChild->GetParent()) { + if (mCurrentAGRState == AGR_YES) { + aBuilder->mCurrentAGR = aBuilder->WrapAGRForFrame( + aForChild, isAsync, aBuilder->mCurrentAGR); + } + } else if (aBuilder->mCurrentFrame != aForChild) { + aBuilder->mCurrentAGR = + aBuilder->FindAnimatedGeometryRootFor(aForChild); + } + + MOZ_ASSERT(nsLayoutUtils::IsAncestorFrameCrossDoc( + aBuilder->RootReferenceFrame(), *aBuilder->mCurrentAGR)); + aBuilder->mInInvalidSubtree = + aBuilder->mInInvalidSubtree || aForChild->IsFrameModified(); + aBuilder->mCurrentFrame = aForChild; + aBuilder->mVisibleRect = aVisibleRect; + aBuilder->mDirtyRect = + aBuilder->mInInvalidSubtree ? aVisibleRect : aDirtyRect; + } void SetReferenceFrameAndCurrentOffset(const nsIFrame* aFrame, const nsPoint& aOffset) { @@ -1731,7 +1760,17 @@ class nsDisplayListBuilder { return false; } + bool MarkCurrentFrameModifiedDuringBuilding() { + if (MarkFrameModifiedDuringBuilding(const_cast(mCurrentFrame))) { + mInInvalidSubtree = true; + mDirtyRect = mVisibleRect; + return true; + } + return false; + } + void RebuildAllItemsInCurrentSubtree() { + mInInvalidSubtree = true; mDirtyRect = mVisibleRect; } @@ -2072,22 +2111,11 @@ MOZ_ALWAYS_INLINE T* MakeDisplayItem(nsDisplayListBuilder* aBuilder, } } - if (aBuilder->InInvalidSubtree() || - item->FrameForInvalidation()->IsFrameModified()) { - item->SetModifiedFrame(true); - } - #ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED if (aBuilder->IsRetainingDisplayList() && !aBuilder->IsInPageSequence() && aBuilder->IsBuilding()) { AssertUniqueItem(item); } - - // Verify that InInvalidSubtree matches invalidation frame's modified state. - if (aBuilder->InInvalidSubtree()) { - MOZ_DIAGNOSTIC_ASSERT( - AnyContentAncestorModified(item->FrameForInvalidation())); - } #endif return item; @@ -2155,14 +2183,13 @@ class nsDisplayItem : public nsDisplayItemLink { virtual void RestoreState() { mClipChain = mState.mClipChain; mClip = mState.mClip; - mItemFlags -= ItemFlag::DisableSubpixelAA; + mDisableSubpixelAA = false; } virtual void RemoveFrame(nsIFrame* aFrame) { if (mFrame && aFrame == mFrame) { MOZ_ASSERT(!mFrame->HasDisplayItem(this)); mFrame = nullptr; - SetDeletedFrame(); SetDisplayItemData(nullptr, nullptr); } } @@ -2188,7 +2215,6 @@ class nsDisplayItem : public nsDisplayItemLink { */ nsDisplayItem(nsDisplayListBuilder* aBuilder, const nsDisplayItem& aOther) : mFrame(aOther.mFrame), - mItemFlags(), mClipChain(aOther.mClipChain), mClip(aOther.mClip), mActiveScrolledRoot(aOther.mActiveScrolledRoot), @@ -2196,21 +2222,21 @@ class nsDisplayItem : public nsDisplayItemLink { mAnimatedGeometryRoot(aOther.mAnimatedGeometryRoot), mToReferenceFrame(aOther.mToReferenceFrame), mBuildingRect(aOther.mBuildingRect), - mPaintRect(aOther.mPaintRect) { + mPaintRect(aOther.mPaintRect), + mForceNotVisible(aOther.mForceNotVisible), + mDisableSubpixelAA(aOther.mDisableSubpixelAA), + mReusedItem(false), + mBackfaceIsHidden(aOther.mBackfaceIsHidden), + mCombines3DTransformWithAncestors( + aOther.mCombines3DTransformWithAncestors), + mPaintRectValid(false), + mCanBeReused(true) +#ifdef MOZ_DUMP_PAINTING + , + mPainted(false) +#endif + { MOZ_COUNT_CTOR(nsDisplayItem); - // TODO: It might be better to remove the flags that aren't copied. - if (aOther.ForceNotVisible()) { - mItemFlags += ItemFlag::ForceNotVisible; - } - if (aOther.IsSubpixelAADisabled()) { - mItemFlags += ItemFlag::DisableSubpixelAA; - } - if (mFrame->In3DContextAndBackfaceIsHidden()) { - mItemFlags += ItemFlag::BackfaceHidden; - } - if (aOther.Combines3DTransformWithAncestors()) { - mItemFlags += ItemFlag::Combines3DTransformWithAncestors; - } } struct HitTestState { @@ -2274,10 +2300,7 @@ class nsDisplayItem : public nsDisplayItemLink { */ virtual nsIFrame* FrameForInvalidation() const { return mFrame; } - bool HasModifiedFrame() const; - void SetModifiedFrame(bool aModified); - - bool HasDeletedFrame() const; + virtual bool HasDeletedFrame() const { return !mFrame; } virtual nsIFrame* StyleFrame() const { return mFrame; } @@ -2521,12 +2544,12 @@ class nsDisplayItem : public nsDisplayItemLink { * Mark this display item as being painted via * FrameLayerBuilder::DrawPaintedLayer. */ - bool Painted() const { return mItemFlags.contains(ItemFlag::Painted); } + bool Painted() const { return mPainted; } /** * Check if this display item has been painted. */ - void SetPainted() { mItemFlags += ItemFlag::Painted; } + void SetPainted() { mPainted = true; } #endif /** @@ -2709,16 +2732,14 @@ class nsDisplayItem : public nsDisplayItemLink { return; } mPaintRect = mBuildingRect = aBuildingRect; - mItemFlags -= ItemFlag::PaintRectValid; + mPaintRectValid = false; } void SetPaintRect(const nsRect& aPaintRect) { mPaintRect = aPaintRect; - mItemFlags += ItemFlag::PaintRectValid; - } - bool HasPaintRect() const { - return mItemFlags.contains(ItemFlag::PaintRectValid); + mPaintRectValid = true; } + bool HasPaintRect() const { return mPaintRectValid; } /** * Returns the building rect for the children, relative to their @@ -2744,9 +2765,7 @@ class nsDisplayItem : public nsDisplayItemLink { */ virtual bool CanApplyOpacity() const { return false; } - bool ForceNotVisible() const { - return mItemFlags.contains(ItemFlag::ForceNotVisible); - } + bool ForceNotVisible() const { return mForceNotVisible; } /** * For debugging and stuff @@ -2812,11 +2831,9 @@ class nsDisplayItem : public nsDisplayItemLink { * Disable usage of component alpha. Currently only relevant for items that * have text. */ - void DisableComponentAlpha() { mItemFlags += ItemFlag::DisableSubpixelAA; } + void DisableComponentAlpha() { mDisableSubpixelAA = true; } - bool IsSubpixelAADisabled() const { - return mItemFlags.contains(ItemFlag::DisableSubpixelAA); - } + bool IsSubpixelAADisabled() const { return mDisableSubpixelAA; } /** * Check if we can add async animations to the layer for this display item. @@ -2852,17 +2869,14 @@ class nsDisplayItem : public nsDisplayItemLink { void FuseClipChainUpTo(nsDisplayListBuilder* aBuilder, const ActiveScrolledRoot* aASR); - bool BackfaceIsHidden() const { - return mItemFlags.contains(ItemFlag::BackfaceHidden); - } + bool BackfaceIsHidden() const { return mBackfaceIsHidden; } bool Combines3DTransformWithAncestors() const { - return mItemFlags.contains(ItemFlag::Combines3DTransformWithAncestors); + return mCombines3DTransformWithAncestors; } bool In3DContextAndBackfaceIsHidden() const { - return mItemFlags.contains(ItemFlag::BackfaceHidden) && - mItemFlags.contains(ItemFlag::Combines3DTransformWithAncestors); + return mBackfaceIsHidden && mCombines3DTransformWithAncestors; } bool HasDifferentFrame(const nsDisplayItem* aOther) const { @@ -2878,22 +2892,14 @@ class nsDisplayItem : public nsDisplayItemLink { return mFrame->GetContent() == aOther->Frame()->GetContent(); } - bool IsReused() const { return mItemFlags.contains(ItemFlag::ReusedItem); } - void SetReused(bool aReused) { - if (aReused) { - mItemFlags += ItemFlag::ReusedItem; - } else { - mItemFlags -= ItemFlag::ReusedItem; - } - } + bool IsReused() const { return mReusedItem; } - bool CanBeReused() const { - return !mItemFlags.contains(ItemFlag::CantBeReused); - } - void SetCantBeReused() { mItemFlags += ItemFlag::CantBeReused; } + void SetReused(bool aReused) { mReusedItem = aReused; } + + bool CanBeReused() const { return mCanBeReused; } void DiscardIfOldItem() { if (mOldList) { - SetCantBeReused(); + mCanBeReused = false; } } virtual void NotifyUsed(nsDisplayListBuilder* aBuilder) {} @@ -2965,34 +2971,11 @@ class nsDisplayItem : public nsDisplayItemLink { #endif protected: - void SetDeletedFrame(); - typedef bool (*PrefFunc)(void); bool ShouldUseAdvancedLayer(LayerManager* aManager, PrefFunc aFunc) const; bool CanUseAdvancedLayer(LayerManager* aManager) const; - enum class ItemFlag { - ModifiedFrame, - DeletedFrame, - ForceNotVisible, - DisableSubpixelAA, - CantBeReused, - ReusedItem, - BackfaceHidden, - Combines3DTransformWithAncestors, - PaintRectValid, -#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED - MergedItem, - PreProcessedItem, -#endif -#ifdef MOZ_DUMP_PAINTING - // True if this frame has been painted. - Painted, -#endif - }; - nsIFrame* mFrame; - mozilla::EnumSet mItemFlags; RefPtr mClipChain; const DisplayItemClip* mClip; RefPtr mActiveScrolledRoot; @@ -3026,31 +3009,26 @@ class nsDisplayItem : public nsDisplayItemLink { #ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED public: - bool IsMergedItem() const { - return mItemFlags.contains(ItemFlag::MergedItem); - } - bool IsPreProcessedItem() const { - return mItemFlags.contains(ItemFlag::PreProcessedItem); - } - void SetMergedPreProcessed(bool aMerged, bool aPreProcessed) { - if (aMerged) { - mItemFlags += ItemFlag::MergedItem; - } else { - mItemFlags -= ItemFlag::MergedItem; - } - - if (aPreProcessed) { - mItemFlags += ItemFlag::PreProcessedItem; - } else { - mItemFlags -= ItemFlag::PreProcessedItem; - } - } - uint32_t mOldListKey = 0; uint32_t mOldNestingDepth = 0; + bool mMergedItem = false; + bool mPreProcessedItem = false; protected: #endif + + bool mForceNotVisible; + bool mDisableSubpixelAA; + bool mReusedItem; + bool mBackfaceIsHidden; + bool mCombines3DTransformWithAncestors; + bool mPaintRectValid; + bool mCanBeReused; + +#ifdef MOZ_DUMP_PAINTING + // True if this frame has been painted. + bool mPainted; +#endif }; /** @@ -4183,9 +4161,7 @@ class nsDisplaySolidColor : public nsDisplaySolidColorBase { NS_ASSERTION(NS_GET_A(aColor) > 0, "Don't create invisible nsDisplaySolidColors!"); MOZ_COUNT_CTOR(nsDisplaySolidColor); - if (!aCanBeReused) { - SetCantBeReused(); - } + mCanBeReused = aCanBeReused; } #ifdef NS_BUILD_REFCNT_LOGGING @@ -4523,10 +4499,13 @@ class nsDisplayTableBackgroundImage : public nsDisplayBackgroundImage { nsIFrame* FrameForInvalidation() const override { return mStyleFrame; } + bool HasDeletedFrame() const override { + return !mStyleFrame || nsDisplayBackgroundImage::HasDeletedFrame(); + } + void RemoveFrame(nsIFrame* aFrame) override { if (aFrame == mStyleFrame) { mStyleFrame = nullptr; - SetDeletedFrame(); } nsDisplayBackgroundImage::RemoveFrame(aFrame); } @@ -4651,10 +4630,13 @@ class nsDisplayTableThemedBackground : public nsDisplayThemedBackground { nsIFrame* FrameForInvalidation() const override { return mAncestorFrame; } + bool HasDeletedFrame() const override { + return !mAncestorFrame || nsDisplayThemedBackground::HasDeletedFrame(); + } + void RemoveFrame(nsIFrame* aFrame) override { if (aFrame == mAncestorFrame) { mAncestorFrame = nullptr; - SetDeletedFrame(); } nsDisplayThemedBackground::RemoveFrame(aFrame); } @@ -4828,10 +4810,13 @@ class nsDisplayTableBackgroundColor : public nsDisplayBackgroundColor { nsIFrame* FrameForInvalidation() const override { return mAncestorFrame; } + bool HasDeletedFrame() const override { + return !mAncestorFrame || nsDisplayBackgroundColor::HasDeletedFrame(); + } + void RemoveFrame(nsIFrame* aFrame) override { if (aFrame == mAncestorFrame) { mAncestorFrame = nullptr; - SetDeletedFrame(); } nsDisplayBackgroundColor::RemoveFrame(aFrame); } @@ -5647,10 +5632,13 @@ class nsDisplayTableBlendMode : public nsDisplayBlendMode { nsIFrame* FrameForInvalidation() const override { return mAncestorFrame; } + bool HasDeletedFrame() const override { + return !mAncestorFrame || nsDisplayBlendMode::HasDeletedFrame(); + } + void RemoveFrame(nsIFrame* aFrame) override { if (aFrame == mAncestorFrame) { mAncestorFrame = nullptr; - SetDeletedFrame(); } nsDisplayBlendMode::RemoveFrame(aFrame); } @@ -5751,10 +5739,13 @@ class nsDisplayTableBlendContainer : public nsDisplayBlendContainer { nsIFrame* FrameForInvalidation() const override { return mAncestorFrame; } + bool HasDeletedFrame() const override { + return !mAncestorFrame || nsDisplayBlendContainer::HasDeletedFrame(); + } + void RemoveFrame(nsIFrame* aFrame) override { if (aFrame == mAncestorFrame) { mAncestorFrame = nullptr; - SetDeletedFrame(); } nsDisplayBlendContainer::RemoveFrame(aFrame); } @@ -5981,6 +5972,7 @@ class nsDisplaySubDocument : public nsDisplayOwnLayer { const ContainerLayerParameters& aContainerParameters); nsIFrame* FrameForInvalidation() const override; + bool HasDeletedFrame() const override; void RemoveFrame(nsIFrame* aFrame) override; void Disown(); @@ -6162,10 +6154,13 @@ class nsDisplayTableFixedPosition : public nsDisplayFixedPosition { nsIFrame* FrameForInvalidation() const override { return mAncestorFrame; } + bool HasDeletedFrame() const override { + return !mAncestorFrame || nsDisplayFixedPosition::HasDeletedFrame(); + } + void RemoveFrame(nsIFrame* aFrame) override { if (aFrame == mAncestorFrame) { mAncestorFrame = nullptr; - SetDeletedFrame(); } nsDisplayFixedPosition::RemoveFrame(aFrame); } diff --git a/layout/svg/SVGTextFrame.cpp b/layout/svg/SVGTextFrame.cpp index ab50894127eb..0f46ab2b8276 100644 --- a/layout/svg/SVGTextFrame.cpp +++ b/layout/svg/SVGTextFrame.cpp @@ -2861,7 +2861,7 @@ void nsDisplaySVGText::HitTest(nsDisplayListBuilder* aBuilder, void nsDisplaySVGText::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) { DrawTargetAutoDisableSubpixelAntialiasing disable(aCtx->GetDrawTarget(), - IsSubpixelAADisabled()); + mDisableSubpixelAA); uint32_t appUnitsPerDevPixel = mFrame->PresContext()->AppUnitsPerDevPixel(); diff --git a/layout/xul/nsTextBoxFrame.cpp b/layout/xul/nsTextBoxFrame.cpp index aba81acb0719..c40d06f618dc 100644 --- a/layout/xul/nsTextBoxFrame.cpp +++ b/layout/xul/nsTextBoxFrame.cpp @@ -278,7 +278,7 @@ static void PaintTextShadowCallback(gfxContext* aCtx, nsPoint aShadowOffset, void nsDisplayXULTextBox::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) { DrawTargetAutoDisableSubpixelAntialiasing disable(aCtx->GetDrawTarget(), - IsSubpixelAADisabled()); + mDisableSubpixelAA); // Paint the text shadow before doing any foreground stuff nsRect drawRect = diff --git a/layout/xul/tree/nsTreeBodyFrame.cpp b/layout/xul/tree/nsTreeBodyFrame.cpp index 611256aec22f..59101afd6a00 100644 --- a/layout/xul/tree/nsTreeBodyFrame.cpp +++ b/layout/xul/tree/nsTreeBodyFrame.cpp @@ -2498,7 +2498,7 @@ class nsDisplayTreeBody final : public nsDisplayItem { gfxContext* aCtx) override { MOZ_ASSERT(aBuilder); DrawTargetAutoDisableSubpixelAntialiasing disable(aCtx->GetDrawTarget(), - IsSubpixelAADisabled()); + mDisableSubpixelAA); ImgDrawResult result = static_cast(mFrame)->PaintTreeBody( *aCtx, GetPaintRect(), ToReferenceFrame(), aBuilder);