mirror of
https://github.com/tumic0/GPXSee.git
synced 2025-07-06 15:42:51 +02:00
Compare commits
32 Commits
Author | SHA1 | Date | |
---|---|---|---|
d3558198ca | |||
acc69f5c3d | |||
7a900f2252 | |||
dad76a4e89 | |||
e28e69b248 | |||
7fffd6a161 | |||
c4fd82e5a0 | |||
fa08c0dbea | |||
070eff2115 | |||
20a4870904 | |||
1bb9908936 | |||
36555b3140 | |||
6564fb36ab | |||
1a3356b8fe | |||
7ad64922c9 | |||
64a8ec1b84 | |||
0a75298b2b | |||
99be5699af | |||
cdb641b204 | |||
f57bd48840 | |||
c2abf2c146 | |||
a5a2070ccc | |||
ed7cb1beb1 | |||
37d832bc7f | |||
c322bf9f68 | |||
2705ffbbfe | |||
e8962dd50f | |||
b37e32d622 | |||
2b1d0d2189 | |||
33e3471ca3 | |||
bf55f1e07d | |||
37a0eec48f |
@ -1,4 +1,4 @@
|
|||||||
version: 7.13.{build}
|
version: 7.14.{build}
|
||||||
configuration: Release
|
configuration: Release
|
||||||
platform: Any CPU
|
platform: Any CPU
|
||||||
environment:
|
environment:
|
||||||
|
@ -3,7 +3,7 @@ unix:!macx {
|
|||||||
} else {
|
} else {
|
||||||
TARGET = GPXSee
|
TARGET = GPXSee
|
||||||
}
|
}
|
||||||
VERSION = 7.13
|
VERSION = 7.14
|
||||||
|
|
||||||
QT += core \
|
QT += core \
|
||||||
gui \
|
gui \
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1456
lang/gpxsee_en.ts
1456
lang/gpxsee_en.ts
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1860
lang/gpxsee_pt_PT.ts
Normal file
1860
lang/gpxsee_pt_PT.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,7 @@
|
|||||||
; The name of the installer
|
; The name of the installer
|
||||||
Name "GPXSee"
|
Name "GPXSee"
|
||||||
; Program version
|
; Program version
|
||||||
!define VERSION "7.13"
|
!define VERSION "7.14"
|
||||||
|
|
||||||
; The file to write
|
; The file to write
|
||||||
OutFile "GPXSee-${VERSION}.exe"
|
OutFile "GPXSee-${VERSION}.exe"
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
; The name of the installer
|
; The name of the installer
|
||||||
Name "GPXSee"
|
Name "GPXSee"
|
||||||
; Program version
|
; Program version
|
||||||
!define VERSION "7.13"
|
!define VERSION "7.14"
|
||||||
|
|
||||||
; The file to write
|
; The file to write
|
||||||
OutFile "GPXSee-${VERSION}_x64.exe"
|
OutFile "GPXSee-${VERSION}_x64.exe"
|
||||||
|
@ -265,6 +265,14 @@ bool FITParser::parseData(CTX &ctx, const MessageDefinition *def)
|
|||||||
if (val != 0x7f)
|
if (val != 0x7f)
|
||||||
ctx.trackpoint.setTemperature((qint8)val);
|
ctx.trackpoint.setTemperature((qint8)val);
|
||||||
break;
|
break;
|
||||||
|
case 73:
|
||||||
|
if (val != 0xffffffff)
|
||||||
|
ctx.trackpoint.setSpeed(val / 1000.0f);
|
||||||
|
break;
|
||||||
|
case 78:
|
||||||
|
if (val != 0xffffffff)
|
||||||
|
ctx.trackpoint.setElevation((val / 5.0) - 500);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -54,6 +54,7 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasTime() const
|
bool hasTime() const
|
||||||
{
|
{
|
||||||
for (int i = 0; i < size(); i++) {
|
for (int i = 0; i < size(); i++) {
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#include "dem.h"
|
|
||||||
#include "route.h"
|
#include "route.h"
|
||||||
|
|
||||||
|
|
||||||
@ -33,7 +32,8 @@ Graph Route::elevation() const
|
|||||||
GraphSegment &gs = graph.last();
|
GraphSegment &gs = graph.last();
|
||||||
|
|
||||||
for (int i = 0; i < _data.size(); i++)
|
for (int i = 0; i < _data.size(); i++)
|
||||||
gs.append(GraphPoint(_distance.at(i), NAN, _data.at(i).elevation()));
|
if (_data.at(i).hasElevation())
|
||||||
|
gs.append(GraphPoint(_distance.at(i), NAN, _data.at(i).elevation()));
|
||||||
|
|
||||||
return graph;
|
return graph;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#include "dem.h"
|
|
||||||
#include "track.h"
|
#include "track.h"
|
||||||
|
|
||||||
|
|
||||||
@ -177,7 +176,7 @@ Graph Track::elevation() const
|
|||||||
GraphSegment gs;
|
GraphSegment gs;
|
||||||
|
|
||||||
for (int j = 0; j < sd.size(); j++) {
|
for (int j = 0; j < sd.size(); j++) {
|
||||||
if (seg.outliers.contains(j))
|
if (!sd.at(j).hasElevation() || seg.outliers.contains(j))
|
||||||
continue;
|
continue;
|
||||||
gs.append(GraphPoint(seg.distance.at(j), seg.time.at(j),
|
gs.append(GraphPoint(seg.distance.at(j), seg.time.at(j),
|
||||||
sd.at(j).elevation()));
|
sd.at(j).elevation()));
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#define CHECK(condition) \
|
#define CHECK(condition) \
|
||||||
if (!(condition)) { \
|
if (!(condition)) { \
|
||||||
_errorString = "Invalid/corrupted IMG file"; \
|
_errorString = "Unsupported or invalid IMG file"; \
|
||||||
return; \
|
return; \
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,11 +85,6 @@ IMG::IMG(const QString &fileName)
|
|||||||
&& read(type, sizeof(type)) && readValue(size) && readValue(part));
|
&& read(type, sizeof(type)) && readValue(size) && readValue(part));
|
||||||
SubFile::Type tt = SubFile::type(type);
|
SubFile::Type tt = SubFile::type(type);
|
||||||
|
|
||||||
if (tt == SubFile::GMP) {
|
|
||||||
_errorString = "NT maps not supported";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString fn(QByteArray(name, sizeof(name)));
|
QString fn(QByteArray(name, sizeof(name)));
|
||||||
if (SubFile::isTileFile(tt)) {
|
if (SubFile::isTileFile(tt)) {
|
||||||
VectorTile *tile;
|
VectorTile *tile;
|
||||||
@ -101,7 +96,7 @@ IMG::IMG(const QString &fileName)
|
|||||||
tile = *it;
|
tile = *it;
|
||||||
|
|
||||||
SubFile *file = part ? tile->file(tt)
|
SubFile *file = part ? tile->file(tt)
|
||||||
: tile->addFile(this, tt, size);
|
: tile->addFile(this, tt);
|
||||||
CHECK(file);
|
CHECK(file);
|
||||||
|
|
||||||
_file.seek(offset + 0x20);
|
_file.seek(offset + 0x20);
|
||||||
@ -114,7 +109,7 @@ IMG::IMG(const QString &fileName)
|
|||||||
} else if (tt == SubFile::TYP) {
|
} else if (tt == SubFile::TYP) {
|
||||||
SubFile *typ = 0;
|
SubFile *typ = 0;
|
||||||
if (typFile.isNull()) {
|
if (typFile.isNull()) {
|
||||||
_typ = new SubFile(this, size);
|
_typ = new SubFile(this);
|
||||||
typ = _typ;
|
typ = _typ;
|
||||||
typFile = fn;
|
typFile = fn;
|
||||||
} else if (fn == typFile)
|
} else if (fn == typFile)
|
||||||
@ -166,7 +161,7 @@ void IMG::load()
|
|||||||
{
|
{
|
||||||
Q_ASSERT(!_style);
|
Q_ASSERT(!_style);
|
||||||
|
|
||||||
if (_typ && _typ->isValid())
|
if (_typ)
|
||||||
_style = new Style(_typ);
|
_style = new Style(_typ);
|
||||||
else {
|
else {
|
||||||
QFile typFile(ProgramPaths::typFile());
|
QFile typFile(ProgramPaths::typFile());
|
||||||
|
@ -56,11 +56,11 @@ bool LBLFile::init()
|
|||||||
quint16 codepage;
|
quint16 codepage;
|
||||||
quint8 multiplier, poiMultiplier;
|
quint8 multiplier, poiMultiplier;
|
||||||
|
|
||||||
if (!(seek(hdl, 0x15) && readUInt32(hdl, _offset)
|
if (!(seek(hdl, _gmpOffset + 0x15) && readUInt32(hdl, _offset)
|
||||||
&& readUInt32(hdl, _size) && readByte(hdl, multiplier)
|
&& readUInt32(hdl, _size) && readByte(hdl, multiplier)
|
||||||
&& readByte(hdl, _encoding) && seek(hdl, 0x57)
|
&& readByte(hdl, _encoding) && seek(hdl, _gmpOffset + 0x57)
|
||||||
&& readUInt32(hdl, _poiOffset) && readUInt32(hdl, _poiSize)
|
&& readUInt32(hdl, _poiOffset) && readUInt32(hdl, _poiSize)
|
||||||
&& readByte(hdl, poiMultiplier) && seek(hdl, 0xAA)
|
&& readByte(hdl, poiMultiplier) && seek(hdl, _gmpOffset + 0xAA)
|
||||||
&& readUInt16(hdl, codepage)))
|
&& readUInt16(hdl, codepage)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -9,9 +9,12 @@ class QTextCodec;
|
|||||||
class LBLFile : public SubFile
|
class LBLFile : public SubFile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LBLFile(IMG *img, quint32 size)
|
LBLFile(IMG *img)
|
||||||
: SubFile(img, size), _codec(0), _offset(0), _size(0), _poiOffset(0),
|
: SubFile(img), _codec(0), _offset(0), _size(0), _poiOffset(0),
|
||||||
_poiSize(0), _poiMultiplier(0), _multiplier(0), _encoding(0) {}
|
_poiSize(0), _poiMultiplier(0), _multiplier(0), _encoding(0) {}
|
||||||
|
LBLFile(SubFile *gmp, quint32 offset) : SubFile(gmp, offset),
|
||||||
|
_codec(0), _offset(0), _size(0), _poiOffset(0), _poiSize(0),
|
||||||
|
_poiMultiplier(0), _multiplier(0), _encoding(0) {}
|
||||||
|
|
||||||
Label label(Handle &hdl, quint32 offset, bool poi = false);
|
Label label(Handle &hdl, quint32 offset, bool poi = false);
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ bool NETFile::init()
|
|||||||
Handle hdl;
|
Handle hdl;
|
||||||
quint8 multiplier;
|
quint8 multiplier;
|
||||||
|
|
||||||
if (!(seek(hdl, 0x15) && readUInt32(hdl, _offset)
|
if (!(seek(hdl, _gmpOffset + 0x15) && readUInt32(hdl, _offset)
|
||||||
&& readUInt32(hdl, _size) && readByte(hdl, multiplier)))
|
&& readUInt32(hdl, _size) && readByte(hdl, multiplier)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -6,8 +6,9 @@
|
|||||||
class NETFile : public SubFile
|
class NETFile : public SubFile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NETFile(IMG *img, quint32 size)
|
NETFile(IMG *img) : SubFile(img), _offset(0), _size(0), _multiplier(0) {}
|
||||||
: SubFile(img, size), _offset(0), _size(0), _multiplier(0) {}
|
NETFile(SubFile *gmp, quint32 offset) : SubFile(gmp, offset),
|
||||||
|
_offset(0), _size(0), _multiplier(0) {}
|
||||||
|
|
||||||
bool lblOffset(Handle &hdl, quint32 netOffset, quint32 &lblOffset);
|
bool lblOffset(Handle &hdl, quint32 netOffset, quint32 &lblOffset);
|
||||||
|
|
||||||
|
@ -1,10 +1,26 @@
|
|||||||
#include "trefile.h"
|
#include "common/rectc.h"
|
||||||
#include "units.h"
|
#include "units.h"
|
||||||
#include "lblfile.h"
|
#include "lblfile.h"
|
||||||
#include "netfile.h"
|
#include "netfile.h"
|
||||||
#include "rgnfile.h"
|
#include "rgnfile.h"
|
||||||
|
|
||||||
|
|
||||||
|
static int bitSize(quint8 baseSize, bool variableSign, bool extraBit)
|
||||||
|
{
|
||||||
|
int bits = 2;
|
||||||
|
if (baseSize <= 9)
|
||||||
|
bits += baseSize;
|
||||||
|
else
|
||||||
|
bits += 2 * baseSize - 9;
|
||||||
|
|
||||||
|
if (variableSign)
|
||||||
|
bits++;
|
||||||
|
if (extraBit)
|
||||||
|
bits++;
|
||||||
|
|
||||||
|
return bits;
|
||||||
|
}
|
||||||
|
|
||||||
bool RGNFile::BitStream::read(int bits, quint32 &val)
|
bool RGNFile::BitStream::read(int bits, quint32 &val)
|
||||||
{
|
{
|
||||||
val = 0;
|
val = 0;
|
||||||
@ -34,29 +50,42 @@ bool RGNFile::BitStream::read(int bits, quint32 &val)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RGNFile::BitStream::readDelta(int bits, int sign, bool extraBit,
|
RGNFile::DeltaStream::DeltaStream(const SubFile &file, Handle &hdl,
|
||||||
|
quint32 length, quint8 info, bool extraBit, bool extended)
|
||||||
|
: BitStream(file, hdl, length), _readBits(0xFFFFFFFF)
|
||||||
|
{
|
||||||
|
_extraBit = extraBit ? 1 : 0;
|
||||||
|
if (!(sign(_lonSign) && sign(_latSign)))
|
||||||
|
return;
|
||||||
|
if (extended) {
|
||||||
|
quint32 b;
|
||||||
|
if (!read(1, b))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_lonBits = bitSize(info & 0x0F, !_lonSign, extraBit);
|
||||||
|
_latBits = bitSize(info >> 4, !_latSign, false);
|
||||||
|
_readBits = _lonBits + _latBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RGNFile::DeltaStream::readDelta(int bits, int sign, int extraBit,
|
||||||
qint32 &delta)
|
qint32 &delta)
|
||||||
{
|
{
|
||||||
quint32 value;
|
quint32 value;
|
||||||
int bo = 0;
|
|
||||||
|
|
||||||
if (!read(bits, value))
|
if (!read(bits, value))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (extraBit) {
|
value >>= extraBit;
|
||||||
value>>=1;
|
|
||||||
bo = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sign) {
|
if (!sign) {
|
||||||
qint32 signMask = 1 << (bits - bo - 1);
|
qint32 signMask = 1 << (bits - extraBit - 1);
|
||||||
if (value & signMask) {
|
if (value & signMask) {
|
||||||
qint32 comp = value ^ signMask;
|
qint32 comp = value ^ signMask;
|
||||||
if (comp)
|
if (comp)
|
||||||
delta = comp - signMask;
|
delta = comp - signMask;
|
||||||
else {
|
else {
|
||||||
qint32 other;
|
qint32 other;
|
||||||
if (!readDelta(bits - bo, sign, false, other))
|
if (!readDelta(bits - extraBit, sign, false, other))
|
||||||
return false;
|
return false;
|
||||||
if (other < 0)
|
if (other < 0)
|
||||||
delta = 1 - signMask + other;
|
delta = 1 - signMask + other;
|
||||||
@ -73,42 +102,15 @@ bool RGNFile::BitStream::readDelta(int bits, int sign, bool extraBit,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RGNFile::BitStream::finish()
|
bool RGNFile::DeltaStream::sign(int &val)
|
||||||
{
|
|
||||||
while (_length--)
|
|
||||||
if (!_file.readByte(_hdl, _data))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool RGNFile::init()
|
|
||||||
{
|
|
||||||
Handle hdl;
|
|
||||||
|
|
||||||
if (!(seek(hdl, 0x15) && readUInt32(hdl, _offset)
|
|
||||||
&& readUInt32(hdl, _size) && readUInt32(hdl, _polygonsOffset)
|
|
||||||
&& readUInt32(hdl, _polygonsSize) && seek(hdl, 0x39)
|
|
||||||
&& readUInt32(hdl, _linesOffset) && readUInt32(hdl, _linesSize)
|
|
||||||
&& seek(hdl, 0x55) && readUInt32(hdl, _pointsOffset)
|
|
||||||
&& readUInt32(hdl, _pointsSize)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (_offset + _size > size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RGNFile::sign(BitStream &bs, int &val)
|
|
||||||
{
|
{
|
||||||
quint32 bit;
|
quint32 bit;
|
||||||
val = 0;
|
val = 0;
|
||||||
|
|
||||||
if (!bs.read(1, bit))
|
if (!read(1, bit))
|
||||||
return false;
|
return false;
|
||||||
if (bit) {
|
if (bit) {
|
||||||
if (!bs.read(1, bit))
|
if (!read(1, bit))
|
||||||
return false;
|
return false;
|
||||||
val = bit ? -1 : 1;
|
val = bit ? -1 : 1;
|
||||||
}
|
}
|
||||||
@ -116,20 +118,41 @@ bool RGNFile::sign(BitStream &bs, int &val)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RGNFile::bitSize(quint8 baseSize, bool variableSign, bool extraBit)
|
|
||||||
|
bool RGNFile::init()
|
||||||
{
|
{
|
||||||
int bits = 2;
|
Handle hdl;
|
||||||
if (baseSize <= 9)
|
quint16 hdrLen;
|
||||||
bits += baseSize;
|
|
||||||
else
|
|
||||||
bits += 2 * baseSize - 9;
|
|
||||||
|
|
||||||
if (variableSign)
|
if (!(seek(hdl, _gmpOffset) && readUInt16(hdl, hdrLen)
|
||||||
bits++;
|
&& seek(hdl, _gmpOffset + 0x15) && readUInt32(hdl, _offset)
|
||||||
if (extraBit)
|
&& readUInt32(hdl, _size)))
|
||||||
bits++;
|
return false;
|
||||||
|
|
||||||
return bits;
|
if (hdrLen >= 0x5D) {
|
||||||
|
if (!(readUInt32(hdl, _polygonsOffset) && readUInt32(hdl, _polygonsSize)
|
||||||
|
&& seek(hdl, _gmpOffset + 0x39) && readUInt32(hdl, _linesOffset)
|
||||||
|
&& readUInt32(hdl, _linesSize) && seek(hdl, _gmpOffset + 0x55)
|
||||||
|
&& readUInt32(hdl, _pointsOffset) && readUInt32(hdl, _pointsSize)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hdrLen >= 0x7D) {
|
||||||
|
quint32 dictOffset, dictSize;
|
||||||
|
if (!(seek(hdl, _gmpOffset + 0x71) && readUInt32(hdl, dictOffset)
|
||||||
|
&& readUInt32(hdl, dictSize)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// NT maps
|
||||||
|
if (dictSize || dictOffset) {
|
||||||
|
qWarning("NT compression not supported");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_init = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RGNFile::polyObjects(const RectC &rect, Handle &hdl, const SubDiv *subdiv,
|
bool RGNFile::polyObjects(const RectC &rect, Handle &hdl, const SubDiv *subdiv,
|
||||||
@ -167,28 +190,17 @@ bool RGNFile::polyObjects(const RectC &rect, Handle &hdl, const SubDiv *subdiv,
|
|||||||
poly.type = (segment.type() == Segment::Polygon)
|
poly.type = (segment.type() == Segment::Polygon)
|
||||||
? ((quint32)(type & 0x7F)) << 8 : ((quint32)(type & 0x3F)) << 8;
|
? ((quint32)(type & 0x7F)) << 8 : ((quint32)(type & 0x3F)) << 8;
|
||||||
|
|
||||||
RectC br;
|
|
||||||
QPoint pos(subdiv->lon() + ((qint32)lon<<(24-subdiv->bits())),
|
QPoint pos(subdiv->lon() + ((qint32)lon<<(24-subdiv->bits())),
|
||||||
subdiv->lat() + ((qint32)lat<<(24-subdiv->bits())));
|
subdiv->lat() + ((qint32)lat<<(24-subdiv->bits())));
|
||||||
Coordinates c(toWGS84(pos.x()), toWGS84(pos.y()));
|
Coordinates c(toWGS84(pos.x()), toWGS84(pos.y()));
|
||||||
br = br.united(c);
|
RectC br(c, c);
|
||||||
poly.points.append(QPointF(c.lon(), c.lat()));
|
poly.points.append(QPointF(c.lon(), c.lat()));
|
||||||
|
|
||||||
BitStream bs(*this, hdl, len);
|
qint32 lonDelta, latDelta;
|
||||||
int lonSign, latSign;
|
DeltaStream stream(*this, hdl, len, bitstreamInfo, labelPtr & 0x400000,
|
||||||
if (!sign(bs, lonSign) || !sign(bs, latSign))
|
false);
|
||||||
return false;
|
while (stream.readNext(lonDelta, latDelta)) {
|
||||||
bool extraBit = labelPtr & 0x400000;
|
|
||||||
int lonBits = bitSize(bitstreamInfo & 0x0F, !lonSign, extraBit);
|
|
||||||
int latBits = bitSize(bitstreamInfo >> 4, !latSign, false);
|
|
||||||
|
|
||||||
while (bs.hasNext(lonBits + latBits)) {
|
|
||||||
qint32 lonDelta, latDelta;
|
|
||||||
|
|
||||||
if (!(bs.readDelta(lonBits, lonSign, extraBit, lonDelta)
|
|
||||||
&& bs.readDelta(latBits, latSign, false, latDelta)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
pos.rx() += lonDelta<<(24-subdiv->bits());
|
pos.rx() += lonDelta<<(24-subdiv->bits());
|
||||||
pos.ry() += latDelta<<(24-subdiv->bits());
|
pos.ry() += latDelta<<(24-subdiv->bits());
|
||||||
|
|
||||||
@ -196,7 +208,7 @@ bool RGNFile::polyObjects(const RectC &rect, Handle &hdl, const SubDiv *subdiv,
|
|||||||
poly.points.append(QPointF(c.lon(), c.lat()));
|
poly.points.append(QPointF(c.lon(), c.lat()));
|
||||||
br = br.united(c);
|
br = br.united(c);
|
||||||
}
|
}
|
||||||
if (!bs.finish())
|
if (!(stream.atEnd() && stream.flush()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!rect.intersects(br))
|
if (!rect.intersects(br))
|
||||||
@ -222,10 +234,9 @@ bool RGNFile::extPolyObjects(const RectC &rect, Handle &hdl,
|
|||||||
const SubDiv *subdiv, const Segment &segment, LBLFile *lbl, Handle &lblHdl,
|
const SubDiv *subdiv, const Segment &segment, LBLFile *lbl, Handle &lblHdl,
|
||||||
QList<IMG::Poly> *polys) const
|
QList<IMG::Poly> *polys) const
|
||||||
{
|
{
|
||||||
quint32 labelPtr;
|
quint32 len, labelPtr = 0;
|
||||||
quint8 type, subtype, len8, len82, bitstreamInfo;
|
quint8 type, subtype, bitstreamInfo;
|
||||||
qint16 lon, lat;
|
qint16 lon, lat;
|
||||||
quint16 len;
|
|
||||||
|
|
||||||
|
|
||||||
if (!seek(hdl, segment.start()))
|
if (!seek(hdl, segment.start()))
|
||||||
@ -235,7 +246,8 @@ bool RGNFile::extPolyObjects(const RectC &rect, Handle &hdl,
|
|||||||
IMG::Poly poly;
|
IMG::Poly poly;
|
||||||
|
|
||||||
if (!(readByte(hdl, type) && readByte(hdl, subtype)
|
if (!(readByte(hdl, type) && readByte(hdl, subtype)
|
||||||
&& readInt16(hdl, lon) && readInt16(hdl, lat) && readByte(hdl, len8)))
|
&& readInt16(hdl, lon) && readInt16(hdl, lat)
|
||||||
|
&& readVUInt32(hdl, len) && readByte(hdl, bitstreamInfo)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (subtype & 0x80) {
|
if (subtype & 0x80) {
|
||||||
@ -243,40 +255,17 @@ bool RGNFile::extPolyObjects(const RectC &rect, Handle &hdl,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len8 & 0x01)
|
|
||||||
len = (len8>>1) - 1;
|
|
||||||
else {
|
|
||||||
if (!readByte(hdl, len82))
|
|
||||||
return false;
|
|
||||||
len = ((len8 | ((quint16)len82<<8))>>2) - 1;
|
|
||||||
}
|
|
||||||
if (!readByte(hdl, bitstreamInfo))
|
|
||||||
return false;
|
|
||||||
poly.type = 0x10000 + (quint16(type) << 8) + (subtype & 0x1F);
|
poly.type = 0x10000 + (quint16(type) << 8) + (subtype & 0x1F);
|
||||||
|
|
||||||
RectC br;
|
|
||||||
QPoint pos(subdiv->lon() + ((qint32)lon<<(24-subdiv->bits())),
|
QPoint pos(subdiv->lon() + ((qint32)lon<<(24-subdiv->bits())),
|
||||||
subdiv->lat() + ((qint32)lat<<(24-subdiv->bits())));
|
subdiv->lat() + ((qint32)lat<<(24-subdiv->bits())));
|
||||||
Coordinates c(toWGS84(pos.x()), toWGS84(pos.y()));
|
Coordinates c(toWGS84(pos.x()), toWGS84(pos.y()));
|
||||||
br = br.united(c);
|
RectC br(c, c);
|
||||||
poly.points.append(QPointF(c.lon(), c.lat()));
|
poly.points.append(QPointF(c.lon(), c.lat()));
|
||||||
|
|
||||||
BitStream bs(*this, hdl, len);
|
qint32 lonDelta, latDelta;
|
||||||
int lonSign, latSign;
|
DeltaStream stream(*this, hdl, len - 1, bitstreamInfo, false, true);
|
||||||
if (!sign(bs, lonSign) || !sign(bs, latSign))
|
while (stream.readNext(lonDelta, latDelta)) {
|
||||||
return false;
|
|
||||||
quint32 extraBit;
|
|
||||||
bs.read(1, extraBit);
|
|
||||||
int lonBits = bitSize(bitstreamInfo & 0x0F, !lonSign, extraBit);
|
|
||||||
int latBits = bitSize(bitstreamInfo >> 4, !latSign, extraBit);
|
|
||||||
|
|
||||||
while (bs.hasNext(lonBits + latBits)) {
|
|
||||||
qint32 lonDelta, latDelta;
|
|
||||||
|
|
||||||
if (!(bs.readDelta(lonBits, lonSign, false, lonDelta)
|
|
||||||
&& bs.readDelta(latBits, latSign, false, latDelta)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
pos.rx() += lonDelta<<(24-subdiv->bits());
|
pos.rx() += lonDelta<<(24-subdiv->bits());
|
||||||
pos.ry() += latDelta<<(24-subdiv->bits());
|
pos.ry() += latDelta<<(24-subdiv->bits());
|
||||||
|
|
||||||
@ -284,19 +273,21 @@ bool RGNFile::extPolyObjects(const RectC &rect, Handle &hdl,
|
|||||||
poly.points.append(QPointF(c.lon(), c.lat()));
|
poly.points.append(QPointF(c.lon(), c.lat()));
|
||||||
br = br.united(c);
|
br = br.united(c);
|
||||||
}
|
}
|
||||||
if (!bs.finish())
|
if (!(stream.atEnd() && stream.flush()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (subtype & 0x20) {
|
if ((subtype & 0x20)) {
|
||||||
if (!readUInt24(hdl, labelPtr))
|
if (!readUInt24(hdl, labelPtr))
|
||||||
return false;
|
return false;
|
||||||
if (lbl && (labelPtr & 0x3FFFFF))
|
} else
|
||||||
poly.label = lbl->label(lblHdl, labelPtr & 0x3FFFFF);
|
labelPtr = 0;
|
||||||
}
|
|
||||||
|
|
||||||
if (!rect.intersects(br))
|
if (!rect.intersects(br))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (lbl && (labelPtr & 0x3FFFFF))
|
||||||
|
poly.label = lbl->label(lblHdl, labelPtr & 0x3FFFFF);
|
||||||
|
|
||||||
polys->append(poly);
|
polys->append(poly);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -404,7 +395,7 @@ void RGNFile::objects(const RectC &rect, const SubDiv *subdiv, LBLFile *lbl,
|
|||||||
{
|
{
|
||||||
Handle rgnHdl, lblHdl, netHdl;
|
Handle rgnHdl, lblHdl, netHdl;
|
||||||
|
|
||||||
if (!_size && !init())
|
if (!_init && !init())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QVector<RGNFile::Segment> seg(segments(rgnHdl, subdiv));
|
QVector<RGNFile::Segment> seg(segments(rgnHdl, subdiv));
|
||||||
@ -436,7 +427,7 @@ void RGNFile::extObjects(const RectC &rect, const SubDiv *subdiv, LBLFile *lbl,
|
|||||||
{
|
{
|
||||||
Handle rgnHdl, lblHdl;
|
Handle rgnHdl, lblHdl;
|
||||||
|
|
||||||
if (!_size && !init())
|
if (!_init && !init())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (polygons && subdiv->polygonsOffset() != subdiv->polygonsEnd()) {
|
if (polygons && subdiv->polygonsOffset() != subdiv->polygonsEnd()) {
|
||||||
|
@ -11,10 +11,13 @@ class NETFile;
|
|||||||
class RGNFile : public SubFile
|
class RGNFile : public SubFile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RGNFile(IMG *img, quint32 size)
|
RGNFile(IMG *img)
|
||||||
: SubFile(img, size), _offset(0), _size(0), _polygonsOffset(0),
|
: SubFile(img), _offset(0), _size(0), _polygonsOffset(0),
|
||||||
_polygonsSize(), _linesOffset(), _linesSize(), _pointsOffset(),
|
_polygonsSize(0), _linesOffset(0), _linesSize(0), _pointsOffset(0),
|
||||||
_pointsSize() {}
|
_pointsSize(0), _init(false) {}
|
||||||
|
RGNFile(SubFile *gmp, quint32 offset) : SubFile(gmp, offset), _offset(0),
|
||||||
|
_size(0), _polygonsOffset(0), _polygonsSize(0), _linesOffset(0),
|
||||||
|
_linesSize(0), _pointsOffset(0), _pointsSize(0), _init(false) {}
|
||||||
|
|
||||||
void objects(const RectC &rect, const SubDiv *subdiv, LBLFile *lbl,
|
void objects(const RectC &rect, const SubDiv *subdiv, LBLFile *lbl,
|
||||||
NETFile *net, QList<IMG::Poly> *polygons, QList<IMG::Poly> *lines,
|
NETFile *net, QList<IMG::Poly> *polygons, QList<IMG::Poly> *lines,
|
||||||
@ -53,27 +56,45 @@ private:
|
|||||||
|
|
||||||
class BitStream {
|
class BitStream {
|
||||||
public:
|
public:
|
||||||
BitStream(const SubFile &file, Handle &hdl, quint16 length)
|
BitStream(const SubFile &file, Handle &hdl, quint32 length)
|
||||||
: _file(file), _hdl(hdl), _length(length), _remaining(0) {}
|
: _file(file), _hdl(hdl), _length(length), _remaining(0) {}
|
||||||
|
|
||||||
bool read(int bits, quint32 &val);
|
bool read(int bits, quint32 &val);
|
||||||
bool readDelta(int bits, int sign, bool extraBit, qint32 &delta);
|
bool flush() {return _file.seek(_hdl, _hdl.pos + _length);}
|
||||||
bool hasNext(int bits) const
|
quint32 bitsAvailable() const {return _length * 8 + _remaining;}
|
||||||
{return _length * 8 + _remaining >= (quint32)bits;}
|
|
||||||
bool finish();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const SubFile &_file;
|
const SubFile &_file;
|
||||||
Handle &_hdl;
|
Handle &_hdl;
|
||||||
quint16 _length;
|
quint32 _length, _remaining;
|
||||||
quint32 _remaining;
|
|
||||||
quint8 _data;
|
quint8 _data;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool sign(BitStream &bs, int &val);
|
class DeltaStream : public BitStream {
|
||||||
static int bitSize(quint8 baseSize, bool variableSign, bool extraBit);
|
public:
|
||||||
|
DeltaStream(const SubFile &file, Handle &hdl, quint32 length,
|
||||||
|
quint8 info, bool extraBit, bool extended);
|
||||||
|
|
||||||
|
bool readNext(qint32 &lonDelta, qint32 &latDelta)
|
||||||
|
{
|
||||||
|
return hasNext()
|
||||||
|
? (readDelta(_lonBits, _lonSign, _extraBit, lonDelta)
|
||||||
|
&& readDelta(_latBits, _latSign, false, latDelta))
|
||||||
|
: false;
|
||||||
|
}
|
||||||
|
bool atEnd() const {return (_readBits != 0xFFFFFFFF && !hasNext());}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool hasNext() const {return bitsAvailable() >= _readBits;}
|
||||||
|
bool sign(int &val);
|
||||||
|
bool readDelta(int bits, int sign, int extraBit, qint32 &delta);
|
||||||
|
|
||||||
|
int _lonSign, _latSign, _extraBit;
|
||||||
|
quint32 _lonBits, _latBits, _readBits;
|
||||||
|
};
|
||||||
|
|
||||||
bool init();
|
bool init();
|
||||||
|
|
||||||
QVector<Segment> segments(Handle &hdl, const SubDiv *subdiv) const;
|
QVector<Segment> segments(Handle &hdl, const SubDiv *subdiv) const;
|
||||||
bool polyObjects(const RectC &rect, Handle &hdl, const SubDiv *subdiv,
|
bool polyObjects(const RectC &rect, Handle &hdl, const SubDiv *subdiv,
|
||||||
const Segment &segment, LBLFile *lbl, Handle &lblHdl, NETFile *net,
|
const Segment &segment, LBLFile *lbl, Handle &lblHdl, NETFile *net,
|
||||||
@ -99,6 +120,8 @@ private:
|
|||||||
quint32 _linesSize;
|
quint32 _linesSize;
|
||||||
quint32 _pointsOffset;
|
quint32 _pointsOffset;
|
||||||
quint32 _pointsSize;
|
quint32 _pointsSize;
|
||||||
|
|
||||||
|
bool _init;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG
|
#ifndef QT_NO_DEBUG
|
||||||
|
@ -942,7 +942,7 @@ Style::Style(SubFile *typ)
|
|||||||
defaultPolygonStyle();
|
defaultPolygonStyle();
|
||||||
defaultPointStyle();
|
defaultPointStyle();
|
||||||
|
|
||||||
if (typ && typ->isValid())
|
if (typ)
|
||||||
parseTYPFile(typ);
|
parseTYPFile(typ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,21 +20,13 @@ SubFile::Type SubFile::type(const char str[3])
|
|||||||
return Unknown;
|
return Unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
SubFile::SubFile(QFile *file) : _img(0), _file(file), _size(0)
|
SubFile::SubFile(QFile *file) :_gmpOffset(0), _img(0), _file(file), _blocks(0)
|
||||||
{
|
{
|
||||||
if (!_file->open(QIODevice::ReadOnly))
|
if (!_file->open(QIODevice::ReadOnly))
|
||||||
qWarning("Error opening %s: %s", qPrintable(_file->fileName()),
|
qWarning("Error opening %s: %s", qPrintable(_file->fileName()),
|
||||||
qPrintable(_file->errorString()));
|
qPrintable(_file->errorString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SubFile::isValid() const
|
|
||||||
{
|
|
||||||
return _file
|
|
||||||
? _file->isOpen()
|
|
||||||
: ((quint32)_img->blockSize() * (quint32)_blocks.size() - _size
|
|
||||||
< (quint32)_img->blockSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SubFile::seek(Handle &handle, quint32 pos) const
|
bool SubFile::seek(Handle &handle, quint32 pos) const
|
||||||
{
|
{
|
||||||
Q_ASSERT(_img || _file);
|
Q_ASSERT(_img || _file);
|
||||||
@ -46,9 +38,9 @@ bool SubFile::seek(Handle &handle, quint32 pos) const
|
|||||||
int blockNum = pos / blockSize;
|
int blockNum = pos / blockSize;
|
||||||
|
|
||||||
if (handle.blockNum != blockNum) {
|
if (handle.blockNum != blockNum) {
|
||||||
if (blockNum >= _blocks.size())
|
if (blockNum >= _blocks->size())
|
||||||
return false;
|
return false;
|
||||||
if (!_img->readBlock(_blocks.at(blockNum), handle.data))
|
if (!_img->readBlock(_blocks->at(blockNum), handle.data))
|
||||||
return false;
|
return false;
|
||||||
handle.blockNum = blockNum;
|
handle.blockNum = blockNum;
|
||||||
}
|
}
|
||||||
@ -74,9 +66,35 @@ bool SubFile::readByte(Handle &handle, quint8 &val) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
quint32 SubFile::size() const
|
bool SubFile::readVUInt32(Handle &hdl, quint32 &val) const
|
||||||
{
|
{
|
||||||
return _file ? (quint32)_file->size() : _size;
|
quint8 bytes, shift, b;
|
||||||
|
|
||||||
|
if (!readByte(hdl, b))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((b & 1) == 0) {
|
||||||
|
if ((b & 2) == 0) {
|
||||||
|
bytes = ((b >> 2) & 1) ^ 3;
|
||||||
|
shift = 5;
|
||||||
|
} else {
|
||||||
|
shift = 6;
|
||||||
|
bytes = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
shift = 7;
|
||||||
|
bytes = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = b >> (8 - shift);
|
||||||
|
|
||||||
|
for (int i = 1; i <= bytes; i++) {
|
||||||
|
if (!readByte(hdl, b))
|
||||||
|
return false;
|
||||||
|
val |= (((quint32)b) << (i * 8)) >> (8 - shift);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SubFile::fileName() const
|
QString SubFile::fileName() const
|
||||||
@ -88,15 +106,15 @@ QString SubFile::fileName() const
|
|||||||
QDebug operator<<(QDebug dbg, const SubFile &file)
|
QDebug operator<<(QDebug dbg, const SubFile &file)
|
||||||
{
|
{
|
||||||
bool continuous = true;
|
bool continuous = true;
|
||||||
for (int i = 1; i < file._blocks.size(); i++) {
|
for (int i = 1; i < file._blocks->size(); i++) {
|
||||||
if (file._blocks.at(i) != file._blocks.at(i-1) + 1) {
|
if (file._blocks->at(i) != file._blocks->at(i-1) + 1) {
|
||||||
continuous = false;
|
continuous = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dbg.nospace() << "SubFile(" << file._size << ", " << file._blocks.size()
|
dbg.nospace() << "SubFile(" << file._blocks->size() << ", "
|
||||||
<< ", " << continuous << ")";
|
<< continuous << ")";
|
||||||
return dbg.space();
|
return dbg.space();
|
||||||
}
|
}
|
||||||
#endif // QT_NO_DEBUG
|
#endif // QT_NO_DEBUG
|
||||||
|
@ -22,13 +22,14 @@ public:
|
|||||||
int pos;
|
int pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
SubFile(IMG *img, quint32 size) : _img(img), _file(0), _size(size) {}
|
SubFile(IMG *img) : _gmpOffset(0), _img(img), _file(0),
|
||||||
|
_blocks(&_blockData) {}
|
||||||
|
SubFile(SubFile *gmp, quint32 offset) : _gmpOffset(offset), _img(gmp->_img),
|
||||||
|
_file(0), _blocks(&(gmp->_blockData)) {}
|
||||||
SubFile(QFile *file);
|
SubFile(QFile *file);
|
||||||
|
|
||||||
void addBlock(quint16 block) {_blocks.append(block);}
|
void addBlock(quint16 block) {_blocks->append(block);}
|
||||||
bool isValid() const;
|
|
||||||
|
|
||||||
quint32 size() const;
|
|
||||||
bool seek(Handle &handle, quint32 pos) const;
|
bool seek(Handle &handle, quint32 pos) const;
|
||||||
bool readByte(Handle &handle, quint8 &val) const;
|
bool readByte(Handle &handle, quint8 &val) const;
|
||||||
|
|
||||||
@ -80,20 +81,28 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
quint16 offset() const {return _blocks.first();}
|
bool readVUInt32(Handle &hdl, quint32 &val) const;
|
||||||
|
|
||||||
|
quint16 offset() const {return _blocks->first();}
|
||||||
QString fileName() const;
|
QString fileName() const;
|
||||||
|
|
||||||
static Type type(const char str[3]);
|
static Type type(const char str[3]);
|
||||||
static bool isTileFile(Type type)
|
static bool isTileFile(Type type)
|
||||||
{return (type == TRE || type == LBL || type == RGN || type == NET);}
|
{
|
||||||
|
return (type == TRE || type == LBL || type == RGN || type == NET
|
||||||
|
|| type == GMP);
|
||||||
|
}
|
||||||
|
|
||||||
friend QDebug operator<<(QDebug dbg, const SubFile &file);
|
friend QDebug operator<<(QDebug dbg, const SubFile &file);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
quint32 _gmpOffset;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IMG *_img;
|
IMG *_img;
|
||||||
QFile *_file;
|
QFile *_file;
|
||||||
quint32 _size;
|
QVector<quint16> *_blocks;
|
||||||
QVector<quint16> _blocks;
|
QVector<quint16> _blockData;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG
|
#ifndef QT_NO_DEBUG
|
||||||
|
@ -43,28 +43,28 @@ bool TREFile::init()
|
|||||||
quint8 locked;
|
quint8 locked;
|
||||||
quint16 hdrLen;
|
quint16 hdrLen;
|
||||||
|
|
||||||
if (!(seek(hdl, 0) && readUInt16(hdl, hdrLen)
|
if (!(seek(hdl, _gmpOffset) && readUInt16(hdl, hdrLen)
|
||||||
&& seek(hdl, 0x0D) && readByte(hdl, locked)))
|
&& seek(hdl, _gmpOffset + 0x0D) && readByte(hdl, locked)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Tile bounds
|
// Tile bounds
|
||||||
qint32 north, east, south, west;
|
qint32 north, east, south, west;
|
||||||
if (!(seek(hdl, 0x15) && readInt24(hdl, north) && readInt24(hdl, east)
|
if (!(seek(hdl, _gmpOffset + 0x15) && readInt24(hdl, north)
|
||||||
&& readInt24(hdl, south) && readInt24(hdl, west)))
|
&& readInt24(hdl, east) && readInt24(hdl, south) && readInt24(hdl, west)))
|
||||||
return false;
|
return false;
|
||||||
_bounds = RectC(Coordinates(toWGS84(west), toWGS84(north)),
|
_bounds = RectC(Coordinates(toWGS84(west), toWGS84(north)),
|
||||||
Coordinates(toWGS84(east), toWGS84(south)));
|
Coordinates(toWGS84(east), toWGS84(south)));
|
||||||
|
|
||||||
// Levels & subdivs info
|
// Levels & subdivs info
|
||||||
quint32 levelsOffset, levelsSize, subdivSize;
|
quint32 levelsOffset, levelsSize, subdivSize;
|
||||||
if (!(seek(hdl, 0x21) && readUInt32(hdl, levelsOffset)
|
if (!(seek(hdl, _gmpOffset + 0x21) && readUInt32(hdl, levelsOffset)
|
||||||
&& readUInt32(hdl, levelsSize) && readUInt32(hdl, _subdivOffset)
|
&& readUInt32(hdl, levelsSize) && readUInt32(hdl, _subdivOffset)
|
||||||
&& readUInt32(hdl, subdivSize)))
|
&& readUInt32(hdl, subdivSize)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// TRE7 info
|
// TRE7 info
|
||||||
if (hdrLen > 0x9A) {
|
if (hdrLen > 0x9A) {
|
||||||
if (!(seek(hdl, 0x7C) && readUInt32(hdl, _extended.offset)
|
if (!(seek(hdl, _gmpOffset + 0x7C) && readUInt32(hdl, _extended.offset)
|
||||||
&& readUInt32(hdl, _extended.size)
|
&& readUInt32(hdl, _extended.size)
|
||||||
&& readUInt16(hdl, _extended.itemSize)))
|
&& readUInt16(hdl, _extended.itemSize)))
|
||||||
return false;
|
return false;
|
||||||
@ -80,7 +80,7 @@ bool TREFile::init()
|
|||||||
if (locked) {
|
if (locked) {
|
||||||
quint32 key;
|
quint32 key;
|
||||||
quint8 unlocked[64];
|
quint8 unlocked[64];
|
||||||
if (!seek(hdl, 0xAA) || !readUInt32(hdl, key))
|
if (!seek(hdl, _gmpOffset + 0xAA) || !readUInt32(hdl, key))
|
||||||
return false;
|
return false;
|
||||||
unlock(unlocked, levels, levelsSize, key);
|
unlock(unlocked, levels, levelsSize, key);
|
||||||
memcpy(levels, unlocked, levelsSize);
|
memcpy(levels, unlocked, levelsSize);
|
||||||
|
@ -13,7 +13,8 @@ class SubDiv;
|
|||||||
class TREFile : public SubFile
|
class TREFile : public SubFile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TREFile(IMG *img, quint32 size) : SubFile(img, size) {}
|
TREFile(IMG *img) : SubFile(img) {}
|
||||||
|
TREFile(SubFile *gmp, quint32 offset) : SubFile(gmp, offset) {}
|
||||||
~TREFile();
|
~TREFile();
|
||||||
|
|
||||||
bool init();
|
bool init();
|
||||||
|
@ -11,26 +11,31 @@ SubFile *VectorTile::file(SubFile::Type type)
|
|||||||
return _lbl;
|
return _lbl;
|
||||||
case SubFile::NET:
|
case SubFile::NET:
|
||||||
return _net;
|
return _net;
|
||||||
|
case SubFile::GMP:
|
||||||
|
return _gmp;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SubFile *VectorTile::addFile(IMG *img, SubFile::Type type, quint32 size)
|
SubFile *VectorTile::addFile(IMG *img, SubFile::Type type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SubFile::TRE:
|
case SubFile::TRE:
|
||||||
_tre = new TREFile(img, size);
|
_tre = new TREFile(img);
|
||||||
return _tre;
|
return _tre;
|
||||||
case SubFile::RGN:
|
case SubFile::RGN:
|
||||||
_rgn = new RGNFile(img, size);
|
_rgn = new RGNFile(img);
|
||||||
return _rgn;
|
return _rgn;
|
||||||
case SubFile::LBL:
|
case SubFile::LBL:
|
||||||
_lbl = new LBLFile(img, size);
|
_lbl = new LBLFile(img);
|
||||||
return _lbl;
|
return _lbl;
|
||||||
case SubFile::NET:
|
case SubFile::NET:
|
||||||
_net = new NETFile(img, size);
|
_net = new NETFile(img);
|
||||||
return _net;
|
return _net;
|
||||||
|
case SubFile::GMP:
|
||||||
|
_gmp = new SubFile(img);
|
||||||
|
return _gmp;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -38,14 +43,30 @@ SubFile *VectorTile::addFile(IMG *img, SubFile::Type type, quint32 size)
|
|||||||
|
|
||||||
bool VectorTile::init()
|
bool VectorTile::init()
|
||||||
{
|
{
|
||||||
if (!(_tre && _tre->isValid() && _tre->init() && _rgn
|
if (_gmp && !initGMP())
|
||||||
&& _rgn->isValid()))
|
|
||||||
return false;
|
return false;
|
||||||
if (_lbl && !_lbl->isValid())
|
|
||||||
|
if (!(_tre && _tre->init() && _rgn))
|
||||||
return false;
|
return false;
|
||||||
if (_net && !_net->isValid())
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VectorTile::initGMP()
|
||||||
|
{
|
||||||
|
SubFile::Handle hdl;
|
||||||
|
quint32 tre, rgn, lbl, net;
|
||||||
|
|
||||||
|
if (!(_gmp->seek(hdl, 0x19) && _gmp->readUInt32(hdl, tre)
|
||||||
|
&& _gmp->readUInt32(hdl, rgn) && _gmp->readUInt32(hdl, lbl)
|
||||||
|
&& _gmp->readUInt32(hdl, net)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
_tre = new TREFile(_gmp, tre);
|
||||||
|
_rgn = new RGNFile(_gmp, rgn);
|
||||||
|
_lbl = new LBLFile(_gmp, lbl);
|
||||||
|
_net = new NETFile(_gmp, net);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,8 +10,9 @@
|
|||||||
|
|
||||||
class VectorTile {
|
class VectorTile {
|
||||||
public:
|
public:
|
||||||
VectorTile() : _tre(0), _rgn(0), _lbl(0), _net(0) {}
|
VectorTile() : _tre(0), _rgn(0), _lbl(0), _net(0), _gmp(0) {}
|
||||||
~VectorTile() {delete _tre; delete _rgn; delete _lbl; delete _net;}
|
~VectorTile()
|
||||||
|
{delete _tre; delete _rgn; delete _lbl; delete _net; delete _gmp;}
|
||||||
|
|
||||||
bool init();
|
bool init();
|
||||||
void clear() {_tre->clear();}
|
void clear() {_tre->clear();}
|
||||||
@ -19,7 +20,7 @@ public:
|
|||||||
const RectC &bounds() const {return _tre->bounds();}
|
const RectC &bounds() const {return _tre->bounds();}
|
||||||
|
|
||||||
SubFile *file(SubFile::Type type);
|
SubFile *file(SubFile::Type type);
|
||||||
SubFile *addFile(IMG *img, SubFile::Type type, quint32 size);
|
SubFile *addFile(IMG *img, SubFile::Type type);
|
||||||
|
|
||||||
void objects(const RectC &rect, int bits, QList<IMG::Poly> *polygons,
|
void objects(const RectC &rect, int bits, QList<IMG::Poly> *polygons,
|
||||||
QList<IMG::Poly> *lines, QList<IMG::Point> *points) const;
|
QList<IMG::Poly> *lines, QList<IMG::Point> *points) const;
|
||||||
@ -27,10 +28,13 @@ public:
|
|||||||
friend QDebug operator<<(QDebug dbg, const VectorTile &tile);
|
friend QDebug operator<<(QDebug dbg, const VectorTile &tile);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool initGMP();
|
||||||
|
|
||||||
TREFile *_tre;
|
TREFile *_tre;
|
||||||
RGNFile *_rgn;
|
RGNFile *_rgn;
|
||||||
LBLFile *_lbl;
|
LBLFile *_lbl;
|
||||||
NETFile *_net;
|
NETFile *_net;
|
||||||
|
SubFile *_gmp;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG
|
#ifndef QT_NO_DEBUG
|
||||||
|
Reference in New Issue
Block a user