diff --git a/include/palette.bm b/include/palette.bm index 8607dd5..fecb661 100644 --- a/include/palette.bm +++ b/include/palette.bm @@ -1,140 +1,139 @@ 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" 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 diff --git a/include/tools.bm b/include/tools.bm index 88d8e3e..f1aa4c1 100644 --- a/include/tools.bm +++ b/include/tools.bm @@ -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) diff --git a/pixler.bas b/pixler.bas index c93f51b..716be28 100644 --- a/pixler.bas +++ b/pixler.bas @@ -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 - floodfill x,y,col - addcommand"floodfill ("+tst(x)+","+tst(y)+","+hex$(col)+")" + + ' 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