From e9c1e44e680e8f4ddaf3622c287e419d488256eb Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 3 Sep 2003 06:28:57 +0000 Subject: [PATCH] provide a function to give the margins for an appearance --- render/render.c | 193 ++++++++++++++++++++++++------------------------ render/render.h | 5 +- 2 files changed, 98 insertions(+), 100 deletions(-) diff --git a/render/render.c b/render/render.c index 7e4f112b..2cfb70c7 100644 --- a/render/render.c +++ b/render/render.c @@ -18,7 +18,7 @@ static void pixel_data_to_pixmap(RrAppearance *l, gint x, gint y, gint w, gint h); -void RrPaint(RrAppearance *l, Window win, gint w, gint h) +void RrPaint(RrAppearance *a, Window win, gint w, gint h) { int i, transferred = 0, sw; RrPixel32 *source, *dest; @@ -28,114 +28,101 @@ void RrPaint(RrAppearance *l, Window win, gint w, gint h) if (w <= 0 || h <= 0) return; - resized = (l->w != w || l->h != h); + resized = (a->w != w || a->h != h); - oldp = l->pixmap; /* save to free after changing the visible pixmap */ - l->pixmap = XCreatePixmap(RrDisplay(l->inst), - RrRootWindow(l->inst), - w, h, RrDepth(l->inst)); + oldp = a->pixmap; /* save to free after changing the visible pixmap */ + a->pixmap = XCreatePixmap(RrDisplay(a->inst), + RrRootWindow(a->inst), + w, h, RrDepth(a->inst)); - g_assert(l->pixmap != None); - l->w = w; - l->h = h; + g_assert(a->pixmap != None); + a->w = w; + a->h = h; - if (l->xftdraw != NULL) - XftDrawDestroy(l->xftdraw); - l->xftdraw = XftDrawCreate(RrDisplay(l->inst), l->pixmap, - RrVisual(l->inst), RrColormap(l->inst)); - g_assert(l->xftdraw != NULL); + if (a->xftdraw != NULL) + XftDrawDestroy(a->xftdraw); + a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap, + RrVisual(a->inst), RrColormap(a->inst)); + g_assert(a->xftdraw != NULL); - g_free(l->surface.pixel_data); - l->surface.pixel_data = g_new(RrPixel32, w * h); + g_free(a->surface.pixel_data); + a->surface.pixel_data = g_new(RrPixel32, w * h); - if (l->surface.grad == RR_SURFACE_PARENTREL) { - g_assert (l->surface.parent); - g_assert (l->surface.parent->w); + if (a->surface.grad == RR_SURFACE_PARENTREL) { + g_assert (a->surface.parent); + g_assert (a->surface.parent->w); - sw = l->surface.parent->w; - source = (l->surface.parent->surface.pixel_data + - l->surface.parentx + sw * l->surface.parenty); - dest = l->surface.pixel_data; + sw = a->surface.parent->w; + 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)); } } else - RrRender(l, w, h); + RrRender(a, w, h); - RECT_SET(tarea, 0, 0, w, h); - if (l->surface.grad != RR_SURFACE_PARENTREL) { - if (l->surface.relief != RR_RELIEF_FLAT) { - switch (l->surface.bevel) { - case RR_BEVEL_1: - tarea.x += 1; tarea.y += 1; - tarea.width -= 2; tarea.height -= 2; - break; - case RR_BEVEL_2: - tarea.x += 2; tarea.y += 2; - tarea.width -= 4; tarea.height -= 4; - break; - } - } else if (l->surface.border) { - tarea.x += 1; tarea.y += 1; - tarea.width -= 2; tarea.height -= 2; - } - } + { + gint l, t, r, b; + RrMargins(a, &l, &t, &r, &b); + RECT_SET(tarea, l, t, w - l - r, h - t - b); + } - for (i = 0; i < l->textures; i++) { - switch (l->texture[i].type) { + for (i = 0; i < a->textures; i++) { + switch (a->texture[i].type) { case RR_TEXTURE_NONE: break; case RR_TEXTURE_TEXT: if (!transferred) { transferred = 1; - if (l->surface.grad != RR_SURFACE_SOLID) - pixel_data_to_pixmap(l, 0, 0, w, h); + if (a->surface.grad != RR_SURFACE_SOLID) + pixel_data_to_pixmap(a, 0, 0, w, h); } - if (l->xftdraw == NULL) { - l->xftdraw = XftDrawCreate(RrDisplay(l->inst), l->pixmap, - RrVisual(l->inst), - RrColormap(l->inst)); + if (a->xftdraw == NULL) { + a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap, + RrVisual(a->inst), + RrColormap(a->inst)); } - RrFontDraw(l->xftdraw, &l->texture[i].data.text, &tarea); + RrFontDraw(a->xftdraw, &a->texture[i].data.text, &tarea); break; case RR_TEXTURE_LINE_ART: if (!transferred) { transferred = 1; - if (l->surface.grad != RR_SURFACE_SOLID) - pixel_data_to_pixmap(l, 0, 0, w, h); + if (a->surface.grad != RR_SURFACE_SOLID) + pixel_data_to_pixmap(a, 0, 0, w, h); } - XDrawLine(RrDisplay(l->inst), l->pixmap, - RrColorGC(l->texture[i].data.lineart.color), - l->texture[i].data.lineart.x1, - l->texture[i].data.lineart.y1, - l->texture[i].data.lineart.x2, - l->texture[i].data.lineart.y2); + XDrawLine(RrDisplay(a->inst), a->pixmap, + RrColorGC(a->texture[i].data.lineart.color), + a->texture[i].data.lineart.x1, + a->texture[i].data.lineart.y1, + a->texture[i].data.lineart.x2, + a->texture[i].data.lineart.y2); break; case RR_TEXTURE_MASK: if (!transferred) { transferred = 1; - if (l->surface.grad != RR_SURFACE_SOLID) - pixel_data_to_pixmap(l, 0, 0, w, h); + if (a->surface.grad != RR_SURFACE_SOLID) + pixel_data_to_pixmap(a, 0, 0, w, h); } - RrPixmapMaskDraw(l->pixmap, &l->texture[i].data.mask, &tarea); + RrPixmapMaskDraw(a->pixmap, &a->texture[i].data.mask, &tarea); break; case RR_TEXTURE_RGBA: g_assert(!transferred); - RrImageDraw(l->surface.pixel_data, - &l->texture[i].data.rgba, &tarea); + RrImageDraw(a->surface.pixel_data, + &a->texture[i].data.rgba, &tarea); break; } } if (!transferred) { transferred = 1; - if (l->surface.grad != RR_SURFACE_SOLID) - pixel_data_to_pixmap(l, 0, 0, w, h); + if (a->surface.grad != RR_SURFACE_SOLID) + pixel_data_to_pixmap(a, 0, 0, w, h); } - XSetWindowBackgroundPixmap(RrDisplay(l->inst), win, l->pixmap); - XClearWindow(RrDisplay(l->inst), win); - if (oldp) XFreePixmap(RrDisplay(l->inst), oldp); + XSetWindowBackgroundPixmap(RrDisplay(a->inst), win, a->pixmap); + XClearWindow(RrDisplay(a->inst), win); + if (oldp) XFreePixmap(RrDisplay(a->inst), oldp); } RrAppearance *RrAppearanceNew(const RrInstance *inst, gint numtex) @@ -281,55 +268,65 @@ static void pixel_data_to_pixmap(RrAppearance *l, g_free(scratch); } -void RrMinsize(RrAppearance *l, gint *w, gint *h) +void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b) +{ + *l = *t = *r = *b = 0; + + if (a->surface.grad != RR_SURFACE_PARENTREL) { + if (a->surface.relief != RR_RELIEF_FLAT) { + switch (a->surface.bevel) { + case RR_BEVEL_1: + *l = *t = *r = *b = 1; + break; + case RR_BEVEL_2: + *l = *t = *r = *b = 2; + break; + } + } else if (a->surface.border) { + *l = *t = *r = *b = 1; + } + } +} + +void RrMinsize(RrAppearance *a, gint *w, gint *h) { gint i; gint m; + gint l, t, r, b; *w = *h = 0; - for (i = 0; i < l->textures; ++i) { - switch (l->texture[i].type) { + for (i = 0; i < a->textures; ++i) { + switch (a->texture[i].type) { case RR_TEXTURE_NONE: break; case RR_TEXTURE_MASK: - *w = MAX(*w, l->texture[i].data.mask.mask->width); - *h = MAX(*h, l->texture[i].data.mask.mask->height); + *w = MAX(*w, a->texture[i].data.mask.mask->width); + *h = MAX(*h, a->texture[i].data.mask.mask->height); break; case RR_TEXTURE_TEXT: - m = RrFontMeasureString(l->texture[i].data.text.font, - l->texture[i].data.text.string); + m = RrFontMeasureString(a->texture[i].data.text.font, + a->texture[i].data.text.string); *w = MAX(*w, m); - m = RrFontHeight(l->texture[i].data.text.font); + m = RrFontHeight(a->texture[i].data.text.font); *h += MAX(*h, m); break; case RR_TEXTURE_RGBA: - *w += MAX(*w, l->texture[i].data.rgba.width); - *h += MAX(*h, l->texture[i].data.rgba.height); + *w += MAX(*w, a->texture[i].data.rgba.width); + *h += MAX(*h, a->texture[i].data.rgba.height); break; case RR_TEXTURE_LINE_ART: - *w += MAX(*w, MAX(l->texture[i].data.lineart.x1, - l->texture[i].data.lineart.x2)); - *h += MAX(*h, MAX(l->texture[i].data.lineart.y1, - l->texture[i].data.lineart.y2)); + *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)); break; } } - if (l->surface.relief != RR_RELIEF_FLAT) { - switch (l->surface.bevel) { - case RR_BEVEL_1: - *w += 2; - *h += 2; - break; - case RR_BEVEL_2: - *w += 4; - *h += 4; - break; - } - } else if (l->surface.border) { - *w += 2; - *h += 2; - } + RrMargins(a, &l, &t, &r, &b); + + *w += l + r; + *h += t + b; if (*w < 1) *w = 1; if (*h < 1) *h = 1; diff --git a/render/render.h b/render/render.h index abdf03bb..02804c01 100644 --- a/render/render.h +++ b/render/render.h @@ -183,8 +183,9 @@ int RrFontMeasureString (const RrFont *f, const gchar *str); int RrFontHeight (const RrFont *f); int RrFontMaxCharWidth (const RrFont *f); -void RrPaint (RrAppearance *l, Window win, gint w, gint h); -void RrMinsize (RrAppearance *l, gint *w, gint *h); +void RrPaint (RrAppearance *a, Window win, gint w, gint h); +void RrMinsize (RrAppearance *a, gint *w, gint *h); +void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b); gboolean RrPixmapToRGBA(const RrInstance *inst, Pixmap pmap, Pixmap mask, -- 2.45.2