633. Perform country-independent matching for Chinese languages in
fontconfig (#A.1406, Keith Packard).
This commit is contained in:
parent
45fb31aa91
commit
234397b429
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* $XFree86: xc/lib/fontconfig/fc-lang/fc-lang.c,v 1.2 2002/07/07 19:18:51 keithp Exp $
|
* $XFree86: xc/lib/fontconfig/fc-lang/fc-lang.c,v 1.3 2002/08/22 07:36:43 keithp Exp $
|
||||||
*
|
*
|
||||||
* Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
|
* Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
|
||||||
*
|
*
|
||||||
|
@ -165,22 +165,38 @@ static int compare (const void *a, const void *b)
|
||||||
return FcStrCmpIgnoreCase (*as, *bs);
|
return FcStrCmpIgnoreCase (*as, *bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_LANG 1024
|
||||||
|
#define MAX_LANG_SET_MAP ((MAX_LANG + 31) / 32)
|
||||||
|
|
||||||
|
#define BitSet(map, id) ((map)[(id)>>5] |= ((FcChar32) 1 << ((id) & 0x1f)))
|
||||||
|
#define BitGet(map, id) ((map)[(id)>>5] >> ((id) & 0x1f)) & 1)
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *files[1024];
|
char *files[MAX_LANG];
|
||||||
FcCharSet *sets[1024];
|
FcCharSet *sets[MAX_LANG];
|
||||||
int duplicate[1024];
|
int duplicate[MAX_LANG];
|
||||||
char *names[1024];
|
int country[MAX_LANG];
|
||||||
|
char *names[MAX_LANG];
|
||||||
|
char *langs[MAX_LANG];
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
int ncountry = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
FcCharLeaf **leaves, **sleaves;
|
FcCharLeaf **leaves, **sleaves;
|
||||||
int total_leaves = 0;
|
int total_leaves = 0;
|
||||||
int l, sl, tl;
|
int l, sl, tl;
|
||||||
|
int c;
|
||||||
char line[1024];
|
char line[1024];
|
||||||
|
FcChar32 map[MAX_LANG_SET_MAP];
|
||||||
|
int num_lang_set_map;
|
||||||
|
|
||||||
while (*++argv)
|
while (*++argv)
|
||||||
|
{
|
||||||
|
if (i == MAX_LANG)
|
||||||
|
fatal (*argv, 0, "Too many languages");
|
||||||
files[i++] = *argv;
|
files[i++] = *argv;
|
||||||
|
}
|
||||||
files[i] = 0;
|
files[i] = 0;
|
||||||
qsort (files, i, sizeof (char *), compare);
|
qsort (files, i, sizeof (char *), compare);
|
||||||
i = 0;
|
i = 0;
|
||||||
|
@ -191,6 +207,10 @@ main (int argc, char **argv)
|
||||||
fatal (files[i], 0, strerror (errno));
|
fatal (files[i], 0, strerror (errno));
|
||||||
sets[i] = scan (f, files[i]);
|
sets[i] = scan (f, files[i]);
|
||||||
names[i] = get_name (files[i]);
|
names[i] = get_name (files[i]);
|
||||||
|
langs[i] = get_lang(names[i]);
|
||||||
|
if (strchr (langs[i], '-'))
|
||||||
|
country[ncountry++] = i;
|
||||||
|
|
||||||
total_leaves += sets[i]->num;
|
total_leaves += sets[i]->num;
|
||||||
i++;
|
i++;
|
||||||
fclose (f);
|
fclose (f);
|
||||||
|
@ -319,10 +339,54 @@ main (int argc, char **argv)
|
||||||
" { FC_REF_CONSTANT, %d, "
|
" { FC_REF_CONSTANT, %d, "
|
||||||
"(FcCharLeaf **) leaves_%s, "
|
"(FcCharLeaf **) leaves_%s, "
|
||||||
"(FcChar16 *) numbers_%s } },\n",
|
"(FcChar16 *) numbers_%s } },\n",
|
||||||
get_lang(names[i]),
|
langs[i],
|
||||||
sets[j]->num, names[j], names[j]);
|
sets[j]->num, names[j], names[j]);
|
||||||
}
|
}
|
||||||
printf ("};\n\n");
|
printf ("};\n\n");
|
||||||
|
printf ("#define NUM_LANG_CHAR_SET %d\n", i);
|
||||||
|
num_lang_set_map = (i + 31) / 32;
|
||||||
|
printf ("#define NUM_LANG_SET_MAP %d\n", num_lang_set_map);
|
||||||
|
/*
|
||||||
|
* Dump indices with country codes
|
||||||
|
*/
|
||||||
|
if (ncountry)
|
||||||
|
{
|
||||||
|
int ncountry_ent = 0;
|
||||||
|
printf ("\n");
|
||||||
|
printf ("static const FcChar32 fcLangCountrySets[][NUM_LANG_SET_MAP] = {\n");
|
||||||
|
for (c = 0; c < ncountry; c++)
|
||||||
|
{
|
||||||
|
i = country[c];
|
||||||
|
if (i >= 0)
|
||||||
|
{
|
||||||
|
int l = strchr (langs[i], '-') - langs[i];
|
||||||
|
int d, k;
|
||||||
|
|
||||||
|
for (k = 0; k < num_lang_set_map; k++)
|
||||||
|
map[k] = 0;
|
||||||
|
|
||||||
|
BitSet (map, i);
|
||||||
|
for (d = c + 1; d < ncountry; d++)
|
||||||
|
{
|
||||||
|
int j = country[d];
|
||||||
|
if (j >= 0 && !strncmp (langs[j], langs[i], l))
|
||||||
|
{
|
||||||
|
BitSet(map, j);
|
||||||
|
country[d] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf (" {");
|
||||||
|
for (k = 0; k < num_lang_set_map; k++)
|
||||||
|
printf (" 0x%08x,", map[k]);
|
||||||
|
printf (" }, /* %*.*s */\n",
|
||||||
|
l, l, langs[i]);
|
||||||
|
++ncountry_ent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf ("};\n\n");
|
||||||
|
printf ("#define NUM_COUNTRY_SET %d\n", ncountry_ent);
|
||||||
|
}
|
||||||
|
|
||||||
while (fgets (line, sizeof (line), stdin))
|
while (fgets (line, sizeof (line), stdin))
|
||||||
fputs (line, stdout);
|
fputs (line, stdout);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* $XFree86: xc/lib/fontconfig/fc-lang/fclang.tmpl.h,v 1.1 2002/07/08 07:31:51 keithp Exp $
|
* $XFree86: xc/lib/fontconfig/fc-lang/fclang.h,v 1.20 2002/10/21 17:03:47 keithp Exp $
|
||||||
*
|
*
|
||||||
* Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
|
* Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
|
||||||
*
|
*
|
||||||
|
@ -3996,3 +3996,11 @@ static const FcLangCharSet fcLangCharSets[] = {
|
||||||
{ FC_REF_CONSTANT, 1, (FcCharLeaf **) leaves_fj, (FcChar16 *) numbers_fj } },
|
{ FC_REF_CONSTANT, 1, (FcCharLeaf **) leaves_fj, (FcChar16 *) numbers_fj } },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define NUM_LANG_CHAR_SET 175
|
||||||
|
#define NUM_LANG_SET_MAP 6
|
||||||
|
|
||||||
|
static const FcChar32 fcLangCountrySets[][NUM_LANG_SET_MAP] = {
|
||||||
|
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00003e00, }, /* zh */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NUM_COUNTRY_SET 1
|
||||||
|
|
15
src/fclang.c
15
src/fclang.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* $XFree86: xc/lib/fontconfig/src/fclang.c,v 1.6 2002/08/22 18:53:22 keithp Exp $
|
* $XFree86: xc/lib/fontconfig/src/fclang.c,v 1.7 2002/08/26 23:34:31 keithp Exp $
|
||||||
*
|
*
|
||||||
* Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
|
* Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
|
||||||
*
|
*
|
||||||
|
@ -31,9 +31,6 @@ typedef struct {
|
||||||
|
|
||||||
#include "../fc-lang/fclang.h"
|
#include "../fc-lang/fclang.h"
|
||||||
|
|
||||||
#define NUM_LANG_CHAR_SET (sizeof (fcLangCharSets) / sizeof (fcLangCharSets[0]))
|
|
||||||
#define NUM_LANG_SET_MAP ((NUM_LANG_CHAR_SET + 31) / 32)
|
|
||||||
|
|
||||||
struct _FcLangSet {
|
struct _FcLangSet {
|
||||||
FcChar32 map[NUM_LANG_SET_MAP];
|
FcChar32 map[NUM_LANG_SET_MAP];
|
||||||
FcStrSet *extra;
|
FcStrSet *extra;
|
||||||
|
@ -339,13 +336,21 @@ FcLangSetCompareStrSet (const FcLangSet *ls, FcStrSet *set)
|
||||||
FcLangResult
|
FcLangResult
|
||||||
FcLangSetCompare (const FcLangSet *lsa, const FcLangSet *lsb)
|
FcLangSetCompare (const FcLangSet *lsa, const FcLangSet *lsb)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
FcLangResult best, r;
|
FcLangResult best, r;
|
||||||
|
|
||||||
for (i = 0; i < NUM_LANG_SET_MAP; i++)
|
for (i = 0; i < NUM_LANG_SET_MAP; i++)
|
||||||
if (lsa->map[i] & lsb->map[i])
|
if (lsa->map[i] & lsb->map[i])
|
||||||
return FcLangEqual;
|
return FcLangEqual;
|
||||||
best = FcLangDifferentLang;
|
best = FcLangDifferentLang;
|
||||||
|
for (j = 0; j < NUM_COUNTRY_SET; j++)
|
||||||
|
for (i = 0; i < NUM_LANG_SET_MAP; i++)
|
||||||
|
if ((lsa->map[i] & fcLangCountrySets[j][i]) &&
|
||||||
|
(lsb->map[i] & fcLangCountrySets[j][i]))
|
||||||
|
{
|
||||||
|
best = FcLangDifferentCountry;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (lsa->extra)
|
if (lsa->extra)
|
||||||
{
|
{
|
||||||
r = FcLangSetCompareStrSet (lsb, lsa->extra);
|
r = FcLangSetCompareStrSet (lsb, lsa->extra);
|
||||||
|
|
Loading…
Reference in New Issue