Bug 1248913 - nsDisplayListBuilder doesn't need to know what blend modes it contains, just whether it contains any. r?mattwoodrow
MozReview-Commit-ID: 5yQcGnXBKKp
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -611,16 +611,17 @@ nsDisplayListBuilder::nsDisplayListBuild
mGlassDisplayItem(nullptr),
mScrollInfoItemsForHoisting(nullptr),
mMode(aMode),
mCurrentScrollParentId(FrameMetrics::NULL_SCROLL_ID),
mCurrentScrollbarTarget(FrameMetrics::NULL_SCROLL_ID),
mCurrentScrollbarFlags(0),
mPerspectiveItemIndex(0),
mSVGEffectsBuildingDepth(0),
+ mContainsBlendMode(false),
mIsBuildingScrollbar(false),
mCurrentScrollbarWillHaveLayer(false),
mBuildCaret(aBuildCaret),
mIgnoreSuppression(false),
mHadToIgnoreSuppression(false),
mIsAtRootOfPseudoStackingContext(false),
mIncludeAllOutOfFlows(false),
mDescendIntoSubdocuments(true),
@@ -669,22 +670,16 @@ static void MarkFrameForDisplay(nsIFrame
f->AddStateBits(NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO);
if (f == aStopAtFrame) {
// we've reached a frame that we know will be painted, so we can stop.
break;
}
}
}
-void nsDisplayListBuilder::SetContainsBlendMode(uint8_t aBlendMode)
-{
- MOZ_ASSERT(aBlendMode != NS_STYLE_BLEND_NORMAL);
- mContainedBlendModes += nsCSSRendering::GetGFXBlendMode(aBlendMode);
-}
-
bool nsDisplayListBuilder::NeedToForceTransparentSurfaceForItem(nsDisplayItem* aItem)
{
return aItem == mGlassDisplayItem || aItem->ClearsBackground();
}
AnimatedGeometryRoot*
nsDisplayListBuilder::WrapAGRForFrame(nsIFrame* aAnimatedGeometryRoot,
AnimatedGeometryRoot* aParent /* = nullptr */)
--- a/layout/base/nsDisplayList.h
+++ b/layout/base/nsDisplayList.h
@@ -1023,24 +1023,18 @@ public:
void SetContainsPluginItem() { mContainsPluginItem = true; }
bool ContainsPluginItem() { return mContainsPluginItem; }
/**
* mContainsBlendMode is true if we processed a display item that
* has a blend mode attached. We do this so we can insert a
* nsDisplayBlendContainer in the parent stacking context.
*/
- void SetContainsBlendMode(uint8_t aBlendMode);
- void SetContainsBlendModes(const BlendModeSet& aModes) {
- mContainedBlendModes = aModes;
- }
- bool ContainsBlendMode() const { return !mContainedBlendModes.isEmpty(); }
- BlendModeSet& ContainedBlendModes() {
- return mContainedBlendModes;
- }
+ void SetContainsBlendMode(bool aContainsBlendMode) { mContainsBlendMode = aContainsBlendMode; }
+ bool ContainsBlendMode() const { return mContainsBlendMode; }
uint32_t AllocatePerspectiveItemIndex() { return mPerspectiveItemIndex++; }
DisplayListClipState& ClipState() { return mClipState; }
/**
* Add the current frame to the will-change budget if possible and
* remeber the outcome. Subsequent calls to IsInWillChangeBudget
@@ -1234,20 +1228,20 @@ private:
// nsDisplayList class is defined below this class, so we can't use it here.
nsDisplayList* mScrollInfoItemsForHoisting;
nsTArray<DisplayItemScrollClip*> mScrollClipsToDestroy;
nsTArray<DisplayItemClip*> mDisplayItemClipsToDestroy;
Mode mMode;
ViewID mCurrentScrollParentId;
ViewID mCurrentScrollbarTarget;
uint32_t mCurrentScrollbarFlags;
- BlendModeSet mContainedBlendModes;
Preserves3DContext mPreserves3DCtx;
uint32_t mPerspectiveItemIndex;
int32_t mSVGEffectsBuildingDepth;
+ bool mContainsBlendMode;
bool mIsBuildingScrollbar;
bool mCurrentScrollbarWillHaveLayer;
bool mBuildCaret;
bool mIgnoreSuppression;
bool mHadToIgnoreSuppression;
bool mIsAtRootOfPseudoStackingContext;
bool mIncludeAllOutOfFlows;
bool mDescendIntoSubdocuments;
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -1823,28 +1823,28 @@ DisplayDebugBorders(nsDisplayListBuilder
#endif
static bool
IsScrollFrameActive(nsDisplayListBuilder* aBuilder, nsIScrollableFrame* aScrollableFrame)
{
return aScrollableFrame && aScrollableFrame->IsScrollingActive(aBuilder);
}
-class AutoSaveRestoreBlendMode
+class AutoSaveRestoreContainsBlendMode
{
nsDisplayListBuilder& mBuilder;
- EnumSet<gfx::CompositionOp> mSavedBlendModes;
+ bool mSavedContainsBlendMode;
public:
- explicit AutoSaveRestoreBlendMode(nsDisplayListBuilder& aBuilder)
+ explicit AutoSaveRestoreContainsBlendMode(nsDisplayListBuilder& aBuilder)
: mBuilder(aBuilder)
- , mSavedBlendModes(aBuilder.ContainedBlendModes())
+ , mSavedContainsBlendMode(aBuilder.ContainsBlendMode())
{ }
- ~AutoSaveRestoreBlendMode() {
- mBuilder.SetContainsBlendModes(mSavedBlendModes);
+ ~AutoSaveRestoreContainsBlendMode() {
+ mBuilder.SetContainsBlendMode(mSavedContainsBlendMode);
}
};
static void
CheckForApzAwareEventHandlers(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame)
{
nsIContent* content = aFrame->GetContent();
if (!content) {
@@ -1972,18 +1972,18 @@ nsIFrame::BuildDisplayListForStackingCon
// the chain.
nsRect dirtyRect = aDirtyRect;
bool inTransform = aBuilder->IsInTransform();
bool isTransformed = IsTransformed();
// reset blend mode so we can keep track if this stacking context needs have
// a nsDisplayBlendContainer. Set the blend mode back when the routine exits
// so we keep track if the parent stacking context needs a container too.
- AutoSaveRestoreBlendMode autoRestoreBlendMode(*aBuilder);
- aBuilder->SetContainsBlendModes(BlendModeSet());
+ AutoSaveRestoreContainsBlendMode autoRestoreBlendMode(*aBuilder);
+ aBuilder->SetContainsBlendMode(false);
nsRect dirtyRectOutsideTransform = dirtyRect;
if (isTransformed) {
const nsRect overflow = GetVisualOverflowRectRelativeToSelf();
if (nsDisplayTransform::ShouldPrerenderTransformedContent(aBuilder,
this)) {
dirtyRect = overflow;
} else {
@@ -2511,17 +2511,17 @@ nsIFrame::BuildDisplayListForChild(nsDis
const nsStyleDisplay* parentDisp =
parent == this ? ourDisp : parent->StyleDisplay();
ApplyOverflowClipping(aBuilder, parent, parentDisp, clipState);
nsDisplayList list;
nsDisplayList extraPositionedDescendants;
if (isStackingContext) {
if (disp->mMixBlendMode != NS_STYLE_BLEND_NORMAL) {
- aBuilder->SetContainsBlendMode(disp->mMixBlendMode);
+ aBuilder->SetContainsBlendMode(true);
}
// True stacking context.
// For stacking contexts, BuildDisplayListForStackingContext handles
// clipping and MarkAbsoluteFramesForDisplayList.
child->BuildDisplayListForStackingContext(aBuilder, dirty, &list);
aBuilder->DisplayCaret(child, dirty, &list);
} else {
nsRect clipRect;