diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-05-18 23:06:11 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-05-18 23:06:11 +0000 |
| commit | a18c1697b1176c26e74267f2ac7a153a2cf2c442 (patch) | |
| tree | 04d62a0bd4d4f15fe2bbf05e8809755c552753ac /render/render.c | |
| parent | f41d06f583b0461446aeac93551a2e0931d50ac0 (diff) | |
make icons use pixel32 data, and image_draw takes pixel32 data.
client.c gets pixmap icons as a backup to netwm ones, and they are converted into pixel32 data.
Diffstat (limited to 'render/render.c')
| -rw-r--r-- | render/render.c | 70 |
1 files changed, 57 insertions, 13 deletions
diff --git a/render/render.c b/render/render.c index a1022bd0..cfad7143 100644 --- a/render/render.c +++ b/render/render.c @@ -19,6 +19,7 @@ Visual *render_visual; Colormap render_colormap; int render_red_offset = 0, render_green_offset = 0, render_blue_offset = 0; int render_red_shift, render_green_shift, render_blue_shift; +int render_red_mask, render_green_mask, render_blue_mask; void render_startup(void) { @@ -87,9 +88,9 @@ void truecolor_startup(void) ZPixmap, 0, NULL, 1, 1, 32, 0); g_assert(timage != NULL); /* find the offsets for each color in the visual's masks */ - red_mask = timage->red_mask; - green_mask = timage->green_mask; - blue_mask = timage->blue_mask; + render_red_mask = red_mask = timage->red_mask; + render_green_mask = green_mask = timage->green_mask; + render_blue_mask = blue_mask = timage->blue_mask; render_red_offset = 0; render_green_offset = 0; @@ -117,7 +118,7 @@ void pseudocolor_startup(void) /* determine the number of colors and the bits-per-color */ pseudo_bpc = 2; /* XXX THIS SHOULD BE A USER OPTION */ g_assert(pseudo_bpc >= 1); - _ncolors = 1 << (pseudo_bpc * 3); + _ncolors = pseudo_ncolors(); if (_ncolors > 1 << render_depth) { g_warning("PseudoRenderControl: Invalid colormap size. Resizing.\n"); @@ -166,7 +167,9 @@ void pseudocolor_startup(void) g = (pseudo_colors[i].green - icolors[ii].green) & 0xff; b = (pseudo_colors[i].blue - icolors[ii].blue) & 0xff; /* find a weighted absolute deviation */ - dev = (r * r) + (g * g) + (b * b); + dev = (r * r) * (0xff - (icolors[ii].red & 0xff)) + + (g * g) * (0xff - (icolors[ii].green & 0xff)) + + (b * b) * (0xff - (icolors[ii].blue & 0xff)); if (dev < closest) { closest = dev; @@ -400,23 +403,23 @@ void appearance_free(Appearance *a) void pixel32_to_pixmap(pixel32 *in, Pixmap out, int x, int y, int w, int h) { - unsigned char *scratch; + pixel32 *scratch; XImage *im = NULL; im = XCreateImage(ob_display, render_visual, render_depth, ZPixmap, 0, NULL, w, h, 32, 0); g_assert(im != NULL); - im->byte_order = endian; + im->byte_order = render_endian; /* this malloc is a complete waste of time on normal 32bpp as reduce_depth just sets im->data = data and returns */ - scratch = malloc(im->width * im->height * sizeof(pixel32)); + scratch = g_new(pixel32, im->width * im->height); im->data = (char*) scratch; reduce_depth(in, im); XPutImage(ob_display, out, DefaultGC(ob_display, ob_screen), im, 0, 0, x, y, w, h); im->data = NULL; XDestroyImage(im); - free(scratch); + g_free(scratch); } void appearance_minsize(Appearance *l, int *w, int *h) @@ -468,9 +471,50 @@ void appearance_minsize(Appearance *l, int *w, int *h) } } -void render_pixmap_to_rgba(Pixmap pmap, Pixmap mask, - int *w, int *h, gulong **data) +gboolean render_pixmap_to_rgba(Pixmap pmap, Pixmap mask, + int *w, int *h, pixel32 **data) { - *w = *h = 0; - *data = NULL; + Window xr; + int xx, xy; + guint pw, ph, mw, mh, xb, xd, i, x, y, di; + XImage *xi, *xm = NULL; + + if (!XGetGeometry(ob_display, pmap, &xr, &xx, &xy, &pw, &ph, &xb, &xd)) + return FALSE; + if (mask) { + if (!XGetGeometry(ob_display, mask, &xr, &xx, &xy, &mw, &mh, &xb, &xd)) + return FALSE; + if (pw != mw || ph != mh || xd != 1) + return FALSE; + } + + xi = XGetImage(ob_display, pmap, 0, 0, pw, ph, 0xffffffff, ZPixmap); + if (!xi) + return FALSE; + + if (mask) { + xm = XGetImage(ob_display, mask, 0, 0, mw, mh, 0xffffffff, ZPixmap); + if (!xm) + return FALSE; + } + + *data = g_new(pixel32, pw * ph); + increase_depth(*data, xi); + + if (mask) { + /* apply transparency from the mask */ + di = 0; + for (i = 0, y = 0; y < ph; ++y) { + for (x = 0; x < pw; ++x, ++i) { + if (!((((unsigned)xm->data[di + x / 8]) >> (x % 8)) & 0x1)) + (*data)[i] &= ~(0xff << default_alpha_offset); + } + di += xm->bytes_per_line; + } + } + + *w = pw; + *h = ph; + + return TRUE; } |
