From 9eacf21021962c11081e09b3ef66060dccc4880b Mon Sep 17 00:00:00 2001 From: michaelp Date: Thu, 7 May 1998 01:10:20 +0000 Subject: [PATCH] hey, now the state stack is actually useful. duh. git-svn-id: svn://10.0.0.236/trunk@1206 18797224-902f-48f8-a5cc-f745e15eee43 --- .../gfx/src/windows/nsRenderingContextWin.cpp | 186 +++++------------- .../gfx/src/windows/nsRenderingContextWin.h | 6 + 2 files changed, 59 insertions(+), 133 deletions(-) diff --git a/mozilla/gfx/src/windows/nsRenderingContextWin.cpp b/mozilla/gfx/src/windows/nsRenderingContextWin.cpp index 8e4115731ce..e3bde9c39b1 100644 --- a/mozilla/gfx/src/windows/nsRenderingContextWin.cpp +++ b/mozilla/gfx/src/windows/nsRenderingContextWin.cpp @@ -111,6 +111,9 @@ nsRenderingContextWin :: nsRenderingContextWin() mDefFont = NULL; mOrigSolidPen = NULL; mBlackPen = NULL; + mCurrBrushColor = NULL; + mCurrFontMetrics = nsnull; + mCurrPenColor = NULL; #ifdef NS_DEBUG mInitialized = PR_FALSE; #endif @@ -146,12 +149,6 @@ nsRenderingContextWin :: ~nsRenderingContextWin() mOrigSolidBrush = NULL; } - if (NULL != mBlackBrush) - { - ::DeleteObject(mBlackBrush); - mBlackBrush = NULL; - } - if (NULL != mOrigFont) { ::SelectObject(mDC, mOrigFont); @@ -170,11 +167,28 @@ nsRenderingContextWin :: ~nsRenderingContextWin() mOrigSolidPen = NULL; } - if (NULL != mBlackPen) + if (NULL != mCurrBrush) { - ::DeleteObject(mBlackPen); - mBlackPen = NULL; + ::DeleteObject(mCurrBrush); + mCurrBrush = NULL; } + else if (NULL != mBlackBrush) + ::DeleteObject(mBlackBrush); + + mBlackBrush = NULL; + + //don't kill the font because the font cache/metrics owns it + mCurrFont = NULL; + + if (NULL != mCurrPen) + { + ::DeleteObject(mCurrPen); + mCurrPen = NULL; + } + else if (NULL != mBlackPen) + ::DeleteObject(mBlackPen); + + mBlackPen = NULL; } if (nsnull != mStateCache) @@ -369,87 +383,9 @@ void nsRenderingContextWin :: PopState() oldstate->mClipRegion = NULL; } - if (NULL != oldstate->mSolidBrush) - { - pstate = mStates; - - //if the solid brushes are different between the states, - //select the previous solid brush - - while ((nsnull != pstate) && (NULL == pstate->mSolidBrush)) - pstate = pstate->mNext; - - if (nsnull != pstate) - { - if (oldstate->mSolidBrush != pstate->mSolidBrush) - ::SelectObject(mDC, pstate->mSolidBrush); - } - else - ::SelectObject(mDC, mBlackBrush); - - //kill the solid brush we are popping off the stack - - if (oldstate->mSolidBrush != mBlackBrush) - { - if (((nsnull != pstate) && (oldstate->mSolidBrush != pstate->mSolidBrush)) || - (nsnull == pstate)) - ::DeleteObject(oldstate->mSolidBrush); - } - - oldstate->mSolidBrush = NULL; - } - - if (NULL != oldstate->mFont) - { - pstate = mStates; - - //if the fonts are different between the states, - //select the previous font - - while ((nsnull != pstate) && (NULL == pstate->mFont)) - pstate = pstate->mNext; - - if (nsnull != pstate) - { - if (oldstate->mFont != pstate->mFont) - ::SelectObject(mDC, pstate->mFont); - } - else - ::SelectObject(mDC, mDefFont); - - //don't delete the font because it lives in the font metrics - oldstate->mFont = NULL; - } - - if (NULL != oldstate->mSolidPen) - { - pstate = mStates; - - //if the solid pens are different between the states, - //select the previous solid pen - - while ((nsnull != pstate) && (NULL == pstate->mSolidPen)) - pstate = pstate->mNext; - - if (nsnull != pstate) - { - if (oldstate->mSolidPen != pstate->mSolidPen) - ::SelectObject(mDC, pstate->mSolidPen); - } - else - ::SelectObject(mDC, mBlackPen); - - //kill the solid brush we are popping off the stack - - if (oldstate->mSolidPen != mBlackPen) - { - if (((nsnull != pstate) && (oldstate->mSolidPen != pstate->mSolidPen)) || - (nsnull == pstate)) - ::DeleteObject(oldstate->mSolidPen); - } - - oldstate->mSolidPen = NULL; - } + oldstate->mSolidBrush = NULL; + oldstate->mFont = NULL; + oldstate->mSolidPen = NULL; } else mTMatrix = nsnull; @@ -947,74 +883,58 @@ nsresult nsRenderingContextWin :: CopyOffScreenBits(nsRect &aBounds) return NS_OK; } +static numpen = 0; +static numbrush = 0; +static numfont = 0; + HBRUSH nsRenderingContextWin :: SetupSolidBrush(void) { - if (mCurrentColor != mStates->mBrushColor) + if ((mCurrentColor != mCurrBrushColor) || (NULL == mCurrBrush)) { HBRUSH tbrush = ::CreateSolidBrush(mColor); - HBRUSH obrush = ::SelectObject(mDC, tbrush); - if ((NULL != obrush) && (NULL != mStates->mSolidBrush)) - ::DeleteObject(obrush); + ::SelectObject(mDC, tbrush); - mStates->mSolidBrush = tbrush; - mStates->mBrushColor = mCurrentColor; + if (NULL != mCurrBrush) + ::DeleteObject(mCurrBrush); + + mStates->mSolidBrush = mCurrBrush = tbrush; + mStates->mBrushColor = mCurrBrushColor = mCurrentColor; +//printf("brushes: %d\n", ++numbrush); } - if (NULL == mStates->mSolidBrush) - { - GraphicsState *tstate = mStates->mNext; - - while ((nsnull != tstate) && (NULL == tstate->mSolidBrush)) - tstate = tstate->mNext; - - if (nsnull == tstate) - return mBlackBrush; - else - return tstate->mSolidBrush; - } - else - return mStates->mSolidBrush; + return mCurrBrush; } void nsRenderingContextWin :: SetupFont(void) { - if (mFontMetrics != mStates->mFontMetrics) + if ((mFontMetrics != mCurrFontMetrics) || (NULL == mCurrFontMetrics)) { HFONT tfont = (HFONT)mFontMetrics->GetFontHandle(); ::SelectObject(mDC, tfont); - mStates->mFont = tfont; - mStates->mFontMetrics = mFontMetrics; + + mStates->mFont = mCurrFont = tfont; + mStates->mFontMetrics = mCurrFontMetrics = mFontMetrics; +//printf("fonts: %d\n", ++numfont); } } HPEN nsRenderingContextWin :: SetupSolidPen(void) { - if (mCurrentColor != mStates->mPenColor) + if ((mCurrentColor != mCurrPenColor) || (NULL == mCurrPen)) { HPEN tpen = ::CreatePen(PS_SOLID, 0, mColor); - HPEN open = ::SelectObject(mDC, tpen); - if ((NULL != open) && (NULL != mStates->mSolidPen)) - ::DeleteObject(open); + ::SelectObject(mDC, tpen); - mStates->mSolidPen = tpen; - mStates->mPenColor = mCurrentColor; + if (NULL != mCurrPen) + ::DeleteObject(mCurrPen); + + mStates->mSolidPen = mCurrPen = tpen; + mStates->mPenColor = mCurrPenColor = mCurrentColor; +//printf("pens: %d\n", ++numpen); } - if (NULL == mStates->mSolidPen) - { - GraphicsState *tstate = mStates->mNext; - - while ((nsnull != tstate) && (NULL == tstate->mSolidPen)) - tstate = tstate->mNext; - - if (nsnull == tstate) - return mBlackPen; - else - return tstate->mSolidPen; - } - else - return mStates->mSolidPen; + return mCurrPen; } diff --git a/mozilla/gfx/src/windows/nsRenderingContextWin.h b/mozilla/gfx/src/windows/nsRenderingContextWin.h index c70cff28ee8..b616fb23e9d 100644 --- a/mozilla/gfx/src/windows/nsRenderingContextWin.h +++ b/mozilla/gfx/src/windows/nsRenderingContextWin.h @@ -150,6 +150,12 @@ protected: HFONT mDefFont; HPEN mOrigSolidPen; HPEN mBlackPen; + nscolor mCurrBrushColor; + HBRUSH mCurrBrush; + nsIFontMetrics *mCurrFontMetrics; + HFONT mCurrFont; + nscolor mCurrPenColor; + HPEN mCurrPen; #ifdef NS_DEBUG PRBool mInitialized;