Copyright 2012-04-26 Werner Randelshofer

org.monte.media.ilbm
Class ILBMDecoder

java.lang.Object
  extended by org.monte.media.ilbm.ILBMDecoder
All Implemented Interfaces:
IFFVisitor

public class ILBMDecoder
extends java.lang.Object
implements IFFVisitor

Creates Image objects by reading an IFF ILBM stream.

ILBM regular expression

 ILBM ::= "FORM" #{ "ILBM" BMHD [CMAP] [GRAB] [DEST] [SPRT] [CAMG] CRNG* CCRT* DRNG* [BODY] }

 BMHD ::= "BMHD" #{ BitMapHeader }
 CMAP ::= "CMAP" #{ (red green blue)* } [0]
 GRAB ::= "GRAB" #{ Point2D }
 DEST ::= "DEST" #{ DestMerge }
 SPRT ::= "SPRT" #{ SpritePrecedence }
 CAMG ::= "CAMG" #{ LONG }

 CRNG ::= "CRNG" #{ CRange }
 DRNG ::= "DRNG" #{ DRange }
 CCRT ::= "CCRT" #{ CycleInfo }
 BODY ::= "BODY" #{ UBYTE* } [0]
 
The token "#" represents a ckSize LONG count of the following braced data bytes. E.g., a BMHD's "#" should equal sizeof(BitMapHeader). Literal strings are shown in "quotes", [square bracket items] are optional, and "*" means 0 or more repetitions. A sometimes-needed pad byte is shown as "[0]".

Version:
1.8 2011-07-21 Treats CMAP specially if OCS chip set is detected.
1.7 2011-04-10 Generates gray-scale color table if no CMAP is provided. Adds support for CCRT color cycling.
1.6 2011-02-20 Adds method produceBitmaps().
1.5.1 2010-07-03 Improved performance of byterun1 decoder.
1.4 2010-01-22 Added support for DRNG color cycling.
1.3 2009-12-24 Added support for CRNG color cycling.
1.2 2004-05-20 Support for masking bitplane added. Removed enforcing of true colors (Apple fixed bugs in its Java VM).
1.1 2003-08-15 Enforcing True color for images. Due to bug in Java 1.3.1, 1.4.1 on Mac OS X 10.0 through 10.2.
1.0.2 2003-01-19 Conversion to JDK 1.3 continued.
1.0.1 2001-06-17 Conversion to JDK 1.3 in progress.
1.0 1999-10-19
Author:
Werner Randelshofer, Hausmatt 10, CH-6405 Immensee, Switzerland

Field Summary
protected static int A2024_MONITOR_ID
           
protected  java.util.ArrayList<BitmapImage> bitmapSources
           
protected static int BMHD_ID
           
protected  int bmhdCompression
           
protected  int bmhdHeight
          Raster width_ and heigth in pixels
protected  int bmhdMasking
           
protected  int bmhdNbPlanes
          Number of source bitplanes.
protected  int bmhdPageHeight
          Source "page" size in pixels.
protected  int bmhdPageWidth
          Source "page" size in pixels.
protected  int bmhdTransparentColor
          Transparent "color number" (sort of).
protected  int bmhdWidth
          Raster width_ and heigth in pixels
protected  int bmhdXAspect
          Pixel aspect, a ratio width : height
protected  int bmhdXPosition
          pixel position for this image
protected  int bmhdYAspect
          Pixel aspect, a ratio width : height
protected  int bmhdYPosition
          pixel position for this image
protected static int BODY_ID
           
protected  BitmapImage bodyBitmap
          BODY data
protected  int camg
          Commodore Amiga Graphics Mode.
protected static int CAMG_ID
           
protected  int camgMode
          CAMG Video display mode.
protected static int CCRT_ID
           
protected static int CMAP_ID
           
protected  java.awt.image.ColorModel cmapColorModel
          CMAP data.
protected static int CMP_BYTE_RUN_1
          ILBM BMHD chunk: compression algorithm.
protected static int CMP_NONE
          ILBM BMHD chunk: compression algorithm.
