diff mupdf-source/thirdparty/zxing-cpp/core/src/BitSource.cpp @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/zxing-cpp/core/src/BitSource.cpp	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,77 @@
+/*
+* Copyright 2016 Nu-book Inc.
+* Copyright 2016 ZXing authors
+*/
+// SPDX-License-Identifier: Apache-2.0
+
+#include "BitSource.h"
+
+#include "ByteArray.h"
+#include "ZXAlgorithms.h"
+
+#include <stdexcept>
+
+namespace ZXing {
+
+int
+BitSource::available() const
+{
+	return 8 * (Size(_bytes) - _byteOffset) - _bitOffset;
+}
+
+static int ReadBitsImpl(int numBits, const ByteArray& _bytes, int available, int& _byteOffset, int& _bitOffset)
+{
+	if (numBits < 1 || numBits > 32 || numBits > available) {
+		throw std::out_of_range("BitSource::readBits: out of range");
+	}
+
+	int result = 0;
+
+	// First, read remainder from current byte
+	if (_bitOffset > 0) {
+		int bitsLeft = 8 - _bitOffset;
+		int toRead = numBits < bitsLeft ? numBits : bitsLeft;
+		int bitsToNotRead = bitsLeft - toRead;
+		int mask = (0xFF >> (8 - toRead)) << bitsToNotRead;
+		result = (_bytes[_byteOffset] & mask) >> bitsToNotRead;
+		numBits -= toRead;
+		_bitOffset += toRead;
+		if (_bitOffset == 8) {
+			_bitOffset = 0;
+			_byteOffset++;
+		}
+	}
+
+	// Next read whole bytes
+	if (numBits > 0) {
+		while (numBits >= 8) {
+			result = (result << 8) | _bytes[_byteOffset];
+			_byteOffset++;
+			numBits -= 8;
+		}
+
+		// Finally read a partial byte
+		if (numBits > 0) {
+			int bitsToNotRead = 8 - numBits;
+			int mask = (0xFF >> bitsToNotRead) << bitsToNotRead;
+			result = (result << numBits) | ((_bytes[_byteOffset] & mask) >> bitsToNotRead);
+			_bitOffset += numBits;
+		}
+	}
+
+	return result;
+}
+
+int BitSource::readBits(int numBits)
+{
+	return ReadBitsImpl(numBits, _bytes, available(), _byteOffset, _bitOffset);
+}
+
+int BitSource::peakBits(int numBits) const
+{
+	int bitOffset = _bitOffset;
+	int byteOffset = _byteOffset;
+	return ReadBitsImpl(numBits, _bytes, available(), byteOffset, bitOffset);
+}
+
+} // ZXing