fonts are no longer loaded from the theme file. instead, they are created by the...
authorDana Jansens <danakj@orodu.net>
Sun, 4 Mar 2007 07:12:34 +0000 (07:12 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 4 Mar 2007 07:12:34 +0000 (07:12 +0000)
render/font.c
render/font.h
render/render.h
render/theme.c
render/theme.h

index a63c8ca..ace605e 100644 (file)
@@ -75,10 +75,8 @@ static void measure_font(const RrInstance *inst, RrFont *f)
     g_free(locale);
 }
 
-static RrFont *openfont(const RrInstance *inst, gchar *fontstring)
+static RrFont *openfontstring(const RrInstance *inst, gchar *fontstring)
 {
-    /* This function is called for each font in the theme file. */
-    /* It returns a pointer to a RrFont struct after filling it. */
     RrFont *out;
     FcPattern *pat;
     gint tint;
@@ -90,6 +88,7 @@ static RrFont *openfont(const RrInstance *inst, gchar *fontstring)
 
     out = g_new(RrFont, 1);
     out->inst = inst;
+    out->ref = 1;
     out->font_desc = pango_font_description_new();
     out->layout = pango_layout_new(inst->pango);
 
@@ -156,10 +155,12 @@ static RrFont *openfont(const RrInstance *inst, gchar *fontstring)
     /* get the ascent and descent */
     measure_font(inst, out);
 
+    FcPatternDestroy(pat);
+
     return out;
 }
 
-RrFont *RrFontOpen(const RrInstance *inst, gchar *fontstring)
+RrFont *RrFontOpenByString(const RrInstance *inst, gchar *fontstring)
 {
     RrFont *out;
 
@@ -168,24 +169,98 @@ RrFont *RrFontOpen(const RrInstance *inst, gchar *fontstring)
         started = TRUE;
     }
 
-    if ((out = openfont(inst, fontstring)))
+    if ((out = openfontstring(inst, fontstring)))
         return out;
     g_warning(_("Unable to load font: %s\n"), fontstring);
     g_warning(_("Trying fallback font: %s\n"), "sans");
 
-    if ((out = openfont(inst, "sans")))
+    if ((out = openfontstring(inst, "sans")))
         return out;
     g_warning(_("Unable to load font: %s\n"), "sans");
 
     return NULL;
 }
 
+RrFont *RrFontOpen(const RrInstance *inst, gchar *name, gint size,
+                   RrFontWeight weight, RrFontSlant slant, gboolean shadow,
+                   gint shadowoffset, gchar shadowtint)
+{
+    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;
+    out->font_desc = pango_font_description_new();
+    out->layout = pango_layout_new(inst->pango);
+
+    switch (weight) {
+    case RR_FONTWEIGHT_LIGHT:     pweight = PANGO_WEIGHT_LIGHT;     break;
+    case RR_FONTWEIGHT_NORMAL:    pweight = PANGO_WEIGHT_NORMAL;    break;
+    case RR_FONTWEIGHT_SEMIBOLD:  pweight = PANGO_WEIGHT_SEMIBOLD;  break;
+    case RR_FONTWEIGHT_BOLD:      pweight = PANGO_WEIGHT_BOLD;      break;
+    case RR_FONTWEIGHT_ULTRABOLD: pweight = PANGO_WEIGHT_ULTRABOLD; break;
+    default: g_assert_not_reached();
+    }
+
+    switch (slant) {
+    case RR_FONTSLANT_NORMAL:  pstyle = PANGO_STYLE_NORMAL;    break;
+    case RR_FONTSLANT_ITALIC:  pstyle = PANGO_STYLE_ITALIC;    break;
+    case RR_FONTSLANT_OBLIQUE: pstyle = PANGO_STYLE_OBLIQUE;   break;
+    default: g_assert_not_reached();
+    }
+
+    /* setup the font */
+    pango_font_description_set_family(out->font_desc, name);
+    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);
+    pango_layout_set_ellipsize(out->layout, PANGO_ELLIPSIZE_MIDDLE);
+
+    /* get the ascent and descent */
+    measure_font(inst, out);
+
+    return out;
+}
+
+RrFont *RrFontOpenDefault(const RrInstance *inst)
+{
+    return RrFontOpen(inst, RrDefaultFontFamily, RrDefaultFontSize,
+                      RrDefaultFontWeight, RrDefaultFontSlant,
+                      RrDefaultFontShadow, RrDefaultFontShadowOffset,
+                      RrDefaultFontShadowTint);
+}
+
+void RrFontRef(RrFont *f)
+{
+    ++f->ref;
+}
+
 void RrFontClose(RrFont *f)
 {
     if (f) {
-        g_object_unref(f->layout);
-        pango_font_description_free(f->font_desc);
-        g_free(f);
+        if (--f->ref < 1) {
+            g_object_unref(f->layout);
+            pango_font_description_free(f->font_desc);
+            g_free(f);
+        }
     }
 }
 
