This commit is contained in:
Denis Molony 2019-11-07 13:06:09 +10:00
parent 74452add39
commit bca4858087
7 changed files with 99 additions and 72 deletions

View File

@ -8,6 +8,8 @@ import java.awt.image.DataBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.bytezone.diskbrowser.utilities.Utility;
// -----------------------------------------------------------------------------------// // -----------------------------------------------------------------------------------//
abstract class CharacterList extends AbstractFile abstract class CharacterList extends AbstractFile
// -----------------------------------------------------------------------------------// // -----------------------------------------------------------------------------------//
@ -35,9 +37,9 @@ abstract class CharacterList extends AbstractFile
{ {
super (name, buffer); super (name, buffer);
image = new BufferedImage ( // image = new BufferedImage ( //
dimension (charsX, borderX, sizeX, gapX), // Utility.dimension (charsX, borderX, sizeX, gapX), //
dimension (charsY, borderY, sizeY, gapY), // Utility.dimension (charsY, borderY, sizeY, gapY), //
BufferedImage.TYPE_BYTE_GRAY); BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g2d = image.createGraphics (); Graphics2D g2d = image.createGraphics ();
@ -77,13 +79,6 @@ abstract class CharacterList extends AbstractFile
abstract Character createCharacter (byte[] buffer, int ptr); abstract Character createCharacter (byte[] buffer, int ptr);
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
// ---------------------------------------------------------------------------------//
int dimension (int chars, int border, int size, int gap)
// ---------------------------------------------------------------------------------//
{
return border * 2 + chars * (size + gap) - gap;
}
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
@Override @Override
public String getText () public String getText ()

View File

@ -10,8 +10,11 @@ import java.util.List;
import com.bytezone.diskbrowser.prodos.ProdosConstants; import com.bytezone.diskbrowser.prodos.ProdosConstants;
import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.HexFormatter;
import com.bytezone.diskbrowser.utilities.Utility;
// -----------------------------------------------------------------------------------//
public class IconFile extends AbstractFile implements ProdosConstants public class IconFile extends AbstractFile implements ProdosConstants
// -----------------------------------------------------------------------------------//
{ {
private final int iBlkNext; private final int iBlkNext;
private final int iBlkID; private final int iBlkID;
@ -20,7 +23,9 @@ public class IconFile extends AbstractFile implements ProdosConstants
private final List<Icon> icons = new ArrayList<> (); private final List<Icon> icons = new ArrayList<> ();
private final boolean debug = false; private final boolean debug = false;
// ---------------------------------------------------------------------------------//
public IconFile (String name, byte[] buffer) public IconFile (String name, byte[] buffer)
// ---------------------------------------------------------------------------------//
{ {
super (name, buffer); super (name, buffer);
@ -59,9 +64,9 @@ public class IconFile extends AbstractFile implements ProdosConstants
int columns = Math.min (icons.size (), 4); int columns = Math.min (icons.size (), 4);
int rows = (icons.size () - 1) / columns + 1; int rows = (icons.size () - 1) / columns + 1;
image = new BufferedImage ( // image = new BufferedImage ( //
dimension (columns, base, maxWidth, gap), // Utility.dimension (columns, base, maxWidth, gap), //
dimension (rows, base, maxHeight, gap), // Utility.dimension (rows, base, maxHeight, gap), //
BufferedImage.TYPE_INT_RGB); BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics (); Graphics2D graphics = image.createGraphics ();
@ -88,14 +93,9 @@ public class IconFile extends AbstractFile implements ProdosConstants
} }
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
private int dimension (int chars, int border, int size, int gap)
// ---------------------------------------------------------------------------------//
{
return border * 2 + chars * (size + gap) - gap;
}
@Override @Override
public String getText () public String getText ()
// ---------------------------------------------------------------------------------//
{ {
StringBuilder text = new StringBuilder ("Name : " + name + "\n\n"); StringBuilder text = new StringBuilder ("Name : " + name + "\n\n");
@ -114,7 +114,9 @@ public class IconFile extends AbstractFile implements ProdosConstants
return text.toString (); return text.toString ();
} }
// ---------------------------------------------------------------------------------//
class Icon class Icon
// ---------------------------------------------------------------------------------//
{ {
byte[] buffer; byte[] buffer;
int iDataLen; int iDataLen;
@ -125,7 +127,9 @@ public class IconFile extends AbstractFile implements ProdosConstants
Image largeImage; Image largeImage;
Image smallImage; Image smallImage;
// -------------------------------------------------------------------------------//
public Icon (byte[] fullBuffer, int ptr) public Icon (byte[] fullBuffer, int ptr)
// -------------------------------------------------------------------------------//
{ {
iDataLen = HexFormatter.unsignedShort (fullBuffer, ptr); iDataLen = HexFormatter.unsignedShort (fullBuffer, ptr);
@ -161,8 +165,10 @@ public class IconFile extends AbstractFile implements ProdosConstants
} }
} }
// -------------------------------------------------------------------------------//
@Override @Override
public String toString () public String toString ()
// -------------------------------------------------------------------------------//
{ {
StringBuilder text = new StringBuilder (); StringBuilder text = new StringBuilder ();
text.append (String.format ("Data length .. %04X%n", iDataLen)); text.append (String.format ("Data length .. %04X%n", iDataLen));
@ -177,7 +183,9 @@ public class IconFile extends AbstractFile implements ProdosConstants
} }
} }
// ---------------------------------------------------------------------------------//
class Image class Image
// ---------------------------------------------------------------------------------//
{ {
int iconType; int iconType;
int iconSize; int iconSize;
@ -188,7 +196,9 @@ public class IconFile extends AbstractFile implements ProdosConstants
boolean colour; boolean colour;
private final BufferedImage image; private final BufferedImage image;
// -------------------------------------------------------------------------------//
public Image (byte[] buffer, int ptr) throws InvalidImageException public Image (byte[] buffer, int ptr) throws InvalidImageException
// -------------------------------------------------------------------------------//
{ {
iconType = HexFormatter.unsignedShort (buffer, ptr); iconType = HexFormatter.unsignedShort (buffer, ptr);
iconSize = HexFormatter.unsignedShort (buffer, ptr + 2); iconSize = HexFormatter.unsignedShort (buffer, ptr + 2);
@ -210,6 +220,7 @@ public class IconFile extends AbstractFile implements ProdosConstants
if (iconType != 0 && iconType != 0x8000 && iconType != 0xFFFF && iconType != 0x00FF) if (iconType != 0 && iconType != 0x8000 && iconType != 0xFFFF && iconType != 0x00FF)
throw new InvalidImageException (String.format ("Bad icon type: %04X", iconType)); throw new InvalidImageException (String.format ("Bad icon type: %04X", iconType));
// have also seen 0x7FFF and 0x8001
iconImage = new byte[iconSize]; iconImage = new byte[iconSize];
iconMask = new byte[iconSize]; iconMask = new byte[iconSize];
@ -248,13 +259,17 @@ public class IconFile extends AbstractFile implements ProdosConstants
} }
} }
// -------------------------------------------------------------------------------//
public int size () public int size ()
// -------------------------------------------------------------------------------//
{ {
return 8 + iconSize * 2; return 8 + iconSize * 2;
} }
// -------------------------------------------------------------------------------//
@Override @Override
public String toString () public String toString ()
// -------------------------------------------------------------------------------//
{ {
StringBuilder text = new StringBuilder (); StringBuilder text = new StringBuilder ();
@ -306,7 +321,9 @@ public class IconFile extends AbstractFile implements ProdosConstants
other color of pixel becoming black." other color of pixel becoming black."
*/ */
// -------------------------------------------------------------------------------//
private void appendIcon (StringBuilder text, byte[] buffer) private void appendIcon (StringBuilder text, byte[] buffer)
// -------------------------------------------------------------------------------//
{ {
int rowBytes = (iconWidth - 1) / 2 + 1; int rowBytes = (iconWidth - 1) / 2 + 1;
for (int i = 0; i < iconImage.length; i += rowBytes) for (int i = 0; i < iconImage.length; i += rowBytes)
@ -324,9 +341,13 @@ public class IconFile extends AbstractFile implements ProdosConstants
} }
} }
// ---------------------------------------------------------------------------------//
class InvalidImageException extends Exception class InvalidImageException extends Exception
// ---------------------------------------------------------------------------------//
{ {
// -------------------------------------------------------------------------------//
public InvalidImageException (String message) public InvalidImageException (String message)
// -------------------------------------------------------------------------------//
{ {
super (message); super (message);
} }

View File

@ -2,15 +2,33 @@ package com.bytezone.diskbrowser.applefile;
import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.HexFormatter;
// -----------------------------------------------------------------------------------//
public class LodeRunner extends AbstractFile public class LodeRunner extends AbstractFile
// -----------------------------------------------------------------------------------//
{ {
private static char[] chars = { ' ', // space
'-', // diggable floor
'=', // undiggable floor
'+', // ladder
'^', // hand over hand bar
'~', // trap door
'#', // hidden ladder
'$', // gold
'*', // enemy
'x' // player
};
// ---------------------------------------------------------------------------------//
public LodeRunner (String name, byte[] buffer) public LodeRunner (String name, byte[] buffer)
// ---------------------------------------------------------------------------------//
{ {
super (name, buffer); super (name, buffer);
} }
// ---------------------------------------------------------------------------------//
@Override @Override
public String getText () public String getText ()
// ---------------------------------------------------------------------------------//
{ {
StringBuilder text = new StringBuilder (); StringBuilder text = new StringBuilder ();
text.append ("Lode Runner Level\n\n"); text.append ("Lode Runner Level\n\n");
@ -40,53 +58,14 @@ public class LodeRunner extends AbstractFile
return text.toString (); return text.toString ();
} }
// ---------------------------------------------------------------------------------//
private StringBuilder addPosition (StringBuilder text, char c) private StringBuilder addPosition (StringBuilder text, char c)
// ---------------------------------------------------------------------------------//
{ {
switch (c) if (c >= 0 && c <= 9)
{ text.append (chars[c]);
case '0': else
text.append (' '); // space text.append (c);
break;
case '1':
text.append ('-'); // diggable floor
break;
case '2':
text.append ('='); // undiggable floor
break;
case '3':
text.append ('+'); // ladder
break;
case '4':
text.append ('^'); // hand over hand bar
break;
case '5':
text.append ('~'); // trap door
break;
case '6':
text.append ('#'); // hidden ladder
break;
case '7':
text.append ('$'); // gold
break;
case '8':
text.append ('*'); // enemy
break;
case '9':
text.append ('x'); // player
break;
default:
text.append (c);
}
return text; return text;
} }

View File

@ -1,11 +1,13 @@
package com.bytezone.diskbrowser.utilities; package com.bytezone.diskbrowser.utilities;
// -----------------------------------------------------------------------------------//
class DateTime class DateTime
// -----------------------------------------------------------------------------------//
{ {
private static String[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", private static String[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
"Sep", "Oct", "Nov", "Dec" }; "Aug", "Sep", "Oct", "Nov", "Dec" };
private static String[] days = { "", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", private static String[] days = { "", "Sunday", "Monday", "Tuesday", "Wednesday",
"Friday", "Saturday" }; "Thursday", "Friday", "Saturday" };
private final int second; private final int second;
private final int minute; private final int minute;
@ -15,7 +17,9 @@ class DateTime
private final int month; private final int month;
private final int weekDay; private final int weekDay;
// ---------------------------------------------------------------------------------//
public DateTime (byte[] buffer, int ptr) public DateTime (byte[] buffer, int ptr)
// ---------------------------------------------------------------------------------//
{ {
second = buffer[ptr] & 0xFF; second = buffer[ptr] & 0xFF;
minute = buffer[++ptr] & 0xFF; minute = buffer[++ptr] & 0xFF;
@ -27,16 +31,21 @@ class DateTime
weekDay = buffer[++ptr] & 0xFF; weekDay = buffer[++ptr] & 0xFF;
} }
// ---------------------------------------------------------------------------------//
public String format () public String format ()
// ---------------------------------------------------------------------------------//
{ {
return String.format ("%02d:%02d:%02d %s %d %s %d", hour, minute, second, days[weekDay], return String.format ("%02d:%02d:%02d %s %d %s %d", hour, minute, second,
day, months[month], year); days[weekDay], day, months[month], year);
} }
// ---------------------------------------------------------------------------------//
@Override @Override
public String toString () public String toString ()
// ---------------------------------------------------------------------------------//
{ {
return "DateTime [second=" + second + ", minute=" + minute + ", hour=" + hour + ", year=" return "DateTime [second=" + second + ", minute=" + minute + ", hour=" + hour
+ year + ", day=" + day + ", month=" + month + ", weekDay=" + weekDay + "]"; + ", year=" + year + ", day=" + day + ", month=" + month + ", weekDay=" + weekDay
+ "]";
} }
} }

View File

@ -1,16 +1,22 @@
package com.bytezone.diskbrowser.utilities; package com.bytezone.diskbrowser.utilities;
// -----------------------------------------------------------------------------------//
public class FileFormatException extends RuntimeException public class FileFormatException extends RuntimeException
// -----------------------------------------------------------------------------------//
{ {
String message; String message;
// ---------------------------------------------------------------------------------//
public FileFormatException (String string) public FileFormatException (String string)
// ---------------------------------------------------------------------------------//
{ {
this.message = string; this.message = string;
} }
// ---------------------------------------------------------------------------------//
@Override @Override
public String toString () public String toString ()
// ---------------------------------------------------------------------------------//
{ {
return message; return message;
} }

View File

@ -5,17 +5,23 @@ import java.text.Format;
import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableCellRenderer;
// -----------------------------------------------------------------------------------//
public class FormatRenderer extends DefaultTableCellRenderer public class FormatRenderer extends DefaultTableCellRenderer
// -----------------------------------------------------------------------------------//
{ {
private final Format formatter; private final Format formatter;
// ---------------------------------------------------------------------------------//
public FormatRenderer (Format formatter) public FormatRenderer (Format formatter)
// ---------------------------------------------------------------------------------//
{ {
this.formatter = formatter; this.formatter = formatter;
} }
// ---------------------------------------------------------------------------------//
@Override @Override
public void setValue (Object value) public void setValue (Object value)
// ---------------------------------------------------------------------------------//
{ {
try try
{ {
@ -29,12 +35,16 @@ public class FormatRenderer extends DefaultTableCellRenderer
super.setValue (value); super.setValue (value);
} }
// ---------------------------------------------------------------------------------//
public static FormatRenderer getDateTimeRenderer () public static FormatRenderer getDateTimeRenderer ()
// ---------------------------------------------------------------------------------//
{ {
return new FormatRenderer (DateFormat.getDateTimeInstance ()); return new FormatRenderer (DateFormat.getDateTimeInstance ());
} }
// ---------------------------------------------------------------------------------//
public static FormatRenderer getTimeRenderer () public static FormatRenderer getTimeRenderer ()
// ---------------------------------------------------------------------------------//
{ {
return new FormatRenderer (DateFormat.getTimeInstance ()); return new FormatRenderer (DateFormat.getTimeInstance ());
} }

View File

@ -38,6 +38,13 @@ public class Utility
return a + b; return a + b;
} }
// ---------------------------------------------------------------------------------//
public static int dimension (int chars, int border, int size, int gap)
// ---------------------------------------------------------------------------------//
{
return border * 2 + chars * (size + gap) - gap;
}
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
public static boolean find (byte[] buffer, byte[] key) public static boolean find (byte[] buffer, byte[] key)
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//