blob: 704fd18418ee58c944b10d23daf64d8552e27da0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include <algorithm>
#include "core/fxcrt/fx_system.h"
uint32_t GetBits32(const uint8_t* pData, int bitpos, int nbits) {
ASSERT(0 < nbits && nbits <= 32);
const uint8_t* dataPtr = &pData[bitpos / 8];
int bitShift;
int bitMask;
int dstShift;
int bitCount = bitpos & 0x07;
if (nbits < 8 && nbits + bitCount <= 8) {
bitShift = 8 - nbits - bitCount;
bitMask = (1 << nbits) - 1;
dstShift = 0;
} else {
bitShift = 0;
int bitOffset = 8 - bitCount;
bitMask = (1 << std::min(bitOffset, nbits)) - 1;
dstShift = nbits - bitOffset;
}
uint32_t result =
static_cast<uint32_t>((*dataPtr++ >> bitShift & bitMask) << dstShift);
while (dstShift >= 8) {
dstShift -= 8;
result |= *dataPtr++ << dstShift;
}
if (dstShift > 0) {
bitShift = 8 - dstShift;
bitMask = (1 << dstShift) - 1;
result |= *dataPtr++ >> bitShift & bitMask;
}
return result;
}
|