/*
 * fontconfig/doc/fcpattern.fncs
 *
 * Copyright © 2003 Keith Packard
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of the author(s) not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission.  The authors make no
 * representations about the suitability of this software for any purpose.  It
 * is provided "as is" without express or implied warranty.
 *
 * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */
@RET@		FcPattern *	
@FUNC@		FcPatternCreate
@TYPE1@ 	void
@PURPOSE@	Create a pattern
@DESC@
Creates a pattern with no properties; used to build patterns from scratch.
@@

@RET@		FcPattern *	
@FUNC@		FcPatternDuplicate
@TYPE1@		const FcPattern * 		@ARG1@		 p
@PURPOSE@	Copy a pattern
@DESC@
Copy a pattern, returning a new pattern that matches
<parameter>p</parameter>. Each pattern may be modified without affecting the
other.
@@

@RET@		void
@FUNC@		FcPatternReference
@TYPE1@		FcPattern * 			@ARG1@		 p
@PURPOSE@	Increment pattern reference count
@DESC@
Add another reference to <parameter>p</parameter>. Patterns are freed only
when the reference count reaches zero.
@@

@RET@		void
@FUNC@		FcPatternDestroy
@TYPE1@		FcPattern * 			@ARG1@		 p
@PURPOSE@	Destroy a pattern
@DESC@
Decrement the pattern reference count. If all references are gone, destroys
the pattern, in the process destroying all related values.
@@

@RET@		int
@FUNC@		FcPatternObjectCount
@TYPE1@		const FcPattern *		@ARG1@		p
@PURPOSE@	Returns the number of the object
@DESC@
Returns the number of the object <parameter>p</parameter> has.
@SINCE@		2.13.1
@@

@RET@		FcBool
@FUNC@		FcPatternEqual
@TYPE1@ 	const FcPattern *		@ARG1@ 		pa
@TYPE2@		const FcPattern * 		@ARG2@		pb 
@PURPOSE@	Compare patterns
@DESC@
Returns whether <parameter>pa</parameter> and <parameter>pb</parameter> are exactly alike.
@@

@RET@		FcBool
@FUNC@		FcPatternEqualSubset
@TYPE1@		const FcPattern * 		@ARG1@ 		pa
@TYPE2@		const FcPattern *		@ARG2@ 		pb
@TYPE3@ 	const FcObjectSet * 		@ARG3@ 		os 
@PURPOSE@	Compare portions of patterns
@DESC@
Returns whether <parameter>pa</parameter> and <parameter>pb</parameter> have exactly the same values for all of the
objects in <parameter>os</parameter>.
@@

@RET@		FcPattern *
@FUNC@		FcPatternFilter
@TYPE1@		FcPattern * 			@ARG1@		 p
@TYPE2@		const FcObjectSet * 		@ARG1@		 os
@PURPOSE@	Filter the objects of pattern
@DESC@
Returns a new pattern that only has those objects from
<parameter>p</parameter> that are in <parameter>os</parameter>.
If <parameter>os</parameter> is NULL, a duplicate of
<parameter>p</parameter> is returned.
@@

@RET@		FcChar32
@FUNC@		FcPatternHash
@TYPE1@		const FcPattern *		@ARG1@		p
@PURPOSE@	Compute a pattern hash value
@DESC@
Returns a 32-bit number which is the same for any two patterns which are
equal.
@@

