fixed bitmap overflow bug in poly2bitmap
[swftools.git] / lib / pdf / BitmapOutputDev.cc
index e1cb3d3..c9bcbb2 100644 (file)
@@ -216,8 +216,8 @@ void BitmapOutputDev::flushBitmap()
        /* clip against (-movex, -movey, -movex+width, -movey+height) */
        if(xmin < -this->movex) xmin = -this->movex;
        if(ymin < -this->movey) ymin = -this->movey;
-       if(xmax > -this->movex + width) xmax = -this->movex+this->width;
-       if(ymax > -this->movey + height) ymax = -this->movey+this->height;
+       if(xmax > -this->movex + this->width) xmax = -this->movex+this->width;
+       if(ymax > -this->movey + this->height) ymax = -this->movey+this->height;
 
        msg("<verbose> Flushing bitmap (bbox: %d,%d,%d,%d)", xmin,ymin,xmax,ymax);
        
@@ -468,13 +468,35 @@ static void update_bitmap(SplashBitmap*bitmap, SplashBitmap*update, int x1, int
            u += width8;
        }
     } else {
-       int x,y;
-       for(y=0;y<yspan;y++) {
-           for(x=0;x<xspan;x++) {
-               b[x] |= u[x];
+       if(((ptroff_t)b&7)==((ptroff_t)u&7)) {
+           int x,y;
+           for(y=0;y<yspan;y++) {
+               Guchar*e1 = b+xspan-8;
+               Guchar*e2 = b+xspan;
+               while(((ptroff_t)b&7) && b<e1) {
+                   *b |= *u;
+                   b++;u++;
+               }
+               while(b<e1) {
+                   *(long long*)b |= *(long long*)u;
+                   b+=8;u+=8;
+               }
+               while(b<e2) {
+                   *b |= *u;
+                   b++;u++;
+               }
+               b += width8-xspan;
+               u += width8-xspan;
+           }
+       } else {
+           int x,y;
+           for(y=0;y<yspan;y++) {
+               for(x=0;x<xspan;x++) {
+                   b[x] |= u[x];
+               }
+               b += width8;
+               u += width8;
            }
-           b += width8;
-           u += width8;
        }
     }
 }
@@ -822,7 +844,6 @@ void BitmapOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, do
     this->width = (int)(x2-x1);
     this->height = (int)(y2-y1);
 
-    msg("<debug> startPage");
     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);
@@ -837,6 +858,8 @@ void BitmapOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, do
     booltextbitmap = booltextdev->getBitmap();
     staletextbitmap = new SplashBitmap(booltextbitmap->getWidth(), booltextbitmap->getHeight(), 1, booltextbitmap->getMode(), 0);
     assert(staletextbitmap->getRowSize() == booltextbitmap->getRowSize());
+    
+    msg("<debug> startPage %dx%d (%dx%d)", this->width, this->height, booltextbitmap->getWidth(), booltextbitmap->getHeight());
 
     clip0bitmap = clip0dev->getBitmap();
     clip1bitmap = clip1dev->getBitmap();