This commit is contained in:
visionmercer 2026-04-30 13:16:00 +02:00
commit b4678feada
2 changed files with 235 additions and 32 deletions

View file

@ -5,6 +5,10 @@ type statetype
offsetX as single
offsetY as single
zoom as single
brushsize as integer
startX as integer
startY as integer
isDrawing as integer
end type
type layertype
@ -14,11 +18,10 @@ type layertype
kind as long
end type
redim shared layers(1) as layertype
redim shared layers(2) as layertype
dim shared state as statetype
dim shared mouseclicked as integer
dim shared mousedown as integer
dim shared rmouseclicked as integer
@ -33,6 +36,7 @@ dim as integer ch1,ch2,ch3,bt
loadpalette "endesga16",pal()
layers(0).ihandle=_newimage(640,350,32)
layers(1).ihandle=_newimage(640,350,32)
layers(2).ihandle=_newimage(640,350,32)
_dest layers(0).ihandle
line (0,0)-(_width-1,_height-1),_rgb32(255),bf
_dest 0
@ -42,11 +46,13 @@ state.bcolor = 2
state.zoom = 1.0
state.offsetX = 70 + 20 ' To the right of the toolbox
state.offsetY = 20
state. brushsize = 1
dim lastMX, lastMY
dim diffX as integer
dim diffY as integer
dim oldWidth as integer
dim oldHeight as integer
dim keyin as string
oldWidth=_width
oldHeight=_height
@ -62,9 +68,9 @@ do
cls
line (0,0)-(_width-1,_height-1),backgroundcolor1,bf
while _mouseinput:mw=mw+_mousewheel:wend
' --- Global Mouse Handling (Left & Right) ---
'Mouse Handling
while _mouseinput:mw=mw+_mousewheel:wend
mouseclicked = 0
rmouseclicked = 0
if mousedown = -1 and _mousebutton(1) = 0 then mouseclicked = -1
@ -85,10 +91,19 @@ do
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
' Keyboarding
keyin=inkey$
select case keyin
case "+"
state.brushsize=state.brushsize+1
case "-"
if state.brushsize>1 then state.brushsize=state.brushsize-1
end select
_dest 0
canvas 'draw canvas first so it doesn't over
toolbox
colorpicker ' Uses rmouseclicked for bcolor
colorpicker
_limit 30
_display
@ -140,7 +155,7 @@ sub canvas
' Workspace background
line (boxX1, 0)-(_width - 1, boxHeight), _rgb32(32), bf
' Render Layers with Zoom/Offset[cite: 4]
' Render Layers (0 = background,1 = drawlayer, 2=reference 3 = Preview)
dim i as integer
for i = 0 to ubound(layers)
dim w as integer: w = _width(layers(i).ihandle) * state.zoom
@ -148,31 +163,73 @@ sub canvas
_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
' Translate Mouse to Canvas Space
dim canX as integer: canX = (_mousex - state.offsetX) / state.zoom
dim canY as integer: canY = (_mousey - state.offsetY) / state.zoom
' Color Selection: Left Click = Foreground, Right Click = Background
dim drawCol as _unsigned long
if mousedown or mouseclicked then drawCol = state.fcolor else drawCol = state.bcolor
' Interaction Boundary Check
if _mousex > boxX1 then
' On Initial Click: Set the anchor point for shapes
if (mousedown or rmousedown) and state.isDrawing = 0 then
state.startX = canX
state.startY = canY
state.isDrawing = -1
end if
if state.isDrawing then
' preview layer handles the "rubber-banding" of shapes
_dest layers(2).ihandle
cls , 0
select case state.tool
case 1 ' Pencil (Direct to Canvas)
_dest layers(1).ihandle
thickline state.startX, state.startY, canX, canY, drawCol
state.startX = canX: state.startY = canY
case 2 ' Straight Line
thickline state.startX, state.startY, canX, canY, drawCol
case 3 ' Thick Circle (Outline)
dim r as single: r = sqr((canX - state.startX)^2 + (canY - state.startY)^2)
r=abs(r)+1
thickcircle state.startX, state.startY, r, drawCol
case 4 ' Filled Circle
dim r_fill as single: r_fill = sqr((canX - state.startX)^2 + (canY - state.startY)^2)
filledcircle state.startX, state.startY, r_fill, drawCol
case 5 ' Rectangle Outline (using thickline)
thickline state.startX, state.startY, canX, state.startY, drawCol
thickline canX, state.startY, canX, canY, drawCol
thickline canX, canY, state.startX, canY, drawCol
thickline state.startX, canY, state.startX, state.startY, drawCol
case 6 ' Filled Rectangle
line (state.startX, state.startY)-(canX, canY), drawCol, bf
case 7
case 8 ' Polygon Outline (using thickline)
' Simple preview of a line; complex polygons usually require
' a point-collection state machine.
thickline state.startX, state.startY, canX, canY, drawCol
end select
' Release Logic: Commit preview to permanent layer
if _mousebutton(1) = 0 and _mousebutton(2) = 0 then
_dest layers(1).ihandle
_putimage , layers(2).ihandle
_dest layers(2).ihandle
cls , 0
state.isDrawing = 0
end if
_dest 0
end if
end if
end sub
@ -208,6 +265,7 @@ end function
'$include: 'include/ui.bm'
'$include: 'include/imgout.bm'
'$include: 'include/palette.bm'
'$include: 'include/tools.bm'
function adduiicon(imagehandle as long)
dim unknown as long