@RET@		FcBool
@FUNC@		FcPatternAdd
@TYPE1@		FcPattern * 			@ARG1@ 		p
@TYPE2@ 	const char *			@ARG2@ 		object
@TYPE3@		FcValue%			@ARG3@		value
@TYPE4@		FcBool%				@ARG4@		append 
@PURPOSE@	Add a value to a pattern
@DESC@
Adds a single value to the list of values associated with the property named
`object<parameter>.  If `append</parameter> is FcTrue, the value is added at the end of any
existing list, otherwise it is inserted at the beginning.  `value' is saved
(with FcValueSave) when inserted into the pattern so that the library
retains no reference to any application-supplied data structure.
@@

@RET@		FcBool
@FUNC@		FcPatternAddWeak
@TYPE1@ 	FcPattern * 			@ARG1@ 		p
@TYPE2@ 	const char * 			@ARG2@ 		object
@TYPE3@ 	FcValue%  			@ARG3@ 		value
@TYPE4@ 	FcBool%  			@ARG4@		append 
@PURPOSE@	Add a value to a pattern with weak binding
@DESC@
FcPatternAddWeak is essentially the same as FcPatternAdd except that any
values added to the list have binding <parameter>weak</parameter> instead of <parameter>strong</parameter>.
@@

@TITLE@		FcPatternAdd-Type
@RET@		FcBool
@FUNC@		FcPatternAddInteger
@TYPE1@ 	FcPattern * 			@ARG1@ 		p
@TYPE2@		const char *			@ARG2@		object
@TYPE3@		int%				@ARG3@		i

@PROTOTYPE+@
@RET+@		FcBool
@FUNC+@		FcPatternAddDouble
@TYPE1+@ 	FcPattern * 			@ARG1+@ 	p
@TYPE2+@	const char *			@ARG2+@		object
@TYPE3+@	double%				@ARG3+@		d

@PROTOTYPE++@
@RET++@		FcBool
@FUNC++@	FcPatternAddString
@TYPE1++@ 	FcPattern * 			@ARG1++@ 	p
@TYPE2++@	const char *			@ARG2++@	object
@TYPE3++@	const FcChar8 *			@ARG3++@	s

@PROTOTYPE+++@
@RET+++@	FcBool
@FUNC+++@	FcPatternAddMatrix
@TYPE1+++@ 	FcPattern * 			@ARG1+++@ 	p
@TYPE2+++@	const char *			@ARG2+++@	object
@TYPE3+++@	const FcMatrix *		@ARG3+++@	m

@PROTOTYPE++++@
@RET++++@	FcBool
@FUNC++++@	FcPatternAddCharSet
@TYPE1++++@ 	FcPattern * 			@ARG1++++@ 	p
@TYPE2++++@	const char *			@ARG2++++@	object
@TYPE3++++@	const FcCharSet *		@ARG3++++@	c

@PROTOTYPE+++++@
@RET+++++@	FcBool
@FUNC+++++@	FcPatternAddBool
@TYPE1+++++@ 	FcPattern * 			@ARG1+++++@ 	p
@TYPE2+++++@	const char *			@ARG2+++++@	object
@TYPE3+++++@	FcBool%				@ARG3+++++@	b

@PROTOTYPE++++++@
@RET++++++@	FcBool
@FUNC++++++@	FcPatternAddFTFace
@TYPE1++++++@ 	FcPattern * 			@ARG1++++++@ 	p
@TYPE2++++++@	const char *			@ARG2++++++@	object
@TYPE3++++++@	const FT_Face 			@ARG3++++++@	f

@PROTOTYPE+++++++@
@RET+++++++@	FcBool
@FUNC+++++++@	FcPatternAddLangSet
@TYPE1+++++++@ 	FcPattern * 			@ARG1+++++++@ 	p
@TYPE2+++++++@	const char *			@ARG2+++++++@	object
@TYPE3+++++++@	const FcLangSet *		@ARG3+++++++@	l

@PROTOTYPE++++++++@
@RET++++++++@	FcBool
@FUNC++++++++@	FcPatternAddRange
@TYPE1++++++++@	FcPattern *			@ARG1++++++++@	p
@TYPE2++++++++@	const char *			@ARG2++++++++@	object
@TYPE3++++++++@	const FcRange *			@ARG3++++++++@	r

@PURPOSE@	Add a typed value to a pattern
@DESC@
These are all convenience functions that insert objects of the specified
type into the pattern.  Use these in preference to FcPatternAdd as they
will provide compile-time typechecking.  These all append values to
any existing list of values.

<function>FcPatternAddRange</function> are available since 2.11.91.
@@

@RET@		FcResult
@FUNC@		FcPatternGetWithBinding
@TYPE1@		FcPattern *			@ARG1@		p
@TYPE2@		const char *			@ARG2@		object
@TYPE3@		int%  	   			@ARG3@		id
@TYPE4@		FcValue *			@ARG4@		v
@TYPE5@		FcValueBinding *		@ARG5@		b
@PURPOSE@	Return a value with binding from a pattern
@DESC@
Returns in <parameter>v</parameter> the <parameter>id</parameter>'th value
and <parameter>b</parameter> binding for that associated with the property
<parameter>object</parameter>.
The Value returned is not a copy, but rather refers to the data stored
within the pattern directly.  Applications must not free this value.
@SINCE@		2.12.5
@@

@RET@		FcResult
@FUNC@		FcPatternGet
@TYPE1@		FcPattern *			@ARG1@		p
@TYPE2@		const char *			@ARG2@		object
@TYPE3@		int%  				@ARG3@ 		id
@TYPE4@		FcValue *			@ARG4@		v 
@PURPOSE@	Return a value from a pattern
@DESC@
Returns in <parameter>v</parameter> the <parameter>id</parameter>'th value
associated with the property <parameter>object</parameter>.
The value returned is not a copy, but rather refers to the data stored
within the pattern directly.  Applications must not free this value.
@@

@TITLE@		FcPatternGet-Type
@PROTOTYPE@
@RET@ 		FcResult
@FUNC@		FcPatternGetInteger
@TYPE1@		FcPattern *			@ARG1@		p
@TYPE2@		const char *			@ARG2@		object
@TYPE3@		int%				@ARG3@		n
@TYPE4@		int *				@ARG4@		i

@PROTOTYPE+@
@RET+@		FcResult
@FUNC+@ 	FcPatternGetDouble
@TYPE1+@	FcPattern *			@ARG1+@		p
@TYPE2+@	const char *			@ARG2+@		object
@TYPE3+@	int%				@ARG3+@		n
@TYPE4+@	double *			@ARG4+@		d 

@PROTOTYPE++@
@RET++@ 	FcResult
@FUNC++@	FcPatternGetString
@TYPE1++@	FcPattern *			@ARG1++@	p
@TYPE2++@	const char *			@ARG2++@	object
@TYPE3++@	int%				@ARG3++@	n
@TYPE4++@	FcChar8 **			@ARG4++@	s

@PROTOTYPE+++@
@RET+++@	FcResult
@FUNC+++@	FcPatternGetMatrix 
@TYPE1+++@ 	FcPattern * 			@ARG1+++@ 	p 
@TYPE2+++@ 	const char * 			@ARG2+++@ 	object 
@TYPE3+++@ 	int%  				@ARG3+++@ 	n 
@TYPE4+++@ 	FcMatrix ** 			@ARG4+++@ 	s 

@PROTOTYPE++++@
@RET++++@ 	FcResult 
@FUNC++++@ 	FcPatternGetCharSet 
@TYPE1++++@ 	FcPattern * 			@ARG1++++@ 	p 
@TYPE2++++@ 	const char * 			@ARG2++++@ 	object 
@TYPE3++++@ 	int%  				@ARG3++++@ 	n 
@TYPE4++++@ 	FcCharSet ** 			@ARG4++++@ 	c 

@PROTOTYPE+++++@
@RET+++++@ 	FcResult 
@FUNC+++++@ 	FcPatternGetBool 		
@TYPE1+++++@ 	FcPattern * 			@ARG1+++++@ 	p
@TYPE2+++++@ 	const char * 			@ARG2+++++@ 	object 
@TYPE3+++++@ 	int%  				@ARG3+++++@ 	n 
@TYPE4+++++@ 	FcBool * 			@ARG4+++++@ 	b 

@PROTOTYPE++++++@
@RET++++++@	FcResult
@FUNC++++++@	FcPatternGetFTFace
@TYPE1++++++@ 	FcPattern * 			@ARG1++++++@ 	p
@TYPE2++++++@	const char *			@ARG2++++++@	object
@TYPE3++++++@ 	int%  				@ARG3++++++@ 	n
@TYPE4++++++@	FT_Face *			@ARG4++++++@	f

@PROTOTYPE+++++++@
@RET+++++++@	FcResult
@FUNC+++++++@	FcPatternGetLangSet
@TYPE1+++++++@ 	FcPattern * 			@ARG1+++++++@ 	p
@TYPE2+++++++@	const char *			@ARG2+++++++@	object
@TYPE3+++++++@ 	int%  				@ARG3+++++++@ 	n
@TYPE4+++++++@	FcLangSet **			@ARG4+++++++@	l

@PROTOTYPE++++++++@
@RET++++++++@	FcResult
@FUNC++++++++@	FcPatternGetRange
@TYPE1++++++++@	FcPattern *			@ARG1++++++++@	p
@TYPE2++++++++@	const char *			@ARG2++++++++@	object
@TYPE3++++++++@	int%  	   			@ARG3++++++++@	n
@TYPE4++++++++@	FcRange **			@ARG4++++++++@	r

@PURPOSE@	Return a typed value from a pattern
@DESC@
These are convenience functions that call FcPatternGet and verify that the
returned data is of the expected type. They return FcResultTypeMismatch if
this is not the case.  Note that these (like FcPatternGet) do not make a
copy of any data structure referenced by the return value.  Use these
in preference to FcPatternGet to provide compile-time typechecking.

<function>FcPatternGetRange</function> are available since 2.11.91.
@@

@RET@		FcPattern *
@FUNC@		FcPatternBuild
@TYPE1@		FcPattern *			@ARG1@		pattern
@TYPE2@ 	...

@PROTOTYPE+@
@RET+@		FcPattern *
@FUNC+@		FcPatternVaBuild
@TYPE1+@	FcPattern *			@ARG1+@		pattern
@TYPE2+@	va_list% 			@ARG2+@		va

@PROTOTYPE++@
@RET++@		void
@FUNC++@	FcPatternVapBuild
@TYPE1++@	FcPattern *			@ARG1++@	result
@TYPE2++@	FcPattern *			@ARG2++@	pattern
@TYPE3++@	va_list%			@ARG3++@	va

@PURPOSE@	Create patterns from arguments
@DESC@
Builds a pattern using a list of objects, types and values.  Each
value to be entered in the pattern is specified with three arguments:
</para>
<orderedlist>
<listitem><para>
Object name, a string describing the property to be added.
</para></listitem><listitem><para>
Object type, one of the FcType enumerated values
</para></listitem><listitem><para>
Value, not an FcValue, but the raw type as passed to any of the
FcPatternAdd&lt;type&gt; functions.  Must match the type of the second
argument.
</para></listitem>
</orderedlist>
<para>
The argument list is terminated by a null object name, no object type nor
value need be passed for this.  The values are added to `pattern', if
`pattern' is null, a new pattern is created.  In either case, the pattern is
returned. Example
</para>
<programlisting>
pattern = FcPatternBuild (0, FC_FAMILY, FcTypeString, "Times", (char *) 0);
</programlisting>
<para>
FcPatternVaBuild is used when the arguments are already in the form of a
varargs value. FcPatternVapBuild is a macro version of FcPatternVaBuild
which returns its result directly in the <parameter>result</parameter>
variable.
@@

@RET@		FcBool
@FUNC@		FcPatternDel
@TYPE1@		FcPattern *			@ARG1@		p
@TYPE2@		const char *			@ARG2@		object 
@PURPOSE@	Delete a property from a pattern
@DESC@
Deletes all values associated with the property `object', returning 
whether the property existed or not.
@@

