Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        Makefile.am tclass.h text.c ttfont.c 
Added Files:
        text_pango.c text_xft.c 


Log Message:
Split up font stuff, preparing for loadable font type handlers.

===================================================================
RCS file: /cvs/e/e16/e/src/Makefile.am,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -3 -r1.91 -r1.92
--- Makefile.am 23 Aug 2007 18:48:20 -0000      1.91
+++ Makefile.am 25 Aug 2007 05:38:53 -0000      1.92
@@ -96,12 +96,12 @@
        systray.c               \
        tclass.c                tclass.h                \
        text.c                  \
+       ttfont.c text_xft.c text_pango.c        \
        theme.c                 \
        timers.c                timers.h                \
        tooltips.c              tooltips.h              \
        user.c                  user.h                  \
        util.h                  \
-       ttfont.c                \
        warp.c                  \
        windowmatch.c           windowmatch.h           \
        x.c                     xwin.h                  \
@@ -111,24 +111,29 @@
        $(SRCS_ECOMPMGR)        \
        $(SRCS_SNPRINTF)
 
-
 LDADD = \
        $(LTLIBINTL)            \
        $(LTLIBICONV)           \
        $(ECORE_LIBS)           \
-       $(ESD_LIBS)             \
-       $(IMLIB2_LIBS)          \
-       $(GLX_LIBS)             \
-       $(PANGO_LIBS)           \
-       $(XFT_LIBS)             \
-       $(X_LIBS)               \
-       $(SM_LIBS)              \
-       $(XINERAMA_LIBS)        \
-       $(X_EXTRA_LIBS)         \
-       $(E_X_LIBS)             \
+       $(ESD_LIBS)             \
+       $(IMLIB2_LIBS)          \
+       $(GLX_LIBS)             \
+       $(PANGO_LIBS)           \
+       $(XFT_LIBS)             \
+       $(X_LIBS)               \
+       $(SM_LIBS)              \
+       $(XINERAMA_LIBS)        \
+       $(X_EXTRA_LIBS)         \
+       $(E_X_LIBS)             \
        -lX11 -lm
 
-INCLUDES = -I$(top_builddir) -I$(top_srcdir) $(ECORE_CFLAGS) $(ESD_CFLAGS) 
$(IMLIB2_CFLAGS) $(PANGO_CFLAGS) $(XFT_CFLAGS) $(X_CFLAGS)
+INCLUDES = -I$(top_builddir) -I$(top_srcdir) \
+       $(ECORE_CFLAGS) \
+       $(ESD_CFLAGS) \
+       $(IMLIB2_CFLAGS) \
+       $(PANGO_CFLAGS) \
+       $(XFT_CFLAGS) \
+       $(X_CFLAGS)
 
 install-data-local:
        $(top_srcdir)/mkinstalldirs $(DESTDIR)$(ENLIGHTENMENT_ROOT)/themes
===================================================================
RCS file: /cvs/e/e16/e/src/tclass.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- tclass.h    7 Aug 2007 22:05:16 -0000       1.21
+++ tclass.h    25 Aug 2007 05:38:53 -0000      1.22
@@ -24,6 +24,7 @@
 #ifndef _TCLASS_H
 #define _TCLASS_H
 
+#include "eimage.h"
 #include "etypes.h"
 #include "xwin.h"
 
@@ -37,15 +38,19 @@
 #define FONT_TO_LEFT      3
 
 #define FONT_TYPE_UNKNOWN       0
-#define FONT_TYPE_IFT           1      /* Imlib2/FreeType */
-#define FONT_TYPE_XFT           2      /* Xft             */
-#define FONT_TYPE_XFS           3      /* XFontSet        */
 #define FONT_TYPE_XFONT         0      /* XFontStruct     */
+#define FONT_TYPE_XFS           2      /* XFontSet        */
+#define FONT_TYPE_IFT           3      /* Imlib2/FreeType */
+#if USE_XFT
+#define FONT_TYPE_XFT           4      /* Xft             */
+#endif
+#if USE_PANGO
 #define FONT_TYPE_PANGO_XFT     5      /* Pango-Xft       */
