polygon intersector: added horizontal line reconstruction
[swftools.git] / lib / pdf / BitmapOutputDev.cc
index 8d762cf..4f88282 100644 (file)
@@ -153,8 +153,9 @@ void BitmapOutputDev::setParameter(const char*key, const char*value)
     }
     this->gfxdev->setParameter(key, value);
 }
-void BitmapOutputDev::preparePage(int pdfpage, int outputpage)
+void BitmapOutputDev::setPageMap(int*page2page, int num_pages)
 {
+    this->gfxdev->setPageMap(page2page, num_pages);
 }
 
 static void getBitmapBBox(Guchar*alpha, int width, int height, int*xmin, int*ymin, int*xmax, int*ymax)
@@ -293,6 +294,30 @@ void BitmapOutputDev::flushText()
     this->emptypage = 0;
 }
 
+void writeMonoBitmap(SplashBitmap*btm, char*filename)
+{
+    int width8 = (btm->getWidth()+7)/8;
+    int width = btm->getWidth();
+    int height = btm->getHeight();
+    gfxcolor_t*b = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height);
+    unsigned char*data = btm->getDataPtr();
+    int x,y;
+    for(y=0;y<height;y++) {
+        unsigned char*l = &data[width8*y];
+        gfxcolor_t*d = &b[width*y];
+        for(x=0;x<width;x++) {
+            if(l[x>>3]&(128>>(x&7))) {
+                d[x].r = d[x].g = d[x].b = 255;
+            } else {
+                d[x].r = d[x].g = d[x].b = 0;
+            }
+            d[x].a = 255;
+        }
+    }
+    writePNG(filename, (unsigned char*)b, width, height);
+    free(b);
+}
+
 void writeBitmap(SplashBitmap*bitmap, char*filename)
 {
     int y,x;
@@ -302,9 +327,10 @@ void writeBitmap(SplashBitmap*bitmap, char*filename)
 
     gfxcolor_t*data = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height);
 
-    unsigned char aa=0;
-    if(bitmap->getMode()==splashModeMono1)
-        aa=255;
+    if(bitmap->getMode()==splashModeMono1) {
+        writeMonoBitmap(bitmap, filename);
+        return;
+    }
 
     for(y=0;y<height;y++) {
        gfxcolor_t*line = &data[y*width];
@@ -314,12 +340,7 @@ void writeBitmap(SplashBitmap*bitmap, char*filename)
            line[x].r = c[0];
            line[x].g = c[1];
            line[x].b = c[2];
-            if(aa) {
-               line[x].a = aa;
-            } else {
-               int a = bitmap->getAlpha(x,y);
-               line[x].a = a;
-            }
+           line[x].a =  bitmap->getAlpha(x,y);
        }
     }
     writePNG(filename, (unsigned char*)data, width, height);
@@ -334,7 +355,7 @@ void writeAlpha(SplashBitmap*bitmap, char*filename)
     int height = bitmap->getHeight();
     
     if(bitmap->getMode()==splashModeMono1) {
-        writeBitmap(bitmap, filename);
+        writeMonoBitmap(bitmap, filename);
         return;
     }
 
@@ -396,13 +417,13 @@ GBool BitmapOutputDev::checkNewText(int x1, int y1, int x2, int y2)
    
     msg("<trace> Testing new text data against current bitmap data, state=%s, counter=%d\n", STATE_NAME[layerstate], dbg_btm_counter);
     
