Mercurial > hgrepos > Python2 > PyMuPDF
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
