make the pango rendering code really complicated because that is the only way to make it draw correctly
This commit is contained in:
parent
8f9aae0cc2
commit
a5100fe677
2 changed files with 44 additions and 28 deletions
|
@ -128,7 +128,10 @@ static RrFont *openfont(const RrInstance *inst, gchar *fontstring)
|
||||||
}
|
}
|
||||||
|
|
||||||
PangoFontset *pfs = pango_font_map_load_fontset(pfm, context, out->pango_font_description, NULL);
|
PangoFontset *pfs = pango_font_map_load_fontset(pfm, context, out->pango_font_description, NULL);
|
||||||
out->pango_font_metrics = pango_fontset_get_metrics(pfs);
|
PangoFontMetrics *metrics = pango_fontset_get_metrics(pfs);
|
||||||
|
out->pango_ascent = pango_font_metrics_get_ascent(metrics);
|
||||||
|
out->pango_descent = pango_font_metrics_get_descent(metrics);
|
||||||
|
pango_font_metrics_unref(metrics);
|
||||||
#endif /* USE_PANGO */
|
#endif /* USE_PANGO */
|
||||||
|
|
||||||
if (FcPatternGetBool(match, OB_SHADOW, 0, &out->shadow) != FcResultMatch)
|
if (FcPatternGetBool(match, OB_SHADOW, 0, &out->shadow) != FcResultMatch)
|
||||||
|
@ -188,7 +191,6 @@ void RrFontClose(RrFont *f)
|
||||||
g_free(f);
|
g_free(f);
|
||||||
}
|
}
|
||||||
#ifdef USE_PANGO
|
#ifdef USE_PANGO
|
||||||
pango_font_metrics_unref(f->pango_font_metrics);
|
|
||||||
pango_font_description_free(f->pango_font_description);
|
pango_font_description_free(f->pango_font_description);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -230,10 +232,9 @@ RrSize *RrFontMeasureString(const RrFont *f, const gchar *str)
|
||||||
gint RrFontHeight(const RrFont *f)
|
gint RrFontHeight(const RrFont *f)
|
||||||
{
|
{
|
||||||
#ifdef USE_PANGO
|
#ifdef USE_PANGO
|
||||||
int ascent, descent;
|
return (f->pango_ascent
|
||||||
ascent = pango_font_metrics_get_ascent(f->pango_font_metrics);
|
+ f->pango_descent
|
||||||
descent = pango_font_metrics_get_descent(f->pango_font_metrics);
|
) / PANGO_SCALE;
|
||||||
return (ascent + descent) / PANGO_SCALE;
|
|
||||||
#else
|
#else
|
||||||
return f->xftfont->ascent + f->xftfont->descent +
|
return f->xftfont->ascent + f->xftfont->descent +
|
||||||
(f->shadow ? f->offset : 0);
|
(f->shadow ? f->offset : 0);
|
||||||
|
@ -256,6 +257,7 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
|
||||||
gboolean shortened = FALSE;
|
gboolean shortened = FALSE;
|
||||||
#else
|
#else
|
||||||
PangoLayout *pl;
|
PangoLayout *pl;
|
||||||
|
PangoLayoutLine *pll;
|
||||||
PangoRectangle rect;
|
PangoRectangle rect;
|
||||||
|
|
||||||
pl = pango_layout_new (context);
|
pl = pango_layout_new (context);
|
||||||
|
@ -291,6 +293,26 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
|
||||||
}
|
}
|
||||||
if (!l) return;
|
if (!l) return;
|
||||||
|
|
||||||
|
l = strlen(text->str); /* number of bytes */
|
||||||
|
|
||||||
|
#else
|
||||||
|
pango_layout_set_text(pl, text->str, -1);
|
||||||
|
pango_layout_set_font_description(pl, t->font->pango_font_description);
|
||||||
|
pango_layout_set_single_paragraph_mode(pl, TRUE);
|
||||||
|
pango_layout_set_width(pl, w * PANGO_SCALE);
|
||||||
|
pango_layout_set_ellipsize(pl, PANGO_ELLIPSIZE_MIDDLE);
|
||||||
|
/* This doesn't work with layout_line() of course */
|
||||||
|
/* pango_layout_set_alignment(pl, (PangoAlignment)(t->justify)); */
|
||||||
|
pango_layout_get_pixel_extents(pl, NULL, &rect);
|
||||||
|
mw = rect.width;
|
||||||
|
y = area->y +
|
||||||
|
area->height / 2 +
|
||||||
|
/* go to great lengths to center the text while keeping the baseline in
|
||||||
|
* the same place */
|
||||||
|
t->font->pango_descent / PANGO_SCALE;
|
||||||
|
|
||||||
|
#endif /* USE_PANGO */
|
||||||
|
|
||||||
switch (t->justify) {
|
switch (t->justify) {
|
||||||
case RR_JUSTIFY_LEFT:
|
case RR_JUSTIFY_LEFT:
|
||||||
break;
|
break;
|
||||||
|
@ -302,21 +324,6 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
l = strlen(text->str); /* number of bytes */
|
|
||||||
|
|
||||||
#else
|
|
||||||
pango_layout_set_text(pl, text->str, -1);
|
|
||||||
pango_layout_set_font_description(pl, t->font->pango_font_description);
|
|
||||||
pango_layout_set_single_paragraph_mode(pl, TRUE);
|
|
||||||
pango_layout_set_width(pl, w * PANGO_SCALE);
|
|
||||||
pango_layout_set_ellipsize(pl, PANGO_ELLIPSIZE_MIDDLE);
|
|
||||||
pango_layout_set_alignment(pl, (PangoAlignment)(t->justify));
|
|
||||||
pango_layout_get_pixel_extents(pl, NULL, &rect);
|
|
||||||
y = area->y +
|
|
||||||
(area->height - rect.height) / 2;
|
|
||||||
|
|
||||||
#endif /* USE_PANGO */
|
|
||||||
|
|
||||||
if (t->font->shadow) {
|
if (t->font->shadow) {
|
||||||
if (t->font->tint >= 0) {
|
if (t->font->tint >= 0) {
|
||||||
c.color.red = 0;
|
c.color.red = 0;
|
||||||
|
@ -338,8 +345,10 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
|
||||||
t->font->xftfont->ascent + y + t->font->offset,
|
t->font->xftfont->ascent + y + t->font->offset,
|
||||||
(FcChar8*)text->str, l);
|
(FcChar8*)text->str, l);
|
||||||
#else /* USE_PANGO */
|
#else /* USE_PANGO */
|
||||||
pango_xft_render_layout(d, &c, pl, (x + t->font->offset) * PANGO_SCALE,
|
/* see below... */
|
||||||
(y + t->font->offset) * PANGO_SCALE);
|
pango_xft_render_layout_line(d, &c, pll = pango_layout_get_line(pl, 0),
|
||||||
|
(x + t->font->offset) * PANGO_SCALE,
|
||||||
|
(y + t->font->offset) * PANGO_SCALE);
|
||||||
#endif /* USE_PANGO */
|
#endif /* USE_PANGO */
|
||||||
}
|
}
|
||||||
c.color.red = t->color->r | t->color->r << 8;
|
c.color.red = t->color->r | t->color->r << 8;
|
||||||
|
@ -353,7 +362,13 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
|
||||||
t->font->xftfont->ascent + y,
|
t->font->xftfont->ascent + y,
|
||||||
(FcChar8*)text->str, l);
|
(FcChar8*)text->str, l);
|
||||||
#else /* USE_PANGO */
|
#else /* USE_PANGO */
|
||||||
pango_xft_render_layout(d, &c, pl, x * PANGO_SCALE, y * PANGO_SCALE);
|
/* This looks retarded, but layout_line() bases y on the baseline, while
|
||||||
|
* layout() bases y on the top of the ink layout shit ass fucking crap.
|
||||||
|
* We want the baseline to always be in the same place, thusly, we use
|
||||||
|
* layout_line()
|
||||||
|
* The actual line doesn't need to be freed */
|
||||||
|
pango_xft_render_layout_line(d, &c, pll = pango_layout_get_line(pl, 0),
|
||||||
|
x * PANGO_SCALE, y * PANGO_SCALE);
|
||||||
g_object_unref(pl);
|
g_object_unref(pl);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -27,15 +27,16 @@
|
||||||
|
|
||||||
struct _RrFont {
|
struct _RrFont {
|
||||||
const RrInstance *inst;
|
const RrInstance *inst;
|
||||||
#ifdef USE_PANGO
|
|
||||||
PangoFontDescription *pango_font_description;
|
|
||||||
PangoFontMetrics *pango_font_metrics;
|
|
||||||
#endif /* USE_PANGO */
|
|
||||||
XftFont *xftfont;
|
XftFont *xftfont;
|
||||||
gint elipses_length;
|
gint elipses_length;
|
||||||
gint shadow;
|
gint shadow;
|
||||||
gchar tint;
|
gchar tint;
|
||||||
gint offset;
|
gint offset;
|
||||||
|
#ifdef USE_PANGO
|
||||||
|
PangoFontDescription *pango_font_description;
|
||||||
|
gint pango_ascent;
|
||||||
|
gint pango_descent;
|
||||||
|
#endif /* USE_PANGO */
|
||||||
};
|
};
|
||||||
|
|
||||||
RrFont *RrFontOpen(const RrInstance *inst, gchar *fontstring);
|
RrFont *RrFontOpen(const RrInstance *inst, gchar *fontstring);
|
||||||
|
|
Loading…
Reference in a new issue