diff --git a/gfx/macbuild/gfx.mcp b/gfx/macbuild/gfx.mcp index 03e3510674a..d46a7de4262 100644 Binary files a/gfx/macbuild/gfx.mcp and b/gfx/macbuild/gfx.mcp differ diff --git a/gfx/src/mac/nsATSUIUtils.cpp b/gfx/src/mac/nsATSUIUtils.cpp index aebce890ac6..8941ea37eff 100644 --- a/gfx/src/mac/nsATSUIUtils.cpp +++ b/gfx/src/mac/nsATSUIUtils.cpp @@ -356,7 +356,7 @@ nsATSUIToolkit::nsATSUIToolkit() // //------------------------------------------------------------------------ -void nsATSUIToolkit::PrepareToDraw(PRBool aFontOrColorChanged, GraphicState* aGS, GrafPtr aPort, nsIDeviceContext* aContext) +void nsATSUIToolkit::PrepareToDraw(PRBool aFontOrColorChanged, nsGraphicState* aGS, GrafPtr aPort, nsIDeviceContext* aContext) { mFontOrColorChanged |= aFontOrColorChanged; mGS = aGS; diff --git a/gfx/src/mac/nsATSUIUtils.h b/gfx/src/mac/nsATSUIUtils.h index 46af17ef21e..edb888f68f9 100644 --- a/gfx/src/mac/nsATSUIUtils.h +++ b/gfx/src/mac/nsATSUIUtils.h @@ -29,7 +29,7 @@ class ATSUILayoutCache; class nsDrawingSurfaceMac; class nsIDeviceContext; -class GraphicState; +class nsGraphicState; class nsATSUIUtils @@ -54,7 +54,7 @@ public: nsATSUIToolkit(); ~nsATSUIToolkit() {}; - void PrepareToDraw(PRBool aFontOrColorChanged, GraphicState* aGS, GrafPtr aPort, nsIDeviceContext* aContext); + void PrepareToDraw(PRBool aFontOrColorChanged, nsGraphicState* aGS, GrafPtr aPort, nsIDeviceContext* aContext); NS_IMETHOD GetWidth(const PRUnichar *aString, PRUint32 aLength, nscoord &aWidth, PRInt32 *aFontID); NS_IMETHOD DrawString(const PRUnichar *aString, PRUint32 aLength, nscoord aX, nscoord aY, PRInt32 aFontID, const nscoord* aSpacing); @@ -64,9 +64,9 @@ private: private: ATSUTextLayout mLastTextLayout; - PRBool mFontOrColorChanged; - GraphicState* mGS; - GrafPtr mPort; + PRBool mFontOrColorChanged; + nsGraphicState* mGS; + GrafPtr mPort; nsIDeviceContext* mContext; }; diff --git a/gfx/src/mac/nsDrawingSurfaceMac.cpp b/gfx/src/mac/nsDrawingSurfaceMac.cpp index ca6403777e4..eb361dc1f5d 100644 --- a/gfx/src/mac/nsDrawingSurfaceMac.cpp +++ b/gfx/src/mac/nsDrawingSurfaceMac.cpp @@ -18,6 +18,7 @@ #include "nsDrawingSurfaceMac.h" +#include "nsGraphicState.h" static NS_DEFINE_IID(kIDrawingSurfaceIID, NS_IDRAWING_SURFACE_IID); @@ -34,7 +35,7 @@ nsDrawingSurfaceMac :: nsDrawingSurfaceMac() NS_INIT_REFCNT(); mPort = NULL; - mGS = new GraphicState(); + mGS = sGraphicStatePool.GetNewGS(); //new nsGraphicState(); mWidth = mHeight = 0; mLockOffset = mLockHeight = 0; mLockFlags = 0; @@ -58,7 +59,7 @@ GWorldPtr offscreenGWorld; } if (mGS){ - delete mGS; + sGraphicStatePool.ReleaseGS(mGS); //delete mGS; } } diff --git a/gfx/src/mac/nsDrawingSurfaceMac.h b/gfx/src/mac/nsDrawingSurfaceMac.h index 676403cb0ed..3f184fb6332 100644 --- a/gfx/src/mac/nsDrawingSurfaceMac.h +++ b/gfx/src/mac/nsDrawingSurfaceMac.h @@ -22,39 +22,7 @@ #include "nsIDrawingSurface.h" #include "nsIDrawingSurfaceMac.h" #include "nsFontMetricsMac.h" - - -class GraphicState -{ -public: - GraphicState(); - ~GraphicState(); - - NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW - - void Clear(); - void Init(nsDrawingSurface aSurface); - void Init(GrafPtr aPort); - void Init(nsIWidget* aWindow); - void Duplicate(GraphicState* aGS); // would you prefer an '=' operator? - -protected: - RgnHandle DuplicateRgn(RgnHandle aRgn); - -public: - nsTransform2D * mTMatrix; // transform that all the graphics drawn here will obey - - PRInt32 mOffx; - PRInt32 mOffy; - - RgnHandle mMainRegion; - RgnHandle mClipRegion; - - nscolor mColor; - PRInt32 mFont; - nsIFontMetrics * mFontMetrics; - PRInt32 mCurrFontHandle; -}; +#include "nsGraphicState.h" class nsDrawingSurfaceMac : public nsIDrawingSurface, @@ -84,7 +52,7 @@ public: NS_IMETHOD GetGrafPtr(GrafPtr *aTheGrafPtr) {*aTheGrafPtr = mPort;return NS_OK;} // locals - GraphicState* GetGS(void) {return mGS;} + nsGraphicState* GetGS(void) {return mGS;} private: GrafPtr mPort; // the onscreen or offscreen GrafPtr; @@ -96,7 +64,7 @@ private: PRUint32 mLockFlags; PRBool mIsOffscreen; - GraphicState* mGS; // a graphics state for the surface + nsGraphicState* mGS; // a graphics state for the surface }; #endif diff --git a/gfx/src/mac/nsRegionMac.cpp b/gfx/src/mac/nsRegionMac.cpp index 034586a36ef..11b3e57facc 100644 --- a/gfx/src/mac/nsRegionMac.cpp +++ b/gfx/src/mac/nsRegionMac.cpp @@ -19,6 +19,65 @@ #include "nsRegionMac.h" #include "prmem.h" + +nsNativeRegionPool sNativeRegionPool; + +//------------------------------------------------------------------------ + +nsNativeRegionPool::nsNativeRegionPool() +{ + for (short i = 0; i < kRegionPoolCount; i ++) + { + mRegionArray[i].mRegion = ::NewRgn(); + mRegionArray[i].mFree = PR_TRUE; + } +} + +//------------------------------------------------------------------------ + +nsNativeRegionPool::~nsNativeRegionPool() +{ + for (short i = 0; i < kRegionPoolCount; i ++) + { + ::DisposeRgn(mRegionArray[i].mRegion); + } +} + +//------------------------------------------------------------------------ + +RgnHandle nsNativeRegionPool::GetNewRegion() +{ + for (short i = 0; i < kRegionPoolCount; i ++) + { + if (mRegionArray[i].mFree) + { + mRegionArray[i].mFree = PR_FALSE; + return mRegionArray[i].mRegion; + } + } + return (::NewRgn()); // we overflew the pool: return a new region +} + +//------------------------------------------------------------------------ + +void nsNativeRegionPool::ReleaseRegion(RgnHandle aRgnHandle) +{ + for (short i = 0; i < kRegionPoolCount; i ++) + { + if (mRegionArray[i].mRegion == aRgnHandle) + { + ::SetEmptyRgn(mRegionArray[i].mRegion); + mRegionArray[i].mFree = PR_TRUE; + return; + } + } + ::DisposeRgn(aRgnHandle); // we overflew the pool: delete the GraphicState +} + + +#pragma mark - +//------------------------------------------------------------------------ + static NS_DEFINE_IID(kRegionIID, NS_IREGION_IID); //--------------------------------------------------------------------- @@ -35,19 +94,19 @@ nsRegionMac :: nsRegionMac() nsRegionMac :: ~nsRegionMac() { if (mRegion) - ::DisposeRgn(mRegion); + sNativeRegionPool.ReleaseRegion(mRegion); //::DisposeRgn(mRegion); mRegion = nsnull; } -NS_IMPL_QUERY_INTERFACE(nsRegionMac, kRegionIID) -NS_IMPL_ADDREF(nsRegionMac) -NS_IMPL_RELEASE(nsRegionMac) +NS_IMPL_QUERY_INTERFACE(nsRegionMac, kRegionIID); +NS_IMPL_ADDREF(nsRegionMac); +NS_IMPL_RELEASE(nsRegionMac); //--------------------------------------------------------------------- nsresult nsRegionMac :: Init(void) { - mRegion = ::NewRgn(); + mRegion = sNativeRegionPool.GetNewRegion(); //::NewRgn(); mRegionType = eRegionComplexity_empty; return NS_OK; } @@ -82,10 +141,10 @@ void nsRegionMac :: Intersect(const nsIRegion &aRegion) void nsRegionMac :: Intersect(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight) { - RgnHandle rectRgn = ::NewRgn(); + RgnHandle rectRgn = sNativeRegionPool.GetNewRegion(); //::NewRgn(); ::SetRectRgn(rectRgn, aX, aY, aX + aWidth, aY + aHeight); ::SectRgn(mRegion, rectRgn, mRegion); - ::DisposeRgn(rectRgn); + sNativeRegionPool.ReleaseRegion(rectRgn); //::DisposeRgn(rectRgn); SetRegionType(); } @@ -102,10 +161,10 @@ void nsRegionMac :: Union(const nsIRegion &aRegion) void nsRegionMac :: Union(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight) { - RgnHandle rectRgn = ::NewRgn(); + RgnHandle rectRgn = sNativeRegionPool.GetNewRegion(); //::NewRgn(); ::SetRectRgn(rectRgn, aX, aY, aX + aWidth, aY + aHeight); ::UnionRgn(mRegion, rectRgn, mRegion); - ::DisposeRgn(rectRgn); + sNativeRegionPool.ReleaseRegion(rectRgn); //::DisposeRgn(rectRgn); SetRegionType(); } @@ -122,10 +181,10 @@ void nsRegionMac :: Subtract(const nsIRegion &aRegion) void nsRegionMac :: Subtract(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight) { - RgnHandle rectRgn = ::NewRgn(); + RgnHandle rectRgn = sNativeRegionPool.GetNewRegion(); //::NewRgn(); ::SetRectRgn(rectRgn, aX, aY, aX + aWidth, aY + aHeight); ::DiffRgn(mRegion, rectRgn, mRegion); - ::DisposeRgn(rectRgn); + sNativeRegionPool.ReleaseRegion(rectRgn); //::DisposeRgn(rectRgn); SetRegionType(); } @@ -431,7 +490,7 @@ void nsRegionMac :: SetRegionEmpty() RgnHandle nsRegionMac :: CreateRectRegion(PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight) { - RgnHandle rectRgn = ::NewRgn(); + RgnHandle rectRgn = sNativeRegionPool.GetNewRegion(); //::NewRgn(); ::SetRectRgn(rectRgn, aX, aY, aX + aWidth, aY + aHeight); return rectRgn; } diff --git a/gfx/src/mac/nsRegionMac.h b/gfx/src/mac/nsRegionMac.h index d94d45dde2f..a8fa6f71bf0 100644 --- a/gfx/src/mac/nsRegionMac.h +++ b/gfx/src/mac/nsRegionMac.h @@ -22,6 +22,34 @@ #include "nsIRegion.h" #include +//------------------------------------------------------------------------ + +class nsNativeRegionPool +{ +public: + nsNativeRegionPool(); + ~nsNativeRegionPool(); + + RgnHandle GetNewRegion(); + void ReleaseRegion(RgnHandle aRgnHandle); + +private: + static const short kRegionPoolCount = 200; + + typedef struct nsRegionRec + { + RgnHandle mRegion; + PRBool mFree; + } nsRegionRec; + + nsRegionRec mRegionArray[kRegionPoolCount]; +}; + +//------------------------------------------------------------------------ + +extern nsNativeRegionPool sNativeRegionPool; + +//------------------------------------------------------------------------ class nsRegionMac : public nsIRegion { diff --git a/gfx/src/mac/nsRenderingContextMac.cpp b/gfx/src/mac/nsRenderingContextMac.cpp index 05f31b0d0e7..70da8a14da2 100644 --- a/gfx/src/mac/nsRenderingContextMac.cpp +++ b/gfx/src/mac/nsRenderingContextMac.cpp @@ -22,6 +22,7 @@ #include "nsIRegion.h" #include "nsIEnumerator.h" #include "nsRegionMac.h" +#include "nsGraphicState.h" #include "nsTransform2D.h" #include "nsVoidArray.h" @@ -33,164 +34,11 @@ #include -#pragma mark - - -//------------------------------------------------------------------------ -// GraphicState -// -//------------------------------------------------------------------------ - #define DrawingSurface nsDrawingSurfaceMac - -//------------------------------------------------------------------------ - -GraphicState::GraphicState() -{ - // everything is initialized to 0 through the 'new' operator -} - -//------------------------------------------------------------------------ - -GraphicState::~GraphicState() -{ - Clear(); -} - -//------------------------------------------------------------------------ - -void GraphicState::Clear() -{ - if (mTMatrix) - { - delete mTMatrix; - mTMatrix = nsnull; - } - - if (mMainRegion) - { - ::DisposeRgn(mMainRegion); - mMainRegion = nsnull; - } - - if (mClipRegion) - { - ::DisposeRgn(mClipRegion); - mClipRegion = nsnull; - } - - NS_IF_RELEASE(mFontMetrics); - - mOffx = 0; - mOffy = 0; - mColor = NS_RGB(255,255,255); - mFont = 0; - mFontMetrics = nsnull; - mCurrFontHandle = 0; -} - -//------------------------------------------------------------------------ - -void GraphicState::Init(nsDrawingSurface aSurface) -{ - // retrieve the grafPort - DrawingSurface* surface = static_cast(aSurface); - GrafPtr port; - surface->GetGrafPtr(&port); - - // init from grafPort - Init(port); -} - -//------------------------------------------------------------------------ - -void GraphicState::Init(GrafPtr aPort) -{ - // delete old values - Clear(); - - // init from grafPort (usually an offscreen port) - RgnHandle rgn = ::NewRgn(); -#if TARGET_CARBON - if ( rgn ) { - Rect bounds; - ::RectRgn(rgn, ::GetPortBounds(aPort, &bounds)); - } -#else - if (rgn) - ::RectRgn(rgn, &aPort->portRect); -#endif - - mMainRegion = rgn; - mClipRegion = DuplicateRgn(rgn); -} - -//------------------------------------------------------------------------ - -void GraphicState::Init(nsIWidget* aWindow) -{ - // delete old values - Clear(); - - // init from widget - mOffx = (PRInt32)aWindow->GetNativeData(NS_NATIVE_OFFSETX); - mOffy = (PRInt32)aWindow->GetNativeData(NS_NATIVE_OFFSETY); - - RgnHandle widgetRgn = (RgnHandle)aWindow->GetNativeData(NS_NATIVE_REGION); - mMainRegion = DuplicateRgn(widgetRgn); - mClipRegion = DuplicateRgn(widgetRgn); -} - -//------------------------------------------------------------------------ - -void GraphicState::Duplicate(GraphicState* aGS) -{ - // delete old values - Clear(); - - // copy new ones - if (aGS->mTMatrix) - mTMatrix = new nsTransform2D(aGS->mTMatrix); - else - mTMatrix = nsnull; - - mOffx = aGS->mOffx; - mOffy = aGS->mOffy; - - mMainRegion = DuplicateRgn(aGS->mMainRegion); - mClipRegion = DuplicateRgn(aGS->mClipRegion); - - mColor = aGS->mColor; - mFont = aGS->mFont; - mFontMetrics = aGS->mFontMetrics; - NS_IF_ADDREF(mFontMetrics); - - mCurrFontHandle = aGS->mCurrFontHandle; -} - - -//------------------------------------------------------------------------ - -RgnHandle GraphicState::DuplicateRgn(RgnHandle aRgn) -{ - RgnHandle dupRgn = nsnull; - if (aRgn) - { - dupRgn = ::NewRgn(); - if (dupRgn) - ::CopyRgn(aRgn, dupRgn); - } - return dupRgn; -} - - -//------------------------------------------------------------------------ - -#pragma mark - - static NS_DEFINE_IID(kRenderingContextIID, NS_IRENDERING_CONTEXT_IID); - +//------------------------------------------------------------------------ nsRenderingContextMac::nsRenderingContextMac() { @@ -241,9 +89,9 @@ nsRenderingContextMac::~nsRenderingContextMac() PRInt32 cnt = mGSStack->Count(); for (PRInt32 i = 0; i < cnt; i ++) { - GraphicState* gs = (GraphicState*)mGSStack->ElementAt(i); + nsGraphicState* gs = (nsGraphicState*)mGSStack->ElementAt(i); if (gs) - delete gs; + sGraphicStatePool.ReleaseGS(gs); //delete gs; } delete mGSStack; mGSStack = nsnull; @@ -405,7 +253,7 @@ NS_IMETHODIMP nsRenderingContextMac::SetPortTextState() NS_IMETHODIMP nsRenderingContextMac :: PushState(void) { // create a GS - GraphicState * gs = new GraphicState(); + nsGraphicState * gs = sGraphicStatePool.GetNewGS(); //new nsGraphicState(); if (!gs) return NS_ERROR_OUT_OF_MEMORY; @@ -426,7 +274,7 @@ NS_IMETHODIMP nsRenderingContextMac :: PopState(PRBool &aClipEmpty) if (cnt > 0) { // get the GS from the stack - GraphicState* gs = (GraphicState *)mGSStack->ElementAt(cnt - 1); + nsGraphicState* gs = (nsGraphicState *)mGSStack->ElementAt(cnt - 1); // copy the GS into the current one and tell the current surface to use it mGS->Duplicate(gs); @@ -434,7 +282,7 @@ NS_IMETHODIMP nsRenderingContextMac :: PopState(PRBool &aClipEmpty) // remove the GS object from the stack and delete it mGSStack->RemoveElementAt(cnt - 1); - delete gs; + sGraphicStatePool.ReleaseGS(gs); //delete gs; } aClipEmpty = (::EmptyRgn(mGS->mClipRegion)); @@ -717,7 +565,7 @@ NS_IMETHODIMP nsRenderingContextMac :: SetClipRect(const nsRect& aRect, nsClipCo Rect macRect; ::SetRect(&macRect, trect.x, trect.y, trect.x + trect.width, trect.y + trect.height); - RgnHandle rectRgn = ::NewRgn(); + RgnHandle rectRgn = sNativeRegionPool.GetNewRegion(); //::NewRgn(); RgnHandle clipRgn = mGS->mClipRegion; if (!clipRgn || !rectRgn) return NS_ERROR_OUT_OF_MEMORY; @@ -743,7 +591,7 @@ NS_IMETHODIMP nsRenderingContextMac :: SetClipRect(const nsRect& aRect, nsClipCo ::SectRgn(rectRgn, mGS->mMainRegion, clipRgn); break; } - ::DisposeRgn(rectRgn); + sNativeRegionPool.ReleaseRegion(rectRgn); //::DisposeRgn(rectRgn); StartDraw(); ::SetClip(clipRgn); @@ -889,7 +737,7 @@ NS_IMETHODIMP nsRenderingContextMac :: GetColor(nscolor &aColor) const NS_IMETHODIMP nsRenderingContextMac :: SetLineStyle(nsLineStyle aLineStyle) { - // note: the line style must be saved in the GraphicState like font, color, etc... + // note: the line style must be saved in the nsGraphicState like font, color, etc... NS_NOTYETIMPLEMENTED("nsRenderingContextMac::SetLineStyle");//ĄTODO return NS_OK; } diff --git a/gfx/src/mac/nsRenderingContextMac.h b/gfx/src/mac/nsRenderingContextMac.h index 34b31e9c357..d948cc417a5 100644 --- a/gfx/src/mac/nsRenderingContextMac.h +++ b/gfx/src/mac/nsRenderingContextMac.h @@ -31,7 +31,7 @@ class nsFont; class nsTransform2D; class nsVoidArray; -class GraphicState; +class nsGraphicState; class DrawingSurface; // a surface is a combination of a port and a graphic state @@ -156,7 +156,7 @@ protected: nsDrawingSurfaceMac* mCurrentSurface; // pointer to the current surface GrafPtr mPort; // current grafPort - shortcut for mCurrentSurface->GetPort() - GraphicState * mGS; // current graphic state - shortcut for mCurrentSurface->GetGS() + nsGraphicState * mGS; // current graphic state - shortcut for mCurrentSurface->GetGS() nsVoidArray * mGSStack; // GraphicStates stack, used for PushState/PopState PRInt8 mChanges;