' **************************************************
' *                  LASSO-FUNKTION                *
' *                                                *
' * Aufruf: Lasso(Undo,Modus)                      *
' * Undo:   1,wenn Bild gerettet werden soll       *
' * Modus:  Verknpfungsart des Ausschnitts (0-15) *
' *                                                *
' * Original-Routine in OMIKRON.BASIC: L. Canisius *
' * GFA-BASIC-Konvertierung: Thomas Werner         *
' * (c) 1992 MAXON Computer GmbH                   *
' **************************************************
'
DEFMOUSE 0
zeichne_bild
VOID FORM_ALERT(0,"[0][ | Lasso-Demo | OR mit UNDO   ][ Start ]")
lasso(1,7)
VOID FORM_ALERT(0,"[0][ |  Lasso-Demo | OR ohne UNDO  ][ Start ]")
zeichne_bild
lasso(0,7)
VOID FORM_ALERT(1,"[0][ | Demo-Ende   ][ Ok ]")
'
PROCEDURE zeichne_bild
  LOCAL i&,x&,y&,r&
  CLS
  FOR i&=1 TO 10
    x&=RANDOM(640)
    y&=RANDOM(400)
    r&=RANDOM(100)
    PCIRCLE x&,y&,r&
  NEXT i&
RETURN
PROCEDURE lasso(undo%,modus%)
  LOCAL puffer_adr%,malloc%,bildschirm%
  DIM puffer%(8064)
  DEFFILL 1 !.................... schwarze Fllung
  DEFLINE 1 !...................... durchgehende Linien
  bildschirm%=XBIOS(2) !............. phys. Bildschirmadresse
  puffer_adr%=INT(VARPTR(puffer%(0))/256+1)*256
  '
  ' * Anfangswerte des Begrenzungsrechtecks *
  '
  xmax%=0
  ymax%=0
  xmin%=640
  ymin%=400
  '
  ' * Original retten *
  '
  GET 0,0,639,399,undo$
  '
  ' * auf Mausklick warten *
  '
  REPEAT
  UNTIL MOUSEK=1
  REPEAT
  UNTIL MOUSEK=0
  '
  ' * Anfangskoordinaten merken *
  '
  xstart%=MOUSEX
  ystart%=MOUSEY
  x1%=xstart%
  x2%=x1%
  y1%=ystart%
  y2%=y1%
  HIDEM
  GRAPHMODE 3
  PLOT xstart%,ystart%
  SHOWM
  ' *
  ' * Ausschnitt mit der Maus w„hlen *
  ' *
  REPEAT
    WHILE MOUSEK=0 AND x1%=x2% AND y1%=y2%
      x1%=MOUSEX
      y1%=MOUSEY
    WEND
    '
    ' * Lasso nicht an den Rand lassen *
    '
    x1%=MIN(x1%,638)
    x1%=MAX(x1%,1)
    y1%=MIN(y1%,398)
    y1%=MAX(y1%,1)
    '
    ' * Ermittlung des Begrenzungsrechtecks *
    '
    xmax%=MAX(x1%,xmax%)
    xmin%=MIN(x1%,xmin%)
    ymax%=MAX(y1%,ymax%)
    ymin%=MIN(y1%,ymin%)
    '
    ' * Zeichnen des Lassos: *
    '
    HIDEM
    '
    ' * 1) versteckt *
    VOID XBIOS(5,L:puffer_adr%,L:bildschirm%,-1)
    GRAPHMODE 1 !............... OR-Modus
    DRAW x2%,y2% TO x1%,y1%
    '
    ' * 2) sichtbar *
    VOID XBIOS(5,L:bildschirm%,L:bildschirm%,-1)
    GRAPHMODE 3 !............... XOR-Modus
    DRAW x2%,y2% TO x1%,y1%
    PLOT x1%,y1%
    '
    SHOWM
    x2%=x1%
    y2%=y1%
  UNTIL MOUSEK=1
  REPEAT
  UNTIL MOUSEK=0
  '
  ' * Umrandung schliessen *
  '
  HIDEM
  DRAW x2%,y2% TO xstart%,ystart%
  '
  ' * Ab jetzt alles im Puffer ausfhren *
  '
  VOID XBIOS(5,L:puffer_adr%,L:bildschirm%,-1)
  GRAPHMODE 2
  DRAW x2%,y2% TO xstart%,ystart%
  '
  ' * Maske durch Fllen des Begrenzungsrechtecks erstellen *
  '
  breite%=xmax%-xmin%
  hohe%=ymax%-ymin%
  BOX xmin%-2,ymin%-2,(xmin%-1)+breite%+6,(ymin%-2)+hohe%+6
  FILL xmin%-1,ymin%-1,1
  '
  ' * Maske mit Bild NOT AND-Verknpfen *
  '
  PUT 0,0,undo$,2
  '
  ' * Ausschnitt nach PUFFER$ *
  '
  GET xmin%,ymin%,xmin%+breite%,ymin%+hohe%,puffer$
  '
  ' * Ab jetzt wieder alles auf sichtbarem Bildschirm ausfhren *
  '
  VOID XBIOS(5,L:bildschirm%,L:bildschirm%,-1)
  '
  ' * Bild restaurieren *
  '
  IF undo%
    PUT 0,0,undo$,3
  ENDIF
  ' *
  ' * Weiterverarbeitung: Verschieben des Ausschnitts *
  ' *
  SHOWM
  CLIP 0,0,640,400
  x%=MOUSEX
  y%=MOUSEY
  PUT x%,y%,puffer$,6
  '
  REPEAT
    WHILE MOUSEK=0 AND x%=MOUSEX AND y%=MOUSEY
    WEND
    PUT x%,y%,puffer$,6
    x%=MOUSEX
    y%=MOUSEY
    PUT x%,y%,puffer$,6
  UNTIL (MOUSEK=1 OR MOUSEK=3)
  IF MOUSEK=3 THEN
    ' * Ausschnitt gem„ž Modus einkopieren *
    PUT x%,y%,puffer$,modus%
  ELSE
    ' * Ausschnitt durch XOR-Verknpfung l”schen *
    PUT x%,y%,puffer$,6
  ENDIF
  CLIP OFF
  ERASE puffer%()
RETURN
