icon file error checking

This commit is contained in:
Denis Molony 2019-08-22 07:47:19 +10:00
parent cdde71b158
commit 0d70e08ef3
2 changed files with 112 additions and 105 deletions

View File

@ -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."

View File

@ -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