Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: Makefile.am tclass.h text.c Log Message: Optionally use pango for font rendering. =================================================================== RCS file: /cvs/e/e16/e/src/Makefile.am,v retrieving revision 1.89 retrieving revision 1.90 diff -u -3 -r1.89 -r1.90 --- Makefile.am 18 Jul 2007 11:18:50 -0000 1.89 +++ Makefile.am 7 Aug 2007 22:05:16 -0000 1.90 @@ -118,6 +118,7 @@ $(ESD_LIBS) \ $(IMLIB2_LIBS) \ $(GLX_LIBS) \ + $(PANGO_LIBS) \ $(XFT_LIBS) \ $(X_LIBS) \ $(SM_LIBS) \ @@ -126,7 +127,7 @@ $(E_X_LIBS) \ -lX11 -lm -INCLUDES = -I$(top_builddir) -I$(top_srcdir) $(ECORE_CFLAGS) $(ESD_CFLAGS) $(IMLIB2_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.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- tclass.h 27 Jul 2007 16:59:50 -0000 1.20 +++ tclass.h 7 Aug 2007 22:05:16 -0000 1.21 @@ -36,11 +36,12 @@ #define FONT_TO_UP 2 #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_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_PANGO_XFT 5 /* Pango-Xft */ typedef struct { =================================================================== RCS file: /cvs/e/e16/e/src/text.c,v retrieving revision 1.89 retrieving revision 1.90 diff -u -3 -r1.89 -r1.90 --- text.c 7 Aug 2007 15:21:49 -0000 1.89 +++ text.c 7 Aug 2007 22:05:16 -0000 1.90 @@ -26,6 +26,16 @@ #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> @@ -559,6 +569,116 @@ }; #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 @@ -850,6 +970,10 @@ #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 ------------------------------------------------------------------------- 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