libpgf: BitStream.h File Reference

| libpgf 7.21.2 PGF - Progressive Graphics File

Loading...
Searching...
No Matches
BitStream.h File Reference
`#include "PGFtypes.h"`

Go to the source code of this file.

## Macros
#define | MAKEU64(a, b)
| Make 64 bit unsigned integer from two 32 bit unsigned integers.

## Functions
void | SetBit (UINT32 *stream, UINT32 pos)
void | ClearBit (UINT32 *stream, UINT32 pos)
bool | GetBit (UINT32 *stream, UINT32 pos)
bool | CompareBitBlock (UINT32 *stream, UINT32 pos, UINT32 k, UINT32 val)
void | SetValueBlock (UINT32 *stream, UINT32 pos, UINT32 val, UINT32 k)
UINT32 | GetValueBlock (UINT32 *stream, UINT32 pos, UINT32 k)
void | ClearBitBlock (UINT32 *stream, UINT32 pos, UINT32 len)
void | SetBitBlock (UINT32 *stream, UINT32 pos, UINT32 len)
UINT32 | SeekBitRange (UINT32 *stream, UINT32 pos, UINT32 len)
UINT32 | SeekBit1Range (UINT32 *stream, UINT32 pos, UINT32 len)
UINT32 | AlignWordPos (UINT32 pos)
UINT32 | NumberOfWords (UINT32 pos)

## Variables
static const UINT32 | Filled = 0xFFFFFFFF

## Macro Definition Documentation

## ◆ MAKEU64

#define MAKEU64 | ( |  | a,
|  |  | b )

Value:
((UINT64) (((UINT32) (a)) | ((UINT64) ((UINT32) (b))) << 32))

Make 64 bit unsigned integer from two 32 bit unsigned integers.

Definition at line 41 of file BitStream.h.

## Function Documentation

## ◆ AlignWordPos()

UINT32 AlignWordPos | ( | UINT32 | pos | ) |
| inline

Compute bit position of the next 32-bit word

Parameters

  pos | current bit stream position

Returns
  bit position of next 32-bit word

Definition at line 328 of file BitStream.h.

328 {
329// return ((pos + WordWidth - 1) >> WordWidthLog) << WordWidthLog;
330 return DWWIDTHBITS(pos);
331}
DWWIDTHBITS
#define DWWIDTHBITS(bits)
aligns scanline width in bits to DWORD value
Definition PGFplatform.h:83

## ◆ ClearBit()

void ClearBit | ( | UINT32 * | stream,
|  | UINT32 | pos )
| inline

Set one bit of a bit stream to 0

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream

Definition at line 70 of file BitStream.h.

70 {
71 stream[pos >> WordWidthLog] &= ~(1 << (pos%WordWidth));
72}
WordWidthLog
#define WordWidthLog
ld of WordWidth
Definition PGFplatform.h:74
WordWidth
#define WordWidth
WordBytes*8.
Definition PGFplatform.h:73

## ◆ ClearBitBlock()

void ClearBitBlock | ( | UINT32 * | stream,
|  | UINT32 | pos,
|  | UINT32 | len )
| inline

Clear block of size at least len at position pos in stream

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream
  len | Number of bits set to 0

Definition at line 169 of file BitStream.h.

169 {
170 ASSERT(len > 0);
171 const UINT32 iFirstInt = pos >> WordWidthLog;
172 const UINT32 iLastInt = (pos + len - 1) >> WordWidthLog;
173
174 const UINT32 startMask = Filled << (pos%WordWidth);
175// const UINT32 endMask=Filled>>(WordWidth-1-((pos+len-1)%WordWidth));
176
177 if (iFirstInt == iLastInt) {
178 stream[iFirstInt] &= ~(startMask /*& endMask*/);
179 } else {
180 stream[iFirstInt] &= ~startMask;
181 for (UINT32 i = iFirstInt + 1; i <= iLastInt; i++) { // changed <=
182 stream[i] = 0;
183 }
184 //stream[iLastInt] &= ~endMask;
185 }
186}
Filled
static const UINT32 Filled
Definition BitStream.h:38

## ◆ CompareBitBlock()

