Store FcNoticeFoundries in read-only memory.

Use a single character array and a separate table of integer indices.
This commit is contained in:
Tilman Sauerbeck 2007-10-25 00:36:37 -07:00 committed by Keith Packard
parent a72ef35ce6
commit 481f6c2307
1 changed files with 50 additions and 25 deletions

View File

@ -801,29 +801,47 @@ FcSfntNameLanguage (FT_SfntName *sname)
/* Order is significant. For example, some B&H fonts are hinted by /* Order is significant. For example, some B&H fonts are hinted by
URW++, and both strings appear in the notice. */ URW++, and both strings appear in the notice. */
static const struct { static const char notice_foundry_data[] =
const FT_String *notice; "Bigelow\0b&h\0"
const FcChar8 *foundry; "Adobe\0adobe\0"
} FcNoticeFoundries[] = { "Bitstream\0bitstream\0"
{ (const FT_String *) "Bigelow", (const FcChar8 *) "b&h" }, "Monotype\0monotype\0"
{ (const FT_String *) "Adobe", (const FcChar8 *) "adobe" }, "Linotype\0linotype\0"
{ (const FT_String *) "Bitstream", (const FcChar8 *) "bitstream" }, "LINOTYPE-HELL\0linotype\0"
{ (const FT_String *) "Monotype", (const FcChar8 *) "monotype" }, "IBM\0ibm\0"
{ (const FT_String *) "Linotype", (const FcChar8 *) "linotype" }, "URW\0urw\0"
{ (const FT_String *) "LINOTYPE-HELL", "International Typeface Corporation\0itc\0"
(const FcChar8 *) "linotype" }, "Tiro Typeworks\0tiro\0"
{ (const FT_String *) "IBM", (const FcChar8 *) "ibm" }, "XFree86\0xfree86\0"
{ (const FT_String *) "URW", (const FcChar8 *) "urw" }, "Microsoft\0microsoft\0"
{ (const FT_String *) "International Typeface Corporation", "Omega\0omega\0"
(const FcChar8 *) "itc" }, "Font21\0hwan\0"
{ (const FT_String *) "Tiro Typeworks", "HanYang System\0hanyang";
(const FcChar8 *) "tiro" },
{ (const FT_String *) "XFree86", (const FcChar8 *) "xfree86" }, struct _notice_foundry {
{ (const FT_String *) "Microsoft", (const FcChar8 *) "microsoft" }, /* these are the offsets into the
{ (const FT_String *) "Omega", (const FcChar8 *) "omega" }, * notice_foundry_data array.
{ (const FT_String *) "Font21", (const FcChar8 *) "hwan" }, */
{ (const FT_String *) "HanYang System", unsigned char notice_offset;
(const FcChar8 *) "hanyang" } unsigned char foundry_offset;
};
static const struct _notice_foundry FcNoticeFoundries[] = {
{ 0, 8 },
{ 12, 18 },
{ 24, 34 },
{ 44, 53 },
{ 62, 71 },
{ 80, 94 },
{ 103, 107 },
{ 111, 115 },
{ 119, 154 },
{ 158, 173 },
{ 178, 186 },
{ 194, 204 },
{ 214, 220 },
{ 226, 233 },
{ 238, 253 }
}; };
#define NUM_NOTICE_FOUNDRIES (int) (sizeof (FcNoticeFoundries) / sizeof (FcNoticeFoundries[0])) #define NUM_NOTICE_FOUNDRIES (int) (sizeof (FcNoticeFoundries) / sizeof (FcNoticeFoundries[0]))
@ -835,8 +853,15 @@ FcNoticeFoundry(const FT_String *notice)
if (notice) if (notice)
for(i = 0; i < NUM_NOTICE_FOUNDRIES; i++) for(i = 0; i < NUM_NOTICE_FOUNDRIES; i++)
if (strstr ((const char *) notice, (const char *) FcNoticeFoundries[i].notice)) {
return FcNoticeFoundries[i].foundry; const struct _notice_foundry *nf = &FcNoticeFoundries[i];
const char *n = notice_foundry_data + nf->notice_offset;
const char *f = notice_foundry_data + nf->foundry_offset;
printf ("foundry \"%s\" -> \"%s\"\n", n, f);
if (strstr ((const char *) notice, n))
return (const FcChar8 *) f;
}
return 0; return 0;
} }