Copyright 2011-01-06 Werner Randelshofer

ch.randelshofer.media.pbm
Class PBMDecoder

java.lang.Object
  extended by ch.randelshofer.media.pbm.PBMDecoder
All Implemented Interfaces:
IFFVisitor

public class PBMDecoder
extends java.lang.Object
implements IFFVisitor

Creates Image objects by reading an IFF PBM stream.

PBM regular expression

 PBM ::= "FORM" #{ "PBM" 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 }
 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.6 2010-08-02 Added support for CRNG and DRNG chunks.
1.5.1 2010-07-03 Improved performance of byterun1 decoder.
1.0 2005-04-05 Created.
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 static int CMAP_ID
           
protected  java.awt.image.ColorModel cmapColorModel
          CMAP data.
protected static int CMP_BYTE_RUN_1
          PBM BMHD chunk: compression algorithm.
protected static int CMP_NONE
          PBM BMHD chunk: compression algorithm.
protected static int CRNG_ID
           
protected static int DRNG_ID
           
protected  java.io.InputStream inputStream
          Input stream to decode from.
protected  java.net.URL location
          URL to get the input stream from.
protected  ColorCyclingMemoryImageSource memoryImageSource
          BODY data
protected static int MSK_HAS_MASK
          PBM BMHD chunk: masking technique.
protected static int MSK_HAS_TRANSPARENT_COLOR
          PBM BMHD chunk: masking technique.
protected static int MSK_LASSO
          PBM BMHD chunk: masking technique.
protected static int MSK_NONE
          PBM BMHD chunk: masking technique.
protected static int PBM_ID
          Chunk ID's.
protected  java.util.Hashtable properties
          Properties.
protected  java.util.ArrayList<ColorCyclingMemoryImageSource> sources
          Stores all the PBM pictures found during decoding as an instance of MemoryImageSource.
 
Constructor Summary
PBMDecoder(java.io.InputStream in)
          Constructors
PBMDecoder(java.net.URL location)
           
 
Method Summary
protected  void decodeBMHD(IFFChunk chunk)
          Decodes the bitmap header (PBM BMHD).
protected  void decodeBODY(IFFChunk 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 MemoryImageSource instances.
 void registerChunks(IFFParser iff)
           
static int unpackByteRun1(byte[] in, byte[] out)
          ByteRun1 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

PBM_ID

protected static final int PBM_ID
Chunk ID's.


BMHD_ID

protected static final int BMHD_ID

CMAP_ID

protected static final int CMAP_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

MSK_NONE

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

See Also:
Constant Field Values

MSK_HAS_MASK

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

See Also:
Constant Field Values

MSK_HAS_TRANSPARENT_COLOR

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

See Also:
Constant Field Values

MSK_LASSO

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

See Also:
Constant Field Values

CMP_NONE

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

See Also:
Constant Field Values

CMP_BYTE_RUN_1

protected static final int CMP_BYTE_RUN_1
PBM 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 PBM pictures found during decoding as an instance of MemoryImageSource.


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.


cmapColorModel

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


memoryImageSource

protected ColorCyclingMemoryImageSource memoryImageSource
BODY data

Constructor Detail

PBMDecoder

public PBMDecoder(java.io.InputStream in)
Constructors


PBMDecoder

public PBMDecoder(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 MemoryImageSource instances.

Returns:
A vector of java.awt.img.MemoryImageSource.
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
Decodes the bitmap header (PBM BMHD).
 typedef UBYTE Masking; // Choice of masking technique

 #define mskNone                 0
 #define mskHasMask              1
 #define mskHasTransparentColor  2
 #define mskLasso                3

 typedef UBYTE Compression; // Choice of compression algorithm
     // applied to the rows of all source and mask planes.
     // "cmpByteRun1" is the byte run encoding. Do not compress
     // accross rows!
 #define cmpNone      0
 #define cmpByteRun1  1

 typedef struct {
   UWORD       w, h; // raster width & height in pixels
   WORD        x, y; // pixel position for this image
   UBYTE       nbPlanes; // # source bitplanes
   Masking     masking;
   Compression compression;
   UBYTE       pad1;     // unused; ignore on read, write as 0
   UWORD       transparentColor; // transparent "color number" (sort of)
   UBYTE       xAspect, yAspect; // pixel aspect, a ratio width : height
   WORD        pageWidth, pageHeight; // source "page" size in pixels
   } BitmapHeader;
 

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

Copyright 2011-01-06 Werner Randelshofer