bool CompareBitBlock | ( | UINT32 * | stream,
|  | UINT32 | pos,
|  | UINT32 | k,
|  | UINT32 | val )
| inline

Compare k-bit binary representation of stream at position pos with val

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream
  k | Number of bits to compare
  val | Value to compare with

Returns
  true if equal

Definition at line 91 of file BitStream.h.

91 {
92 const UINT32 iLoInt = pos >> WordWidthLog;
93 const UINT32 iHiInt = (pos + k - 1) >> WordWidthLog;
94 ASSERT(iLoInt <= iHiInt);
95 const UINT32 mask = (Filled >> (WordWidth - k));
96
97 if (iLoInt == iHiInt) {
98 // fits into one integer
99 val &= mask;
100 val <<= (pos%WordWidth);
101 return (stream[iLoInt] & val) == val;
102 } else {
103 // must be splitted over integer boundary
104 UINT64 v1 = MAKEU64(stream[iLoInt], stream[iHiInt]);
105 UINT64 v2 = UINT64(val & mask) << (pos%WordWidth);
106 return (v1 & v2) == v2;
107 }
108}
MAKEU64
#define MAKEU64(a, b)
Make 64 bit unsigned integer from two 32 bit unsigned integers.
Definition BitStream.h:41

## ◆ GetBit()

bool GetBit | ( | UINT32 * | stream,
|  | UINT32 | pos )
| inline

Return one bit of a bit stream

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream

Returns
  bit at position pos of bit stream stream

Definition at line 79 of file BitStream.h.

79 {
80 return (stream[pos >> WordWidthLog] & (1 << (pos%WordWidth))) > 0;
81
82}

## ◆ GetValueBlock()

UINT32 GetValueBlock | ( | UINT32 * | stream,
|  | UINT32 | pos,
|  | UINT32 | k )
| inline

Read k-bit number from stream at position pos

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream
  k | Number of bits to read: 1 <= k <= 32

Definition at line 142 of file BitStream.h.

142 {
143 UINT32 count, hiCount;
144 const UINT32 iLoInt = pos >> WordWidthLog; // integer of first bit
145 const UINT32 iHiInt = (pos + k - 1) >> WordWidthLog; // integer of last bit
146 const UINT32 loMask = Filled << (pos%WordWidth);
147 const UINT32 hiMask = Filled >> (WordWidth - 1 - ((pos + k - 1)%WordWidth));
148
149 if (iLoInt == iHiInt) {
150 // inside integer boundary
151 count = stream[iLoInt] & (loMask & hiMask);
152 count >>= pos%WordWidth;
153 } else {
154 // overlapping integer boundary
155 count = stream[iLoInt] & loMask;
156 count >>= pos%WordWidth;
157 hiCount = stream[iHiInt] & hiMask;
158 hiCount <<= WordWidth - (pos%WordWidth);
159 count |= hiCount;
160 }
161 return count;
162}

## ◆ NumberOfWords()

UINT32 NumberOfWords | ( | UINT32 | pos | ) |
| inline

Compute number of the 32-bit words

Parameters

  pos | Current bit stream position

Returns
  Number of 32-bit words

Definition at line 337 of file BitStream.h.

337 {
338 return (pos + WordWidth - 1) >> WordWidthLog;
339}

## ◆ SeekBit1Range()

UINT32 SeekBit1Range | ( | UINT32 * | stream,
|  | UINT32 | pos,
|  | UINT32 | len )
| inline

Returns the distance to the next 0 in stream at position pos. If no 0 is found within len bits, then len is returned.

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream
  len | size of search area (in bits) return The distance to the next 0 in stream at position pos

Definition at line 249 of file BitStream.h.

249 {
250 UINT32 count = 0;
251 UINT32 testMask = 1 << (pos%WordWidth);
252 UINT32* word = stream + (pos >> WordWidthLog);
253
254 while (((*word & testMask) != 0) && (count < len)) {
255 count++;
256 testMask <<= 1;
257 if (!testMask) {
258 word++; testMask = 1;
259
260 // fast steps if all bits in a word are one
261 while ((count + WordWidth <= len) && (*word == Filled)) {
262 word++;
263 count += WordWidth;
264 }
265 }
266 }
267 return count;
268}

