X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcfreetype.c;h=c30826e52549264ebe7161400ddc4842d0468be0;hb=6b1fc678ca59df3f3f1ffac0e509cf485c9df0c0;hp=d6197de6df129b900673f2219adcf4db7cca49d4;hpb=317b849215ab16cfcd0dda0e424efc9216a74f28;p=fontconfig.git diff --git a/src/fcfreetype.c b/src/fcfreetype.c index d6197de..c30826e 100644 --- a/src/fcfreetype.c +++ b/src/fcfreetype.c @@ -13,9 +13,9 @@ * 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 @@ -120,11 +120,11 @@ static const FcFtEncoding fcFtEncoding[] = { { TT_PLATFORM_MACINTOSH, TT_MAC_ID_JAPANESE, "SJIS" }, { 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, "UCS-2BE" }, { TT_PLATFORM_ISO, TT_ISO_ID_7BIT_ASCII, "ASCII" }, { TT_PLATFORM_ISO, TT_ISO_ID_10646, "UCS-2BE" }, { TT_PLATFORM_ISO, TT_ISO_ID_8859_1, "ISO-8859-1" }, @@ -1091,10 +1091,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, @@ -1119,7 +1125,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; @@ -1236,6 +1242,9 @@ 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 @@ -1266,6 +1275,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) @@ -1478,14 +1490,14 @@ 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_); } /* @@ -1662,7 +1674,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 */ @@ -2525,9 +2537,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 * @@ -2551,11 +2560,13 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing 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); @@ -2801,10 +2812,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 @@ -2820,7 +2827,7 @@ FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks) #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]; @@ -2839,10 +2846,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 @@ -2854,29 +2861,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; @@ -2884,25 +2892,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; @@ -2916,28 +2923,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 * @@ -2950,52 +2953,50 @@ FcFontCapabilities(FT_Face face) 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 + (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__