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

View file

@ -222,6 +222,78 @@ sub floodfill (startx,starty,fillcolor~&)
wend
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)
' 1. Get canvas boundaries from the active drawing layer
dim canvasw as integer:canvasw=_width(layers(1).ihandle)

View file

@ -35,8 +35,8 @@ screen _newimage(750,480,32)
_delay 0.1
temp&=_resize
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(1).ihandle=_newimage(320,320,32)
layers(2).ihandle=_newimage(320,320,32)
@ -238,6 +238,8 @@ sub redraw
filledpolygon numarr(),state.fcolor
case "floodfill"
floodfill numarr(0),numarr(1),numarr(2)
case "boundaryfill"
boundaryfill numarr(0),numarr(1),numarr(2),numarr(3)
case "gradient"
ditheredgradient numarr(0),numarr(1),numarr(2),numarr(3),state.fcolor,state.bcolor
case ""
@ -426,17 +428,12 @@ sub canvas
end if
end if
dim r as integer
' 3. Calculate Canvas Coordinates
dim canx as long
dim cany as long
canx=int((_mousex-state.offsetx)/state.zoom)
cany=int((_mousey-state.offsety)/state.zoom)
static polypoints(200) as single
static pointcount as integer
static drawcol
if _mousebutton(1) then drawcol=state.fcolor
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
_source 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
addcommand"floodfill ("+tst(x)+","+tst(y)+","+hex$(col)+")"
end if
state.isdrawing=0
_source osource
_dest odest