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