From 93aa7aad04bb81c753ffa4585d4198b53bbf4def Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Tue, 15 Jul 2014 10:30:21 +0200 Subject: [PATCH] Backed out changeset 032ba47c6684 (bug 1022612) --- layout/base/FrameLayerBuilder.cpp | 1 + layout/base/nsDisplayList.cpp | 3 +++ layout/base/nsDisplayList.h | 26 ++++++++++++++++++++++---- layout/base/nsLayoutDebugger.cpp | 5 ++++- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/layout/base/FrameLayerBuilder.cpp b/layout/base/FrameLayerBuilder.cpp index e6dc2676dc2..1c76e00d268 100644 --- a/layout/base/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -2735,6 +2735,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList, } aList->AppendToTop(&savedItems); + aList->SetDidComputeVisibility(); } void diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index 8031bf5e389..adc19bf694d 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -1221,6 +1221,9 @@ nsDisplayList::ComputeVisibilityForSublist(nsDisplayListBuilder* aBuilder, mIsOpaque = !aVisibleRegion->Intersects(mVisibleRect); mForceTransparentSurface = forceTransparentSurface; +#if defined(DEBUG) || defined(MOZ_DUMP_PAINTING) + mDidComputeVisibility = true; +#endif return anyVisible; } diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h index 5af19316ea3..d346b41ca38 100644 --- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -1425,12 +1425,14 @@ public: /** * Create an empty list. */ - nsDisplayList() - : mIsOpaque(false) - , mForceTransparentSurface(false) + nsDisplayList() : + mIsOpaque(false) { mTop = &mSentinel; mSentinel.mAbove = nullptr; +#if defined(DEBUG) || defined(MOZ_DUMP_PAINTING) + mDidComputeVisibility = false; +#endif } ~nsDisplayList() { if (mSentinel.mAbove) { @@ -1616,13 +1618,16 @@ public: * empty, i.e. everything visible in this list is opaque. */ bool IsOpaque() const { + NS_ASSERTION(mDidComputeVisibility, "Need to have called ComputeVisibility"); return mIsOpaque; } /** - * Returns true if any display item requires the surface to be transparent. + * Returns true if during ComputeVisibility any display item + * set the surface to be transparent. */ bool NeedsTransparentSurface() const { + NS_ASSERTION(mDidComputeVisibility, "Need to have called ComputeVisibility"); return mForceTransparentSurface; } /** @@ -1681,6 +1686,16 @@ public: nsDisplayItem::HitTestState* aState, nsTArray *aOutFrames) const; +#if defined(DEBUG) || defined(MOZ_DUMP_PAINTING) + bool DidComputeVisibility() const { return mDidComputeVisibility; } +#endif + + void SetDidComputeVisibility() + { +#if defined(DEBUG) || defined(MOZ_DUMP_PAINTING) + mDidComputeVisibility = true; +#endif + } void SetIsOpaque() { mIsOpaque = true; @@ -1712,6 +1727,9 @@ private: // This is set to true by ComputeVisibility if any display item in this // list needs to force the surface containing this list to be transparent. bool mForceTransparentSurface; +#if defined(DEBUG) || defined(MOZ_DUMP_PAINTING) + bool mDidComputeVisibility; +#endif }; /** diff --git a/layout/base/nsLayoutDebugger.cpp b/layout/base/nsLayoutDebugger.cpp index 1096ef4cca8..ff7cb9119b8 100644 --- a/layout/base/nsLayoutDebugger.cpp +++ b/layout/base/nsLayoutDebugger.cpp @@ -154,7 +154,10 @@ PrintDisplayItemTo(nsDisplayListBuilder* aBuilder, nsDisplayItem* aItem, nsRect component = aItem->GetComponentAlphaBounds(aBuilder); nsDisplayList* list = aItem->GetChildren(); const DisplayItemClip& clip = aItem->GetClip(); - nsRegion opaque = aItem->GetOpaqueRegion(aBuilder, &snap); + nsRegion opaque; + if (!list || list->DidComputeVisibility()) { + opaque = aItem->GetOpaqueRegion(aBuilder, &snap); + } if (aDumpHtml && aItem->Painted()) { nsCString string(aItem->Name()); string.Append('-');