fc-lang/fc-lang.c | 20 +++++++++++++++++--- src/fclang.c | 33 ++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 16 deletions(-) New commits: commit c5f0a65b36bc863d67bbf1f334262c35445ce610 Author: Behdad Esfahbod <behdad@xxxxxxxxxx> Date: Tue Aug 25 20:40:30 2009 -0400 Revert "Fix FcNameUnparseLangSet()" and redo it This reverts commit 5c6d1ff23bda4386984a1d6e4c024958f8f5547c and fixes that bug using the new reverse-map I added in the previous commit. diff --git a/src/fclang.c b/src/fclang.c index 6a3b7b5..ab7ae53 100644 --- a/src/fclang.c +++ b/src/fclang.c @@ -551,20 +551,27 @@ bail0: FcBool FcNameUnparseLangSet (FcStrBuf *buf, const FcLangSet *ls) { - int i; + int i, bit; + FcChar32 bits; FcBool first = FcTrue; - for (i = 0; i < NUM_LANG_CHAR_SET; i++) - if (FcLangSetBitGet (ls, i)) - { - if (!first) - if (!FcStrBufChar (buf, '|')) + for (i = 0; i < NUM_LANG_SET_MAP; i++) + { + if ((bits = ls->map[i])) + { + for (bit = 0; bit <= 31; bit++) + if (bits & (1 << bit)) + { + int id = (i << 5) | bit; + if (!first) + if (!FcStrBufChar (buf, '|')) + return FcFalse; + if (!FcStrBufString (buf, fcLangCharSets[fcLangCharSetIndicesInv[id]].lang)) return FcFalse; - if (!FcStrBufString (buf, fcLangCharSets[i].lang)) - return FcFalse; - first = FcFalse; - } - + first = FcFalse; + } + } + } if (ls->extra) { FcStrList *list = FcStrListCreate (ls->extra); commit d354a321ee51f0bb70a39faeed541d1a90477d7d Author: Behdad Esfahbod <behdad@xxxxxxxxxx> Date: Tue Aug 25 20:39:20 2009 -0400 Bug 23419 - "contains" expression seems not working on the fontconfig rule Fix bug in FcLangSetContains(), similar to 5c6d1ff23bda4386984a1d6e4c024958f8f5547c diff --git a/fc-lang/fc-lang.c b/fc-lang/fc-lang.c index a00aabc..21d568d 100644 --- a/fc-lang/fc-lang.c +++ b/fc-lang/fc-lang.c @@ -370,6 +370,7 @@ main (int argc, char **argv) printf ("#define LEAF(o,l) (LEAF0 + l * sizeof (FcCharLeaf) - (OFF0 + o * sizeof (intptr_t)))\n"); printf ("#define fcLangCharSets (fcLangData.langCharSets)\n"); printf ("#define fcLangCharSetIndices (fcLangData.langIndices)\n"); + printf ("#define fcLangCharSetIndicesInv (fcLangData.langIndicesInv)\n"); printf ("\n"); printf ("static const struct {\n" @@ -378,9 +379,10 @@ main (int argc, char **argv) " intptr_t leaf_offsets[%d];\n" " FcChar16 numbers[%d];\n" " FcChar%s langIndices[%d];\n" + " FcChar%s langIndicesInv[%d];\n" "} fcLangData = {\n", nsets, tl, tn, tn, - nsets < 256 ? "8 " : "16", nsets); + nsets < 256 ? "8 " : "16", nsets, nsets < 256 ? "8 " : "16", nsets); /* * Dump sets @@ -469,15 +471,27 @@ main (int argc, char **argv) } printf ("},\n"); + /* langIndices */ printf ("{\n"); for (i = 0; sets[i]; i++) { printf (" %d, /* %s */\n", entries[i].id, names[i]); } + printf ("},\n"); + + /* langIndicesInv */ + printf ("{\n"); + { + static int entries_inv[MAX_LANG]; + for (i = 0; sets[i]; i++) + entries_inv[entries[i].id] = i; + for (i = 0; sets[i]; i++) + printf (" %d, /* %s */\n", entries_inv[i], names[entries_inv[i]]); + } printf ("}\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); diff --git a/src/fclang.c b/src/fclang.c index c5ad5ef..6a3b7b5 100644 --- a/src/fclang.c +++ b/src/fclang.c @@ -686,10 +686,10 @@ FcLangSetContains (const FcLangSet *lsa, const FcLangSet *lsb) if (missing & (1 << j)) { if (!FcLangSetContainsLang (lsa, - fcLangCharSets[i*32 + j].lang)) + fcLangCharSets[fcLangCharSetIndicesInv[i*32 + j]].lang)) { if (FcDebug() & FC_DBG_MATCHV) - printf ("\tMissing bitmap %s\n", fcLangCharSets[i*32+j].lang); + printf ("\tMissing bitmap %s\n", fcLangCharSets[fcLangCharSetIndicesInv[i*32+j]].lang); return FcFalse; } } _______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/fontconfig