diff --git a/gfx/ipc/GfxMessageUtils.h b/gfx/ipc/GfxMessageUtils.h index b375300da7b7..e4bc6162fc4b 100644 --- a/gfx/ipc/GfxMessageUtils.h +++ b/gfx/ipc/GfxMessageUtils.h @@ -393,7 +393,7 @@ template struct ParamTraits> : RegionParamTraits, mozilla::gfx::IntRectTyped, - typename mozilla::gfx::IntRegionTyped::RectIterator> + typename mozilla::gfx::IntRegionTyped::OldRectIterator> {}; template<> diff --git a/gfx/layers/LayersLogging.h b/gfx/layers/LayersLogging.h index bf177d3b40d7..6e95348e9185 100644 --- a/gfx/layers/LayersLogging.h +++ b/gfx/layers/LayersLogging.h @@ -102,7 +102,7 @@ AppendToString(std::stringstream& aStream, const mozilla::gfx::IntRegionTypedCopySurface(source, IntRect(r->x - mInvalidRect.x, r->y - mInvalidRect.y, r->width, r->height), diff --git a/gfx/layers/ipc/CompositorChild.cpp b/gfx/layers/ipc/CompositorChild.cpp index b7aedf973bbd..61a4307d097b 100644 --- a/gfx/layers/ipc/CompositorChild.cpp +++ b/gfx/layers/ipc/CompositorChild.cpp @@ -234,7 +234,7 @@ static void CalculatePluginClip(const LayoutDeviceIntRect& aBounds, } // shift to plugin widget origin contentVisibleRegion.MoveBy(-aBounds.x, -aBounds.y); - LayoutDeviceIntRegion::RectIterator iter(contentVisibleRegion); + LayoutDeviceIntRegion::OldRectIterator iter(contentVisibleRegion); for (const LayoutDeviceIntRect* rgnRect = iter.Next(); rgnRect; rgnRect = iter.Next()) { aResult.AppendElement(*rgnRect); aVisibleBounds.UnionRect(aVisibleBounds, *rgnRect); diff --git a/gfx/src/nsRegion.h b/gfx/src/nsRegion.h index 952496ba9047..a809307f1f1a 100644 --- a/gfx/src/nsRegion.h +++ b/gfx/src/nsRegion.h @@ -351,6 +351,45 @@ public: void VisitEdges(visitFn, void *closure); nsCString ToString() const; + + class RectIterator + { + int mCurrent; // Index of the current entry + int mLimit; // Index one past the final entry. + mutable nsRect mTmp; // The most recently gotten rectangle. + pixman_box32_t *mBoxes; + + public: + explicit RectIterator(const nsRegion& aRegion) + { + mCurrent = 0; + mBoxes = pixman_region32_rectangles(aRegion.Impl(), &mLimit); + // Work around pixman bug. Sometimes pixman creates regions with 1 rect + // that's empty. + if (mLimit == 1 && nsRegion::BoxToRect(mBoxes[0]).IsEmpty()) { + mLimit = 0; + } + } + + bool Done() const { return mCurrent == mLimit; } + + const nsRect& Get() const + { + MOZ_ASSERT(!Done()); + mTmp = nsRegion::BoxToRect(mBoxes[mCurrent]); + NS_ASSERTION(!mTmp.IsEmpty(), "Shouldn't return empty rect"); + return mTmp; + } + + void Next() + { + MOZ_ASSERT(!Done()); + mCurrent++; + } + }; + + RectIterator RectIter() const { return RectIterator(*this); } + private: pixman_region32_t mImpl; @@ -701,7 +740,7 @@ public: nsRegion ToAppUnits (nscoord aAppUnitsPerPixel) const { nsRegion result; - RectIterator rgnIter(*this); + OldRectIterator rgnIter(*this); const Rect* currentRect; while ((currentRect = rgnIter.Next())) { nsRect appRect = ::ToAppUnits(*currentRect, aAppUnitsPerPixel); @@ -768,13 +807,14 @@ public: nsCString ToString() const { return mImpl.ToString(); } - class RectIterator + // XXX: this is going away soon in favour of RectIterator + class OldRectIterator { nsRegionRectIterator mImpl; Rect mTmp; public: - explicit RectIterator (const BaseIntRegion& aRegion) : mImpl (aRegion.mImpl) {} + explicit OldRectIterator (const BaseIntRegion& aRegion) : mImpl (aRegion.mImpl) {} const Rect* Next () { @@ -800,6 +840,29 @@ public: } }; + class RectIterator + { + nsRegion::RectIterator mImpl; // The underlying iterator. + mutable Rect mTmp; // The most recently gotten rectangle. + + public: + explicit RectIterator(const BaseIntRegion& aRegion) + : mImpl(aRegion.mImpl) + {} + + bool Done() const { return mImpl.Done(); } + + const Rect& Get() const + { + mTmp = FromRect(mImpl.Get()); + return mTmp; + } + + void Next() { mImpl.Next(); } + }; + + RectIterator RectIter() const { return RectIterator(*this); } + protected: // Expose enough to derived classes from them to define conversions // between different types of BaseIntRegions. @@ -875,6 +938,6 @@ private: } // namespace mozilla typedef mozilla::gfx::IntRegion nsIntRegion; -typedef nsIntRegion::RectIterator nsIntRegionRectIterator; +typedef nsIntRegion::OldRectIterator nsIntRegionRectIterator; #endif diff --git a/widget/PuppetWidget.cpp b/widget/PuppetWidget.cpp index ce7c7af6cfb5..bcc72f25f47b 100644 --- a/widget/PuppetWidget.cpp +++ b/widget/PuppetWidget.cpp @@ -32,7 +32,7 @@ using namespace mozilla::widget; static void InvalidateRegion(nsIWidget* aWidget, const LayoutDeviceIntRegion& aRegion) { - LayoutDeviceIntRegion::RectIterator it(aRegion); + LayoutDeviceIntRegion::OldRectIterator it(aRegion); while(const LayoutDeviceIntRect* r = it.Next()) { aWidget->Invalidate(*r); } diff --git a/widget/cocoa/VibrancyManager.mm b/widget/cocoa/VibrancyManager.mm index 26f9670b1fa1..411554e9b150 100644 --- a/widget/cocoa/VibrancyManager.mm +++ b/widget/cocoa/VibrancyManager.mm @@ -28,7 +28,7 @@ VibrancyManager::UpdateVibrantRegion(VibrancyType aType, vr.effectViews.SwapElements(viewsToRecycle); // vr.effectViews is now empty. - LayoutDeviceIntRegion::RectIterator iter(aRegion); + LayoutDeviceIntRegion::OldRectIterator iter(aRegion); const LayoutDeviceIntRect* iterRect = nullptr; for (size_t i = 0; (iterRect = iter.Next()) || i < viewsToRecycle.Length(); ++i) { if (iterRect) { @@ -71,7 +71,7 @@ VibrancyManager::ClearVibrantRegion(const VibrantRegion& aVibrantRegion) const { [[NSColor clearColor] set]; - LayoutDeviceIntRegion::RectIterator iter(aVibrantRegion.region); + LayoutDeviceIntRegion::OldRectIterator iter(aVibrantRegion.region); while (const LayoutDeviceIntRect* rect = iter.Next()) { NSRectFill(mCoordinateConverter.DevPixelsToCocoaPoints(*rect)); } diff --git a/widget/cocoa/nsChildView.mm b/widget/cocoa/nsChildView.mm index 8fba8c8c06b4..85d9a26cfa4e 100644 --- a/widget/cocoa/nsChildView.mm +++ b/widget/cocoa/nsChildView.mm @@ -3753,7 +3753,7 @@ NSEvent* gLastDragMouseDownEvent = nil; RefPtr targetContext = new gfxContext(dt); // Set up the clip region. - LayoutDeviceIntRegion::RectIterator iter(region); + LayoutDeviceIntRegion::OldRectIterator iter(region); targetContext->NewPath(); for (;;) { const LayoutDeviceIntRect* r = iter.Next(); @@ -4632,7 +4632,7 @@ NewCGSRegionFromRegion(const LayoutDeviceIntRegion& aRegion, CGRect (^aRectConverter)(const LayoutDeviceIntRect&)) { nsTArray rects; - LayoutDeviceIntRegion::RectIterator iter(aRegion); + LayoutDeviceIntRegion::OldRectIterator iter(aRegion); for (;;) { const LayoutDeviceIntRect* r = iter.Next(); if (!r) { diff --git a/widget/nsBaseWidget.cpp b/widget/nsBaseWidget.cpp index c3497c4ee5d3..54cd58c0606f 100644 --- a/widget/nsBaseWidget.cpp +++ b/widget/nsBaseWidget.cpp @@ -758,7 +758,7 @@ nsBaseWidget::ArrayFromRegion(const LayoutDeviceIntRegion& aRegion, nsTArray& aRects) { const LayoutDeviceIntRect* r; - for (LayoutDeviceIntRegion::RectIterator iter(aRegion); (r = iter.Next()); ) { + for (LayoutDeviceIntRegion::OldRectIterator iter(aRegion); (r = iter.Next()); ) { aRects.AppendElement(*r); } } diff --git a/widget/nsShmImage.cpp b/widget/nsShmImage.cpp index 82a28eeb18b1..784f3dc758a6 100644 --- a/widget/nsShmImage.cpp +++ b/widget/nsShmImage.cpp @@ -142,7 +142,7 @@ nsShmImage::Put(Display* aDisplay, Drawable aWindow, LayoutDeviceIntRegion bounded; bounded.And(aRegion, LayoutDeviceIntRect(0, 0, mImage->width, mImage->height)); - LayoutDeviceIntRegion::RectIterator iter(bounded); + LayoutDeviceIntRegion::OldRectIterator iter(bounded); for (const LayoutDeviceIntRect *r = iter.Next(); r; r = iter.Next()) { XShmPutImage(aDisplay, aWindow, gc, mImage, r->x, r->y, diff --git a/widget/uikit/nsWindow.mm b/widget/uikit/nsWindow.mm index 4e80ec2e2b4b..ff8d75929f80 100644 --- a/widget/uikit/nsWindow.mm +++ b/widget/uikit/nsWindow.mm @@ -377,7 +377,7 @@ private: } // Set up the clip region. - LayoutDeviceIntRegion::RectIterator iter(region); + LayoutDeviceIntRegion::OldRectIterator iter(region); targetContext->NewPath(); for (;;) { const LayoutDeviceIntRect* r = iter.Next();