diff --git a/pixler.bas b/pixler.bas index 5ab5fd9..c865fc0 100644 --- a/pixler.bas +++ b/pixler.bas @@ -2,6 +2,9 @@ type statetype tool as long fcolor as long bcolor as long + offsetX as single + offsetY as single + zoom as single end type type layertype @@ -20,6 +23,7 @@ dim shared mouseclicked as integer dim shared mousedown as integer dim shared rmouseclicked as integer dim shared rmousedown as integer + $resize:on screen _newimage(750,480,32) _delay 0.1 @@ -32,31 +36,82 @@ layers(1).ihandle=_newimage(640,350,32) _dest layers(0).ihandle line (0,0)-(_width-1,_height-1),_rgb32(255),bf _dest 0 +state.tool = 1 +state.fcolor = 1 +state.bcolor = 2 +state.zoom = 1.0 +state.offsetX = 70 + 20 ' To the right of the toolbox +state.offsetY = 20 +dim lastMX, lastMY +dim diffX as integer +dim diffY as integer +dim oldWidth as integer +dim oldHeight as integer +oldWidth=_width +oldHeight=_height do + if CheckResize(_source) = -1 THEN + diffX = _width - oldWidth + diffY = _height - oldHeight + state.offsetX = state.offsetX + (diffX / 2) + state.offsetY = state.offsetY + (diffY / 2) + oldWidth = _width + oldHeight = _height + end if + + cls line (0,0)-(_width-1,_height-1),backgroundcolor1,bf - IF CheckResize(_SOURCE) = -1 then rem 'whatever, maybe some day somthing needs changing if the window is resized' - while _mouseinput:wend - mouseclicked=0 - rmouseclicked=0 - if mousedown=-1 and _mousebutton(1)=0 then mouseclicked=-1 - if rmousedown=-1 and _mousebutton(2)=0 then rmouseclicked=-1 - mousedown=_mousebutton(1) - rmousedown=_mousebutton(2) + while _mouseinput:mw=mw+_mousewheel:wend + + ' --- Global Mouse Handling (Left & Right) --- + mouseclicked = 0 + rmouseclicked = 0 + if mousedown = -1 and _mousebutton(1) = 0 then mouseclicked = -1 + if rmousedown = -1 and _mousebutton(2) = 0 then rmouseclicked = -1 + mousedown = _mousebutton(1) + rmousedown = _mousebutton(2) + + ' Panning (Middle Mouse) + if _mousebutton(3) then + state.offsetX = state.offsetX + (_mousex - lastMX) + state.offsetY = state.offsetY + (_mousey - lastMY) + end if + lastMX = _mousex: lastMY = _mousey + + ' Zooming + if mw <> 0 then + state.zoom = state.zoom + (mw * 0.1) + if state.zoom < 0.1 then state.zoom = 0.1 + mw=0 + end if + 'state.zoom=mw/100 + canvas ' Uses mousedown and rmousedown for drawing/erasing toolbox - colorpicker - canvas - locate 10,10: print state.tool - locate 11,10: color state.fcolor: print state.fcolor - locate 12,10: color state.bcolor: print state.bcolor + colorpicker ' Uses rmouseclicked for bcolor + _limit 30 _display loop sub toolbox - dim x,y - if imagebutton(0,0,32,32,icon(0)) then state.tool=1 - if imagebutton(32,0,32,32,icon(1)) then state.tool=2 + dim i, x, y + dim btnSize : btnSize = 32 + dim spacing : spacing = 1 + + for i = 0 to 19 + ' Force integer math to keep columns locked at 2 + ' x will only ever be 0 or 33 + x = (i mod 2) * (btnSize + spacing) + + ' y will only increase every 2 buttons + ' Use Int() if your language doesn't support the \ operator + y = Int(i / 2) * (btnSize + spacing) + + if imagebutton(x, y, btnSize, btnSize, icon(i)) then + state.tool = i + 1 + end if + next end sub sub colorpicker @@ -78,51 +133,75 @@ sub colorpicker end sub sub canvas -' 1. Define the box boundaries dim boxX1 as integer: boxX1 = 70 dim boxWidth as integer: boxWidth = _width - 1 - boxX1 dim boxHeight as integer: boxHeight = _height - 20 + + ' Workspace background + line (boxX1, 0)-(_width - 1, boxHeight), _rgb32(32), bf - ' 2. Draw the background box - line (boxX1, 0)-(_width - 1, boxHeight), _rgb32(64), bf - - ' 3. Loop through layers and calculate centering for each + ' Render Layers with Zoom/Offset[cite: 4] + dim i as integer for i = 0 to ubound(layers) - dim imgW as integer: imgW = _width(layers(i).ihandle) - - ' Calculate X to center the image relative to the box - ' We take the box start (70) and add half of the remaining whitespace - dim drawX as integer - drawX = boxX1 + (boxWidth - imgW) / 2 - - ' If you also want it centered vertically: - dim imgH as integer: imgH = _height(layers(i).ihandle) - dim drawY as integer - drawY = (boxHeight - imgH) / 2 - - _putimage (drawX, drawY), layers(i).ihandle + dim w as integer: w = _width(layers(i).ihandle) * state.zoom + dim h as integer: h = _height(layers(i).ihandle) * state.zoom + _putimage (state.offsetX, state.offsetY)-(state.offsetX + w, state.offsetY + h), layers(i).ihandle next + + ' --- Drawing Logic (Multi-Button) --- + if (mousedown or rmousedown) and _mousex > boxX1 then + ' Translate to Canvas Space + dim canX as integer: canX = (_mousex - state.offsetX) / state.zoom + dim canY as integer: canY = (_mousey - state.offsetY) / state.zoom + + ' Boundary Check + if canX >= 0 and canX < _width(layers(0).ihandle) then + if canY >= 0 and canY < _height(layers(0).ihandle) then + _dest layers(0).ihandle + + ' Select color based on button pressed + dim drawCol as _unsigned long + if mousedown then drawCol = state.fcolor else drawCol = state.bcolor + + ' Apply Tool + if state.tool = 1 then + pset (canX, canY), drawCol + elseif state.tool = 2 then + ' Example: Square brush + line (canX - 1, canY - 1)-(canX + 1, canY + 1), drawCol, bf + end if + + _dest 0 + end if + end if + end if end sub -function icon(index as long) +function icon (index as long) static init as integer static icons() as long if not init then - dim icons(5) as long - icons(0)=_newimage(32,32,32) - _dest icons(0) - line (5,27)-(27,5) - icons(1)=_newimage(32,32,32) - _dest icons(1) - circle (15,15),13 - icons(2)=_newimage(32,32,32) - _dest icons(2) + redim icons(19) as long ' Room for 20 icons - _dest 0 - init = -1 + ' Define your specific tool icons here + icons(0) = _newimage(32, 32, 32): _dest icons(0): line (5, 27)-(27, 5): _dest 0 + icons(1) = _newimage(32, 32, 32): _dest icons(1): circle (15, 15), 13: _dest 0 + icons(2) = _newimage(32, 32, 32): _dest icons(2): line (5, 5)-(27, 27), , b: _dest 0 + + ' Fill the remaining slots with blank 32x32 images + dim j as integer + for j = 3 to 19 + if icons(j) = 0 then icons(j) = _newimage(32, 32, 32) + next + + init = -1 end if - if (index>=lbound(icons)) and (index<=ubound(icons)) then - icon=icons(index) + + ' Bounds checking to prevent returning 0 or crashing + if index >= 0 and index <= 19 then + icon = icons(index) + else + icon = icons(0) end if end function