Optionally use pango for font rendering.
SVN revision: 31218
This commit is contained in:
parent
fb662352ca
commit
90139eb915
|
@ -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 = \
|
||||
|
|
|
@ -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
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
11
src/tclass.h
11
src/tclass.h
|
@ -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
|
||||
{
|
||||
|
|
124
src/text.c
124
src/text.c
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue