home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SGRAPH.PAS *)
- (* Grafik für Amstrad CGA 16 Farben HiRes *)
- (* (c) 1989 Lorenz Holländer & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT SGraph;
-
- INTERFACE USES Crt, Dos, Graph;
-
- VAR GraphDriver : INTEGER;
- GraphMode : INTEGER;
- MaxX, MaxY : WORD; { Bildschirm-Koordinaten }
- MaxColor : WORD; { 15 höchste Farbnummer }
- ActColor : WORD; { Farbe von 0 bis 15 }
-
- PROCEDURE HiRes;
- PROCEDURE ClearDevice; { Bildschirm löschen }
- PROCEDURE SetBorderColor(Farbe : BYTE);
- PROCEDURE SetColor(Farbe : WORD);
- PROCEDURE PutPixel(x, y : INTEGER; pixel : WORD);
- PROCEDURE Bar(x1, y1, x2, y2 : INTEGER);
- PROCEDURE Circle(x, y : INTEGER; radius : WORD);
- PROCEDURE FloodFill(x, y : INTEGER; border : WORD);
- FUNCTION GetPixel(x, y : INTEGER) : WORD;
-
- IMPLEMENTATION
-
- PROCEDURE HiRes; { Initialisierung des Grafikpakets }
- BEGIN
- DirectVideo := FALSE;
- GraphDriver := CGA;
- GraphMode := CGAhi;
- InitGraph(GraphDriver, GraphMode, '');
- MaxColor := 15; { höchste erlaubte Farbnummer }
- MaxX := GetMaxX; { Maximal-Koordinaten des Bildschirms }
- MaxY := GetMaxY;
- port[$3d9] := $0F; { VDU ColorSelectRegister $0F}
- { 16 Farben im CGA Hiresmode }
- ActColor := 1;
- END;
-
- PROCEDURE SetBorderColor(Farbe : BYTE);
- VAR regs : Registers;
- BEGIN
- regs.ah := 5;
- Regs.al := Farbe;
- Intr($15, regs);
- END;
-
- PROCEDURE SetReadRegister(Plane : BYTE);
- VAR regs : Registers;
- BEGIN
- regs.ah := 4;
- Regs.al := Plane;
- Intr($15, regs);
- END;
-
- PROCEDURE SetWriteRegister(Farbe : BYTE);
- { setzt die Farbebene zum Schreiben }
- VAR regs : Registers;
- BEGIN
- regs.ah := 3;
- regs.al := Farbe;
- Intr($15, regs);
- END;
-
- PROCEDURE ClearDevice; { Bildschirm löschen }
- BEGIN
- port[$3dd] := $0f;
- graph.cleardevice; { Löschroutine aus GRAPH.TPU }
- END;
-
- PROCEDURE SetColor(Farbe : WORD);
- VAR regs : Registers;
- BEGIN
- SetWriteRegister(Farbe);
- ActColor := Farbe;
- { globale Variable wird auf die aktuelle Farbe gesetzt }
- END;
-
- PROCEDURE PutPixel(x, y : INTEGER; pixel : WORD);
- VAR regs : Registers; i, k : BYTE;
- BEGIN
- FOR i := 0 TO 3 DO BEGIN
- k := 1 SHL i;
- SetReadRegister(i);
- SetWriteRegister(k);
- IF (pixel AND k) = 0 THEN Graph.PutPixel(x, y, 0)
- ELSE Graph.PutPixel(x, y, 1);
- END;
- END;
-
- PROCEDURE Bar(x1, y1, x2, y2 : INTEGER);
- VAR regs : Registers; i, k : BYTE;
- FillStyle : FillSettingsType;
- BEGIN
- GetFillSettings(FillStyle);
- FOR i := 0 TO 3 DO BEGIN
- k := 1 SHL i;
- SetReadRegister(i);
- SetWriteRegister(k);
- IF (ActColor AND k) = 0 THEN BEGIN
- SetFillStyle(FillStyle.Pattern, 0);
- Graph.Bar(x1, y1, x2, y2)
- END ELSE BEGIN
- SetFillStyle(FillStyle.Pattern, 1);
- Graph.Bar(x1, y1, x2, y2);
- END;
- END;
- END;
-
- PROCEDURE Circle(x, y : INTEGER; radius : WORD);
- VAR regs : Registers; i, k : BYTE;
- BEGIN
- FOR i := 0 TO 3 DO BEGIN
- k := 1 SHL i;
- SetReadRegister(i);
- SetWriteRegister(k);
- IF (ActColor AND k) <> 0 THEN
- Graph.Circle(x, y, radius);
- END;
- END;
-
- PROCEDURE FloodFill(x, y : INTEGER; border : WORD);
- VAR i, k : BYTE;
- BEGIN
- FOR i := 0 TO 3 DO BEGIN
- k := 1 SHL i;
- SetReadRegister(i);
- SetWriteRegister(k);
- IF (Actcolor AND k) <> 0 THEN
- Graph.FloodFill(x, y, border);
- END;
- END;
- { Randbegrenzung muß in der Farbe actcolor vorhanden sein! }
-
- FUNCTION GetPixel(x, y : INTEGER) : WORD;
- VAR i, k : BYTE; f : ARRAY [0..3] OF WORD;
- BEGIN
- FOR i := 0 TO 3 DO BEGIN
- SetReadRegister(i);
- f[i] := Graph.GetPixel(x, y);
- END;
- GetPixel := f[0] + 2*f[1] + 4*f[2] + 8*f[3];
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SGRAPH.PAS *)