/* * Get the font metrics */ static void fnmetrics( struct font_metrics *fm ) { char *str; static char *fieldstocheck[3]; #ifdef ENABLE_SFNT FT_SfntName sn; #endif /* ENABLE_SFNT */ int i; fm->italic_angle = 0.0; /* FreeType hides the angle */ fm->underline_position = face->underline_position; fm->underline_thickness = face->underline_thickness; fm->is_fixed_pitch = FT_IS_FIXED_WIDTH(face); fm->ascender = face->ascender; fm->descender = face->descender; fm->units_per_em = face->units_per_EM; fm->bbox[0] = face->bbox.xMin; fm->bbox[1] = face->bbox.yMin; fm->bbox[2] = face->bbox.xMax; fm->bbox[3] = face->bbox.yMax; #ifdef ENABLE_SFNT if( FT_Get_Sfnt_Name(face, TT_NAME_ID_COPYRIGHT, &sn) ) #endif /* ENABLE_SFNT */ fm->name_copyright = ""; #ifdef ENABLE_SFNT else fm->name_copyright = dupcnstring(sn.string, sn.string_len); #endif /* ENABLE_SFNT */ fm->name_family = face->family_name; fm->name_style = face->style_name; if(fm->name_style == NULL) fm->name_style = ""; #ifdef ENABLE_SFNT if( FT_Get_Sfnt_Name(face, TT_NAME_ID_FULL_NAME, &sn) ) #endif /* ENABLE_SFNT */ { int len; len = strlen(fm->name_family) + strlen(fm->name_style) + 2; if(( fm->name_full = malloc(len) )==NULL) { fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); exit(255); } strcpy(fm->name_full, fm->name_family); if(strlen(fm->name_style) != 0) { strcat(fm->name_full, " "); strcat(fm->name_full, fm->name_style); } } #ifdef ENABLE_SFNT else fm->name_full = dupcnstring(sn.string, sn.string_len); #endif /* ENABLE_SFNT */ #ifdef ENABLE_SFNT if( FT_Get_Sfnt_Name(face, TT_NAME_ID_VERSION_STRING, &sn) ) #endif /* ENABLE_SFNT */ fm->name_version = "1.0"; #ifdef ENABLE_SFNT else fm->name_version = dupcnstring(sn.string, sn.string_len); #endif /* ENABLE_SFNT */ #ifdef XP_PSTEXT { extern const char *xp_psfontname; fm->name_ps = strdup(xp_psfontname); /* Handle the rare case if a family name was not provided by the TTF * font (like Solaris TTF fonts in /usr/openwin/lib/locale/ko.UTF-8/X11/fonts/TrueType, * /usr/openwin/lib/locale/ko/X11/fonts/TrueType) - in this case we * have to generate a family name somehow... */ if(fm->name_family == NULL) fm->name_family = fm->name_ps; } #else #ifdef ENABLE_SFNT if( FT_Get_Sfnt_Name(face, TT_NAME_ID_PS_NAME , &sn) ) { #endif /* ENABLE_SFNT */ if(( fm->name_ps = strdup(fm->name_full) )==NULL) { fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); exit(255); } #ifdef ENABLE_SFNT } else fm->name_ps = dupcnstring(sn.string, sn.string_len); #endif /* ENABLE_SFNT */ #endif /* XP_PSTEXT */ for(i=0; fm->name_ps[i]!=0; i++) if(fm->name_ps[i] == ' ') fm->name_ps[i] = '_'; /* no spaces in the Postscript name *m /* guess the boldness from the font names */ fm->force_bold=0; fieldstocheck[0] = fm->name_style; fieldstocheck[1] = fm->name_full; fieldstocheck[2] = fm->name_ps; for(i=0; !fm->force_bold && i<sizeof fieldstocheck /sizeof(fieldstocheck[0]); i++) { str=fieldstocheck[i]; for(i=0; str[i]!=0; i++) { if( (str[i]=='B' || str[i]=='b' && ( i==0 || !isalpha(str[i-1]) ) ) && !strncmp("old",&str[i+1],3) && !islower(str[i+4]) ) { fm->force_bold=1; break; } } } }
static int handle_header( int len, char *str ) { struct line *cl; char *s, *p; char bf[2000]; int c; #if 0 fprintf(stderr, "line: %s\n", str); #endif for(cl = header; cl->name != 0; cl++) { if(strncmp(str, cl->name, cl->namelen)) continue; #if 0 fprintf(stderr, "match: %s\n", cl->name); #endif if(cl->flags & IS_SEEN) { if(cl->flags & ALLOW_REPEAT) continue; fprintf(stderr, "**** input line %d redefines the property %s\n", lineno, cl->name); exit(1); } cl->flags |= IS_SEEN; if(cl->fmt == 0) { if(len - cl->namelen + 1 > sizeof bf) len = sizeof bf; /* cut it down */ s = bf; /* a temporary buffer to extract the value */ /* skip until a quote */ for(p = str+cl->namelen; len!=0 && (c = *p)!=0; p++, len--) { if(c == '"') { p++; break; } } for(; len!=0 && (c = *p)!=0; p++, len--) { if(c == '"') { c = *++p; if(c == '"') *s++ = c; else break; } else *s++ = c; } *s = 0; /* end of line */ *((char **)(cl->vp[0])) = dupcnstring(bf, s-bf); } else { c = sscanf(str+cl->namelen, cl->fmt, cl->vp[0], cl->vp[1], cl->vp[2], cl->vp[3]); if(c != cl->nvals) { fprintf(stderr, "**** property %s at input line %d must have %d arguments\n", cl->name, lineno, cl->nvals); exit(1); } } if(cl->flags & IS_LAST) return 1; else return 0; } return 0; }