root/lib/pdf/xpdf/JPXStream.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


//========================================================================
//
// JPXStream.h
//
// Copyright 2002-2003 Glyph & Cog, LLC
//
//========================================================================

#ifndef JPXSTREAM_H
#define JPXSTREAM_H

#include <aconf.h>

#ifdef USE_GCC_PRAGMAS
#pragma interface
#endif

#include "gtypes.h"
#include "Object.h"
#include "Stream.h"

class JArithmeticDecoder;
class JArithmeticDecoderStats;

//------------------------------------------------------------------------

enum JPXColorSpaceType {
  jpxCSBiLevel = 0,
  jpxCSYCbCr1 = 1,
  jpxCSYCbCr2 = 3,
  jpxCSYCBCr3 = 4,
  jpxCSPhotoYCC = 9,
  jpxCSCMY = 11,
  jpxCSCMYK = 12,
  jpxCSYCCK = 13,
  jpxCSCIELab = 14,
  jpxCSsRGB = 16,
  jpxCSGrayscale = 17,
  jpxCSBiLevel2 = 18,
  jpxCSCIEJab = 19,
  jpxCSCISesRGB = 20,
  jpxCSROMMRGB = 21,
  jpxCSsRGBYCbCr = 22,
  jpxCSYPbPr1125 = 23,
  jpxCSYPbPr1250 = 24
};

struct JPXColorSpecCIELab {
  Guint rl, ol, ra, oa, rb, ob, il;
};

struct JPXColorSpecEnumerated {
  JPXColorSpaceType type;       // color space type
  union {
    JPXColorSpecCIELab cieLab;
  };
};

struct JPXColorSpec {
  Guint meth;                   // method
  int prec;                     // precedence
  union {
    JPXColorSpecEnumerated enumerated;
  };
};

//------------------------------------------------------------------------

struct JPXPalette {
  Guint nEntries;               // number of entries in the palette
  Guint nComps;                 // number of components in each entry
  Guint *bpc;                   // bits per component, for each component
  int *c;                       // color data:
                                //   c[i*nComps+j] = entry i, component j
};

//------------------------------------------------------------------------

struct JPXCompMap {
  Guint nChannels;              // number of channels
  Guint *comp;                  // codestream components mapped to each channel
  Guint *type;                  // 0 for direct use, 1 for palette mapping
  Guint *pComp;                 // palette components to use
};

//------------------------------------------------------------------------

struct JPXChannelDefn {
  Guint nChannels;              // number of channels
  Guint *idx;                   // channel indexes
  Guint *type;                  // channel types
  Guint *assoc;                 // channel associations
};

//------------------------------------------------------------------------

struct JPXTagTreeNode {
  GBool finished;               // true if this node is finished
  Guint val;                    // current value
};

//------------------------------------------------------------------------

struct JPXCoeff {
  Gushort flags;                // flag bits
  Gushort len;                  // number of significant bits in mag
  Guint mag;                    // magnitude value
};

// coefficient flags
#define jpxCoeffSignificantB  0
#define jpxCoeffTouchedB      1
#define jpxCoeffFirstMagRefB  2
#define jpxCoeffSignB         7
#define jpxCoeffSignificant   (1 << jpxCoeffSignificantB)
#define jpxCoeffTouched       (1 << jpxCoeffTouchedB)
#define jpxCoeffFirstMagRef   (1 << jpxCoeffFirstMagRefB)
#define jpxCoeffSign          (1 << jpxCoeffSignB)

//------------------------------------------------------------------------

struct JPXCodeBlock {
  //----- size
  Guint x0, y0, x1, y1;         // bounds

  //----- persistent state
  GBool seen;                   // true if this code-block has already
                                //   been seen
  Guint lBlock;                 // base number of bits used for pkt data length
  Guint nextPass;               // next coding pass

  //---- info from first packet
  Guint nZeroBitPlanes;         // number of zero bit planes

