1 /* Copyright (C) 1990, 2000, 2001 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: gxtype1.h,v 1.19 2004/09/22 13:52:33 igor Exp $ */ 18 /* Private Adobe Type 1 / Type 2 charstring interpreter definitions */ 19 20 #ifndef gxtype1_INCLUDED 21 # define gxtype1_INCLUDED 22 23 #include "gscrypt1.h" 24 #include "gsgdata.h" 25 #include "gstype1.h" 26 #include "gxhintn.h" 27 28 /* This file defines the structures for the state of a Type 1 / */ 29 /* Type 2 charstring interpreter. */ 30 31 /* 32 * Because of oversampling, one pixel in the Type 1 interpreter may 33 * correspond to several device pixels. This is also true of the hint data, 34 * since the CTM reflects the transformation to the oversampled space. 35 * To help keep the font level hints separated from the character level hints, 36 * we store the scaling factor separately with each set of hints. 37 */ 38 typedef struct pixel_scale_s { 39 fixed unit; /* # of pixels per device pixel */ 40 fixed half; /* unit / 2 */ 41 int log2_unit; /* log2(unit / fixed_1) */ 42 } pixel_scale; 43 typedef struct point_scale_s { 44 pixel_scale x, y; 45 } point_scale; 46 47 #define set_pixel_scale(pps, log2)\ 48 (pps)->unit = ((pps)->half = fixed_half << ((pps)->log2_unit = log2)) << 1 49 #define scaled_rounded(v, pps)\ 50 (((v) + (pps)->half) & -(pps)->unit) 51 52 53 /* 54 * The Type 2 charstring documentation says that the total number of hints 55 * is limited to 96. 56 */ 57 58 #define max_total_stem_hints 96 59 60 /* ------ Interpreter state ------ */ 61 62 /* Define the control state of the interpreter. */ 63 /* This is what must be saved and restored */ 64 /* when calling a CharString subroutine. */ 65 typedef struct { 66 const byte *ip; 67 crypt_state dstate; 68 gs_glyph_data_t cs_data; /* original CharString or Subr, */ 69 /* for GC */ 70 } ip_state_t; 71 72 /* Get the next byte from a CharString. It may or may not be encrypted. */ 73 #define charstring_this(ch, state, encrypted)\ 74 (encrypted ? decrypt_this(ch, state) : ch) 75 #define charstring_next(ch, state, chvar, encrypted)\ 76 (encrypted ? (chvar = decrypt_this(ch, state),\ 77 decrypt_skip_next(ch, state)) :\ 78 (chvar = ch)) 79 #define charstring_skip_next(ch, state, encrypted)\ 80 (encrypted ? decrypt_skip_next(ch, state) : 0) 81 82 #ifndef gx_path_DEFINED 83 # define gx_path_DEFINED 84 typedef struct gx_path_s gx_path; 85 #endif 86 87 #ifndef segment_DEFINED 88 # define segment_DEFINED 89 typedef struct segment_s segment; 90 #endif 91 92 /* This is the full state of the Type 1 interpreter. */ 93 #define ostack_size 48 /* per Type 2 documentation */ 94 #define ipstack_size 10 /* per documentation */ 95 struct gs_type1_state_s { 96 t1_hinter h; 97 /* The following are set at initialization */ 98 gs_font_type1 *pfont; /* font-specific data */ 99 gs_imager_state *pis; /* imager state */ 100 gx_path *path; /* path for appending */ 101 bool no_grid_fitting; 102 int paint_type; /* 0/3 for fill, 1/2 for stroke */ 103 void *callback_data; 104 fixed_coeff fc; /* cached fixed coefficients */ 105 float flatness; /* flatness for character curves */ 106 point_scale scale; /* oversampling scale */ 107 gs_log2_scale_point log2_subpixels; /* log2 of the number of subpixels */ 108 gs_fixed_point origin; /* character origin */ 109 /* The following are updated dynamically */ 110 fixed ostack[ostack_size]; /* the Type 1 operand stack */ 111 int os_count; /* # of occupied stack entries */ 112 ip_state_t ipstack[ipstack_size + 1]; /* control stack */ 113 int ips_count; /* # of occupied entries */ 114 int init_done; /* -1 if not done & not needed, */ 115 /* 0 if not done & needed, 1 if done */ 116 bool sb_set; /* true if lsb is preset */ 117 bool width_set; /* true if width is set (for seac parts) */ 118 /* (Type 2 charstrings only) */ 119 int num_hints; /* number of hints (Type 2 only) */ 120 gs_fixed_point lsb; /* left side bearing (char coords) */ 121 gs_fixed_point width; /* character width (char coords) */ 122 int seac_accent; /* accent character code for seac, or -1 */ 123 fixed save_asb; /* save seac asb */ 124 gs_fixed_point save_lsb; /* save seac accented lsb */ 125 gs_fixed_point save_adxy; /* save seac adx/ady */ 126 fixed asb_diff; /* save_asb - save_lsb.x, */ 127 /* needed to adjust Flex endpoint */ 128 gs_fixed_point adxy; /* seac accent displacement, */ 129 /* needed to adjust currentpoint */ 130 int flex_path_state_flags; /* record whether path was open */ 131 /* at start of Flex section */ 132 #define flex_max 8 133 int flex_count; 134 int ignore_pops; /* # of pops to ignore (after */ 135 /* a known othersubr call) */ 136 /* The following are set dynamically. */ 137 gs_fixed_point vs_offset; /* device space offset for centering */ 138 /* middle stem of vstem3 */ 139 /* of subpath */ 140 fixed transient_array[32]; /* Type 2 transient array, */ 141 /* will be variable-size someday */ 142 }; 143 144 extern_st(st_gs_type1_state); 145 #define public_st_gs_type1_state() /* in gxtype1.c */\ 146 gs_public_st_composite(st_gs_type1_state, gs_type1_state, "gs_type1_state",\ 147 gs_type1_state_enum_ptrs, gs_type1_state_reloc_ptrs) 148 149 /* ------ Shared Type 1 / Type 2 interpreter fragments ------ */ 150 151 /* Define a pointer to the charstring interpreter stack. */ 152 typedef fixed *cs_ptr; 153 154 /* Clear the operand stack. */ 155 /* The cast avoids compiler warning about a "negative subscript." */ 156 #define CLEAR_CSTACK(cstack, csp)\ 157 (csp = (cs_ptr)(cstack) - 1) 158 159 /* Copy the operand stack out of the saved state. */ 160 #define INIT_CSTACK(cstack, csp, pcis)\ 161 BEGIN\ 162 if ( pcis->os_count == 0 )\ 163 CLEAR_CSTACK(cstack, csp);\ 164 else {\ 165 memcpy(cstack, pcis->ostack, pcis->os_count * sizeof(fixed));\ 166 csp = &cstack[pcis->os_count - 1];\ 167 }\ 168 END 169 170 #define CS_CHECK_PUSH(csp, cstack)\ 171 BEGIN\ 172 if (csp >= &cstack[countof(cstack)-1])\ 173 return_error(gs_error_invalidfont);\ 174 END 175 176 /* Decode a 1-byte number. */ 177 #define decode_num1(var, c)\ 178 (var = c_value_num1(c)) 179 #define decode_push_num1(csp, cstack, c)\ 180 BEGIN\ 181 CS_CHECK_PUSH(csp, cstack);\ 182 *++csp = int2fixed(c_value_num1(c));\ 183 END 184 185 /* Decode a 2-byte number. */ 186 #define decode_num2(var, c, cip, state, encrypted)\ 187 BEGIN\ 188 uint c2 = *cip++;\ 189 int cn = charstring_this(c2, state, encrypted);\ 190 \ 191 var = (c < c_neg2_0 ? c_value_pos2(c, 0) + cn :\ 192 c_value_neg2(c, 0) - cn);\ 193 charstring_skip_next(c2, state, encrypted);\ 194 END 195 #define decode_push_num2(csp, cstack, c, cip, state, encrypted)\ 196 BEGIN\ 197 uint c2 = *cip++;\ 198 int cn;\ 199 \ 200 CS_CHECK_PUSH(csp, cstack);\ 201 cn = charstring_this(c2, state, encrypted);\ 202 if ( c < c_neg2_0 )\ 203 { if_debug2('1', "[1] (%d)+%d\n", c_value_pos2(c, 0), cn);\ 204 *++csp = int2fixed(c_value_pos2(c, 0) + (int)cn);\ 205 }\ 206 else\ 207 { if_debug2('1', "[1] (%d)-%d\n", c_value_neg2(c, 0), cn);\ 208 *++csp = int2fixed(c_value_neg2(c, 0) - (int)cn);\ 209 }\ 210 charstring_skip_next(c2, state, encrypted);\ 211 END 212 213 /* Decode a 4-byte number, but don't push it, because Type 1 and Type 2 */ 214 /* charstrings scale it differently. */ 215 #if arch_sizeof_long > 4 216 # define sign_extend_num4(lw)\ 217 lw = (lw ^ 0x80000000L) - 0x80000000L 218 #else 219 # define sign_extend_num4(lw) DO_NOTHING 220 #endif 221 #define decode_num4(lw, cip, state, encrypted)\ 222 BEGIN\ 223 int i;\ 224 uint c4;\ 225 \ 226 lw = 0;\ 227 for ( i = 4; --i >= 0; )\ 228 { charstring_next(*cip, state, c4, encrypted);\ 229 lw = (lw << 8) + c4;\ 230 cip++;\ 231 }\ 232 sign_extend_num4(lw);\ 233 END 234 235 /* ------ Shared Type 1 / Type 2 charstring utilities ------ */ 236 237 void gs_type1_finish_init(gs_type1_state * pcis); 238 239 int gs_type1_sbw(gs_type1_state * pcis, fixed sbx, fixed sby, 240 fixed wx, fixed wy); 241 242 /* blend returns the number of values to pop. */ 243 int gs_type1_blend(gs_type1_state *pcis, fixed *csp, int num_results); 244 245 int gs_type1_seac(gs_type1_state * pcis, const fixed * cstack, 246 fixed asb_diff, ip_state_t * ipsp); 247 248 int gs_type1_endchar(gs_type1_state * pcis); 249 250 /* Get the metrics (l.s.b. and width) from the Type 1 interpreter. */ 251 void type1_cis_get_metrics(const gs_type1_state * pcis, double psbw[4]); 252 253 #endif /* gxtype1_INCLUDED */ 254