mirror of
https://github.com/trudnai/Steve2.git
synced 2024-06-14 00:29:29 +00:00
Optimized color management
This commit is contained in:
parent
5afcb161b6
commit
fd63ce5bca
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user