X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Frender.c;h=a1120570dc304d1ae0174e4d625fbe87eb46353b;hb=a8a93d7d39b3cc82a25d99c9c639c97a5facbfec;hp=36d26a6f0f1670a24bd140f5b8a84fe557606772;hpb=f1ed62cead95b1370e4282c2bf3303aa2d75803a;p=chaz%2Fopenbox diff --git a/render/render.c b/render/render.c index 36d26a6f..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,15 +38,27 @@ 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; + gint i, transferred = 0, sw, sh, partial_w, partial_h; RrPixel32 *source, *dest; Pixmap oldp; 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 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); @@ -72,11 +85,22 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) g_assert (a->surface.parent->w); sw = a->surface.parent->w; + sh = a->surface.parent->h; + source = (a->surface.parent->surface.pixel_data + a->surface.parentx + sw * a->surface.parenty); dest = a->surface.pixel_data; - for (i = 0; i < h; i++, source += sw, dest += w) { - memcpy(dest, source, w * sizeof(RrPixel32)); + + if (a->surface.parentx + w > sw) { + partial_w = sw - a->surface.parentx; + } else partial_w = w; + + if (a->surface.parenty + h > sh) { + partial_h = sh - a->surface.parenty; + } else partial_h = h; + + for (i = 0; i < partial_h; i++, source += sw, dest += w) { + memcpy(dest, source, partial_w * sizeof(RrPixel32)); } } else RrRender(a, w, h); @@ -94,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) { @@ -107,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, @@ -120,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); @@ -137,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); } @@ -255,7 +291,7 @@ void RrAppearanceFree(RrAppearance *a) RrColorFree(p->bevel_dark); RrColorFree(p->bevel_light); g_free(p->pixel_data); - + p->pixel_data = NULL; g_free(a); } } @@ -325,10 +361,14 @@ 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; case RR_TEXTURE_RGBA: *w += MAX(*w, a->texture[i].data.rgba.width); @@ -352,12 +392,12 @@ void RrMinsize(RrAppearance *a, gint *w, gint *h) if (*h < 1) *h = 1; } -void reverse_bits(gchar *c, gint n) +static void reverse_bits(gchar *c, gint n) { gint i; - for (i = 0; i < n; i++) - *c++ = (((*c * 0x0802UL & 0x22110UL) | - (*c * 0x8020UL & 0x88440UL)) * 0x10101UL) >> 16; + for (i = 0; i < n; i++, c++) + *c = (((*c * 0x0802UL & 0x22110UL) | + (*c * 0x8020UL & 0x88440UL)) * 0x10101UL) >> 16; } gboolean RrPixmapToRGBA(const RrInstance *inst,