Optionally use pango for font rendering.

SVN revision: 31218
This commit is contained in:
Kim Woelders 2007-08-07 22:05:16 +00:00
parent fb662352ca
commit 90139eb915
6 changed files with 176 additions and 7 deletions

View File

@ -5,7 +5,7 @@ config_DATA = \
definitions \
actionclasses.cfg bindings.cfg matches.cfg menus.cfg \
e16keyedit.db \
fonts.cfg.xft
fonts.cfg.xft fonts.cfg.pango
menudir = $(ENLIGHTENMENT_ROOT)/config/menus
menu_DATA = \

35
config/fonts.cfg.pango Normal file
View File

@ -0,0 +1,35 @@
/* Pango font example */
#include <definitions>
__E_CFG_VERSION 1
__FONTS __BGN
font-default "pango:sans bold 8"
font-border "pango:sans bold 8"
font-border-italic "pango:sans italic 8"
font-border-small "pango:sans 6"
font-coords "pango:sans bold 8"
font-dialog "pango:sans 8"
font-dialog-hilite "pango:sans bold 8"
font-dialog-italic "pango:sans italic 8"
font-epplet "pango:sans 6"
font-epplet-small "pango:sans 6"
font-epplet-medium "pango:sans 8"
font-epplet-large "pango:sans 10"
font-focus "pango:sans bold 8"
font-iconbox "pango:sans bold 8"
font-init "pango:sans bold 9"
font-menu "pango:sans 8"
font-pager "pango:sans bold 8"
font-tooltip "pango:sans bold 8"
__END

View File

@ -128,6 +128,13 @@ if test "x$enable_sm" = "xyes"; then
AC_DEFINE(HAVE_SM, 1, [Session management support])
fi
AC_ARG_ENABLE(pango,
[ --enable-pango compile with pango-xft support @<:@default=no@:>@],,
enable_pango=no)
if test "x$enable_pango" = "xyes"; then
PKG_CHECK_MODULES(PANGO, pangoxft, AC_DEFINE(USE_PANGO, 1, [pango-xft support]), enable_pango=no)
fi
AC_ARG_ENABLE(xft,
[ --enable-xft compile with Xft support @<:@default=yes@:>@],,
enable_xft=yes)
@ -331,6 +338,7 @@ echo " Sound ........................ $enable_sound"
echo " Old GNOME hints .............. $enable_hints_gnome"
echo " Session management ........... $enable_sm"
echo " Zoom ......................... $enable_zoom"
echo " Pango ........................ $enable_pango"
echo " Xft .......................... $enable_xft"
echo " Xinerama ..................... $enable_xinerama"
echo " RandR ........................ $enable_xrandr"

View File

@ -118,6 +118,7 @@ LDADD = \
$(ESD_LIBS) \
$(IMLIB2_LIBS) \
$(GLX_LIBS) \
$(PANGO_LIBS) \
$(XFT_LIBS) \
$(X_LIBS) \
$(SM_LIBS) \
@ -126,7 +127,7 @@ LDADD = \
$(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

View File

@ -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
{

View File

@ -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 @@ const FontOps FontOpsXft = {
};
#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
@ -852,6 +972,10 @@ TextStateLoadFont(TextState * ts)
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;