@RET@		FcBool
@FUNC@		FcPatternRemove
@TYPE1@		FcPattern *			@ARG1@		p
@TYPE2@		const char *			@ARG2@		object 
@TYPE3@		int%				@ARG3@		id
@PURPOSE@	Remove one object of the specified type from the pattern
@DESC@
Removes the value associated with the property `object' at position `id', returning 
whether the property existed and had a value at that position or not.
@@

@RET@		void
@FUNC@		FcPatternIterStart
@TYPE1@		const FcPattern *		@ARG1@		p
@TYPE2@		FcPatternIter *			@ARG2@		iter
@PURPOSE@	Initialize the iterator with the first iterator in the pattern
@DESC@
Initialize <parameter>iter</parameter> with the first iterator in <parameter>p</parameter>.
If there are no objects in <parameter>p</parameter>, <parameter>iter</parameter>
will not have any valid data.
@SINCE@		2.13.1
@@

@RET@		FcBool
@FUNC@		FcPatternIterNext
@TYPE1@		const FcPattern *		@ARG1@		p
@TYPE2@		FcPatternIter *			@ARG2@		iter
@PURPUSE@	Set the iterator to point to the next object in the pattern
@DESC@
Set <parameter>iter</parameter> to point to the next object in <parameter>p</parameter>
and returns FcTrue if <parameter>iter</parameter> has been changed to the next object.
returns FcFalse otherwise.
@SINCE@		2.13.1
@@