## ◆ SeekBitRange()

UINT32 SeekBitRange | ( | UINT32 * | stream,
|  | UINT32 | pos,
|  | UINT32 | len )
| inline

Returns the distance to the next 1 in stream at position pos. If no 1 is found within len bits, then len is returned.

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream
  len | size of search area (in bits) return The distance to the next 1 in stream at position pos

Definition at line 220 of file BitStream.h.

220 {
221 UINT32 count = 0;
222 UINT32 testMask = 1 << (pos%WordWidth);
223 UINT32* word = stream + (pos >> WordWidthLog);
224
225 while (((*word & testMask) == 0) && (count < len)) {
226 count++;
227 testMask <<= 1;
228 if (!testMask) {
229 word++; testMask = 1;
230
231 // fast steps if all bits in a word are zero
232 while ((count + WordWidth <= len) && (*word == 0)) {
233 word++;
234 count += WordWidth;
235 }
236 }
237 }
238
239 return count;
240}

## ◆ SetBit()

void SetBit | ( | UINT32 * | stream,
|  | UINT32 | pos )
| inline

Set one bit of a bit stream to 1

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream

Definition at line 62 of file BitStream.h.

62 {
63 stream[pos >> WordWidthLog] |= (1 << (pos%WordWidth));
64}

## ◆ SetBitBlock()

void SetBitBlock | ( | UINT32 * | stream,
|  | UINT32 | pos,
|  | UINT32 | len )
| inline

Set block of size at least len at position pos in stream

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream
  len | Number of bits set to 1

Definition at line 193 of file BitStream.h.

193 {
194 ASSERT(len > 0);
195
196 const UINT32 iFirstInt = pos >> WordWidthLog;
197 const UINT32 iLastInt = (pos + len - 1) >> WordWidthLog;
198
199 const UINT32 startMask = Filled << (pos%WordWidth);
200// const UINT32 endMask=Filled>>(WordWidth-1-((pos+len-1)%WordWidth));
201
202 if (iFirstInt == iLastInt) {
203 stream[iFirstInt] |= (startMask /*& endMask*/);
204 } else {
205 stream[iFirstInt] |= startMask;
206 for (UINT32 i = iFirstInt + 1; i <= iLastInt; i++) { // changed <=
207 stream[i] = Filled;
208 }
209 //stream[iLastInt] &= ~endMask;
210 }
211}

## ◆ SetValueBlock()

void SetValueBlock | ( | UINT32 * | stream,
|  | UINT32 | pos,
|  | UINT32 | val,
|  | UINT32 | k )
| inline

Store k-bit binary representation of val in stream at position pos

Parameters

  stream | A bit stream stored in array of unsigned integers
  pos | A valid zero-based position in the bit stream
  val | Value to store in stream at position pos
  k | Number of bits of integer representation of val

Definition at line 116 of file BitStream.h.

116 {
117 const UINT32 offset = pos%WordWidth;
118 const UINT32 iLoInt = pos >> WordWidthLog;
119 const UINT32 iHiInt = (pos + k - 1) >> WordWidthLog;
120 ASSERT(iLoInt <= iHiInt);
121 const UINT32 loMask = Filled << offset;
122 const UINT32 hiMask = Filled >> (WordWidth - 1 - ((pos + k - 1)%WordWidth));
123
124 if (iLoInt == iHiInt) {
125 // fits into one integer
126 stream[iLoInt] &= ~(loMask & hiMask); // clear bits
127 stream[iLoInt] |= val << offset; // write value
128 } else {
129 // must be splitted over integer boundary
130 stream[iLoInt] &= ~loMask; // clear bits
131 stream[iLoInt] |= val << offset; // write lower part of value
132 stream[iHiInt] &= ~hiMask; // clear bits
133 stream[iHiInt] |= val >> (WordWidth - offset); // write higher part of value
134 }
135}

## Variable Documentation

## ◆ Filled

const UINT32 Filled = 0xFFFFFFFF
| static

Definition at line 38 of file BitStream.h.