index a068660..17894b8 100644 (file)
 
 struct _RrFont {
     const RrInstance *inst;
+    gint ref;
     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 elipses_length; /*!< This one is in pixels, yay */
     gint shadow;
     gchar tint;
     gint offset;
 };
 
-RrFont *RrFontOpen(const RrInstance *inst, gchar *fontstring);
-void RrFontClose(RrFont *f);
 void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *position);
 
+/*! Increment the references for this font, RrFontClose will decrement until 0
+  and then really close it */
+void RrFontRef(RrFont *f);
+
 #endif /* __font_h */
index c5f9838..0b8d3b4 100644 (file)
@@ -186,6 +186,14 @@ struct _RrAppearance {
 #define RrDefaultGreenOffset 8
 #define RrDefaultBlueOffset 0
 
+#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);
 
@@ -219,9 +227,16 @@ RrAppearance *RrAppearanceNew  (const RrInstance *inst, gint numtex);
 RrAppearance *RrAppearanceCopy (RrAppearance *a);
 void          RrAppearanceFree (RrAppearance *a);
 
+RrFont *RrFontOpenByString  (const RrInstance *inst, gchar *fontstring);
+RrFont *RrFontOpen          (const RrInstance *inst, gchar *name, gint size,
+                             RrFontWeight weight, RrFontSlant slant,
+                             gboolean shadow, gint shadowoffset,
+                             gchar shadowtint);
+RrFont *RrFontOpenDefault   (const RrInstance *inst);
+void    RrFontClose         (RrFont *f);
 RrSize *RrFontMeasureString (const RrFont *f, const gchar *str);
-gint RrFontHeight        (const RrFont *f);
-gint RrFontMaxCharWidth  (const RrFont *f);
+gint    RrFontHeight        (const RrFont *f);
+gint    RrFontMaxCharWidth  (const RrFont *f);
 
 void RrPaint   (RrAppearance *a, Window win, gint w, gint h);
 void RrMinsize (RrAppearance *a, gint *w, gint *h);
index 0e02ae8..b26af61 100644 (file)
@@ -45,12 +45,13 @@ static gboolean read_appearance(XrmDatabase db, const RrInstance *inst,
 static RrPixel32* read_c_image(gint width, gint height, const guint8 *data);
 static void set_default_appearance(RrAppearance *a);
 
-RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
+RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
+                    RrFont *active_window_font, RrFont *inactive_window_font,
+                    RrFont *menu_title_font, RrFont *menu_item_font)
 {
     XrmDatabase db = NULL;
     RrJustify winjust, mtitlejust;
     gchar *str;
-    gchar *font_str;
     RrTheme *theme;
 
     theme = g_new0(RrTheme, 1);
@@ -110,22 +111,18 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
     }
 
     /* load the font stuff */
-    if (!read_string(db, "window.active.label.text.font", &font_str))
-        font_str = "arial,sans:bold:pixelsize=10:shadow=y:shadowtint=50";
-
-    if (!(theme->win_font_focused = RrFontOpen(inst, font_str))) {
-        RrThemeFree(theme);
-        return NULL;
-    }
+    if (active_window_font) {
+        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 (!read_string(db, "window.inactive.label.text.font", &font_str))
-        /* font_str will already be set to the last one */;
-
-    if (!(theme->win_font_unfocused = RrFontOpen(inst, font_str))) {
-        RrThemeFree(theme);
-        return NULL;
-    }
+    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));
 
@@ -137,13 +134,11 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
             winjust = RR_JUSTIFY_CENTER;
     }
 
-    if (!read_string(db, "menu.title.text.font", &font_str))
-        font_str = "arial,sans:bold:pixelsize=12:shadow=y";
-
-    if (!(theme->menu_title_font = RrFontOpen(inst, font_str))) {
-        RrThemeFree(theme);
-        return NULL;
-    }
+    if (menu_title_font) {
+        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;
@@ -154,13 +149,11 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
             mtitlejust = RR_JUSTIFY_CENTER;
     }
 
-    if (!read_string(db, "menu.items.font", &font_str))
-        font_str = "arial,sans:bold:pixelsize=11:shadow=y";
-
-    if (!(theme->menu_font = RrFontOpen(inst, font_str))) {
-        RrThemeFree(theme);
-        return NULL;
-    }
+    if (menu_item_font) {
+        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 */
index 5190e07..22bf7e1 100644 (file)
@@ -187,7 +187,11 @@ struct _RrTheme {
 
 };
 
-RrTheme* RrThemeNew(const RrInstance *inst, gchar *theme);
+/*! The font values are all optional. If a NULL is used for any of them, then
+  the default font will be used. */
+RrTheme* RrThemeNew(const RrInstance *inst, gchar *theme,
+                    RrFont *active_window_font, RrFont *inactive_window_font,
+                    RrFont *menu_title_font, RrFont *menu_item_font);
 void RrThemeFree(RrTheme *theme);
 
 G_END_DECLS