/*
 * fontconfig/doc/fcfontset.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@		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.
If <parameter>config</parameter> is NULL, the default configuration is checked
to be up to date, and used.
@@

@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.
If <parameter>config</parameter> is NULL, the current configuration is used.
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 calling 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.
@@
