libpgf  7.15.32
PGF - Progressive Graphics File
BitStream.h File Reference
#include "PGFtypes.h"

Go to the source code of this file.

Macros

#define MAKEU64(a, b)   ((UINT64) (((UINT32) (a)) | ((UINT64) ((UINT32) (b))) << 32))
 Make 64 bit unsigned integer from two 32 bit unsigned integers. More...
 

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,
 
)    ((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
poscurrent 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 }
#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
streamA bit stream stored in array of unsigned integers
posA 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
#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
streamA bit stream stored in array of unsigned integers
posA valid zero-based position in the bit stream
lenNumber 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
static const UINT32 Filled
Definition: BitStream.h:38
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

◆ 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
streamA bit stream stored in array of unsigned integers
posA valid zero-based position in the bit stream
kNumber of bits to compare
valValue 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 }
#define MAKEU64(a, b)
Make 64 bit unsigned integer from two 32 bit unsigned integers.
Definition: BitStream.h:41
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
static const UINT32 Filled
Definition: BitStream.h:38
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

◆ GetBit()

bool GetBit ( UINT32 *  stream,
UINT32  pos 
)
inline

Return one bit of a bit stream

Parameters
streamA bit stream stored in array of unsigned integers
posA 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

◆ GetValueBlock()

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

Read k-bit number from stream at position pos

Parameters
streamA bit stream stored in array of unsigned integers
posA valid zero-based position in the bit stream
kNumber 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
static const UINT32 Filled
Definition: BitStream.h:38
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

◆ NumberOfWords()

UINT32 NumberOfWords ( UINT32  pos)
inline

Compute number of the 32-bit words

Parameters
posCurrent 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

◆ 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
streamA bit stream stored in array of unsigned integers
posA valid zero-based position in the bit stream
lensize 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
static const UINT32 Filled
Definition: BitStream.h:38
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

◆ 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
streamA bit stream stored in array of unsigned integers
posA valid zero-based position in the bit stream
lensize 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

◆ SetBit()

void SetBit ( UINT32 *  stream,
UINT32  pos 
)
inline

Set one bit of a bit stream to 1

Parameters
streamA bit stream stored in array of unsigned integers
posA 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

◆ SetBitBlock()

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

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

Parameters
streamA bit stream stored in array of unsigned integers
posA valid zero-based position in the bit stream
lenNumber 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
static const UINT32 Filled
Definition: BitStream.h:38
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

◆ 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
streamA bit stream stored in array of unsigned integers
posA valid zero-based position in the bit stream
valValue to store in stream at position pos
kNumber 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 }
#define WordWidthLog
ld of WordWidth
Definition: PGFplatform.h:74
static const UINT32 Filled
Definition: BitStream.h:38
#define WordWidth
WordBytes*8.
Definition: PGFplatform.h:73

Variable Documentation

◆ Filled

const UINT32 Filled = 0xFFFFFFFF
static

Definition at line 38 of file BitStream.h.