protected static int CMP_VERTICAL
          ILBM BMHD chunk: compression algorithm.
protected static int CRNG_ID
           
protected static int DBLNTSC_MONITOR_ID
           
protected static int DBLPAL_MONITOR_ID
           
protected static int DEFAULT_MONITOR_ID
           
protected static int DRNG_ID
           
protected static int EHB_MASK
           
protected static int EURO36_MONITOR_ID
           
protected static int EURO72_MONITOR_ID
           
protected static int EXTRAHALFBRITE_KEY
           
protected static int HAM_KEY
           
protected static int HAM_MASK
           
protected static int ILBM_ID
          Chunk ID's.
protected  java.io.InputStream inputStream
          Input stream to decode from.
protected  java.net.URL location
          URL to get the input stream from.
protected static int MODE_DIRECT_COLORS
           
protected static int MODE_EHB
           
protected static int MODE_HAM6
           
protected static int MODE_HAM8
           
protected static int MODE_INDEXED_COLORS
           
protected static int MONITOR_ID_MASK
          ILBM CAMG chunk: Mask and ID bits for CAMG ModeID.
protected static int MSK_HAS_MASK
          ILBM BMHD chunk: masking technique.
protected static int MSK_HAS_TRANSPARENT_COLOR
          ILBM BMHD chunk: masking technique.
protected static int MSK_LASSO
          ILBM BMHD chunk: masking technique.
protected static int MSK_NONE
          ILBM BMHD chunk: masking technique.
protected static int NTSC_MONITOR_ID
           
protected static int PAL_MONITOR_ID
           
protected  java.util.Hashtable properties
          Properties.
protected static int PROTO_MONITOR_ID
           
protected  java.util.ArrayList<ColorCyclingMemoryImageSource> sources
          Stores all the ILBM pictures found during decoding as an instance of ColorCyclingMemoryImageSource.
protected static int SUPER72_MONITOR_ID
           
protected static int VDAT_ID
           
protected static int VGA_MONITOR_ID
           
 
Constructor Summary
ILBMDecoder(java.io.InputStream in)
          Constructors
ILBMDecoder(java.net.URL location)
           
 
Method Summary
protected  void decodeBMHD(IFFChunk chunk)
           
protected  void decodeBODY(IFFChunk chunk)
           
protected  void decodeCAMG(IFFChunk chunk)
          Decodes the CAMG Chunk.
protected  ColorCycle decodeCCRT(IFFChunk chunk)
          Decodes the color cycling range and timing chunk (ILBM CCRT).
protected  void decodeCMAP(IFFChunk chunk, boolean is4BitsPerChannel)
           
protected  ColorCycle decodeCRNG(IFFChunk chunk)
          Decodes the color range cycling (ILBM CRNG).
protected  ColorCycle decodeDRNG(IFFChunk chunk)
          Decodes the DPaint IV enhanced color cycle chunk (ILBM DRNG)
 void enterGroup(IFFChunk chunk)
           
 void leaveGroup(IFFChunk chunk)
           
 java.util.ArrayList<ColorCyclingMemoryImageSource> produce()
          Processes the input stream and creates a vector of ColorCyclingMemoryImageSource instances.
 java.util.ArrayList<BitmapImage> produceBitmaps()
          Processes the input stream and creates a vector of BitmapImages instances.
 void registerChunks(IFFParser iff)
           
static int unpackByteRun1(byte[] in, byte[] out)
          ByteRun1 run decoder.
 void unpackVertical(byte[] in, BitmapImage bm)
          Vertical run decoder.
 void visitChunk(IFFChunk group, IFFChunk chunk)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

ILBM_ID

protected static final int ILBM_ID
Chunk ID's.


BMHD_ID

protected static final int BMHD_ID

CMAP_ID

protected static final int CMAP_ID

CAMG_ID

protected static final int CAMG_ID

CCRT_ID

protected static final int CCRT_ID

CRNG_ID

protected static final int CRNG_ID

DRNG_ID

protected static final int DRNG_ID

BODY_ID

protected static final int BODY_ID

