Merge branch 'devel/x11' into tizen
[platform/upstream/fontsproto.git] / fontstruct.h
1 /***********************************************************
2 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
3
4                         All Rights Reserved
5
6 Permission to use, copy, modify, and distribute this software and its
7 documentation for any purpose and without fee is hereby granted,
8 provided that the above copyright notice appear in all copies and that
9 both that copyright notice and this permission notice appear in
10 supporting documentation, and that the name of Digital not be
11 used in advertising or publicity pertaining to distribution of the
12 software without specific, written prior permission.
13
14 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20 SOFTWARE.
21
22 ******************************************************************/
23
24 #ifndef FONTSTR_H
25 #define FONTSTR_H
26
27 #include <X11/Xproto.h>
28 #include "font.h"
29 #include <X11/Xfuncproto.h>
30 #include <X11/Xdefs.h>
31
32 /*
33  * This version of the server font data strucutre is only for describing
34  * the in memory data structure. The file structure is not necessarily a
35  * copy of this. That is up to the compiler and the OS layer font loading
36  * machinery.
37  */
38
39 #define GLYPHPADOPTIONS 4       /* 1, 2, 4, or 8 */
40
41 typedef struct _FontProp {
42     long        name;
43     long        value;          /* assumes ATOM is not larger than INT32 */
44 }           FontPropRec;
45
46 typedef struct _FontResolution {
47     unsigned short x_resolution;
48     unsigned short y_resolution;
49     unsigned short point_size;
50 }           FontResolutionRec;
51
52 typedef struct _ExtentInfo {
53     DrawDirection drawDirection;
54     int         fontAscent;
55     int         fontDescent;
56     int         overallAscent;
57     int         overallDescent;
58     int         overallWidth;
59     int         overallLeft;
60     int         overallRight;
61 }           ExtentInfoRec;
62
63 typedef struct _CharInfo {
64     xCharInfo   metrics;        /* info preformatted for Queries */
65     char       *bits;           /* pointer to glyph image */
66 }           CharInfoRec;
67
68 /*
69  * Font is created at font load time. It is specific to a single encoding.
70  * e.g. not all of the glyphs in a font may be part of a single encoding.
71  */
72
73 typedef struct _FontInfo {
74     unsigned short firstCol;
75     unsigned short lastCol;
76     unsigned short firstRow;
77     unsigned short lastRow;
78     unsigned short defaultCh;
79     unsigned int noOverlap:1;
80     unsigned int terminalFont:1;
81     unsigned int constantMetrics:1;
82     unsigned int constantWidth:1;
83     unsigned int inkInside:1;
84     unsigned int inkMetrics:1;
85     unsigned int allExist:1;
86     unsigned int drawDirection:2;
87     unsigned int cachable:1;
88     unsigned int anamorphic:1;
89     short       maxOverlap;
90     short       pad;
91     xCharInfo   maxbounds;
92     xCharInfo   minbounds;
93     xCharInfo   ink_maxbounds;
94     xCharInfo   ink_minbounds;
95     short       fontAscent;
96     short       fontDescent;
97     int         nprops;
98     FontPropPtr props;
99     char       *isStringProp;
100 }           FontInfoRec;
101
102 typedef struct _Font {
103     int         refcnt;
104     FontInfoRec info;
105     char        bit;
106     char        byte;
107     char        glyph;
108     char        scan;
109     fsBitmapFormat format;
110     int         (*get_glyphs) (FontPtr         /* font */,
111                                unsigned long   /* count */,
112                                unsigned char * /* chars */,
113                                FontEncoding    /* encoding */,
114                                unsigned long * /* count */,
115                                CharInfoPtr *   /* glyphs */);
116     int         (*get_metrics) (FontPtr         /* font */,
117                                 unsigned long   /* count */,
118                                 unsigned char * /* chars */,
119                                 FontEncoding    /* encoding */,
120                                 unsigned long * /* count */,
121                                 xCharInfo **    /* glyphs */);
122     void        (*unload_font) (FontPtr         /* font */);
123     void        (*unload_glyphs) (FontPtr         /* font */);
124     FontPathElementPtr fpe;
125     void        *svrPrivate;
126     void        *fontPrivate;
127     void        *fpePrivate;
128     int         maxPrivate;
129     void        **devPrivates;
130 }           FontRec;
131
132 #define FontGetPrivate(pFont,n) ((n) > (pFont)->maxPrivate ? (void *) 0 : \
133                              (pFont)->devPrivates[n])
134
135 #define FontSetPrivate(pFont,n,ptr) ((n) > (pFont)->maxPrivate ? \
136                         _FontSetNewPrivate (pFont, n, ptr) : \
137                         ((((pFont)->devPrivates[n] = (ptr)) != 0) || TRUE))
138
139 typedef struct _FontNames {
140     int         nnames;
141     int         size;
142     int        *length;
143     char      **names;
144 }           FontNamesRec;
145
146
147 /* External view of font paths */
148 typedef struct _FontPathElement {
149     int         name_length;
150 #if FONT_PATH_ELEMENT_NAME_CONST
151     const
152 #endif
153     char        *name;
154     int         type;
155     int         refcount;
156     void        *private;
157 }           FontPathElementRec;
158
159 typedef Bool (*NameCheckFunc) (const char *name);
160 typedef int (*InitFpeFunc) (FontPathElementPtr fpe);
161 typedef int (*FreeFpeFunc) (FontPathElementPtr fpe);
162 typedef int (*ResetFpeFunc) (FontPathElementPtr fpe);
163 typedef int (*OpenFontFunc) ( void *client,
164                               FontPathElementPtr fpe,
165                               Mask flags,
166                               const char* name,
167                               int namelen,
168                               fsBitmapFormat format,
169                               fsBitmapFormatMask fmask,
170                               XID id,
171                               FontPtr* pFont,
172                               char** aliasName,
173                               FontPtr non_cachable_font);
174 typedef void (*CloseFontFunc) (FontPathElementPtr fpe, FontPtr pFont);
175 typedef int (*ListFontsFunc) (void *client,
176                               FontPathElementPtr fpe,
177                               const char* pat,
178                               int len,
179                               int max,
180                               FontNamesPtr names);
181
182 typedef int (*StartLfwiFunc) (void *client,
183                               FontPathElementPtr fpe,
184                               const char* pat,
185                               int len,
186                               int max,
187                               void ** privatep);
188
189 typedef int (*NextLfwiFunc) (void *client,
190                              FontPathElementPtr fpe,
191                              char** name,
192                              int* namelen,
193                              FontInfoPtr* info,
194                              int* numFonts,
195                              void *private);
196
197 typedef int (*WakeupFpeFunc) (FontPathElementPtr fpe,
198                               unsigned long* LastSelectMask);
199
200 typedef void (*ClientDiedFunc) (void *client,
201                                FontPathElementPtr fpe);
202
203 typedef int (*LoadGlyphsFunc) (void *client,
204                                FontPtr pfont,
205                                Bool range_flag,
206                                unsigned int nchars,
207                                int item_size,
208                                unsigned char* data);
209
210 typedef int (*StartLaFunc) (void *client,
211                             FontPathElementPtr fpe,
212                             const char* pat,
213                             int len,
214                             int max,
215                             void ** privatep);
216
217 typedef int (*NextLaFunc) (void *client,
218                            FontPathElementPtr fpe,
219                            char** namep,
220                            int* namelenp,
221                            char** resolvedp,
222                            int* resolvedlenp,
223                            void *private);
224
225 typedef void (*SetPathFunc)(void);
226
227 typedef struct _FPEFunctions {
228     NameCheckFunc       name_check;
229     InitFpeFunc         init_fpe;
230     ResetFpeFunc        reset_fpe;
231     FreeFpeFunc         free_fpe;
232     OpenFontFunc        open_font;
233     CloseFontFunc       close_font;
234     ListFontsFunc       list_fonts;
235     StartLaFunc         start_list_fonts_and_aliases;
236     NextLaFunc          list_next_font_or_alias;
237     StartLfwiFunc       start_list_fonts_with_info;
238     NextLfwiFunc        list_next_font_with_info;
239     WakeupFpeFunc       wakeup_fpe;
240     ClientDiedFunc      client_died;
241                 /* for load_glyphs, range_flag = 0 ->
242                         nchars = # of characters in data
243                         item_size = bytes/char
244                         data = list of characters
245                    range_flag = 1 ->
246                         nchars = # of fsChar2b's in data
247                         item_size is ignored
248                         data = list of fsChar2b's */
249     LoadGlyphsFunc      load_glyphs;
250     SetPathFunc         set_path_hook;
251 } FPEFunctionsRec, FPEFunctions;
252
253 /*
254  * Various macros for computing values based on contents of
255  * the above structures
256  */
257
258 #define GLYPHWIDTHPIXELS(pci) \
259         ((pci)->metrics.rightSideBearing - (pci)->metrics.leftSideBearing)
260
261 #define GLYPHHEIGHTPIXELS(pci) \
262         ((pci)->metrics.ascent + (pci)->metrics.descent)
263
264 #define GLYPHWIDTHBYTES(pci)    (((GLYPHWIDTHPIXELS(pci))+7) >> 3)
265
266 #define GLYPHWIDTHPADDED(bc)    (((bc)+7) & ~0x7)
267
268 #define BYTES_PER_ROW(bits, nbytes) \
269         ((nbytes) == 1 ? (((bits)+7)>>3)        /* pad to 1 byte */ \
270         :(nbytes) == 2 ? ((((bits)+15)>>3)&~1)  /* pad to 2 bytes */ \
271         :(nbytes) == 4 ? ((((bits)+31)>>3)&~3)  /* pad to 4 bytes */ \
272         :(nbytes) == 8 ? ((((bits)+63)>>3)&~7)  /* pad to 8 bytes */ \
273         : 0)
274
275 #define BYTES_FOR_GLYPH(ci,pad) (GLYPHHEIGHTPIXELS(ci) * \
276                                  BYTES_PER_ROW(GLYPHWIDTHPIXELS(ci),pad))
277 /*
278  * Macros for computing different bounding boxes for fonts; from
279  * the font protocol
280  */
281
282 #define FONT_MAX_ASCENT(pi)     ((pi)->fontAscent > (pi)->ink_maxbounds.ascent ? \
283                             (pi)->fontAscent : (pi)->ink_maxbounds.ascent)
284 #define FONT_MAX_DESCENT(pi)    ((pi)->fontDescent > (pi)->ink_maxbounds.descent ? \
285                             (pi)->fontDescent : (pi)->ink_maxbounds.descent)
286 #define FONT_MAX_HEIGHT(pi)     (FONT_MAX_ASCENT(pi) + FONT_MAX_DESCENT(pi))
287 #define FONT_MIN_LEFT(pi)       ((pi)->ink_minbounds.leftSideBearing < 0 ? \
288                             (pi)->ink_minbounds.leftSideBearing : 0)
289 #define FONT_MAX_RIGHT(pi)      ((pi)->ink_maxbounds.rightSideBearing > \
290                                 (pi)->ink_maxbounds.characterWidth ? \
291                             (pi)->ink_maxbounds.rightSideBearing : \
292                                 (pi)->ink_maxbounds.characterWidth)
293 #define FONT_MAX_WIDTH(pi)      (FONT_MAX_RIGHT(pi) - FONT_MIN_LEFT(pi))
294
295 #include "fontproto.h"
296
297 #endif                          /* FONTSTR_H */