From 88adb975b93ec9091935459331de35e894ee55f5 Mon Sep 17 00:00:00 2001 From: "Jerry.Kirk%Nexwarecorp.com" Date: Tue, 26 Oct 1999 00:45:24 +0000 Subject: [PATCH] Fixing problem with   being put into empty text fields This is relly more of a hack, not a fix. Bug 16886 r=kedl --- gfx/src/photon/nsRenderingContextPh.cpp | 301 +++++++++++++++++++++--- 1 file changed, 273 insertions(+), 28 deletions(-) diff --git a/gfx/src/photon/nsRenderingContextPh.cpp b/gfx/src/photon/nsRenderingContextPh.cpp index 896221c1481c..50636377a874 100644 --- a/gfx/src/photon/nsRenderingContextPh.cpp +++ b/gfx/src/photon/nsRenderingContextPh.cpp @@ -37,7 +37,6 @@ static NS_DEFINE_IID(kIRenderingContextIID, NS_IRENDERING_CONTEXT_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); @@ -64,6 +63,25 @@ long FillColorVal[8] = {Pg_BLACK,Pg_BLUE,Pg_RED,Pg_YELLOW,Pg_GREEN,Pg_MAGENTA,Pg #define NS_TO_PH_RGB(ns) (ns & 0xff) << 16 | (ns & 0xff00) | ((ns >> 16) & 0xff) #define PH_TO_NS_RGB(ns) (ns & 0xff) << 16 | (ns & 0xff00) | ((ns >> 16) & 0xff) +#ifdef DEBUG +// By creating "/dev/shmem/grab" this enables a functions that takes the +// offscreen buffer and stuffs it into "grab.bmp" to be viewed by the +// developer for debug purposes... + +#include +#include +#include +#include +#include + +int x=0,y=0; +int X,Y,DEPTH; +int real_depth; +int scale=1; + +static void do_bmp(char *ptr,int bpl,int x,int y); +#endif + #include PRLogModuleInfo *PhGfxLog = PR_NewLogModule("PhGfxLog"); #include "nsPhGfxLog.h" @@ -230,7 +248,7 @@ NS_IMETHODIMP nsRenderingContextPh :: Init(nsIDeviceContext* aContext, NS_PRECONDITION(PR_FALSE == mInitialized, "double init"); nsresult res; - + mContext = aContext; NS_IF_ADDREF(mContext); @@ -311,12 +329,22 @@ NS_IMETHODIMP nsRenderingContextPh::CommonInit() mClipRegion->SetTo(0, 0, width, height); } } - - mContext->GetAppUnitsToDevUnits(app2dev); - mTMatrix->AddScale(app2dev,app2dev); - mContext->GetDevUnitsToAppUnits(mP2T); - mContext->GetGammaTable(mGammaTable); + else + { + return NS_ERROR_FAILURE; + } + NS_ASSERTION(mContext,"nsRenderingContextPh::CommonInit mContext is NULL!"); + NS_ASSERTION(mTMatrix,"nsRenderingContextPh::CommonInit mTMatrix is NULL!"); + + if (mContext && mTMatrix) + { + mContext->GetAppUnitsToDevUnits(app2dev); + mTMatrix->AddScale(app2dev,app2dev); + mContext->GetDevUnitsToAppUnits(mP2T); + mContext->GetGammaTable(mGammaTable); + } + return NS_OK; } @@ -1158,9 +1186,12 @@ nsRenderingContextPh :: InvertRect(nscoord aX, nscoord aY, nscoord aWidth, nscoo w = aWidth; h = aHeight; + if (!mSurface) + return NS_OK; // kedl, error instead? + mTMatrix->TransformCoord(&x,&y,&w,&h); SELECT(mSurface); -// printf ("invert rect: %d %d %d %d\n",x,y,w,h); + //printf ("invert rect: %d %d %d %d\n",x,y,w,h); PgSetFillColor(Pg_INVERT_COLOR); PgSetDrawMode(Pg_DRAWMODE_XOR); @@ -1524,19 +1555,21 @@ NS_IMETHODIMP nsRenderingContextPh :: DrawString(const char *aString, PRUint32 a /* HACK to see if we have a clipping problem */ //PgSetClipping(0,NULL); -#if 1 - err=PgDrawTextChars( aString, aLength, &pos, (Pg_TEXT_LEFT | Pg_TEXT_TOP)); -#else - /* This is garbage and doesn't work */ - int char_count, byte_count; - char *new_str; - byte_count = mbstrnlen(aString, aLength, 0, &char_count); - printf("nsRenderingContextPh::DrawString1 aLength=<%d> char_count=<%d> byte_count=<%d>\n", aLength, char_count, byte_count); - new_str = malloc(byte_count+1); - memcpy(new_str, aString, byte_count+1); - err=PgDrawTextmx( new_str, byte_count, &pos, (Pg_TEXT_LEFT | Pg_TEXT_TOP)); +#if 0 + printf("nsRenderingContextPh::DrawString1 buffer="); + for(int i=0; i<(aLength*2); i++) + { + printf("%X,", *(aString+i)); + } + printf("\n"); #endif + /* Kirk: 10/22/99 HACK HACK should be fix'd Bugzilla 16886 */ + /* Don't print 1 character strings that are &NBSP; */ + if ( (aLength == 1) && (*aString == 0xFFFFFFA0)) + return NS_OK; + + err=PgDrawTextChars( aString, aLength, &pos, (Pg_TEXT_LEFT | Pg_TEXT_TOP)); if ( err == -1) { printf("nsRenderingContextPh::DrawString1 returned error code\n"); @@ -1665,7 +1698,7 @@ NS_IMETHODIMP nsRenderingContextPh :: CopyOffScreenBits(nsDrawingSurface aSrcSur 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)); -printf("nsRenderingContextPh::CopyOffScreenBits 0\n"); +//printf("nsRenderingContextPh::CopyOffScreenBits 0\n"); PhArea_t area; PRInt32 srcX = aSrcX; @@ -1693,7 +1726,7 @@ printf("nsRenderingContextPh::CopyOffScreenBits 0\n"); if( mBufferIsEmpty ) { PR_LOG(PhGfxLog, PR_LOG_DEBUG, ("nsRenderingContextPh::CopyOffScreenBits Buffer empty, skipping.\n")); - printf("nsRenderingContextPh::CopyOffScreenBits Buffer empty, skipping.\n"); + //printf("nsRenderingContextPh::CopyOffScreenBits Buffer empty, skipping.\n"); SELECT( destsurf ); PgSetGC(saveGC); @@ -1703,7 +1736,7 @@ printf("nsRenderingContextPh::CopyOffScreenBits 0\n"); PR_LOG(PhGfxLog, PR_LOG_DEBUG, (" flags=%X\n", aCopyFlags )); -#if 1 +#if 0 printf("nsRenderingContextPh::CopyOffScreenBits() flags=\n"); if (aCopyFlags & NS_COPYBITS_USE_SOURCE_CLIP_REGION) @@ -1732,8 +1765,8 @@ printf("nsRenderingContextPh::CopyOffScreenBits 0\n"); area.size.w=drect.width; area.size.h=drect.height; - printf ("nsRenderingContextPh::CopyOffScreenBits 1 CopyFlags=<%d>, SrcSurf=<%p> DestSurf=<%p> Src=(%d,%d) Area=(%d,%d,%d,%d)\n", - aCopyFlags,aSrcSurf,destsurf,srcX,srcY,area.pos.x,area.pos.y,area.size.w,area.size.h); +// printf ("nsRenderingContextPh::CopyOffScreenBits 1 CopyFlags=<%d>, SrcSurf=<%p> DestSurf=<%p> Src=(%d,%d) Area=(%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; @@ -1786,11 +1819,10 @@ if (aSrcSurf==destsurf) PhDim_t size = { area.size.w,area.size.h }; unsigned char *ptr; ptr = image->image; -// ptr += image->bpl * srcY + srcX*3 ; PgDrawImagemx( ptr, image->type , &pos, &size, image->bpl, 0); - -// PgSetGC( mPtGC ); -// PgSetRegion( mPtGC->rid ); +#ifdef DEBUG + do_bmp(ptr,image->bpl/3,size.w,size.h); +#endif } PgSetGC(saveGC); @@ -1889,3 +1921,216 @@ void nsRenderingContextPh::SetPhLineStyle() } + +#if DEBUG + +/*******************************************/ +static void putshort(FILE *fp, int i) +{ + int c, c1; + + c = ((unsigned int ) i) & 0xff; c1 = (((unsigned int) i)>>8) & 0xff; + putc(c, fp); putc(c1,fp); +} + + +/*******************************************/ +static void putint(FILE *fp, int i) +{ + int c, c1, c2, c3; + c = ((unsigned int ) i) & 0xff; + c1 = (((unsigned int) i)>>8) & 0xff; + c2 = (((unsigned int) i)>>16) & 0xff; + c3 = (((unsigned int) i)>>24) & 0xff; + + putc(c, fp); putc(c1,fp); putc(c2,fp); putc(c3,fp); +} + +/*******************************************/ +static void writeBMP24(FILE *fp, unsigned char *pic24,int w,int h) +{ + int i,j,c,padb; + unsigned char *pp; + int xx,yy; + unsigned char r,g,b; + unsigned char p1,p2; + unsigned long ar,ag,ab; + + padb = (4 - ((w/scale*3) % 4)) & 0x03; /* # of pad bytes to write at EOscanline */ + + for (i=h-1; i>=0; i-=scale) + { + pp = pic24 + DEPTH*x + DEPTH*y*X + (i * X * DEPTH); + + for (j=0; j> 5) | ((p2 & 7) << 3)); + ar+= (p2 >> 3); + } + else + if (real_depth==15) + { + p1=pp[0+xx*DEPTH+yy*DEPTH*X]; + p2=pp[1+xx*DEPTH+yy*DEPTH*X]; + ab+= (p1 & 0x1f); + ag+= ((p1 >> 5) | ((p2 & 3) << 3)); + ar+= ((p2 & 0x7f) >> 2); + } + } + r = ar/(scale*scale); + g = ag/(scale*scale); + b = ab/(scale*scale); + if (real_depth==24) + { + putc(r, fp); + putc(g, fp); + putc(b, fp); + } + else + if (real_depth==16) + { + putc(b<<3, fp); + putc(g<<2, fp); + putc(r<<3, fp); + } + else + if (real_depth==15) + { + putc(b<<3, fp); + putc(g<<3, fp); + putc(r<<3, fp); + } + pp += DEPTH*scale; + } + + for (j=0; jX || w==0) + w = X-x; + if (y+h>Y || h==0) + h = Y-y; + + //printf( "aperature 0x%x\n",aperature ); + printf ("X:%d Y:%d DEPTH:%d\n",X,Y,DEPTH); + printf ("x:%d y:%d w:%d h:%d scale:%d\n",x,y,w,h,scale); + + if (DEPTH!=24 && DEPTH!=16 && DEPTH!=15) + { + printf("Depth must be 15,16 or 24 for now.\n"); + exit(0); + } + + real_depth=DEPTH; + DEPTH = (DEPTH+1)/8; + + if (loop) + { + cp = strstr(filename,"."); + if (cp==0) + sprintf (buf,"%s%d",filename,loop++); + else + { + *cp = 0; + sprintf (buf,"%s%d.%s",filename,loop++,cp+1); + *cp = '.'; + } + } + else + { + strcpy(buf,filename); + } + + printf ("bmp file: %s\n",buf); + + fp = fopen (buf,"w"); + + { + nbits = 24; + cmaplen = 0; + nc = 0; + bperlin = ((w * nbits + 31) / 32) * 4; /* # bytes written per line */ + + putc('B', fp); putc('M', fp); /* BMP file magic number */ + + /* compute filesize and write it */ + i = 14 + /* size of bitmap file header */ + 40 + /* size of bitmap info header */ + (nc * 4) + /* size of colormap */ + bperlin * h; /* size of image data */ + + putint(fp, i); + putshort(fp, 0); /* reserved1 */ + putshort(fp, 0); /* reserved2 */ + putint(fp, 14 + 40 + (nc * 4)); /* offset from BOfile to BObitmap */ + + putint(fp, 40); /* biSize: size of bitmap info header */ + putint(fp, w/scale); /* biWidth */ + putint(fp, h/scale); /* biHeight */ + putshort(fp, 1); /* biPlanes: must be '1' */ + putshort(fp, nbits); /* biBitCount: 1,4,8, or 24 */ +#define BI_RGB 0 + putint(fp, BI_RGB); /* biCompression: BI_RGB, BI_RLE8 or BI_RLE4 */ + putint(fp, bperlin*h); /* biSizeImage: size of raw image data */ + putint(fp, 75 * 39); /* biXPelsPerMeter: (75dpi * 39" per meter) */ + putint(fp, 75 * 39); /* biYPelsPerMeter: (75dpi * 39" per meter) */ + putint(fp, nc); /* biClrUsed: # of colors used in cmap */ + putint(fp, nc); /* biClrImportant: same as above */ + + if (buffer) + writeBMP24(fp,buffer,w,h); + else + writeBMP24(fp,p,w,h); + } + fclose(fp); +} + +#endif \ No newline at end of file