Class ILBMDecoder

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

public class ILBMDecoder extends 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]".
Author:
Werner Randelshofer, Hausmatt 10, CH-6405 Goldau, Switzerland
  • Field Details

    • 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:
    • DEFAULT_MONITOR_ID

      protected static final int DEFAULT_MONITOR_ID
      See Also:
    • NTSC_MONITOR_ID

      protected static final int NTSC_MONITOR_ID
      See Also:
    • PAL_MONITOR_ID

      protected static final int PAL_MONITOR_ID
      See Also:
    • VGA_MONITOR_ID

      protected static final int VGA_MONITOR_ID
      See Also:
    • A2024_MONITOR_ID

      protected static final int A2024_MONITOR_ID
      See Also:
    • PROTO_MONITOR_ID

      protected static final int PROTO_MONITOR_ID
      See Also:
    • EURO72_MONITOR_ID

      protected static final int EURO72_MONITOR_ID
      See Also:
    • EURO36_MONITOR_ID

      protected static final int EURO36_MONITOR_ID
      See Also:
    • SUPER72_MONITOR_ID

      protected static final int SUPER72_MONITOR_ID
      See Also:
    • DBLNTSC_MONITOR_ID

      protected static final int DBLNTSC_MONITOR_ID
      See Also:
    • DBLPAL_MONITOR_ID

      protected static final int DBLPAL_MONITOR_ID
      See Also:
    • MODE_INDEXED_COLORS

      protected static final int MODE_INDEXED_COLORS
      See Also:
    • MODE_DIRECT_COLORS

      protected static final int MODE_DIRECT_COLORS
      See Also:
    • MODE_EHB

      protected static final int MODE_EHB
      See Also:
    • MODE_HAM6

      protected static final int MODE_HAM6
      See Also:
    • MODE_HAM8

      protected static final int MODE_HAM8
      See Also:
    • HAM_MASK

      protected static final int HAM_MASK
      See Also:
    • EHB_MASK

      protected static final int EHB_MASK
      See Also:
    • HAM_KEY

      protected static final int HAM_KEY
      See Also:
    • EXTRAHALFBRITE_KEY

      protected static final int EXTRAHALFBRITE_KEY
      See Also:
    • MSK_NONE

      protected static final int MSK_NONE
      ILBM BMHD chunk: masking technique.
      See Also:
    • MSK_HAS_MASK

      protected static final int MSK_HAS_MASK
      ILBM BMHD chunk: masking technique.
      See Also:
    • MSK_HAS_TRANSPARENT_COLOR

      protected static final int MSK_HAS_TRANSPARENT_COLOR
      ILBM BMHD chunk: masking technique.
      See Also:
    • MSK_LASSO

      protected static final int MSK_LASSO
      ILBM BMHD chunk: masking technique.
      See Also:
    • CMP_NONE

      protected static final int CMP_NONE
      ILBM BMHD chunk: compression algorithm.
      See Also:
    • CMP_BYTE_RUN_1

      protected static final int CMP_BYTE_RUN_1
      ILBM BMHD chunk: compression algorithm.
      See Also:
    • CMP_VERTICAL

      protected static final int CMP_VERTICAL
      ILBM BMHD chunk: compression algorithm.
      See Also:
    • inputStream

      protected InputStream inputStream
      Input stream to decode from.
    • location

      protected URL location
      URL to get the input stream from.
    • sources

      Stores all the ILBM pictures found during decoding as an instance of ColorCyclingMemoryImageSource.
    • bitmapSources

      protected ArrayList<AmigaBitmapImage> bitmapSources
    • bmhdWidth

      protected int bmhdWidth
      Raster width and height in pixels
    • bmhdHeight

      protected int bmhdHeight
      Raster width and height 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 ColorModel cmapColorModel
      CMAP data.
    • bodyBitmap

      protected AmigaBitmapImage bodyBitmap
      BODY data
  • Constructor Details

    • ILBMDecoder

      public ILBMDecoder(InputStream in)
      Constructors
    • ILBMDecoder

      public ILBMDecoder(URL location)
  • Method Details

    • produce

      Processes the input stream and creates a vector of ColorCyclingMemoryImageSource instances.
      Returns:
      A vector of java.awt.img.ColorCyclingMemoryImageSource.
      Throws:
      IOException
    • produceBitmaps

      public ArrayList<AmigaBitmapImage> produceBitmaps() throws IOException
      Processes the input stream and creates a vector of BitmapImages instances.
      Returns:
      A vector of java.awt.img.ColorCyclingMemoryImageSource.
      Throws:
      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, AmigaBitmapImage 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