1 double sin(double x); 2 double cos(double x); 3 double tan(double x); 4 double asin(double x); 5 double acos(double x); 6 double atan(double x); 7 double atan2(double y, double x); 8 double sinh(double x); 9 double cosh(double x); 10 double tanh(double x); 11 double exp(double x); 12 double expm1(double x); 13 double log(double x); 14 double log10(double x); 15 double log1p(double x); 16 double pow(double x, double y); 17 double sqrt(double x); 18 double cbrt(double x); 19 double ceil(double x); 20 double floor(double x); 21 double fabs(double x); 22 double frexp(double value, int *eptr); 23 double ldexp(double value, int exp); 24 double modf(double value, double *iptr); 25 double erf(double x); 26 double erfc(double x); 27 double atof(const char *nptr); 28 double hypot(double x, double y); 29 double lgamma(double x); 30 double j0(double x); 31 double j1(double x); 32 double jn(int n, double x); 33 double y0(double x); 34 double y1(double x); 35 double yn(int n, double x); 36 extern struct _iobuf { 37 int _cnt; 38 char *_ptr; 39 char *_base; 40 int _bufsiz; 41 short _flag; 42 char _file; 43 } _iob[]; 44 typedef unsigned long size_t; 45 typedef char *va_list; 46 struct _iobuf *fopen(const char *filename, const char *type); 47 struct _iobuf *freopen(const char *filename, const char *type, struct _iobuf *stream); 48 struct _iobuf *fdopen(int fildes, const char *type); 49 struct _iobuf *popen(const char *command, const char *type); 50 int pclose(struct _iobuf *stream); 51 int fflush(struct _iobuf *stream); 52 int fclose(struct _iobuf *stream); 53 int remove(const char *path); 54 int rename(const char *from, const char *to); 55 struct _iobuf *tmpfile(void); 56 char *tmpnam(char *s); 57 int setvbuf(struct _iobuf *iop, char *buf, int type, size_t size); 58 int setbuf(struct _iobuf *stream, char *buf); 59 int setbuffer(struct _iobuf *stream, char *buf, size_t size); 60 int setlinebuf(struct _iobuf *stream); 61 int fprintf(struct _iobuf *stream, const char *format, ...); 62 int printf(const char *format, ...); 63 char *sprintf(char *s, const char *format, ...); 64 int vfprintf(struct _iobuf *stream, const char *format, va_list arg); 65 int vprintf(const char *format, va_list arg); 66 int vsprintf(char *s, const char *format, va_list arg); 67 int fscanf(struct _iobuf *stream, const char *format, ...); 68 int scanf(const char *format, ...); 69 int sscanf(char *s, const char *format, ...); 70 int fgetc(struct _iobuf *stream); 71 int getw(struct _iobuf *stream); 72 char *fgets(char *s, int n, struct _iobuf *stream); 73 char *gets(char *s); 74 int fputc(int c, struct _iobuf *stream); 75 int putw(int w, struct _iobuf *stream); 76 int fputs(const char *s, struct _iobuf *stream); 77 int puts(const char *s); 78 int ungetc(int c, struct _iobuf *stream); 79 int fread(void *ptr, size_t size, size_t count, struct _iobuf *iop); 80 int fwrite(const void *ptr, size_t size, size_t count, struct _iobuf *iop); 81 int fseek(struct _iobuf *stream, long offset, int ptrname); 82 long ftell(struct _iobuf *stream); 83 void rewind(struct _iobuf *stream); 84 int fgetpos(struct _iobuf *stream, long *pos); 85 int fsetpos(struct _iobuf *stream, const long *pos); 86 void perror(const char *s); 87 typedef unsigned char byte; 88 typedef unsigned char uchar; 89 typedef unsigned short ushort; 90 typedef unsigned int uint; 91 typedef unsigned long ulong; 92 typedef unsigned char u_char; 93 typedef unsigned short u_short; 94 typedef unsigned int u_int; 95 typedef unsigned long u_long; 96 typedef unsigned short ushort_; 97 typedef struct _physadr { int r[1]; } *physadr; 98 typedef struct label_t { 99 int val[11]; 100 } label_t; 101 typedef struct _quad { long val[2]; } quad; 102 typedef long daddr_t; 103 typedef char * caddr_t; 104 typedef u_long ino_t; 105 typedef long swblk_t; 106 typedef long time_t; 107 typedef short dev_t; 108 typedef long off_t; 109 typedef u_short uid_t; 110 typedef u_short gid_t; 111 typedef signed char prio_t; 112 typedef long fd_mask; 113 typedef struct fd_set { 114 fd_mask fds_bits[(((256 )+(( (sizeof(fd_mask) * 8 ) )-1))/( (sizeof(fd_mask) * 8 ) )) ]; 115 } fd_set; 116 typedef struct qhdr { 117 struct qhdr *link, *rlink; 118 } *queue_t; 119 typedef char *ptr_ord_t; 120 typedef double floatp; 121 typedef char *(*proc_alloc_t)(unsigned num_elements, unsigned element_size, const char *client_name ); 122 typedef void (*proc_free_t)(char *data, unsigned num_elements, unsigned element_size, const char *client_name ); 123 extern struct _iobuf *gs_out; 124 typedef struct gs_point_s { 125 double x, y; 126 } gs_point; 127 typedef struct gs_int_point_s { 128 int x, y; 129 } gs_int_point; 130 typedef struct gs_rect_s { 131 gs_point p, q; 132 } gs_rect; 133 typedef struct gs_int_rect_s { 134 gs_int_point p, q; 135 } gs_int_rect; 136 typedef struct gs_state_s gs_state; 137 typedef struct { 138 proc_alloc_t alloc; 139 proc_free_t free; 140 } gs_memory_procs; 141 char *gs_malloc(uint, uint, const char * ); 142 void gs_free(char *, uint, uint, const char * ); 143 extern char gs_debug[128]; 144 extern int gs_log_error(int, const char *, int ); 145 typedef long fixed; 146 typedef struct gs_fixed_point_s { 147 fixed x, y; 148 } gs_fixed_point; 149 typedef struct gs_fixed_rect_s { 150 gs_fixed_point p, q; 151 } gs_fixed_rect; 152 typedef struct gs_matrix_s { 153 long _xx; float xx; long _xy; float xy; long _yx; float yx; long _yy; float yy; long _tx; float tx; long _ty; float ty; 154 } gs_matrix; 155 void gs_make_identity(gs_matrix * ); 156 int gs_make_translation(floatp, floatp, gs_matrix * ), 157 gs_make_scaling(floatp, floatp, gs_matrix * ), 158 gs_make_rotation(floatp, gs_matrix * ); 159 int gs_matrix_multiply(const gs_matrix *, const gs_matrix *, gs_matrix * ), 160 gs_matrix_invert(const gs_matrix *, gs_matrix * ), 161 gs_matrix_rotate(const gs_matrix *, floatp, gs_matrix * ); 162 int gs_point_transform(floatp, floatp, const gs_matrix *, gs_point * ), 163 gs_point_transform_inverse(floatp, floatp, const gs_matrix *, gs_point * ), 164 gs_distance_transform(floatp, floatp, const gs_matrix *, gs_point * ), 165 gs_distance_transform_inverse(floatp, floatp, const gs_matrix *, gs_point * ), 166 gs_bbox_transform_inverse(gs_rect *, gs_matrix *, gs_rect * ); 167 typedef struct gs_matrix_fixed_s { 168 long _xx; float xx; long _xy; float xy; long _yx; float yx; long _yy; float yy; long _tx; float tx; long _ty; float ty; 169 fixed tx_fixed, ty_fixed; 170 } gs_matrix_fixed; 171 extern void gs_update_matrix_fixed(gs_matrix_fixed * ); 172 int gs_point_transform2fixed(gs_matrix_fixed *, floatp, floatp, gs_fixed_point * ), 173 gs_distance_transform2fixed(gs_matrix_fixed *, floatp, floatp, gs_fixed_point * ); 174 typedef struct { 175 long xx, xy, yx, yy; 176 int skewed; 177 int shift; 178 int max_bits; 179 fixed round; 180 } fixed_coeff; 181 182 typedef enum { 183 gs_cap_butt = 0, 184 gs_cap_round = 1, 185 gs_cap_square = 2 186 } gs_line_cap; 187 typedef enum { 188 gs_join_miter = 0, 189 gs_join_round = 1, 190 gs_join_bevel = 2 191 } gs_line_join; 192 gs_state *gs_state_alloc(proc_alloc_t, proc_free_t ); 193 int gs_state_free(gs_state * ); 194 int gs_gsave(gs_state * ), 195 gs_grestore(gs_state * ), 196 gs_grestoreall(gs_state * ); 197 gs_state *gs_gstate(gs_state * ); 198 int gs_currentgstate(gs_state * , const gs_state * ), 199 gs_setgstate(gs_state * , const gs_state * ); 200 gs_state *gs_state_swap_saved(gs_state *, gs_state * ); 201 void gs_state_swap(gs_state *, gs_state * ); 202 int gs_initgraphics(gs_state * ); 203 typedef struct gx_device_s gx_device; 204 int gs_flushpage(gs_state * ); 205 int gs_copypage(gs_state * ); 206 int gs_output_page(gs_state *, int, int ); 207 int gs_copyscanlines(gx_device *, int, byte *, uint, int *, uint * ); 208 gx_device * gs_getdevice(int ); 209 int gs_copydevice(gx_device **, gx_device *, proc_alloc_t ); 210 int gs_makeimagedevice(gx_device **, gs_matrix *, uint, uint, byte *, int, proc_alloc_t ); 211 void gs_nulldevice(gs_state * ); 212 int gs_setdevice(gs_state *, gx_device * ); 213 gx_device * gs_currentdevice(gs_state * ); 214 const char * gs_devicename(gx_device * ); 215 void gs_deviceinitialmatrix(gx_device *, gs_matrix * ); 216 int gs_closedevice(gx_device * ); 217 int gs_setlinewidth(gs_state *, floatp ); 218 float gs_currentlinewidth(const gs_state * ); 219 int gs_setlinecap(gs_state *, gs_line_cap ); 220 gs_line_cap gs_currentlinecap(const gs_state * ); 221 int gs_setlinejoin(gs_state *, gs_line_join ); 222 gs_line_join gs_currentlinejoin(const gs_state * ); 223 int gs_setmiterlimit(gs_state *, floatp ); 224 float gs_currentmiterlimit(const gs_state * ); 225 int gs_setdash(gs_state *, const float *, uint, floatp ); 226 uint gs_currentdash_length(const gs_state * ); 227 int gs_currentdash_pattern(const gs_state *, float * ); 228 float gs_currentdash_offset(const gs_state * ); 229 int gs_setflat(gs_state *, floatp ); 230 float gs_currentflat(const gs_state * ); 231 int gs_setstrokeadjust(gs_state *, int ); 232 int gs_currentstrokeadjust(const gs_state * ); 233 typedef enum { 234 gs_color_space_DeviceGray = 0, 235 gs_color_space_DeviceRGB, 236 gs_color_space_DeviceCMYK 237 } gs_color_space; 238 typedef struct gs_color_s gs_color; 239 extern const uint gs_color_sizeof; 240 int gs_setgray(gs_state *, floatp ); 241 float gs_currentgray(gs_state * ); 242 int gs_sethsbcolor(gs_state *, floatp, floatp, floatp ), 243 gs_currenthsbcolor(gs_state *, float [3] ), 244 gs_setrgbcolor(gs_state *, floatp, floatp, floatp ), 245 gs_currentrgbcolor(gs_state *, float [3] ); 246 int gs_currentcolorspace(gs_state *, gs_color_space * ); 247 typedef float (*gs_transfer_proc)(gs_state *, floatp ); 248 int gs_settransfer(gs_state *, gs_transfer_proc ), 249 gs_settransfer_remap(gs_state *, gs_transfer_proc, int ); 250 gs_transfer_proc gs_currenttransfer(gs_state * ); 251 int gs_setcolortransfer(gs_state *, gs_transfer_proc , 252 gs_transfer_proc , gs_transfer_proc , 253 gs_transfer_proc ), 254 gs_setcolortransfer_remap(gs_state *, gs_transfer_proc , 255 gs_transfer_proc , gs_transfer_proc , 256 gs_transfer_proc , int ); 257 void gs_currentcolortransfer(gs_state *, gs_transfer_proc [4] ); 258 int gs_setscreen(gs_state *, floatp, floatp, float (*)(floatp, floatp ) ); 259 int gs_currentscreen(gs_state *, float *, float *, float (**)(floatp, floatp ) ); 260 int gs_sethalftonephase(gs_state *, int, int ); 261 int gs_currenthalftonephase(gs_state *, gs_int_point * ); 262 typedef struct gs_screen_enum_s gs_screen_enum; 263 extern const uint gs_screen_enum_sizeof; 264 int gs_screen_init(gs_screen_enum *, gs_state *, floatp, floatp ); 265 int gs_screen_currentpoint(gs_screen_enum *, gs_point * ); 266 int gs_screen_next(gs_screen_enum *, floatp ); 267 struct gs_state_s { 268 gs_state *saved; 269 gs_memory_procs memory_procs; 270 gs_matrix_fixed ctm; 271 gs_matrix ctm_inverse; 272 int inverse_valid; 273 struct gx_path_s *path; 274 struct gx_clip_path_s *clip_path; 275 int clip_rule; 276 struct line_params_s *line_params; 277 struct halftone_params_s *halftone; 278 float (*ht_proc)(floatp, floatp ); 279 gs_int_point ht_phase; 280 gs_int_point phase_mod; 281 struct gs_color_s *color; 282 struct gx_device_color_s *dev_color; 283 struct gx_transfer_s *transfer; 284 struct gs_font_s *font; 285 gs_matrix char_tm; 286 int char_tm_valid; 287 byte in_cachedevice; 288 byte in_charpath; 289 290 291 292 293 int level; 294 float flatness; 295 int stroke_adjust; 296 struct device_s *device; 297 int device_is_shared; 298 299 }; 300 typedef unsigned long gx_bitmap_id; 301 typedef struct gx_bitmap_s { 302 byte *data; 303 int raster; 304 gs_int_point size; 305 gx_bitmap_id id; 306 ushort rep_width, rep_height; 307 } gx_bitmap; 308 typedef unsigned long gx_color_index; 309 typedef unsigned short gx_color_value; 310 typedef struct gx_device_color_info_s { 311 int num_components; 312 313 int depth; 314 gx_color_value max_gray; 315 gx_color_value max_rgb; 316 317 gx_color_value dither_gray; 318 gx_color_value dither_rgb; 319 320 } gx_device_color_info; 321 typedef struct gx_device_procs_s gx_device_procs; 322 struct gx_device_s { 323 int params_size; gx_device_procs *procs; const char *dname; int width; int height; float x_pixels_per_inch; float y_pixels_per_inch; float l_margin, b_margin, r_margin, t_margin; gx_device_color_info color_info; int is_open; 324 }; 325 typedef struct gs_prop_item_s gs_prop_item; 326 struct gx_device_procs_s { 327 int (*open_device)(gx_device *dev ); 328 void (*get_initial_matrix)(gx_device *dev, gs_matrix *pmat ); 329 int (*sync_output)(gx_device *dev ); 330 int (*output_page)(gx_device *dev, int num_copies, int flush ); 331 int (*close_device)(gx_device *dev ); 332 gx_color_index (*map_rgb_color)(gx_device *dev, gx_color_value red, gx_color_value green, gx_color_value blue ); 333 int (*map_color_rgb)(gx_device *dev, gx_color_index color, gx_color_value rgb[3] ); 334 int (*fill_rectangle)(gx_device *dev, int x, int y, int width, int height, gx_color_index color ); 335 int (*tile_rectangle)(gx_device *dev, gx_bitmap *tile, int x, int y, int width, int height, gx_color_index color0, gx_color_index color1, int phase_x, int phase_y ); 336 int (*copy_mono)(gx_device *dev, unsigned char *data, int data_x, int raster, gx_bitmap_id id, int x, int y, int width, int height, gx_color_index color0, gx_color_index color1 ); 337 int (*copy_color)(gx_device *dev, unsigned char *data, int data_x, int raster, gx_bitmap_id id, int x, int y, int width, int height ); 338 int (*draw_line)(gx_device *dev, int x0, int y0, int x1, int y1, gx_color_index color ); 339 int (*get_bits)(gx_device *dev, int y, unsigned char *data, unsigned int size, int pad_to_word ); 340 int (*get_props)(gx_device *dev, gs_prop_item *plist ); 341 342 int (*put_props)(gx_device *dev, gs_prop_item *plist, int count ); 343 344 }; 345 extern unsigned int gx_device_bytes_per_scan_line(gx_device *dev, int pad_to_word ); 346 int gx_default_open_device(gx_device *dev ); 347 void gx_default_get_initial_matrix(gx_device *dev, gs_matrix *pmat ); 348 int gx_default_sync_output(gx_device *dev ); 349 int gx_default_output_page(gx_device *dev, int num_copies, int flush ); 350 int gx_default_close_device(gx_device *dev ); 351 gx_color_index gx_default_map_rgb_color(gx_device *dev, gx_color_value red, gx_color_value green, gx_color_value blue ); 352 int gx_default_map_color_rgb(gx_device *dev, gx_color_index color, gx_color_value rgb[3] ); 353 int gx_default_tile_rectangle(gx_device *dev, gx_bitmap *tile, int x, int y, int width, int height, gx_color_index color0, gx_color_index color1, int phase_x, int phase_y ); 354 int gx_default_copy_color(gx_device *dev, unsigned char *data, int data_x, int raster, gx_bitmap_id id, int x, int y, int width, int height ); 355 int gx_default_draw_line(gx_device *dev, int x0, int y0, int x1, int y1, gx_color_index color ); 356 int gx_default_get_bits(gx_device *dev, int y, unsigned char *data, unsigned int size, int pad_to_word ); 357 int gx_default_get_props(gx_device *dev, gs_prop_item *plist ); 358 int gx_default_put_props(gx_device *dev, gs_prop_item *plist, int count ); 359 typedef struct device_s { 360 gx_device *info; 361 int is_band_device; 362 gx_color_index white, black; 363 } device; 364 int gs_initmatrix(gs_state * ), 365 gs_defaultmatrix(const gs_state *, gs_matrix * ), 366 gs_currentmatrix(const gs_state *, gs_matrix * ), 367 gs_setmatrix(gs_state *, const gs_matrix * ), 368 gs_translate(gs_state *, floatp, floatp ), 369 gs_scale(gs_state *, floatp, floatp ), 370 gs_rotate(gs_state *, floatp ), 371 gs_concat(gs_state *, const gs_matrix * ); 372 int gs_transform(gs_state *, floatp, floatp, gs_point * ), 373 gs_dtransform(gs_state *, floatp, floatp, gs_point * ), 374 gs_itransform(gs_state *, floatp, floatp, gs_point * ), 375 gs_idtransform(gs_state *, floatp, floatp, gs_point * ); 376 static int 377 ctm_set_inverse(gs_state *pgs) 378 { int code = gs_matrix_invert(&*(gs_matrix *)&(pgs)->ctm , &pgs->ctm_inverse); 379 0; 380 if ( code < 0 ) return code; 381 pgs->inverse_valid = 1; 382 return 0; 383 } 384 void 385 gs_update_matrix_fixed(gs_matrix_fixed *pmat) 386 { (*pmat). tx = ((float)(((*pmat). tx_fixed = ((fixed)(((*pmat). tx)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))) , (*pmat). ty = ((float)(((*pmat). ty_fixed = ((fixed)(((*pmat). ty)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))); 387 } 388 int 389 gs_initmatrix(gs_state *pgs) 390 { gx_device *dev = pgs->device->info; 391 (*dev->procs->get_initial_matrix)(dev, &*(gs_matrix *)&(pgs)->ctm ); 392 (pgs->ctm). tx = ((float)(((pgs->ctm). tx_fixed = ((fixed)(((pgs->ctm). tx)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))) , (pgs->ctm). ty = ((float)(((pgs->ctm). ty_fixed = ((fixed)(((pgs->ctm). ty)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))) , pgs->inverse_valid = 0, pgs->char_tm_valid = 0; 393 return 0; 394 } 395 int 396 gs_defaultmatrix(const gs_state *pgs, gs_matrix *pmat) 397 { gx_device *dev = pgs->device->info; 398 (*dev->procs->get_initial_matrix)(dev, pmat); 399 return 0; 400 } 401 int 402 gs_currentmatrix(const gs_state *pgs, gs_matrix *pmat) 403 { *pmat = *(gs_matrix *)&(pgs)->ctm; 404 return 0; 405 } 406 int 407 gs_setmatrix(gs_state *pgs, const gs_matrix *pmat) 408 { *(gs_matrix *)&(pgs)->ctm = *pmat; 409 (pgs->ctm). tx = ((float)(((pgs->ctm). tx_fixed = ((fixed)(((pgs->ctm). tx)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))) , (pgs->ctm). ty = ((float)(((pgs->ctm). ty_fixed = ((fixed)(((pgs->ctm). ty)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))) , pgs->inverse_valid = 0, pgs->char_tm_valid = 0; 410 return 0; 411 } 412 int 413 gs_translate(gs_state *pgs, floatp dx, floatp dy) 414 { gs_point pt; 415 int code; 416 if ( (code = gs_distance_transform(dx, dy, &*(gs_matrix *)&(pgs)->ctm , &pt)) < 0 ) 417 return code; 418 pgs->ctm.tx += pt.x; 419 pgs->ctm.ty += pt.y; 420 (pgs->ctm). tx = ((float)(((pgs->ctm). tx_fixed = ((fixed)(((pgs->ctm). tx)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))) , (pgs->ctm). ty = ((float)(((pgs->ctm). ty_fixed = ((fixed)(((pgs->ctm). ty)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))) , pgs->inverse_valid = 0, pgs->char_tm_valid = 0; 421 return 0; 422 } 423 int 424 gs_scale(gs_state *pgs, floatp sx, floatp sy) 425 { pgs->ctm.xx *= sx; 426 pgs->ctm.xy *= sx; 427 pgs->ctm.yx *= sy; 428 pgs->ctm.yy *= sy; 429 pgs->inverse_valid = 0, pgs->char_tm_valid = 0; 430 return 0; 431 } 432 int 433 gs_rotate(gs_state *pgs, floatp ang) 434 { int code = gs_matrix_rotate(&*(gs_matrix *)&(pgs)->ctm , ang, &*(gs_matrix *)&(pgs)->ctm ); 435 pgs->inverse_valid = 0, pgs->char_tm_valid = 0; 436 return code; 437 } 438 int 439 gs_concat(gs_state *pgs, const gs_matrix *pmat) 440 { int code = gs_matrix_multiply(pmat, &*(gs_matrix *)&(pgs)->ctm , &*(gs_matrix *)&(pgs)->ctm ); 441 (pgs->ctm). tx = ((float)(((pgs->ctm). tx_fixed = ((fixed)(((pgs->ctm). tx)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))) , (pgs->ctm). ty = ((float)(((pgs->ctm). ty_fixed = ((fixed)(((pgs->ctm). ty)*(float)(1<<12 ) )) )*(1.0/(1<<12 ) ))) , pgs->inverse_valid = 0, pgs->char_tm_valid = 0; 442 return code; 443 } 444 int 445 gs_transform(gs_state *pgs, floatp x, floatp y, gs_point *pt) 446 { return gs_point_transform(x, y, &*(gs_matrix *)&(pgs)->ctm , pt); 447 } 448 int 449 gs_dtransform(gs_state *pgs, floatp dx, floatp dy, gs_point *pt) 450 { return gs_distance_transform(dx, dy, &*(gs_matrix *)&(pgs)->ctm , pt); 451 } 452 int 453 gs_itransform(gs_state *pgs, floatp x, floatp y, gs_point *pt) 454 { 455 456 if ( !!(((*(long *)(&((&pgs->ctm)->xy)) | *(long *)(&( (&pgs->ctm)->yx)) ) << 1) == 0) ) 457 { return gs_point_transform_inverse(x, y, &*(gs_matrix *)&(pgs)->ctm , pt); 458 } 459 else 460 { if ( !pgs->inverse_valid ) { int code = ctm_set_inverse(pgs); if ( code < 0 ) return code; }; 461 return gs_point_transform(x, y, &pgs->ctm_inverse, pt); 462 } 463 } 464 int 465 gs_idtransform(gs_state *pgs, floatp dx, floatp dy, gs_point *pt) 466 { 467 468 if ( !!(((*(long *)(&((&pgs->ctm)->xy)) | *(long *)(&( (&pgs->ctm)->yx)) ) << 1) == 0) ) 469 { return gs_distance_transform_inverse(dx, dy, 470 &*(gs_matrix *)&(pgs)->ctm , pt); 471 } 472 else 473 { if ( !pgs->inverse_valid ) { int code = ctm_set_inverse(pgs); if ( code < 0 ) return code; }; 474 return gs_distance_transform(dx, dy, &pgs->ctm_inverse, pt); 475 } 476 } 477 int 478 gs_translate_to_fixed(register gs_state *pgs, fixed px, fixed py) 479 { pgs->ctm.tx = ((float)((pgs->ctm.tx_fixed = px)*(1.0/(1<<12 ) ))); 480 pgs->ctm.ty = ((float)((pgs->ctm.ty_fixed = py)*(1.0/(1<<12 ) ))); 481 pgs->inverse_valid = 0; 482 pgs->char_tm_valid = 1; 483 return 0; 484 } 485 int 486 gx_matrix_to_fixed_coeff(const gs_matrix *pmat, register fixed_coeff *pfc, 487 int max_bits) 488 { gs_matrix ctm; 489 int scale = -10000; 490 int expt, shift; 491 ctm = *pmat; 492 pfc->skewed = 0; 493 if ( !((*(long *)(&(ctm.xx)) << 1) == 0) ) 494 { (void)frexp(ctm.xx, &scale); 495 } 496 if ( !((*(long *)(&(ctm.xy)) << 1) == 0) ) 497 { (void)frexp(ctm.xy, &expt); 498 if ( expt > scale ) scale = expt; 499 pfc->skewed = 1; 500 } 501 if ( !((*(long *)(&(ctm.yx)) << 1) == 0) ) 502 { (void)frexp(ctm.yx, &expt); 503 if ( expt > scale ) scale = expt; 504 pfc->skewed = 1; 505 } 506 if ( !((*(long *)(&(ctm.yy)) << 1) == 0) ) 507 { (void)frexp(ctm.yy, &expt); 508 if ( expt > scale ) scale = expt; 509 } 510 scale = sizeof(long) * 8 - 1 - max_bits - scale; 511 shift = scale - 12; 512 if ( shift > 0 ) 513 { pfc->shift = shift; 514 pfc->round = (fixed)1 << (shift - 1); 515 } 516 else 517 { pfc->shift = 0; 518 pfc->round = 0; 519 scale -= shift; 520 } 521 pfc->xx = (((*(long *)(&(ctm.xx)) << 1) == 0) ? 0 : (long)ldexp(ctm.xx, scale)); 522 pfc->yy = (((*(long *)(&(ctm.yy)) << 1) == 0) ? 0 : (long)ldexp(ctm.yy, scale)); 523 if ( pfc->skewed ) 524 { pfc->xy = (((*(long *)(&(ctm.xy)) << 1) == 0) ? 0 : (long)ldexp(ctm.xy, scale)); 525 pfc->yx = (((*(long *)(&(ctm.yx)) << 1) == 0) ? 0 : (long)ldexp(ctm.yx, scale)); 526 } 527 else 528 pfc->xy = pfc->yx = 0; 529 pfc->max_bits = max_bits; 530 return 0; 531 } 532