2016-12-31 09:34:15 +00:00
|
|
|
package com.bytezone.diskbrowser.applefile;
|
|
|
|
|
|
|
|
import java.awt.image.BufferedImage;
|
|
|
|
import java.awt.image.DataBuffer;
|
|
|
|
|
2017-01-08 23:36:10 +00:00
|
|
|
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
|
|
|
|
2016-12-31 09:34:15 +00:00
|
|
|
public class DoubleHiResImage extends HiResImage
|
|
|
|
{
|
2017-01-23 06:56:42 +00:00
|
|
|
private static int[] swap = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 };
|
2017-01-11 06:16:10 +00:00
|
|
|
|
2016-12-31 09:34:15 +00:00
|
|
|
private final byte[] auxBuffer;
|
2017-01-08 23:36:10 +00:00
|
|
|
private DoubleScrunch doubleScrunch;
|
|
|
|
byte[] packedBuffer;
|
2016-12-31 09:34:15 +00:00
|
|
|
|
|
|
|
public DoubleHiResImage (String name, byte[] buffer, byte[] auxBuffer)
|
|
|
|
{
|
|
|
|
super (name, buffer);
|
|
|
|
|
|
|
|
this.auxBuffer = auxBuffer;
|
|
|
|
createImage ();
|
|
|
|
}
|
|
|
|
|
2017-01-08 23:36:10 +00:00
|
|
|
public DoubleHiResImage (String name, byte[] buffer)
|
|
|
|
{
|
|
|
|
super (name, buffer);
|
|
|
|
|
2018-07-23 04:44:16 +00:00
|
|
|
// assert name.endsWith (".PAC") || name.endsWith ("A2FC");
|
2017-01-08 23:36:10 +00:00
|
|
|
|
2017-01-11 06:16:10 +00:00
|
|
|
if (name.endsWith (".PAC"))
|
|
|
|
{
|
|
|
|
packedBuffer = buffer;
|
|
|
|
doubleScrunch = new DoubleScrunch ();
|
|
|
|
doubleScrunch.unscrunch (buffer);
|
|
|
|
auxBuffer = doubleScrunch.memory[0];
|
|
|
|
this.buffer = doubleScrunch.memory[1];
|
|
|
|
}
|
2018-07-23 04:44:16 +00:00
|
|
|
else //if (name.endsWith (".A2FC") || auxType == 0x2000)
|
2017-01-11 06:16:10 +00:00
|
|
|
{
|
|
|
|
auxBuffer = new byte[0x2000];
|
|
|
|
this.buffer = new byte[0x2000];
|
|
|
|
System.arraycopy (buffer, 0, auxBuffer, 0, 0x2000);
|
|
|
|
System.arraycopy (buffer, 0x2000, this.buffer, 0, 0x2000);
|
|
|
|
}
|
2018-07-23 04:44:16 +00:00
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// auxBuffer = null;
|
|
|
|
// }
|
2017-01-08 23:36:10 +00:00
|
|
|
|
|
|
|
createImage ();
|
|
|
|
}
|
|
|
|
|
2016-12-31 09:34:15 +00:00
|
|
|
@Override
|
|
|
|
protected void createMonochromeImage ()
|
|
|
|
{
|
|
|
|
// image will be doubled vertically
|
|
|
|
image = new BufferedImage (560, 192 * 2, BufferedImage.TYPE_BYTE_GRAY);
|
|
|
|
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
|
2017-01-11 06:16:10 +00:00
|
|
|
int ndx = 0;
|
2016-12-31 09:34:15 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
|
|
for (int j = 0; j < 8; j++)
|
|
|
|
for (int k = 0; k < 8; k++)
|
|
|
|
{
|
|
|
|
int base = i * 0x28 + j * 0x80 + k * 0x400;
|
|
|
|
int max = Math.min (base + 40, buffer.length);
|
|
|
|
for (int ptr = base; ptr < max; ptr += 2)
|
|
|
|
{
|
|
|
|
int value = auxBuffer[ptr] & 0x7F | ((buffer[ptr] & 0x7F) << 7)
|
|
|
|
| ((auxBuffer[ptr + 1] & 0x7F) << 14) | ((buffer[ptr + 1] & 0x7F) << 21);
|
|
|
|
for (int px = 0; px < 28; px++)
|
|
|
|
{
|
|
|
|
int val = (value >> px) & 0x01;
|
|
|
|
int pixel = val == 0 ? 0 : 255;
|
2017-01-11 06:16:10 +00:00
|
|
|
dataBuffer.setElem (ndx, pixel);
|
|
|
|
dataBuffer.setElem (ndx + 560, pixel); // repeat pixel one line on
|
|
|
|
++ndx;
|
2016-12-31 09:34:15 +00:00
|
|
|
}
|
|
|
|
}
|
2017-01-11 06:16:10 +00:00
|
|
|
ndx += 560; // skip past repeated line
|
2016-12-31 09:34:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void createColourImage ()
|
|
|
|
{
|
2017-01-14 20:58:07 +00:00
|
|
|
paletteIndex = paletteFactory.getCurrentPaletteIndex ();
|
2017-01-14 01:40:58 +00:00
|
|
|
Palette palette = paletteFactory.getCurrentPalette ();
|
|
|
|
int[] colours = palette.getColours ();
|
2017-01-11 21:26:28 +00:00
|
|
|
|
2016-12-31 09:34:15 +00:00
|
|
|
// image will be doubled horizontally
|
|
|
|
image = new BufferedImage (140 * 2, 192, BufferedImage.TYPE_INT_RGB);
|
|
|
|
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
|
2017-01-11 06:16:10 +00:00
|
|
|
int ndx = 0;
|
2016-12-31 09:34:15 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
|
|
for (int j = 0; j < 8; j++)
|
|
|
|
for (int k = 0; k < 8; k++)
|
|
|
|
{
|
|
|
|
int base = i * 0x28 + j * 0x80 + k * 0x400;
|
|
|
|
int max = Math.min (base + 40, buffer.length);
|
|
|
|
|
|
|
|
for (int ptr = base; ptr < max; ptr += 2)
|
|
|
|
{
|
|
|
|
int value = auxBuffer[ptr] & 0x7F | ((buffer[ptr] & 0x7F) << 7)
|
|
|
|
| ((auxBuffer[ptr + 1] & 0x7F) << 14) | ((buffer[ptr + 1] & 0x7F) << 21);
|
|
|
|
for (int px = 0; px < 28; px += 4)
|
|
|
|
{
|
|
|
|
int val = (value >> px) & 0x0F;
|
2017-01-14 11:11:07 +00:00
|
|
|
int val2 = swap[val];
|
|
|
|
dataBuffer.setElem (ndx++, colours[val2]);
|
|
|
|
dataBuffer.setElem (ndx++, colours[val2]); // repeat pixel
|
2016-12-31 09:34:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-01-08 23:36:10 +00:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getHexDump ()
|
|
|
|
{
|
|
|
|
StringBuilder text = new StringBuilder ();
|
|
|
|
|
|
|
|
if (packedBuffer != null)
|
|
|
|
{
|
|
|
|
text.append ("Packed buffer:\n\n");
|
|
|
|
text.append (HexFormatter.format (packedBuffer));
|
|
|
|
}
|
2017-01-09 09:21:02 +00:00
|
|
|
|
2017-01-08 23:36:10 +00:00
|
|
|
text.append ("\n\nAuxilliary buffer:\n\n");
|
|
|
|
text.append (HexFormatter.format (auxBuffer));
|
2017-01-09 09:21:02 +00:00
|
|
|
|
2017-01-08 23:36:10 +00:00
|
|
|
text.append ("\n\nPrimary buffer:\n\n");
|
|
|
|
text.append (HexFormatter.format (buffer));
|
|
|
|
|
|
|
|
return text.toString ();
|
|
|
|
}
|
2016-12-31 09:34:15 +00:00
|
|
|
}
|