This commit is contained in:
Denis Molony 2017-01-11 17:16:10 +11:00
parent ee3b38094b
commit 152ac38ac8
2 changed files with 92 additions and 18 deletions

View File

@ -44,9 +44,9 @@ public class DoubleHiResImage extends HiResImage
private static final int AQUA = 0x44FF99; private static final int AQUA = 0x44FF99;
private static final int WHITE = 0xFFFFFF; private static final int WHITE = 0xFFFFFF;
private static int[] palette = // private static int[] palette =
{ BLACK, MAGENTA, DARK_BLUE, PURPLE, DARK_GREEN, GRAY1, MEDIUM_BLUE, LIGHT_BLUE, // { BLACK, MAGENTA, DARK_BLUE, PURPLE, DARK_GREEN, GRAY1, MEDIUM_BLUE, LIGHT_BLUE,
BROWN, ORANGE, GRAY2, PINK, GREEN, YELLOW, AQUA, WHITE }; // BROWN, ORANGE, GRAY2, PINK, GREEN, YELLOW, AQUA, WHITE };
// private static final int BLACK = 0x000000; // private static final int BLACK = 0x000000;
// private static final int MAGENTA = 0x722640; // private static final int MAGENTA = 0x722640;
@ -68,9 +68,64 @@ public class DoubleHiResImage extends HiResImage
// { BLACK, MAGENTA, DARK_BLUE, PURPLE, DARK_GREEN, GRAY, MEDIUM_BLUE, LIGHT_BLUE, // { BLACK, MAGENTA, DARK_BLUE, PURPLE, DARK_GREEN, GRAY, MEDIUM_BLUE, LIGHT_BLUE,
// BROWN, ORANGE, GRAY, PINK, GREEN, YELLOW, AQUA, WHITE }; // BROWN, ORANGE, GRAY, PINK, GREEN, YELLOW, AQUA, WHITE };
private static int[][] palette2 =
{ { 0x000000, 0xDD0033, 0x885500, 0xFF6600, 0x007722, 0x555555, 0x11DD00, 0xFFFF00,
0x000099, 0xDD22DD, 0xAAAAAA, 0xFF9988, 0x2222FF, 0x66AAFF, 0x44FF99,
0xFFFFFF },
{//
rgb (0, 0, 0), // black
rgb (157, 9, 102), // red
rgb (42, 42, 229), // dk blue
rgb (199, 52, 255), // purple
rgb (0, 118, 26), // dk green
rgb (128, 128, 128), // gray
rgb (13, 161, 255), // med blue
rgb (170, 170, 255), // lt blue
rgb (85, 85, 0), // brown
rgb (242, 94, 0), // orange
rgb (192, 192, 192), // grey
rgb (255, 137, 229), // pink
rgb (56, 203, 0), // lt green
rgb (213, 213, 26), // yellow
rgb (98, 246, 153), // aqua
rgb (255, 255, 255) // white
}, //
{ 0x000000, 0x722640, 0x40337F, 0xE434FE, 0x0E5940, 0x808080, 0x1B9AEF, 0xBFB3FF,
0x404C00, 0xE46501, 0x808080, 0xF1A6BF, 0x1BCB01, 0xBFCC80, 0x8DD9BF,
0xFFFFFF } };
/*-
* 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 final byte[] auxBuffer;
private DoubleScrunch doubleScrunch; private DoubleScrunch doubleScrunch;
byte[] packedBuffer; byte[] packedBuffer;
private final int paletteIndex = 2;
public DoubleHiResImage (String name, byte[] buffer, byte[] auxBuffer) public DoubleHiResImage (String name, byte[] buffer, byte[] auxBuffer)
{ {
@ -84,13 +139,27 @@ public class DoubleHiResImage extends HiResImage
{ {
super (name, buffer); super (name, buffer);
assert name.endsWith (".PAC"); assert name.endsWith (".PAC") || name.endsWith ("A2FC");
if (name.endsWith (".PAC"))
{
packedBuffer = buffer; packedBuffer = buffer;
doubleScrunch = new DoubleScrunch (); doubleScrunch = new DoubleScrunch ();
doubleScrunch.unscrunch (buffer); doubleScrunch.unscrunch (buffer);
auxBuffer = doubleScrunch.memory[0]; auxBuffer = doubleScrunch.memory[0];
this.buffer = doubleScrunch.memory[1]; this.buffer = doubleScrunch.memory[1];
}
else if (name.endsWith (".A2FC"))
{
auxBuffer = new byte[0x2000];
this.buffer = new byte[0x2000];
System.arraycopy (buffer, 0, auxBuffer, 0, 0x2000);
System.arraycopy (buffer, 0x2000, this.buffer, 0, 0x2000);
}
else
{
auxBuffer = null;
}
createImage (); createImage ();
} }
@ -101,7 +170,7 @@ public class DoubleHiResImage extends HiResImage
// image will be doubled vertically // image will be doubled vertically
image = new BufferedImage (560, 192 * 2, BufferedImage.TYPE_BYTE_GRAY); image = new BufferedImage (560, 192 * 2, BufferedImage.TYPE_BYTE_GRAY);
DataBuffer dataBuffer = image.getRaster ().getDataBuffer (); DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
int element = 0; int ndx = 0;
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
@ -117,12 +186,12 @@ public class DoubleHiResImage extends HiResImage
{ {
int val = (value >> px) & 0x01; int val = (value >> px) & 0x01;
int pixel = val == 0 ? 0 : 255; int pixel = val == 0 ? 0 : 255;
dataBuffer.setElem (element, pixel); dataBuffer.setElem (ndx, pixel);
dataBuffer.setElem (element + 560, pixel); // repeat pixel one line on dataBuffer.setElem (ndx + 560, pixel); // repeat pixel one line on
++element; ++ndx;
} }
} }
element += 560; // skip past repeated line ndx += 560; // skip past repeated line
} }
} }
@ -132,7 +201,7 @@ public class DoubleHiResImage extends HiResImage
// image will be doubled horizontally // image will be doubled horizontally
image = new BufferedImage (140 * 2, 192, BufferedImage.TYPE_INT_RGB); image = new BufferedImage (140 * 2, 192, BufferedImage.TYPE_INT_RGB);
DataBuffer dataBuffer = image.getRaster ().getDataBuffer (); DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
int element = 0; int ndx = 0;
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
@ -148,8 +217,8 @@ public class DoubleHiResImage extends HiResImage
for (int px = 0; px < 28; px += 4) for (int px = 0; px < 28; px += 4)
{ {
int val = (value >> px) & 0x0F; int val = (value >> px) & 0x0F;
dataBuffer.setElem (element++, palette[val]); dataBuffer.setElem (ndx++, palette2[paletteIndex][val]);
dataBuffer.setElem (element++, palette[val]); // repeat pixel dataBuffer.setElem (ndx++, palette2[paletteIndex][val]); // repeat pixel
} }
} }
} }
@ -174,4 +243,9 @@ public class DoubleHiResImage extends HiResImage
return text.toString (); return text.toString ();
} }
private static int rgb (int red, int green, int blue)
{
return red << 16 | green << 8 | blue;
}
} }

View File

@ -275,7 +275,7 @@ class FileEntry extends CatalogEntry implements ProdosConstants
else else
file = new DoubleHiResImage (name, exactBuffer, link.getBuffer ()); file = new DoubleHiResImage (name, exactBuffer, link.getBuffer ());
} }
else if (name.endsWith (".PAC")) else if (name.endsWith (".PAC") || name.endsWith (".A2FC"))
file = new DoubleHiResImage (name, exactBuffer); file = new DoubleHiResImage (name, exactBuffer);
else if ((endOfFile == 0x1FF8 || endOfFile == 0x1FFF || endOfFile == 0x2000 else if ((endOfFile == 0x1FF8 || endOfFile == 0x1FFF || endOfFile == 0x2000
|| endOfFile == 0x4000) || endOfFile == 0x4000)