X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fpdf%2FBitmapOutputDev.cc;h=5c005d035d8f900484d89bb2a5076661057f2245;hp=9e8123b10f4cb04c13a86f697dfee7a2eb4309ea;hb=9e1987ca321def20b6f756bb5955d41c78c45c05;hpb=fc8854e5ed42dbcef96d25eb851b9873707a15ff diff --git a/lib/pdf/BitmapOutputDev.cc b/lib/pdf/BitmapOutputDev.cc index 9e8123b..5c005d0 100644 --- a/lib/pdf/BitmapOutputDev.cc +++ b/lib/pdf/BitmapOutputDev.cc @@ -29,6 +29,7 @@ #include "../log.h" #include "../png.h" #include "../devices/record.h" +#include "../gfxtools.h" #include "../types.h" #include "bbox.h" @@ -80,6 +81,7 @@ BitmapOutputDev::BitmapOutputDev(InfoOutputDev*info, PDFDoc*doc) this->gfxdev->setDevice(this->gfxoutput); this->config_extrafontdata = 0; + this->config_optimizeplaincolorfills = 0; this->bboxpath = 0; //this->clipdev = 0; //this->clipstates = 0; @@ -311,7 +313,16 @@ void BitmapOutputDev::flushBitmap() void BitmapOutputDev::flushText() { msg(" Flushing text"); - gfxdevice_record_flush(this->gfxoutput, this->dev); + + static gfxfontlist_t*output_font_list = 0; + static gfxdevice_t*last = 0; + if(last != this->dev) { + if(output_font_list) + gfxfontlist_free(output_font_list, 0); + output_font_list = gfxfontlist_create(); + } + gfxdevice_record_flush(this->gfxoutput, this->dev, &output_font_list); + last = this->dev; this->emptypage = 0; } @@ -1335,11 +1346,47 @@ void BitmapOutputDev::stroke(GfxState *state) rgbdev->stroke(state); dbg_newdata("stroke"); } + +extern gfxcolor_t getFillColor(GfxState * state); + +char area_is_plain_colored(GfxState*state, SplashBitmap*boolpoly, SplashBitmap*rgbbitmap, int x1, int y1, int x2, int y2) +{ + int width = boolpoly->getWidth(); + int height = boolpoly->getHeight(); + if(!fixBBox(&x1, &y1, &x2, &y2, width, height)) { + return 0; + } + gfxcolor_t color = getFillColor(state); + SplashColorPtr rgb = rgbbitmap->getDataPtr() + + (y1*width+x1)*sizeof(SplashColor); + int width8 = (width+7)/8; + unsigned char*bits = (unsigned char*)boolpoly->getDataPtr() + + (y1*width8+x1); + int x,y; + int w = x2-x1; + int h = y2-y1; + for(y=0;y fill"); boolpolydev->fill(state); gfxbbox_t bbox = getBBox(state); + if(config_optimizeplaincolorfills) { + if(area_is_plain_colored(state, boolpolybitmap, rgbbitmap, bbox.xmin, bbox.ymin, bbox.xmax, bbox.ymax)) { + return; + } + } checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); rgbdev->fill(state); dbg_newdata("fill");