  //----- info for the current packet
  Guint included;               // code-block inclusion in this packet:
                                //   0=not included, 1=included
  Guint nCodingPasses;          // number of coding passes in this pkt
  Guint dataLen;                // pkt data length

  //----- coefficient data
  JPXCoeff *coeffs;             // the coefficients
  JArithmeticDecoder            // arithmetic decoder
    *arithDecoder;
  JArithmeticDecoderStats       // arithmetic decoder stats
    *stats;
};

//------------------------------------------------------------------------

struct JPXSubband {
  //----- computed
  Guint x0, y0, x1, y1;         // bounds
  Guint nXCBs, nYCBs;           // number of code-blocks in the x and y
                                //   directions

  //----- tag trees
  Guint maxTTLevel;             // max tag tree level
  JPXTagTreeNode *inclusion;    // inclusion tag tree for each subband
  JPXTagTreeNode *zeroBitPlane; // zero-bit plane tag tree for each
                                //   subband

  //----- children
  JPXCodeBlock *cbs;            // the code-blocks (len = nXCBs * nYCBs)
};

//------------------------------------------------------------------------

struct JPXPrecinct {
  //----- computed
  Guint x0, y0, x1, y1;         // bounds of the precinct

  //----- children
  JPXSubband *subbands;         // the subbands
};

//------------------------------------------------------------------------

struct JPXResLevel {
  //----- from the COD and COC segments (main and tile)
  Guint precinctWidth;          // log2(precinct width)
  Guint precinctHeight;         // log2(precinct height)

  //----- computed
  Guint x0, y0, x1, y1;         // bounds of the tile-comp (for this res level)
  Guint bx0[3], by0[3],         // subband bounds
        bx1[3], by1[3];

  //---- children
  JPXPrecinct *precincts;       // the precincts
};

//------------------------------------------------------------------------

struct JPXTileComp {
  //----- from the SIZ segment
  GBool sgned;                  // 1 for signed, 0 for unsigned
  Guint prec;                   // precision, in bits
  Guint hSep;                   // horizontal separation of samples
  Guint vSep;                   // vertical separation of samples

  //----- from the COD and COC segments (main and tile)
  Guint style;                  // coding style parameter (Scod / Scoc)
  Guint nDecompLevels;          // number of decomposition levels
  Guint codeBlockW;             // log2(code-block width)
  Guint codeBlockH;             // log2(code-block height)
  Guint codeBlockStyle;         // code-block style
  Guint transform;              // wavelet transformation

  //----- from the QCD and QCC segments (main and tile)
  Guint quantStyle;             // quantization style
  Guint *quantSteps;            // quantization step size for each subband
  Guint nQuantSteps;            // number of entries in quantSteps

  //----- computed
  Guint x0, y0, x1, y1;         // bounds of the tile-comp, in ref coords
  Guint cbW;                    // code-block width
  Guint cbH;                    // code-block height

  //----- image data
  int *data;                    // the decoded image data
  int *buf;                     // intermediate buffer for the inverse
                                //   transform

  //----- children
  JPXResLevel *resLevels;       // the resolution levels
                                //   (len = nDecompLevels + 1)
};

//------------------------------------------------------------------------

struct JPXTile {
  //----- from the COD segments (main and tile)
  Guint progOrder;              // progression order
  Guint nLayers;                // number of layers
  Guint multiComp;              // multiple component transformation

  //----- computed
  Guint x0, y0, x1, y1;         // bounds of the tile, in ref coords
  Guint maxNDecompLevels;       // max number of decomposition levels used
                                //   in any component in this tile

  //----- progression order loop counters
  Guint comp;                   //   component
  Guint res;                    //   resolution level
  Guint precinct;               //   precinct
  Guint layer;                  //   layer

  //----- children
  JPXTileComp *tileComps;       // the tile-components (len = JPXImage.nComps)
};

