(*---------------------------------------------------------------------------
  :Program.    BobTools.mod
  :Contents.   Tools für BobEdi
  :Author.     Frank Lömker
  :Copyright.  FreeWare, siehe Dok-File
  :Language.   Modula-2
  :Translator. M2Amiga V4.0d
  :Imports.    IntuiSupport 1.1.3 [Christian Stiens], BobHelp [Frank Lömker]
  :History.    V1.0, [Frank Lömker] 26-Dez-91
  :History.    V2.0, [Frank Lömker] 09-Jul-92 erweitert
  :Bugs.       keine bekannt
---------------------------------------------------------------------------*)

IMPLEMENTATION MODULE BobTools;

(*$ LargeVars:=FALSE StackParms:=FALSE StackChk:=FALSE NilChk:=FALSE
    OverflowChk:=FALSE RangeChk:=FALSE EntryClear:=FALSE Volatile:=FALSE *)

FROM IntuitionD IMPORT GadgetPtr,StringInfo,WindowFlagSet,WindowFlags,
      IDCMPFlagSet,IDCMPFlags,ActivationFlagSet,ActivationFlags,IntuiMessage,
      PropInfoFlagSet,PropInfoFlags,PropInfo,selectDown,menuDown;
FROM IntuitionL IMPORT RefreshGadgets,ActivateGadget,CloseWindow,ModifyIDCMP,
      RemoveGadget,NewModifyProp;
FROM GraphicsD IMPORT DrawModeSet,DrawModes;
FROM GraphicsL IMPORT BltBitMap,ClipBlit,SetAPen,RectFill,SetRGB4,SetDrMd,
      WaitBlit,ReadPixel,SetRast;
FROM DosL IMPORT Delay;
FROM ExecL IMPORT WaitPort;
FROM MathTrans IMPORT Asin,Sin,Cos,Sqrt;
FROM Conversions IMPORT ValToStr;
FROM String IMPORT FirstPos;
FROM IntuiSupport IMPORT CreateWindowA,CreateStrGadget,CreateBoolGadget,GetIMes,
      CreatePropGadget,autoBord3D,stdGadg,stdActv;
FROM BobHelp IMPORT REAL,str2,Tgrenzen,TgrenzG,Tfarben,Tpunkte, mittex,mittey,
      MaxX,MaxY,maxbreite,aus,rp,nachwin,mywin,myscreen,myBit,anzbilder,bilder,
      helpbit,xbreite,ybreite,RasterA,Lkor,kleinx,kleiny,Print,PrintHot,
      PrintVal,PrintHex,line,box,rahmen,fehler,gadget,checkgads,lupe,getCol,
      Plot,PixCol;
FROM SYSTEM IMPORT ADR,ASSEMBLE;

VAR imes:IntuiMessage;

PROCEDURE copy (bildnr:INTEGER);
VAR strgad:ARRAY [1..3] OF GadgetPtr;
    copgad,exgad:GadgetPtr;
    stinfo:POINTER TO StringInfo;
    gad:GadgetPtr;
    gadnr,nr:INTEGER;
    werte:ARRAY [1..3] OF INTEGER;
    helpstr:str2;
    err:BOOLEAN;
    err2:LONGCARD;
