}
assert(sm->lshift < LONG_BIT);
assert(sm->rshift < LONG_BIT);
+ debugf("SHIFTMASK %p={.lshift=%d, .rshift=%d} image_mask=%lx\n",
+ sm, sm->lshift, sm->rshift, ximage_mask);
}
static void rtimestamp(double *t, const char *wh) {
int x,y,i;
unsigned char *op= (*output)->data;
for (y=0; y<wheight; y++) {
- for (x=0; x<wwidth; x++) {
- long xrgb= XGetPixel(im_use,x,y);
- for (i=0; i<3; i++) {
- unsigned long sample=
- ((xrgb << shiftmasks[i].lshift) >> shiftmasks[i].rshift)
- & SAMPLEMASK;
- *op++= sample;
+ if (im_use->xoffset == 0 &&
+ im_use->format == ZPixmap &&
+ im_use->byte_order == LSBFirst &&
+ im_use->depth == 24 &&
+ im_use->bits_per_pixel == 32 &&
+ im_use->red_mask == 0x0000ffU &&
+ im_use->green_mask == 0x00ff00U &&
+ im_use->blue_mask == 0xff0000U) {
+ const char *p= im_use->data + y * im_use->bytes_per_line;
+// debugf("optimised copy y=%d",y);
+ for (x=0; x<wwidth; x++) {
+ *op++ = *p++;
+ *op++ = *p++;
+ *op++ = *p++;
+ p++;
+ }
+ } else {
+ for (x=0; x<wwidth; x++) {
+ long xrgb= XGetPixel(im_use,x,y);
+ for (i=0; i<3; i++) {
+ unsigned long sample=
+ ((xrgb << shiftmasks[i].lshift) >> shiftmasks[i].rshift)
+ & SAMPLEMASK;
+ *op++= sample;
+ }
}
}
}
if (!(wwidth >= 320 && wheight >= 320))
fatal("YPP client window is implausibly small?");
+ if (attr.depth < 24)
+ fatal("Display is not 24bpp.");
+
check_client_window_all_on_screen();
Bool shmpixmaps=0;
unsigned char *pixel= sn->data;
CANONICALISE_IMAGE(im, sn->w, sn->h, {
- rgb=
- (pixel[0] << 16) |
- (pixel[1] << 8) |
- (pixel[2] );
- pixel += 3;
+ r= *pixel++;
+ g= *pixel++;
+ b= *pixel++;
});
sysassert(!ferror(screenshot_file));