MODULE ImageIODemo;

(*--------------------------------------------------------------------*)
(*                                                                    *)
(*            ImageIODemo ein Demo für die FileTreasures              *)
(*                   von Paul Lukowicz Juni 1989                      *)
(*                                                                    *)
(*--------------------------------------------------------------------*)
(*  Dieses Programm zeigt einige Anwendungen des Moduls ImageIOLib    *)
(*  der FileTreasures. Um das Programm kurz zu halten haben wir hier  *)
(*  nur einige Möglichkeiten der SaveWin und LoadWin Routinen.        *)
(*--------------------------------------------------------------------*)



FROM  EasyFile    IMPORT  FILE, MakeResponseText, IOErrTxtStr, SetIOErrMode,
                          noHalt;

FROM  FTDecs      IMPORT  Response;

FROM  GraphicsL   IMPORT  SetAPen, DrawEllipse;

FROM  ImageIOLib  IMPORT  SaveWin, ImageInfo, LoadWin, LMinTerm,
                          default, notSource, and, nor, nand, or;

FROM  InOut       IMPORT  ReadString, ReadInt, WriteString, WriteLn, WriteInt;

FROM  IntuitionD  IMPORT  WindowPtr;

FROM  Windows     IMPORT  OpenWindow, WinGad, WinGadSet, WriteS, CloseWindow,
                          WriteL;


VAR  Wins                    : ARRAY[0..1] OF WindowPtr;
     x,y,dx,dy,SColor,TColor : INTEGER;
     Image                   : FILE;
     res                     : Response;
     Name                    : ARRAY[0..2] OF CHAR;



PROCEDURE InitDisplay(VAR Wins: ARRAY OF WindowPtr);

(*  Diese Prozedur öffnet auf dem zwei Fenster und zeichnet in jedem  *)
(*  mit einer anderen Farbe eine aus Ellipsen bestehende Figur.       *)

VAR i : INTEGER;


BEGIN

 OpenWindow(Wins[0],0,0,319,120,"Fenster 1",WinGadSet{ });
 OpenWindow(Wins[1],320,0,319,120,"Fenster 2",WinGadSet{ });

 FOR i := 1 TO 15 DO
  SetAPen(Wins[0]^.rPort,1);
  DrawEllipse(Wins[0]^.rPort,160,65,i*10,54-i*3);
  SetAPen(Wins[1]^.rPort,2);
  DrawEllipse(Wins[1]^.rPort,160,65,i*10,54-i*2)
 END

END InitDisplay;



PROCEDURE Menu(): INTEGER;

(*  Diese Prozdur gibt das Menu aus warte auf eingabe einer Auswahl,  *)
(*  die dann als Funktionsergebnis zurückgegeben wird.                *)

VAR i : INTEGER;


BEGIN

 REPEAT
  WriteLn; WriteString("<1>  Bild speichern");
  WriteLn; WriteString("<2>  Bild laden");
  WriteLn; WriteString("<3>  Datei untersuchen");
  WriteLn; WriteString("<4>  Lademodus");
  WriteLn; WriteString("<5>  Programm beenden");

  WriteLn;
  WriteLn; WriteString("Ihre Wahl ? ");
  ReadInt(i)
 UNTIL (i > 0) AND (i < 6);

 RETURN i;

END Menu;



PROCEDURE Save( Wins: ARRAY OF WindowPtr );

(*  Speichert einen Auschnitt der gewünschten Auschnittes eines Fenster  *)
(*  in die gewünschte Datei                                              *)

VAR  W, x, y, dx, dy, SColor        : INTEGER;
     Name                           : ARRAY[0..120] OF CHAR;
     Text                           : IOErrTxtStr;


BEGIN
  WriteLn;
  REPEAT
   WriteString("Fenster 1 oder 2 ? ");
   ReadInt(W)
  UNTIL (W>0) AND (W<3);

  WriteString("X- Koordinate der linken oberen Ecke ? ");
  ReadInt(x);
  WriteString("Y- Koordinate der linken oberen Ecke ? ");
  ReadInt(y);

  WriteString("Breite ? ");
  ReadInt(dx);
  WriteString("Höhe ? ");
  ReadInt(dy);

  REPEAT
   WriteString("Farbe ? (1 oder 2) ");
   ReadInt(SColor);
  UNTIL (SColor > 0) AND (SColor < 3);

  WriteString("Dateiname ? ");
  ReadString(Name);

  SaveWin(Wins[W-1],x,y,dx,dy,SColor,Name,res);
  MakeResponseText(res,Text);
  WriteLn; WriteString(Text); WriteLn;

