]> granicus.if.org Git - graphviz/commitdiff
make textlayout respect -Gdpi
authorellson <devnull@localhost>
Thu, 30 Aug 2007 19:20:21 +0000 (19:20 +0000)
committerellson <devnull@localhost>
Thu, 30 Aug 2007 19:20:21 +0000 (19:20 +0000)
plugin/gd/gvtextlayout_gd.c
plugin/pango/gvrender_pango.c
plugin/pango/gvtextlayout_pango.c

index c64ebd7c2b5e3cfc7d3d21416088720fc3c40b3f..b2646c5f900eae13b7dfbf3c2b60ad626dc6949b 100644 (file)
@@ -97,17 +97,18 @@ char *gd_alternate_fontlist(char *font)
 }
 #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;
@@ -116,18 +117,21 @@ static boolean gd_textlayout(GVCOMMON_t *common, textpara_t * para, char **fontp
 
     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
@@ -137,7 +141,7 @@ static boolean gd_textlayout(GVCOMMON_t *common, textpara_t * para, char **fontp
 #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);
@@ -160,6 +164,7 @@ static boolean gd_textlayout(GVCOMMON_t *common, textpara_t * para, char **fontp
              * see LINESPACING in const.h.
              */
            para->height = (int)(para->fontsize * 1.2);
+            para->yoffset = 0.0;
        }
     }
     return TRUE;
index 6b1dbc0d1ce9f7856618b4b5392baf6adf0860b7..e65df32a5620470aae61d0249aa7ef165308613d 100644 (file)
@@ -246,7 +246,6 @@ static void cairogen_textpara(GVJ_t * job, pointf p, textpara_t * para)
     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));
@@ -263,11 +262,8 @@ static void cairogen_textpara(GVJ_t * job, pointf p, textpara_t * para)
        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);
 }
 
index 297c57ab9c436d8747649c7b80f070f1970d25ce..c67c82ca6b5ed07227b3231990dbca9d8044f991 100644 (file)
@@ -32,7 +32,7 @@ static void pango_free_layout (void *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;
@@ -42,9 +42,9 @@ static boolean pango_textlayout(GVCOMMON_t *common, textpara_t * para, char **fo
     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;
@@ -54,7 +54,7 @@ static boolean pango_textlayout(GVCOMMON_t *common, textpara_t * para, char **fo
 
     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));
 
@@ -128,7 +128,8 @@ static boolean pango_textlayout(GVCOMMON_t *common, textpara_t * para, char **fo
 #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
@@ -154,14 +155,16 @@ static boolean pango_textlayout(GVCOMMON_t *common, textpara_t * para, char **fo
     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;