summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
Diffstat (limited to 'render')
-rw-r--r--render/font.c36
-rw-r--r--render/font.h1
-rw-r--r--render/geom.h4
-rw-r--r--render/render.c8
-rw-r--r--render/render.h3
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 <X11/Xft/Xft.h>
@@ -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 <X11/Xlib.h> /* 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);