From 9baf9f953d0b54f6bd0c454e0c6aedc43bd1aa31 Mon Sep 17 00:00:00 2001 From: "Jerry.Kirk%Nexwarecorp.com" Date: Thu, 30 Sep 1999 12:21:33 +0000 Subject: [PATCH] Added nsGraphicState and made changes in nsRenderingContext to use it. General clean-up of code for Photon. --- gfx/src/photon/Makefile.in | 4 +- gfx/src/photon/nsDeviceContextPh.cpp | 24 +- gfx/src/photon/nsDeviceContextPh.h | 8 + gfx/src/photon/nsDrawingSurfacePh.cpp | 293 +++++++------- gfx/src/photon/nsDrawingSurfacePh.h | 4 +- gfx/src/photon/nsFontMetricsPh.cpp | 4 +- gfx/src/photon/nsGfxFactoryPh.cpp | 28 +- gfx/src/photon/nsGraphicsStatePh.cpp | 122 ++++++ gfx/src/photon/nsGraphicsStatePh.h | 71 ++++ gfx/src/photon/nsIDrawingSurfacePh.h | 2 + gfx/src/photon/nsImagePh.cpp | 97 +++-- gfx/src/photon/nsRegionPh.cpp | 7 +- gfx/src/photon/nsRenderingContextPh.cpp | 513 ++++++++++++++---------- gfx/src/photon/nsRenderingContextPh.h | 19 +- 14 files changed, 773 insertions(+), 423 deletions(-) create mode 100644 gfx/src/photon/nsGraphicsStatePh.cpp create mode 100644 gfx/src/photon/nsGraphicsStatePh.h diff --git a/gfx/src/photon/Makefile.in b/gfx/src/photon/Makefile.in index 6f881e46f682..6509a4b98011 100644 --- a/gfx/src/photon/Makefile.in +++ b/gfx/src/photon/Makefile.in @@ -36,11 +36,13 @@ CPPSRCS = \ nsGfxFactoryPh.cpp \ nsImagePh.cpp \ nsRegionPh.cpp \ + nsGraphicsStatePh.cpp \ nsRenderingContextPh.cpp \ clip.cpp \ $(NULL) -EXPORTS = nsIRenderingContextPh.h +# Force Debug on to make logging work +DEFINES += -DDEBUG include $(topsrcdir)/config/rules.mk diff --git a/gfx/src/photon/nsDeviceContextPh.cpp b/gfx/src/photon/nsDeviceContextPh.cpp index 91b1882ea165..83ecebf1e744 100644 --- a/gfx/src/photon/nsDeviceContextPh.cpp +++ b/gfx/src/photon/nsDeviceContextPh.cpp @@ -16,20 +16,34 @@ * Reserved. */ -#include "nsDeviceContextPh.h" -#include "nsRenderingContextPh.h" -#include "nsDeviceContextSpecPh.h" +#include + +#include "nspr.h" #include "nsIPref.h" #include "nsIServiceManager.h" #include "il_util.h" +#include "nsCRT.h" + +#include "nsDeviceContextPh.h" +#include "nsRenderingContextPh.h" +#include "nsDeviceContextSpecPh.h" + #include "nsPhGfxLog.h" static NS_DEFINE_IID(kIDeviceContextSpecIID, NS_IDEVICE_CONTEXT_SPEC_IID); +static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); +static NS_DEFINE_IID(kIPrefIID, NS_IPREF_IID); + +NS_IMPL_ISUPPORTS1(nsDeviceContextPh, nsIDeviceContext) nsDeviceContextPh :: nsDeviceContextPh() - : DeviceContextImpl() { + NS_INIT_REFCNT(); + + mTwipsToPixels = 1.0; + mPixelsToTwips = 1.0; + mDepth = 0 ; mSurface = NULL; mPaletteInfo.isPaletteDevice = PR_FALSE; mPaletteInfo.sizePalette = 0; @@ -69,8 +83,6 @@ nsDeviceContextPh :: ~nsDeviceContextPh() NS_IF_RELEASE(mSpec); } -static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); -static NS_DEFINE_IID(kIPrefIID, NS_IPREF_IID); NS_IMETHODIMP nsDeviceContextPh :: Init(nsNativeWidget aWidget) { diff --git a/gfx/src/photon/nsDeviceContextPh.h b/gfx/src/photon/nsDeviceContextPh.h index e96b35e1b231..584776db3364 100644 --- a/gfx/src/photon/nsDeviceContextPh.h +++ b/gfx/src/photon/nsDeviceContextPh.h @@ -20,6 +20,12 @@ #define nsDeviceContextPh_h___ #include "nsDeviceContext.h" +#include "nsUnitConversion.h" +#include "nsIWidget.h" +#include "nsIView.h" +#include "nsIRenderingContext.h" + +#include "nsRenderingContextPh.h" #include class nsDeviceContextPh : public DeviceContextImpl @@ -27,6 +33,8 @@ class nsDeviceContextPh : public DeviceContextImpl public: nsDeviceContextPh(); + NS_DECL_ISUPPORTS + NS_IMETHOD Init(nsNativeWidget aWidget); NS_IMETHOD CreateRenderingContext(nsIRenderingContext *&aContext); diff --git a/gfx/src/photon/nsDrawingSurfacePh.cpp b/gfx/src/photon/nsDrawingSurfacePh.cpp index 7d4ca7412273..2d796b160c31 100644 --- a/gfx/src/photon/nsDrawingSurfacePh.cpp +++ b/gfx/src/photon/nsDrawingSurfacePh.cpp @@ -16,35 +16,14 @@ * Reserved. */ -#ifdef NGLAYOUT_DDRAW -#define INITGUID -#endif - #include "nsDrawingSurfacePh.h" #include "prmem.h" -#include "nsCRT.h" #include "nsPhGfxLog.h" #include #include -//#define GFX_DEBUG - -#ifdef GFX_DEBUG - #define BREAK_TO_DEBUGGER DebugBreak() -#else - #define BREAK_TO_DEBUGGER -#endif - -#ifdef GFX_DEBUG - #define VERIFY(exp) ((exp) ? 0: (GetLastError(), BREAK_TO_DEBUGGER)) -#else // !_DEBUG - #define VERIFY(exp) (exp) -#endif // !_DEBUG - -static NS_DEFINE_IID(kIDrawingSurfaceIID, NS_IDRAWING_SURFACE_IID); -static NS_DEFINE_IID(kIDrawingSurfacePhIID, NS_IDRAWING_SURFACE_PH_IID); - +NS_IMPL_ISUPPORTS2(nsDrawingSurfacePh, nsIDrawingSurface, nsIDrawingSurfacePh) nsDrawingSurfacePh :: nsDrawingSurfacePh() { @@ -86,44 +65,6 @@ nsDrawingSurfacePh :: ~nsDrawingSurfacePh() } } -NS_IMETHODIMP nsDrawingSurfacePh :: QueryInterface(REFNSIID aIID, void** aInstancePtr) -{ - if (nsnull == aInstancePtr) - return NS_ERROR_NULL_POINTER; - - if (aIID.Equals(kIDrawingSurfaceIID)) - { - nsIDrawingSurface* tmp = this; - *aInstancePtr = (void*) tmp; - NS_ADDREF_THIS(); - return NS_OK; - } - - if (aIID.Equals(kIDrawingSurfacePhIID)) - { - nsIDrawingSurfacePh* tmp = this; - *aInstancePtr = (void*) tmp; - NS_ADDREF_THIS(); - return NS_OK; - } - - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - - if (aIID.Equals(kISupportsIID)) - { - nsIDrawingSurface* tmp = this; - nsISupports* tmp2 = tmp; - *aInstancePtr = (void*) tmp2; - NS_ADDREF_THIS(); - return NS_OK; - } - - return NS_NOINTERFACE; -} - -NS_IMPL_ADDREF(nsDrawingSurfacePh) -NS_IMPL_RELEASE(nsDrawingSurfacePh) - /** * Lock a rect of a drawing surface and return a * pointer to the upper left hand corner of the @@ -146,7 +87,8 @@ NS_IMETHODIMP nsDrawingSurfacePh :: Lock(PRInt32 aX, PRInt32 aY, void **aBits, PRInt32 *aStride, PRInt32 *aWidthBytes, PRUint32 aFlags) { -//printf ("lock\n"); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Lock mLocked=<%d>\n")); + if (mLocked) { NS_ASSERTION(0, "nested lock attempt"); @@ -160,11 +102,13 @@ NS_IMETHODIMP nsDrawingSurfacePh :: Lock(PRInt32 aX, PRInt32 aY, mLockHeight = aHeight; mLockFlags = aFlags; - PhImage_t *image; - PhDim_t dim; - short bytes_per_pixel = 3; + PhImage_t *image; + PhDim_t dim; + short bytes_per_pixel = 3; - image = PR_Malloc(sizeof(PhImage_t)); +// kirk - replaced Malloc with Calloc and got rid of memset further down +// image = PR_Malloc(sizeof(PhImage_t)); + image = PR_CALLOC(sizeof(PhImage_t) ); if (image == NULL) return NS_ERROR_FAILURE; @@ -173,21 +117,23 @@ NS_IMETHODIMP nsDrawingSurfacePh :: Lock(PRInt32 aX, PRInt32 aY, dim.w = mLockWidth; dim.h = mLockHeight; - memset( image, 0, sizeof(PhImage_t) ); +// memset( image, 0, sizeof(PhImage_t) ); image->type = Pg_IMAGE_DIRECT_888; // 3 bytes per pixel with this type image->size = dim; -// image->image = (char *) PgShmemCreate( dim.w * dim.h * bytes_per_pixel, NULL); image->image = (char *) PR_Malloc( dim.w * dim.h * bytes_per_pixel); if (image->image == NULL) return NS_ERROR_FAILURE; image->bpl = bytes_per_pixel*dim.w; -int y; -for (y=0;yimage+y*dim.w*3,mPixmap->image+3*mLockX+(mLockY+y)*mPixmap->bpl,dim.w*3); - -// *aBits = mImage->image+mLockX*3+mLockY*mImage->bpl; + int y; + for (y=0;yimage+y*dim.w*3, + mPixmap->image+3*mLockX+(mLockY+y)*mPixmap->bpl, + dim.w*3); + } + *aBits = mImage->image; *aWidthBytes = aWidth*3; *aStride = mImage->bpl; @@ -198,55 +144,76 @@ for (y=0;y mIsOffscreen=<%d> area=(%ld,%ld,%ld,%ld)\n", + this, mIsOffscreen, aX, aY, aWidth, aHeight)); -int x; -int y; -unsigned char *ptr; + int x, y, err; + unsigned char *ptr; -PmMemFlush( (PmMemoryContext_t *) mGC, mPixmap ); // get the image -ptr = mPixmap->image; + err=PmMemFlush( (PmMemoryContext_t *) mGC, mPixmap ); // get the image + NS_ASSERTION(err != -1, "nsDrawingSurfacePh::XOR PmMemFlush failed"); + if (err == -1) + return NS_ERROR_FAILURE; + + ptr = mPixmap->image; + for (y=aY;ybpl)]^=255; + ptr[3*x+1+(y*mPixmap->bpl)]^=255; + ptr[3*x+2+(y*mPixmap->bpl)]^=255; + } + } -for (y=aY;ybpl)]^=255; - ptr[3*x+1+(y*mPixmap->bpl)]^=255; - ptr[3*x+2+(y*mPixmap->bpl)]^=255; - } -} - return NS_OK; + return NS_OK; } extern void *Mask; + NS_IMETHODIMP nsDrawingSurfacePh :: Unlock(void) { -//printf ("unlock: %p\n",Mask); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Unlock this=<%p> mLocked=<%d> \n", this, mLocked)); + if (!mLocked) { - NS_ASSERTION(0, "attempting to unlock an DS that isn't locked"); + NS_ASSERTION(0, "nsDrawingSurfacePh::Unlock - attempting to unlock an DS that isn't locked"); return NS_ERROR_FAILURE; } // If the lock was not read only, put the bits back on the pixmap if (!(mLockFlags & NS_LOCK_SURFACE_READ_ONLY)) { -//printf ("really put data back: %d %d %d %d (%d %d)\n",mLockX,mLockY,mLockWidth,mLockHeight,mImage->size.w,mImage->size.h); - PhPoint_t pos = { mLockX, mLockY }; + PhPoint_t pos = { mLockX, mLockY }; + int err; Select(); + +/* Kirk Hack to see what this does 9/27/99 */ +/* No apparent problems improvements or problems... */ +#if 1 if (Mask) { -// printf ("use mask\n"); -int bpl; - bpl = (mLockWidth+7)/8; - bpl = (bpl + 3) & ~0x3; - PgDrawTImage( mImage->image, mImage->type, &pos, &mImage->size, mImage->bpl, 0 ,Mask,bpl); + int bpl; + bpl = (mLockWidth+7)/8; + bpl = (bpl + 3) & ~0x3; + err=PgDrawTImage( mImage->image, mImage->type, &pos, &mImage->size, mImage->bpl, 0 ,Mask,bpl); + if (err == -1) + { + NS_ASSERTION(0, "nsDrawingSurfacePh::Unlock PgDrawTImage failed"); + return NS_ERROR_FAILURE; + } } else - PgDrawImage( mImage->image, mImage->type, &pos, &mImage->size, mImage->bpl, 0 ); - + { + err=PgDrawImage( mImage->image, mImage->type, &pos, &mImage->size, mImage->bpl, 0 ); + if (err == -1) + { + NS_ASSERTION(0, "nsDrawingSurfacePh::Unlock PgDrawImage failed"); + return NS_ERROR_FAILURE; + } + } +#endif } PR_Free(mImage->image); @@ -262,30 +229,26 @@ NS_IMETHODIMP nsDrawingSurfacePh :: GetDimensions(PRUint32 *aWidth, PRUint32 *aH *aWidth = mWidth; *aHeight = mHeight; - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::GetDimensions - Not Implemented\n")); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::GetDimensions this=<%p> w,h=(%ld,%ld)\n", this, mWidth, mHeight)); return NS_OK; } NS_IMETHODIMP nsDrawingSurfacePh :: IsOffscreen(PRBool *aOffScreen) { *aOffScreen = mIsOffscreen; - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::IsOffScreen - Not Implemented\n")); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::IsOffScreen mIsOffscreen=<%d>\n", mIsOffscreen)); return NS_OK; } NS_IMETHODIMP nsDrawingSurfacePh :: IsPixelAddressable(PRBool *aAddressable) { -// FIXME -printf ("ispixeladdressable\n"); *aAddressable = PR_FALSE; PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::IsPixelAddressable - Not Implemented\n")); - return NS_OK; } NS_IMETHODIMP nsDrawingSurfacePh :: GetPixelFormat(nsPixelFormat *aFormat) { -//printf ("getpixelformat\n"); *aFormat = mPixFormat; return NS_OK; } @@ -296,7 +259,7 @@ NS_IMETHODIMP nsDrawingSurfacePh :: Init( PhGC_t * &aGC ) mIsOffscreen = PR_FALSE; // is onscreen mPixmap = NULL; // is onscreen - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Init with PhGC_t\n")); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Init with PhGC_t this=<%p>\n",this)); return NS_OK; } @@ -304,8 +267,7 @@ NS_IMETHODIMP nsDrawingSurfacePh :: Init( PhGC_t * &aGC ) NS_IMETHODIMP nsDrawingSurfacePh :: Init( PhGC_t * &aGC, PRUint32 aWidth, PRUint32 aHeight, PRUint32 aFlags) { -//printf ("kedl: init with width and height\n"); - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Init with PhGC_t + width/height\n")); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Init with PhGC_t + width/height this=<%p> w,h=(%ld,%ld)\n", this, aWidth, aHeight)); mholdGC = aGC; mWidth = aWidth; @@ -320,43 +282,65 @@ NS_IMETHODIMP nsDrawingSurfacePh :: Init( PhGC_t * &aGC, PRUint32 aWidth, PhArea_t area; PtArg_t arg[3]; - image = PR_Malloc(sizeof(PhImage_t)); +// kirk - replaced Malloc with Calloc and got rid of memset further down +// image = PR_Malloc(sizeof(PhImage_t)); + image = PR_CALLOC(sizeof(PhImage_t) ); if (image == NULL) return NS_ERROR_FAILURE; - mPixmap = image; + mPixmap = image; + area.pos.x = 0; + area.pos.y = 0; + area.size.w = aWidth; + area.size.h = aHeight; + dim.w = area.size.w; + dim.h = area.size.h; - area.pos.x=0; - area.pos.y=0; - area.size.w=aWidth; - area.size.h=aHeight; - dim.w = area.size.w; - dim.h = area.size.h; - dim.h += 100; // kedl, uggggg hack! weird font not drawing unless - // the surface is somewhat bigger?? - dim.w ++; +#if 1 + // kedl, hack! weird font not drawing unless + // the surface is somewhat bigger?? + dim.h += 100; + dim.w ++; +#endif //printf ("kedl: create drawing surface: %d %d %d %d, %lu\n",area.pos.x,area.pos.y,area.size.w,area.size.h,image); - PhPoint_t translation = { 0, 0 }, center, radii; + PhPoint_t translation = { 0, 0 }; PmMemoryContext_t *mc; short bytes_per_pixel = 3; - memset( image, 0, sizeof(PhImage_t) ); +// memset( image, 0, sizeof(PhImage_t) ); image->type = Pg_IMAGE_DIRECT_888; // 3 bytes per pixel with this type image->size = dim; image->image = (char *) PgShmemCreate( dim.w * dim.h * bytes_per_pixel, NULL); - image->bpl = bytes_per_pixel*dim.w; + + if (image->image == NULL) + { + NS_ASSERTION(0,"nsDrawingSurfacePh::Init Out of Memory calling PgShmemCreate"); + return NS_ERROR_FAILURE; + } + + image->bpl = bytes_per_pixel * dim.w; mc = PmMemCreateMC( image, &dim, &translation ); - - mGC = (PhGC_t *)mc; + if (mc == NULL) + { + NS_ASSERTION(0, "nsDrawingSurfacePh::Init Out of Memory calling PmMemCreateMC"); + return NS_ERROR_FAILURE; + } + + mGC = (PhGC_t *) mc; // now all drawing goes into the memory context - PmMemStart( mc ); - -// PgSetRegion( mholdGC->rid ); + PhDrawContext_t *oldDC; + oldDC = PmMemStart( mc ); + if (oldDC == NULL) + { + NS_ASSERTION(0, "nsDrawingSurfacePh::Init - Error calling PmMemStart"); + return NS_ERROR_FAILURE; + } + return NS_OK; } @@ -374,43 +358,72 @@ NS_IMETHODIMP nsDrawingSurfacePh :: ReleaseGC( void ) NS_IMETHODIMP nsDrawingSurfacePh :: Select( void ) { -PhGC_t *gc=PgGetGC(); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Select mIsOffscreen=<%d>\n", mIsOffscreen)); - if (mholdGC==nsnull) mholdGC = mGC; + PhGC_t *gc = PgGetGC(); + + if (mholdGC==nsnull) + mholdGC = mGC; - if (gc==mGC) + if (gc == mGC) { //printf ("don't set gc\n"); - return 0; + return NS_OK; // kirk - this was a 0, I think its the same? } else { if (mIsOffscreen) { - //printf ("going offscreen: %p\n",mGC); fflush(stdout); - PmMemFlush( (PmMemoryContext_t *) mGC, mPixmap ); // get the image - PmMemStart( (PmMemoryContext_t *) mGC); -// PgSetRegion(mGC->rid); + int err; + PhDrawContext_t *oldDC; + + err=PmMemFlush( (PmMemoryContext_t *) mGC, mPixmap ); // get the image + if (err == -1) + { + NS_ASSERTION(0, "nsDrawingSurfacePh::Select - Error calling PmMemFlush"); + return NS_ERROR_FAILURE; + } + + oldDC=PmMemStart( (PmMemoryContext_t *) mGC); + if (oldDC == NULL) + { + NS_ASSERTION(0, "nsDrawingSurfacePh::Select - Error calling PmMemStart"); + return NS_ERROR_FAILURE; + } } else { //printf ("going onscreen: %p\n",mGC); fflush(stdout); PgSetGC(mGC); -// PgSetRegion(mGC->rid); } } - return 1; + return NS_OK; } void nsDrawingSurfacePh::Stop(void) { -// printf ("offscreen: %d\n",mIsOffscreen); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Stop mIsOffscreen=<%d>\n", mIsOffscreen)); + if (mIsOffscreen) { - PmMemFlush( (PmMemoryContext_t *) mGC, mPixmap ); // get the image - PmMemStop( (PmMemoryContext_t *) mGC ); + int err; + PhDrawContext_t *theMC; + + err=PmMemFlush( (PmMemoryContext_t *) mGC, mPixmap ); // get the image + if (err == -1) + { + NS_ASSERTION(0, "nsDrawingSurfacePh::Stop - Error calling PmMemFlush"); + return; + } + + theMC = PmMemStop( (PmMemoryContext_t *) mGC ); + if (theMC == NULL) + { + NS_ASSERTION(0, "nsDrawingSurfacePh::Stop - Error calling PmMemStop"); + return; + } } } diff --git a/gfx/src/photon/nsDrawingSurfacePh.h b/gfx/src/photon/nsDrawingSurfacePh.h index a8d48c48eadf..3123f572962b 100644 --- a/gfx/src/photon/nsDrawingSurfacePh.h +++ b/gfx/src/photon/nsDrawingSurfacePh.h @@ -24,11 +24,11 @@ class nsDrawingSurfacePh : public nsIDrawingSurface, - nsIDrawingSurfacePh + public nsIDrawingSurfacePh { public: nsDrawingSurfacePh(); - + NS_DECL_ISUPPORTS //nsIDrawingSurface interface diff --git a/gfx/src/photon/nsFontMetricsPh.cpp b/gfx/src/photon/nsFontMetricsPh.cpp index 16ac5f6758d9..9a7e1a69d992 100644 --- a/gfx/src/photon/nsFontMetricsPh.cpp +++ b/gfx/src/photon/nsFontMetricsPh.cpp @@ -23,9 +23,7 @@ static NS_DEFINE_IID(kIFontMetricsIID, NS_IFONT_METRICS_IID); nsFontMetricsPh :: nsFontMetricsPh() { - /* stolen from GTK version */ NS_INIT_REFCNT(); - mDeviceContext = nsnull; mFont = nsnull; @@ -58,7 +56,7 @@ nsFontMetricsPh :: ~nsFontMetricsPh() mDeviceContext = nsnull; } -NS_IMPL_ISUPPORTS(nsFontMetricsPh, kIFontMetricsIID) +NS_IMPL_ISUPPORTS1(nsFontMetricsPh, nsIFontMetrics) NS_IMETHODIMP nsFontMetricsPh :: Init(const nsFont& aFont, nsIDeviceContext *aContext) diff --git a/gfx/src/photon/nsGfxFactoryPh.cpp b/gfx/src/photon/nsGfxFactoryPh.cpp index 7b3841494ec1..bfe83c7f35b5 100644 --- a/gfx/src/photon/nsGfxFactoryPh.cpp +++ b/gfx/src/photon/nsGfxFactoryPh.cpp @@ -38,13 +38,15 @@ static NS_DEFINE_IID(kCDeviceContext, NS_DEVICE_CONTEXT_CID); static NS_DEFINE_IID(kCRegion, NS_REGION_CID); static NS_DEFINE_IID(kCBlender, NS_BLENDER_CID); +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); +static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); + static NS_DEFINE_IID(kCDeviceContextSpec, NS_DEVICE_CONTEXT_SPEC_CID); static NS_DEFINE_IID(kCDeviceContextSpecFactory, NS_DEVICE_CONTEXT_SPEC_FACTORY_CID); -static NS_DEFINE_IID(kCDrawingSurface, NS_DRAWING_SURFACE_CID); - -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); +//static NS_DEFINE_IID(kCDrawingSurface, NS_DRAWING_SURFACE_CID); +//static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); +//static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); class nsGfxFactoryPh : public nsIFactory { @@ -80,7 +82,7 @@ nsGfxFactoryPh::~nsGfxFactoryPh() { PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsGfxFactoryPh::~nsGfxFactoryPh Destructor\n")); - NS_ASSERTION(mRefCnt == 0, "non-zero refcnt at destruction"); + NS_ASSERTION(mRefCnt == 0, "nsGfxFactoryGTK::~nsGfxFactoryGTK non-zero refcnt at destruction"); } nsresult nsGfxFactoryPh::QueryInterface(const nsIID &aIID, @@ -141,27 +143,19 @@ nsresult nsGfxFactoryPh::CreateInstance(nsISupports *aOuter, if (mClassID.Equals(kCFontMetrics)) { PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsGfxFactoryPh::CreateInstance asking for nsFontMetricsPh.\n")); - nsFontMetricsPh* fm; - NS_NEWXPCOM(fm, nsFontMetricsPh); - inst = (nsISupports *)fm; + inst = (nsISupports *) new nsFontMetricsPh(); } else if (mClassID.Equals(kCDeviceContext)) { PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsGfxFactoryPh::CreateInstance asking for nsDeviceContextPh.\n")); - nsDeviceContextPh* dc; - NS_NEWXPCOM(dc, nsDeviceContextPh); - inst = (nsISupports *)dc; + inst = (nsISupports *)new nsDeviceContextPh(); } else if (mClassID.Equals(kCRenderingContext)) { PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsGfxFactoryPh::CreateInstance asking for nsRenderingContextPh.\n")); - nsRenderingContextPh* rc; - NS_NEWXPCOM(rc, nsRenderingContextPh); - inst = (nsISupports *)((nsIRenderingContext*)rc); + inst = (nsISupports *)new nsRenderingContextPh(); } else if (mClassID.Equals(kCImage)) { PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsGfxFactoryPh::CreateInstance asking for nsImagePh.\n")); - nsImagePh* image; - NS_NEWXPCOM(image, nsImagePh); - inst = (nsISupports *)image; + inst = (nsISupports *)new nsImagePh(); } else if (mClassID.Equals(kCRegion)) { PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsGfxFactoryPh::CreateInstance asking for nsRegionPh.\n")); diff --git a/gfx/src/photon/nsGraphicsStatePh.cpp b/gfx/src/photon/nsGraphicsStatePh.cpp new file mode 100644 index 000000000000..a0bc135397bb --- /dev/null +++ b/gfx/src/photon/nsGraphicsStatePh.cpp @@ -0,0 +1,122 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsGraphicsStatePh.h" + +////////////////////////////////////////////////////////////////////////// +nsGraphicsState::nsGraphicsState() +{ + mMatrix = nsnull; + mClipRegion = nsnull; + mColor = NS_RGB(0, 0, 0); + mLineStyle = nsLineStyle_kSolid; + mFontMetrics = nsnull; +} +////////////////////////////////////////////////////////////////////////// +nsGraphicsState::~nsGraphicsState() +{ + NS_IF_RELEASE(mClipRegion); + NS_IF_RELEASE(mFontMetrics); +} +////////////////////////////////////////////////////////////////////////// +nsGraphicsStatePool::nsGraphicsStatePool() +{ + mFreeList = nsnull; +} +////////////////////////////////////////////////////////////////////////// + + + +////////////////////////////////////////////////////////////////////////// +// +// Public nsGraphicsStatePool +// +////////////////////////////////////////////////////////////////////////// +/* static */ nsGraphicsState * +nsGraphicsStatePool::GetNewGS() +{ + nsGraphicsStatePool * thePool = PrivateGetPool(); + + return thePool->PrivateGetNewGS(); +} +////////////////////////////////////////////////////////////////////////// +/* static */ void +nsGraphicsStatePool::ReleaseGS(nsGraphicsState* aGS) +{ + nsGraphicsStatePool * thePool = PrivateGetPool(); + + thePool->PrivateReleaseGS(aGS); +} +////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +// +// Private nsGraphicsStatePool +// +////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +nsGraphicsStatePool * +nsGraphicsStatePool::gsThePool = nsnull; + +////////////////////////////////////////////////////////////////////////// +nsGraphicsStatePool * +nsGraphicsStatePool::PrivateGetPool() +{ + if (nsnull == gsThePool) + { + gsThePool = new nsGraphicsStatePool(); + } + + return gsThePool; +} + +////////////////////////////////////////////////////////////////////////// + +nsGraphicsStatePool::~nsGraphicsStatePool() +{ + nsGraphicsState* gs = mFreeList; + while (gs != nsnull) { + nsGraphicsState* next = gs->mNext; + delete gs; + gs = next; + } +} +////////////////////////////////////////////////////////////////////////// +nsGraphicsState * +nsGraphicsStatePool::PrivateGetNewGS() +{ + nsGraphicsState* gs = mFreeList; + if (gs != nsnull) { + mFreeList = gs->mNext; + return gs; + } + return new nsGraphicsState; +} +////////////////////////////////////////////////////////////////////////// +void +nsGraphicsStatePool::PrivateReleaseGS(nsGraphicsState* aGS) +{ + // aGS->Clear(); + aGS->mNext = mFreeList; + mFreeList = aGS; +} +////////////////////////////////////////////////////////////////////////// + diff --git a/gfx/src/photon/nsGraphicsStatePh.h b/gfx/src/photon/nsGraphicsStatePh.h new file mode 100644 index 000000000000..1f5e6d8c1322 --- /dev/null +++ b/gfx/src/photon/nsGraphicsStatePh.h @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsGraphicsStatePh_h___ +#define nsGraphicsStatePh_h___ + +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsTransform2D.h" +#include "nsRegionPh.h" + +class nsGraphicsState +{ +public: + + nsTransform2D *mMatrix; + nsIRegion *mClipRegion; + nscolor mColor; + nsLineStyle mLineStyle; + nsIFontMetrics *mFontMetrics; + + nsGraphicsState *mNext; // link into free list of graphics states. + + friend class nsGraphicsStatePool; + +#ifndef USE_GS_POOL + friend class nsRenderingContextPh; +#endif + +private: + nsGraphicsState(); + ~nsGraphicsState(); +}; + +class nsGraphicsStatePool +{ +public: + + static nsGraphicsState * GetNewGS(); + static void ReleaseGS(nsGraphicsState* aGS); + + + nsGraphicsStatePool(); + ~nsGraphicsStatePool(); + +private: + nsGraphicsState* mFreeList; + + static nsGraphicsStatePool * PrivateGetPool(); + nsGraphicsState * PrivateGetNewGS(); + void PrivateReleaseGS(nsGraphicsState* aGS); + + static nsGraphicsStatePool * gsThePool; +}; + +#endif /* nsGraphicsStatePh_h___ */ diff --git a/gfx/src/photon/nsIDrawingSurfacePh.h b/gfx/src/photon/nsIDrawingSurfacePh.h index 52c42e1a3f17..633dc21e26a2 100644 --- a/gfx/src/photon/nsIDrawingSurfacePh.h +++ b/gfx/src/photon/nsIDrawingSurfacePh.h @@ -31,6 +31,8 @@ class nsIDrawingSurfacePh : public nsISupports { public: + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IDRAWING_SURFACE_PH_IID) + /** * Initialize a drawing surface using a windows DC. * aDC is "owned" by the drawing surface until the drawing diff --git a/gfx/src/photon/nsImagePh.cpp b/gfx/src/photon/nsImagePh.cpp index bfd5e933ab0e..b0b2a418cf0b 100644 --- a/gfx/src/photon/nsImagePh.cpp +++ b/gfx/src/photon/nsImagePh.cpp @@ -23,11 +23,9 @@ static NS_DEFINE_IID(kIImageIID, NS_IIMAGE_IID); +NS_IMPL_ISUPPORTS1(nsImagePh, nsIImage) -/** ---------------------------------------------------------------- - * Constructor for nsImagePh - * @update dc - 11/20/98 - */ +// ---------------------------------------------------------------- nsImagePh :: nsImagePh() { NS_INIT_REFCNT(); @@ -53,10 +51,7 @@ nsImagePh :: nsImagePh() mImage.image = nsnull; } -/** ---------------------------------------------------------------- - * destructor for nsImagePh - * @update dc - 11/20/98 - */ +// ---------------------------------------------------------------- nsImagePh :: ~nsImagePh() { PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::~nsImagePh Destructor called\n")); @@ -65,11 +60,8 @@ nsImagePh :: ~nsImagePh() CleanUp(PR_TRUE); } -NS_IMPL_ISUPPORTS(nsImagePh, kIImageIID); - /** ---------------------------------------------------------------- * Initialize the nsImagePh object - * @update dc - 11/20/98 * @param aWidth - Width of the image * @param aHeight - Height of the image * @param aDepth - Depth of the image @@ -78,12 +70,8 @@ NS_IMPL_ISUPPORTS(nsImagePh, kIImageIID); */ nsresult nsImagePh :: Init(PRInt32 aWidth, PRInt32 aHeight, PRInt32 aDepth,nsMaskRequirements aMaskRequirements) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Init (%p) - aWidth=%d aHeight=%d aDepth=%d\n", this, - aWidth, aHeight, aDepth)); + PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Init (%p) - aWidth=%d aHeight=%d aDepth=%d\n", this, aWidth, aHeight, aDepth)); - -// mHBitmap = nsnull; -// mAlphaHBitmap = nsnull; CleanUp(PR_TRUE); if (8 == aDepth) @@ -271,7 +259,8 @@ NS_IMETHODIMP nsImagePh :: Draw(nsIRenderingContext &aContext, nsDrawingSurface PRInt32 aSX, PRInt32 aSY, PRInt32 aSWidth, PRInt32 aSHeight, PRInt32 aDX, PRInt32 aDY, PRInt32 aDWidth, PRInt32 aDHeight) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw1 (%p)\n", this )); + PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw1 this=<%p> aS=(%d,%d,%d,%d) aD=(%d,%d,%d,%d)\n", this, + aSX, aSY, aSWidth, aSHeight, aDX, aDY, aDWidth, aDHeight )); if( !mImage.image ) { @@ -280,20 +269,44 @@ NS_IMETHODIMP nsImagePh :: Draw(nsIRenderingContext &aContext, nsDrawingSurface } PhPoint_t pos = { aDX, aDY }; - -// PgDrawPhImagemx( &pos, &mImage, 0 ); + int err; if( mColorMap ) { - PgSetPalette( (PgColor_t*) mColorMap->Index, 0, 0, mColorMap->NumColors, Pg_PALSET_SOFT, 0 ); + err=PgSetPalette( (PgColor_t*) mColorMap->Index, 0, 0, mColorMap->NumColors, Pg_PALSET_SOFT, 0 ); + if (err == -1) + { + NS_ASSERTION(0,"nsImagePh::Draw Error calling PgSetPalette"); + return NS_ERROR_FAILURE; + } } - if( mAlphaBits ) - PgDrawTImage( mImage.image, mImage.type, &pos, &mImage.size, mImage.bpl, 0, mAlphaBits, mARowBytes ); - else - PgDrawImage( mImage.image, mImage.type, &pos, &mImage.size, mImage.bpl, 0 ); + PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw1 this=<%p> mImage.size=(%ld,%ld)\n", this, mImage.size.w, mImage.size.h)); -// PgFlush(); + +/* Kirk Hack to see what this does 9/27/99 */ +/* I think this is needed... but I can't find anything that calls it... */ +/* This draw may be able to call the other draw to save space */ +#if 1 + if( mAlphaBits ) + { + err=PgDrawTImage( mImage.image, mImage.type, &pos, &mImage.size, mImage.bpl, 0, mAlphaBits, mARowBytes ); + if (err == -1) + { + NS_ASSERTION(0,"nsImagePh::Draw Error calling PgDrawTImage"); + return NS_ERROR_FAILURE; + } + } + else + { + err=PgDrawImage( mImage.image, mImage.type, &pos, &mImage.size, mImage.bpl, 0 ); + if (err == -1) + { + NS_ASSERTION(0,"nsImagePh::Draw Error calling PgDrawImage"); + return NS_ERROR_FAILURE; + } + } +#endif return NS_OK; } @@ -313,9 +326,8 @@ NS_IMETHODIMP nsImagePh :: Draw(nsIRenderingContext &aContext, nsDrawingSurface NS_IMETHODIMP nsImagePh :: Draw(nsIRenderingContext &aContext, nsDrawingSurface aSurface, PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw2 (%p) (%ld,%ld,%ld,%ld)\n", this, aX, aY, aWidth, aHeight )); + PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw2 this=(%p) dest=(%ld,%ld,%ld,%ld) aSurface=<%p>\n", this, aX, aY, aWidth, aHeight, aSurface )); -//printf ("kedl: draw2\n"); // REVISIT - this is a brute-force implementation. We currently have no h/w blit // capabilities. @@ -326,20 +338,39 @@ NS_IMETHODIMP nsImagePh :: Draw(nsIRenderingContext &aContext, nsDrawingSurface } PhPoint_t pos = { aX, aY }; + int err; + + PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw2 this=<%p> mImage.size=(%ld,%ld)\n", this, mImage.size.w, mImage.size.h)); + +/* Kirk Hack to see what this does 9/27/99 */ +/* No Images draw without this enabled.. Check out Test 2 */ +#if 1 if( mAlphaBits ) - PgDrawTImage( mImage.image, mImage.type, &pos, &mImage.size, mImage.bpl, 0, mAlphaBits, mARowBytes ); + { + err=PgDrawTImage( mImage.image, mImage.type, &pos, &mImage.size, mImage.bpl, 0, mAlphaBits, mARowBytes ); + if (err == -1) + { + NS_ASSERTION(0,"nsImagePh::Draw Error calling PgDrawTImage"); + return NS_ERROR_FAILURE; + } + } else - PgDrawImage( mImage.image, mImage.type, &pos, &mImage.size, mImage.bpl, 0 ); - -// PgDrawPhImagemx( &pos, &mImage, 0 ); -// PgFlush(); + { + err=PgDrawImage( mImage.image, mImage.type, &pos, &mImage.size, mImage.bpl, 0 ); + if (err == -1) + { + NS_ASSERTION(0,"nsImagePh::Draw Error calling PgDrawImage"); + return NS_ERROR_FAILURE; + } + } +#endif return NS_OK; } /** ---------------------------------------------------------------- - * Create an optimezed bitmap, -- this routine may need to be deleted, not really used now + * Create an optimized bitmap, -- this routine may need to be deleted, not really used now * @update dc - 11/20/98 * @param aContext - The device context to use for the optimization */ diff --git a/gfx/src/photon/nsRegionPh.cpp b/gfx/src/photon/nsRegionPh.cpp index 0ba9f7f8bf7c..7f6b98c5ebc5 100644 --- a/gfx/src/photon/nsRegionPh.cpp +++ b/gfx/src/photon/nsRegionPh.cpp @@ -64,7 +64,7 @@ nsRegionPh :: nsRegionPh() nsRegionPh :: ~nsRegionPh() { -// PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRegionPh::~nsRegion Destructor called\n")); +PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRegionPh::~nsRegion Destructor\n")); #ifdef DEBUG_REGION DumpTiles(mRegion); @@ -74,10 +74,7 @@ nsRegionPh :: ~nsRegionPh() PhFreeTiles(mRegion); } - -NS_IMPL_QUERY_INTERFACE(nsRegionPh, kRegionIID) -NS_IMPL_ADDREF(nsRegionPh) -NS_IMPL_RELEASE(nsRegionPh) +NS_IMPL_ISUPPORTS1(nsRegionPh, nsIRegion) nsresult nsRegionPh :: Init(void) { diff --git a/gfx/src/photon/nsRenderingContextPh.cpp b/gfx/src/photon/nsRenderingContextPh.cpp index 4fc920041132..007fa37af30c 100644 --- a/gfx/src/photon/nsRenderingContextPh.cpp +++ b/gfx/src/photon/nsRenderingContextPh.cpp @@ -16,6 +16,8 @@ * Reserved. */ +#define NEW_GS + #include "nsRenderingContextPh.h" #include "nsRegionPh.h" #include @@ -24,28 +26,22 @@ #include "prprf.h" #include "nsDrawingSurfacePh.h" #include "nsGfxCIID.h" -#include +#ifdef NEW_GS +#include "nsGraphicsStatePh.h" +#endif +#include #include #include #include -#ifdef GFX_DEBUG - #define BREAK_TO_DEBUGGER DebugBreak() -#else - #define BREAK_TO_DEBUGGER -#endif - -#ifdef GFX_DEBUG - #define VERIFY(exp) ((exp) ? 0: (GetLastError(), BREAK_TO_DEBUGGER)) -#else // !_DEBUG - #define VERIFY(exp) (exp) -#endif // !_DEBUG static NS_DEFINE_IID(kIRenderingContextIID, NS_IRENDERING_CONTEXT_IID); -static NS_DEFINE_IID(kIRenderingContextPhIID, NS_IRENDERING_CONTEXT_PH_IID); +//static NS_DEFINE_IID(kIRenderingContextPhIID, NS_IRENDERING_CONTEXT_PH_IID); static NS_DEFINE_IID(kIDrawingSurfaceIID, NS_IDRAWING_SURFACE_IID); static NS_DEFINE_IID(kDrawingSurfaceCID, NS_DRAWING_SURFACE_CID); +static NS_DEFINE_CID(kRegionCID, NS_REGION_CID); + #define FLAG_CLIP_VALID 0x0001 #define FLAG_CLIP_CHANGED 0x0002 @@ -56,7 +52,6 @@ static NS_DEFINE_IID(kDrawingSurfaceCID, NS_DRAWING_SURFACE_CID); int cur_color = 0; char FillColorName[8][20] = {"Pg_BLACK","Pg_BLUE","Pg_RED","Pg_YELLOW","Pg_GREEN","Pg_MAGENTA","Pg_CYAN","Pg_WHITE"}; long FillColorVal[8] = {Pg_BLACK,Pg_BLUE,Pg_RED,Pg_YELLOW,Pg_GREEN,Pg_MAGENTA,Pg_CYAN,Pg_WHITE}; -//PRBool mBufferIsEmpty; // Macro for creating a palette relative color if you have a COLORREF instead // of the reg, green, and blue values. The color is color-matches to the nearest @@ -73,12 +68,19 @@ long FillColorVal[8] = {Pg_BLACK,Pg_BLUE,Pg_RED,Pg_YELLOW,Pg_GREEN,Pg_MAGENTA,Pg PRLogModuleInfo *PhGfxLog = PR_NewLogModule("PhGfxLog"); #include "nsPhGfxLog.h" +NS_IMPL_ISUPPORTS1(nsRenderingContextPh, nsIRenderingContext) + + /* Global Variable for Alpha Blending */ -void *Mask; +void *Mask = nsnull; + +/* The default Photon Drawing Context */ +PhGC_t *nsRenderingContextPh::mPtGC = nsnull; #define SELECT(surf) mBufferIsEmpty = PR_FALSE; if (surf->Select()) ApplyClipping(surf->GetGC()); //#define SELECT(surf) if (surf->Select()) ApplyClipping(surf->GetGC()); +#ifndef NEW_GS class GraphicsState { public: @@ -93,7 +95,7 @@ public: nscolor mCurrentColor; nsTransform2D *mMatrix; // transform that all the graphics drawn here will obey nsIFontMetrics *mFontMetrics; - nsRegionPh *mClipRegion; + nsIRegion *mClipRegion; }; @@ -112,11 +114,7 @@ GraphicsState :: GraphicsState() GraphicsState :: ~GraphicsState() { } - - -#define NOT_SETUP 0x33 - -PhGC_t *nsRenderingContextPh::mPtGC = nsnull; +#endif nsRenderingContextPh :: nsRenderingContextPh() { @@ -124,8 +122,8 @@ nsRenderingContextPh :: nsRenderingContextPh() mGC = nsnull; mTMatrix = new nsTransform2D(); - mRegion = new nsRegionPh(); - mRegion->Init(); + mClipRegion = nsnull ; // new nsRegionPh(); + //mClipRegion->Init(); mFontMetrics = nsnull; mSurface = nsnull; mMainSurface = nsnull; @@ -135,7 +133,7 @@ nsRenderingContextPh :: nsRenderingContextPh() mWidget = nsnull; mPhotonFontName = nsnull; Mask = nsnull; - mLineStyle = nsLineStyle_kSolid; + mCurrentLineStyle = nsLineStyle_kSolid; //default objects //state management @@ -147,10 +145,7 @@ nsRenderingContextPh :: nsRenderingContextPh() if( mPtGC == nsnull ) mPtGC = PgGetGC(); - #ifdef NS_DEBUG - mInitialized = PR_FALSE; - #endif - + mInitialized = PR_FALSE; mBufferIsEmpty = PR_TRUE; PushState(); @@ -159,14 +154,24 @@ nsRenderingContextPh :: nsRenderingContextPh() nsRenderingContextPh :: ~nsRenderingContextPh() { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh(%p) destructor, mGC = %p\n", this, mGC )); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::~nsRenderingContextPh this=<%p> mGC = %p\n", this, mGC )); - if (mContext) - NS_IF_RELEASE(mContext); +#if 1 + // Destroy the State Machine + if (mStateCache) + { + PRInt32 cnt = mStateCache->Count(); - if (mFontMetrics) - NS_IF_RELEASE(mFontMetrics); + while (--cnt >= 0) + { + PRBool clipstate; + PopState(clipstate); + } + delete mStateCache; + mStateCache = nsnull; + } +#else if (nsnull != mStateCache) { PRInt32 cnt = mStateCache->Count(); @@ -183,6 +188,7 @@ nsRenderingContextPh :: ~nsRenderingContextPh() delete mStateCache; mStateCache = nsnull; } +#endif if (mTMatrix) delete mTMatrix; @@ -191,84 +197,34 @@ nsRenderingContextPh :: ~nsRenderingContextPh() { if( mGC ) { -// PgDestroyGC( mGC ); - PgSetGC( mPtGC ); PgSetRegion( mPtGC->rid ); - PgDestroyGC( mGC ); mGC = nsnull; } } - else - { -// PmMemStop( (PmMemoryContext_t *)mGC); - } - if (mRegion) - { - delete mRegion; - } - if( mWidget ) - { -#ifdef ENABLE_PHOTON_FLUXING - PtEndFlux( PtFindDisjoint( mWidget )); -#endif -// PtContainerRelease(PtFindDisjoint( mWidget )); -// PtFlush(); - } + + /* We always do this?? */ PgSetGC( mPtGC ); PgSetRegion( mPtGC->rid ); if (mPhotonFontName) delete [] mPhotonFontName; - + + NS_IF_RELEASE(mClipRegion); /* do we need to do this? */ + +// if (mClipRegion) +// delete mClipRegion; + + NS_IF_RELEASE(mFontMetrics); + NS_IF_RELEASE(mContext); } -nsresult nsRenderingContextPh :: QueryInterface(REFNSIID aIID, void** aInstancePtr) -{ - if (nsnull == aInstancePtr) - return NS_ERROR_NULL_POINTER; - - if (aIID.Equals(kIRenderingContextIID)) - { - nsIRenderingContext* tmp = this; - *aInstancePtr = (void*) tmp; - NS_ADDREF_THIS(); - return NS_OK; - } - - if (aIID.Equals(kIRenderingContextPhIID)) - { - nsIRenderingContextPh* tmp = this; - *aInstancePtr = (void*) tmp; - NS_ADDREF_THIS(); - return NS_OK; - } - - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); - - if (aIID.Equals(kISupportsIID)) - { - nsIRenderingContext* tmp = this; - nsISupports* tmp2 = tmp; - *aInstancePtr = (void*) tmp2; - NS_ADDREF_THIS(); - return NS_OK; - } - - return NS_NOINTERFACE; -} - - -NS_IMPL_ADDREF(nsRenderingContextPh) -NS_IMPL_RELEASE(nsRenderingContextPh) - - NS_IMETHODIMP nsRenderingContextPh :: Init(nsIDeviceContext* aContext, - nsIWidget *aWindow) + nsIWidget *aWindow) { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init with a widget\n")); NS_PRECONDITION(PR_FALSE == mInitialized, "double init"); @@ -282,29 +238,29 @@ NS_IMETHODIMP nsRenderingContextPh :: Init(nsIDeviceContext* aContext, if(!mWidget) { - printf( "nsRenderingContext::Init (with a widget) mWidget is NULL!\n" ); - fflush( stdout ); + NS_IF_RELEASE(mContext); // new + NS_ASSERTION(mWidget,"nsRenderingContext::Init (with a widget) mWidget is NULL!"); return NS_ERROR_FAILURE; } PhRid_t rid = PtWidgetRid( mWidget ); - //PhRid_t rid = PtWidgetRid( PtFindDisjoint(mWidget) ); + + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init this=<%p> mWidget=<%p> rid=<%d>\n", this, mWidget, rid )); - if( !rid ) + if (rid == 0) { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init Widget (%p) does not have a Rid!\n", mWidget )); + //NS_ASSERTION(rid, "nsRenderingContextPh::Init PtWidgetRid returned 0"); } - - NS_ASSERTION(rid, "nsRenderingContextPh::Init PtWidgetRid returned 0"); - - mGC = PgCreateGC( 4096 ); - - if( !mGC ) + else { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init PgCreateGC() failed!\n" )); - } + mGC = PgCreateGC( 4096 ); + if( !mGC ) + { + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init PgCreateGC() failed!\n" )); + } - NS_ASSERTION(mGC, "nsRenderingContextPh::Init PgCreateGC() failed!"); + NS_ASSERTION(mGC, "nsRenderingContextPh::Init PgCreateGC() failed!"); PgSetGC( mGC ); PgDefaultGC( mGC ); @@ -314,20 +270,29 @@ NS_IMETHODIMP nsRenderingContextPh :: Init(nsIDeviceContext* aContext, // PgSetRegion( mPtGC->rid ); mSurface = new nsDrawingSurfacePh(); -//printf ("create1: %p\n",mSurface); - res = mSurface->Init(mGC); - if (res != NS_OK) + if (mSurface) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init mSurface->Init(mGC) failed\n")); + res = mSurface->Init(mGC); + if (res != NS_OK) + { + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init mSurface->Init(mGC) failed\n")); + return NS_ERROR_FAILURE; + } + } + else + { + NS_ASSERTION(0, "nsRenderingContextPh::Init Failed to new the mSurface"); return NS_ERROR_FAILURE; } - -// mSurface->Init(mGC,640,480,0); -// SELECT(mSurface); + mOffscreenSurface = mSurface; - NS_IF_ADDREF(aWindow); +// NS_IF_ADDREF(aWindow); /* took this out */ NS_ADDREF(mSurface); + } + + mInitialized = PR_TRUE; + return (CommonInit()); } @@ -335,10 +300,21 @@ NS_IMETHODIMP nsRenderingContextPh::CommonInit() { float app2dev; + if ( NS_SUCCEEDED(nsComponentManager::CreateInstance(kRegionCID, 0, NS_GET_IID(nsIRegion), (void**)&mClipRegion)) ) + { + mClipRegion->Init(); + mClipRegion->SetTo(0, 0, 0,0); + if (mSurface) + { + PRUint32 width, height; + mSurface->GetDimensions(&width, &height); + mClipRegion->SetTo(0, 0, width, height); + } + } + mContext->GetAppUnitsToDevUnits(app2dev); mTMatrix->AddScale(app2dev,app2dev); mContext->GetDevUnitsToAppUnits(mP2T); - mContext->GetGammaTable(mGammaTable); return NS_OK; @@ -346,32 +322,23 @@ NS_IMETHODIMP nsRenderingContextPh::CommonInit() NS_IMETHODIMP nsRenderingContextPh :: Init(nsIDeviceContext* aContext, - nsDrawingSurface aSurface) + nsDrawingSurface aSurface) { -printf ("kedl: init with a surface!!!! %p\n",aSurface); -PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init with a Drawing Surface\n")); + + printf ("nsRenderingContextPh::Init with a surface!!!! %p\n",aSurface); + + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init with a Drawing Surface\n")); NS_PRECONDITION(PR_FALSE == mInitialized, "double init"); mContext = aContext; NS_IF_ADDREF(mContext); -// mGC = PgCreateGC( 8192 ); -// PgSetGC( mGC ); -// PgDefaultGC( mGC ); -// PgSetRegion( rid ); - - mSurface = (nsDrawingSurfacePh *)aSurface; + mSurface = (nsDrawingSurfacePh *) aSurface; mOffscreenSurface=mSurface; -//printf ("kedl: gcs %p %p\n",((nsDrawingSurfacePh *)aSurface)->GetGC(),mSurface->GetGC()); -// mSurface->Select(); + NS_ADDREF(mSurface); -// NS_ADDREF(mSurface); - -// printf( "abs clip = not set from surface!\n" ); -// PgSetClipping( 0, NULL ); -// PgClearTranslation(); -// mTMatrix->SetToTranslate(0,0); + mInitialized = PR_TRUE; return (CommonInit()); } @@ -401,18 +368,16 @@ NS_IMETHODIMP nsRenderingContextPh::UnlockDrawingSurface(void) NS_IMETHODIMP nsRenderingContextPh :: SelectOffScreenDrawingSurface(nsDrawingSurface aSurface) { -// PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SelectOffScreenDrawingSurface\n")); - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SelectOffScreenDrawingSurface (%s)\n", FillColorName[cur_color])); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SelectOffScreenDrawingSurface this=<%p> sSurface=<%p>\n", this, aSurface)); -// printf ("kedl: surface select: %lu\n",aSurface); if (nsnull==aSurface) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" selecting offscreen (private)\n")); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SelectOffScreenDrawingSurface selecting offscreen (private)\n")); mSurface = mOffscreenSurface; } else { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" selecting passed-in (%p)\n", aSurface)); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SelectOffScreenDrawingSurface selecting passed-in (%p)\n", aSurface)); mSurface = (nsDrawingSurfacePh *) aSurface; } @@ -437,7 +402,7 @@ NS_IMETHODIMP nsRenderingContextPh :: GetDrawingSurface(nsDrawingSurface *aSurfa { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::GetDrawingSurface\n")); // printf ("get drawing surface! %p\n",mSurface); - *aSurface = (void *)mSurface; + *aSurface = (void *) mSurface; return NS_OK; } @@ -446,10 +411,18 @@ NS_IMETHODIMP nsRenderingContextPh :: GetHints(PRUint32& aResult) { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::GetHints\n")); + PRUint32 result = 0; + + // Most X servers implement 8 bit text rendering alot faster than + // XChar2b rendering. In addition, we can avoid the PRUnichar to + // XChar2b conversion. So we set this bit... + result |= NS_RENDERING_HINT_FAST_8BIT_TEXT; + + /* this flag indicates that the system prefers 8bit chars over wide chars */ /* It may or may not be faster under photon... */ - aResult = NS_RENDERING_HINT_FAST_8BIT_TEXT; + aResult = result; return NS_OK; } @@ -476,6 +449,45 @@ NS_IMETHODIMP nsRenderingContextPh :: PushState(void) { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::PushState\n")); +#ifdef NEW_GS +/* kirk 9/27/99 stole this from GTK */ + + // Get a new GS +#ifdef USE_GS_POOL + nsGraphicsState *state = nsGraphicsStatePool::GetNewGS(); +#else + nsGraphicsState *state = new nsGraphicsState; +#endif + + // Push into this state object, add to vector + if (!state) + { + NS_ASSERTION(0, "nsRenderingContextPh::PushState Failed to create a new Graphics State"); + return NS_ERROR_FAILURE; + } + + state->mMatrix = mTMatrix; + + if (nsnull == mTMatrix) + mTMatrix = new nsTransform2D(); + else + mTMatrix = new nsTransform2D(mTMatrix); + + if (mClipRegion) + { + // set the state's clip region to a new copy of the current clip region + GetClipRegion(&state->mClipRegion); + } + + NS_IF_ADDREF(mFontMetrics); + state->mFontMetrics = mFontMetrics; + + state->mColor = mCurrentColor; + state->mLineStyle = mCurrentLineStyle; + + mStateCache->AppendElement(state); +#else + GraphicsState * state = new GraphicsState(); if (state) { @@ -486,16 +498,16 @@ NS_IMETHODIMP nsRenderingContextPh :: PushState(void) state->mMatrix = mTMatrix; state->mFontMetrics = mFontMetrics; NS_IF_ADDREF( state->mFontMetrics ); - state->mClipRegion = mRegion; + state->mClipRegion = mClipRegion; - /* if the mRegion is not empty make a copy */ - if (mRegion != nsnull) + /* if the mClipRegion is not empty make a copy */ + if (mClipRegion != nsnull) { - mRegion = new nsRegionPh(); - if (mRegion) + mClipRegion = new nsRegionPh(); + if (mClipRegion) { - mRegion->Init(); - mRegion->SetTo(*state->mClipRegion); + mClipRegion->Init(); + mClipRegion->SetTo(*state->mClipRegion); } else { @@ -510,6 +522,7 @@ NS_IMETHODIMP nsRenderingContextPh :: PushState(void) } else return NS_ERROR_OUT_OF_MEMORY; +#endif return NS_OK; } @@ -519,6 +532,62 @@ NS_IMETHODIMP nsRenderingContextPh :: PopState( PRBool &aClipEmpty ) { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::PopState\n")); +#ifdef NEW_GS +/* kirk 9/27/99 stole this code from GTK */ + + PRUint32 cnt = mStateCache->Count(); + nsGraphicsState * state; + + if (cnt > 0) { + state = (nsGraphicsState *)mStateCache->ElementAt(cnt - 1); + mStateCache->RemoveElementAt(cnt - 1); + + // Assign all local attributes from the state object just popped + if (mTMatrix) + delete mTMatrix; + mTMatrix = state->mMatrix; + + // get rid of the current clip region + NS_IF_RELEASE(mClipRegion); + mClipRegion = nsnull; + + // restore everything + mClipRegion = (nsRegionPh *) state->mClipRegion; + mFontMetrics = state->mFontMetrics; + + if (mSurface && mClipRegion) + { +// kirk what does this do? +// GdkRegion *rgn; +// mClipRegion->GetNativeRegion((void*&)rgn); +// ::gdk_gc_set_clip_region (mSurface->GetGC(), rgn); + } + + ApplyClipping(mGC); + + if (state->mColor != mCurrentColor) + SetColor(state->mColor); + + if (state->mLineStyle != mCurrentLineStyle) + SetLineStyle(state->mLineStyle); + + // Delete this graphics state object +#ifdef USE_GS_POOL + nsGraphicsStatePool::ReleaseGS(state); +#else + delete state; +#endif + } + + if (mClipRegion) + aClipEmpty = mClipRegion->IsEmpty(); + else + aClipEmpty = PR_TRUE; + + return NS_OK; + +#else + PRUint32 cnt = mStateCache->Count(); PRBool bEmpty=PR_FALSE; //kedl ?? PRBool bEmpty=aClipEmpty; @@ -541,11 +610,11 @@ NS_IMETHODIMP nsRenderingContextPh :: PopState( PRBool &aClipEmpty ) NS_IF_RELEASE( mFontMetrics ); mFontMetrics = state->mFontMetrics; - if (mRegion) - delete mRegion; + if (mClipRegion) + delete mClipRegion; - mRegion = state->mClipRegion; - if ((mRegion) && (mRegion->IsEmpty() == PR_TRUE)) + mClipRegion = state->mClipRegion; + if ((mClipRegion) && (mClipRegion->IsEmpty() == PR_TRUE)) { bEmpty = PR_TRUE; } @@ -560,6 +629,8 @@ NS_IMETHODIMP nsRenderingContextPh :: PopState( PRBool &aClipEmpty ) aClipEmpty = bEmpty; return NS_OK; +#endif + } @@ -579,9 +650,9 @@ NS_IMETHODIMP nsRenderingContextPh :: SetClipRect(const nsRect& aRect, nsClipCom PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SetClipRect (%ld,%ld,%ld,%ld)\n", aRect.x, aRect.y, aRect.width, aRect.height )); - if ((mTMatrix) && (mRegion)) + if ((mTMatrix) && (mClipRegion)) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" prev clip empty = %i\n", mRegion->IsEmpty())); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" prev clip empty = %i\n", mClipRegion->IsEmpty())); mTMatrix->TransformCoord(&trect.x, &trect.y,&trect.width, &trect.height); @@ -589,31 +660,31 @@ NS_IMETHODIMP nsRenderingContextPh :: SetClipRect(const nsRect& aRect, nsClipCom { case nsClipCombine_kIntersect: PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" combine type = intersect\n")); - mRegion->Intersect(trect.x,trect.y,trect.width,trect.height); + mClipRegion->Intersect(trect.x,trect.y,trect.width,trect.height); break; case nsClipCombine_kUnion: PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" combine type = union\n")); - mRegion->Union(trect.x,trect.y,trect.width,trect.height); + mClipRegion->Union(trect.x,trect.y,trect.width,trect.height); break; case nsClipCombine_kSubtract: PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" combine type = subtract\n")); - mRegion->Subtract(trect.x,trect.y,trect.width,trect.height); + mClipRegion->Subtract(trect.x,trect.y,trect.width,trect.height); break; case nsClipCombine_kReplace: PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" combine type = replace\n")); - mRegion->SetTo(trect.x,trect.y,trect.width,trect.height); + mClipRegion->SetTo(trect.x,trect.y,trect.width,trect.height); break; default: PR_LOG(PhGfxLog, PR_LOG_ERROR, ("nsRenderingContextPh::SetClipRect Unknown Combine type\n")); break; } - aClipEmpty = mRegion->IsEmpty(); + aClipEmpty = mClipRegion->IsEmpty(); PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" new clip empty = %i\n", aClipEmpty )); ApplyClipping(mGC); -// kirk mRegion->GetNativeRegion((void*&)rgn); +// kirk mClipRegion->GetNativeRegion((void*&)rgn); // kirk PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SetClipRect Calling PgSetCliping (%ld,%ld,%ld,%ld)\n", rgn->ul.x, rgn->ul.y, rgn->lr.x, rgn->lr.y)); // kirk PgSetClipping(1, rgn); @@ -633,9 +704,9 @@ NS_IMETHODIMP nsRenderingContextPh :: GetClipRect(nsRect &aRect, PRBool &aClipVa PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::GetClipRect\n")); PRInt32 x, y, w, h; - if (!mRegion->IsEmpty()) + if (!mClipRegion->IsEmpty()) { - mRegion->GetBoundingBox(&x,&y,&w,&h); + mClipRegion->GetBoundingBox(&x,&y,&w,&h); aRect.SetRect(x,y,w,h); aClipValid = PR_TRUE; } @@ -656,20 +727,20 @@ NS_IMETHODIMP nsRenderingContextPh :: SetClipRegion(const nsIRegion& aRegion, ns switch(aCombine) { case nsClipCombine_kIntersect: - mRegion->Intersect(aRegion); + mClipRegion->Intersect(aRegion); break; case nsClipCombine_kUnion: - mRegion->Union(aRegion); + mClipRegion->Union(aRegion); break; case nsClipCombine_kSubtract: - mRegion->Subtract(aRegion); + mClipRegion->Subtract(aRegion); break; case nsClipCombine_kReplace: - mRegion->SetTo(aRegion); + mClipRegion->SetTo(aRegion); break; } - aClipEmpty = mRegion->IsEmpty(); + aClipEmpty = mClipRegion->IsEmpty(); ApplyClipping(mGC); return NS_OK; @@ -684,6 +755,44 @@ NS_IMETHODIMP nsRenderingContextPh :: CopyClipRegion(nsIRegion &aRegion) NS_IMETHODIMP nsRenderingContextPh :: GetClipRegion(nsIRegion **aRegion) { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::GetClipRegion\n")); + +#ifdef NEW_GS +/* kirk 9/27/99 stole this from GTK */ + nsresult rv = NS_ERROR_FAILURE; + + if (!aRegion) + return NS_ERROR_NULL_POINTER; + + if (*aRegion) // copy it, they should be using CopyClipRegion + { + // printf("you should be calling CopyClipRegion()\n"); + (*aRegion)->SetTo(*mClipRegion); + rv = NS_OK; + } + else + { + if ( NS_SUCCEEDED(nsComponentManager::CreateInstance(kRegionCID, 0, NS_GET_IID(nsIRegion), + (void**)aRegion )) ) + { + if (mClipRegion) + { + (*aRegion)->Init(); + (*aRegion)->SetTo(*mClipRegion); + NS_ADDREF(*aRegion); + rv = NS_OK; + } + else + { + printf("null clip region, can't make a valid copy\n"); + NS_RELEASE(*aRegion); + rv = NS_ERROR_FAILURE; + } + } + } + + return rv; +#else + nsresult rv = NS_OK; NS_ASSERTION(!(nsnull == aRegion), "no region ptr"); @@ -708,10 +817,11 @@ NS_IMETHODIMP nsRenderingContextPh :: GetClipRegion(nsIRegion **aRegion) if (rv == NS_OK) { - (*aRegion)->SetTo(*mRegion); + (*aRegion)->SetTo(*mClipRegion); } return rv; +#endif } @@ -739,7 +849,7 @@ NS_IMETHODIMP nsRenderingContextPh :: GetColor(nscolor &aColor) const NS_IMETHODIMP nsRenderingContextPh :: SetLineStyle(nsLineStyle aLineStyle) { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SetLineStyle\n")); - mLineStyle = aLineStyle; + mCurrentLineStyle = aLineStyle; return NS_OK; } @@ -747,7 +857,7 @@ NS_IMETHODIMP nsRenderingContextPh :: SetLineStyle(nsLineStyle aLineStyle) NS_IMETHODIMP nsRenderingContextPh :: GetLineStyle(nsLineStyle &aLineStyle) { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::GetLineStyle - Not Implemented\n")); - aLineStyle = mLineStyle; + aLineStyle = mCurrentLineStyle; return NS_OK; } @@ -914,7 +1024,7 @@ NS_IMETHODIMP nsRenderingContextPh :: DrawLine(nscoord aX0, nscoord aY0, nscoord { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::DrawLine (%ld,%ld,%ld,%ld)\n", aX0, aY0, aX1, aY1 )); - if( nsLineStyle_kNone == mLineStyle ) + if( nsLineStyle_kNone == mCurrentLineStyle ) return NS_OK; nscoord x0,y0,x1,y1; @@ -941,7 +1051,7 @@ NS_IMETHODIMP nsRenderingContextPh :: DrawPolyline(const nsPoint aPoints[], PRIn { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("untested nsRenderingContextPh::DrawPolyLine\n")); - if( nsLineStyle_kNone == mLineStyle ) + if( nsLineStyle_kNone == mCurrentLineStyle ) return NS_OK; PhPoint_t *pts; @@ -973,7 +1083,7 @@ NS_IMETHODIMP nsRenderingContextPh :: DrawPolyline(const nsPoint aPoints[], PRIn NS_IMETHODIMP nsRenderingContextPh :: DrawRect(const nsRect& aRect) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("untested nsRenderingContextPh::DrawRect\n")); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("untested nsRenderingContextPh::DrawRect 1 \n")); DrawRect( aRect.x, aRect.y, aRect.width, aRect.height ); @@ -983,7 +1093,7 @@ NS_IMETHODIMP nsRenderingContextPh :: DrawRect(const nsRect& aRect) NS_IMETHODIMP nsRenderingContextPh :: DrawRect(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("untested nsRenderingContextPh::DrawRect\n")); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("untested nsRenderingContextPh::DrawRect 2 \n")); nscoord x,y,w,h; @@ -1002,7 +1112,7 @@ NS_IMETHODIMP nsRenderingContextPh :: DrawRect(nscoord aX, nscoord aY, nscoord a NS_IMETHODIMP nsRenderingContextPh :: FillRect(const nsRect& aRect) { -// PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::FillRect (%i,%i,%i,%i)\n", aRect.x, aRect.y, aRect.width, aRect.height )); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::FillRect 1 (%i,%i,%i,%i)\n", aRect.x, aRect.y, aRect.width, aRect.height )); FillRect( aRect.x, aRect.y, aRect.width, aRect.height ); @@ -1012,7 +1122,7 @@ NS_IMETHODIMP nsRenderingContextPh :: FillRect(const nsRect& aRect) NS_IMETHODIMP nsRenderingContextPh :: FillRect(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::FillRect (%i,%i,%i,%i)\n", aX, aY, aWidth, aHeight )); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::FillRect 2 (%i,%i,%i,%i)\n", aX, aY, aWidth, aHeight )); nscoord x,y,w,h; x = aX; @@ -1023,7 +1133,6 @@ NS_IMETHODIMP nsRenderingContextPh :: FillRect(nscoord aX, nscoord aY, nscoord a mTMatrix->TransformCoord(&x,&y,&w,&h); SELECT(mSurface); PgDrawIRect( x, y, x + w - 1, y + h - 1, Pg_DRAW_FILL_STROKE ); -// PgDrawIRect( x, y, x + w - 1, y + h - 1, Pg_DRAW_FILL ); return NS_OK; } @@ -1031,7 +1140,6 @@ NS_IMETHODIMP nsRenderingContextPh :: FillRect(nscoord aX, nscoord aY, nscoord a NS_IMETHODIMP nsRenderingContextPh :: InvertRect(const nsRect& aRect) { -// NS_NOTYETIMPLEMENTED("nsRenderingContextPh::InvertRect"); InvertRect( aRect.x, aRect.y, aRect.width, aRect.height ); return NS_OK; @@ -1043,8 +1151,6 @@ nsRenderingContextPh :: InvertRect(const nsRect& aRect) NS_IMETHODIMP nsRenderingContextPh :: InvertRect(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight) { -// NS_NOTYETIMPLEMENTED("nsRenderingContextPh::InvertRect"); - nscoord x,y,w,h; x = aX; @@ -1534,16 +1640,22 @@ NS_IMETHODIMP nsRenderingContextPh :: CopyOffScreenBits(nsDrawingSurface aSrcSur const nsRect &aDestBounds, PRUint32 aCopyFlags) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::CopyOffScreenBits.\n")); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::CopyOffScreenBits this=<%p> aSrcSurf=<%p> aSrcPt=(%d,%d) aCopyFlags=<%d> DestRect=<%d,%d,%d,%d>\n", + this, aSrcSurf, aSrcX, aSrcY, aCopyFlags, aDestBounds.x, aDestBounds.y, aDestBounds.width, aDestBounds.height)); - - PhArea_t area; + PhArea_t area; PRInt32 srcX = aSrcX; PRInt32 srcY = aSrcY; nsRect drect = aDestBounds; - nsDrawingSurfacePh *destsurf; + nsDrawingSurfacePh *destsurf; - PhGC_t *saveGC=PgGetGC(); + if ( (aSrcSurf==NULL) || (mTMatrix==NULL) || (mSurface==NULL)) + { + NS_ASSERTION(0, "nsRenderingContextPh::CopyOffScreenBits STarted with NULL pointer"); + return NS_ERROR_FAILURE; + } + + PhGC_t *saveGC = PgGetGC(); if (aCopyFlags & NS_COPYBITS_TO_BACK_BUFFER) { @@ -1555,7 +1667,7 @@ NS_IMETHODIMP nsRenderingContextPh :: CopyOffScreenBits(nsDrawingSurface aSrcSur if( mBufferIsEmpty ) { - PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" Buffer empty, skipping.\n")); + PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::CopyOffScreenBits Buffer empty, skipping.\n")); SELECT( destsurf ); PgSetGC(saveGC); return NS_OK; @@ -1594,14 +1706,15 @@ NS_IMETHODIMP nsRenderingContextPh :: CopyOffScreenBits(nsDrawingSurface aSrcSur // printf ("location: %d, %p %p (%d %d) %d %d %d %d\n",aCopyFlags,aSrcSurf,destsurf,srcX,srcY,area.pos.x,area.pos.y,area.size.w,area.size.h); -nsRect rect; -PRBool valid; -GetClipRect(rect,valid); -if (valid) -{ -// printf ("clip: %d %d %d %d\n",rect.x,rect.y,rect.width,rect.height); - area.size.w = rect.width; area.size.h = rect.height; -} + nsRect rect; + PRBool valid; + GetClipRect(rect,valid); + if (valid) + { + //printf ("clip: %d %d %d %d\n",rect.x,rect.y,rect.width,rect.height); + area.size.w = rect.width; + area.size.h = rect.height; + } ((nsDrawingSurfacePh *)aSrcSurf)->Stop(); PhImage_t *image; @@ -1661,14 +1774,6 @@ printf ("unimp pushclipstate\n"); PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::PushClipState - Not implemented.\n")); } -NS_IMETHODIMP nsRenderingContextPh :: CreateDrawingSurface( PhGC_t *aGC, nsDrawingSurface &aSurface) -{ -printf ("unimp createdrawingsurface\n"); - PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::CreateDrawingSurface - Not implemented.\n")); - - return NS_OK; -} - void nsRenderingContextPh::ApplyClipping( PhGC_t *gc ) { @@ -1686,7 +1791,7 @@ rid = gc->rid; //PtArg_t arg; //PhPoint_t *pos; - if (mRegion) + if (mClipRegion) { PhRegion_t my_region; PhRect_t rect = {{0,0},{0,0}}; @@ -1704,7 +1809,7 @@ rid = gc->rid; //printf ("clip widget: %p %d %d\n",mWidget,pos->x,pos->y); /* no offset needed use the normal tile list */ - mRegion->GetNativeRegion((void*&)tiles); + mClipRegion->GetNativeRegion((void*&)tiles); if (tiles != nsnull) { @@ -1725,7 +1830,7 @@ rid = gc->rid; void nsRenderingContextPh::SetPhLineStyle() { - switch( mLineStyle ) + switch( mCurrentLineStyle ) { case nsLineStyle_kSolid: PgSetStrokeDash( nsnull, 0, 0x10000 ); diff --git a/gfx/src/photon/nsRenderingContextPh.h b/gfx/src/photon/nsRenderingContextPh.h index 8e6bab436c9d..d4d27301c0c1 100644 --- a/gfx/src/photon/nsRenderingContextPh.h +++ b/gfx/src/photon/nsRenderingContextPh.h @@ -30,21 +30,19 @@ #include "nsIViewManager.h" #include "nsIWidget.h" #include "nsRect.h" -//#include "nsImagePh.h" #include "nsIDeviceContext.h" #include "nsVoidArray.h" -#include "nsIRenderingContextPh.h" +//#include "nsIRenderingContextPh.h" #include "nsDrawingSurfacePh.h" -//#include "nsRegionPh.h" class GraphicsState; class nsDrawingSurfacePh; class nsImagePh; +class nsIRegion; class nsRegionPh; -class nsRenderingContextPh : public nsIRenderingContext, - nsIRenderingContextPh +class nsRenderingContextPh : public nsIRenderingContext { public: nsRenderingContextPh(); @@ -159,7 +157,7 @@ public: NS_IMETHOD RetrieveCurrentNativeGraphicData(PRUint32 * ngd); // nsIRenderingContextPh - NS_IMETHOD CreateDrawingSurface(PhGC_t *aGC, nsDrawingSurface &aSurface); + // NS_IMETHOD CreateDrawingSurface(PhGC_t *aGC, nsDrawingSurface &aSurface); private: ~nsRenderingContextPh(); @@ -176,7 +174,7 @@ protected: PhGC_t *mholdGC; PhGC_t *mOldGC; nscolor mCurrentColor; - nsLineStyle mLineStyle; + nsLineStyle mCurrentLineStyle; nsTransform2D *mTMatrix; // transform that all the graphics drawn here will obey nsIFontMetrics *mFontMetrics; nsDrawingSurfacePh *mOffscreenSurface; @@ -185,7 +183,7 @@ protected: nsIWidget *mDCOwner; nsIDeviceContext *mContext; float mP2T; - nsRegionPh *mRegion; + nsIRegion *mClipRegion; PtWidget_t *mWidget; char *mPhotonFontName; nsRegionPh *mGlobalClip; @@ -196,12 +194,9 @@ protected: nsVoidArray *mStateCache; PRUint8 *mGammaTable; - static PhGC_t *mPtGC; + static PhGC_t *mPtGC; /* Default Photon Graphics Context */ PRBool mBufferIsEmpty; - -#ifdef NS_DEBUG PRBool mInitialized; -#endif }; #endif /* nsRenderingContextPh_h___ */