8 void RrColorInspect(struct RrInstance *i)
10 unsigned long red_mask, green_mask, blue_mask;
11 XImage *timage = NULL;
12 timage = XCreateImage(i->display, i->visual, i->depth,
13 ZPixmap, 0, NULL, 1, 1, 32, 0);
14 g_assert(timage != NULL);
15 /* find the offsets for each color in the visual's masks */
16 i->red_mask = red_mask = timage->red_mask;
17 i->green_mask = green_mask = timage->green_mask;
18 i->blue_mask = blue_mask = timage->blue_mask;
22 while (! (red_mask & 1)) { i->red_offset++; red_mask >>= 1; }
23 while (! (green_mask & 1)) { i->green_offset++; green_mask >>= 1; }
24 while (! (blue_mask & 1)) { i->blue_offset++; blue_mask >>= 1; }
25 i->red_shift = i->green_shift = i->blue_shift = 8;
26 while (red_mask) { red_mask >>= 1; i->red_shift--; }
27 while (green_mask) { green_mask >>= 1; i->green_shift--; }
28 while (blue_mask) { blue_mask >>= 1; i->blue_shift--; }
32 int RrColorParse(struct RrInstance *inst, const char *colorname,
37 if (!XParseColor(RrDisplay(inst), RrColormap(inst), colorname, &xcol)) {
38 RrDebug("unable to parse color '%s'", colorname);
45 ret->r = (xcol.red >> 8) / 255.0;
46 ret->g = (xcol.green >> 8) / 255.0;
47 ret->b = (xcol.blue >> 8) / 255.0;
52 static void swap_byte_order(XImage *im)
56 g_message("SWAPPING BYTE ORDER");
59 for (y = 0; y < im->height; ++y) {
60 for (x = 0; x < im->height; ++x) {
61 char *c = &im->data[di + x * im->bits_per_pixel / 8];
64 switch (im->bits_per_pixel) {
76 g_message("your bit depth is currently unhandled\n");
79 di += im->bytes_per_line;
82 if (im->byte_order == LSBFirst)
83 im->byte_order = MSBFirst;
85 im->byte_order = LSBFirst;
88 void RrIncreaseDepth(struct RrInstance *i, RrData32 *data, XImage *im)
92 RrData32 *p32 = (RrData32 *) im->data;
93 guint16 *p16 = (guint16 *) im->data;
94 unsigned char *p8 = (unsigned char *)im->data;
96 if (im->byte_order != render_endian)
99 switch (im->bits_per_pixel) {
101 for (y = 0; y < im->height; y++) {
102 for (x = 0; x < im->width; x++) {
103 r = (p32[x] >> i->red_offset) & 0xff;
104 g = (p32[x] >> i->green_offset) & 0xff;
105 b = (p32[x] >> i->blue_offset) & 0xff;
106 data[x] = (r << default_red_offset)
107 + (g << default_green_offset)
108 + (b << default_blue_offset)
109 + (0xff << default_alpha_offset);
112 p32 += im->bytes_per_line/4;
116 for (y = 0; y < im->height; y++) {
117 for (x = 0; x < im->width; x++) {
118 r = (p16[x] & i->red_mask) >> i->red_offset <<
120 g = (p16[x] & i->green_mask) >> i->green_offset <<
122 b = (p16[x] & i->blue_mask) >> i->blue_offset <<
124 data[x] = (r << default_red_offset)
125 + (g << default_green_offset)
126 + (b << default_blue_offset)
127 + (0xff << default_alpha_offset);
130 p16 += im->bytes_per_line/2;
134 g_message("this image bit depth is currently unhandled\n");
137 for (y = 0; y < im->height; y++) {
138 for (x = 0; x < im->width; x++) {
139 if (!(((p8[x / 8]) >> (x % 8)) & 0x1))
140 data[x] = 0xff << default_alpha_offset; /* black */
142 data[x] = 0xffffffff; /* white */
145 p8 += im->bytes_per_line;
149 g_message("this image bit depth is currently unhandled\n");
154 gboolean RrPixmapToRGBA(struct RrInstance *inst, Pixmap pmap,
155 Pixmap mask, int *w, int *h, RrData32 **data)
159 guint pw, ph, mw, mh, xb, xd, i, x, y, di;
160 XImage *xi, *xm = NULL;
161 if (!XGetGeometry(inst->display, pmap, &xr, &xx, &xy, &pw, &ph, &xb, &xd))
164 if (!XGetGeometry(inst->display, mask,
165 &xr, &xx, &xy, &mw, &mh, &xb, &xd))
167 if (pw != mw || ph != mh || xd != 1)
170 xi = XGetImage(inst->display, pmap, 0, 0, pw, ph, 0xffffffff, ZPixmap);
174 xm = XGetImage(inst->display, mask, 0, 0, mw, mh, 0xffffffff, ZPixmap);
178 *data = g_new(RrData32, pw * ph);
179 RrIncreaseDepth(inst, *data, xi);
181 /* apply transparency from the mask */
183 for (i = 0, y = 0; y < ph; ++y) {
184 for (x = 0; x < pw; ++x, ++i) {
185 if (!((((unsigned)xm->data[di + x / 8]) >> (x % 8)) & 0x1))
186 (*data)[i] &= ~(0xff << default_alpha_offset);
188 di += xm->bytes_per_line;