| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905 |
- MODULE MGdemo;
- IMPORT Graph, IO, Lib, SYSTEM, Storage;
- TYPE
- PieInfo = RECORD
- state: CARDINAL;
- x1, y1, x2, y2: CARDINAL;
- startx, starty: CARDINAL;
- CurrentX: CARDINAL;
- CurrentY: CARDINAL;
- fill: BOOLEAN;
- color: CARDINAL;
- END;
- PieHandle = POINTER TO PieInfo;
- TYPE
- ColorArray = ARRAY [0..15] OF LONGCARD;
- SmallColorArray = ARRAY [0..3] OF CARDINAL;
- CONST
- Colors = ColorArray( Graph._BLACK, Graph._BLUE, Graph._GREEN, Graph._CYAN, Graph._RED, Graph._MAGENTA, Graph._BROWN,
- Graph._WHITE, Graph._GRAY, Graph._LIGHTBLUE, Graph._LIGHTGREEN, Graph._LIGHTCYAN,
- Graph._LIGHTRED, Graph._LIGHTMAGENTA, Graph._LIGHTYELLOW, Graph._BRIGHTWHITE);
- VAR
- Mono: BOOLEAN;
- XValues: ARRAY [0..3] OF CARDINAL;
- YValues: ARRAY [0..3] OF CARDINAL;
- cv: Graph.VideoConfig;
- Patterns: ARRAY [0..4] OF Graph.FillMaskType;
- PROCEDURE Max(V1, V2: CARDINAL): CARDINAL;
- BEGIN
- IF V1 > V2 THEN
- RETURN V1;
- ELSE
- RETURN V2;
- END;
- END Max;
- PROCEDURE TestKey;
- BEGIN
- IF CAP(IO.RdKey()) = 'X' THEN
- SYSTEM.Eval(Graph.SetVideoMode(Graph._DEFAULTMODE));
- HALT;
- END; (*IF*)
- END TestKey;
- PROCEDURE InitPalette();
- VAR
- i: CARDINAL;
- red, green, blue: CARDINAL;
- color: LONGCARD;
- colors: ARRAY [0..255] OF LONGCARD;
- BEGIN
- i:=0;
- SYSTEM.Eval(Graph.SetVideoMode(Graph._MRES256COLOR));
- WHILE i < 256 DO
- red :=CARDINAL(BITSET(i)* BITSET(0E0H))>>2;
- green:=CARDINAL(BITSET(i) * BITSET(01CH))<<1;
- blue :=CARDINAL(BITSET(i) * BITSET(3))<<4;
- color:= (LONGCARD(blue)<<16) + (LONGCARD(green)<<8) + LONGCARD(red);
- colors[i]:=color;
- INC(i);
- END;
- SYSTEM.Eval(Graph.RemapAllPalette(colors));
- END InitPalette;
- PROCEDURE AdjustRGB(VAR red, green, blue: CARDINAL);
- VAR
- nr, nb, ng: CARDINAL;
- BEGIN
- IF (red >= blue) AND (red >= green) THEN
- nr:=255;
- ng:=(green*255) DIV red;
- nb:=(blue*255) DIV red;
- ELSIF (green >= red) AND (green >= blue) THEN
- ng:=255;
- nr:=(red*255) DIV green;
- nb:=(blue*255) DIV green;
- ELSE
- nb:=255;
- ng:=(green*255) DIV blue;
- nr:=(red*255) DIV blue;
- END;
- red:=nr;
- blue:=nb;
- green:=ng;
- END AdjustRGB;
- PROCEDURE PlotRGB(x, y, red, green, blue: CARDINAL);
- VAR
- r, g, b, color: CARDINAL;
- BEGIN
- r:=CARDINAL(BITSET(red) * BITSET(0E0H));
- g:=CARDINAL(BITSET(green) * BITSET(0E0H))>>3;
- b:=CARDINAL(BITSET(blue) * BITSET(0C0H))>>6;
- color:= CARDINAL(BITSET(r) + BITSET(g) + BITSET(b));
- Graph.Plot(x+20, y, color);
- END PlotRGB;
- PROCEDURE VGATriangle();
- VAR
- x, y: CARDINAL;
- red, green, blue: CARDINAL;
- BEGIN
- InitPalette();
- x:=0;
- WHILE x < 256 DO
- y:=0;
- WHILE y < 200 DO
- red:=x;
- green:=(y*255) DIV 200;
- IF (red+green) < 255 THEN
- blue:=255-(red+green);
- AdjustRGB(red, green, blue);
- PlotRGB(x, y, red, green, blue);
- END;
- INC(y);
- END;
- INC(x);
- END;
- SYSTEM.Eval(Graph.SetTextColor(10));
- SYSTEM.Eval(Graph.SetTextPosition(25, 5));
- Graph.OutText('Hit Any Key To Continue,X To Exit.');
- TestKey;
- SYSTEM.Eval(Graph.SetVideoMode(Graph._ERESCOLOR));
- END VGATriangle;
- PROCEDURE DrawEllipses();
- VAR
- n: INTEGER;
- f: BOOLEAN;
- x1, x2, y1, y2: CARDINAL;
- c: CARDINAL;
- BEGIN
- n:=0;
- c:=1;
- f:=Graph._GFILLINTERIOR;
- Patterns[0] := Graph.FillMaskType(88H, 44H, 22H, 11H, 88H, 44H, 22H, 11H);
- Patterns[1] := Graph.FillMaskType(0AAH, 0AAH, 0AAH, 0AAH, 0AAH, 0AAH, 0AAH, 0AAH);
- Patterns[2] := Graph.FillMaskType(0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH);
- Patterns[3] := Graph.FillMaskType(0FFH, 40H, 0FFH, 40H, 0FFH, 40H, 0FFH, 40H);
- Patterns[4] := Graph.FillMaskType(80H, 40H, 20H, 10H, 08H, 04H, 02H, 01H);
- LOOP
- IF n = 100 THEN
- EXIT;
- END;
- INC(n);
- IF IO.KeyPressed() THEN
- EXIT;
- END;
- Graph.SetFillMask(Patterns[Lib.RANDOM(5)]);
- x1:=Lib.RANDOM(cv.numxpixels-1);
- y1:=Lib.RANDOM(cv.numypixels-1);
- x2:=Lib.RANDOM(cv.numxpixels-x1);
- y2:=Lib.RANDOM(cv.numypixels-y1);
- IF f = Graph._GFILLINTERIOR THEN
- f:=Graph._GBORDER;
- ELSE
- f:=Graph._GFILLINTERIOR;
- END;
- Graph.Ellipse(x1, y1, x2, y2, c, f);
- INC(c);
- IF c = cv.numcolors THEN
- c:=1;
- END;
- END;
- IF NOT Mono THEN
- SYSTEM.Eval(Graph.SetTextPosition(25, 1));
- Graph.OutText('Press Any Key To Continue, X To Exit');
- END;
- TestKey;
- END DrawEllipses;
- PROCEDURE Ellipses(scale: CARDINAL);
- BEGIN
- Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- DrawEllipses();
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- Graph.Rectangle(49 DIV scale, 24 DIV scale, 501 DIV scale, 291 DIV scale, 3, Graph._GBORDER);
- Graph.SetClipRgn(50 DIV scale, 25 DIV scale, 500 DIV scale, 290 DIV scale);
- DrawEllipses();
- Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
- END Ellipses;
- PROCEDURE InitPie(x1, y1, x2, y2: CARDINAL; InitState, scale: CARDINAL; fill: BOOLEAN): PieHandle;
- VAR
- p: PieHandle;
- BEGIN
- Storage.ALLOCATE(p, SIZE(PieInfo));
- p^.x1:=x1 DIV scale;
- p^.y1:=y1 DIV scale;
- p^.x2:=x2 DIV scale;
- p^.y2:=y2 DIV scale;
- p^.CurrentX:=XValues[InitState];
- p^.CurrentY:=YValues[InitState];
- p^.startx:=XValues[InitState];
- p^.starty:=YValues[InitState];
- p^.state:=InitState;
- p^.fill:=fill;
- IF Mono THEN
- p^.color:=1;
- ELSE
- p^.color:=Lib.RANDOM(cv.numcolors-2)+1;
- END;
- Graph.Pie(p^.x1, p^.y1, p^.x2, p^.y2, p^.CurrentX, p^.CurrentY, p^.CurrentX, p^.CurrentY, p^.color, fill);
- RETURN p;
- END InitPie;
- PROCEDURE DisposePie(p: PieHandle);
- BEGIN
- Storage.DEALLOCATE(p, SIZE(PieInfo));
- END DisposePie;
- PROCEDURE Circulate(p: PieHandle);
- BEGIN
- Graph.SetFillMask(Patterns[2]);
- Graph.Rectangle(p^.x1-p^.x2, p^.y1-p^.y2, p^.x1+p^.x2, p^.y1+p^.y2, 0, Graph._GFILLINTERIOR);
- IF p^.state = 0 THEN
- IF p^.CurrentY > 0 THEN
- DEC(p^.CurrentY, 4);
- ELSE
- INC(p^.state);
- END;
- END;
- IF p^.state = 1 THEN
- IF p^.CurrentX > 0 THEN
- DEC(p^.CurrentX, 8);
- ELSE
- INC(p^.state);
- END;
- END;
- IF p^.state = 2 THEN
- IF p^.CurrentY < cv.numypixels THEN
- INC(p^.CurrentY, 4);
- ELSE
- INC(p^.state);
- END;
- END;
- IF p^.state = 3 THEN
- IF p^.CurrentX < cv.numxpixels THEN
- INC(p^.CurrentX, 8);
- ELSE
- p^.state:=0;
- END;
- END;
- IF p^.fill = Graph._GFILLINTERIOR THEN
- Graph.SetFillMask(Patterns[Lib.RANDOM(5)]);
- END;
- Graph.Pie(p^.x1, p^.y1, p^.x2, p^.y2, p^.CurrentX, p^.CurrentY,
- p^.startx, p^.starty, p^.color, p^.fill);
- END Circulate;
- PROCEDURE Pies(scale: INTEGER);
- VAR
- p: ARRAY [0..4] OF PieHandle;
- n: INTEGER;
- BEGIN
- n:=0;
- XValues[0]:=cv.numxpixels-1;
- XValues[1]:=cv.numxpixels-1;
- XValues[2]:=0;
- XValues[3]:=0;
- YValues[0]:=cv.numypixels-1;
- YValues[1]:=0;
- YValues[2]:=0;
- YValues[3]:=cv.numypixels-1;
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
- p[0]:=InitPie(80, 60, 50, 30, 0, scale, Graph._GBORDER);
- p[1]:=InitPie(510, 70, 60, 60, 1, scale, Graph._GFILLINTERIOR);
- p[2]:=InitPie(70, 255, 30, 55, 2, scale, Graph._GFILLINTERIOR);
- p[3]:=InitPie(450, 200, 55, 35, 3, scale, Graph._GBORDER);
- p[4]:=InitPie(320, 160, 45, 45, 0, scale, Graph._GFILLINTERIOR);
- IF NOT Mono THEN
- SYSTEM.Eval(Graph.SetTextPosition(25, 1));
- Graph.OutText('Press Any Key To Continue, X To Exit');
- END;
- WHILE NOT IO.KeyPressed() DO
- IF n = 5 THEN
- n:=0;
- END;
- Circulate(p[n]);
- INC(n);
- END;
- TestKey;
- n:=0;
- WHILE n < 5 DO
- DisposePie(p[n]);
- INC(n);
- END;
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- Graph.SetFillMask(Patterns[2]);
- END Pies;
- VAR
- spotlist: ARRAY [0..5] OF ARRAY [0..5] OF Graph.GraphCoords;
- PROCEDURE DrawCircles(patnum, start, depth, width: INTEGER);
- VAR
- n: INTEGER;
- x, y, xpos, ypos: CARDINAL;
- BEGIN
- n:=0;
- LOOP
- x:=spotlist[patnum-1][n].xcoord;
- IF x = 0 THEN EXIT END;
- xpos:=CARDINAL(width>>2)*x;
- y:=spotlist[patnum-1][n].ycoord;
- ypos:=CARDINAL(depth>>3)*y+CARDINAL(start);
- Graph.Ellipse(xpos, ypos, 4, 4, cv.numcolors-1, Graph._GFILLINTERIOR);
- INC(n);
- IF n = 6 THEN
- EXIT;
- END;
- END;
- END DrawCircles;
- PROCEDURE MoveSideways(image: ADDRESS; pos: ARRAY OF CARDINAL;
- limit: CARDINAL; incr: INTEGER): CARDINAL;
- VAR
- x, y: CARDINAL;
- ret: INTEGER;
- BEGIN
- x:=0;
- y:=0;
- ret:=0;
- LOOP
- IF x = pos[limit] THEN EXIT END;
- Graph.PutImage(x, y, image, Graph._GXOR);
- INC(x, incr);
- Graph.PutImage(x, y, image, Graph._GPSET);
- IF IO.KeyPressed() THEN
- TestKey;
- ret:=1;
- EXIT;
- END;
- END;
- RETURN ret;
- END MoveSideways;
- PROCEDURE MoveDown(image: ADDRESS; pos: ARRAY OF CARDINAL;
- limit: CARDINAL; xpos: CARDINAL; incr: INTEGER): INTEGER;
- VAR
- y: CARDINAL;
- ret: INTEGER;
- BEGIN
- y:=0;
- ret:=0;
- LOOP
- IF y = pos[limit] THEN EXIT END;
- Graph.PutImage(xpos, y, image, Graph._GXOR);
- INC(y, incr);
- Graph.PutImage(xpos, y, image, Graph._GPSET);
- IF IO.KeyPressed() THEN
- TestKey;
- ret:=1;
- EXIT;
- END;
- END;
- RETURN ret;
- END MoveDown;
- PROCEDURE DrawSpots(number, start, depth, width: INTEGER);
- VAR
- pattern: ARRAY [0..2] OF CARDINAL;
- n: CARDINAL;
- BEGIN
- IF number = 0 THEN RETURN END;
- CASE number OF
- | 1:
- pattern[0]:=1;
- pattern[1]:=0;
- | 2:
- pattern[0]:=2;
- pattern[1]:=0;
- | 3:
- pattern[0]:=2;
- pattern[1]:=1;
- pattern[2]:=0;
- | 4:
- pattern[0]:=4;
- pattern[1]:=0;
- | 5:
- pattern[0]:=4;
- pattern[1]:=1;
- pattern[2]:=0;
- | 6:
- pattern[0]:=6;
- pattern[1]:=0;
- END;
- n:=0;
- WHILE pattern[n] # 0 DO
- DrawCircles(pattern[n], start, depth, width);
- INC(n);
- END;
- END DrawSpots;
- PROCEDURE DrawDomino(depth, width: INTEGER);
- VAR
- spots: INTEGER;
- BEGIN
- Graph.Rectangle(0, 0, width, depth, cv.numcolors-1, Graph._GBORDER);
- Graph.Line(0, depth DIV 2, width, depth DIV 2, cv.numcolors-1);
- spots:=Lib.RANDOM(7);
- DrawSpots(spots, 0, depth, width);
- spots:=Lib.RANDOM(7);
- DrawSpots(spots, depth DIV 2, depth, width);
- END DrawDomino;
- PROCEDURE MakeDomino(depth, width: INTEGER): ADDRESS;
- VAR
- Buffer: ADDRESS;
- size: LONGCARD;
- BEGIN
- size:=Graph.ImageSize(0, 0, width, depth);
- Storage.ALLOCATE(Buffer, CARDINAL(size));
- DrawDomino(depth, width);
- Graph.GetImage(0, 0, width, depth, Buffer);
- RETURN Buffer;
- END MakeDomino;
- PROCEDURE Animation(adapter: CARDINAL);
- VAR
- ColPosition: ARRAY [0..10] OF CARDINAL;
- RowPosition: ARRAY [0..2] OF CARDINAL;
- count, width, depth, incr: INTEGER;
- MaxRow, MaxCol, clear: INTEGER;
- CurrentRow, CurrentCol: INTEGER;
- image: ADDRESS;
- BEGIN
- spotlist[0][0]:= Graph.GraphCoords(2, 2);
- spotlist[1][0]:= Graph.GraphCoords(1, 1);
- spotlist[1][1]:= Graph.GraphCoords(3, 3);
- spotlist[2][0]:= Graph.GraphCoords(0, 0);
- spotlist[3][0]:= Graph.GraphCoords(1, 1);
- spotlist[3][1]:= Graph.GraphCoords(3, 1);
- spotlist[3][2]:= Graph.GraphCoords(1, 3);
- spotlist[3][3]:= Graph.GraphCoords(3, 3);
- spotlist[4][0]:= Graph.GraphCoords(0, 0);
- spotlist[5][0]:= Graph.GraphCoords(1, 1);
- spotlist[5][1]:= Graph.GraphCoords(3, 1);
- spotlist[5][2]:= Graph.GraphCoords(1, 2);
- spotlist[5][3]:= Graph.GraphCoords(3, 2);
- spotlist[5][4]:= Graph.GraphCoords(1, 3);
- spotlist[5][5]:= Graph.GraphCoords(3, 3);
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- Graph.SetFillMask(Patterns[2]);
- IF (adapter = Graph._EGA) OR (adapter = Graph._HGC) THEN
- width:=50;
- depth:=100;
- MaxRow:=2;
- MaxCol:=9;
- clear:=20;
- incr:=10;
- ELSE
- width:=50;
- depth:=90;
- MaxRow:=1;
- MaxCol:=4;
- clear:=10;
- incr:=5;
- END;
- count:=0;
- WHILE count <= MaxCol DO
- ColPosition[count]:=count*(width+10);
- INC(count);
- END;
- count:=0;
- WHILE count <= MaxRow DO
- RowPosition[count]:=count*(depth+clear);
- INC(count);
- END;
- CurrentCol:=MaxCol;
- CurrentRow:=MaxRow;
- LOOP
- IF CurrentCol < 0 THEN EXIT END;
- image:=MakeDomino(depth, width);
- IF CurrentCol > 0 THEN
- IF MoveSideways(image, ColPosition, CurrentCol, incr) # 0 THEN
- EXIT;
- END;
- END;
- IF CurrentRow > 0 THEN
- IF MoveDown(image, RowPosition, CurrentRow, ColPosition[CurrentCol], incr) # 0 THEN
- EXIT;
- END;
- DEC(CurrentRow);
- ELSE
- DEC(CurrentCol);
- CurrentRow:=MaxRow;
- END;
- Storage.DEALLOCATE(image, CARDINAL(Graph.ImageSize(0, 0, width, depth)));
- IF IO.KeyPressed() THEN
- EXIT;
- END;
- END;
- IF NOT Mono THEN
- SYSTEM.Eval(Graph.SetTextPosition(25, 1));
- Graph.OutText('Press Any Key To Continue, X To Exit.');
- END;
- TestKey;
- END Animation;
- PROCEDURE Bars(scale: INTEGER);
- VAR
- x1, y1,x2, y2, x3, y3, x4, y4: CARDINAL;
- NewMask: Graph.FillMaskType;
- BEGIN
- Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- x1:=460 DIV scale;
- y1:=150 DIV scale;
- x2:=140 DIV scale;
- y2:=130 DIV scale;
- x4:=300 DIV scale;
- y4:=260 DIV scale;
- x3:=620 DIV scale;
- y3:=260 DIV scale;
- Graph.Pie(x1, y1, x2, y2, x3, y3, x4, y4, Max(4 MOD cv.numcolors, 1), Graph._GFILLINTERIOR);
- x1:=460 DIV scale;
- y1:=170 DIV scale;
- x2:=140 DIV scale;
- y2:=130 DIV scale;
- x3:=300 DIV scale;
- y3:=280 DIV scale;
- x4:=620 DIV scale;
- y4:=280 DIV scale;
- Graph.Pie(x1, y1, x2, y2, x3, y3, x4, y4, Max(3 MOD cv.numcolors, 1), Graph._GBORDER);
- NewMask[0]:=88H;
- NewMask[1]:=44H;
- NewMask[2]:=22H;
- NewMask[3]:=11H;
- NewMask[4]:=88H;
- NewMask[5]:=44H;
- NewMask[6]:=22H;
- NewMask[7]:=11H;
- Graph.SetFillMask(NewMask);
- x1:=19 DIV scale;
- y1:=10 DIV scale;
- x2:=x1;
- y2:=321 DIV scale;
- x3:=600 DIV scale;
- y3:=y2;
- Graph.Line(x1, y1, x2, y2, cv.numcolors-1);
- Graph.Line(x2, y2, x3, y3, cv.numcolors-1);
- IF NOT Mono THEN
- SYSTEM.Eval(Graph.SetTextPosition(25, 13 DIV scale));
- Graph.OutText('Bar Graphs and Pie Charts');
- END;
- x1:=20 DIV scale;
- y1:=20 DIV scale;
- x2:=59 DIV scale;
- y2:=320 DIV scale;
- Graph.Cube(Graph._GTOP, x1, y1, x2, y2, 20 DIV scale, Max(1 MOD cv.numcolors, 1), Graph._GFILLINTERIOR);
- x1:=60 DIV scale;
- y1:=120 DIV scale;
- x2:=99 DIV scale;
- y2:=320 DIV scale;
- Graph.Cube(Graph._GTOP, x1, y1, x2, y2, 20 DIV scale, Max(2 MOD cv.numcolors, 1),Graph._GFILLINTERIOR);
-
- x1:=100 DIV scale;
- y1:=80 DIV scale;
- x2:=139 DIV scale;
- y2:=320 DIV scale;
- Graph.Cube(Graph._GTOP, x1, y1, x2, y2, 20 DIV scale, Max(3 MOD cv.numcolors, 1), Graph._GFILLINTERIOR );
-
- x1:=140 DIV scale;
- y1:=200 DIV scale;
- x2:=179 DIV scale;
- y2:=320 DIV scale;
- Graph.Cube(Graph._GTOP, x1, y1, x2, y2, 20 DIV scale, Max(4 MOD cv.numcolors, 1), Graph._GFILLINTERIOR);
- SYSTEM.Eval(IO.RdKey());
- END Bars;
- PROCEDURE RandColor(): CARDINAL;
- VAR
- color: CARDINAL;
- BEGIN
- color:=Lib.RANDOM(cv.numcolors);
- IF color = 0 THEN
- color:=cv.numcolors-1;
- END;
- RETURN color;
- END RandColor;
- PROCEDURE DrawLines();
- VAR
- x, y, col: CARDINAL;
- MaxX, MaxY: CARDINAL;
- top, left, bottom, right: CARDINAL;
- i, limit: INTEGER;
- BEGIN
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- top:=0;
- left:=0;
- bottom:=cv.numypixels - 1;
- right :=cv.numxpixels - 1;
- MaxX:=cv.numxpixels - 1;
- MaxY:=cv.numypixels - 1;
- limit:=cv.numcolors-1;
- col:=0;
- i := 0;
- WHILE (i <= limit) & ~IO.KeyPressed() DO
- INC(col);
- Graph.SetClipRgn(left, top, right, bottom);
- INC(top, 4);
- INC(left, 4);
- DEC(bottom, 4);
- DEC(right, 4);
- x := 0;
- WHILE x <= MaxX DO
- Graph.Line(x, 0, MaxX - x,MaxY, col);
- INC(x, 4);
- END;
- y := 0;
- WHILE y <= MaxY DO
- Graph.Line(MaxX, y, 0, MaxY - y, col);
- INC(y, 2);
- END;
- INC(i);
- END;
- SYSTEM.Eval(Graph.SetTextPosition(25, 1));
- Graph.SetClipRgn(0, 0, cv.numxpixels-1, cv.numypixels-1);
- IF NOT Mono THEN
- Graph.OutText('Press Any Key To Continue, X To Exit.');
- END;
- TestKey;
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- END DrawLines;
- PROCEDURE DrawLogo(scale: INTEGER; Cols: SmallColorArray);
- VAR
- mode: BOOLEAN;
- BEGIN
- IF Mono THEN
- mode:=Graph._GBORDER;
- ELSE
- mode:=Graph._GFILLINTERIOR;
- END;
- Graph.Rectangle(140 DIV scale, 20 DIV scale, 500 DIV scale, 330 DIV scale, Cols[0], mode);
- Graph.Line(225 DIV scale, 110 DIV scale, 320 DIV scale, 140 DIV scale, Cols[1]);
- Graph.Line(320 DIV scale, 140 DIV scale, 415 DIV scale, 110 DIV scale, Cols[1]);
- Graph.Line(415 DIV scale, 110 DIV scale, 460 DIV scale, 125 DIV scale, Cols[1]);
- Graph.Line(460 DIV scale, 125 DIV scale, 460 DIV scale, 225 DIV scale, Cols[1]);
- Graph.Line(460 DIV scale, 225 DIV scale, 365 DIV scale, 255 DIV scale, Cols[1]);
- Graph.Line(365 DIV scale, 255 DIV scale, 365 DIV scale, 285 DIV scale, Cols[1]);
- Graph.Line(365 DIV scale, 285 DIV scale, 320 DIV scale, 300 DIV scale, Cols[1]);
- Graph.Line(320 DIV scale, 300 DIV scale, 180 DIV scale, 255 DIV scale, Cols[1]);
- Graph.Line(180 DIV scale, 255 DIV scale, 180 DIV scale, 190 DIV scale, Cols[1]);
- Graph.Line(180 DIV scale, 190 DIV scale, 225 DIV scale, 205 DIV scale, Cols[1]);
- Graph.Line(225 DIV scale, 205 DIV scale, 225 DIV scale, 235 DIV scale, Cols[1]);
- Graph.Line(225 DIV scale, 235 DIV scale, 270 DIV scale, 250 DIV scale, Cols[1]);
- Graph.Line(270 DIV scale, 250 DIV scale, 270 DIV scale, 190 DIV scale, Cols[1]);
- Graph.Line(270 DIV scale, 190 DIV scale, 180 DIV scale, 160 DIV scale, Cols[1]);
- Graph.Line(180 DIV scale, 160 DIV scale, 180 DIV scale, 125 DIV scale, Cols[1]);
- Graph.Line(180 DIV scale, 125 DIV scale, 225 DIV scale, 110 DIV scale, Cols[1]);
- Graph.Line(180 DIV scale, 125 DIV scale, 320 DIV scale, 170 DIV scale, Cols[1]);
- Graph.Line(320 DIV scale, 170 DIV scale, 460 DIV scale, 125 DIV scale, Cols[1]);
- Graph.Line(320 DIV scale, 170 DIV scale, 320 DIV scale, 300 DIV scale, Cols[1]);
- Graph.Line(365 DIV scale, 190 DIV scale, 415 DIV scale, 175 DIV scale, Cols[1]);
- Graph.Line(415 DIV scale, 175 DIV scale, 415 DIV scale, 210 DIV scale, Cols[1]);
- Graph.Line(415 DIV scale, 210 DIV scale, 365 DIV scale, 225 DIV scale, Cols[1]);
- Graph.Line(365 DIV scale, 225 DIV scale, 365 DIV scale, 190 DIV scale, Cols[1]);
- Graph.Line(365 DIV scale, 190 DIV scale, 415 DIV scale, 210 DIV scale, Cols[1]);
- Graph.Line(225 DIV scale, 205 DIV scale, 270 DIV scale, 190 DIV scale, Cols[1]);
- Graph.Line(225 DIV scale, 235 DIV scale, 270 DIV scale, 220 DIV scale, Cols[1]);
- Graph.Line(180 DIV scale, 190 DIV scale, 225 DIV scale, 175 DIV scale, Cols[1]);
- IF NOT Mono THEN
- Graph.FloodFill(250 DIV scale, 130 DIV scale, Cols[1], Cols[1]);
- Graph.FloodFill(230 DIV scale, 180 DIV scale, Cols[1], Cols[1]);
- Graph.FloodFill(260 DIV scale, 240 DIV scale, Cols[1], Cols[1]);
- Graph.FloodFill(380 DIV scale, 210 DIV scale, Cols[1], Cols[1]);
- Graph.FloodFill(200 DIV scale, 230 DIV scale, Cols[2], Cols[1]);
- Graph.FloodFill(250 DIV scale, 220 DIV scale, Cols[2], Cols[1]);
- Graph.FloodFill(400 DIV scale, 190 DIV scale, Cols[2], Cols[1]);
- Graph.FloodFill(440 DIV scale, 190 DIV scale, Cols[2], Cols[1]);
- END;
- END DrawLogo;
- PROCEDURE Rotate(Colors: ARRAY OF LONGCARD);
- VAR
- n: CARDINAL;
- BEGIN
- n:=0;
- Colors[15]:=Colors[0];
- WHILE n < 15 DO
- Colors[n]:=Colors[n+1];
- INC(n);
- END;
- END Rotate;
- PROCEDURE CGAIntro();
- VAR
- c: SmallColorArray;
- BEGIN
- c:=SmallColorArray(1,2,3,4);
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- DrawLogo(2, c);
- SYSTEM.Eval(Graph.SetTextPosition(4, 9));
- SYSTEM.Eval(Graph.SetTextColor(2));
- Graph.OutText('TopSpeed Modula-2 Graphics');
- SYSTEM.Eval(Graph.SetTextPosition(25, 1));
- Graph.OutText('Press Any Key To Continue, X To Exit.');
- TestKey;
- END CGAIntro;
- PROCEDURE EGAIntro();
- VAR
- n : INTEGER;
- c : SmallColorArray;
- PROCEDURE GetKey():CHAR;
- VAR
- c : CHAR;
- BEGIN
- c := IO.RdKey();
- IF CAP(c) = 'X' THEN
- SYSTEM.Eval(Graph.SetVideoMode(Graph._DEFAULTMODE));
- HALT;
- END; (*IF*)
- RETURN c;
- END GetKey;
- BEGIN
- c:=SmallColorArray(9, 8, 15, 6);
- Graph.OutText('TopSpeed Modula-2 Graphics');
- SYSTEM.Eval(Graph.SetActivePage(1));
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- DrawLogo(1, c);
- SYSTEM.Eval(Graph.SetTextPosition(4, 20));
- SYSTEM.Eval(Graph.SetTextColor(4));
- Graph.OutText('TopSpeed Modula-2 Graphics Library Demo');
- SYSTEM.Eval(Graph.SetVisualPage(1));
- SYSTEM.Eval(Graph.SetTextColor(10));
- SYSTEM.Eval(Graph.SetTextPosition(25, 23));
- Graph.OutText('Press Any Key To Continue, X To Exit');
- IF CAP(GetKey()) = 'C' THEN
- n:=1;
- WHILE NOT IO.KeyPressed() DO
- SYSTEM.Eval(Graph.RemapPalette(6, Colors[(6+n) MOD 16]));
- SYSTEM.Eval(Graph.RemapPalette(8, Colors[(8+n) MOD 16]));
- SYSTEM.Eval(Graph.RemapPalette(9, Colors[(9+n) MOD 16]));
- SYSTEM.Eval(Graph.RemapPalette(15, Colors[(15+n) MOD 16]));
- Lib.Delay(100);
- INC(n);
- END;
- SYSTEM.Eval(IO.RdKey());
- WHILE NOT IO.KeyPressed() DO
- SYSTEM.Eval(Graph.RemapAllPalette(Colors));
- Lib.Delay(1000);
- Rotate(Colors);
- END;
- SYSTEM.Eval(IO.RdKey());
- END;
- SYSTEM.Eval(Graph.SetActivePage(0));
- SYSTEM.Eval(Graph.SetVisualPage(0));
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- END EGAIntro;
- PROCEDURE HercIntro();
- VAR
- c: SmallColorArray;
- BEGIN
- c:=SmallColorArray(1, 1, 1, 1);
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- DrawLogo(1, c);
- TestKey;
- Graph.ClearScreen(Graph._GCLEARSCREEN);
- END HercIntro;
- PROCEDURE HercDemo();
- BEGIN
- SYSTEM.Eval(Graph.SetVideoMode(Graph._HERCMONO));
- Graph.GetVideoConfig(cv);
- HercIntro();
- Ellipses(1);
- DrawLines();
- Animation(Graph._HGC);
- Pies(1);
- Bars(1);
- END HercDemo;
- PROCEDURE EGADemo();
- BEGIN
- SYSTEM.Eval(Graph.SetVideoMode(Graph._ERESCOLOR));
- Graph.GetVideoConfig(cv);
- EGAIntro();
- Ellipses(1);
- DrawLines();
- Animation(Graph._EGA);
- Pies(1);
- Bars(1);
- END EGADemo;
- PROCEDURE VGADemo();
- BEGIN
- SYSTEM.Eval(Graph.SetVideoMode(Graph._ERESCOLOR));
- Graph.GetVideoConfig(cv);
- EGAIntro();
- VGATriangle();
- Ellipses(1);
- DrawLines();
- Animation(Graph._EGA);
- Pies(1);
- Bars(1);
- END VGADemo;
- PROCEDURE CGADemo();
- BEGIN
- SYSTEM.Eval(Graph.SetVideoMode(Graph._MRES4COLOR));
- Graph.GetVideoConfig(cv);
- CGAIntro();
- Ellipses(2);
- DrawLines();
- Animation(Graph._CGA);
- Pies(2);
- Bars(2);
- END CGADemo;
- BEGIN
- Mono := FALSE;
- Graph.GetVideoConfig(cv);
- CASE cv.adapter OF
- | Graph._HGC :
- Mono:= TRUE;
- HercDemo();
- | Graph._MDPA :
- IO.WrStr('A Color Graphics Card Is Not Installed');
- IO.WrLn();
- HALT;
- | Graph._CGA, Graph._MCGA :
- CGADemo();
- | Graph._VGA :
- VGADemo();
- | Graph._EGA :
- EGADemo();
- ELSE
- IO.WrStr('Graphics Card Not Supported');
- IO.WrLn();
- HALT;
- END;
- SYSTEM.Eval(Graph.SetVideoMode(Graph._DEFAULTMODE));
- END MGdemo.
|