mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-09-27 09:55:28 +00:00
50 lines
1.2 KiB
Java
50 lines
1.2 KiB
Java
package com.bytezone.diskbrowser.applefile;
|
|
|
|
public class FaddenHiResImage extends OriginalHiResImage
|
|
{
|
|
// https://github.com/fadden/fhpack/blob/master/fhpack.cpp
|
|
|
|
public FaddenHiResImage (String name, byte[] buffer, int fileType, int auxType,
|
|
int endOfFile)
|
|
{
|
|
super (name, buffer, fileType, auxType, endOfFile);
|
|
|
|
assert buffer[0] == 0x66;
|
|
|
|
this.buffer = new byte[0x2000];
|
|
int outPtr = 0;
|
|
|
|
int ptr = 1;
|
|
while (ptr < buffer.length)
|
|
{
|
|
int literalLen = (buffer[ptr] & 0xF0) >>> 4;
|
|
int matchLen = (buffer[ptr++] & 0x0F) + 4;
|
|
|
|
if (literalLen == 15)
|
|
literalLen = (buffer[ptr++] & 0xFF) + 15;
|
|
|
|
if (literalLen > 0)
|
|
{
|
|
System.arraycopy (buffer, ptr, this.buffer, outPtr, literalLen);
|
|
ptr += literalLen;
|
|
outPtr += literalLen;
|
|
}
|
|
|
|
if (matchLen == 19) // 15 + 4
|
|
{
|
|
matchLen = (buffer[ptr++] & 0xFF);
|
|
if (matchLen == 254) // eof
|
|
break;
|
|
if (matchLen == 253) // no match
|
|
continue;
|
|
matchLen += 19;
|
|
}
|
|
|
|
int offset = (buffer[ptr++] & 0xFF) | ((buffer[ptr++] & 0xFF) << 8);
|
|
while (matchLen-- > 0)
|
|
this.buffer[outPtr++] = this.buffer[offset++];
|
|
}
|
|
createImage ();
|
|
}
|
|
}
|