provide a function to give the margins for an appearance
This commit is contained in:
parent
5a44164be9
commit
e9c1e44e68
2 changed files with 98 additions and 100 deletions
193
render/render.c
193
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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue