From: Juliusz Chroboczek Date: Fri, 11 Apr 2003 23:45:59 +0000 (+0000) Subject: Implemented foundry generation for Type 1 and TrueType X-Git-Tag: fc-2_1_94~8 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=2ae95e77f7d50d65ca414a5d5a1065aa9f2581ed;p=fontconfig.git Implemented foundry generation for Type 1 and TrueType --- diff --git a/src/data.h b/src/data.h new file mode 100644 index 0000000..5b71113 --- /dev/null +++ b/src/data.h @@ -0,0 +1,77 @@ +/* + Copyright (c) 2002-2003 by Juliusz Chroboczek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* Order is significant. For example, some B&H fonts are hinted by + URW++, and both strings appear in the notice. */ + +char *notice_foundries[][2] = + {{"Bigelow", "b&h"}, + {"Adobe", "adobe"}, + {"Bitstream", "bitsteam"}, + {"Monotype", "monotype"}, + {"Linotype", "linotype"}, + {"LINOTYPE-HELL", "linotype"}, + {"IBM", "ibm"}, + {"URW", "urw"}, + {"International Typeface Corporation", "itc"}, + {"Tiro Typeworks", "tiro"}, + {"XFree86", "xfree86"}, + {"Microsoft", "microsoft"}, + {"Omega", "omega"}, + {"Font21", "hwan"}, + {"HanYang System", "hanyang"}}; + +/* This table is partly taken from ttmkfdir by Joerg Pommnitz. */ + +/* It should not contain useless entries (such as UNKN) nor duplicate + entries for padding both with spaces and NULs. */ + +char *vendor_foundries[][2] = + {{"ADBE", "adobe"}, + {"AGFA", "agfa"}, + {"ALTS", "altsys"}, + {"APPL", "apple"}, + {"ARPH", "arphic"}, + {"ATEC", "alltype"}, + {"B&H", "b&h"}, + {"BITS", "bitstream"}, + {"CANO", "cannon"}, + {"DYNA", "dynalab"}, + {"EPSN", "epson"}, + {"FJ", "fujitsu"}, + {"IBM", "ibm"}, + {"ITC", "itc"}, + {"IMPR", "impress"}, + {"LARA", "larabiefonts"}, + {"LEAF", "interleaf"}, + {"LETR", "letraset"}, + {"LINO", "linotype"}, + {"MACR", "macromedia"}, + {"MONO", "monotype"}, + {"MS", "microsoft"}, + {"MT", "monotype"}, + {"NEC", "nec"}, + {"PARA", "paratype"}, + {"QMSI", "qms"}, + {"RICO", "ricoh"}, + {"URW", "urw"}, + {"Y&Y", "y&y"}}; diff --git a/src/fcfreetype.c b/src/fcfreetype.c index dcbcc56..1c95095 100644 --- a/src/fcfreetype.c +++ b/src/fcfreetype.c @@ -33,6 +33,8 @@ #include #include +#include "data.h" + /* * Keep Han languages separated by eliminating languages * that the codePageRange bits says aren't supported @@ -112,6 +114,41 @@ FcUtf8IsLatin (FcChar8 *str, int len) return FcTrue; } +static char* +notice_foundry(char *notice) +{ + int i; + for(i = 0; i < sizeof(notice_foundries) / sizeof(notice_foundries[0]); i++) + if(notice && strstr(notice, notice_foundries[i][0])) + return notice_foundries[i][1]; + return NULL; +} + +static int +vendor_match(signed char *vendor, char *vendor_string) +{ + /* vendor is not necessarily NUL-terminated. */ + int i, len; + len = strlen(vendor_string); + if(memcmp(vendor, vendor_string, len) != 0) + return 0; + for(i = len; i < 4; i++) + if(vendor[i] != ' ' && vendor[i] != '\0') + return 0; + return 1; +} + +static char* +vendor_foundry(signed char *vendor) +{ + int i; + for(i = 0; i < sizeof(vendor_foundries) / sizeof(vendor_foundries[0]); i++) + if(vendor_match(vendor, vendor_foundries[i][0])) + return vendor_foundries[i][1]; + return NULL; +} + + FcPattern * FcFreeTypeQuery (const FcChar8 *file, int id, @@ -129,6 +166,7 @@ FcFreeTypeQuery (const FcChar8 *file, FT_Library ftLibrary; FcChar8 *family; FcChar8 *style; + FcChar8 *foundry; int spacing; TT_OS2 *os2; PS_FontInfoRec psfontinfo; @@ -171,6 +209,16 @@ FcFreeTypeQuery (const FcChar8 *file, if (face->style_flags & FT_STYLE_FLAG_BOLD) weight = FC_WEIGHT_BOLD; + /* + * Get the OS/2 table + */ + os2 = (TT_OS2 *) FT_Get_Sfnt_Table (face, ft_sfnt_os2); + + if (os2 && os2->version >= 0x0001 && os2->version != 0xffff) + foundry = vendor_foundry(os2->achVendID); + else + foundry = NULL; + /* * Grub through the name table looking for family * and style names. FreeType makes quite a hash @@ -178,6 +226,7 @@ FcFreeTypeQuery (const FcChar8 *file, */ family = 0; style = 0; + foundry = 0; snamec = FT_Get_Sfnt_Name_Count (face); for (snamei = 0; snamei < snamec; snamei++) { @@ -287,7 +336,9 @@ FcFreeTypeQuery (const FcChar8 *file, prio |= FC_NAME_PRIO_NAME_PS; break; case TT_NAME_ID_FONT_SUBFAMILY: - break; + case TT_NAME_ID_TRADEMARK: + case TT_NAME_ID_MANUFACTURER: + break; default: continue; } @@ -400,6 +451,11 @@ FcFreeTypeQuery (const FcChar8 *file, style_prio = prio; } break; + case TT_NAME_ID_TRADEMARK: + case TT_NAME_ID_MANUFACTURER: + if(!foundry) + foundry = notice_foundry(utf8); + break; } if (utf8) free (utf8); @@ -457,6 +513,11 @@ FcFreeTypeQuery (const FcChar8 *file, free (style); } + if(foundry) { + if(!FcPatternAddString (pat, FC_FOUNDRY, foundry)) + goto bail; + } + if (!FcPatternAddString (pat, FC_FILE, file)) goto bail1; @@ -492,10 +553,6 @@ FcFreeTypeQuery (const FcChar8 *file, goto bail1; } - /* - * Get the OS/2 table and poke about - */ - os2 = (TT_OS2 *) FT_Get_Sfnt_Table (face, ft_sfnt_os2); if (os2 && os2->version >= 0x0001 && os2->version != 0xffff) { for (i = 0; i < NUM_CODE_PAGE_RANGE; i++) @@ -527,6 +584,9 @@ FcFreeTypeQuery (const FcChar8 *file, exclusiveLang = FcCodePageRange[i].lang; } } + + foundry = vendor_foundry(os2->achVendID); + } if (os2 && os2->version != 0xffff) @@ -607,6 +667,9 @@ FcFreeTypeQuery (const FcChar8 *file, slant = FC_SLANT_ITALIC; else if (psfontinfo.italic_angle >= 0) slant = FC_SLANT_ROMAN; + + if(!foundry) + foundry = notice_foundry(psfontinfo.notice); } if (!FcPatternAddInteger (pat, FC_SLANT, slant))