xref: /plan9/sys/src/cmd/gs/src/vdtrace.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 2002 artofcode LLC. 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: vdtrace.h,v 1.14 2004/09/20 09:59:29 igor Exp $ */
18 /* Visual tracer service interface */
19 
20 #ifndef vdtrace_INCLUDED
21 #  define vdtrace_INCLUDED
22 
23 /*  Painting contract :
24 
25     First use vd_get_dc.
26     Then paint with vd_* functionns.
27     When completed, use vd_release_dc.
28 
29     The following functions paint immediately, without vd_beg_path, vd_end_path, vd_fill, vd_stroke :
30     vd_circle, vd_round, vd_bar, vd_bar_w, vd_curve, vd_curve_w
31 
32     The following functions require vd_fill or vd_stroke only if enclosed with vd_beg_path, vd_end_path :
33     vd_moveto, vd_lineto, vd_curveto, vd_closepath.
34     Otherwise they paint directly (this is useful for step-by-step execution).
35 */
36 
37 #if !defined(VD_TRACE)
38 #define VD_TRACE 1
39 #endif
40 
41 typedef struct vd_trace_host_s vd_trace_host;
42 typedef struct vd_trace_interface_s vd_trace_interface;
43 struct gs_fixed_point_s;
44 
45 struct  vd_trace_interface_s {
46     vd_trace_host *host;
47     double scale_x, scale_y;
48     double orig_x, orig_y;
49     double shift_x, shift_y;
50     double (*get_size_x)(vd_trace_interface *I);
51     double (*get_size_y)(vd_trace_interface *I);
52     void (*get_dc)(vd_trace_interface *I, vd_trace_interface **I1);
53     void (*release_dc)(vd_trace_interface *I, vd_trace_interface **I1);
54     void (*erase)(vd_trace_interface *I, unsigned long rgbcolor);
55     void (*beg_path)(vd_trace_interface *I);
56     void (*end_path)(vd_trace_interface *I);
57     void (*moveto)(vd_trace_interface *I, double x, double y);
58     void (*lineto)(vd_trace_interface *I, double x, double y);
59     void (*curveto)(vd_trace_interface *I, double x0, double y0, double x1, double y1, double x2, double y2);
60     void (*closepath)(vd_trace_interface *I);
61     void (*circle)(vd_trace_interface *I, double x, double y, int r); /* Radius doesn't scale. */
62     void (*round)(vd_trace_interface *I, double x, double y, int r); /* Radius doesn't scale. */
63     void (*fill)(vd_trace_interface *I);
64     void (*stroke)(vd_trace_interface *I);
65     void (*setcolor)(vd_trace_interface *I, unsigned long rgbcolor);
66     void (*setlinewidth)(vd_trace_interface *I, unsigned int width); /* Width doesn't scale. */
67     void (*text)(vd_trace_interface *I, double x, double y, char *ASCIIZ); /* Font doesn't scale. */
68     void (*wait)(vd_trace_interface *I);
69     void (*set_scale)(vd_trace_interface *I);
70     void (*set_shift)(vd_trace_interface *I);
71     void (*set_origin)(vd_trace_interface *I);
72 };
73 
74 extern vd_trace_interface * vd_trace0; /* Pointer to trace interface. */
75 extern vd_trace_interface * vd_trace1; /* A copy of vd_trace0, or NULL if trace is disabled. */
76 extern char vd_flags[];
77 
78 void vd_impl_moveto(double x, double y);
79 void vd_impl_lineto(double x, double y);
80 void vd_impl_lineto_multi(const struct gs_fixed_point_s *p, int n);
81 void vd_impl_curveto(double x0, double y0, double x1, double y1, double x2, double y2);
82 void vd_impl_bar(double x0, double y0, double x1, double y1, int w, unsigned long c); /* unscaled width */
83 void vd_impl_square(double x0, double y0, int w, unsigned int c); /* unscaled width */
84 void vd_impl_rect(double x0, double y0, double x1, double y1, int w, unsigned int c);  /* unscaled width */
85 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 */
86 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 */
87 void vd_impl_circle(double x, double y, int r, unsigned long c); /* unscaled radius */
88 void vd_impl_round(double x, double y, int r, unsigned long c);  /* unscaled radius */
89 void vd_impl_text(double x, double y, char *s, unsigned long c); /* unscaled font */
90 void vd_setflag(char f, char v);
91 
92 #ifndef RGB
93 #    define RGB(r,g,b) ((unsigned long)(r) * 65536L + (unsigned long)(g) * 256L + (unsigned long)(b))
94 #endif
95 
96 #if VD_TRACE && defined(DEBUG)
97 #    define vd_allowed(f)       (vd_flags[(f) & 127])
98 #    define vd_get_dc(f)        while (vd_trace0 && vd_allowed(f)) { vd_trace0->get_dc(vd_trace0, &vd_trace1); break; }
99 #    define vd_release_dc       BEGIN if (vd_trace1) vd_trace1->release_dc(vd_trace1, &vd_trace1); END
100 #    define vd_enabled          (vd_trace1 != 0)
101 #    define vd_get_size_unscaled_x      (vd_trace1 ? vd_trace1->get_size_x(vd_trace1) : 100)
102 #    define vd_get_size_unscaled_y      (vd_trace1 ? vd_trace1->get_size_y(vd_trace1) : 100)
103 #    define vd_get_size_scaled_x        (vd_trace1 ? vd_trace1->get_size_x(vd_trace1) / vd_trace1->scale_x : 100)
104 #    define vd_get_size_scaled_y        (vd_trace1 ? vd_trace1->get_size_y(vd_trace1) / vd_trace1->scale_y : 100)
105 #    define vd_get_scale_x              (vd_trace1 ? vd_trace1->scale_x : 100)
106 #    define vd_get_scale_y              (vd_trace1 ? vd_trace1->scale_y : 100)
107 #    define vd_get_origin_x             (vd_trace1 ? vd_trace1->orig_x : 0)
108 #    define vd_get_origin_y             (vd_trace1 ? vd_trace1->orig_y : 0)
109 #    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
110 #    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
111 #    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
112 #    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
113 #    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
114 #    define vd_erase(c)         BEGIN if (vd_trace1)  vd_trace1->erase(vd_trace1,c); END
115 #    define vd_beg_path         BEGIN if (vd_trace1)  vd_trace1->beg_path(vd_trace1); END
116 #    define vd_end_path         BEGIN if (vd_trace1)  vd_trace1->end_path(vd_trace1); END
117 #    define vd_moveto(x,y)      BEGIN if (vd_trace1)  vd_impl_moveto(x,y); END
118 #    define vd_lineto(x,y)      BEGIN if (vd_trace1)  vd_impl_lineto(x,y); END
119 #    define vd_lineto_multi(p,n)        BEGIN if (vd_trace1)  vd_impl_lineto_multi(p,n); END
120 #    define vd_curveto(x0,y0,x1,y1,x2,y2) BEGIN if (vd_trace1)  vd_impl_curveto(x0,y0,x1,y1,x2,y2); END
121 #    define vd_closepath        BEGIN if (vd_trace1) vd_trace1->closepath(vd_trace1); END
122 #    define vd_bar(x0,y0,x1,y1,w,c)   BEGIN if (vd_trace1) vd_impl_bar(x0,y0,x1,y1,w,c); END
123 #    define vd_square(x0,y0,w,c)      BEGIN if (vd_trace1) vd_impl_square(x0,y0,w,c); END
124 #    define vd_rect(x0,y0,x1,y1,w,c)  BEGIN if (vd_trace1) vd_impl_rect(x0,y0,x1,y1,w,c); END
125 #    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
126 #    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
127 #    define vd_circle(x,y,r,c)  BEGIN if (vd_trace1) vd_impl_circle(x,y,r,c); END
128 #    define vd_round(x,y,r,c)   BEGIN if (vd_trace1) vd_impl_round(x,y,r,c); END
129 #    define vd_fill             BEGIN if (vd_trace1) vd_trace1->fill(vd_trace1); END
130 #    define vd_stroke           BEGIN if (vd_trace1) vd_trace1->stroke(vd_trace1); END
131 #    define vd_setcolor(c)      BEGIN if (vd_trace1) vd_trace1->setcolor(vd_trace1,c); END
132 #    define vd_setlinewidth(w)  BEGIN if (vd_trace1) vd_trace1->setlinewidth(vd_trace1,w); END
133 #    define vd_text(x,y,s,c)    BEGIN if (vd_trace1) vd_impl_text(x,y,s,c); END
134 #    define vd_wait             BEGIN if (vd_trace1) vd_trace1->wait(vd_trace1); END
135 #    define vd_save	vd_trace_interface * vd_trace_save; vd_trace_save = vd_trace1; /* NOTE :
136 	    Use vd_save at end of the definition group of a  block,
137 	    because in release build it compiles to the empty operator.
138 	    We intentionally defined an operator here for a compatible syntax check.  */
139 #    define vd_restore	vd_trace1 = vd_trace_save
140 #    define vd_disable	vd_trace1 = NULL
141 #else
142 #    define vd_allowed(f)   false
143 #    define vd_get_dc(f)    DO_NOTHING
144 #    define vd_release_dc   DO_NOTHING
145 #    define vd_enabled			0
146 #    define vd_get_size_unscaled_x      100
147 #    define vd_get_size_unscaled_y      100
148 #    define vd_get_size_scaled_x        100
149 #    define vd_get_size_scaled_y        100
150 #    define vd_get_scale_x              100
151 #    define vd_get_scale_y              100
152 #    define vd_get_origin_x             0
153 #    define vd_get_origin_y             0
154 #    define vd_set_scale(sx)	    DO_NOTHING
155 #    define vd_set_scaleXY(sx,sy)   DO_NOTHING
156 #    define vd_set_origin(x,y)	    DO_NOTHING
157 #    define vd_set_shift(x,y)	    DO_NOTHING
158 #    define vd_set_central_shift    DO_NOTHING
159 #    define vd_erase(c)		    DO_NOTHING
160 #    define vd_beg_path		    DO_NOTHING
161 #    define vd_end_path		    DO_NOTHING
162 #    define vd_moveto(x,y)	    DO_NOTHING
163 #    define vd_lineto(x,y)	    DO_NOTHING
164 #    define vd_lineto_multi(p,n)    DO_NOTHING
165 #    define vd_curveto(x0,y0,x1,y1,x2,y2) DO_NOTHING
166 #    define vd_closepath	    DO_NOTHING
167 #    define vd_bar(x0,y0,x1,y1,w,c) DO_NOTHING
168 #    define vd_square(x0,y0,w,c)    DO_NOTHING
169 #    define vd_rect(x0,y0,x1,y1,w,c)	DO_NOTHING
170 #    define vd_quad(x0,y0,x1,y1,x2,y2,x3,y3,w,c)  DO_NOTHING
171 #    define vd_curve(x0,y0,x1,y1,x2,y2,x3,y3,w,c) DO_NOTHING
172 #    define vd_circle(x,y,r,c)	    DO_NOTHING
173 #    define vd_round(x,y,r,c)	    DO_NOTHING
174 #    define vd_fill		    DO_NOTHING
175 #    define vd_stroke		    DO_NOTHING
176 #    define vd_setcolor(c)	    DO_NOTHING
177 #    define vd_setlinewidth(w)	    DO_NOTHING
178 #    define vd_text(x,y,s,c)	    DO_NOTHING
179 #    define vd_wait		    DO_NOTHING
180 #    define vd_save		    DO_NOTHING
181 #    define vd_restore
182 #    define vd_disable
183 #endif
184 
185 #endif /* vdtrace_INCLUDED */
186