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