[3ae31e9] | 1 | /*
|
---|
| 2 | =============================================================================
|
---|
| 3 | egvdi.c -- a C library test set.
|
---|
| 4 | Version 2 -- 1989-01-24 -- Metacomco / Lattice / D.N. Lynx Crowe
|
---|
| 5 |
|
---|
| 6 | Watch out for data sizes.
|
---|
| 7 |
|
---|
| 8 | All pointers in arg lists of GEM functions must be 16 bit WORD's.
|
---|
| 9 |
|
---|
| 10 | BYTE, WORD, LONG etc are defined in the portab.h include file.
|
---|
| 11 | =============================================================================
|
---|
| 12 | */
|
---|
| 13 |
|
---|
| 14 | /* load fonts not implemented in current ST GEM */
|
---|
| 15 |
|
---|
| 16 | #define HASFNTLD 0 /* non-zero if vst_load_fonts() is implemented */
|
---|
| 17 |
|
---|
| 18 | #include "stdio.h"
|
---|
| 19 | #include "gemlib.h" /* assorted useful GEM macro's */
|
---|
| 20 | #include "portab.h" /* include type def macro's etc */
|
---|
| 21 |
|
---|
| 22 | #define MYLINE 0x5ABC /* a user defined line style mask */
|
---|
| 23 |
|
---|
| 24 | /* GLOBALS needed below */
|
---|
| 25 |
|
---|
| 26 | WORD phys_handle;
|
---|
| 27 | WORD handle;
|
---|
| 28 | WORD dummy;
|
---|
| 29 | WORD pxyarray[4];
|
---|
| 30 |
|
---|
| 31 | setpxy(x1, y1, x2, y2)
|
---|
| 32 | WORD x1, y1, x2, y2;
|
---|
| 33 | {
|
---|
| 34 | pxyarray[0] = x1; /* set global points array */
|
---|
| 35 | pxyarray[1] = y1; /* from data points supplied */
|
---|
| 36 | pxyarray[2] = x2;
|
---|
| 37 | pxyarray[3] = y2;
|
---|
| 38 | }
|
---|
| 39 |
|
---|
| 40 | line(x1, y1, x2, y2)
|
---|
| 41 | WORD x1, y1, x2, y2;
|
---|
| 42 | {
|
---|
| 43 | pxyarray[0] = x1;
|
---|
| 44 | pxyarray[1] = y1;
|
---|
| 45 | pxyarray[2] = x2;
|
---|
| 46 | pxyarray[3] = y2; /* set-up array for v_pline() */
|
---|
| 47 |
|
---|
| 48 | v_pline(handle, 2, pxyarray); /* call polyline to draw line */
|
---|
| 49 |
|
---|
| 50 | /* that was ( handle, npoints, array_of_points ) */
|
---|
| 51 | }
|
---|
| 52 |
|
---|
| 53 | /* |
---|
| 54 |
|
---|
| 55 | */
|
---|
| 56 |
|
---|
| 57 | line_test()
|
---|
| 58 | {
|
---|
| 59 | int j; /* loop counter*/
|
---|
| 60 |
|
---|
| 61 | vsl_udsty(handle, MYLINE); /* define user def. line (No 7) */
|
---|
| 62 |
|
---|
| 63 | /* polymarkers are point marker shapes for graphs etc */
|
---|
| 64 |
|
---|
| 65 | vsm_type(handle, 4); /* use square polymarker (1 to 6) */
|
---|
| 66 | vsm_height(handle, 10); /* and make it nice and big. */
|
---|
| 67 | vsm_color(handle, BLACK); /* set marker color */
|
---|
| 68 |
|
---|
| 69 | for (j = 1; j < 8; j++) { /* draw lines with diff attributes */
|
---|
| 70 |
|
---|
| 71 | vsl_type(handle, j); /* try each line style */
|
---|
| 72 | vsl_color(handle, j); /* and each available color */
|
---|
| 73 |
|
---|
| 74 | /* You can set line termination style too */
|
---|
| 75 | /* N.B: there are only 3 end types */
|
---|
| 76 |
|
---|
| 77 | vsl_ends(handle, (j-1) & 3, (j-1) & 3);
|
---|
| 78 | line(10, j*10+10, 100, j*10+10); /* draw a line */
|
---|
| 79 | v_pmarker(handle, 2, pxyarray); /* mark ends */
|
---|
| 80 |
|
---|
| 81 | /* v_pmarker has same syntax as v_pline */
|
---|
| 82 | }
|
---|
| 83 |
|
---|
| 84 | vsl_color(handle, BLACK); /* reset */
|
---|
| 85 | vsl_type(handle, SOLID); /* and line type */
|
---|
| 86 | vsl_ends(handle, ARROWED, ARROWED); /* set end type for thickness loop */
|
---|
| 87 |
|
---|
| 88 | for(j = 1; j < 10; j += 2) { /* i.e. for 1,3,5,7,9 */
|
---|
| 89 |
|
---|
| 90 | /* you can select line thickness too */
|
---|
| 91 |
|
---|
| 92 | vsl_width(handle, j); /* set thickness */
|
---|
| 93 | line(105, j*10+10, 195, j*10+10); /* draw a line */
|
---|
| 94 | }
|
---|
| 95 |
|
---|
| 96 | vsl_ends(handle, SQUARED, SQUARED); /* reset end types */
|
---|
| 97 |
|
---|
| 98 | vsl_width(handle, 1); /* reset the width in case it's used again */
|
---|
| 99 | }
|
---|
| 100 |
|
---|
| 101 | /* |
---|
| 102 |
|
---|
| 103 | */
|
---|
| 104 |
|
---|
| 105 | circ_test()
|
---|
| 106 | {
|
---|
| 107 | int radius,k;
|
---|
| 108 |
|
---|
| 109 | /* vsf_ functions select fill attributes */
|
---|
| 110 |
|
---|
| 111 | vsf_interior(handle, PATTERN); /* tell gem to pattern fill */
|
---|
| 112 | vsf_color(handle, BLACK); /* in fill color black */
|
---|
| 113 |
|
---|
| 114 | for(k = 10; k > 0; k--) {
|
---|
| 115 |
|
---|
| 116 | vsf_style(handle, k); /* set fill pattern */
|
---|
| 117 | radius = k * 10;
|
---|
| 118 | v_circle(handle, radius+2, 100, radius);
|
---|
| 119 | }
|
---|
| 120 | }
|
---|
| 121 |
|
---|
| 122 | box_test()
|
---|
| 123 | {
|
---|
| 124 | setpxy(320, 5, 635, 195);
|
---|
| 125 | vsf_color(handle, BLACK);
|
---|
| 126 | vsf_interior(handle, SOLID);
|
---|
| 127 | v_bar(handle, pxyarray); /* do a rectangle (no border) */
|
---|
| 128 |
|
---|
| 129 | setpxy(330, 15, 625, 185);
|
---|
| 130 | vsf_interior(handle, PATTERN);
|
---|
| 131 | vsf_style(handle, DOTS);
|
---|
| 132 | vr_recfl(handle, pxyarray); /* filled rectangle */
|
---|
| 133 |
|
---|
| 134 | setpxy(340, 25, 615, 175);
|
---|
| 135 | vsf_style(handle, BRICKS);
|
---|
| 136 | v_rfbox(handle, pxyarray); /* try a rounded & filled box */
|
---|
| 137 |
|
---|
| 138 | vsf_interior(handle, HATCH);
|
---|
| 139 | vsf_color(handle, 3);
|
---|
| 140 | vsf_style(handle, GRID);
|
---|
| 141 | v_ellipse(handle, 479, 130, 120, 35); /* put filled ellipse */
|
---|
| 142 |
|
---|
| 143 | /* that was xpos, ypos, xradius, yradius */
|
---|
| 144 |
|
---|
| 145 | vsf_color(handle, BLACK);
|
---|
| 146 | }
|
---|
| 147 |
|
---|
| 148 | /* |
---|
| 149 |
|
---|
| 150 | */
|
---|
| 151 |
|
---|
| 152 | arc_test()
|
---|
| 153 | {
|
---|
| 154 | int radius, revs, da, ang;
|
---|
| 155 |
|
---|
| 156 | radius = 10; /* start with a radius of 10 */
|
---|
| 157 | da = 360; /* delta-angle for spiral steps */
|
---|
| 158 |
|
---|
| 159 | /* NOTE: GEM angles are in tenths of a degree */
|
---|
| 160 |
|
---|
| 161 | vswr_mode(handle, MD_REPLACE); /* make sure we're in replace mode */
|
---|
| 162 |
|
---|
| 163 | /* vswr_mode sets writing mode to one of 4 */
|
---|
| 164 |
|
---|
| 165 | vsl_color(handle, 2); /* reset color */
|
---|
| 166 | vsl_type(handle, SOLID); /* and line type */
|
---|
| 167 | vsl_width(handle, 3); /* use fairly thick lines */
|
---|
| 168 |
|
---|
| 169 | /* now draw the spiral */
|
---|
| 170 |
|
---|
| 171 | for (revs = 0; revs < 6; revs++) {
|
---|
| 172 |
|
---|
| 173 | for (ang = 0; ang < 3600; ang += da) {
|
---|
| 174 |
|
---|
| 175 | v_arc(handle, 190, 160, radius, ang, ang+da);
|
---|
| 176 | radius++;
|
---|
| 177 | }
|
---|
| 178 | }
|
---|
| 179 |
|
---|
| 180 | vsl_color(handle, BLACK); /* reset color */
|
---|
| 181 | vsl_type(handle, SOLID); /* and line type */
|
---|
| 182 | vsl_width(handle, 1); /* reset line width */
|
---|
| 183 | }
|
---|
| 184 |
|
---|
| 185 | pie_test()
|
---|
| 186 | {
|
---|
| 187 | int nsegs, da, ang, seg;
|
---|
| 188 |
|
---|
| 189 | vsf_interior(handle, HATCH);
|
---|
| 190 |
|
---|
| 191 | /* making pies has never been easier */
|
---|
| 192 |
|
---|
| 193 | nsegs = 12; /* No. of segments in pie */
|
---|
| 194 | da = 3600 / nsegs; /* angle for each segment */
|
---|
| 195 |
|
---|
| 196 | for (seg = 0; seg < nsegs; seg++) {
|
---|
| 197 |
|
---|
| 198 | ang = seg * da;
|
---|
| 199 | vsf_style(handle, seg+2);
|
---|
| 200 | v_pieslice(handle, 472, 100, 90, ang, ang+da);
|
---|
| 201 | }
|
---|
| 202 | }
|
---|
| 203 |
|
---|
| 204 | /* |
---|
| 205 |
|
---|
| 206 | */
|
---|
| 207 |
|
---|
| 208 | text_test()
|
---|
| 209 | {
|
---|
| 210 |
|
---|
| 211 | int s; /* somewhere to put returned values */
|
---|
| 212 |
|
---|
| 213 | #if HASLDFNT
|
---|
| 214 | s = vst_load_fonts(handle, 0);
|
---|
| 215 | printf("%d extra fonts loaded.\n", s);
|
---|
| 216 | #endif
|
---|
| 217 |
|
---|
| 218 | vswr_mode(handle, MD_TRANS); /* writing mode so only fg drawn */
|
---|
| 219 | vst_height(handle, 50, &dummy, &dummy, &dummy, &dummy); /* BIG */
|
---|
| 220 | s = vst_color(handle, BLACK); /* text color */
|
---|
| 221 | v_gtext(handle, 390, 100, "Metacomco!"); /* print text at x,y */
|
---|
| 222 |
|
---|
| 223 | vswr_mode(handle ,MD_REPLACE); /* change writing mode to REPLACE */
|
---|
| 224 | vst_height(handle, 100, &dummy, &dummy, &dummy, &dummy); /* BIGGER */
|
---|
| 225 | s = vst_color(handle, RED); /* text color */
|
---|
| 226 | s = vst_effects(handle, SKEWED); /* make it skewed */
|
---|
| 227 | v_justified(handle, 380, 155, "Hi There!", 180, 1, 1);
|
---|
| 228 |
|
---|
| 229 | /* justified text is fill justified to required length (180) */
|
---|
| 230 | }
|
---|
| 231 |
|
---|
| 232 | fill_test()
|
---|
| 233 | {
|
---|
| 234 | vsf_interior(handle, HATCH);
|
---|
| 235 | vsf_style(handle, GRID);
|
---|
| 236 | vsf_color(handle, 3);
|
---|
| 237 | v_contourfill(handle, 5, 5, -1);
|
---|
| 238 |
|
---|
| 239 | /*
|
---|
| 240 | that last value is the boundary color.
|
---|
| 241 | -1 implies any color change is to be
|
---|
| 242 | regarded as a boundary condition
|
---|
| 243 | */
|
---|
| 244 | }
|
---|
| 245 |
|
---|
| 246 | gem_close()
|
---|
| 247 | {
|
---|
| 248 |
|
---|
| 249 | /* anything to do just before finishing should go here */
|
---|
| 250 |
|
---|
| 251 | v_clsvwk(handle); /* close virtual workstation */
|
---|
| 252 | }
|
---|
| 253 |
|
---|
| 254 | /* |
---|
| 255 |
|
---|
| 256 | */
|
---|
| 257 |
|
---|
| 258 | gem_init()
|
---|
| 259 | {
|
---|
| 260 | WORD i;
|
---|
| 261 | WORD work_in[11],work_out[57];
|
---|
| 262 |
|
---|
| 263 | /* NOTE: if the data out from opnvwk() is needed elsewhere */
|
---|
| 264 | /* it may be more convenient to declare it as an */
|
---|
| 265 | /* external static or global */
|
---|
| 266 |
|
---|
| 267 | appl_init(); /* open the application (tell GEM AES were here) */
|
---|
| 268 |
|
---|
| 269 | /* find system handle ... */
|
---|
| 270 |
|
---|
| 271 | phys_handle = graf_handle(&dummy, &dummy, &dummy, &dummy);
|
---|
| 272 |
|
---|
| 273 | handle = phys_handle; /* handle will contain our vdi handle */
|
---|
| 274 |
|
---|
| 275 | /* use this handle for all future VDI calls */
|
---|
| 276 |
|
---|
| 277 | for (i = 0; i < 10; i++)
|
---|
| 278 | work_in[i] = 1; /* set all defaults before we open it */
|
---|
| 279 |
|
---|
| 280 | work_in[10] = 2; /* use raster co-ordinates */
|
---|
| 281 |
|
---|
| 282 | v_opnvwk(work_in, &handle, work_out); /* open the workstation */
|
---|
| 283 |
|
---|
| 284 | v_hide_c(handle); /* hide the mouse */
|
---|
| 285 | v_clrwk(handle); /* clear workstation */
|
---|
| 286 | v_show_c(handle, 1); /* show the mouse again */
|
---|
| 287 |
|
---|
| 288 | /* turn clipping on to stop screen overflow... */
|
---|
| 289 |
|
---|
| 290 | setpxy(0, 0, 639, 399);
|
---|
| 291 | vs_clip(handle, TRUE, pxyarray); /* clip full screen */
|
---|
| 292 | }
|
---|
| 293 |
|
---|
| 294 | /* |
---|
| 295 |
|
---|
| 296 | */
|
---|
| 297 |
|
---|
| 298 | wait4it()
|
---|
| 299 | {
|
---|
| 300 | WORD c;
|
---|
| 301 |
|
---|
| 302 | putchar(7); /* ring bell */
|
---|
| 303 |
|
---|
| 304 | do {
|
---|
| 305 |
|
---|
| 306 | vq_mouse(handle, &c, &dummy, &dummy);
|
---|
| 307 |
|
---|
| 308 | /* reads mouse buttons (bits 0 & 1), xpos, ypos respect. */
|
---|
| 309 |
|
---|
| 310 | } while( !c ); /* loop until button pressed */
|
---|
| 311 | }
|
---|
| 312 |
|
---|
| 313 | main()
|
---|
| 314 | {
|
---|
| 315 | gem_init(); /* initialise a virtual workstation */
|
---|
| 316 |
|
---|
| 317 | box_test(); /* test assorted square primitives */
|
---|
| 318 | line_test(); /* test polyline and polymarker f's */
|
---|
| 319 | wait4it(); /* wait for a mouse button */
|
---|
| 320 |
|
---|
| 321 | arc_test(); /* test arc functions */
|
---|
| 322 | circ_test(); /* test circle & ellipse primitives */
|
---|
| 323 | pie_test(); /* test pie segment functions */
|
---|
| 324 | wait4it(); /* wait for a mouse button */
|
---|
| 325 |
|
---|
| 326 | text_test(); /* test text related GEM functions */
|
---|
| 327 | fill_test(); /* test contour fill op */
|
---|
| 328 | wait4it(); /* wait for a mouse button */
|
---|
| 329 |
|
---|
| 330 | gem_close(); /* close up the workstation before we exit */
|
---|
| 331 | }
|
---|