Tiling a timage to another Timage.

BlitzMax Forums/BlitzMax Beginners Area/Tiling a timage to another Timage.

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Ok I've got some code working.

It returns a dithered image in about 30-40 milliseconds.

My main problem is adjusting for images that are not even divisable by 4.

Function round:Float(n:Float) 
	Local r:Float = n Mod 2.0
	If r >=.5
		Return Ceil(n) 
	Else
		Return Floor(n) 
	EndIf
End Function

Function ditherfilter:timage(source:TImage, brush:TImage) 
	Local sourcePixmap:TPixmap = LockImage(source) 
	Local sourcePixmapPtr:Byte Ptr = PixmapPixelPtr(sourcePixmap, 0, 0) 
	Local tmpPixmap:TPixmap = CopyPixmap(sourcePixmap) 
	Local tmpPixmapPtr:Byte Ptr = PixmapPixelPtr(tmpPixmap,0,0)
	Local x:Int,y:Int

	Local w:Int = tmpPixmap.width
	Local h:Int = tmpPixmap.height
	Local extra_width:Float = w - (Floor(w / 4) * 4) 
	Local extra_height:Float = h - (Floor(h / 4) * 4) 
	For x = 0 To w - 1 Step 4' this is a 4 pixel jump thgouth the image
		For y = 0 To h - 1 Step 4 ' this is a 4 pixel jump thgouth the image
			' set the component totals to be averaged upon completion
			Local total_red:Float = 0
			Local total_green:Float = 0
			Local total_blue:Float = 0
			Local pixels_scanned:Float = 0
			Local gray:Float = 0
			Local subimage:Float = 0
			'average the color of each 4x4 square
			For Local x2:Int = 0 To 3
				For Local y2:Int = 0 To 3
				' get the color of each pixel of 16
				Local red:Float = sourcePixmapPtr[(x + x2) * 4 + (y + y2) * 4 * w] 
				Local green:Float = sourcePixmapPtr[(x + x2) * 4 + (y + y2) * 4 * w + 1] 
				Local blue:Float = sourcePixmapPtr[(x + x2) * 4 + (y + y2) * 4 * w + 2] 
				total_red:+red
				total_green:+green
				total_blue:+blue
				pixels_scanned:+1
				Next
			Next
			
			'draw the 4x4 fill
			total_red:/pixels_scanned
			total_green:/pixels_scanned
			total_blue:/pixels_scanned
			gray = (total_red + total_green + total_blue) / 3
			For Local x2:Int = 0 To 3
				For Local y2:Int = 0 To 3
				subimage = round(gray / 255 * 16) 
				Local brush:TPixmap = LockImage(brush, subimage, 0, 0) 
				Local brushPixmapPtr:Byte Ptr = PixmapPixelPtr(brush, 0, 0) 
				
				Local w2:Int = brush.width
				tmpPixmapPtr[(x + x2) * 4 + (y + y2) * 4 * w] = brushPixmapPTr[x2 * 4 + y2 * 4 * w2] 
				tmpPixmapPtr[(x + x2) * 4 + (y + y2) * 4 * w + 1] = brushPixmapPTr[x2 * 4 + y2 * 4 * w2 + 1] 
				tmpPixmapPtr[(x + x2) * 4 + (y + y2) * 4 * w + 2] = brushPixmapPTr[x2 * 4 + y2 * 4 * w2 + 2]            		'alpha
				Next
			Next
		Next
	Next
	Local tmpImage:TImage = LoadImage(tmpPixmap)
	Return tmpImage
End Function


Could sombody patch up my work please? I would like the dither pattern to extend over the edges and keep the original size of the image.