OSDN Git Service

* gcc.c-torture/compile/20080625-1.c: Skip for M32C.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.c-torture / compile / 920428-2.c
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 }