]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcint.h
Reinstate the old global cache code. For the forseeable future, it's
[fontconfig.git] / src / fcint.h
index 105a5511ac51b98ee432546a511ee220d6d6dd71..73039f4b2832b23641cd53d5595c9e8207158c77 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * $XFree86: xc/lib/fontconfig/src/fcint.h,v 1.24 2002/08/22 07:36:44 keithp Exp $
+ * $RCSId: xc/lib/fontconfig/src/fcint.h,v 1.27 2002/08/31 22:17:32 keithp Exp $
  *
- * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
+ * Copyright © 2000 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
@@ -41,6 +41,7 @@
 #include <config.h>
 #endif
 
+/* unused */
 typedef struct _FcSymbolic {
     const char *name;
     int                value;
@@ -53,6 +54,12 @@ typedef struct _FcSymbolic {
 #define FC_FONT_FILE_INVALID   ((FcChar8 *) ".")
 #define FC_FONT_FILE_DIR       ((FcChar8 *) ".dir")
 
+#ifdef _WIN32
+#define FC_SEARCH_PATH_SEPARATOR ';'
+#else
+#define FC_SEARCH_PATH_SEPARATOR ':'
+#endif
+
 #define FC_DBG_MATCH   1
 #define FC_DBG_MATCHV  2
 #define FC_DBG_EDIT    4
@@ -63,6 +70,7 @@ typedef struct _FcSymbolic {
 #define FC_DBG_SCAN    128
 #define FC_DBG_SCANV   256
 #define FC_DBG_MEMORY  512
+#define FC_DBG_CONFIG  1024
 
 #define FC_MEM_CHARSET     0
 #define FC_MEM_CHARLEAF            1
@@ -93,30 +101,50 @@ typedef struct _FcSymbolic {
 #define FC_MEM_VSTACK      26
 #define FC_MEM_ATTR        27
 #define FC_MEM_PSTACK      28
+#define FC_MEM_STATICSTR    29
 
-#define FC_MEM_NUM         29
+#define FC_MEM_NUM         30
 
 typedef enum _FcValueBinding {
-    FcValueBindingWeak, FcValueBindingStrong
+    FcValueBindingWeak, FcValueBindingStrong, FcValueBindingSame
 } FcValueBinding;
 
+typedef struct _FcValueListPtr {
+    int                        bank;
+    union {
+        int                stat;
+        struct _FcValueList *dyn;
+    } u;
+} FcValueListPtr;
+
 typedef struct _FcValueList {
-    struct _FcValueList    *next;
+    FcValueListPtr         next;
+
     FcValue                value;
     FcValueBinding         binding;
 } FcValueList;
 
+typedef int FcObjectPtr;
+
+typedef struct _FcPatternEltPtr {
+    int                        bank;
+    union {
+        int                stat;
+        struct _FcPatternElt *dyn;
+    } u;
+} FcPatternEltPtr;
+
 typedef struct _FcPatternElt {
-    const char     *object;
-    FcValueList            *values;
+    FcObjectPtr             object;
+    FcValueListPtr          values;
 } FcPatternElt;
 
-
 struct _FcPattern {
     int                    num;
     int                    size;
-    FcPatternElt    *elts;
+    FcPatternEltPtr elts;
     int                    ref;
+    int                    bank;
 };
 
 typedef enum _FcOp {
@@ -126,10 +154,12 @@ typedef enum _FcOp {
     FcOpAssign, FcOpAssignReplace, 
     FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast,
     FcOpQuest,
-    FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual, FcOpContains, FcOpNotContains,
+    FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual, 
+    FcOpContains, FcOpListing, FcOpNotContains,
     FcOpLess, FcOpLessEqual, FcOpMore, FcOpMoreEqual,
     FcOpPlus, FcOpMinus, FcOpTimes, FcOpDivide,
-    FcOpNot, FcOpComma, FcOpInvalid
+    FcOpNot, FcOpComma, FcOpFloor, FcOpCeil, FcOpRound, FcOpTrunc,
+    FcOpInvalid
 } FcOp;
 
 typedef struct _FcExpr {
@@ -187,8 +217,17 @@ typedef struct _FcCharLeaf {
 struct _FcCharSet {
     int                    ref;        /* reference count */
     int                    num;        /* size of leaves and numbers arrays */
-    FcCharLeaf     **leaves;
-    FcChar16       *numbers;
+    int                    bank;
+    union {
+       struct {
+           FcCharLeaf  **leaves;
+           FcChar16    *numbers;
+       } dyn;
+       struct {
+           int         leafidx_offset;
+           int         numbers_offset;
+       } stat;
+    } u;
 };
 
 struct _FcStrSet {
@@ -211,6 +250,69 @@ typedef struct _FcStrBuf {
     int            size;
 } FcStrBuf;
 
+typedef struct _FcCache {
+    int            magic;
+    int            count;
+    int     bank;
+    int     pattern_count;
+    int     patternelt_count;
+    int     valuelist_count;
+    int     str_count;
+    int            langset_count;
+    int     charset_count;
+    int     charset_numbers_count;
+    int     charset_leaf_count;
+    int     charset_leaf_idx_count;
+} FcCache;
+
+/*
+ * To map adobe glyph names to unicode values, a precomputed hash
+ * table is used
+ */
+
+typedef struct _FcGlyphName {
+    FcChar32   ucs;            /* unicode value */
+    FcChar8    name[1];        /* name extends beyond struct */
+} FcGlyphName;
+
+/*
+ * To perform case-insensitive string comparisons, a table
+ * is used which holds three different kinds of folding data.
+ * 
+ * The first is a range of upper case values mapping to a range
+ * of their lower case equivalents.  Within each range, the offset
+ * between upper and lower case is constant.
+ *
+ * The second is a range of upper case values which are interleaved
+ * with their lower case equivalents.
+ * 
+ * The third is a set of raw unicode values mapping to a list
+ * of unicode values for comparison purposes.  This allows conversion
+ * of ß to "ss" so that SS, ss and ß all match.  A separate array
+ * holds the list of unicode values for each entry.
+ *
+ * These are packed into a single table.  Using a binary search,
+ * the appropriate entry can be located.
+ */
+
+#define FC_CASE_FOLD_RANGE         0
+#define FC_CASE_FOLD_EVEN_ODD      1
+#define FC_CASE_FOLD_FULL          2
+
+typedef struct _FcCaseFold {
+    FcChar32   upper;
+    FcChar16   method : 2;
+    FcChar16   count : 14;
+    short      offset;     /* lower - upper for RANGE, table id for FULL */
+} FcCaseFold;
+
+#define FC_MAX_FILE_LEN            4096
+
+#define FC_STORAGE_STATIC 0x80
+#define fc_value_string(v)  (((v)->type & FC_STORAGE_STATIC) ? ((FcChar8 *) v) + (v)->u.s_off : (v) -> u.s)
+#define fc_value_charset(v)  (((v)->type & FC_STORAGE_STATIC) ? (const FcCharSet *)(((char *) v) + (v)->u.c_off) : (v) -> u.c)
+#define fc_value_langset(v)  (((v)->type & FC_STORAGE_STATIC) ? (const FcLangSet *)(((char *) v) + (v)->u.l_off) : (v) -> u.l)
+
 /*
  * The per-user ~/.fonts.cache-<version> file is loaded into
  * this data structure.  Each directory gets a substructure
@@ -221,6 +323,7 @@ typedef struct _FcStrBuf {
  * cache which is then rewritten to the users home directory
  */
 
+#define FC_CACHE_MAGIC 0x12345678
 #define FC_GLOBAL_CACHE_DIR_HASH_SIZE      37
 #define FC_GLOBAL_CACHE_FILE_HASH_SIZE     67
 
@@ -238,18 +341,20 @@ typedef struct _FcGlobalCacheFile {
     FcChar8                    *name;
 } FcGlobalCacheFile;
 
+typedef struct _FcGlobalCacheDir FcGlobalCacheDir;
+
 typedef struct _FcGlobalCacheSubdir {
     struct _FcGlobalCacheSubdir        *next;
-    FcChar8                    *file;
+    FcGlobalCacheDir           *ent;
 } FcGlobalCacheSubdir;
 
-typedef struct _FcGlobalCacheDir {
+struct _FcGlobalCacheDir {
     struct _FcGlobalCacheDir   *next;
     FcGlobalCacheInfo          info;
     int                                len;
     FcGlobalCacheFile          *ents[FC_GLOBAL_CACHE_FILE_HASH_SIZE];
     FcGlobalCacheSubdir                *subdirs;
-} FcGlobalCacheDir;
+};
 
 typedef struct _FcGlobalCache {
     FcGlobalCacheDir           *ents[FC_GLOBAL_CACHE_DIR_HASH_SIZE];
@@ -304,6 +409,13 @@ struct _FcConfig {
     FcSubst    *substPattern;      /* substitutions for patterns */
     FcSubst    *substFont;         /* substitutions for fonts */
     int                maxObjects;         /* maximum number of tests in all substs */
+    /*
+     * List of patterns used to control font file selection
+     */
+    FcStrSet   *acceptGlobs;
+    FcStrSet   *rejectGlobs;
+    FcFontSet  *acceptPatterns;
+    FcFontSet  *rejectPatterns;
     /*
      * The set of fonts loaded from the listed directories; the
      * order within the set does not determine the font selection,
@@ -336,12 +448,16 @@ void
 FcGlobalCacheDestroy (FcGlobalCache *cache);
 
 FcBool
-FcGlobalCacheCheckTime (FcGlobalCacheInfo *info);
+FcGlobalCacheCheckTime (const FcChar8*file, FcGlobalCacheInfo *info);
 
 void
 FcGlobalCacheReferenced (FcGlobalCache     *cache,
                         FcGlobalCacheInfo  *info);
 
+void
+FcGlobalCacheReferenceSubdir (FcGlobalCache *cache,
+                             const FcChar8 *dir);
+
 FcGlobalCacheDir *
 FcGlobalCacheDirGet (FcGlobalCache  *cache,
                     const FcChar8  *dir,
@@ -352,7 +468,8 @@ FcBool
 FcGlobalCacheScanDir (FcFontSet                *set,
                      FcStrSet          *dirs,
                      FcGlobalCache     *cache,
-                     const FcChar8     *dir);
+                     const FcChar8     *dir,
+                     FcConfig          *config);
 
 FcGlobalCacheFile *
 FcGlobalCacheFileGet (FcGlobalCache *cache,
@@ -375,12 +492,30 @@ FcBool
 FcGlobalCacheSave (FcGlobalCache    *cache,
                   const FcChar8    *cache_file);
 
+void
+FcCacheForce(FcBool force);
+
 FcBool
-FcDirCacheReadDir (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir);
+FcCacheSerialize (int bank, FcConfig * config);
+
+FcFontSet *
+FcCacheRead (FcConfig *config, FcGlobalCache * cache);
 
 FcBool
-FcDirCacheWriteDir (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir);
-    
+FcDirCacheRead (FcFontSet * set, const FcChar8 *dir);
+
+FcBool
+FcDirCacheWrite (int bank, FcFontSet *set, const FcChar8 *dir);
+
+int
+FcCacheBankCount (void);
+
+FcBool
+FcCacheHaveBank (int bank);
+
+int
+FcCacheBankToIndex (int bank);
 /* fccfg.c */
 
 FcBool
@@ -419,32 +554,72 @@ FcConfigSetFonts (FcConfig        *config,
                  FcSetName     set);
 
 FcBool
-FcConfigCompareValue (const FcValue m,
+FcConfigCompareValue (const FcValue *m,
                      FcOp          op,
-                     const FcValue v);
+                     const FcValue *v);
+
+FcBool
+FcConfigGlobAdd (FcConfig      *config,
+                const FcChar8  *glob,
+                FcBool         accept);
+
+FcBool
+FcConfigAcceptFilename (FcConfig       *config,
+                       const FcChar8   *filename);
+
+FcBool
+FcConfigPatternsAdd (FcConfig  *config,
+                    FcPattern  *pattern,
+                    FcBool     accept);
+
+FcBool
+FcConfigAcceptFont (FcConfig       *config,
+                   const FcPattern *font);
 
 /* fccharset.c */
 FcCharSet *
 FcCharSetFreeze (FcCharSet *cs);
 
+void
+FcCharSetThawAll (void);
+
 FcBool
 FcNameUnparseCharSet (FcStrBuf *buf, const FcCharSet *c);
 
 FcCharSet *
 FcNameParseCharSet (FcChar8 *string);
 
-FcChar32
-FcFreeTypeUcs4ToPrivate (FcChar32 ucs4, const FcCharMap *map);
+FcCharLeaf *
+FcCharSetFindLeafCreate (FcCharSet *fcs, FcChar32 ucs4);
 
-FcChar32
-FcFreeTypePrivateToUcs4 (FcChar32 private, const FcCharMap *map);
+void
+FcCharSetNewBank (void);
+
+int
+FcCharSetNeededBytes (const FcCharSet *c);
+
+void *
+FcCharSetDistributeBytes (FcCache * metadata,
+                         void * block_ptr);
+
+FcCharSet *
+FcCharSetSerialize(int bank, FcCharSet *c);
+
+void *
+FcCharSetUnserialize (FcCache metadata, void *block_ptr);
+
+FcCharLeaf *
+FcCharSetGetLeaf(const FcCharSet *c, int i);
+
+FcChar16 *
+FcCharSetGetNumbers(const FcCharSet *c);
 
-const FcCharMap *
-FcFreeTypeGetPrivateMap (FT_Encoding encoding);
-    
 /* fcdbg.c */
 void
-FcValueListPrint (const FcValueList *l);
+FcValueListPrint (const FcValueListPtr l);
+
+void
+FcLangSetPrint (const FcLangSet *ls);
 
 void
 FcOpPrint (FcOp op);
@@ -466,6 +641,27 @@ FcDebug (void);
 
 /* fcdir.c */
 
+FcBool
+FcFileIsDir (const FcChar8 *file);
+
+FcBool
+FcFileScanConfig (FcFontSet    *set,
+                 FcStrSet      *dirs,
+                 FcFileCache   *cache,
+                 FcBlanks      *blanks,
+                 const FcChar8 *file,
+                 FcBool        force,
+                 FcConfig      *config);
+
+FcBool
+FcDirScanConfig (FcFontSet     *set,
+                FcStrSet       *dirs,
+                FcFileCache    *cache,
+                FcBlanks       *blanks,
+                const FcChar8  *dir,
+                FcBool         force,
+                FcConfig       *config);
+
 /* fcfont.c */
 int
 FcFontDebug (void);
@@ -477,7 +673,32 @@ FcFreeTypeIsExclusiveLang (const FcChar8  *lang);
 FcBool
 FcFreeTypeHasLang (FcPattern *pattern, const FcChar8 *lang);
 
+FcChar32
+FcFreeTypeUcs4ToPrivate (FcChar32 ucs4, const FcCharMap *map);
+
+FcChar32
+FcFreeTypePrivateToUcs4 (FcChar32 private, const FcCharMap *map);
+
+const FcCharMap *
+FcFreeTypeGetPrivateMap (FT_Encoding encoding);
+    
 /* fcfs.c */
+
+void
+FcFontSetNewBank (void);
+
+int
+FcFontSetNeededBytes (FcFontSet *s);
+
+void *
+FcFontSetDistributeBytes (FcCache * metadata, void * block_ptr);
+
+FcBool
+FcFontSetSerialize (int bank, FcFontSet * s);
+
+FcBool
+FcFontSetUnserialize(FcCache metadata, FcFontSet * s, void * block_ptr);
+
 /* fcgram.y */
 int
 FcConfigparse (void);
@@ -491,13 +712,6 @@ FcConfigerror (char *fmt, ...);
 char *
 FcConfigSaveField (const char *field);
 
-FcTest *
-FcTestCreate (FcMatchKind   kind,
-             FcQual        qual,
-             const FcChar8 *field,
-             FcOp          compare,
-             FcExpr        *expr);
-
 void
 FcTestDestroy (FcTest *test);
 
@@ -531,9 +745,6 @@ FcExprCreateOp (FcExpr *left, FcOp op, FcExpr *right);
 void
 FcExprDestroy (FcExpr *e);
 
-FcEdit *
-FcEditCreate (const char *field, FcOp op, FcExpr *expr, FcValueBinding binding);
-
 void
 FcEditDestroy (FcEdit *e);
 
@@ -568,19 +779,62 @@ FcNameParseLangSet (const FcChar8 *string);
 FcBool
 FcNameUnparseLangSet (FcStrBuf *buf, const FcLangSet *ls);
 
+void
+FcLangSetNewBank (void);
+
+int
+FcLangSetNeededBytes (const FcLangSet *l);
+
+void *
+FcLangSetDistributeBytes (FcCache * metadata,
+                         void * block_ptr);
+
+FcLangSet *
+FcLangSetSerialize (int bank, FcLangSet *l);
+
+void *
+FcLangSetUnserialize (FcCache metadata, void *block_ptr);
+
 /* fclist.c */
 
+FcBool
+FcListPatternMatchAny (const FcPattern *p,
+                      const FcPattern *font);
+
 /* fcmatch.c */
 
 /* fcname.c */
 
 FcBool
-FcNameBool (FcChar8 *v, FcBool *result);
+FcNameBool (const FcChar8 *v, FcBool *result);
+
+void
+FcObjectNewBank(void);
+
+void *
+FcObjectDistributeBytes (FcCache * metadata,
+                        void * block_ptr);
+
+FcObjectPtr
+FcObjectToPtr (const char * si);
+
+int
+FcObjectNeededBytes (FcObjectPtr p);
+
+void
+FcObjectUnserialize (FcCache metadata, FcConfig * config, void *block_ptr);
+
+FcObjectPtr
+FcObjectSerialize (FcObjectPtr s);
 
 /* fcpat.c */
+
+FcValue
+FcValueCanonicalize (const FcValue *v);
+
 void
-FcValueListDestroy (FcValueList *l);
-    
+FcValueListDestroy (FcValueListPtr l);
+
 FcPatternElt *
 FcPatternFindElt (const FcPattern *p, const char *object);
 
@@ -597,6 +851,45 @@ FcPatternAddWithBinding  (FcPattern            *p,
 FcPattern *
 FcPatternFreeze (FcPattern *p);
 
+void
+FcPatternFini (void);
+
+FcBool
+FcPatternAppend (FcPattern *p, FcPattern *s);
+
+const char *
+FcObjectStaticName (const char *name);
+
+const char *
+FcObjectPtrU (FcObjectPtr p);
+
+int
+FcObjectPtrCompare (FcObjectPtr a, FcObjectPtr b);
+
+void
+FcPatternNewBank (void);
+
+int
+FcPatternNeededBytes (FcPattern *p);
+
+void *
+FcPatternDistributeBytes (FcCache * metadata, void * block_ptr);
+
+FcValueList * 
+FcValueListPtrU(FcValueListPtr p);
+
+FcPatternElt *
+FcPatternEltU (FcPatternEltPtr pei);
+
+FcValueListPtr
+FcValueListPtrCreateDynamic(FcValueList * p);
+
+FcPattern *
+FcPatternSerialize (int bank, FcPattern * p);
+
+FcPattern *
+FcPatternUnserialize (FcCache metadata, void *block_ptr);
+
 /* fcrender.c */
 
 /* fcmatrix.c */
@@ -607,6 +900,9 @@ void
 FcMatrixFree (FcMatrix *mat);
 
 /* fcstr.c */
+void
+FcStrSetSort (FcStrSet * set);
+
 FcChar8 *
 FcStrPlus (const FcChar8 *s1, const FcChar8 *s2);
     
@@ -634,4 +930,19 @@ FcStrBufData (FcStrBuf *buf, const FcChar8 *s, int len);
 int
 FcStrCmpIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
 
+const FcChar8 *
+FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
+
+const FcChar8 *
+FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
+
+FcBool
+FcStrUsesHome (const FcChar8 *s);
+
+FcChar8 *
+FcStrLastSlash (const FcChar8  *path);
+
+FcChar32
+FcStrHashIgnoreCase (const FcChar8 *s);
+
 #endif /* _FC_INT_H_ */