From 5150420d30de70031c50b95e52bec8c5fe74651d Mon Sep 17 00:00:00 2001 From: kramm Date: Wed, 12 Nov 2008 10:33:56 +0000 Subject: [PATCH] continued bounding box implementation --- lib/pdf/BitmapOutputDev.cc | 178 +++++++++++++++++--------------------------- 1 file changed, 70 insertions(+), 108 deletions(-) diff --git a/lib/pdf/BitmapOutputDev.cc b/lib/pdf/BitmapOutputDev.cc index 8d762cf..2851f09 100644 --- a/lib/pdf/BitmapOutputDev.cc +++ b/lib/pdf/BitmapOutputDev.cc @@ -53,7 +53,7 @@ BitmapOutputDev::BitmapOutputDev(InfoOutputDev*info, PDFDoc*doc) this->rgbdev = new SplashOutputDev(splashModeRGB8, 1, gFalse, splash_white, gTrue, gTrue); /* color mode for binary bitmaps */ - SplashColorMode colorMode = splashModeMono1; + SplashColorMode colorMode = splashModeMono8; /* two devices for testing things against clipping: one clips, the other doesn't */ this->clip0dev = new SplashOutputDev(colorMode, 1, gFalse, splash_black, gTrue, gFalse); @@ -302,24 +302,16 @@ void writeBitmap(SplashBitmap*bitmap, char*filename) gfxcolor_t*data = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height); - unsigned char aa=0; - if(bitmap->getMode()==splashModeMono1) - aa=255; - for(y=0;ygetPixel(x,y,c); + int a = bitmap->getAlpha(x,y); line[x].r = c[0]; line[x].g = c[1]; line[x].b = c[2]; - if(aa) { - line[x].a = aa; - } else { - int a = bitmap->getAlpha(x,y); - line[x].a = a; - } + line[x].a = a; } } writePNG(filename, (unsigned char*)data, width, height); @@ -332,11 +324,6 @@ void writeAlpha(SplashBitmap*bitmap, char*filename) int width = bitmap->getWidth(); int height = bitmap->getHeight(); - - if(bitmap->getMode()==splashModeMono1) { - writeBitmap(bitmap, filename); - return; - } gfxcolor_t*data = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height); @@ -462,7 +449,7 @@ GBool BitmapOutputDev::checkNewBitmap(int x1, int y1, int x2, int y2) sprintf(filename2, "state%dbooltext_afternewgfx.png", dbg_btm_counter); sprintf(filename3, "state%dbitmap_afternewgfx.png", dbg_btm_counter); - if(dbg_btm_counter==12) { + if(0) { msg(" %s %s %s", filename1, filename2, filename3); writeAlpha(boolpolybitmap, filename1); writeAlpha(booltextbitmap, filename2); @@ -512,43 +499,35 @@ GBool BitmapOutputDev::checkNewBitmap(int x1, int y1, int x2, int y2) // break; //} -static inline GBool fixBBox(int*x1, int*y1, int*x2, int*y2, int width, int height) -{ - if(!(*x1|*y1|*x2|*y2)) { - // undefined bbox - *x1 = *y1 = 0; - *x2 = width; - *y2 = height; - return gTrue; - } - if(*x2<=*x1) return gFalse; - if(*x2<0) return gFalse; - if(*x1<0) *x1 = 0; - if(*x1>=width) return gFalse; - if(*x2>width) *x2=width; - - if(*y2<=*y1) return gFalse; - if(*y2<0) return gFalse; - if(*y1<0) *y1 = 0; - if(*y1>=height) return gFalse; - if(*y2>height) *y2=height; - return gTrue; -} - GBool BitmapOutputDev::clip0and1differ(int x1,int y1,int x2,int y2) { if(clip0bitmap->getMode()==splashModeMono1) { - int width = clip0bitmap->getWidth(); - int width8 = (width+7)/8; - int height = clip0bitmap->getHeight(); - - if(fixBBox(&x1,&y1,&x2,&y2,width,height)) { - /* area is outside or null */ - return gFalse; - } + if(x2<=x1) + return gFalse; + if(x2<0) + return gFalse; + if(x1<0) + x1 = 0; + if(x1>=clip0bitmap->getWidth()) + return gFalse; + if(x2>clip0bitmap->getWidth()) + x2=clip0bitmap->getWidth(); + + if(y2<=y1) + return gFalse; + if(y2<0) + return gFalse; + if(y1<0) + y1 = 0; + if(y1>=clip0bitmap->getHeight()) + return gFalse; + if(y2>clip0bitmap->getHeight()) + y2=clip0bitmap->getHeight(); SplashBitmap*clip0 = clip0bitmap; SplashBitmap*clip1 = clip1bitmap; + int width8 = (clip0bitmap->getWidth()+7)/8; + int height = clip0bitmap->getHeight(); int x18 = x1/8; int x28 = (x2+7)/8; int y; @@ -561,15 +540,21 @@ GBool BitmapOutputDev::clip0and1differ(int x1,int y1,int x2,int y2) } return gFalse; } else { + if(x1<0) x1=0; + if(x2<0) x2=0; + if(y1<0) y1=0; + if(y2<0) y2=0; + if(x1>clip0bitmap->getWidth()) x1=clip0bitmap->getWidth(); + if(y1>clip0bitmap->getHeight()) y1=clip0bitmap->getHeight(); + if(x2>clip0bitmap->getWidth()) x2=clip0bitmap->getWidth(); + if(y2>clip0bitmap->getHeight()) y2=clip0bitmap->getHeight(); + if(x1>x2) x1=x2; + if(y1>x2) y1=y2; + SplashBitmap*clip0 = clip0bitmap; SplashBitmap*clip1 = clip1bitmap; int width = clip0->getAlphaRowSize(); int height = clip0->getHeight(); - - if(!fixBBox(&x1, &y1, &x2, &y2, width, height)) { - x1=y1=0;x2=y2=1; - } - Guchar*a0 = clip0->getAlphaPtr(); Guchar*a1 = clip1->getAlphaPtr(); int x,y; @@ -614,42 +599,14 @@ static void clearBooleanBitmap(SplashBitmap*btm, int x1, int y1, int x2, int y2) } } -GBool compare8(unsigned char*data1, unsigned char*data2, int len) +long long unsigned int compare64(long long unsigned int*data1, long long unsigned int*data2, int len) { - if(!len) - return 0; - if(((ptroff_t)data1&7)==((ptroff_t)data2&7)) { - // oh good, we can do aligning - while((ptroff_t)data1&7) { - if(*data1&*data2) - return 1; - data1++; - data2++; - if(!--len) - return 0; - } - } - /* use 64 bit for the (hopefully aligned) middle section */ - int l8 = len/8; - long long unsigned int*d1 = (long long unsigned int*)data1; - long long unsigned int*d2 = (long long unsigned int*)data2; - long long unsigned int x = 0; + long long unsigned int c; int t; - for(t=0;tgetMode()==splashModeMono1) { /* alternative implementation, using one bit per pixel- needs the no-dither patch in xpdf */ - - int width = boolpoly->getWidth(); - int height = boolpoly->getHeight(); - if(!fixBBox(&x1,&y1,&x2,&y2, width, height)) { - return gFalse; - } + if(x1>=width) return gFalse; + if(x2<=0) return gFalse; + if(y1>=height)return gFalse; + if(y2<=0) return gFalse; + if(x1>=x2) return gFalse; + if(y1>=y2) return gFalse; Guchar*polypixels = boolpoly->getDataPtr(); Guchar*textpixels = booltext->getDataPtr(); + int width = boolpoly->getWidth(); + int height = boolpoly->getHeight(); int width8 = (width+7)/8; int runx = width8; int runy = height; @@ -691,28 +650,31 @@ GBool BitmapOutputDev::intersection(int x1, int y1, int x2, int y2) }*/ int x,y; - unsigned char*data1 = (unsigned char*)polypixels; - unsigned char*data2 = (unsigned char*)textpixels; - msg(" Testing area (%d,%d,%d,%d), runx=%d,runy=%d", x1,y1,x2,y2, runx, runy); for(y=0;ygetAlphaRowSize(); - int height = boolpoly->getHeight(); - - if(!fixBBox(&x1, &y1, &x2, &y2, width, height)) { - x1=y1=0;x2=y2=1; - } + if(x1<0) x1=0; + if(y1<0) y1=0; + if(x2<0) x2=0; + if(y2<0) y2=0; + if(x1>width) x1=width; + if(y1>height) y1=height; + if(x2>width) x2=width; + if(y2>height) y2=height; + if(x1>x2) x1=x2; + if(y1>y2) y1=y2; Guchar*polypixels = boolpoly->getAlphaPtr(); Guchar*textpixels = booltext->getAlphaPtr(); + + int width = boolpoly->getAlphaRowSize(); + int height = boolpoly->getHeight(); int x,y; char overlap1 = 0; @@ -746,7 +708,7 @@ GBool BitmapOutputDev::intersection(int x1, int y1, int x2, int y2) msg(" Bad bounding box: intersection outside bbox"); msg(" given bbox: %d %d %d %d", x1, y1, x2, y2); msg(" changed area: %d %d %d %d", ax1, ay1, ax2, ay2); - //writeAlpha(booltextbitmap, "alpha.png"); + writeAlpha(booltextbitmap, "alpha.png"); } return overlap2; } -- 1.7.10.4