X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fpdf%2FBitmapOutputDev.cc;h=a85876582719502adcfac67a2db37c3e01654f8c;hp=29cf789a0cdcb8419213e4473fcd41ce6d65b252;hb=3bf6a6c26f5dda79b6de3b236c9867fcf6a3f17b;hpb=f32de5188d6ec5a3b70ced18669e27e0b250bf50 diff --git a/lib/pdf/BitmapOutputDev.cc b/lib/pdf/BitmapOutputDev.cc index 29cf789..a858765 100644 --- a/lib/pdf/BitmapOutputDev.cc +++ b/lib/pdf/BitmapOutputDev.cc @@ -81,7 +81,6 @@ BitmapOutputDev::BitmapOutputDev(InfoOutputDev*info, PDFDoc*doc) this->gfxdev->setDevice(this->gfxoutput); this->config_extrafontdata = 0; - this->config_skewedtobitmap = 0; this->config_optimizeplaincolorfills = 0; this->bboxpath = 0; //this->clipdev = 0; @@ -175,8 +174,8 @@ static int dbg_btm_counter=1; void BitmapOutputDev::flushBitmap() { - int width = rgbdev->getBitmapWidth(); - int height = rgbdev->getBitmapHeight(); + int bitmap_width = rgbdev->getBitmapWidth(); + int bitmap_height = rgbdev->getBitmapHeight(); if(sizeof(SplashColor)!=3) { msg(" sizeof(SplashColor)!=3"); @@ -197,7 +196,7 @@ void BitmapOutputDev::flushBitmap() Guchar*alpha = rgbbitmap->getAlphaPtr(); Guchar*alpha2 = stalepolybitmap->getDataPtr(); - int width8 = (stalepolybitmap->getWidth()+7)/8; + int bitmap_width8 = (stalepolybitmap->getWidth()+7)/8; /*char filename[80]; sprintf(filename, "flush%d_mask.png", dbg_btm_counter); @@ -207,14 +206,17 @@ void BitmapOutputDev::flushBitmap() sprintf(filename, "flush%d_bitmap.png", dbg_btm_counter); writeBitmap(rgbbitmap, filename);*/ - ibbox_t* boxes = get_bitmap_bboxes((unsigned char*)alpha, width, height); - ibbox_t*b; + ibbox_t pagebox = {-movex, -movey, -movex + this->width, -movey + this->height, 0}; + ibbox_t bitmapbox = {0, 0, bitmap_width, bitmap_height, 0}; + ibbox_t c = ibbox_clip(&bitmapbox, &pagebox); + ibbox_t* boxes = get_bitmap_bboxes((unsigned char*)(alpha+c.ymin*bitmap_width+c.xmin), c.xmax - c.xmin, c.ymax - c.ymin, bitmap_width); + ibbox_t*b; for(b=boxes;b;b=b->next) { - int xmin = b->xmin; - int ymin = b->ymin; - int xmax = b->xmax; - int ymax = b->ymax; + int xmin = b->xmin - this->movex; + int ymin = b->ymin - this->movey; + int xmax = b->xmax - this->movex; + int ymax = b->ymax - this->movey; /* clip against (-movex, -movey, -movex+width, -movey+height) */ @@ -249,10 +251,10 @@ void BitmapOutputDev::flushBitmap() img->height = rangey; int x,y; for(y=0;ydata[y*rangex]; - Guchar*ain = &alpha[(y+ymin)*width+xmin]; - Guchar*ain2 = &alpha2[(y+ymin)*width8]; + Guchar*ain = &alpha[(y+ymin)*bitmap_width+xmin]; + Guchar*ain2 = &alpha2[(y+ymin)*bitmap_width8]; if(this->emptypage) { for(x=0;x 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 */ @@ -1706,11 +1702,20 @@ gfxbbox_t BitmapOutputDev::getImageBBox(GfxState*state) bbox.ymax=max(bbox.ymax,y); return bbox; } + +GBool invalid_size(int width, int height) +{ + if((U64)width*(U64)height > 0x7fffffffll) + return 1; + return 0; +} + void BitmapOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) { msg(" drawImageMask streamkind=%d", str->getKind()); + if(invalid_size(width,height)) return; CopyStream*cpystr = new CopyStream(str, height * ((width + 7) / 8)); str = cpystr->getStream(); @@ -1727,6 +1732,7 @@ void BitmapOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int *maskColors, GBool inlineImg) { msg(" drawImage streamkind=%d", str->getKind()); + if(invalid_size(width,height)) return; CopyStream*cpystr = new CopyStream(str, height * ((width * colorMap->getNumPixelComps() * colorMap->getBits() + 7) / 8)); str = cpystr->getStream(); @@ -1745,6 +1751,7 @@ void BitmapOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, GBool maskInvert) { msg(" drawMaskedImage streamkind=%d", str->getKind()); + if(invalid_size(width,height)) return; CopyStream*cpystr = new CopyStream(str, height * ((width * colorMap->getNumPixelComps() * colorMap->getBits() + 7) / 8)); str = cpystr->getStream(); @@ -1764,6 +1771,7 @@ void BitmapOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream * GfxImageColorMap *maskColorMap) { msg(" drawSoftMaskedImage %dx%d (%dx%d) streamkind=%d", width, height, maskWidth, maskHeight, str->getKind()); + if(invalid_size(width,height)) return; CopyStream*cpystr = new CopyStream(str, height * ((width * colorMap->getNumPixelComps() * colorMap->getBits() + 7) / 8)); str = cpystr->getStream(); @@ -1786,8 +1794,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,