X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=render%2Frender.c;h=49485c8a1dea41f0de7c3c6781e2e51b884754f2;hb=ec7898dda7bfdd56cfb4d9ff51dddc1c1ab1f00e;hp=82e6f96e3d155d1a0830eca6a7742ded5a0f9a8e;hpb=34ad5b92b4498e2f5de87d67e3b0a0e3eb67b4fb;p=chaz%2Fopenbox diff --git a/render/render.c b/render/render.c index 82e6f96e..49485c8a 100644 --- a/render/render.c +++ b/render/render.c @@ -40,8 +40,7 @@ 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; - RrPixel32 *source, *dest; + gint i, transferred = 0, force_transfer = 0; Pixmap oldp = None; RrRect tarea; /* area in which to draw textures */ gboolean resized; @@ -82,36 +81,13 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) a->surface.pixel_data = g_new(RrPixel32, w * h); } - if (a->surface.grad == RR_SURFACE_PARENTREL) { - g_assert (a->surface.parent); - 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; - - 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); + RrRender(a, w, h); { gint l, t, r, b; RrMargins(a, &l, &t, &r, &b); - RECT_SET(tarea, l, t, w - l - r, h - t - b); - } + RECT_SET(tarea, l, t, w - l - r, h - t - b); + } for (i = 0; i < a->textures; i++) { switch (a->texture[i].type) { @@ -125,7 +101,7 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) pixel_data_to_pixmap(a, 0, 0, w, h); } if (a->xftdraw == NULL) { - a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap, + a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap, RrVisual(a->inst), RrColormap(a->inst)); } @@ -156,18 +132,32 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) break; case RR_TEXTURE_RGBA: g_assert(!transferred); - RrImageDraw(a->surface.pixel_data, - &a->texture[i].data.rgba, - a->w, a->h, - &tarea); + { + RrRect narea = tarea; + RrTextureRGBA *rgb = &a->texture[i].data.rgba; + if (rgb->twidth) + narea.width = MIN(tarea.width, rgb->twidth); + if (rgb->theight) + narea.height = MIN(tarea.height, rgb->theight); + narea.x += rgb->tx; + narea.y += rgb->ty; + RrImageDraw(a->surface.pixel_data, + &a->texture[i].data.rgba, + a->w, a->h, + &narea); + } + 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; @@ -191,11 +181,19 @@ RrAppearance *RrAppearanceNew(const RrInstance *inst, gint numtex) out = g_new0(RrAppearance, 1); out->inst = inst; out->textures = numtex; + out->surface.bevel_light_adjust = 128; + out->surface.bevel_dark_adjust = 64; if (numtex) out->texture = g_new0(RrTexture, numtex); return out; } +void RrAppearanceRemoveTextures(RrAppearance *a) +{ + g_free(a->texture); + a->textures = 0; +} + void RrAppearanceAddTextures(RrAppearance *a, gint numtex) { g_assert(a->textures == 0); @@ -220,7 +218,7 @@ RrAppearance *RrAppearanceCopy(RrAppearance *orig) if (spo->primary != NULL) spc->primary = RrColorNew(copy->inst, spo->primary->r, - spo->primary->g, + spo->primary->g, spo->primary->b); else spc->primary = NULL; @@ -259,7 +257,23 @@ RrAppearance *RrAppearanceCopy(RrAppearance *orig) spo->bevel_light->b); else spc->bevel_light = NULL; + if (spo->split_primary != NULL) + spc->split_primary = RrColorNew(copy->inst, + spo->split_primary->r, + spo->split_primary->g, + spo->split_primary->b); + else spc->split_primary = NULL; + + if (spo->split_secondary != NULL) + spc->split_secondary = RrColorNew(copy->inst, + spo->split_secondary->r, + spo->split_secondary->g, + spo->split_secondary->b); + else spc->split_secondary = NULL; + spc->interlaced = spo->interlaced; + spc->bevel_light_adjust = spo->bevel_light_adjust; + spc->bevel_dark_adjust = spo->bevel_dark_adjust; spc->border = spo->border; spc->parent = NULL; spc->parentx = spc->parenty = 0; @@ -300,6 +314,8 @@ void RrAppearanceFree(RrAppearance *a) RrColorFree(p->interlace_color); RrColorFree(p->bevel_dark); RrColorFree(p->bevel_light); + RrColorFree(p->split_primary); + RrColorFree(p->split_secondary); g_free(p->pixel_data); p->pixel_data = NULL; g_free(a); @@ -376,9 +392,11 @@ gint RrMinWidth(RrAppearance *a) 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); + a->texture[i].data.text.shadow_offset_y, + a->texture[i].data.text.flow, + a->texture[i].data.text.maxwidth); w = MAX(w, m->width); g_free(m); break; @@ -404,6 +422,7 @@ gint RrMinHeight(RrAppearance *a) { gint i; gint l, t, r, b; + RrSize *m; gint h = 0; for (i = 0; i < a->textures; ++i) { @@ -414,8 +433,24 @@ gint RrMinHeight(RrAppearance *a) 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)); + if (a->texture[i].data.text.flow) { + g_assert(a->texture[i].data.text.string != NULL); + + 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, + a->texture[i].data.text.flow, + a->texture[i].data.text.maxwidth); + h += MAX(h, m->height); + g_free(m); + } + else + 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);