Home | History | Annotate | Line # | Download | only in fonts
      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