I've often wanted to fill irregular-shaped graphic areas. And recently colouring-in previously prepared outline pictures has inexplicably become popular. LB allows easy calling of the flood-filling API, which can be used ( as here) to flood-fill out to a specified boundary colour OR to keep re-colouring for as long as it is in a contiguous area of stated colour. This first example could have been achieved with a 'circlefilled' command. Other shapes cannot be filled the same way...
I wrote variations of the following code which either draws a black-on-white figure, or loads a prepared BMP of the correct size. You can prepare source material from the many on-line 'colouring-in' drawings, or create them by edge-detection of suitable photos.
I choose points at random. If not black ( the chosen boundary) I fill them with a random colour out to the surrounding black boundary. Large areas are likely to get 'hit' early on and then repeatedly changed. This can be avoided by skipping if GetPixel is used to find if that area has already been coloured, but if you do that the picture will be increasingly static. Conversely, small areas may still not have been seen after many cycles. But if you use a systematic ( eg raster) scan to find areas to colour, it looks distinctly odder and less pleasing.
The next example fills a pre-supplied black outline drawing.
And the next example colours an outlined shape at the time of its creation. Bit of a tribute to the 'Olber's Paradox' of cosmology.
nomainwin WindowWidth =500 WindowHeight =500 open "Fill-me" for graphics_nsb as #wg #wg "trapclose [quit]" hw =hwnd( #wg) ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< calldll #user32, "GetDC", hw as ulong, hdc as ulong ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< filedialog "Choose a 500x500 BMP", "*.bmp", fn$ loadbmp "scr", fn$ #wg "down" #wg "drawbmp scr 0 0" #wg "flush" notice "Hitto flood-fill the areas one at a time at 10/second." for i =1 to 1000 r =int( 256 *rnd( 1)) g =int( 256 *rnd( 1)) b =int( 256 *rnd( 1)) fillCol$ =str$( r) +" " +str$( g); " " +str$( b) if fillCol$ <>"0 0 0" then #wg "color "; fillCol$; " ; up ; backcolor "; fillCol$ xVar =int( 500 *rnd( 1)) yVar =int( 500 *rnd( 1)) targetcolor =0 ' this is the colour of the outline to fill out to. calldll #gdi32, "ExtFloodFill",_ hdc as ulong,_ xVar as long,_ yVar as long,_ targetcolor as long,_ _FLOODFILLBORDER as long,_ ' ' ie fill out 'til this colour is met... <<<<<<<<<<<<<<<<<<<<<<<<<< result as long calldll #kernel32, "Sleep", 100 as long, ret as void scan end if next i #wg "flush ; getbmp scr 0 0 500 500" bmpsave "scr", "fillDemo.bmp" wait [quit] calldll #user32, "ReleaseDC", hw as ulong, hdc as ulong, ret as void 'release the DC <<<<<<<<<<<<<<<<<<<<< close #wg end