1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-28 05:34:47 +01:00

Code cleanup

This commit is contained in:
Martin Tůma 2021-09-29 19:52:39 +02:00
parent 3c2b293deb
commit 505d7271f1
3 changed files with 47 additions and 45 deletions

View File

@ -23,7 +23,7 @@ namespace Garmin
return sizes[b0 & 0x07];
}
inline quint8 bs(const quint8 val)
inline quint32 bs(const quint32 val)
{
return (val + 7) >> 3;
}

View File

@ -116,14 +116,15 @@ bool NODFile::readBlock(Handle &hdl, quint32 blockOffset,
{
blockInfo.offset = blockOffset;
if (!(seek(hdl, blockInfo.offset + _blockOffset)
&& readUInt16(hdl, blockInfo.hdr.s0) && readUInt32(hdl, blockInfo.hdr.s2)
&& readUInt32(hdl, blockInfo.hdr.s6) && readUInt32(hdl, blockInfo.hdr.sa)
&& readUInt16(hdl, blockInfo.hdr.se) && readByte(hdl, &blockInfo.hdr.s10)
&& readByte(hdl, &blockInfo.hdr.s11) && readByte(hdl, &blockInfo.hdr.s12)))
return false;
return true;
return (seek(hdl, blockInfo.offset + _blockOffset)
&& readUInt16(hdl, blockInfo.hdr.flags)
&& readUInt32(hdl, blockInfo.hdr.baseLon)
&& readUInt32(hdl, blockInfo.hdr.baseLat)
&& readUInt32(hdl, blockInfo.hdr.unk)
&& readUInt16(hdl, blockInfo.hdr.linkInfoSize)
&& readByte(hdl, &blockInfo.hdr.linksCount)
&& readByte(hdl, &blockInfo.hdr.nodesCount)
&& readByte(hdl, &blockInfo.hdr.linkTypesCount));
}
bool NODFile::blockInfo(Handle &hdl, quint32 blockId, BlockInfo &blockInfo) const
@ -143,14 +144,14 @@ bool NODFile::blockInfo(Handle &hdl, quint32 blockId, BlockInfo &blockInfo) cons
bool NODFile::linkInfo(Handle &hdl, const BlockInfo &blockInfo, quint32 linkId,
LinkInfo &linkInfo) const
{
if (linkId >= blockInfo.hdr.s10)
if (linkId >= blockInfo.hdr.linksCount)
return false;
quint32 infoOffset = ((blockInfo.hdr.se * linkId) >> 3) + 0x13
+ ((blockInfo.hdr.s0 >> 0xb) & 1) + blockInfo.offset + _blockOffset;
quint32 s1 = ((blockInfo.hdr.s0 >> 2) & 0x1f) + 8;
quint32 s2 = (blockInfo.hdr.s0 >> 7) & 0xf;
quint32 skip = (blockInfo.hdr.se * linkId) & 7;
quint32 infoOffset = _blockOffset + blockInfo.offset + blockInfo.hdr.size()
+ ((blockInfo.hdr.linkInfoSize * linkId) >> 3);
quint32 s1 = ((blockInfo.hdr.flags >> 2) & 0x1f) + 8;
quint32 s2 = (blockInfo.hdr.flags >> 7) & 0xf;
quint32 skip = (blockInfo.hdr.linkInfoSize * linkId) & 7;
if (infoOffset > _blockOffset + _blockSize || infoOffset < blockInfo.offset)
return false;
@ -168,7 +169,7 @@ bool NODFile::linkInfo(Handle &hdl, const BlockInfo &blockInfo, quint32 linkId,
} else {
if (!bs.read(s1 - s2, linkInfo.linkOffset))
return false;
linkInfo.linkOffset += blockInfo.hdr.sa;
linkInfo.linkOffset += blockInfo.hdr.unk;
}
if (!bs.read(s2, linkInfo.nodeOffset))
@ -207,8 +208,8 @@ bool NODFile::nodeInfo(Handle &hdl, const BlockInfo &blockInfo,
quint8 latShift = 0x20 - latBits;
quint8 shift = 0x20 - maxBits;
QPoint pos((((int)(lon << lonShift) >> lonShift) << shift)
+ blockInfo.hdr.s2, (((int)(lat << latShift) >> latShift) << shift)
+ blockInfo.hdr.s6);
+ blockInfo.hdr.baseLon, (((int)(lat << latShift) >> latShift) << shift)
+ blockInfo.hdr.baseLat);
nodeInfo.bytes = ((lonBits + latBits) >> 3) + 1;
if ((maxBits < 0x1c) && (nodeInfo.flags & 8)) {
@ -230,17 +231,14 @@ bool NODFile::nodeInfo(Handle &hdl, const BlockInfo &blockInfo,
bool NODFile::nodeOffset(Handle &hdl, const BlockInfo &blockInfo,
quint8 nodeId, quint32 &nodeOffset) const
{
if (nodeId >= blockInfo.hdr.s11)
if (nodeId >= blockInfo.hdr.nodesCount)
return false;
quint32 offset = ((blockInfo.hdr.s10 * blockInfo.hdr.se + 7) >> 3)
+ 0x13 + nodeId * 3 + _blockOffset + blockInfo.offset
+ ((blockInfo.hdr.s0 >> 0xb) & 1);
quint32 offset = _blockOffset + blockInfo.offset + blockInfo.hdr.size()
+ bs(blockInfo.hdr.linksCount * blockInfo.hdr.linkInfoSize)
+ nodeId * 3;
if (!(seek(hdl, offset) && readUInt24(hdl, nodeOffset)))
return false;
return true;
return (seek(hdl, offset) && readUInt24(hdl, nodeOffset));
}
bool NODFile::nodeBlock(Handle &hdl, quint32 nodeOffset,
@ -290,7 +288,7 @@ bool NODFile::absAdjInfo(Handle &hdl, AdjacencyInfo &adj) const
return false;
BitStream1 bs(*this, hdl, _blockOffset + _blockSize - infoOffset);
quint8 linkId = adj.blockInfo.hdr.s10;
quint8 linkId = adj.blockInfo.hdr.linksCount;
quint32 m2p = 2;
quint32 skip = 8;
quint32 flags;
@ -395,7 +393,7 @@ bool NODFile::relAdjInfo(Handle &hdl, AdjacencyInfo &adj) const
BitStream1 bs(*this, hdl, _blockOffset + _blockSize - infoOffset);
quint32 linkId = adj.blockInfo.hdr.s10;
quint32 linkId = adj.blockInfo.hdr.linksCount;
quint32 skip = 8;
quint32 flagsBits = 8;
quint32 flags;
@ -499,11 +497,11 @@ int NODFile::nextNode(Handle &hdl, AdjacencyInfo &adjInfo) const
bool NODFile::linkType(Handle &hdl, const BlockInfo &blockInfo, quint8 linkId,
quint32 &type) const
{
quint32 offset = ((blockInfo.hdr.s10 * blockInfo.hdr.se + 7) >> 3) + 0x13
+ blockInfo.offset + _blockOffset + ((blockInfo.hdr.s0 >> 0xb) & 1)
+ blockInfo.hdr.s11 * 3;
quint32 offset = _blockOffset + blockInfo.offset + blockInfo.hdr.size()
+ bs(blockInfo.hdr.linksCount * blockInfo.hdr.linkInfoSize)
+ blockInfo.hdr.nodesCount * 3;
int low = 0;
int high = blockInfo.hdr.s12 - 1;
int high = blockInfo.hdr.linkTypesCount - 1;
quint16 val;
while (low <= high) {
@ -524,8 +522,8 @@ bool NODFile::linkType(Handle &hdl, const BlockInfo &blockInfo, quint8 linkId,
if (high < 0)
return false;
if (blockInfo.hdr.s12 > 1 && !(seek(hdl, offset + _blockRecordSize * high)
&& readUInt16(hdl, val)))
if ((blockInfo.hdr.linkTypesCount > 1)
&& !(seek(hdl, offset + _blockRecordSize * high) && readUInt16(hdl, val)))
return false;
type = (val & 0x3f) << 8;

View File

@ -10,18 +10,22 @@ class NODFile : public SubFile
public:
struct BlockInfo
{
quint32 offset;
struct
struct BlockHeader
{
quint32 s2; // node lon base
quint32 s6; // node lat base
quint32 sa;
quint16 s0; // flags
quint16 se; // link info bit size
quint8 s10; // links count
quint8 s11; // nodes count
quint8 s12; // link types count
} hdr;
quint32 baseLon;
quint32 baseLat;
quint32 unk;
quint16 flags;
quint16 linkInfoSize;
quint8 linksCount;
quint8 nodesCount;
quint8 linkTypesCount;
quint32 size() const {return 0x13 + ((flags >> 0xb) & 1);}
};
quint32 offset;
BlockHeader hdr;
};
struct LinkInfo