Git init
[framework/uifw/xorg/lib/libxft.git] / src / xftint.h
1 /*
2  * Copyright © 2000 Keith Packard
3  *
4  * Permission to use, copy, modify, distribute, and sell this software and its
5  * documentation for any purpose is hereby granted without fee, provided that
6  * the above copyright notice appear in all copies and that both that
7  * copyright notice and this permission notice appear in supporting
8  * documentation, and that the name of Keith Packard not be used in
9  * advertising or publicity pertaining to distribution of the software without
10  * specific, written prior permission.  Keith Packard makes no
11  * representations about the suitability of this software for any purpose.  It
12  * is provided "as is" without express or implied warranty.
13  *
14  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20  * PERFORMANCE OF THIS SOFTWARE.
21  */
22
23 /*
24  * These definitions are solely for use by the implementation of Xft
25  * and constitute no kind of standard.  If you need any of these functions,
26  * please drop me a note.  Either the library needs new functionality,
27  * or there's a way to do what you need using the existing published
28  * interfaces. keithp@freedesktop.org
29  */
30
31 #ifndef _XFTINT_H_
32 #define _XFTINT_H_
33
34 #ifdef HAVE_CONFIG_H
35 #include "config.h"
36 #else /* X monolithic tree */
37 #define HAVE_STDLIB_H 1  /* assumed since all ANSI C platforms require it */
38 #include <X11/Xosdefs.h> /* get string.h or strings.h as appropriate */
39 #endif
40
41 #include <stdio.h>
42 #if HAVE_STDLIB_H
43 #include <stdlib.h>
44 #endif
45 #if HAVE_STRING_H
46 #include <string.h>
47 #else
48 #if HAVE_STRINGS_H
49 #include <strings.h>
50 #endif
51 #endif
52 #include <ctype.h>
53
54 #include <X11/Xlib.h>
55 #include <X11/Xutil.h>
56 #include <X11/Xmd.h>
57 #include <X11/Xlibint.h>
58 #define _XFT_NO_COMPAT_
59 #include "Xft.h"
60 #include <fontconfig/fcprivate.h>
61 #include <fontconfig/fcfreetype.h>
62
63 /* Added to <X11/Xfuncproto.h> in X11R6.9 and later */
64 #ifndef _X_HIDDEN
65 # define _X_HIDDEN /**/
66 #endif
67 #ifndef _X_EXPORT
68 # define _X_EXPORT /**/
69 #endif
70
71 #ifndef HAVE_CONFIG_H
72 # if (FREETYPE_MAJOR > 2 ||                                                 \
73       (FREETYPE_MAJOR == 2 && (FREETYPE_MINOR > 1 ||                        \
74                                (FREETYPE_MINOR == 1 && FREETYPE_PATCH >= 5))))
75 #  define HAVE_FT_BITMAP_SIZE_Y_PPEM 1
76 # else
77 #  define HAVE_FT_BITMAP_SIZE_Y_PPEM 0
78 # endif
79 #endif
80
81 typedef struct _XftMatcher {
82     char    *object;
83     double  (*compare) (char *object, FcValue value1, FcValue value2);
84 } XftMatcher;
85
86 typedef struct _XftSymbolic {
87     const char  *name;
88     int         value;
89 } XftSymbolic;
90
91 /*
92  * Glyphs are stored in this structure
93  */
94 typedef struct _XftGlyph {
95     XGlyphInfo      metrics;
96     void            *bitmap;
97     unsigned long   glyph_memory;
98 } XftGlyph;
99
100 /*
101  * A hash table translates Unicode values into glyph indicies
102  */
103 typedef struct _XftUcsHash {
104     FcChar32        ucs4;
105     FT_UInt         glyph;
106 } XftUcsHash;
107
108 /*
109  * Many fonts can share the same underlying face data; this
110  * structure references that.  Note that many faces may in fact
111  * live in the same font file; that is irrelevant to this structure
112  * which is concerned only with the individual faces themselves
113  */
114
115 typedef struct _XftFtFile {
116     struct _XftFtFile   *next;
117     int                 ref;        /* number of font infos using this file */
118     
119     char                *file;      /* file name */
120     int                 id;         /* font index within that file */
121
122     FT_F26Dot6          xsize;      /* current xsize setting */
123     FT_F26Dot6          ysize;      /* current ysize setting */
124     FT_Matrix           matrix;     /* current matrix setting */
125     
126     int                 lock;       /* lock count; can't unload unless 0 */
127     FT_Face             face;       /* pointer to face; only valid when lock */
128 } XftFtFile;
129
130 /*
131  * This structure holds the data extracted from a pattern
132  * needed to create a unique font object.
133  */
134
135 struct _XftFontInfo {
136     /*
137      * Hash value (not include in hash value computation)
138      */
139     FcChar32            hash;
140     XftFtFile           *file;          /* face source */
141     /*
142      * Rendering options
143      */
144     FT_F26Dot6          xsize, ysize;   /* pixel size */
145     FcBool              antialias;      /* doing antialiasing */
146     FcBool              embolden;       /* force emboldening */
147     int                 rgba;           /* subpixel order */
148     FT_Matrix           matrix;         /* glyph transformation matrix */
149     FcBool              transform;      /* non-identify matrix? */
150     FT_Int              load_flags;     /* glyph load flags */
151     FcBool              render;         /* whether to use the Render extension */
152     /*
153      * Internal fields
154      */
155     int                 spacing;
156     FcBool              minspace;
157     int                 char_width;
158 };
159
160 /*
161  * Internal version of the font with private data
162  */
163
164 typedef struct _XftFontInt {
165     XftFont             public;         /* public fields */
166     XftFont             *next;          /* all fonts on display */
167     XftFont             *hash_next;     /* fonts in this hash chain */
168     XftFontInfo         info;           /* Data from pattern */
169     int                 ref;            /* reference count */
170     /*
171      * Per-glyph information, indexed by glyph ID
172      * This array follows the font in memory
173      */
174     XftGlyph            **glyphs;
175     int                 num_glyphs;     /* size of glyphs/bitmaps arrays */
176     /*
177      * Hash table to get from Unicode value to glyph ID
178      * This array follows the glyphs in memory
179      */
180     XftUcsHash          *hash_table;
181     int                 hash_value;
182     int                 rehash_value;
183     /*
184      * X specific fields
185      */
186     GlyphSet            glyphset;       /* Render glyphset */
187     XRenderPictFormat   *format;        /* Render format for glyphs */
188     /*
189      * Glyph memory management fields
190      */
191     unsigned long       glyph_memory;
192     unsigned long       max_glyph_memory;
193     FcBool              use_free_glyphs;   /* Use XRenderFreeGlyphs */
194 } XftFontInt;
195
196 typedef enum _XftClipType {
197     XftClipTypeNone, XftClipTypeRegion, XftClipTypeRectangles
198 } XftClipType;
199
200 typedef struct _XftClipRect {
201     int                 xOrigin;
202     int                 yOrigin;
203     int                 n;
204 } XftClipRect;
205
206 #define XftClipRects(cr)    ((XRectangle *) ((cr) + 1))
207
208 typedef union _XftClip {
209     XftClipRect     *rect;
210     Region          region;
211 } XftClip;
212
213 struct _XftDraw {
214     Display         *dpy;
215     int             screen;
216     unsigned int    bits_per_pixel;
217     unsigned int    depth;
218     Drawable        drawable;
219     Visual          *visual;    /* NULL for bitmaps */
220     Colormap        colormap;
221     XftClipType     clip_type;
222     XftClip         clip;
223     int             subwindow_mode;
224     struct {
225         Picture         pict;
226     } render;
227     struct {
228         GC              gc;
229         int             use_pixmap;
230     } core;
231 };
232
233 /*
234  * Instead of taking two round trips for each blending request,
235  * assume that if a particular drawable fails GetImage that it will
236  * fail for a "while"; use temporary pixmaps to avoid the errors
237  */
238
239 #define XFT_ASSUME_PIXMAP       20
240
241 typedef struct _XftSolidColor {
242     XRenderColor    color;
243     int             screen;
244     Picture         pict;
245 } XftSolidColor;
246
247 #define XFT_NUM_SOLID_COLOR     16
248
249 #define XFT_NUM_FONT_HASH       127
250
251 typedef struct _XftDisplayInfo {
252     struct _XftDisplayInfo  *next;
253     Display                 *display;
254     XExtCodes               *codes;
255     FcPattern               *defaults;
256     FcBool                  hasRender;
257     XftFont                 *fonts;
258     XRenderPictFormat       *solidFormat;
259     unsigned long           glyph_memory;
260     unsigned long           max_glyph_memory;
261     FcBool                  use_free_glyphs;
262     int                     num_unref_fonts;
263     int                     max_unref_fonts;
264     XftSolidColor           colors[XFT_NUM_SOLID_COLOR];
265     XftFont                 *fontHash[XFT_NUM_FONT_HASH];
266 } XftDisplayInfo;
267
268 /*
269  * By default, use no more than 4 meg of server memory total, and no
270  * more than 1 meg for any one font
271  */
272 #define XFT_DPY_MAX_GLYPH_MEMORY    (4 * 1024 * 1024)
273 #define XFT_FONT_MAX_GLYPH_MEMORY   (1024 * 1024)
274
275 /*
276  * By default, keep the last 16 unreferenced fonts around to
277  * speed reopening them.  Note that the glyph caching code
278  * will keep the global memory usage reasonably limited
279  */
280 #define XFT_DPY_MAX_UNREF_FONTS     16
281
282 extern XftDisplayInfo   *_XftDisplayInfo;
283
284 #define XFT_DBG_OPEN    1
285 #define XFT_DBG_OPENV   2
286 #define XFT_DBG_RENDER  4
287 #define XFT_DBG_DRAW    8
288 #define XFT_DBG_REF     16
289 #define XFT_DBG_GLYPH   32
290 #define XFT_DBG_GLYPHV  64
291 #define XFT_DBG_CACHE   128
292 #define XFT_DBG_CACHEV  256
293 #define XFT_DBG_MEMORY  512
294
295 #define XFT_MEM_DRAW    0
296 #define XFT_MEM_FONT    1
297 #define XFT_MEM_FILE    2
298 #define XFT_MEM_GLYPH   3
299 #define XFT_MEM_NUM     4
300
301 /* xftcompat.c */
302 void XftFontSetDestroy (FcFontSet *s);
303 FcBool XftMatrixEqual (_Xconst FcMatrix *mat1, _Xconst FcMatrix *mat2);
304 void XftMatrixMultiply (FcMatrix *result, FcMatrix *a, FcMatrix *b);
305 void XftMatrixRotate (FcMatrix *m, double c, double s);
306 void XftMatrixScale (FcMatrix *m, double sx, double sy);
307 void XftMatrixShear (FcMatrix *m, double sh, double sv);
308 FcPattern *XftPatternCreate (void);
309 void XftValueDestroy (FcValue v);
310 void XftPatternDestroy (FcPattern *p);
311 FcBool XftPatternAdd (FcPattern *p, _Xconst char *object, FcValue value, FcBool append);
312 FcBool XftPatternDel (FcPattern *p, _Xconst char *object);
313 FcBool XftPatternAddInteger (FcPattern *p, _Xconst char *object, int i);
314 FcBool XftPatternAddDouble (FcPattern *p, _Xconst char *object, double i);
315 FcBool XftPatternAddMatrix (FcPattern *p, _Xconst char *object, FcMatrix *i);
316 FcBool XftPatternAddString (FcPattern *p, _Xconst char *object, char *i);
317 FcBool XftPatternAddBool (FcPattern *p, _Xconst char *object, FcBool i);
318 FcResult XftPatternGet (FcPattern *p, _Xconst char *object, int id, FcValue *v);
319 FcResult XftPatternGetInteger (FcPattern *p, _Xconst char *object, int id, int *i);
320 FcResult XftPatternGetDouble (FcPattern *p, _Xconst char *object, int id, double *i);
321 FcResult XftPatternGetString (FcPattern *p, _Xconst char *object, int id, char **i);
322 FcResult XftPatternGetMatrix (FcPattern *p, _Xconst char *object, int id, FcMatrix **i);
323 FcResult XftPatternGetBool (FcPattern *p, _Xconst char *object, int id, FcBool *i);
324 FcPattern *XftPatternDuplicate (FcPattern *orig);
325 FcPattern *XftPatternVaBuild (FcPattern *orig, va_list va);
326 FcPattern *XftPatternBuild (FcPattern *orig, ...);
327 FcBool XftNameUnparse (FcPattern *pat, char *dest, int len);
328 FcBool XftGlyphExists (Display *dpy, XftFont *font, FcChar32 ucs4);
329 FcObjectSet *XftObjectSetCreate (void);
330 Bool XftObjectSetAdd (FcObjectSet *os, _Xconst char *object);
331 void XftObjectSetDestroy (FcObjectSet *os);
332 FcObjectSet *XftObjectSetVaBuild (_Xconst char *first, va_list va);
333 FcObjectSet *XftObjectSetBuild (_Xconst char *first, ...);
334 FcFontSet *XftListFontSets (FcFontSet **sets, int nsets, FcPattern *p, FcObjectSet *os);
335
336 /* xftcore.c */
337 void
338 XftRectCore (XftDraw            *draw,
339              _Xconst XftColor   *color,
340              int                x, 
341              int                y,
342              unsigned int       width,
343              unsigned int       height);
344
345 void
346 XftGlyphCore (XftDraw           *draw,
347               _Xconst XftColor  *color,
348               XftFont           *public,
349               int               x,
350               int               y,
351               _Xconst FT_UInt   *glyphs,
352               int               nglyphs);
353
354 void
355 XftGlyphSpecCore (XftDraw               *draw,
356                   _Xconst XftColor      *color,
357                   XftFont               *public,
358                   _Xconst XftGlyphSpec  *glyphs,
359                   int                   nglyphs);
360
361 void
362 XftGlyphFontSpecCore (XftDraw                   *draw,
363                       _Xconst XftColor          *color,
364                       _Xconst XftGlyphFontSpec  *glyphs,
365                       int                       nglyphs);
366
367 /* xftdbg.c */
368 int
369 XftDebug (void);
370
371 /* xftdpy.c */
372 XftDisplayInfo *
373 _XftDisplayInfoGet (Display *dpy, FcBool createIfNecessary);
374
375 void
376 _XftDisplayManageMemory (Display *dpy);
377
378 int
379 XftDefaultParseBool (char *v);
380
381 FcBool
382 XftDefaultGetBool (Display *dpy, const char *object, int screen, FcBool def);
383
384 int
385 XftDefaultGetInteger (Display *dpy, const char *object, int screen, int def);
386
387 double
388 XftDefaultGetDouble (Display *dpy, const char *object, int screen, double def);
389
390 FcFontSet *
391 XftDisplayGetFontSet (Display *dpy);
392
393 /* xftdraw.c */
394 unsigned int
395 XftDrawDepth (XftDraw *draw);
396
397 unsigned int
398 XftDrawBitsPerPixel (XftDraw *draw);
399
400 FcBool
401 XftDrawRenderPrepare (XftDraw   *draw);
402
403 /* xftextent.c */
404     
405 /* xftfont.c */
406
407 /* xftfreetype.c */
408 FcBool
409 _XftSetFace (XftFtFile *f, FT_F26Dot6 xsize, FT_F26Dot6 ysize, FT_Matrix *matrix);
410
411 void
412 XftFontManageMemory (Display *dpy);
413
414 /* xftglyph.c */
415 void
416 _XftFontUncacheGlyph (Display *dpy, XftFont *public);
417
418 void
419 _XftFontManageMemory (Display *dpy, XftFont *public);
420
421 /* xftinit.c */
422 void
423 XftMemReport (void);
424
425 void
426 XftMemAlloc (int kind, int size);
427
428 void
429 XftMemFree (int kind, int size);
430
431 /* xftlist.c */
432 FcFontSet *
433 XftListFontsPatternObjects (Display         *dpy,
434                             int             screen,
435                             FcPattern       *pattern,
436                             FcObjectSet    *os);
437
438 /* xftname.c */
439 void 
440 _XftNameInit (void);
441
442 /* xftrender.c */
443
444 /* xftstr.c */
445 int
446 _XftMatchSymbolic (XftSymbolic *s, int n, const char *name, int def);
447
448 /* xftswap.c */
449 int
450 XftNativeByteOrder (void);
451
452 void
453 XftSwapCARD32 (CARD32 *data, int n);
454
455 void
456 XftSwapCARD24 (CARD8 *data, int width, int height);
457
458 void
459 XftSwapCARD16 (CARD16 *data, int n);
460
461 void
462 XftSwapImage (XImage *image);
463
464 /* xftxlfd.c */
465 #endif /* _XFT_INT_H_ */