lots and lots of lots

This commit is contained in:
visionmercer 2026-04-30 10:09:05 +02:00
commit 6af399f587

View file

@ -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
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
' 2. Draw the background box
line (boxX1, 0)-(_width - 1, boxHeight), _rgb32(64), bf
' Workspace background
line (boxX1, 0)-(_width - 1, boxHeight), _rgb32(32), 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)
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
' 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
_dest 0
init = -1
end if
if (index>=lbound(icons)) and (index<=ubound(icons)) then
' 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