moving shadow information out of the themes, and into the Text textures.
authorDana Jansens <danakj@orodu.net>
Sun, 4 Mar 2007 18:47:21 +0000 (18:47 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 4 Mar 2007 18:47:21 +0000 (18:47 +0000)
cleaning up some old Xft cruft in font.c also, that is no longer needed.

render/font.c
render/font.h
render/render.c
render/render.h
render/theme.c

index 0bb8262..3c64cce 100644 (file)
 #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 @@ 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;
index 17894b8..03f960c 100644 (file)
@@ -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);
index fd95469..962d3ec 100644 (file)
@@ -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;
index 713e2f1..65d16f2 100644 (file)
@@ -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);
index b26af61..c876218 100644 (file)
@@ -32,6 +32,7 @@
 #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 @@ 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;