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

146 lines
3.6 KiB
Java
Raw Normal View History

2016-12-17 08:34:47 +00:00
package com.bytezone.diskbrowser.applefile;
2016-12-22 22:41:28 +00:00
import java.awt.AlphaComposite;
2019-11-01 03:51:39 +00:00
import java.awt.Color;
2016-12-22 22:41:28 +00:00
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
2016-12-17 08:34:47 +00:00
import java.util.ArrayList;
import java.util.List;
public class FontFile extends AbstractFile
{
2019-11-01 03:30:19 +00:00
private static final int borderX = 3;
private static final int borderY = 3;
private static final int gapX = 3;
private static final int gapY = 3;
private static final int charsX = 8;
private static final int charsY = 12;
private static final int sizeX = 7;
private static final int sizeY = 8;
private static final int charBytes = 8;
2016-12-17 08:34:47 +00:00
List<Character> characters = new ArrayList<Character> ();
public FontFile (String name, byte[] buffer)
{
super (name, buffer);
2019-11-01 03:30:19 +00:00
image = new BufferedImage ( //
dimension (charsX, borderX, sizeX, gapX), //
dimension (charsY, borderY, sizeY, gapY), //
BufferedImage.TYPE_BYTE_GRAY);
2016-12-22 22:41:28 +00:00
Graphics2D g2d = image.createGraphics ();
g2d.setComposite (AlphaComposite.getInstance (AlphaComposite.SRC_OVER, (float) 1.0));
2019-11-01 03:51:39 +00:00
if (false) // show gaps around the glyphs
{
g2d.setColor (new Color (245, 245, 245));
g2d.fillRect (0, 0, image.getWidth (), image.getHeight ());
}
2016-12-17 08:34:47 +00:00
int ptr = 0;
2019-11-01 03:30:19 +00:00
int x = borderX;
int y = borderY;
2016-12-22 22:41:28 +00:00
int count = 0;
2016-12-17 08:34:47 +00:00
while (ptr < buffer.length)
{
Character c = new Character (buffer, ptr);
characters.add (c);
2019-11-01 03:30:19 +00:00
ptr += charBytes;
2016-12-22 22:41:28 +00:00
g2d.drawImage (c.image, x, y, null);
2019-11-01 03:30:19 +00:00
if (++count % charBytes == 0)
2016-12-22 22:41:28 +00:00
{
2019-11-01 03:30:19 +00:00
x = borderX;
y += sizeY + gapY;
2016-12-22 22:41:28 +00:00
}
2019-11-01 03:30:19 +00:00
else
x += sizeX + gapX;
2016-12-17 08:34:47 +00:00
}
2019-11-01 03:30:19 +00:00
2016-12-22 22:41:28 +00:00
g2d.dispose ();
2016-12-17 08:34:47 +00:00
}
2019-11-01 03:30:19 +00:00
private int dimension (int chars, int border, int size, int gap)
{
return border * 2 + chars * (size + gap) - gap;
}
2016-12-17 08:34:47 +00:00
@Override
public String getText ()
{
StringBuilder text = new StringBuilder ("Name : " + name + "\n\n");
for (int i = 0; i < characters.size (); i += 8)
{
StringBuilder line = new StringBuilder ();
for (int j = 0; j < 8; j++)
{
for (int k = 0; k < 8; k++)
{
line.append (characters.get (i + k).lines[j]);
line.append (" ");
}
line.append ("\n");
}
text.append (line.toString ());
text.append ("\n");
}
return text.toString ();
}
2017-03-19 09:52:36 +00:00
public static boolean isFont (byte[] buffer)
{
if (buffer.length % 8 != 0)
return false;
for (int i = 0; i < 8; i++)
if (buffer[i] != 0 && buffer[i] != 0x7F)
return false;
return true;
}
2016-12-17 08:34:47 +00:00
class Character
{
String[] lines = new String[8];
2016-12-22 22:41:28 +00:00
private final BufferedImage image;
2016-12-17 08:34:47 +00:00
public Character (byte[] buffer, int ptr)
{
2016-12-22 22:41:28 +00:00
// draw the image
2019-11-01 03:30:19 +00:00
image = new BufferedImage (sizeX, sizeY, BufferedImage.TYPE_BYTE_GRAY);
2016-12-22 22:41:28 +00:00
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
int element = 0;
2019-11-01 03:30:19 +00:00
for (int i = 0; i < charBytes; i++)
2016-12-17 08:34:47 +00:00
{
int b = buffer[ptr + i] & 0xFF;
String s = "0000000" + Integer.toString (b, 2);
s = s.substring (s.length () - 7);
s = s.replace ('0', ' ');
s = s.replace ('1', 'O');
s = new StringBuilder (s).reverse ().toString ();
2016-12-22 22:41:28 +00:00
for (byte ch : s.getBytes ())
dataBuffer.setElem (element++, ch == ' ' ? 0 : 255);
2016-12-17 08:34:47 +00:00
lines[i] = s;
}
}
@Override
public String toString ()
{
StringBuilder text = new StringBuilder ();
for (String s : lines)
text.append (s + "\n");
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
}
}