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

*/
OPT PREPROCESS


MODULE 'utility/tagitem','dos/dos','exec/memory'
MODULE 'intuition/intuition','intuition/screens'
MODULE 'graphics', 'graphics/rastport','graphics/gfx'
MODULE 'cybergraphics','cybergraphx/cybergraphics'

PROC main()
  DEF win:PTR TO window
  DEF bm:PTR TO bitmap
  DEF w,h
  DEF mess:PTR TO intuimessage
  DEF weiter
  DEF bmlock->:PTR TO CHAR  /*APTR*/
  DEF bpr
  DEF dataptr->:PTR TO BYTE
  DEF yptr->:PTR TO BYTE
  DEF xptr->:PTR TO BYTE
  DEF x,y
  DEF r,g,b

  IF (cybergfxbase:=OpenLibrary('cybergraphics.library',51))=NIL
    WriteF('Can not open cybergraphics.library')
    RETURN RETURN_FAIL
  ENDIF

  win:= OpenWindowTagList(NIL,
       [WA_Left,100,
        WA_Top,100,
        WA_Width,300,
        WA_Height,200,
        WA_Title,'Test mit einer BGR-Bitmap',
        WA_Flags,WFLG_CLOSEGADGET OR
          WFLG_DRAGBAR OR
          WFLG_DEPTHGADGET OR
          WFLG_ACTIVATE OR
          WFLG_NOCAREREFRESH,
        WA_IDCMP,IDCMP_CLOSEWINDOW OR
          IDCMP_VANILLAKEY,
        TAG_END])

  IF (win = NIL)
    CloseLibrary(cybergfxbase)
    WriteF('Kann das Fenster nicht öffnen !\n')
    RETURN RETURN_FAIL
  ENDIF

  IF (GetBitMapAttr(win.wscreen.rastport.bitmap,BMA_DEPTH)<=8)
    CloseWindow(win)
    CloseLibrary(cybergfxbase)
    WriteF('Dieses Programm läuft nur auf einem High- oder Truecolor-Bildschirmmodus !\n')
    RETURN RETURN_ERROR
  ENDIF

  w:= win.gzzwidth
  h:= win.gzzheight

  bm:= AllocBitMap(w,h,24,BMF_MINPLANES OR BMF_SPECIALFMT OR SHIFT_PIXFMT(PIXFMT_BGR24),NIL)

  IF (bm = NIL)
    CloseWindow(win)
    CloseLibrary(cybergfxbase)
    WriteF('Nicht genug Speicher für die Bitmap !\n')
    RETURN RETURN_FAIL
  ENDIF


  bmlock:= LockBitMapTagList(bm,
          [LBMI_BASEADDRESS,{dataptr},
           LBMI_BYTESPERROW,{bpr},
           TAG_END])

  IF (bmlock = NIL)
    FreeBitMap(bm)
    CloseWindow(win)
    CloseLibrary(cybergfxbase)
    WriteF('Kann Bitmap nicht sperren !\n')
    RETURN RETURN_FAIL
  ENDIF

  yptr:= dataptr

  y:=0
  WHILE (y < h)
    xptr:= yptr

    x:=0
    WHILE (x < w)
      r:= (x * 255) / (w-1)
      g:= (y * 255) / (h-1)
      b:= (r + g) / 2
      xptr[0]:= b
      xptr[1]:= g
      xptr[2]:= r
      xptr+=3
      x++

    ENDWHILE

    yptr+=bpr
    y++

  ENDWHILE

  UnLockBitMap(bmlock)

  BltBitMapRastPort(bm,0,0,win.rport,win.borderleft,win.bordertop,w,h,$c0)

  FreeBitMap(bm)

  weiter:= TRUE

  REPEAT

    WaitPort(win.userport)
    WHILE (mess:= GetMsg(win.userport))

      SELECT (mess.class)

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

        CASE IDCMP_CLOSEWINDOW
          weiter:= FALSE

      ENDSELECT

      ReplyMsg(mess)

    ENDWHILE

  UNTIL (weiter = FALSE)

  CloseWindow(win)
  IF cybergfxbase  THEN CloseLibrary(cybergfxbase)

  RETURN RETURN_OK
ENDPROC
ghh don'tpanic