Added boundary fill, and removed unused variables.

This commit is contained in:
visionmercer 2026-05-22 12:58:45 +02:00
commit bbdb7a3033
3 changed files with 213 additions and 135 deletions

View file

@ -1,140 +1,139 @@
sub loadpalette(palname as string,palarray() as _unsigned long) sub loadpalette(palname as string,palarray() as _unsigned long)
dim slso8(7) as _unsigned long select case lcase$(palname)
select case lcase$(palname)
case "slso8" case "slso8"
redim palarray(7) as _unsigned long redim palarray(7) as _unsigned long
palarray(0)=&hff0d2b45 palarray(0)=&HFF0D2B45
palarray(1)=&hff203c56 palarray(1)=&HFF203C56
palarray(2)=&hff544e68 palarray(2)=&HFF544E68
palarray(3)=&hff8d697a palarray(3)=&HFF8D697A
palarray(4)=&hffd08159 palarray(4)=&HFFD08159
palarray(5)=&hffffaa5e palarray(5)=&HFFFFAA5E
palarray(6)=&hffffd4a3 palarray(6)=&HFFFFD4A3
palarray(7)=&hffffecd6 palarray(7)=&HFFFFECD6
case "endesga16" case "endesga16"
redim palarray(15) as _unsigned long redim palarray(15) as _unsigned long
palarray( 0)=&hffe4a672 palarray( 0)=&HFFE4A672
palarray( 1)=&hffb86f50 palarray( 1)=&HFFB86F50
palarray( 2)=&hff743f39 palarray( 2)=&HFF743F39
palarray( 3)=&hff3f2832 palarray( 3)=&HFF3F2832
palarray( 4)=&hff9e2835 palarray( 4)=&HFF9E2835
palarray( 5)=&hffe53b44 palarray( 5)=&HFFE53B44
palarray( 6)=&hfffb922b palarray( 6)=&HFFFB922B
palarray( 7)=&hffffe762 palarray( 7)=&HFFFFE762
palarray( 8)=&hff63c64d palarray( 8)=&HFF63C64D
palarray( 9)=&hff327345 palarray( 9)=&HFF327345
palarray(10)=&hff193d3f palarray(10)=&HFF193D3F
palarray(11)=&hff4f6781 palarray(11)=&HFF4F6781
palarray(12)=&hffafbfd2 palarray(12)=&HFFAFBFD2
palarray(13)=&hffffffff palarray(13)=&HFFFFFFFF
palarray(14)=&hff2ce8f4 palarray(14)=&HFF2CE8F4
palarray(15)=&hff0484d1 palarray(15)=&HFF0484D1
case "kinkan" case "kinkan"
redim palarray(7) as _unsigned long redim palarray(7) as _unsigned long
palarray(0)=&hff446176 palarray(0)=&HFF446176
palarray(1)=&hff3eaaae palarray(1)=&HFF3EAAAE
palarray(2)=&hff8cefb6 palarray(2)=&HFF8CEFB6
palarray(3)=&hffc4f0c2 palarray(3)=&HFFC4F0C2
palarray(4)=&hfffffee4 palarray(4)=&HFFFFFEE4
palarray(5)=&hffbec0c0 palarray(5)=&HFFBEC0C0
palarray(6)=&hffffa7b9 palarray(6)=&HFFFFA7B9
palarray(7)=&hffff7a8f palarray(7)=&HFFFF7A8F
case "custodian-8" case "custodian-8"
redim palarray(7) as _unsigned long redim palarray(7) as _unsigned long
palarray(0)=&hff2b3634 palarray(0)=&HFF2B3634
palarray(1)=&hff474848 palarray(1)=&HFF474848
palarray(2)=&hff6e5f52 palarray(2)=&HFF6E5F52
palarray(3)=&hffa2856c palarray(3)=&HFFA2856C
palarray(4)=&hffa0a294 palarray(4)=&HFFA0A294
palarray(5)=&hffdcb9a0 palarray(5)=&HFFDCB9A0
palarray(6)=&hfff3dbc6 palarray(6)=&HFFF3DBC6
palarray(7)=&hfffffefe palarray(7)=&HFFFFFEFE
case "greyteen" case "greyteen"
redim palarray(17) as _unsigned long redim palarray(17) as _unsigned long
palarray( 0)=&hff272524 palarray( 0)=&HFF272524
palarray( 1)=&hff444140 palarray( 1)=&HFF444140
palarray( 2)=&hf626368 palarray( 2)=&HF626368
palarray( 3)=&hff918783 palarray( 3)=&HFF918783
palarray( 4)=&hffa7a8b9 palarray( 4)=&HFFA7A8B9
palarray( 5)=&hffd7c7c0 palarray( 5)=&HFFD7C7C0
palarray( 6)=&hffdadceb palarray( 6)=&HFFDADCEB
palarray( 7)=&hfff2ece9 palarray( 7)=&HFFF2ECE9
palarray( 8)=&hff4e393a palarray( 8)=&HFF4E393A
palarray( 9)=&hff7d5c51 palarray( 9)=&HFF7D5C51
palarray(10)=&hffcd9f83 palarray(10)=&HFFCD9F83
palarray(11)=&hffebd8a3 palarray(11)=&HFFEBD8A3
palarray(12)=&hff95ae91 palarray(12)=&HFF95AE91
palarray(13)=&hff5a7054 palarray(13)=&HFF5A7054
palarray(14)=&hff3f4459 palarray(14)=&HFF3F4459
palarray(15)=&hff7b8caa palarray(15)=&HFF7B8CAA
palarray(16)=&hffb0c6d5 palarray(16)=&HFFB0C6D5
palarray(17)=&hff745e72 palarray(17)=&HFF745E72
case "ega" case "ega"
redim palarray(63) as _unsigned long redim palarray(63) as _unsigned long
palarray( 0)=&hff000000 palarray( 0)=&HFF000000
palarray( 1)=&hff000055 palarray( 1)=&HFF000055
palarray( 2)=&hff0000aa palarray( 2)=&HFF0000AA
palarray( 3)=&hff0000ff palarray( 3)=&HFF0000FF
palarray( 4)=&hff550000 palarray( 4)=&HFF550000
palarray( 5)=&hff550055 palarray( 5)=&HFF550055
palarray( 6)=&hff5500aa palarray( 6)=&HFF5500AA
palarray( 7)=&hff5500ff palarray( 7)=&HFF5500FF
palarray( 8)=&hffaa0000 palarray( 8)=&HFFAA0000
palarray( 9)=&hffaa0055 palarray( 9)=&HFFAA0055
palarray(10)=&hffaa00aa palarray(10)=&HFFAA00AA
palarray(11)=&hffaa00ff palarray(11)=&HFFAA00FF
palarray(12)=&hffff0000 palarray(12)=&HFFFF0000
palarray(13)=&hffff0055 palarray(13)=&HFFFF0055
palarray(14)=&hffff00aa palarray(14)=&HFFFF00AA
palarray(15)=&hffff00ff palarray(15)=&HFFFF00FF
palarray(16)=&hff005500 palarray(16)=&HFF005500
palarray(17)=&hff005555 palarray(17)=&HFF005555
palarray(18)=&hff0055aa palarray(18)=&HFF0055AA
palarray(19)=&hff0055ff palarray(19)=&HFF0055FF
palarray(20)=&hff555500 palarray(20)=&HFF555500
palarray(21)=&hff555555 palarray(21)=&HFF555555
palarray(22)=&hff5555aa palarray(22)=&HFF5555AA
palarray(23)=&hff5555ff palarray(23)=&HFF5555FF
palarray(24)=&hffaa5500 palarray(24)=&HFFAA5500
palarray(25)=&hffaa5555 palarray(25)=&HFFAA5555
palarray(26)=&hffaa55aa palarray(26)=&HFFAA55AA
palarray(27)=&hffaa55ff palarray(27)=&HFFAA55FF
palarray(28)=&hffff5500 palarray(28)=&HFFFF5500
palarray(29)=&hffff5555 palarray(29)=&HFFFF5555
palarray(30)=&hffff55aa palarray(30)=&HFFFF55AA
palarray(31)=&hffff55ff palarray(31)=&HFFFF55FF
palarray(32)=&hff00aa00 palarray(32)=&HFF00AA00
palarray(33)=&hff00aa55 palarray(33)=&HFF00AA55
palarray(34)=&hff00aaaa palarray(34)=&HFF00AAAA
palarray(35)=&hff00aaff palarray(35)=&HFF00AAFF
palarray(36)=&hff55aa00 palarray(36)=&HFF55AA00
palarray(37)=&hff55aa55 palarray(37)=&HFF55AA55
palarray(38)=&hff55aaaa palarray(38)=&HFF55AAAA
palarray(39)=&hff55aaff palarray(39)=&HFF55AAFF
palarray(40)=&hffaaaa00 palarray(40)=&HFFAAAA00
palarray(41)=&hffaaaa55 palarray(41)=&HFFAAAA55
palarray(42)=&hffaaaaaa palarray(42)=&HFFAAAAAA
palarray(43)=&hffaaaaff palarray(43)=&HFFAAAAFF
palarray(44)=&hffffaa00 palarray(44)=&HFFFFAA00
palarray(45)=&hffffaa55 palarray(45)=&HFFFFAA55
palarray(46)=&hffffaaaa palarray(46)=&HFFFFAAAA
palarray(47)=&hffffaaff palarray(47)=&HFFFFAAFF
palarray(48)=&hff00ff00 palarray(48)=&HFF00FF00
palarray(49)=&hff00ff55 palarray(49)=&HFF00FF55
palarray(50)=&hff00ffaa palarray(50)=&HFF00FFAA
palarray(51)=&hff00ffff palarray(51)=&HFF00FFFF
palarray(52)=&hff55ff00 palarray(52)=&HFF55FF00
palarray(53)=&hff55ff55 palarray(53)=&HFF55FF55
palarray(54)=&hff55ffaa palarray(54)=&HFF55FFAA
palarray(55)=&hff55ffff palarray(55)=&HFF55FFFF
palarray(56)=&hffaaff00 palarray(56)=&HFFAAFF00
palarray(57)=&hffaaff55 palarray(57)=&HFFAAFF55
palarray(58)=&hffaaffaa palarray(58)=&HFFAAFFAA
palarray(59)=&hffaaffff palarray(59)=&HFFAAFFFF
palarray(60)=&hffffff00 palarray(60)=&HFFFFFF00
palarray(61)=&hffffff55 palarray(61)=&HFFFFFF55
palarray(62)=&hffffffaa palarray(62)=&HFFFFFFAA
palarray(63)=&hffffffff palarray(63)=&HFFFFFFFF
case else case else
redim palarray(1) as _unsigned long redim palarray(1) as _unsigned long
if _fileexists(palname) then if _fileexists(palname) then
@ -153,8 +152,8 @@ sub loadpalette(palname as string,palarray() as _unsigned long)
loop loop
close fh close fh
else else
palarray(0)=&hff000000 palarray(0)=&HFF000000
palarray(1)=&hffffffff palarray(1)=&HFFFFFFFF
end if end if
end select end select
end sub end sub

