dmolony-DiskBrowser/src/com/bytezone/diskbrowser/applefile/DoubleHiResImage.java

145 lines
4.9 KiB
Java

package com.bytezone.diskbrowser.applefile;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import com.bytezone.diskbrowser.utilities.HexFormatter;
// -----------------------------------------------------------------------------------//
public class DoubleHiResImage extends HiResImage
// -----------------------------------------------------------------------------------//
{
private static int[] swap = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 };
private final byte[] auxBuffer;
private DoubleScrunch doubleScrunch;
byte[] packedBuffer;
// ---------------------------------------------------------------------------------//
public DoubleHiResImage (String name, byte[] buffer, byte[] auxBuffer)
// ---------------------------------------------------------------------------------//
{
super (name, buffer);
this.auxBuffer = auxBuffer;
createImage ();
}
// ---------------------------------------------------------------------------------//
public DoubleHiResImage (String name, byte[] buffer)
// ---------------------------------------------------------------------------------//
{
super (name, buffer);
if (name.endsWith (".PAC"))
{
packedBuffer = buffer;
doubleScrunch = new DoubleScrunch (buffer);
auxBuffer = doubleScrunch.memory[0];
this.buffer = doubleScrunch.memory[1];
}
else
{
auxBuffer = new byte[0x2000];
this.buffer = new byte[0x2000];
System.arraycopy (buffer, 0, auxBuffer, 0, 0x2000);
System.arraycopy (buffer, 0x2000, this.buffer, 0, 0x2000);
}
createImage ();
}
// ---------------------------------------------------------------------------------//
@Override
protected void createMonochromeImage ()
// ---------------------------------------------------------------------------------//
{
// image will be doubled vertically
int WIDTH = 280 * 2;
int HEIGHT = 192 * 2;
image = new BufferedImage (WIDTH, HEIGHT, BufferedImage.TYPE_BYTE_GRAY);
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
int ndx = 0;
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;
dataBuffer.setElem (ndx, pixel);
dataBuffer.setElem (ndx + WIDTH, pixel); // repeat pixel one line on
++ndx;
}
}
ndx += WIDTH; // skip past repeated line
}
}
// ---------------------------------------------------------------------------------//
@Override
protected void createColourImage ()
// ---------------------------------------------------------------------------------//
{
paletteIndex = paletteFactory.getCurrentPaletteIndex ();
Palette palette = paletteFactory.getCurrentPalette ();
int[] colours = palette.getColours ();
// image will be doubled horizontally
image = new BufferedImage (140 * 2, 192, BufferedImage.TYPE_INT_RGB);
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
int ndx = 0;
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;
int val2 = swap[val];
dataBuffer.setElem (ndx++, colours[val2]);
dataBuffer.setElem (ndx++, colours[val2]); // repeat pixel
}
}
}
}
// ---------------------------------------------------------------------------------//
@Override
public String getHexDump ()
// ---------------------------------------------------------------------------------//
{
StringBuilder text = new StringBuilder ();
if (packedBuffer != null)
{
text.append ("Packed buffer:\n\n");
text.append (HexFormatter.format (packedBuffer));
}
text.append ("\n\nAuxilliary buffer:\n\n");
text.append (HexFormatter.format (auxBuffer));
text.append ("\n\nPrimary buffer:\n\n");
text.append (HexFormatter.format (buffer));
return text.toString ();
}
}