]> git.ipfire.org Git - thirdparty/cups.git/blame - pdftops/JArithmeticDecoder.h
Merge changes from CUPS 1.4svn-r7199.
[thirdparty/cups.git] / pdftops / JArithmeticDecoder.h
CommitLineData
ef416fc2 1//========================================================================
2//
3// JArithmeticDecoder.h
4//
5// Arithmetic decoder used by the JBIG2 and JPEG2000 decoders.
6//
7// Copyright 2002-2004 Glyph & Cog, LLC
8//
9//========================================================================
10
11#ifndef JARITHMETICDECODER_H
12#define JARITHMETICDECODER_H
13
14#include <config.h>
15
16#ifdef USE_GCC_PRAGMAS
17#pragma interface
18#endif
19
20#include "gtypes.h"
21
22class Stream;
23
24//------------------------------------------------------------------------
25// JArithmeticDecoderStats
26//------------------------------------------------------------------------
27
28class JArithmeticDecoderStats {
29public:
30
31 JArithmeticDecoderStats(int contextSizeA);
32 ~JArithmeticDecoderStats();
33 JArithmeticDecoderStats *copy();
34 void reset();
35 int getContextSize() { return contextSize; }
36 void copyFrom(JArithmeticDecoderStats *stats);
37 void setEntry(Guint cx, int i, int mps);
38
39private:
40
41 Guchar *cxTab; // cxTab[cx] = (i[cx] << 1) + mps[cx]
42 int contextSize;
43
44 friend class JArithmeticDecoder;
45};
46
47//------------------------------------------------------------------------
48// JArithmeticDecoder
49//------------------------------------------------------------------------
50
51class JArithmeticDecoder {
52public:
53
54 JArithmeticDecoder();
55 ~JArithmeticDecoder();
56
57 void setStream(Stream *strA)
58 { str = strA; dataLen = 0; limitStream = gFalse; }
59 void setStream(Stream *strA, int dataLenA)
60 { str = strA; dataLen = dataLenA; limitStream = gTrue; }
61
62 // Start decoding on a new stream. This fills the byte buffers and
63 // runs INITDEC.
64 void start();
65
66 // Restart decoding on an interrupted stream. This refills the
67 // buffers if needed, but does not run INITDEC. (This is used in
68 // JPEG 2000 streams when codeblock data is split across multiple
69 // packets/layers.)
70 void restart(int dataLenA);
71
72 // Read any leftover data in the stream.
73 void cleanup();
74
75 // Decode one bit.
76 int decodeBit(Guint context, JArithmeticDecoderStats *stats);
77
78 // Decode eight bits.
79 int decodeByte(Guint context, JArithmeticDecoderStats *stats);
80
81 // Returns false for OOB, otherwise sets *<x> and returns true.
82 GBool decodeInt(int *x, JArithmeticDecoderStats *stats);
83
84 Guint decodeIAID(Guint codeLen,
85 JArithmeticDecoderStats *stats);
86
87private:
88
89 Guint readByte();
90 int decodeIntBit(JArithmeticDecoderStats *stats);
91 void byteIn();
92
93 static Guint qeTab[47];
94 static int nmpsTab[47];
95 static int nlpsTab[47];
96 static int switchTab[47];
97
98 Guint buf0, buf1;
99 Guint c, a;
100 int ct;
101
102 Guint prev; // for the integer decoder
103
104 Stream *str;
105 int dataLen;
106 GBool limitStream;
107};
108
109#endif