View file

@ -222,6 +222,78 @@ sub floodfill (startx,starty,fillcolor~&)
wend wend
end sub end sub
sub boundaryfill (startx,starty,fillcolor~&,boundarycolor~&)
' Boundary check safety gates
if startx < 0 or startx >= _width or starty < 0 or starty >= _height then exit sub
' If the starting pixel is already the boundary or the fill color, exit immediately
dim currentcolor~&
currentcolor~& = point(startx,starty)
if currentcolor~& = boundarycolor~& or currentcolor~& = fillcolor~& then exit sub
dim stackx(2000) as integer
dim stacky(2000) as integer
stackptr=1
stackx(stackptr)=startx
stacky(stackptr)=starty
while stackptr>0
curx=stackx(stackptr)
cury=stacky(stackptr)
stackptr=stackptr-1
' Move to the left edge of the region until we hit a boundary or fillcolor
x=curx
while x>=0
currentcolor~& = point(x,cury)
if currentcolor~& = boundarycolor~& or currentcolor~& = fillcolor~& then exit while
x=x-1
wend
x=x+1
spanabove=0
spanbelow=0
' Process the span moving right
while x<_width
currentcolor~& = point(x,cury)
if currentcolor~& = boundarycolor~& or currentcolor~& = fillcolor~& then exit while
pset (x,cury),fillcolor~&
' Check row above
if cury>0 then
dim colorabove~&
colorabove~& = point(x,cury-1)
if spanabove=0 and colorabove~& <> boundarycolor~& and colorabove~& <> fillcolor~& then
stackptr=stackptr+1
stackx(stackptr)=x
stacky(stackptr)=cury-1
spanabove=1
elseif spanabove=1 and (colorabove~& = boundarycolor~& or colorabove~& = fillcolor~&) then
spanabove=0
end if
end if
' Check row below
if cury<_height-1 then
dim colorbelow~&
colorbelow~& = point(x,cury+1)
if spanbelow=0 and colorbelow~& <> boundarycolor~& and colorbelow~& <> fillcolor~& then
stackptr=stackptr+1
stackx(stackptr)=x
stacky(stackptr)=cury+1
spanbelow=1
elseif spanbelow=1 and (colorbelow~& = boundarycolor~& or colorbelow~& = fillcolor~&) then
spanbelow=0
end if
end if
x=x+1
wend
wend
end sub
sub ditheredgradient (x1 as long,y1 as long,x2 as long,y2 as long,fcol as _unsigned long,bcol as _unsigned long) sub ditheredgradient (x1 as long,y1 as long,x2 as long,y2 as long,fcol as _unsigned long,bcol as _unsigned long)
' 1. Get canvas boundaries from the active drawing layer ' 1. Get canvas boundaries from the active drawing layer
dim canvasw as integer:canvasw=_width(layers(1).ihandle) dim canvasw as integer:canvasw=_width(layers(1).ihandle)

