Fixes for on screen drawing in viewer.

r=kedl


git-svn-id: svn://10.0.0.236/trunk@53547 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
Jerry.Kirk%Nexwarecorp.com 1999-11-15 22:05:16 +00:00
parent d6c5f3cedd
commit 078ded00e5
5 changed files with 107 additions and 52 deletions

View File

@ -43,6 +43,8 @@ NS_IMPL_ISUPPORTS1(nsDeviceContextPh, nsIDeviceContext)
nsDeviceContextPh :: nsDeviceContextPh()
{
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsDeviceContextPh::nsDeviceContextPh this=<%p>\n", this));
NS_INIT_REFCNT();
mTwipsToPixels = 1.0;
@ -66,7 +68,7 @@ nsDeviceContextPh :: nsDeviceContextPh()
nsDeviceContextPh :: ~nsDeviceContextPh()
{
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsDeviceContextPh::~nsDeviceContextPh destructor called mSurface=<%p>\n", mSurface));
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsDeviceContextPh::~nsDeviceContextPh destructor called this=<%p> mSurface=<%p>\n", this, mSurface));
nsDrawingSurfacePh *surf = (nsDrawingSurfacePh *)mSurface;

View File

@ -83,10 +83,10 @@ nsDrawingSurfacePh :: ~nsDrawingSurfacePh()
}
}
#if 1
Stop();
if (mIsOffscreen)
{
Stop();
//PmMemReleaseMC( mMC); /* this function has an error! */
free(mMC);
mMC = nsnull;
@ -95,7 +95,6 @@ nsDrawingSurfacePh :: ~nsDrawingSurfacePh()
PR_Free (mPixmap);
mPixmap = nsnull;
}
#endif
}
/**
@ -120,7 +119,7 @@ NS_IMETHODIMP nsDrawingSurfacePh :: Lock(PRInt32 aX, PRInt32 aY,
void **aBits, PRInt32 *aStride,
PRInt32 *aWidthBytes, PRUint32 aFlags)
{
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Lock mLocked=<%d>\n"));
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsDrawingSurfacePh::Lock this=<%p> mLocked=<%d>\n", this, mLocked));
if (mLocked)
{

View File

@ -31,6 +31,8 @@ NS_IMPL_ISUPPORTS1(nsImagePh, nsIImage)
//#define PgFLUSH() PgFlush()
#define PgFLUSH()
extern void do_bmp(char *ptr,int bpl,int x,int y);
// ----------------------------------------------------------------
nsImagePh :: nsImagePh()
{
@ -359,7 +361,8 @@ NS_IMETHODIMP nsImagePh :: Draw(nsIRenderingContext &aContext, nsDrawingSurface
aWidth = mWidth;
aHeight = mHeight;
}
#if 1
/* Create a new GC just for this image */
PhGC_t *newGC = PgCreateGC(0);
PgDefaultGC(newGC);
@ -373,6 +376,11 @@ NS_IMETHODIMP nsImagePh :: Draw(nsIRenderingContext &aContext, nsDrawingSurface
PhRect_t rect = { {aRect.x,aRect.y}, {aRect.x+aRect.width-1,aRect.y+aRect.height-1}};
PgSetMultiClip(1,&rect);
}
newGC->translation = previousGC->translation;
newGC->rid = previousGC->rid;
newGC->target_rid = previousGC->target_rid;
#endif
#if 1
/* Print out all the clipping that applies */
@ -410,15 +418,6 @@ NS_IMETHODIMP nsImagePh :: Draw(nsIRenderingContext &aContext, nsDrawingSurface
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw2 this=<%p> mImage.size=(%ld,%ld) mAlphaBits=<%p> mARowBytes=%d mImage.type=%d mImage.mask_bpl=%d\n", this, mImage.size.w, mImage.size.h, mAlphaBits, mARowBytes, mImage.type, mImage.mask_bpl));
//printf("nsImagePh::Draw2 this=<%p> mImage.size=(%ld,%ld) mAlphaBits=<%p> mARowBytes=%d mImage.type=%d mImage.mask_bpl=%d\n", this, mImage.size.w, mImage.size.h, mAlphaBits, mARowBytes, mImage.type, mImage.mask_bpl);
#if 0
if ( (mImage.size.w==100) && (mImage.size.h==38))
{
/* this causes trouble if logging is OFF */
printf("skipping image\n");
return NS_OK;
}
#endif
if( mAlphaBits )
{
#if 0
@ -480,14 +479,31 @@ if ( (mImage.size.w==100) && (mImage.size.h==38))
abort();
return NS_ERROR_FAILURE;
}
#if 1
/* Try to dump the image to a BMP file */
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw2 Dump image to BMP\n"));
unsigned char *ptr;
ptr = mImage.image;
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw2 Dump image info w,h,d=(%d,%d,%d) mColorMap=<%p> \n",
mWidth, mHeight, mDepth, mColorMap));
do_bmp(ptr, mImage.bpl/3, mImage.size.w, mImage.size.h);
#endif
}
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::Draw2 this=<%p> finished \n", this));
//printf("nsImagePh::Draw2 this=<%p> finished \n", this);
#if 1
/* Restore the old GC */
PgSetGC(previousGC);
PgDestroyGC(newGC);
#endif
PgFLUSH(); //kedl
return NS_OK;
@ -589,7 +605,7 @@ PRInt32 nsImagePh::GetWidth()
PRUint8* nsImagePh::GetBits()
{
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::GetBits\n" ));
//PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::GetBits\n" ));
return mImageBits;
}
@ -676,7 +692,7 @@ void* nsImagePh::GetBitInfo()
NS_IMETHODIMP
nsImagePh::LockImagePixels(PRBool aMaskPixels)
{
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::LockImagePixels aMaskPixels=<%d>\n", aMaskPixels));
//PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::LockImagePixels aMaskPixels=<%d>\n", aMaskPixels));
return NS_OK;
}
@ -686,7 +702,7 @@ nsImagePh::LockImagePixels(PRBool aMaskPixels)
NS_IMETHODIMP
nsImagePh::UnlockImagePixels(PRBool aMaskPixels)
{
PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::UnlockImagePixels aMaskPixels=<%d>\n", aMaskPixels));
//PR_LOG(PhGfxLog, PR_LOG_DEBUG,("nsImagePh::UnlockImagePixels aMaskPixels=<%d>\n", aMaskPixels));
return NS_OK;
}

