- if(sizeof(SplashColor)!=3) {
- msg("<error> sizeof(SplashColor)!=3");
- return;
- }
- //xmin = ymin = 0;
- //xmax = width;
- //ymax = height;
-
- int rangex = xmax-xmin;
- int rangey = ymax-ymin;
- gfximage_t*img = (gfximage_t*)malloc(sizeof(gfximage_t));
- img->data = (gfxcolor_t*)malloc(rangex * rangey * 4);
- img->width = rangex;
- img->height = rangey;
- int x,y;
- for(y=0;y<rangey;y++) {
- SplashColorPtr in=&rgb[((y+ymin)*width+xmin)*sizeof(SplashColor)];
- gfxcolor_t*out = &img->data[y*rangex];
- Guchar*ain = &alpha[(y+ymin)*width+xmin];
- Guchar*ain2 = &alpha2[(y+ymin)*width+xmin];
- if(this->emptypage) {
- for(x=0;x<rangex;x++) {
- /* the first bitmap on the page doesn't need to have an alpha channel-
- blend against a white background*/
- out[x].r = (in[x*3+0]*ain[x])/255 + 255-ain[x];
- out[x].g = (in[x*3+1]*ain[x])/255 + 255-ain[x];
- out[x].b = (in[x*3+2]*ain[x])/255 + 255-ain[x];
- out[x].a = 255;
- }
- } else {
- for(x=0;x<rangex;x++) {
- /*
- if(!ain2[x]) {
- out[x].r = 0;out[x].g = 0;out[x].b = 0;out[x].a = 0;
- } else {*/
-
- /* according to endPage()/compositeBackground() in xpdf/SplashOutputDev.cc, we
- have to premultiply alpha (mix background and pixel according to the alpha channel).
- */
- out[x].r = (in[x*3+0]*ain[x])/255;
- out[x].g = (in[x*3+1]*ain[x])/255;
- out[x].b = (in[x*3+2]*ain[x])/255;
- out[x].a = ain[x];
+ /* 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;
+
+ msg("<verbose> Flushing bitmap (bbox: %d,%d,%d,%d)", xmin,ymin,xmax,ymax);
+
+ if((xmax-xmin)<=0 || (ymax-ymin)<=0) // no bitmap, nothing to do
+ continue;
+
+ int rangex = xmax-xmin;
+ int rangey = ymax-ymin;
+ gfximage_t*img = (gfximage_t*)malloc(sizeof(gfximage_t));
+ img->data = (gfxcolor_t*)malloc(rangex * rangey * 4);
+ img->width = rangex;
+ img->height = rangey;
+ int x,y;
+ for(y=0;y<rangey;y++) {
+ SplashColorPtr in=&rgb[((y+ymin)*width+xmin)*sizeof(SplashColor)];
+ gfxcolor_t*out = &img->data[y*rangex];
+ Guchar*ain = &alpha[(y+ymin)*width+xmin];
+ Guchar*ain2 = &alpha2[(y+ymin)*width8];
+ if(this->emptypage) {
+ for(x=0;x<rangex;x++) {
+ /* the first bitmap on the page doesn't need to have an alpha channel-
+ blend against a white background*/
+ out[x].r = (in[x*3+0]*ain[x])/255 + 255-ain[x];
+ out[x].g = (in[x*3+1]*ain[x])/255 + 255-ain[x];
+ out[x].b = (in[x*3+2]*ain[x])/255 + 255-ain[x];
+ out[x].a = 255;
+ }
+ } else {
+ for(x=0;x<rangex;x++) {
+ if(!(ain2[(x+xmin)/8]&(0x80>>((x+xmin)&7)))) {
+ /* cut away pixels that we don't remember drawing (i.e., that are
+ not in the monochrome bitmap). Prevents some "hairlines" showing
+ up to the left and right of bitmaps. */
+ out[x].r = 0;out[x].g = 0;out[x].b = 0;out[x].a = 0;
+ } else {
+ /* according to endPage()/compositeBackground() in xpdf/SplashOutputDev.cc, we
+ have to premultiply alpha (mix background and pixel according to the alpha channel).
+ */
+ out[x].r = (in[x*3+0]*ain[x])/255;
+ out[x].g = (in[x*3+1]*ain[x])/255;
+ out[x].b = (in[x*3+2]*ain[x])/255;
+ out[x].a = ain[x];
+ }
+ }