DECLARE SUB hsv2rgb (hh, ss, vv, r, g, b) DECLARE SUB rgb2hsv (r%, g%, b%, h, s, v) CONST SCALE& = 1024 CONST MAXVAL& = .3 * SCALE& CONST HWEIGHT! = (1 / 60) * (1 / 60) CONST SWEIGHT! = 0'(1 / 30) * (1 / 30) CONST VWEIGHT! = 0'(1 / 5) * (1 / 5) CONST HTARGET! = 240 CONST STARGET! = .7 CONST VTARGET! = 1 DIM linebuf(2) AS STRING * 960 OPEN "bs-fore.raw" FOR BINARY AS #1 OPEN "bs-back.raw" FOR BINARY AS #2 OPEN "bs-reslt.raw" FOR BINARY AS #3 FOR y% = 0 TO 199 GET #1, , linebuf(1) GET #2, , linebuf(2) DEF SEG = VARSEG(linebuf(1)) p% = VARPTR(linebuf(1)) q% = 1 FOR x% = 0 TO 319 rgb2hsv PEEK(p%), PEEK(p% + 1), PEEK(p% + 2), h, s, v d& = SCALE& * SQR(HWEIGHT * ((h - HTARGET) ^ 2) + SWEIGHT * ((s - STARGET) ^ 2) + VWEIGHT * ((v - VTARGET) ^ 2)) IF d& < MAXVAL& THEN id& = MAXVAL& - d& POKE p%, (PEEK(p%) * d& + ASC(MID$(linebuf(2), q%, 1)) * id&) \ MAXVAL& POKE p% + 1, (PEEK(p% + 1) * d& + ASC(MID$(linebuf(2), q% + 1, 1)) * id&) \ MAXVAL& POKE p% + 2, (PEEK(p% + 2) * d& + ASC(MID$(linebuf(2), q% + 2, 1)) * id&) \ MAXVAL& END IF p% = p% + 3 q% = q% + 3 NEXT x% PUT #3, , linebuf(1) LOCATE , 1: PRINT y% / 2; "%"; NEXT y% LOCATE , 1: PRINT "done"; SPACE$(30) CLOSE #1, #2, #3 SUB hsv2rgb (hh, ss, vv, r, g, b) h = hh: s = ss: v = vv IF s = 0 THEN r = v * 255 g = v * 255 b = v * 255 ELSE IF h = 360 THEN h = 0 h = h / 60 i = INT(h) f = h - i p = v * (1 - s) q = v * (1 - (s * f)) t = v * (1 - (s * (1 - f))) SELECT CASE i CASE 0: r = v * 255: g = t * 255: b = p * 255 CASE 1: r = q * 255: g = v * 255: b = p * 255 CASE 2: r = p * 255: g = v * 255: b = t * 255 CASE 3: r = p * 255: g = q * 255: b = v * 255 CASE 4: r = t * 255: g = p * 255: b = v * 255 CASE 5: r = v * 255: g = p * 255: b = q * 255 END SELECT END IF END SUB SUB rgb2hsv (r%, g%, b%, h, s, v) min% = r% IF min% > g% THEN min% = g% IF min% > b% THEN min% = b% max% = r% IF max% < g% THEN max% = g% IF max% < b% THEN max% = b% v = max% / 255 delta% = max% - min% IF max% <> 0 THEN s = delta% / max% ELSE s = 0 IF delta% = 0 THEN s = 0 h = -1 EXIT SUB END IF SELECT CASE max% CASE r%: h = 60! * (g% - b%) / delta% CASE g%: h = 120 + 60! * (b% - r%) / delta% CASE ELSE: h = 240 + 60! * (r% - g%) / delta% END SELECT IF h >= 360 THEN h = h - 360 * (h \ 360) ELSEIF h < 0 THEN h = h - 360 * (h \ 360 - 1) END IF END SUB