summaryrefslogtreecommitdiff
path: root/core/fxcrt
diff options
context:
space:
mode:
authorthestig <thestig@chromium.org>2016-05-20 11:50:06 -0700
committerCommit bot <commit-bot@chromium.org>2016-05-20 11:50:06 -0700
commit1b99b2dcde9d8bf1a5944a7e0dac81ca33459af5 (patch)
tree50ce9fbd5fadac593fc0af976de6841e55e22fdf /core/fxcrt
parent3cbb6fbcc7077d94161ec95b7bc1421671317c65 (diff)
downloadpdfium-1b99b2dcde9d8bf1a5944a7e0dac81ca33459af5.tar.xz
Merge GetBits32() impls into one. Put it in fxcrt.
Review-Url: https://codereview.chromium.org/1990153003
Diffstat (limited to 'core/fxcrt')
-rw-r--r--core/fxcrt/fx_basic_util.cpp35
-rw-r--r--core/fxcrt/fx_basic_util_unittest.cpp30
-rw-r--r--core/fxcrt/include/fx_basic.h4
3 files changed, 66 insertions, 3 deletions
diff --git a/core/fxcrt/fx_basic_util.cpp b/core/fxcrt/fx_basic_util.cpp
index aa36d56f38..2d3483e9b3 100644
--- a/core/fxcrt/fx_basic_util.cpp
+++ b/core/fxcrt/fx_basic_util.cpp
@@ -7,8 +7,6 @@
#include "core/fxcrt/include/fx_basic.h"
#include "core/fxcrt/include/fx_ext.h"
-#include <cctype>
-
#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
#include <dirent.h>
#include <sys/types.h>
@@ -16,6 +14,9 @@
#include <direct.h>
#endif
+#include <algorithm>
+#include <cctype>
+
CFX_PrivateData::CFX_PrivateData() {}
CFX_PrivateData::~CFX_PrivateData() {
@@ -364,3 +365,33 @@ CFX_Vector_3by1 CFX_Matrix_3by3::TransformVector(const CFX_Vector_3by1& v) {
d * v.a + e * v.b + f * v.c,
g * v.a + h * v.b + i * v.c);
}
+
+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 = (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;
+}
diff --git a/core/fxcrt/fx_basic_util_unittest.cpp b/core/fxcrt/fx_basic_util_unittest.cpp
new file mode 100644
index 0000000000..3272eab70c
--- /dev/null
+++ b/core/fxcrt/fx_basic_util_unittest.cpp
@@ -0,0 +1,30 @@
+// Copyright 2016 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.
+
+#include "core/fxcrt/include/fx_basic.h"
+#include "testing/fx_string_testhelpers.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+uint32_t ReferenceGetBits32(const uint8_t* pData, int bitpos, int nbits) {
+ int result = 0;
+ for (int i = 0; i < nbits; i++) {
+ if (pData[(bitpos + i) / 8] & (1 << (7 - (bitpos + i) % 8)))
+ result |= 1 << (nbits - i - 1);
+ }
+ return result;
+}
+
+} // namespace
+
+TEST(fxge, GetBits32) {
+ unsigned char data[] = {0xDE, 0x3F, 0xB1, 0x7C, 0x12, 0x9A, 0x04, 0x56};
+ for (int nbits = 1; nbits <= 32; ++nbits) {
+ for (int bitpos = 0; bitpos < (int)sizeof(data) * 8 - nbits; ++bitpos) {
+ EXPECT_EQ(ReferenceGetBits32(data, bitpos, nbits),
+ GetBits32(data, bitpos, nbits));
+ }
+ }
+}
diff --git a/core/fxcrt/include/fx_basic.h b/core/fxcrt/include/fx_basic.h
index 7fdfbf699d..d3dce8c749 100644
--- a/core/fxcrt/include/fx_basic.h
+++ b/core/fxcrt/include/fx_basic.h
@@ -178,7 +178,7 @@ class CFX_UTF8Encoder {
class CFX_BasicArray {
protected:
- CFX_BasicArray(int unit_size);
+ explicit CFX_BasicArray(int unit_size);
CFX_BasicArray(const CFX_BasicArray&) = delete;
~CFX_BasicArray();
@@ -972,4 +972,6 @@ class CFX_Matrix_3by3 {
FX_FLOAT i;
};
+uint32_t GetBits32(const uint8_t* pData, int bitpos, int nbits);
+
#endif // CORE_FXCRT_INCLUDE_FX_BASIC_H_