MGDEMO.MOD 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. MODULE MGdemo;
  2. IMPORT Graph, IO, Lib, SYSTEM, Storage;
  3. TYPE
  4. PieInfo = RECORD
  5. state: CARDINAL;
  6. x1, y1, x2, y2: CARDINAL;
  7. startx, starty: CARDINAL;
  8. CurrentX: CARDINAL;
  9. CurrentY: CARDINAL;
  10. fill: BOOLEAN;
  11. color: CARDINAL;
  12. END;
  13. PieHandle = POINTER TO PieInfo;
  14. TYPE
  15. ColorArray = ARRAY [0..15] OF LONGCARD;
  16. SmallColorArray = ARRAY [0..3] OF CARDINAL;
  17. CONST
  18. Colors = ColorArray( Graph._BLACK, Graph._BLUE, Graph._GREEN, Graph._CYAN, Graph._RED, Graph._MAGENTA, Graph._BROWN,
  19. Graph._WHITE, Graph._GRAY, Graph._LIGHTBLUE, Graph._LIGHTGREEN, Graph._LIGHTCYAN,
  20. Graph._LIGHTRED, Graph._LIGHTMAGENTA, Graph._LIGHTYELLOW, Graph._BRIGHTWHITE);
  21. VAR
  22. Mono: BOOLEAN;
  23. XValues: ARRAY [0..3] OF CARDINAL;
  24. YValues: ARRAY [0..3] OF CARDINAL;
  25. cv: Graph.VideoConfig;
  26. Patterns: ARRAY [0..4] OF Graph.FillMaskType;
  27. PROCEDURE Max(V1, V2: CARDINAL): CARDINAL;
  28. BEGIN
  29. IF V1 > V2 THEN
  30. RETURN V1;
  31. ELSE
  32. RETURN V2;
  33. END;
  34. END Max;
  35. PROCEDURE TestKey;
  36. BEGIN
  37. IF CAP(IO.RdKey()) = 'X' THEN
  38. SYSTEM.Eval(Graph.SetVideoMode(Graph._DEFAULTMODE));
  39. HALT;
  40. END; (*IF*)
  41. END TestKey;
  42. PROCEDURE InitPalette();
  43. VAR
  44. i: CARDINAL;
  45. red, green, blue: CARDINAL;
  46. color: LONGCARD;
  47. colors: ARRAY [0..255] OF LONGCARD;
  48. BEGIN
  49. i:=0;
  50. SYSTEM.Eval(Graph.SetVideoMode(Graph._MRES256COLOR));
  51. WHILE i < 256 DO
  52. red :=CARDINAL(BITSET(i)* BITSET(0E0H))>>2;
  53. green:=CARDINAL(BITSET(i) * BITSET(01CH))<<1;
  54. blue :=CARDINAL(BITSET(i) * BITSET(3))<<4;
  55. color:= (LONGCARD(blue)<<16) + (LONGCARD(green)<<8) + LONGCARD(red);
  56. colors[i]:=color;
  57. INC(i);
  58. END;
  59. SYSTEM.Eval(Graph.RemapAllPalette(colors));
  60. END InitPalette;
  61. PROCEDURE AdjustRGB(VAR red, green, blue: CARDINAL);
  62. VAR
  63. nr, nb, ng: CARDINAL;
  64. BEGIN
  65. IF (red >= blue) AND (red >= green) THEN
  66. nr:=255;
  67. ng:=(green*255) DIV red;
  68. nb:=(blue*255) DIV red;
  69. ELSIF (green >= red) AND (green >= blue) THEN
  70. ng:=255;
  71. nr:=(red*255) DIV green;
  72. nb:=(blue*255) DIV green;
  73. ELSE
  74. nb:=255;
  75. ng:=(green*255) DIV blue;
  76. nr:=(red*255) DIV blue;
  77. END;
  78. red:=nr;
  79. blue:=nb;
  80. green:=ng;
  81. END AdjustRGB;
  82. PROCEDURE PlotRGB(x, y, red, green, blue: CARDINAL);
  83. VAR
  84. r, g, b, color: CARDINAL;
  85. BEGIN
  86. r:=CARDINAL(BITSET(red) * BITSET(0E0H));
  87. g:=CARDINAL(BITSET(green) * BITSET(0E0H))>>3;
  88. b:=CARDINAL(BITSET(blue) * BITSET(0C0H))>>6;
  89. color:= CARDINAL(BITSET(r) + BITSET(g) + BITSET(b));
  90. Graph.Plot(x+20, y, color);
  91. END PlotRGB;
  92. PROCEDURE VGATriangle();
  93. VAR
  94. x, y: CARDINAL;
  95. red, green, blue: CARDINAL;
  96. BEGIN
  97. InitPalette();
  98. x:=0;
  99. WHILE x < 256 DO
  100. y:=0;
  101. WHILE y < 200 DO
  102. red:=x;
  103. green:=(y*255) DIV 200;
  104. IF (red+green) < 255 THEN
  105. blue:=255-(red+green);
  106. AdjustRGB(red, green, blue);
  107. PlotRGB(x, y, red, green, blue);
  108. END;
  109. INC(y);
  110. END;
  111. INC(x);
  112. END;
  113. SYSTEM.Eval(Graph.SetTextColor(10));
  114. SYSTEM.Eval(Graph.SetTextPosition(25, 5));
  115. Graph.OutText('Hit Any Key To Continue,X To Exit.');
  116. TestKey;
  117. SYSTEM.Eval(Graph.SetVideoMode(Graph._ERESCOLOR));
  118. END VGATriangle;
  119. PROCEDURE DrawEllipses();
  120. VAR
  121. n: INTEGER;
  122. f: BOOLEAN;
  123. x1, x2, y1, y2: CARDINAL;
  124. c: CARDINAL;
  125. BEGIN
  126. n:=0;
  127. c:=1;
  128. f:=Graph._GFILLINTERIOR;
  129. Patterns[0] := Graph.FillMaskType(88H, 44H, 22H, 11H, 88H, 44H, 22H, 11H);
  130. Patterns[1] := Graph.FillMaskType(0AAH, 0AAH, 0AAH, 0AAH, 0AAH, 0AAH, 0AAH, 0AAH);
  131. Patterns[2] := Graph.FillMaskType(0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH);
  132. Patterns[3] := Graph.FillMaskType(0FFH, 40H, 0FFH, 40H, 0FFH, 40H, 0FFH, 40H);
  133. Patterns[4] := Graph.FillMaskType(80H, 40H, 20H, 10H, 08H, 04H, 02H, 01H);
  134. LOOP
  135. IF n = 100 THEN
  136. EXIT;
  137. END;
  138. INC(n);
  139. IF IO.KeyPressed() THEN
  140. EXIT;
  141. END;
  142. Graph.SetFillMask(Patterns[Lib.RANDOM(5)]);
  143. x1:=Lib.RANDOM(cv.numxpixels-1);
  144. y1:=Lib.RANDOM(cv.numypixels-1);
  145. x2:=Lib.RANDOM(cv.numxpixels-x1);
  146. y2:=Lib.RANDOM(cv.numypixels-y1);
  147. IF f = Graph._GFILLINTERIOR THEN
  148. f:=Graph._GBORDER;
  149. ELSE
  150. f:=Graph._GFILLINTERIOR;
  151. END;
  152. Graph.Ellipse(x1, y1, x2, y2, c, f);
  153. INC(c);
  154. IF c = cv.numcolors THEN
  155. c:=1;
  156. END;
  157. END;
  158. IF NOT Mono THEN
  159. SYSTEM.Eval(Graph.SetTextPosition(25, 1));
  160. Graph.OutText('Press Any Key To Continue, X To Exit');
  161. END;
  162. TestKey;
  163. END DrawEllipses;
  164. PROCEDURE Ellipses(scale: CARDINAL);
  165. BEGIN
  166. Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
  167. Graph.ClearScreen(Graph._GCLEARSCREEN);
  168. DrawEllipses();
  169. Graph.ClearScreen(Graph._GCLEARSCREEN);
  170. Graph.Rectangle(49 DIV scale, 24 DIV scale, 501 DIV scale, 291 DIV scale, 3, Graph._GBORDER);
  171. Graph.SetClipRgn(50 DIV scale, 25 DIV scale, 500 DIV scale, 290 DIV scale);
  172. DrawEllipses();
  173. Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
  174. END Ellipses;
  175. PROCEDURE InitPie(x1, y1, x2, y2: CARDINAL; InitState, scale: CARDINAL; fill: BOOLEAN): PieHandle;
  176. VAR
  177. p: PieHandle;
  178. BEGIN
  179. Storage.ALLOCATE(p, SIZE(PieInfo));
  180. p^.x1:=x1 DIV scale;
  181. p^.y1:=y1 DIV scale;
  182. p^.x2:=x2 DIV scale;
  183. p^.y2:=y2 DIV scale;
  184. p^.CurrentX:=XValues[InitState];
  185. p^.CurrentY:=YValues[InitState];
  186. p^.startx:=XValues[InitState];
  187. p^.starty:=YValues[InitState];
  188. p^.state:=InitState;
  189. p^.fill:=fill;
  190. IF Mono THEN
  191. p^.color:=1;
  192. ELSE
  193. p^.color:=Lib.RANDOM(cv.numcolors-2)+1;
  194. END;
  195. Graph.Pie(p^.x1, p^.y1, p^.x2, p^.y2, p^.CurrentX, p^.CurrentY, p^.CurrentX, p^.CurrentY, p^.color, fill);
  196. RETURN p;
  197. END InitPie;
  198. PROCEDURE DisposePie(p: PieHandle);
  199. BEGIN
  200. Storage.DEALLOCATE(p, SIZE(PieInfo));
  201. END DisposePie;
  202. PROCEDURE Circulate(p: PieHandle);
  203. BEGIN
  204. Graph.SetFillMask(Patterns[2]);
  205. Graph.Rectangle(p^.x1-p^.x2, p^.y1-p^.y2, p^.x1+p^.x2, p^.y1+p^.y2, 0, Graph._GFILLINTERIOR);
  206. IF p^.state = 0 THEN
  207. IF p^.CurrentY > 0 THEN
  208. DEC(p^.CurrentY, 4);
  209. ELSE
  210. INC(p^.state);
  211. END;
  212. END;
  213. IF p^.state = 1 THEN
  214. IF p^.CurrentX > 0 THEN
  215. DEC(p^.CurrentX, 8);
  216. ELSE
  217. INC(p^.state);
  218. END;
  219. END;
  220. IF p^.state = 2 THEN
  221. IF p^.CurrentY < cv.numypixels THEN
  222. INC(p^.CurrentY, 4);
  223. ELSE
  224. INC(p^.state);
  225. END;
  226. END;
  227. IF p^.state = 3 THEN
  228. IF p^.CurrentX < cv.numxpixels THEN
  229. INC(p^.CurrentX, 8);
  230. ELSE
  231. p^.state:=0;
  232. END;
  233. END;
  234. IF p^.fill = Graph._GFILLINTERIOR THEN
  235. Graph.SetFillMask(Patterns[Lib.RANDOM(5)]);
  236. END;
  237. Graph.Pie(p^.x1, p^.y1, p^.x2, p^.y2, p^.CurrentX, p^.CurrentY,
  238. p^.startx, p^.starty, p^.color, p^.fill);
  239. END Circulate;
  240. PROCEDURE Pies(scale: INTEGER);
  241. VAR
  242. p: ARRAY [0..4] OF PieHandle;
  243. n: INTEGER;
  244. BEGIN
  245. n:=0;
  246. XValues[0]:=cv.numxpixels-1;
  247. XValues[1]:=cv.numxpixels-1;
  248. XValues[2]:=0;
  249. XValues[3]:=0;
  250. YValues[0]:=cv.numypixels-1;
  251. YValues[1]:=0;
  252. YValues[2]:=0;
  253. YValues[3]:=cv.numypixels-1;
  254. Graph.ClearScreen(Graph._GCLEARSCREEN);
  255. Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
  256. p[0]:=InitPie(80, 60, 50, 30, 0, scale, Graph._GBORDER);
  257. p[1]:=InitPie(510, 70, 60, 60, 1, scale, Graph._GFILLINTERIOR);
  258. p[2]:=InitPie(70, 255, 30, 55, 2, scale, Graph._GFILLINTERIOR);
  259. p[3]:=InitPie(450, 200, 55, 35, 3, scale, Graph._GBORDER);
  260. p[4]:=InitPie(320, 160, 45, 45, 0, scale, Graph._GFILLINTERIOR);
  261. IF NOT Mono THEN
  262. SYSTEM.Eval(Graph.SetTextPosition(25, 1));
  263. Graph.OutText('Press Any Key To Continue, X To Exit');
  264. END;
  265. WHILE NOT IO.KeyPressed() DO
  266. IF n = 5 THEN
  267. n:=0;
  268. END;
  269. Circulate(p[n]);
  270. INC(n);
  271. END;
  272. TestKey;
  273. n:=0;
  274. WHILE n < 5 DO
  275. DisposePie(p[n]);
  276. INC(n);
  277. END;
  278. Graph.ClearScreen(Graph._GCLEARSCREEN);
  279. Graph.SetFillMask(Patterns[2]);
  280. END Pies;
  281. VAR
  282. spotlist: ARRAY [0..5] OF ARRAY [0..5] OF Graph.GraphCoords;
  283. PROCEDURE DrawCircles(patnum, start, depth, width: INTEGER);
  284. VAR
  285. n: INTEGER;
  286. x, y, xpos, ypos: CARDINAL;
  287. BEGIN
  288. n:=0;
  289. LOOP
  290. x:=spotlist[patnum-1][n].xcoord;
  291. IF x = 0 THEN EXIT END;
  292. xpos:=CARDINAL(width>>2)*x;
  293. y:=spotlist[patnum-1][n].ycoord;
  294. ypos:=CARDINAL(depth>>3)*y+CARDINAL(start);
  295. Graph.Ellipse(xpos, ypos, 4, 4, cv.numcolors-1, Graph._GFILLINTERIOR);
  296. INC(n);
  297. IF n = 6 THEN
  298. EXIT;
  299. END;
  300. END;
  301. END DrawCircles;
  302. PROCEDURE MoveSideways(image: ADDRESS; pos: ARRAY OF CARDINAL;
  303. limit: CARDINAL; incr: INTEGER): CARDINAL;
  304. VAR
  305. x, y: CARDINAL;
  306. ret: INTEGER;
  307. BEGIN
  308. x:=0;
  309. y:=0;
  310. ret:=0;
  311. LOOP
  312. IF x = pos[limit] THEN EXIT END;
  313. Graph.PutImage(x, y, image, Graph._GXOR);
  314. INC(x, incr);
  315. Graph.PutImage(x, y, image, Graph._GPSET);
  316. IF IO.KeyPressed() THEN
  317. TestKey;
  318. ret:=1;
  319. EXIT;
  320. END;
  321. END;
  322. RETURN ret;
  323. END MoveSideways;
  324. PROCEDURE MoveDown(image: ADDRESS; pos: ARRAY OF CARDINAL;
  325. limit: CARDINAL; xpos: CARDINAL; incr: INTEGER): INTEGER;
  326. VAR
  327. y: CARDINAL;
  328. ret: INTEGER;
  329. BEGIN
  330. y:=0;
  331. ret:=0;
  332. LOOP
  333. IF y = pos[limit] THEN EXIT END;
  334. Graph.PutImage(xpos, y, image, Graph._GXOR);
  335. INC(y, incr);
  336. Graph.PutImage(xpos, y, image, Graph._GPSET);
  337. IF IO.KeyPressed() THEN
  338. TestKey;
  339. ret:=1;
  340. EXIT;
  341. END;
  342. END;
  343. RETURN ret;
  344. END MoveDown;
  345. PROCEDURE DrawSpots(number, start, depth, width: INTEGER);
  346. VAR
  347. pattern: ARRAY [0..2] OF CARDINAL;
  348. n: CARDINAL;
  349. BEGIN
  350. IF number = 0 THEN RETURN END;
  351. CASE number OF
  352. | 1:
  353. pattern[0]:=1;
  354. pattern[1]:=0;
  355. | 2:
  356. pattern[0]:=2;
  357. pattern[1]:=0;
  358. | 3:
  359. pattern[0]:=2;
  360. pattern[1]:=1;
  361. pattern[2]:=0;
  362. | 4:
  363. pattern[0]:=4;
  364. pattern[1]:=0;
  365. | 5:
  366. pattern[0]:=4;
  367. pattern[1]:=1;
  368. pattern[2]:=0;
  369. | 6:
  370. pattern[0]:=6;
  371. pattern[1]:=0;
  372. END;
  373. n:=0;
  374. WHILE pattern[n] # 0 DO
  375. DrawCircles(pattern[n], start, depth, width);
  376. INC(n);
  377. END;
  378. END DrawSpots;
  379. PROCEDURE DrawDomino(depth, width: INTEGER);
  380. VAR
  381. spots: INTEGER;
  382. BEGIN
  383. Graph.Rectangle(0, 0, width, depth, cv.numcolors-1, Graph._GBORDER);
  384. Graph.Line(0, depth DIV 2, width, depth DIV 2, cv.numcolors-1);
  385. spots:=Lib.RANDOM(7);
  386. DrawSpots(spots, 0, depth, width);
  387. spots:=Lib.RANDOM(7);
  388. DrawSpots(spots, depth DIV 2, depth, width);
  389. END DrawDomino;
  390. PROCEDURE MakeDomino(depth, width: INTEGER): ADDRESS;
  391. VAR
  392. Buffer: ADDRESS;
  393. size: LONGCARD;
  394. BEGIN
  395. size:=Graph.ImageSize(0, 0, width, depth);
  396. Storage.ALLOCATE(Buffer, CARDINAL(size));
  397. DrawDomino(depth, width);
  398. Graph.GetImage(0, 0, width, depth, Buffer);
  399. RETURN Buffer;
  400. END MakeDomino;
  401. PROCEDURE Animation(adapter: CARDINAL);
  402. VAR
  403. ColPosition: ARRAY [0..10] OF CARDINAL;
  404. RowPosition: ARRAY [0..2] OF CARDINAL;
  405. count, width, depth, incr: INTEGER;
  406. MaxRow, MaxCol, clear: INTEGER;
  407. CurrentRow, CurrentCol: INTEGER;
  408. image: ADDRESS;
  409. BEGIN
  410. spotlist[0][0]:= Graph.GraphCoords(2, 2);
  411. spotlist[1][0]:= Graph.GraphCoords(1, 1);
  412. spotlist[1][1]:= Graph.GraphCoords(3, 3);
  413. spotlist[2][0]:= Graph.GraphCoords(0, 0);
  414. spotlist[3][0]:= Graph.GraphCoords(1, 1);
  415. spotlist[3][1]:= Graph.GraphCoords(3, 1);
  416. spotlist[3][2]:= Graph.GraphCoords(1, 3);
  417. spotlist[3][3]:= Graph.GraphCoords(3, 3);
  418. spotlist[4][0]:= Graph.GraphCoords(0, 0);
  419. spotlist[5][0]:= Graph.GraphCoords(1, 1);
  420. spotlist[5][1]:= Graph.GraphCoords(3, 1);
  421. spotlist[5][2]:= Graph.GraphCoords(1, 2);
  422. spotlist[5][3]:= Graph.GraphCoords(3, 2);
  423. spotlist[5][4]:= Graph.GraphCoords(1, 3);
  424. spotlist[5][5]:= Graph.GraphCoords(3, 3);
  425. Graph.ClearScreen(Graph._GCLEARSCREEN);
  426. Graph.SetFillMask(Patterns[2]);
  427. IF (adapter = Graph._EGA) OR (adapter = Graph._HGC) THEN
  428. width:=50;
  429. depth:=100;
  430. MaxRow:=2;
  431. MaxCol:=9;
  432. clear:=20;
  433. incr:=10;
  434. ELSE
  435. width:=50;
  436. depth:=90;
  437. MaxRow:=1;
  438. MaxCol:=4;
  439. clear:=10;
  440. incr:=5;
  441. END;
  442. count:=0;
  443. WHILE count <= MaxCol DO
  444. ColPosition[count]:=count*(width+10);
  445. INC(count);
  446. END;
  447. count:=0;
  448. WHILE count <= MaxRow DO
  449. RowPosition[count]:=count*(depth+clear);
  450. INC(count);
  451. END;
  452. CurrentCol:=MaxCol;
  453. CurrentRow:=MaxRow;
  454. LOOP
  455. IF CurrentCol < 0 THEN EXIT END;
  456. image:=MakeDomino(depth, width);
  457. IF CurrentCol > 0 THEN
  458. IF MoveSideways(image, ColPosition, CurrentCol, incr) # 0 THEN
  459. EXIT;
  460. END;
  461. END;
  462. IF CurrentRow > 0 THEN
  463. IF MoveDown(image, RowPosition, CurrentRow, ColPosition[CurrentCol], incr) # 0 THEN
  464. EXIT;
  465. END;
  466. DEC(CurrentRow);
  467. ELSE
  468. DEC(CurrentCol);
  469. CurrentRow:=MaxRow;
  470. END;
  471. Storage.DEALLOCATE(image, CARDINAL(Graph.ImageSize(0, 0, width, depth)));
  472. IF IO.KeyPressed() THEN
  473. EXIT;
  474. END;
  475. END;
  476. IF NOT Mono THEN
  477. SYSTEM.Eval(Graph.SetTextPosition(25, 1));
  478. Graph.OutText('Press Any Key To Continue, X To Exit.');
  479. END;
  480. TestKey;
  481. END Animation;
  482. PROCEDURE Bars(scale: INTEGER);
  483. VAR
  484. x1, y1,x2, y2, x3, y3, x4, y4: CARDINAL;
  485. NewMask: Graph.FillMaskType;
  486. BEGIN
  487. Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
  488. Graph.ClearScreen(Graph._GCLEARSCREEN);
  489. x1:=460 DIV scale;
  490. y1:=150 DIV scale;
  491. x2:=140 DIV scale;
  492. y2:=130 DIV scale;
  493. x4:=300 DIV scale;
  494. y4:=260 DIV scale;
  495. x3:=620 DIV scale;
  496. y3:=260 DIV scale;
  497. Graph.Pie(x1, y1, x2, y2, x3, y3, x4, y4, Max(4 MOD cv.numcolors, 1), Graph._GFILLINTERIOR);
  498. x1:=460 DIV scale;
  499. y1:=170 DIV scale;
  500. x2:=140 DIV scale;
  501. y2:=130 DIV scale;
  502. x3:=300 DIV scale;
  503. y3:=280 DIV scale;
  504. x4:=620 DIV scale;
  505. y4:=280 DIV scale;
  506. Graph.Pie(x1, y1, x2, y2, x3, y3, x4, y4, Max(3 MOD cv.numcolors, 1), Graph._GBORDER);
  507. NewMask[0]:=88H;
  508. NewMask[1]:=44H;
  509. NewMask[2]:=22H;
  510. NewMask[3]:=11H;
  511. NewMask[4]:=88H;
  512. NewMask[5]:=44H;
  513. NewMask[6]:=22H;
  514. NewMask[7]:=11H;
  515. Graph.SetFillMask(NewMask);
  516. x1:=19 DIV scale;
  517. y1:=10 DIV scale;
  518. x2:=x1;
  519. y2:=321 DIV scale;
  520. x3:=600 DIV scale;
  521. y3:=y2;
  522. Graph.Line(x1, y1, x2, y2, cv.numcolors-1);
  523. Graph.Line(x2, y2, x3, y3, cv.numcolors-1);
  524. IF NOT Mono THEN
  525. SYSTEM.Eval(Graph.SetTextPosition(25, 13 DIV scale));
  526. Graph.OutText('Bar Graphs and Pie Charts');
  527. END;
  528. x1:=20 DIV scale;
  529. y1:=20 DIV scale;
  530. x2:=59 DIV scale;
  531. y2:=320 DIV scale;
  532. Graph.Cube(Graph._GTOP, x1, y1, x2, y2, 20 DIV scale, Max(1 MOD cv.numcolors, 1), Graph._GFILLINTERIOR);
  533. x1:=60 DIV scale;
  534. y1:=120 DIV scale;
  535. x2:=99 DIV scale;
  536. y2:=320 DIV scale;
  537. Graph.Cube(Graph._GTOP, x1, y1, x2, y2, 20 DIV scale, Max(2 MOD cv.numcolors, 1),Graph._GFILLINTERIOR);
  538. x1:=100 DIV scale;
  539. y1:=80 DIV scale;
  540. x2:=139 DIV scale;
  541. y2:=320 DIV scale;
  542. Graph.Cube(Graph._GTOP, x1, y1, x2, y2, 20 DIV scale, Max(3 MOD cv.numcolors, 1), Graph._GFILLINTERIOR );
  543. x1:=140 DIV scale;
  544. y1:=200 DIV scale;
  545. x2:=179 DIV scale;
  546. y2:=320 DIV scale;
  547. Graph.Cube(Graph._GTOP, x1, y1, x2, y2, 20 DIV scale, Max(4 MOD cv.numcolors, 1), Graph._GFILLINTERIOR);
  548. SYSTEM.Eval(IO.RdKey());
  549. END Bars;
  550. PROCEDURE RandColor(): CARDINAL;
  551. VAR
  552. color: CARDINAL;
  553. BEGIN
  554. color:=Lib.RANDOM(cv.numcolors);
  555. IF color = 0 THEN
  556. color:=cv.numcolors-1;
  557. END;
  558. RETURN color;
  559. END RandColor;
  560. PROCEDURE DrawLines();
  561. VAR
  562. x, y, col: CARDINAL;
  563. MaxX, MaxY: CARDINAL;
  564. top, left, bottom, right: CARDINAL;
  565. i, limit: INTEGER;
  566. BEGIN
  567. Graph.ClearScreen(Graph._GCLEARSCREEN);
  568. top:=0;
  569. left:=0;
  570. bottom:=cv.numypixels - 1;
  571. right :=cv.numxpixels - 1;
  572. MaxX:=cv.numxpixels - 1;
  573. MaxY:=cv.numypixels - 1;
  574. limit:=cv.numcolors-1;
  575. col:=0;
  576. i := 0;
  577. WHILE (i <= limit) & ~IO.KeyPressed() DO
  578. INC(col);
  579. Graph.SetClipRgn(left, top, right, bottom);
  580. INC(top, 4);
  581. INC(left, 4);
  582. DEC(bottom, 4);
  583. DEC(right, 4);
  584. x := 0;
  585. WHILE x <= MaxX DO
  586. Graph.Line(x, 0, MaxX - x,MaxY, col);
  587. INC(x, 4);
  588. END;
  589. y := 0;
  590. WHILE y <= MaxY DO
  591. Graph.Line(MaxX, y, 0, MaxY - y, col);
  592. INC(y, 2);
  593. END;
  594. INC(i);
  595. END;
  596. SYSTEM.Eval(Graph.SetTextPosition(25, 1));
  597. Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
  598. IF NOT Mono THEN
  599. Graph.OutText('Press Any Key To Continue, X To Exit.');
  600. END;
  601. TestKey;
  602. Graph.ClearScreen(Graph._GCLEARSCREEN);
  603. END DrawLines;
  604. PROCEDURE DrawLogo(scale: INTEGER; Cols: SmallColorArray);
  605. VAR
  606. mode: BOOLEAN;
  607. BEGIN
  608. IF Mono THEN
  609. mode:=Graph._GBORDER;
  610. ELSE
  611. mode:=Graph._GFILLINTERIOR;
  612. END;
  613. Graph.Rectangle(140 DIV scale, 20 DIV scale, 500 DIV scale, 330 DIV scale, Cols[0], mode);
  614. Graph.Line(225 DIV scale, 110 DIV scale, 320 DIV scale, 140 DIV scale, Cols[1]);
  615. Graph.Line(320 DIV scale, 140 DIV scale, 415 DIV scale, 110 DIV scale, Cols[1]);
  616. Graph.Line(415 DIV scale, 110 DIV scale, 460 DIV scale, 125 DIV scale, Cols[1]);
  617. Graph.Line(460 DIV scale, 125 DIV scale, 460 DIV scale, 225 DIV scale, Cols[1]);
  618. Graph.Line(460 DIV scale, 225 DIV scale, 365 DIV scale, 255 DIV scale, Cols[1]);
  619. Graph.Line(365 DIV scale, 255 DIV scale, 365 DIV scale, 285 DIV scale, Cols[1]);
  620. Graph.Line(365 DIV scale, 285 DIV scale, 320 DIV scale, 300 DIV scale, Cols[1]);
  621. Graph.Line(320 DIV scale, 300 DIV scale, 180 DIV scale, 255 DIV scale, Cols[1]);
  622. Graph.Line(180 DIV scale, 255 DIV scale, 180 DIV scale, 190 DIV scale, Cols[1]);
  623. Graph.Line(180 DIV scale, 190 DIV scale, 225 DIV scale, 205 DIV scale, Cols[1]);
  624. Graph.Line(225 DIV scale, 205 DIV scale, 225 DIV scale, 235 DIV scale, Cols[1]);
  625. Graph.Line(225 DIV scale, 235 DIV scale, 270 DIV scale, 250 DIV scale, Cols[1]);
  626. Graph.Line(270 DIV scale, 250 DIV scale, 270 DIV scale, 190 DIV scale, Cols[1]);
  627. Graph.Line(270 DIV scale, 190 DIV scale, 180 DIV scale, 160 DIV scale, Cols[1]);
  628. Graph.Line(180 DIV scale, 160 DIV scale, 180 DIV scale, 125 DIV scale, Cols[1]);
  629. Graph.Line(180 DIV scale, 125 DIV scale, 225 DIV scale, 110 DIV scale, Cols[1]);
  630. Graph.Line(180 DIV scale, 125 DIV scale, 320 DIV scale, 170 DIV scale, Cols[1]);
  631. Graph.Line(320 DIV scale, 170 DIV scale, 460 DIV scale, 125 DIV scale, Cols[1]);
  632. Graph.Line(320 DIV scale, 170 DIV scale, 320 DIV scale, 300 DIV scale, Cols[1]);
  633. Graph.Line(365 DIV scale, 190 DIV scale, 415 DIV scale, 175 DIV scale, Cols[1]);
  634. Graph.Line(415 DIV scale, 175 DIV scale, 415 DIV scale, 210 DIV scale, Cols[1]);
  635. Graph.Line(415 DIV scale, 210 DIV scale, 365 DIV scale, 225 DIV scale, Cols[1]);
  636. Graph.Line(365 DIV scale, 225 DIV scale, 365 DIV scale, 190 DIV scale, Cols[1]);
  637. Graph.Line(365 DIV scale, 190 DIV scale, 415 DIV scale, 210 DIV scale, Cols[1]);
  638. Graph.Line(225 DIV scale, 205 DIV scale, 270 DIV scale, 190 DIV scale, Cols[1]);
  639. Graph.Line(225 DIV scale, 235 DIV scale, 270 DIV scale, 220 DIV scale, Cols[1]);
  640. Graph.Line(180 DIV scale, 190 DIV scale, 225 DIV scale, 175 DIV scale, Cols[1]);
  641. IF NOT Mono THEN
  642. Graph.FloodFill(250 DIV scale, 130 DIV scale, Cols[1], Cols[1]);
  643. Graph.FloodFill(230 DIV scale, 180 DIV scale, Cols[1], Cols[1]);
  644. Graph.FloodFill(260 DIV scale, 240 DIV scale, Cols[1], Cols[1]);
  645. Graph.FloodFill(380 DIV scale, 210 DIV scale, Cols[1], Cols[1]);
  646. Graph.FloodFill(200 DIV scale, 230 DIV scale, Cols[2], Cols[1]);
  647. Graph.FloodFill(250 DIV scale, 220 DIV scale, Cols[2], Cols[1]);
  648. Graph.FloodFill(400 DIV scale, 190 DIV scale, Cols[2], Cols[1]);
  649. Graph.FloodFill(440 DIV scale, 190 DIV scale, Cols[2], Cols[1]);
  650. END;
  651. END DrawLogo;
  652. PROCEDURE Rotate(Colors: ARRAY OF LONGCARD);
  653. VAR
  654. n: CARDINAL;
  655. BEGIN
  656. n:=0;
  657. Colors[15]:=Colors[0];
  658. WHILE n < 15 DO
  659. Colors[n]:=Colors[n+1];
  660. INC(n);
  661. END;
  662. END Rotate;
  663. PROCEDURE CGAIntro();
  664. VAR
  665. c: SmallColorArray;
  666. BEGIN
  667. c:=SmallColorArray(1,2,3,4);
  668. Graph.ClearScreen(Graph._GCLEARSCREEN);
  669. DrawLogo(2, c);
  670. SYSTEM.Eval(Graph.SetTextPosition(4, 9));
  671. SYSTEM.Eval(Graph.SetTextColor(2));
  672. Graph.OutText('TopSpeed Modula-2 Graphics');
  673. SYSTEM.Eval(Graph.SetTextPosition(25, 1));
  674. Graph.OutText('Press Any Key To Continue, X To Exit.');
  675. TestKey;
  676. END CGAIntro;
  677. PROCEDURE EGAIntro();
  678. VAR
  679. n : INTEGER;
  680. c : SmallColorArray;
  681. PROCEDURE GetKey():CHAR;
  682. VAR
  683. c : CHAR;
  684. BEGIN
  685. c := IO.RdKey();
  686. IF CAP(c) = 'X' THEN
  687. SYSTEM.Eval(Graph.SetVideoMode(Graph._DEFAULTMODE));
  688. HALT;
  689. END; (*IF*)
  690. RETURN c;
  691. END GetKey;
  692. BEGIN
  693. c:=SmallColorArray(9, 8, 15, 6);
  694. Graph.OutText('TopSpeed Modula-2 Graphics');
  695. SYSTEM.Eval(Graph.SetActivePage(1));
  696. Graph.ClearScreen(Graph._GCLEARSCREEN);
  697. DrawLogo(1, c);
  698. SYSTEM.Eval(Graph.SetTextPosition(4, 20));
  699. SYSTEM.Eval(Graph.SetTextColor(4));
  700. Graph.OutText('TopSpeed Modula-2 Graphics Library Demo');
  701. SYSTEM.Eval(Graph.SetVisualPage(1));
  702. SYSTEM.Eval(Graph.SetTextColor(10));
  703. SYSTEM.Eval(Graph.SetTextPosition(25, 23));
  704. Graph.OutText('Press Any Key To Continue, X To Exit');
  705. IF CAP(GetKey()) = 'C' THEN
  706. n:=1;
  707. WHILE NOT IO.KeyPressed() DO
  708. SYSTEM.Eval(Graph.RemapPalette(6, Colors[(6+n) MOD 16]));
  709. SYSTEM.Eval(Graph.RemapPalette(8, Colors[(8+n) MOD 16]));
  710. SYSTEM.Eval(Graph.RemapPalette(9, Colors[(9+n) MOD 16]));
  711. SYSTEM.Eval(Graph.RemapPalette(15, Colors[(15+n) MOD 16]));
  712. Lib.Delay(100);
  713. INC(n);
  714. END;
  715. SYSTEM.Eval(IO.RdKey());
  716. WHILE NOT IO.KeyPressed() DO
  717. SYSTEM.Eval(Graph.RemapAllPalette(Colors));
  718. Lib.Delay(1000);
  719. Rotate(Colors);
  720. END;
  721. SYSTEM.Eval(IO.RdKey());
  722. END;
  723. SYSTEM.Eval(Graph.SetActivePage(0));
  724. SYSTEM.Eval(Graph.SetVisualPage(0));
  725. Graph.ClearScreen(Graph._GCLEARSCREEN);
  726. END EGAIntro;
  727. PROCEDURE HercIntro();
  728. VAR
  729. c: SmallColorArray;
  730. BEGIN
  731. c:=SmallColorArray(1, 1, 1, 1);
  732. Graph.ClearScreen(Graph._GCLEARSCREEN);
  733. DrawLogo(1, c);
  734. TestKey;
  735. Graph.ClearScreen(Graph._GCLEARSCREEN);
  736. END HercIntro;
  737. PROCEDURE HercDemo();
  738. BEGIN
  739. SYSTEM.Eval(Graph.SetVideoMode(Graph._HERCMONO));
  740. Graph.GetVideoConfig(cv);
  741. HercIntro();
  742. Ellipses(1);
  743. DrawLines();
  744. Animation(Graph._HGC);
  745. Pies(1);
  746. Bars(1);
  747. END HercDemo;
  748. PROCEDURE EGADemo();
  749. BEGIN
  750. SYSTEM.Eval(Graph.SetVideoMode(Graph._ERESCOLOR));
  751. Graph.GetVideoConfig(cv);
  752. EGAIntro();
  753. Ellipses(1);
  754. DrawLines();
  755. Animation(Graph._EGA);
  756. Pies(1);
  757. Bars(1);
  758. END EGADemo;
  759. PROCEDURE VGADemo();
  760. BEGIN
  761. SYSTEM.Eval(Graph.SetVideoMode(Graph._ERESCOLOR));
  762. Graph.GetVideoConfig(cv);
  763. EGAIntro();
  764. VGATriangle();
  765. Ellipses(1);
  766. DrawLines();
  767. Animation(Graph._EGA);
  768. Pies(1);
  769. Bars(1);
  770. END VGADemo;
  771. PROCEDURE CGADemo();
  772. BEGIN
  773. SYSTEM.Eval(Graph.SetVideoMode(Graph._MRES4COLOR));
  774. Graph.GetVideoConfig(cv);
  775. CGAIntro();
  776. Ellipses(2);
  777. DrawLines();
  778. Animation(Graph._CGA);
  779. Pies(2);
  780. Bars(2);
  781. END CGADemo;
  782. BEGIN
  783. Mono := FALSE;
  784. Graph.GetVideoConfig(cv);
  785. CASE cv.adapter OF
  786. | Graph._HGC :
  787. Mono:= TRUE;
  788. HercDemo();
  789. | Graph._MDPA :
  790. IO.WrStr('A Color Graphics Card Is Not Installed');
  791. IO.WrLn();
  792. HALT;
  793. | Graph._CGA, Graph._MCGA :
  794. CGADemo();
  795. | Graph._VGA :
  796. VGADemo();
  797. | Graph._EGA :
  798. EGADemo();
  799. ELSE
  800. IO.WrStr('Graphics Card Not Supported');
  801. IO.WrLn();
  802. HALT;
  803. END;
  804. SYSTEM.Eval(Graph.SetVideoMode(Graph._DEFAULTMODE));
  805. END MGdemo.