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 structure 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 */
298