2018-08-18 03:24:22 +00:00
|
|
|
package com.bytezone.diskbrowser.applefile;
|
|
|
|
|
|
|
|
import java.awt.AlphaComposite;
|
2018-08-18 05:12:41 +00:00
|
|
|
import java.awt.Font;
|
2018-08-18 03:24:22 +00:00
|
|
|
import java.awt.Graphics2D;
|
|
|
|
import java.awt.image.BufferedImage;
|
|
|
|
import java.awt.image.DataBuffer;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
2018-08-18 05:12:41 +00:00
|
|
|
import com.bytezone.common.Platform;
|
|
|
|
import com.bytezone.common.Platform.FontType;
|
|
|
|
|
|
|
|
// see graffidisk.v1.0.2mg
|
2018-08-18 03:24:22 +00:00
|
|
|
public class CharacterRom extends AbstractFile
|
|
|
|
{
|
|
|
|
String description;
|
|
|
|
List<Character> characters = new ArrayList<> ();
|
|
|
|
|
|
|
|
public CharacterRom (String name, byte[] buffer)
|
|
|
|
{
|
|
|
|
super (name, buffer);
|
|
|
|
|
|
|
|
description = new String (buffer, 16, 16);
|
|
|
|
|
2018-08-18 05:12:41 +00:00
|
|
|
int sizeX = buffer[5] & 0xFF;
|
|
|
|
int sizeY = buffer[6] & 0xFF;
|
|
|
|
|
2018-08-18 03:24:22 +00:00
|
|
|
int gapX = 4;
|
|
|
|
int gapY = 4;
|
|
|
|
int marginX = 2;
|
|
|
|
int marginY = 2;
|
2018-08-18 05:12:41 +00:00
|
|
|
int heading = 20;
|
2018-08-18 03:24:22 +00:00
|
|
|
|
2018-08-18 05:12:41 +00:00
|
|
|
image = new BufferedImage (8 * (sizeX + gapX), 12 * (sizeY + gapY) + heading,
|
2018-08-18 03:24:22 +00:00
|
|
|
BufferedImage.TYPE_BYTE_GRAY);
|
|
|
|
Graphics2D g2d = image.createGraphics ();
|
|
|
|
g2d.setComposite (AlphaComposite.getInstance (AlphaComposite.SRC_OVER, (float) 1.0));
|
|
|
|
|
|
|
|
int x = marginX;
|
|
|
|
int y = marginY;
|
|
|
|
int count = 0;
|
|
|
|
int ptr = 256;
|
|
|
|
|
2018-08-18 05:12:41 +00:00
|
|
|
Font font = Platform.getFont (FontType.SANS_SERIF, 10);
|
|
|
|
g2d.setFont (font);
|
|
|
|
g2d.drawString (description, x, y + 10);
|
|
|
|
y += heading;
|
|
|
|
|
2018-08-18 03:24:22 +00:00
|
|
|
while (ptr < buffer.length)
|
|
|
|
{
|
|
|
|
Character character = new Character (buffer, ptr);
|
|
|
|
characters.add (character);
|
|
|
|
ptr += 8;
|
|
|
|
|
|
|
|
g2d.drawImage (character.image, x, y, null);
|
|
|
|
x += sizeX + gapX;
|
|
|
|
if (++count % 8 == 0)
|
|
|
|
{
|
|
|
|
x = marginX;
|
|
|
|
y += sizeY + gapY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
g2d.dispose ();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getText ()
|
|
|
|
{
|
|
|
|
StringBuilder text = new StringBuilder (description + "\n\n");
|
|
|
|
for (int i = 256; i < buffer.length; i += 8)
|
|
|
|
{
|
|
|
|
for (int line = 0; line < 8; line++)
|
|
|
|
{
|
|
|
|
int value = buffer[i + line] & 0xFF;
|
|
|
|
for (int bit = 0; bit < 8; bit++)
|
|
|
|
{
|
|
|
|
text.append ((value & 0x80) != 0 ? "X" : ".");
|
|
|
|
value <<= 1;
|
|
|
|
}
|
|
|
|
text.append ("\n");
|
|
|
|
}
|
|
|
|
text.append ("\n");
|
|
|
|
}
|
|
|
|
return text.toString ();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean isRom (byte[] buffer)
|
|
|
|
{
|
|
|
|
if (buffer.length < 4)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// no idea what these mean
|
|
|
|
// BD 41 53 10 A0 07 08
|
|
|
|
return buffer[0] == (byte) 0xBD && buffer[1] == (byte) 0x41
|
|
|
|
&& buffer[2] == (byte) 0x53 && buffer[3] == (byte) 0x10;
|
|
|
|
}
|
|
|
|
|
|
|
|
class Character
|
|
|
|
{
|
|
|
|
private final BufferedImage image;
|
|
|
|
|
|
|
|
public Character (byte[] buffer, int ptr)
|
|
|
|
{
|
|
|
|
// draw the image
|
|
|
|
image = new BufferedImage (7, 8, BufferedImage.TYPE_BYTE_GRAY);
|
|
|
|
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
|
|
|
|
int element = 0;
|
|
|
|
|
|
|
|
for (int line = 0; line < 8; line++)
|
|
|
|
{
|
|
|
|
int value = buffer[ptr++] & 0xFF;
|
|
|
|
for (int bit = 0; bit < 7; bit++)
|
|
|
|
{
|
|
|
|
dataBuffer.setElem (element++, (value & 0x80) != 0 ? 255 : 0);
|
|
|
|
value <<= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|