From 2ca37472a43a40952a456cfa8a1fb6b663a79293 Mon Sep 17 00:00:00 2001 From: Ed Morley Date: Mon, 3 Sep 2012 09:20:05 +0100 Subject: [PATCH] Backout 03cb77f8d75d (bug 769021), 04fd792509d6 (bug 786817) for burning the tree --- layout/base/FrameLayerBuilder.cpp | 65 ++++++++--------------------- layout/base/MaskLayerImageCache.cpp | 5 +-- layout/base/MaskLayerImageCache.h | 51 ++++------------------ 3 files changed, 27 insertions(+), 94 deletions(-) diff --git a/layout/base/FrameLayerBuilder.cpp b/layout/base/FrameLayerBuilder.cpp index 18e9f6406ef..10170f5023f 100644 --- a/layout/base/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -497,19 +497,11 @@ public: mXScale(1.f), mYScale(1.f), mActiveScrolledRootPosition(0, 0) {} - /** - * Record the number of clips in the Thebes layer's mask layer. - * Should not be reset when the layer is recycled since it is used to track - * changes in the use of mask layers. - */ - uint32_t mMaskClipCount; - /** * A color that should be painted over the bounds of the layer's visible * region before any other content is painted. */ nscolor mForcedBackgroundColor; - /** * The resolution scale used. */ @@ -1683,10 +1675,6 @@ ContainerState::FindThebesLayerFor(nsDisplayItem* aItem, layer = thebesLayerData->mLayer; } - // check to see if the new item has rounded rect clips in common with - // other items in the layer - thebesLayerData->UpdateCommonClipCount(aClip); - thebesLayerData->Accumulate(this, aItem, aVisibleRect, aDrawRect, aClip); return thebesLayerData; @@ -3214,7 +3202,7 @@ FrameLayerBuilder::Clip::RemoveRoundedCorners() } gfxRect -CalculateBounds(const nsTArray& aRects, int32_t A2D) +CalculateBounds(nsTArray aRects, int32_t A2D) { nsRect bounds = aRects[0].mRect; for (uint32_t i = 1; i < aRects.Length(); ++i) { @@ -3223,36 +3211,16 @@ CalculateBounds(const nsTArray& aRects, in return nsLayoutUtils::RectToGfxRect(bounds, A2D); } - -static void -SetClipCount(ThebesDisplayItemLayerUserData* aThebesData, - uint32_t aClipCount) -{ - if (aThebesData) { - aThebesData->mMaskClipCount = aClipCount; - } -} - + void ContainerState::SetupMaskLayer(Layer *aLayer, const FrameLayerBuilder::Clip& aClip, uint32_t aRoundedRectClipCount) { - // if the number of clips we are going to mask has decreased, then aLayer might have - // cached graphics which assume the existence of a soon-to-be non-existent mask layer - // in that case, invalidate the whole layer. - ThebesDisplayItemLayerUserData* thebesData = GetThebesDisplayItemLayerUserData(aLayer); - if (thebesData && - aRoundedRectClipCount < thebesData->mMaskClipCount) { - ThebesLayer* thebes = aLayer->AsThebesLayer(); - thebes->InvalidateRegion(thebes->GetValidRegion().GetBounds()); - } - // don't build an unnecessary mask nsIntRect layerBounds = aLayer->GetVisibleRegion().GetBounds(); if (aClip.mRoundedClipRects.IsEmpty() || - aRoundedRectClipCount == 0 || + aRoundedRectClipCount <= 0 || layerBounds.IsEmpty()) { - SetClipCount(thebesData, 0); return; } @@ -3270,7 +3238,6 @@ ContainerState::SetupMaskLayer(Layer *aLayer, const FrameLayerBuilder::Clip& aCl if (*userData == newData) { aLayer->SetMaskLayer(maskLayer); - SetClipCount(thebesData, aRoundedRectClipCount); return; } @@ -3296,24 +3263,28 @@ ContainerState::SetupMaskLayer(Layer *aLayer, const FrameLayerBuilder::Clip& aCl gfxMatrix imageTransform = maskTransform; imageTransform.Scale(mParameters.mXScale, mParameters.mYScale); - nsAutoPtr newKey( - new MaskLayerImageCache::MaskLayerImageKey(aLayer->Manager()->GetBackendType())); - // copy and transform the rounded rects + nsTArray roundedRects; for (uint32_t i = 0; i < newData.mRoundedClipRects.Length(); ++i) { - newKey->mRoundedClipRects.AppendElement( + roundedRects.AppendElement( MaskLayerImageCache::PixelRoundedRect(newData.mRoundedClipRects[i], mContainerFrame->PresContext())); - newKey->mRoundedClipRects[i].ScaleAndTranslate(imageTransform); + roundedRects[i].ScaleAndTranslate(imageTransform); } - const MaskLayerImageCache::MaskLayerImageKey* lookupKey = newKey; - // check to see if we can reuse a mask image + const MaskLayerImageCache::MaskLayerImageKey* key = + new MaskLayerImageCache::MaskLayerImageKey(roundedRects, aLayer->Manager()->GetBackendType()); + const MaskLayerImageCache::MaskLayerImageKey* lookupKey = key; + nsRefPtr container = GetMaskLayerImageCache()->FindImageFor(&lookupKey); - if (!container) { + if (container) { + // track the returned key for the mask image + delete key; + key = lookupKey; + } else { // no existing mask image, so build a new one nsRefPtr surface = aLayer->Manager()->CreateOptimalMaskSurface(surfaceSize); @@ -3321,7 +3292,6 @@ ContainerState::SetupMaskLayer(Layer *aLayer, const FrameLayerBuilder::Clip& aCl // fail if we can't get the right surface if (!surface || surface->CairoStatus()) { NS_WARNING("Could not create surface for mask layer."); - SetClipCount(thebesData, 0); return; } @@ -3344,7 +3314,7 @@ ContainerState::SetupMaskLayer(Layer *aLayer, const FrameLayerBuilder::Clip& aCl static_cast(image.get())->SetData(data); container->SetCurrentImageInTransaction(image); - GetMaskLayerImageCache()->PutImage(newKey.forget(), container); + GetMaskLayerImageCache()->PutImage(key, container); } maskLayer->SetContainer(container); @@ -3354,10 +3324,9 @@ ContainerState::SetupMaskLayer(Layer *aLayer, const FrameLayerBuilder::Clip& aCl userData->mScaleX = newData.mScaleX; userData->mScaleY = newData.mScaleY; userData->mRoundedClipRects.SwapElements(newData.mRoundedClipRects); - userData->mImageKey = lookupKey; + userData->mImageKey = key; aLayer->SetMaskLayer(maskLayer); - SetClipCount(thebesData, aRoundedRectClipCount); return; } diff --git a/layout/base/MaskLayerImageCache.cpp b/layout/base/MaskLayerImageCache.cpp index af21c4b8326..8c67029be61 100644 --- a/layout/base/MaskLayerImageCache.cpp +++ b/layout/base/MaskLayerImageCache.cpp @@ -12,13 +12,10 @@ namespace mozilla { MaskLayerImageCache::MaskLayerImageCache() { - MOZ_COUNT_CTOR(MaskLayerImageCache); mMaskImageContainers.Init(); } MaskLayerImageCache::~MaskLayerImageCache() -{ - MOZ_COUNT_DTOR(MaskLayerImageCache); -} +{} /* static */ PLDHashOperator diff --git a/layout/base/MaskLayerImageCache.h b/layout/base/MaskLayerImageCache.h index 5598c5f5416..ab27f4f7016 100644 --- a/layout/base/MaskLayerImageCache.h +++ b/layout/base/MaskLayerImageCache.h @@ -50,24 +50,10 @@ public: aPresContext->AppUnitsToGfxUnits(aRRect.mRect.width), aPresContext->AppUnitsToGfxUnits(aRRect.mRect.height)) { - MOZ_COUNT_CTOR(PixelRoundedRect); NS_FOR_CSS_HALF_CORNERS(corner) { mRadii[corner] = aPresContext->AppUnitsToGfxUnits(aRRect.mRadii[corner]); } } - PixelRoundedRect(const PixelRoundedRect& aPRR) - : mRect(aPRR.mRect) - { - MOZ_COUNT_CTOR(PixelRoundedRect); - NS_FOR_CSS_HALF_CORNERS(corner) { - mRadii[corner] = aPRR.mRadii[corner]; - } - } - - ~PixelRoundedRect() - { - MOZ_COUNT_DTOR(PixelRoundedRect); - } // Applies the scale and translate components of aTransform. // It is an error to pass a matrix which does more than just scale @@ -113,9 +99,6 @@ public: gfxRect mRect; // Indices into mRadii are the NS_CORNER_* constants in nsStyleConsts.h gfxFloat mRadii[8]; - - private: - PixelRoundedRect() MOZ_DELETE; }; /** @@ -128,27 +111,14 @@ public: * pointers to a key object (the +1 being from the hashtable entry), but this * invariant may be temporarily broken. */ - struct MaskLayerImageKey + class MaskLayerImageKey { - MaskLayerImageKey(layers::LayersBackend aBackend) + public: + MaskLayerImageKey(const nsTArray& aRoundedClipRects, layers::LayersBackend aBackend) : mBackend(aBackend) , mLayerCount(0) - , mRoundedClipRects() - { - MOZ_COUNT_CTOR(MaskLayerImageKey); - } - MaskLayerImageKey(const MaskLayerImageKey& aKey) - : mBackend(aKey.mBackend) - , mLayerCount(aKey.mLayerCount) - , mRoundedClipRects(aKey.mRoundedClipRects) - { - MOZ_COUNT_CTOR(MaskLayerImageKey); - } - - ~MaskLayerImageKey() - { - MOZ_COUNT_DTOR(MaskLayerImageKey); - } + , mRoundedClipRects(aRoundedClipRects) + {} void AddRef() const { ++mLayerCount; } void Release() const @@ -202,14 +172,11 @@ protected: typedef const MaskLayerImageKey& KeyType; typedef const MaskLayerImageKey* KeyTypePointer; - MaskLayerImageEntry(KeyTypePointer aKey) : mKey(aKey) + MaskLayerImageEntry(KeyTypePointer aKey) : mKey(aKey) {} + MaskLayerImageEntry(const MaskLayerImageEntry& aOther) + : mKey(aOther.mKey.get()) { - MOZ_COUNT_CTOR(MaskLayerImageEntry); - } - MaskLayerImageEntry(const MaskLayerImageEntry& aOther) MOZ_DELETE; - ~MaskLayerImageEntry() - { - MOZ_COUNT_DTOR(MaskLayerImageEntry); + NS_ERROR("ALLOW_MEMMOVE == true, should never be called"); } // KeyEquals(): does this entry match this key?