+#endif
 
 typedef struct
 {
-   int                 (*Load) (TextState * ts, int fallback);
+   int                 (*Load) (TextState * ts, const char *name);
    void                (*Destroy) (TextState * ts);
    void                (*TextSize) (TextState * ts, const char *text, int len,
                                    int *width, int *height, int *ascent);
@@ -115,5 +120,10 @@
                             int active, int sticky, int state,
                             const char *text, int x, int y, int w, int h,
                             int fsize, int justification);
+
+int                 _xft_FdcInit(TextState * ts, Win win, Drawable draw);
+void                _xft_FdcFini(TextState * ts);
+void                _xft_FdcSetDrawable(TextState * ts, unsigned long draw);
+void                _xft_FdcSetColor(TextState * ts, XColor * xc);
 
 #endif /* _TCLASS_H */
===================================================================
RCS file: /cvs/e/e16/e/src/text.c,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -3 -r1.90 -r1.91
--- text.c      7 Aug 2007 22:05:16 -0000       1.90
+++ text.c      25 Aug 2007 05:38:53 -0000      1.91
@@ -26,27 +26,6 @@
 #include "tclass.h"
 #include "xwin.h"
 
-#ifdef USE_PANGO
-#include <X11/Xft/Xft.h>
-#include <pango/pangoxft.h>
-/* If we have pango-xft we might as well also have xft */
-#undef USE_XFT
-#define USE_XFT 1
-#else
-#undef FONT_TYPE_PANGO_XFT
-#endif
-
-#ifdef USE_XFT
-#include <X11/extensions/Xrender.h>
-#include <X11/Xft/Xft.h>
-#else
-#undef FONT_TYPE_XFT
-#endif
-
-#if FONT_TYPE_IFT
-extern const FontOps FontOpsIft;
-#endif
-
 static              GC
 _get_gc(Win win)
 {
@@ -417,268 +396,6 @@
    EwcClose();
 }
 
