

MODULE  ScreenDemo;


(*-------------------------------------------------------------------------*)
(*                                                                         *)
(*                 Demo zum Bibliotheksmodul "ScreenLib"                   *)
(*                                                                         *)
(*  Hier wird die Anwendung der wichtigsten Prozeduren aus dem Modul       *)
(*  "ScreenLib" demonstriert. Es wird auch deutlich wie die "ScreenLib"    *)
(*  im Zusammenhang mit anderen Systemroutinen gebraucht werden kann.      *)
(*                     April 1988 by Paul Lukowicz                         *)
(*                                                                         *)
(*  Überarbeitet und erweitert um Extra-Halfbrite sowie H.A.M. Screen von  *)
(*  Ernst Heinz  /  02.10.1990                                             *)
(*                                                                         *)
(*-------------------------------------------------------------------------*)




FROM  ScreenLib   IMPORT  SimpleScr, SimpleScrX, WriteScr, CloseScr, SetColReg,
                          PlaceScr, GetScrRast, GetScrMouse, FillScr, ScrollScr,
                          GetScrDim, halfbrite, ham, noBar;

FROM  IntuitionD  IMPORT  ScreenPtr;

FROM  IntuitionL  IMPORT  MoveScreen;

FROM  DosL        IMPORT  Delay;

FROM  GraphicsD   IMPORT  bold, RastPortPtr;

FROM  GraphicsL   IMPORT  RectFill, SetAPen, TextLength, WritePixel;

FROM  SYSTEM      IMPORT  ADR;




CONST  briteText = 'Ein Extra-Halfbrite Screen ohne Titel !';

       hamText = 'Ein H.A.M. Screen ohne Titel !';




VAR
    S1, S2, S3			: ScreenPtr;     (*  Zeiger auf die Screens  *)
    Rast			: RastPortPtr;   (*  RastPort des Screens  *)
    n			        : LONGINT;       (*  Hilfsvariablen  *)
    X, Y, j1, j2, j3, bj1,
    bj2, bj3, i, Yk		: INTEGER;
    k, l, w, h, x               : INTEGER;
    error                       : BOOLEAN;