View file

@ -35,8 +35,8 @@ screen _newimage(750,480,32)
_delay 0.1 _delay 0.1
temp&=_resize temp&=_resize
redim shared pal(0) as _unsigned long redim shared pal(0) as _unsigned long
dim as integer ch1,ch2,ch3,bt
loadpalette"slso8",pal() loadpalette"custodian-8",pal()
layers(0).ihandle=_newimage(320,320,32) layers(0).ihandle=_newimage(320,320,32)
layers(1).ihandle=_newimage(320,320,32) layers(1).ihandle=_newimage(320,320,32)
layers(2).ihandle=_newimage(320,320,32) layers(2).ihandle=_newimage(320,320,32)
@ -238,6 +238,8 @@ sub redraw
filledpolygon numarr(),state.fcolor filledpolygon numarr(),state.fcolor
case "floodfill" case "floodfill"
floodfill numarr(0),numarr(1),numarr(2) floodfill numarr(0),numarr(1),numarr(2)
case "boundaryfill"
boundaryfill numarr(0),numarr(1),numarr(2),numarr(3)
case "gradient" case "gradient"
ditheredgradient numarr(0),numarr(1),numarr(2),numarr(3),state.fcolor,state.bcolor ditheredgradient numarr(0),numarr(1),numarr(2),numarr(3),state.fcolor,state.bcolor
case "" case ""
@ -426,17 +428,12 @@ sub canvas
end if end if
end if end if
dim r as integer
' 3. Calculate Canvas Coordinates ' 3. Calculate Canvas Coordinates
dim canx as long dim canx as long
dim cany as long dim cany as long
canx=int((_mousex-state.offsetx)/state.zoom) canx=int((_mousex-state.offsetx)/state.zoom)
cany=int((_mousey-state.offsety)/state.zoom) cany=int((_mousey-state.offsety)/state.zoom)
static polypoints(200) as single
static pointcount as integer
static drawcol static drawcol
if _mousebutton(1) then drawcol=state.fcolor if _mousebutton(1) then drawcol=state.fcolor
if _mousebutton(2) then drawcol=state.bcolor if _mousebutton(2) then drawcol=state.bcolor
@ -704,8 +701,18 @@ sub do.floodfill(x as long,y as long,col as long)
if mouseclicked or rmouseclicked then if mouseclicked or rmouseclicked then
_source layers(1).ihandle _source layers(1).ihandle
_dest layers(1).ihandle _dest layers(1).ihandle
' Check if either Left Shift (100303) or Right Shift (100304) is held down
if _keydown(100303) or _keydown(100304) then
' Fill until it hits the background color as a border
boundaryfill x,y,col,state.bcolor
addcommand"boundaryfill ("+tst(x)+","+tst(y)+","+hex$(col)+","+hex$(state.bcolor)+")"
else
' Standard color-replace flood fill
floodfill x,y,col floodfill x,y,col
addcommand"floodfill ("+tst(x)+","+tst(y)+","+hex$(col)+")" addcommand"floodfill ("+tst(x)+","+tst(y)+","+hex$(col)+")"
end if
state.isdrawing=0 state.isdrawing=0
_source osource _source osource
_dest odest _dest odest