1 |
297 |
jeremybenn |
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 __SIZE_TYPE__ 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 |
|
|
}
|