BEGIN
 (*  Low-Resolution Screen öffnen, Farbe setzen und Text ausgeben.  *)

 S1 := SimpleScr('Screen1',0,0,1,5,FALSE,FALSE,FALSE);
 WriteScr(S1,"Low Resolution Screen",50,20,1,2);
 Delay(200);

 (*  High-Resolution Screen öffnen, Farbe setzen und Text ausgeben.  *)

 S2 := SimpleScr('Screen2',0,30,2,3,FALSE,FALSE,FALSE);
 SetColReg(S2,0,15,10,0);
 WriteScr(S2,"High Resolution Screen",150,30,2,1);
 ScrollScr(S2,0,15,600,200,0,-100,0,1,0,5);
 ScrollScr(S2,0,15,600,200,0,100,0,25,0,-6);

 (*  Low-Resolution Screen öffnen, Farbe setzen und Text ausgeben.  *)

 S3 := SimpleScr('Screen3',0,120,3,2,FALSE,FALSE,FALSE);
 SetColReg(S3,0,0,0,15);
 WriteScr(S3,"Low Resolution Interlace ",50,30,1,0);
 Delay(200);


 PlaceScr(S1,0,120,TRUE);   (*  LoRes-Screen im Vordergrund neu plazieren.  *)
 WriteScr(S1,"Der Erste Screen ist vorne",50,40,3,1);

 j1 := 0; j2 := 0; j3 := 0;        (*  Gesamtverschiebung für Screens  *)
 bj1 := 2; bj2 := -1; bj3 := -4;   (*  Betrag einer Einzelverschiebung  *)

 FOR i := 0 TO 100 DO
  j1 := j1 + bj1;                  (*  Verschiebung mitzählen  *)
  IF ABS(j1) > 20 THEN             (*  Gesamtverschiebung > 20 ?  *)
   bj1 := bj1 * (-1)		   (*  ja --> Verschieberichtung umdrehen  *)
  END;
  j2 := j2 + bj2;                  (*  analog für Screen 2  *)
  IF ABS(j2) > 20 THEN
   bj2 := bj2 * (-1)
  END;
  j3 := j3 + bj3;                  (*  analog für Screen 3  *)
  IF ABS(j3) > 40 THEN
   bj3 := bj3 * (-1)
  END;
  MoveScreen(S3,0,bj3);            (*  Screens verschieben  *)
  MoveScreen(S2,0,bj2);
  MoveScreen(S1,0,bj1)
 END;

 CloseScr(S2);                     (*  Screen 2 und Screen 3 schließen  *)
 CloseScr(S3);
 PlaceScr(S1,0,0,TRUE);
 WriteScr(S1,"Andere Screens geschlossen.",50,60,3,0);
 Delay(200);

 PlaceScr(S1,0,0,TRUE);      (*  Screen 1 ganz nach oben  *)
 Rast := GetScrRast(S1);     (*  RastPort holen, Screen mit Farbe füllen  *)
 FillScr(S1,3);
 GetScrMouse(S1,X,Y);        (*  Mausposition  *)
 Yk := 50;                   (*  Position des "Enderechteckes" *)
 IF (Y - Yk) < 20 THEN
  Yk := Y + 5                (*  Maus schon drin ?  Ja, Position ändern.  *)
 END;
 RectFill(Rast,0,Yk,60,Yk+20);
 WriteScr(S1,"Nun könen Sie mit der Maus zeichnen.",10,20,2,3);
 WriteScr(S1,"Hier",10,Yk+7,1,0);
 WriteScr(S1,"ENDE",10,Yk+17,1,0);
 REPEAT
  GetScrMouse(S1,X,Y);               (*  Mauskoordinaten holen und  *)
  error := WritePixel(Rast,X,Y)      (*  an dieser Stelle Punkt zeichnen  *)
 UNTIL (X<60) AND ((Y-Yk) < 20) AND (Y>Yk);   (*  bis Maus im "Enderechteck"  *)

 CloseScr(S1);               (*  nun auch noch Screen 1 schließen  *)

 (*  Nun einen Extra-Halfbrite Screen öffnen.  *)

 S1 := SimpleScrX('',0,0,1,1,halfbrite+noBar);
 Rast := GetScrRast(S1);
 SetColReg(S1,0,5,5,5);
 SetColReg(S1,1,5,3,6);
 GetScrDim(S1,x,l,w,h);
 l := TextLength(Rast,ADR(briteText),SIZE(briteText));
 x := (w-l)/2;
 WriteScr(S1,briteText,x,h-13, 1,0);
 WriteScr(S1,briteText,x,h- 3,33,0);
 w := w/3;
 h := (h-25)/32;
 l := w/2;
 x := l+w;
 l := l/31;
 FOR k:=1 TO 31 DO
  SetAPen(Rast,k);
  RectFill(Rast,k*l,h*k,k*l+w-1,h*k+h-1);
  SetAPen(Rast,k+32);
  RectFill(Rast,x+k*l,h*k,x+k*l+w-1,h*k+h-1)
 END;
 Delay(300);
 CloseScr(S1);

 (*  Und zum Schluß noch einen H.A.M. Screen öffnen.  *)

 S1 := SimpleScrX('',0,0,1,1,ham+noBar);
 Rast := GetScrRast(S1);
 SetColReg(S1,0,5,5,5);
 SetColReg(S1,1,0,0,0);
 GetScrDim(S1,x,l,w,h);
 l := h/48;
 FillScr(S1,1);
 FOR k:=16 TO 63 DO                       (*  horizontale Streifen zeichnen  *)
  SetAPen(Rast,k);
  RectFill(Rast,0,(k-16)*l,w-1,(k-15)*l-1)
 END;
 Delay(120);
 l := w/48;
 FOR k:=16 TO 63 DO                       (*  vertikale Streifen zeichnen  *)
  Delay(40);
  SetAPen(Rast,k);
  RectFill(Rast,(k-16)*l,0,(k-15)*l-3,h-1)
 END;
 SetAPen(Rast,3);
 RectFill(Rast,0,40,w-1,79);
 l :=TextLength(Rast,ADR(hamText),SIZE(hamText));
 x := (w-l)/2;
 WriteScr(S1,hamText,x,60,1,3);
 Delay(300)
END  ScreenDemo.
