ecxtlacitka.png (2658 bytes) Ecx EcxDocs EcxMUI EcxExamples Back to Amiga E home page
/*
    area.c original C code by Thomas Rapp
    area.e by ghh 2022

*/
OPT PREPROCESS ->potreba pro makro RASSIZE v graphics/gfx.m

MODULE  'exec/ports','exec/memory'
MODULE  'dos/dos','utility/tagitem'
MODULE  'graphics/gfx','graphics/rastport'
MODULE  'intuition/intuition'

CONST MAXVEC = 10  /* maximale Anzahl Area-Funktionsaufrufe */


PROC main()

  DEF win:PTR TO window
  DEF port:PTR TO mp
  DEF mess:PTR TO intuimessage
  DEF weiter
  DEF rp:PTR TO rastport
  DEF tmpras:tmpras        /* TmpRas-Struktur */
  DEF tmpbuf:PTR TO CHAR   /* Puffer für TmpRas */
  DEF rassize              /* Größe des TmpRas-Puffer */
  DEF areainfo:areainfo    /* AreaInfo-Struktur */
  DEF areabuf:PTR TO CHAR  /* Puffer für AreaInfo */

  win:= OpenWindowTagList(NIL,
       [WA_Left,400,WA_Top,300,
        WA_InnerWidth,  100,
        WA_InnerHeight, 100,
        WA_Title,'Fenster',
        WA_Flags,WFLG_CLOSEGADGET OR WFLG_DRAGBAR OR WFLG_DEPTHGADGET OR
                 WFLG_ACTIVATE OR WFLG_GIMMEZEROZERO OR WFLG_NOCAREREFRESH,
        WA_IDCMP,IDCMP_CLOSEWINDOW OR IDCMP_VANILLAKEY,
        TAG_END])

  IF (win)

    rp:= win.rport

    rassize:= RASSIZE(win.gzzwidth,win.gzzheight)
    tmpbuf:= AllocVec(rassize,MEMF_CHIP OR MEMF_CLEAR)   /* Puffer für TmpRas anlegen */
    IF (tmpbuf)
      InitTmpRas(tmpras,tmpbuf,rassize)                  /* TmpRas initialisieren */
      rp.tmpras:= tmpras                                 /* und in RastPort eintragen */
    ENDIF

    areabuf:= AllocVec(5*MAXVEC,MEMF_CLEAR)              /* Puffer für AreaInfo anlegen */
    IF (areabuf)                                         /* (5 Bytes pro Area-Funktionsaufruf) */
      InitArea(areainfo,areabuf,MAXVEC)                  /* AreaInfo initialisieren */
      rp.areainfo:= areainfo                             /* und in RastPort eintragen */
    ENDIF

    SetAPen(rp,2)          /* Farbe setzten (Stift 2 ist meistens weiß) */
    AreaMove(rp,10,50)     /* Startecke setzen */
    AreaDraw(rp,50,10)     /* Nächste Ecke setzen */
    AreaDraw(rp,90,50)
    AreaDraw(rp,50,90)
    AreaEnd(rp)            /* Area abschließen und füllen */
                           /* die Linie zum Startpunkt wird automatisch ergänzt */

                           /* Zum Vergleich: den Rahmen mit Linien nachziehen */
    SetAPen(rp,1)          /* Stift 1 = schwarz */
    Move(rp,10,50)
    Draw(rp,50,10)
    Draw(rp,90,50)
    Draw(rp,50,90)
    Draw(rp,10,50)         /* Diesmal muß die letzte Linie mitgezeichnet werden */


    port:= win.userport
    weiter:= TRUE
    WHILE (weiter)

      WaitPort(port)
      mess:= GetMsg(port)

      WHILE (mess)

        SELECT (mess.class)
          CASE IDCMP_CLOSEWINDOW
            weiter:= FALSE

          CASE IDCMP_VANILLAKEY
            IF (mess.code = $1b)
              weiter:= FALSE
            ENDIF

        ENDSELECT

        ReplyMsg(mess)
        mess:= GetMsg(port)

      ENDWHILE

      EXIT weiter = FALSE

    ENDWHILE

    IF (tmpbuf)
      rp.tmpras:= NIL   /* TmpRas aus RastPort entfernen */
      FreeVec(tmpbuf)   /* Puffer freigeben */
    ENDIF

    IF (areabuf)
      rp.areainfo:= NIL /* AreaInfo aus RastPort entfernen */
      FreeVec(areabuf)  /* Puffer freigeben */
    ENDIF

    CloseWindow(win)

  ELSE
    WriteF('Konnte Fenster nicht öffnen !\n')
    RETURN RETURN_FAIL
  ENDIF

ENDPROC RETURN_OK
ghh don'tpanic