Better Color Management

This commit is contained in:
tudnai 2023-08-08 13:01:22 -07:00
parent 82100c6bc3
commit 223e2eb9e6
1 changed files with 72 additions and 21 deletions

View File

@ -343,9 +343,8 @@ class HiRes: NSView {
case 1: // purple (bits are in reverse!) case 1: // purple (bits are in reverse!)
pixelsSRGB[colorAddr] = color_purple pixelsSRGB[colorAddr] = color_purple
pixelsSRGB[colorAddr + 1] = color_purple pixelsSRGB[colorAddr + 1] = color_purple
// HiRes.pixelsSRGB[colorAddr + 1] = color_purple pixelsSRGB[colorAddr + 2] = color_purple
if (colorAddr >= 2) && (prev != 0x03) && (prev != 0x07) && (prev != 0x00) && (prev != 0x04) { if (colorAddr >= 2) && (prev != 0x03) && (prev != 0x07) && (prev != 0x00) && (prev != 0x04) {
pixelsSRGB[colorAddr] = color_purple
pixelsSRGB[colorAddr - 1] = color_purple pixelsSRGB[colorAddr - 1] = color_purple
pixelsSRGB[colorAddr - 2] = color_purple pixelsSRGB[colorAddr - 2] = color_purple
} }
@ -353,58 +352,68 @@ class HiRes: NSView {
case 2: // green case 2: // green
// reducing color bleeding // reducing color bleeding
if (colorAddr > 1) && (pixelsSRGB[colorAddr - 2] != color_black) { if (colorAddr > 1) && (pixelsSRGB[colorAddr - 2] != color_black) {
pixelsSRGB[colorAddr] = color_green pixelsSRGB[colorAddr + 0] = color_green
pixelsSRGB[colorAddr + 1] = color_green
} }
pixelsSRGB[colorAddr] = color_green
pixelsSRGB[colorAddr + 1] = color_green
pixelsSRGB[colorAddr + 2] = color_green pixelsSRGB[colorAddr + 2] = color_green
pixelsSRGB[colorAddr + 3] = color_green pixelsSRGB[colorAddr + 3] = color_green
case 3: // white 1 case 3: // white 1
// if ( colorAddr >= 2 ) && ( HiRes.pixelsSRGB[colorAddr - 2] != color_black ) { // if ( colorAddr >= 2 ) && ( pixelsSRGB[colorAddr - 2] != color_black ) {
// HiRes.pixelsSRGB[colorAddr - 1] = HiRes.pixelsSRGB[colorAddr - 2] // pixelsSRGB[colorAddr - 2] = color_white // HiRes.pixelsSRGB[colorAddr - 2]
// } // }
// if (colorAddr >= 1) { // if (colorAddr >= 1) {
// HiRes.pixelsSRGB[colorAddr - 1] = color_yellow // HiRes.pixelsSRGB[colorAddr - 1] = color_yellow
// } // }
pixelsSRGB[colorAddr] = color_white pixelsSRGB[colorAddr - 1] = color_white
pixelsSRGB[colorAddr + 0] = color_white
pixelsSRGB[colorAddr + 1] = color_white pixelsSRGB[colorAddr + 1] = color_white
pixelsSRGB[colorAddr + 2] = color_white pixelsSRGB[colorAddr + 2] = color_white
pixelsSRGB[colorAddr + 3] = color_white pixelsSRGB[colorAddr + 3] = color_white
pixelsSRGB[colorAddr + 4] = color_white
case 5: // blue case 5: // blue
pixelsSRGB[colorAddr + 1] = color_blue pixelsSRGB[colorAddr + 1] = color_blue
pixelsSRGB[colorAddr + 2] = color_blue pixelsSRGB[colorAddr + 2] = color_blue
pixelsSRGB[colorAddr] = color_blue
pixelsSRGB[colorAddr - 1] = color_blue
if (colorAddr >= 2) && (prev != 0x00) && (prev != 0x04) { if (colorAddr >= 2) && (prev != 0x00) && (prev != 0x04) {
pixelsSRGB[colorAddr] = color_blue
pixelsSRGB[colorAddr - 1] = color_blue
pixelsSRGB[colorAddr - 2] = color_blue pixelsSRGB[colorAddr - 2] = color_blue
} }
case 6: // orange case 6: // orange
// reducing color bleeding // reducing color bleeding
if (colorAddr > 0) && (pixelsSRGB[colorAddr] != color_black) { if (colorAddr > 0) && (pixelsSRGB[colorAddr - 2] != color_black) {
pixelsSRGB[colorAddr + 0] = color_orange // important for color bleeding and color contiunity
pixelsSRGB[colorAddr + 1] = color_orange pixelsSRGB[colorAddr + 1] = color_orange
pixelsSRGB[colorAddr + 2] = color_orange
} }
pixelsSRGB[colorAddr + 2] = color_orange
pixelsSRGB[colorAddr + 3] = color_orange pixelsSRGB[colorAddr + 3] = color_orange
pixelsSRGB[colorAddr + 4] = color_orange pixelsSRGB[colorAddr + 4] = color_orange
case 7: // white 2 case 7: // white 2
// pixelsSRGB[colorAddr + 0] = color_white // Donkey Kong would be perfect but problem in Sneakers if ( colorAddr >= 2 ) && ( pixelsSRGB[colorAddr - 2] != color_black ) {
// pixelsSRGB[colorAddr - 2] = color_white // HiRes.pixelsSRGB[colorAddr - 2]
pixelsSRGB[colorAddr - 1] = color_white
}
pixelsSRGB[colorAddr + 0] = color_white // Donkey Kong would be perfect but problem in Sneakers
pixelsSRGB[colorAddr + 1] = color_white pixelsSRGB[colorAddr + 1] = color_white
pixelsSRGB[colorAddr + 2] = color_white pixelsSRGB[colorAddr + 2] = color_white
pixelsSRGB[colorAddr + 3] = color_white pixelsSRGB[colorAddr + 3] = color_white
pixelsSRGB[colorAddr + 4] = color_white pixelsSRGB[colorAddr + 4] = color_white
case 0: // 0x00 (black 1), 0x04 (black 2) case 0: // 0x00 (black 1), 0x04 (black 2)
pixelsSRGB[colorAddr + 0] = color_black // pixelsSRGB[colorAddr + 0] = color_black
pixelsSRGB[colorAddr + 1] = color_black pixelsSRGB[colorAddr + 1] = color_black
pixelsSRGB[colorAddr + 2] = color_black pixelsSRGB[colorAddr + 2] = color_black
pixelsSRGB[colorAddr + 3] = color_black pixelsSRGB[colorAddr + 3] = color_black
// white adjustment // white adjustment
// if (colorAddr >= 2) && ((prev == 3) || (prev == 7)) {
if (colorAddr >= 2) && (prev == 7) { if (colorAddr >= 2) && (prev == 7) {
pixelsSRGB[colorAddr - 1] = color_black pixelsSRGB[colorAddr - 1] = color_black
pixelsSRGB[colorAddr - 0] = color_black
} }
// blue adjustment // blue adjustment
if (colorAddr >= 2) && (prev == 5) { if (colorAddr >= 2) && (prev == 5) {
@ -418,6 +427,7 @@ class HiRes: NSView {
pixelsSRGB[colorAddr + 4] = color_black pixelsSRGB[colorAddr + 4] = color_black
// white adjustment // white adjustment
// if (colorAddr >= 2) && ((prev == 3) || (prev == 7)) {
if (colorAddr >= 2) && (prev == 7) { if (colorAddr >= 2) && (prev == 7) {
pixelsSRGB[colorAddr - 0] = color_black pixelsSRGB[colorAddr - 0] = color_black
} }
@ -428,6 +438,43 @@ class HiRes: NSView {
// pixelsSRGB[colorAddr - 2] = color_black // if i put that in there is ladder on Donkey Kong is too thin // pixelsSRGB[colorAddr - 2] = color_black // if i put that in there is ladder on Donkey Kong is too thin
} }
// let pp = pixelAddr - 1 // HiRes.pixelAddrBlockIncrement
// let cp = pixelsSRGB[pp / 4]
//
// let pa = pixelAddr - HiRes.pixelAddrBlockIncrement * 7 * 20
// let ca = pixelsSRGB[pa / 4]
//
// if cp == ca {
// switch cp {
// case color_blue, color_white, color_green, color_purple, color_orange, color_yellow:
//// pixelsSRGB[pp/4] = color_turquis
//// pixelsSRGB[pa/4] = color_yellow
//
// let c1 = ca & 0x00FFFFFF
// let a = ca >> 24
// let a1 = (a / 6) << 24
// let a2 = a1 * 2
// let a3 = a1 * 3
// let a4 = a1 * 4
//
//// pixelsSRGB[colorAddr + 0] = a4 | c1
//// pixelsSRGB[colorAddr + 1] = a3 | c1
//// pixelsSRGB[colorAddr + 2] = a2 | c1
//// pixelsSRGB[colorAddr + 3] = a1 | c1
//
// pixelsSRGB[colorAddr + 0] = a4 | c1
// pixelsSRGB[colorAddr + 1] = a2 | c1
//
// // let pb = pixelAddr + HiRes.pixelAddrBlockIncrement * 7 * 20
// // let cb = pb / 4
// // pixelsSRGB[cb] = pixelsSRGB[colorAddr]
// default:
// break
// }
//
// }
default: default:
break break
} }
@ -439,6 +486,7 @@ class HiRes: NSView {
if colorAddr >= 2 { if colorAddr >= 2 {
pixelsSRGB[colorAddr - 1] = color_white pixelsSRGB[colorAddr - 1] = color_white
pixelsSRGB[colorAddr - 2] = color_white pixelsSRGB[colorAddr - 2] = color_white
pixelsSRGB[colorAddr - 3] = color_white
} }
// blue expansion // blue expansion
if pixel == 5 { if pixel == 5 {
@ -475,18 +523,21 @@ class HiRes: NSView {
// blue adjustment -- followed by white // blue adjustment -- followed by white
else if (prev == 0x05) && ( else if (prev == 0x05) && (
(pixel == 0x05) || (pixel == 0x05)
(pixel == 0x03) || (pixel == 0x07) // white || (pixel == 0x03)
|| (pixel == 0x07) // white
) { ) {
pixelsSRGB[colorAddr - 0] = color_blue // pixelsSRGB[colorAddr - 0] = color_blue
pixelsSRGB[colorAddr - 1] = color_blue // pixelsSRGB[colorAddr - 1] = color_blue
pixelsSRGB[colorAddr - 2] = color_blue pixelsSRGB[colorAddr - 2] = color_blue // blue color bleed
} }
} }
static let pixelAddrBlockIncrement = 8 * 2 // 2 display pixels per logical pixel static let logicalPixels = 8
static let physicalPixels = 2
static let pixelAddrBlockIncrement = logicalPixels * physicalPixels // 2 display pixels per logical pixel
func RenderColor() { func RenderColor() {
var height = HiRes.PixelHeight var height = HiRes.PixelHeight
@ -601,7 +652,7 @@ class HiRes: NSView {
currentContext?.interpolationQuality = .high // TODO: Make a switch that lets you turn on and off "old monitor effects" currentContext?.interpolationQuality = .high // TODO: Make a switch that lets you turn on and off "old monitor effects"
} }
else { else {
currentContext?.interpolationQuality = .none currentContext?.interpolationQuality = .high // .none
} }
currentContext?.draw(image, in: boundingBox) currentContext?.draw(image, in: boundingBox)
} }