mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-06-15 04:29:27 +00:00
icon file error checking
This commit is contained in:
parent
cdde71b158
commit
0d70e08ef3
|
@ -8,9 +8,10 @@ import java.awt.image.DataBuffer;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.bytezone.diskbrowser.prodos.ProdosConstants;
|
||||
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
||||
|
||||
public class IconFile extends AbstractFile
|
||||
public class IconFile extends AbstractFile implements ProdosConstants
|
||||
{
|
||||
private static Palette palette = //
|
||||
new Palette ("Virtual II", new int[] { 0x000000, // 0 black
|
||||
|
@ -54,6 +55,7 @@ public class IconFile extends AbstractFile
|
|||
private final int iBlkPath;
|
||||
private final String iBlkName;
|
||||
private final List<Icon> icons = new ArrayList<IconFile.Icon> ();
|
||||
private final boolean debug = false;
|
||||
|
||||
public IconFile (String name, byte[] buffer)
|
||||
{
|
||||
|
@ -65,9 +67,11 @@ public class IconFile extends AbstractFile
|
|||
iBlkName = HexFormatter.getHexString (buffer, 10, 16);
|
||||
|
||||
int ptr = 26;
|
||||
|
||||
while (true)
|
||||
{
|
||||
int dataLen = HexFormatter.unsignedShort (buffer, ptr);
|
||||
|
||||
if (dataLen == 0 || (dataLen + ptr) > buffer.length)
|
||||
break;
|
||||
Icon icon = new Icon (buffer, ptr);
|
||||
|
@ -84,16 +88,12 @@ public class IconFile extends AbstractFile
|
|||
maxWidth = Math.max (maxWidth, icon.largeImage.iconWidth);
|
||||
}
|
||||
|
||||
// System.out.printf ("Icons: %d, Max height: %d, max width: %d%n", icons.size (),
|
||||
// maxHeight, maxWidth);
|
||||
|
||||
int base = 10;
|
||||
int x = base;
|
||||
int y = base;
|
||||
int gap = 5;
|
||||
int columns = Math.min (icons.size (), 4);
|
||||
int rows = (icons.size () - 1) / columns + 1;
|
||||
// System.out.printf ("Rows: %d, cols: %d%n", rows, columns);
|
||||
|
||||
image = new BufferedImage (columns * maxWidth + 2 * base + (columns - 1) * gap,
|
||||
rows * maxHeight + 2 * base + (rows - 1) * gap, BufferedImage.TYPE_INT_RGB);
|
||||
|
@ -167,6 +167,15 @@ public class IconFile extends AbstractFile
|
|||
iDataType = HexFormatter.unsignedShort (buffer, 82);
|
||||
iDataAux = HexFormatter.unsignedShort (buffer, 84);
|
||||
|
||||
if (debug)
|
||||
{
|
||||
System.out.printf ("Len %,d%n", iDataLen);
|
||||
System.out.printf ("Path %,d %s%n", len, pathName);
|
||||
System.out.printf ("Data %,d %s%n", len, dataName);
|
||||
System.out.printf ("Type %04X %s%n", iDataType, fileTypes[iDataType]);
|
||||
System.out.printf ("Aux %04X%n", iDataAux);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
largeImage = new Image (buffer, 86);
|
||||
|
@ -212,6 +221,15 @@ public class IconFile extends AbstractFile
|
|||
iconHeight = HexFormatter.unsignedShort (buffer, ptr + 4);
|
||||
iconWidth = HexFormatter.unsignedShort (buffer, ptr + 6);
|
||||
|
||||
if (debug)
|
||||
{
|
||||
System.out.printf ("Icon type ... %04X %<d%n", iconType);
|
||||
System.out.printf ("Icon size ... %d%n", iconSize);
|
||||
System.out.printf ("Icon height . %d%n", iconHeight);
|
||||
System.out.printf ("Icon width .. %d%n", iconWidth);
|
||||
System.out.println ();
|
||||
}
|
||||
|
||||
if (iconType != 0 && iconType != 0x8000)
|
||||
throw new InvalidImageException (String.format ("Bad icon type: %04X", iconType));
|
||||
|
||||
|
@ -220,32 +238,21 @@ public class IconFile extends AbstractFile
|
|||
|
||||
colour = (iconType & 0x80) != 0;
|
||||
|
||||
// System.out.printf ("Icon type %04X %<d%n", iconType);
|
||||
// System.out.printf ("Icon size %d%n", iconSize);
|
||||
// System.out.printf ("Icon height %d%n", iconHeight);
|
||||
// System.out.printf ("Icon width %d%n", iconWidth);
|
||||
// System.out.println ();
|
||||
|
||||
System.arraycopy (buffer, ptr + 8, iconImage, 0, iconSize);
|
||||
System.arraycopy (buffer, ptr + 8 + iconSize, iconMask, 0, iconSize);
|
||||
|
||||
int[] colours = palette.getColours ();
|
||||
// int gap = 5;
|
||||
|
||||
image = new BufferedImage (iconWidth, iconHeight, BufferedImage.TYPE_INT_RGB);
|
||||
|
||||
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
|
||||
int element = 0;
|
||||
// System.out.println ("*** " + dataBuffer.getSize ());
|
||||
// System.out.printf ("width %d height %d%n", iconWidth, iconHeight);
|
||||
// System.out.printf ("icon image length %d%n", iconImage.length);
|
||||
|
||||
int rowBytes = (iconWidth - 1) / 2 + 1;
|
||||
if (true)
|
||||
for (int i = 0; i < iconImage.length; i += rowBytes)
|
||||
{
|
||||
int max = Math.min (i + rowBytes, dataBuffer.getSize ());
|
||||
// System.out.printf ("max %d%n", max);
|
||||
for (int j = i; j < max; j++)
|
||||
{
|
||||
int left = (byte) ((iconImage[j] & 0xF0) >>> 4);
|
||||
|
@ -286,7 +293,7 @@ public class IconFile extends AbstractFile
|
|||
|
||||
/*
|
||||
Offset Color RGB Mini-Palette
|
||||
|
||||
|
||||
0 Black 000 0
|
||||
1 Blue 00F 1
|
||||
2 Yellow FF0 2
|
||||
|
@ -295,7 +302,7 @@ public class IconFile extends AbstractFile
|
|||
5 Red D00 1
|
||||
6 Green 0E0 2
|
||||
7 White FFF 3
|
||||
|
||||
|
||||
8 Black 000 0
|
||||
9 Blue 00F 1
|
||||
10 Yellow FF0 2
|
||||
|
@ -304,18 +311,18 @@ public class IconFile extends AbstractFile
|
|||
13 Red D00 1
|
||||
14 Green 0E0 2
|
||||
15 White FFF 3
|
||||
|
||||
|
||||
The displayMode word bits are defined as:
|
||||
|
||||
|
||||
Bit 0 selectedIconBit 1 = invert image before copying
|
||||
Bit 1 openIconBit 1 = copy light-gray pattern instead of image
|
||||
Bit 2 offLineBit 1 = AND light-gray pattern to image being copied
|
||||
Bits 3-7 reserved.
|
||||
Bits 8-11 foreground color to apply to black part of black & white icons
|
||||
Bits 12-15 background color to apply to white part of black & white icons
|
||||
|
||||
|
||||
Bits 0-2 can occur at once and are tested in the order 1-2-0.
|
||||
|
||||
|
||||
"Color is only applied to the black and white icons if bits 15-8 are not all 0.
|
||||
Colored pixels in an icon are inverted by black pixels becoming white and any
|
||||
other color of pixel becoming black."
|
||||
|
|
|
@ -2,92 +2,92 @@ package com.bytezone.diskbrowser.prodos;
|
|||
|
||||
public interface ProdosConstants
|
||||
{
|
||||
int FILE_TYPE_NON = 0x00;
|
||||
int FILE_TYPE_PCD = 0x02;
|
||||
int FILE_TYPE_TEXT = 0x04;
|
||||
int FILE_TYPE_PDA = 0x05;
|
||||
int FILE_TYPE_BINARY = 0x06;
|
||||
int FILE_TYPE_FNT = 0x07;
|
||||
int FILE_TYPE_FOT = 0x08; // was Apple /// FotoFile
|
||||
int FILE_TYPE_DIRECTORY = 0x0F;
|
||||
int FILE_TYPE_ADB = 0x19;
|
||||
int FILE_TYPE_AWP = 0x1A;
|
||||
int FILE_TYPE_ASP = 0x1B;
|
||||
int FILE_TYPE_DESCRIPTOR_TABLE = 0x42;
|
||||
int FILE_TYPE_GWP = 0x50;
|
||||
int FILE_TYPE_GEO = 0x82;
|
||||
int FILE_TYPE_IIGS_SOURCE = 0xB0;
|
||||
int FILE_TYPE_IIGS_OBJECT = 0xB1;
|
||||
int FILE_TYPE_IIGS_APPLICATION = 0xB3;
|
||||
int FILE_TYPE_IIGS_DEVICE_DRIVER = 0xBB;
|
||||
int FILE_TYPE_LDF = 0xBC;
|
||||
int FILE_TYPE_GS_BASIC = 0xAB;
|
||||
int FILE_TYPE_GSOS_FILE_SYSTEM_TRANSLATOR = 0xBD;
|
||||
int FILE_TYPE_PNT = 0xC0;
|
||||
int FILE_TYPE_PIC = 0xC1;
|
||||
int FILE_TYPE_ANI = 0xC2;
|
||||
int FILE_TYPE_PAL = 0xC3;
|
||||
int FILE_TYPE_FONT = 0xC8;
|
||||
int FILE_TYPE_FINDER = 0xC9;
|
||||
int FILE_TYPE_ICN = 0xCA;
|
||||
int FILE_TYPE_APPLETALK = 0xE2;
|
||||
int FILE_TYPE_PASCAL_VOLUME = 0xEF;
|
||||
int FILE_TYPE_USER_DEFINED_1 = 0xF1; // OVL
|
||||
int FILE_TYPE_BAT = 0xF5;
|
||||
int FILE_TYPE_INTEGER_BASIC = 0xFA;
|
||||
int FILE_TYPE_INTEGER_BASIC_VARS = 0xFB;
|
||||
int FILE_TYPE_APPLESOFT_BASIC = 0xFC;
|
||||
int FILE_TYPE_APPLESOFT_BASIC_VARS = 0xFD;
|
||||
int FILE_TYPE_RELOCATABLE = 0xFE;
|
||||
int FILE_TYPE_SYS = 0xFF;
|
||||
static int FILE_TYPE_NON = 0x00;
|
||||
static int FILE_TYPE_PCD = 0x02;
|
||||
static int FILE_TYPE_TEXT = 0x04;
|
||||
static int FILE_TYPE_PDA = 0x05;
|
||||
static int FILE_TYPE_BINARY = 0x06;
|
||||
static int FILE_TYPE_FNT = 0x07;
|
||||
static int FILE_TYPE_FOT = 0x08; // was Apple /// FotoFile
|
||||
static int FILE_TYPE_DIRECTORY = 0x0F;
|
||||
static int FILE_TYPE_ADB = 0x19;
|
||||
static int FILE_TYPE_AWP = 0x1A;
|
||||
static int FILE_TYPE_ASP = 0x1B;
|
||||
static int FILE_TYPE_DESCRIPTOR_TABLE = 0x42;
|
||||
static int FILE_TYPE_GWP = 0x50;
|
||||
static int FILE_TYPE_GEO = 0x82;
|
||||
static int FILE_TYPE_IIGS_SOURCE = 0xB0;
|
||||
static int FILE_TYPE_IIGS_OBJECT = 0xB1;
|
||||
static int FILE_TYPE_IIGS_APPLICATION = 0xB3;
|
||||
static int FILE_TYPE_IIGS_DEVICE_DRIVER = 0xBB;
|
||||
static int FILE_TYPE_LDF = 0xBC;
|
||||
static int FILE_TYPE_GS_BASIC = 0xAB;
|
||||
static int FILE_TYPE_GSOS_FILE_SYSTEM_TRANSLATOR = 0xBD;
|
||||
static int FILE_TYPE_PNT = 0xC0;
|
||||
static int FILE_TYPE_PIC = 0xC1;
|
||||
static int FILE_TYPE_ANI = 0xC2;
|
||||
static int FILE_TYPE_PAL = 0xC3;
|
||||
static int FILE_TYPE_FONT = 0xC8;
|
||||
static int FILE_TYPE_FINDER = 0xC9;
|
||||
static int FILE_TYPE_ICN = 0xCA;
|
||||
static int FILE_TYPE_APPLETALK = 0xE2;
|
||||
static int FILE_TYPE_PASCAL_VOLUME = 0xEF;
|
||||
static int FILE_TYPE_USER_DEFINED_1 = 0xF1; // OVL
|
||||
static int FILE_TYPE_BAT = 0xF5;
|
||||
static int FILE_TYPE_INTEGER_BASIC = 0xFA;
|
||||
static int FILE_TYPE_INTEGER_BASIC_VARS = 0xFB;
|
||||
static int FILE_TYPE_APPLESOFT_BASIC = 0xFC;
|
||||
static int FILE_TYPE_APPLESOFT_BASIC_VARS = 0xFD;
|
||||
static int FILE_TYPE_RELOCATABLE = 0xFE;
|
||||
static int FILE_TYPE_SYS = 0xFF;
|
||||
|
||||
int VOLUME_HEADER = 15;
|
||||
int SUBDIRECTORY_HEADER = 14;
|
||||
int SUBDIRECTORY = 13;
|
||||
int GSOS_EXTENDED_FILE = 5; // tech note #25
|
||||
int PASCAL_ON_PROFILE = 4; // tech note #25
|
||||
int TREE = 3;
|
||||
int SAPLING = 2;
|
||||
int SEEDLING = 1;
|
||||
int FREE = 0;
|
||||
static int VOLUME_HEADER = 15;
|
||||
static int SUBDIRECTORY_HEADER = 14;
|
||||
static int SUBDIRECTORY = 13;
|
||||
static int GSOS_EXTENDED_FILE = 5; // tech note #25
|
||||
static int PASCAL_ON_PROFILE = 4; // tech note #25
|
||||
static int TREE = 3;
|
||||
static int SAPLING = 2;
|
||||
static int SEEDLING = 1;
|
||||
static int FREE = 0;
|
||||
|
||||
String[] fileTypes = { //
|
||||
"NON", "BAD", "PCD", "PTX", "TXT", "PDA", "BIN", "FNT", //
|
||||
"FOT", "BA3", "DA3", "WPF", "SOS", "$0D", "$0E", "DIR", //
|
||||
"RPD", "RPI", "AFD", "AFM", "AFR", "SCL", "PFS", "$17", //
|
||||
"$18", "ADB", "AWP", "ASP", "$1C", "$1D", "$1E", "$1F", //
|
||||
"TDM", "$21", "$22", "$23", "$24", "$25", "$26", "$27", //
|
||||
"$28", "$29", "8SC", "8OB", "8IC", "8LD", "P8C", "$2F", //
|
||||
"$30", "$31", "$32", "$33", "$34", "$35", "$36", "$37", //
|
||||
"$38", "$39", "$3A", "$3B", "$3C", "$3D", "$3E", "$3F", //
|
||||
"DIC", "OCR", "FTD", "$43", "$44", "$45", "$46", "$47", //
|
||||
"$48", "$49", "$4A", "$4B", "$4C", "$4D", "$4E", "$4F", //
|
||||
"GWP", "GSS", "GDB", "DRW", "GDP", "HMD", "EDU", "STN", //
|
||||
"HLP", "COM", "CFG", "ANM", "MUM", "ENT", "DVU", "FIN", //
|
||||
"$60", "$61", "$62", "$63", "$64", "$65", "$66", "$67", //
|
||||
"$68", "$69", "$6A", "BIO", "$6C", "TDR", "PRE", "HDV", //
|
||||
"$70", "$71", "$72", "$73", "$74", "$75", "$76", "$77", //
|
||||
"$78", "$79", "$7A", "$7B", "$7C", "$7D", "$7E", "$7F", //
|
||||
"GES", "GEA", "GEO", "GED", "GEF", "GEP", "GEI", "GEX", //
|
||||
"$88", "GEV", "$8A", "GEC", "GEK", "GEW", "$8E", "$8F", //
|
||||
"$90", "$91", "$92", "$93", "$94", "$95", "$96", "$97", //
|
||||
"$98", "$99", "$9A", "$9B", "$9C", "$9D", "$9E", "$9F", //
|
||||
"WP ", "$A1", "$A2", "$A3", "$A4", "$A5", "$A6", "$A7", //
|
||||
"$A8", "$A9", "$AA", "GSB", "TDF", "BDF", "$AE", "$AF", //
|
||||
"SRC", "OBJ", "LIB", "S16", "RTL", "EXE", "PIF", "TIF", //
|
||||
"NDA", "CDA", "TOL", "DVR", "LDF", "FST", "$BE", "DOC", //
|
||||
"PNT", "PIC", "ANI", "PAL", "$C4", "OOG", "SCR", "CDV", //
|
||||
"FON", "FND", "ICN", "$CB", "$CC", "$CD", "$CE", "$CF", //
|
||||
"$D0", "$D1", "$D2", "$D3", "$D4", "MUS", "INS", "MDI", //
|
||||
"SND", "$D9", "$DA", "DBM", "$DC", "DDD", "$DE", "$DF", //
|
||||
"LBR", "$E1", "ATK", "$E3", "$E4", "$E5", "$E6", "$E7", //
|
||||
"$E8", "$E9", "$EA", "$EB", "$EC", "$ED", "R16", "PAR", //
|
||||
"CMD", "OVL", "UD2", "UD3", "UD4", "BAT", "UD6", "UD7", //
|
||||
"PRG", "P16", "INT", "IVR", "BAS", "VAR", "REL", "SYS" };
|
||||
static String[] fileTypes = { //
|
||||
"NON", "BAD", "PCD", "PTX", "TXT", "PDA", "BIN", "FNT", //
|
||||
"FOT", "BA3", "DA3", "WPF", "SOS", "$0D", "$0E", "DIR", //
|
||||
"RPD", "RPI", "AFD", "AFM", "AFR", "SCL", "PFS", "$17", //
|
||||
"$18", "ADB", "AWP", "ASP", "$1C", "$1D", "$1E", "$1F", //
|
||||
"TDM", "$21", "$22", "$23", "$24", "$25", "$26", "$27", //
|
||||
"$28", "$29", "8SC", "8OB", "8IC", "8LD", "P8C", "$2F", //
|
||||
"$30", "$31", "$32", "$33", "$34", "$35", "$36", "$37", //
|
||||
"$38", "$39", "$3A", "$3B", "$3C", "$3D", "$3E", "$3F", //
|
||||
"DIC", "OCR", "FTD", "$43", "$44", "$45", "$46", "$47", //
|
||||
"$48", "$49", "$4A", "$4B", "$4C", "$4D", "$4E", "$4F", //
|
||||
"GWP", "GSS", "GDB", "DRW", "GDP", "HMD", "EDU", "STN", //
|
||||
"HLP", "COM", "CFG", "ANM", "MUM", "ENT", "DVU", "FIN", //
|
||||
"$60", "$61", "$62", "$63", "$64", "$65", "$66", "$67", //
|
||||
"$68", "$69", "$6A", "BIO", "$6C", "TDR", "PRE", "HDV", //
|
||||
"$70", "$71", "$72", "$73", "$74", "$75", "$76", "$77", //
|
||||
"$78", "$79", "$7A", "$7B", "$7C", "$7D", "$7E", "$7F", //
|
||||
"GES", "GEA", "GEO", "GED", "GEF", "GEP", "GEI", "GEX", //
|
||||
"$88", "GEV", "$8A", "GEC", "GEK", "GEW", "$8E", "$8F", //
|
||||
"$90", "$91", "$92", "$93", "$94", "$95", "$96", "$97", //
|
||||
"$98", "$99", "$9A", "$9B", "$9C", "$9D", "$9E", "$9F", //
|
||||
"WP ", "$A1", "$A2", "$A3", "$A4", "$A5", "$A6", "$A7", //
|
||||
"$A8", "$A9", "$AA", "GSB", "TDF", "BDF", "$AE", "$AF", //
|
||||
"SRC", "OBJ", "LIB", "S16", "RTL", "EXE", "PIF", "TIF", //
|
||||
"NDA", "CDA", "TOL", "DVR", "LDF", "FST", "$BE", "DOC", //
|
||||
"PNT", "PIC", "ANI", "PAL", "$C4", "OOG", "SCR", "CDV", //
|
||||
"FON", "FND", "ICN", "$CB", "$CC", "$CD", "$CE", "$CF", //
|
||||
"$D0", "$D1", "$D2", "$D3", "$D4", "MUS", "INS", "MDI", //
|
||||
"SND", "$D9", "$DA", "DBM", "$DC", "DDD", "$DE", "$DF", //
|
||||
"LBR", "$E1", "ATK", "$E3", "$E4", "$E5", "$E6", "$E7", //
|
||||
"$E8", "$E9", "$EA", "$EB", "$EC", "$ED", "R16", "PAR", //
|
||||
"CMD", "OVL", "UD2", "UD3", "UD4", "BAT", "UD6", "UD7", //
|
||||
"PRG", "P16", "INT", "IVR", "BAS", "VAR", "REL", "SYS" };
|
||||
|
||||
int ENTRY_SIZE = 39;
|
||||
int ENTRIES_PER_BLOCK = 13;
|
||||
int BLOCK_ENTRY_SIZE = ENTRY_SIZE * ENTRIES_PER_BLOCK;
|
||||
static int ENTRY_SIZE = 39;
|
||||
static int ENTRIES_PER_BLOCK = 13;
|
||||
static int BLOCK_ENTRY_SIZE = ENTRY_SIZE * ENTRIES_PER_BLOCK;
|
||||
}
|
||||
|
||||
/* http://www.kreativekorp.com/miscpages/a2info/filetypes.shtml
|
||||
|
|
Loading…
Reference in New Issue
Block a user