View File

@ -376,9 +376,11 @@ NS_IMETHODIMP nsRegionPh :: GetRects(nsRegionRectSet **aRects)
nsRegionRect *rect;
PhTile_t *t = mRegion;
/* Count the Tiles */
t = PhCoalesceTiles( PhMergeTiles( PhSortTiles( t )));
/* kirkj this was causing a crash in nsWidget::UpdateWidgetDamage when */
/* loading pages under viewer. 11/15/99 */
// t = PhCoalesceTiles( PhMergeTiles( PhSortTiles( t )));
/* Count the Tiles */
while(t)
{
nbox++;

View File

@ -37,8 +37,6 @@
#include <stdlib.h>
#include <mem.h>
static NS_DEFINE_IID(kIRenderingContextIID, NS_IRENDERING_CONTEXT_IID);
static NS_DEFINE_IID(kIDrawingSurfaceIID, NS_IDRAWING_SURFACE_IID);
static NS_DEFINE_IID(kDrawingSurfaceCID, NS_DRAWING_SURFACE_CID);
@ -82,7 +80,7 @@ int X,Y,DEPTH;
int real_depth;
int scale=1;
static void do_bmp(char *ptr,int bpl,int x,int y);
void do_bmp(char *ptr,int bpl,int x,int y);
#endif
#include <prlog.h>
@ -165,15 +163,21 @@ nsRenderingContextPh :: ~nsRenderingContextPh()
NS_IF_RELEASE(mFontMetrics);
NS_IF_RELEASE(mContext);
/* Go back to the default Photon DrawContext */
/* This allows the photon widgets under Viewer to work right */
PhDCSetCurrent(NULL);
PgSetGC(mPtGC);
PgSetRegion(mPtGC->rid);
if( mGC )
{
//PgDestroyGC( mGC );
//PgDestroyGC( mGC ); /* this causes crashes */
mGC = nsnull;
}
/* Go back to the default GC */
//PgSetGC( NULL );
if (mPhotonFontName)
{
delete [] mPhotonFontName;
@ -188,13 +192,24 @@ NS_IMETHODIMP nsRenderingContextPh :: Init(nsIDeviceContext* aContext,
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init with a widget aContext=<%p> aWindow=<%p>\n", aContext, aWindow));
NS_PRECONDITION(PR_FALSE == mInitialized, "double init");
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init with a widget 2 aContext=<%p> mContext=<%p>\n", aContext, mContext));
nsresult res;
mContext = aContext;
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init with a widget 3 aContext=<%p> mContext=<%p>\n", aContext, mContext));
NS_IF_ADDREF(mContext);
NS_ASSERTION(mContext,"mContext is NULL 2");
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init with a widget 4 aContext=<%p> mContext=<%p>\n", aContext, mContext));
NS_ASSERTION(mContext,"mContext is NULL 2");
if (!mContext)
{
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init mContext is NULL 2\n"));
abort();
}
mWidget = (PtWidget_t*) aWindow->GetNativeData( NS_NATIVE_WIDGET );
if(!mWidget)
@ -261,9 +276,9 @@ NS_IMETHODIMP nsRenderingContextPh :: Init(nsIDeviceContext* aContext,
nsDrawingSurface aSurface)
{
printf ("nsRenderingContextPh::Init with a surface!!!! %p\n",aSurface);
//printf ("nsRenderingContextPh::Init with a surface!!!! %p\n",aSurface);
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init with a Drawing Surface\n"));
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::Init with a Drawing Surface this=<%p> aContext=<%p> aSurface=<%p>\n", this, aContext, aSurface));
NS_PRECONDITION(PR_FALSE == mInitialized, "double init");
@ -273,6 +288,8 @@ NS_IMETHODIMP nsRenderingContextPh :: Init(nsIDeviceContext* aContext,
mSurface = (nsDrawingSurfacePh *) aSurface;
NS_ADDREF(mSurface);
mGC = mSurface->GetGC();
mInitialized = PR_TRUE;
return (CommonInit());
}
@ -295,7 +312,7 @@ NS_IMETHODIMP nsRenderingContextPh::CommonInit()
{
//mClipRegion->SetTo(0,0,0,0);
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::CommonInit mSurface is null"));
NS_ASSERTION(mSurface, "nsRenderingContextPh::CommonInit Error no surface");
//NS_ASSERTION(mSurface, "nsRenderingContextPh::CommonInit Error no surface");
//abort();
//return NS_ERROR_FAILURE;
}
@ -543,7 +560,7 @@ NS_IMETHODIMP nsRenderingContextPh :: SetClipRect(const nsRect& aRect, nsClipCom
nsRect trect = aRect;
PhRect_t *rgn;
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SetClipRect this=<%p> mTMatrix=<%p> mClipRegion=<%p> aCombine=<%d>\n", this, mTMatrix, mClipRegion, aCombine ));
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::SetClipRect this=<%p> mTMatrix=<%p> mClipRegion=<%p> aCombine=<%d> mGC=<%p>\n", this, mTMatrix, mClipRegion, aCombine, mGC ));
if ((mTMatrix) && (mClipRegion))
{
@ -1025,14 +1042,18 @@ NS_IMETHODIMP nsRenderingContextPh :: FillRect(nscoord aX, nscoord aY, nscoord a
NS_IMETHODIMP
nsRenderingContextPh :: InvertRect(const nsRect& aRect)
{
InvertRect( aRect.x, aRect.y, aRect.width, aRect.height );
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::InvertRect with nsRect\n"));
nsresult res;
res = InvertRect( aRect.x, aRect.y, aRect.width, aRect.height );
return NS_OK;
return res;
}
NS_IMETHODIMP
nsRenderingContextPh :: InvertRect(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight)
{
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::InvertRect rect=(%d,%d,%d,%d)\n", aX,aY,aWidth,aHeight));
if (nsnull == mTMatrix || nsnull == mSurface) {
return NS_ERROR_FAILURE;
@ -1045,13 +1066,12 @@ nsRenderingContextPh :: InvertRect(nscoord aX, nscoord aY, nscoord aWidth, nscoo
w = aWidth;
h = aHeight;
/* Kedl thinks this fixes the blinking cursor crash */
//if (!mSurface)
// return NS_OK; // kedl, error instead?
mTMatrix->TransformCoord(&x,&y,&w,&h);
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::InvertRect after transform rect=(%d,%d,%d,%d)\n", x,y,w,h));
SELECT(mSurface);
//printf ("invert rect: %d %d %d %d\n",x,y,w,h);
PgSetFillColor(Pg_INVERT_COLOR);
PgSetDrawMode(Pg_DRAWMODE_XOR);
@ -1167,12 +1187,7 @@ NS_IMETHODIMP nsRenderingContextPh :: FillPolygon(const nsPoint aPoints[], PRInt
return NS_ERROR_FAILURE;
}
//PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("untested nsRenderingContextPh::FillPolygon before PgFlush \n"));
PgFLUSH(); //kedl
//PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("untested nsRenderingContextPh::FillPolygon after PgFlush \n"));
return NS_OK;
}
@ -1622,23 +1637,36 @@ NS_IMETHODIMP nsRenderingContextPh::DrawImage(nsIImage *aImage,
PgFLUSH(); //kedl
#if 0
#if 1
#ifdef DEBUG
{
mSurface->Flush();
//mSurface->Flush();
PhImage_t *image;
PRUint32 w, h;
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::DrawImage2 dump surface to BMP\n"));
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::DrawImage2 dump surface to BMP mSurface=<%p>\n", mSurface));
image = ((nsDrawingSurfacePh *)mSurface)->mPixmap;
((nsDrawingSurfacePh *)mSurface)->GetDimensions(&w,&h);
if (mSurface)
{
image = ((nsDrawingSurfacePh *)mSurface)->mPixmap;
unsigned char *ptr;
ptr = image->image;
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::DrawImage2 dump surface image=<%p>\n", image));
do_bmp(ptr,image->bpl/3,w,h);
/* Make sure its an off screen surface */
if (image)
{
((nsDrawingSurfacePh *)mSurface)->GetDimensions(&w,&h);
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::DrawImage2 dump surface w,h=<%d,%d)\n", w,h));
unsigned char *ptr;
ptr = image->image;
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::DrawImage2 dump surface ptr=<%p>\n",ptr));
do_bmp(ptr,image->bpl/3,w,h);
}
}
}
#endif
#endif
@ -1810,9 +1838,11 @@ NS_IMETHODIMP nsRenderingContextPh :: CopyOffScreenBits(nsDrawingSurface aSrcSur
destsurf->Flush();
#if 1
#ifdef DEBUG
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::CopyOffScreenBits dump offscreen-2-offscreen buffer\n"));
do_bmp(ptr,image->bpl/3,size.w,size.h);
#endif
#endif
}
}
@ -1842,6 +1872,7 @@ NS_IMETHODIMP nsRenderingContextPh :: CopyOffScreenBits(nsDrawingSurface aSrcSur
destsurf->Flush();
#if 1
#ifdef DEBUG
/* Ouput the source buffer as a bmp */
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::CopyOffScreenBits dump offscreen buffer as BMP\n"));
@ -1866,6 +1897,7 @@ NS_IMETHODIMP nsRenderingContextPh :: CopyOffScreenBits(nsDrawingSurface aSrcSur
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::CopyOffScreenBits destination buffer is NULL\n"));
}
}
#endif
#endif
}
@ -1893,11 +1925,12 @@ void nsRenderingContextPh :: PushClipState(void)
void nsRenderingContextPh::ApplyClipping( PhGC_t *gc )
{
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::ApplyClipping gc=<%p> mClipRegion=<%p>\n", gc, mClipRegion));
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::ApplyClipping this=<%p> gc=<%p> mClipRegion=<%p>\n",this, gc, mClipRegion));
if (!gc)
{
NS_WARNING("nsRenderingContextPh::ApplyClipping gc is NULL");
NS_ASSERTION(0,"nsRenderingContextPh::ApplyClipping gc is NULL");
abort(); /* Is this an error? Try Test10 */
return;
}
@ -2122,10 +2155,13 @@ void do_bmp(char *ptr, int bpl, int W, int H)
Y=H;
DEPTH=24;
PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::do_bmp 1\n"));
// don't write bmp file if not wanted
test = fopen ("/dev/shmem/grab","r");
if (test==0)
return;
fclose(test);
p = ptr;