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