fcint.h revision 18bd4a06
12c393a42Smrg/*
20d39df38Smrg * fontconfig/src/fcint.h
32c393a42Smrg *
42c393a42Smrg * Copyright © 2000 Keith Packard
52c393a42Smrg *
62c393a42Smrg * Permission to use, copy, modify, distribute, and sell this software and its
72c393a42Smrg * documentation for any purpose is hereby granted without fee, provided that
82c393a42Smrg * the above copyright notice appear in all copies and that both that
92c393a42Smrg * copyright notice and this permission notice appear in supporting
10898dab68Smrg * documentation, and that the name of the author(s) not be used in
112c393a42Smrg * advertising or publicity pertaining to distribution of the software without
12898dab68Smrg * specific, written prior permission.  The authors make no
132c393a42Smrg * representations about the suitability of this software for any purpose.  It
142c393a42Smrg * is provided "as is" without express or implied warranty.
152c393a42Smrg *
160d39df38Smrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
172c393a42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
180d39df38Smrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
192c393a42Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
202c393a42Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
212c393a42Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
222c393a42Smrg * PERFORMANCE OF THIS SOFTWARE.
232c393a42Smrg */
242c393a42Smrg
252c393a42Smrg#ifndef _FCINT_H_
262c393a42Smrg#define _FCINT_H_
272c393a42Smrg
282c393a42Smrg#ifdef HAVE_CONFIG_H
292c393a42Smrg#include <config.h>
302c393a42Smrg#endif
312c393a42Smrg
325e61939bSmrg#include "fcstdint.h"
335e61939bSmrg
342c393a42Smrg#include <stdlib.h>
352c393a42Smrg#include <stdio.h>
362c393a42Smrg#include <string.h>
372c393a42Smrg#include <ctype.h>
385e61939bSmrg#include <assert.h>
392c393a42Smrg#include <errno.h>
40d91dd368Smrg#include <limits.h>
4118bd4a06Smrg#include <float.h>
4218bd4a06Smrg#include <math.h>
432c393a42Smrg#include <unistd.h>
442c393a42Smrg#include <stddef.h>
452c393a42Smrg#include <sys/types.h>
462c393a42Smrg#include <sys/stat.h>
472c393a42Smrg#include <time.h>
482c393a42Smrg#include <fontconfig/fontconfig.h>
492c393a42Smrg#include <fontconfig/fcprivate.h>
502c393a42Smrg#include "fcdeprecate.h"
515e61939bSmrg#include "fcmutex.h"
525e61939bSmrg#include "fcatomic.h"
532c393a42Smrg
542c393a42Smrg#ifndef FC_CONFIG_PATH
552c393a42Smrg#define FC_CONFIG_PATH "fonts.conf"
562c393a42Smrg#endif
572c393a42Smrg
582c393a42Smrg#ifdef _WIN32
595e61939bSmrg#  include "fcwindows.h"
60898dab68Smrgtypedef UINT (WINAPI *pfnGetSystemWindowsDirectory)(LPSTR, UINT);
61898dab68Smrgtypedef HRESULT (WINAPI *pfnSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR);
62898dab68Smrgextern pfnGetSystemWindowsDirectory pGetSystemWindowsDirectory;
63898dab68Smrgextern pfnSHGetFolderPathA pSHGetFolderPathA;
64898dab68Smrg#  define FC_SEARCH_PATH_SEPARATOR ';'
65898dab68Smrg#  define FC_DIR_SEPARATOR         '\\'
66898dab68Smrg#  define FC_DIR_SEPARATOR_S       "\\"
672c393a42Smrg#else
68898dab68Smrg#  define FC_SEARCH_PATH_SEPARATOR ':'
69898dab68Smrg#  define FC_DIR_SEPARATOR         '/'
70898dab68Smrg#  define FC_DIR_SEPARATOR_S       "/"
712c393a42Smrg#endif
722c393a42Smrg
7318bd4a06Smrg#ifdef PATH_MAX
7418bd4a06Smrg#define FC_PATH_MAX	PATH_MAX
7518bd4a06Smrg#else
7618bd4a06Smrg#define FC_PATH_MAX	128
7718bd4a06Smrg#endif
7818bd4a06Smrg
795e61939bSmrg#if __GNUC__ >= 4
805e61939bSmrg#define FC_UNUSED	__attribute__((unused))
815e61939bSmrg#else
825e61939bSmrg#define FC_UNUSED
835e61939bSmrg#endif
845e61939bSmrg
852c393a42Smrg#define FC_DBG_MATCH	1
862c393a42Smrg#define FC_DBG_MATCHV	2
872c393a42Smrg#define FC_DBG_EDIT	4
882c393a42Smrg#define FC_DBG_FONTSET	8
892c393a42Smrg#define FC_DBG_CACHE	16
902c393a42Smrg#define FC_DBG_CACHEV	32
912c393a42Smrg#define FC_DBG_PARSE	64
922c393a42Smrg#define FC_DBG_SCAN	128
932c393a42Smrg#define FC_DBG_SCANV	256
942c393a42Smrg#define FC_DBG_CONFIG	1024
952c393a42Smrg#define FC_DBG_LANGSET	2048
9618bd4a06Smrg#define FC_DBG_MATCH2	4096
972c393a42Smrg
98d91dd368Smrg#define _FC_ASSERT_STATIC1(_line, _cond) typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1] FC_UNUSED
99898dab68Smrg#define _FC_ASSERT_STATIC0(_line, _cond) _FC_ASSERT_STATIC1 (_line, (_cond))
100898dab68Smrg#define FC_ASSERT_STATIC(_cond) _FC_ASSERT_STATIC0 (__LINE__, (_cond))
101898dab68Smrg
1020d39df38Smrg#define FC_MIN(a,b) ((a) < (b) ? (a) : (b))
1030d39df38Smrg#define FC_MAX(a,b) ((a) > (b) ? (a) : (b))
1040d39df38Smrg#define FC_ABS(a)   ((a) < 0 ? -(a) : (a))
1052c393a42Smrg
1062c393a42Smrg/* slim_internal.h */
1072c393a42Smrg#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun)
1082c393a42Smrg#define FcPrivate		__attribute__((__visibility__("hidden")))
1092c393a42Smrg#define HAVE_GNUC_ATTRIBUTE 1
1102c393a42Smrg#include "fcalias.h"
1112c393a42Smrg#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
1122c393a42Smrg#define FcPrivate		__hidden
1132c393a42Smrg#else /* not gcc >= 3.3 and not Sun Studio >= 8 */
1142c393a42Smrg#define FcPrivate
1152c393a42Smrg#endif
1162c393a42Smrg
1175e61939bSmrgFC_ASSERT_STATIC (sizeof (FcRef) == sizeof (int));
1185e61939bSmrg
1192c393a42Smrgtypedef enum _FcValueBinding {
120d91dd368Smrg    FcValueBindingWeak, FcValueBindingStrong, FcValueBindingSame,
121d91dd368Smrg    /* to make sure sizeof (FcValueBinding) == 4 even with -fshort-enums */
122d91dd368Smrg    FcValueBindingEnd = INT_MAX
1232c393a42Smrg} FcValueBinding;
1242c393a42Smrg
1255e61939bSmrg#define FcStrdup(s) ((FcChar8 *) strdup ((const char *) (s)))
1265e61939bSmrg#define FcFree(s) (free ((FcChar8 *) (s)))
1275e61939bSmrg
1282c393a42Smrg/*
1292c393a42Smrg * Serialized data structures use only offsets instead of pointers
1302c393a42Smrg * A low bit of 1 indicates an offset.
1312c393a42Smrg */
132898dab68Smrg
1332c393a42Smrg/* Is the provided pointer actually an offset? */
1342c393a42Smrg#define FcIsEncodedOffset(p)	((((intptr_t) (p)) & 1) != 0)
1352c393a42Smrg
1362c393a42Smrg/* Encode offset in a pointer of type t */
1372c393a42Smrg#define FcOffsetEncode(o,t)	((t *) ((o) | 1))
1382c393a42Smrg
1392c393a42Smrg/* Decode a pointer into an offset */
1402c393a42Smrg#define FcOffsetDecode(p)	(((intptr_t) (p)) & ~1)
1412c393a42Smrg
1422c393a42Smrg/* Compute pointer offset */
1432c393a42Smrg#define FcPtrToOffset(b,p)	((intptr_t) (p) - (intptr_t) (b))
1442c393a42Smrg
1452c393a42Smrg/* Given base address, offset and type, return a pointer */
1462c393a42Smrg#define FcOffsetToPtr(b,o,t)	((t *) ((intptr_t) (b) + (o)))
1472c393a42Smrg
1482c393a42Smrg/* Given base address, encoded offset and type, return a pointer */
1492c393a42Smrg#define FcEncodedOffsetToPtr(b,p,t) FcOffsetToPtr(b,FcOffsetDecode(p),t)
1502c393a42Smrg
1512c393a42Smrg/* Given base address, pointer and type, return an encoded offset */
1522c393a42Smrg#define FcPtrToEncodedOffset(b,p,t) FcOffsetEncode(FcPtrToOffset(b,p),t)
1532c393a42Smrg
1542c393a42Smrg/* Given a structure, offset member and type, return pointer */
1552c393a42Smrg#define FcOffsetMember(s,m,t)	    FcOffsetToPtr(s,(s)->m,t)
1562c393a42Smrg
1572c393a42Smrg/* Given a structure, encoded offset member and type, return pointer to member */
1582c393a42Smrg#define FcEncodedOffsetMember(s,m,t) FcOffsetToPtr(s,FcOffsetDecode((s)->m), t)
1592c393a42Smrg
1602c393a42Smrg/* Given a structure, member and type, convert the member to a pointer */
1612c393a42Smrg#define FcPointerMember(s,m,t)	(FcIsEncodedOffset((s)->m) ? \
1622c393a42Smrg				 FcEncodedOffsetMember (s,m,t) : \
1632c393a42Smrg				 (s)->m)
1642c393a42Smrg
1652c393a42Smrg/*
1662c393a42Smrg * Serialized values may hold strings, charsets and langsets as pointers,
1672c393a42Smrg * unfortunately FcValue is an exposed type so we can't just always use
1682c393a42Smrg * offsets
1692c393a42Smrg */
1702c393a42Smrg#define FcValueString(v)	FcPointerMember(v,u.s,FcChar8)
1712c393a42Smrg#define FcValueCharSet(v)	FcPointerMember(v,u.c,const FcCharSet)
1722c393a42Smrg#define FcValueLangSet(v)	FcPointerMember(v,u.l,const FcLangSet)
17318bd4a06Smrg#define FcValueRange(v)		FcPointerMember(v,u.r,const FcRange)
1742c393a42Smrg
1752c393a42Smrgtypedef struct _FcValueList *FcValueListPtr;
1762c393a42Smrg
1772c393a42Smrgtypedef struct _FcValueList {
1782c393a42Smrg    struct _FcValueList	*next;
1792c393a42Smrg    FcValue		value;
1802c393a42Smrg    FcValueBinding	binding;
1812c393a42Smrg} FcValueList;
1822c393a42Smrg
1832c393a42Smrg#define FcValueListNext(vl)	FcPointerMember(vl,next,FcValueList)
184898dab68Smrg
1852c393a42Smrgtypedef int FcObject;
1862c393a42Smrg
187d91dd368Smrg/* The 1024 is to leave some room for future added internal objects, such
188d91dd368Smrg * that caches from newer fontconfig can still be used with older fontconfig
189d91dd368Smrg * without getting confused. */
190d91dd368Smrg#define FC_EXT_OBJ_INDEX	1024
191d91dd368Smrg#define FC_OBJ_ID(_n_)	((_n_) & (~FC_EXT_OBJ_INDEX))
192d91dd368Smrg
1932c393a42Smrgtypedef struct _FcPatternElt *FcPatternEltPtr;
1942c393a42Smrg
1952c393a42Smrg/*
196898dab68Smrg * Pattern elts are stuck in a structure connected to the pattern,
1972c393a42Smrg * so they get moved around when the pattern is resized. Hence, the
1982c393a42Smrg * values field must be a pointer/offset instead of just an offset
1992c393a42Smrg */
2002c393a42Smrgtypedef struct _FcPatternElt {
2012c393a42Smrg    FcObject		object;
2022c393a42Smrg    FcValueList		*values;
2032c393a42Smrg} FcPatternElt;
2042c393a42Smrg
2052c393a42Smrg#define FcPatternEltValues(pe)	FcPointerMember(pe,values,FcValueList)
2062c393a42Smrg
2072c393a42Smrgstruct _FcPattern {
2082c393a42Smrg    int		    num;
2092c393a42Smrg    int		    size;
2102c393a42Smrg    intptr_t	    elts_offset;
2115e61939bSmrg    FcRef	    ref;
2122c393a42Smrg};
2132c393a42Smrg
2142c393a42Smrg#define FcPatternElts(p)	FcOffsetMember(p,elts_offset,FcPatternElt)
2152c393a42Smrg
2162c393a42Smrg#define FcFontSetFonts(fs)	FcPointerMember(fs,fonts,FcPattern *)
2172c393a42Smrg
2182c393a42Smrg#define FcFontSetFont(fs,i)	(FcIsEncodedOffset((fs)->fonts) ? \
2192c393a42Smrg				 FcEncodedOffsetToPtr(fs, \
2202c393a42Smrg						      FcFontSetFonts(fs)[i], \
2212c393a42Smrg						      FcPattern) : \
2222c393a42Smrg				 fs->fonts[i])
2232c393a42Smrg
2242c393a42Smrgtypedef enum _FcOp {
225898dab68Smrg    FcOpInteger, FcOpDouble, FcOpString, FcOpMatrix, FcOpRange, FcOpBool, FcOpCharSet, FcOpLangSet,
2262c393a42Smrg    FcOpNil,
2272c393a42Smrg    FcOpField, FcOpConst,
228898dab68Smrg    FcOpAssign, FcOpAssignReplace,
2292c393a42Smrg    FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast,
2305e61939bSmrg    FcOpDelete, FcOpDeleteAll,
2312c393a42Smrg    FcOpQuest,
232898dab68Smrg    FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual,
2332c393a42Smrg    FcOpContains, FcOpListing, FcOpNotContains,
2342c393a42Smrg    FcOpLess, FcOpLessEqual, FcOpMore, FcOpMoreEqual,
2352c393a42Smrg    FcOpPlus, FcOpMinus, FcOpTimes, FcOpDivide,
2362c393a42Smrg    FcOpNot, FcOpComma, FcOpFloor, FcOpCeil, FcOpRound, FcOpTrunc,
2372c393a42Smrg    FcOpInvalid
2382c393a42Smrg} FcOp;
2392c393a42Smrg
240898dab68Smrgtypedef enum _FcOpFlags {
241898dab68Smrg	FcOpFlagIgnoreBlanks = 1 << 0
242898dab68Smrg} FcOpFlags;
243898dab68Smrg
244898dab68Smrg#define FC_OP_GET_OP(_x_)	((_x_) & 0xffff)
245898dab68Smrg#define FC_OP_GET_FLAGS(_x_)	(((_x_) & 0xffff0000) >> 16)
246898dab68Smrg#define FC_OP(_x_,_f_)		(FC_OP_GET_OP (_x_) | ((_f_) << 16))
247898dab68Smrg
2485e61939bSmrgtypedef struct _FcExprMatrix {
2495e61939bSmrg  struct _FcExpr *xx, *xy, *yx, *yy;
2505e61939bSmrg} FcExprMatrix;
2515e61939bSmrg
2525e61939bSmrgtypedef struct _FcExprName {
2535e61939bSmrg  FcObject	object;
2545e61939bSmrg  FcMatchKind	kind;
2555e61939bSmrg} FcExprName;
2565e61939bSmrg
25718bd4a06Smrgstruct _FcRange {
25818bd4a06Smrg    double begin;
25918bd4a06Smrg    double end;
26018bd4a06Smrg};
26118bd4a06Smrg
2625e61939bSmrg
2632c393a42Smrgtypedef struct _FcExpr {
2642c393a42Smrg    FcOp   op;
2652c393a42Smrg    union {
26618bd4a06Smrg	int		ival;
26718bd4a06Smrg	double		dval;
26818bd4a06Smrg	const FcChar8	*sval;
26918bd4a06Smrg	FcExprMatrix	*mexpr;
27018bd4a06Smrg	FcBool		bval;
27118bd4a06Smrg	FcCharSet	*cval;
27218bd4a06Smrg	FcLangSet	*lval;
27318bd4a06Smrg	FcRange		*rval;
27418bd4a06Smrg
27518bd4a06Smrg	FcExprName	name;
27618bd4a06Smrg	const FcChar8	*constant;
2772c393a42Smrg	struct {
2782c393a42Smrg	    struct _FcExpr *left, *right;
2792c393a42Smrg	} tree;
2802c393a42Smrg    } u;
2812c393a42Smrg} FcExpr;
2822c393a42Smrg
2830d39df38Smrgtypedef struct _FcExprPage FcExprPage;
2840d39df38Smrg
2850d39df38Smrgstruct _FcExprPage {
2860d39df38Smrg  FcExprPage *next_page;
2870d39df38Smrg  FcExpr *next;
2880d39df38Smrg  FcExpr exprs[(1024 - 2/* two pointers */ - 2/* malloc overhead */) * sizeof (void *) / sizeof (FcExpr)];
289898dab68Smrg  FcExpr end[FLEXIBLE_ARRAY_MEMBER];
2900d39df38Smrg};
2910d39df38Smrg
2922c393a42Smrgtypedef enum _FcQual {
2932c393a42Smrg    FcQualAny, FcQualAll, FcQualFirst, FcQualNotFirst
2942c393a42Smrg} FcQual;
2952c393a42Smrg
2962c393a42Smrg#define FcMatchDefault	((FcMatchKind) -1)
2972c393a42Smrg
2982c393a42Smrgtypedef struct _FcTest {
2992c393a42Smrg    FcMatchKind		kind;
3002c393a42Smrg    FcQual		qual;
3012c393a42Smrg    FcObject		object;
3022c393a42Smrg    FcOp		op;
3032c393a42Smrg    FcExpr		*expr;
3042c393a42Smrg} FcTest;
3052c393a42Smrg
3062c393a42Smrgtypedef struct _FcEdit {
3072c393a42Smrg    FcObject	    object;
3082c393a42Smrg    FcOp	    op;
3092c393a42Smrg    FcExpr	    *expr;
3102c393a42Smrg    FcValueBinding  binding;
3112c393a42Smrg} FcEdit;
3122c393a42Smrg
313d91dd368Smrgtypedef enum _FcRuleType {
314d91dd368Smrg    FcRuleUnknown, FcRuleTest, FcRuleEdit
315d91dd368Smrg} FcRuleType;
316d91dd368Smrg
317d91dd368Smrgtypedef struct _FcRule {
318d91dd368Smrg    struct _FcRule *next;
319d91dd368Smrg    FcRuleType      type;
320d91dd368Smrg    union {
321d91dd368Smrg	FcTest *test;
322d91dd368Smrg	FcEdit *edit;
323d91dd368Smrg    } u;
324d91dd368Smrg} FcRule;
325d91dd368Smrg
3262c393a42Smrgtypedef struct _FcSubst {
3272c393a42Smrg    struct _FcSubst	*next;
328d91dd368Smrg    FcRule		*rule;
3292c393a42Smrg} FcSubst;
3302c393a42Smrg
3312c393a42Smrgtypedef struct _FcCharLeaf {
3322c393a42Smrg    FcChar32	map[256/32];
3332c393a42Smrg} FcCharLeaf;
3342c393a42Smrg
3352c393a42Smrgstruct _FcCharSet {
3365e61939bSmrg    FcRef	    ref;	/* reference count */
3372c393a42Smrg    int		    num;	/* size of leaves and numbers arrays */
3382c393a42Smrg    intptr_t	    leaves_offset;
3392c393a42Smrg    intptr_t	    numbers_offset;
3402c393a42Smrg};
3412c393a42Smrg
3422c393a42Smrg#define FcCharSetLeaves(c)	FcOffsetMember(c,leaves_offset,intptr_t)
3432c393a42Smrg#define FcCharSetLeaf(c,i)	(FcOffsetToPtr(FcCharSetLeaves(c), \
3442c393a42Smrg					       FcCharSetLeaves(c)[i], \
3452c393a42Smrg					       FcCharLeaf))
3462c393a42Smrg#define FcCharSetNumbers(c)	FcOffsetMember(c,numbers_offset,FcChar16)
3472c393a42Smrg
34818bd4a06Smrg#define FCSS_DEFAULT            0 /* default behavior */
34918bd4a06Smrg#define FCSS_ALLOW_DUPLICATES   1 /* allows for duplicate strings in the set */
35018bd4a06Smrg#define FCSS_GROW_BY_64         2 /* grows buffer by 64 elements instead of 1 */
35118bd4a06Smrg
35218bd4a06Smrg#define FcStrSetHasControlBit(s,c)  (s->control & c)
35318bd4a06Smrg#define FcStrSetHasControlBits(s,c) ( (c) == (s->control & (c)) )
35418bd4a06Smrg
3552c393a42Smrgstruct _FcStrSet {
3565e61939bSmrg    FcRef	    ref;	/* reference count */
3572c393a42Smrg    int		    num;
3582c393a42Smrg    int		    size;
3592c393a42Smrg    FcChar8	    **strs;
36018bd4a06Smrg    unsigned int    control;    /* control bits for set behavior */
3612c393a42Smrg};
3622c393a42Smrg
3632c393a42Smrgstruct _FcStrList {
3642c393a42Smrg    FcStrSet	    *set;
3652c393a42Smrg    int		    n;
3662c393a42Smrg};
3672c393a42Smrg
3682c393a42Smrgtypedef struct _FcStrBuf {
3692c393a42Smrg    FcChar8 *buf;
3702c393a42Smrg    FcBool  allocated;
3712c393a42Smrg    FcBool  failed;
3722c393a42Smrg    int	    len;
3732c393a42Smrg    int	    size;
3740d39df38Smrg    FcChar8 buf_static[16 * sizeof (void *)];
3752c393a42Smrg} FcStrBuf;
3762c393a42Smrg
3772c393a42Smrgstruct _FcCache {
3785e61939bSmrg    unsigned int magic;              /* FC_CACHE_MAGIC_MMAP or FC_CACHE_ALLOC */
37918bd4a06Smrg    int		version;	    /* FC_CACHE_VERSION_NUMBER */
3802c393a42Smrg    intptr_t	size;		    /* size of file */
3812c393a42Smrg    intptr_t	dir;		    /* offset to dir name */
3822c393a42Smrg    intptr_t	dirs;		    /* offset to subdirs */
3832c393a42Smrg    int		dirs_count;	    /* number of subdir strings */
3842c393a42Smrg    intptr_t	set;		    /* offset to font set */
385898dab68Smrg    int		checksum;	    /* checksum of directory state */
38618bd4a06Smrg    int64_t	checksum_nano;	    /* checksum of directory state */
3872c393a42Smrg};
3882c393a42Smrg
3892c393a42Smrg#undef FcCacheDir
3902c393a42Smrg#undef FcCacheSubdir
3912c393a42Smrg#define FcCacheDir(c)	FcOffsetMember(c,dir,FcChar8)
3922c393a42Smrg#define FcCacheDirs(c)	FcOffsetMember(c,dirs,intptr_t)
3932c393a42Smrg#define FcCacheSet(c)	FcOffsetMember(c,set,FcFontSet)
3942c393a42Smrg#define FcCacheSubdir(c,i)  FcOffsetToPtr (FcCacheDirs(c),\
3952c393a42Smrg					   FcCacheDirs(c)[i], \
3962c393a42Smrg					   FcChar8)
3972c393a42Smrg
3982c393a42Smrg/*
3992c393a42Smrg * Used while constructing a directory cache object
4002c393a42Smrg */
4012c393a42Smrg
4022c393a42Smrg#define FC_SERIALIZE_HASH_SIZE	8191
4032c393a42Smrg
4040d39df38Smrgtypedef union _FcAlign {
4050d39df38Smrg    double	d;
4060d39df38Smrg    int		i;
4070d39df38Smrg    intptr_t	ip;
4080d39df38Smrg    FcBool	b;
4090d39df38Smrg    void	*p;
4100d39df38Smrg} FcAlign;
4110d39df38Smrg
4122c393a42Smrgtypedef struct _FcSerializeBucket {
4132c393a42Smrg    struct _FcSerializeBucket *next;
4142c393a42Smrg    const void	*object;
4152c393a42Smrg    intptr_t	offset;
4162c393a42Smrg} FcSerializeBucket;
4172c393a42Smrg
4182c393a42Smrgtypedef struct _FcCharSetFreezer FcCharSetFreezer;
4192c393a42Smrg
4202c393a42Smrgtypedef struct _FcSerialize {
4212c393a42Smrg    intptr_t		size;
4222c393a42Smrg    FcCharSetFreezer	*cs_freezer;
4232c393a42Smrg    void		*linear;
4242c393a42Smrg    FcSerializeBucket	*buckets[FC_SERIALIZE_HASH_SIZE];
4252c393a42Smrg} FcSerialize;
426898dab68Smrg
4272c393a42Smrg/*
4282c393a42Smrg * To map adobe glyph names to unicode values, a precomputed hash
4292c393a42Smrg * table is used
4302c393a42Smrg */
4312c393a42Smrg
4322c393a42Smrgtypedef struct _FcGlyphName {
4332c393a42Smrg    FcChar32	ucs;		/* unicode value */
4342c393a42Smrg    FcChar8	name[1];	/* name extends beyond struct */
4352c393a42Smrg} FcGlyphName;
4362c393a42Smrg
4372c393a42Smrg/*
4382c393a42Smrg * To perform case-insensitive string comparisons, a table
4392c393a42Smrg * is used which holds three different kinds of folding data.
440898dab68Smrg *
4412c393a42Smrg * The first is a range of upper case values mapping to a range
4422c393a42Smrg * of their lower case equivalents.  Within each range, the offset
4432c393a42Smrg * between upper and lower case is constant.
4442c393a42Smrg *
4452c393a42Smrg * The second is a range of upper case values which are interleaved
4462c393a42Smrg * with their lower case equivalents.
447898dab68Smrg *
4482c393a42Smrg * The third is a set of raw unicode values mapping to a list
4492c393a42Smrg * of unicode values for comparison purposes.  This allows conversion
4502c393a42Smrg * of ß to "ss" so that SS, ss and ß all match.  A separate array
4512c393a42Smrg * holds the list of unicode values for each entry.
4522c393a42Smrg *
4532c393a42Smrg * These are packed into a single table.  Using a binary search,
4542c393a42Smrg * the appropriate entry can be located.
4552c393a42Smrg */
4562c393a42Smrg
4572c393a42Smrg#define FC_CASE_FOLD_RANGE	    0
4582c393a42Smrg#define FC_CASE_FOLD_EVEN_ODD	    1
4592c393a42Smrg#define FC_CASE_FOLD_FULL	    2
4602c393a42Smrg
4612c393a42Smrgtypedef struct _FcCaseFold {
4622c393a42Smrg    FcChar32	upper;
4632c393a42Smrg    FcChar16	method : 2;
4642c393a42Smrg    FcChar16	count : 14;
4652c393a42Smrg    short    	offset;	    /* lower - upper for RANGE, table id for FULL */
4662c393a42Smrg} FcCaseFold;
4672c393a42Smrg
4682c393a42Smrg#define FC_MAX_FILE_LEN	    4096
4692c393a42Smrg
4702c393a42Smrg#define FC_CACHE_MAGIC_MMAP	    0xFC02FC04
4712c393a42Smrg#define FC_CACHE_MAGIC_ALLOC	    0xFC02FC05
4722c393a42Smrg
4732c393a42Smrgstruct _FcAtomic {
4742c393a42Smrg    FcChar8	*file;		/* original file name */
4752c393a42Smrg    FcChar8	*new;		/* temp file name -- write data here */
4762c393a42Smrg    FcChar8	*lck;		/* lockfile name (used for locking) */
4772c393a42Smrg    FcChar8	*tmp;		/* tmpfile name (used for locking) */
4782c393a42Smrg};
4792c393a42Smrg
4802c393a42Smrgstruct _FcBlanks {
4812c393a42Smrg    int		nblank;
4822c393a42Smrg    int		sblank;
4832c393a42Smrg    FcChar32	*blanks;
4842c393a42Smrg};
4852c393a42Smrg
4862c393a42Smrgstruct _FcConfig {
4872c393a42Smrg    /*
4882c393a42Smrg     * File names loaded from the configuration -- saved here as the
4892c393a42Smrg     * cache file must be consulted before the directories are scanned,
4902c393a42Smrg     * and those directives may occur in any order
4912c393a42Smrg     */
4922c393a42Smrg    FcStrSet	*configDirs;	    /* directories to scan for fonts */
4932c393a42Smrg    /*
4942c393a42Smrg     * Set of allowed blank chars -- used to
4952c393a42Smrg     * trim fonts of bogus glyphs
4962c393a42Smrg     */
4972c393a42Smrg    FcBlanks	*blanks;
4982c393a42Smrg    /*
4992c393a42Smrg     * List of directories containing fonts,
500898dab68Smrg     * built by recursively scanning the set
5012c393a42Smrg     * of configured directories
5022c393a42Smrg     */
5032c393a42Smrg    FcStrSet	*fontDirs;
5042c393a42Smrg    /*
5052c393a42Smrg     * List of directories containing cache files.
5062c393a42Smrg     */
5072c393a42Smrg    FcStrSet	*cacheDirs;
5082c393a42Smrg    /*
5092c393a42Smrg     * Names of all of the configuration files used
5102c393a42Smrg     * to create this configuration
5112c393a42Smrg     */
5122c393a42Smrg    FcStrSet	*configFiles;	    /* config files loaded */
5132c393a42Smrg    /*
5142c393a42Smrg     * Substitution instructions for patterns and fonts;
5152c393a42Smrg     * maxObjects is used to allocate appropriate intermediate storage
5162c393a42Smrg     * while performing a whole set of substitutions
5172c393a42Smrg     */
5182c393a42Smrg    FcSubst	*substPattern;	    /* substitutions for patterns */
5192c393a42Smrg    FcSubst	*substFont;	    /* substitutions for fonts */
5202c393a42Smrg    FcSubst	*substScan;	    /* substitutions for scanned fonts */
5212c393a42Smrg    int		maxObjects;	    /* maximum number of tests in all substs */
5222c393a42Smrg    /*
5232c393a42Smrg     * List of patterns used to control font file selection
5242c393a42Smrg     */
5252c393a42Smrg    FcStrSet	*acceptGlobs;
5262c393a42Smrg    FcStrSet	*rejectGlobs;
5272c393a42Smrg    FcFontSet	*acceptPatterns;
5282c393a42Smrg    FcFontSet	*rejectPatterns;
5292c393a42Smrg    /*
5302c393a42Smrg     * The set of fonts loaded from the listed directories; the
5312c393a42Smrg     * order within the set does not determine the font selection,
5322c393a42Smrg     * except in the case of identical matches in which case earlier fonts
5332c393a42Smrg     * match preferrentially
5342c393a42Smrg     */
5352c393a42Smrg    FcFontSet	*fonts[FcSetApplication + 1];
5362c393a42Smrg    /*
5372c393a42Smrg     * Fontconfig can periodically rescan the system configuration
5382c393a42Smrg     * and font directories.  This rescanning occurs when font
5392c393a42Smrg     * listing requests are made, but no more often than rescanInterval
5402c393a42Smrg     * seconds apart.
5412c393a42Smrg     */
5422c393a42Smrg    time_t	rescanTime;	    /* last time information was scanned */
5432c393a42Smrg    int		rescanInterval;	    /* interval between scans */
5440d39df38Smrg
5455e61939bSmrg    FcRef	ref;                /* reference count */
5460d39df38Smrg
5475e61939bSmrg    FcExprPage  *expr_pool;	    /* pool of FcExpr's */
548898dab68Smrg
5495e61939bSmrg    FcChar8     *sysRoot;	    /* override the system root directory */
5505e61939bSmrg};
5512c393a42Smrg
5522c393a42Smrgtypedef struct _FcFileTime {
5532c393a42Smrg    time_t  time;
5542c393a42Smrg    FcBool  set;
5552c393a42Smrg} FcFileTime;
5562c393a42Smrg
5572c393a42Smrgtypedef struct _FcCharMap FcCharMap;
5582c393a42Smrg
559898dab68Smrgtypedef struct _FcStatFS    FcStatFS;
560898dab68Smrg
561898dab68Smrgstruct _FcStatFS {
562898dab68Smrg    FcBool is_remote_fs;
563898dab68Smrg    FcBool is_mtime_broken;
564898dab68Smrg};
565898dab68Smrg
5665e61939bSmrgtypedef struct _FcValuePromotionBuffer FcValuePromotionBuffer;
5675e61939bSmrg
5685e61939bSmrgstruct _FcValuePromotionBuffer {
5695e61939bSmrg  union {
5705e61939bSmrg    double d;
5715e61939bSmrg    int i;
5725e61939bSmrg    long l;
5735e61939bSmrg    char c[256]; /* Enlarge as needed */
5745e61939bSmrg  } u;
5755e61939bSmrg};
5765e61939bSmrg
5772c393a42Smrg/* fcblanks.c */
5782c393a42Smrg
5792c393a42Smrg/* fccache.c */
5802c393a42Smrg
5812c393a42SmrgFcPrivate FcCache *
5822c393a42SmrgFcDirCacheScan (const FcChar8 *dir, FcConfig *config);
5832c393a42Smrg
5842c393a42SmrgFcPrivate FcCache *
5852c393a42SmrgFcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcStrSet *dirs);
5862c393a42Smrg
587b2a52337SmrgFcPrivate FcCache *
588b2a52337SmrgFcDirCacheRebuild (FcCache *cache, struct stat *dir_stat, FcStrSet *dirs);
589b2a52337Smrg
5902c393a42SmrgFcPrivate FcBool
5912c393a42SmrgFcDirCacheWrite (FcCache *cache, FcConfig *config);
592898dab68Smrg
593898dab68SmrgFcPrivate FcBool
594898dab68SmrgFcDirCacheCreateTagFile (const FcChar8 *cache_dir);
595898dab68Smrg
5962c393a42SmrgFcPrivate void
5972c393a42SmrgFcCacheObjectReference (void *object);
5982c393a42Smrg
5992c393a42SmrgFcPrivate void
6002c393a42SmrgFcCacheObjectDereference (void *object);
6012c393a42Smrg
6022c393a42SmrgFcPrivate void
6032c393a42SmrgFcCacheFini (void);
604898dab68Smrg
6052c393a42SmrgFcPrivate void
6062c393a42SmrgFcDirCacheReference (FcCache *cache, int nref);
6072c393a42Smrg
60818bd4a06SmrgFcPrivate int
60918bd4a06SmrgFcDirCacheLock (const FcChar8 *dir,
61018bd4a06Smrg		FcConfig      *config);
61118bd4a06Smrg
61218bd4a06SmrgFcPrivate void
61318bd4a06SmrgFcDirCacheUnlock (int fd);
61418bd4a06Smrg
6152c393a42Smrg/* fccfg.c */
6162c393a42Smrg
6175e61939bSmrgFcPrivate FcBool
6185e61939bSmrgFcConfigInit (void);
6195e61939bSmrg
6205e61939bSmrgFcPrivate void
6215e61939bSmrgFcConfigFini (void);
6225e61939bSmrg
623898dab68SmrgFcPrivate FcChar8 *
624898dab68SmrgFcConfigXdgCacheHome (void);
625898dab68Smrg
626898dab68SmrgFcPrivate FcChar8 *
627898dab68SmrgFcConfigXdgConfigHome (void);
628898dab68Smrg
629898dab68SmrgFcPrivate FcChar8 *
630898dab68SmrgFcConfigXdgDataHome (void);
631898dab68Smrg
6320d39df38SmrgFcPrivate FcExpr *
6330d39df38SmrgFcConfigAllocExpr (FcConfig *config);
6340d39df38Smrg
6352c393a42SmrgFcPrivate FcBool
6362c393a42SmrgFcConfigAddConfigDir (FcConfig	    *config,
6372c393a42Smrg		      const FcChar8 *d);
6382c393a42Smrg
6392c393a42SmrgFcPrivate FcBool
6402c393a42SmrgFcConfigAddFontDir (FcConfig	    *config,
6412c393a42Smrg		    const FcChar8   *d);
6422c393a42Smrg
6432c393a42SmrgFcPrivate FcBool
6442c393a42SmrgFcConfigAddDir (FcConfig	*config,
6452c393a42Smrg		const FcChar8	*d);
6462c393a42Smrg
6472c393a42SmrgFcPrivate FcBool
6482c393a42SmrgFcConfigAddCacheDir (FcConfig	    *config,
6492c393a42Smrg		     const FcChar8  *d);
6502c393a42Smrg
6512c393a42SmrgFcPrivate FcBool
6522c393a42SmrgFcConfigAddConfigFile (FcConfig		*config,
6532c393a42Smrg		       const FcChar8	*f);
6542c393a42Smrg
6552c393a42SmrgFcPrivate FcBool
6562c393a42SmrgFcConfigAddBlank (FcConfig	*config,
6572c393a42Smrg		  FcChar32    	blank);
6582c393a42Smrg
659d91dd368SmrgFcBool
660d91dd368SmrgFcConfigAddRule (FcConfig	*config,
661d91dd368Smrg		 FcRule		*rule,
6622c393a42Smrg		 FcMatchKind	kind);
6632c393a42Smrg
6642c393a42SmrgFcPrivate void
6652c393a42SmrgFcConfigSetFonts (FcConfig	*config,
6662c393a42Smrg		  FcFontSet	*fonts,
6672c393a42Smrg		  FcSetName	set);
6682c393a42Smrg
6692c393a42SmrgFcPrivate FcBool
6702c393a42SmrgFcConfigCompareValue (const FcValue *m,
671d91dd368Smrg		      unsigned int   op_,
6722c393a42Smrg		      const FcValue *v);
6732c393a42Smrg
6742c393a42SmrgFcPrivate FcBool
6752c393a42SmrgFcConfigGlobAdd (FcConfig	*config,
6762c393a42Smrg		 const FcChar8	*glob,
6772c393a42Smrg		 FcBool		accept);
6782c393a42Smrg
6792c393a42SmrgFcPrivate FcBool
6802c393a42SmrgFcConfigAcceptFilename (FcConfig	*config,
6812c393a42Smrg			const FcChar8	*filename);
6822c393a42Smrg
6832c393a42SmrgFcPrivate FcBool
6842c393a42SmrgFcConfigPatternsAdd (FcConfig	*config,
6852c393a42Smrg		     FcPattern	*pattern,
6862c393a42Smrg		     FcBool	accept);
6872c393a42Smrg
6882c393a42SmrgFcPrivate FcBool
6892c393a42SmrgFcConfigAcceptFont (FcConfig	    *config,
6902c393a42Smrg		    const FcPattern *font);
6912c393a42Smrg
6922c393a42SmrgFcPrivate FcFileTime
6932c393a42SmrgFcConfigModifiedTime (FcConfig *config);
6942c393a42Smrg
6952c393a42SmrgFcPrivate FcBool
696898dab68SmrgFcConfigAddCache (FcConfig *config, FcCache *cache,
6972c393a42Smrg		  FcSetName set, FcStrSet *dirSet);
6982c393a42Smrg
6992c393a42Smrg/* fcserialize.c */
7002c393a42SmrgFcPrivate intptr_t
7012c393a42SmrgFcAlignSize (intptr_t size);
702898dab68Smrg
7032c393a42SmrgFcPrivate FcSerialize *
7042c393a42SmrgFcSerializeCreate (void);
7052c393a42Smrg
7062c393a42SmrgFcPrivate void
7072c393a42SmrgFcSerializeDestroy (FcSerialize *serialize);
7082c393a42Smrg
7092c393a42SmrgFcPrivate FcBool
7102c393a42SmrgFcSerializeAlloc (FcSerialize *serialize, const void *object, int size);
7112c393a42Smrg
7122c393a42SmrgFcPrivate intptr_t
7132c393a42SmrgFcSerializeReserve (FcSerialize *serialize, int size);
7142c393a42Smrg
7152c393a42SmrgFcPrivate intptr_t
7162c393a42SmrgFcSerializeOffset (FcSerialize *serialize, const void *object);
7172c393a42Smrg
7182c393a42SmrgFcPrivate void *
7192c393a42SmrgFcSerializePtr (FcSerialize *serialize, const void *object);
7202c393a42Smrg
7212c393a42SmrgFcPrivate FcBool
7222c393a42SmrgFcLangSetSerializeAlloc (FcSerialize *serialize, const FcLangSet *l);
7232c393a42Smrg
7242c393a42SmrgFcPrivate FcLangSet *
7252c393a42SmrgFcLangSetSerialize(FcSerialize *serialize, const FcLangSet *l);
7262c393a42Smrg
7272c393a42Smrg/* fccharset.c */
72818bd4a06SmrgFcPrivate FcCharSet *
72918bd4a06SmrgFcCharSetPromote (FcValuePromotionBuffer *vbuf);
73018bd4a06Smrg
7312c393a42SmrgFcPrivate void
7322c393a42SmrgFcLangCharSetPopulate (void);
7332c393a42Smrg
7342c393a42SmrgFcPrivate FcCharSetFreezer *
7352c393a42SmrgFcCharSetFreezerCreate (void);
7362c393a42Smrg
7372c393a42SmrgFcPrivate const FcCharSet *
7382c393a42SmrgFcCharSetFreeze (FcCharSetFreezer *freezer, const FcCharSet *fcs);
7392c393a42Smrg
7402c393a42SmrgFcPrivate void
7412c393a42SmrgFcCharSetFreezerDestroy (FcCharSetFreezer *freezer);
7422c393a42Smrg
7432c393a42SmrgFcPrivate FcBool
7442c393a42SmrgFcNameUnparseCharSet (FcStrBuf *buf, const FcCharSet *c);
7452c393a42Smrg
7462c393a42SmrgFcPrivate FcCharSet *
7472c393a42SmrgFcNameParseCharSet (FcChar8 *string);
7482c393a42Smrg
7490d39df38SmrgFcPrivate FcBool
7500d39df38SmrgFcNameUnparseValue (FcStrBuf    *buf,
7510d39df38Smrg                    FcValue     *v0,
7520d39df38Smrg		    FcChar8     *escape);
7530d39df38Smrg
7540d39df38SmrgFcPrivate FcBool
7550d39df38SmrgFcNameUnparseValueList (FcStrBuf	*buf,
7560d39df38Smrg			FcValueListPtr	v,
7570d39df38Smrg			FcChar8		*escape);
7580d39df38Smrg
7592c393a42SmrgFcPrivate FcCharLeaf *
7602c393a42SmrgFcCharSetFindLeafCreate (FcCharSet *fcs, FcChar32 ucs4);
7612c393a42Smrg
7622c393a42SmrgFcPrivate FcBool
7632c393a42SmrgFcCharSetSerializeAlloc(FcSerialize *serialize, const FcCharSet *cs);
7642c393a42Smrg
7652c393a42SmrgFcPrivate FcCharSet *
7662c393a42SmrgFcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs);
7672c393a42Smrg
7682c393a42SmrgFcPrivate FcChar16 *
7692c393a42SmrgFcCharSetGetNumbers(const FcCharSet *c);
7702c393a42Smrg
7715e61939bSmrg/* fccompat.c */
7725e61939bSmrgFcPrivate int
7735e61939bSmrgFcOpen(const char *pathname, int flags, ...);
7745e61939bSmrg
7755e61939bSmrgFcPrivate int
7765e61939bSmrgFcMakeTempfile (char *template);
7775e61939bSmrg
7785e61939bSmrgFcPrivate int32_t
7795e61939bSmrgFcRandom (void);
7805e61939bSmrg
781d91dd368SmrgFcPrivate FcBool
782d91dd368SmrgFcMakeDirectory (const FcChar8 *dir);
783d91dd368Smrg
7842c393a42Smrg/* fcdbg.c */
7855e61939bSmrg
7865e61939bSmrgFcPrivate void
7875e61939bSmrgFcValuePrintFile (FILE *f, const FcValue v);
7885e61939bSmrg
7892c393a42SmrgFcPrivate void
790898dab68SmrgFcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark);
791898dab68Smrg
792898dab68SmrgFcPrivate void
793898dab68SmrgFcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos);
794898dab68Smrg
795898dab68SmrgFcPrivate void
796898dab68SmrgFcValueListPrint (FcValueListPtr l);
7972c393a42Smrg
7982c393a42SmrgFcPrivate void
7992c393a42SmrgFcLangSetPrint (const FcLangSet *ls);
8002c393a42Smrg
8012c393a42SmrgFcPrivate void
8022c393a42SmrgFcOpPrint (FcOp op);
8032c393a42Smrg
8042c393a42SmrgFcPrivate void
8052c393a42SmrgFcTestPrint (const FcTest *test);
8062c393a42Smrg
8072c393a42SmrgFcPrivate void
8082c393a42SmrgFcExprPrint (const FcExpr *expr);
8092c393a42Smrg
8102c393a42SmrgFcPrivate void
8112c393a42SmrgFcEditPrint (const FcEdit *edit);
8122c393a42Smrg
8132c393a42SmrgFcPrivate void
8142c393a42SmrgFcSubstPrint (const FcSubst *subst);
8152c393a42Smrg
8162c393a42SmrgFcPrivate void
8172c393a42SmrgFcCharSetPrint (const FcCharSet *c);
818898dab68Smrg
81918bd4a06SmrgFcPrivate void
82018bd4a06SmrgFcPatternPrint2 (FcPattern *p1, FcPattern *p2, const FcObjectSet *os);
82118bd4a06Smrg
8222c393a42Smrgextern FcPrivate int FcDebugVal;
8232c393a42Smrg
8242c393a42Smrg#define FcDebug() (FcDebugVal)
8252c393a42Smrg
8262c393a42SmrgFcPrivate void
8272c393a42SmrgFcInitDebug (void);
8282c393a42Smrg
8292c393a42Smrg/* fcdefault.c */
8302c393a42SmrgFcPrivate FcChar8 *
8312c393a42SmrgFcGetDefaultLang (void);
8322c393a42Smrg
8335e61939bSmrgFcPrivate FcChar8 *
8345e61939bSmrgFcGetPrgname (void);
8355e61939bSmrg
8365e61939bSmrgFcPrivate void
8375e61939bSmrgFcDefaultFini (void);
8385e61939bSmrg
8392c393a42Smrg/* fcdir.c */
8402c393a42Smrg
8415e61939bSmrgFcPrivate FcBool
8425e61939bSmrgFcFileIsLink (const FcChar8 *file);
8435e61939bSmrg
844d91dd368SmrgFcPrivate FcBool
845d91dd368SmrgFcFileIsFile (const FcChar8 *file);
846d91dd368Smrg
8472c393a42SmrgFcPrivate FcBool
8482c393a42SmrgFcFileScanConfig (FcFontSet	*set,
8492c393a42Smrg		  FcStrSet	*dirs,
8502c393a42Smrg		  FcBlanks	*blanks,
8512c393a42Smrg		  const FcChar8 *file,
8522c393a42Smrg		  FcConfig	*config);
8532c393a42Smrg
8542c393a42SmrgFcPrivate FcBool
8552c393a42SmrgFcDirScanConfig (FcFontSet	*set,
8562c393a42Smrg		 FcStrSet	*dirs,
8572c393a42Smrg		 FcBlanks	*blanks,
8582c393a42Smrg		 const FcChar8	*dir,
8592c393a42Smrg		 FcBool		force,
8602c393a42Smrg		 FcConfig	*config);
8612c393a42Smrg
8622c393a42Smrg/* fcfont.c */
8632c393a42SmrgFcPrivate int
8642c393a42SmrgFcFontDebug (void);
8650d39df38Smrg
8662c393a42Smrg/* fcfs.c */
8672c393a42Smrg
8682c393a42SmrgFcPrivate FcBool
8692c393a42SmrgFcFontSetSerializeAlloc (FcSerialize *serialize, const FcFontSet *s);
8702c393a42Smrg
8712c393a42SmrgFcPrivate FcFontSet *
8722c393a42SmrgFcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s);
8732c393a42Smrg
874b2a52337SmrgFcPrivate FcFontSet *
875b2a52337SmrgFcFontSetDeserialize (const FcFontSet *set);
876b2a52337Smrg
8772c393a42Smrg/* fcinit.c */
8785e61939bSmrgFcPrivate FcConfig *
8795e61939bSmrgFcInitLoadOwnConfig (FcConfig *config);
8802c393a42Smrg
8815e61939bSmrgFcPrivate FcConfig *
8825e61939bSmrgFcInitLoadOwnConfigAndFonts (FcConfig *config);
8832c393a42Smrg
8845e61939bSmrg/* fcxml.c */
88518bd4a06SmrgFcPrivate void
88618bd4a06SmrgFcConfigPathFini (void);
88718bd4a06Smrg
8882c393a42SmrgFcPrivate void
8895e61939bSmrgFcTestDestroy (FcTest *test);
8902c393a42Smrg
8912c393a42SmrgFcPrivate void
8925e61939bSmrgFcEditDestroy (FcEdit *e);
8932c393a42Smrg
894d91dd368Smrgvoid
895d91dd368SmrgFcRuleDestroy (FcRule *rule);
896d91dd368Smrg
8972c393a42Smrg/* fclang.c */
8982c393a42SmrgFcPrivate FcLangSet *
899898dab68SmrgFcFreeTypeLangSet (const FcCharSet  *charset,
9002c393a42Smrg		   const FcChar8    *exclusiveLang);
9012c393a42Smrg
9022c393a42SmrgFcPrivate FcLangResult
9032c393a42SmrgFcLangCompare (const FcChar8 *s1, const FcChar8 *s2);
904898dab68Smrg
9052c393a42SmrgFcPrivate FcLangSet *
9065e61939bSmrgFcLangSetPromote (const FcChar8 *lang, FcValuePromotionBuffer *buf);
9072c393a42Smrg
9082c393a42SmrgFcPrivate FcLangSet *
9092c393a42SmrgFcNameParseLangSet (const FcChar8 *string);
9102c393a42Smrg
9112c393a42SmrgFcPrivate FcBool
9122c393a42SmrgFcNameUnparseLangSet (FcStrBuf *buf, const FcLangSet *ls);
9132c393a42Smrg
9142c393a42SmrgFcPrivate FcChar8 *
9152c393a42SmrgFcNameUnparseEscaped (FcPattern *pat, FcBool escape);
9162c393a42Smrg
9172c393a42Smrg/* fclist.c */
9182c393a42Smrg
9192c393a42SmrgFcPrivate FcBool
9202c393a42SmrgFcListPatternMatchAny (const FcPattern *p,
9212c393a42Smrg		       const FcPattern *font);
9222c393a42Smrg
9232c393a42Smrg/* fcmatch.c */
9242c393a42Smrg
9252c393a42Smrg/* fcname.c */
9262c393a42Smrg
9275e61939bSmrgenum {
9285e61939bSmrg  FC_INVALID_OBJECT = 0,
9295e61939bSmrg#define FC_OBJECT(NAME, Type, Cmp) FC_##NAME##_OBJECT,
9305e61939bSmrg#include "fcobjs.h"
9315e61939bSmrg#undef FC_OBJECT
9325e61939bSmrg  FC_ONE_AFTER_MAX_BASE_OBJECT
9335e61939bSmrg#define FC_MAX_BASE_OBJECT (FC_ONE_AFTER_MAX_BASE_OBJECT - 1)
9345e61939bSmrg};
9352c393a42Smrg
9362c393a42SmrgFcPrivate FcBool
9372c393a42SmrgFcNameBool (const FcChar8 *v, FcBool *result);
9382c393a42Smrg
9392c393a42SmrgFcPrivate FcBool
9402c393a42SmrgFcObjectValidType (FcObject object, FcType type);
9412c393a42Smrg
9422c393a42SmrgFcPrivate FcObject
9432c393a42SmrgFcObjectFromName (const char * name);
9442c393a42Smrg
9452c393a42SmrgFcPrivate const char *
9462c393a42SmrgFcObjectName (FcObject object);
9472c393a42Smrg
9480d39df38SmrgFcPrivate FcObjectSet *
9490d39df38SmrgFcObjectGetSet (void);
9500d39df38Smrg
9512c393a42Smrg#define FcObjectCompare(a, b)	((int) a - (int) b)
9522c393a42Smrg
9532c393a42Smrg/* fcpat.c */
9542c393a42Smrg
9552c393a42SmrgFcPrivate FcValue
9562c393a42SmrgFcValueCanonicalize (const FcValue *v);
9572c393a42Smrg
958898dab68SmrgFcPrivate FcValueListPtr
959898dab68SmrgFcValueListCreate (void);
960898dab68Smrg
9612c393a42SmrgFcPrivate void
9622c393a42SmrgFcValueListDestroy (FcValueListPtr l);
9632c393a42Smrg
964898dab68SmrgFcPrivate FcValueListPtr
965898dab68SmrgFcValueListPrepend (FcValueListPtr vallist,
966898dab68Smrg		    FcValue        value,
967898dab68Smrg		    FcValueBinding binding);
968898dab68Smrg
969898dab68SmrgFcPrivate FcValueListPtr
970898dab68SmrgFcValueListAppend (FcValueListPtr vallist,
971898dab68Smrg		   FcValue        value,
972898dab68Smrg		   FcValueBinding binding);
973898dab68Smrg
974898dab68SmrgFcPrivate FcValueListPtr
975898dab68SmrgFcValueListDuplicate(FcValueListPtr orig);
976898dab68Smrg
9772c393a42SmrgFcPrivate FcPatternElt *
9782c393a42SmrgFcPatternObjectFindElt (const FcPattern *p, FcObject object);
9792c393a42Smrg
9802c393a42SmrgFcPrivate FcPatternElt *
9812c393a42SmrgFcPatternObjectInsertElt (FcPattern *p, FcObject object);
9822c393a42Smrg
983898dab68SmrgFcPrivate FcBool
984898dab68SmrgFcPatternObjectListAdd (FcPattern	*p,
985898dab68Smrg			FcObject	object,
986898dab68Smrg			FcValueListPtr	list,
987898dab68Smrg			FcBool		append);
988898dab68Smrg
9892c393a42SmrgFcPrivate FcBool
9902c393a42SmrgFcPatternObjectAddWithBinding  (FcPattern	*p,
9912c393a42Smrg				FcObject	object,
9922c393a42Smrg				FcValue		value,
9932c393a42Smrg				FcValueBinding  binding,
9942c393a42Smrg				FcBool		append);
9952c393a42Smrg
9962c393a42SmrgFcPrivate FcBool
9972c393a42SmrgFcPatternObjectAdd (FcPattern *p, FcObject object, FcValue value, FcBool append);
998898dab68Smrg
9992c393a42SmrgFcPrivate FcBool
10002c393a42SmrgFcPatternObjectAddWeak (FcPattern *p, FcObject object, FcValue value, FcBool append);
1001898dab68Smrg
10022c393a42SmrgFcPrivate FcResult
10032c393a42SmrgFcPatternObjectGet (const FcPattern *p, FcObject object, int id, FcValue *v);
1004898dab68Smrg
10052c393a42SmrgFcPrivate FcBool
10062c393a42SmrgFcPatternObjectDel (FcPattern *p, FcObject object);
10072c393a42Smrg
10082c393a42SmrgFcPrivate FcBool
10092c393a42SmrgFcPatternObjectRemove (FcPattern *p, FcObject object, int id);
10102c393a42Smrg
10112c393a42SmrgFcPrivate FcBool
10122c393a42SmrgFcPatternObjectAddInteger (FcPattern *p, FcObject object, int i);
10132c393a42Smrg
10142c393a42SmrgFcPrivate FcBool
10152c393a42SmrgFcPatternObjectAddDouble (FcPattern *p, FcObject object, double d);
10162c393a42Smrg
10172c393a42SmrgFcPrivate FcBool
10182c393a42SmrgFcPatternObjectAddString (FcPattern *p, FcObject object, const FcChar8 *s);
10192c393a42Smrg
10202c393a42SmrgFcPrivate FcBool
10212c393a42SmrgFcPatternObjectAddMatrix (FcPattern *p, FcObject object, const FcMatrix *s);
10222c393a42Smrg
10232c393a42SmrgFcPrivate FcBool
10242c393a42SmrgFcPatternObjectAddCharSet (FcPattern *p, FcObject object, const FcCharSet *c);
10252c393a42Smrg
10262c393a42SmrgFcPrivate FcBool
10272c393a42SmrgFcPatternObjectAddBool (FcPattern *p, FcObject object, FcBool b);
10282c393a42Smrg
10292c393a42SmrgFcPrivate FcBool
10302c393a42SmrgFcPatternObjectAddLangSet (FcPattern *p, FcObject object, const FcLangSet *ls);
10312c393a42Smrg
103218bd4a06SmrgFcPrivate FcBool
103318bd4a06SmrgFcPatternObjectAddRange (FcPattern *p, FcObject object, const FcRange *r);
103418bd4a06Smrg
10352c393a42SmrgFcPrivate FcResult
10362c393a42SmrgFcPatternObjectGetInteger (const FcPattern *p, FcObject object, int n, int *i);
10372c393a42Smrg
10382c393a42SmrgFcPrivate FcResult
10392c393a42SmrgFcPatternObjectGetDouble (const FcPattern *p, FcObject object, int n, double *d);
10402c393a42Smrg
10412c393a42SmrgFcPrivate FcResult
10422c393a42SmrgFcPatternObjectGetString (const FcPattern *p, FcObject object, int n, FcChar8 ** s);
10432c393a42Smrg
10442c393a42SmrgFcPrivate FcResult
10452c393a42SmrgFcPatternObjectGetMatrix (const FcPattern *p, FcObject object, int n, FcMatrix **s);
10462c393a42Smrg
10472c393a42SmrgFcPrivate FcResult
10482c393a42SmrgFcPatternObjectGetCharSet (const FcPattern *p, FcObject object, int n, FcCharSet **c);
10492c393a42Smrg
10502c393a42SmrgFcPrivate FcResult
10512c393a42SmrgFcPatternObjectGetBool (const FcPattern *p, FcObject object, int n, FcBool *b);
10522c393a42Smrg
10532c393a42SmrgFcPrivate FcResult
10542c393a42SmrgFcPatternObjectGetLangSet (const FcPattern *p, FcObject object, int n, FcLangSet **ls);
10552c393a42Smrg
105618bd4a06SmrgFcPrivate FcResult
105718bd4a06SmrgFcPatternObjectGetRange (const FcPattern *p, FcObject object, int id, FcRange **r);
105818bd4a06Smrg
10592c393a42SmrgFcPrivate FcBool
10602c393a42SmrgFcPatternAppend (FcPattern *p, FcPattern *s);
10612c393a42Smrg
106218bd4a06SmrgFcPrivate int
106318bd4a06SmrgFcPatternPosition (const FcPattern *p, const char *object);
106418bd4a06Smrg
10652c393a42SmrgFcPrivate FcChar32
10662c393a42SmrgFcStringHash (const FcChar8 *s);
10672c393a42Smrg
10682c393a42SmrgFcPrivate FcBool
10692c393a42SmrgFcPatternSerializeAlloc (FcSerialize *serialize, const FcPattern *pat);
10702c393a42Smrg
10712c393a42SmrgFcPrivate FcPattern *
10722c393a42SmrgFcPatternSerialize (FcSerialize *serialize, const FcPattern *pat);
10732c393a42Smrg
10742c393a42SmrgFcPrivate FcBool
10752c393a42SmrgFcValueListSerializeAlloc (FcSerialize *serialize, const FcValueList *pat);
10762c393a42Smrg
10772c393a42SmrgFcPrivate FcValueList *
10782c393a42SmrgFcValueListSerialize (FcSerialize *serialize, const FcValueList *pat);
10792c393a42Smrg
10802c393a42Smrg/* fcrender.c */
10812c393a42Smrg
10822c393a42Smrg/* fcmatrix.c */
10832c393a42Smrg
10842c393a42Smrgextern FcPrivate const FcMatrix    FcIdentityMatrix;
10852c393a42Smrg
10862c393a42SmrgFcPrivate void
10872c393a42SmrgFcMatrixFree (FcMatrix *mat);
10882c393a42Smrg
108918bd4a06Smrg/* fcrange.c */
109018bd4a06Smrg
109118bd4a06SmrgFcPrivate FcRange *
109218bd4a06SmrgFcRangePromote (double v, FcValuePromotionBuffer *vbuf);
109318bd4a06Smrg
109418bd4a06SmrgFcPrivate FcBool
109518bd4a06SmrgFcRangeIsInRange (const FcRange *a, const FcRange *b);
109618bd4a06Smrg
109718bd4a06SmrgFcPrivate FcBool
109818bd4a06SmrgFcRangeCompare (FcOp op, const FcRange *a, const FcRange *b);
109918bd4a06Smrg
110018bd4a06SmrgFcPrivate FcChar32
110118bd4a06SmrgFcRangeHash (const FcRange *r);
110218bd4a06Smrg
110318bd4a06SmrgFcPrivate FcBool
110418bd4a06SmrgFcRangeSerializeAlloc (FcSerialize *serialize, const FcRange *r);
110518bd4a06Smrg
110618bd4a06SmrgFcPrivate FcRange *
110718bd4a06SmrgFcRangeSerialize (FcSerialize *serialize, const FcRange *r);
110818bd4a06Smrg
1109898dab68Smrg/* fcstat.c */
1110898dab68Smrg
1111898dab68SmrgFcPrivate int
1112898dab68SmrgFcStat (const FcChar8 *file, struct stat *statb);
1113898dab68Smrg
1114898dab68SmrgFcPrivate int
1115898dab68SmrgFcStatChecksum (const FcChar8 *file, struct stat *statb);
1116898dab68Smrg
1117898dab68SmrgFcPrivate FcBool
1118898dab68SmrgFcIsFsMmapSafe (int fd);
1119898dab68Smrg
1120898dab68SmrgFcPrivate FcBool
1121898dab68SmrgFcIsFsMtimeBroken (const FcChar8 *dir);
1122898dab68Smrg
11232c393a42Smrg/* fcstr.c */
112418bd4a06SmrgFcPrivate FcStrSet *
112518bd4a06SmrgFcStrSetCreateEx (unsigned int control);
112618bd4a06Smrg
1127898dab68SmrgFcPrivate FcBool
1128898dab68SmrgFcStrSetAddLangs (FcStrSet *strs, const char *languages);
1129898dab68Smrg
11302c393a42SmrgFcPrivate void
11312c393a42SmrgFcStrSetSort (FcStrSet * set);
11322c393a42Smrg
11332c393a42SmrgFcPrivate void
11342c393a42SmrgFcStrBufInit (FcStrBuf *buf, FcChar8 *init, int size);
11352c393a42Smrg
11362c393a42SmrgFcPrivate void
11372c393a42SmrgFcStrBufDestroy (FcStrBuf *buf);
11382c393a42Smrg
11392c393a42SmrgFcPrivate FcChar8 *
11402c393a42SmrgFcStrBufDone (FcStrBuf *buf);
11412c393a42Smrg
11420d39df38SmrgFcPrivate FcChar8 *
11430d39df38SmrgFcStrBufDoneStatic (FcStrBuf *buf);
11440d39df38Smrg
11452c393a42SmrgFcPrivate FcBool
11462c393a42SmrgFcStrBufChar (FcStrBuf *buf, FcChar8 c);
11472c393a42Smrg
11482c393a42SmrgFcPrivate FcBool
11492c393a42SmrgFcStrBufString (FcStrBuf *buf, const FcChar8 *s);
11502c393a42Smrg
11512c393a42SmrgFcPrivate FcBool
11522c393a42SmrgFcStrBufData (FcStrBuf *buf, const FcChar8 *s, int len);
11532c393a42Smrg
11542c393a42SmrgFcPrivate int
11552c393a42SmrgFcStrCmpIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
11562c393a42Smrg
11575e61939bSmrgFcPrivate int
11585e61939bSmrgFcStrCmpIgnoreCaseAndDelims (const FcChar8 *s1, const FcChar8 *s2, const FcChar8 *delims);
11595e61939bSmrg
11602c393a42SmrgFcPrivate const FcChar8 *
11612c393a42SmrgFcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
11622c393a42Smrg
11632c393a42SmrgFcPrivate const FcChar8 *
11642c393a42SmrgFcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
11652c393a42Smrg
11662c393a42SmrgFcPrivate const FcChar8 *
11672c393a42SmrgFcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2);
11682c393a42Smrg
11695e61939bSmrgFcPrivate int
11705e61939bSmrgFcStrMatchIgnoreCaseAndDelims (const FcChar8 *s1, const FcChar8 *s2, const FcChar8 *delims);
11715e61939bSmrg
11725e61939bSmrgFcPrivate FcBool
11735e61939bSmrgFcStrGlobMatch (const FcChar8 *glob,
11745e61939bSmrg		const FcChar8 *string);
11755e61939bSmrg
11762c393a42SmrgFcPrivate FcBool
11772c393a42SmrgFcStrUsesHome (const FcChar8 *s);
11782c393a42Smrg
11795e61939bSmrgFcPrivate FcChar8 *
11805e61939bSmrgFcStrBuildFilename (const FcChar8 *path,
11815e61939bSmrg		    ...);
11825e61939bSmrg
11832c393a42SmrgFcPrivate FcChar8 *
11842c393a42SmrgFcStrLastSlash (const FcChar8  *path);
11852c393a42Smrg
11862c393a42SmrgFcPrivate FcChar32
11872c393a42SmrgFcStrHashIgnoreCase (const FcChar8 *s);
11882c393a42Smrg
11892c393a42SmrgFcPrivate FcChar8 *
11902c393a42SmrgFcStrCanonFilename (const FcChar8 *s);
11912c393a42Smrg
11922c393a42SmrgFcPrivate FcBool
11932c393a42SmrgFcStrSerializeAlloc (FcSerialize *serialize, const FcChar8 *str);
11942c393a42Smrg
11952c393a42SmrgFcPrivate FcChar8 *
11962c393a42SmrgFcStrSerialize (FcSerialize *serialize, const FcChar8 *str);
11972c393a42Smrg
11985e61939bSmrg/* fcobjs.c */
11995e61939bSmrg
120018bd4a06SmrgFcPrivate void
120118bd4a06SmrgFcObjectFini (void);
120218bd4a06Smrg
12035e61939bSmrgFcPrivate FcObject
12045e61939bSmrgFcObjectLookupIdByName (const char *str);
12055e61939bSmrg
12065e61939bSmrgFcPrivate FcObject
12075e61939bSmrgFcObjectLookupBuiltinIdByName (const char *str);
12085e61939bSmrg
12095e61939bSmrgFcPrivate const char *
12105e61939bSmrgFcObjectLookupOtherNameById (FcObject id);
12115e61939bSmrg
12125e61939bSmrgFcPrivate const FcObjectType *
12135e61939bSmrgFcObjectLookupOtherTypeById (FcObject id);
12145e61939bSmrg
12155e61939bSmrgFcPrivate const FcObjectType *
12165e61939bSmrgFcObjectLookupOtherTypeByName (const char *str);
12175e61939bSmrg
12182c393a42Smrg#endif /* _FC_INT_H_ */
1219