X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcfreetype.c;h=96f70c372ccd13b5f9156e41f2ad450dabf8f474;hb=23816bf9acbd6cc5dd942daaba3cc084ea70d99d;hp=87f3b999e2a663ea947066e76f80120b41893de2;hpb=2f02e38361b24032945e24f7f8480999bf9df1e2;p=fontconfig.git diff --git a/src/fcfreetype.c b/src/fcfreetype.c index 87f3b99..96f70c3 100644 --- a/src/fcfreetype.c +++ b/src/fcfreetype.c @@ -44,10 +44,10 @@ THE SOFTWARE. */ +#include "fcint.h" #include #include #include -#include "fcint.h" #include #include FT_FREETYPE_H #include FT_TRUETYPE_TABLES_H @@ -64,6 +64,7 @@ #include "ftglue.h" +#if HAVE_WARNING_CPP_DIRECTIVE #if !HAVE_FT_GET_BDF_PROPERTY #warning "No FT_Get_BDF_Property: Please install freetype 2.1.4 or later" #endif @@ -71,6 +72,7 @@ #if !HAVE_FT_GET_PS_FONT_INFO #warning "No FT_Get_PS_Font_Info: Please install freetype 2.1.1 or later" #endif +#endif /* * Keep Han languages separated by eliminating languages @@ -554,11 +556,32 @@ FcFontCapabilities(FT_Face face); #define NUM_FC_MAC_ROMAN_FAKE (int) (sizeof (fcMacRomanFake) / sizeof (fcMacRomanFake[0])) -#if HAVE_ICONV && HAVE_ICONV_H -#define USE_ICONV 1 +#if USE_ICONV #include #endif +/* + * A shift-JIS will have many high bits turned on + */ +static FcBool +FcLooksLikeSJIS (FcChar8 *string, int len) +{ + int nhigh = 0, nlow = 0; + + while (len-- > 0) + { + if (*string++ & 0x80) nhigh++; + else nlow++; + } + /* + * Heuristic -- if more than 1/3 of the bytes have the high-bit set, + * this is likely to be SJIS and not ROMAN + */ + if (nhigh * 2 > nlow) + return FcTrue; + return FcFalse; +} + static FcChar8 * FcSfntNameTranscode (FT_SfntName *sname) { @@ -579,24 +602,35 @@ FcSfntNameTranscode (FT_SfntName *sname) fromcode = fcFtEncoding[i].fromcode; /* - * "real" Mac language IDs are all less than 150. - * Names using one of the MS language IDs are assumed - * to use an associated encoding (Yes, this is a kludge) + * Many names encoded for TT_PLATFORM_MACINTOSH are broken + * in various ways. Kludge around them. */ - if (!strcmp (fromcode, FC_ENCODING_MAC_ROMAN) && - sname->language_id >= 0x100) + if (!strcmp (fromcode, FC_ENCODING_MAC_ROMAN)) { - int f; + if (sname->language_id == TT_MAC_LANGID_ENGLISH && + FcLooksLikeSJIS (sname->string, sname->string_len)) + { + fromcode = "SJIS"; + } + else if (sname->language_id >= 0x100) + { + /* + * "real" Mac language IDs are all less than 150. + * Names using one of the MS language IDs are assumed + * to use an associated encoding (Yes, this is a kludge) + */ + int f; - fromcode = NULL; - for (f = 0; f < NUM_FC_MAC_ROMAN_FAKE; f++) - if (fcMacRomanFake[f].language_id == sname->language_id) - { - fromcode = fcMacRomanFake[f].fromcode; - break; - } - if (!fromcode) - return 0; + fromcode = NULL; + for (f = 0; f < NUM_FC_MAC_ROMAN_FAKE; f++) + if (fcMacRomanFake[f].language_id == sname->language_id) + { + fromcode = fcMacRomanFake[f].fromcode; + break; + } + if (!fromcode) + return 0; + } } if (!strcmp (fromcode, "UCS-2BE") || !strcmp (fromcode, "UTF-16BE")) { @@ -737,10 +771,24 @@ static const FcChar8 * FcSfntNameLanguage (FT_SfntName *sname) { int i; + FT_UShort platform_id = sname->platform_id; + FT_UShort language_id = sname->language_id; + + /* + * Many names encoded for TT_PLATFORM_MACINTOSH are broken + * in various ways. Kludge around them. + */ + if (platform_id == TT_PLATFORM_MACINTOSH && + sname->encoding_id == TT_MAC_ID_ROMAN && + FcLooksLikeSJIS (sname->string, sname->string_len)) + { + language_id = TT_MAC_LANGID_JAPANESE; + } + for (i = 0; i < NUM_FC_FT_LANGUAGE; i++) - if (fcFtLanguage[i].platform_id == sname->platform_id && + if (fcFtLanguage[i].platform_id == platform_id && (fcFtLanguage[i].language_id == TT_LANGUAGE_DONT_CARE || - fcFtLanguage[i].language_id == sname->language_id)) + fcFtLanguage[i].language_id == language_id)) { if (fcFtLanguage[i].lang[0] == '\0') return NULL; @@ -906,9 +954,10 @@ static const FcStringConst weightConsts[] = { { (FC8) "demibold", FC_WEIGHT_DEMIBOLD }, { (FC8) "demi", FC_WEIGHT_DEMIBOLD }, { (FC8) "semibold", FC_WEIGHT_SEMIBOLD }, - { (FC8) "bold", FC_WEIGHT_BOLD }, { (FC8) "extrabold", FC_WEIGHT_EXTRABOLD }, + { (FC8) "superbold", FC_WEIGHT_EXTRABOLD }, { (FC8) "ultrabold", FC_WEIGHT_ULTRABOLD }, + { (FC8) "bold", FC_WEIGHT_BOLD }, { (FC8) "black", FC_WEIGHT_BLACK }, { (FC8) "heavy", FC_WEIGHT_HEAVY }, }; @@ -937,6 +986,7 @@ static const FcStringConst widthConsts[] = { static const FcStringConst slantConsts[] = { { (FC8) "italic", FC_SLANT_ITALIC }, + { (FC8) "kursiv", FC_SLANT_ITALIC }, { (FC8) "oblique", FC_SLANT_OBLIQUE }, }; @@ -945,6 +995,20 @@ static const FcStringConst slantConsts[] = { #define FcIsSlant(s) FcStringIsConst(s,slantConsts,NUM_SLANT_CONSTS) #define FcContainsSlant(s) FcStringContainsConst (s,slantConsts,NUM_SLANT_CONSTS) +static const FcStringConst decorativeConsts[] = { + { (FC8) "shadow", FcTrue }, + { (FC8) "smallcaps", FcTrue }, + { (FC8) "antiqua", FcTrue }, + { (FC8) "romansc", FcTrue }, + { (FC8) "embosed", FcTrue }, + { (FC8) "romansmallcaps", FcTrue }, +}; + +#define NUM_DECORATIVE_CONSTS (int) (sizeof (decorativeConsts) / sizeof (decorativeConsts[0])) + +#define FcIsDecorative(s) FcStringIsConst(s,decorativeConsts,NUM_DECORATIVE_CONSTS) +#define FcContainsDecorative(s) FcStringContainsConst (s,decorativeConsts,NUM_DECORATIVE_CONSTS) + static double FcGetPixelSize (FT_Face face, int i) { @@ -990,6 +1054,7 @@ FcFreeTypeQuery (const FcChar8 *file, int slant = -1; int weight = -1; int width = -1; + FcBool decorative = FcFalse; int i; FcCharSet *cs; FcLangSet *ls; @@ -998,7 +1063,6 @@ FcFreeTypeQuery (const FcChar8 *file, FcChar8 *family = 0; #endif FcChar8 *complex; - FcChar8 *file2; const FcChar8 *foundry = 0; int spacing; TT_OS2 *os2; @@ -1279,15 +1343,8 @@ FcFreeTypeQuery (const FcChar8 *file, printf ("Saving unique fullname %s\n", full); } - file2 = FcStrCopy (file); - if (!FcPatternAddString (pat, FC_FILE, FcStrBasename(file2))) - { - FcStrFree (file2); + if (!FcPatternAddString (pat, FC_FILE, file)) goto bail1; - } - FcStrFree (file2); - - FcPatternAddFullFname (pat, (const char *)FcStrCopy (file)); if (!FcPatternAddInteger (pat, FC_INDEX, id)) goto bail1; @@ -1373,6 +1430,9 @@ FcFreeTypeQuery (const FcChar8 *file, weight = FC_WEIGHT_EXTRABOLD; else if (os2->usWeightClass < 950) weight = FC_WEIGHT_BLACK; + if ((FcDebug() & FC_DBG_SCANV) && weight != -1) + printf ("\tos2 weight class %d maps to weight %d\n", + os2->usWeightClass, weight); switch (os2->usWidthClass) { case 1: width = FC_WIDTH_ULTRACONDENSED; break; @@ -1385,6 +1445,9 @@ FcFreeTypeQuery (const FcChar8 *file, case 8: width = FC_WIDTH_EXTRAEXPANDED; break; case 9: width = FC_WIDTH_ULTRAEXPANDED; break; } + if ((FcDebug() & FC_DBG_SCANV) && width != -1) + printf ("\tos2 width class %d maps to width %d\n", + os2->usWidthClass, width); } if (os2 && (complex = FcFontCapabilities(face))) { @@ -1500,6 +1563,12 @@ FcFreeTypeQuery (const FcChar8 *file, if (FcDebug() & FC_DBG_SCANV) printf ("\tStyle %s maps to slant %d\n", style, slant); } + if (decorative == FcFalse) + { + decorative = FcContainsDecorative (style) > 0; + if (FcDebug() & FC_DBG_SCANV) + printf ("\tStyle %s maps to decorative %d\n", style, decorative); + } } /* * Pull default values from the FreeType flags if more @@ -1537,6 +1606,9 @@ FcFreeTypeQuery (const FcChar8 *file, if (!FcPatternAddString (pat, FC_FOUNDRY, foundry)) goto bail1; + if (!FcPatternAddBool (pat, FC_DECORATIVE, decorative)) + goto bail1; + /* * Compute the unicode coverage for the font */ @@ -2880,3 +2952,7 @@ bail: ftglue_free(memory, gpostags); return complex; } + +#define __fcfreetype__ +#include "fcaliastail.h" +#undef __fcfreetype__