@RET@		FcBool
@FUNC@		FcPatternIterEqual
@TYPE1@		const FcPattern *		@ARG1@		p1
@TYPE2@		FcPatternIter *			@ARG2@		i1
@TYPE3@		const FcPattern *		@ARG3@		p2
@TYPE4@		FcPatternIter *			@ARG4@		i2
@PURPOSE@	Compare iterators
@DESC@
Return FcTrue if both <parameter>i1</parameter> and <parameter>i2</parameter>
point to same object and contains same values. return FcFalse otherwise.
@SINCE@		2.13.1
@@

@RET@		FcBool
@FUNC@		FcPatternFindIter
@TYPE1@		const FcPattern *		@ARG1@		p
@TYPE2@		FcPatternIter *			@ARG2@		iter
@TYPE3@		const char *  			@ARG3@		object
@PURPOSE@	Set the iterator to point to the object in the pattern
@DESC@
Set <parameter>iter</parameter> to point to <parameter>object</parameter> in
<parameter>p</parameter> if any and returns FcTrue. returns FcFalse otherwise.
@SINCE@		2.13.1
@@

@RET@		FcBool
@FUNC@		FcPatternIterIsValid
@TYPE1@		const FcPattern *		@ARG1@		p
@TYPE2@		FcPatternIter :			@ARG2@		iter
@PURPOSE@	Check whether the iterator is valid or not
@DESC@
Returns FcTrue if <parameter>iter</parameter> point to the valid entry
in <parameter>p</parameter>. returns FcFalse otherwise.
@SINCE@		2.13.1
@@

