RetroAvatarsをHSPに移植する(2)

前回:RetroAvatarsをHSPに移植する


細々と進行中。
前回、いろいろ勘違いしていたところを修正。
中途半端にモジュール化。ばばちい。
"enhanceFace"ちょっとわかってきた。



TANINIで生成したところ。ちょっと進歩!


途中経過(292行)

#define global W 12
#define global H 12
#define global EMPTY_COL 0
#define global SOLID_COL 255
#define global EYES_COL 1
#define global NOSE_COL 2

screen 0, 250, 250

titleStr = "TANINI"
size = length(titleStr)

dim g, 14, 14

code = 0
randomize(0)
repeat 32
	code = code + (peek(titleStr,cnt\size)*rnd(3071)\1024)
loop

randomize(code)
R = rnd(3263)\192 + 64
G = rnd(3263)\192 + 64
B = rnd(3263)\192 + 64

color 0, 0, 0 : boxf
color 255, 255, 255


*initGraph
repeat 14
	i = cnt
	repeat 14
		g.i.cnt = EMPTY_COL
	loop
loop


*createGraph
repeat H, 1
	y = cnt
	repeat W, 1
		x = cnt
		c = 158
		if( rnd(3203)\356 > c ){
			g.y.x = EMPTY_COL
		} else {
			g.y.x = SOLID_COL
		}
	loop
loop


*removeNoise
dim xt1, 8 : dim yt1, 8
xt1 = -1, 0, 1, -1, 1, -1, 0, 1
yt1 = -1, -1, -1, 0, 0, 1, 1, 1
dim xt2, 4 : dim yt2, 4
xt2 = 0, 1, 0, -1
yt2 = -1, 0, 1, 0

repeat 4
	for y, 1, H+1, 1
		for x, 1, W+1, 1
			if( g.y.x == EMPTY_COL ){
				p = 0
				for i, 0, 8, 1
					y0 = y+yt1.i : x0 = x+xt1.i
					p = p + g.y0.x0
				next
				if p >= SOLID_COL*8 {
					g.y.x = SOLID_COL
				}

				if( g.(y-1).x==SOLID_COL && g.(y+1).x==SOLID_COL ){
					if( g.(x-1).x!=SOLID_COL && g.(x+1).x!=SOLID_COL ){
							if ( rnd(3274)\5>2 ){
								g.y.x = SOLID_COL
							}
					}
				}
				if( g.(y-1).x==SOLID_COL && g.(y+1).x==SOLID_COL ){
					if( g.(x-1).x==SOLID_COL && g.(x+1).x==SOLID_COL ){
						if( rnd(3274)\5>2 ){
							g.y.x = SOLID_COL
						}
					}
				}
	}
		next
	next

	for y, 1, H+1, 1
		for x, 1, W+1, 1
			if( g.y.x == SOLID_COL ){
				p = 0
				for i, 0, 8, 1
					y0 = y+yt1.i : x0 = x+xt1.i
					p = p + g.y0.x0
				next
				if p <= 0 {
					g.y.x = EMPTY_COL
				}
			}
		next
	next
loop

#module retroAvatars
#defcfunc checkForFilledEdge array g0
	result = 0
	for y, 1, H+1, 1
		if( ( EMPTY_COL < g0.y.0 )&&( g0.y.0 < SOLID_COL ) ) : return 1
		if( ( EMPTY_COL < g0.y.W )&&( g0.y.W < SOLID_COL ) ) : return 1
	next

	for x, 1, W+1, 1
		if( ( EMPTY_COL < g0.0.x )&&( g0.0.x < SOLID_COL ) ) : return 2
		if( ( EMPTY_COL < g0.H.x )&&( g0.H.x < SOLID_COL ) ) : return 2
	next

	return 0

