diff --git a/src/com/bytezone/diskbrowser/applefile/HiResImage.java b/src/com/bytezone/diskbrowser/applefile/HiResImage.java index 738aec5..f7ba037 100644 --- a/src/com/bytezone/diskbrowser/applefile/HiResImage.java +++ b/src/com/bytezone/diskbrowser/applefile/HiResImage.java @@ -423,7 +423,13 @@ public abstract class HiResImage extends AbstractFile { // routine found here - http://kpreid.livejournal.com/4319.html + // this should be pixelsPerLine * (2 or 4) * screenLines byte[] newBuf = new byte[calculateBufferSize (buffer)]; + if (true) + { + unpackLine2 (buffer, 0, buffer.length, newBuf, 0); + return newBuf; + } int ptr = 0, newPtr = 0; while (ptr < buffer.length) @@ -472,7 +478,53 @@ public abstract class HiResImage extends AbstractFile // Super Hi-res IIGS (MAIN in $C0/02) // only called by SHRPictureFile1 // ---------------------------------------------------------------------------------// - int unpackLine (byte[] buffer, int ptr, byte[] newBuf, int newPtr) + int unpackLine2 (byte[] buffer, int ptr, int max, byte[] newBuf, int newPtr) + // ---------------------------------------------------------------------------------// + { + int savePtr = newPtr; + + while (ptr < max - 1) // minimum 2 bytes needed + { + int type = (buffer[ptr] & 0xC0) >>> 6; // 0-3 + int count = (buffer[ptr++] & 0x3F) + 1; // 1-64 + + switch (type) + { + case 0: // 2-65 bytes + while (count-- != 0 && newPtr < newBuf.length && ptr < max) + newBuf[newPtr++] = buffer[ptr++]; + break; + + case 1: // 2 bytes + byte b = buffer[ptr++]; + while (count-- != 0 && newPtr < newBuf.length) + newBuf[newPtr++] = b; + break; + + case 2: // 5 bytes + for (int i = 0; i < 4; i++) + fourBuf[i] = ptr < max ? buffer[ptr++] : 0; + + while (count-- != 0) + for (int i = 0; i < 4; i++) + if (newPtr < newBuf.length) + newBuf[newPtr++] = fourBuf[i]; + break; + + case 3: // 2 bytes + b = buffer[ptr++]; + count *= 4; + while (count-- != 0 && newPtr < newBuf.length) + newBuf[newPtr++] = b; + break; + } + } + + return newPtr - savePtr; // bytes unpacked + } + + // ---------------------------------------------------------------------------------// + private int unpackLineX (byte[] buffer, int ptr, byte[] newBuf, int newPtr) // ---------------------------------------------------------------------------------// { int savePtr = newPtr; diff --git a/src/com/bytezone/diskbrowser/applefile/SHRPictureFile1.java b/src/com/bytezone/diskbrowser/applefile/SHRPictureFile1.java index 7443a51..c529d48 100644 --- a/src/com/bytezone/diskbrowser/applefile/SHRPictureFile1.java +++ b/src/com/bytezone/diskbrowser/applefile/SHRPictureFile1.java @@ -339,7 +339,8 @@ public class SHRPictureFile1 extends HiResImage break; } - int bytesUnpacked = unpackLine (packedScanLines[line], 0, unpackedBuffer, ptr); + int bytesUnpacked = unpackLine2 (packedScanLines[line], 0, + packedScanLines[line].length, unpackedBuffer, ptr); if (bytesUnpacked != dataWidth) System.out.printf ("Unexpected line width %3d %5d %3d %3d%n", line, ptr,