/*
 * $Id$
 *
 * 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 Keith Packard not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission.  Keith Packard makes no
 * representations about the suitability of this software for any purpose.  It
 * is provided "as is" without express or implied warranty.
 *
 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL KEITH PACKARD 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@		FcFontSet *
@FUNC@		FcFontSetCreate
@TYPE1@		void
@PURPOSE@	Create a font set
@DESC@
Creates an empty font set.
@@

@RET@		void
@FUNC@		FcFontSetDestroy
@TYPE1@		FcFontSet *			@ARG1@		s
@PURPOSE@	Destroy a font set
@DESC@
Destroys a font set.  Note that this destroys any referenced patterns as
well.
@@

@RET@		FcBool
@FUNC@		FcFontSetAdd
@TYPE1@		FcFontSet *			@ARG1@		s
@TYPE2@		FcPattern *			@ARG2@		font
@PURPOSE@	Add to a font set
@DESC@
Adds a pattern to a font set.  Note that the pattern is not copied before
being inserted into the set. Returns FcFalse if the pattern cannot be
inserted into the set (due to allocation failure). Otherwise returns FcTrue.
@@

@RET@		FcFontSet *
@FUNC@		FcFontSetList
@TYPE1@		FcConfig *			@ARG1@		config
@TYPE2@		FcFontSet **			@ARG2@		sets
@TYPE3@		int				@ARG3@		nsets
@TYPE4@		FcPattern *			@ARG4@		pattern
@TYPE5@		FcObjectSet *			@ARG5@		object_set
@PURPOSE@	List fonts from a set of font sets
@DESC@
Selects fonts matching <parameter>pattern</parameter> from
<parameter>sets</parameter>, creates patterns from those
fonts containing only the objects in <parameter>object_set</parameter> and returns
the set of unique such patterns.
@@

@RET@		FcPattern *
@FUNC@		FcFontSetMatch
@TYPE1@		FcConfig *			@ARG1@		config
@TYPE2@		FcFontSet **			@ARG2@		sets
@TYPE3@		int				@ARG3@		nsets
@TYPE4@		FcPattern *			@ARG4@		pattern
@TYPE5@		FcResult *			@ARG5@		result
@PURPOSE@	Return the best font from a set of font sets
@DESC@
Finds the font in <parameter>sets</parameter> most closely matching
<parameter>pattern</parameter> and returns the result of
<function>FcFontRenderPrepare</function> for that font and the provided
pattern. This function should be called only after
<function>FcConfigSubstitute</function> and
<function>FcDefaultSubstitute</function> have been called for
<parameter>pattern</parameter>; otherwise the results will not be correct.
Returns NULL if an error occurs during this process.
@@

@RET@		void
@FUNC@		FcFontSetPrint
@TYPE1@		FcFontSet *			@ARG1@		set
@PURPOSE@	Print a set of patterns to stdout
@DESC@
This function is useful for diagnosing font related issues, printing the
complete contents of every pattern in <parameter>set</parameter>. The format
of the output is designed to be of help to users and developers, and may
change at any time.
@@

@RET@		
@FUNC@		FcFontSetSort
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcFontSet **			@ARG2@		sets
@TYPE3@		int				@ARG3@		nsets
@TYPE4@		FcPattern *			@ARG4@		pattern
@TYPE5@		FcBool%				@ARG5@		trim
@TYPE6@		FcCharSet **			@ARG6@		csp
@TYPE7@		FcResult *                      @ARG7@          result
@PURPOSE@	Add to a font set
@DESC@
Returns the list of fonts from <parameter>sets</parameter>
sorted by closeness to <parameter>pattern</parameter>.  
If <parameter>trim</parameter> is FcTrue,
elements in the list which don't include Unicode coverage not provided by
earlier elements in the list are elided.  The union of Unicode coverage of
all of the fonts is returned in <parameter>csp</parameter>,
if <parameter>csp</parameter> is not NULL.  This function
should be called only after FcConfigSubstitute and FcDefaultSubstitute have
been called for <parameter>p</parameter>;
otherwise the results will not be correct.
    </para><para>
The returned FcFontSet references FcPattern structures which may be shared
by the return value from multiple FcFontSort calls, applications cannot
modify these patterns.  Instead, they should be passed, along with
<parameter>pattern</parameter> to
<function>FcFontRenderPrepare</function> which combines them into a complete pattern.
    </para><para>
The FcFontSet returned by FcFontSetSort is destroyed by caling FcFontSetDestroy.
@@

@RET@		
@FUNC@		FcFontSetSortDestroy
@TYPE1@		FcFontSet *			@ARG1@		set
@PURPOSE@	DEPRECATED destroy a font set
@DESC@
This function is DEPRECATED. <function>FcFontSetSortDestroy</function>
destroys <parameter>set</parameter> by calling
<function>FcFontSetDestroy</function>. Applications should use
<function>FcFontSetDestroy</function> directly instead.
@@
