diff options
Diffstat (limited to 'fontconfig')
-rw-r--r-- | fontconfig/Makefile.am | 1 | ||||
-rw-r--r-- | fontconfig/configure.ac | 1 | ||||
-rw-r--r-- | fontconfig/doc/fontconfig-user.sgml | 2 | ||||
-rw-r--r-- | fontconfig/fonts.dtd | 4 | ||||
-rw-r--r-- | fontconfig/src/fccfg.c | 10 | ||||
-rw-r--r-- | fontconfig/src/fcdbg.c | 6 | ||||
-rw-r--r-- | fontconfig/src/fcint.h | 1 | ||||
-rw-r--r-- | fontconfig/src/fcxml.c | 57 |
8 files changed, 77 insertions, 5 deletions
diff --git a/fontconfig/Makefile.am b/fontconfig/Makefile.am index 84c91acbb..8510f556f 100644 --- a/fontconfig/Makefile.am +++ b/fontconfig/Makefile.am @@ -59,7 +59,6 @@ MAINTAINERCLEANFILES = \ $(srcdir)/mkinstalldirs \ `find "$(srcdir)" -type f -name Makefile.in -print` -pkgconfigdir=$(libdir)/pkgconfig pkgconfig_DATA = fontconfig.pc baseconfigdir = $(BASECONFIGDIR) diff --git a/fontconfig/configure.ac b/fontconfig/configure.ac index f8a41c934..4996b7936 100644 --- a/fontconfig/configure.ac +++ b/fontconfig/configure.ac @@ -68,6 +68,7 @@ AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL AC_PROG_MAKE_SET PKG_PROG_PKG_CONFIG +m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], AC_SUBST([pkgconfigdir], ${libdir}/pkgconfig)) AC_MSG_CHECKING([for RM macro]) _predefined_rm=`make -p -f /dev/null 2>/dev/null|grep '^RM ='|sed -e 's/^RM = //'` diff --git a/fontconfig/doc/fontconfig-user.sgml b/fontconfig/doc/fontconfig-user.sgml index 90e246b69..eeff69add 100644 --- a/fontconfig/doc/fontconfig-user.sgml +++ b/fontconfig/doc/fontconfig-user.sgml @@ -425,6 +425,8 @@ with "same" binding using the value from the matched pattern element. "prepend_first" Insert at head of list Insert at head of list "append" Append after matching Append at end of list "append_last" Append at end of list Append at end of list + "delete" Delete matching value Delete all values + "delete_all" Delete all values Delete all values </programlisting> </para></refsect2> <refsect2><title><literal><int></literal>, <literal><double></literal>, <literal><string></literal>, <literal><bool></literal></title><para> diff --git a/fontconfig/fonts.dtd b/fontconfig/fonts.dtd index def8c216f..4c38e77f0 100644 --- a/fontconfig/fonts.dtd +++ b/fontconfig/fonts.dtd @@ -140,7 +140,7 @@ if 'target' is 'font', execute the match on the result of a font selection. --> -<!ELEMENT match (test*, edit*)> +<!ELEMENT match (test*, edit*)+> <!ATTLIST match target (pattern|font|scan) "pattern"> @@ -189,7 +189,7 @@ <!ELEMENT edit (%expr;)*> <!ATTLIST edit name CDATA #REQUIRED - mode (assign|assign_replace|prepend|append|prepend_first|append_last) "assign" + mode (assign|assign_replace|prepend|append|prepend_first|append_last|delete|delete_all) "assign" binding (weak|strong|same) "weak"> <!-- diff --git a/fontconfig/src/fccfg.c b/fontconfig/src/fccfg.c index 12d7e1a97..db878d5f4 100644 --- a/fontconfig/src/fccfg.c +++ b/fontconfig/src/fccfg.c @@ -1701,6 +1701,16 @@ FcConfigSubstituteWithPat (FcConfig *config, case FcOpAppendLast: FcConfigPatternAdd (p, e->object, l, FcTrue); break; + case FcOpDelete: + if (t) + { + FcConfigDel (&st[i].elt->values, st[i].value); + break; + } + /* fall through ... */ + case FcOpDeleteAll: + FcConfigPatternDel (p, e->object); + break; default: FcValueListDestroy (l); break; diff --git a/fontconfig/src/fcdbg.c b/fontconfig/src/fcdbg.c index 270d79179..9d02f5ac7 100644 --- a/fontconfig/src/fcdbg.c +++ b/fontconfig/src/fcdbg.c @@ -79,7 +79,7 @@ void FcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark) { if (show_pos_mark) - printf (" [insert here] "); + printf (" [marker] "); else printf (" "); _FcValuePrintFile (stdout, v); @@ -110,7 +110,7 @@ FcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos) FcValueBindingPrint (l); } if (!pos) - printf (" [insert here]"); + printf (" [marker]"); } void @@ -222,6 +222,8 @@ FcOpPrint (FcOp op_) case FcOpPrependFirst: printf ("PrependFirst"); break; case FcOpAppend: printf ("Append"); break; case FcOpAppendLast: printf ("AppendLast"); break; + case FcOpDelete: printf ("Delete"); break; + case FcOpDeleteAll: printf ("DeleteAll"); break; case FcOpQuest: printf ("Quest"); break; case FcOpOr: printf ("Or"); break; case FcOpAnd: printf ("And"); break; diff --git a/fontconfig/src/fcint.h b/fontconfig/src/fcint.h index 71b734150..fceb8cc7b 100644 --- a/fontconfig/src/fcint.h +++ b/fontconfig/src/fcint.h @@ -208,6 +208,7 @@ typedef enum _FcOp { FcOpField, FcOpConst, FcOpAssign, FcOpAssignReplace, FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast, + FcOpDelete, FcOpDeleteAll, FcOpQuest, FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual, FcOpContains, FcOpListing, FcOpNotContains, diff --git a/fontconfig/src/fcxml.c b/fontconfig/src/fcxml.c index 2a0d088c1..470e44fac 100644 --- a/fontconfig/src/fcxml.c +++ b/fontconfig/src/fcxml.c @@ -260,6 +260,8 @@ FcExprDestroy (FcExpr *e) case FcOpPrependFirst: case FcOpAppend: case FcOpAppendLast: + case FcOpDelete: + case FcOpDeleteAll: break; case FcOpOr: case FcOpAnd: @@ -2321,6 +2323,8 @@ static const FcOpMap fcModeOps[] = { { "prepend_first", FcOpPrependFirst }, { "append", FcOpAppend }, { "append_last", FcOpAppendLast }, + { "delete", FcOpDelete }, + { "delete_all", FcOpDeleteAll }, }; #define NUM_MODE_OPS (int) (sizeof fcModeOps / sizeof fcModeOps[0]) @@ -2363,6 +2367,13 @@ FcParseEdit (FcConfigParse *parse) return; expr = FcPopBinary (parse, FcOpComma); + if ((mode == FcOpDelete || mode == FcOpDeleteAll) && + expr != NULL) + { + FcConfigMessage (parse, FcSevereWarning, "Expression doesn't take any effects for delete and delete_all"); + FcExprDestroy (expr); + expr = NULL; + } edit = FcEditCreate (parse, FcObjectFromName ((char *) name), mode, expr, binding); if (!edit) @@ -2375,6 +2386,11 @@ FcParseEdit (FcConfigParse *parse) FcEditDestroy (edit); } +typedef struct FcSubstStack { + FcTest *test; + FcEdit *edit; +} FcSubstStack; + static void FcParseMatch (FcConfigParse *parse) { @@ -2383,6 +2399,9 @@ FcParseMatch (FcConfigParse *parse) FcTest *test = 0; FcEdit *edit = 0; FcVStack *vstack; + FcBool tested = FcFalse; + FcSubstStack *sstack = NULL; + int len, pos = 0; kind_name = FcConfigGetAttribute (parse, "target"); if (!kind_name) @@ -2401,6 +2420,16 @@ FcParseMatch (FcConfigParse *parse) return; } } + len = FcVStackElements(parse); + if (len > 0) + { + sstack = malloc (sizeof (FcSubstStack) * (len + 1)); + if (!sstack) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + } while ((vstack = FcVStackPeek (parse))) { switch ((int) vstack->tag) { @@ -2408,8 +2437,22 @@ FcParseMatch (FcConfigParse *parse) vstack->u.test->next = test; test = vstack->u.test; vstack->tag = FcVStackNone; + tested = FcTrue; break; case FcVStackEdit: + /* due to the reverse traversal, <edit> node appears faster than + * <test> node if any. so we have to deal with it here rather than + * the above in FcVStackTest, and put recipes in reverse order. + */ + if (tested) + { + sstack[pos].test = test; + sstack[pos].edit = edit; + pos++; + test = NULL; + edit = NULL; + tested = FcFalse; + } vstack->u.edit->next = edit; edit = vstack->u.edit; vstack->tag = FcVStackNone; @@ -2428,6 +2471,20 @@ FcParseMatch (FcConfigParse *parse) } if (!FcConfigAddEdit (parse->config, test, edit, kind)) FcConfigMessage (parse, FcSevereError, "out of memory"); + if (sstack) + { + int i; + + for (i = 0; i < pos; i++) + { + if (!FcConfigAddEdit (parse->config, sstack[pos - i - 1].test, sstack[pos - i - 1].edit, kind)) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + } + free (sstack); + } } static void |