all repos — openbox @ 8ebf2b6a3f095a7404bac3a2867355f33c1582d4

openbox fork - make it a bit more like ryudo

Fix reduce color depth to not use original data
(and break parentrel)
Derek Foreman manmower@gmail.com
commit

8ebf2b6a3f095a7404bac3a2867355f33c1582d4

parent

70e4138169f19102854bca49d4f55708fabcbbbf

2 files changed, 16 insertions(+), 9 deletions(-)

jump to
M render/color.crender/color.c

@@ -65,12 +65,11 @@ }

void reduce_depth(pixel32 *data, XImage *im) { - /* since pixel32 is the largest possible pixel size, we can share the - array*/ int r, g, b; int x,y; - pixel16 *p16 = (pixel16*) data; - unsigned char *p8 = (unsigned char *)data; + pixel32 *p32 = (pixel32 *) im->data; + pixel16 *p16 = (pixel16 *) im->data; + unsigned char *p8 = (unsigned char *)im->data; switch (im->bits_per_pixel) { case 32: if ((render_red_offset != default_red_shift) ||

@@ -81,12 +80,14 @@ for (x = 0; x < im->width; x++) {

r = (data[x] >> default_red_shift) & 0xFF; g = (data[x] >> default_green_shift) & 0xFF; b = (data[x] >> default_blue_shift) & 0xFF; - data[x] = (r << render_red_offset) + (g << render_green_offset) + - (b << render_blue_offset); + p32[x] = (r << render_red_offset) + + (g << render_green_offset) + + (b << render_blue_offset); } data += im->width; + p32 += im->width; } - } + } else im->data = data; break; case 16: for (y = 0; y < im->height; y++) {
M render/render.crender/render.c

@@ -377,17 +377,23 @@

void pixel32_to_pixmap(pixel32 *in, Pixmap out, int x, int y, int w, int h) { + unsigned char *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->data = (char *)in; - reduce_depth((pixel32*)im->data, im); +/* 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)); + im->data = 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); } void appearance_minsize(Appearance *l, Size *s)