1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-04-10 23:41:35 +00:00

Propogate error forward and downwards

This commit is contained in:
David Schmenk 2024-11-20 10:15:13 -08:00
parent 4fb7fe3e40
commit 5d90bd94b2

View File

@ -10,7 +10,8 @@ const RED_MSK = $7C00
const BLU = 0
const GRN = 1
const RED = 2
const ERR_DIV = 3
const ERR_MAX = 32
const ERR_DIV = 2
byte[12] ntscCycle
byte[] ntscChroma
@ -46,7 +47,7 @@ byte[] = 16, 5, 32 // RED
//byte[] = 20, 40, 0 // GREEN
//byte[] = 0, 16, 16 // BROWN
//byte[] = 20, 0, 40 // RED
var er, eg, eb // Running error
var rgberr // Running color error
def packrgb24(r, g, b)#1
return (b >> 2) | ((g & $F8) << 2) | ((r & $F8) << 7)
@ -82,6 +83,7 @@ def dotprod(x1, y1, z1, x2, y2, z2)
end
def rgbpix(r, g, b, x, y)#0
var errptr
var pr, pg, pb
var nr, ng, nb
var cr, cg, cb, cx
@ -89,9 +91,10 @@ def rgbpix(r, g, b, x, y)#0
byte i
// Error propogation
r = r + er/ERR_DIV
g = g + eg/ERR_DIV
b = b + eb/ERR_DIV
errptr = rgberr + x * 3 * 2
r = r + errptr=>[RED] / ERR_DIV
g = g + errptr=>[GRN] / ERR_DIV
b = b + errptr=>[BLU] / ERR_DIV
pr = 0
pg = 0
pb = 0
@ -117,105 +120,70 @@ def rgbpix(r, g, b, x, y)#0
cd = dist(r, g, b, cr, cg, cb)
if cd < pd and cd < nd
// RGB better matched with current 1/4 chroma color
er = r - cr
eg = g - cg
eb = b - cb
r = (r - cr + 1) / 2
g = (g - cg + 1) / 2
b = (b - cb + 1) / 2
ntscCycle[i+RED] = ntscChroma[i+RED]
ntscCycle[i+GRN] = ntscChroma[i+GRN]
ntscCycle[i+BLU] = ntscChroma[i+BLU]
dhgrSet(x, y)
else
// RGB closer to black
er = r - pr
eg = g - pg
eb = b - pb
r = (r - pr + 1) / 2
g = (g - pg + 1) / 2
b = (b - pb + 1) / 2
ntscCycle[i+RED] = 0
ntscCycle[i+GRN] = 0
ntscCycle[i+BLU] = 0
fin
//er = min(32, max(-32, er))
//eg = min(32, max(-32, eg))
//eb = min(32, max(-32, eb))
// Propogate error down and forward
r = min(ERR_MAX, max(-ERR_MAX, r))
g = min(ERR_MAX, max(-ERR_MAX, g))
b = min(ERR_MAX, max(-ERR_MAX, b))
errptr=>[RED] = r
errptr=>[GRN] = g
errptr=>[BLU] = b
errptr = errptr + 6
errptr=>[RED] = r + errptr=>[RED]
errptr=>[GRN] = g + errptr=>[GRN]
errptr=>[BLU] = b + errptr=>[BLU]
end
def rgb3Spans(rs, gs, bs, re, ge, be, rm, gm, bm, y)#0
var i, j
memset(@ntscCycle, 0, 12)
for j = y to y + 2
for i = 0 to 63
rgbpix((i>>rs)|re, (i>>gs)|ge, (i>>bs)|be, i, j)
next
for i = 64 to 127
rgbpix(rm, gm, bm, i, j)
next
next
end
def rgbTest#0
var i
er, eg, eb, = -32, -32, -32
for i = 0 to 63
rgbpix(i, 0, 0, i, 0)
next
for i = 64 to 127
rgbpix(63, 0, 0, i, 0)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 63
rgbpix(0, i, 0, i, 2)
next
for i = 64 to 127
rgbpix(0, 63, 0, i, 2)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 63
rgbpix(0, 0, i, i, 4)
next
for i = 64 to 127
rgbpix(0, 0, 63, i, 4)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 63
rgbpix(i, i, i, i, 6)
next
for i = 64 to 127
rgbpix(63, 63, 63, i, 6)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 63
rgbpix(i, i/2, i/2, i, 8)
next
for i = 64 to 127
rgbpix(63, 32, 32, i, 8)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 63
rgbpix(i/2, i, i/2, i, 10)
next
for i = 64 to 127
rgbpix(32, 63, 32, i, 10)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 63
rgbpix(i/2, i/2, i, i, 12)
next
for i = 64 to 127
rgbpix(32, 32, 63, i, 12)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 127
rgbpix(16, 16, 16, i, 14)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 127
rgbpix(32, 32, 32, i, 16)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 127
rgbpix(48, 48, 48, i, 18)
next
er, eg, eb, = -32, -32, -32
memset(@ntscCycle, 0, 12)
for i = 0 to 127
rgbpix(63, 63, 63, i, 20)
next
// Init error propogation array
rgberr = heapalloc(561 * 3 * 2)
memset(rgberr, 0, 560 * 3 * 2)
rgberr=>[RED] = -1
rgberr=>[GRN] = -1
rgberr=>[BLU] = -1
rgb3Spans(0,5,5, 0, 0, 0, 63, 0, 0, 0)
rgb3Spans(5,0,5, 0, 0, 0, 0,63, 0, 3)
rgb3Spans(5,5,0, 0, 0, 0, 0, 0,63, 6)
rgb3Spans(0,0,0, 0, 0, 0, 63,63,63, 9)
rgb3Spans(0,1,1, 0, 0, 0, 63,31,31, 12)
rgb3Spans(1,0,1, 0, 0, 0, 31,63,31, 15)
rgb3Spans(1,1,0, 0, 0, 0, 31,31,63, 18)
rgb3Spans(5,5,5, 16,16,16, 16,16,16, 21)
rgb3Spans(5,5,5, 32,32,32, 32,32,32, 24)
rgb3Spans(5,5,5, 48,48,48, 48,48,48, 27)
rgb3Spans(5,5,5, 63,63,63, 63,63,63, 30)
end
dcgrMode(0)