X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcint.h;h=494552ef44b241be96b9a75e479414e9e272ea07;hb=00f059e930f12ca7c66cf2ffbc6c4ae789912af7;hp=b34d1ea0590d0d2e34c99f9207249e1f86d5e6a9;hpb=8245771d5a42dac36024411a0da047b9a7dc42c6;p=fontconfig.git diff --git a/src/fcint.h b/src/fcint.h index b34d1ea..494552e 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -25,8 +25,19 @@ #ifndef _FCINT_H_ #define _FCINT_H_ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include +#ifdef HAVE_INTTYPES_H +#include +#elif defined(HAVE_STDINT_H) +#include +#else +#error missing C99 integer data types +#endif #include #include #include @@ -37,9 +48,6 @@ #include #include #include -#ifdef HAVE_CONFIG_H -#include -#endif #ifndef FC_CONFIG_PATH #define FC_CONFIG_PATH "fonts.conf" @@ -47,6 +55,7 @@ #define FC_FONT_FILE_INVALID ((FcChar8 *) ".") #define FC_FONT_FILE_DIR ((FcChar8 *) ".dir") +#define FC_GLOBAL_MAGIC_COOKIE "GLOBAL" #ifdef _WIN32 #define FC_SEARCH_PATH_SEPARATOR ';' @@ -99,6 +108,10 @@ #define FC_MEM_NUM 30 +#define FC_BANK_DYNAMIC 0 +#define FC_BANK_FIRST 1 +#define FC_BANK_LANGS 0xfcfcfcfc + typedef enum _FcValueBinding { FcValueBindingWeak, FcValueBindingStrong, FcValueBindingSame } FcValueBinding; @@ -213,14 +226,14 @@ struct _FcCharSet { int num; /* size of leaves and numbers arrays */ int bank; union { - struct { - FcCharLeaf **leaves; - FcChar16 *numbers; - } dyn; struct { int leafidx_offset; int numbers_offset; } stat; + struct { + FcCharLeaf **leaves; + FcChar16 *numbers; + } dyn; } u; }; @@ -245,16 +258,18 @@ typedef struct _FcStrBuf { } 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 magic; /* FC_CACHE_MAGIC */ + int subdirs; /* number of subdir strings */ + off_t pos; /* position of data block in file */ + off_t count; /* number of bytes of data in block */ + int bank; /* bank ID */ + int pattern_count; /* number of FcPatterns */ + int patternelt_count; /* number of FcPatternElts */ + int valuelist_count; /* number of FcValueLists */ + int str_count; /* size of strings appearing as FcValues */ + int langset_count; /* number of FcLangSets */ + int charset_count; /* number of FcCharSets */ + int charset_numbers_count; int charset_leaf_count; int charset_leaf_idx_count; } FcCache; @@ -306,34 +321,11 @@ typedef struct _FcCaseFold { #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) +#define fc_storage_type(v) ((v)->type & ~FC_STORAGE_STATIC) -/* - * The per-user ~/.fonts.cache- file is loaded into - * this data structure. Each directory gets a substructure - * which is validated by comparing the directory timestamp with - * that saved in the cache. When valid, the entire directory cache - * can be immediately loaded without reading the directory. Otherwise, - * the files are checked individually; updated files are loaded into the - * cache which is then rewritten to the users home directory - */ - -#define FC_CACHE_MAGIC 0xFC02FC02 +#define fc_alignof(type) offsetof (struct { char c; type member; }, member) -typedef struct _FcGlobalCacheDir FcGlobalCacheDir; - -struct _FcGlobalCacheDir { - struct _FcGlobalCacheDir *next; - char *name; - FcCache metadata; - off_t offset; - void *ent; -}; - -typedef struct _FcGlobalCache { - FcGlobalCacheDir *dirs; - FcBool updated; - int fd; -} FcGlobalCache; +#define FC_CACHE_MAGIC 0xFC02FC04 struct _FcAtomic { FcChar8 *file; /* original file name */ @@ -367,6 +359,10 @@ struct _FcConfig { * of configured directories */ FcStrSet *fontDirs; + /* + * List of directories containing cache files. + */ + FcStrSet *cacheDirs; /* * Names of all of the configuration files used * to create this configuration @@ -406,47 +402,41 @@ struct _FcConfig { extern FcConfig *_fcConfig; +typedef struct _FcFileTime { + time_t time; + FcBool set; +} FcFileTime; + typedef struct _FcCharMap FcCharMap; +/* watch out; assumes that v is void * -PL */ +#define ALIGN(v,type) ((void *)(((uintptr_t)(v) + fc_alignof(type) - 1) & ~(fc_alignof(type) - 1))) + /* fcblanks.c */ /* fccache.c */ -FcGlobalCache * -FcGlobalCacheCreate (void); - -void -FcGlobalCacheDestroy (FcGlobalCache *cache); - -FcBool -FcGlobalCacheReadDir (FcFontSet *set, - FcStrSet *dirs, - FcGlobalCache *cache, - const char *dir, - FcConfig *config); - -void -FcGlobalCacheLoad (FcGlobalCache *cache, - FcStrSet *staleDirs, - const FcChar8 *cache_file); +FcFontSet * +FcCacheRead (FcConfig *config); FcBool -FcGlobalCacheUpdate (FcGlobalCache *cache, - const char *file, - FcFontSet *set); +FcDirCacheWrite (FcFontSet *set, FcStrSet * dirs, const FcChar8 *dir, FcConfig *config); FcBool -FcGlobalCacheSave (FcGlobalCache *cache, - const FcChar8 *cache_file); +FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir, FcConfig *config); -FcFontSet * -FcCacheRead (FcConfig *config, FcGlobalCache * cache); +extern int *_fcBankId, *_fcBankIdx; +int +FcCacheBankToIndexMTF (int bank); -FcBool -FcDirCacheWrite (FcFontSet *set, FcStrSet * dirs, const FcChar8 *dir); +static inline int +FcCacheBankToIndex (int bank) +{ + return (_fcBankId[*_fcBankIdx] == bank) ? *_fcBankIdx : FcCacheBankToIndexMTF(bank); +} -int -FcCacheBankToIndex (int bank); +const char * +FcCacheFindBankDir (int bank); /* fccfg.c */ @@ -462,6 +452,13 @@ FcBool FcConfigAddDir (FcConfig *config, const FcChar8 *d); +FcBool +FcConfigAddCacheDir (FcConfig *config, + const FcChar8 *d); + +FcStrList * +FcConfigGetCacheDirs (FcConfig *config); + FcBool FcConfigAddConfigFile (FcConfig *config, const FcChar8 *f); @@ -508,7 +505,13 @@ FcBool FcConfigAcceptFont (FcConfig *config, const FcPattern *font); +FcFileTime +FcConfigModifiedTime (FcConfig *config); + /* fccharset.c */ +void +FcLangCharSetPopulate (void); + FcCharSet * FcCharSetFreeze (FcCharSet *cs); @@ -530,6 +533,9 @@ FcCharSetNewBank (void); int FcCharSetNeededBytes (const FcCharSet *c); +int +FcCharSetNeededBytesAlign (void); + void * FcCharSetDistributeBytes (FcCache * metadata, void * block_ptr); @@ -538,7 +544,7 @@ FcCharSet * FcCharSetSerialize(int bank, FcCharSet *c); void * -FcCharSetUnserialize (FcCache metadata, void *block_ptr); +FcCharSetUnserialize (FcCache * metadata, void *block_ptr); FcCharLeaf * FcCharSetGetLeaf(const FcCharSet *c, int i); @@ -568,8 +574,17 @@ FcEditPrint (const FcEdit *edit); void FcSubstPrint (const FcSubst *subst); -int -FcDebug (void); +extern int FcDebugVal; + +static inline int +FcDebug (void) { return FcDebugVal; } + +void +FcInitDebug (void); + +/* fcdefault.c */ +FcChar8 * +FcGetDefaultLang (void); /* fcdir.c */ @@ -579,7 +594,6 @@ FcFileIsDir (const FcChar8 *file); FcBool FcFileScanConfig (FcFontSet *set, FcStrSet *dirs, - FcFileCache *cache, FcBlanks *blanks, const FcChar8 *file, FcBool force, @@ -588,7 +602,6 @@ FcFileScanConfig (FcFontSet *set, FcBool FcDirScanConfig (FcFontSet *set, FcStrSet *dirs, - FcFileCache *cache, FcBlanks *blanks, const FcChar8 *dir, FcBool force, @@ -622,6 +635,9 @@ FcFontSetNewBank (void); int FcFontSetNeededBytes (FcFontSet *s); +int +FcFontSetNeededBytesAlign (void); + void * FcFontSetDistributeBytes (FcCache * metadata, void * block_ptr); @@ -629,7 +645,7 @@ FcBool FcFontSetSerialize (int bank, FcFontSet * s); FcBool -FcFontSetUnserialize(FcCache metadata, FcFontSet * s, void * block_ptr); +FcFontSetUnserialize(FcCache * metadata, FcFontSet * s, void * block_ptr); /* fcgram.y */ int @@ -717,6 +733,9 @@ FcLangSetNewBank (void); int FcLangSetNeededBytes (const FcLangSet *l); +int +FcLangSetNeededBytesAlign (void); + void * FcLangSetDistributeBytes (FcCache * metadata, void * block_ptr); @@ -725,7 +744,7 @@ FcLangSet * FcLangSetSerialize (int bank, FcLangSet *l); void * -FcLangSetUnserialize (FcCache metadata, void *block_ptr); +FcLangSetUnserialize (FcCache * metadata, void *block_ptr); /* fclist.c */ @@ -750,8 +769,11 @@ FcObjectToPtr (const char * si); int FcObjectNeededBytes (void); +int +FcObjectNeededBytesAlign (void); + void * -FcObjectUnserialize (FcCache metadata, void *block_ptr); +FcObjectUnserialize (FcCache * metadata, void *block_ptr); void FcObjectSerialize (void); @@ -759,8 +781,11 @@ FcObjectSerialize (void); const char * FcObjectPtrU (FcObjectPtr p); -int -FcObjectPtrCompare (FcObjectPtr a, FcObjectPtr b); +static inline int +FcObjectPtrCompare (const FcObjectPtr a, const FcObjectPtr b) +{ + return a - b; +} void FcObjectStaticNameFini (void); @@ -786,9 +811,6 @@ FcPatternAddWithBinding (FcPattern *p, FcValueBinding binding, FcBool append); -FcPattern * -FcPatternFreeze (FcPattern *p); - void FcPatternFini (void); @@ -807,14 +829,34 @@ FcPatternNewBank (void); int FcPatternNeededBytes (FcPattern *p); +int +FcPatternNeededBytesAlign (void); + void * FcPatternDistributeBytes (FcCache * metadata, void * block_ptr); -FcValueList * -FcValueListPtrU(FcValueListPtr p); +/* please don't access these outside of fcpat.c! only visible so that + * *PtrU can be inlined. */ +extern FcValueList ** _fcValueLists; +extern FcPatternElt ** _fcPatternElts; -FcPatternElt * -FcPatternEltU (FcPatternEltPtr pei); +static inline FcValueList * +FcValueListPtrU (FcValueListPtr pi) +{ + if (pi.bank == FC_BANK_DYNAMIC) + return pi.u.dyn; + + return &_fcValueLists[FcCacheBankToIndex(pi.bank)][pi.u.stat]; +} + +static inline FcPatternElt * +FcPatternEltU (FcPatternEltPtr pei) +{ + if (pei.bank == FC_BANK_DYNAMIC) + return pei.u.dyn; + + return &_fcPatternElts[FcCacheBankToIndex(pei.bank)][pei.u.stat]; +} FcValueListPtr FcValueListPtrCreateDynamic(FcValueList * p); @@ -823,7 +865,7 @@ FcPattern * FcPatternSerialize (int bank, FcPattern * p); void * -FcPatternUnserialize (FcCache metadata, void *block_ptr); +FcPatternUnserialize (FcCache * metadata, void *block_ptr); /* fcrender.c */