Copyright 2011-01-06 Werner Randelshofer

ch.randelshofer.media.ilbm
Class ILBMDecoder

java.lang.Object
  extended by ch.randelshofer.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* [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.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 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 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 DRNG_ID
           
protected static int EHB_MASK
           
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
          ILBM CAMG chunk: Commodore Amiga Video display modes.
protected static int MODE_EHB
          ILBM CAMG chunk: Commodore Amiga Video display modes.
protected static int MODE_HAM6
          ILBM CAMG chunk: Commodore Amiga Video display modes.
protected static int MODE_HAM8
          ILBM CAMG chunk: Commodore Amiga Video display modes.
protected static int MODE_INDEXED_COLORS
          ILBM CAMG chunk: Commodore Amiga Video display modes.
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  java.util.Hashtable properties
          Properties.
protected  java.util.ArrayList<ColorCyclingMemoryImageSource> sources
          Stores all the ILBM pictures found during decoding as an instance of ColorCyclingMemoryImageSource.
protected static int VDAT_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  void decodeCMAP(IFFChunk chunk)
           
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.
 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

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

MODE_INDEXED_COLORS

protected static final int MODE_INDEXED_COLORS
ILBM CAMG chunk: Commodore Amiga Video display modes.

See Also:
Constant Field Values

MODE_DIRECT_COLORS

protected static final int MODE_DIRECT_COLORS
ILBM CAMG chunk: Commodore Amiga Video display modes.

See Also:
Constant Field Values

MODE_EHB

protected static final int MODE_EHB
ILBM CAMG chunk: Commodore Amiga Video display modes.

See Also:
Constant Field Values

MODE_HAM6

protected static final int MODE_HAM6
ILBM CAMG chunk: Commodore Amiga Video display modes.

See Also:
Constant Field Values

MODE_HAM8

protected static final int MODE_HAM8
ILBM CAMG chunk: Commodore Amiga Video display modes.

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.


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

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)
                   throws ParseException
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 2011-01-06 Werner Randelshofer