From 8f9aae0cc29d91dd9b4e3d3639ed3d58a7aa923b Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Fri, 15 Jul 2005 14:39:31 +0000 Subject: [PATCH] fix the dpi stuff with pango by reading the right ascent and descent stuff --- render/font.c | 36 ++++++++++++++++++++++++++---------- render/font.h | 1 + render/geom.h | 4 ++-- render/render.c | 8 ++++---- render/render.h | 3 ++- 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/render/font.c b/render/font.c index d26a64f2..0f2ce8fb 100644 --- a/render/font.c +++ b/render/font.c @@ -21,6 +21,7 @@ #include "color.h" #include "mask.h" #include "theme.h" +#include "geom.h" #include "gettext.h" #include @@ -42,6 +43,9 @@ FcObjectType objs[] = { { OB_SHADOW_ALPHA, FcTypeInteger } }; +PangoFontMap *pfm; +PangoContext *context; + static gboolean started = FALSE; static void font_startup(void) @@ -53,6 +57,9 @@ static void font_startup(void) #ifdef USE_PANGO g_type_init(); + /* these will never be freed, but we will need them until we shut down anyway */ + pfm = pango_xft_get_font_map(RrDisplay(NULL), RrScreen(NULL)); + context = pango_xft_get_context(RrDisplay(NULL), RrScreen(NULL)); #endif /* USE_PANGO */ /* Here we are teaching xft about the shadow, shadowoffset & shadowtint */ FcNameRegisterObjectTypes(objs, (sizeof(objs) / sizeof(objs[0]))); @@ -119,6 +126,9 @@ static RrFont *openfont(const RrInstance *inst, gchar *fontstring) /* TODO: is PANGO_SCALE correct ?? */ pango_font_description_set_size(out->pango_font_description, tmp_int*PANGO_SCALE); } + + PangoFontset *pfs = pango_font_map_load_fontset(pfm, context, out->pango_font_description, NULL); + out->pango_font_metrics = pango_fontset_get_metrics(pfs); #endif /* USE_PANGO */ if (FcPatternGetBool(match, OB_SHADOW, 0, &out->shadow) != FcResultMatch) @@ -177,16 +187,18 @@ void RrFontClose(RrFont *f) XftFontClose(RrDisplay(f->inst), f->xftfont); g_free(f); } +#ifdef USE_PANGO + pango_font_metrics_unref(f->pango_font_metrics); + pango_font_description_free(f->pango_font_description); +#endif } static void font_measure_full(const RrFont *f, const gchar *str, gint *x, gint *y) { #ifdef USE_PANGO - PangoContext *context; PangoLayout *pl; PangoRectangle rect; - context = pango_xft_get_context (RrDisplay(f->inst), RrScreen(f->inst)); pl = pango_layout_new (context); pango_layout_set_text(pl, str, -1); pango_layout_set_font_description(pl, f->pango_font_description); @@ -195,7 +207,6 @@ static void font_measure_full(const RrFont *f, const gchar *str, *x = rect.width + (f->shadow ? ABS(f->offset) : 0); *y = rect.height + (f->shadow ? ABS(f->offset) : 0); g_object_unref(pl); - g_object_unref(context); #else XGlyphInfo info; @@ -208,17 +219,25 @@ static void font_measure_full(const RrFont *f, const gchar *str, #endif /* USE_PANGO */ } -gint RrFontMeasureString(const RrFont *f, const gchar *str) +RrSize *RrFontMeasureString(const RrFont *f, const gchar *str) { - gint x, y; - font_measure_full (f, str, &x, &y); - return x + 4; + RrSize *size; + size = g_new(RrSize, 1); + font_measure_full (f, str, &size->width, &size->height); + return size; } gint RrFontHeight(const RrFont *f) { +#ifdef USE_PANGO + int ascent, descent; + ascent = pango_font_metrics_get_ascent(f->pango_font_metrics); + descent = pango_font_metrics_get_descent(f->pango_font_metrics); + return (ascent + descent) / PANGO_SCALE; +#else return f->xftfont->ascent + f->xftfont->descent + (f->shadow ? f->offset : 0); +#endif } gint RrFontMaxCharWidth(const RrFont *f) @@ -237,10 +256,8 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area) gboolean shortened = FALSE; #else PangoLayout *pl; - PangoContext *context; PangoRectangle rect; - context = pango_xft_get_context (RrDisplay(t->font->inst), RrScreen(t->font->inst)); pl = pango_layout_new (context); #endif /* USE_PANGO */ @@ -338,7 +355,6 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area) #else /* USE_PANGO */ pango_xft_render_layout(d, &c, pl, x * PANGO_SCALE, y * PANGO_SCALE); g_object_unref(pl); - g_object_unref(context); #endif g_string_free(text, TRUE); diff --git a/render/font.h b/render/font.h index 1ddeb047..8f0d4e6f 100644 --- a/render/font.h +++ b/render/font.h @@ -29,6 +29,7 @@ struct _RrFont { const RrInstance *inst; #ifdef USE_PANGO PangoFontDescription *pango_font_description; + PangoFontMetrics *pango_font_metrics; #endif /* USE_PANGO */ XftFont *xftfont; gint elipses_length; diff --git a/render/geom.h b/render/geom.h index dcf06ea5..9768235e 100644 --- a/render/geom.h +++ b/render/geom.h @@ -16,8 +16,8 @@ See the COPYING file for a copy of the GNU General Public License. */ -#ifndef __geom_h -#define __geom_h +#ifndef __render_geom_h +#define __render_geom_h typedef struct { int width; diff --git a/render/render.c b/render/render.c index cb29165e..a4161405 100644 --- a/render/render.c +++ b/render/render.c @@ -311,7 +311,7 @@ void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b) void RrMinsize(RrAppearance *a, gint *w, gint *h) { gint i; - gint m; + RrSize *m; gint l, t, r, b; *w = *h = 0; @@ -326,9 +326,9 @@ void RrMinsize(RrAppearance *a, gint *w, gint *h) case RR_TEXTURE_TEXT: m = RrFontMeasureString(a->texture[i].data.text.font, a->texture[i].data.text.string); - *w = MAX(*w, m); - m = RrFontHeight(a->texture[i].data.text.font); - *h += MAX(*h, m); + *w = MAX(*w, m->width + 4); + m->height = RrFontHeight(a->texture[i].data.text.font); + *h += MAX(*h, m->height); break; case RR_TEXTURE_RGBA: *w += MAX(*w, a->texture[i].data.rgba.width); diff --git a/render/render.h b/render/render.h index ab481b40..3ff0636b 100644 --- a/render/render.h +++ b/render/render.h @@ -20,6 +20,7 @@ #ifndef __render_h #define __render_h +#include "geom.h" #include "version.h" #include /* some platforms dont include this as needed for Xft */ @@ -202,7 +203,7 @@ RrAppearance *RrAppearanceNew (const RrInstance *inst, gint numtex); RrAppearance *RrAppearanceCopy (RrAppearance *a); void RrAppearanceFree (RrAppearance *a); -gint RrFontMeasureString (const RrFont *f, const gchar *str); +RrSize *RrFontMeasureString (const RrFont *f, const gchar *str); gint RrFontHeight (const RrFont *f); gint RrFontMaxCharWidth (const RrFont *f); -- 2.45.2