From d9c90497089ae5cf00891d6febfa7f486f021833 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 13 Jan 2018 18:13:18 -0500 Subject: Add signed support to BitStream and BitWriter --- libqpdf/BitStream.cc | 17 +++++++++++++++++ libqpdf/BitWriter.cc | 15 +++++++++++++++ libqpdf/qpdf/BitStream.hh | 2 ++ libqpdf/qpdf/BitWriter.hh | 2 ++ 4 files changed, 36 insertions(+) (limited to 'libqpdf') diff --git a/libqpdf/BitStream.cc b/libqpdf/BitStream.cc index 14eae55d..bb52af31 100644 --- a/libqpdf/BitStream.cc +++ b/libqpdf/BitStream.cc @@ -30,6 +30,23 @@ BitStream::getBits(int nbits) this->bits_available, nbits); } +long long +BitStream::getBitsSigned(int nbits) +{ + unsigned long long bits = read_bits(this->p, this->bit_offset, + this->bits_available, nbits); + long long result = 0; + if (static_cast(bits) > 1 << (nbits - 1)) + { + result = static_cast(bits - (1 << nbits)); + } + else + { + result = static_cast(bits); + } + return result; +} + void BitStream::skipToNextByte() { diff --git a/libqpdf/BitWriter.cc b/libqpdf/BitWriter.cc index 4fb375cb..7513ac76 100644 --- a/libqpdf/BitWriter.cc +++ b/libqpdf/BitWriter.cc @@ -17,6 +17,21 @@ BitWriter::writeBits(unsigned long long val, unsigned int bits) write_bits(this->ch, this->bit_offset, val, bits, this->pl); } +void +BitWriter::writeBitsSigned(long long val, unsigned int bits) +{ + unsigned long long uval = 0; + if (val < 0) + { + uval = static_cast((1 << bits) + val); + } + else + { + uval = static_cast(val); + } + writeBits(uval, bits); +} + void BitWriter::flush() { diff --git a/libqpdf/qpdf/BitStream.hh b/libqpdf/qpdf/BitStream.hh index e45a90ee..8ea8bec4 100644 --- a/libqpdf/qpdf/BitStream.hh +++ b/libqpdf/qpdf/BitStream.hh @@ -15,6 +15,8 @@ class BitStream QPDF_DLL unsigned long long getBits(int nbits); QPDF_DLL + long long getBitsSigned(int nbits); + QPDF_DLL void skipToNextByte(); private: diff --git a/libqpdf/qpdf/BitWriter.hh b/libqpdf/qpdf/BitWriter.hh index 7e3b07a9..3d93c0b7 100644 --- a/libqpdf/qpdf/BitWriter.hh +++ b/libqpdf/qpdf/BitWriter.hh @@ -16,6 +16,8 @@ class BitWriter BitWriter(Pipeline* pl); QPDF_DLL void writeBits(unsigned long long val, unsigned int bits); + QPDF_DLL + void writeBitsSigned(long long val, unsigned int bits); // Force any partial byte to be written to the pipeline. QPDF_DLL void flush(); -- cgit v1.2.3-70-g09d2