pixel fill

BlitzPlus Forums/BlitzPlus Programming/pixel fill

Bremer(Posted 2003) [#1]
Hi, I'm finishing my sprite editor that I'm going to use for future project and was thinking whether or not I need a fill rutine in there. Does anyone have an easy way of doing this?


PRJ(Posted 2003) [#2]
Found these two in the Code archive:
* http://www.blitzbasic.com/codearcs/codearcs.php?code=314
* http://www.blitzbasic.com/codearcs/codearcs.php?code=50

Hope it helps...


Bremer(Posted 2003) [#3]
The first one looks promising. Thanks. With a last name like I bet your from Denmark, right?


Qube(Posted 2003) [#4]
Here's another pixel flood fill routine I did a while back for you to look over...

Graphics 1024,768,32,1
SetBuffer FrontBuffer()

Global screen_width = GraphicsWidth()
Global screen_height = GraphicsHeight()


cx = screen_width / 2
cy = screen_height / 2
r# = 10

For count = 0 To 360 * 20
	x1# = cx + Cos(count) * r#
	y1# = cy + Sin(count) * r#
	If x2# > 0 And y2# > 0 Then Line x1,y1,x2,y2
	x2# = x1#
	y2# = y1#
	r# = r# + .05
Next

Type fill
	Field x
	Field y
	Field d
End Type

match_red = 0
match_green = 0
match_blue = 0
fill_red = 255
fill_green = 0
fill_blue = 0

floodfill(10,10,((match_red Shl 16) Or (match_green Shl 8) Or match_blue),((fill_red Shl 16) Or (fill_green Shl 8) Or fill_blue))

While Not KeyHit(1)
Wend

End



Function floodfill(x,y,m,fc)
	m = ReadPixel(x,y)
	flood.fill = New fill
	flood\x = x 
	flood\y = y	
	done = False
	
	LockBuffer FrontBuffer()
	While done = False
		done = True
		
		For flood.fill = Each fill
			done = False
		
			x = flood\x
			y = flood\y
			c = ReadPixelFast(x,y)
			Delete flood
		
			If c = m
				WritePixelFast x,y,fc
				If y > 0
					If ReadPixelFast(x,y - 1) = m 
						flood.fill = New fill
						flood\x = x
						flood\y = y - 1
					End If
				End If
				If y < screen_height - 2 
					If ReadPixelFast(x,y + 1) = m 
						flood.fill = New fill
						flood\x = x
						flood\y = y + 1
					End If
				End If
				If x > 0
					If ReadPixelFast(x - 1,y) = m
						flood.fill = New fill
						flood\x = x - 1
						flood\y = y
					End If
				End If
				If x < screen_width - 2 
					If ReadPixelFast(x + 1,y) = m
						flood.fill = New fill
						flood\x = x + 1
						flood\y = y
					End If
				End If
			End If
		Next
	Wend
	UnlockBuffer FrontBuffer()
End Function



Curtastic(Posted 2003) [#5]
I updated mine.
It no longer needs any arrays, just that type to include
there is more info on the page.


EOF(Posted 2003) [#6]
Something else for you to consider. A Texture Fill function I done by converting an existing Floodfill routine.


Qube(Posted 2003) [#7]
LOL, so many ways to do a simple flood fill!


Bremer(Posted 2003) [#8]
Hi Syntax Error, that texture fill is great, I'll try and work that into my bitmap font editor, thanks.