@RET@		const char *
@FUNC@		FcPatternIterGetObject
@TYPE1@		const FcPattern *		@ARG1@		p
@TYPE2@		FcPatternIter *			@ARG2@		iter
@PURPOSE@	Returns an object name which the iterator point to
@DESC@
Returns an object name in <parameter>p</parameter> which
<parameter>iter</parameter> point to. returns NULL if
<parameter>iter</parameter> isn't valid.
@SINCE@		2.13.1
@@

@RET@		int
@FUNC@		FcPatternIterValueCount
@TYPE1@		const FcPattern *		@ARG1@		p
@TYPE2@		FcPatternIter *			@ARG2@		iter
@PURPOSE@	Returns the number of the values which the iterator point to
@DESC@
Returns the number of the values in the object which <parameter>iter</parameter>
point to. if <parameter>iter</parameter> isn't valid, returns 0.
@SINCE@		2.13.1
@@

@RET@		FcResult
@FUNC@		FcPatternIterGetValue
@TYPE1@		const FcPattern *		@ARG1@		p
@TYPE2@		FcPatternIter *			@ARG2@		iter
@TYPE3@		int	      			@ARG3@		id
@TYPE4@		FcValue *			@ARG4@		v
@TYPE5@		FcValueBinding *		@ARG5@		b
@PURPOSE@	Returns a value which the iterator point to
@DESC@
Returns in <parameter>v</parameter> the <parameter>id</parameter>'th value
which <parameter>iter</parameter> point to. also binding to <parameter>b</parameter>
if given.
The value returned is not a copy, but rather refers to the data stored
within the pattern directly.  Applications must not free this value.
@SINCE@		2.13.1
@@

@RET@		void
@FUNC@		FcPatternPrint
@TYPE1@		const FcPattern *		@ARG1@		p 
@PURPOSE@	Print a pattern for debugging
@DESC@
Prints an easily readable version of the pattern to stdout.  There is
no provision for reparsing data in this format, it's just for diagnostics
and debugging.
@@

@RET@		void 	
@FUNC@		FcDefaultSubstitute
@TYPE1@		FcPattern *			@ARG1@		pattern 
@PURPOSE@	Perform default substitutions in a pattern
@DESC@
Supplies default values for underspecified font patterns:
<itemizedlist>
<listitem><para>
Patterns without a specified style or weight are set to Medium
</para></listitem>
<listitem><para>
Patterns without a specified style or slant are set to Roman
</para></listitem>
<listitem><para>
Patterns without a specified pixel size are given one computed from any
specified point size (default 12), dpi (default 75) and scale (default 1).
</para></listitem>
</itemizedlist>
@@

@RET@		FcPattern *
@FUNC@		FcNameParse
@TYPE1@		const FcChar8 *			@ARG1@		name 
@PURPOSE@	Parse a pattern string
@DESC@
Converts <parameter>name</parameter> from the standard text format described above into a pattern.
@@

@RET@		FcChar8 *
@FUNC@		FcNameUnparse
@TYPE1@		FcPattern *			@ARG1@		pat 
@PURPOSE@	Convert a pattern back into a string that can be parsed
@DESC@
Converts the given pattern into the standard text format described above.
The return value is not static, but instead refers to newly allocated memory
which should be freed by the caller using free().
@@
