TESTTRAK.MOD 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. (******************************************************************************)
  2. (* TESTTRAK.MOD *)
  3. (* *)
  4. (* MetaWINDOW graphics test program *)
  5. (* Transcribed from TESTTRAK.C METAGRAPHICS SOFTWARE CORPORATION (c) 1987-1989*)
  6. (* *)
  7. (* PSW 10/31/90 02:44am *)
  8. (******************************************************************************)
  9. MODULE Testtrak;
  10. (*
  11. * Graphix
  12. * Release 3.7
  13. * (c) Copyright 1986-1992 PMI
  14. * Green Bay, Wisconsin
  15. * (414) 468-6040
  16. * All rights reserved
  17. *
  18. *)
  19. IMPORT GrQry;
  20. IMPORT GrConst;
  21. IMPORT GrPorts;
  22. IMPORT Meta;
  23. IMPORT Str;
  24. IMPORT Lib;
  25. IMPORT IO;
  26. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  27. FROM GrConst IMPORT rect, point, event, cursor, dirRec, mapArray;
  28. FROM GrPorts IMPORT adsPort;
  29. FROM GrFonts IMPORT adsFont;
  30. CONST
  31. sec = 18;
  32. COLOR = 11;
  33. VAR
  34. GrafixCard,
  35. CommPort: INTEGER;
  36. buf, buf1,
  37. Msg1, Msg2: ARRAY [0..79] OF CHAR;
  38. x, y,
  39. ox, oy,
  40. i, j,
  41. evCnt,
  42. max_clr,
  43. clr,
  44. px, py,
  45. maxgig: INTEGER;
  46. a, b: ARRAY [0..15] OF INTEGER;
  47. bol, bol1: BOOLEAN;
  48. evnt: event;
  49. R1, sR: rect;
  50. pt: point;
  51. scrMask,
  52. csrMask: cursor;
  53. OK: BOOLEAN;
  54. thePort: adsPort; (* pointer to default MetaWINDOW port *)
  55. bm: mapArray;
  56. (*
  57. ** assumes event queing is enabled. call with # of
  58. ** "ticks" to wait; ie appx 18 ticks per second
  59. ** occur. Also use for "time outs".
  60. *)
  61. PROCEDURE mwDelay(time: INTEGER);
  62. VAR
  63. b: BOOLEAN;
  64. i: INTEGER;
  65. evnt: event;
  66. BEGIN
  67. b := Meta.PeekEvent(0, evnt);
  68. i := evnt.Time;
  69. REPEAT
  70. b := Meta.PeekEvent(0, evnt)
  71. UNTIL (evnt.Time - i >= time);
  72. END mwDelay;
  73. (*** Display the active keys ***)
  74. PROCEDURE DispOpt();
  75. BEGIN
  76. Meta.RasterOp(GrConst.zXORz);
  77. Meta.MoveTo(px*2, py*22);
  78. Meta.DrawString('- Active keys - [w]hirl-a-gig, [c]lear screen');
  79. Meta.MoveTo(px*2, py*23);
  80. Meta.DrawString('[f]lip origin, [t]racking on/off.');
  81. Meta.MoveTo(px*2, py*24);
  82. Meta.DrawString('mouse: lft=draw, rt=plot');
  83. Meta.RasterOp(GrConst.zREPz);
  84. END DispOpt;
  85. (*** do some keen patterns ***)
  86. PROCEDURE DispPatt();
  87. VAR
  88. i: INTEGER;
  89. BEGIN
  90. Meta.SetRect(R1, 0, 0, sR.Xmax, sR.Ymax);
  91. x := R1.Xmax DIV 32; y := R1.Ymax DIV 32;
  92. FOR i := 0 TO 15 DO
  93. Meta.PenColor(i);
  94. Meta.BackColor(15-i);
  95. Meta.FillRect(R1, i+16);
  96. Meta.FrameRect(R1);
  97. Meta.InsetRect(R1, x, y);
  98. END;
  99. END DispPatt;
  100. (*** Load the specified font. ***)
  101. PROCEDURE LoadFont(VAR fontName: ARRAY OF CHAR);
  102. VAR
  103. Dir: dirRec;
  104. qErr,
  105. loadErr: INTEGER;
  106. path: ARRAY[0..80] OF CHAR;
  107. fontBuf: adsFont;
  108. BEGIN
  109. Str.Copy(path, fontName);
  110. loadErr := -1; (* Preempt Error *)
  111. qErr := Meta.FileQuery(path, Dir, 1);
  112. IF (qErr # 1) THEN
  113. (* No font file in default dir, try environment variable *)
  114. Lib.EnvironmentFind("METAPATH", path);
  115. IF (path[0] # CHR(0)) THEN
  116. (* found the env parm, try using the path listed there *)
  117. IF (path[Str.Length(path)] # '\') THEN
  118. (* If no trailing slash, add one *)
  119. Str.Append(path, '\');
  120. END;
  121. Str.Append(path, fontName);
  122. qErr := Meta.FileQuery(path, Dir, 1);
  123. END;
  124. END;
  125. IF (qErr = 1) THEN
  126. (* we got our file *)
  127. ALLOCATE(ADDRESS(fontBuf), VAL(CARDINAL, Dir.fileSize + 1));
  128. IF (fontBuf # NIL) THEN
  129. (* We got our memory *)
  130. loadErr := Meta.FileLoad(path, ADDRESS(fontBuf), VAL(CARDINAL, Dir.fileSize+1));
  131. IF loadErr <= 0 THEN
  132. DEALLOCATE(ADDRESS(fontBuf), VAL(CARDINAL, Dir.fileSize + 1));
  133. END;
  134. Meta.SetFont(ADDRESS(fontBuf));
  135. END;
  136. END;
  137. IF (loadErr > 0) THEN
  138. (* clear out system load error *)
  139. qErr := Meta.QueryError();
  140. ELSE
  141. (* beep if font load probs *)
  142. IO.WrChar(CHR(7));
  143. Str.Copy(fontName, 'Using internal SYSTEM08.FNT');
  144. END;
  145. END LoadFont;
  146. PROCEDURE Insert(VAR S1: ARRAY OF CHAR; S2: ARRAY OF CHAR; Pos, Width: CARDINAL);
  147. VAR
  148. L1, L2, i: CARDINAL;
  149. BEGIN
  150. L1 := Str.Length(S1);
  151. L2 := Str.Length(S2);
  152. IF (Pos + Width) > L1 THEN
  153. RETURN
  154. END;
  155. IF L2 > Width THEN
  156. RETURN
  157. END;
  158. FOR i := 0 TO L2 DO
  159. S1[Pos + i] := S2[i];
  160. END;
  161. FOR i := Pos + L2 TO Pos + Width DO
  162. S1[i] := ' ';
  163. END;
  164. END Insert;
  165. BEGIN
  166. (* init the system *)
  167. GrQry.GrQuery(GrafixCard, CommPort);
  168. i := Meta.InitGrafix(-GrafixCard);
  169. IF (i # 0) THEN
  170. (* Display reason for no go *)
  171. GrQry.GrInitErr(GrafixCard, CommPort, i);
  172. END;
  173. Meta.ScreenRect(sR);
  174. Meta.SetDisplay(GrConst.GrafPg0);
  175. max_clr := Meta.QueryColors();
  176. px := sR.Xmax DIV 80;
  177. py := sR.Ymax DIV 25;
  178. Meta.SetRect(R1, px*60, py*18, px*70, py*22);
  179. Meta.PenColor(COLOR);
  180. Meta.FillRect(sR, 1);
  181. Meta.PenColor(GrConst.White);
  182. Meta.GetPort(thePort);
  183. i := thePort^.portBMap^.devClass;
  184. IF (thePort^.portBMap^.pixPlanes > 1) THEN
  185. i := INTEGER(BITSET(i) * BITSET(0FFF8H))
  186. END;
  187. Str.Copy(buf1, 'SYSTEM');
  188. Str.IntToStr(LONGINT(i), buf, 10, OK);
  189. Str.Append(buf1, buf);
  190. Str.Append(buf1, '.FNT');
  191. LoadFont(buf1);
  192. Meta.MoveTo(px, py);
  193. Meta.DrawString(buf1);
  194. (* Init the whirlagig *)
  195. Meta.PenSize(1, 1);
  196. maxgig := 39;
  197. x := px * 10;
  198. y := py * 8;
  199. j := py;
  200. FOR i := 0 TO 15 DO
  201. a[i] := x - px * 5;
  202. b[i] := j;
  203. j := j + py;
  204. END;
  205. (* Create a user-defined cursor to be a triangle *)
  206. scrMask.curWidth := 16; scrMask.curHeight := 16;
  207. scrMask.curAlign := 0; scrMask.curRowBytes := 2;
  208. scrMask.curBits := 1; scrMask.curPlanes := 1;
  209. scrMask.curData[0] := 000H; scrMask.curData[1] := 000H;
  210. scrMask.curData[2] := 000H; scrMask.curData[3] := 000H;
  211. scrMask.curData[4] := 000H; scrMask.curData[5] := 000H;
  212. scrMask.curData[6] := 000H; scrMask.curData[7] := 000H;
  213. scrMask.curData[8] := 000H; scrMask.curData[9] := 000H;
  214. scrMask.curData[10] := 000H; scrMask.curData[11] := 000H;
  215. scrMask.curData[12] := 000H; scrMask.curData[13] := 000H;
  216. scrMask.curData[14] := 001H; scrMask.curData[15] := 000H;
  217. scrMask.curData[16] := 003H; scrMask.curData[17] := 080H;
  218. scrMask.curData[18] := 007H; scrMask.curData[19] := 0C0H;
  219. scrMask.curData[20] := 00FH; scrMask.curData[21] := 0E0H;
  220. scrMask.curData[22] := 01FH; scrMask.curData[23] := 0F0H;
  221. scrMask.curData[24] := 03FH; scrMask.curData[25] := 0F8H;
  222. scrMask.curData[26] := 07FH; scrMask.curData[27] := 0FCH;
  223. scrMask.curData[28] := 000H; scrMask.curData[29] := 000H;
  224. scrMask.curData[30] := 000H; scrMask.curData[31] := 000H;
  225. csrMask.curWidth := 16; csrMask.curHeight := 16;
  226. csrMask.curAlign := 0; csrMask.curRowBytes := 2;
  227. csrMask.curBits := 1; csrMask.curPlanes := 1;
  228. csrMask.curData[0] := 000H; csrMask.curData[1] := 000H;
  229. csrMask.curData[2] := 000H; csrMask.curData[3] := 000H;
  230. csrMask.curData[4] := 000H; csrMask.curData[5] := 000H;
  231. csrMask.curData[6] := 000H; csrMask.curData[7] := 000H;
  232. csrMask.curData[8] := 000H; csrMask.curData[9] := 000H;
  233. csrMask.curData[10] := 000H; csrMask.curData[11] := 000H;
  234. csrMask.curData[12] := 001H; csrMask.curData[13] := 000H;
  235. csrMask.curData[14] := 002H; csrMask.curData[15] := 080H;
  236. csrMask.curData[16] := 004H; csrMask.curData[17] := 040H;
  237. csrMask.curData[18] := 008H; csrMask.curData[19] := 020H;
  238. csrMask.curData[20] := 010H; csrMask.curData[21] := 010H;
  239. csrMask.curData[22] := 020H; csrMask.curData[23] := 008H;
  240. csrMask.curData[24] := 040H; csrMask.curData[25] := 004H;
  241. csrMask.curData[26] := 080H; csrMask.curData[27] := 002H;
  242. csrMask.curData[28] := 0FFH; csrMask.curData[29] := 0FEH;
  243. csrMask.curData[30] := 000H; csrMask.curData[31] := 000H;
  244. Meta.DefineCursor(2, 8, 8, scrMask, csrMask);
  245. (* Now turn on mouse and event queue stuff *)
  246. Meta.InitMouse(CommPort);
  247. Meta.ScaleMouse (sR.Xmax DIV 40, sR.Ymax DIV 40);
  248. ox := 100;
  249. x := 100;
  250. oy := 100;
  251. y := 100;
  252. Meta.MoveCursor(x, y);
  253. FOR i := 0 TO 7 DO
  254. bm[i] := i;
  255. END;
  256. bm[4] := 0; (* arrow *)
  257. bm[5] := 2; (* new pointy thing *)
  258. Meta.CursorMap(bm);
  259. bol := TRUE;
  260. bol1 := TRUE;
  261. (* Enable mouse autotracking & event queue*)
  262. Meta.TrackCursor(bol);
  263. Meta.ShowCursor();
  264. Meta.EventQueue(TRUE);
  265. (* flush event queue *)
  266. WHILE Meta.KeyEvent(FALSE, evnt) DO
  267. ;
  268. END;
  269. DispOpt();
  270. Meta.LimitMouse(sR.Xmin-20, sR.Ymin-20, sR.Xmax+20, sR.Ymax+20);
  271. clr := 0;
  272. evCnt := 0;
  273. Meta.RasterOp(GrConst.zREPz);
  274. (* Init messages *)
  275. Str.Copy(Msg1, 'event= ascii= scan= state= x= y= time= ');
  276. Str.Copy(Msg2, 'x= y= sw= time= ');
  277. REPEAT
  278. Meta.QueryCursor(pt.X, pt.Y, i, j);
  279. IF Meta.KeyEvent(FALSE, evnt) THEN
  280. CASE evnt.ASCII OF
  281. | 't': (* t will flip tracking on/off *)
  282. bol := NOT(bol);
  283. Meta.TrackCursor(bol);
  284. | 'c': (* clears screen *)
  285. Meta.HideCursor();
  286. Meta.PenColor(COLOR);
  287. Meta.FillRect(sR, 1);
  288. Meta.PenColor(GrConst.White);
  289. DispOpt();
  290. Meta.ShowCursor();
  291. | 'f': (* f will flip port origin *)
  292. Meta.HideCursor();
  293. bol1 := NOT(bol1);
  294. Meta.PortOrigin(bol1);
  295. Meta.PenColor(COLOR);
  296. Meta.FillRect(sR, 1);
  297. Meta.PenColor(GrConst.White);
  298. DispOpt();
  299. Meta.ShowCursor();
  300. | 'w': (* w for the whilagig *)
  301. Meta.HideCursor();
  302. Meta.RasterOp (GrConst.zXORz);
  303. FOR i := 0 TO maxgig DO
  304. FOR j := 0 TO 15 DO
  305. Meta.MoveTo (pt.X, pt.Y);
  306. Meta.LineTo (a[j], b[j]);
  307. END
  308. END;
  309. Meta.RasterOp(GrConst.zREPz);
  310. Meta.ShowCursor();
  311. END;
  312. INC(evCnt);
  313. Str.IntToStr(LONGINT(evCnt), buf, 10, OK);
  314. Insert(Msg1, buf, 6, 2);
  315. Str.IntToStr(LONGINT(evnt.ASCII), buf, 16, OK);
  316. Insert(Msg1, buf, 16, 2);
  317. Str.IntToStr(LONGINT(evnt.ScanCode), buf, 16, OK);
  318. Insert(Msg1, buf, 25, 2);
  319. Str.IntToStr(LONGINT(evnt.State), buf, 16, OK);
  320. Insert(Msg1, buf, 35, 4);
  321. Str.IntToStr(LONGINT(evnt.CursorX), buf, 10, OK);
  322. Insert(Msg1, buf, 43, 3);
  323. Str.IntToStr(LONGINT(evnt.CursorY), buf, 10, OK);
  324. Insert(Msg1, buf, 50, 3);
  325. Str.IntToStr(LONGINT(evnt.Time), buf, 10, OK);
  326. Insert(Msg1, buf, 60, 5);
  327. Meta.MoveTo(px*6, py*2);
  328. Meta.DrawString(Msg1);
  329. ELSIF (evnt.Time MOD 8) = 0 THEN
  330. Meta.ProtectRect(R1);
  331. Meta.PenColor(clr);
  332. Meta.FillRect(R1, 1);
  333. Meta.ProtectOff();
  334. INC(clr);
  335. IF (clr > max_clr) THEN
  336. clr := 0
  337. END;
  338. END;
  339. (*** etch-a-sketch ***)
  340. IF j = (GrConst.swRight + GrConst.swLeft) THEN
  341. Meta.PenColor(GrConst.Black);
  342. Meta.HideCursor();
  343. Meta.MoveTo(ox, oy);
  344. Meta.LineTo(pt.X, pt.Y);
  345. Meta.ShowCursor();
  346. ELSE
  347. IF INTEGER(BITSET(j) * BITSET(GrConst.swLeft)) # 0 THEN
  348. Meta.PenColor(GrConst.Black);
  349. Meta.HideCursor();
  350. Meta.MoveTo(ox, oy);
  351. Meta.LineTo(pt.X, pt.Y);
  352. Meta.ShowCursor();
  353. END;
  354. ox := pt.X;
  355. oy := pt.Y;
  356. END;
  357. Meta.PenColor(GrConst.White);
  358. Str.IntToStr(LONGINT(evnt.CursorX), buf, 10, OK);
  359. Insert(Msg2, buf, 2, 3);
  360. Str.IntToStr(LONGINT(evnt.CursorY), buf, 10, OK);
  361. Insert(Msg2, buf, 9, 3);
  362. Str.IntToStr(LONGINT(j), buf, 10, OK);
  363. Insert(Msg2, buf, 17, 2);
  364. Str.IntToStr(LONGINT(evnt.Time), buf, 10, OK);
  365. Insert(Msg2, buf, 26, 6);
  366. Meta.MoveTo(px*6, py*4);
  367. Meta.DrawString(Msg2);
  368. IF Meta.PtInRect(pt, R1) THEN
  369. Meta.DrawString(" pt IS in rect ");
  370. ELSE
  371. Meta.DrawString(" pt NOT in rect ");
  372. END;
  373. Meta.RasterOp(GrConst.zXORz);
  374. Meta.MoveTo(px*79, py*4);
  375. Meta.LineTo(px*79, py*20);
  376. Meta.RasterOp(GrConst.zREPz);
  377. UNTIL ((pt.X <= -20) AND ((evnt.ASCII # CHR(3)) AND (evnt.ScanCode # BYTE(02EH))));
  378. Meta.TrackCursor(FALSE);
  379. Meta.HideCursor();
  380. Meta.BackColor(COLOR);
  381. (* Scroll a rectangle into screen *)
  382. Meta.RasterOp(GrConst.zXORz);
  383. Meta.FrameRect(R1);
  384. Meta.RasterOp(GrConst.zREPz);
  385. FOR i := 0 TO 30 DO
  386. Meta.ScrollRect(R1, 0, -4);
  387. Meta.OffsetRect(R1, 0, -4);
  388. END;
  389. FOR i := 0 TO 40 DO
  390. Meta.ScrollRect(R1, 8, 0);
  391. Meta.OffsetRect(R1, 8, 0);
  392. END;
  393. mwDelay(sec);
  394. (* pretty patterns to end with *)
  395. DispPatt();
  396. mwDelay(sec*3);
  397. GrQry.GrQuit('', 0);
  398. END Testtrak.