1 /* Copyright (C) 2001-2006 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied, modified
8    or distributed except as expressly authorized under the terms of that
9    license.  Refer to licensing information at http://www.artifex.com/
10    or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
11    San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
12 */
13 
14 /* $Id: vdtrace.h 9348 2009-01-12 19:33:58Z giles $ */
15 /* Visual tracer service interface */
16 
17 #ifndef vdtrace_INCLUDED
18 #  define vdtrace_INCLUDED
19 
20 /*  Painting contract :
21 
22     First use vd_get_dc.
23     Then paint with vd_* functionns.
24     When completed, use vd_release_dc.
25 
26     The following functions paint immediately, without vd_beg_path, vd_end_path, vd_fill, vd_stroke :
27     vd_circle, vd_round, vd_bar, vd_bar_w, vd_curve, vd_curve_w
28 
29     The following functions require vd_fill or vd_stroke only if enclosed with vd_beg_path, vd_end_path :
30     vd_moveto, vd_lineto, vd_curveto, vd_closepath.
31     Otherwise they paint directly (this is useful for step-by-step execution).
32 */
33 
34 #if !defined(VD_TRACE)
35 #   if defined(DEBUG)
36 #	define VD_TRACE 1
37 #   else
38 #	define VD_TRACE 0
39 #   endif
40 #endif
41 
42 typedef struct vd_trace_host_s vd_trace_host;
43 typedef struct vd_trace_interface_s vd_trace_interface;
44 struct gs_fixed_point_s;
45 
46 struct  vd_trace_interface_s {
47     vd_trace_host *host;
48     double scale_x, scale_y;
49     double orig_x, orig_y;
50     double shift_x, shift_y;
51     double (*get_size_x)(vd_trace_interface *I);
52     double (*get_size_y)(vd_trace_interface *I);
53     void (*get_dc)(vd_trace_interface *I, vd_trace_interface **I1);
54     void (*release_dc)(vd_trace_interface *I, vd_trace_interface **I1);
55     void (*erase)(vd_trace_interface *I, unsigned long rgbcolor);
56     void (*beg_path)(vd_trace_interface *I);
57     void (*end_path)(vd_trace_interface *I);
58     void (*moveto)(vd_trace_interface *I, double x, double y);
59     void (*lineto)(vd_trace_interface *I, double x, double y);
60     void (*curveto)(vd_trace_interface *I, double x0, double y0, double x1, double y1, double x2, double y2);
61     void (*closepath)(vd_trace_interface *I);
62     void (*circle)(vd_trace_interface *I, double x, double y, int r); /* Radius doesn't scale. */
63     void (*round)(vd_trace_interface *I, double x, double y, int r); /* Radius doesn't scale. */
64     void (*pixel)(vd_trace_interface *I, double x, double y, unsigned long rgbcolor);
65     void (*fill)(vd_trace_interface *I);
66     void (*stroke)(vd_trace_interface *I);
67     void (*setcolor)(vd_trace_interface *I, unsigned long rgbcolor);
68     void (*setlinewidth)(vd_trace_interface *I, unsigned int width); /* Width doesn't scale. */
69     void (*text)(vd_trace_interface *I, double x, double y, char *ASCIIZ); /* Font doesn't scale. */
70     void (*wait)(vd_trace_interface *I);
71     void (*set_scale)(vd_trace_interface *I);
72     void (*set_shift)(vd_trace_interface *I);
73     void (*set_origin)(vd_trace_interface *I);
74 };
75 
76 extern vd_trace_interface * vd_trace0; /* Pointer to trace interface. */
77 extern vd_trace_interface * vd_trace1; /* A copy of vd_trace0, or NULL if trace is disabled. */
78 extern char vd_flags[];
79 
80 void vd_impl_moveto(double x, double y);
81 void vd_impl_lineto(double x, double y);
82 void vd_impl_lineto_multi(const struct gs_fixed_point_s *p, int n);
83 void vd_impl_curveto(double x0, double y0, double x1, double y1, double x2, double y2);
84 void vd_impl_bar(double x0, double y0, double x1, double y1, int w, unsigned long c); /* unscaled width */
85 void vd_impl_square(double x0, double y0, int w, unsigned int c); /* unscaled width */
86 void vd_impl_rect(double x0, double y0, double x1, double y1, int w, unsigned int c);  /* unscaled width */
87 void vd_impl_quad(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3, int w, unsigned int c);  /* unscaled width */
88 void vd_impl_curve(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3, int w, unsigned long c); /* unscaled width */
89 void vd_impl_circle(double x, double y, int r, unsigned long c); /* unscaled radius */
90 void vd_impl_round(double x, double y, int r, unsigned long c);  /* unscaled radius */
91 void vd_impl_pixel(double x, double y, unsigned long c);
92 void vd_impl_text(double x, double y, char *s, unsigned long c); /* unscaled font */
93 void vd_setflag(char f, char v);
94 
95 #ifndef RGB
96 #    define RGB(r,g,b) ((unsigned long)(r) * 65536L + (unsigned long)(g) * 256L + (unsigned long)(b))
97 #endif
98 
99 #if VD_TRACE && defined(DEBUG)
100 #    define vd_allowed(f)       (vd_flags[(f) & 127])
101 #    define vd_get_dc(f)        while (vd_trace0 && vd_allowed(f)) { vd_trace0->get_dc(vd_trace0, &vd_trace1); break; }
102 #    define vd_release_dc       BEGIN if (vd_trace1) vd_trace1->release_dc(vd_trace1, &vd_trace1); END
103 #    define vd_enabled          (vd_trace1 != 0)
104 #    define vd_get_size_unscaled_x      (vd_trace1 ? vd_trace1->get_size_x(vd_trace1) : 100)
105 #    define vd_get_size_unscaled_y      (vd_trace1 ? vd_trace1->get_size_y(vd_trace1) : 100)
106 #    define vd_get_size_scaled_x        (vd_trace1 ? vd_trace1->get_size_x(vd_trace1) / vd_trace1->scale_x : 100)
107 #    define vd_get_size_scaled_y        (vd_trace1 ? vd_trace1->get_size_y(vd_trace1) / vd_trace1->scale_y : 100)
108 #    define vd_get_scale_x              (vd_trace1 ? vd_trace1->scale_x : 100)
109 #    define vd_get_scale_y              (vd_trace1 ? vd_trace1->scale_y : 100)
110 #    define vd_get_origin_x             (vd_trace1 ? vd_trace1->orig_x : 0)
111 #    define vd_get_origin_y             (vd_trace1 ? vd_trace1->orig_y : 0)
112 #    define vd_set_scale(s)     BEGIN if (vd_trace1) { vd_trace1->scale_x = vd_trace1->scale_y = s; vd_trace1->set_scale(vd_trace1); } END
113 #    define vd_set_scaleXY(sx,sy)       BEGIN if (vd_trace1) { vd_trace1->scale_x = sx, vd_trace1->scale_y = sy; vd_trace1->set_scale(vd_trace1); } END
114 #    define vd_set_origin(x,y)  BEGIN if (vd_trace1) { vd_trace1->orig_x  = x, vd_trace1->orig_y  = y; vd_trace1->set_origin(vd_trace1); } END
115 #    define vd_set_shift(x,y)   BEGIN if (vd_trace1) { vd_trace1->shift_x = x, vd_trace1->shift_y = y; vd_trace1->set_shift(vd_trace1); } END
116 #    define vd_set_central_shift        BEGIN if (vd_trace1) vd_trace1->shift_x = vd_trace1->get_size_x(vd_trace1)/2, vd_trace1->shift_y = vd_trace1->get_size_y(vd_trace1)/2; END
117 #    define vd_erase(c)         BEGIN if (vd_trace1)  vd_trace1->erase(vd_trace1,c); END
118 #    define vd_beg_path         BEGIN if (vd_trace1)  vd_trace1->beg_path(vd_trace1); END
119 #    define vd_end_path         BEGIN if (vd_trace1)  vd_trace1->end_path(vd_trace1); END
120 #    define vd_moveto(x,y)      BEGIN if (vd_trace1)  vd_impl_moveto(x,y); END
121 #    define vd_lineto(x,y)      BEGIN if (vd_trace1)  vd_impl_lineto(x,y); END
122 #    define vd_lineto_multi(p,n)        BEGIN if (vd_trace1)  vd_impl_lineto_multi(p,n); END
123 #    define vd_curveto(x0,y0,x1,y1,x2,y2) BEGIN if (vd_trace1)  vd_impl_curveto(x0,y0,x1,y1,x2,y2); END
124 #    define vd_closepath        BEGIN if (vd_trace1) vd_trace1->closepath(vd_trace1); END
125 #    define vd_bar(x0,y0,x1,y1,w,c)   BEGIN if (vd_trace1) vd_impl_bar(x0,y0,x1,y1,w,c); END
126 #    define vd_square(x0,y0,w,c)      BEGIN if (vd_trace1) vd_impl_square(x0,y0,w,c); END
127 #    define vd_rect(x0,y0,x1,y1,w,c)  BEGIN if (vd_trace1) vd_impl_rect(x0,y0,x1,y1,w,c); END
128 #    define vd_quad(x0,y0,x1,y1,x2,y2,x3,y3,w,c)  BEGIN if (vd_trace1) vd_impl_quad(x0,y0,x1,y1,x2,y2,x3,y3,w,c); END
129 #    define vd_curve(x0,y0,x1,y1,x2,y2,x3,y3,w,c) BEGIN if (vd_trace1) vd_impl_curve(x0,y0,x1,y1,x2,y2,x3,y3,w,c); END
130 #    define vd_circle(x,y,r,c)  BEGIN if (vd_trace1) vd_impl_circle(x,y,r,c); END
131 #    define vd_round(x,y,r,c)   BEGIN if (vd_trace1) vd_impl_round(x,y,r,c); END
132 #    define vd_pixel(x,y,c)   BEGIN if (vd_trace1) vd_impl_pixel(x,y,c); END
133 #    define vd_fill             BEGIN if (vd_trace1) vd_trace1->fill(vd_trace1); END
134 #    define vd_stroke           BEGIN if (vd_trace1) vd_trace1->stroke(vd_trace1); END
135 #    define vd_setcolor(c)      BEGIN if (vd_trace1) vd_trace1->setcolor(vd_trace1,c); END
136 #    define vd_setlinewidth(w)  BEGIN if (vd_trace1) vd_trace1->setlinewidth(vd_trace1,w); END
137 #    define vd_text(x,y,s,c)    BEGIN if (vd_trace1) vd_impl_text(x,y,s,c); END
138 #    define vd_wait             BEGIN if (vd_trace1) vd_trace1->wait(vd_trace1); END
139 #    define vd_save	vd_trace_interface * vd_trace_save; vd_trace_save = vd_trace1; /* NOTE :
140 	    Use vd_save at end of the definition group of a  block,
141 	    because in release build it compiles to the empty operator.
142 	    We intentionally defined an operator here for a compatible syntax check.  */
143 #    define vd_restore	vd_trace1 = vd_trace_save
144 #    define vd_disable	vd_trace1 = NULL
145 #else
146 #    define vd_allowed(f)   false
147 #    define vd_get_dc(f)    DO_NOTHING
148 #    define vd_release_dc   DO_NOTHING
149 #    define vd_enabled			0
150 #    define vd_get_size_unscaled_x      100
151 #    define vd_get_size_unscaled_y      100
152 #    define vd_get_size_scaled_x        100
153 #    define vd_get_size_scaled_y        100
154 #    define vd_get_scale_x              100
155 #    define vd_get_scale_y              100
156 #    define vd_get_origin_x             0
157 #    define vd_get_origin_y             0
158 #    define vd_set_scale(sx)	    DO_NOTHING
159 #    define vd_set_scaleXY(sx,sy)   DO_NOTHING
160 #    define vd_set_origin(x,y)	    DO_NOTHING
161 #    define vd_set_shift(x,y)	    DO_NOTHING
162 #    define vd_set_central_shift    DO_NOTHING
163 #    define vd_erase(c)		    DO_NOTHING
164 #    define vd_beg_path		    DO_NOTHING
165 #    define vd_end_path		    DO_NOTHING
166 #    define vd_moveto(x,y)	    DO_NOTHING
167 #    define vd_lineto(x,y)	    DO_NOTHING
168 #    define vd_lineto_multi(p,n)    DO_NOTHING
169 #    define vd_curveto(x0,y0,x1,y1,x2,y2) DO_NOTHING
170 #    define vd_closepath	    DO_NOTHING
171 #    define vd_bar(x0,y0,x1,y1,w,c) DO_NOTHING
172 #    define vd_square(x0,y0,w,c)    DO_NOTHING
173 #    define vd_rect(x0,y0,x1,y1,w,c)	DO_NOTHING
174 #    define vd_quad(x0,y0,x1,y1,x2,y2,x3,y3,w,c)  DO_NOTHING
175 #    define vd_curve(x0,y0,x1,y1,x2,y2,x3,y3,w,c) DO_NOTHING
176 #    define vd_circle(x,y,r,c)	    DO_NOTHING
177 #    define vd_round(x,y,r,c)	    DO_NOTHING
178 #    define vd_pixel(x,y,c)	    DO_NOTHING
179 #    define vd_fill		    DO_NOTHING
180 #    define vd_stroke		    DO_NOTHING
181 #    define vd_setcolor(c)	    DO_NOTHING
182 #    define vd_setlinewidth(w)	    DO_NOTHING
183 #    define vd_text(x,y,s,c)	    DO_NOTHING
184 #    define vd_wait		    DO_NOTHING
185 #    define vd_save		    DO_NOTHING
186 #    define vd_restore		    DO_NOTHING
187 #    define vd_disable		    DO_NOTHING
188 #endif
189 
190 #endif /* vdtrace_INCLUDED */
191