VDAT_ID

protected static final int VDAT_ID

MONITOR_ID_MASK

protected static final int MONITOR_ID_MASK
ILBM CAMG chunk: Mask and ID bits for CAMG ModeID.

See Also:
Constant Field Values

DEFAULT_MONITOR_ID

protected static final int DEFAULT_MONITOR_ID
See Also:
Constant Field Values

NTSC_MONITOR_ID

protected static final int NTSC_MONITOR_ID
See Also:
Constant Field Values

PAL_MONITOR_ID

protected static final int PAL_MONITOR_ID
See Also:
Constant Field Values

VGA_MONITOR_ID

protected static final int VGA_MONITOR_ID
See Also:
Constant Field Values

A2024_MONITOR_ID

protected static final int A2024_MONITOR_ID
See Also:
Constant Field Values

PROTO_MONITOR_ID

protected static final int PROTO_MONITOR_ID
See Also:
Constant Field Values

EURO72_MONITOR_ID

protected static final int EURO72_MONITOR_ID
See Also:
Constant Field Values

EURO36_MONITOR_ID

protected static final int EURO36_MONITOR_ID
See Also:
Constant Field Values

SUPER72_MONITOR_ID

protected static final int SUPER72_MONITOR_ID
See Also:
Constant Field Values

DBLNTSC_MONITOR_ID

protected static final int DBLNTSC_MONITOR_ID
See Also:
Constant Field Values

DBLPAL_MONITOR_ID

protected static final int DBLPAL_MONITOR_ID
See Also:
Constant Field Values

MODE_INDEXED_COLORS

protected static final int MODE_INDEXED_COLORS
See Also:
Constant Field Values

MODE_DIRECT_COLORS

protected static final int MODE_DIRECT_COLORS
See Also:
Constant Field Values

MODE_EHB

protected static final int MODE_EHB
See Also:
Constant Field Values

MODE_HAM6

protected static final int MODE_HAM6
See Also:
Constant Field Values

MODE_HAM8

protected static final int MODE_HAM8
See Also:
Constant Field Values

HAM_MASK

protected static final int HAM_MASK
See Also:
Constant Field Values

EHB_MASK

protected static final int EHB_MASK
See Also:
Constant Field Values

HAM_KEY

protected static final int HAM_KEY
See Also:
Constant Field Values

EXTRAHALFBRITE_KEY

protected static final int EXTRAHALFBRITE_KEY
See Also:
Constant Field Values

MSK_NONE

protected static final int MSK_NONE
ILBM BMHD chunk: masking technique.

See Also:
Constant Field Values

MSK_HAS_MASK

protected static final int MSK_HAS_MASK
ILBM BMHD chunk: masking technique.

See Also:
Constant Field Values

MSK_HAS_TRANSPARENT_COLOR

protected static final int MSK_HAS_TRANSPARENT_COLOR
ILBM BMHD chunk: masking technique.

See Also:
Constant Field Values

MSK_LASSO

protected static final int MSK_LASSO
ILBM BMHD chunk: masking technique.

See Also:
Constant Field Values

CMP_NONE

protected static final int CMP_NONE
ILBM BMHD chunk: compression algorithm.

See Also:
Constant Field Values

CMP_BYTE_RUN_1

protected static final int CMP_BYTE_RUN_1
ILBM BMHD chunk: compression algorithm.

See Also:
Constant Field Values

CMP_VERTICAL

protected static final int CMP_VERTICAL
ILBM BMHD chunk: compression algorithm.

See Also:
Constant Field Values

inputStream

protected java.io.InputStream inputStream
Input stream to decode from.


location

protected java.net.URL location
URL to get the input stream from.


sources

protected java.util.ArrayList<ColorCyclingMemoryImageSource> sources
Stores all the ILBM pictures found during decoding as an instance of ColorCyclingMemoryImageSource.


bitmapSources

protected java.util.ArrayList<BitmapImage> bitmapSources

properties

protected java.util.Hashtable properties
Properties.


bmhdWidth

protected int bmhdWidth
Raster width_ and heigth in pixels


