[Fontconfig] [PATCH 1/1] Cache fonts’ PostScript Names.

James Cloos cloos at jhcloos.com
Sat Apr 3 19:00:59 PDT 2010


The ability to select a font based on its psname rather than on its
fullname is important for a number of applications.

Viewers and RIPs for a number of page description languages need to
render documents which specify their (non-embedded) fonts by psname.

The spliced font format, which the ISO is likely to standardize as
part of its Open Font Format (ISO 14496-22), references component
fonts by their psnames.  (OFF is the ISO standardization of OpenType.)

A few SFNT/GLYF fonts specify multiple psnames; even though non-ASCII
/FontNames may not be legal PostScript, they are cached none-the-less.

As of this commit, fc-cat(1), fc-list(1), fc-query(1) and fc-scan(1)
all correctly report psnames of SFNT, Type1 and (bare) CFF fonts.

Signed-off-by: James Cloos <cloos at jhcloos.com>
---
 doc/fontconfig-devel.sgml |    3 +++
 fontconfig/fontconfig.h   |    2 ++
 src/fcfreetype.c          |   38 +++++++++++++++++++++++++++++++++++++-
 src/fcint.h               |    6 ++++--
 src/fcname.c              |    4 +++-
 5 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/doc/fontconfig-devel.sgml b/doc/fontconfig-devel.sgml
index 891251f..e27e2e6 100644
--- a/doc/fontconfig-devel.sgml
+++ b/doc/fontconfig-devel.sgml
@@ -145,6 +145,9 @@ convenience for the applications rendering mechanism.
                                                 family + style
     fullnamelang   FC_FULLNAMELANG      String  Language cooresponding to
                                                 each fullname
+    psname         FC_PSNAME            String  Font PostScript name
+    psnamelang     FC_PSNAMELANG        String  Language cooresponding to
+                                                each psname
     slant          FC_SLANT             Int     Italic, oblique or roman
     weight         FC_WEIGHT            Int     Light, medium, demibold,
                                                 bold or black
diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h
index c9f20cc..76bcdbb 100644
--- a/fontconfig/fontconfig.h
+++ b/fontconfig/fontconfig.h
@@ -111,6 +111,8 @@ typedef int		FcBool;
 #define FC_EMBEDDED_BITMAP  "embeddedbitmap"	/* Bool - true to enable embedded bitmaps */
 #define FC_DECORATIVE	    "decorative"	/* Bool - true if style is a decorative variant */
 #define FC_LCD_FILTER	    "lcdfilter"		/* Int */
+#define FC_PSNAME	    "psname"		/* String */
+#define FC_PSNAMELANG	    "psnamelang"	/* String */
 
 #define FC_CACHE_SUFFIX		    ".cache-"FC_CACHE_VERSION
 #define FC_DIR_CACHE_FILE	    "fonts.cache-"FC_CACHE_VERSION
diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 68596f5..d472039 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -1105,6 +1105,7 @@ static const FT_UShort nameid_order[] = {
     TT_NAME_ID_FONT_SUBFAMILY,
     TT_NAME_ID_TRADEMARK,
     TT_NAME_ID_MANUFACTURER,
+    TT_NAME_ID_PS_NAME,
 };
 
 #define NUM_NAMEID_ORDER  (sizeof (nameid_order) / sizeof (nameid_order[0]))
