dmolony-DiskBrowser/src/com/bytezone/diskbrowser/applefile/SHRPictureFile2.java

197 lines
5.9 KiB
Java
Raw Normal View History

2017-01-25 11:02:50 +00:00
package com.bytezone.diskbrowser.applefile;
2017-01-26 04:19:23 +00:00
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import com.bytezone.diskbrowser.prodos.ProdosConstants;
2017-02-01 21:15:30 +00:00
import com.bytezone.diskbrowser.utilities.HexFormatter;
2017-01-26 04:19:23 +00:00
2017-01-25 11:02:50 +00:00
public class SHRPictureFile2 extends HiResImage
{
2017-01-26 04:19:23 +00:00
ColorTable[] colorTables;
2018-07-30 08:44:29 +00:00
byte[] controlBytes;
2017-01-25 11:02:50 +00:00
2018-07-25 05:48:14 +00:00
// see Graphics & Animation.2mg
2017-01-25 11:02:50 +00:00
public SHRPictureFile2 (String name, byte[] buffer, int fileType, int auxType, int eof)
{
super (name, buffer, fileType, auxType, eof);
2018-07-25 05:48:14 +00:00
switch (fileType)
2017-01-26 04:19:23 +00:00
{
2018-07-25 05:48:14 +00:00
case ProdosConstants.FILE_TYPE_PNT:
switch (auxType)
{
case 0:
System.out.printf (
"%s: PNT aux 0 (Paintworks Packed SHR Image) not written yet%n", name);
2018-07-28 12:00:02 +00:00
int background = HexFormatter.intValue (buffer[0x20], buffer[0x21]);
byte[] palette = new byte[32];
byte[] patterns = new byte[512];
byte[] data = new byte[buffer.length - 0x222];
System.arraycopy (buffer, 0x00, palette, 0, palette.length);
System.arraycopy (buffer, 0x22, patterns, 0, patterns.length);
System.arraycopy (buffer, 0x0222, data, 0, data.length);
this.buffer = unpackBytes (data);
2018-07-25 05:48:14 +00:00
break;
2018-07-26 03:43:07 +00:00
case 1: // packed version of PIC/$00
2018-07-25 05:48:14 +00:00
this.buffer = unpackBytes (buffer);
2018-07-30 08:44:29 +00:00
controlBytes = new byte[200];
System.arraycopy (this.buffer, 32000, controlBytes, 0, controlBytes.length);
2018-07-25 05:48:14 +00:00
colorTables = new ColorTable[16];
for (int i = 0; i < colorTables.length; i++)
colorTables[i] = new ColorTable (i, this.buffer, 32256 + i * 32);
break;
2018-07-26 03:43:07 +00:00
case 2: // handled in SHRPictureFile1
2018-07-25 05:48:14 +00:00
break;
2018-07-26 03:43:07 +00:00
case 3: // packed version of PIC/$01
2018-07-25 05:48:14 +00:00
System.out.printf ("%s: PNT aux 3 (Packed IIGS SHR Image) not written yet%n",
name);
break;
2018-07-26 03:43:07 +00:00
case 4: // packed version of PIC/$02
System.out.printf ("%s: PNT aux 4 (Packed SHR Brooks Image) not tested yet%n",
name);
this.buffer = unpackBytes (buffer);
colorTables = new ColorTable[200];
for (int i = 0; i < colorTables.length; i++)
{
2018-07-28 12:00:02 +00:00
colorTables[i] = new ColorTable (i, this.buffer, 32000 + i * 32);
2018-07-26 03:43:07 +00:00
colorTables[i].reverse ();
}
2018-07-25 05:48:14 +00:00
break;
default:
System.out.printf ("%s: PNT unknown aux: %04X%n", name, auxType);
}
break;
2017-01-27 07:11:00 +00:00
2018-07-25 05:48:14 +00:00
case ProdosConstants.FILE_TYPE_PIC:
if (auxType > 2)
{
System.out.printf ("%s: PIC changing aux from %04X to 0%n", name, auxType);
auxType = 0;
}
2017-01-26 04:19:23 +00:00
2018-07-25 05:48:14 +00:00
switch (auxType)
2017-01-26 04:19:23 +00:00
{
2018-07-26 03:43:07 +00:00
case 0: // unpacked version of PNT/$01
2018-07-30 08:44:29 +00:00
controlBytes = new byte[200];
System.arraycopy (buffer, 32000, controlBytes, 0, controlBytes.length);
2018-07-25 05:48:14 +00:00
colorTables = new ColorTable[16];
for (int i = 0; i < colorTables.length; i++)
colorTables[i] = new ColorTable (i, buffer, 32256 + i * 32);
break;
2018-07-26 03:43:07 +00:00
case 1: // unpacked version of PNT/$03
2018-07-25 05:48:14 +00:00
System.out.printf ("%s: PIC aux 1 not written yet%n", name);
break;
2018-07-26 03:43:07 +00:00
case 2: // unpacked version of PNT/$04
2018-07-25 05:48:14 +00:00
colorTables = new ColorTable[200];
for (int i = 0; i < colorTables.length; i++)
{
colorTables[i] = new ColorTable (i, buffer, 32000 + i * 32);
colorTables[i].reverse ();
}
break;
default:
System.out.println ("PIC unknown aux " + auxType);
2017-01-26 04:19:23 +00:00
}
2018-07-25 05:48:14 +00:00
break;
default:
System.out.println ("unknown filetype " + fileType);
2017-01-26 04:19:23 +00:00
}
2017-01-27 07:11:00 +00:00
if (colorTables != null)
createImage ();
2017-01-25 11:02:50 +00:00
}
@Override
2018-07-30 08:44:29 +00:00
void createMonochromeImage ()
2017-01-25 11:02:50 +00:00
{
}
@Override
2018-07-30 08:44:29 +00:00
void createColourImage ()
2017-01-25 11:02:50 +00:00
{
2017-01-26 04:19:23 +00:00
image = new BufferedImage (320, 200, BufferedImage.TYPE_INT_RGB);
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
int element = 0;
int ptr = 0;
for (int row = 0; row < 200; row++)
{
ColorTable colorTable =
2018-07-30 08:44:29 +00:00
controlBytes != null ? colorTables[controlBytes[row] & 0x0F] : colorTables[row];
2017-01-26 04:19:23 +00:00
for (int col = 0; col < 160; col++)
{
int left = (buffer[ptr] & 0xF0) >> 4;
int right = buffer[ptr] & 0x0F;
dataBuffer.setElem (element++, colorTable.entries[left].color.getRGB ());
dataBuffer.setElem (element++, colorTable.entries[right].color.getRGB ());
ptr++;
}
}
2017-01-25 11:02:50 +00:00
}
2017-01-26 04:19:23 +00:00
@Override
public String getText ()
{
StringBuilder text = new StringBuilder (super.getText ());
text.append ("\n\n");
2018-07-30 08:44:29 +00:00
if (controlBytes != null)
2017-01-26 11:30:16 +00:00
{
text.append ("SCB\n---\n");
2018-07-30 08:44:29 +00:00
for (int i = 0; i < controlBytes.length; i += 8)
2017-01-26 11:30:16 +00:00
{
for (int j = 0; j < 8; j++)
2018-07-30 08:44:29 +00:00
text.append (String.format (" %3d: %02X ", i + j, controlBytes[i + j]));
2017-01-26 11:30:16 +00:00
text.append ("\n");
}
text.append ("\n");
}
2017-01-26 04:19:23 +00:00
2017-01-27 07:11:00 +00:00
if (colorTables != null)
2017-02-01 21:15:30 +00:00
{
text.append ("Color Table\n\n #");
for (int i = 0; i < 16; i++)
text.append (String.format (" %02X ", i));
text.append ("\n--");
for (int i = 0; i < 16; i++)
text.append (" ----");
text.append ("\n");
2017-01-27 07:11:00 +00:00
for (ColorTable colorTable : colorTables)
{
2017-02-01 21:15:30 +00:00
text.append (colorTable.toLine ());
text.append ("\n");
2017-01-27 07:11:00 +00:00
}
2017-02-01 21:15:30 +00:00
}
text.append ("\nScreen lines\n\n");
for (int i = 0; i < 200; i++)
{
2018-07-28 12:00:02 +00:00
text.append (String.format ("Line: %02X %<3d%n", i));
2017-02-01 21:15:30 +00:00
text.append (HexFormatter.format (buffer, i * 160, 160));
text.append ("\n\n");
}
2017-01-26 04:19:23 +00:00
text.deleteCharAt (text.length () - 1);
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
2017-01-25 11:02:50 +00:00
}