conf.d/20-fix-globaladvance.conf | 8 ++++---- conf.d/20-unhint-small-vera.conf | 6 +++--- conf.d/25-unhint-nonlatin.conf | 30 +++++++++++++++--------------- conf.d/30-urw-aliases.conf | 7 +------ conf.d/65-fonts-persian.conf | 14 +++++++------- conf.d/80-delicious.conf | 2 +- doc/fontconfig-user.sgml | 3 ++- fonts.dtd | 1 + src/fccfg.c | 35 ++++++++++++++++++++++------------- src/fcdbg.c | 27 ++++++++++++++++++--------- src/fcint.h | 8 ++++++++ src/fclist.c | 2 +- src/fcxml.c | 24 ++++++++++++++++++++---- 13 files changed, 103 insertions(+), 64 deletions(-) New commits: commit bc4517d8e5af8f31821ec8d9990765dad2867dd4 Author: Akira TAGOH <akira@xxxxxxxxx> Date: Wed Apr 11 19:52:35 2012 +0900 Bug 19128 - Handling whitespace in aliases Add a new attribute `ignore-blanks' to <test>. When this is set to "true", any blanks in the string will be ignored on comparison. This takes effects for compare="eq" or "not_eq" only. Also changed the behavior of the comparison on <alias> too. diff --git a/conf.d/20-fix-globaladvance.conf b/conf.d/20-fix-globaladvance.conf index 2a9c063..c62ba59 100644 --- a/conf.d/20-fix-globaladvance.conf +++ b/conf.d/20-fix-globaladvance.conf @@ -7,22 +7,22 @@ FreeType very confused as it forces all widths to match. Undo this magic by disabling the width forcing code --> <match target="font"> - <test name="family"><string>GulimChe</string></test> + <test name="family" compare="eq" ignore-blanks="true"><string>GulimChe</string></test> <edit name="globaladvance"><bool>false</bool></edit> </match> <match target="font"> - <test name="family"><string>DotumChe</string></test> + <test name="family" compare="eq" ignore-blanks="true"><string>DotumChe</string></test> <edit name="globaladvance"><bool>false</bool></edit> </match> <match target="font"> - <test name="family"><string>BatangChe</string></test> + <test name="family" compare="eq" ignore-blanks="true"><string>BatangChe</string></test> <edit name="globaladvance"><bool>false</bool></edit> </match> <match target="font"> - <test name="family"><string>GungsuhChe</string></test> + <test name="family" compare="eq" ignore-blanks="true"><string>GungsuhChe</string></test> <edit name="globaladvance"><bool>false</bool></edit> </match> </fontconfig> diff --git a/conf.d/20-unhint-small-vera.conf b/conf.d/20-unhint-small-vera.conf index c4ebee9..c9505ca 100644 --- a/conf.d/20-unhint-small-vera.conf +++ b/conf.d/20-unhint-small-vera.conf @@ -10,7 +10,7 @@ --> <match target="font"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Bitstream Vera Sans</string> </test> <test name="pixelsize" compare="less"> @@ -22,7 +22,7 @@ </match> <match target="font"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Bitstream Vera Serif</string> </test> <test name="pixelsize" compare="less"> @@ -34,7 +34,7 @@ </match> <match target="font"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Bitstream Vera Sans Mono</string> </test> <test name="pixelsize" compare="less"> diff --git a/conf.d/25-unhint-nonlatin.conf b/conf.d/25-unhint-nonlatin.conf index ffb70c6..9adffa7 100644 --- a/conf.d/25-unhint-nonlatin.conf +++ b/conf.d/25-unhint-nonlatin.conf @@ -5,7 +5,7 @@ <!-- We can't hint CJK fonts well, so turn off hinting for CJK fonts. --> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Kochi Mincho</string> </test> <edit name="hinting" mode="assign"> @@ -13,7 +13,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Kochi Gothic</string> </test> <edit name="hinting" mode="assign"> @@ -21,7 +21,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Sazanami Mincho</string> </test> <edit name="hinting" mode="assign"> @@ -29,7 +29,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Sazanami Gothic</string> </test> <edit name="hinting" mode="assign"> @@ -37,7 +37,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Baekmuk Batang</string> </test> <edit name="hinting" mode="assign"> @@ -45,7 +45,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Baekmuk Dotum</string> </test> <edit name="hinting" mode="assign"> @@ -53,7 +53,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Baekmuk Gulim</string> </test> <edit name="hinting" mode="assign"> @@ -61,7 +61,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Baekmuk Headline</string> </test> <edit name="hinting" mode="assign"> @@ -69,7 +69,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>AR PL Mingti2L Big5</string> </test> <edit name="hinting" mode="assign"> @@ -77,7 +77,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>AR PL ShanHeiSun Uni</string> </test> <edit name="hinting" mode="assign"> @@ -85,7 +85,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>AR PL KaitiM Big5</string> </test> <edit name="hinting" mode="assign"> @@ -93,7 +93,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>AR PL ZenKai Uni</string> </test> <edit name="hinting" mode="assign"> @@ -101,7 +101,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>AR PL SungtiL GB</string> </test> <edit name="hinting" mode="assign"> @@ -109,7 +109,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>AR PL KaitiM GB</string> </test> <edit name="hinting" mode="assign"> @@ -117,7 +117,7 @@ </edit> </match> <match target="font"> - <test name="family" compare="eq"> + <test name="family" compare="eq" ignore-blanks="true"> <string>ZYSong18030</string> </test> <edit name="hinting" mode="assign"> diff --git a/conf.d/30-urw-aliases.conf b/conf.d/30-urw-aliases.conf index 359f9fb..aae06ac 100644 --- a/conf.d/30-urw-aliases.conf +++ b/conf.d/30-urw-aliases.conf @@ -29,13 +29,8 @@ <family>Zapf Dingbats</family> <accept><family>Dingbats</family></accept> </alias> - <!-- workaround for Bug#19128 --> - <alias binding="same"> - <family>ZapfDingbats</family> - <accept><family>Dingbats</family></accept> - </alias> <match target="pattern"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Symbol</string> </test> <edit name="family" mode="append" binding="same"> diff --git a/conf.d/65-fonts-persian.conf b/conf.d/65-fonts-persian.conf index 0033675..ea00661 100644 --- a/conf.d/65-fonts-persian.conf +++ b/conf.d/65-fonts-persian.conf @@ -181,7 +181,7 @@ <!-- Register the fonts that we actually do have --> <match target="scan"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Elham</string> </test> <edit name="foundry"> @@ -190,7 +190,7 @@ </match> <match target="scan"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Homa</string> </test> <edit name="foundry"> @@ -199,7 +199,7 @@ </match> <match target="scan"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Koodak</string> </test> <edit name="foundry"> @@ -208,7 +208,7 @@ </match> <match target="scan"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Nazli</string> </test> <edit name="foundry"> @@ -217,7 +217,7 @@ </match> <match target="scan"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Roya</string> </test> <edit name="foundry"> @@ -226,7 +226,7 @@ </match> <match target="scan"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Terafik</string> </test> <edit name="foundry"> @@ -235,7 +235,7 @@ </match> <match target="scan"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Titr</string> </test> <edit name="foundry"> diff --git a/conf.d/80-delicious.conf b/conf.d/80-delicious.conf index 728f50c..845647b 100644 --- a/conf.d/80-delicious.conf +++ b/conf.d/80-delicious.conf @@ -5,7 +5,7 @@ <!-- Delicious 'heavy' variant says its Medium weight --> <match target="scan"> - <test name="family"> + <test name="family" compare="eq" ignore-blanks="true"> <string>Delicious</string> </test> <test name="style"> diff --git a/doc/fontconfig-user.sgml b/doc/fontconfig-user.sgml index 86f2b32..22d2ad3 100644 --- a/doc/fontconfig-user.sgml +++ b/doc/fontconfig-user.sgml @@ -396,7 +396,8 @@ above). 'compare' can be one of "eq", "not_eq", "less", "less_eq", "more", "more "not_contains". 'qual' may either be the default, "any", in which case the match succeeds if any value associated with the property matches the test value, or "all", in which case all of the values associated with the property must -match the test value. When used in a <match target="font"> element, +match the test value. 'ignore-blanks' takes a boolean value. if 'ignore-blanks' is set "true", any blanks in the string will be ignored on its comparison. this takes effects only when compare="eq" or compare="not_eq". +When used in a <match target="font"> element, the target= attribute in the <test> element selects between matching the original pattern or the font. "default" selects whichever target the outer <match> element has selected. diff --git a/fonts.dtd b/fonts.dtd index e1e8b73..255367c 100644 --- a/fonts.dtd +++ b/fonts.dtd @@ -159,6 +159,7 @@ qual (any|all|first|not_first) "any" name CDATA #REQUIRED target (pattern|font|default) "default" + ignore-blanks (#PCDATA) "false" compare (eq|not_eq|less|less_eq|more|more_eq|contains|not_contains) "eq"> <!-- diff --git a/src/fccfg.c b/src/fccfg.c index f9cdaaf..31c4276 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -691,12 +691,14 @@ FcConfigPromote (FcValue v, FcValue u) FcBool FcConfigCompareValue (const FcValue *left_o, - FcOp op, + FcOp op_, const FcValue *right_o) { FcValue left = FcValueCanonicalize(left_o); FcValue right = FcValueCanonicalize(right_o); FcBool ret = FcFalse; + FcOp op = FC_OP_GET_OP (op_); + int flags = FC_OP_GET_FLAGS (op_); left = FcConfigPromote (left, right); right = FcConfigPromote (right, left); @@ -751,13 +753,19 @@ FcConfigCompareValue (const FcValue *left_o, switch (op) { case FcOpEqual: case FcOpListing: - ret = FcStrCmpIgnoreCase (left.u.s, right.u.s) == 0; + if (flags & FcOpFlagIgnoreBlanks) + ret = FcStrCmpIgnoreBlanksAndCase (left.u.s, right.u.s) == 0; + else + ret = FcStrCmpIgnoreCase (left.u.s, right.u.s) == 0; break; case FcOpContains: ret = FcStrStrIgnoreCase (left.u.s, right.u.s) != 0; break; case FcOpNotEqual: - ret = FcStrCmpIgnoreCase (left.u.s, right.u.s) != 0; + if (flags & FcOpFlagIgnoreBlanks) + ret = FcStrCmpIgnoreBlanksAndCase (left.u.s, right.u.s) != 0; + else + ret = FcStrCmpIgnoreCase (left.u.s, right.u.s) != 0; break; case FcOpNotContains: ret = FcStrStrIgnoreCase (left.u.s, right.u.s) == 0; @@ -872,8 +880,9 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e) FcResult r; FcMatrix *m; FcChar8 *str; + FcOp op = FC_OP_GET_OP (e->op); - switch (e->op) { + switch (op) { case FcOpInteger: v.type = FcTypeInteger; v.u.i = e->u.ival; @@ -961,7 +970,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e) { switch (vl.type) { case FcTypeDouble: - switch (e->op) { + switch (op) { case FcOpPlus: v.type = FcTypeDouble; v.u.d = vl.u.d + vr.u.d; @@ -990,7 +999,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e) } break; case FcTypeBool: - switch (e->op) { + switch (op) { case FcOpOr: v.type = FcTypeBool; v.u.b = vl.u.b || vr.u.b; @@ -1005,7 +1014,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e) } break; case FcTypeString: - switch (e->op) { + switch (op) { case FcOpPlus: v.type = FcTypeString; str = FcStrPlus (vl.u.s, vr.u.s); @@ -1021,7 +1030,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e) } break; case FcTypeMatrix: - switch (e->op) { + switch (op) { case FcOpTimes: v.type = FcTypeMatrix; m = malloc (sizeof (FcMatrix)); @@ -1042,7 +1051,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e) } break; case FcTypeCharSet: - switch (e->op) { + switch (op) { case FcOpPlus: v.type = FcTypeCharSet; v.u.c = FcCharSetUnion (vl.u.c, vr.u.c); @@ -1061,7 +1070,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e) } break; case FcTypeLangSet: - switch (e->op) { + switch (op) { case FcOpPlus: v.type = FcTypeLangSet; v.u.l = FcLangSetUnion (vl.u.l, vr.u.l); @@ -1186,7 +1195,7 @@ FcConfigMatchValueList (FcPattern *p, while (e) { /* Compute the value of the match expression */ - if (e->op == FcOpComma) + if (FC_OP_GET_OP (e->op) == FcOpComma) { value = FcConfigEvaluate (p, e->u.tree.left); e = e->u.tree.right; @@ -1230,7 +1239,7 @@ FcConfigValues (FcPattern *p, FcExpr *e, FcValueBinding binding) if (!l) return 0; FcMemAlloc (FC_MEM_VALLIST, sizeof (FcValueList)); - if (e->op == FcOpComma) + if (FC_OP_GET_OP (e->op) == FcOpComma) { l->value = FcConfigEvaluate (p, e->u.tree.left); l->next = FcConfigValues (p, e->u.tree.right, binding); @@ -1518,7 +1527,7 @@ FcConfigSubstituteWithPat (FcConfig *config, break; } } - switch (e->op) { + switch (FC_OP_GET_OP (e->op)) { case FcOpAssign: /* * If there was a test, then replace the matched diff --git a/src/fcdbg.c b/src/fcdbg.c index 10f3cc9..a1ed2b2 100644 --- a/src/fcdbg.c +++ b/src/fcdbg.c @@ -185,9 +185,18 @@ FcPatternPrint (const FcPattern *p) printf ("\n"); } +#define FcOpFlagsPrint(_o_) \ + { \ + int f = FC_OP_GET_FLAGS (_o_); \ + if (f & FcOpFlagIgnoreBlanks) \ + printf ("(ignore blanks)"); \ + } + void -FcOpPrint (FcOp op) +FcOpPrint (FcOp op_) { + FcOp op = FC_OP_GET_OP (op_); + switch (op) { case FcOpInteger: printf ("Integer"); break; case FcOpDouble: printf ("Double"); break; @@ -208,8 +217,8 @@ FcOpPrint (FcOp op) case FcOpQuest: printf ("Quest"); break; case FcOpOr: printf ("Or"); break; case FcOpAnd: printf ("And"); break; - case FcOpEqual: printf ("Equal"); break; - case FcOpNotEqual: printf ("NotEqual"); break; + case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (op_); break; + case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (op_); break; case FcOpLess: printf ("Less"); break; case FcOpLessEqual: printf ("LessEqual"); break; case FcOpMore: printf ("More"); break; @@ -227,7 +236,7 @@ FcOpPrint (FcOp op) case FcOpCeil: printf ("Ceil"); break; case FcOpRound: printf ("Round"); break; case FcOpTrunc: printf ("Trunc"); break; - case FcOpListing: printf ("Listing"); break; + case FcOpListing: printf ("Listing"); FcOpFlagsPrint (op_); break; case FcOpInvalid: printf ("Invalid"); break; } } @@ -236,7 +245,7 @@ void FcExprPrint (const FcExpr *expr) { if (!expr) printf ("none"); - else switch (expr->op) { + else switch (FC_OP_GET_OP (expr->op)) { case FcOpInteger: printf ("%d", expr->u.ival); break; case FcOpDouble: printf ("%g", expr->u.dval); break; case FcOpString: printf ("\"%s\"", expr->u.sval); break; @@ -287,7 +296,7 @@ FcExprPrint (const FcExpr *expr) case FcOpComma: FcExprPrint (expr->u.tree.left); printf (" "); - switch (expr->op) { + switch (FC_OP_GET_OP (expr->op)) { case FcOpAssign: printf ("Assign"); break; case FcOpAssignReplace: printf ("AssignReplace"); break; case FcOpPrependFirst: printf ("PrependFirst"); break; @@ -296,14 +305,14 @@ FcExprPrint (const FcExpr *expr) case FcOpAppendLast: printf ("AppendLast"); break; case FcOpOr: printf ("Or"); break; case FcOpAnd: printf ("And"); break; - case FcOpEqual: printf ("Equal"); break; - case FcOpNotEqual: printf ("NotEqual"); break; + case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (expr->op); break; + case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (expr->op); break; case FcOpLess: printf ("Less"); break; case FcOpLessEqual: printf ("LessEqual"); break; case FcOpMore: printf ("More"); break; case FcOpMoreEqual: printf ("MoreEqual"); break; case FcOpContains: printf ("Contains"); break; - case FcOpListing: printf ("Listing"); break; + case FcOpListing: printf ("Listing"); FcOpFlagsPrint (expr->op); break; case FcOpNotContains: printf ("NotContains"); break; case FcOpPlus: printf ("Plus"); break; case FcOpMinus: printf ("Minus"); break; diff --git a/src/fcint.h b/src/fcint.h index a982b77..a89aae1 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -244,6 +244,14 @@ typedef enum _FcOp { FcOpInvalid } FcOp; +typedef enum _FcOpFlags { + FcOpFlagIgnoreBlanks = 1 << 0 +} FcOpFlags; + +#define FC_OP_GET_OP(_x_) ((_x_) & 0xffff) +#define FC_OP_GET_FLAGS(_x_) (((_x_) & 0xffff0000) >> 16) +#define FC_OP(_x_,_f_) (FC_OP_GET_OP (_x_) | ((_f_) << 16)) + typedef struct _FcExpr { FcOp op; union { diff --git a/src/fclist.c b/src/fclist.c index 331352c..56f0432 100644 --- a/src/fclist.c +++ b/src/fclist.c @@ -148,7 +148,7 @@ FcListValueListMatchAny (FcValueListPtr patOrig, /* pattern */ * where it requires an exact match) */ if (FcConfigCompareValue (&fnt->value, - FcOpListing, + FC_OP (FcOpListing, FcOpFlagIgnoreBlanks), &pat->value)) break; } diff --git a/src/fcxml.c b/src/fcxml.c index 708e131..c49529a 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -195,7 +195,7 @@ FcExprDestroy (FcExpr *e) { if (!e) return; - switch (e->op) { + switch (FC_OP_GET_OP (e->op)) { case FcOpInteger: break; case FcOpDouble: @@ -571,7 +571,7 @@ FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type) if (!expr) return; - switch (expr->op) { + switch (FC_OP_GET_OP (expr->op)) { case FcOpInteger: case FcOpDouble: FcTypecheckValue (parse, FcTypeDouble, type); @@ -1687,7 +1687,7 @@ FcParseAlias (FcConfigParse *parse) FcTest *t = FcTestCreate (parse, FcMatchPattern, FcQualAny, (FcChar8 *) FC_FAMILY, - FcOpEqual, + FC_OP (FcOpEqual, FcOpFlagIgnoreBlanks), family); if (test) { @@ -1911,6 +1911,8 @@ FcParseTest (FcConfigParse *parse) FcOp compare; FcExpr *expr; FcTest *test; + const FcChar8 *iblanks_string; + int flags = 0; kind_string = FcConfigGetAttribute (parse, "target"); if (!kind_string) @@ -1968,13 +1970,27 @@ FcParseTest (FcConfigParse *parse) return; } } + iblanks_string = FcConfigGetAttribute (parse, "ignore-blanks"); + if (iblanks_string) + { + FcBool f = FcFalse; + + if (!FcNameBool (iblanks_string, &f)) + { + FcConfigMessage (parse, + FcSevereWarning, + "invalid test ignore-blanks \"%s\"", iblanks_string); + } + if (f) + flags |= FcOpFlagIgnoreBlanks; + } expr = FcPopBinary (parse, FcOpComma); if (!expr) { FcConfigMessage (parse, FcSevereWarning, "missing test expression"); return; } - test = FcTestCreate (parse, kind, qual, name, compare, expr); + test = FcTestCreate (parse, kind, qual, name, FC_OP (compare, flags), expr); if (!test) { FcConfigMessage (parse, FcSevereError, "out of memory"); _______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/fontconfig