public class PBMDecoder extends java.lang.Object implements IFFVisitor
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]".Modifier and Type | Field and Description |
---|---|
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 and Description |
---|
PBMDecoder(java.io.InputStream in)
Constructors
|
PBMDecoder(java.net.URL location) |
Modifier and Type | Method and Description |
---|---|
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) |
protected static final int PBM_ID
protected static final int BMHD_ID
protected static final int CMAP_ID
protected static final int CRNG_ID
protected static final int DRNG_ID
protected static final int BODY_ID
protected static final int MSK_NONE
protected static final int MSK_HAS_MASK
protected static final int MSK_HAS_TRANSPARENT_COLOR
protected static final int MSK_LASSO
protected static final int CMP_NONE
protected static final int CMP_BYTE_RUN_1
protected java.io.InputStream inputStream
protected java.net.URL location
protected java.util.ArrayList<ColorCyclingMemoryImageSource> sources
protected java.util.Hashtable properties
protected int bmhdWidth
protected int bmhdHeight
protected int bmhdXPosition
protected int bmhdYPosition
protected int bmhdNbPlanes
protected int bmhdMasking
protected int bmhdCompression
protected int bmhdTransparentColor
protected int bmhdXAspect
protected int bmhdYAspect
protected int bmhdPageWidth
protected int bmhdPageHeight
protected java.awt.image.ColorModel cmapColorModel
protected ColorCyclingMemoryImageSource memoryImageSource
public PBMDecoder(java.io.InputStream in)
public PBMDecoder(java.net.URL location)
public java.util.ArrayList<ColorCyclingMemoryImageSource> produce() throws java.io.IOException
java.io.IOException
public void registerChunks(IFFParser iff)
public void enterGroup(IFFChunk chunk)
enterGroup
in interface IFFVisitor
public void leaveGroup(IFFChunk chunk)
leaveGroup
in interface IFFVisitor
public void visitChunk(IFFChunk group, IFFChunk chunk) throws ParseException, AbortException
visitChunk
in interface IFFVisitor
ParseException
AbortException
protected void decodeBMHD(IFFChunk chunk) throws ParseException
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;
ParseException
protected void decodeCMAP(IFFChunk chunk) throws ParseException
ParseException
protected ColorCycle decodeCRNG(IFFChunk chunk) throws ParseException
#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;
ParseException
protected ColorCycle decodeDRNG(IFFChunk chunk) throws ParseException
The RNG_ACTIVE flag is set when the range is cyclable. A range should only have the RNG _ACTIVE if it:
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;
ParseException
protected void decodeBODY(IFFChunk chunk) throws ParseException
ParseException
public static int unpackByteRun1(byte[] in, byte[] out) throws ParseException
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;
in
- out
- ParseException