1/***********************************************************
2Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
3
4                        All Rights Reserved
5
6Permission to use, copy, modify, and distribute this software and its
7documentation for any purpose and without fee is hereby granted,
8provided that the above copyright notice appear in all copies and that
9both that copyright notice and this permission notice appear in
10supporting documentation, and that the name of Digital not be
11used in advertising or publicity pertaining to distribution of the
12software without specific, written prior permission.
13
14DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20SOFTWARE.
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
41typedef struct _FontProp {
42    long        name;
43    long        value;		/* assumes ATOM is not larger than INT32 */
44}           FontPropRec;
45
46typedef struct _FontResolution {
47    unsigned short x_resolution;
48    unsigned short y_resolution;
49    unsigned short point_size;
50}           FontResolutionRec;
51
52typedef 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
63typedef 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
73typedef 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
102typedef 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
139typedef struct _FontNames {
140    int         nnames;
141    int         size;
142    int        *length;
143    char      **names;
144}           FontNamesRec;
145
146
147/* External view of font paths */
148typedef 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
159typedef Bool (*NameCheckFunc) (const char *name);
160typedef int (*InitFpeFunc) (FontPathElementPtr fpe);
161typedef int (*FreeFpeFunc) (FontPathElementPtr fpe);
162typedef int (*ResetFpeFunc) (FontPathElementPtr fpe);
163typedef 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);
174typedef void (*CloseFontFunc) (FontPathElementPtr fpe, FontPtr pFont);
175typedef int (*ListFontsFunc) (void *client,
176			      FontPathElementPtr fpe,
177			      const char* pat,
178			      int len,
179			      int max,
180			      FontNamesPtr names);
181
182typedef int (*StartLfwiFunc) (void *client,
183			      FontPathElementPtr fpe,
184			      const char* pat,
185			      int len,
186			      int max,
187			      void ** privatep);
188
189typedef int (*NextLfwiFunc) (void *client,
190			     FontPathElementPtr fpe,
191			     char** name,
192			     int* namelen,
193			     FontInfoPtr* info,
194			     int* numFonts,
195			     void *private);
196
197typedef int (*WakeupFpeFunc) (FontPathElementPtr fpe,
198			      unsigned long* LastSelectMask);
199
200typedef void (*ClientDiedFunc) (void *client,
201			       FontPathElementPtr fpe);
202
203typedef int (*LoadGlyphsFunc) (void *client,
204			       FontPtr pfont,
205			       Bool range_flag,
206			       unsigned int nchars,
207			       int item_size,
208			       unsigned char* data);
209
210typedef int (*StartLaFunc) (void *client,
211			    FontPathElementPtr fpe,
212			    const char* pat,
213			    int len,
214			    int max,
215			    void ** privatep);
216
217typedef int (*NextLaFunc) (void *client,
218			   FontPathElementPtr fpe,
219			   char** namep,
220			   int* namelenp,
221			   char** resolvedp,
222			   int* resolvedlenp,
223			   void *private);
224
225typedef void (*SetPathFunc)(void);
226
227typedef 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