#deffunc outlineArea array g0, int col
	dim xt, 8 : dim yt, 8
	xt = 0, 1, 0, -1, -1, 1, -1, 1
	yt = -1, 0, 1, 0, -1, -1, 1, 1

	for y, 1, H+1, 1
		for x, 1, W+1, 1
			if( g0.y.x == col ){
				for i, 0, 8, 1
					y0 = y+yt.i : x0 = x+xt.i
					if( i < 4 ){
						if( g0.y0.x0 != col ) : g0.y0.x0 = 255
					} else {
						if( g0.y0.x0 == 0 ) : g0.y0.x0 = 255
					}
				next
			}
		next
	next
	return


#deffunc mirror array g0
	x_sym = 1
	y_sym = 0

	for y, 1, H+1, 1
		for x, 1, W/2+1, 1
			p = g0.y.x
			if( x_sym == 1 ){
				x0 = W-x+1
				g0.y.x0 = p
			}
		next
	next

	for y, 1, H/2+1, 1
		for x, 1, W+1, 1
			p = g0.y.x
			if( y_sym == 1 ){
				y0 = H-y+1
				g0.y0.x = p
			}
		next
	next
	return


#deffunc floodFill array g0, int startX, int startY, int col
	p = g0.startY.startX
	g0.startY.startX = col

	dim xt, 8 : dim yt, 8
		xt = 0, 1, 0, -1, -1, 1, -1, 1
		yt = -1, 0, 1, 0, -1, -1, 1, 1
	
	for i, 0, 8, 1
		x = startX + xt.i
		y = startY + yt.i
		if( (1 <= x)&&( x <= W ) ){
			if( ( 1<=y )&&( y <= H ) ){
				if( g0.y.x == p ) : floodFill g0, x, y, col
			}
		}
	next

	return

#global


*enhanceFace
hx = W/2
eyes = 0

for y, 2, H/2+1,1
	x0 = hx-1
	if( g.y.x0 == EMPTY_COL ){
		floodFill g, x0, y, 1
		if( checkForFilledEdge(g) == 0 ){
			_break
		}
		floodFill g, x0, y, 0
	}

	x0 = hx-2
	if( g.y.x0 == EMPTY_COL ){
		floodFill g, x0, y, EYES_COL
		if(  checkForFilledEdge(g) == 0 ){
			_break
		}
		floodFill g, x0, y, EMPTY_COL
	}

next

if( y == H/2+1 ){
	for y, 2, H+1, 1
		x0 = hx-1
		if( g.y.x0 == SOLID_COL ){
			if( g.y.hx == EMPTY_COL ){
				g.y.x0 = EMPTY_COL
				g.y.hx = SOLID_COL
				y0 = y+1
				g.y0.x0 = EMPTY_COL

				floodFill g, x0, y, EYES_COL
				if( checkForFilledEdge(g) == 0 ) : _break
				floodFill g, x0, y, EMPTY_COL
			}
		}
	next
}

ny = y + 1
if( y < H+1 ) : eyes = 1

if( eyes == 0 ){
		y = 2 + rnd(3000)\(h/2)
		g.y.(hx-1) = EYES_COL
		outlineArea g, EYES_COL
		eyes = 1
		ny = y + 1
}

for y, 2, H+1, 1
	if( g.y.hx == EYES_COL ){
		x0 = hx-1
		g.y.hx = SOLID_COL
		g.y.x0 = EYES_COL
	} else {
		x0 = hx-2
		if( g.y.x0 == EYES_COL ) : g.y.hx = SOLID_COL
		x0 = hx-1
		if( g.y.x0 == EYES_COL ) : g.y.hx = SOLID_COL
	}
next

mirror g

if( eyes == 1 ) : outlineArea g, 1

// 鼻(つくりかけ)
nose = 0
for y, ny, H+1, 1
	if( g.y.hx == COL_EMPTY ){
		floodFill g, hx, y, 2
		if( checkForFilledEdge(g) == 0 ) : _break
		floodFill g, hx, y, 0
	}
next
if( y <= 10 ) : nose = 1


*draw
repeat H, 1
	y = cnt
	repeat W, 1
		x = cnt
		if( g.y.x == SOLID_COL ){
			color R, G, B
		} else {
			color 0, 0, 0
		}
		boxf 10+x*10, 10+y*10, 10+x*10+10, 10+y*10+10
	loop
loop

stop