-    char filename1[80];
-    char filename2[80];
-    char filename3[80];
-    sprintf(filename1, "state%dboolbitmap_afternewtext.png", dbg_btm_counter);
-    sprintf(filename2, "state%dbooltext_afternewtext.png", dbg_btm_counter);
-    sprintf(filename3, "state%dbitmap_afternewtext.png", dbg_btm_counter);
     if(0) {
+        char filename1[80];
+        char filename2[80];
+        char filename3[80];
+        sprintf(filename1, "state%dboolbitmap_afternewtext.png", dbg_btm_counter);
+        sprintf(filename2, "state%dbooltext_afternewtext.png", dbg_btm_counter);
+        sprintf(filename3, "state%dbitmap_afternewtext.png", dbg_btm_counter);
         msg("<verbose> %s %s %s", filename1, filename2, filename3);
        writeAlpha(boolpolybitmap, filename1);
        writeAlpha(booltextbitmap, filename2);
@@ -455,14 +476,13 @@ GBool BitmapOutputDev::checkNewBitmap(int x1, int y1, int x2, int y2)
     /* similar to checkNewText() above, only in reverse */
     msg("<trace> Testing new graphics data against current text data, state=%s, counter=%d\n", STATE_NAME[layerstate], dbg_btm_counter);
 
-    char filename1[80];
-    char filename2[80];
-    char filename3[80];
-    sprintf(filename1, "state%dboolbitmap_afternewgfx.png", dbg_btm_counter);
-    sprintf(filename2, "state%dbooltext_afternewgfx.png", dbg_btm_counter);
-    sprintf(filename3, "state%dbitmap_afternewgfx.png", dbg_btm_counter);
-
-    if(dbg_btm_counter==12) {
+    if(0) {
+        char filename1[80];
+        char filename2[80];
+        char filename3[80];
+        sprintf(filename1, "state%dboolbitmap_afternewgfx.png", dbg_btm_counter);
+        sprintf(filename2, "state%dbooltext_afternewgfx.png", dbg_btm_counter);
+        sprintf(filename3, "state%dbitmap_afternewgfx.png", dbg_btm_counter);
         msg("<verbose> %s %s %s", filename1, filename2, filename3);
        writeAlpha(boolpolybitmap, filename1);
        writeAlpha(booltextbitmap, filename2);
@@ -542,7 +562,7 @@ GBool BitmapOutputDev::clip0and1differ(int x1,int y1,int x2,int y2)
        int width8 = (width+7)/8;
        int height = clip0bitmap->getHeight();
 
-        if(fixBBox(&x1,&y1,&x2,&y2,width,height)) {
+        if(!fixBBox(&x1,&y1,&x2,&y2,width,height)) {
             /* area is outside or null */
             return gFalse;
         }
@@ -555,9 +575,10 @@ GBool BitmapOutputDev::clip0and1differ(int x1,int y1,int x2,int y2)
 
        for(y=y1;y<y2;y++) {
            unsigned char*row1 = &clip0bitmap->getDataPtr()[width8*y+x18];
-           unsigned char*row2 = &clip1bitmap->getDataPtr()[width8*y+x28];
-           if(memcmp(row1, row2, x28-x18))
+           unsigned char*row2 = &clip1bitmap->getDataPtr()[width8*y+x18];
+           if(memcmp(row1, row2, x28-x18)) {
                return gTrue;
+            }
        }
        return gFalse;
     } else {
@@ -695,11 +716,8 @@ GBool BitmapOutputDev::intersection(int x1, int y1, int x2, int y2)
         unsigned char*data2 = (unsigned char*)textpixels;
         msg("<verbose> Testing area (%d,%d,%d,%d), runx=%d,runy=%d", x1,y1,x2,y2, runx, runy);
         for(y=0;y<runy;y++) {
-            compare8(data1,data2,runx);
-            /*for(x=0;x<runx;x++) {
-                if(data1[x]&data2[x])
-                    return gTrue;
-            }*/
+            if(compare8(data1,data2,runx))
+                return gTrue;
             data1+=width8;
             data2+=width8;
         }
@@ -1394,7 +1412,9 @@ void BitmapOutputDev::drawChar(GfxState *state, double x, double y,
    
        /* calculate the bbox of this character */
        int x1 = (int)x, x2 = (int)x+1, y1 = (int)y, y2 = (int)y+1;
-       SplashPath*path = clip0dev->getCurrentFont()->getGlyphPath(code);
+        SplashFont*font = clip0dev->getCurrentFont();
+       SplashPath*path = font?font->getGlyphPath(code):NULL;
+
         if(!path) {
             if(code)
                 msg("<error> couldn't create outline for char %d", code);
@@ -1430,6 +1450,7 @@ void BitmapOutputDev::drawChar(GfxState *state, double x, double y,
                state->setRender(oldrender);
            }
        } else {
+
            /* this char is not at all affected by clipping. 
               Now just dump out the bitmap we're currently working on, if necessary. */
            booltextdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen);