xref: /plan9/sys/src/cmd/gs/src/gxxfont.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1992, 1993, 1994, 1996, 2002 Aladdin Enterprises.  All rights reserved.
2 
3   This software is provided AS-IS with no warranty, either express or
4   implied.
5 
6   This software is distributed under license and may not be copied,
7   modified or distributed except as expressly authorized under the terms
8   of the license contained in the file LICENSE in this distribution.
9 
10   For more information about licensing, please refer to
11   http://www.ghostscript.com/licensing/. For information on
12   commercial licensing, go to http://www.artifex.com/licensing/ or
13   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15 */
16 
17 /* $Id: gxxfont.h,v 1.6 2002/06/16 08:45:43 lpd Exp $ */
18 /* External font interface for Ghostscript library */
19 
20 #ifndef gxxfont_INCLUDED
21 #  define gxxfont_INCLUDED
22 
23 #include "gsccode.h"
24 #include "gsmatrix.h"
25 #include "gsuid.h"
26 #include "gsxfont.h"
27 
28 /*
29  *                    Design issues for external fonts
30  *
31  * 1. Where do xfonts come from: a device or a font service?
32  *
33  * 2. Is a given xfont associated with a particular device, or with a
34  *    class of devices, which may have different output media?
35  *    (Specifically, Windows displays vs. printers.)
36  *
37  * 3. Is an xfont a handle that must be interpreted by its originator,
38  *    or an object with its own set of operations?
39  *
40  * 4. Are xfonts always transformation-specific, or is there such a thing
41  *    as a scalable xfont?
42  *
43  * 5. What is the meaning of the transformation matrix supplied when
44  *    asking for an xfont?
45  *
46  *                      Answers (for the current design)
47  *
48  * 1. Devices supply xfonts.  Internal devices (image, null, clipping,
49  *    command list, tracing) forward font requests to a real underlying
50  *    device.  File format devices should do the same, but right now
51  *    they don't.
52  *
53  * 2. An xfont is not associated with anything: it just provides bitmaps.
54  *    Since xfonts are only used at small sizes and low resolutions,
55  *    tuning differences for different output media aren't likely to be
56  *    an issue.
57  *
58  * 3. Xfonts are objects.  They are allocated by their originator, and
59  *    (currently) only freed by `restore'.
60  *
61  * 4. Xfonts are always transformation-specific.  This may lead to some
62  *    clutter, but it's very unlikely that a document will have enough
63  *    different transformed versions of a single font for this to be a
64  *    problem in practice.
65  *
66  * 5. The transformation matrix is the CTM within the BuildChar or BuildGlyph
67  *    procedure.  This maps a 1000x1000 square to the intended character size
68  *    (assuming the base font uses the usual 1000-unit scaling).
69  */
70 
71 /* The definitions for xfonts are very similar to those for devices. */
72 
73 /* Structure for generic xfonts. */
74 typedef struct gx_xfont_common_s {
75     const gx_xfont_procs *procs;
76 } gx_xfont_common;
77 
78 /* A generic xfont. */
79 struct gx_xfont_s {
80     gx_xfont_common common;
81 };
82 
83 /* Definition of xfont procedures. */
84 
85 struct gx_xfont_procs_s {
86 
87     /* Look up a font name, UniqueID, and matrix, and return */
88     /* an xfont. */
89 
90     /* NOTE: even though this is defined as an xfont_proc, */
91     /* it is actually a `factory' procedure, the only one that */
92     /* does not take an xfont * as its first argument. */
93 
94 #define xfont_proc_lookup_font(proc)\
95   gx_xfont *proc(gx_device *dev, const byte *fname, uint len,\
96     int encoding_index, const gs_uid *puid, const gs_matrix *pmat,\
97     gs_memory_t *mem)
98     xfont_proc_lookup_font((*lookup_font));
99 
100     /*
101      * Convert a character name to an xglyph code.  encoding_index is
102      * actually a gs_encoding_index_t.  Either chr or glyph may be absent
103      * (gs_no_char/glyph), but not both.  glyph_name is the glyph's
104      * (string) name if the glyph is not GS_NO_GLYPH and is not a CID.
105      */
106     /*
107      * This procedure was deprecated as of release 3.43, but still
108      * supported.  In release 7.21, the argument list was changed, and the
109      * procedure is no longer deprecated.
110      */
111 
112 #define xfont_proc_char_xglyph(proc)\
113   gx_xglyph proc(gx_xfont *xf, gs_char chr, int encoding_index,\
114     gs_glyph glyph, const gs_const_string *glyph_name)
115     xfont_proc_char_xglyph((*char_xglyph));
116 
117     /* Get the metrics for a character. */
118     /* Note: pwidth changed in release 2.9.7. */
119 
120 #define xfont_proc_char_metrics(proc)\
121   int proc(gx_xfont *xf, gx_xglyph xg, int wmode,\
122     gs_point *pwidth, gs_int_rect *pbbox)
123     xfont_proc_char_metrics((*char_metrics));
124 
125     /* Render a character. */
126     /* (x,y) corresponds to the character origin. */
127     /* The target may be any Ghostscript device. */
128 
129 #define xfont_proc_render_char(proc)\
130   int proc(gx_xfont *xf, gx_xglyph xg, gx_device *target,\
131     int x, int y, gx_color_index color, int required)
132     xfont_proc_render_char((*render_char));
133 
134     /* Release any external resources associated with an xfont. */
135     /* If mprocs is not NULL, also free any storage */
136     /* allocated by lookup_font (including the xfont itself). */
137 
138 #define xfont_proc_release(proc)\
139   int proc(gx_xfont *xf, gs_memory_t *mem)
140     xfont_proc_release((*release));
141 
142     /* (There was a char_xglyph2 procedure here, added in release 3.43, */
143     /* removed in 7.21.) */
144 
145 };
146 
147 /*
148  * Since xfonts are garbage-collectable, they need structure descriptors.
149  * Fortunately, the common part of an xfont contains no pointers to
150  * GC-managed space, so simple xfonts can use gs_private_st_simple.
151  * The following macro will serve for an xfont with only one pointer,
152  * to its device:
153  */
154 #define gs__st_dev_ptrs1(scope_st, stname, stype, sname, penum, preloc, de)\
155   private ENUM_PTRS_WITH(penum, stype *xfptr) return 0;\
156     case 0: ENUM_RETURN(gx_device_enum_ptr((gx_device *)(xfptr->de)));\
157   ENUM_PTRS_END\
158   private RELOC_PTRS_WITH(preloc, stype *xfptr) ;\
159     xfptr->de = (void *)gx_device_reloc_ptr((gx_device *)(xfptr->de), gcst);\
160   RELOC_PTRS_END\
161   gs__st_composite_only(scope_st, stname, stype, sname, penum, preloc)
162 /*
163  * We probably don't ever want xfont descriptors to be public....
164 #define gs_public_st_dev_ptrs1(stname, stype, sname, penum, preloc, de)\
165   gs__st_dev_ptrs1(public_st, stname, stype, sname, penum, preloc, de)
166  */
167 #define gs_private_st_dev_ptrs1(stname, stype, sname, penum, preloc, de)\
168   gs__st_dev_ptrs1(private_st, stname, stype, sname, penum, preloc, de)
169 
170 #endif /* gxxfont_INCLUDED */
171