From 7744067b6b50124c31f647e2943ef1fce9fdec96 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 4 Mar 2007 18:47:21 +0000 Subject: [PATCH] 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. --- render/font.c | 70 +++++++---------------------- render/font.h | 3 -- render/render.c | 6 ++- render/render.h | 14 +++--- render/theme.c | 114 +++++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 135 insertions(+), 72 deletions(-) diff --git a/render/font.c b/render/font.c index 0bb82620..3c64cce9 100644 --- a/render/font.c +++ b/render/font.c @@ -31,29 +31,6 @@ #include #include -#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 @@ static void measure_font(const RrInstance *inst, RrFont *f) } 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 @@ RrFont *RrFontOpen(const RrInstance *inst, gchar *name, gint size, 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 *RrFontOpen(const RrInstance *inst, gchar *name, gint size, 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 @@ void RrFontClose(RrFont *f) } 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 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area) 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; diff --git a/render/font.h b/render/font.h index 17894b8b..03f960c6 100644 --- a/render/font.h +++ b/render/font.h @@ -30,9 +30,6 @@ struct _RrFont { 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); diff --git a/render/render.c b/render/render.c index fd95469c..962d3ec9 100644 --- a/render/render.c +++ b/render/render.c @@ -348,9 +348,11 @@ void RrMinsize(RrAppearance *a, gint *w, gint *h) 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; diff --git a/render/render.h b/render/render.h index 713e2f12..65d16f22 100644 --- a/render/render.h +++ b/render/render.h @@ -121,6 +121,8 @@ struct _RrTextureText { RrJustify justify; RrColor *color; gchar *string; + gint shadow_offset; + gchar shadow_tint; }; struct _RrPixmapMask { @@ -190,9 +192,6 @@ struct _RrAppearance { #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); diff --git a/render/theme.c b/render/theme.c index b26af615..c8762181 100644 --- a/render/theme.c +++ b/render/theme.c @@ -32,6 +32,7 @@ #include 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 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, { 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 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, 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 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, 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 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, 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 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, 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 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, 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 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, 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 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, 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; @@ -1094,6 +1176,28 @@ static gchar *create_class_name(gchar *rname) 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) { gboolean ret = FALSE; -- 2.45.2