bmhdHeight

protected int bmhdHeight
Raster width_ and heigth in pixels


bmhdXPosition

protected int bmhdXPosition
pixel position for this image


bmhdYPosition

protected int bmhdYPosition
pixel position for this image


bmhdNbPlanes

protected int bmhdNbPlanes
Number of source bitplanes.


bmhdMasking

protected int bmhdMasking

bmhdCompression

protected int bmhdCompression

bmhdTransparentColor

protected int bmhdTransparentColor
Transparent "color number" (sort of).


bmhdXAspect

protected int bmhdXAspect
Pixel aspect, a ratio width : height


bmhdYAspect

protected int bmhdYAspect
Pixel aspect, a ratio width : height


bmhdPageWidth

protected int bmhdPageWidth
Source "page" size in pixels.


bmhdPageHeight

protected int bmhdPageHeight
Source "page" size in pixels.


camg

protected int camg
Commodore Amiga Graphics Mode.


camgMode

protected int camgMode
CAMG Video display mode.


cmapColorModel

protected java.awt.image.ColorModel cmapColorModel
CMAP data.


bodyBitmap

protected BitmapImage bodyBitmap
BODY data

Constructor Detail

ILBMDecoder

public ILBMDecoder(java.io.InputStream in)
Constructors


ILBMDecoder

public ILBMDecoder(java.net.URL location)
Method Detail

produce

public java.util.ArrayList<ColorCyclingMemoryImageSource> produce()
                                                           throws java.io.IOException
Processes the input stream and creates a vector of ColorCyclingMemoryImageSource instances.

Returns:
A vector of java.awt.img.ColorCyclingMemoryImageSource.
Throws:
java.io.IOException

produceBitmaps

public java.util.ArrayList<BitmapImage> produceBitmaps()
                                                throws java.io.IOException
Processes the input stream and creates a vector of BitmapImages instances.

Returns:
A vector of java.awt.img.ColorCyclingMemoryImageSource.
Throws:
java.io.IOException

registerChunks

public void registerChunks(IFFParser iff)

enterGroup

public void enterGroup(IFFChunk chunk)
Specified by:
enterGroup in interface IFFVisitor

leaveGroup

public void leaveGroup(IFFChunk chunk)
Specified by:
leaveGroup in interface IFFVisitor

visitChunk

public void visitChunk(IFFChunk group,
                       IFFChunk chunk)
                throws ParseException,
                       AbortException
Specified by:
visitChunk in interface IFFVisitor
Throws:
ParseException
AbortException

decodeBMHD

protected void decodeBMHD(IFFChunk chunk)
                   throws ParseException
Throws:
ParseException

decodeCAMG

protected void decodeCAMG(IFFChunk chunk)
                   throws ParseException
Decodes the CAMG Chunk. Requires data from BMHD Chunk.

Throws:
ParseException

decodeCMAP

protected void decodeCMAP(IFFChunk chunk,
                          boolean is4BitsPerChannel)
                   throws ParseException
Throws:
ParseException

decodeCCRT

protected ColorCycle decodeCCRT(IFFChunk chunk)
                         throws ParseException
Decodes the color cycling range and timing chunk (ILBM CCRT).
 enum {
     dontCycle = 0, forward = 1, backwards = -1
 } ccrtDirection;
 typedef struct {
   WORD enum ccrtDirection direction;  // 0=don't cycle, 1=forward, -1=backwards
   UBYTE start;      // range lower
   UBYTE end;        // range upper
   ULONG  seconds;    // seconds between cycling
   ULONG  microseconds; // msecs between cycling
   WORD  pad;        // future exp - store 0 here
 } ilbmColorCyclingRangeAndTimingChunk;
 

Throws:
ParseException

decodeCRNG

protected ColorCycle decodeCRNG(IFFChunk chunk)
                         throws ParseException