-#if FONT_TYPE_XFT
-/*
- * Xft
- */
-extern const FontOps FontOpsXft;
-
-typedef struct
-{
-   XftFont            *font;
-   Win                 win;
-   Drawable            draw;
-   XftDraw            *xftd;
-   XftColor            xftc;
-} FontCtxXft;
-
-static int
-_xft_Load(TextState * ts, int fallback __UNUSED__)
-{
-   XftFont            *font;
-   FontCtxXft         *fdc;
-   const char         *name;
-
-   name = ts->fontname;
-   if (!strncmp(name, "xft:", 4))
-      name += 4;
-   else if (strchr(name, '/'))
-      return -1;
-
-   if (name[0] == '-')
-      font = XftFontOpenXlfd(disp, VRoot.scr, name);
-   else
-      font = XftFontOpenName(disp, VRoot.scr, name);
-
-   if (!font)
-      return -1;
-
-#if 0                          /* Debug */
-   {
-      FT_Face             ftf = XftLockFace(font);
-
-      if (ftf == NULL)
-        return -1;
-      Eprintf("Font %s family_name=%s style_name=%s\n", name,
-             ftf->family_name, ftf->style_name);
-      XftUnlockFace(font);
-   }
-#endif
-
-   fdc = EMALLOC(FontCtxXft, 1);
-   if (!fdc)
-      return -1;
-   fdc->font = font;
-   ts->fdc = fdc;
-   ts->need_utf8 = 1;
-   ts->type = FONT_TYPE_XFT;
-   ts->ops = &FontOpsXft;
-   return 0;
-}
-
-static void
-_xft_Unload(TextState * ts)
-{
-   FontCtxXft         *fdc = (FontCtxXft *) ts->fdc;
-
-   XftFontClose(disp, fdc->font);
-}
-
-static void
-_xft_TextSize(TextState * ts, const char *text, int len,
-             int *width, int *height, int *ascent)
-{
-   FontCtxXft         *fdc = (FontCtxXft *) ts->fdc;
-   XGlyphInfo          gi;
-
-   if (len == 0)
-      len = strlen(text);
-   XftTextExtentsUtf8(disp, fdc->font, (const XftChar8 *)text, len, &gi);
-   *width = gi.xOff;
-   *height = fdc->font->height;
-   if (*height < fdc->font->ascent + fdc->font->descent)
-      *height = fdc->font->ascent + fdc->font->descent;
-   *ascent = fdc->font->ascent;
-#if 0
-   Eprintf("asc/dsc/h=%d/%d/%d x,y=%2d,%d wxh=%dx%d ox,y=%3d,%d: (%d)%s\n",
-          fdc->font->ascent, fdc->font->descent, fdc->font->height, gi.x, gi.y,
-          gi.width, gi.height, gi.xOff, gi.yOff, len, text);
-#endif
-}
-
-static void
-_xft_TextDraw(TextState * ts, int x, int y, const char *text, int len)
-{
-   FontCtxXft         *fdc = (FontCtxXft *) ts->fdc;
-
-   XftDrawStringUtf8(fdc->xftd, &(fdc->xftc), fdc->font, x, y,
-                    (const XftChar8 *)text, len);
-}
-
-static int
-_xft_FdcInit(TextState * ts, Win win, Drawable draw)
-{
-   FontCtxXft         *fdc = (FontCtxXft *) ts->fdc;
-
-   fdc->win = win;
-   fdc->draw = draw;
-
-   fdc->xftd = XftDrawCreate(disp, draw, WinGetVisual(win), WinGetCmap(win));
-   if (!fdc->xftd)
-      return -1;
-   return 0;
-}
-
-static void
-_xft_FdcFini(TextState * ts)
-{
-   FontCtxXft         *fdc = (FontCtxXft *) ts->fdc;
-
-   XftDrawDestroy(fdc->xftd);
-}
-
-static void
-_xft_FdcSetDrawable(TextState * ts, unsigned long draw)
-{
-   FontCtxXft         *fdc = (FontCtxXft *) ts->fdc;
-
-   if (fdc->draw == draw)
-      return;
-   fdc->draw = draw;
-   XftDrawChange(fdc->xftd, draw);
-}
-
-static void
-_xft_FdcSetColor(TextState * ts, XColor * xc)
-{
-   FontCtxXft         *fdc = (FontCtxXft *) ts->fdc;
-   XRenderColor        xrc;
-
-   xrc.red = xc->red * 256;
-   xrc.green = xc->green * 256;
-   xrc.blue = xc->blue * 256;
-   xrc.alpha = 65535;
-
-   XftColorAllocValue(disp, WinGetVisual(fdc->win), WinGetCmap(fdc->win),
-                     &xrc, &(fdc->xftc));
-}
-
-const FontOps       FontOpsXft = {
-   _xft_Load, _xft_Unload, _xft_TextSize, TextstateTextFit, _xft_TextDraw,
-   _xft_FdcInit, _xft_FdcFini, _xft_FdcSetDrawable, _xft_FdcSetColor
-};
-#endif /* FONT_TYPE_XFT */
-
-#if FONT_TYPE_PANGO_XFT
-/*
- * Pango-Xft
- */
-extern const FontOps FontOpsPangoXft;
-
-static PangoContext *_pango_ctx = NULL;
-
-/* Beware! The layout of FontCtxPangoXft must match FontCtxXft
- * in order to reuse the _xft_Fdc... functions. */
-typedef struct
-{
-   PangoFontDescription *font;
-   Win                 win;
-   Drawable            draw;
-   XftDraw            *xftd;
-   XftColor            xftc;
-} FontCtxPangoXft;
-
-static int
-_pango_xft_Load(TextState * ts, int fallback __UNUSED__)
-{
-   FontCtxPangoXft    *fdc;
-   PangoFontDescription *font;
-   PangoFontMask       flags;
-   const char         *name;
-
-   name = ts->fontname;
-   if (strncmp(name, "pango:", 6))
-      return -1;
-   name += 6;
-
-   if (!_pango_ctx)
-      _pango_ctx = pango_xft_get_context(disp, VRoot.scr);
-   if (!_pango_ctx)
-      return -1;
-
-   font = pango_font_description_from_string(name);
-   if (!font)
-      return -1;
-
-   flags = pango_font_description_get_set_fields(font);
-   if ((flags & PANGO_FONT_MASK_FAMILY) == 0)
-      pango_font_description_set_family(font, "sans");
-   if ((flags & PANGO_FONT_MASK_SIZE) == 0)
-      pango_font_description_set_size(font, 10 * PANGO_SCALE);
-
-   fdc = EMALLOC(FontCtxPangoXft, 1);
-   if (!fdc)
-      return -1;
-   fdc->font = font;
-   ts->fdc = fdc;
-   ts->need_utf8 = 1;
-   ts->type = FONT_TYPE_PANGO_XFT;
-   ts->ops = &FontOpsPangoXft;
-   return 0;
-}
-
-static void
-_pango_xft_Unload(TextState * ts)
-{
-   FontCtxPangoXft    *fdc = (FontCtxPangoXft *) ts->fdc;
-
-   pango_font_description_free(fdc->font);
-}
-
-static void
-_pango_xft_TextSize(TextState * ts, const char *text, int len __UNUSED__,
-                   int *width, int *height, int *ascent)
-{
-   FontCtxPangoXft    *fdc = (FontCtxPangoXft *) ts->fdc;
-   PangoLayout        *layout;
-   PangoRectangle      logical_rect;
-
-   layout = pango_layout_new(_pango_ctx);
-   pango_layout_set_text(layout, text, -1);
-   pango_layout_set_font_description(layout, fdc->font);
-   pango_layout_get_extents(layout, NULL, &logical_rect);
-
-   *width = PANGO_PIXELS(logical_rect.x + logical_rect.width);
-   *height = PANGO_PIXELS(logical_rect.height);
-   *ascent = PANGO_PIXELS(-logical_rect.y);
-
-   g_object_unref(layout);
-}
-
-static void
-_pango_xft_TextDraw(TextState * ts, int x, int y, const char *text,
-                   int len __UNUSED__)
-{
-   FontCtxPangoXft    *fdc = (FontCtxPangoXft *) ts->fdc;
-   PangoLayout        *layout;
-
-   layout = pango_layout_new(_pango_ctx);
-   pango_layout_set_text(layout, text, -1);
-   pango_layout_set_font_description(layout, fdc->font);
-
-   pango_xft_render_layout(fdc->xftd, &(fdc->xftc), layout,
-                          x * PANGO_SCALE, y * PANGO_SCALE);
-
-   g_object_unref(layout);
-}
-
-const FontOps       FontOpsPangoXft = {
-   _pango_xft_Load, _pango_xft_Unload,
-   _pango_xft_TextSize, TextstateTextFit, _pango_xft_TextDraw,
-   _xft_FdcInit, _xft_FdcFini, _xft_FdcSetDrawable, _xft_FdcSetColor
-};
-#endif /* FONT_TYPE_PANGO_XFT */
-
 #if FONT_TYPE_XFS
 /*
  * XFontSet - XCreateFontSet
@@ -695,37 +412,27 @@
 } FontCtxXfs;
 
 static int
-_xfs_Load(TextState * ts, int fallback)
+_xfs_Load(TextState * ts, const char *name)
 {
    XFontSet            font;
    FontCtxXfs         *fdc;
    int                 i, missing_cnt, font_cnt;
-   char              **missing_list, *def_str, **fn;
+   char              **missing_list, *def_str, **fnlr;
    XFontStruct       **fs;
 
-   font = XCreateFontSet(disp, ts->fontname, &missing_list,
-                        &missing_cnt, &def_str);
+   font = XCreateFontSet(disp, name, &missing_list, &missing_cnt, &def_str);
    if (missing_cnt)
       XFreeStringList(missing_list);
-
-   if (!font && fallback)
-     {
-       font = XCreateFontSet(disp, "fixed", &missing_list,
-                             &missing_cnt, &def_str);
-       if (missing_cnt)
-          XFreeStringList(missing_list);
-     }
-
    if (!font)
       return -1;
 
-   if (EDebug(EDBUG_TYPE_FONTS))
+   if (EDebug(EDBUG_TYPE_FONTS) >= 2)
      {
        Eprintf("- XBaseFontNameListOfFontSet %s\n",
                XBaseFontNameListOfFontSet(font));
-       font_cnt = XFontsOfFontSet(font, &fs, &fn);
+       font_cnt = XFontsOfFontSet(font, &fs, &fnlr);
        for (i = 0; i < font_cnt; i++)
-          Eprintf("- XFontsOfFontSet %d: %s\n", i, fn[i]);
+          Eprintf("- XFontsOfFontSet %d: %s\n", i, fnlr[i]);
      }
 
    fdc = EMALLOC(FontCtxXfs, 1);
@@ -734,7 +441,7 @@
    fdc->font = font;
    ts->fdc = fdc;
    fdc->ascent = 0;
-   font_cnt = XFontsOfFontSet(font, &fs, &fn);
+   font_cnt = XFontsOfFontSet(font, &fs, &fnlr);
    for (i = 0; i < font_cnt; i++)
       fdc->ascent = MAX(fs[i]->ascent, fdc->ascent);
    ts->type = FONT_TYPE_XFS;
@@ -822,24 +529,15 @@
 } FontCtxXfont;
 
 static int
-_xfont_Load(TextState * ts, int fallback __UNUSED__)
+_xfont_Load(TextState * ts, const char *name)
 {
-   XFontStruct        *font = NULL;
+   XFontStruct        *font;
    FontCtxXfont       *fdc;
 
-   if (strchr(ts->fontname, ',') == NULL)
-      font = XLoadQueryFont(disp, ts->fontname);
-   if (font)
-      goto done;
-
-   /* This one really should succeed! */
-   font = XLoadQueryFont(disp, "fixed");
-   if (font)
-      goto done;
-
-   return -1;                  /* Failed */
+   font = XLoadQueryFont(disp, name);
+   if (!font)
+      return -1;
 
