xref: /plan9-contrib/sys/src/cmd/gs/src/ifapi.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1*593dc095SDavid du Colombier /* Copyright (C) 1991, 2000 Aladdin Enterprises.  All rights reserved.
2*593dc095SDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
5*593dc095SDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
9*593dc095SDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15*593dc095SDavid du Colombier */
16*593dc095SDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: ifapi.h,v 1.19 2004/08/04 19:36:12 stefan Exp $ */
18*593dc095SDavid du Colombier /* Font API interface */
19*593dc095SDavid du Colombier 
20*593dc095SDavid du Colombier #ifndef ifapi_INCLUDED
21*593dc095SDavid du Colombier #  define ifapi_INCLUDED
22*593dc095SDavid du Colombier 
23*593dc095SDavid du Colombier #include "iplugin.h"
24*593dc095SDavid du Colombier 
25*593dc095SDavid du Colombier typedef int FracInt; /* A fractional integer with statically unknown number of fraction bits.
26*593dc095SDavid du Colombier                         The number of bits depends on plugin and is being specified in
27*593dc095SDavid du Colombier                         FAPI_server::frac_shift.
28*593dc095SDavid du Colombier                      */
29*593dc095SDavid du Colombier typedef int FAPI_retcode;
30*593dc095SDavid du Colombier 
31*593dc095SDavid du Colombier typedef enum {
32*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_FontMatrix,
33*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_UniqueID,
34*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_BlueScale,
35*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_Weight,
36*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_ItalicAngle,
37*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_IsFixedPitch,
38*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_UnderLinePosition,
39*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_UnderlineThickness,
40*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_FontType,
41*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_FontBBox,
42*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_BlueValues_count,
43*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_BlueValues,
44*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_OtherBlues_count,
45*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_OtherBlues,
46*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_FamilyBlues_count,
47*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_FamilyBlues,
48*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_FamilyOtherBlues_count,
49*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_FamilyOtherBlues,
50*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_BlueShift,
51*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_BlueFuzz,
52*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_StdHW,
53*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_StdVW,
54*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_StemSnapH_count,
55*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_StemSnapH,
56*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_StemSnapV_count,
57*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_StemSnapV,
58*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_ForceBold,
59*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_LanguageGroup,
60*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_lenIV,
61*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_Subrs_count,
62*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_Subrs_total_size,
63*593dc095SDavid du Colombier     FAPI_FONT_FEATURE_TT_size
64*593dc095SDavid du Colombier } fapi_font_feature;
65*593dc095SDavid du Colombier 
66*593dc095SDavid du Colombier typedef enum {
67*593dc095SDavid du Colombier   FAPI_METRICS_NOTDEF,
68*593dc095SDavid du Colombier   FAPI_METRICS_ADD, /* Add to native glyph width. */
69*593dc095SDavid du Colombier   FAPI_METRICS_REPLACE_WIDTH, /* Replace the native glyph width. */
70*593dc095SDavid du Colombier   FAPI_METRICS_REPLACE /* Replace the native glyph width and lsb. */
71*593dc095SDavid du Colombier } FAPI_metrics_type;
72*593dc095SDavid du Colombier 
73*593dc095SDavid du Colombier typedef struct {
74*593dc095SDavid du Colombier     int char_code;
75*593dc095SDavid du Colombier     bool is_glyph_index; /* true if char_code contains glyph index */
76*593dc095SDavid du Colombier     const unsigned char *char_name; /* to be used exclusively with char_code. */
77*593dc095SDavid du Colombier     unsigned int char_name_length;
78*593dc095SDavid du Colombier     FAPI_metrics_type metrics_type;
79*593dc095SDavid du Colombier     FracInt sb_x, sb_y, aw_x, aw_y; /* replaced PS metrics. */
80*593dc095SDavid du Colombier     int metrics_scale; /* Scale for replaced PS metrics.
81*593dc095SDavid du Colombier 		          Zero means "em box size". */
82*593dc095SDavid du Colombier } FAPI_char_ref;
83*593dc095SDavid du Colombier 
84*593dc095SDavid du Colombier typedef struct FAPI_font_s FAPI_font;
85*593dc095SDavid du Colombier struct FAPI_font_s {
86*593dc095SDavid du Colombier     /* server's data : */
87*593dc095SDavid du Colombier     void *server_font_data;
88*593dc095SDavid du Colombier     bool need_decrypt;
89*593dc095SDavid du Colombier     /* client's data : */
90*593dc095SDavid du Colombier     const gs_memory_t *memory;
91*593dc095SDavid du Colombier     const char *font_file_path;
92*593dc095SDavid du Colombier     int subfont;
93*593dc095SDavid du Colombier     bool is_type1; /* Only for non-disk fonts; dirty for disk fonts. */
94*593dc095SDavid du Colombier     bool is_cid;
95*593dc095SDavid du Colombier     bool is_mtx_skipped; /* Ugly. UFST needs only */
96*593dc095SDavid du Colombier     void *client_ctx_p;
97*593dc095SDavid du Colombier     void *client_font_data;
98*593dc095SDavid du Colombier     void *client_font_data2;
99*593dc095SDavid du Colombier     const void *char_data;
100*593dc095SDavid du Colombier     int char_data_len;
101*593dc095SDavid du Colombier     unsigned short (*get_word )(FAPI_font *ff, fapi_font_feature var_id, int index);
102*593dc095SDavid du Colombier     unsigned long  (*get_long )(FAPI_font *ff, fapi_font_feature var_id, int index);
103*593dc095SDavid du Colombier     float          (*get_float)(FAPI_font *ff, fapi_font_feature var_id, int index);
104*593dc095SDavid du Colombier     unsigned short (*get_subr) (FAPI_font *ff, int index,     byte *buf, ushort buf_length);
105*593dc095SDavid du Colombier     unsigned short (*get_glyph)(FAPI_font *ff, int char_code, byte *buf, ushort buf_length);
106*593dc095SDavid du Colombier     unsigned short (*serialize_tt_font)(FAPI_font *ff, void *buf, int buf_size);
107*593dc095SDavid du Colombier };
108*593dc095SDavid du Colombier 
109*593dc095SDavid du Colombier typedef struct FAPI_path_s FAPI_path;
110*593dc095SDavid du Colombier struct FAPI_path_s {
111*593dc095SDavid du Colombier     void *olh; /* Client's data. */
112*593dc095SDavid du Colombier     int shift;
113*593dc095SDavid du Colombier     int (*moveto   )(FAPI_path *, FracInt, FracInt);
114*593dc095SDavid du Colombier     int (*lineto   )(FAPI_path *, FracInt, FracInt);
115*593dc095SDavid du Colombier     int (*curveto  )(FAPI_path *, FracInt, FracInt, FracInt, FracInt, FracInt, FracInt);
116*593dc095SDavid du Colombier     int (*closepath)(FAPI_path *);
117*593dc095SDavid du Colombier };
118*593dc095SDavid du Colombier 
119*593dc095SDavid du Colombier typedef struct FAPI_font_scale_s {
120*593dc095SDavid du Colombier     FracInt matrix[6];
121*593dc095SDavid du Colombier     FracInt HWResolution[2];
122*593dc095SDavid du Colombier     int subpixels[2];
123*593dc095SDavid du Colombier     bool align_to_pixels;
124*593dc095SDavid du Colombier } FAPI_font_scale;
125*593dc095SDavid du Colombier 
126*593dc095SDavid du Colombier typedef struct FAPI_metrics_s {
127*593dc095SDavid du Colombier     int bbox_x0, bbox_y0, bbox_x1, bbox_y1; /* design units */
128*593dc095SDavid du Colombier     int escapement; /* design units */
129*593dc095SDavid du Colombier     int em_x, em_y; /* design units */
130*593dc095SDavid du Colombier } FAPI_metrics;
131*593dc095SDavid du Colombier 
132*593dc095SDavid du Colombier typedef struct { /* 1bit/pixel only, rows are byte-aligned. */
133*593dc095SDavid du Colombier     void *p;
134*593dc095SDavid du Colombier     int width, height, line_step;
135*593dc095SDavid du Colombier     int orig_x, orig_y; /* origin, 1/16s pixel */
136*593dc095SDavid du Colombier } FAPI_raster;
137*593dc095SDavid du Colombier 
138*593dc095SDavid du Colombier #ifndef FAPI_server_DEFINED
139*593dc095SDavid du Colombier #define FAPI_server_DEFINED
140*593dc095SDavid du Colombier typedef struct FAPI_server_s FAPI_server;
141*593dc095SDavid du Colombier #endif
142*593dc095SDavid du Colombier 
143*593dc095SDavid du Colombier typedef int FAPI_descendant_code; /* Possible values are descendant font indices and 4 ones defined below. */
144*593dc095SDavid du Colombier #define FAPI_DESCENDANT_PREPARED -1 /* See FAPI_prepare_font in zfapi.c . */
145*593dc095SDavid du Colombier #define FAPI_TOPLEVEL_PREPARED -2
146*593dc095SDavid du Colombier #define FAPI_TOPLEVEL_BEGIN -3
147*593dc095SDavid du Colombier #define FAPI_TOPLEVEL_COMPLETE -4
148*593dc095SDavid du Colombier 
149*593dc095SDavid du Colombier struct FAPI_server_s {
150*593dc095SDavid du Colombier     i_plugin_instance ig;
151*593dc095SDavid du Colombier     int frac_shift; /* The number of fractional bits in coordinates. */
152*593dc095SDavid du Colombier     FAPI_retcode (*ensure_open)(FAPI_server *server);
153*593dc095SDavid du Colombier     FAPI_retcode (*get_scaled_font)(FAPI_server *server, FAPI_font *ff, int subfont, const FAPI_font_scale *scale, const char *xlatmap, bool bVertical, FAPI_descendant_code dc);
154*593dc095SDavid du Colombier     FAPI_retcode (*get_decodingID)(FAPI_server *server, FAPI_font *ff, const char **decodingID);
155*593dc095SDavid du Colombier     FAPI_retcode (*get_font_bbox)(FAPI_server *server, FAPI_font *ff, int BBox[4]);
156*593dc095SDavid du Colombier     FAPI_retcode (*get_font_proportional_feature)(FAPI_server *server, FAPI_font *ff, int subfont, bool *bProportional);
157*593dc095SDavid du Colombier     FAPI_retcode (*can_retrieve_char_by_name)(FAPI_server *server, FAPI_font *ff, FAPI_char_ref *c, int *result);
158*593dc095SDavid du Colombier     FAPI_retcode (*can_replace_metrics)(FAPI_server *server, FAPI_font *ff, FAPI_char_ref *c, int *result);
159*593dc095SDavid du Colombier     FAPI_retcode (*get_char_width)(FAPI_server *server, FAPI_font *ff, FAPI_char_ref *c, FAPI_metrics *metrics);
160*593dc095SDavid du Colombier     FAPI_retcode (*get_char_raster_metrics)(FAPI_server *server, FAPI_font *ff, FAPI_char_ref *c, FAPI_metrics *metrics);
161*593dc095SDavid du Colombier     FAPI_retcode (*get_char_raster)(FAPI_server *server, FAPI_raster *r);
162*593dc095SDavid du Colombier     FAPI_retcode (*get_char_outline_metrics)(FAPI_server *server, FAPI_font *ff, FAPI_char_ref *c, FAPI_metrics *metrics);
163*593dc095SDavid du Colombier     FAPI_retcode (*get_char_outline)(FAPI_server *server, FAPI_path *p);
164*593dc095SDavid du Colombier     FAPI_retcode (*release_char_data)(FAPI_server *server);
165*593dc095SDavid du Colombier     FAPI_retcode (*release_typeface)(FAPI_server *server, void *server_font_data);
166*593dc095SDavid du Colombier     /*  Some people get confused with terms "font cache" and "character cache".
167*593dc095SDavid du Colombier         "font cache" means a cache for scaled font objects, which mainly
168*593dc095SDavid du Colombier         keep the font header information and rules for adjusting it to specific raster.
169*593dc095SDavid du Colombier         "character cahce" is a cache for specific character outlines and/or character rasters.
170*593dc095SDavid du Colombier     */
171*593dc095SDavid du Colombier     /*  get_scaled_font opens a typeface with a server and scales it according to CTM and HWResolution.
172*593dc095SDavid du Colombier         This creates a server's scaled font object.
173*593dc095SDavid du Colombier         Since UFST doesn't provide a handle to this object,
174*593dc095SDavid du Colombier         we need to build the data for it and call this function whenever scaled font data may change.
175*593dc095SDavid du Colombier         The server must cache scaled fonts internally.
176*593dc095SDavid du Colombier         Note that FreeType doesn't provide internal font cache,
177*593dc095SDavid du Colombier         so the bridge must do.
178*593dc095SDavid du Colombier     */
179*593dc095SDavid du Colombier     /*  GS cannot provide information when a scaled font to be closed.
180*593dc095SDavid du Colombier         Therefore we don't provide close_scaled_font function in this interface.
181*593dc095SDavid du Colombier         The server must cache scaled fonts, and close ones which were
182*593dc095SDavid du Colombier         not in use during a long time.
183*593dc095SDavid du Colombier     */
184*593dc095SDavid du Colombier     /*  Due to the interpreter fallback with CDevProc,
185*593dc095SDavid du Colombier         get_char_raster_metrics leaves some data kept by the server,
186*593dc095SDavid du Colombier 	so taht get_char_raster uses them and release_char_data releases them.
187*593dc095SDavid du Colombier         Therefore calls from GS to these functions must not
188*593dc095SDavid du Colombier         interfer with different characters.
189*593dc095SDavid du Colombier     */
190*593dc095SDavid du Colombier };
191*593dc095SDavid du Colombier 
192*593dc095SDavid du Colombier 
193*593dc095SDavid du Colombier #endif /* ifapi_INCLUDED */
194