X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FBitmapOutputDev.cc;h=4f88282814f7aea8dda008e7af373b9b8f14ec43;hb=bf04757cd94e94c1f67fa3d2a4e3e59fa5bce0c0;hp=3b10a2f36cc21f00d714fcb1552b5225e660305b;hpb=9227569986ba464b81ca42ab213fb87a2dd3b55f;p=swftools.git diff --git a/lib/pdf/BitmapOutputDev.cc b/lib/pdf/BitmapOutputDev.cc index 3b10a2f..4f88282 100644 --- a/lib/pdf/BitmapOutputDev.cc +++ b/lib/pdf/BitmapOutputDev.cc @@ -294,6 +294,30 @@ void BitmapOutputDev::flushText() this->emptypage = 0; } +void writeMonoBitmap(SplashBitmap*btm, char*filename) +{ + int width8 = (btm->getWidth()+7)/8; + int width = btm->getWidth(); + int height = btm->getHeight(); + gfxcolor_t*b = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height); + unsigned char*data = btm->getDataPtr(); + int x,y; + for(y=0;y>3]&(128>>(x&7))) { + d[x].r = d[x].g = d[x].b = 255; + } else { + d[x].r = d[x].g = d[x].b = 0; + } + d[x].a = 255; + } + } + writePNG(filename, (unsigned char*)b, width, height); + free(b); +} + void writeBitmap(SplashBitmap*bitmap, char*filename) { int y,x; @@ -303,9 +327,10 @@ 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; + if(bitmap->getMode()==splashModeMono1) { + writeMonoBitmap(bitmap, filename); + return; + } for(y=0;ygetAlpha(x,y); - line[x].a = a; - } + line[x].a = bitmap->getAlpha(x,y); } } writePNG(filename, (unsigned char*)data, width, height); @@ -335,7 +355,7 @@ void writeAlpha(SplashBitmap*bitmap, char*filename) int height = bitmap->getHeight(); if(bitmap->getMode()==splashModeMono1) { - writeBitmap(bitmap, filename); + writeMonoBitmap(bitmap, filename); return; } @@ -397,13 +417,13 @@ GBool BitmapOutputDev::checkNewText(int x1, int y1, int x2, int y2) msg(" Testing new text data against current bitmap data, state=%s, counter=%d\n", STATE_NAME[layerstate], dbg_btm_counter); - char filename1[80]; - char filename2[80]; - char filename3[80]; - sprintf(filename1, "state%dboolbitmap_afternewtext.png", dbg_btm_counter); - sprintf(filename2, "state%dbooltext_afternewtext.png", dbg_btm_counter); - sprintf(filename3, "state%dbitmap_afternewtext.png", dbg_btm_counter); if(0) { + char filename1[80]; + char filename2[80]; + char filename3[80]; + sprintf(filename1, "state%dboolbitmap_afternewtext.png", dbg_btm_counter); + sprintf(filename2, "state%dbooltext_afternewtext.png", dbg_btm_counter); + sprintf(filename3, "state%dbitmap_afternewtext.png", dbg_btm_counter); msg(" %s %s %s", filename1, filename2, filename3); writeAlpha(boolpolybitmap, filename1); writeAlpha(booltextbitmap, filename2); @@ -456,14 +476,13 @@ GBool BitmapOutputDev::checkNewBitmap(int x1, int y1, int x2, int y2) /* similar to checkNewText() above, only in reverse */ msg(" Testing new graphics data against current text data, state=%s, counter=%d\n", STATE_NAME[layerstate], dbg_btm_counter); - char filename1[80]; - char filename2[80]; - char filename3[80]; - sprintf(filename1, "state%dboolbitmap_afternewgfx.png", dbg_btm_counter); - 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) { + char filename1[80]; + char filename2[80]; + char filename3[80]; + sprintf(filename1, "state%dboolbitmap_afternewgfx.png", dbg_btm_counter); + sprintf(filename2, "state%dbooltext_afternewgfx.png", dbg_btm_counter); + sprintf(filename3, "state%dbitmap_afternewgfx.png", dbg_btm_counter); msg(" %s %s %s", filename1, filename2, filename3); writeAlpha(boolpolybitmap, filename1); writeAlpha(booltextbitmap, filename2); @@ -543,7 +562,7 @@ GBool BitmapOutputDev::clip0and1differ(int x1,int y1,int x2,int y2) int width8 = (width+7)/8; int height = clip0bitmap->getHeight(); - if(fixBBox(&x1,&y1,&x2,&y2,width,height)) { + if(!fixBBox(&x1,&y1,&x2,&y2,width,height)) { /* area is outside or null */ return gFalse; } @@ -556,9 +575,10 @@ GBool BitmapOutputDev::clip0and1differ(int x1,int y1,int x2,int y2) for(y=y1;ygetDataPtr()[width8*y+x18]; - unsigned char*row2 = &clip1bitmap->getDataPtr()[width8*y+x28]; - if(memcmp(row1, row2, x28-x18)) + unsigned char*row2 = &clip1bitmap->getDataPtr()[width8*y+x18]; + if(memcmp(row1, row2, x28-x18)) { return gTrue; + } } return gFalse; } else { @@ -696,11 +716,8 @@ GBool BitmapOutputDev::intersection(int x1, int y1, int x2, int y2) 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;ygetCurrentFont()->getGlyphPath(code); + SplashFont*font = clip0dev->getCurrentFont(); + SplashPath*path = font?font->getGlyphPath(code):NULL; + if(!path) { if(code) msg(" couldn't create outline for char %d", code); @@ -1431,6 +1450,7 @@ void BitmapOutputDev::drawChar(GfxState *state, double x, double y, state->setRender(oldrender); } } else { + /* this char is not at all affected by clipping. Now just dump out the bitmap we're currently working on, if necessary. */ booltextdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen);