rem Basic2D Showcase

rem Standard Setup Code for all examples
sync on : sync rate 0
set text font "arial" : set text size 16
set text to bold : set text transparent

rem Nice backdrop
load bitmap "parchment.jpg"

rem Produce Title
ink rgb(0,0,0),0 : center text (screen width()/2)+1,7,"2D Graphics Support"
ink rgb(255,255,255),0 : center text screen width()/2,6,"2D Graphics Support"

rem Create an array to hold pixeldatas
bitsperpixel=bitmap depth()/8
workA = make memory(640*480*bitsperpixel)
fill memory workA, 0, 640*480*bitsperpixel

rem Create Art Space
set current bitmap 0
box 48,48,640-48,450-48,rgb(255,255,0),rgb(255,200,255),rgb(255,255,200),rgb(200,255,255)
lock pixels
pitch=get pixels pitch() : ptr=get pixels pointer()
workAptr=workA : linesize=640*bitsperpixel
for y=0 to 479
 copy memory workAptr, ptr, linesize : inc workAptr,640*bitsperpixel : inc ptr,pitch
next y
unlock pixels

rem Main loop
do

rem Draw to Memory
mx=mousex() : my=mousey()
focus=16*(1+size)
if mx>focus and mx<640-focus and my>focus and my<479-focus
 for focus=1 to 16*(1+size)
  for y=my-focus to my+focus
   penwidth=focus-abs(y-my)
   for x=mx-penwidth to mx+penwidth
    workptr=workA+(x*bitsperpixel)+(y*640*bitsperpixel)
    col = *workptr
    colb = col && %1111111111111111
    if bitsperpixel=2
     cr = (col && %11111000000000000000000000000000)>>27
     cg = (col && %00000111111000000000000000000000)>>21
     cb = (col && %00000000000111110000000000000000)>>16
     dec cr
     dec cg
     dec cb
    endif
    if bitsperpixel=4
     cr = rgbr(col) - 1
     cg = rgbg(col) - 1
     cb = rgbb(col) - 1
    endif
    if nocap=0
     if cr<0 then cr=0
     if cg<0 then cg=0
     if cb<0 then cb=0
    endif
    if bitsperpixel=2
     col = (cr<<27)+(cg<<21)+(cb<<16)
     *workptr = col+colb
    endif
    if bitsperpixel=4
     col = rgb(cr,cg,cb)
     *workptr = col
    endif
   next x
  next y
 next focus
endif

rem Draw Memory to screen
workAptr=workA+(640*48*bitsperpixel)
ymax=450-48
lock pixels
linesize=(640-48-48)*bitsperpixel
pitch=get pixels pitch()
ptr=get pixels pointer()+(48*pitch)
for y=48 to ymax
 copy memory ptr+(48*bitsperpixel), workAptr+(48*bitsperpixel), linesize
 inc workAptr,640*bitsperpixel
 inc ptr,pitch
next y
unlock pixels

rem Show Buttons
over=0
for but=1 to 3
 for high=0 to 1
  if high=0 then ink rgb(20,20,20),0 : bx=-1 : by=-1
  if high=1 then ink rgb(100,200,100),0 : bx=0 : by=0
  if high=1 and mousey()>420 and mousey()<460
   if but=1 and abs(mousex()-170)<50 then ink rgb(255,255,255),0 : over=1
   if but=2 and abs(mousex()-320)<50 then ink rgb(255,255,255),0 : over=2
   if but=3 and abs(mousex()-470)<50 then ink rgb(255,255,255),0 : over=3
  endif
  if but=1 then but$="SIZE"
  if but=2 then but$="PLASMA"
  if but=3 then but$="EXIT"
  center text 320+bx+((but-2)*150),420+by,but$
 next high
next but

rem Controls
if mouseclick()=1
 if once=0
  once=1
  if over=1 then size=size+1
  if over=2 then nocap=1-nocap
  if size=3 then size=0
  if over=3 then delete memory workA : end
 endif
else
 once=0
endif

rem Update screen
sync

rem End loop
loop

rem Free memory
delete memory workA
delete memory workB