- done:
    fdc = EMALLOC(FontCtxXfont, 1);
    if (!fdc)
       return -1;
@@ -952,9 +650,51 @@
    ts->ops->TextDraw(ts, x, y, text, len);
 }
 
+typedef struct
+{
+   const char         *type;
+   const FontOps      *ops;
+   char                checked;
+} FontHandler;
+
+#define FONT(type, ops, opsm) { type, ops, 0 }
+
+#if FONT_TYPE_IFT
+extern const FontOps FontOps_ift;
+#endif
+#if FONT_TYPE_XFT
+extern const FontOps FontOps_xft;
+#endif
+#if FONT_TYPE_PANGO_XFT
+extern const FontOps FontOps_pango;
+#endif
+
+static FontHandler  fhs[] = {
+#if FONT_TYPE_XFONT
+   FONT("xfont", &FontOpsXfont, &FontOpsXfont),        /* XFontStruct - 
XLoadQueryFont */
+#endif
+#if FONT_TYPE_XFS
+   FONT("xfs", &FontOpsXfs, &FontOpsXfs),      /* XFontSet - XCreateFontSet */
+#endif
+#if FONT_TYPE_IFT
+   FONT("ift", &FontOps_ift, NULL),    /* Imlib2/FreeType */
+#endif
+#if FONT_TYPE_XFT
+   FONT("xft", &FontOps_xft, NULL),    /* Xft */
+#endif
+#if FONT_TYPE_PANGO_XFT
+   FONT("pango", &FontOps_pango, NULL),        /* Pango-Xft */
+#endif
+   {NULL, NULL, 0},
+};
+
 static void
 TextStateLoadFont(TextState * ts)
 {
+   const char         *s, *type, *name;
+   char                buf[1024];
+   FontHandler        *fhp = fhs;
+
    if (!ts->fontname)
       return;
 
@@ -964,28 +704,48 @@
 
    ts->need_utf8 = Mode.locale.utf8_int;
 
+   type = NULL;
+   name = ts->fontname;
 #if FONT_TYPE_IFT
-   if (!FontOpsIft.Load(ts, 0))        /* Imlib2/FreeType */
-      goto done;
+   if (strchr(ts->fontname, '/'))
+     {
+       type = "ift";
+       goto check;
+     }
 #endif
 #if FONT_TYPE_XFS
-   if (!FontOpsXfs.Load(ts, 0))        /* XFontSet - XCreateFontSet */
-      goto done;
-#endif
-#if FONT_TYPE_PANGO_XFT
-   if (!FontOpsPangoXft.Load(ts, 0))   /* Pango-Xft */
-      goto done;
-#endif
-#if FONT_TYPE_XFT
-   if (!FontOpsXft.Load(ts, 0))        /* Xft */
-      goto done;
+   if (ts->fontname[0] == '-')
+     {
+       type = "xfs";
+       goto check;
+     }
 #endif
+   s = strchr(ts->fontname, ':');
+   if (!s || s == ts->fontname)
+      goto fallback;
+   if (s - ts->fontname > 16)
+      goto fallback;
+   memcpy(buf, ts->fontname, s - ts->fontname);
+   buf[s - ts->fontname] = '\0';
+   type = buf;
+   name = s + 1;
+
+ check:
+   for (fhp = fhs; fhp->type; fhp++)
+     {
+       if (strcmp(fhp->type, type))
+          continue;
+       ts->ops = fhp->ops;
+       ts->ops->Load(ts, name);
+       goto done;
+     }
+ fallback:
 #if FONT_TYPE_XFS
-   if (!FontOpsXfs.Load(ts, 1))        /* XFontSet - XCreateFontSet */
+   if (!FontOpsXfs.Load(ts, "fixed"))  /* XFontSet - XCreateFontSet */
       goto done;
 #endif
 #if FONT_TYPE_XFONT
-   if (!FontOpsXfont.Load(ts, 1))      /* XFontStruct - XLoadQueryFont */
+   if (!FontOpsXfont.Load(ts, "fixed"))        /* XFontStruct - XLoadQueryFont 
*/
       goto done;
 #endif
 
===================================================================
RCS file: /cvs/e/e16/e/src/ttfont.c,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -3 -r1.60 -r1.61
--- ttfont.c    17 Jan 2007 01:10:43 -0000      1.60
+++ ttfont.c    25 Aug 2007 05:38:53 -0000      1.61
@@ -22,11 +22,16 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 #include "E.h"
-#include "eimage.h"
 #include "tclass.h"
-#include <Imlib2.h>
 
 #if FONT_TYPE_IFT
+#include "eimage.h"
+#include <Imlib2.h>
+
+/*
+ * Imlib2/FreeType
+ */
+extern const FontOps FontOps_ift;
 
 typedef void        EFont;
 
@@ -97,11 +102,6 @@
    imlib_text_draw(x, y - imlib_get_font_ascent(), text);
 }
 
-/*
- * Imlib2/FreeType
- */
-extern const FontOps FontOpsIft;
-
 typedef struct
 {
    EFont              *font;
@@ -110,7 +110,7 @@
 } FontCtxIft;
 
 static int
-_ift_Load(TextState * ts, int fallback __UNUSED__)
+_ift_Load(TextState * ts, const char *name __UNUSED__)
 {
    EFont              *font;
    FontCtxIft         *fdc;
@@ -138,7 +138,7 @@
    ts->fdc = fdc;
    ts->need_utf8 = 1;
    ts->type = FONT_TYPE_IFT;
-   ts->ops = &FontOpsIft;
+   ts->ops = &FontOps_ift;
    return 0;
 }
 
@@ -191,7 +191,7 @@
    EGetColor(xc, &(fdc->r), &(fdc->g), &(fdc->b));
 }
 
-const FontOps       FontOpsIft = {
+const FontOps       FontOps_ift = {
    _ift_Load, _ift_Unload, _ift_TextSize, TextstateTextFit, _ift_TextDraw,
    _ift_FdcInit, NULL, _ift_FdcSetDrawable, _ift_FdcSetColor
 };



-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to