static int get_rgb_shifts(void) { get_shifts(xwa.visual->red_mask, &r_pos, &r_size, &r_scale); get_shifts(xwa.visual->green_mask, &g_pos, &g_size, &g_scale); get_shifts(xwa.visual->blue_mask, &b_pos, &b_size, &b_scale); return (1 << r_size) * (1 << g_size) * (1 << b_size); }
action* parse_actions(int stateno) { register action *actions; actions = get_shifts(stateno); actions = add_reductions(stateno, actions); return (actions); }
RImage *RCreateImageFromXImage(RContext * context, XImage * image, XImage * mask) { RImage *img; int x, y; unsigned long pixel; unsigned char *data; int rshift, gshift, bshift; int rmask, gmask, bmask; assert(image != NULL); assert(image->format == ZPixmap); assert(!mask || mask->format == ZPixmap); img = RCreateImage(image->width, image->height, mask != NULL); if (!img) { return NULL; } /* I don't know why, but XGetImage() for pixmaps don't set the * {red,green,blue}_mask values correctly. */ if (context->depth == image->depth) { rmask = context->visual->red_mask; gmask = context->visual->green_mask; bmask = context->visual->blue_mask; } else { rmask = image->red_mask; gmask = image->green_mask; bmask = image->blue_mask; } /* how many bits to shift to normalize the color into 8bpp */ rshift = get_shifts(rmask) - 8; gshift = get_shifts(gmask) - 8; bshift = get_shifts(bmask) - 8; data = img->data; if (image->depth == 1) { for (y = 0; y < image->height; y++) { for (x = 0; x < image->width; x++) { pixel = XGetPixel(image, x, y); if (pixel) { *data++ = 0; *data++ = 0; *data++ = 0; } else { *data++ = 0xff; *data++ = 0xff; *data++ = 0xff; } if (mask) data++; } } } else { for (y = 0; y < image->height; y++) { for (x = 0; x < image->width; x++) { pixel = XGetPixel(image, x, y); *(data++) = NORMALIZE_RED(pixel); *(data++) = NORMALIZE_GREEN(pixel); *(data++) = NORMALIZE_BLUE(pixel); if (mask) data++; } } } #define MIN(a,b) ((a)<(b)?(a):(b)) if (mask) { data = img->data + 3; /* Skip R, G & B */ for (y = 0; y < MIN(mask->height, image->height); y++) { for (x = 0; x < MIN(mask->width, image->width); x++) { if (mask->width <= image->width && XGetPixel(mask, x, y)) { *data = 0xff; } else { *data = 0; } data += 4; } for (; x < image->width; x++) { *data = 0; data += 4; } } for (; y < image->height; y++) { for (x = 0; x < image->width; x++) { *data = 0; data += 4; } } } return img; }