]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcfreetype.c
Eliminate relocations from FcCodePageRange structure (bug 10982).
[fontconfig.git] / src / fcfreetype.c
index e2bcb156a27265f40e4cc069fce58bb61bab5ba5..7773c836c215df3b32c4ae6968d185ee270097bb 100644 (file)
  */
 
 static const struct {
-    int                    bit;
-    const FcChar8   *lang;
+    char           bit;
+    const FcChar8   lang[6];
 } FcCodePageRange[] = {
-    { 17,      (const FcChar8 *) "ja" },
-    { 18,      (const FcChar8 *) "zh-cn" },
-    { 19,      (const FcChar8 *) "ko" },
-    { 20,      (const FcChar8 *) "zh-tw" },
+    { 17,      "ja" },
+    { 18,      "zh-cn" },
+    { 19,      "ko" },
+    { 20,      "zh-tw" },
 };
 
 #define NUM_CODE_PAGE_RANGE (int) (sizeof FcCodePageRange / sizeof FcCodePageRange[0])
@@ -1330,70 +1330,6 @@ FcFreeTypeQueryFace (const FT_Face  face,
        ++nfamily;
     }
 
-    /*
-     * Walk through FC_FULLNAME entries eliding those in FC_FAMILY
-     * or which are simply a FC_FAMILY and FC_STYLE glued together
-     */
-    {
-       int     fn, fa;
-       FcChar8 *full;
-       FcChar8 *fam;
-       FcChar8 *style;
-
-       for (fn = 0; FcPatternGetString (pat, FC_FULLNAME, fn, &full) == FcResultMatch; fn++)
-       {
-           FcBool  remove = FcFalse;
-           /*
-            * Check each family
-            */
-           for (fa = 0; !remove && 
-                FcPatternGetString (pat, FC_FAMILY, 
-                                    fa, &fam) == FcResultMatch;
-                fa++)
-           {
-               /*
-                * for exact match
-                */
-               if (!FcStrCmpIgnoreBlanksAndCase (full, fam))
-               {
-                   remove = FcTrue;
-                   break;
-               }
-               /*
-                * If the family is in the full name, check the
-                * combination of this family with every style
-                */
-               if (!FcStrContainsIgnoreBlanksAndCase (full, fam))
-                   continue;
-               for (st = 0; !remove && 
-                    FcPatternGetString (pat, FC_STYLE, 
-                                        st, &style) == FcResultMatch;
-                    st++)
-               {
-                   FcChar8     *both = FcStrPlus (fam, style);
-
-                   if (both)
-                   {
-                       if (FcStrCmpIgnoreBlanksAndCase (full, both) == 0)
-                           remove = FcTrue;
-                       free (both);
-                   }
-               }
-           }
-           if (remove)
-           {
-               FcPatternRemove (pat, FC_FULLNAME, fn);
-               FcPatternRemove (pat, FC_FULLNAMELANG, fn);
-               fn--;
-               nfullname--;
-               nfullname_lang--;
-           }
-       }
-       if (FcDebug () & FC_DBG_SCANV)
-           for (fn = 0; FcPatternGetString (pat, FC_FULLNAME, fn, &full) == FcResultMatch; fn++)
-               printf ("Saving unique fullname %s\n", full);
-    }
-
     if (!FcPatternAddString (pat, FC_FILE, file))
        goto bail1;
 
@@ -2368,12 +2304,12 @@ FcUcs4ToGlyphName (FcChar32 ucs4)
 {
     int                i = (int) (ucs4 % FC_GLYPHNAME_HASH);
     int                r = 0;
-    const FcGlyphName  *gn;
+    FcGlyphId  gn;
 
-    while ((gn = ucs_to_name[i]))
+    while ((gn = ucs_to_name[i]) != -1)
     {
-       if (gn->ucs == ucs4)
-           return gn->name;
+       if (glyphs[gn].ucs == ucs4)
+           return glyphs[gn].name;
        if (!r) 
        {
            r = (int) (ucs4 % FC_GLYPHNAME_REHASH);
@@ -2393,12 +2329,12 @@ FcGlyphNameToUcs4 (FcChar8 *name)
     FcChar32   h = FcHashGlyphName (name);
     int                i = (int) (h % FC_GLYPHNAME_HASH);
     int                r = 0;
-    const FcGlyphName  *gn;
+    FcGlyphId  gn;
 
-    while ((gn = name_to_ucs[i]))
+    while ((gn = name_to_ucs[i]) != -1)
     {
-       if (!strcmp ((char *) name, (char *) gn->name))
-           return gn->ucs;
+       if (!strcmp ((char *) name, (char *) glyphs[gn].name))
+           return glyphs[gn].ucs;
        if (!r) 
        {
            r = (int) (h % FC_GLYPHNAME_REHASH);
@@ -2412,6 +2348,19 @@ FcGlyphNameToUcs4 (FcChar8 *name)
     return 0xffff;
 }
 
+/*
+ * Work around a bug in some FreeType versions which fail
+ * to correctly bounds check glyph name buffers and overwrite
+ * the stack. As Postscript names have a limit of 127 characters,
+ * this should be sufficient.
+ */
+
+#if FC_GLYPHNAME_MAXLEN < 127
+# define FC_GLYPHNAME_BUFLEN 127
+#else
+# define FC_GLYPHNAME_BUFLEN FC_GLYPHNAME_MAXLEN
+#endif
+
 /*
  * Search through a font for a glyph by name.  This is
  * currently a linear search as there doesn't appear to be
@@ -2421,11 +2370,11 @@ static FT_UInt
 FcFreeTypeGlyphNameIndex (FT_Face face, const FcChar8 *name)
 {
     FT_UInt gindex;
-    FcChar8 name_buf[FC_GLYPHNAME_MAXLEN + 2];
+    FcChar8 name_buf[FC_GLYPHNAME_BUFLEN + 2];
 
     for (gindex = 0; gindex < (FT_UInt) face->num_glyphs; gindex++)
     {
-       if (FT_Get_Glyph_Name (face, gindex, name_buf, FC_GLYPHNAME_MAXLEN+1) == 0)
+       if (FT_Get_Glyph_Name (face, gindex, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0)
            if (!strcmp ((char *) name, (char *) name_buf))
                return gindex;
     }
@@ -2715,11 +2664,11 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
      */
     if (FcFreeTypeUseNames (face))
     {
-       FcChar8 name_buf[FC_GLYPHNAME_MAXLEN + 2];
+       FcChar8 name_buf[FC_GLYPHNAME_BUFLEN + 2];
 
        for (glyph = 0; glyph < (FT_UInt) face->num_glyphs; glyph++)
        {
-           if (FT_Get_Glyph_Name (face, glyph, name_buf, FC_GLYPHNAME_MAXLEN+1) == 0)
+           if (FT_Get_Glyph_Name (face, glyph, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0)
            {
                ucs4 = FcGlyphNameToUcs4 (name_buf);
                if (ucs4 != 0xffff &&