renamed png functions
[swftools.git] / lib / pdf / BitmapOutputDev.cc
index 7b7b6a5..52aa798 100644 (file)
@@ -174,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("<error> sizeof(SplashColor)!=3");
@@ -196,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);
@@ -206,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) */
 
@@ -248,10 +251,10 @@ void BitmapOutputDev::flushBitmap()
        img->height = rangey;
        int x,y;
        for(y=0;y<rangey;y++) {
-           SplashColorPtr in=&rgb[((y+ymin)*width+xmin)*sizeof(SplashColor)];
+           SplashColorPtr in=&rgb[((y+ymin)*bitmap_width+xmin)*sizeof(SplashColor)];
            gfxcolor_t*out = &img->data[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<rangex;x++) {
                    /* the first bitmap on the page doesn't need to have an alpha channel-
@@ -347,7 +350,7 @@ void writeMonoBitmap(SplashBitmap*btm, char*filename)
             }
         }
     }
-    writePNG(filename, (unsigned char*)b, width, height);
+    png_write(filename, (unsigned char*)b, width, height);
     free(b);
 }
 
@@ -376,7 +379,7 @@ void writeBitmap(SplashBitmap*bitmap, char*filename)
            line[x].a =  bitmap->getAlpha(x,y);
        }
     }
-    writePNG(filename, (unsigned char*)data, width, height);
+    png_write(filename, (unsigned char*)data, width, height);
     free(data);
 }
 
@@ -404,7 +407,7 @@ void writeAlpha(SplashBitmap*bitmap, char*filename)
            line[x].a = a;
        }
     }
-    writePNG(filename, (unsigned char*)data, width, height);
+    png_write(filename, (unsigned char*)data, width, height);
     free(data);
 }
 
@@ -848,12 +851,24 @@ GBool BitmapOutputDev::intersection(SplashBitmap*boolpoly, SplashBitmap*booltext
     }
 }
 
+GBool BitmapOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI,
+             int rotate, GBool useMediaBox, GBool crop,
+             int sliceX, int sliceY, int sliceW, int sliceH,
+             GBool printing, Catalog *catalog,
+             GBool (*abortCheckCbk)(void *data),
+             void *abortCheckCbkData)
+{
+    this->setPage(page);
+    gfxdev->setPage(page);
+    return gTrue;
+}
 
-void BitmapOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, double crop_y1, double crop_x2, double crop_y2)
+void BitmapOutputDev::startPage(int pageNum, GfxState *state)
 {
+    PDFRectangle *r = this->page->getCropBox();
     double x1,y1,x2,y2;
-    state->transform(crop_x1,crop_y1,&x1,&y1);
-    state->transform(crop_x2,crop_y2,&x2,&y2);
+    state->transform(r->x1,r->y1,&x1,&y1);
+    state->transform(r->x2,r->y2,&x2,&y2);
     if(x2<x1) {double x3=x1;x1=x2;x2=x3;}
     if(y2<y1) {double y3=y1;y1=y2;y2=y3;}
     
@@ -869,12 +884,12 @@ void BitmapOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, do
     this->width = (int)(x2-x1);
     this->height = (int)(y2-y1);
 
-    rgbdev->startPage(pageNum, state, crop_x1, crop_y1, crop_x2, crop_y2);
-    boolpolydev->startPage(pageNum, state, crop_x1, crop_y1, crop_x2, crop_y2);
-    booltextdev->startPage(pageNum, state, crop_x1, crop_y1, crop_x2, crop_y2);
-    clip0dev->startPage(pageNum, state, crop_x1, crop_y1, crop_x2, crop_y2);
-    clip1dev->startPage(pageNum, state, crop_x1, crop_y1, crop_x2, crop_y2);
-    gfxdev->startPage(pageNum, state, crop_x1, crop_y1, crop_x2, crop_y2);
+    rgbdev->startPage(pageNum, state);
+    boolpolydev->startPage(pageNum, state);
+    booltextdev->startPage(pageNum, state);
+    clip0dev->startPage(pageNum, state);
+    clip1dev->startPage(pageNum, state);
+    gfxdev->startPage(pageNum, state);
 
     boolpolybitmap = boolpolydev->getBitmap();
     stalepolybitmap = new SplashBitmap(boolpolybitmap->getWidth(), boolpolybitmap->getHeight(), 1, boolpolybitmap->getMode(), 0);
@@ -987,15 +1002,6 @@ GBool BitmapOutputDev::needNonText()
     clip1dev->needNonText();
     return rgbdev->needNonText();
 }
-/*GBool BitmapOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI,
-                          int rotate, GBool useMediaBox, GBool crop,
-                          int sliceX, int sliceY, int sliceW, int sliceH,
-                          GBool printing, Catalog *catalog,
-                          GBool (*abortCheckCbk)(void *data),
-                          void *abortCheckCbkData)
-{
-    return gTrue;
-}*/
 void BitmapOutputDev::setDefaultCTM(double *ctm) 
 {
     boolpolydev->setDefaultCTM(ctm);
@@ -1699,11 +1705,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("<debug> drawImageMask streamkind=%d", str->getKind());
+    if(invalid_size(width,height)) return;
 
     CopyStream*cpystr = new CopyStream(str, height * ((width + 7) / 8));
     str = cpystr->getStream();
@@ -1720,6 +1735,7 @@ void BitmapOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
                       int *maskColors, GBool inlineImg)
 {
     msg("<debug> 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();
@@ -1738,6 +1754,7 @@ void BitmapOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str,
                             GBool maskInvert)
 {
     msg("<debug> 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();
@@ -1757,6 +1774,7 @@ void BitmapOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *
                                 GfxImageColorMap *maskColorMap)
 {
     msg("<debug> 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();