/*
 * fontconfig/doc/fcconfig.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@           FcConfig *
@FUNC@          FcConfigCreate
@TYPE1@		void
@PURPOSE@	Create a configuration
@DESC@
Creates an empty configuration.
@@

@RET@           FcConfig *
@FUNC@          FcConfigReference
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Increment config reference count
@DESC@
Add another reference to <parameter>config</parameter>. Configs are freed only
when the reference count reaches zero.
If <parameter>config</parameter> is NULL, the current configuration is used.
In that case this function will be similar to FcConfigGetCurrent() except that
it increments the reference count before returning and the user is responsible
for destroying the configuration when not needed anymore.
@@

@RET@           void
@FUNC@          FcConfigDestroy
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Destroy a configuration
@DESC@
Decrements the config reference count. If all references are gone, destroys
the configuration and any data associated with it.
Note that calling this function with the return from FcConfigGetCurrent will
cause a new configuration to be created for use as current configuration.
@@

@RET@           FcBool
@FUNC@          FcConfigSetCurrent
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Set configuration as default
@DESC@
Sets the current default configuration to <parameter>config</parameter>.  Implicitly calls
FcConfigBuildFonts if necessary, and FcConfigReference() to inrease the reference count
in <parameter>config</parameter> since 2.12.0, returning FcFalse if that call fails.
@@

@RET@           FcConfig *
@FUNC@          FcConfigGetCurrent
@TYPE1@		void
@PURPOSE@	Return current configuration
@DESC@
Returns the current default configuration.
@@

@RET@           FcBool
@FUNC@          FcConfigUptoDate
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Check timestamps on config files
@DESC@
Checks all of the files related to <parameter>config</parameter> and returns
whether any of them has been modified since the configuration was created.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@		FcChar8 *
@FUNC@		FcConfigHome
@TYPE1@		void
@PURPOSE@	return the current home directory.
@DESC@
Return the current user's home directory, if it is available, and if using it
is enabled, and NULL otherwise.
See also <function>FcConfigEnableHome</function>).
@@

@RET@		FcBool
@FUNC@		FcConfigEnableHome
@TYPE1@		FcBool%				@ARG1@		enable
@PURPOSE@	controls use of the home directory.
@DESC@
If <parameter>enable</parameter> is FcTrue, then Fontconfig will use various
files which are specified relative to the user's home directory (using the ~
notation in the configuration). When <parameter>enable</parameter> is
FcFalse, then all use of the home directory in these contexts will be
disabled. The previous setting of the value is returned.
@@

@RET@           FcBool
@FUNC@          FcConfigBuildFonts
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Build font database
@DESC@
Builds the set of available fonts for the given configuration.  Note that
any changes to the configuration after this call have indeterminate effects.
Returns FcFalse if this operation runs out of memory.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcStrList *
@FUNC@          FcConfigGetConfigDirs
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get config directories
@DESC@
Returns the list of font directories specified in the configuration files
for <parameter>config</parameter>.  Does not include any subdirectories.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcStrList *
@FUNC@          FcConfigGetFontDirs
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get font directories
@DESC@
Returns the list of font directories in <parameter>config</parameter>. This includes the
configured font directories along with any directories below those in the
filesystem.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcStrList *
@FUNC@          FcConfigGetConfigFiles
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get config files
@DESC@
Returns the list of known configuration files used to generate <parameter>config</parameter>.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcChar8 *
@FUNC@          FcConfigGetCache
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	DEPRECATED used to return per-user cache filename
@DESC@
With fontconfig no longer using per-user cache files, this function now
simply returns NULL to indicate that no per-user file exists.
@@

@RET@		FcStrList *
@FUNC@		FcConfigGetCacheDirs
@TYPE1@		const FcConfig *		@ARG1@		config
@PURPOSE@	return the list of directories searched for cache files
@DESC@
<function>FcConfigGetCacheDirs</function> returns a string list containing
all of the directories that fontconfig will search when attempting to load a
cache file for a font directory.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcFontSet *
@FUNC@          FcConfigGetFonts
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcSetName%                      @ARG2@          set
@PURPOSE@	Get config font set
@DESC@
Returns one of the two sets of fonts from the configuration as specified
by <parameter>set</parameter>. This font set is owned by the library and must
not be modified or freed.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcBlanks *
@FUNC@          FcConfigGetBlanks
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get config blanks
@DESC@
Returns the FcBlanks object associated with the given configuration, if no
blanks were present in the configuration, this function will return 0.
The returned FcBlanks object if not NULL, is valid as long as the owning
FcConfig is alive.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           int
@FUNC@          FcConfigGetRescanInterval
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get config rescan interval
@DESC@
Returns the interval between automatic checks of the configuration (in
seconds) specified in <parameter>config</parameter>.  The configuration is checked during
a call to FcFontList when this interval has passed since the last check.
An interval setting of zero disables automatic checks.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcBool
@FUNC@          FcConfigSetRescanInterval
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		int%                       	@ARG2@          rescanInterval
@PURPOSE@	Set config rescan interval
@DESC@
Sets the rescan interval. Returns FcFalse if the interval cannot be set (due
to allocation failure). Otherwise returns FcTrue.
An interval setting of zero disables automatic checks.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcBool
@FUNC@          FcConfigAppFontAddFile
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		const FcChar8 *			@ARG2@          file
@PURPOSE@	Add font file to font database
@DESC@
Adds an application-specific font to the configuration. Returns FcFalse
if the fonts cannot be added (due to allocation failure or no fonts found).
Otherwise returns FcTrue. If <parameter>config</parameter> is NULL,
the current configuration is used.
@@

@RET@           FcBool
@FUNC@          FcConfigAppFontAddDir
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		const FcChar8 *			@ARG2@          dir
@PURPOSE@	Add fonts from directory to font database
@DESC@
Scans the specified directory for fonts, adding each one found to the
application-specific set of fonts. Returns FcFalse
if the fonts cannot be added (due to allocation failure).
Otherwise returns FcTrue. If <parameter>config</parameter> is NULL,
the current configuration is used.
@@

@RET@           void
@FUNC@          FcConfigAppFontClear
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Remove all app fonts from font database
@DESC@
Clears the set of application-specific fonts.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcBool
@FUNC@          FcConfigSubstituteWithPat
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcPattern *			@ARG3@		p_pat
@TYPE4@		FcMatchKind%                     @ARG4@          kind
@PURPOSE@	Execute substitutions
@DESC@
Performs the sequence of pattern modification operations, if <parameter>kind</parameter> is
FcMatchPattern, then those tagged as pattern operations are applied, else
if <parameter>kind</parameter> is FcMatchFont, those tagged as font operations are applied and
p_pat is used for &lt;test&gt; elements with target=pattern. Returns FcFalse
if the substitution cannot be performed (due to allocation failure). Otherwise returns FcTrue.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcBool
@FUNC@          FcConfigSubstitute
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcMatchKind%                    @ARG3@          kind
@PURPOSE@	Execute substitutions
@DESC@
Calls FcConfigSubstituteWithPat setting p_pat to NULL. Returns FcFalse
if the substitution cannot be performed (due to allocation failure). Otherwise returns FcTrue.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcPattern *
@FUNC@          FcFontMatch
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcResult *                      @ARG3@          result
@PURPOSE@	Return best font
@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>p</parameter>; otherwise the results will not be correct.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcFontSet *
@FUNC@          FcFontSort
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcBool%				@ARG3@		trim
@TYPE4@		FcCharSet **			@ARG4@		csp
@TYPE5@		FcResult *                      @ARG5@          result
@PURPOSE@	Return list of matching fonts
@DESC@
Returns the list of fonts sorted by closeness to <parameter>p</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 must not
modify these patterns.  Instead, they should be passed, along with <parameter>p</parameter> to
<function>FcFontRenderPrepare</function> which combines them into a complete pattern.
    </para><para>
The FcFontSet returned by FcFontSort is destroyed by calling FcFontSetDestroy.
If <parameter>config</parameter> is NULL, the current configuration is used.
@@

@RET@           FcPattern *
@FUNC@          FcFontRenderPrepare
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		pat
@TYPE3@		FcPattern *                     @ARG3@          font
@PURPOSE@	Prepare pattern for loading font file
@DESC@
Creates a new pattern consisting of elements of <parameter>font</parameter> not appearing
in <parameter>pat</parameter>, elements of <parameter>pat</parameter> not appearing in <parameter>font</parameter> and the best matching
value from <parameter>pat</parameter> for elements appearing in both.  The result is passed to
FcConfigSubstituteWithPat with <parameter>kind</parameter> FcMatchFont and then returned.
@@

@RET@           FcFontSet *
@FUNC@          FcFontList
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcObjectSet *                   @ARG3@          os
@PURPOSE@	List fonts
@DESC@
Selects fonts matching <parameter>p</parameter>, creates patterns from those fonts containing
only the objects in <parameter>os</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@           FcChar8 *
@FUNC@          FcConfigFilename
@TYPE1@         const FcChar8 *			@ARG1@          name
@PURPOSE@	Find a config file
@DESC@
Given the specified external entity name, return the associated filename.
This provides applications a way to convert various configuration file
references into filename form.
    </para><para>
A null or empty <parameter>name</parameter> indicates that the default configuration file should
be used; which file this references can be overridden with the
FONTCONFIG_FILE environment variable.  Next, if the name starts with <parameter>~</parameter>, it
refers to a file in the current users home directory.  Otherwise if the name
doesn't start with '/', it refers to a file in the default configuration
directory; the built-in default directory can be overridden with the
FONTCONFIG_PATH environment variable.
@@

@RET@		FcBool
@FUNC@		FcConfigParseAndLoad
@TYPE1@		FcConfig *			@ARG1@		config
@TYPE2@		const FcChar8 *			@ARG2@		file
@TYPE3@		FcBool%				@ARG3@		complain
@PURPOSE@	load a configuration file
@DESC@
Walks the configuration in 'file' and constructs the internal representation
in 'config'.  Any include files referenced from within 'file' will be loaded
and parsed.  If 'complain' is FcFalse, no warning will be displayed if
'file' does not exist. Error and warning messages will be output to stderr.
Returns FcFalse if some error occurred while loading the file, either a
parse error, semantic error or allocation failure. Otherwise returns FcTrue.
@@

@RET@		FcBool
@FUNC@		FcConfigParseAndLoadFromMemory
@TYPE1@		FcConfig *			@ARG1@		config
@TYPE2@		const FcChar8 *			@ARG2@		buffer
@TYPE3@		FcBool%				@ARG3@		complain
@PURPOSE@	load a configuration from memory
@DESC@
Walks the configuration in 'memory' and constructs the internal representation
in 'config'.  Any includes files referenced from within 'memory' will be loaded
and dparsed.  If 'complain' is FcFalse, no warning will be displayed if
'file' does not exist. Error and warning messages will be output to stderr.
Returns FcFalse if fsome error occurred while loading the file, either a
parse error, semantic error or allocation failure. Otherwise returns FcTrue.
@SINCE@		2.12.5
@@

@RET@		const FcChar8 *
@FUNC@		FcConfigGetSysRoot
@TYPE1@		const FcConfig *		@ARG1@		config
@PURPOSE@	Obtain the system root directory
@DESC@
Obtrains the system root directory in 'config' if available.
@SINCE@		2.10.92
@@

@RET@		void
@FUNC@		FcConfigSetSysRoot
@TYPE1@		FcConfig *			@ARG1@		config
@TYPE2@		const FcChar8 *			@ARG2@		sysroot
@PURPOSE@	Set the system root directory
@DESC@
Set 'sysroot' as the system root directory. fontconfig prepend 'sysroot'
to the cache directories in order to allow people to generate caches at
the build time. Note that this causes changing current config. i.e.
this function calls FcConfigSetCurrent() internally.
@SINCE@		2.10.92
@@

