deflng a-z

img1 = _loadimage("img/zmago.jpg", 32)

w = _width(img1)
h = _height(img1)

img2 = _newimage(w, h, 32)
img3 = _newimage(w, h, 32)
img4 = _newimage(w, h, 32)

screen _newimage(w*2, h*2, 32)

dither_bw img1, img2, 0.1

dither img1, img3, 2
dither img1, img4, 4

_dest 0
_putimage (0, 0), img1
_putimage (w, 0), img2
_putimage (0, h), img3
_putimage (w, h), img4

do
loop until _keyhit=27
system

'colour dither
'source image, destination image, number of colours per channel
sub dither(img1, img2, num)
	w = _width(img1)
	h = _height(img1)

	_dest img2
	_source img2

	_putimage , img1

	for y=0 to h-1
	for x=0 to w-1

		z = point(x, y)

		r = (_red(z)*num\255)*255\num
		g = (_green(z)*num\255)*255\num
		b = (_blue(z)*num\255)*255\num

		pset (x, y), _rgb(r, g, b)

		qr = _red(z) - r
		qg = _green(z) - g
		qb = _blue(z) - b

		r = _red(point(x + 1, y)) +   qr*7/16
		g = _green(point(x + 1, y)) + qg*7/16
		b = _blue(point(x + 1, y)) +  qb*7/16
		pset (x + 1, y), _rgb(r, g, b)

		r = _red(point(x - 1, y + 1)) +   qr*3/16
		g = _green(point(x - 1, y + 1)) + qg*3/16
		b = _blue(point(x - 1, y + 1)) +  qb*3/16
		pset (x - 1, y + 1), _rgb(r, g, b)

		r = _red(point(x, y + 1)) +   qr*5/16
		g = _green(point(x, y + 1)) + qg*5/16
		b = _blue(point(x, y + 1)) +  qb*5/16
		pset (x, y + 1), _rgb(r, g, b)

		r = _red(point(x + 1, y + 1)) +   qr*1/16
		g = _green(point(x + 1, y + 1)) + qg*1/16
		b = _blue(point(x + 1, y + 1)) +  qb*1/16
		pset (x + 1, y + 1), _rgb(r, g, b)
	next
	next
end sub

'black and white dither
'source image, destination image, bw threshold percent
sub dither_bw(img1, img2, t as double)
	w = _width(img1)
	h = _height(img1)

	_dest img2
	_source img2

	_putimage , img1

	for y=0 to h-1
	for x=0 to w-1

		z = point(x, y)

		c = -((_red(z)+_green(z)+_blue(z))/3 > 255*t)*255

		pset (x, y), _rgb(c, c, c)

		qr = _red(z) - c
		qg = _green(z) - c
		qb = _blue(z) - c

		r = _red(point(x + 1, y)) +   qr*7/16
		g = _green(point(x + 1, y)) + qg*7/16
		b = _blue(point(x + 1, y)) +  qb*7/16
		pset (x + 1, y), _rgb(r, g, b)

		r = _red(point(x - 1, y + 1)) +   qr*3/16
		g = _green(point(x - 1, y + 1)) + qg*3/16
		b = _blue(point(x - 1, y + 1)) +  qb*3/16
		pset (x - 1, y + 1), _rgb(r, g, b)

		r = _red(point(x, y + 1)) +   qr*5/16
		g = _green(point(x, y + 1)) + qg*5/16
		b = _blue(point(x, y + 1)) +  qb*5/16
		pset (x, y + 1), _rgb(r, g, b)

		r = _red(point(x + 1, y + 1)) +   qr*1/16
		g = _green(point(x + 1, y + 1)) + qg*1/16
		b = _blue(point(x + 1, y + 1)) +  qb*1/16
		pset (x + 1, y + 1), _rgb(r, g, b)
	next
	next
end sub
