summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuliusz Chroboczek <Juliusz.Chroboczek@pps.jussieu.fr>2003-04-11 23:45:59 +0000
committerJuliusz Chroboczek <Juliusz.Chroboczek@pps.jussieu.fr>2003-04-11 23:45:59 +0000
commit2ae95e77f7d50d65ca414a5d5a1065aa9f2581ed (patch)
tree756a84f61685d7b6012acc082fbd2b55a110ad1f
parent0a557ec372a7dddede4edec3ac77caf328fd12f5 (diff)
Implemented foundry generation for Type 1 and TrueType
-rw-r--r--src/data.h77
-rw-r--r--src/fcfreetype.c73
2 files changed, 145 insertions, 5 deletions
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 <freetype/ttnameid.h>
#include <freetype/t1tables.h>
+#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;
@@ -172,12 +210,23 @@ FcFreeTypeQuery (const FcChar8 *file,
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
* of them
*/
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))