Decodes the color range cycling (ILBM CRNG).
 #define RNG_NORATE  36   // Dpaint uses this rate to mean non-active
  set {
  active = 1, reverse = 2
  } crngActive;

  // A CRange is store in a CRNG chunk.
  typedef struct {
  WORD  pad1;              // reserved for future use; store 0 here *
  WORD  rate;              // 60/sec=16384, 30/sec=8192, 1/sec=16384/60=273
  WORD set crngActive flags;     // bit0 set = active, bit 1 set = reverse
  UBYTE low; UBYTE high;         // lower and upper color registers selected
  } ilbmColorRegisterRangeChunk;
 

Throws:
ParseException

decodeDRNG

protected ColorCycle decodeDRNG(IFFChunk chunk)
                         throws ParseException
Decodes the DPaint IV enhanced color cycle chunk (ILBM DRNG)

The RNG_ACTIVE flag is set when the range is cyclable. A range should only have the RNG _ACTIVE if it:

  1. contains at least one color register
  2. has a defined rate
  3. has more than one color and/or color register
 ILBM DRNG DPaint IV enhanced color cycle chunk
 --------------------------------------------

 set {
     RNG_ACTIVE=1,RNG_DP_RESERVED=4
 } drngFlags;

 /* True color cell * /
 typedef struct {
     UBYTE cell;
     UBYTE r;
     UBYTE g;
     UBYTE b;
 } ilbmDRNGDColor;

 /* Color register cell * /
 typedef struct {
     UBYTE cell;
     UBYTE index;
 } ilbmDRNGDIndex;

 /* DRNG chunk. * /
 typedef struct {
     UBYTE min; /* min cell value * /
     UBYTE max; /* max cell value * /
     UWORD rate; /* color cycling rate, 16384 = 60 steps/second * /
     UWORD set drngFlags flags; /* 1=RNG_ACTIVE, 4=RNG_DP_RESERVED * /
     UBYTE ntrue; /* number of DColorCell structs to follow * /
     UBYTE ntregs; /* number of DIndexCell structs to follow * /
     ilbmDRNGDColor[ntrue] trueColorCells;
     ilbmDRNGDIndex[ntregs] colorRegisterCells;
 } ilbmDRangeChunk;
 

Throws:
ParseException

decodeBODY

protected void decodeBODY(IFFChunk chunk)
                   throws ParseException
Throws:
ParseException

unpackByteRun1

public static int unpackByteRun1(byte[] in,
                                 byte[] out)
                          throws ParseException
ByteRun1 run decoder.

The run encoding scheme by byteRun1 is best described by pseudo code for the decoder Unpacker (called UnPackBits in the Macintosh toolbox.

 UnPacker:
  LOOP until produced the desired number of bytes
      Read the next source byte into n
      SELECT n FROM
          [0..127] => copy the next n+1 bytes literally
          [-1..-127] => replicate the next byte -n+1 times
          -128    => no operation
      ENDCASE;
   ENDLOOP;
 

Parameters:
in -
out -
Throws:
ParseException

unpackVertical

public void unpackVertical(byte[] in,
                           BitmapImage bm)
                    throws ParseException
Vertical run decoder.

Each plane is stored in a separate VDAT chunk.

A VDAT chunk consists of an id, a length, and a body.

 struct {
    uint16 id;  // The 4 ASCII characters "VDAT"
    uint16 length,
    byte[length] body
 }
 
The body consists of a command list and a data list.
 struct {
    uint16         cnt;        // Command count + 2
    uint8[cnt - 2] cmd;        // The commands
    uint16[]       data;       // Data words
 }
 
Pseudo code for the unpacker:
 UnPacker:
  Read cnt;
  LOOP cnt - 2 TIMES
      Read the next command byte into cmd
      SELECT cmd FROM
          0 =>
                  Read the next data word into n
                  Copy the next n data words literally
          1    =>
                  Read the next data word into n
                  Replicate the next data word n times
          [2..127] =>
                  Replicate the next data word cmd times
          [-1..-128] =>
                  Copy the next -cmd data words literally
      ENDCASE;
      IF end of data reached THEN EXIT END;
   ENDLOOP;
 

Throws:
ParseException

Copyright 2012-04-26 Werner Randelshofer