1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-10-07 07:13:21 +02:00
GPXSee/src/map/IMG/huffmanstream.cpp

75 lines
1.3 KiB
C++
Raw Normal View History

#include "huffmanstream.h"
HuffmanStream::HuffmanStream(const SubFile &file, SubFile::Handle &hdl,
quint32 length, const HuffmanTable &table, bool line)
: BitStream4(file, hdl, length), _table(table), _symbolDataSize(0),
_symbolData(0)
{
if (line) {
if (!(sign(_lonSign) && sign(_latSign)))
return;
} else {
_lonSign = 0;
_latSign = 0;
}
quint32 eb;
if (!read(1, eb))
return;
if (eb) {
qWarning("Extended polygon/lines not supported");
flush();
}
}
bool HuffmanStream::sign(int &val)
{
quint32 bit;
val = 0;
if (!read(1, bit))
return false;
if (bit) {
if (!read(1, bit))
return false;
val = bit ? -1 : 1;
}
return true;
}
bool HuffmanStream::readDelta(int sign, qint32 &symbol)
{
2020-02-02 09:03:35 +01:00
quint8 size;
quint32 next;
quint8 nextSize = qMin((quint32)(32 - _symbolDataSize), bitsAvailable());
2020-02-02 09:03:35 +01:00
if (!read(nextSize, next))
return false;
2020-02-02 09:03:35 +01:00
_symbolData = (_symbolData << nextSize) | next;
_symbolDataSize += nextSize;
2020-02-02 09:03:35 +01:00
symbol = _table.symbol(_symbolData << (32 - _symbolDataSize), size);
if (size <= _symbolDataSize)
_symbolDataSize -= size;
else
return false;
if (symbol && !sign) {
if (!_symbolDataSize)
return false;
else {
sign = ((1U << (_symbolDataSize - 1)) & _symbolData) ? -1 : 1;
_symbolDataSize--;
}
}
symbol = sign * symbol;
return true;
}