/*
 * $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.
 */

@SYNOPSIS@
#include &lt;fontconfig.h&gt;
#include &lt;fcfreetype.h&gt;
@RET@           FT_UInt       
@FUNC@          FcFreeTypeCharIndex 
@TYPE1@         FT_Face%			@ARG1@          face      
@TYPE2@         FcChar32%			@ARG2@          ucs4      
@PURPOSE@	map Unicode to glyph id
@DESC@
Maps a Unicode char to a glyph index.  This function uses information from
several possible underlying encoding tables to work around broken fonts.
As a result, this function isn't designed to be used in performance
sensitive areas; results from this function are intended to be cached by
higher level functions.
@@

@SYNOPSIS@
#include &lt;fontconfig.h&gt;
#include &lt;fcfreetype.h&gt;
@RET@           FcCharSet *      
@FUNC@          FcFreeTypeCharSet 
@TYPE1@         FT_Face%			@ARG1@          face      
@TYPE2@         FcBlanks *			@ARG2@          blanks
@PURPOSE@	compute unicode coverage
@DESC@
Scans a FreeType face and returns the set of encoded Unicode chars.  This scans
several encoding tables to build as complete a list as possible.  
If 'blanks' is not 0, the glyphs in the font are examined and any blank glyphs
not in 'blanks' are not placed in the returned FcCharSet.
@@

@SYNOPSIS@
#include &lt;fontconfig.h&gt;
#include &lt;fcfreetype.h&gt;
@RET@           FcCharSet *      
@FUNC@          FcFreeTypeCharSetAndSpacing 
@TYPE1@         FT_Face%			@ARG1@          face      
@TYPE2@         FcBlanks *			@ARG2@          blanks
@TYPE3@		int *				@ARG3@		spacing
@PURPOSE@	compute unicode coverage and spacing type
@DESC@
Scans a FreeType face and returns the set of encoded Unicode chars.
This scans
several encoding tables to build as complete a list as possible.  
If 'blanks' is not 0, the glyphs in the font are examined and any blank glyphs
not in 'blanks' are not placed in the returned FcCharSet.
<parameter>spacing</parameter> receives the computed spacing type of the
font, one of FC_MONO for a font where all glyphs have the same width,
FC_DUAL, where the font has glyphs in precisely two widths, one twice as
wide as the other, or FC_PROPORTIONAL where the font has glyphs of many
widths.  
@@

@SYNOPSIS@
#include &lt;fontconfig.h&gt;
#include &lt;fcfreetype.h&gt;
@RET@           FcPattern *      
@FUNC@          FcFreeTypeQuery 
@TYPE1@         const FcChar8 *			@ARG1@          file      
@TYPE2@         int%				@ARG2@          id      
@TYPE3@         FcBlanks *			@ARG3@          blanks      
@TYPE4@         int *				@ARG4@          count      
@PURPOSE@	compute pattern from font file (and index)
@DESC@
Constructs a pattern representing the 'id'th font in 'file'.  The number
of fonts in 'file' is returned in 'count'.
@@

@SYNOPSIS@
#include &lt;fontconfig.h&gt;
#include &lt;fcfreetype.h&gt;
@RET@           FcPattern *      
@FUNC@          FcFreeTypeQueryFace
@TYPE1@		const FT_Face%			@ARG1@		face
@TYPE2@         const FcChar8 *			@ARG2@          file
@TYPE3@         int%				@ARG3@          id
@TYPE4@         FcBlanks *			@ARG4@          blanks
@PURPOSE@	compute pattern from FT_Face
@DESC@
Constructs a pattern representing 'face'. 'file' and 'id' are used solely as
data for pattern elements (FC_FILE, FC_INDEX and sometimes FC_FAMILY).
@@
