Overview | Package | Class | Tree | Deprecated | Index | Help
| Copyright 2012-04-26 Werner Randelshofer
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD

## org.monte.media.ilbm
Class ILBMDecoder

    java.lang.Object
      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`

Overview | Package | Class | Tree | Deprecated | Index | Help
| Copyright 2012-04-26 Werner Randelshofer
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD