int ymax = b->ymax;
/* 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);
+ msg("<verbose> Flushing bitmap (bbox: %d,%d,%d,%d %dx%d) (clipped against %d,%d,%d,%d)", xmin,ymin,xmax,ymax, xmax-xmin, ymax-ymin,
+ -this->movex, -this->movey, -this->movex+this->width, -this->movey+this->height);
+
+ if(xmin < -this->movex) {
+ xmin = -this->movex;
+ if(xmax < -this->movex) continue;
+ }
+ if(ymin < -this->movey) {
+ ymin = -this->movey;
+ if(ymax < -this->movey) continue;
+ }
+ if(xmax >= -this->movex + this->width) {
+ xmax = -this->movex+this->width;
+ if(xmin >= -this->movex + this->width) continue;
+ }
+ if(ymax >= -this->movey + this->height) {
+ ymax = -this->movey+this->height;
+ if(ymin >= -this->movey + this->height) continue;
+ }
if((xmax-xmin)<=0 || (ymax-ymin)<=0) // no bitmap, nothing to do
continue;
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;
}
}
}
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);
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();
boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen);
booltextdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen);
clip1dev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen);
+ } else if(state->getRender()&RENDER_STROKE) {
+ // we're drawing as stroke
+ boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen);
+ rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen);
} else if(rgbbitmap != rgbdev->getBitmap()) {
// we're doing softmasking or transparency grouping
boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen);