(* $R- $S- $V- *)

MODULE AdvancedLayerClip;

(* Layer-Clipping ... by Holger Gzella *)

FROM Arts      IMPORT Assert;
FROM SYSTEM    IMPORT ADR,INLINE,LONGSET;
FROM Graphics  IMPORT RastPortPtr,Move,Draw,RegionPtr,Rectangle,LayerPtr,
                      NewRegion,OrRectRegion,DisposeRegion,ClearRectRegion,
                      LayerFlags,LayerFlagSet;
FROM GfxMacros IMPORT SetDrPt;
FROM Intuition IMPORT OpenWorkBench,ScreenPtr;
FROM Layers    IMPORT InstallClipRegion,CreateUpfrontLayer,DeleteLayer,
                      LockLayer,UnlockLayer;
FROM Dos       IMPORT Delay;

VAR RastPort   : RastPortPtr;
    OldClipping: RegionPtr;
    NewClipping: RegionPtr;
    i          : INTEGER;
    ok         : BOOLEAN;
    Cliprect   : Rectangle;
    Layer      : LayerPtr;
    WBScreen   : ScreenPtr;

BEGIN

  (* ScreenPtr auf Workbench-Screen holen *)
  (* und ein Upfront-Layer erzeugen ...   *)

  WBScreen:=OpenWorkBench();
  Assert(WBScreen#NIL,ADR("Konnte Workbench nicht öffnen!"));

  Layer:=CreateUpfrontLayer(ADR(WBScreen^.layerInfo),ADR(WBScreen^.bitMap),
                            0,0,640,128,LayerFlagSet{layerSmart},NIL);
  Assert(Layer#NIL,ADR("Konnte Layer nicht öffnen!"));

  RastPort:=Layer^.rp;                          (* RastPort deklarieren *)

  (* Clipping-Bereich definieren ...  *)
  (* (geht von (30;20) bis (610;108)) *)

  WITH Cliprect DO
    minX:=30; minY:=20; maxX:=610; maxY:=108;
  END;

  NewClipping:=NewRegion();                     (* neue Region holen *)
  Assert(NewClipping#NIL,ADR("Kein Speicher mehr!"));

  ok:=OrRectRegion(NewClipping,ADR(Cliprect));  (* Clip-Bereich hinzufügen *)
  Assert(ok#FALSE,ADR("Kein Speicher mehr!"));

  (* Erstmal muß ein Rahmen um das Layer gezeichnet werden! *)

  Move(RastPort,0,0);
  Draw(RastPort,639,0);
  Draw(RastPort,639,127);
  Draw(RastPort,0,127);
  Draw(RastPort,0,0);

  (* Nun wird die neue Region als *)
  (* Clipping-Region eingebunden. *)

  LockLayer(Layer);                             (* Layer versperren *)

  OldClipping:=InstallClipRegion(Layer,NewClipping);

  UnlockLayer(Layer);                           (* Layer freigeben *)

  (* Nun wird gezeichnet, so daß man *)
  (* das Ergebnis auch sieht ...     *)

  Move(RastPort,30,20);                         (* Rahmen zeichnen *)
  Draw(RastPort,610,20);
  Draw(RastPort,610,108);
  Draw(RastPort,30,108);
  Draw(RastPort,30,20);

  (* Jetzt wird über den markierten *)
  (* Bereich hinaus gezeichnet!     *)

  SetDrPt(RastPort,08888H);                     (* Linienmuster setzen *)

  FOR i:=0 TO 640 DO
    Move(RastPort,0,0);
    Draw(RastPort,i,128);
  END;

  (* Nun wird der ursprüngliche Zu- *)
  (* stand wieder hergestellt ...   *)

  LockLayer(Layer);                             (* Layer versperren *)

  OldClipping:=InstallClipRegion(Layer,OldClipping);

  UnlockLayer(Layer);                           (* Layer wieder befreien *)

  ok:=ClearRectRegion(NewClipping,ADR(Cliprect));
  Assert(ok#FALSE,ADR("Konnte Rectangle nicht entfernen!"));

  DisposeRegion(NewClipping);                   (* neue Region entfernen *)

  Delay(250);                                   (* warten ... *)

  (* Das ist der gute Schluß ... *)

  ok:=DeleteLayer(Layer);                       (* Layer entfernen *)
  Assert(ok#FALSE,ADR("Konnte Layer nicht entfernen!"));

END AdvancedLayerClip.
