1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-21 06:14:23 +02:00

Compare commits

..

34 Commits
11.11 ... 11.12

Author SHA1 Message Date
80ec7f624e Moved maps and csv from pkg to data 2023-01-26 01:51:46 +01:00
bfeb6d266e Some more iso8211 code cleanup 2023-01-26 01:13:15 +01:00
af3e5d41c2 Split the config header to config+hash headers 2023-01-26 01:11:56 +01:00
51511a9bf9 Fixed broken parsing of KML tracks with empty coordinates 2023-01-25 09:01:20 +01:00
2549204662 Use CFBundleLocalizations instead of lproj directories 2023-01-24 23:01:40 +01:00
b826c856fc Extended Info.plist with some more bundle info 2023-01-24 09:19:13 +01:00
1afe74242a Properly handle locales with sub-languages 2023-01-24 08:33:48 +01:00
b43412b135 Added Korean localization 2023-01-23 23:48:00 +01:00
bbad4eb8d9 Merge branch 'origin/master' into Weblate. 2023-01-23 23:10:54 +01:00
f6c128fbf6 Create localization lproj directories on OS X
+ pkg dir structure cleanup
2023-01-23 23:11:05 +01:00
b955c4d45e Translated using Weblate (Korean)
Currently translated at 100.0% (440 of 440 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ko/
2023-01-23 15:50:01 +01:00
e26a776576 Translated using Weblate (Esperanto)
Currently translated at 93.1% (434 of 466 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/eo/
2023-01-23 15:49:59 +01:00
52c4e97be5 Translated using Weblate (Russian)
Currently translated at 100.0% (466 of 466 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2023-01-23 15:49:59 +01:00
49bd2b9501 Translated using Weblate (Finnish)
Currently translated at 97.2% (453 of 466 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2023-01-23 15:49:59 +01:00
ab76521990 ISO8211 API cleanup 2023-01-19 10:08:17 +01:00
ee73908231 Do not treat Ozimaps as directories
Directory parsing was stopped at the level of the map which is not what we
want - users would have to create separate directories for every Ozimap.
2023-01-19 10:04:03 +01:00
3af98b6785 Fixed typo 2023-01-16 21:16:20 +01:00
05657ccdce Version++ 2023-01-15 10:10:48 +01:00
a698aa96cd Trying to fix the Android CI build...
no. 5
2023-01-14 15:20:40 +01:00
a7fef63461 Trying to fix the Android CI build...
no. 4
2023-01-14 15:08:58 +01:00
83217d31a7 Trying to fix the Android CI build...
no. 3
2023-01-14 14:46:45 +01:00
4191f5414f Trying to fix the Android CI build...
no. 2
2023-01-14 14:20:04 +01:00
bf81994aa0 Trying to fix the Android CI build... 2023-01-14 14:00:43 +01:00
21c02010f7 Improved marine charts render style 2023-01-14 13:00:36 +01:00
c209e24db8 Optimization/code cleanup 2023-01-14 08:45:18 +01:00
9ff7ecea97 ENC signal stations 2023-01-11 23:03:54 +01:00
78e3c78197 Added safety zone lines 2023-01-09 23:58:03 +01:00
38cd871178 Cleanup 2023-01-05 22:13:26 +01:00
5594bf74b6 Run the CodeQL action manually only 2023-01-05 22:02:25 +01:00
65515143eb Added missing include guard prefix 2023-01-05 21:44:03 +01:00
29895420b6 Fixed broken temperature units translations 2023-01-01 16:54:44 +01:00
88f7e13500 Added alignment check 2022-12-23 08:35:59 +01:00
51335a0f84 Added missing build dependencies 2022-12-16 16:34:32 +01:00
077cc20934 Create codeql.yml 2022-12-16 16:23:59 +01:00
51 changed files with 730 additions and 609 deletions

View File

@ -1,4 +1,4 @@
version: 11.11.{build}
version: 11.12.{build}
configuration:
- Release
@ -28,9 +28,9 @@ build_script:
md installer
copy release\GPXSee.exe installer
windeployqt --release installer\GPXSee.exe
copy pkg\gpxsee64.nsi installer
xcopy pkg\csv installer\csv /i
xcopy pkg\maps installer\maps /i
copy pkg\windows\gpxsee64.nsi installer
xcopy data\csv installer\csv /i
xcopy data\maps installer\maps /i
xcopy lang\*.qm installer\translations\ /sy
xcopy icons\symbols installer\symbols /i
copy licence.txt installer

45
.github/workflows/codeql.yml vendored Normal file
View File

@ -0,0 +1,45 @@
name: "CodeQL"
on: [workflow_dispatch]
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'cpp' ]
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qt5-qmake qttools5-dev-tools libqt5opengl5-dev qtpositioning5-dev libqt5svg5-dev
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{matrix.language}}"

View File

Can't render this file because it is too large.

View File

@ -3,7 +3,7 @@ unix:!macx:!android {
} else {
TARGET = GPXSee
}
VERSION = 11.11
VERSION = 11.12
QT += core \
gui \
@ -29,6 +29,7 @@ HEADERS += src/common/config.h \
src/GUI/pluginparameters.h \
src/common/garmin.h \
src/common/coordinates.h \
src/common/hash.h \
src/common/linec.h \
src/common/range.h \
src/common/rectc.h \
@ -472,23 +473,26 @@ TRANSLATIONS = lang/gpxsee_en.ts \
lang/gpxsee_it.ts \
lang/gpxsee_eo.ts \
lang/gpxsee_zh.ts \
lang/gpxsee_ca.ts
lang/gpxsee_ca.ts \
lang/gpxsee_ko.ts
macx {
ICON = icons/app/gpxsee.icns
QMAKE_INFO_PLIST = pkg/Info.plist
QMAKE_INFO_PLIST = pkg/mac/Info.plist
locale.path = Contents/Resources/translations
locale.files = $$files(lang/*.qm)
csv.path = Contents/Resources
csv.files = pkg/csv
csv.files = data/csv
maps.path = Contents/Resources
maps.files = pkg/maps
maps.files = data/maps
symbols.path = Contents/Resources/symbols
symbols.files = $$files(icons/symbols/*.png)
icons.path = Contents/Resources/icons
icons.files = $$files(icons/formats/*.icns)
lproj.path = Contents/Resources
lproj.files = $$files(pkg/mac/lproj/*)
QMAKE_BUNDLE_DATA += locale maps symbols icons csv
QMAKE_BUNDLE_DATA += locale maps symbols icons csv lproj
}
win32 {
@ -533,9 +537,9 @@ win32 {
unix:!macx:!android {
isEmpty(PREFIX):PREFIX = /usr/local
maps.files = $$files(pkg/maps/*)
maps.files = $$files(data/maps/*)
maps.path = $$PREFIX/share/gpxsee/maps
csv.files = $$files(pkg/csv/*)
csv.files = $$files(data/csv/*)
csv.path = $$PREFIX/share/gpxsee/csv
symbols.files = $$files(icons/symbols/*.png)
symbols.path = $$PREFIX/share/gpxsee/symbols
@ -543,12 +547,14 @@ unix:!macx:!android {
locale.path = $$PREFIX/share/gpxsee/translations
icon.files = $$files(icons/app/hicolor/*)
icon.path = $$PREFIX/share/icons/hicolor
desktop.files = pkg/gpxsee.desktop
desktop.files = pkg/linux/gpxsee.desktop
desktop.path = $$PREFIX/share/applications
mime.files = pkg/gpxsee.xml
mime.files = pkg/linux/gpxsee.xml
mime.path = $$PREFIX/share/mime/packages
appdata.files = pkg/linux/gpxsee.appdata.xml
appdata.path = $$PREFIX/share/metainfo
target.path = $$PREFIX/bin
INSTALLS += target maps csv symbols locale icon desktop mime
INSTALLS += target maps csv symbols locale icon desktop mime appdata
}
android {
@ -581,9 +587,9 @@ android {
pkg/android/build.gradle \
pkg/android/res/values/libs.xml
maps.files = $$files(pkg/maps/*)
maps.files = $$files(data/maps/*)
maps.path = /assets/maps
csv.files = $$files(pkg/csv/*)
csv.files = $$files(data/csv/*)
csv.path = /assets/csv
symbols.files = $$files(icons/symbols/*.png)
symbols.path = /assets/symbols

View File

@ -188,6 +188,7 @@
<file alias="silo.png">icons/map/marine/silo.png</file>
<file alias="turning-basin.png">icons/map/marine/turning-basin.png</file>
<file alias="entry-prohibited-line.png">icons/map/marine/entry-prohibited-line.png</file>
<file alias="safety-zone-line.png">icons/map/marine/safety-zone-line.png</file>
<file alias="cable-area-line.png">icons/map/marine/cable-area-line.png</file>
<file alias="pipeline-area-line.png">icons/map/marine/pipeline-area-line.png</file>
<file alias="windmotor.png">icons/map/marine/windmotor.png</file>
@ -203,7 +204,7 @@
<!-- Mapsforge rendertheme -->
<qresource prefix="/mapsforge">
<file alias="default.xml">data/default.xml</file>
<file alias="default.xml">data/mapsforge/default.xml</file>
<file alias="patterns/hills.svg">icons/map/mapsforge/patterns/hills.svg</file>
<file alias="patterns/farmland.svg">icons/map/mapsforge/patterns/farmland.svg</file>

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 B

View File

@ -556,7 +556,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="432"/>
<source>Use styles</source>
<translation type="unfinished"></translation>
<translation>Uzi stilojn</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="439"/>
@ -603,7 +603,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="482"/>
<source>Show tabs</source>
<translation type="unfinished"></translation>
<translation>Montri langetojn</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="491"/>
@ -1241,7 +1241,7 @@
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Electronic Navigational Charts</source>
<translation type="unfinished"></translation>
<translation>ENC-mapoj</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>

View File

@ -557,7 +557,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="432"/>
<source>Use styles</source>
<translation type="unfinished"></translation>
<translation>Käytä tyylejä</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="439"/>

View File

@ -2397,12 +2397,12 @@
<message>
<location filename="../src/GUI/temperaturegraph.cpp" line="111"/>
<source>C</source>
<translation>°C</translation>
<translation>C</translation>
</message>
<message>
<location filename="../src/GUI/temperaturegraph.cpp" line="115"/>
<source>F</source>
<translation>°F</translation>
<translation>F</translation>
</message>
</context>
<context>
@ -2410,12 +2410,12 @@
<message>
<location filename="../src/GUI/temperaturegraphitem.cpp" line="21"/>
<source>C</source>
<translation>°C</translation>
<translation>C</translation>
</message>
<message>
<location filename="../src/GUI/temperaturegraphitem.cpp" line="21"/>
<source>F</source>
<translation>°F</translation>
<translation>F</translation>
</message>
<message>
<location filename="../src/GUI/temperaturegraphitem.cpp" line="24"/>

File diff suppressed because it is too large Load Diff

View File

@ -557,7 +557,7 @@
<message>
<location filename="../src/GUI/gui.cpp" line="432"/>
<source>Use styles</source>
<translation type="unfinished"></translation>
<translation>Использовать стили</translation>
</message>
<message>
<location filename="../src/GUI/gui.cpp" line="439"/>
@ -1247,7 +1247,7 @@
<message>
<location filename="../src/map/maplist.cpp" line="158"/>
<source>Electronic Navigational Charts</source>
<translation type="unfinished"></translation>
<translation>Морские карты ENC</translation>
</message>
<message>
<location filename="../src/map/maplist.cpp" line="165"/>

View File

@ -34,8 +34,10 @@ android {
* Changing them manually might break the compilation!
*******************************************************/
compileSdkVersion androidCompileSdkVersion.toInteger()
buildToolsVersion androidBuildToolsVersion
//compileSdkVersion androidCompileSdkVersion.toInteger()
compileSdkVersion 31
//buildToolsVersion androidBuildToolsVersion
buildToolsVersion '31.0.0'
ndkVersion androidNdkVersion
sourceSets {

View File

@ -1,14 +0,0 @@
# Project-wide Gradle settings.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2500m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# Enable building projects in parallel
org.gradle.parallel=true
# Gradle caching allows reusing the build artifacts from a previous
# build with the same inputs. However, over time, the cache size will
# grow. Uncomment the following line to enable it.
#org.gradle.caching=true

View File

@ -2,8 +2,12 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>GPXSee</string>
<key>CFBundleIconFile</key>
<string>@ICON@</string>
<key>CFBundlePackageType</key>
@ -16,6 +20,34 @@
<string>@EXECUTABLE@</string>
<key>CFBundleIdentifier</key>
<string>org.gpxsee.GPXSee</string>
<key>CFBundleVersion</key>
<string>@FULL_VERSION@</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>CFBundleLocalizations</key>
<array>
<string>ca</string>
<string>cs</string>
<string>da</string>
<string>de</string>
<string>en</string>
<string>eo</string>
<string>es</string>
<string>fi</string>
<string>fr</string>
<string>hu</string>
<string>it</string>
<string>ko</string>
<string>nb</string>
<string>pl</string>
<string>pt_BR</string>
<string>ru</string>
<string>sv</string>
<string>tr</string>
<string>uk</string>
<string>zh_CN</string>
</array>
<key>CFBundleDocumentTypes</key>
<array>

View File

@ -37,7 +37,7 @@ Unicode true
; The name of the installer
Name "GPXSee"
; Program version
!define VERSION "11.11"
!define VERSION "11.12"
; The file to write
OutFile "GPXSee-${VERSION}_x64.exe"
@ -325,6 +325,7 @@ SectionGroup "Localization" SEC_LOCALIZATION
!insertmacro LOCALIZATION "German" "de"
!insertmacro LOCALIZATION "Hungarian" "hu"
!insertmacro LOCALIZATION "Italian" "it"
!insertmacro LOCALIZATION "Korean" "ko"
!insertmacro LOCALIZATION "Norwegian" "nb"
!insertmacro LOCALIZATION "Polish" "pl"
!insertmacro LOCALIZATION "Portuguese (Brazil)" "pt_BR"

View File

@ -28,10 +28,10 @@ App::App(int &argc, char **argv) : QApplication(argc, argv)
#endif
setApplicationVersion(APP_VERSION);
QTranslator *gpxsee = new QTranslator(this);
if (gpxsee->load(QLocale::system(), "gpxsee", "_",
QTranslator *app = new QTranslator(this);
if (app->load(QLocale::system(), "gpxsee", "_",
ProgramPaths::translationsDir()))
installTranslator(gpxsee);
installTranslator(app);
QTranslator *qt = new QTranslator(this);
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC)

View File

@ -26,6 +26,7 @@
#include <QStyle>
#include <QTabBar>
#include <QGeoPositionInfoSource>
#include "common/config.h"
#include "common/programpaths.h"
#include "common/downloader.h"
#include "data/data.h"

View File

@ -7,7 +7,6 @@
#include <QList>
#include <QFlags>
#include "common/rectc.h"
#include "common/config.h"
#include "data/waypoint.h"
#include "map/projection.h"
#include "searchpointer.h"

View File

@ -1,7 +1,7 @@
#ifndef SEARCHPOINTER_H
#define SEARCHPOINTER_H
#include "common/config.h"
#include "common/hash.h"
template <class T>
class SearchPointer

View File

@ -1,21 +1,7 @@
#ifndef CONFIG_H
#define CONFIG_H
#include <QtGlobal>
#include <QPoint>
#define APP_NAME "GPXSee"
#define APP_HOMEPAGE "http://www.gpxsee.org"
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
#define HASH_T uint
#else // QT6
#define HASH_T size_t
#endif // QT6
inline HASH_T qHash(const QPoint &p)
{
return ::qHash(p.x()) ^ ::qHash(p.y());
}
#endif /* CONFIG_H */

18
src/common/hash.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef HASH_H
#define HASH_H
#include <QtGlobal>
#include <QPoint>
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
#define HASH_T uint
#else // QT6
#define HASH_T size_t
#endif // QT6
inline HASH_T qHash(const QPoint &p)
{
return ::qHash(p.x()) ^ ::qHash(p.y());
}
#endif // HASH_H

View File

@ -4,7 +4,7 @@
#include <QString>
#include <QCache>
#include <QByteArray>
#include "common/config.h"
#include "common/hash.h"
#include "area.h"
class QString;

View File

@ -482,6 +482,7 @@ void KMLParser::track(SegmentData &segment)
{
const char error[] = "gx:coord/when element count mismatch";
int i = 0;
bool empty = false;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("when")) {
@ -495,6 +496,8 @@ void KMLParser::track(SegmentData &segment)
_reader.raiseError("Invalid coordinates");
return;
}
if (segment.at(i).coordinates().isNull())
empty = true;
i++;
} else if (_reader.name() == QLatin1String("ExtendedData"))
extendedData(segment);
@ -507,10 +510,15 @@ void KMLParser::track(SegmentData &segment)
return;
}
// empty (invalid) coordinates are allowed per KML specification!
/* empty (invalid) coordinates are allowed per KML specification, but
invalid in our data representation so get rid of the segment entries */
if (empty) {
SegmentData filtered;
for (int i = 0; i < segment.size(); i++)
if (segment.at(i).coordinates().isNull())
segment.remove(i);
if (!segment.at(i).coordinates().isNull())
filtered.append(segment.at(i));
segment = filtered;
}
}
void KMLParser::multiTrack(TrackData &t)

View File

@ -7,7 +7,7 @@
#include <QVector>
#include <QPixmap>
#include <QDebug>
#include "common/config.h"
#include "common/hash.h"
#include "common/coordinates.h"
#include "link.h"
#include "style.h"

View File

@ -10,6 +10,7 @@
#define CATMOR 40
#define CATTRK 54
#define CATREA 56
#define CATSIT 61
#define CATSCF 65
#define CATWAT 69
#define CATWRK 71
@ -24,6 +25,7 @@
#define WATLEV 187
#define I_CATACH 17000
#define I_CATSIT 17002
#define I_RESTRN 17004
#define I_CATHAF 17008
#define I_RDOCAL 17017

View File

@ -5,6 +5,13 @@
using namespace ENC;
#define UINT16(x) \
(((quint16)*(const uchar*)(x)) \
| ((quint16)(*((const uchar*)(x) + 1)) << 8))
#define INT32(x) ((qint32)UINT32(x))
#define INT16(x) ((qint16)UINT16(x))
struct DR {
char RecordLength[5];
char InterchangeLevel;
@ -91,13 +98,14 @@ bool ISO8211::fieldType(const QString &str, int cnt, FieldType &type, int &size)
return true;
}
int ISO8211::readDR(QFile &file, QVector<FieldDefinition> &fields) const
int ISO8211::readDR(QVector<FieldDefinition> &fields)
{
DR ddr;
QByteArray fieldLen, fieldPos;
int len, lenSize, posSize, tagSize, offset;
if (file.read((char*)&ddr, sizeof(ddr)) != sizeof(ddr))
static_assert(sizeof(ddr) == 24, "Invalid DR alignment");
if (_file.read((char*)&ddr, sizeof(ddr)) != sizeof(ddr))
return -1;
len = Util::str2int(ddr.RecordLength, sizeof(ddr.RecordLength));
@ -118,9 +126,9 @@ int ISO8211::readDR(QFile &file, QVector<FieldDefinition> &fields) const
r.tag.resize(tagSize);
if (file.read(r.tag.data(), tagSize) != tagSize
|| file.read(fieldLen.data(), lenSize) != lenSize
|| file.read(fieldPos.data(), posSize) != posSize)
if (_file.read(r.tag.data(), tagSize) != tagSize
|| _file.read(fieldLen.data(), lenSize) != lenSize
|| _file.read(fieldPos.data(), posSize) != posSize)
return -1;
r.pos = offset + Util::str2int(fieldPos.constData(), posSize);
@ -133,13 +141,13 @@ int ISO8211::readDR(QFile &file, QVector<FieldDefinition> &fields) const
return len;
}
bool ISO8211::readDDA(QFile &file, const FieldDefinition &def, SubFields &fields)
bool ISO8211::readDDA(const FieldDefinition &def, SubFields &fields)
{
static QRegularExpression re("(\\d*)(\\w+)\\(*(\\d*)\\)*");
QByteArray ba;
ba.resize(def.size);
if (!(file.seek(def.pos) && file.read(ba.data(), ba.size()) == ba.size()))
if (!(_file.seek(def.pos) && _file.read(ba.data(), ba.size()) == ba.size()))
return false;
QList<QByteArray> list(ba.split('\x1f'));
@ -187,12 +195,16 @@ bool ISO8211::readDDA(QFile &file, const FieldDefinition &def, SubFields &fields
return true;
}
bool ISO8211::readDDR(QFile &file)
bool ISO8211::readDDR()
{
QVector<FieldDefinition> fields;
qint64 pos = file.pos();
int len = readDR(file, fields);
if (!_file.open(QIODevice::ReadOnly)) {
_errorString = _file.errorString();
return false;
}
int len = readDR(fields);
if (len < 0) {
_errorString = "Not a ISO8211 file";
return false;
@ -200,7 +212,7 @@ bool ISO8211::readDDR(QFile &file)
for (int i = 0; i < fields.size(); i++) {
SubFields def;
if (!readDDA(file, fields.at(i), def)) {
if (!readDDA(fields.at(i), def)) {
_errorString = QString("Error reading %1 DDA field")
.arg(QString(fields.at(i).tag));
return false;
@ -208,7 +220,7 @@ bool ISO8211::readDDR(QFile &file)
_map.insert(fields.at(i).tag, def);
}
if (file.pos() != pos + len || fields.size() < 2) {
if (_file.pos() != len || fields.size() < 2) {
_errorString = "DDR format error";
return false;
}
@ -216,20 +228,21 @@ bool ISO8211::readDDR(QFile &file)
return true;
}
bool ISO8211::readUDA(QFile &file, quint64 pos, const FieldDefinition &def,
const SubFields &fields, Data &data) const
bool ISO8211::readUDA(quint64 pos, const FieldDefinition &def,
const SubFields &fields, Data &data)
{
QByteArray ba;
ba.resize(def.size);
if (!(file.seek(pos + def.pos)
&& file.read(ba.data(), ba.size()) == ba.size()))
if (!(_file.seek(pos + def.pos)
&& _file.read(ba.data(), ba.size()) == ba.size()))
return false;
const char *sp;
const char *dp = ba.constData();
const char *ep = ba.constData() + ba.size() - 1;
data.clear();
data.setFields(&fields);
do {
@ -286,11 +299,14 @@ bool ISO8211::readUDA(QFile &file, quint64 pos, const FieldDefinition &def,
return true;
}
bool ISO8211::readRecord(QFile &file, Record &record)
bool ISO8211::readRecord(Record &record)
{
if (_file.atEnd())
return false;
QVector<FieldDefinition> fields;
qint64 pos = file.pos();
int len = readDR(file, fields);
qint64 pos = _file.pos();
int len = readDR(fields);
if (len < 0) {
_errorString = "Error reading DR";
@ -312,7 +328,7 @@ bool ISO8211::readRecord(QFile &file, Record &record)
f.setTag(def.tag);
if (!readUDA(file, pos, def, it.value(), f.rdata())) {
if (!readUDA(pos, def, it.value(), f.rdata())) {
_errorString = QString("Error reading %1 record")
.arg(QString(def.tag));
return false;

View File

@ -1,25 +1,17 @@
#ifndef ENC_ISO8211_H
#define ENC_ISO8211_H
#include <QFile>
#include <QByteArray>
#include <QVariant>
#include <QDebug>
class QFile;
#define UINT32(x) \
(((quint32)*(const uchar*)(x)) \
| ((quint32)(*((const uchar*)(x) + 1)) << 8) \
| ((quint32)(*((const uchar*)(x) + 2)) << 16) \
| ((quint32)(*((const uchar*)(x) + 3)) << 24))
#define UINT16(x) \
(((quint16)*(const uchar*)(x)) \
| ((quint16)(*((const uchar*)(x) + 1)) << 8))
#define INT32(x) ((qint32)UINT32(x))
#define INT16(x) ((qint16)UINT16(x))
namespace ENC {
class ISO8211
@ -102,8 +94,9 @@ public:
}
};
bool readDDR(QFile &file);
bool readRecord(QFile &file, Record &record);
ISO8211(const QString &path) : _file(path) {}
bool readDDR();
bool readRecord(Record &record);
const QString &errorString() const {return _errorString;}
@ -113,11 +106,12 @@ private:
static bool fieldType(const QString &str, int cnt, FieldType &type,
int &size);
int readDR(QFile &file, QVector<FieldDefinition> &fields) const;
bool readDDA(QFile &file, const FieldDefinition &def, SubFields &fields);
bool readUDA(QFile &file, quint64 pos, const FieldDefinition &def,
const SubFields &fields, Data &data) const;
int readDR(QVector<FieldDefinition> &fields);
bool readDDA(const FieldDefinition &def, SubFields &fields);
bool readUDA(quint64 pos, const FieldDefinition &def,
const SubFields &fields, Data &data);
QFile _file;
FieldsMap _map;
QString _errorString;
};

View File

@ -1,4 +1,3 @@
#include <QFile>
#include "common/util.h"
#include "objects.h"
#include "attributes.h"
@ -51,22 +50,24 @@ static QMap<uint,uint> orderMapInit()
map.insert(TYPE(UWTROC), 26);
map.insert(TYPE(WATTUR), 27);
map.insert(TYPE(PILBOP), 28);
map.insert(TYPE(I_RDOCAL), 29);
map.insert(TYPE(I_TRNBSN), 30);
map.insert(TYPE(HRBFAC), 31);
map.insert(TYPE(I_HRBFAC), 31);
map.insert(TYPE(PILPNT), 32);
map.insert(TYPE(ACHBRT), 33);
map.insert(TYPE(I_ACHBRT), 33);
map.insert(TYPE(CRANES), 34);
map.insert(TYPE(I_CRANES), 34);
map.insert(TYPE(I_WTWGAG), 35);
map.insert(TYPE(PYLONS), 36);
map.insert(TYPE(LNDMRK), 37);
map.insert(TYPE(SILTNK), 38);
map.insert(TYPE(LNDELV), 39);
map.insert(TYPE(SMCFAC), 40);
map.insert(TYPE(BUISGL), 41);
map.insert(TYPE(SISTAT), 29);
map.insert(TYPE(I_SISTAT), 29);
map.insert(TYPE(I_RDOCAL), 30);
map.insert(TYPE(I_TRNBSN), 31);
map.insert(TYPE(HRBFAC), 32);
map.insert(TYPE(I_HRBFAC), 32);
map.insert(TYPE(PILPNT), 33);
map.insert(TYPE(ACHBRT), 34);
map.insert(TYPE(I_ACHBRT), 34);
map.insert(TYPE(CRANES), 35);
map.insert(TYPE(I_CRANES), 35);
map.insert(TYPE(I_WTWGAG), 36);
map.insert(TYPE(PYLONS), 37);
map.insert(TYPE(LNDMRK), 38);
map.insert(TYPE(SILTNK), 39);
map.insert(TYPE(LNDELV), 40);
map.insert(TYPE(SMCFAC), 41);
map.insert(TYPE(BUISGL), 42);
map.insert(TYPE(I_DISMAR), 0xFFFFFFFE);
map.insert(TYPE(SOUNDG), 0xFFFFFFFF);
@ -220,6 +221,22 @@ static QString hUnits(uint type)
}
}
static QString sistat(uint type)
{
switch (type) {
case 1:
return "SS (Port Control)";
case 3:
return "SS (INT)";
case 6:
return "SS (Lock)";
case 8:
return "SS (Bridge)";
default:
return "SS";
}
}
MapData::Point::Point(uint type, const Coordinates &c, const QString &label,
const QVector<QByteArray> &params) : _type(type), _pos(c), _label(label)
{
@ -233,6 +250,10 @@ MapData::Point::Point(uint type, const Coordinates &c, const QString &label,
if (!params.at(1).isEmpty())
_label = QString("VHF ") + QString::fromLatin1(params.at(1));
_param = QVariant(params.at(0).toDouble());
} else if (type>>16 == I_SISTAT || type>>16 == SISTAT) {
if (_label.isEmpty())
_label = sistat(type & 0xFF);
_type = TYPE(SISTAT);
}
}
@ -509,7 +530,9 @@ MapData::Attr MapData::pointAttr(const ISO8211::Record &r, uint OBJL)
|| (OBJL == BUAARE && key == CATBUA)
|| (OBJL == SMCFAC && key == CATSCF)
|| (OBJL == BUISGL && key == FUNCTN)
|| (OBJL == WATTUR && key == CATWAT))
|| (OBJL == WATTUR && key == CATWAT)
|| (OBJL == SISTAT && key == CATSIT)
|| (OBJL == I_SISTAT && key == I_CATSIT))
subtype = av.at(1).toByteArray().toUInt();
else if (OBJL == I_DISMAR && key == CATDIS)
subtype |= av.at(1).toByteArray().toUInt();
@ -727,31 +750,25 @@ bool MapData::bounds(const QVector<ISO8211::Record> &gv, Rect &b)
MapData::MapData(const QString &path): _fileName(path)
{
QFile file(_fileName);
QVector<ISO8211::Record> gv;
ISO8211 ddf;
ISO8211 ddf(_fileName);
ISO8211::Record record;
uint COMF = 1;
if (!file.open(QIODevice::ReadOnly)) {
_errorString = file.errorString();
return;
}
if (!ddf.readDDR(file)) {
_errorString = ddf.errorString();
return;
}
while (!file.atEnd()) {
ISO8211::Record record;
if (!ddf.readRecord(file, record)) {
if (!ddf.readDDR()) {
_errorString = ddf.errorString();
return;
}
while (ddf.readRecord(record)) {
if (!processRecord(record, gv, COMF, _name)) {
_errorString = "Invalid S-57 record";
return;
}
}
if (!ddf.errorString().isNull()) {
_errorString = ddf.errorString();
return;
}
Rect b;
if (!bounds(gv, b)) {
@ -783,30 +800,22 @@ MapData::~MapData()
void MapData::load()
{
QFile file(_fileName);
RecordMap vi, vc, ve, vf;
QVector<ISO8211::Record> fe;
uint COMF = 1, SOMF = 1;
ISO8211 ddf;
uint PRIM, OBJL;
ISO8211 ddf(_fileName);
ISO8211::Record record;
uint PRIM, OBJL, COMF = 1, SOMF = 1;
Poly *poly;
Line *line;
Point *point;
double min[2], max[2];
if (!file.open(QIODevice::ReadOnly))
return;
if (!ddf.readDDR(file))
return;
while (!file.atEnd()) {
ISO8211::Record record;
if (!ddf.readRecord(file, record))
if (!ddf.readDDR())
return;
while (ddf.readRecord(record))
if (!processRecord(record, fe, vi, vc, ve, vf, COMF, SOMF))
return;
}
qWarning("Invalid S-57 record");
for (int i = 0; i < fe.size(); i++) {
const ISO8211::Record &r = fe.at(i);

View File

@ -71,6 +71,7 @@
#define RIVERS 114
#define ROADWY 116
#define SLCONS 122
#define SISTAT 123
#define SILTNK 125
#define SLOTOP 126
#define SMCFAC 128
@ -90,6 +91,7 @@
#define I_ACHARE 17001
#define I_DISMAR 17004
#define I_RESARE 17005
#define I_SISTAT 17007
#define I_BERTHS 17010
#define I_BRIDGE 17011
#define I_CBLOHD 17012

View File

@ -67,6 +67,9 @@ void Style::polygonStyle()
QImage(":/marine/entry-prohibited-line.png"));
_polygons[SUBTYPE(I_RESARE, 17)] = Polygon(
QImage(":/marine/entry-prohibited-line.png"));
_polygons[SUBTYPE(RESARE, 12)] = Polygon(QImage(":/marine/safety-zone-line.png"));
_polygons[SUBTYPE(I_RESARE, 12)] = Polygon(QImage(":/marine/safety-zone-line.png"));
_polygons[SUBTYPE(RESARE, 1)] = Polygon(QImage(":/marine/safety-zone-line.png"));
_polygons[SUBTYPE(ACHARE, 1)] = Polygon(QImage(":/marine/anchor-line.png"));
_polygons[SUBTYPE(I_ACHARE, 1)] = Polygon(QImage(":/marine/anchor-line.png"));
_polygons[TYPE(PRCARE)] = Polygon(QBrush(QColor("#eb49eb"),
@ -117,7 +120,8 @@ void Style::polygonStyle()
<< TYPE(DMPGRD) << TYPE(TSEZNE) << TYPE(OBSTRN) << TYPE(UWTROC)
<< TYPE(DWRTPT) << SUBTYPE(ACHARE, 1) << SUBTYPE(I_ACHARE, 1)
<< SUBTYPE(RESARE, 9) << SUBTYPE(RESARE, 2) << SUBTYPE(I_RESARE, 2)
<< SUBTYPE(RESARE, 17) << SUBTYPE(I_RESARE, 17) << TYPE(CBLARE)
<< SUBTYPE(RESARE, 17) << SUBTYPE(I_RESARE, 17) << SUBTYPE(RESARE, 12)
<< SUBTYPE(I_RESARE, 12) << SUBTYPE(RESARE, 1) << TYPE(CBLARE)
<< TYPE(PIPARE) << TYPE(PRCARE) << SUBTYPE(MARKUL, 3);
}
@ -241,6 +245,7 @@ void Style::pointStyle()
_points[SUBTYPE(I_DISMAR, 2)].setTextFontSize(Small);
_points[SUBTYPE(I_DISMAR, 2)].setHaloColor(QColor());
_points[SUBTYPE(I_DISMAR, 3)] = _points[SUBTYPE(I_DISMAR, 2)];
_points[SUBTYPE(I_DISMAR, 4)] = _points[SUBTYPE(I_DISMAR, 2)];
_points[TYPE(CGUSTA)] = Point(QImage(":/marine/coast-guard.png"));
_points[TYPE(RDOSTA)] = Point(QImage(":/marine/radio.png"));
_points[TYPE(RADSTA)] = Point(QImage(":/marine/radar.png"));
@ -255,6 +260,7 @@ void Style::pointStyle()
_points[SUBTYPE(WATTUR, 3)] = Point(QImage(":/marine/overfalls.png"));
_points[SUBTYPE(WATTUR, 4)] = Point(QImage(":/marine/overfalls.png"));
_points[TYPE(PILBOP)] = Point(QImage(":/marine/boarding-place.png"));
_points[TYPE(SISTAT)] = Point(QImage(":/marine/pylon.png"));
_points[SUBTYPE(SMCFAC, 7)] = Point(QImage(":/POI/restaurant-11.png"));
_points[SUBTYPE(SMCFAC, 11)] = Point(QImage(":/POI/pharmacy-11.png"));

View File

@ -301,7 +301,7 @@ void RasterTile::processPolygons(QList<TextItem*> &textItems)
QList<TextItem *> labels;
for (int i = 0; i < _polygons.size(); i++) {
MapData::Poly &poly = _polygons[i];
const MapData::Poly &poly = _polygons.at(i);
bool exists = set.contains(poly.label.text());
if (poly.label.text().isEmpty())
@ -343,7 +343,7 @@ void RasterTile::processLines(QList<TextItem*> &textItems)
void RasterTile::processStreetNames(QList<TextItem*> &textItems)
{
for (int i = 0; i < _lines.size(); i++) {
MapData::Poly &poly = _lines[i];
const MapData::Poly &poly = _lines.at(i);
const Style::Line &style = _style->line(poly.type);
if (style.img().isNull() && style.foreground() == Qt::NoPen)
@ -433,7 +433,7 @@ void RasterTile::processPoints(QList<TextItem*> &textItems)
std::sort(_points.begin(), _points.end());
for (int i = 0; i < _points.size(); i++) {
MapData::Point &point = _points[i];
const MapData::Point &point = _points.at(i);
const Style::Point &style = _style->point(point.type);
bool poi = Style::isPOI(point.type);

View File

@ -1,5 +1,5 @@
#ifndef SECTION_H
#define SECTION_H
#ifndef IMG_SECTION_H
#define IMG_SECTION_H
#include <QtGlobal>
@ -14,4 +14,4 @@ struct Section {
}
#endif // SECTION_H
#endif // IMG_SECTION_H

View File

@ -2,7 +2,7 @@
#define IMG_SHIELD_H
#include <QString>
#include "common/config.h"
#include "common/hash.h"
#define FIRST_SHIELD Shield::USInterstate
#define LAST_SHIELD Shield::Oval

View File

@ -384,10 +384,13 @@ void Style::defaultLineStyle()
_lines[0x10307] = Line(QPen(QColor("#05620e"), 1, Qt::SolidLine));
_lines[0x10401] = Line(QImage(":/marine/cable.png"));
_lines[0x10402] = Line(QImage(":/marine/pipeline.png"));
_lines[0x10405] = Line(QPen(QColor("#e728e7"), 1, Qt::DashLine));
_lines[0x10404] = Line(QImage(":/marine/fishing-farm-line.png"));
_lines[0x10405] = Line(QImage(":/marine/pipeline-area-line.png"));
_lines[0x10406] = Line(QImage(":/marine/cable-area-line.png"));
_lines[0x10409] = Line(QPen(QColor("#000000"), 1, Qt::DotLine));
_lines[0x10501] = Line(QImage(":/marine/noanchor-line.png"));
_lines[0x10503] = Line(QPen(QColor("#e728e7"), 1, Qt::DashLine));
_lines[0x10505] = Line(QImage(":/marine/safety-zone-line.png"));
_lines[0x10507] = Line(QPen(QColor("#e728e7"), 1, Qt::DashLine));
_lines[0x10601] = Line(QPen(QColor("#000000"), 1, Qt::SolidLine));
_lines[0x10606] = Line(QImage(":/marine/anchor-line.png"));
@ -663,8 +666,10 @@ void Style::defaultPointStyle()
_points[0x10216] = Point(QImage(":/marine/mooring-buoy.png"));
_points[0x10305] = Point(QImage(":/marine/chimney.png"));
_points[0x10306] = Point(QImage(":/marine/church.png"));
_points[0x10307] = Point(QImage(":/marine/silo.png"));
_points[0x10308] = Point(QImage(":/marine/tower.png"));
_points[0x1030a] = Point(QImage(":/marine/triangulation-point.png"));
_points[0x1030b] = Point(QImage(":/marine/radio.png"));
_points[0x10400] = Point(QImage(":/marine/obstruction.png"));
_points[0x10401] = Point(QImage(":/marine/obstruction.png"));
_points[0x10402] = Point(QImage(":/marine/wreck.png"));
@ -673,9 +678,12 @@ void Style::defaultPointStyle()
_points[0x1040a] = Point(QImage(":/marine/rock-dangerous.png"));
_points[0x1040c] = Point(QImage(":/marine/rock-exposed.png"));
_points[0x10701] = Point(QImage(":/marine/anchorage.png"));
_points[0x10702] = Point(QImage(":/marine/boarding-place.png"));
_points[0x10703] = Point(QImage(":/marine/yacht-harbor.png"));
_points[0x10704] = Point(QImage(":/marine/pile.png"));
_points[0x10705] = Point(QImage(":/marine/anchoring-prohibited.png"));
_points[0x1070a] = Point(QImage(":/marine/coast-guard.png"));
_points[0x1070b] = Point(QImage(":/marine/fishing-harbor.png"));
}
bool Style::itemInfo(SubFile *file, SubFile::Handle &hdl,

View File

@ -4,6 +4,7 @@
#include <QImageReader>
#include <QBuffer>
#include <QtConcurrent>
#include "common/hash.h"
#include "osm.h"
#include "tile.h"
#include "aqmmap.h"

View File

@ -4,7 +4,6 @@
#include <QDebug>
#include <QFile>
#include <QHash>
#include "common/config.h"
#include "map.h"
class AQMMap : public Map

View File

@ -4,7 +4,7 @@
#include <QFile>
#include <QCache>
#include <QPainterPath>
#include "common/config.h"
#include "common/hash.h"
#include "common/rectc.h"
#include "common/rtree.h"
#include "common/range.h"

View File

@ -8,7 +8,6 @@
#include <QRegularExpression>
#include "common/coordinates.h"
#include "common/rectc.h"
#include "common/config.h"
#include "tar.h"
#include "ozf.h"
#include "image.h"
@ -381,7 +380,7 @@ void OziMap::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
Map *OziMap::createTAR(const QString &path, const Projection &, bool *isDir)
{
if (isDir)
*isDir = true;
*isDir = false;
return new OziMap(path, true);
}
@ -389,7 +388,7 @@ Map *OziMap::createTAR(const QString &path, const Projection &, bool *isDir)
Map *OziMap::createMAP(const QString &path, const Projection &, bool *isDir)
{
if (isDir)
*isDir = true;
*isDir = false;
return new OziMap(path, false);
}

View File

@ -6,7 +6,7 @@
#include <QSet>
#include <QList>
#include <QHash>
#include "common/config.h"
#include "common/hash.h"
#include "common/rectc.h"
#include "common/kv.h"
#include "common/downloader.h"