@@ -1146,6 +1147,8 @@ FcFreeTypeQueryFace (const FT_Face  face,
     int		    nstyle_lang = 0;
     int		    nfullname = 0;
     int		    nfullname_lang = 0;
+    int		    npsname = 0;
+    int		    npsname_lang = 0;
     int		    p, platform;
     int		    n, nameid;
 
@@ -1248,7 +1251,6 @@ FcFreeTypeQueryFace (const FT_Face  face,
 		case TT_NAME_ID_PREFERRED_FAMILY:
 		case TT_NAME_ID_FONT_FAMILY:
 #if 0	    
-		case TT_NAME_ID_PS_NAME:
 		case TT_NAME_ID_UNIQUE_ID:
 #endif
 		    if (FcDebug () & FC_DBG_SCANV)
@@ -1275,6 +1277,18 @@ FcFreeTypeQueryFace (const FT_Face  face,
 		    np = &nfullname;
 		    nlangp = &nfullname_lang;
 		    break;
+		case TT_NAME_ID_PS_NAME:
+		    if (FcDebug () & FC_DBG_SCANV)
+			printf ("found psname (n %2d p %d e %d l 0x%04x) %s\n",
+				sname.name_id, sname.platform_id,
+				sname.encoding_id, sname.language_id,
+				utf8);
+
+		    elt = FC_PSNAME;
+		    eltlang = FC_PSNAMELANG;
+		    np = &npsname;
+		    nlangp = &npsname_lang;
+		    break;
 #ifdef TT_NAME_ID_WWS_SUBFAMILY
 		case TT_NAME_ID_WWS_SUBFAMILY:
 #endif
@@ -1354,6 +1368,28 @@ FcFreeTypeQueryFace (const FT_Face  face,
 	++nstyle;
     }
     
+    if (!npsname && face)
+    {
+	const char *ps_name;
+
+	ps_name = FT_Get_Postscript_Name (face);
+
+	if (ps_name &&
+	    FcStrCmpIgnoreBlanksAndCase ((FcChar8 *) ps_name, (FcChar8 *) "") != 0)
+	{
+	    if (FcDebug () & FC_DBG_SCANV)
+		printf ("using FreeType psname \"%s\"\n", ps_name);
+
+	    if (!FcPatternAddString (pat, FC_PSNAME, (FcChar8 *) ps_name))
+		goto bail1;
+
+	    if (!FcPatternAddString (pat, FC_PSNAMELANG, (FcChar8 *) "en"))
+		goto bail1;
+
+	    ++npsname;
+	}
+    }
+
     if (!nfamily)
     {
 	FcChar8	*start, *end;
diff --git a/src/fcint.h b/src/fcint.h
index 8e80d1e..3495761 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -419,7 +419,7 @@ typedef struct _FcCaseFold {
 
 #define FC_CACHE_MAGIC_MMAP	    0xFC02FC04
 #define FC_CACHE_MAGIC_ALLOC	    0xFC02FC05
-#define FC_CACHE_CONTENT_VERSION    3 /* also check FC_CACHE_VERSION */
+#define FC_CACHE_CONTENT_VERSION    4 /* also check FC_CACHE_VERSION */
 
 struct _FcAtomic {
     FcChar8	*file;		/* original file name */
@@ -837,7 +837,9 @@ FcListPatternMatchAny (const FcPattern *p,
 #define FC_EMBEDDED_BITMAP_OBJECT	39
 #define FC_DECORATIVE_OBJECT	40
 #define FC_LCD_FILTER_OBJECT	41
-#define FC_MAX_BASE_OBJECT	FC_LCD_FILTER_OBJECT
+#define FC_PSNAME_OBJECT	42
+#define FC_PSNAMELANG_OBJECT	43
+#define FC_MAX_BASE_OBJECT	FC_PSNAMELANG_OBJECT
 
 FcPrivate FcBool
 FcNameBool (const FcChar8 *v, FcBool *result);
diff --git a/src/fcname.c b/src/fcname.c
index b4ce944..d0ee0bc 100644
--- a/src/fcname.c
+++ b/src/fcname.c
@@ -75,7 +75,9 @@ static const FcObjectType _FcBaseObjectTypes[] = {
     { FC_EMBOLDEN,	FcTypeBool },
     { FC_EMBEDDED_BITMAP,   FcTypeBool },
     { FC_DECORATIVE,	FcTypeBool },
-    { FC_LCD_FILTER,	FcTypeInteger }, /* 41 */
+    { FC_LCD_FILTER,	FcTypeInteger },
+    { FC_PSNAME,	FcTypeString },
+    { FC_PSNAMELANG,	FcTypeString }, /* 43 */
 };
 
 #define NUM_OBJECT_TYPES    (sizeof _FcBaseObjectTypes / sizeof _FcBaseObjectTypes[0])
-- 
1.7.0.1.147.g6d84b



More information about the Fontconfig mailing list