(*
 * -------------------------------------------------------------------------
 *
 *	:Program.	Graphik.mod
 *	:Contents.	Minimale Graphikroutinen auf bis zu 5 Screens
 *	:Author.	Reiner Nix
 *	:Address.	Geranienhof 2, 5000 Köln 71 Seeberg
 *	:Copyright.	Public Domain
 *	:Language.	Modula-2
 *	:Translator.	M2Amiga A-L V3.3d
 *	:History.	V1.0	21.11.90
 *
 * -------------------------------------------------------------------------
 *)
IMPLEMENTATION MODULE Graphik;

(* $R- Bereichskontrolle aus   *)
(* $V- Überlaufkontrolle aus   *)
(* $S- Stackkontrolle aus      *)


FROM    SYSTEM          IMPORT  ADR;
FROM    Arts            IMPORT  Assert,TermProcedure;
FROM    Graphics        IMPORT  jam2,
                                ViewModes,ViewModeSet,
                                RastPortPtr,ViewPortPtr,
                                SetRGB4,SetAPen,SetRast,WritePixel,Draw,Move,
                                RectFill,Text;
FROM    Intuition       IMPORT  customScreen,
                                ScreenPtr,
                                NewScreen,
                                OpenScreen,CloseScreen,
                                ScreenToFront,ScreenToBack;
FROM    Str             IMPORT  Length;

TYPE    String80                =ARRAY[0..80] OF CHAR;

VAR     i                       :GraphikBereich;
        Dummy                   :BOOLEAN;
        RasterPtr               :RastPortPtr;
        AusschnittPtr           :ViewPortPtr;
        Bildschirm              :ARRAY GraphikBereich OF ScreenPtr;



PROCEDURE OeffneGraphik         (n              :GraphikBereich);

VAR     neuBildschirm           :NewScreen;

BEGIN
WITH neuBildschirm DO
  leftEdge	:= 0;
  topEdge	:= 0;
  width		:= xMax;
  height	:= yMax;
  depth		:= 4;
  detailPen	:= 1;
  blockPen	:= 2;
  viewModes     := ViewModeSet {hires};
  type		:= customScreen;
  font		:= NIL;
  defaultTitle	:= NIL;
  gadgets	:= NIL;
  customBitMap	:= NIL
  END;
Bildschirm[n] := OpenScreen (neuBildschirm);
Assert (Bildschirm[n] # NIL,ADR ("kann Bildschirm nicht öffnen!"))
END OeffneGraphik;


PROCEDURE BenutzeGraphik        (n              :GraphikBereich);

BEGIN
IF Bildschirm[n] = NIL THEN
  OeffneGraphik (n)
  END;
RasterPtr     := ADR (Bildschirm[n]^.rastPort);
AusschnittPtr := ADR (Bildschirm[n]^.viewPort)
END BenutzeGraphik;


PROCEDURE GraphikNachVorne      (n              :GraphikBereich);

BEGIN
IF Bildschirm[n] = NIL THEN
  OeffneGraphik (n)
  END;
ScreenToFront (Bildschirm[n])
END GraphikNachVorne;


PROCEDURE GraphikNachHinten     (n              :GraphikBereich);

BEGIN
IF Bildschirm[n] = NIL THEN
  OeffneGraphik (n)
  END;
ScreenToBack (Bildschirm[n])
END GraphikNachHinten;


PROCEDURE GraphikFarbe          (n              :RegisterBereich;
                                 Farbe          :CARDINAL);

BEGIN
Farbe := Farbe MOD 1000H;
SetRGB4 (AusschnittPtr,n,Farbe DIV 100H,Farbe MOD 100H DIV 10H,Farbe MOD 10H)
END GraphikFarbe;


PROCEDURE BenutzeFarbe          (n              :RegisterBereich);

BEGIN
SetAPen (RasterPtr,n)
END BenutzeFarbe;


PROCEDURE LoescheGraphik        (n              :GraphikBereich);

BEGIN
IF Bildschirm[n] = NIL THEN
  OeffneGraphik (n)
  END;
SetRast (RasterPtr,0)
END LoescheGraphik;


PROCEDURE ZeichnePunkt          (x              :xBereich;
                                 y              :yBereich);

BEGIN
Dummy := WritePixel (RasterPtr,x,y)
END ZeichnePunkt;


PROCEDURE ZeichneLinie          (x1             :xBereich;
                                 y1             :yBereich;
                                 x2             :xBereich;
                                 y2             :yBereich);

BEGIN
Move (RasterPtr,x1,y2);
Draw (RasterPtr,x2,y2)
END ZeichneLinie;


PROCEDURE ZeichneRechteck       (x1             :xBereich;
                                 y1             :yBereich;
                                 x2             :xBereich;
                                 y2             :yBereich);

BEGIN
RectFill (RasterPtr,x1,y1,x2,y2)
END ZeichneRechteck;


PROCEDURE SchreibeSatz          (x              :xBereich;
                                 y              :yBereich;
                                 Satz           :ARRAY OF CHAR);

BEGIN
Move (RasterPtr,x,y);
Text (RasterPtr,ADR (Satz),Length (Satz))
END SchreibeSatz;


PROCEDURE SchliesseAlles;

VAR i :GraphikBereich;

BEGIN
FOR i := 1 TO maxGraphik DO
  IF Bildschirm[i] # NIL THEN
    CloseScreen (Bildschirm[i])
    END
  END
END SchliesseAlles;


BEGIN
RasterPtr     := NIL;
AusschnittPtr := NIL;
FOR i := 1 TO maxGraphik DO
  Bildschirm[i] := NIL
  END;
TermProcedure (SchliesseAlles);
BenutzeGraphik (1)
END Graphik.