END Save;



PROCEDURE Load( Wins: ARRAY OF WindowPtr );

(*  Lädt einen Auschnitt eines gepeicherten Bildes in die gewünschte  *)
(*  Bitplane eines Fensters                                           *)


VAR  W, x, y, dx, dy,fx, fy, TColor : INTEGER;
     Name                           : ARRAY[0..120] OF CHAR;
     Text                           : IOErrTxtStr;

BEGIN
  WriteLn;
  REPEAT
   WriteString("Fenster 1 oder 2 ? ");
   ReadInt(W);
  UNTIL (W>0) AND (W<3);

  WriteString("Ziel-X- Koordinate der linken oberen Ecke ? ");
  ReadInt(x);
  WriteString("Ziel-Y- Koordinate der linken oberen Ecke ? ");
  ReadInt(y);

  WriteString("Breite (-1 = Alles) ? ");
  ReadInt(dx);
  WriteString("Höhe ? (-1 = Alles) ? ");
  ReadInt(dy);

  WriteString("Von X = ? ");
  ReadInt(fx);
  WriteString("Von Y = ? ");
  ReadInt(fy);

  REPEAT
   WriteString("Farbe ? (1 oder 2) ");
   ReadInt(TColor)
  UNTIL (TColor > 0) AND (TColor < 3);

  WriteString("Dateiname ? ");
  ReadString(Name);

  LoadWin(Wins[W-1],fx,fy,dx,dy,1,x,y,TColor,Name,res);
  MakeResponseText(res,Text);
  WriteLn; WriteString(Text); WriteLn;

END Load;



PROCEDURE Info();

(*  Gibt Auskunft über die Breite, Höhe und Tiefe     *)
(*  eines gespeicherten Bildes                        *)


VAR  Name                       : ARRAY[0..120] OF CHAR;
     w, h, Depth, OrgCol        : INTEGER;
     Res                        : Response;
     Text                       : IOErrTxtStr;

BEGIN

 WriteLn; WriteString("Dateiname ? ");
 ReadString(Name);
 ImageInfo(Name,w,h,Depth,OrgCol,Res);
 WriteLn; WriteString("Breite  = "); WriteInt(w,-1);
 WriteLn; WriteString("Höhe    = "); WriteInt(h,-1);
 WriteLn; WriteString("Tiefe   = "); WriteInt(Depth,-1);
 MakeResponseText(Res,Text);
 WriteLn; WriteString(Text); WriteLn;


END Info;


PROCEDURE SetMode();

(*  Setz den "MinTerm" Wert für Blitteroperationen beim Laden von Bildern.  *)
(*  Dadurch kann das geladene Bild, invertiert oder mit dem Inhalt des      *)
(*  Fensters verknüpft werden                                               *)

VAR i : INTEGER;


BEGIN

 REPEAT
  WriteLn; WriteString("<1>  Normal");
  WriteLn; WriteString("<2>  Daten invertieren");
  WriteLn; WriteString("<3>  OR");
  WriteLn; WriteString("<4>  AND");
  WriteLn; WriteString("<5>  NOR");

  WriteLn;
  WriteLn; WriteString("Ihre Wahl ? ");
  ReadInt(i)
 UNTIL (i > 0) AND (i < 6);

 CASE i OF
   1: LMinTerm := default   |
   2: LMinTerm := notSource |
   3: LMinTerm := or        |
   4: LMinTerm := and       |
   5: LMinTerm := nor
 END

END SetMode;


BEGIN

 InitDisplay(Wins);           (*  Menu ausgeben                     *)
 SetIOErrMode(noHalt);        (*  Keine unterbrechung durch Fehler  *)

 (*  Programmschleife  *)
 LOOP
  CASE Menu() OF
   1: Save(Wins) |
   2: Load(Wins) |
   3: Info()     |
   4: SetMode()  |
   5: EXIT
  END
 END;

 CloseWindow(Wins[0]);      (*  Ende - > Fenster schliessen  *)
 CloseWindow(Wins[1])

END ImageIODemo.

