/*
* $RCSId: xc/lib/fontconfig/src/fcfreetype.c,v 1.11 2002/08/31 22:17:32 keithp Exp $
*
- * Copyright © 2001 Keith Packard
+ * Copyright © 2001 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
*/
/*
- Copyright © 2002-2003 by Juliusz Chroboczek
+ Copyright © 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
{ TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, "GB3212" },
{ 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, "Johap" },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, "Johab" },
{ TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, "UCS4" },
{ TT_PLATFORM_ISO, TT_ISO_ID_7BIT_ASCII, "ASCII" },
{ TT_PLATFORM_ISO, TT_ISO_ID_10646, "UCS-2BE" },
free (utf8);
}
- if (!nfamily && face->family_name)
+ if (!nfamily && face->family_name &&
+ FcStrCmpIgnoreBlanksAndCase (face->family_name, "") != 0)
{
if (FcDebug () & FC_DBG_SCANV)
- printf ("using FreeType family %s", face->family_name);
+ printf ("using FreeType family \"%s\"\n", face->family_name);
if (!FcPatternAddString (pat, FC_FAMILY, face->family_name))
goto bail1;
++nfamily;
}
- if (!nstyle && face->style_name)
+ if (!nstyle && face->style_name &&
+ FcStrCmpIgnoreBlanksAndCase (face->style_name, "") != 0)
{
if (FcDebug () & FC_DBG_SCANV)
- printf ("using FreeType style %s", face->family_name);
+ printf ("using FreeType style \"%s\"\n", face->style_name);
if (!FcPatternAddString (pat, FC_STYLE, face->style_name))
goto bail1;
++nstyle;
strncpy ((char *) family, (char *) start, end - start);
family[end - start] = '\0';
if (FcDebug () & FC_DBG_SCANV)
- printf ("using filename for family %s", family);
+ printf ("using filename for family %s\n", family);
if (!FcPatternAddString (pat, FC_FAMILY, family))
{
free (family);
if (!FcPatternAddInteger (pat, FC_INDEX, id))
goto bail1;
- if (!FcPatternAddString (pat, FC_SOURCE, (FcChar8 *) "FreeType"))
- goto bail1;
-
#if 0
/*
* don't even try this -- CJK 'monospace' fonts are really
#define TTO_Err_Empty_Script 0x1005
#define TTO_Err_Invalid_SubTable 0x1001
+#define OTLAYOUT_HEAD "otlayout:"
+#define OTLAYOUT_HEAD_LEN 9
+#define OTLAYOUT_ID_LEN 4
+/* space + head + id */
+#define OTLAYOUT_LEN (1 + OTLAYOUT_HEAD_LEN + OTLAYOUT_ID_LEN)
+/*
+ * This is a bit generous; the registry has only lower case and space
+ * except for 'DFLT'.
+ */
+#define FcIsSpace(x) (040 == (x))
+#define FcIsValidScript(x) (FcIsLower(x) || FcIsUpper (x) || FcIsSpace(x))
+
static void
addtag(FcChar8 *complex, FT_ULong tag)
{
- FcChar8 tagstring[15];
- sprintf (tagstring, "otlayout:%c%c%c%c ",
- (unsigned char)(tag >> 24),
- (unsigned char)((tag & 0xff0000) >> 16),
- (unsigned char)((tag & 0xff00) >> 8),
- (unsigned char)(tag & 0xff));
- strncat(complex, tagstring, 14);
+ FcChar8 tagstring[OTLAYOUT_ID_LEN + 1];
+
+ tagstring[0] = (FcChar8)(tag >> 24),
+ tagstring[1] = (FcChar8)(tag >> 16),
+ 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
+ */
+ if (!FcIsValidScript(tagstring[0]) ||
+ !FcIsValidScript(tagstring[1]) ||
+ !FcIsValidScript(tagstring[2]) ||
+ !FcIsValidScript(tagstring[3]))
+ return;
+
+ if (*complex != '\0')
+ strcat (complex, " ");
+ strcat (complex, "otlayout:");
+ strcat (complex, tagstring);
}
static int
return TT_Err_Ok;
Fail:
+ *script_count = 0;
FT_FREE( *stags );
return error;
}
FT_Error err;
FT_ULong len = 0;
FT_ULong *gsubtags=NULL, *gpostags=NULL;
- FT_UShort gsub_count=0, gpos_count=0, maxsize;
+ FT_UShort gsub_count=0, gpos_count=0;
+ FT_ULong maxsize;
FT_Memory memory = face->stream->memory;
FcChar8 *complex = NULL;
int indx1 = 0, indx2 = 0;
err = FT_Load_Sfnt_Table(face, TTAG_SILF, 0, 0, &len);
issilgraphitefont = ( err == FT_Err_Ok);
- err = GetScriptTags(face, TTAG_GPOS, &gpostags, &gpos_count);
- err = GetScriptTags(face, TTAG_GSUB, &gsubtags, &gsub_count);
+ 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;
+
if (!issilgraphitefont && !gsub_count && !gpos_count)
- {
goto bail;
- }
- maxsize = ((gpos_count + gsub_count) * 15) + (issilgraphitefont ? 13 : 0);
+ maxsize = (((FT_ULong) gpos_count + (FT_ULong) gsub_count) * OTLAYOUT_LEN +
+ (issilgraphitefont ? 13 : 0));
complex = malloc (sizeof (FcChar8) * maxsize);
+ if (!complex)
+ goto bail;
+
+ complex[0] = '\0';
if (issilgraphitefont)
- {
strcpy(complex, "ttable:Silf ");
- }
- else
- {
- strcpy(complex, "");
- }
while ((indx1 < gsub_count) || (indx2 < gpos_count)) {
if (indx1 == gsub_count) {