}
#endif /* HAVE_GD_FONTCONFIG */
-static boolean gd_textlayout(GVCOMMON_t *common, textpara_t * para, char **fontpath)
+static boolean gd_textlayout(textpara_t * para, char **fontpath)
{
char *err;
char *fontlist;
int brect[8];
gdFTStringExtra strex;
+ double fontsize;
strex.flags = gdFTEX_XSHOW
| gdFTEX_RETURNFONTPATHNAME | gdFTEX_RESOLUTION;
strex.xshow = NULL;
- strex.hdpi = strex.vdpi = 72;
+ strex.hdpi = strex.vdpi = (int)para->dpi;
if (strstr(para->fontname, "/"))
strex.flags |= gdFTEX_FONTPATHNAME;
para->width = 0.0;
para->height = 0.0;
+ para->yoffset = 0.0;
para->xshow = NULL;
para->layout = NULL;
para->free_layout = NULL;
+ fontsize = para->fontsize * POINTS_PER_INCH / para->dpi;
+
if (para->fontname) {
- if (para->fontsize <= FONTSIZE_MUCH_TOO_SMALL) {
+ if (fontsize <= FONTSIZE_MUCH_TOO_SMALL) {
return TRUE; /* OK, but ignore text entirely */
- } else if (para->fontsize <= FONTSIZE_TOO_SMALL) {
+ } else if (fontsize <= FONTSIZE_TOO_SMALL) {
/* draw line in place of text */
/* fake a finite fontsize so that line length is calculated */
- para->fontsize = FONTSIZE_TOO_SMALL;
+ fontsize = FONTSIZE_TOO_SMALL;
}
/* call gdImageStringFT with null *im to get brect and to set font cache */
#ifdef HAVE_GD_FONTCONFIG
#endif
err = gdImageStringFTEx(NULL, brect, -1, fontlist,
- para->fontsize, 0, 0, 0, para->str, &strex);
+ fontsize, 0, 0, 0, para->str, &strex);
if (err) {
fprintf(stderr,"%s\n", err);
* see LINESPACING in const.h.
*/
para->height = (int)(para->fontsize * 1.2);
+ para->yoffset = 0.0;
}
}
return TRUE;
cairo_t *cr = (cairo_t *) job->surface;
pointf offset;
PangoLayout *layout = (PangoLayout*)(para->layout);
- PangoLayoutIter* iter;
cairo_set_dash (cr, dashed, 0, 0.0); /* clear any dashing */
cairogen_set_color(cr, &(obj->pencolor));
offset.x = para->width / 2.0;
break;
}
- /* offset to baseline */
- iter = pango_layout_get_iter (layout);
- offset.y = pango_layout_iter_get_baseline (iter) / PANGO_SCALE;
- cairo_move_to (cr, p.x-offset.x, -p.y-offset.y);
+ cairo_move_to (cr, p.x-offset.x, -p.y - para->yoffset);
pango_cairo_show_layout(cr, layout);
}
g_object_unref((PangoLayout*)layout);
}
-static boolean pango_textlayout(GVCOMMON_t *common, textpara_t * para, char **fontpath)
+static boolean pango_textlayout(textpara_t * para, char **fontpath)
{
static char buf[1024]; /* returned in fontpath, only good until next call */
static PangoFontMap *fontmap;
char *fnt;
PangoLayout *layout;
PangoRectangle ink_rect, logical_rect;
+ PangoLayoutIter* iter;
#if ENABLE_PANGO_XSHOW
PangoRectangle char_rect;
- PangoLayoutIter* iter;
#endif
#ifdef ENABLE_PANGO_MARKUP
PangoAttrList *attrs;
if (!fontmap)
fontmap = pango_cairo_font_map_get_default();
- pango_cairo_font_map_set_resolution(PANGO_CAIRO_FONT_MAP(fontmap), (double)POINTS_PER_INCH);
+ pango_cairo_font_map_set_resolution(PANGO_CAIRO_FONT_MAP(fontmap), para->dpi);
if (!context)
context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP(fontmap));
#endif
}
}
- pango_font_description_set_size (desc, (gint)(para->fontsize * PANGO_SCALE));
+ pango_font_description_set_size (desc,
+ (gint)(para->fontsize * PANGO_SCALE * POINTS_PER_INCH / para->dpi));
#ifdef ENABLE_PANGO_MARKUP
if (logical_rect.width == 0)
logical_rect.height = 0;
- para->width = (double)logical_rect.width / PANGO_SCALE;
- para->height = (double)logical_rect.height / PANGO_SCALE;
+ para->width = logical_rect.width / PANGO_SCALE;
+ para->height = logical_rect.height / PANGO_SCALE;
+
+ iter = pango_layout_get_iter (layout);
+ para->yoffset = pango_layout_iter_get_baseline (iter) / PANGO_SCALE;
/* determine position of each character in the layout */
para->xshow = NULL;
#ifdef ENABLE_PANGO_XSHOW
/* FIXME - unfinished code */
- iter = pango_layout_get_iter (layout);
do {
pango_layout_iter_get_char_extents (iter, &char_rect);
char_rect.x /= PANGO_SCALE;