Class PBMDecoder

java.lang.Object
org.monte.media.pbm.PBMDecoder
All Implemented Interfaces:
IFFVisitor

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

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

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

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

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

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

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

      protected ColorCyclingMemoryImageSource memoryImageSource
      BODY data
  • Constructor Details

    • PBMDecoder

      public PBMDecoder(InputStream in)
      Constructors
    • PBMDecoder

      public PBMDecoder(URL location)
  • Method Details

    • produce

      Processes the input stream and creates a vector of MemoryImageSource instances.
      Returns:
      A vector of java.awt.img.MemoryImageSource.
      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
      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 and 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