BEGIN
  nachwin:=CreateWindowA (NIL,mittex-73,mittey-28,147,56,myscreen,NIL,
           WindowFlagSet{activate,rmbTrap},IDCMPFlagSet{gadgetUp,vanillaKey});
  rp:=nachwin^.rPort;
  ValToStr (bildnr,TRUE,helpstr,10,-2,0C,err);
  strgad[1]:=CreateStrGadget (1,39,6,24,8,3,autoBord3D,stdGadg,stdActv,
                              helpstr,bildnr,nachwin);
   PrintHot (2,9,13,3,ADR("von"),1);
  nr:=bildnr; INC (nr);
  IF nr>anzbilder THEN nr:=1; END;
  ValToStr (nr,TRUE,helpstr,10,-2,0C,err);
  strgad[2]:=CreateStrGadget (2,110,6,24,8,3,autoBord3D,stdGadg,stdActv,
                              helpstr,nr,nachwin);
   PrintHot (2,72,13,4,ADR("nach"),1);
  strgad[3]:=CreateStrGadget (3,100,21,24,8,3,autoBord3D,stdGadg,stdActv,
                              "1",1,nachwin);
   PrintHot (2,20,28,7,ADR("Anzahl:"),1);
  copgad:=CreateBoolGadget (4,15,41,32,8,ADR("Copy"),autoBord3D,stdGadg,
                    ActivationFlagSet{relVerify},nachwin);
  SetAPen (rp,1);
  line (16,48,22,48); line (68,48,74,48);
  exgad:=CreateBoolGadget (5,67,41,64,8,ADR("Exchange"),autoBord3D,stdGadg,
                    ActivationFlagSet{relVerify},nachwin);
  RefreshGadgets (strgad[1],nachwin,NIL);
  rp:=mywin^.rPort;
  err:=ActivateGadget (strgad[1],nachwin,NIL);
  gadnr:=-1;
  REPEAT
    GetIMes (nachwin,imes,TRUE);
    IF gadgetUp IN imes.class THEN
      gad:=imes.iAddress; gadnr:=gad^.gadgetID;
    ELSIF (vanillaKey IN imes.class) AND (imes.code#32) THEN
      gadnr:=FirstPos ("VNA CE",0,CAP(CHAR(imes.code)));
    END;
    IF (gadnr>=0) AND (gadnr<3) THEN
      err:=ActivateGadget (strgad[gadnr+1],nachwin,NIL);
    END;
  UNTIL gadnr>3;
  FOR nr:=1 TO 3 DO
    stinfo:=strgad[nr]^.specialInfo;
    werte[nr]:=ABS(stinfo^.longInt);
    IF (werte[nr]=0) AND (nr<3) THEN werte[nr]:=1; END;
  END;
  IF gadnr=4 THEN  (* kopieren *)
    FOR nr:=0 TO (werte[3]-1) DO
      IF werte[2]+nr>anzbilder THEN werte[2]:=1-nr; END;
      IF werte[1]+nr>anzbilder THEN werte[1]:=1-nr; END;
      err2:=BltBitMap (ADR(bilder^[werte[1]+nr]),0,0,
              ADR(bilder^[werte[2]+nr]),0,0,MaxX,MaxY,192,255,NIL);
    END;
  ELSE             (* austauschen *)
    FOR nr:=0 TO werte[3]-1 DO
      IF werte[2]+nr>anzbilder THEN werte[2]:=1-nr; END;
      IF werte[1]+nr>anzbilder THEN werte[1]:=1-nr; END;
      err2:=BltBitMap (ADR(bilder^[werte[2]+nr]),0,0,
              ADR(helpbit),0,0,MaxX,MaxY,192,255,NIL);
      err2:=BltBitMap (ADR(bilder^[werte[1]+nr]),0,0,
              ADR(bilder^[werte[2]+nr]),0,0,MaxX,MaxY,192,255,NIL);
      err2:=BltBitMap (ADR(helpbit),0,0,
              ADR(bilder^[werte[1]+nr]),0,0,MaxX,MaxY,192,255,NIL);
    END;
  END;
  CloseWindow (nachwin); nachwin:=NIL;
END copy;

PROCEDURE animation (VAR grenzen:Tgrenzen;VAR mode:SHORTINT;VAR warte:BOOLEAN);
VAR xAnim,yAnim:INTEGER;

  PROCEDURE animKords; (*$ EntryExitCode:=FALSE *)
  BEGIN  (* Vor            Zurück         P.Pong        Delay *)
    ASSEMBLE (
      DC.W 40,138,92,150, 40,153,92,165, 40,168,92,180, 135,123,188,135,
        (* Start           Cancel             Mode(ganz) *)
           61,190,105,202, 120,190,172,202, 37,122,95,185
    END);
  END animKords;

  PROCEDURE zeiganim (VAR nr,delay,richt:INTEGER;speed,mode:INTEGER;
                      warte:BOOLEAN);
  VAR err:LONGCARD;
  BEGIN
    DEC (delay);
    IF delay<=0 THEN
      IF mode=3 THEN
        IF (nr>=grenzen[2]) OR (nr<=grenzen[1]) THEN richt:=-richt; END;
      END;
      IF nr>grenzen[2] THEN nr:=grenzen[1+INTEGER(mode=3)];
      ELSIF nr<grenzen[1] THEN nr:=grenzen[2-INTEGER(mode=3)]; END;
      PrintVal (2,xAnim+xbreite+8,yAnim+6+ybreite DIV 2,2,nr);
      err:=BltBitMap (ADR(bilder^[nr]),0,0,rp^.bitMap,xAnim,yAnim+11,
                       xbreite,ybreite,192,255,NIL);
      INC (nr,richt);
      IF warte THEN Delay (speed); delay:=0;
               ELSE delay:=speed*speed*10; END;
    END;
  END zeiganim;

CONST anzsteps=31;
VAR xpos,ypos,wahl,
    speed,delay,richt,nr:INTEGER;
    start,err:BOOLEAN;
    speedgad:GadgetPtr;
    grenzgad:TgrenzG;
    prinfo:POINTER TO PropInfo;
    ko:POINTER TO ARRAY [1..7],[1..4] OF INTEGER;
    helpstr:str2;
    gad:GadgetPtr;

BEGIN
  SetAPen (rp,0);
  RectFill (rp,0,0,maxbreite+1,maxbreite+1);
  box (1,1,maxbreite+1,maxbreite+1,4);
  box (2,2,maxbreite,maxbreite,7);
  xAnim:=mittex-xbreite DIV 2; yAnim:=73-ybreite;
  SetAPen (rp,1);
  RectFill (rp,xAnim,yAnim,xAnim+xbreite-1,yAnim+ybreite-1);
  box (xAnim-2,yAnim-2,xAnim+xbreite+1,yAnim+ybreite+1,7);
  speedgad:=CreatePropGadget (1,mittex-anzsteps*2-3,84,anzsteps*4+6,11,
          anzsteps,0,NIL,stdGadg,ActivationFlagSet{gadgImmediate,relVerify,
          followMouse}, PropInfoFlagSet{autoKnob,freeHoriz},mywin);
  prinfo:=speedgad^.specialInfo;
  ko:=ADR(animKords);
  Print (2,mittex-32,mittey-6,8,ADR("Speed: 0"));
  Print (2,42,132,6,ADR(" Mode "));
  gadget (ko^[1,1],ko^[1,2],ko^[1,3],"Vor",2);
  gadget (ko^[2,1],ko^[2,2],ko^[1,3],"Zurück",1);
  gadget (ko^[3,1],ko^[3,2],ko^[1,3],"P.Pong",1);
  gadget (ko^[4,1],ko^[4,2],ko^[4,3],"Delay",1);
  gadget (ko^[5,1],ko^[5,2],ko^[5,3],"Start",1);
  gadget (ko^[6,1],ko^[6,2],ko^[6,3],"Cancel",1);
  ValToStr (grenzen[1],TRUE,helpstr,10,-2,0C,err);
  grenzgad[1]:=CreateStrGadget (2,162,145,24,8,3,autoBord3D,stdGadg,stdActv,
                                helpstr,grenzen[1],mywin);
  ValToStr (grenzen[2],TRUE,helpstr,10,-2,0C,err);
  grenzgad[2]:=CreateStrGadget (3,162,168,24,8,3,autoBord3D,stdGadg,stdActv,
                                helpstr,grenzen[2],mywin);
  RefreshGadgets (speedgad,mywin,NIL);
  PrintHot (2,135,151,3,ADR("von"),1);
  PrintHot (2,135,174,3,ADR("bis"),1);
  rahmen (132,141,191,179,FALSE);
  Print (2,xAnim+xbreite+8,yAnim-3+ybreite DIV 2,2,ADR("Nr"));
  rahmen (ko^[7,1],ko^[7,2],ko^[7,3],ko^[7,4],FALSE);
  rahmen (ko^[mode,1],ko^[mode,2],ko^[mode,3],ko^[mode,4],TRUE);
  rahmen (ko^[4,1],ko^[4,2],ko^[4,3],ko^[4,4],warte);
  ModifyIDCMP (mywin,IDCMPFlagSet{mouseButtons,mouseMove,gadgetUp,vanillaKey});
  nr:=1; speed:=0; delay:=0; richt:=1;
  start:=FALSE;
  err:=ActivateGadget (grenzgad[1],mywin,NIL);
  REPEAT
    IF start THEN
      zeiganim (nr,delay,richt,speed,mode,warte);
    ELSE
      WaitPort (mywin^.userPort);
    END;
    GetIMes (mywin,imes,FALSE);
    wahl:=0;
    IF gadgetUp IN imes.class THEN
      gad:=imes.iAddress;
      CASE gad^.gadgetID OF
         1: speed:=CARDINAL(LONGCARD(prinfo^.horizPot)*anzsteps DIV 65536);
            PrintVal(2,mittex+16,mittey-6,2,speed);
        |2..3: checkgads (grenzgad,grenzen,TRUE);
               IF gad^.gadgetID=2 THEN
                 err:=ActivateGadget (grenzgad[2],mywin,NIL);
               END;
        ELSE
      END;  (* CASE gad^.gadgetID *)
    ELSIF (mouseMove IN imes.class) THEN
      speed:=CARDINAL(LONGCARD(prinfo^.horizPot)*anzsteps DIV 65536);
      PrintVal(2,mittex+16,mittey-6,2,speed);
    ELSIF (mouseButtons IN imes.class) AND (imes.code=selectDown) THEN
      xpos:=imes.mouseX; ypos:=imes.mouseY;
      REPEAT
        INC (wahl);
      UNTIL (wahl>6) OR ((xpos>=ko^[wahl,1]) AND (ypos>=ko^[wahl,2]) AND
                         (xpos<=ko^[wahl,3]) AND (ypos<=ko^[wahl,4]));
    ELSIF vanillaKey IN imes.class THEN
      wahl:=FirstPos(" OZPDSCVB",0,CAP(CHAR(imes.code)));
      IF wahl>6 THEN
        err:=ActivateGadget (grenzgad[wahl-6],mywin,NIL);
      END;
    END;  (* IF gadgetUp *)
    CASE wahl OF
      1..3: FOR xpos:=1 TO 3 DO
              rahmen (ko^[xpos,1],ko^[xpos,2],
                      ko^[xpos,3],ko^[xpos,4],xpos=wahl);
            END;
            richt:=INTEGER(wahl#2)*2-1; mode:=wahl;
      |  4: warte:=NOT warte;
            rahmen (ko^[wahl,1],ko^[wahl,2],ko^[wahl,3],ko^[wahl,4],warte);
      |5..6: start:=NOT start;
             IF wahl=6 THEN start:=TRUE; END;
             rahmen (ko^[wahl,1],ko^[wahl,2],ko^[wahl,3],ko^[wahl,4],start);
             checkgads (grenzgad,grenzen,TRUE);
      ELSE
    END;  (* CASE wahl *)
  UNTIL wahl=6;
  ModifyIDCMP (mywin,IDCMPFlagSet{mouseButtons,rawKey});
  nr:=RemoveGadget (mywin,grenzgad[1]);
  nr:=RemoveGadget (mywin,grenzgad[2]);
  nr:=RemoveGadget (mywin,speedgad);
  SetAPen (rp,0);
  RectFill (rp,1,1,maxbreite+1,maxbreite+1);
  lupe;
END animation;

PROCEDURE palette (farbe:INTEGER);
CONST r=1;
      g=2;
      b=3;
      h=4;
      s=5;
      v=6;

  PROCEDURE palKords; (*$ EntryExitCode:=FALSE *)
  BEGIN  (* Farben         Copy           Exchange       Spread *)
    ASSEMBLE (
      DC.W 14,115,101,135, 120,17,173,29, 120,34,173,46, 120,51,173,63,
        (* Ok             Cancel *)
           120,72,173,84, 120,89,173,101
    END);
  END palKords;

VAR farbW:ARRAY [16..31],[1..6] OF SHORTINT;
    farbgad:ARRAY [1..6] OF GadgetPtr;
    propI:PropInfoFlagSet;

  PROCEDURE rgb2hsv (nr:INTEGER);
  VAR min,dm:INTEGER;
  BEGIN
    farbW[nr,v]:=farbW[nr,r];
    IF farbW[nr,v]<farbW[nr,g] THEN farbW[nr,v]:=farbW[nr,g]; END;
    IF farbW[nr,v]<farbW[nr,b] THEN farbW[nr,v]:=farbW[nr,b]; END;
    min:=farbW[nr,r];
    IF min>farbW[nr,g] THEN min:=farbW[nr,g]; END;
    IF min>farbW[nr,b] THEN min:=farbW[nr,b]; END;
    farbW[nr,s]:=0; farbW[nr,h]:=0;
    IF (farbW[nr,v]>0) THEN
      dm:=farbW[nr,v]-min;
      farbW[nr,s]:=(dm*15) DIV farbW[nr,v];
      IF dm=0 THEN dm:=1; END;
      IF farbW[nr,v]=farbW[nr,r] THEN
        farbW[nr,h]:=(farbW[nr,g]-farbW[nr,b])*15 DIV dm;
      ELSIF farbW[nr,v]=farbW[nr,g] THEN
        farbW[nr,h]:=(farbW[nr,b]-farbW[nr,r])*15 DIV dm +30;
      ELSE (* v=b *)
        farbW[nr,h]:=(farbW[nr,r]-farbW[nr,g])*15 DIV dm +60;
      END;
      IF farbW[nr,h]<0 THEN farbW[nr,h]:=farbW[nr,h]+90; END;
    END;
  END rgb2hsv;

  PROCEDURE hsv2rgb (nr:INTEGER);
  VAR hi,hf,t1,t2,t3,t4:INTEGER;
  BEGIN
    farbW[nr,r]:=farbW[nr,v]; farbW[nr,g]:=farbW[nr,v];
    farbW[nr,b]:=farbW[nr,v];
    IF farbW[nr,s]>0 THEN
      hi:=farbW[nr,h] DIV 15;
      hf:=farbW[nr,h] MOD 15;
      t4:=farbW[nr,s]; t3:=farbW[nr,v];
      t1:=t3-(t3*t4) DIV 15;
      t2:=t3-(t3*t4*hf) DIV 225;
      t3:=t3-(t3*t4) DIV 15+(t3*t4*hf) DIV 225;
      CASE hi OF
         0: farbW[nr,g]:=t3; farbW[nr,b]:=t1;
        |1: farbW[nr,r]:=t2; farbW[nr,b]:=t1;
        |2: farbW[nr,r]:=t1; farbW[nr,b]:=t3;
        |3: farbW[nr,r]:=t1; farbW[nr,g]:=t2;
        |4: farbW[nr,r]:=t3; farbW[nr,g]:=t1;
        |5: farbW[nr,g]:=t1; farbW[nr,b]:=t2;
      END;
    END;
  END hsv2rgb;

  PROCEDURE modifyGads (start,ende:INTEGER);
  VAR nr,xpos:INTEGER;
  BEGIN
    FOR nr:=start TO ende DO
      IF nr#4 THEN
        NewModifyProp(farbgad[nr],nachwin,NIL,propI,
                   0,4369*(15-CARDINAL(farbW[farbe,nr])),0,4096,1);
      END;
      xpos:=nr*16-6+9*INTEGER(nr>4);
      IF nr=4 THEN INC (xpos,5); END;
      PrintHex (2,xpos,111,1+INTEGER(nr=4),farbW[farbe,nr]);
    END;
    IF (start<=4) AND (4<=ende) THEN
      NewModifyProp(farbgad[4],nachwin,NIL,propI,0,
       (737-CARDINAL(farbW[farbe,4]=0))*(89-CARDINAL(farbW[farbe,4])),0,728,1);
    END;
  END modifyGads;

VAR gad:GadgetPtr;
    prinfo:POINTER TO PropInfo;
    wahl,xpos,ypos,nr,altF,help,grenze:INTEGER;
    RGBfarb,altfarben:Tfarben;
    ko:POINTER TO ARRAY [1..6],[1..4] OF INTEGER;
    modus:SHORTINT;
    delta:REAL;
BEGIN
  nachwin:=CreateWindowA (ADR("Palette"),mittex-94,mittey-65,188,140,
         myscreen,NIL,WindowFlagSet{activate,windowDrag,rmbTrap},
         IDCMPFlagSet{mouseButtons,gadgetUp,gadgetDown,vanillaKey});
  rp:=nachwin^.rPort;
  ko:=ADR(palKords);
  Print (2,10,18,12,ADR("R G B  H S V"));
  Print (2,55,26,2,ADR("F "));
  Print (2,55,104,2,ADR("0 "));
  getCol (RGBfarb); altfarben:=RGBfarb;
  FOR nr:=16 TO 31 DO
    FOR help:=1 TO 3 DO
      farbW[nr,help]:=RGBfarb[nr,help];
    END;
    rgb2hsv (nr);
    SetAPen (rp,nr);
    RectFill (rp,14+(nr MOD 8)*11,115+INTEGER(nr>23)*11,
                 23+(nr MOD 8)*11,124+INTEGER(nr>23)*11);
  END;
  box (13+(farbe MOD 8)*11,114+INTEGER(farbe>23)*11,
       24+(farbe MOD 8)*11,125+INTEGER(farbe>23)*11,7);
  SetAPen (rp,farbe); RectFill (rp,122,117,171,133);
  rahmen (120,115,173,135,FALSE);
  propI:=PropInfoFlagSet{autoKnob,freeVert};  (* nr*24 *)
  FOR nr:=1 TO 6 DO
    farbgad[nr]:=CreatePropGadget (nr,nr*16-8+9*INTEGER(nr>3),22,12,80,0,16,
           NIL,stdGadg,ActivationFlagSet{gadgImmediate,relVerify},
           propI,nachwin);
  END;
  modifyGads (1,6);
  RefreshGadgets (farbgad[1],nachwin,NIL);
  gadget (ko^[2,1],ko^[2,2],ko^[2,3],"Copy",3);
  gadget (ko^[3,1],ko^[3,2],ko^[3,3],"Exch",1);
  gadget (ko^[4,1],ko^[4,2],ko^[4,3],"Spread",1);
  gadget (ko^[5,1],ko^[5,2],ko^[5,3],"OK",1);
  gadget (ko^[6,1],ko^[6,2],ko^[6,3],"CANCEL",1);
  modus:=0;
  REPEAT
    GetIMes (nachwin,imes,TRUE);
    wahl:=0;
    IF (gadgetUp IN imes.class) OR (gadgetDown IN imes.class)
       OR (intuiTicks IN imes.class) THEN
      IF gadgetDown IN imes.class THEN
         ModifyIDCMP (nachwin,
          IDCMPFlagSet{mouseButtons,gadgetUp,gadgetDown,vanillaKey,intuiTicks});
      ELSIF gadgetUp IN imes.class THEN
         ModifyIDCMP (nachwin,
              IDCMPFlagSet{mouseButtons,gadgetUp,gadgetDown,vanillaKey});
      END;
      IF NOT (intuiTicks IN imes.class) THEN gad:=imes.iAddress; END;
      nr:=gad^.gadgetID; prinfo:=gad^.specialInfo;
      IF nr#4 THEN
        ypos:=15-INTEGER(LONGCARD(prinfo^.vertPot)*15 DIV 65535);
      ELSE
        ypos:=89-INTEGER(LONGCARD(prinfo^.vertPot)*89 DIV 65535);
      END;
      help:=nr*16-6+9*INTEGER(nr>4);
      IF nr=4 THEN INC (help,5); END;
      PrintHex (2,help,111,1+INTEGER(nr=4),ypos);
      farbW[farbe,nr]:=ypos;
      IF nr>3 THEN
        hsv2rgb (farbe); modifyGads (1,3);
      ELSE
        rgb2hsv (farbe); modifyGads (4,6);
      END;
      IF gadgetUp IN imes.class THEN modifyGads (nr,nr); END;
      SetRGB4 (ADR(myscreen^.viewPort),farbe,
               farbW[farbe,1],farbW[farbe,2],farbW[farbe,3]);
    ELSIF (mouseButtons IN imes.class) AND (imes.code=selectDown) THEN
      xpos:=imes.mouseX; ypos:=imes.mouseY;
      REPEAT
        INC (wahl);
      UNTIL (wahl>6) OR ((xpos>=ko^[wahl,1]) AND (ypos>=ko^[wahl,2]) AND
                         (xpos<=ko^[wahl,3]) AND (ypos<=ko^[wahl,4]));
    ELSIF (vanillaKey IN imes.class) AND (imes.code#32) THEN
      wahl:=FirstPos ("  PESOC",0,CAP(CHAR(imes.code)));
    END;  (* IF gadgetUp *)
    IF (wahl>1) AND (wahl<7) THEN
      rahmen (ko^[wahl,1],ko^[wahl,2],ko^[wahl,3],ko^[wahl,4],TRUE);
    END;
    CASE wahl OF
       1: box (13+(farbe MOD 8)*11,114+INTEGER(farbe>23)*11,  (* Farbleiste *)
               24+(farbe MOD 8)*11,125+INTEGER(farbe>23)*11,0);
          altF:=farbe;
          farbe:=(xpos-14) DIV 11+16+INTEGER(ypos>125)*8;
          CASE modus OF
             1: FOR nr:=1 TO 6 DO
                  farbW[farbe,nr]:=farbW[altF,nr];
                END;
            |2: FOR nr:=1 TO 6 DO
                  help:=farbW[altF,nr];
                  farbW[altF,nr]:=farbW[farbe,nr];
                  farbW[farbe,nr]:=help
                END;
            |3: IF ABS(altF-farbe)>1 THEN
                  IF altF>farbe THEN
                    grenze:=farbe;
                  ELSE
                    grenze:=altF; altF:=farbe;
                  END;
                  FOR nr:=1 TO 3 DO
                    delta:=REAL(farbW[altF,nr]-farbW[grenze,nr])
                           / REAL(altF-grenze);
                    FOR help:=grenze+1 TO altF-1 DO
                      farbW[help,nr]:=INTEGER(delta*REAL(help-grenze))
                                      +farbW[grenze,nr];
                    END;
                  END;
                  FOR nr:=grenze+1 TO altF-1 DO
                    rgb2hsv (nr);
                  END;
                END;
            ELSE
          END;
          IF modus>0 THEN
            FOR nr:=16 TO 31 DO
              SetRGB4 (ADR(myscreen^.viewPort),nr,
                   farbW[nr,1],farbW[nr,2],farbW[nr,3]);
            END;
            rahmen (ko^[modus+1,1],ko^[modus+1,2],ko^[modus+1,3],ko^[modus+1,4],FALSE);
            modus:=0;
          END;
          box (13+(farbe MOD 8)*11,114+INTEGER(farbe>23)*11,
               24+(farbe MOD 8)*11,125+INTEGER(farbe>23)*11,7);
          SetAPen (rp,farbe); RectFill (rp,122,117,171,133);
          modifyGads (1,6);
      |2..4: IF modus>0 THEN
               rahmen (ko^[modus+1,1],ko^[modus+1,2],ko^[modus+1,3],ko^[modus+1,4],FALSE);
             END;
             IF modus#wahl-1 THEN modus:=wahl-1;
                             ELSE modus:=0; END;
      |6: FOR nr:=16 TO 31 DO      (* Cancel *)
            SetRGB4 (ADR(myscreen^.viewPort),nr,
                 altfarben[nr,1],altfarben[nr,2],altfarben[nr,3]);
          END;
      ELSE
    END;  (* CASE wahl *)
  UNTIL (wahl=5) OR (wahl=6);
  rp:=mywin^.rPort;
  CloseWindow (nachwin); nachwin:=NIL;
END palette;

PROCEDURE spiegeln (VAR Lkor:Tpunkte;brush,vert:BOOLEAN);
VAR err:LONGCARD;
    kords:Tpunkte;
    nr,x,grenze:INTEGER;
BEGIN
  IF RasterA#aus THEN SetAPen (rp,RasterA*3-2); END;
  IF vert THEN
    IF RasterA#aus THEN line (mittex-1,Lkor.ymin-1,mittex-1,Lkor.ymax); END;
    grenze:= (xbreite DIV 2)-1;
  ELSE
    IF RasterA#aus THEN line (Lkor.xmin-1,mittey-1,Lkor.xmax,mittey-1); END;
    grenze:= (ybreite DIV 2)-1;
  END;
  FOR x:=0 TO grenze DO
    kords:=Lkor;
    FOR nr:=1 TO 2-INTEGER(brush) DO
      WITH kords DO
        IF vert THEN
          err:=BltBitMap (rp^.bitMap,xmin+x*dx,ymin+11,
                      ADR(helpbit),0,0,dx,ymax-ymin+1,192,255,NIL);
          err:=BltBitMap (rp^.bitMap,xmin+(xbreite-x-1)*dx,ymin+11,rp^.bitMap,
                      xmin+x*dx,ymin+11,dx,ymax-ymin+1,192,255,NIL);
          err:=BltBitMap (ADR(helpbit),0,0,rp^.bitMap,xmin+(xbreite-x-1)*dx,
                      ymin+11,dx,ymax-ymin+1,192,255,NIL);
        ELSE
          err:=BltBitMap (rp^.bitMap,xmin,ymin+x*dy+11,
                      ADR(helpbit),0,0,xmax-xmin+1,dy,192,255,NIL);
          err:=BltBitMap (rp^.bitMap,xmin,ymin+(ybreite-x-1)*dy+11,rp^.bitMap,
                      xmin,ymin+x*dy+11,xmax-xmin+1,dy,192,255,NIL);
          err:=BltBitMap (ADR(helpbit),0,0,rp^.bitMap,xmin,
                      ymin+(ybreite-x-1)*dy+11,xmax-xmin+1,dy,192,255,NIL);
        END;
        xmin:=kleinx; ymin:=kleiny;
        xmax:=kleinx+xbreite-1; ymax:=kleiny+ybreite-1; dx:=1; dy:=1;
      END;  (* WITH kords *)
    END;  (* FOR nr:= *)
  END;  (* FOR x:= *)
  IF RasterA<>aus THEN
    SetAPen (rp,2);
    line (mittex-1,Lkor.ymin-1,mittex-1,Lkor.ymax);
    line (Lkor.xmin-1,mittey-1,Lkor.xmax,mittey-1);
  END;
END spiegeln;

PROCEDURE drehen (helpx,helpy,startx,starty,Bbreite:INTEGER);  (* >0: brush *)
VAR x,y,breite,hx,hy:INTEGER;
    err:LONGCARD;
    error:BOOLEAN;
BEGIN
  IF Bbreite>0 THEN x:=Bbreite; y:=Bbreite;
               ELSE x:=xbreite; y:=ybreite; END;
  err:=BltBitMap (rp^.bitMap,startx,starty+11,rp^.bitMap,helpx,
                  helpy+11,x,y,192,255,NIL);
  IF xbreite>ybreite THEN breite:=ybreite;
                     ELSE breite:=xbreite; END;
  IF Bbreite>0 THEN breite:=Bbreite; END;
  WaitBlit;
  FOR x:=0 TO breite-1 DO
    FOR y:=0 TO breite-1 DO
      (*$ StackParms:=TRUE *)
      Plot (-y+breite-1+startx,x+starty,PixCol (x+helpx,y+helpy));
      (*$ POP StackParms *)
    END;
  END;
  IF Bbreite=0 THEN lupe; END;
END drehen;

PROCEDURE kasten (VAR xAnim,yAnim:INTEGER;breite,cutx,cuty:INTEGER);
BEGIN
  xAnim:=mittex-breite DIV 2; yAnim:=73-breite;
  SetAPen (rp,0); RectFill (rp,mittex-MaxY+2,73-MaxY-3,
                               mittex+MaxY DIV 2+6,73+3);
  SetAPen (rp,1);
  RectFill (rp,xAnim,yAnim,xAnim+breite-1,yAnim+breite-1);
  box (xAnim-2,yAnim-2,xAnim+breite+1,yAnim+breite+1,7);
END kasten;

PROCEDURE werte (x,y:INTEGER);
BEGIN
  SetDrMd (rp,DrawModeSet{dm0});
  PrintVal (2,172,26,3,x);
  PrintVal (2,172,47,3,y);
END werte;

PROCEDURE Scheren (VAR cutx,cuty,breite,xAnim,yAnim,farbeH:INTEGER);
VAR dx,nr,help,xStart:INTEGER;
    delta:REAL;

  PROCEDURE para;
  BEGIN
    line (xStart,2,xStart+cutx-1,2);
    line (xStart+cutx-1,2,xStart+cutx-1+dx,1+cuty);
    line (xStart+cutx-1+dx,1+cuty,xStart+dx,1+cuty);
    line (xStart+dx,1+cuty,xStart,2);
  END para;

BEGIN
  help:=mittex-(MaxY-cutx DIV 2);
  nachwin:=CreateWindowA (NIL,help-2,yAnim+9,MaxY*2-cutx+4,breite+4,
           myscreen,NIL,WindowFlagSet{activate,rmbTrap,borderless},
           IDCMPFlagSet{mouseButtons});
  rp:=nachwin^.rPort;
  SetAPen (rp,1);
  RectFill (rp,2,2,2+MaxY*2-cutx-1,2+breite-1);
  box (0,0,3+MaxY*2-cutx,3+breite,7);
  ClipBlit (mywin^.rPort,xAnim,yAnim,rp,MaxY-cutx+2,2,cutx,cuty,192);
  xStart:=MaxY-cutx+2;
  dx:=0;
  REPEAT
    SetDrMd (rp,DrawModeSet{complement});
    para;
    GetIMes (nachwin,imes,FALSE);
    IF imes.class=IDCMPFlagSet{} THEN GetIMes (mywin,imes,FALSE); END;
    para;
    dx:=nachwin^.mouseX-xStart;
    rp:=mywin^.rPort;
    werte (cutx+ABS(dx),cuty); rp:=nachwin^.rPort;
  UNTIL (mouseButtons IN imes.class) AND
        ( (imes.code=selectDown) OR (imes.code=menuDown) );
  SetDrMd (rp,DrawModeSet{dm0});
  IF imes.code#menuDown THEN
    delta:=REAL(dx)/REAL(cuty-1);
    FOR nr:=2 TO 1+cuty DO
      help:=xStart+INTEGER(delta*REAL(nr-2));
      ClipBlit (rp,xStart,nr,rp,help,nr,cutx,1,192);
      SetAPen (rp,farbeH);
      IF dx>0 THEN line (xStart-1,nr,help-1,nr);
                   line (help+cutx,nr,xStart+dx+cutx,nr);
              ELSE line (help+cutx,nr,xStart+cutx,nr);
                   line (xStart+dx-1,nr,help-1,nr); END;
    END;  (* FOR nr *)
    INC (cutx,ABS(dx));
    IF cutx>MaxY THEN cutx:=MaxY; END;
    rp:=mywin^.rPort;
    IF cutx>breite THEN breite:=cutx; END;
    kasten (xAnim,yAnim,breite,cutx,cuty);
    INC (xStart,INTEGER(dx<0)*dx);
    IF xStart<2 THEN xStart:=2; END;
    ClipBlit (nachwin^.rPort,xStart,2,rp,xAnim,yAnim,cutx,cuty,192);
  ELSE
    rp:=mywin^.rPort;
  END;  (* IF imes.code *)
  CloseWindow (nachwin); nachwin:=NIL;
END Scheren;

PROCEDURE Groesse (VAR cutx,cuty,xAnim,yAnim,breite:INTEGER;dx,dy:REAL);
VAR startx,starty,bx,by,nr:INTEGER;
    st:ARRAY [1..10] OF CHAR;
BEGIN
  bx:=INTEGER(REAL(cutx)*dx+0.5); IF bx>MaxY THEN bx:=MaxY; END;
  by:=INTEGER(REAL(cuty)*dy+0.5); IF by>MaxY THEN by:=MaxY; END;
  IF (bx>0) AND (by>0) THEN
    nr:=by; IF nr<cuty THEN nr:=cuty; END;
    startx:=mittex-bx DIV 2; starty:=73-nr;
    nachwin:=CreateWindowA (NIL,startx,starty+11,bx,nr,myscreen,NIL,
                 WindowFlagSet{rmbTrap,borderless},IDCMPFlagSet{});
    FOR nr:=0 TO bx-1 DO
      ClipBlit (rp,xAnim+INTEGER(REAL(nr)/dx),yAnim,
                nachwin^.rPort,nr,0,1,cuty,192);
    END;
    ClipBlit (nachwin^.rPort,0,0,rp,startx,starty,bx,cuty,192);
    FOR nr:=0 TO by-1 DO
      (*$ StackParms:=TRUE *)
      ClipBlit (rp,startx,starty+INTEGER(REAL(nr)/dy),
                nachwin^.rPort,0,nr,bx,1,192);
      (*$ POP StackParms *)
    END;
    cutx:=bx; cuty:=by;
    IF cutx>cuty THEN breite:=cutx;
                 ELSE breite:=cuty; END;
    kasten (xAnim,yAnim,breite,cutx,cuty);
    ClipBlit (nachwin^.rPort,0,0,rp,xAnim,yAnim,bx,by,192);
    CloseWindow (nachwin); nachwin:=NIL;
  END;  (* IF (bx>0) *)
END Groesse;

PROCEDURE defGroesse (xAnim,yAnim,cutx,cuty:INTEGER;VAR dx,dy:REAL);
VAR maxx,maxy:INTEGER;
BEGIN
  maxx:=xAnim; maxy:=yAnim;
  ModifyIDCMP (mywin,IDCMPFlagSet{mouseButtons,intuiTicks});
  REPEAT
    SetDrMd (rp,DrawModeSet{complement});
    box (xAnim,yAnim,maxx,maxy,1);
    GetIMes (mywin,imes,TRUE);
    box (xAnim,yAnim,maxx,maxy,1);
    maxx:=mywin^.mouseX; IF maxx<xAnim THEN maxx:=xAnim; END;
    maxy:=mywin^.mouseY; IF maxy<yAnim THEN maxy:=yAnim; END;
    werte (maxx-xAnim+1,maxy-yAnim+1);
  UNTIL (mouseButtons IN imes.class) AND
        ( (imes.code=selectDown) OR (imes.code=menuDown) );
  SetDrMd (rp,DrawModeSet{dm0});
  ModifyIDCMP (mywin,IDCMPFlagSet{mouseButtons,vanillaKey});
  IF imes.code=menuDown THEN
    dx:=1.0;
    dy:=1.0;
  ELSE
    dx:=REAL(maxx-xAnim+1)/REAL(cutx);
    dy:=REAL(maxy-yAnim+1)/REAL(cuty);
  END;
END defGroesse;

PROCEDURE DreBel (VAR cutx,cuty,xAnim,yAnim,breite,farbeH:INTEGER);
VAR x,y,cosw,sinw,winkel:REAL;
    dy,sx,sy,nr1,nr2,breix,breiy,farb,hx,hy:INTEGER;
    ecken:ARRAY [1..4],[1..2] OF INTEGER;

 PROCEDURE minmax (VAR min,max:INTEGER; ind:INTEGER);
 VAR nr:INTEGER;
 BEGIN
   min:=ecken[1,ind]; max:=min;
   FOR nr:=2 TO 4 DO
     IF ecken[nr,ind]<min THEN min:=ecken[nr,ind]; END;
     IF ecken[nr,ind]>max THEN max:=ecken[nr,ind]; END;
   END;
 END minmax;

 PROCEDURE xpos (x,y:INTEGER):INTEGER;
 BEGIN
   RETURN INTEGER(REAL(x-xAnim)*Cos(winkel)-REAL(y-dy)*Sin(winkel))+xAnim;
 END xpos;

 PROCEDURE ypos (x,y:INTEGER):INTEGER;
 BEGIN
   RETURN INTEGER(REAL(x-xAnim)*Sin(winkel)+REAL(y-dy)*Cos(winkel))+dy;
 END ypos;

 PROCEDURE recht (zeigen:BOOLEAN);
 BEGIN
   ecken[2,1]:=xpos(xAnim+cutx-1,dy); ecken[2,2]:=ypos(xAnim+cutx-1,dy);
   ecken[3,1]:=xpos(xAnim+cutx-1,yAnim); ecken[3,2]:=ypos(xAnim+cutx-1,yAnim);
   ecken[4,1]:=xpos(xAnim,yAnim); ecken[4,2]:=ypos(xAnim,yAnim);
   IF zeigen THEN
     line (xAnim,dy,ecken[2,1],ecken[2,2]);
     line (ecken[2,1],ecken[2,2],ecken[3,1],ecken[3,2]);
     line (ecken[3,1],ecken[3,2],ecken[4,1],ecken[4,2]);
     line (ecken[4,1],ecken[4,2],xAnim,dy);
   END;
 END recht;

BEGIN
  Print (2,164,59,6,ADR("Winkel"));
  winkel:=0.0; dy:=yAnim+cuty-1;
  ecken[1,1]:=xAnim; ecken[1,2]:=dy;
  ModifyIDCMP (mywin,IDCMPFlagSet{mouseButtons,intuiTicks});
  REPEAT
    SetDrMd (rp,DrawModeSet{complement});
    recht (TRUE);;
    GetIMes (mywin,imes,TRUE);
    recht (TRUE);
    x:=REAL(mywin^.mouseX-xAnim); y:=REAL(mywin^.mouseY-dy);
    IF (ABS(x)>0.0) OR (ABS(y)>0.0) THEN
      winkel:=Asin(y/Sqrt(x*x+y*y));
      IF x<0.0 THEN winkel:=(REAL(winkel>0.0)*2.0-1.0)*3.1415926-winkel; END;
      IF winkel<0.0 THEN winkel:=6.2831853-ABS(winkel); END;
      winkel:=REAL(INTEGER(winkel*180.0/3.1415926))*3.1415926/180.0;
    ELSE
      winkel:=0.0;
    END;
    minmax (sx,breix,1); minmax (sy,breiy,2);
    werte (breix-sx+1,breiy-sy+1);
    PrintVal (2,172,68,3,INTEGER(winkel*180.0/3.1415926));
  UNTIL (mouseButtons IN imes.class) AND
        ( (imes.code=selectDown) OR (imes.code=menuDown) );
  ModifyIDCMP (mywin,IDCMPFlagSet{mouseButtons,vanillaKey});
  IF imes.code=selectDown THEN
    recht (FALSE);
    minmax (sx,breix,1); minmax (sy,breiy,2);
    breix:=breix-sx+1; breiy:=breiy-sy+1;
    nachwin:=CreateWindowA (NIL,xAnim,yAnim+11,breix,breiy,myscreen,NIL,
                 WindowFlagSet{rmbTrap,borderless},IDCMPFlagSet{});
    SetRast (nachwin^.rPort,farbeH);
    winkel:=6.2831853-winkel;
    cosw:=Cos(winkel); sinw:=Sin(winkel);
    myBit:=nachwin^.rPort^.bitMap^;
    FOR nr1:=sx TO sx+breix-1 DO
      FOR nr2:=sy TO sy+breiy-1 DO
        hx:=INTEGER(REAL(nr1-xAnim)*cosw-REAL(nr2-dy)*sinw)+xAnim;
        hy:=INTEGER(REAL(nr1-xAnim)*sinw+REAL(nr2-dy)*cosw)+dy;
        IF (hx>=xAnim) AND (hx<=xAnim+cutx-1) AND (hy>=yAnim)
            AND (hy<=yAnim+cuty-1) THEN
          farb:=ReadPixel (rp,hx,hy);
          Plot (nr1+xAnim-sx,nr2+yAnim-sy,farb);
        END;
      END;
    END;
    myBit:=rp^.bitMap^;
    cutx:=breix; cuty:=breiy;
    IF cutx>MaxX THEN cutx:=MaxX; END; IF cuty>MaxY THEN cuty:=MaxY; END;
    IF cutx>cuty THEN breite:=cutx;
                 ELSE breite:=cuty; END;
    kasten (xAnim,yAnim,breite,cutx,cuty);
    ClipBlit (nachwin^.rPort,0,0,rp,xAnim,yAnim,cutx,cuty,192);
    CloseWindow (nachwin); nachwin:=NIL;
  END;
  SetAPen (rp,0); RectFill (rp,164,50,214,69);
END DreBel;

PROCEDURE setbrush (VAR cutx,cuty,farbeH:INTEGER; VAR mode:SHORTINT);

  PROCEDURE brushKords; (*$ EntryExitCode:=FALSE *)
  BEGIN (* Drehen          Dre90°         SpieX          SpieY *)
    ASSEMBLE (
      DC.W 21,103,73,115,  21,118,73,130, 21,133,73,145, 21,148,73,160,
        (* Scheren        Größe           DopX            DopY *)
           21,163,73,175, 85,103,137,115, 85,118,137,130, 85,133,137,145,
        (* HalbX           HalbY           Normal           Trans *)
           85,148,137,160, 85,163,137,175, 152,124,204,136, 152,139,204,151,
        (* Farbe            Ok              Cancel           Mode(ganz) *)
           152,154,204,166, 65,188,101,200, 120,188,172,200, 149,108,207,171
    END);
  END brushKords;

VAR wahl,Acutx,Acuty,xAnim,yAnim,breite,xpos,ypos:INTEGER;
    Amode,help:SHORTINT;
    err:LONGCARD;
    ko:POINTER TO ARRAY [1..16],[1..4] OF INTEGER;
    punkte:Tpunkte;
    dx,dy:REAL;

BEGIN
  IF cutx>0 THEN
    Acutx:=cutx; Acuty:=cuty; Amode:=mode;
    SetAPen (rp,0);
    RectFill (rp,0,0,maxbreite+1,maxbreite+1);
    box (1,1,maxbreite+1,maxbreite+1,4);
    box (2,2,maxbreite,maxbreite,7);
    IF cutx>cuty THEN breite:=cutx
                 ELSE breite:=cuty; END;
    kasten (xAnim,yAnim,breite,cutx,cuty);
    err:=BltBitMap (ADR(bilder^[0]),0,0,rp^.bitMap,xAnim,yAnim+11,
                    cutx,cuty,192,255,NIL);
    ko:=ADR(brushKords);
    Print (2,154,118,6,ADR(" Mode "));
    gadget (ko^[1,1],ko^[1,2],ko^[1,3],"Drehen",2);
    gadget (ko^[2,1],ko^[2,2],ko^[2,3],"Dre90°",3);
    gadget (ko^[3,1],ko^[3,2],ko^[3,3],"SpieX",5);
    gadget (ko^[4,1],ko^[4,2],ko^[4,3],"SpieY",5);
    gadget (ko^[5,1],ko^[5,2],ko^[5,3],"Schere",1);
    gadget (ko^[6,1],ko^[6,2],ko^[6,3],"Größe",1);
    gadget (ko^[7,1],ko^[7,2],ko^[7,3],"DopX",1);
    gadget (ko^[8,1],ko^[8,2],ko^[8,3],"DopY",3);
    gadget (ko^[9,1],ko^[9,2],ko^[9,3],"HalbX",1);
    gadget (ko^[10,1],ko^[10,2],ko^[10,3],"HalbY",2);
    gadget (ko^[11,1],ko^[11,2],ko^[11,3],"Normal",1);
    gadget (ko^[12,1],ko^[12,2],ko^[12,3],"Trans",1);
    gadget (ko^[13,1],ko^[13,2],ko^[13,3],"Farbe",1);
    gadget (ko^[14,1],ko^[14,2],ko^[14,3]," OK ",2);
    gadget (ko^[15,1],ko^[15,2],ko^[15,3],"CANCEL",1);
    rahmen (ko^[16,1],ko^[16,2],ko^[16,3],ko^[16,4],FALSE);
    rahmen (ko^[mode+11,1],ko^[mode+11,2],ko^[mode+11,3],ko^[mode+11,4],TRUE);
    Print (2,164,17,6,ADR("Breite"));
    Print (2,164,38,5,ADR(" Höhe")); werte (cutx,cuty);
    ModifyIDCMP (mywin,IDCMPFlagSet{mouseButtons,vanillaKey});
    REPEAT
      GetIMes (mywin,imes,TRUE);
      wahl:=0;
      IF (mouseButtons IN imes.class) AND (imes.code=selectDown) THEN
        xpos:=imes.mouseX; ypos:=imes.mouseY;
        REPEAT
          INC (wahl);
        UNTIL (wahl>15) OR ((xpos>=ko^[wahl,1]) AND (ypos>=ko^[wahl,2]) AND
                           (xpos<=ko^[wahl,3]) AND (ypos<=ko^[wahl,4]));
      ELSIF vanillaKey IN imes.class THEN
        wahl:=FirstPos(" REXYSGDPHANTFOC",0,CAP(CHAR(imes.code)));
      END;  (* IF mouseButtons *)
      IF (wahl>0) AND (wahl<16) THEN
        rahmen (ko^[wahl,1],ko^[wahl,2],ko^[wahl,3],ko^[wahl,4],TRUE);
        CASE wahl OF
              1: DreBel (cutx,cuty,xAnim,yAnim,breite,farbeH);
          |   2: IF (cutx>1) OR (cuty>1) THEN
                   drehen (3,3,xAnim,yAnim,breite);
                   xpos:=cutx; cutx:=cuty; cuty:=xpos;
                   ClipBlit (rp,xAnim+breite-cutx,yAnim,
                             rp,xAnim,yAnim,cutx,breite,192);
                   SetAPen (rp,1); RectFill (rp,xAnim+cutx,yAnim,
                                                xAnim+breite-1,yAnim+breite-1);
                   SetAPen (rp,0); RectFill (rp,3,3,breite+3,breite+3);
                 END;
          |3..4: help:=RasterA; RasterA:=aus;
                 WITH punkte DO
                   xmin:=xAnim; ymin:=yAnim; dx:=1; dy:=1;
                   xmax:=xAnim+cutx; ymax:=yAnim+cuty;
                 END;
                 IF (cutx>1) AND (wahl=3) THEN
                   xpos:=xbreite; xbreite:=cutx;
                   spiegeln (punkte,TRUE,TRUE);
                   xbreite:=xpos;
                 ELSIF (cuty>1) AND (wahl=4) THEN
                   ypos:=ybreite; ybreite:=cuty;
                   spiegeln (punkte,TRUE,FALSE);
                   ybreite:=ypos;
                 END;
                 RasterA:=help;
          |   5: IF cuty>1 THEN
                   Scheren (cutx,cuty,breite,xAnim,yAnim,farbeH);
                 END;
          |   6: defGroesse (xAnim,yAnim,cutx,cuty,dx,dy);
                 Groesse (cutx,cuty,xAnim,yAnim,breite,dx,dy);
          |   7: Groesse (cutx,cuty,xAnim,yAnim,breite,2.0,1.0);
          |   8: Groesse (cutx,cuty,xAnim,yAnim,breite,1.0,2.0);
          |   9: Groesse (cutx,cuty,xAnim,yAnim,breite,0.5,1.0);
          |  10: Groesse (cutx,cuty,xAnim,yAnim,breite,1.0,0.5);
          |11..13:FOR xpos:=11 TO 13 DO
                  rahmen (ko^[xpos,1],ko^[xpos,2],
                          ko^[xpos,3],ko^[xpos,4],xpos=wahl);
                 END;
                 mode:=wahl-11;
          |  14: err:=BltBitMap (rp^.bitMap,xAnim,yAnim+11,ADR(bilder^[0]),0,0,
                                 cutx,cuty,192,255,NIL);
          |  15: cutx:=Acutx; cuty:=Acuty; mode:=Amode;
        END;
        IF wahl<11 THEN
          rahmen (ko^[wahl,1],ko^[wahl,2],ko^[wahl,3],ko^[wahl,4],FALSE);
        END;
        werte (cutx,cuty);
      END;  (* IF wahl>0 *)
    UNTIL (wahl=14) OR (wahl=15);
    ModifyIDCMP (mywin,IDCMPFlagSet{mouseButtons,rawKey});
    SetAPen (rp,0);
    RectFill (rp,1,1,maxbreite+1,maxbreite+1);
    lupe;
  ELSE
    fehler ("Kein Brush vorhanden !","");
  END;  (* IF cutx>0 *)
END setbrush;

END BobTools.
