X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Frender.c;h=8623455f6c06091e6c55335ca48531eb393b8f5b;hb=959fff5e1cda35b0a1569ef323aab3129db3cb1f;hp=df47d6dbe8f3d7d234bce61e9a41a192da399412;hpb=a79651294c54a784b34c85e3832e8c7ca4f3aa17;p=chaz%2Fopenbox diff --git a/render/render.c b/render/render.c index df47d6db..8623455f 100644 --- a/render/render.c +++ b/render/render.c @@ -2,7 +2,7 @@ render.c for the Openbox window manager Copyright (c) 2006 Mikael Magnusson - Copyright (c) 2003 Ben Jansens + Copyright (c) 2003-2007 Dana Jansens Copyright (c) 2003 Derek Foreman This program is free software; you can redistribute it and/or modify @@ -18,9 +18,6 @@ See the COPYING file for a copy of the GNU General Public License. */ -#include -#include - #include "render.h" #include "gradient.h" #include "font.h" @@ -30,6 +27,9 @@ #include "theme.h" #include +#include +#include +#include #ifdef HAVE_STDLIB_H # include @@ -40,9 +40,9 @@ static void pixel_data_to_pixmap(RrAppearance *l, Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) { - gint i, transferred = 0, sw, sh, partial_w, partial_h; + gint i, transferred = 0, sw, sh, partial_w, partial_h, force_transfer = 0; RrPixel32 *source, *dest; - Pixmap oldp; + Pixmap oldp = None; RrRect tarea; /* area in which to draw textures */ gboolean resized; @@ -52,6 +52,14 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) /* 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); oldp = a->pixmap; /* save to free after changing the visible pixmap */ @@ -69,8 +77,10 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) RrVisual(a->inst), RrColormap(a->inst)); g_assert(a->xftdraw != NULL); - g_free(a->surface.pixel_data); - a->surface.pixel_data = g_new(RrPixel32, w * h); + if (resized) { + g_free(a->surface.pixel_data); + a->surface.pixel_data = g_new(RrPixel32, w * h); + } if (a->surface.grad == RR_SURFACE_PARENTREL) { g_assert (a->surface.parent); @@ -79,10 +89,6 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) sw = a->surface.parent->w; sh = a->surface.parent->h; - if (a->surface.parentx >= sw || a->surface.parenty >= sh) { - return oldp; - } - source = (a->surface.parent->surface.pixel_data + a->surface.parentx + sw * a->surface.parenty); dest = a->surface.pixel_data; @@ -154,14 +160,18 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) &a->texture[i].data.rgba, a->w, a->h, &tarea); + force_transfer = 1; break; } } if (!transferred) { transferred = 1; - if ((a->surface.grad != RR_SURFACE_SOLID) || (a->surface.interlaced)) + if ((a->surface.grad != RR_SURFACE_SOLID) || (a->surface.interlaced) || + force_transfer) + { pixel_data_to_pixmap(a, 0, 0, w, h); + } } return oldp; @@ -190,6 +200,14 @@ RrAppearance *RrAppearanceNew(const RrInstance *inst, gint numtex) return out; } +void RrAppearanceAddTextures(RrAppearance *a, gint numtex) +{ + g_assert(a->textures == 0); + + a->textures = numtex; + if (numtex) a->texture = g_new0(RrTexture, numtex); +} + RrAppearance *RrAppearanceCopy(RrAppearance *orig) { RrSurface *spo, *spc; @@ -340,52 +358,85 @@ void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b) } } -void RrMinsize(RrAppearance *a, gint *w, gint *h) +void RrMinSize(RrAppearance *a, gint *w, gint *h) +{ + *w = RrMinWidth(a); + *h = RrMinHeight(a); +} + +gint RrMinWidth(RrAppearance *a) { gint i; RrSize *m; gint l, t, r, b; - *w = *h = 0; + gint w = 0; for (i = 0; i < a->textures; ++i) { switch (a->texture[i].type) { case RR_TEXTURE_NONE: break; case RR_TEXTURE_MASK: - *w = MAX(*w, a->texture[i].data.mask.mask->width); - *h = MAX(*h, a->texture[i].data.mask.mask->height); + w = MAX(w, a->texture[i].data.mask.mask->width); break; case RR_TEXTURE_TEXT: m = RrFontMeasureString(a->texture[i].data.text.font, 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, - a->texture[i].data.text.shadow_offset_y); - *h += MAX(*h, m->height); + w = MAX(w, m->width); g_free(m); break; case RR_TEXTURE_RGBA: - *w += MAX(*w, a->texture[i].data.rgba.width); - *h += MAX(*h, a->texture[i].data.rgba.height); + w += MAX(w, a->texture[i].data.rgba.width); + break; + case RR_TEXTURE_LINE_ART: + w += MAX(w, MAX(a->texture[i].data.lineart.x1, + a->texture[i].data.lineart.x2)); + break; + } + } + + RrMargins(a, &l, &t, &r, &b); + + w += l + r; + + if (w < 1) w = 1; + return w; +} + +gint RrMinHeight(RrAppearance *a) +{ + gint i; + gint l, t, r, b; + gint h = 0; + + for (i = 0; i < a->textures; ++i) { + switch (a->texture[i].type) { + case RR_TEXTURE_NONE: + break; + case RR_TEXTURE_MASK: + h = MAX(h, a->texture[i].data.mask.mask->height); + break; + case RR_TEXTURE_TEXT: + h += MAX(h, RrFontHeight(a->texture[i].data.text.font, + a->texture[i].data.text.shadow_offset_y)); + break; + case RR_TEXTURE_RGBA: + h += MAX(h, a->texture[i].data.rgba.height); break; case RR_TEXTURE_LINE_ART: - *w += MAX(*w, MAX(a->texture[i].data.lineart.x1, - a->texture[i].data.lineart.x2)); - *h += MAX(*h, MAX(a->texture[i].data.lineart.y1, - a->texture[i].data.lineart.y2)); + h += MAX(h, MAX(a->texture[i].data.lineart.y1, + a->texture[i].data.lineart.y2)); break; } } RrMargins(a, &l, &t, &r, &b); - *w += l + r; - *h += t + b; + h += t + b; - if (*w < 1) *w = 1; - if (*h < 1) *h = 1; + if (h < 1) h = 1; + return h; } static void reverse_bits(gchar *c, gint n)