示例#1
0
int getTruetypeTextBBoxGD(rendererVTableObj *renderer, char **fonts, int numfonts, double size, char *string, rectObj *rect, double **advances, int bAdjustBaseline) {
#ifdef USE_GD_FT
   int bbox[8];
   char *error;
   if(advances) {
#if defined (GD_HAS_FTEX_XSHOW)
      char *s;
      int k;
      gdFTStringExtra strex;
      strex.flags = gdFTEX_XSHOW;
      error = gdImageStringFTEx(NULL, bbox, 0, fonts[0], size, 0, 0, 0, string, &strex);
      if(error) {
         msSetError(MS_TTFERR, error, "gdImageStringFTEx()");
         return(MS_FAILURE);
      }

      *advances = (double*)malloc( strlen(string) * sizeof(double) );
      MS_CHECK_ALLOC(*advances, strlen(string) * sizeof(double), MS_FAILURE);
      s = strex.xshow;
      k = 0;
      /* TODO this smells buggy and can cause errors at a higher level. strlen NOK here*/
      while ( *s && k < strlen(string) ) {
         (*advances)[k++] = atof(s);      
         while ( *s && *s != ' ')
            s++;
         if ( *s == ' ' )
            s++;
      }

      gdFree(strex.xshow); /* done with character advances */

      rect->minx = bbox[0];
      rect->miny = bbox[5];
      rect->maxx = bbox[2];
      rect->maxy = bbox[1];
      return MS_SUCCESS;
#else
      msSetError(MS_TTFERR, "gdImageStringFTEx support is not available or is not current enough (requires 2.0.29 or higher).", "msGetTruetypeTextBBox()");
      return(MS_FAILURE);
#endif
   } else {
      error = gdImageStringFT(NULL, bbox, 0, fonts[0], size, 0, 0, 0, string);
      if(error) {
         msSetError(MS_TTFERR, error, "msGetTruetypeTextBBox()");
         return(MS_FAILURE);
      }

      rect->minx = bbox[0];
      rect->miny = bbox[5];
      rect->maxx = bbox[2];
      rect->maxy = bbox[1];
      return MS_SUCCESS;
   }
#else
    msSetError(MS_TTFERR,"Truetype support not available", "getTruetypeTextBBoxGD()");
    return(MS_FAILURE);
#endif
}
示例#2
0
int main ()
{
  char in [INSZ];
  in [INSZ-1] = EOS;

  gdImageStringFTEx (in);

  return 0;
}
示例#3
0
static boolean gd_textlayout(textpara_t * para, char **fontpath)
{
    char *err;
    char *fontlist;
    int brect[8];
    gdFTStringExtra strex;
    double fontsize;

    strex.fontpath = NULL;
    strex.flags = gdFTEX_RETURNFONTPATHNAME | gdFTEX_RESOLUTION;
    strex.hdpi = strex.vdpi = POINTS_PER_INCH;

    if (strstr(para->fontname, "/"))
	strex.flags |= gdFTEX_FONTPATHNAME;
    else
	strex.flags |= gdFTEX_FONTCONFIG;

    para->width = 0.0;
    para->height = 0.0;
    para->yoffset_layout = 0.0;

    para->layout = NULL;
    para->free_layout = NULL;

    fontsize = para->fontsize;
    para->yoffset_centerline = 0.1 * fontsize;

    if (para->fontname) {
	if (fontsize <= FONTSIZE_MUCH_TOO_SMALL) {
	    return TRUE; /* OK, but ignore text entirely */
	} else if (fontsize <= FONTSIZE_TOO_SMALL) {
	    /* draw line in place of text */
	    /* fake a finite fontsize so that line length is calculated */
	    fontsize = FONTSIZE_TOO_SMALL;
	}
	/* call gdImageStringFT with null *im to get brect and to set font cache */
#ifdef HAVE_GD_FONTCONFIG
	if (para->postscript_alias)
	    fontlist = psfontResolve (para->postscript_alias);
	else
	    fontlist = para->fontname;
#else
	fontlist = gd_alternate_fontlist(para->fontname);
#endif

	err = gdImageStringFTEx(NULL, brect, -1, fontlist,
				fontsize, 0, 0, 0, para->str, &strex);

	if (err) {
	    agerr(AGERR,"%s\n", err);
	    return FALSE; /* indicate error */
	}

	if (fontpath)
	    *fontpath = strex.fontpath;
	else
	    free (strex.fontpath); /* strup'ed in libgd */

	if (para->str && para->str[0]) {
	    /* can't use brect on some archtectures if strlen 0 */
	    para->width = (double) (brect[4] - brect[0]);
	    /* 1.2 specifies how much extra space to leave between lines;
             * see LINESPACING in const.h.
             */
	    para->height = (int)(para->fontsize * 1.2);
	}
    }
    return TRUE;
}
示例#4
0
static void gd_textline(point p, textline_t * line)
{
    char *str, *fontlist, *err;
    pointf mp, ep;
    int brect[8];
    double fontsz;
    gdFTStringExtra strex;
    int pencolor;

    if (!im)
        return;

    strex.flags = gdFTEX_RESOLUTION;
    strex.hdpi = strex.vdpi = Dpi * Zoom;

    if (cstk[SP].pen == P_NONE)
        return;

    pencolor = cstk[SP].pencolor;
    if (!im->trueColor && cstk[SP].fillcolor == transparent)
        pencolor = -pencolor;	/* disable antialiasing */

    if (strstr(cstk[SP].fontfam, "/"))
        strex.flags |= gdFTEX_FONTPATHNAME;
    else
        strex.flags |= gdFTEX_FONTCONFIG;

    str = line->str;
    fontlist = gd_alternate_fontlist(cstk[SP].fontfam);
    fontsz = cstk[SP].fontsz;

    switch (line->just) {
    case 'l':
        mp.x = p.x;
        break;
    case 'r':
        mp.x = p.x - line->width;
        break;
    default:
    case 'n':
        mp.x = p.x - line->width / 2;
        break;
    }
    ep.y = mp.y = p.y;
    ep.x = mp.x + line->width;

    mp = gdpt(mp);
    if (fontsz <= FONTSIZE_MUCH_TOO_SMALL) {
        /* ignore entirely */
    } else if (fontsz <= FONTSIZE_TOO_SMALL) {
        /* draw line in place of text */
        ep = gdpt(ep);
        gdImageLine(im, ROUND(mp.x), ROUND(mp.y),
                    ROUND(ep.x), ROUND(ep.y), cstk[SP].pencolor);
    } else {
#ifdef HAVE_GD_FREETYPE
        err = gdImageStringFTEx(im, brect, pencolor,
                                fontlist, fontsz, Rot ? (PI / 2) : 0,
                                ROUND(mp.x), ROUND(mp.y), str, &strex);
#if 0
        gdImagePolygon(im, (gdPointPtr) brect, 4, cstk[SP].pencolor);
#endif
#if 0
        fprintf(stderr,
                "textline: font=%s size=%g pos=%g,%g width=%g dpi=%d width/dpi=%g\n",
                fontlist, fontsz, mp.x, mp.y, (double) (brect[4] - brect[0]),
                strex.hdpi,
                (((double) (brect[4] - brect[0])) / strex.hdpi));
#endif
        if (err) {
            /* revert to builtin fonts */
            gd_missingfont(err, cstk[SP].fontfam);
#endif
            mp.y += 2;
            if (fontsz <= 8.5) {
                gdImageString(im, gdFontTiny,
                              ROUND(mp.x), ROUND(mp.y - 9.),
                              (unsigned char *) str, cstk[SP].pencolor);
            } else if (fontsz <= 9.5) {
                gdImageString(im, gdFontSmall,
                              ROUND(mp.x), ROUND(mp.y - 12.),
                              (unsigned char *) str, cstk[SP].pencolor);
            } else if (fontsz <= 10.5) {
                gdImageString(im, gdFontMediumBold,
                              ROUND(mp.x), ROUND(mp.y - 13.),
                              (unsigned char *) str, cstk[SP].pencolor);
            } else if (fontsz <= 11.5) {
                gdImageString(im, gdFontLarge,
                              ROUND(mp.x), ROUND(mp.y - 14.),
                              (unsigned char *) str, cstk[SP].pencolor);
            } else {
                gdImageString(im, gdFontGiant,
                              ROUND(mp.x), ROUND(mp.y - 15.),
                              (unsigned char *) str, cstk[SP].pencolor);
            }
#ifdef HAVE_GD_FREETYPE
        }
#endif
    }
}