//------------------------------------------------------------------------

struct JPXImage {
  //----- from the SIZ segment
  Guint xSize, ySize;           // size of reference grid
  Guint xOffset, yOffset;       // image offset
  Guint xTileSize, yTileSize;   // size of tiles
  Guint xTileOffset,            // offset of first tile
        yTileOffset;
  Guint nComps;                 // number of components

  //----- computed
  Guint nXTiles;                // number of tiles in x direction
  Guint nYTiles;                // number of tiles in y direction

  //----- children
  JPXTile *tiles;               // the tiles (len = nXTiles * nYTiles)
};

//------------------------------------------------------------------------

class JPXStream: public FilterStream {
public:

  JPXStream(Stream *strA);
  virtual ~JPXStream();
  virtual StreamKind getKind() { return strJPX; }
  virtual void reset();
  virtual void close();
  virtual int getChar();
  virtual int lookChar();
  virtual GString *getPSFilter(int psLevel, char *indent);
  virtual GBool isBinary(GBool last = gTrue);
  virtual void getImageParams(int *bitsPerComponent,
                              StreamColorSpaceMode *csMode);

private:

  void fillReadBuf();
  void getImageParams2(int *bitsPerComponent, StreamColorSpaceMode *csMode);
  GBool readBoxes();
  GBool readColorSpecBox(Guint dataLen);
  GBool readCodestream(Guint len);
  GBool readTilePart();
  GBool readTilePartData(Guint tileIdx,
                         Guint tilePartLen, GBool tilePartToEOC);
  GBool readCodeBlockData(JPXTileComp *tileComp,
                          JPXResLevel *resLevel,
                          JPXPrecinct *precinct,
                          JPXSubband *subband,
                          Guint res, Guint sb,
                          JPXCodeBlock *cb);
  void inverseTransform(JPXTileComp *tileComp);
  void inverseTransformLevel(JPXTileComp *tileComp,
                             Guint r, JPXResLevel *resLevel,
                             Guint nx0, Guint ny0,
                             Guint nx1, Guint ny1);
  void inverseTransform1D(JPXTileComp *tileComp,
                          int *data, Guint stride,
                          Guint i0, Guint i1);
  GBool inverseMultiCompAndDC(JPXTile *tile);
  GBool readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen);
  int readMarkerHdr(int *segType, Guint *segLen);
  GBool readUByte(Guint *x);
  GBool readByte(int *x);
  GBool readUWord(Guint *x);
  GBool readULong(Guint *x);
  GBool readNBytes(int nBytes, GBool signd, int *x);
  GBool readBits(int nBits, Guint *x);
  void startBitBuf(Guint byteCountA);
  Guint finishBitBuf();

  Guint nComps;                 // number of components
  Guint *bpc;                   // bits per component, for each component
  Guint width, height;          // image size
  GBool haveImgHdr;             // set if a JP2/JPX image header has been
                                //   found
  JPXColorSpec cs;              // color specification
  GBool haveCS;                 // set if a color spec has been found
  JPXPalette palette;           // the palette
  GBool havePalette;            // set if a palette has been found
  JPXCompMap compMap;           // the component mapping
  GBool haveCompMap;            // set if a component mapping has been found
  JPXChannelDefn channelDefn;   // channel definition
  GBool haveChannelDefn;        // set if a channel defn has been found

  JPXImage img;                 // JPEG2000 decoder data
  Guint bitBuf;                 // buffer for bit reads
  int bitBufLen;                // number of bits in bitBuf
  GBool bitBufSkip;             // true if next bit should be skipped
                                //   (for bit stuffing)
  Guint byteCount;              // number of available bytes left

  Guint curX, curY, curComp;    // current position for lookChar/getChar
  Guint readBuf;                // read buffer
  Guint readBufLen;             // number of valid bits in readBuf
};

#endif

/* [<][>][^][v][top][bottom][index][help] */