]> git.wh0rd.org - fontconfig.git/blob - src/fcint.h
Remove 0b82 and Tamil numbers from tamil orthography (Jungshik Shin
[fontconfig.git] / src / fcint.h
1 /*
2 * $RCSId: xc/lib/fontconfig/src/fcint.h,v 1.27 2002/08/31 22:17:32 keithp Exp $
3 *
4 * Copyright © 2000 Keith Packard
5 *
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name of Keith Packard not be used in
11 * advertising or publicity pertaining to distribution of the software without
12 * specific, written prior permission. Keith Packard makes no
13 * representations about the suitability of this software for any purpose. It
14 * is provided "as is" without express or implied warranty.
15 *
16 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22 * PERFORMANCE OF THIS SOFTWARE.
23 */
24
25 #ifndef _FCINT_H_
26 #define _FCINT_H_
27
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <string.h>
31 #include <ctype.h>
32 #include <errno.h>
33 #include <unistd.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <time.h>
37 #include <fontconfig/fontconfig.h>
38 #include <fontconfig/fcprivate.h>
39 #include <fontconfig/fcfreetype.h>
40 #ifdef HAVE_CONFIG_H
41 #include <config.h>
42 #endif
43
44 typedef struct _FcSymbolic {
45 const char *name;
46 int value;
47 } FcSymbolic;
48
49 #ifndef FC_CONFIG_PATH
50 #define FC_CONFIG_PATH "fonts.conf"
51 #endif
52
53 #define FC_FONT_FILE_INVALID ((FcChar8 *) ".")
54 #define FC_FONT_FILE_DIR ((FcChar8 *) ".dir")
55
56 #ifdef _WIN32
57 #define FC_SEARCH_PATH_SEPARATOR ';'
58 #else
59 #define FC_SEARCH_PATH_SEPARATOR ':'
60 #endif
61
62 #define FC_DBG_MATCH 1
63 #define FC_DBG_MATCHV 2
64 #define FC_DBG_EDIT 4
65 #define FC_DBG_FONTSET 8
66 #define FC_DBG_CACHE 16
67 #define FC_DBG_CACHEV 32
68 #define FC_DBG_PARSE 64
69 #define FC_DBG_SCAN 128
70 #define FC_DBG_SCANV 256
71 #define FC_DBG_MEMORY 512
72
73 #define FC_MEM_CHARSET 0
74 #define FC_MEM_CHARLEAF 1
75 #define FC_MEM_FONTSET 2
76 #define FC_MEM_FONTPTR 3
77 #define FC_MEM_OBJECTSET 4
78 #define FC_MEM_OBJECTPTR 5
79 #define FC_MEM_MATRIX 6
80 #define FC_MEM_PATTERN 7
81 #define FC_MEM_PATELT 8
82 #define FC_MEM_VALLIST 9
83 #define FC_MEM_SUBSTATE 10
84 #define FC_MEM_STRING 11
85 #define FC_MEM_LISTBUCK 12
86 #define FC_MEM_STRSET 13
87 #define FC_MEM_STRLIST 14
88 #define FC_MEM_CONFIG 15
89 #define FC_MEM_LANGSET 16
90 #define FC_MEM_ATOMIC 17
91 #define FC_MEM_BLANKS 18
92 #define FC_MEM_CACHE 19
93 #define FC_MEM_STRBUF 20
94 #define FC_MEM_SUBST 21
95 #define FC_MEM_OBJECTTYPE 22
96 #define FC_MEM_CONSTANT 23
97 #define FC_MEM_TEST 24
98 #define FC_MEM_EXPR 25
99 #define FC_MEM_VSTACK 26
100 #define FC_MEM_ATTR 27
101 #define FC_MEM_PSTACK 28
102
103 #define FC_MEM_NUM 29
104
105 typedef enum _FcValueBinding {
106 FcValueBindingWeak, FcValueBindingStrong, FcValueBindingSame
107 } FcValueBinding;
108
109 typedef struct _FcValueList {
110 struct _FcValueList *next;
111 FcValue value;
112 FcValueBinding binding;
113 } FcValueList;
114
115 typedef struct _FcPatternElt {
116 const char *object;
117 FcValueList *values;
118 } FcPatternElt;
119
120
121 struct _FcPattern {
122 int num;
123 int size;
124 FcPatternElt *elts;
125 int ref;
126 };
127
128 typedef enum _FcOp {
129 FcOpInteger, FcOpDouble, FcOpString, FcOpMatrix, FcOpBool, FcOpCharSet,
130 FcOpNil,
131 FcOpField, FcOpConst,
132 FcOpAssign, FcOpAssignReplace,
133 FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast,
134 FcOpQuest,
135 FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual, FcOpContains, FcOpNotContains,
136 FcOpLess, FcOpLessEqual, FcOpMore, FcOpMoreEqual,
137 FcOpPlus, FcOpMinus, FcOpTimes, FcOpDivide,
138 FcOpNot, FcOpComma, FcOpFloor, FcOpCeil, FcOpRound, FcOpTrunc,
139 FcOpInvalid
140 } FcOp;
141
142 typedef struct _FcExpr {
143 FcOp op;
144 union {
145 int ival;
146 double dval;
147 FcChar8 *sval;
148 FcMatrix *mval;
149 FcBool bval;
150 FcCharSet *cval;
151 char *field;
152 FcChar8 *constant;
153 struct {
154 struct _FcExpr *left, *right;
155 } tree;
156 } u;
157 } FcExpr;
158
159 typedef enum _FcQual {
160 FcQualAny, FcQualAll, FcQualFirst, FcQualNotFirst
161 } FcQual;
162
163 #define FcMatchDefault ((FcMatchKind) -1)
164
165 typedef struct _FcTest {
166 struct _FcTest *next;
167 FcMatchKind kind;
168 FcQual qual;
169 const char *field;
170 FcOp op;
171 FcExpr *expr;
172 } FcTest;
173
174 typedef struct _FcEdit {
175 struct _FcEdit *next;
176 const char *field;
177 FcOp op;
178 FcExpr *expr;
179 FcValueBinding binding;
180 } FcEdit;
181
182 typedef struct _FcSubst {
183 struct _FcSubst *next;
184 FcTest *test;
185 FcEdit *edit;
186 } FcSubst;
187
188 typedef struct _FcCharLeaf {
189 FcChar32 map[256/32];
190 } FcCharLeaf;
191
192 #define FC_REF_CONSTANT -1
193
194 struct _FcCharSet {
195 int ref; /* reference count */
196 int num; /* size of leaves and numbers arrays */
197 FcCharLeaf **leaves;
198 FcChar16 *numbers;
199 };
200
201 struct _FcStrSet {
202 int ref; /* reference count */
203 int num;
204 int size;
205 FcChar8 **strs;
206 };
207
208 struct _FcStrList {
209 FcStrSet *set;
210 int n;
211 };
212
213 typedef struct _FcStrBuf {
214 FcChar8 *buf;
215 FcBool allocated;
216 FcBool failed;
217 int len;
218 int size;
219 } FcStrBuf;
220
221 /*
222 * To map adobe glyph names to unicode values, a precomputed hash
223 * table is used
224 */
225
226 typedef struct _FcGlyphName {
227 FcChar32 ucs; /* unicode value */
228 FcChar8 name[1]; /* name extends beyond struct */
229 } FcGlyphName;
230
231 /*
232 * The per-user ~/.fonts.cache-<version> file is loaded into
233 * this data structure. Each directory gets a substructure
234 * which is validated by comparing the directory timestamp with
235 * that saved in the cache. When valid, the entire directory cache
236 * can be immediately loaded without reading the directory. Otherwise,
237 * the files are checked individually; updated files are loaded into the
238 * cache which is then rewritten to the users home directory
239 */
240
241 #define FC_GLOBAL_CACHE_DIR_HASH_SIZE 37
242 #define FC_GLOBAL_CACHE_FILE_HASH_SIZE 67
243
244 typedef struct _FcGlobalCacheInfo {
245 unsigned int hash;
246 FcChar8 *file;
247 time_t time;
248 FcBool referenced;
249 } FcGlobalCacheInfo;
250
251 typedef struct _FcGlobalCacheFile {
252 struct _FcGlobalCacheFile *next;
253 FcGlobalCacheInfo info;
254 int id;
255 FcChar8 *name;
256 } FcGlobalCacheFile;
257
258 typedef struct _FcGlobalCacheDir FcGlobalCacheDir;
259
260 typedef struct _FcGlobalCacheSubdir {
261 struct _FcGlobalCacheSubdir *next;
262 FcGlobalCacheDir *ent;
263 } FcGlobalCacheSubdir;
264
265 struct _FcGlobalCacheDir {
266 struct _FcGlobalCacheDir *next;
267 FcGlobalCacheInfo info;
268 int len;
269 FcGlobalCacheFile *ents[FC_GLOBAL_CACHE_FILE_HASH_SIZE];
270 FcGlobalCacheSubdir *subdirs;
271 };
272
273 typedef struct _FcGlobalCache {
274 FcGlobalCacheDir *ents[FC_GLOBAL_CACHE_DIR_HASH_SIZE];
275 FcBool updated;
276 FcBool broken;
277 int entries;
278 int referenced;
279 } FcGlobalCache;
280
281 struct _FcAtomic {
282 FcChar8 *file; /* original file name */
283 FcChar8 *new; /* temp file name -- write data here */
284 FcChar8 *lck; /* lockfile name (used for locking) */
285 FcChar8 *tmp; /* tmpfile name (used for locking) */
286 };
287
288 struct _FcBlanks {
289 int nblank;
290 int sblank;
291 FcChar32 *blanks;
292 };
293
294 struct _FcConfig {
295 /*
296 * File names loaded from the configuration -- saved here as the
297 * cache file must be consulted before the directories are scanned,
298 * and those directives may occur in any order
299 */
300 FcStrSet *configDirs; /* directories to scan for fonts */
301 FcChar8 *cache; /* name of per-user cache file */
302 /*
303 * Set of allowed blank chars -- used to
304 * trim fonts of bogus glyphs
305 */
306 FcBlanks *blanks;
307 /*
308 * List of directories containing fonts,
309 * built by recursively scanning the set
310 * of configured directories
311 */
312 FcStrSet *fontDirs;
313 /*
314 * Names of all of the configuration files used
315 * to create this configuration
316 */
317 FcStrSet *configFiles; /* config files loaded */
318 /*
319 * Substitution instructions for patterns and fonts;
320 * maxObjects is used to allocate appropriate intermediate storage
321 * while performing a whole set of substitutions
322 */
323 FcSubst *substPattern; /* substitutions for patterns */
324 FcSubst *substFont; /* substitutions for fonts */
325 int maxObjects; /* maximum number of tests in all substs */
326 /*
327 * The set of fonts loaded from the listed directories; the
328 * order within the set does not determine the font selection,
329 * except in the case of identical matches in which case earlier fonts
330 * match preferrentially
331 */
332 FcFontSet *fonts[FcSetApplication + 1];
333 /*
334 * Fontconfig can periodically rescan the system configuration
335 * and font directories. This rescanning occurs when font
336 * listing requests are made, but no more often than rescanInterval
337 * seconds apart.
338 */
339 time_t rescanTime; /* last time information was scanned */
340 int rescanInterval; /* interval between scans */
341 };
342
343 extern FcConfig *_fcConfig;
344
345 typedef struct _FcCharMap FcCharMap;
346
347 /* fcblanks.c */
348
349 /* fccache.c */
350
351 FcGlobalCache *
352 FcGlobalCacheCreate (void);
353
354 void
355 FcGlobalCacheDestroy (FcGlobalCache *cache);
356
357 FcBool
358 FcGlobalCacheCheckTime (const FcChar8*file, FcGlobalCacheInfo *info);
359
360 void
361 FcGlobalCacheReferenced (FcGlobalCache *cache,
362 FcGlobalCacheInfo *info);
363
364 void
365 FcGlobalCacheReferenceSubdir (FcGlobalCache *cache,
366 const FcChar8 *dir);
367
368 FcGlobalCacheDir *
369 FcGlobalCacheDirGet (FcGlobalCache *cache,
370 const FcChar8 *dir,
371 int len,
372 FcBool create_missing);
373
374 FcBool
375 FcGlobalCacheScanDir (FcFontSet *set,
376 FcStrSet *dirs,
377 FcGlobalCache *cache,
378 const FcChar8 *dir);
379
380 FcGlobalCacheFile *
381 FcGlobalCacheFileGet (FcGlobalCache *cache,
382 const FcChar8 *file,
383 int id,
384 int *count);
385
386
387 void
388 FcGlobalCacheLoad (FcGlobalCache *cache,
389 const FcChar8 *cache_file);
390
391 FcBool
392 FcGlobalCacheUpdate (FcGlobalCache *cache,
393 const FcChar8 *file,
394 int id,
395 const FcChar8 *name);
396
397 FcBool
398 FcGlobalCacheSave (FcGlobalCache *cache,
399 const FcChar8 *cache_file);
400
401 FcBool
402 FcDirCacheReadDir (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir);
403
404 FcBool
405 FcDirCacheWriteDir (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir);
406
407 /* fccfg.c */
408
409 FcBool
410 FcConfigAddConfigDir (FcConfig *config,
411 const FcChar8 *d);
412
413 FcBool
414 FcConfigAddFontDir (FcConfig *config,
415 const FcChar8 *d);
416
417 FcBool
418 FcConfigAddDir (FcConfig *config,
419 const FcChar8 *d);
420
421 FcBool
422 FcConfigAddConfigFile (FcConfig *config,
423 const FcChar8 *f);
424
425 FcBool
426 FcConfigSetCache (FcConfig *config,
427 const FcChar8 *c);
428
429 FcBool
430 FcConfigAddBlank (FcConfig *config,
431 FcChar32 blank);
432
433 FcBool
434 FcConfigAddEdit (FcConfig *config,
435 FcTest *test,
436 FcEdit *edit,
437 FcMatchKind kind);
438
439 void
440 FcConfigSetFonts (FcConfig *config,
441 FcFontSet *fonts,
442 FcSetName set);
443
444 FcBool
445 FcConfigCompareValue (const FcValue m,
446 FcOp op,
447 const FcValue v);
448
449 /* fccharset.c */
450 FcCharSet *
451 FcCharSetFreeze (FcCharSet *cs);
452
453 FcBool
454 FcNameUnparseCharSet (FcStrBuf *buf, const FcCharSet *c);
455
456 FcCharSet *
457 FcNameParseCharSet (FcChar8 *string);
458
459 FcCharLeaf *
460 FcCharSetFindLeafCreate (FcCharSet *fcs, FcChar32 ucs4);
461
462 /* fcdbg.c */
463 void
464 FcValueListPrint (const FcValueList *l);
465
466 void
467 FcLangSetPrint (const FcLangSet *ls);
468
469 void
470 FcOpPrint (FcOp op);
471
472 void
473 FcTestPrint (const FcTest *test);
474
475 void
476 FcExprPrint (const FcExpr *expr);
477
478 void
479 FcEditPrint (const FcEdit *edit);
480
481 void
482 FcSubstPrint (const FcSubst *subst);
483
484 int
485 FcDebug (void);
486
487 /* fcdir.c */
488
489 /* fcfont.c */
490 int
491 FcFontDebug (void);
492
493 /* fcfreetype.c */
494 FcBool
495 FcFreeTypeIsExclusiveLang (const FcChar8 *lang);
496
497 FcBool
498 FcFreeTypeHasLang (FcPattern *pattern, const FcChar8 *lang);
499
500 FcChar32
501 FcFreeTypeUcs4ToPrivate (FcChar32 ucs4, const FcCharMap *map);
502
503 FcChar32
504 FcFreeTypePrivateToUcs4 (FcChar32 private, const FcCharMap *map);
505
506 const FcCharMap *
507 FcFreeTypeGetPrivateMap (FT_Encoding encoding);
508
509 /* fcfs.c */
510 /* fcgram.y */
511 int
512 FcConfigparse (void);
513
514 int
515 FcConfigwrap (void);
516
517 void
518 FcConfigerror (char *fmt, ...);
519
520 char *
521 FcConfigSaveField (const char *field);
522
523 FcTest *
524 FcTestCreate (FcMatchKind kind,
525 FcQual qual,
526 const FcChar8 *field,
527 FcOp compare,
528 FcExpr *expr);
529
530 void
531 FcTestDestroy (FcTest *test);
532
533 FcExpr *
534 FcExprCreateInteger (int i);
535
536 FcExpr *
537 FcExprCreateDouble (double d);
538
539 FcExpr *
540 FcExprCreateString (const FcChar8 *s);
541
542 FcExpr *
543 FcExprCreateMatrix (const FcMatrix *m);
544
545 FcExpr *
546 FcExprCreateBool (FcBool b);
547
548 FcExpr *
549 FcExprCreateNil (void);
550
551 FcExpr *
552 FcExprCreateField (const char *field);
553
554 FcExpr *
555 FcExprCreateConst (const FcChar8 *constant);
556
557 FcExpr *
558 FcExprCreateOp (FcExpr *left, FcOp op, FcExpr *right);
559
560 void
561 FcExprDestroy (FcExpr *e);
562
563 FcEdit *
564 FcEditCreate (const char *field, FcOp op, FcExpr *expr, FcValueBinding binding);
565
566 void
567 FcEditDestroy (FcEdit *e);
568
569 /* fcinit.c */
570
571 void
572 FcMemReport (void);
573
574 void
575 FcMemAlloc (int kind, int size);
576
577 void
578 FcMemFree (int kind, int size);
579
580 /* fclang.c */
581 FcLangSet *
582 FcFreeTypeLangSet (const FcCharSet *charset,
583 const FcChar8 *exclusiveLang);
584
585 FcLangResult
586 FcLangCompare (const FcChar8 *s1, const FcChar8 *s2);
587
588 const FcCharSet *
589 FcCharSetForLang (const FcChar8 *lang);
590
591 FcLangSet *
592 FcLangSetPromote (const FcChar8 *lang);
593
594 FcLangSet *
595 FcNameParseLangSet (const FcChar8 *string);
596
597 FcBool
598 FcNameUnparseLangSet (FcStrBuf *buf, const FcLangSet *ls);
599
600 /* fclist.c */
601
602 /* fcmatch.c */
603
604 /* fcname.c */
605
606 FcBool
607 FcNameBool (FcChar8 *v, FcBool *result);
608
609 /* fcpat.c */
610 void
611 FcValueListDestroy (FcValueList *l);
612
613 FcPatternElt *
614 FcPatternFindElt (const FcPattern *p, const char *object);
615
616 FcPatternElt *
617 FcPatternInsertElt (FcPattern *p, const char *object);
618
619 FcBool
620 FcPatternAddWithBinding (FcPattern *p,
621 const char *object,
622 FcValue value,
623 FcValueBinding binding,
624 FcBool append);
625
626 FcPattern *
627 FcPatternFreeze (FcPattern *p);
628
629 /* fcrender.c */
630
631 /* fcmatrix.c */
632
633 extern const FcMatrix FcIdentityMatrix;
634
635 void
636 FcMatrixFree (FcMatrix *mat);
637
638 /* fcstr.c */
639 FcChar8 *
640 FcStrPlus (const FcChar8 *s1, const FcChar8 *s2);
641
642 void
643 FcStrFree (FcChar8 *s);
644
645 void
646 FcStrBufInit (FcStrBuf *buf, FcChar8 *init, int size);
647
648 void
649 FcStrBufDestroy (FcStrBuf *buf);
650
651 FcChar8 *
652 FcStrBufDone (FcStrBuf *buf);
653
654 FcBool
655 FcStrBufChar (FcStrBuf *buf, FcChar8 c);
656
657 FcBool
658 FcStrBufString (FcStrBuf *buf, const FcChar8 *s);
659
660 FcBool
661 FcStrBufData (FcStrBuf *buf, const FcChar8 *s, int len);
662
663 int
664 FcStrCmpIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
665
666 const FcChar8 *
667 FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
668
669 const FcChar8 *
670 FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
671
672 FcBool
673 FcStrUsesHome (const FcChar8 *s);
674
675 FcChar8 *
676 FcStrLastSlash (const FcChar8 *path);
677
678 #endif /* _FC_INT_H_ */