X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Frender.c;h=a1120570dc304d1ae0174e4d625fbe87eb46353b;hb=f746a4975b1ab7559da3d9db51af14e1c084bc13;hp=5b6cb95feddddb43b0c5f0b0957b9028c6b1f238;hpb=005eb35ee810fbc1edc31a83f298866067be6ef9;p=chaz%2Fopenbox diff --git a/render/render.c b/render/render.c index 5b6cb95f..a1120570 100644 --- a/render/render.c +++ b/render/render.c @@ -1,6 +1,7 @@ /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- render.c for the Openbox window manager + Copyright (c) 2006 Mikael Magnusson Copyright (c) 2003 Ben Jansens Copyright (c) 2003 Derek Foreman @@ -37,7 +38,7 @@ static void pixel_data_to_pixmap(RrAppearance *l, gint x, gint y, gint w, gint h); -void RrPaint(RrAppearance *a, Window win, gint w, gint h) +Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) { gint i, transferred = 0, sw, sh, partial_w, partial_h; RrPixel32 *source, *dest; @@ -45,12 +46,20 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) RrRect tarea; /* area in which to draw textures */ gboolean resized; - if (w <= 0 || h <= 0) return; + if (w <= 0 || h <= 0) return None; if (a->surface.parentx < 0 || a->surface.parenty < 0) { /* ob_debug("Invalid parent co-ordinates\n"); */ - return; + return None; + } + + if (a->surface.grad == RR_SURFACE_PARENTREL && + (a->surface.parentx >= a->surface.parent->w || + a->surface.parenty >= a->surface.parent->h)) + { + return None; } + resized = (a->w != w || a->h != h); oldp = a->pixmap; /* save to free after changing the visible pixmap */ @@ -78,10 +87,6 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) sw = a->surface.parent->w; sh = a->surface.parent->h; - if (a->surface.parentx >= sw || a->surface.parenty >= sh) { - return; - } - source = (a->surface.parent->surface.pixel_data + a->surface.parentx + sw * a->surface.parenty); dest = a->surface.pixel_data; @@ -113,7 +118,8 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) case RR_TEXTURE_TEXT: if (!transferred) { transferred = 1; - if (a->surface.grad != RR_SURFACE_SOLID) + if ((a->surface.grad != RR_SURFACE_SOLID) + || (a->surface.interlaced)) pixel_data_to_pixmap(a, 0, 0, w, h); } if (a->xftdraw == NULL) { @@ -126,7 +132,8 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) case RR_TEXTURE_LINE_ART: if (!transferred) { transferred = 1; - if (a->surface.grad != RR_SURFACE_SOLID) + if ((a->surface.grad != RR_SURFACE_SOLID) + || (a->surface.interlaced)) pixel_data_to_pixmap(a, 0, 0, w, h); } XDrawLine(RrDisplay(a->inst), a->pixmap, @@ -139,7 +146,8 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) case RR_TEXTURE_MASK: if (!transferred) { transferred = 1; - if (a->surface.grad != RR_SURFACE_SOLID) + if ((a->surface.grad != RR_SURFACE_SOLID) + || (a->surface.interlaced)) pixel_data_to_pixmap(a, 0, 0, w, h); } RrPixmapMaskDraw(a->pixmap, &a->texture[i].data.mask, &tarea); @@ -156,12 +164,21 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) if (!transferred) { transferred = 1; - if (a->surface.grad != RR_SURFACE_SOLID) + if ((a->surface.grad != RR_SURFACE_SOLID) || (a->surface.interlaced)) pixel_data_to_pixmap(a, 0, 0, w, h); } + return oldp; +} + +void RrPaint(RrAppearance *a, Window win, gint w, gint h) +{ + Pixmap oldp; + + oldp = RrPaintPixmap(a, w, h); XSetWindowBackgroundPixmap(RrDisplay(a->inst), win, a->pixmap); XClearWindow(RrDisplay(a->inst), win); + /* free this after changing the visible pixmap */ if (oldp) XFreePixmap(RrDisplay(a->inst), oldp); } @@ -344,9 +361,12 @@ void RrMinsize(RrAppearance *a, gint *w, gint *h) break; case RR_TEXTURE_TEXT: m = RrFontMeasureString(a->texture[i].data.text.font, - a->texture[i].data.text.string); + a->texture[i].data.text.string, + a->texture[i].data.text.shadow_offset_x, + a->texture[i].data.text.shadow_offset_y); *w = MAX(*w, m->width + 4); - m->height = RrFontHeight(a->texture[i].data.text.font); + m->height = RrFontHeight(a->texture[i].data.text.font, + a->texture[i].data.text.shadow_offset_y); *h += MAX(*h, m->height); g_free(m); break; @@ -375,7 +395,7 @@ void RrMinsize(RrAppearance *a, gint *w, gint *h) static void reverse_bits(gchar *c, gint n) { gint i; - for (i = 0; i < n; i++, *c++) + for (i = 0; i < n; i++, c++) *c = (((*c * 0x0802UL & 0x22110UL) | (*c * 0x8020UL & 0x88440UL)) * 0x10101UL) >> 16; }