X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcfreetype.c;h=d37af2d0eff9113a5a8ae74467016e3dd346c712;hb=082caefb6d5462c97f280b7037e3740b4865a244;hp=0612c17398c6a83bc29ce58d49d0b0b5fce9c0f0;hpb=60421f5d68e81478430c2d9c796eedbf6d43b3cf;p=fontconfig.git diff --git a/src/fcfreetype.c b/src/fcfreetype.c index 0612c17..d37af2d 100644 --- a/src/fcfreetype.c +++ b/src/fcfreetype.c @@ -1,5 +1,5 @@ /* - * $RCSId: xc/lib/fontconfig/src/fcfreetype.c,v 1.11 2002/08/31 22:17:32 keithp Exp $ + * fontconfig/src/fcfreetype.c * * Copyright © 2001 Keith Packard * @@ -7,15 +7,15 @@ * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Keith Packard not be used in + * documentation, and that the name of the author(s) not be used in * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no + * specific, written prior permission. The authors make no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * - * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR @@ -115,18 +115,19 @@ typedef struct { #define FC_ENCODING_MAC_ROMAN "MACINTOSH" static const FcFtEncoding fcFtEncoding[] = { - { TT_PLATFORM_APPLE_UNICODE, TT_ENCODING_DONT_CARE, "UCS-2BE" }, + { TT_PLATFORM_APPLE_UNICODE, TT_ENCODING_DONT_CARE, "UTF-16BE" }, { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, "MACINTOSH" }, { TT_PLATFORM_MACINTOSH, TT_MAC_ID_JAPANESE, "SJIS" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, "UTF-16BE" }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, "UTF-16BE" }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, "SJIS-WIN" }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, "GB3212" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, "GB2312" }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, "BIG-5" }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, "Wansung" }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, "Johab" }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, "UCS4" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, "UTF-16BE" }, { TT_PLATFORM_ISO, TT_ISO_ID_7BIT_ASCII, "ASCII" }, - { TT_PLATFORM_ISO, TT_ISO_ID_10646, "UCS-2BE" }, + { TT_PLATFORM_ISO, TT_ISO_ID_10646, "UTF-16BE" }, { TT_PLATFORM_ISO, TT_ISO_ID_8859_1, "ISO-8859-1" }, }; @@ -251,14 +252,14 @@ static const FcFtLanguage fcFtLanguage[] = { { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_DZONGKHA, "dz" }, { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_JAVANESE, "jw" }, { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SUNDANESE, "su" }, - + #if 0 /* these seem to be errors that have been dropped */ { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SCOTTISH_GAELIC }, { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_IRISH_GAELIC }, #endif - + /* The following codes are new as of 2000-03-10 */ { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GALICIAN, "gl" }, { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_AFRIKAANS, "af" }, @@ -494,7 +495,7 @@ static const FcFtLanguage fcFtLanguage[] = { { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_PASHTO_AFGHANISTAN, "ps" }, { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FILIPINO_PHILIPPINES, "phi" }, { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_DHIVEHI_MALDIVES, "div" }, - + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_OROMO_ETHIOPIA, "om" }, { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TIGRIGNA_ETHIOPIA, "ti" }, { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TIGRIGNA_ERYTHREA, "ti" }, @@ -743,7 +744,7 @@ FcSfntNameTranscode (FT_SfntName *sname) while (in_bytes_left) { - size_t did = iconv (cd, + size_t did = iconv (cd, &inbuf, &in_bytes_left, &outbuf, &out_bytes_left); if (did == (size_t) (-1)) @@ -785,7 +786,7 @@ FcSfntNameLanguage (FT_SfntName *sname) { language_id = TT_MAC_LANGID_JAPANESE; } - + for (i = 0; i < NUM_FC_FT_LANGUAGE; i++) if (fcFtLanguage[i].platform_id == platform_id && (fcFtLanguage[i].language_id == TT_LANGUAGE_DONT_CARE || @@ -870,7 +871,7 @@ FcVendorMatch(const FT_Char vendor[4], const FT_Char *vendor_string) { /* vendor is not necessarily NUL-terminated. */ int i, len; - + len = strlen((char *) vendor_string); if (memcmp(vendor, vendor_string, len) != 0) return FcFalse; @@ -926,7 +927,7 @@ static const FcChar8 * FcVendorFoundry(const FT_Char vendor[4]) { int i; - + if (vendor) for(i = 0; i < NUM_VENDOR_FOUNDRIES; i++) if (FcVendorMatch (vendor, FcVendorFoundries[i].vendor)) @@ -1016,6 +1017,7 @@ static const FcStringConst widthConsts[] = { { (FC8) "extraexpanded", FC_WIDTH_EXTRAEXPANDED }, { (FC8) "ultraexpanded", FC_WIDTH_ULTRAEXPANDED }, { (FC8) "expanded", FC_WIDTH_EXPANDED }, /* must be after *expanded */ + { (FC8) "extended", FC_WIDTH_EXPANDED }, }; #define NUM_WIDTH_CONSTS (int) (sizeof (widthConsts) / sizeof (widthConsts[0])) @@ -1036,11 +1038,11 @@ static const FcStringConst slantConsts[] = { static const FcStringConst decorativeConsts[] = { { (FC8) "shadow", FcTrue }, - { (FC8) "smallcaps", FcTrue }, + { (FC8) "caps", FcTrue }, { (FC8) "antiqua", FcTrue }, { (FC8) "romansc", FcTrue }, { (FC8) "embosed", FcTrue }, - { (FC8) "romansmallcaps", FcTrue }, + { (FC8) "dunhill", FcTrue }, }; #define NUM_DECORATIVE_CONSTS (int) (sizeof (decorativeConsts) / sizeof (decorativeConsts[0])) @@ -1090,10 +1092,16 @@ static const FT_UShort platform_order[] = { #define NUM_PLATFORM_ORDER (sizeof (platform_order) / sizeof (platform_order[0])) static const FT_UShort nameid_order[] = { +#ifdef TT_NAME_ID_WWS_FAMILY + TT_NAME_ID_WWS_FAMILY, +#endif TT_NAME_ID_PREFERRED_FAMILY, TT_NAME_ID_FONT_FAMILY, TT_NAME_ID_MAC_FULL_NAME, TT_NAME_ID_FULL_NAME, +#ifdef TT_NAME_ID_WWS_SUBFAMILY + TT_NAME_ID_WWS_SUBFAMILY, +#endif TT_NAME_ID_PREFERRED_SUBFAMILY, TT_NAME_ID_FONT_SUBFAMILY, TT_NAME_ID_TRADEMARK, @@ -1118,7 +1126,7 @@ FcFreeTypeQueryFace (const FT_Face face, #if 0 FcChar8 *family = 0; #endif - FcChar8 *complex; + FcChar8 *complex_; const FcChar8 *foundry = 0; int spacing; TT_OS2 *os2; @@ -1132,7 +1140,7 @@ FcFreeTypeQueryFace (const FT_Face face, const FcChar8 *exclusiveLang = 0; FT_SfntName sname; FT_UInt snamei, snamec; - + int nfamily = 0; int nfamily_lang = 0; int nstyle = 0; @@ -1144,7 +1152,7 @@ FcFreeTypeQueryFace (const FT_Face face, FcChar8 *style = 0; int st; - + pat = FcPatternCreate (); if (!pat) goto bail0; @@ -1170,7 +1178,7 @@ FcFreeTypeQueryFace (const FT_Face face, * the Postscript FontInfo dictionary. Finally, the * BDF properties will queried. */ - + if (os2 && os2->version >= 0x0001 && os2->version != 0xffff) foundry = FcVendorFoundry(os2->achVendID); @@ -1235,9 +1243,12 @@ FcFreeTypeQueryFace (const FT_Face face, continue; switch (sname.name_id) { +#ifdef TT_NAME_ID_WWS_FAMILY + case TT_NAME_ID_WWS_FAMILY: +#endif case TT_NAME_ID_PREFERRED_FAMILY: case TT_NAME_ID_FONT_FAMILY: -#if 0 +#if 0 case TT_NAME_ID_PS_NAME: case TT_NAME_ID_UNIQUE_ID: #endif @@ -1265,6 +1276,9 @@ FcFreeTypeQueryFace (const FT_Face face, np = &nfullname; nlangp = &nfullname_lang; break; +#ifdef TT_NAME_ID_WWS_SUBFAMILY + case TT_NAME_ID_WWS_SUBFAMILY: +#endif case TT_NAME_ID_PREFERRED_SUBFAMILY: case TT_NAME_ID_FONT_SUBFAMILY: if (FcDebug () & FC_DBG_SCANV) @@ -1321,7 +1335,7 @@ FcFreeTypeQueryFace (const FT_Face face, } } - if (!nfamily && face->family_name && + if (!nfamily && face->family_name && FcStrCmpIgnoreBlanksAndCase ((FcChar8 *) face->family_name, (FcChar8 *) "") != 0) { if (FcDebug () & FC_DBG_SCANV) @@ -1330,7 +1344,7 @@ FcFreeTypeQueryFace (const FT_Face face, goto bail1; ++nfamily; } - + if (!nstyle && face->style_name && FcStrCmpIgnoreBlanksAndCase ((FcChar8 *) face->style_name, (FcChar8 *) "") != 0) { @@ -1340,7 +1354,7 @@ FcFreeTypeQueryFace (const FT_Face face, goto bail1; ++nstyle; } - + if (!nfamily) { FcChar8 *start, *end; @@ -1419,7 +1433,7 @@ FcFreeTypeQueryFace (const FT_Face face, } if (bits & (1 << bit)) { - /* + /* * If the font advertises support for multiple * "exclusive" languages, then include support * for any language found to have coverage @@ -1477,21 +1491,21 @@ FcFreeTypeQueryFace (const FT_Face face, printf ("\tos2 width class %d maps to width %d\n", os2->usWidthClass, width); } - if (os2 && (complex = FcFontCapabilities(face))) + if (os2 && (complex_ = FcFontCapabilities(face))) { - if (!FcPatternAddString (pat, FC_CAPABILITY, complex)) + if (!FcPatternAddString (pat, FC_CAPABILITY, complex_)) { - free (complex); + free (complex_); goto bail1; } - free (complex); + free (complex_); } /* * Type 1: Check for FontInfo dictionary information * Code from g2@magestudios.net (Gerard Escalante) */ - + #if HAVE_FT_GET_PS_FONT_INFO if (FT_Get_PS_Font_Info(face, &psfontinfo) == 0) { @@ -1502,23 +1516,23 @@ FcFreeTypeQueryFace (const FT_Face face, printf ("\tType1 weight %s maps to %d\n", psfontinfo.weight, weight); } - + #if 0 - /* + /* * Don't bother with italic_angle; FreeType already extracts that * information for us and sticks it into style_flags */ if (psfontinfo.italic_angle) - slant = FC_SLANT_ITALIC; + slant = FC_SLANT_ITALIC; else - slant = FC_SLANT_ROMAN; + slant = FC_SLANT_ROMAN; #endif if(!foundry) foundry = FcNoticeFoundry(psfontinfo.notice); } #endif /* HAVE_FT_GET_PS_FONT_INFO */ - + #if HAVE_FT_GET_BDF_PROPERTY /* * Finally, look for a FOUNDRY BDF property if no other @@ -1540,7 +1554,7 @@ FcFreeTypeQueryFace (const FT_Face face, prop.type == BDF_PROPERTY_TYPE_CARDINAL)) { FT_Int32 value; - + if (prop.type == BDF_PROPERTY_TYPE_INTEGER) value = prop.u.integer; else @@ -1661,7 +1675,7 @@ FcFreeTypeQueryFace (const FT_Face face, /* * Skip over PCF fonts that have no encoded characters; they're * usually just Unicode fonts transcoded to some legacy encoding - * ftglue.c forces us to approximate whether a font is a PCF font + * FT forces us to approximate whether a font is a PCF font * or not by whether it has any BDF properties. Try PIXEL_SIZE; * I don't know how to get a list of BDF properties on the font. -PL */ @@ -1700,40 +1714,6 @@ FcFreeTypeQueryFace (const FT_Face face, goto bail2; if (!FcPatternAddBool (pat, FC_ANTIALIAS, FcFalse)) goto bail2; -#if HAVE_FT_GET_BDF_PROPERTY - if(face->num_fixed_sizes == 1) { - int rc; - int value; - - /* skip bitmap fonts which do not even have a family name */ - rc = FT_Get_BDF_Property(face, "FAMILY_NAME", &prop); - if (rc != 0 || prop.type != BDF_PROPERTY_TYPE_ATOM) - goto bail2; - - rc = FT_Get_BDF_Property(face, "POINT_SIZE", &prop); - if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_INTEGER) - value = prop.u.integer; - else if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_CARDINAL) - value = prop.u.cardinal; - else - goto nevermind; - if(!FcPatternAddDouble(pat, FC_SIZE, value / 10.0)) - goto nevermind; - - rc = FT_Get_BDF_Property(face, "RESOLUTION_Y", &prop); - if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_INTEGER) - value = prop.u.integer; - else if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_CARDINAL) - value = prop.u.cardinal; - else - goto nevermind; - if(!FcPatternAddDouble(pat, FC_DPI, (double)value)) - goto nevermind; - - } - nevermind: - ; -#endif } #if HAVE_FT_GET_X11_FONT_FORMAT /* @@ -1751,7 +1731,7 @@ FcFreeTypeQueryFace (const FT_Face face, * Drop our reference to the charset */ FcCharSetDestroy (cs); - + return pat; bail2: @@ -1771,10 +1751,10 @@ FcFreeTypeQuery(const FcChar8 *file, FT_Face face; FT_Library ftLibrary; FcPattern *pat = NULL; - + if (FT_Init_FreeType (&ftLibrary)) return NULL; - + if (FT_New_Face (ftLibrary, (char *) file, id, &face)) goto bail; @@ -2246,7 +2226,7 @@ static const FcCharMap AdobeSymbol = { AdobeSymbolEnt, sizeof (AdobeSymbolEnt) / sizeof (AdobeSymbolEnt[0]), }; - + static const FcFontDecode fcFontDecoders[] = { { ft_encoding_unicode, 0, (1 << 21) - 1 }, { ft_encoding_symbol, &AdobeSymbol, (1 << 16) - 1 }, @@ -2331,7 +2311,7 @@ static FcBool FcFreeTypeUseNames (FT_Face face) { FT_Int map; - + if (!FT_Has_PS_Glyph_Names (face)) return FcFalse; for (map = 0; map < face->num_charmaps; map++) @@ -2347,11 +2327,11 @@ FcUcs4ToGlyphName (FcChar32 ucs4) int r = 0; FcGlyphId gn; - while ((gn = ucs_to_name[i]) != -1) + while ((gn = _fc_ucs_to_name[i]) != -1) { - if (glyphs[gn].ucs == ucs4) - return glyphs[gn].name; - if (!r) + if (_fc_glyph_names[gn].ucs == ucs4) + return _fc_glyph_names[gn].name; + if (!r) { r = (int) (ucs4 % FC_GLYPHNAME_REHASH); if (!r) @@ -2372,11 +2352,11 @@ FcGlyphNameToUcs4 (FcChar8 *name) int r = 0; FcGlyphId gn; - while ((gn = name_to_ucs[i]) != -1) + while ((gn = _fc_name_to_ucs[i]) != -1) { - if (!strcmp ((char *) name, (char *) glyphs[gn].name)) - return glyphs[gn].ucs; - if (!r) + if (!strcmp ((char *) name, (char *) _fc_glyph_names[gn].name)) + return _fc_glyph_names[gn].ucs; + if (!r) { r = (int) (h % FC_GLYPHNAME_REHASH); if (!r) @@ -2499,14 +2479,14 @@ FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4) } static FcBool -FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4, +FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4, FT_UInt glyph, FcBlanks *blanks, FT_Pos *advance, FcBool using_strike) { FT_Int load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; FT_GlyphSlot slot; - + if (using_strike) load_flags &= ~FT_LOAD_NO_SCALE; @@ -2519,14 +2499,14 @@ FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4, */ if (face->face_flags & FT_FACE_FLAG_SCALABLE) load_flags |= FT_LOAD_NO_BITMAP; - + if (FT_Load_Glyph (face, glyph, load_flags)) return FcFalse; - + slot = face->glyph; if (!glyph) return FcFalse; - + *advance = slot->metrics.horiAdvance; switch (slot->format) { @@ -2558,9 +2538,6 @@ FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4, return FcFalse; } -#define FC_MIN(a,b) ((a) < (b) ? (a) : (b)) -#define FC_MAX(a,b) ((a) > (b) ? (a) : (b)) -#define FC_ABS(a) ((a) < 0 ? -(a) : (a)) #define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) <= FC_MAX (FC_ABS (x), FC_ABS (y)) / 33) static FcCharSet * @@ -2583,12 +2560,14 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing fcs = FcCharSetCreate (); if (!fcs) goto bail0; - + +#if HAVE_FT_SELECT_SIZE if (strike_index >= 0) { if (FT_Select_Size (face, strike_index) != FT_Err_Ok) goto bail1; using_strike = FcTrue; } +#endif #ifdef CHECK printf ("Family %s style %s\n", face->family_name, face->style_name); @@ -2608,10 +2587,10 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing { ucs4 = map->ent[i].bmp; glyph = FT_Get_Char_Index (face, map->ent[i].encode); - if (glyph && + if (glyph && FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike)) { - /* + /* * ignore glyphs with zero advance. They’re * combining characters, and while their behaviour * isn’t well defined for monospaced applications in @@ -2723,7 +2702,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing if (FT_Get_Glyph_Name (face, glyph, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0) { ucs4 = FcGlyphNameToUcs4 (name_buf); - if (ucs4 != 0xffff && + if (ucs4 != 0xffff && FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike)) { if (advance) @@ -2793,13 +2772,13 @@ FcCharSet * FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing) { FcCharSet *cs; - + cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, -1); /* * Check for bitmap-only ttf fonts that are missing the glyf table. * In that case, pick a size and look for glyphs in that size instead */ - if (FcCharSetCount (cs) == 0) + if (FcCharSetCount (cs) == 0) { /* Check for non-scalable TT fonts */ if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) && @@ -2811,7 +2790,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing) /* Select the face closest to 16 pixels tall */ for (i = 1; i < face->num_fixed_sizes; i++) { - if (abs (face->available_sizes[i].height - 16) < + if (abs (face->available_sizes[i].height - 16) < abs (face->available_sizes[strike_index].height - 16)) strike_index = i; } @@ -2834,10 +2813,6 @@ FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks) #define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) #define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) #define TTAG_SILF FT_MAKE_TAG( 'S', 'i', 'l', 'f') -#define TT_Err_Ok FT_Err_Ok -#define TT_Err_Invalid_Face_Handle FT_Err_Invalid_Face_Handle -#define TTO_Err_Empty_Script 0x1005 -#define TTO_Err_Invalid_SubTable 0x1001 #define OTLAYOUT_HEAD "otlayout:" #define OTLAYOUT_HEAD_LEN 9 @@ -2851,9 +2826,9 @@ FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks) */ #define FcIsSpace(x) (040 == (x)) #define FcIsValidScript(x) (FcIsLower(x) || FcIsUpper (x) || FcIsSpace(x)) - + static void -addtag(FcChar8 *complex, FT_ULong tag) +addtag(FcChar8 *complex_, FT_ULong tag) { FcChar8 tagstring[OTLAYOUT_ID_LEN + 1]; @@ -2862,7 +2837,7 @@ addtag(FcChar8 *complex, FT_ULong tag) tagstring[2] = (FcChar8)(tag >> 8), tagstring[3] = (FcChar8)(tag); tagstring[4] = '\0'; - + /* skip tags which aren't alphabetic, under the assumption that * they're probably broken */ @@ -2872,10 +2847,10 @@ addtag(FcChar8 *complex, FT_ULong tag) !FcIsValidScript(tagstring[3])) return; - if (*complex != '\0') - strcat ((char *) complex, " "); - strcat ((char *) complex, "otlayout:"); - strcat ((char *) complex, (char *) tagstring); + if (*complex_ != '\0') + strcat ((char *) complex_, " "); + strcat ((char *) complex_, "otlayout:"); + strcat ((char *) complex_, (char *) tagstring); } static int @@ -2887,29 +2862,30 @@ compareulong (const void *a, const void *b) } -static FT_Error -GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags, FT_UShort *script_count) +static int +GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags) { - FT_ULong cur_offset, new_offset, base_offset; + FT_ULong cur_offset, new_offset, base_offset; FT_Stream stream = face->stream; FT_Error error; - FT_UShort n, p; + FT_UShort n, p; FT_Memory memory; + int script_count; - if ( !stream ) - return TT_Err_Invalid_Face_Handle; + if (!stream) + return 0; memory = stream->memory; if (( error = ftglue_face_goto_table( face, tabletag, stream ) )) - return error; + return 0; base_offset = ftglue_stream_pos ( stream ); /* skip version */ if ( ftglue_stream_seek ( stream, base_offset + 4L ) || ftglue_stream_frame_enter( stream, 2L ) ) - return error; + return 0; new_offset = GET_UShort() + base_offset; @@ -2917,25 +2893,24 @@ GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags, FT_UShort *scri cur_offset = ftglue_stream_pos( stream ); - if ( ftglue_stream_seek( stream, new_offset ) != TT_Err_Ok ) - return error; + if ( ftglue_stream_seek( stream, new_offset ) != FT_Err_Ok ) + return 0; base_offset = ftglue_stream_pos( stream ); if ( ftglue_stream_frame_enter( stream, 2L ) ) - return error; + return 0; - *script_count = GET_UShort (); + script_count = GET_UShort (); ftglue_stream_frame_exit( stream ); - *stags = ftglue_alloc(memory, *script_count * sizeof( FT_ULong ), &error); - - if (error) - return error; + *stags = malloc(script_count * sizeof (FT_ULong)); + if (!stags) + return 0; p = 0; - for ( n = 0; n < *script_count; n++ ) + for ( n = 0; n < script_count; n++ ) { if ( ftglue_stream_frame_enter( stream, 6L ) ) goto Fail; @@ -2949,28 +2924,24 @@ GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags, FT_UShort *scri error = ftglue_stream_seek( stream, new_offset ); - if ( error == TT_Err_Ok ) + if ( error == FT_Err_Ok ) p++; (void)ftglue_stream_seek( stream, cur_offset ); } if (!p) - { - error = TTO_Err_Invalid_SubTable; goto Fail; - } /* sort the tag list before returning it */ - qsort(*stags, *script_count, sizeof(FT_ULong), compareulong); + qsort(*stags, script_count, sizeof(FT_ULong), compareulong); - return TT_Err_Ok; + return script_count; Fail: - *script_count = 0; - ftglue_free( memory, *stags ); + free(*stags); *stags = NULL; - return error; + return 0; } static FcChar8 * @@ -2982,53 +2953,50 @@ FcFontCapabilities(FT_Face face) FT_ULong *gsubtags=NULL, *gpostags=NULL; FT_UShort gsub_count=0, gpos_count=0; FT_ULong maxsize; - FT_Memory memory = face->stream->memory; - FcChar8 *complex = NULL; + FcChar8 *complex_ = NULL; int indx1 = 0, indx2 = 0; err = FT_Load_Sfnt_Table(face, TTAG_SILF, 0, 0, &len); issilgraphitefont = ( err == FT_Err_Ok); - if (GetScriptTags(face, TTAG_GPOS, &gpostags, &gpos_count) != FT_Err_Ok) - gpos_count = 0; - if (GetScriptTags(face, TTAG_GSUB, &gsubtags, &gsub_count) != FT_Err_Ok) - gsub_count = 0; - + gpos_count = GetScriptTags(face, TTAG_GPOS, &gpostags); + gsub_count = GetScriptTags(face, TTAG_GSUB, &gsubtags); + if (!issilgraphitefont && !gsub_count && !gpos_count) goto bail; - maxsize = (((FT_ULong) gpos_count + (FT_ULong) gsub_count) * OTLAYOUT_LEN + + maxsize = (((FT_ULong) gpos_count + (FT_ULong) gsub_count) * OTLAYOUT_LEN + (issilgraphitefont ? 13 : 0)); - complex = malloc (sizeof (FcChar8) * maxsize); - if (!complex) + complex_ = malloc (sizeof (FcChar8) * maxsize); + if (!complex_) goto bail; - complex[0] = '\0'; + complex_[0] = '\0'; if (issilgraphitefont) - strcpy((char *) complex, "ttable:Silf "); + strcpy((char *) complex_, "ttable:Silf "); while ((indx1 < gsub_count) || (indx2 < gpos_count)) { if (indx1 == gsub_count) { - addtag(complex, gpostags[indx2]); + addtag(complex_, gpostags[indx2]); indx2++; } else if ((indx2 == gpos_count) || (gsubtags[indx1] < gpostags[indx2])) { - addtag(complex, gsubtags[indx1]); + addtag(complex_, gsubtags[indx1]); indx1++; } else if (gsubtags[indx1] == gpostags[indx2]) { - addtag(complex, gsubtags[indx1]); + addtag(complex_, gsubtags[indx1]); indx1++; indx2++; } else { - addtag(complex, gpostags[indx2]); + addtag(complex_, gpostags[indx2]); indx2++; } } if (FcDebug () & FC_DBG_SCANV) - printf("complex features in this font: %s\n", complex); + printf("complex_ features in this font: %s\n", complex_); bail: - ftglue_free(memory, gsubtags); - ftglue_free(memory, gpostags); - return complex; + free(gsubtags); + free(gpostags); + return complex_; } #define __fcfreetype__