From 263b687559e2a776dd44023507072898be9b6aee Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Fri, 13 Jan 2017 09:11:05 +1100 Subject: [PATCH] HGR using palette --- .../applefile/DoubleHiResImage.java | 207 +----------------- .../diskbrowser/applefile/HiResImage.java | 177 +++++++++++++++ .../applefile/OriginalHiResImage.java | 16 +- 3 files changed, 189 insertions(+), 211 deletions(-) diff --git a/src/com/bytezone/diskbrowser/applefile/DoubleHiResImage.java b/src/com/bytezone/diskbrowser/applefile/DoubleHiResImage.java index f4a962e..22dd0ba 100644 --- a/src/com/bytezone/diskbrowser/applefile/DoubleHiResImage.java +++ b/src/com/bytezone/diskbrowser/applefile/DoubleHiResImage.java @@ -1,5 +1,7 @@ package com.bytezone.diskbrowser.applefile; +import static com.bytezone.diskbrowser.applefile.HiResImage.palette; + import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; @@ -7,187 +9,6 @@ import com.bytezone.diskbrowser.utilities.HexFormatter; public class DoubleHiResImage extends HiResImage { - // private static final int MAGENTA = 0xFF00FF; - // private static final int BROWN = 0x994C00; - // private static final int ORANGE = 0xFF9933; - // private static final int DARK_GREEN = 0x006600; - // private static final int GRAY = 0xA0A0A0; - // private static final int GREEN = 0x00CC00; - // private static final int YELLOW = 0xFFFF33; - // private static final int DARK_BLUE = 0x0066CC; - // private static final int PURPLE = 0xCC00CC; - // private static final int PINK = 0xFFCCE5; - // private static final int MEDIUM_BLUE = 0x3399FF; - // private static final int LIGHT_BLUE = 0x99CCFF; - // private static final int AQUA = 0x99FFFF; - - // private static final int MAGENTA = 0xDD0033; - // private static final int BROWN = 0x885500; - // private static final int ORANGE = 0xFF6600; - // private static final int DARK_GREEN = 0x007722; - // private static final int GRAY1 = 0x555555; - // private static final int GREEN = 0x11DD00; - // private static final int YELLOW = 0xFFFF00; - // private static final int DARK_BLUE = 0x000099; - // private static final int PURPLE = 0xDD22DD; - // private static final int GRAY2 = 0xAAAAAA; - // private static final int PINK = 0xFF9988; - // private static final int MEDIUM_BLUE = 0x2222FF; - // private static final int LIGHT_BLUE = 0x66AAFF; - // private static final int AQUA = 0x44FF99; - - // private static final int MAGENTA = 0x722640; - // private static final int DARK_BLUE = 0x40337F; - // private static final int PURPLE = 0xE434FE; - // private static final int DARK_GREEN = 0x0E5940; - // private static final int GRAY = 0x808080; - // private static final int MEDIUM_BLUE = 0x1B9AEF; - // private static final int LIGHT_BLUE = 0xBFB3FF; - // private static final int BROWN = 0x404C00; - // private static final int ORANGE = 0xE46501; - // private static final int PINK = 0xF1A6BF; - // private static final int GREEN = 0x1BCB01; - // private static final int YELLOW = 0xBFCC80; - // private static final int AQUA = 0x8DD9BF; - - private static int[][] // - palette = { - // my preferences - { 0x000000, // 0 black A - 0xFF0000, // 1 red C - 0xA52A2A, // 2 brown E (8) - 0xFFA500, // 3 orange G (9) - 0x008000, // 4 dark green I - 0x808080, // 5 grey1 K - 0x90EE90, // 6 light green M (C) - 0xFFFF00, // 7 yellow O (D) - 0x00008B, // 8 dark blue B (2) - 0x800080, // 9 purple D (3) - 0xC0C0C0, // A grey2 F - 0xFFC0CB, // B pink H - 0x00BFFF, // C med blue J (6) - 0x87CEFA, // D light blue L (7) - 0x00FFFF, // E aqua N - 0xFFFFFF // F white P - }, - // Virtual II - { 0x000000, // 0 black - 0xDD0033, // 1 magenta - 0x885500, // 2 brown (8) - 0xFF6600, // 3 orange (9) - 0x007722, // 4 dark green - 0x555555, // 5 grey1 - 0x11DD00, // 6 light green (C) - 0xFFFF00, // 7 yellow (D) - 0x000099, // 8 dark blue (2) - 0xDD22DD, // 9 purple (3) - 0xAAAAAA, // A grey2 - 0xFF9988, // B pink - 0x2222FF, // C med blue (6) - 0x66AAFF, // D light blue (7) - 0x44FF99, // E aqua - 0xFFFFFF // F white - }, - // Bill Buckels - { 0x000000, // 0 black - 0x9D0966, // 1 red - 0x555500, // 2 brown - 0xF25E00, // 3 orange - 0x00761A, // 4 dk green - 0x808080, // 5 gray - 0x38CB00, // 6 lt green - 0xD5D51A, // 7 yellow - 0x2A2AE5, // 8 dk blue - 0xC734FF, // 9 purple - 0xC0C0C0, // A grey - 0xFF89E5, // B pink - 0x0DA1FF, // C med blue - 0xAAAAFF, // D lt blue - 0x62F699, // E aqua - 0xFFFFFF // F white - }, - // no idea - green beagle - { 0x000000, // 0 black - 0x722640, // 1 magenta - 0x404C00, // 2 dark green - 0xE46501, // 3 orange - 0x0E5940, // 4 dark green - 0x808080, // 5 grey - 0x1B9AEF, // 6 blue - 0xBFB3FF, // 7 lilac - 0x40337F, // 8 dark purple - 0xE434FE, // 9 mauve - 0x808080, // A dark grey - 0xF1A6BF, // B pink - 0x1BCB01, // C bright green - 0xBFCC80, // D light green - 0x8DD9BF, // E green - 0xFFFFFF // F white - }, - // Authentic (MP) - { 0x000000, // black - 0xD00030, // magenta - 0x805000, // brown - 0xF06000, // orange - 0x007020, // dark green - 0x505050, // grey1 - 0x10D000, // light green - 0xF0F000, // yellow - 0x000090, // dark blue - 0xD020D0, // purple - 0xA0A0A0, // grey2 - 0xF09080, // pink - 0x2020F0, // med blue - 0x60A0F0, // light blue - 0x44FF99, // aqua - 0xFFFFFF // white - }, - // NTSC Corrected (MP) - { 0x000000, // black - 0x901740, // magenta - 0x405400, // brown - 0xD06A1A, // orange - 0x006940, // dark green - 0x808080, // grey1 - 0x2FBC1A, // light green - 0xBFD35A, // yellow - 0x402CA5, // dark blue - 0xD043E5, // purple - 0x808080, // grey2 - 0xFF96BF, // pink - 0x2F95E5, // med blue - 0xBFABFF, // light blue - 0x6FE8BF, // aqua - 0xFFFFFF // white - }, }; - - /*- - * Michael Pohoreski - The Apple II Forever Anthology - - @reference: Technote tn-iigs-063 “Master Color Values” - Color Register Values - Color Reg LR HR DHR Master Authentic Tweaked NTSC - Name # # # Value Corrected - ----------------------------------------------------------------------------- - Black 0 0 0,4 0 $0000 (00,00,00) (00,00,00) 00,00,00 - (Magenta) Deep Red 1 1 1 $0D03 (D0,00,30) (D0,00,30) 90,17,40 - Dark Blue 2 2 8 $0009 (00,00,90) (00,00,80) 40,2C,A5 - (Violet) Purple 3 3 2 9 $0D2D (D0,20,D0) (FF,00,FF) D0,43,E5 - Dark Green 4 4 4 $0072 (00,70,20) (00,80,00) 00,69,40 - (Gray 1) Dark Gray 5 5 5 $0555 (50,50,50) (80,80,80) 80,80,80 - (Blue) Medium Blue 6 6 6 C $022F (20,20,F0) (00,00,FF) 2F,95,E5 - (Cyan) Light Blue 7 7 D $06AF (60,A0,F0) (60,A0,FF) BF,AB,FF - Brown 8 8 2 $0850 (80,50,00) (80,50,00) 40,54,00 - Orange 9 9 5 3 $0F60 (F0,60,00) (FF,80,00) D0,6A,1A - (Gray 2) Light Gray A A A $0AAA (A0,A0,A0) (C0,C0,C0) 80,80,80 - Pink B B B $0F98 (F0,90,80) (FF,90,80) FF,96,BF - (Green) Light Green C C 1 6 $01D0 (10,D0,00) (00,FF,00) 2F,BC,1A - Yellow D D 7 $0FF0 (F0,F0,00) (FF,FF,00) BF,D3,5A - (Aqua) Aquamarine E E E $04F9 (40,F0,90) (40,FF,90) 6F,E8,BF - White F F 3,7 F $0FFF (F0,F0,F0) (FF,FF,FF) FF,FF,FF - Legend: - LR: Lo-Res HR: Hi-Res DHR: Double Hi-Res - */ private final byte[] auxBuffer; private DoubleScrunch doubleScrunch; @@ -313,28 +134,4 @@ public class DoubleHiResImage extends HiResImage return text.toString (); } - - private void switchColours () - { - for (int i = 0; i < palette.length; i++) - { - for (int c = 2; c <= 6; c += 4) - { - int temp = palette[i][c]; - palette[i][c] = palette[i][c + 6]; - palette[i][c + 6] = temp; - - temp = palette[i][c + 1]; - palette[i][c + 1] = palette[i][c + 7]; - palette[i][c + 7] = temp; - } - } - } - - private static int rgb (int red, int green, int blue) - { - System.out.printf ("%3d %3d %3d = 0x%06X%n", red, green, blue, - (red << 16 | green << 8 | blue)); - return red << 16 | green << 8 | blue; - } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/applefile/HiResImage.java b/src/com/bytezone/diskbrowser/applefile/HiResImage.java index 7666575..b2d8a23 100644 --- a/src/com/bytezone/diskbrowser/applefile/HiResImage.java +++ b/src/com/bytezone/diskbrowser/applefile/HiResImage.java @@ -12,6 +12,162 @@ import com.bytezone.diskbrowser.utilities.HexFormatter; public abstract class HiResImage extends AbstractFile { + protected static int[][] // + palette = { + // my preferences + { 0x000000, // 0 black A + 0xFF0000, // 1 red C + 0xA52A2A, // 2 brown E (8) + 0xFFA500, // 3 orange G (9) + 0x008000, // 4 dark green I + 0x808080, // 5 grey1 K + 0x90EE90, // 6 light green M (C) + 0xFFFF00, // 7 yellow O (D) + 0x00008B, // 8 dark blue B (2) + 0x800080, // 9 purple D (3) + 0xC0C0C0, // A grey2 F + 0xFFC0CB, // B pink H + 0x00BFFF, // C med blue J (6) + 0x87CEFA, // D light blue L (7) + 0x00FFFF, // E aqua N + 0xFFFFFF // F white P + }, + // Virtual II + { 0x000000, // 0 black + 0xDD0033, // 1 magenta + 0x885500, // 2 brown (8) + 0xFF6600, // 3 orange (9) + 0x007722, // 4 dark green + 0x555555, // 5 grey1 + 0x11DD00, // 6 light green (C) + 0xFFFF00, // 7 yellow (D) + 0x000099, // 8 dark blue (2) + 0xDD22DD, // 9 purple (3) + 0xAAAAAA, // A grey2 + 0xFF9988, // B pink + 0x2222FF, // C med blue (6) + 0x66AAFF, // D light blue (7) + 0x44FF99, // E aqua + 0xFFFFFF // F white + }, + // Bill Buckels + { 0x000000, // 0 black + 0x9D0966, // 1 red + 0x555500, // 2 brown + 0xF25E00, // 3 orange + 0x00761A, // 4 dk green + 0x808080, // 5 gray + 0x38CB00, // 6 lt green + 0xD5D51A, // 7 yellow + 0x2A2AE5, // 8 dk blue + 0xC734FF, // 9 purple + 0xC0C0C0, // A grey + 0xFF89E5, // B pink + 0x0DA1FF, // C med blue + 0xAAAAFF, // D lt blue + 0x62F699, // E aqua + 0xFFFFFF // F white + }, + // Kegs (BB) + { rgb (0, 0, 0), // black */ + rgb (221, 0, 51), // red */ + rgb (136, 85, 34), // brown */ + rgb (255, 102, 0), // orange */ + rgb (0, 119, 0), // dk green */ + rgb (85, 85, 85), // gray */ + rgb (0, 221, 0), // lt green */ + rgb (255, 255, 0), // yellow */ + rgb (0, 0, 153), // dk blue */ + rgb (221, 0, 221), // purple */ + rgb (170, 170, 170), // grey */ + rgb (255, 153, 136), // pink */ + rgb (34, 34, 255), // med blue */ + rgb (102, 170, 255), // lt blue */ + rgb (0, 255, 153), // aqua */ + rgb (255, 255, 255) // white + }, + // Authentic (MP) + { 0x000000, // black + 0xD00030, // magenta + 0x805000, // brown + 0xF06000, // orange + 0x007020, // dark green + 0x505050, // grey1 + 0x10D000, // light green + 0xF0F000, // yellow + 0x000090, // dark blue + 0xD020D0, // purple + 0xA0A0A0, // grey2 + 0xF09080, // pink + 0x2020F0, // med blue + 0x60A0F0, // light blue + 0x40F090, // aqua + 0xFFFFFF // white + }, + // Tweaked (MP) + { 0x000000, // black + 0xD00030, // magenta + 0x805000, // brown + 0xFF8000, // orange + 0x008000, // dark green + 0x808080, // grey1 + 0x00FF00, // light green + 0xFFFF00, // yellow + 0x000080, // dark blue + 0xFF00FF, // purple + 0xC0C0C0, // grey2 + 0xFF9080, // pink + 0x0000FF, // med blue + 0x60A0FF, // light blue + 0x40FF90, // aqua + 0xFFFFFF // white + }, + // NTSC Corrected (MP) + { 0x000000, // black + 0x901740, // magenta + 0x405400, // brown + 0xD06A1A, // orange + 0x006940, // dark green + 0x808080, // grey1 + 0x2FBC1A, // light green + 0xBFD35A, // yellow + 0x402CA5, // dark blue + 0xD043E5, // purple + 0x808080, // grey2 + 0xFF96BF, // pink + 0x2F95E5, // med blue + 0xBFABFF, // light blue + 0x6FE8BF, // aqua + 0xFFFFFF // white + }, }; + + /*- + * Michael Pohoreski - The Apple II Forever Anthology + + @reference: Technote tn-iigs-063 “Master Color Values” + Color Register Values + Color Reg LR HR DHR Master Authentic Tweaked NTSC + Name # # # Value Corrected + ----------------------------------------------------------------------------- + Black 0 0 0,4 0 $0000 (00,00,00) (00,00,00) 00,00,00 + (Magenta) Deep Red 1 1 1 $0D03 (D0,00,30) (D0,00,30) 90,17,40 + Dark Blue 2 2 8 $0009 (00,00,90) (00,00,80) 40,2C,A5 + (Violet) Purple 3 3 2 9 $0D2D (D0,20,D0) (FF,00,FF) D0,43,E5 + Dark Green 4 4 4 $0072 (00,70,20) (00,80,00) 00,69,40 + (Gray 1) Dark Gray 5 5 5 $0555 (50,50,50) (80,80,80) 80,80,80 + (Blue) Medium Blue 6 6 6 C $022F (20,20,F0) (00,00,FF) 2F,95,E5 + (Cyan) Light Blue 7 7 D $06AF (60,A0,F0) (60,A0,FF) BF,AB,FF + Brown 8 8 2 $0850 (80,50,00) (80,50,00) 40,54,00 + Orange 9 9 5 3 $0F60 (F0,60,00) (FF,80,00) D0,6A,1A + (Gray 2) Light Gray A A A $0AAA (A0,A0,A0) (C0,C0,C0) 80,80,80 + Pink B B B $0F98 (F0,90,80) (FF,90,80) FF,96,BF + (Green) Light Green C C 1 6 $01D0 (10,D0,00) (00,FF,00) 2F,BC,1A + Yellow D D 7 $0FF0 (F0,F0,00) (FF,FF,00) BF,D3,5A + (Aqua) Aquamarine E E E $04F9 (40,F0,90) (40,FF,90) 6F,E8,BF + White F F 3,7 F $0FFF (F0,F0,F0) (FF,FF,FF) FF,FF,FF + Legend: + LR: Lo-Res HR: Hi-Res DHR: Double Hi-Res + */ private static final byte[] pngHeader = { (byte) 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; @@ -320,4 +476,25 @@ public abstract class HiResImage extends AbstractFile return true; } + + // switch between lo-res and DHR indexing + private void switchColours () + { + int[] tbl = { 2, 3, 6, 7 }; + for (int i = 0; i < palette.length; i++) + for (int j = 0; j < tbl.length; j++) + { + int c = tbl[j]; + int temp = palette[i][c]; + palette[i][c] = palette[i][c + 6]; + palette[i][c + 6] = temp; + } + } + + private static int rgb (int red, int green, int blue) + { + System.out.printf ("%3d %3d %3d = 0x%06X%n", red, green, blue, + (red << 16 | green << 8 | blue)); + return red << 16 | green << 8 | blue; + } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/applefile/OriginalHiResImage.java b/src/com/bytezone/diskbrowser/applefile/OriginalHiResImage.java index 689a5f8..948f678 100755 --- a/src/com/bytezone/diskbrowser/applefile/OriginalHiResImage.java +++ b/src/com/bytezone/diskbrowser/applefile/OriginalHiResImage.java @@ -7,11 +7,12 @@ public class OriginalHiResImage extends HiResImage { private static final int WHITE = 0xFFFFFF; private static final int BLACK = 0x000000; - private static final int RED = 0xFF0000; - private static final int GREEN = 0x00CC00; - private static final int BLUE = 0x0000FF; - private static final int VIOLET = 0xBB66FF; - private static final int[][] palette = { { VIOLET, GREEN }, { BLUE, RED } }; + // private static final int RED = 0xFF0000; + // private static final int GREEN = 0x00CC00; + // private static final int BLUE = 0x0000FF; + // private static final int VIOLET = 0xBB66FF; + // private static final int[][] palette = { { VIOLET, GREEN }, { BLUE, RED } }; + private static final int[][] paletteTable = { { 9, 6 }, { 12, 3 } }; private static boolean matchColourBits = false; @@ -88,6 +89,8 @@ public class OriginalHiResImage extends HiResImage private void fillLine (int base) { + int paletteNdx = paletteIndex % palette.length; + int max = Math.min (base + 40, buffer.length); int linePtr = 0; assert colourBits != null; @@ -103,7 +106,8 @@ public class OriginalHiResImage extends HiResImage int val = (value >> px) & 0x01; // get the next pixel to draw int column = (ptr + px) % 2; // is it in an odd or even column? line[linePtr++] = val == 0 ? 0 : // black pixel - palette[colourBit][column]; // coloured pixel - use lookup table + // palette[colourBit][column]; // coloured pixel - use lookup table + palette[paletteNdx][paletteTable[colourBit][column]]; // coloured pixel - use lookup table } }