Optimized color management

This commit is contained in:
tudnai 2020-05-04 13:54:04 -07:00
parent 5afcb161b6
commit fd63ce5bca

View File

@ -392,7 +392,8 @@ class HiRes: NSView {
#if HIRESLOW || HIRESLOWCOLOR #if HIRESLOW || HIRESLOWCOLOR
static let ScreenBitmapSize = (PixelWidth * PixelHeight * 4) static let ScreenBitmapSize = (PixelWidth * PixelHeight * 4)
static let context = createBitmapContext(pixelsWide: PixelWidth, PixelHeight) static let context = createBitmapContext(pixelsWide: PixelWidth, PixelHeight)
static let pixels = UnsafeMutableRawBufferPointer(start: context?.data, count: ScreenBitmapSize) // UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: byteCount) static let pixels = UnsafeMutableRawBufferPointer(start: context?.data, count: ScreenBitmapSize)
static var typedPointer = pixels.bindMemory(to: UInt32.self)
#endif #endif
let R = 2 let R = 2
@ -473,29 +474,26 @@ class HiRes: NSView {
#elseif HIRESLOWCOLOR #elseif HIRESLOWCOLOR
let color_black : UInt32 = 0x00000000;
let color_white : UInt32 = 0xFFFFFFFF;
let color_purple : UInt32 = 0xFFBB11EE;
let color_green : UInt32 = 0xFF0BA212;
let color_blue : UInt32 = 0xFF1166EE;
let color_orange : UInt32 = 0xFFEE2211;
func hiresColorPixel ( pixelAddr : Int, pixel : Int, prev : Int ) { func hiresColorPixel ( pixelAddr : Int, pixel : Int, prev : Int ) {
let colorAddr = pixelAddr / 4
switch ( pixel ) { switch ( pixel ) {
case 0x00: // black case 0x00: // black
HiRes.pixels[pixelAddr + R] = 0x00; // HiRes.typedPointer[colorAddr] = color_black;
HiRes.pixels[pixelAddr + G] = 0x00; // HiRes.typedPointer[colorAddr + 1] = color_black;
HiRes.pixels[pixelAddr + B] = 0x00; break
HiRes.pixels[pixelAddr + A] = 0x00;
HiRes.pixels[pixelAddr + 4 + R] = 0x00;
HiRes.pixels[pixelAddr + 4 + G] = 0x00;
HiRes.pixels[pixelAddr + 4 + B] = 0x00;
HiRes.pixels[pixelAddr + 4 + A] = 0x00;
case 0x01: // purple (bits are in reverse!)
HiRes.pixels[pixelAddr + R] = 0xBB;
HiRes.pixels[pixelAddr + G] = 0x11;
HiRes.pixels[pixelAddr + B] = 0xEE;
HiRes.pixels[pixelAddr + A] = 0xFF;
HiRes.pixels[pixelAddr + 4 + R] = 0x00; case 0x01: // purple (bits are in reverse!)
HiRes.pixels[pixelAddr + 4 + G] = 0x00; HiRes.typedPointer[colorAddr] = color_purple;
HiRes.pixels[pixelAddr + 4 + B] = 0x00; // HiRes.typedPointer[colorAddr + 1] = color_black;
HiRes.pixels[pixelAddr + 4 + A] = 0x00;
case 0x02: // green case 0x02: // green
if (prev == 0x02) || if (prev == 0x02) ||
@ -504,131 +502,66 @@ class HiRes: NSView {
(prev == 0x00) || (prev == 0x04) || (prev == 0x00) || (prev == 0x04) ||
(prev == 0x04) (prev == 0x04)
{ {
HiRes.pixels[pixelAddr + R] = 0x08; HiRes.typedPointer[colorAddr] = color_green;
HiRes.pixels[pixelAddr + G] = 0xA2;
HiRes.pixels[pixelAddr + B] = 0x12;
HiRes.pixels[pixelAddr + A] = 0xFF;
}
else {
HiRes.pixels[pixelAddr + R] = 0x00;
HiRes.pixels[pixelAddr + G] = 0x00;
HiRes.pixels[pixelAddr + B] = 0x00;
HiRes.pixels[pixelAddr + A] = 0x00;
} }
// else {
// HiRes.typedPointer[colorAddr] = color_black;
// }
// reducing color bleeding // reducing color bleeding
if (prev == 0x01) || if (prev == 0x01) ||
(prev == 0x05) (prev == 0x05)
{ {
HiRes.pixels[pixelAddr + 4 + R] = 0x00; // HiRes.typedPointer[colorAddr + 1] = color_black;
HiRes.pixels[pixelAddr + 4 + G] = 0x00;
HiRes.pixels[pixelAddr + 4 + B] = 0x00;
HiRes.pixels[pixelAddr + 4 + A] = 0x00;
} }
else { else {
HiRes.pixels[pixelAddr + 4 + R] = 0x08; HiRes.typedPointer[colorAddr + 1] = color_green;
HiRes.pixels[pixelAddr + 4 + G] = 0xA2;
HiRes.pixels[pixelAddr + 4 + B] = 0x12;
HiRes.pixels[pixelAddr + 4 + A] = 0xFF;
} }
case 0x03: // white case 0x03: // white
HiRes.pixels[pixelAddr + R] = 0xFF; HiRes.typedPointer[colorAddr] = color_white;
HiRes.pixels[pixelAddr + G] = 0xFF; HiRes.typedPointer[colorAddr + 1] = color_white;
HiRes.pixels[pixelAddr + B] = 0xFF;
HiRes.pixels[pixelAddr + A] = 0xFF;
HiRes.pixels[pixelAddr + 4 + R] = 0xFF;
HiRes.pixels[pixelAddr + 4 + G] = 0xFF;
HiRes.pixels[pixelAddr + 4 + B] = 0xFF;
HiRes.pixels[pixelAddr + 4 + A] = 0xFF;
case 0x04: // black 2 case 0x04: // black 2
HiRes.pixels[pixelAddr + R] = 0x00; // HiRes.typedPointer[colorAddr] = color_black;
HiRes.pixels[pixelAddr + G] = 0x00; // HiRes.typedPointer[colorAddr + 1] = color_black;
HiRes.pixels[pixelAddr + B] = 0x00; break
HiRes.pixels[pixelAddr + A] = 0x00;
HiRes.pixels[pixelAddr + 4 + R] = 0x00;
HiRes.pixels[pixelAddr + 4 + G] = 0x00;
HiRes.pixels[pixelAddr + 4 + B] = 0x00;
HiRes.pixels[pixelAddr + 4 + A] = 0x00;
case 0x05: // blue case 0x05: // blue
HiRes.pixels[pixelAddr + R] = 0x11; HiRes.typedPointer[colorAddr] = color_blue;
HiRes.pixels[pixelAddr + G] = 0x66; // HiRes.typedPointer[colorAddr + 1] = color_black;
HiRes.pixels[pixelAddr + B] = 0xEE;
HiRes.pixels[pixelAddr + A] = 0xFF;
HiRes.pixels[pixelAddr + 4 + R] = 0x00;
HiRes.pixels[pixelAddr + 4 + G] = 0x00;
HiRes.pixels[pixelAddr + 4 + B] = 0x00;
HiRes.pixels[pixelAddr + 4 + A] = 0x00;
case 0x06: // orange case 0x06: // orange
// do we need to extend the color? // do we need to extend the color?
if (prev == 0x06) || if (prev == 0x06) ||
(prev == 0x03) || (prev == 0x07) (prev == 0x03) || (prev == 0x07)
{ {
HiRes.pixels[pixelAddr + R] = 0xEE; HiRes.typedPointer[colorAddr] = color_orange;
HiRes.pixels[pixelAddr + G] = 0x22;
HiRes.pixels[pixelAddr + B] = 0x11;
HiRes.pixels[pixelAddr + A] = 0xFF;
} }
else { else {
HiRes.pixels[pixelAddr + R] = 0x00; // HiRes.typedPointer[colorAddr] = color_black;
HiRes.pixels[pixelAddr + G] = 0x00;
HiRes.pixels[pixelAddr + B] = 0x00;
HiRes.pixels[pixelAddr + A] = 0x00;
} }
HiRes.pixels[pixelAddr + 4 + R] = 0xEE; HiRes.typedPointer[colorAddr + 1] = color_orange;
HiRes.pixels[pixelAddr + 4 + G] = 0x22;
HiRes.pixels[pixelAddr + 4 + B] = 0x11;
HiRes.pixels[pixelAddr + 4 + A] = 0xFF;
case 0x07: // white 2 case 0x07: // white 2
HiRes.pixels[pixelAddr + R] = 0xFF; HiRes.typedPointer[colorAddr] = color_white;
HiRes.pixels[pixelAddr + G] = 0xFF; HiRes.typedPointer[colorAddr + 1] = color_white;
HiRes.pixels[pixelAddr + B] = 0xFF;
HiRes.pixels[pixelAddr + A] = 0xFF;
HiRes.pixels[pixelAddr + 4 + R] = 0xFF;
HiRes.pixels[pixelAddr + 4 + G] = 0xFF;
HiRes.pixels[pixelAddr + 4 + B] = 0xFF;
HiRes.pixels[pixelAddr + 4 + A] = 0xFF;
default: default:
HiRes.pixels[pixelAddr + R] = 0x00; // HiRes.typedPointer[colorAddr] = color_black;
HiRes.pixels[pixelAddr + G] = 0x00; // HiRes.typedPointer[colorAddr + 1] = color_black;
HiRes.pixels[pixelAddr + B] = 0x00; break
HiRes.pixels[pixelAddr + A] = 0x00;
HiRes.pixels[pixelAddr + 4 + R] = 0x00;
HiRes.pixels[pixelAddr + 4 + G] = 0x00;
HiRes.pixels[pixelAddr + 4 + B] = 0x00;
HiRes.pixels[pixelAddr + 4 + A] = 0x00;
} }
// white adjustment // white adjustment
if ( (prev & 2) == 2 ) && ( (pixel & 1) == 1 ) { if ( (prev & 2) == 2 ) && ( (pixel & 1) == 1 ) {
HiRes.pixels[pixelAddr + R] = 0xFF; HiRes.typedPointer[colorAddr] = color_white;
HiRes.pixels[pixelAddr + G] = 0xFF; HiRes.typedPointer[colorAddr - 1] = color_white;
HiRes.pixels[pixelAddr + B] = 0xFF;
HiRes.pixels[pixelAddr + A] = 0xFF;
HiRes.pixels[pixelAddr - 4 + R] = 0xFF;
HiRes.pixels[pixelAddr - 4 + G] = 0xFF;
HiRes.pixels[pixelAddr - 4 + B] = 0xFF;
HiRes.pixels[pixelAddr - 4 + A] = 0xFF;
// TODO: Need better check if extra green was created // TODO: Need better check if extra green was created
if (HiRes.pixels[pixelAddr - 8 + G] == 0xA2 ) { if (HiRes.pixels[pixelAddr - 8 + G] == 0xA2 ) {
HiRes.pixels[pixelAddr - 8 + R] = 0x00; HiRes.typedPointer[colorAddr - 2] = color_black;
HiRes.pixels[pixelAddr - 8 + G] = 0x00;
HiRes.pixels[pixelAddr - 8 + B] = 0x00;
HiRes.pixels[pixelAddr - 8 + A] = 0x00;
} }
} }
@ -640,10 +573,7 @@ class HiRes: NSView {
) { ) {
// was the previous purple pixel promoted to white or is it still purple? // was the previous purple pixel promoted to white or is it still purple?
if ( HiRes.pixels[pixelAddr - 8 + R] == 0xBB ) { if ( HiRes.pixels[pixelAddr - 8 + R] == 0xBB ) {
HiRes.pixels[pixelAddr - 4 + R] = 0xBB; HiRes.typedPointer[colorAddr - 1] = color_purple;
HiRes.pixels[pixelAddr - 4 + G] = 0x11;
HiRes.pixels[pixelAddr - 4 + B] = 0xEE;
HiRes.pixels[pixelAddr - 4 + A] = 0xFF;
} }
} }
@ -652,10 +582,7 @@ class HiRes: NSView {
(pixel == 0x05) || (pixel == 0x05) ||
(pixel == 0x03) || (pixel == 0x07) (pixel == 0x03) || (pixel == 0x07)
) { ) {
HiRes.pixels[pixelAddr - 4 + R] = 0x11; HiRes.typedPointer[colorAddr - 1] = color_blue;
HiRes.pixels[pixelAddr - 4 + G] = 0x66;
HiRes.pixels[pixelAddr - 4 + B] = 0xEE;
HiRes.pixels[pixelAddr - 4 + A] = 0xFF;
} }
} }
@ -688,12 +615,12 @@ class HiRes: NSView {
var pixelAddr = 0 var pixelAddr = 0
var minX = 9999 // var minX = 9999
var minY = 9999 // var minY = 9999
var maxX = 0 // var maxX = 0
var maxY = 0 // var maxY = 0
//
var x = 0 // var x = 0
var y = 0 var y = 0
HiRes.context?.clear( CGRect(x: 0, y: 0, width: frame.width, height: frame.height) ) HiRes.context?.clear( CGRect(x: 0, y: 0, width: frame.width, height: frame.height) )
@ -767,7 +694,7 @@ class HiRes: NSView {
// } // }
y += 1 y += 1
x = 0 // x = 0
} }
// HiRes.context?.setShouldAntialias(true) // HiRes.context?.setShouldAntialias(true)
@ -790,7 +717,7 @@ class HiRes: NSView {
// refresh the entire screen // refresh the entire screen
let boundingBox = CGRect(x: 0, y: 0, width: frame.width, height: frame.height) let boundingBox = CGRect(x: 0, y: 0, width: frame.width, height: frame.height)
currentContext!.draw (image, in: boundingBox) currentContext!.draw(image, in: boundingBox)
} }
#elseif HIRESDRAWCOLOR #elseif HIRESDRAWCOLOR