moving shadow information out of the themes, and into the Text textures. cleaning up some old Xft cruft in font.c also, that is no longer needed.
@@ -31,29 +31,6 @@ #include <string.h>
#include <stdlib.h> #include <locale.h> -#define OB_SHADOW "shadow" -#define OB_SHADOW_OFFSET "shadowoffset" -#define OB_SHADOW_ALPHA "shadowtint" - -FcObjectType objs[] = { - { OB_SHADOW, FcTypeBool }, - { OB_SHADOW_OFFSET, FcTypeInteger }, - { OB_SHADOW_ALPHA, FcTypeInteger } -}; - -static gboolean started = FALSE; - -static void font_startup(void) -{ - if (!XftInit(0)) { - g_warning(_("Couldn't initialize Xft.")); - exit(EXIT_FAILURE); - } - - /* Here we are teaching xft about the shadow, shadowoffset & shadowtint */ - FcNameRegisterObjectTypes(objs, (sizeof(objs) / sizeof(objs[0]))); -} - static void measure_font(const RrInstance *inst, RrFont *f) { PangoFontMetrics *metrics;@@ -76,20 +53,12 @@ g_free(locale);
} RrFont *RrFontOpen(const RrInstance *inst, gchar *name, gint size, - RrFontWeight weight, RrFontSlant slant, gboolean shadow, - gint shadowoffset, gchar shadowtint) + RrFontWeight weight, RrFontSlant slant) { RrFont *out; PangoWeight pweight; PangoStyle pstyle; - if (!started) { - font_startup(); - started = TRUE; - } - - g_assert(shadowtint <= 100 && shadowtint >= -100); - out = g_new(RrFont, 1); out->inst = inst; out->ref = 1;@@ -118,11 +87,6 @@ pango_font_description_set_weight(out->font_desc, pweight);
pango_font_description_set_style(out->font_desc, pstyle); pango_font_description_set_size(out->font_desc, size * PANGO_SCALE); - /* setup the shadow */ - out->shadow = shadow; - out->offset = shadowoffset; - out->tint = shadowtint; - /* setup the layout */ pango_layout_set_font_description(out->layout, out->font_desc); pango_layout_set_single_paragraph_mode(out->layout, TRUE);@@ -137,9 +101,7 @@
RrFont *RrFontOpenDefault(const RrInstance *inst) { return RrFontOpen(inst, RrDefaultFontFamily, RrDefaultFontSize, - RrDefaultFontWeight, RrDefaultFontSlant, - RrDefaultFontShadow, RrDefaultFontShadowOffset, - RrDefaultFontShadowTint); + RrDefaultFontWeight, RrDefaultFontSlant); } void RrFontRef(RrFont *f)@@ -159,29 +121,29 @@ }
} static void font_measure_full(const RrFont *f, const gchar *str, - gint *x, gint *y) + gint *x, gint *y, gint shadow_offset) { PangoRectangle rect; pango_layout_set_text(f->layout, str, -1); pango_layout_set_width(f->layout, -1); pango_layout_get_pixel_extents(f->layout, NULL, &rect); - *x = rect.width + (f->shadow ? ABS(f->offset) : 0); - *y = rect.height + (f->shadow ? ABS(f->offset) : 0); + *x = rect.width + ABS(shadow_offset); + *y = rect.height + ABS(shadow_offset); } -RrSize *RrFontMeasureString(const RrFont *f, const gchar *str) +RrSize *RrFontMeasureString(const RrFont *f, const gchar *str, + gint shadow_offset) { RrSize *size; size = g_new(RrSize, 1); - font_measure_full(f, str, &size->width, &size->height); + font_measure_full(f, str, &size->width, &size->height, shadow_offset); return size; } -gint RrFontHeight(const RrFont *f) +gint RrFontHeight(const RrFont *f, gint shadow_offset) { - return (f->ascent + f->descent) / PANGO_SCALE + - (f->shadow ? f->offset : 0); + return (f->ascent + f->descent) / PANGO_SCALE + ABS(shadow_offset); } static inline int font_calculate_baseline(RrFont *f, gint height)@@ -245,27 +207,27 @@ x += (w - mw) / 2;
break; } - if (t->font->shadow) { - if (t->font->tint >= 0) { + if (t->shadow_offset) { + if (t->shadow_tint >= 0) { c.color.red = 0; c.color.green = 0; c.color.blue = 0; - c.color.alpha = 0xffff * t->font->tint / 100; + c.color.alpha = 0xffff * t->shadow_tint / 100; c.pixel = BlackPixel(RrDisplay(t->font->inst), RrScreen(t->font->inst)); } else { c.color.red = 0xffff; c.color.green = 0xffff; c.color.blue = 0xffff; - c.color.alpha = 0xffff * -t->font->tint / 100; + c.color.alpha = 0xffff * -t->shadow_tint / 100; c.pixel = WhitePixel(RrDisplay(t->font->inst), RrScreen(t->font->inst)); } /* see below... */ pango_xft_render_layout_line (d, &c, pango_layout_get_line(t->font->layout, 0), - (x + t->font->offset) * PANGO_SCALE, - (y + t->font->offset) * PANGO_SCALE); + (x + t->shadow_offset) * PANGO_SCALE, + (y + t->shadow_offset) * PANGO_SCALE); } c.color.red = t->color->r | t->color->r << 8;
@@ -30,9 +30,6 @@ PangoFontDescription *font_desc;
PangoLayout *layout; /*!< Used for measuring and rendering strings */ gint ascent; /*!< The font's ascent in pango-units */ gint descent; /*!< The font's descent in pango-units */ - gint shadow; - gchar tint; - gint offset; }; void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *position);
@@ -348,9 +348,11 @@ *h = MAX(*h, a->texture[i].data.mask.mask->height);
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); *w = MAX(*w, m->width + 4); - m->height = RrFontHeight(a->texture[i].data.text.font); + m->height = RrFontHeight(a->texture[i].data.text.font, + a->texture[i].data.text.shadow_offset); *h += MAX(*h, m->height); g_free(m); break;
@@ -121,6 +121,8 @@ RrFont *font;
RrJustify justify; RrColor *color; gchar *string; + gint shadow_offset; + gchar shadow_tint; }; struct _RrPixmapMask {@@ -190,9 +192,6 @@ #define RrDefaultFontFamily "arial,sans"
#define RrDefaultFontSize 8 #define RrDefaultFontWeight RR_FONTWEIGHT_NORMAL #define RrDefaultFontSlant RR_FONTSLANT_NORMAL -#define RrDefaultFontShadow FALSE -#define RrDefaultFontShadowOffset 1 -#define RrDefaultFontShadowTint 50 RrInstance* RrInstanceNew (Display *display, gint screen); void RrInstanceFree (RrInstance *inst);@@ -228,13 +227,12 @@ RrAppearance *RrAppearanceCopy (RrAppearance *a);
void RrAppearanceFree (RrAppearance *a); RrFont *RrFontOpen (const RrInstance *inst, gchar *name, gint size, - RrFontWeight weight, RrFontSlant slant, - gboolean shadow, gint shadowoffset, - gchar shadowtint); + RrFontWeight weight, RrFontSlant slant); RrFont *RrFontOpenDefault (const RrInstance *inst); void RrFontClose (RrFont *f); -RrSize *RrFontMeasureString (const RrFont *f, const gchar *str); -gint RrFontHeight (const RrFont *f); +RrSize *RrFontMeasureString (const RrFont *f, const gchar *str, + gint shadow_offset); +gint RrFontHeight (const RrFont *f, gint shadow_offset); gint RrFontMaxCharWidth (const RrFont *f); void RrPaint (RrAppearance *a, Window win, gint w, gint h);
@@ -32,6 +32,7 @@ #include <stdlib.h>
#include <string.h> static XrmDatabase loaddb(RrTheme *theme, gchar *name); +static gboolean read_bool(XrmDatabase db, gchar *rname, gboolean *value); static gboolean read_int(XrmDatabase db, gchar *rname, gint *value); static gboolean read_string(XrmDatabase db, gchar *rname, gchar **value); static gboolean read_color(XrmDatabase db, const RrInstance *inst,@@ -51,8 +52,11 @@ RrFont *menu_title_font, RrFont *menu_item_font)
{ XrmDatabase db = NULL; RrJustify winjust, mtitlejust; + gboolean b; gchar *str; RrTheme *theme; + gint offset; + gint tint; theme = g_new0(RrTheme, 1);@@ -116,15 +120,12 @@ theme->win_font_focused = active_window_font;
RrFontRef(active_window_font); } else theme->win_font_focused = RrFontOpenDefault(inst); - theme->win_font_height = RrFontHeight(theme->win_font_focused); if (inactive_window_font) { theme->win_font_unfocused = inactive_window_font; RrFontRef(inactive_window_font); } else theme->win_font_unfocused = RrFontOpenDefault(inst); - theme->win_font_height = MAX(theme->win_font_height, - RrFontHeight(theme->win_font_unfocused)); winjust = RR_JUSTIFY_LEFT; if (read_string(db, "window.label.text.justify", &str)) {@@ -139,7 +140,6 @@ theme->menu_title_font = menu_title_font;
RrFontRef(menu_title_font); } else theme->menu_title_font = RrFontOpenDefault(inst); - theme->menu_title_font_height = RrFontHeight(theme->menu_title_font); mtitlejust = RR_JUSTIFY_LEFT; if (read_string(db, "menu.title.text.justify", &str)) {@@ -154,7 +154,6 @@ theme->menu_font = menu_item_font;
RrFontRef(menu_item_font); } else theme->menu_font = RrFontOpenDefault(inst); - theme->menu_font_height = RrFontHeight(theme->menu_font); /* load direct dimensions */ if (!read_int(db, "menu.overlap", &theme->menu_overlap) ||@@ -655,6 +654,22 @@ theme->a_focused_label->texture[0].data.text.color =
theme->app_hilite_label->texture[0].data.text.color = theme->title_focused_color; + if (read_bool(db, "window.active.label.text.shadow", &b) && b) { + if (!read_int(db, "window.active.label.text.shadow.offset", &offset)) + offset = 1; + + if (!read_int(db, "window.active.label.text.shadow.tint", &tint)) + tint = 50; + tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint)); + } else { + offset = 0; + tint = 50; + } + theme->a_focused_label->texture[0].data.text.shadow_offset = + theme->app_hilite_label->texture[0].data.text.shadow_offset = offset; + theme->a_focused_label->texture[0].data.text.shadow_tint = + theme->app_hilite_label->texture[0].data.text.shadow_tint = tint; + theme->a_unfocused_label->texture[0].type = theme->app_unhilite_label->texture[0].type = RR_TEXTURE_TEXT; theme->a_unfocused_label->texture[0].data.text.justify = winjust;@@ -667,11 +682,42 @@ theme->a_unfocused_label->texture[0].data.text.color =
theme->app_unhilite_label->texture[0].data.text.color = theme->title_unfocused_color; + if (read_bool(db, "window.inactive.label.text.shadow", &b) && b) { + if (!read_int(db, "window.inactive.label.text.shadow.offset", &offset)) + offset = 1; + + if (!read_int(db, "window.inactive.label.text.shadow.tint", &tint)) + tint = 50; + tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint)); + } else { + offset = 0; + tint = 50; + } + theme->a_unfocused_label->texture[0].data.text.shadow_offset = + theme->app_unhilite_label->texture[0].data.text.shadow_offset = + offset; + theme->a_unfocused_label->texture[0].data.text.shadow_tint = + theme->app_unhilite_label->texture[0].data.text.shadow_tint = tint; + theme->a_menu_title->texture[0].type = RR_TEXTURE_TEXT; theme->a_menu_title->texture[0].data.text.justify = mtitlejust; theme->a_menu_title->texture[0].data.text.font = theme->menu_title_font; theme->a_menu_title->texture[0].data.text.color = theme->menu_title_color; + if (read_bool(db, "menu.title.text.shadow", &b) && b) { + if (!read_int(db, "menu.title.text.shadow.offset", &offset)) + offset = 1; + + if (!read_int(db, "menu.title.text.shadow.tint", &tint)) + tint = 50; + tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint)); + } else { + offset = 0; + tint = 50; + } + theme->a_menu_title->texture[0].data.text.shadow_offset = offset; + theme->a_menu_title->texture[0].data.text.shadow_tint = tint; + theme->a_menu_text_normal->texture[0].type = theme->a_menu_text_disabled->texture[0].type = theme->a_menu_text_selected->texture[0].type = RR_TEXTURE_TEXT;@@ -689,6 +735,25 @@ theme->menu_disabled_color;
theme->a_menu_text_selected->texture[0].data.text.color = theme->menu_selected_color; + if (read_bool(db, "menu.items.text.shadow", &b) && b) { + if (!read_int(db, "menu.items.text.shadow.offset", &offset)) + offset = 1; + + if (!read_int(db, "menu.items.text.shadow.tint", &tint)) + tint = 50; + tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint)); + } else { + offset = 0; + tint = 50; + } + theme->a_menu_text_normal->texture[0].data.text.shadow_offset = + theme->a_menu_text_disabled->texture[0].data.text.shadow_offset = + theme->a_menu_text_selected->texture[0].data.text.shadow_offset = + offset; + theme->a_menu_text_normal->texture[0].data.text.shadow_tint = + theme->a_menu_text_disabled->texture[0].data.text.shadow_tint = + theme->a_menu_text_selected->texture[0].data.text.shadow_tint = tint; + theme->a_disabled_focused_max->texture[0].type = theme->a_disabled_unfocused_max->texture[0].type = theme->a_hover_focused_max->texture[0].type =@@ -873,6 +938,23 @@ theme->menu_selected_color;
XrmDestroyDatabase(db); + /* set the font heights */ + theme->win_font_height = RrFontHeight + (theme->win_font_focused, + theme->a_focused_label->texture[0].data.text.shadow_offset); + theme->win_font_height = + MAX(theme->win_font_height, + RrFontHeight + (theme->win_font_focused, + theme->a_unfocused_label->texture[0].data.text.shadow_offset)); + theme->menu_title_font_height = RrFontHeight + (theme->menu_title_font, + theme->a_menu_title->texture[0].data.text.shadow_offset); + theme->menu_font_height = RrFontHeight + (theme->menu_font, + theme->a_menu_text_normal->texture[0].data.text.shadow_offset); + + /* calculate some last extents */ { gint ft, fb, fl, fr, ut, ub, ul, ur;@@ -1092,6 +1174,28 @@ ++p;
if (*p == '\0') break; } return rclass; +} + +static gboolean read_bool(XrmDatabase db, gchar *rname, gint *value) +{ + gboolean ret = FALSE; + gchar *rclass = create_class_name(rname); + gchar *rettype; + XrmValue retvalue; + + if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) && + retvalue.addr != NULL) { + if (!g_ascii_strcasecmp(retvalue.addr, "true")) { + *value = TRUE; + ret = TRUE; + } else if (!g_ascii_strcasecmp(retvalue.addr, "false")) { + *value = FALSE; + ret = TRUE; + } + } + + g_free(rclass); + return ret; } static gboolean read_int(XrmDatabase db, gchar *rname, gint *value)