X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcfreetype.c;h=7773c836c215df3b32c4ae6968d185ee270097bb;hb=1bd0b5ba7365fc7b4ef39e46efc66a6f25c052c5;hp=e2bcb156a27265f40e4cc069fce58bb61bab5ba5;hpb=72ffe6536a6825a32095c8185aff836a12326ac5;p=fontconfig.git diff --git a/src/fcfreetype.c b/src/fcfreetype.c index e2bcb15..7773c83 100644 --- a/src/fcfreetype.c +++ b/src/fcfreetype.c @@ -80,13 +80,13 @@ */ 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 &&