X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fpdf%2FBitmapOutputDev.cc;h=7b7b6a564c5f6ae5ef4a86be3260386570c1d33c;hb=70ce1703acd71940235f2db58840c21d2a697003;hp=320fc3ff3937a7f836fcbb28f171c133c5eaa9c1;hpb=52cd86c5fb2bcf5a31b2e34a6efae34a81d59642;p=swftools.git diff --git a/lib/pdf/BitmapOutputDev.cc b/lib/pdf/BitmapOutputDev.cc index 320fc3f..7b7b6a5 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; } @@ -903,13 +914,7 @@ void BitmapOutputDev::finishPage() msg(" finishPage (BitmapOutputDev)"); gfxdev->endPage(); - if(layerstate == STATE_BITMAP_IS_ABOVE) { - this->flushText(); - this->flushBitmap(); - } else { - this->flushBitmap(); - this->flushText(); - } + flushEverything(); /* splash will now destroy alpha, and paint the background color into the "holes" in the bitmap */ @@ -1335,11 +1340,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"); @@ -1474,6 +1515,10 @@ void BitmapOutputDev::drawChar(GfxState *state, double x, double y, boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); booltextdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); clip1dev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + } else if(state->getRender()&RENDER_STROKE) { + // we're drawing as stroke + boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); } else if(rgbbitmap != rgbdev->getBitmap()) { // we're doing softmasking or transparency grouping boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); @@ -1734,8 +1779,19 @@ void BitmapOutputDev::drawForm(Ref id) void BitmapOutputDev::processLink(Link *link, Catalog *catalog) { msg(" processLink"); + flushEverything(); gfxdev->processLink(link, catalog); } +void BitmapOutputDev::flushEverything() +{ + if(layerstate == STATE_BITMAP_IS_ABOVE) { + this->flushText(); + this->flushBitmap(); + } else { + this->flushBitmap(); + this->flushText(); + } +} void BitmapOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, GfxColorSpace *blendingColorSpace,