X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Frender.c;h=e97f78559a7a21161a23b59d2e6dcb909cd4cc58;hb=13215aaaabca4c6757d1669a3a47afc7066deb7a;hp=36d26a6f0f1670a24bd140f5b8a84fe557606772;hpb=f1ed62cead95b1370e4282c2bf3303aa2d75803a;p=chaz%2Fopenbox diff --git a/render/render.c b/render/render.c index 36d26a6f..e97f7855 100644 --- a/render/render.c +++ b/render/render.c @@ -39,7 +39,7 @@ static void pixel_data_to_pixmap(RrAppearance *l, void RrPaint(RrAppearance *a, Window win, 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 */ @@ -47,6 +47,10 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) if (w <= 0 || h <= 0) return; + if (a->surface.parentx < 0 || a->surface.parenty < 0) { + /* ob_debug("Invalid parent co-ordinates\n"); */ + return; + } resized = (a->w != w || a->h != h); oldp = a->pixmap; /* save to free after changing the visible pixmap */ @@ -72,11 +76,26 @@ 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; + + 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; - 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); @@ -255,7 +274,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); } } @@ -329,6 +348,7 @@ void RrMinsize(RrAppearance *a, gint *w, gint *h) *w = MAX(*w, m->width + 4); m->height = RrFontHeight(a->texture[i].data.text.font); *h += MAX(*h, m->height); + g_free(m); break; case RR_TEXTURE_RGBA: *w += MAX(*w, a->texture[i].data.rgba.width); @@ -352,7 +372,7 @@ 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++)