]> git.ipfire.org Git - thirdparty/cups.git/blame - pdftops/JPXStream.h
Merge changes from CUPS 1.4svn-r7199.
[thirdparty/cups.git] / pdftops / JPXStream.h
CommitLineData
ef416fc2 1//========================================================================
2//
3// JPXStream.h
4//
5// Copyright 2002-2003 Glyph & Cog, LLC
6//
7//========================================================================
8
9#ifndef JPXSTREAM_H
10#define JPXSTREAM_H
11
12#include <config.h>
13
14#ifdef USE_GCC_PRAGMAS
15#pragma interface
16#endif
17
18#include "gtypes.h"
19#include "Object.h"
20#include "Stream.h"
21
22class JArithmeticDecoderStats;
23
24//------------------------------------------------------------------------
25
26enum JPXColorSpaceType {
27 jpxCSBiLevel = 0,
28 jpxCSYCbCr1 = 1,
29 jpxCSYCbCr2 = 3,
30 jpxCSYCBCr3 = 4,
31 jpxCSPhotoYCC = 9,
32 jpxCSCMY = 11,
33 jpxCSCMYK = 12,
34 jpxCSYCCK = 13,
35 jpxCSCIELab = 14,
36 jpxCSsRGB = 16,
37 jpxCSGrayscale = 17,
38 jpxCSBiLevel2 = 18,
39 jpxCSCIEJab = 19,
40 jpxCSCISesRGB = 20,
41 jpxCSROMMRGB = 21,
42 jpxCSsRGBYCbCr = 22,
43 jpxCSYPbPr1125 = 23,
44 jpxCSYPbPr1250 = 24
45};
46
47struct JPXColorSpecCIELab {
48 Guint rl, ol, ra, oa, rb, ob, il;
49};
50
51struct JPXColorSpecEnumerated {
52 JPXColorSpaceType type; // color space type
53 union {
54 JPXColorSpecCIELab cieLab;
55 };
56};
57
58struct JPXColorSpec {
59 Guint meth; // method
60 int prec; // precedence
61 union {
62 JPXColorSpecEnumerated enumerated;
63 };
64};
65
66//------------------------------------------------------------------------
67
68struct JPXPalette {
69 Guint nEntries; // number of entries in the palette
70 Guint nComps; // number of components in each entry
71 Guint *bpc; // bits per component, for each component
72 int *c; // color data:
73 // c[i*nComps+j] = entry i, component j
74};
75
76//------------------------------------------------------------------------
77
78struct JPXCompMap {
79 Guint nChannels; // number of channels
80 Guint *comp; // codestream components mapped to each channel
81 Guint *type; // 0 for direct use, 1 for palette mapping
82 Guint *pComp; // palette components to use
83};
84
85//------------------------------------------------------------------------
86
87struct JPXChannelDefn {
88 Guint nChannels; // number of channels
89 Guint *idx; // channel indexes
90 Guint *type; // channel types
91 Guint *assoc; // channel associations
92};
93
94//------------------------------------------------------------------------
95
96struct JPXTagTreeNode {
97 GBool finished; // true if this node is finished
98 Guint val; // current value
99};
100
101//------------------------------------------------------------------------
102
103struct JPXCoeff {
104 Gushort flags; // flag bits
105 Gushort len; // number of significant bits in mag
106 Guint mag; // magnitude value
107};
108
109// coefficient flags
110#define jpxCoeffSignificantB 0
111#define jpxCoeffTouchedB 1
112#define jpxCoeffFirstMagRefB 2
113#define jpxCoeffSignB 7
114#define jpxCoeffSignificant (1 << jpxCoeffSignificantB)
115#define jpxCoeffTouched (1 << jpxCoeffTouchedB)
116#define jpxCoeffFirstMagRef (1 << jpxCoeffFirstMagRefB)
117#define jpxCoeffSign (1 << jpxCoeffSignB)
118
119//------------------------------------------------------------------------
120
121struct JPXCodeBlock {
122 //----- size
123 Guint x0, y0, x1, y1; // bounds
124
125 //----- persistent state
126 GBool seen; // true if this code-block has already
127 // been seen
128 Guint lBlock; // base number of bits used for pkt data length
129 Guint nextPass; // next coding pass
130
131 //---- info from first packet
132 Guint nZeroBitPlanes; // number of zero bit planes
133
134 //----- info for the current packet
135 Guint included; // code-block inclusion in this packet:
136 // 0=not included, 1=included
137 Guint nCodingPasses; // number of coding passes in this pkt
138 Guint dataLen; // pkt data length
139
140 //----- coefficient data
141 JPXCoeff *coeffs; // the coefficients
142 JArithmeticDecoder // arithmetic decoder
143 *arithDecoder;
144 JArithmeticDecoderStats // arithmetic decoder stats
145 *stats;
146};
147
148//------------------------------------------------------------------------
149
150struct JPXSubband {
151 //----- computed
152 Guint x0, y0, x1, y1; // bounds
153 Guint nXCBs, nYCBs; // number of code-blocks in the x and y
154 // directions
155
156 //----- tag trees
157 Guint maxTTLevel; // max tag tree level
158 JPXTagTreeNode *inclusion; // inclusion tag tree for each subband
159 JPXTagTreeNode *zeroBitPlane; // zero-bit plane tag tree for each
160 // subband
161
162 //----- children
163 JPXCodeBlock *cbs; // the code-blocks (len = nXCBs * nYCBs)
164};
165
166//------------------------------------------------------------------------
167
168struct JPXPrecinct {
169 //----- computed
170 Guint x0, y0, x1, y1; // bounds of the precinct
171
172 //----- children
173 JPXSubband *subbands; // the subbands
174};
175
176//------------------------------------------------------------------------
177
178struct JPXResLevel {
179 //----- from the COD and COC segments (main and tile)
180 Guint precinctWidth; // log2(precinct width)
181 Guint precinctHeight; // log2(precinct height)
182
183 //----- computed
184 Guint x0, y0, x1, y1; // bounds of the tile-comp (for this res level)
185 Guint bx0[3], by0[3], // subband bounds
186 bx1[3], by1[3];
187
188 //---- children
189 JPXPrecinct *precincts; // the precincts
190};
191
192//------------------------------------------------------------------------
193
194struct JPXTileComp {
195 //----- from the SIZ segment
196 GBool sgned; // 1 for signed, 0 for unsigned
197 Guint prec; // precision, in bits
198 Guint hSep; // horizontal separation of samples
199 Guint vSep; // vertical separation of samples
200
201 //----- from the COD and COC segments (main and tile)
202 Guint style; // coding style parameter (Scod / Scoc)
203 Guint nDecompLevels; // number of decomposition levels
204 Guint codeBlockW; // log2(code-block width)
205 Guint codeBlockH; // log2(code-block height)
206 Guint codeBlockStyle; // code-block style
207 Guint transform; // wavelet transformation
208
209 //----- from the QCD and QCC segments (main and tile)
210 Guint quantStyle; // quantization style
211 Guint *quantSteps; // quantization step size for each subband
212 Guint nQuantSteps; // number of entries in quantSteps
213
214 //----- computed
215 Guint x0, y0, x1, y1; // bounds of the tile-comp, in ref coords
216 Guint cbW; // code-block width
217 Guint cbH; // code-block height
218
219 //----- image data
220 int *data; // the decoded image data
221 int *buf; // intermediate buffer for the inverse
222 // transform
223
224 //----- children
225 JPXResLevel *resLevels; // the resolution levels
226 // (len = nDecompLevels + 1)
227};
228
229//------------------------------------------------------------------------
230
231struct JPXTile {
232 //----- from the COD segments (main and tile)
233 Guint progOrder; // progression order
234 Guint nLayers; // number of layers
235 Guint multiComp; // multiple component transformation
236
237 //----- computed
238 Guint x0, y0, x1, y1; // bounds of the tile, in ref coords
239 Guint maxNDecompLevels; // max number of decomposition levels used
240 // in any component in this tile
241
242 //----- progression order loop counters
243 Guint comp; // component
244 Guint res; // resolution level
245 Guint precinct; // precinct
246 Guint layer; // layer
247
248 //----- children
249 JPXTileComp *tileComps; // the tile-components (len = JPXImage.nComps)
250};
251
252//------------------------------------------------------------------------
253
254struct JPXImage {
255 //----- from the SIZ segment
256 Guint xSize, ySize; // size of reference grid
257 Guint xOffset, yOffset; // image offset
258 Guint xTileSize, yTileSize; // size of tiles
259 Guint xTileOffset, // offset of first tile
260 yTileOffset;
261 Guint nComps; // number of components
262
263 //----- computed
264 Guint nXTiles; // number of tiles in x direction
265 Guint nYTiles; // number of tiles in y direction
266
267 //----- children
268 JPXTile *tiles; // the tiles (len = nXTiles * nYTiles)
269};
270
271//------------------------------------------------------------------------
272
273class JPXStream: public FilterStream {
274public:
275
276 JPXStream(Stream *strA);
277 virtual ~JPXStream();
278 virtual StreamKind getKind() { return strJPX; }
279 virtual void reset();
280 virtual int getChar();
281 virtual int lookChar();
282 virtual GString *getPSFilter(int psLevel, char *indent);
283 virtual GBool isBinary(GBool last = gTrue);
284 virtual void getImageParams(int *bitsPerComponent,
285 StreamColorSpaceMode *csMode);
286
287private:
288
289 void fillReadBuf();
290 void getImageParams2(int *bitsPerComponent, StreamColorSpaceMode *csMode);
291 GBool readBoxes();
292 GBool readColorSpecBox(Guint dataLen);
293 GBool readCodestream(Guint len);
294 GBool readTilePart();
295 GBool readTilePartData(Guint tileIdx,
296 Guint tilePartLen, GBool tilePartToEOC);
297 GBool readCodeBlockData(JPXTileComp *tileComp,
298 JPXResLevel *resLevel,
299 JPXPrecinct *precinct,
300 JPXSubband *subband,
301 Guint res, Guint sb,
302 JPXCodeBlock *cb);
303 void inverseTransform(JPXTileComp *tileComp);
304 void inverseTransformLevel(JPXTileComp *tileComp,
305 Guint r, JPXResLevel *resLevel,
306 Guint nx0, Guint ny0,
307 Guint nx1, Guint ny1);
308 void inverseTransform1D(JPXTileComp *tileComp,
309 int *data, Guint stride,
310 Guint i0, Guint i1);
311 GBool inverseMultiCompAndDC(JPXTile *tile);
312 GBool readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen);
313 int readMarkerHdr(int *segType, Guint *segLen);
314 GBool readUByte(Guint *x);
315 GBool readByte(int *x);
316 GBool readUWord(Guint *x);
317 GBool readULong(Guint *x);
318 GBool readNBytes(int nBytes, GBool signd, int *x);
319 GBool readBits(int nBits, Guint *x);
320 void clearBitBuf();
321
322 Guint nComps; // number of components
323 Guint *bpc; // bits per component, for each component
324 Guint width, height; // image size
325 GBool haveImgHdr; // set if a JP2/JPX image header has been
326 // found
327 JPXColorSpec cs; // color specification
328 GBool haveCS; // set if a color spec has been found
329 JPXPalette palette; // the palette
330 GBool havePalette; // set if a palette has been found
331 JPXCompMap compMap; // the component mapping
332 GBool haveCompMap; // set if a component mapping has been found
333 JPXChannelDefn channelDefn; // channel definition
334 GBool haveChannelDefn; // set if a channel defn has been found
335
336 JPXImage img; // JPEG2000 decoder data
337 Guint bitBuf; // buffer for bit reads
338 int bitBufLen; // number of bits in bitBuf
339 GBool bitBufSkip; // true if next bit should be skipped
340 // (for bit stuffing)
341 Guint byteCount; // number of bytes read since last call
342 // to clearBitBuf
343
344 Guint curX, curY, curComp; // current position for lookChar/getChar
345 Guint readBuf; // read buffer
346 Guint readBufLen; // number of valid bits in readBuf
347};
348
349#endif