mirror of
https://github.com/tumic0/QtPBFImagePlugin.git
synced 2025-02-22 02:50:50 +01:00
Compare commits
6 Commits
c12c2b4497
...
252ca8542a
Author | SHA1 | Date | |
---|---|---|---|
252ca8542a | |||
14069640b4 | |||
4e2dfabc9d | |||
8e49440a02 | |||
badd834b59 | |||
0a4543ddcf |
6
.gitignore
vendored
6
.gitignore
vendored
@ -1,10 +1,6 @@
|
|||||||
# Object files
|
# Object files
|
||||||
*.o
|
*.o
|
||||||
|
|
||||||
# Protobuf stuff
|
|
||||||
protobuf/vector_tile.pb.cc
|
|
||||||
protobuf/vector_tile.pb.h
|
|
||||||
|
|
||||||
# Qt stuff
|
# Qt stuff
|
||||||
/.qmake.stash
|
/.qmake.stash
|
||||||
moc_*.cpp
|
moc_*.cpp
|
||||||
@ -14,4 +10,4 @@ Makefile*
|
|||||||
|
|
||||||
# lib
|
# lib
|
||||||
libpbf.so
|
libpbf.so
|
||||||
pbf.dylib
|
libpbf.dylib
|
||||||
|
@ -96,7 +96,7 @@ algorithm to work properly.
|
|||||||
* Expressions are not supported in the styles, only property functions are implemented.
|
* Expressions are not supported in the styles, only property functions are implemented.
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
[Changelog](https://build.opensuse.org/package/view_file/home:tumic:QtPBFImagePlugin/QtPBFImagePlugin/libqt5-qtpbfimageformat.changes)
|
[Changelog](https://build.opensuse.org/projects/home:tumic:QtPBFImagePlugin/packages/QtPBFImagePlugin/files/qt6-qtpbfimageformat.changes)
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
A picture is worth a thousand words.
|
A picture is worth a thousand words.
|
||||||
|
76
src/data.cpp
76
src/data.cpp
@ -3,6 +3,11 @@
|
|||||||
#define TYPE(tag) (tag & 0x07)
|
#define TYPE(tag) (tag & 0x07)
|
||||||
#define FIELD(tag) (tag >> 3)
|
#define FIELD(tag) (tag >> 3)
|
||||||
|
|
||||||
|
#define VARINT 0
|
||||||
|
#define I64 1
|
||||||
|
#define LEN 2
|
||||||
|
#define I32 5
|
||||||
|
|
||||||
struct CTX
|
struct CTX
|
||||||
{
|
{
|
||||||
CTX(const QByteArray &ba)
|
CTX(const QByteArray &ba)
|
||||||
@ -10,7 +15,7 @@ struct CTX
|
|||||||
|
|
||||||
const char *bp;
|
const char *bp;
|
||||||
const char *be;
|
const char *be;
|
||||||
quint64 tag;
|
quint32 tag;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline qint64 zigzag64decode(quint64 value)
|
static inline qint64 zigzag64decode(quint64 value)
|
||||||
@ -24,9 +29,8 @@ static bool varint(CTX &ctx, T &val)
|
|||||||
{
|
{
|
||||||
val = 0;
|
val = 0;
|
||||||
uint shift = 0;
|
uint shift = 0;
|
||||||
const char *end = qMin(ctx.be, ctx.bp + sizeof(val));
|
|
||||||
|
|
||||||
while (ctx.bp < end) {
|
while (ctx.bp < ctx.be) {
|
||||||
val |= ((quint8)*ctx.bp & 0x7F) << shift;
|
val |= ((quint8)*ctx.bp & 0x7F) << shift;
|
||||||
shift += 7;
|
shift += 7;
|
||||||
if (!((quint8)*ctx.bp++ & 0x80))
|
if (!((quint8)*ctx.bp++ & 0x80))
|
||||||
@ -38,12 +42,15 @@ static bool varint(CTX &ctx, T &val)
|
|||||||
|
|
||||||
static bool str(CTX &ctx, QByteArray &val)
|
static bool str(CTX &ctx, QByteArray &val)
|
||||||
{
|
{
|
||||||
quint64 len;
|
qint32 len;
|
||||||
|
|
||||||
|
if (TYPE(ctx.tag) != LEN)
|
||||||
|
return false;
|
||||||
if (!varint(ctx, len))
|
if (!varint(ctx, len))
|
||||||
return false;
|
return false;
|
||||||
if (ctx.bp + len > ctx.be)
|
if (ctx.bp + len > ctx.be)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
val = QByteArray::fromRawData(ctx.bp, len);
|
val = QByteArray::fromRawData(ctx.bp, len);
|
||||||
ctx.bp += len;
|
ctx.bp += len;
|
||||||
|
|
||||||
@ -52,20 +59,26 @@ static bool str(CTX &ctx, QByteArray &val)
|
|||||||
|
|
||||||
static bool dbl(CTX &ctx, double &val)
|
static bool dbl(CTX &ctx, double &val)
|
||||||
{
|
{
|
||||||
|
if (TYPE(ctx.tag) != I64)
|
||||||
|
return false;
|
||||||
if (ctx.bp + sizeof(val) > ctx.be)
|
if (ctx.bp + sizeof(val) > ctx.be)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
memcpy(&val, ctx.bp, sizeof(val));
|
memcpy(&val, ctx.bp, sizeof(val));
|
||||||
|
ctx.bp += sizeof(val);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool flt(CTX &ctx, float &val)
|
static bool flt(CTX &ctx, float &val)
|
||||||
{
|
{
|
||||||
|
if (TYPE(ctx.tag) != I32)
|
||||||
|
return false;
|
||||||
if (ctx.bp + sizeof(val) > ctx.be)
|
if (ctx.bp + sizeof(val) > ctx.be)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
memcpy(&val, ctx.bp, sizeof(val));
|
memcpy(&val, ctx.bp, sizeof(val));
|
||||||
|
ctx.bp += sizeof(val);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -74,8 +87,8 @@ static bool packed(CTX &ctx, QVector<quint32> &vals)
|
|||||||
{
|
{
|
||||||
quint32 v;
|
quint32 v;
|
||||||
|
|
||||||
if (TYPE(ctx.tag) == 2) {
|
if (TYPE(ctx.tag) == LEN) {
|
||||||
quint64 len;
|
qint32 len;
|
||||||
if (!varint(ctx, len))
|
if (!varint(ctx, len))
|
||||||
return false;
|
return false;
|
||||||
const char *ee = ctx.bp + len;
|
const char *ee = ctx.bp + len;
|
||||||
@ -87,7 +100,7 @@ static bool packed(CTX &ctx, QVector<quint32> &vals)
|
|||||||
vals.append(v);
|
vals.append(v);
|
||||||
}
|
}
|
||||||
return (ctx.bp == ee);
|
return (ctx.bp == ee);
|
||||||
} else if (TYPE(ctx.tag) == 0) {
|
} else if (TYPE(ctx.tag) == VARINT) {
|
||||||
if (!varint(ctx, v))
|
if (!varint(ctx, v))
|
||||||
return false;
|
return false;
|
||||||
vals.append(v);
|
vals.append(v);
|
||||||
@ -98,19 +111,19 @@ static bool packed(CTX &ctx, QVector<quint32> &vals)
|
|||||||
|
|
||||||
static bool skip(CTX &ctx)
|
static bool skip(CTX &ctx)
|
||||||
{
|
{
|
||||||
quint64 len = 0;
|
qint32 len = 0;
|
||||||
|
|
||||||
switch (TYPE(ctx.tag)) {
|
switch (TYPE(ctx.tag)) {
|
||||||
case 0:
|
case VARINT:
|
||||||
return varint(ctx, len);
|
return varint(ctx, len);
|
||||||
case 1:
|
case I64:
|
||||||
len = 8;
|
len = 8;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case LEN:
|
||||||
if (!varint(ctx, len))
|
if (!varint(ctx, len))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case I32:
|
||||||
len = 4;
|
len = 4;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -126,8 +139,12 @@ static bool skip(CTX &ctx)
|
|||||||
|
|
||||||
static bool value(CTX &ctx, QVariant &val)
|
static bool value(CTX &ctx, QVariant &val)
|
||||||
{
|
{
|
||||||
|
if (TYPE(ctx.tag) != LEN)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
qint32 len;
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
quint64 len, num;
|
quint64 num;
|
||||||
double dnum;
|
double dnum;
|
||||||
float fnum;
|
float fnum;
|
||||||
|
|
||||||
@ -159,21 +176,29 @@ static bool value(CTX &ctx, QVariant &val)
|
|||||||
val = QVariant(dnum);
|
val = QVariant(dnum);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
|
if (TYPE(ctx.tag) != VARINT)
|
||||||
|
return false;
|
||||||
if (!varint(ctx, num))
|
if (!varint(ctx, num))
|
||||||
return false;
|
return false;
|
||||||
val = QVariant(static_cast<qint64>(num));
|
val = QVariant(static_cast<qint64>(num));
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
|
if (TYPE(ctx.tag) != VARINT)
|
||||||
|
return false;
|
||||||
if (!varint(ctx, num))
|
if (!varint(ctx, num))
|
||||||
return false;
|
return false;
|
||||||
val = QVariant(num);
|
val = QVariant(num);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
|
if (TYPE(ctx.tag) != VARINT)
|
||||||
|
return false;
|
||||||
if (!varint(ctx, num))
|
if (!varint(ctx, num))
|
||||||
return false;
|
return false;
|
||||||
val = QVariant(zigzag64decode(num));
|
val = QVariant(zigzag64decode(num));
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
|
if (TYPE(ctx.tag) != VARINT)
|
||||||
|
return false;
|
||||||
if (!varint(ctx, num))
|
if (!varint(ctx, num))
|
||||||
return false;
|
return false;
|
||||||
val = QVariant(num ? true : false);
|
val = QVariant(num ? true : false);
|
||||||
@ -189,8 +214,12 @@ static bool value(CTX &ctx, QVariant &val)
|
|||||||
|
|
||||||
static bool feature(CTX &ctx, Data::Feature &f)
|
static bool feature(CTX &ctx, Data::Feature &f)
|
||||||
{
|
{
|
||||||
quint64 len;
|
quint32 e;
|
||||||
quint8 e;
|
|
||||||
|
if (TYPE(ctx.tag) != LEN)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
qint32 len;
|
||||||
if (!varint(ctx, len))
|
if (!varint(ctx, len))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -204,6 +233,8 @@ static bool feature(CTX &ctx, Data::Feature &f)
|
|||||||
|
|
||||||
switch (FIELD(ctx.tag)) {
|
switch (FIELD(ctx.tag)) {
|
||||||
case 1:
|
case 1:
|
||||||
|
if (TYPE(ctx.tag) != VARINT)
|
||||||
|
return false;
|
||||||
if (!varint(ctx, f.id))
|
if (!varint(ctx, f.id))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
@ -212,11 +243,13 @@ static bool feature(CTX &ctx, Data::Feature &f)
|
|||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
if (TYPE(ctx.tag) != VARINT)
|
||||||
|
return false;
|
||||||
if (!varint(ctx, e))
|
if (!varint(ctx, e))
|
||||||
return false;
|
return false;
|
||||||
if (e > Data::GeomType::POLYGON)
|
if (e > Data::GeomType::POLYGON)
|
||||||
return false;
|
return false;
|
||||||
f.type = (Data::GeomType)e;
|
f.type = static_cast<Data::GeomType>(e);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if (!packed(ctx, f.geometry))
|
if (!packed(ctx, f.geometry))
|
||||||
@ -233,8 +266,11 @@ static bool feature(CTX &ctx, Data::Feature &f)
|
|||||||
|
|
||||||
static bool layer(CTX &ctx, Data::Layer &l)
|
static bool layer(CTX &ctx, Data::Layer &l)
|
||||||
{
|
{
|
||||||
if (ctx.tag == 0x1a) {
|
if (FIELD(ctx.tag) == 3) {
|
||||||
quint64 len;
|
if (TYPE(ctx.tag) != LEN)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
qint32 len;
|
||||||
if (!varint(ctx, len))
|
if (!varint(ctx, len))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -267,10 +303,14 @@ static bool layer(CTX &ctx, Data::Layer &l)
|
|||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
|
if (TYPE(ctx.tag) != VARINT)
|
||||||
|
return false;
|
||||||
if (!varint(ctx, l.extent))
|
if (!varint(ctx, l.extent))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
|
if (TYPE(ctx.tag) != VARINT)
|
||||||
|
return false;
|
||||||
if (!varint(ctx, l.version))
|
if (!varint(ctx, l.version))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user