1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-17 12:24:24 +02:00

Compare commits

..

58 Commits
13.12 ... 13.15

Author SHA1 Message Date
436cf0d14c Qt5 compatability module is not needed anymore 2024-01-21 18:44:42 +01:00
0e83bd89d1 Use Qt 6.6.1 for the Mac OS Qt6 CI build 2024-01-21 18:26:11 +01:00
536d12469a Use the canonical file name also for the "already open" check 2024-01-21 17:50:56 +01:00
c9f44506e7 Fixed minimal Windows version check for Qt6 builds 2024-01-21 16:04:59 +01:00
bc4bffdfe7 Fixed NSIS command line parameters 2024-01-21 12:26:04 +01:00
eda35b6762 Made the Windows installer more modular
Enable separately selecting the Qt6, OpenSSL or ANGLE options.
Added ICU option for Qt builds with ICU enabled/required.
2024-01-21 12:01:27 +01:00
b05e7b15fe Use ISO-8859-1 as the fallback encoding rather than UTF-8 2024-01-19 09:56:56 +01:00
ed2fc0c627 Fixed missing sdkmanager in path 2024-01-18 22:39:56 +01:00
60f58592b2 Try to use older cmdline-tools 2024-01-18 22:37:08 +01:00
80abb6f604 Trying to fix the android CI build... 2024-01-18 22:27:57 +01:00
19c4aa1c34 Try another Java 11 version instead of the now broken azul build 2024-01-18 22:15:48 +01:00
578045108f Removed now unused Qt5 compatability module 2024-01-18 22:13:54 +01:00
796c2e7eaf Removed unused header include 2024-01-18 22:13:05 +01:00
c08d3b7159 Fixed indent 2024-01-18 22:12:23 +01:00
7f7de87e99 Drop Qt5Compat dependency
Use QStringConverter instead of QTextCodec on Qt > 6.5.
Qt6 builds now require Qt build with ICU support for the non-UTF encodings to
work!
2024-01-18 10:04:38 +01:00
9cacf1906e Do not duplicate the same paths in the "open recent" menu 2024-01-18 09:53:50 +01:00
cedca8725b Supress windows build warnings 2024-01-18 09:52:22 +01:00
c493f8cf16 Make the popup layout more resistant to broken HTML content 2024-01-17 08:57:08 +01:00
866b2c27ca Consistently initialize all stuff in constructor 2024-01-05 00:20:05 +01:00
07614a8f74 Added missing header includes 2024-01-04 18:53:43 +01:00
bc7d965a49 Version++ 2024-01-02 22:05:56 +01:00
e383a35c65 Year++ in copyright notices 2024-01-02 22:04:30 +01:00
6b4990a204 Fixed error handling 2024-01-02 19:11:04 +01:00
7a7a331b58 The codec is always set when reading the GPI header 2024-01-02 09:48:13 +01:00
a1e10c395a Some more code cleanup 2024-01-01 13:02:42 +01:00
c97561add4 Code cleanup 2024-01-01 10:58:23 +01:00
d994fae4ce Fixed the change that has broken non-TAR maps
Do not fail on the first image read error - there may be files with a "_%u_%u."
file name match that are not image tiles.
2024-01-01 10:48:16 +01:00
789606cf86 Silenced some more clazy warnings 2023-12-31 13:57:43 +01:00
542b3e920e Fixed read error check 2023-12-31 13:24:36 +01:00
0248ecb254 Improved tile file check 2023-12-31 13:20:04 +01:00
acc9d07a22 Properly associate .gmi files 2023-12-31 10:48:26 +01:00
7860ce8acc Use the info we already have for calibration file type distinction 2023-12-31 10:05:02 +01:00
2541797e7d Improved error reporting 2023-12-31 01:12:46 +01:00
e13d6dfc4b Fixed broken image dimensions checks 2023-12-29 18:01:28 +01:00
9e1e960c93 Use a file name that allows QFileInfo::completeSuffix() to match 2023-12-27 22:41:56 +01:00
d18537733f Added mtbmap.cz as replacement for 4Umaps
While having a much lower topographic quality than 4Umaps, there is apparently
no other freely accessible map with the same MTB/hiking info out there. So let's
provide at least what we have...
2023-12-27 22:17:35 +01:00
c6a37594ae Code cleanup 2023-12-27 15:26:39 +01:00
bcfd51276f Use QNetworkRequest::setTransferTimeout where available 2023-12-27 15:12:53 +01:00
aed09a0e6a Android build fix no.3 2023-12-27 00:33:49 +01:00
867b70d159 Android build fix #2 2023-12-26 21:00:27 +01:00
0b05079a49 Fixed Android build 2023-12-26 20:52:58 +01:00
ca71eb9d93 Header includes cleanup 2023-12-26 20:46:52 +01:00
4a82055867 Some more code cleanup 2023-12-26 20:05:38 +01:00
f9b4cd991f Removed 4Umaps from the default map sources
4Umaps are most probably dead:
https://sourceforge.net/p/mobac/forum/general/thread/106784dc1d/
2023-12-26 14:38:03 +01:00
14dc2af877 Code cleanup 2023-12-26 14:14:08 +01:00
9380f31022 Code cleanup 2023-12-25 11:12:52 +01:00
5f76427ba4 Code cleanup 2023-12-25 10:49:50 +01:00
d4b731aeaf Use MIB numbers for QTextCodec fetching
Discard the "broken name cache" workaround and use QTextCodec search based
on MIB numbers.
2023-12-22 09:32:47 +01:00
3d27b4ea00 The codec is always set in load(), use the default constructor 2023-12-21 17:27:27 +01:00
502a7b4129 Do not have a separate class/file for ENC style retrieving, move
the stuff to the ENC raster tile constructor
2023-12-21 16:57:11 +01:00
6f32c73684 Added infinitive recursion assert 2023-12-21 16:55:42 +01:00
829d85a70a Optimize TextCodec initialization
QTextCodec initialization is very slow due to it's broken caching in Qt when
ICU is enabled. Make TetCodec initialize fast anyway as it may be used very
often in IMG maps (every LBL subfile has it's own codec!).
2023-12-21 01:31:44 +01:00
e05c2e0383 Version++ 2023-12-21 01:15:12 +01:00
bff27df10c Fixed race conditions on local static data 2023-12-21 01:13:36 +01:00
11ac5da640 Increase the default pixmap cache size on Android to 384MB
We need at least 4 * 4096x4096x4 for overzoomed vector tiles + additional
memory for remaining pixmaps (GUI icons, ...)
2023-12-18 21:18:50 +01:00
112dc59cf2 Fixed broken map scale (ruler) on HiDPI maps 2023-12-18 20:35:55 +01:00
aa892f6c3f Limit the overzoom by the resulting tile size rather than number of levels
Huge sizes may cause broken rendering and cache ping-pong. Do not allow
resulting tile sizes > 4096x4096px.
2023-12-18 20:32:00 +01:00
4e1b696869 Version++ 2023-12-18 20:27:10 +01:00
91 changed files with 637 additions and 425 deletions

View File

@ -1,4 +1,4 @@
version: 13.12.{build}
version: 13.15.{build}
configuration:
- Release
@ -11,11 +11,10 @@ environment:
matrix:
- QTDIR: C:\Qt\5.15\msvc2019_64
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
OPENSSLVERSION: 1_1
NSISDEF: /DOPENSSL /DANGLE
- QTDIR: C:\Qt\6.5\msvc2019_64
OPENSSLDIR: C:\OpenSSL-v30-Win64\bin
OPENSSLVERSION: 3
NSISDEF: /DQT6
NSISDEF: /DQT6 /DOPENSSL
install:
- cmd: |-
@ -37,8 +36,8 @@ build_script:
xcopy lang\*.qm installer\translations\ /sy
xcopy icons\symbols installer\symbols /i
copy licence.txt installer
copy %OPENSSLDIR%\libcrypto-%OPENSSLVERSION%-x64.dll installer
copy %OPENSSLDIR%\libssl-%OPENSSLVERSION%-x64.dll installer
copy %OPENSSLDIR%\libcrypto-*-x64.dll installer
copy %OPENSSLDIR%\libssl-*-x64.dll installer
makensis.exe %NSISDEF% installer\gpxsee64.nsi

View File

@ -15,14 +15,14 @@ jobs:
- name: set up JDK 11
uses: actions/setup-java@v3
with:
distribution: 'zulu'
distribution: 'temurin'
java-version: '11'
- name: Setup Android SDK
uses: android-actions/setup-android@v2
- name: Run sdkmanager update
run: ${ANDROID_HOME}/tools/bin/sdkmanager --update
- name: Install android platform, platform-tools, build-tools and ndk
run: ${ANDROID_HOME}/tools/bin/sdkmanager --install "cmdline-tools;latest" "platform-tools" "platforms;android-33" "build-tools;33.0.0" "ndk;23.1.7779620"
uses: android-actions/setup-android@v3
with:
cmdline-tools-version: 9862592
- name: Install android platform, build-tools and ndk
run: ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager --install "platforms;android-33" "build-tools;33.0.0" "ndk;23.1.7779620"
- name: Setup NDK path
run: echo "ANDROID_NDK_ROOT=${ANDROID_HOME}/ndk/23.1.7779620/" >> $GITHUB_ENV
- name: Install Qt (Desktop)

View File

@ -39,8 +39,8 @@ jobs:
- name: Install Qt
uses: jurplel/install-qt-action@v3
with:
version: '6.5.1'
modules: qtpositioning qt5compat qtserialport
version: '6.6.1'
modules: qtpositioning qtserialport
- name: Create localization
run: lrelease gpxsee.pro
- name: Configure build

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.gpxsee.org/map/1.4">
<name>4UMaps</name>
<url>https://tileserver.4umaps.com/$z/$x/$y.png</url>
<zoom min="2" max="15"/>
<bounds bottom="-65"/>
<copyright>Map data: © OpenStreetMap contributors (ODbL) | Rendering: © 4UMaps.eu</copyright>
</map>

6
data/maps/mtbmap-cz.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.gpxsee.org/map/1.4">
<name>mtbmap.cz</name>
<url>https://tile.mtbmap.cz/mtbmap_tiles/$z/$x/$y.png</url>
<copyright>Map data: OpenStreetMap, USGS | Rendering: Martin Tesař</copyright>
</map>

View File

@ -3,7 +3,7 @@ unix:!macx:!android {
} else {
TARGET = GPXSee
}
VERSION = 13.12
VERSION = 13.15
QT += core \
@ -18,8 +18,10 @@ QT += core \
svg \
serialport
greaterThan(QT_MAJOR_VERSION, 5) {
QT += openglwidgets \
core5compat
QT += openglwidgets
lessThan(QT_MINOR_VERSION, 5) {
QT += core5compat
}
}
CONFIG += object_parallel_to_source
@ -510,10 +512,11 @@ macx {
}
win32 {
CONFIG += no_batch
RESOURCES += theme-color.qrc
QMAKE_TARGET_DESCRIPTION = GPXSee
QMAKE_TARGET_COPYRIGHT = Copyright (c) 2023 Martin Tuma
QMAKE_TARGET_COPYRIGHT = Copyright (c) 2015-2024 Martin Tuma
RC_ICONS = icons/app/gpxsee.ico \
icons/formats/gpx.ico \
icons/formats/tcx.ico \

View File

@ -111,5 +111,6 @@
<mimetype>application/vnd.iho.s57-data</mimetype>
<mimetype>application/vnd.iho.s57-catalogue</mimetype>
<mimetype>application/vnd.gpsdump.wpt</mimetype>
<mimetype>application/vnd.gpstuner.gmi</mimetype>
</mimetypes>
</component>

View File

@ -16,4 +16,4 @@ Icon=gpxsee
Terminal=false
Type=Application
Categories=Graphics;Viewer;Education;Geography;Maps;Sports;Qt
MimeType=application/gpx+xml;application/vnd.garmin.tcx+xml;application/vnd.ant.fit;application/vnd.google-earth.kml+xml;application/vnd.fai.igc;application/vnd.nmea.nmea;application/vnd.oziexplorer.plt;application/vnd.oziexplorer.rte;application/vnd.oziexplorer.wpt;application/vnd.groundspeak.loc+xml;application/vnd.sigma.slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/vnd.suunto.sml+xml;image/jpeg;text/csv;application/vnd.garmin.img;application/vnd.garmin.jnx;application/vnd.garmin.gmap+xml;image/vnd.maptech.kap;application/vnd.oziexplorer.map;application/vnd.mapbox.mbtiles;application/vnd.twonav.rmap;application/vnd.trekbuddy.tba;application/vnd.gpxsee.map+xml;application/x-tar;image/tiff;application/vnd.google-earth.kmz;application/vnd.alpinequest.aqm;application/vnd.cgtk.gemf;application/vnd.rmaps.sqlite;application/vnd.osmdroid.sqlite;application/vnd.mapsforge.map;application/vnd.tomtom.ov2;application/vnd.tomtom.itn;application/vnd.esri.wld;application/vnd.onmove.omd;application/vnd.onmove.ghp;application/vnd.memory-map.qct;application/vnd.twonav.trk;application/vnd.twonav.rte;application/vnd.twonav.wpt;application/vnd.orux.map+xml;application/vnd.iho.s57-data;application/vnd.iho.s57-catalogue;application/vnd.gpsdump.wpt
MimeType=application/gpx+xml;application/vnd.garmin.tcx+xml;application/vnd.ant.fit;application/vnd.google-earth.kml+xml;application/vnd.fai.igc;application/vnd.nmea.nmea;application/vnd.oziexplorer.plt;application/vnd.oziexplorer.rte;application/vnd.oziexplorer.wpt;application/vnd.groundspeak.loc+xml;application/vnd.sigma.slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/vnd.suunto.sml+xml;image/jpeg;text/csv;application/vnd.garmin.img;application/vnd.garmin.jnx;application/vnd.garmin.gmap+xml;image/vnd.maptech.kap;application/vnd.oziexplorer.map;application/vnd.mapbox.mbtiles;application/vnd.twonav.rmap;application/vnd.trekbuddy.tba;application/vnd.gpxsee.map+xml;application/x-tar;image/tiff;application/vnd.google-earth.kmz;application/vnd.alpinequest.aqm;application/vnd.cgtk.gemf;application/vnd.rmaps.sqlite;application/vnd.osmdroid.sqlite;application/vnd.mapsforge.map;application/vnd.tomtom.ov2;application/vnd.tomtom.itn;application/vnd.esri.wld;application/vnd.onmove.omd;application/vnd.onmove.ghp;application/vnd.memory-map.qct;application/vnd.twonav.trk;application/vnd.twonav.rte;application/vnd.twonav.wpt;application/vnd.orux.map+xml;application/vnd.iho.s57-data;application/vnd.iho.s57-catalogue;application/vnd.gpsdump.wpt;application/vnd.gpstuner.gmi

View File

@ -363,4 +363,14 @@
<glob pattern="*.031"/>
</mime-type>
<mime-type type="application/vnd.gpstuner.gmi">
<comment>GPS Tuner Map Calibration File</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text/plain"/>
<magic>
<match type="string" offset="0" value="Map Calibration data file"/>
</magic>
<glob pattern="*.gmi"/>
</mime-type>
</mime-info>

View File

@ -417,6 +417,22 @@
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>gmi</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.gpstuner.gmi</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/map.icns</string>
<key>CFBundleTypeName</key>
<string>GPS Tuner Map Calibration File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
@ -1252,6 +1268,29 @@
<string>application/vnd.oziexplorer.map</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.gpstuner.gmi</string>
<key>UTTypeReferenceURL</key>
<string>https://github.com/tumic0/GPXSee/blob/master/src/map/gmifile.cpp</string>
<key>UTTypeDescription</key>
<string>GPS Tuner Map Calibration File</string>
<key>UTTypeIconFile</key>
<string>icons/map.icns</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>gmi</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.gpstuner.gmi</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.mapbox.mbtiles</string>

View File

@ -37,7 +37,7 @@ Unicode true
; The name of the installer
Name "GPXSee"
; Program version
!define VERSION "13.12"
!define VERSION "13.15"
; The file to write
OutFile "GPXSee-${VERSION}_x64.exe"
@ -58,7 +58,7 @@ VIProductVersion "${VERSION}.0.0"
VIAddVersionKey "ProductVersion" ${VERSION}
VIAddVersionKey "FileVersion" "${VERSION}.0.0"
VIAddVersionKey "ProductName" "GPXSee"
VIAddVersionKey "LegalCopyright" "Copyright (c) 2023 Martin Tůma"
VIAddVersionKey "LegalCopyright" "Copyright (c) 2015-2024 Martin Tůma"
VIAddVersionKey "FileDescription" "GPXSee installer (x64)"
; Registry key to check for directory (so if you install again, it will
@ -95,10 +95,17 @@ Var StartMenuFolder
!insertmacro MUI_LANGUAGE "English"
Function .onInit
!ifdef QT6
${IfNot} ${AtLeastWin10}
MessageBox MB_OK "GPXSee can only be installed on Windows 10 or later."
Abort
${EndIf}
!else
${IfNot} ${AtLeastWin7}
MessageBox MB_OK "GPXSee can only be installed on Windows 7 or later."
Abort
${EndIf}
!endif
${If} ${RunningX64}
SetRegView 64
@ -163,6 +170,7 @@ Section "GPXSee" SEC_APP
!insertmacro FILE_ASSOCIATION_ADD "kap" "BSB Nautical Chart" 10
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 11
!insertmacro FILE_ASSOCIATION_ADD "map" "OziExplorer Map File" 12
!insertmacro FILE_ASSOCIATION_ADD "gmi" "GPS Tuner Map Calibration File" 12
!insertmacro FILE_ASSOCIATION_ADD "mbtiles" "MBTiles Map File" 13
!insertmacro FILE_ASSOCIATION_ADD "rmap" "TwoNav Raster Map File" 14
!insertmacro FILE_ASSOCIATION_ADD "tba" "TrekBuddy Atlas" 15
@ -218,6 +226,7 @@ Section "GPXSee" SEC_APP
WriteRegStr HKCR ".jnx\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".kap\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".map\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".gmi\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".mbtiles\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".rmap\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".rtmap\OpenWithList" "GPXSee.exe" ""
@ -247,7 +256,7 @@ Section "GPXSee" SEC_APP
SectionEnd
Section "QT framework" SEC_QT
Section "Qt framework" SEC_QT
SectionIn RO
@ -262,7 +271,6 @@ Section "QT framework" SEC_QT
File "Qt6Sql.dll"
File "Qt6Svg.dll"
File "Qt6Widgets.dll"
File "Qt6Core5Compat.dll"
File "Qt6Positioning.dll"
File "Qt6SerialPort.dll"
File /r "tls"
@ -280,6 +288,7 @@ Section "QT framework" SEC_QT
File /r "printsupport"
!endif
File /r "platforms"
File /r "iconengines"
File /r "imageformats"
File /r "styles"
File /r "sqldrivers"
@ -298,21 +307,30 @@ Section "MSVC runtime" SEC_MSVC
SectionEnd
!ifdef ICU
Section "ICU" SEC_ICU
SectionIn RO
File "icudt*.dll"
File "icuin*.dll"
File "icuuc*.dll"
SectionEnd
!endif
!ifdef OPENSSL
Section "OpenSSL" SEC_OPENSSL
SectionIn RO
!ifdef QT6
File "libcrypto-3-x64.dll"
File "libssl-3-x64.dll"
!else
File "libcrypto-1_1-x64.dll"
File "libssl-1_1-x64.dll"
!endif
File "libcrypto-*-x64.dll"
File "libssl-*-x64.dll"
SectionEnd
!endif
!ifndef QT6
!ifdef ANGLE
Section "ANGLE" SEC_ANGLE
File "libGLESv2.dll"
@ -384,6 +402,7 @@ Section "Uninstall"
!insertmacro FILE_ASSOCIATION_REMOVE "jnx"
!insertmacro FILE_ASSOCIATION_REMOVE "kap"
!insertmacro FILE_ASSOCIATION_REMOVE "map"
!insertmacro FILE_ASSOCIATION_REMOVE "gmi"
!insertmacro FILE_ASSOCIATION_REMOVE "mbtiles"
!insertmacro FILE_ASSOCIATION_REMOVE "rmap"
!insertmacro FILE_ASSOCIATION_REMOVE "tba"
@ -431,6 +450,7 @@ Section "Uninstall"
DeleteRegValue HKCR ".jnx\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".kap\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".map\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".gmi\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".mbtiles\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".rmap\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".rtmap\OpenWithList" "GPXSee.exe"
@ -466,13 +486,24 @@ SectionEnd
; Descriptions
; Language strings
!ifdef QT6
LangString DESC_QT ${LANG_ENGLISH} \
"QT cross-platform application framework."
"Qt6 cross-platform application framework."
!else
LangString DESC_QT ${LANG_ENGLISH} \
"Qt5 cross-platform application framework."
!endif
LangString DESC_MSVC ${LANG_ENGLISH} \
"Microsoft Visual C++ 2019 runtime. If already installed, will be skipped."
"Microsoft Visual C++ runtime. If already installed, will be skipped."
!ifdef ICU
LangString DESC_ICU ${LANG_ENGLISH} \
"ICU library. Required for character set/encoding conversions."
!endif
!ifdef OPENSSL
LangString DESC_OPENSSL ${LANG_ENGLISH} \
"OpenSSL library. Required for HTTPS to work."
!ifndef QT6
"OpenSSL library. Qt SSL/TLS backend for HTTPS."
!endif
!ifdef ANGLE
LangString DESC_ANGLE ${LANG_ENGLISH} \
"ANGLE (OpenGL via Direct3D). Enables OpenGL on systems without native OpenGL drivers."
!endif
@ -484,8 +515,13 @@ LangString DESC_LOCALIZATION ${LANG_ENGLISH} \
; Assign language strings to sections
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_QT} $(DESC_QT)
!ifdef ICU
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_ICU} $(DESC_ICU)
!endif
!ifdef OPENSSL
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_OPENSSL} $(DESC_OPENSSL)
!ifndef QT6
!endif
!ifdef ANGLE
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_ANGLE} $(DESC_ANGLE)
!endif
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_MSVC} $(DESC_MSVC)

View File

@ -4,6 +4,7 @@
#include <QGraphicsItem>
#include <QVector>
#include <QLocale>
#include <QFont>
#include "common/range.h"
class AxisItem : public QGraphicsItem

View File

@ -1,7 +1,6 @@
#include <cmath>
#include <QLocale>
#include "data/data.h"
#include "tooltip.h"
#include "elevationgraphitem.h"
#include "elevationgraph.h"

View File

@ -5,8 +5,10 @@
#include <QFileInfo>
#include <QApplication>
#include <QFontMetrics>
#include "common/util.h"
#include "fileselectwidget.h"
#ifdef Q_OS_ANDROID
#include "common/util.h"
#endif // Q_OS_ANDROID
FileSelectWidget::FileSelectWidget(QWidget *parent) : QWidget(parent)

View File

@ -16,7 +16,6 @@
#include "infoitem.h"
#include "griditem.h"
#include "graphitem.h"
#include "pathitem.h"
#include "format.h"
#include "graphicsscene.h"
#include "graphview.h"

View File

@ -52,11 +52,13 @@
#include "graphtab.h"
#include "graphitem.h"
#include "pathitem.h"
#include "mapitem.h"
#include "mapaction.h"
#include "poiaction.h"
#include "navigationwidget.h"
#include "gui.h"
#ifdef Q_OS_ANDROID
#include "common/util.h"
#include "navigationwidget.h"
#endif // Q_OS_ANDROID
#define MAX_RECENT_FILES 10
@ -1026,13 +1028,16 @@ void GUI::openDir()
bool GUI::openFile(const QString &fileName, bool tryUnknown, int &showError)
{
if (_files.contains(fileName))
QFileInfo fi(fileName);
QString canonicalFileName(fi.canonicalFilePath());
if (_files.contains(canonicalFileName))
return true;
if (!loadFile(fileName, tryUnknown, showError))
return false;
_files.append(fileName);
_files.append(canonicalFileName);
#ifndef Q_OS_ANDROID
_browser->setCurrent(fileName);
#endif // Q_OS_ANDROID
@ -1045,7 +1050,7 @@ bool GUI::openFile(const QString &fileName, bool tryUnknown, int &showError)
updateStatusBarInfo();
updateWindowTitle();
#ifndef Q_OS_ANDROID
updateRecentFiles(fileName);
updateRecentFiles(canonicalFileName);
#endif // Q_OS_ANDROID
return true;

View File

@ -3,6 +3,7 @@
#include <QGraphicsItem>
#include <QList>
#include <QFont>
#include "common/kv.h"
class InfoItem : public QGraphicsItem

View File

@ -4,9 +4,11 @@
#include <QGraphicsSceneMouseEvent>
#include "map/map.h"
#include "mapaction.h"
#include "popup.h"
#include "tooltip.h"
#include "mapitem.h"
#ifdef Q_OS_ANDROID
#include "popup.h"
#endif // Q_OS_ANDROID
static void growLeft(Map *map, const Coordinates &c, QRectF &rect)

View File

@ -2,6 +2,7 @@
#define MOTIONINFOITEM_H
#include <QGraphicsItem>
#include <QFont>
#include "units.h"
class MotionInfoItem : public QGraphicsItem

View File

@ -3,6 +3,7 @@
#include <QFont>
#include <QGraphicsItem>
#include <QtMath>
#include "graphicsscene.h"
class PathTickItem : public GraphicsItem
@ -16,7 +17,7 @@ public:
void setPos(const QPointF &pos);
void setColor(const QColor &color) {_brush = QBrush(color);}
void setDigitalZoom(int zoom) {setScale(pow(2, -zoom));}
void setDigitalZoom(int zoom) {setScale(qPow(2, -zoom));}
int type() const {return parentItem()->type();}
ToolTip info() const

View File

@ -2,12 +2,6 @@
#include <QLineEdit>
#include "pluginparameters.h"
static const QMap<QString, QStringList> pluginParams = {
{"nmea", {"nmea.source", "nmea.baudrate"}},
{"serialnmea", {"serialnmea.serial_port"}},
{"geoclue2", {"desktopId"}}
};
static void deleteLayout(QLayout *layout)
{
if (!layout)
@ -32,6 +26,12 @@ PluginParameters::PluginParameters(const QString &plugin,
void PluginParameters::setPlugin(const QString &plugin)
{
static const QMap<QString, QStringList> pluginParams = {
{"nmea", {"nmea.source", "nmea.baudrate"}},
{"serialnmea", {"serialnmea.serial_port"}},
{"geoclue2", {"desktopId"}}
};
saveParameters();
QStringList params = pluginParams.value(plugin);

View File

@ -7,6 +7,7 @@
#include <QBasicTimer>
#include <QScreen>
#include <QVBoxLayout>
#include <QFormLayout>
#include <QApplication>
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
#include <QDesktopWidget>
@ -93,21 +94,29 @@ void PopupFrame::createLayout(const ToolTip &content)
}
if (!content.list().isEmpty()) {
QString html = "<table>";
for (int i = 0; i < content.list().count(); i++)
html += "<tr><td align=\"right\"><b>" + content.list().at(i).key()
+ ":&nbsp;</b></td><td>" + content.list().at(i).value()
+ "</td></tr>";
html += "</table>";
QFormLayout *textLayout = new QFormLayout();
textLayout->setLabelAlignment(Qt::AlignRight);
textLayout->setHorizontalSpacing(5);
textLayout->setVerticalSpacing(2);
QLabel *label = new QLabel(html);
label->setAlignment(Qt::AlignLeft);
label->setIndent(1);
label->setTextInteractionFlags(Qt::TextBrowserInteraction);
label->setOpenExternalLinks(true);
label->setWordWrap(true);
for (int i = 0; i < content.list().count(); i++) {
QLabel *key = new QLabel(content.list().at(i).key() + ":");
key->setTextFormat(Qt::PlainText);
key->setAlignment(Qt::AlignTop);
key->setStyleSheet("font-weight: bold");
QLabel *value = new QLabel(content.list().at(i).value());
value->setSizePolicy(QSizePolicy::MinimumExpanding,
QSizePolicy::Preferred);
value->setTextFormat(Qt::RichText);
value->setAlignment(Qt::AlignTop);
value->setTextInteractionFlags(Qt::TextBrowserInteraction);
value->setOpenExternalLinks(true);
value->setWordWrap(true);
layout->addWidget(label);
textLayout->addRow(key, value);
}
layout->addLayout(textLayout);
}
setLayout(layout);

View File

@ -2,6 +2,7 @@
#define SCALEITEM_H
#include <QGraphicsItem>
#include <QFont>
#include "units.h"
class ScaleItem : public QGraphicsItem

View File

@ -4,7 +4,6 @@
#include <QPageSize>
#include <QGeoPositionInfoSource>
#include "common/config.h"
#include "common/util.h"
#include "data/graph.h"
#include "format.h"
#include "units.h"
@ -33,7 +32,7 @@
: QPageSize::PageSizeId::A4)
#ifdef Q_OS_ANDROID
#define PIXMAP_CACHE 256
#define PIXMAP_CACHE 384
#define DEM_CACHE 128
#else // Q_OS_ANDROID
#define PIXMAP_CACHE 512

View File

@ -2,6 +2,7 @@
#define SLIDERINFOITEM_H
#include <QGraphicsItem>
#include <QFont>
class SliderInfoItem : public QGraphicsItem
{

View File

@ -1,6 +1,5 @@
#include <QLocale>
#include "data/data.h"
#include "tooltip.h"
#include "format.h"
#include "speedgraphitem.h"
#include "speedgraph.h"

View File

@ -1,5 +1,4 @@
#include <QFile>
#include <QFileInfo>
#include <QNetworkRequest>
#include <QDir>
#include <QTimerEvent>
@ -56,6 +55,7 @@ Authorization::Authorization(const QString &username, const QString &password)
_header = HTTPHeader("Authorization", "Basic " + data);
}
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
NetworkTimeout::NetworkTimeout(int timeout, QNetworkReply *reply)
: QObject(reply), _timeout(timeout)
{
@ -77,6 +77,7 @@ void NetworkTimeout::timerEvent(QTimerEvent *ev)
reply->abort();
_timer.stop();
}
#endif // QT 5.15
QNetworkAccessManager *Downloader::_manager = 0;
@ -104,11 +105,15 @@ bool Downloader::doDownload(const Download &dl, const QList<HTTPHeader> &headers
request.setAttribute(ATTR_REDIRECT_POLICY,
QNetworkRequest::NoLessSafeRedirectPolicy);
request.setAttribute(ATTR_HTTP2_ALLOWED, QVariant(_http2));
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
request.setTransferTimeout(_timeout * 1000);
#endif // QT 5.15
for (int i = 0; i < headers.size(); i++) {
const HTTPHeader &hdr = headers.at(i);
request.setRawHeader(hdr.key(), hdr.value());
if (hdr.key() == "User-Agent")
// QByteArray::compare() not available in Qt < 5.12
if (!QString(hdr.key()).compare("User-Agent", Qt::CaseInsensitive))
userAgent = true;
}
if (!userAgent)
@ -128,9 +133,9 @@ bool Downloader::doDownload(const Download &dl, const QList<HTTPHeader> &headers
_currentDownloads.insert(url, file);
if (reply->isRunning()) {
/* Starting with Qt 5.15 this can be replaced by
QNetworkRequest::setTransferTimeout() */
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
new NetworkTimeout(_timeout, reply);
#endif // QT 5.15
connect(reply, &QIODevice::readyRead, this, &Downloader::emitReadReady);
connect(reply, &QNetworkReply::finished, this, &Downloader::emitFinished);
} else {

View File

@ -3,7 +3,9 @@
#include <QNetworkAccessManager>
#include <QNetworkReply>
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
#include <QBasicTimer>
#endif // QT 5.15
#include <QUrl>
#include <QList>
#include <QHash>
@ -39,6 +41,7 @@ private:
HTTPHeader _header;
};
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
class NetworkTimeout : public QObject
{
Q_OBJECT
@ -55,6 +58,7 @@ private:
QBasicTimer _timer;
int _timeout;
};
#endif // QT 5.15
class Downloader : public QObject
{
@ -79,8 +83,6 @@ private slots:
void emitReadReady();
private:
class ReplyTimeout;
void insertError(const QUrl &url, QNetworkReply::NetworkError error);
bool doDownload(const Download &dl, const QList<HTTPHeader> &headers);
void downloadFinished(QNetworkReply *reply);

View File

@ -2,9 +2,12 @@
#define HASH_H
#include <QtGlobal>
#include <QPoint>
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
#include <QPoint>
#include <QPair>
#include <QHash>
#define HASH_T uint
inline uint qHash(const QPoint &p)

View File

@ -1,59 +1,100 @@
#include <QTextCodec>
#include "textcodec.h"
TextCodec::TextCodec()
#if QT_VERSION < QT_VERSION_CHECK(6, 5, 0)
static QTextCodec *codec(int mib)
{
QTextCodec *c = QTextCodec::codecForMib(mib);
if (!c)
qWarning("MIB-%d: No such QTextCodec, using ISO-8859-1", mib);
return c;
}
TextCodec::TextCodec() : _codec(0)
{
_codec = QTextCodec::codecForName("Windows-1252");
}
TextCodec::TextCodec(int codepage)
{
switch (codepage) {
case 65001:
_codec = 0;
case 874:
_codec = codec(2109);
break;
case 932:
_codec = QTextCodec::codecForName("Shift-JIS");
_codec = codec(17);
break;
case 936:
_codec = QTextCodec::codecForName("GB18030");
_codec = codec(114);
break;
case 949:
_codec = QTextCodec::codecForName("EUC-KR");
_codec = codec(38);
break;
case 950:
_codec = QTextCodec::codecForName("Big5");
_codec = codec(2026);
break;
case 1250:
_codec = QTextCodec::codecForName("Windows-1250");
_codec = codec(2250);
break;
case 1251:
_codec = QTextCodec::codecForName("Windows-1251");
_codec = codec(2251);
break;
case 1252:
_codec = codec(2252);
break;
case 1253:
_codec = QTextCodec::codecForName("Windows-1253");
_codec = codec(2253);
break;
case 1254:
_codec = QTextCodec::codecForName("Windows-1254");
_codec = codec(2254);
break;
case 1255:
_codec = QTextCodec::codecForName("Windows-1255");
_codec = codec(2255);
break;
case 1256:
_codec = QTextCodec::codecForName("Windows-1256");
_codec = codec(2256);
break;
case 1257:
_codec = QTextCodec::codecForName("Windows-1257");
_codec = codec(2257);
break;
case 1258:
_codec = QTextCodec::codecForName("Windows-1258");
_codec = codec(2258);
break;
case 65001:
_codec = codec(106);
break;
default:
_codec = QTextCodec::codecForName("Windows-1252");
qWarning("%d: Unknown codepage, using ISO-8859-1", codepage);
_codec = 0;
}
}
QString TextCodec::toString(const QByteArray &ba) const
QString TextCodec::toString(const QByteArray &ba)
{
return _codec ? _codec->toUnicode(ba) : QString::fromUtf8(ba);
return _codec ? _codec->toUnicode(ba) : QString::fromLatin1(ba);
}
#else // QT 6.5
TextCodec::TextCodec()
{
}
TextCodec::TextCodec(int codepage)
{
if (codepage == 65001)
_decoder = QStringDecoder(QStringDecoder::Utf8);
else {
QByteArray cp(QByteArray("CP") + QByteArray::number(codepage));
_decoder = QStringDecoder(cp.constData());
if (!_decoder.isValid())
qWarning("%d: Unknown codepage, using ISO-8859-1", codepage);
}
}
QString TextCodec::toString(const QByteArray &ba)
{
return _decoder.isValid() ? _decoder.decode(ba) : QString::fromLatin1(ba);
}
#endif // QT 6.5

View File

@ -2,8 +2,11 @@
#define TEXTCODEC_H
#include <QString>
class QTextCodec;
#if QT_VERSION < QT_VERSION_CHECK(6, 5, 0)
#include <QTextCodec>
#else // QT 6.5
#include <QStringDecoder>
#endif // QT 6.5
class TextCodec
{
@ -11,10 +14,14 @@ public:
TextCodec();
TextCodec(int codepage);
QString toString(const QByteArray &ba) const;
QString toString(const QByteArray &ba);
private:
#if QT_VERSION < QT_VERSION_CHECK(6, 5, 0)
QTextCodec *_codec;
#else // QT 6.5
QStringDecoder _decoder;
#endif // QT 6.5
};
#endif // TEXTCODEC_H

View File

@ -148,9 +148,9 @@ qreal DEM::elevation(const Coordinates &c)
QList<Area> DEM::tiles()
{
static const QRegularExpression re("([NS])([0-9]{2})([EW])([0-9]{3})");
QDir dir(_dir);
QFileInfoList files(dir.entryInfoList(QDir::Files | QDir::Readable));
QRegularExpression re("([NS])([0-9]{2})([EW])([0-9]{3})");
QLocale l(QLocale::system());
QList<Area> list;

View File

@ -88,6 +88,7 @@ static Coordinates parseUTM(const QString &zone, const QString &easting,
bool GPSDumpParser::parse(QFile *file, QList<TrackData> &tracks,
QList<RouteData> &routes, QList<Area> &polygons, QVector<Waypoint> &waypoints)
{
static const QRegularExpression dm("[ ]{2,}");
Q_UNUSED(tracks);
Q_UNUSED(routes);
Q_UNUSED(polygons);
@ -95,7 +96,6 @@ bool GPSDumpParser::parse(QFile *file, QList<TrackData> &tracks,
_errorLine = 1;
_errorString.clear();
Type type = Unknown;
QRegularExpression dm("[ ]{2,}");
while (!file->atEnd()) {
QByteArray ba(file->readLine(4096).trimmed());

View File

@ -2,11 +2,9 @@
#include <QDir>
#include "common/rectc.h"
#include "common/greatcircle.h"
#include "data.h"
#include "dem.h"
#include "path.h"
#include "area.h"
#include "common/wgs84.h"
#include "data.h"
#include "path.h"
#include "poi.h"

View File

@ -13,7 +13,7 @@ QDebug operator<<(QDebug dbg, const SMLParser::Sensors &sensors)
#endif // QT_NO_DEBUG
void SMLParser::sample(SegmentData &segment, QMap<QDateTime, Sensors> &map)
void SMLParser::sample(SegmentData &segment, SensorsMap &map)
{
QDateTime timestamp;
Sensors sensors;
@ -97,19 +97,20 @@ void SMLParser::sample(SegmentData &segment, QMap<QDateTime, Sensors> &map)
void SMLParser::samples(SegmentData &segment)
{
QMap<QDateTime, Sensors> sensors;
QMap<QDateTime, Sensors>::const_iterator it;
SensorsMap map;
while (_reader.readNextStartElement()) {
if (_reader.name() == QLatin1String("Sample")) {
sample(segment, sensors);
sample(segment, map);
} else
_reader.skipCurrentElement();
}
for (int i = 0; i < segment.size(); i++) {
Trackpoint &t = segment[i];
if ((it = sensors.lowerBound(t.timestamp())) != sensors.constEnd()) {
SensorsMap::const_iterator it(map.lowerBound(t.timestamp()));
if (it != map.constEnd()) {
t.setCadence(it->cadence * 60);
t.setTemperature(it->temperature - 273.15);
t.setHeartRate(it->hr * 60);

View File

@ -23,10 +23,12 @@ private:
qreal cadence, temperature, hr, power, speed;
};
typedef QMap<QDateTime, Sensors> SensorsMap;
void sml(QList<TrackData> &tracks);
void deviceLog(TrackData &track);
void samples(SegmentData &segment);
void sample(SegmentData &segment, QMap<QDateTime, Sensors> &map);
void sample(SegmentData &segment, SensorsMap &map);
#ifndef QT_NO_DEBUG
friend QDebug operator<<(QDebug dbg, const Sensors &sensors);

View File

@ -75,7 +75,7 @@ bool TwoNavParser::parse(QFile *file, QList<TrackData> &tracks,
QVector<Waypoint> &waypoints)
{
Q_UNUSED(polygons);
TextCodec codec;
TextCodec codec(1252);
GCS gcs;
bool ok, route = false, track = false, waypoint = false;

View File

@ -323,7 +323,7 @@ bool ISO8211::readRecord(Record &record)
const FieldDefinition &def = fields.at(i);
Data data;
FieldsMap::const_iterator it = _map.find(def.tag);
FieldsMap::const_iterator it(_map.find(def.tag));
if (it == _map.constEnd()) {
_errorString = QString("%1: unknown record").arg(QString(def.tag));
return false;

View File

@ -86,7 +86,7 @@ static QMap<uint,uint> orderMap = orderMapInit();
static uint order(uint type)
{
uint st = ((type>>16) == BUAARE) ? type : (type & 0xFFFF0000);
QMap<uint, uint>::const_iterator it = orderMap.find(st);
QMap<uint, uint>::const_iterator it(orderMap.find(st));
return (it == orderMap.constEnd()) ? (type>>16) + 512 : it.value();
}

View File

@ -15,51 +15,13 @@ using namespace ENC;
typedef QSet<Coordinates> PointSet;
static const float C1 = 0.866025f; /* sqrt(3)/2 */
static const QColor haloColor(Qt::white);
static const QColor tsslptPen = QColor("#eb49eb");
static const QColor tsslptBrush = QColor("#80eb49eb");
static QFont pixelSizeFont(int pixelSize)
static const Style *style()
{
QFont f;
f.setPixelSize(pixelSize);
return f;
}
static QFont *font(Style::FontSize size)
{
/* The fonts must be initialized on first usage (after the QGuiApplication
instance is created) */
static QFont large = pixelSizeFont(16);
static QFont normal = pixelSizeFont(12);
static QFont small = pixelSizeFont(10);
switch (size) {
case Style::None:
return 0;
case Style::Large:
return &large;
case Style::Small:
return &small;
default:
return &normal;
}
}
static const QImage *light()
{
static QImage img(":/marine/light.png");
return &img;
}
static const QImage *signal()
{
static QImage img(":/marine/fog-signal.png");
return &img;
}
static const Style& style()
{
static Style s;
return s;
static ENC::Style s;
return &s;
}
static double area(const QVector<Coordinates> &polygon)
@ -213,8 +175,8 @@ void RasterTile::drawArrows(QPainter *painter,
QPolygonF polygon(tsslptArrow(centroid(poly.path().first()),
deg2rad(180 - poly.param().toDouble())));
painter->setPen(QPen(QColor("#eb49eb"), 1));
painter->setBrush(QBrush("#80eb49eb"));
painter->setPen(QPen(tsslptPen, 1));
painter->setBrush(QBrush(tsslptBrush));
painter->drawPolygon(polygon);
}
}
@ -223,14 +185,12 @@ void RasterTile::drawArrows(QPainter *painter,
void RasterTile::drawPolygons(QPainter *painter,
const QList<MapData::Poly> &polygons)
{
const Style &s = style();
for (int n = 0; n < s.drawOrder().size(); n++) {
for (int n = 0; n < _style->drawOrder().size(); n++) {
for (int i = 0; i < polygons.size(); i++) {
const MapData::Poly &poly = polygons.at(i);
if (poly.type() != s.drawOrder().at(n))
if (poly.type() != _style->drawOrder().at(n))
continue;
const Style::Polygon &style = s.polygon(poly.type());
const Style::Polygon &style = _style->polygon(poly.type());
if (!style.img().isNull()) {
for (int i = 0; i < poly.path().size(); i++)
@ -257,13 +217,11 @@ void RasterTile::drawPolygons(QPainter *painter,
void RasterTile::drawLines(QPainter *painter, const QList<MapData::Line> &lines)
{
const Style &s = style();
painter->setBrush(Qt::NoBrush);
for (int i = 0; i < lines.size(); i++) {
const MapData::Line &line = lines.at(i);
const Style::Line &style = s.line(line.type());
const Style::Line &style = _style->line(line.type());
if (!style.img().isNull()) {
BitmapLine::draw(painter, polyline(line.path()), style.img());
@ -284,8 +242,6 @@ void RasterTile::drawTextItems(QPainter *painter,
void RasterTile::processPolygons(const QList<MapData::Poly> &polygons,
QList<TextItem*> &textItems)
{
const Style &s = style();
for (int i = 0; i < polygons.size(); i++) {
const MapData::Poly &poly = polygons.at(i);
uint type = poly.type()>>16;
@ -293,7 +249,7 @@ void RasterTile::processPolygons(const QList<MapData::Poly> &polygons,
if (!(type == HRBFAC || type == I_TRNBSN
|| poly.type() == SUBTYPE(I_BERTHS, 6)))
continue;
const Style::Point &style = s.point(poly.type());
const Style::Point &style = _style->point(poly.type());
const QImage *img = style.img().isNull() ? 0 : &style.img();
if (!img)
continue;
@ -311,7 +267,6 @@ void RasterTile::processPolygons(const QList<MapData::Poly> &polygons,
void RasterTile::processPoints(QList<MapData::Point> &points,
QList<TextItem*> &textItems, QList<TextItem*> &lights)
{
const Style &s = style();
PointSet lightsSet, signalsSet;
int i;
@ -332,12 +287,12 @@ void RasterTile::processPoints(QList<MapData::Point> &points,
for ( ; i < points.size(); i++) {
const MapData::Point &point = points.at(i);
QPoint pos(ll2xy(point.pos()).toPoint());
const Style::Point &style = s.point(point.type());
const Style::Point &style = _style->point(point.type());
const QString *label = point.label().isEmpty() ? 0 : &(point.label());
const QImage *img = style.img().isNull() ? 0 : &style.img();
const QFont *fnt = showLabel(img, _zoomRange, _zoom, point.type())
? font(style.textFontSize()) : 0;
? _style->font(style.textFontSize()) : 0;
const QColor *color = &style.textColor();
const QColor *hColor = style.haloColor().isValid()
? &style.haloColor() : 0;
@ -351,9 +306,11 @@ void RasterTile::processPoints(QList<MapData::Point> &points,
if (item->isValid() && !item->collides(textItems)) {
textItems.append(item);
if (lightsSet.contains(point.pos()))
lights.append(new TextPointItem(pos, 0, 0, light(), 0, 0, 0, 0));
lights.append(new TextPointItem(pos, 0, 0, _style->light(), 0,
0, 0, 0));
if (signalsSet.contains(point.pos()))
lights.append(new TextPointItem(pos, 0, 0, signal(), 0, 0, 0, 0));
lights.append(new TextPointItem(pos, 0, 0, _style->signal(), 0,
0, 0, 0));
} else
delete item;
}
@ -362,18 +319,16 @@ void RasterTile::processPoints(QList<MapData::Point> &points,
void RasterTile::processLines(const QList<MapData::Line> &lines,
QList<TextItem*> &textItems)
{
const Style &s = style();
for (int i = 0; i < lines.size(); i++) {
const MapData::Line &line = lines.at(i);
const Style::Line &style = s.line(line.type());
const Style::Line &style = _style->line(line.type());
if (style.img().isNull() && style.pen() == Qt::NoPen)
continue;
if (line.label().isEmpty() || style.textFontSize() == Style::None)
continue;
const QFont *fnt = font(style.textFontSize());
const QFont *fnt = _style->font(style.textFontSize());
const QColor *color = &style.textColor();
TextPathItem *item = new TextPathItem(polyline(line.path()),
@ -449,3 +404,23 @@ void RasterTile::render()
_valid = true;
}
RasterTile::RasterTile(const Projection &proj, const Transform &transform,
const MapData *data, int zoom, const Range &zoomRange, const QRect &rect,
qreal ratio) :
_proj(proj), _transform(transform), _map(data), _atlas(0), _zoom(zoom),
_zoomRange(zoomRange), _rect(rect), _ratio(ratio),
_pixmap(rect.width() * ratio, rect.height() * ratio), _valid(false)
{
_style = style();
}
RasterTile::RasterTile(const Projection &proj, const Transform &transform,
AtlasData *data, int zoom, const Range &zoomRange, const QRect &rect,
qreal ratio) :
_proj(proj), _transform(transform), _map(0), _atlas(data), _zoom(zoom),
_zoomRange(zoomRange), _rect(rect), _ratio(ratio),
_pixmap(rect.width() * ratio, rect.height() * ratio), _valid(false)
{
_style = style();
}

View File

@ -7,6 +7,7 @@
#include "map/transform.h"
#include "map/textpointitem.h"
#include "mapdata.h"
#include "style.h"
#include "atlasdata.h"
class TextItem;
@ -18,14 +19,10 @@ class RasterTile
public:
RasterTile(const Projection &proj, const Transform &transform,
const MapData *data, int zoom, const Range &zoomRange, const QRect &rect,
qreal ratio) : _proj(proj), _transform(transform), _map(data), _atlas(0),
_zoom(zoom), _zoomRange(zoomRange), _rect(rect), _ratio(ratio),
_pixmap(rect.width() * ratio, rect.height() * ratio), _valid(false) {}
qreal ratio);
RasterTile(const Projection &proj, const Transform &transform,
AtlasData *data, int zoom, const Range &zoomRange, const QRect &rect,
qreal ratio) : _proj(proj), _transform(transform), _map(0), _atlas(data),
_zoom(zoom), _zoomRange(zoomRange), _rect(rect), _ratio(ratio),
_pixmap(rect.width() * ratio, rect.height() * ratio), _valid(false) {}
qreal ratio);
int zoom() const {return _zoom;}
QPoint xy() const {return _rect.topLeft();}
@ -61,6 +58,7 @@ private:
Projection _proj;
Transform _transform;
const Style *_style;
const MapData *_map;
AtlasData *_atlas;
int _zoom;

View File

@ -14,6 +14,13 @@ static QImage railroad()
return img;
}
static QFont pixelSizeFont(int pixelSize)
{
QFont f;
f.setPixelSize(pixelSize);
return f;
}
void Style::polygonStyle()
{
_polygons[TYPE(M_COVR)] = Polygon(QBrush("#ffffff"));
@ -321,6 +328,13 @@ void Style::pointStyle()
Style::Style()
{
_light = QImage(":/marine/light.png");
_signal = QImage(":/marine/fog-signal.png");
_large = pixelSizeFont(16);
_normal = pixelSizeFont(12);
_small = pixelSizeFont(10);
polygonStyle();
lineStyle();
pointStyle();
@ -330,7 +344,7 @@ const Style::Line &Style::line(uint type) const
{
static Line null;
QMap<uint, Line>::const_iterator it = _lines.find(type);
QMap<uint, Line>::const_iterator it(_lines.find(type));
return (it == _lines.constEnd()) ? null : *it;
}
@ -338,7 +352,7 @@ const Style::Polygon &Style::polygon(uint type) const
{
static Polygon null;
QMap<uint, Polygon>::const_iterator it = _polygons.find(type);
QMap<uint, Polygon>::const_iterator it(_polygons.find(type));
return (it == _polygons.constEnd()) ? null : *it;
}
@ -346,6 +360,20 @@ const Style::Point &Style::point(uint type) const
{
static Point null;
QMap<uint, Point>::const_iterator it = _points.find(type);
QMap<uint, Point>::const_iterator it(_points.find(type));
return (it == _points.constEnd()) ? null : *it;
}
const QFont *Style::font(Style::FontSize size) const
{
switch (size) {
case Style::None:
return 0;
case Style::Large:
return &_large;
case Style::Small:
return &_small;
default:
return &_normal;
}
}

View File

@ -3,6 +3,7 @@
#include <QPen>
#include <QBrush>
#include <QFont>
#include <QMap>
#include "objects.h"
@ -96,6 +97,10 @@ public:
const Point &point(uint type) const;
const QVector<uint> &drawOrder() const {return _drawOrder;}
const QFont *font(Style::FontSize size) const;
const QImage *light() const {return &_light;}
const QImage *signal() const {return &_signal;}
private:
void polygonStyle();
void lineStyle();
@ -105,6 +110,10 @@ private:
QMap<uint, Polygon> _polygons;
QMap<uint, Point> _points;
QVector<uint> _drawOrder;
/* Fonts and images must be initialized after QGuiApplication! */
QFont _small, _normal, _large;
QImage _light, _signal;
};
}

View File

@ -52,8 +52,10 @@ bool GMAPData::readXML(const QString &path, QString &dataDir, QString &typFile)
{
QFile file(path);
if (!file.open(QFile::ReadOnly | QFile::Text))
if (!file.open(QFile::ReadOnly | QFile::Text)) {
_errorString = file.errorString();
return false;
}
QXmlStreamReader reader(&file);
if (reader.readNextStartElement()) {

View File

@ -105,7 +105,7 @@ bool IMGData::readFAT(QFile &file, TileMap &tileMap)
QByteArray fn(name, sizeof(name));
if (VectorTile::isTileFile(tt)) {
VectorTile *tile;
TileMap::const_iterator it = tileMap.find(fn);
TileMap::const_iterator it(tileMap.find(fn));
if (it == tileMap.constEnd()) {
tile = new VectorTile();
tileMap.insert(fn, tile);

View File

@ -138,7 +138,7 @@ void LBLFile::clear()
}
Label LBLFile::str2label(const QVector<quint8> &str, bool capitalize,
bool convert) const
bool convert)
{
Shield::Type shieldType = Shield::None;
QByteArray label, shieldLabel;
@ -247,7 +247,7 @@ Label LBLFile::label6b(const SubFile *file, Handle &fileHdl, quint32 size,
}
Label LBLFile::label8b(const SubFile *file, Handle &fileHdl, quint32 size,
bool capitalize, bool convert) const
bool capitalize, bool convert)
{
QVector<quint8> str;
quint8 c;
@ -264,7 +264,7 @@ Label LBLFile::label8b(const SubFile *file, Handle &fileHdl, quint32 size,
}
Label LBLFile::labelHuffman(Handle &hdl, const SubFile *file, Handle &fileHdl,
quint32 size, bool capitalize, bool convert) const
quint32 size, bool capitalize, bool convert)
{
QVector<quint8> str;
@ -305,7 +305,7 @@ Label LBLFile::labelHuffman(Handle &hdl, const SubFile *file, Handle &fileHdl,
}
Label LBLFile::label(Handle &hdl, quint32 offset, bool poi, bool capitalize,
bool convert) const
bool convert)
{
quint32 labelOffset;
if (poi) {
@ -328,7 +328,7 @@ Label LBLFile::label(Handle &hdl, quint32 offset, bool poi, bool capitalize,
}
Label LBLFile::label(Handle &hdl, const SubFile *file, Handle &fileHdl,
quint32 size, bool capitalize, bool convert) const
quint32 size, bool capitalize, bool convert)
{
switch (_encoding) {
case 6:

View File

@ -30,9 +30,9 @@ public:
void clear();
Label label(Handle &hdl, quint32 offset, bool poi = false,
bool capitalize = true, bool convert = false) const;
bool capitalize = true, bool convert = false);
Label label(Handle &hdl, const SubFile *file, Handle &fileHdl,
quint32 size, bool capitalize = true, bool convert = false) const;
quint32 size, bool capitalize = true, bool convert = false);
quint8 imageIdSize() const {return _imgIdSize;}
QPixmap image(Handle &hdl, quint32 id) const;
@ -44,13 +44,13 @@ private:
};
Label str2label(const QVector<quint8> &str, bool capitalize,
bool convert) const;
bool convert);
Label label6b(const SubFile *file, Handle &fileHdl, quint32 size,
bool capitalize, bool convert) const;
Label label8b(const SubFile *file, Handle &fileHdl, quint32 size,
bool capitalize, bool convert) const;
bool capitalize, bool convert);
Label labelHuffman(Handle &hdl, const SubFile *file, Handle &fileHdl,
quint32 size, bool capitalize, bool convert) const;
quint32 size, bool capitalize, bool convert);
bool loadRasterTable(Handle &hdl, quint32 offset, quint32 size,
quint32 recordSize);

View File

@ -329,7 +329,7 @@ bool NETFile::readShape(const NODFile *nod, SubFile::Handle &nodHdl,
}
bool NETFile::linkLabel(Handle &hdl, quint32 offset,
const LBLFile *lbl, Handle &lblHdl, Label &label) const
LBLFile *lbl, Handle &lblHdl, Label &label) const
{
if (!seek(hdl, offset))
return false;
@ -392,7 +392,7 @@ NETFile::~NETFile()
}
bool NETFile::link(const SubDiv *subdiv, quint32 shift, Handle &hdl,
const NODFile *nod, Handle &nodHdl2, Handle &nodHdl, const LBLFile *lbl,
const NODFile *nod, Handle &nodHdl2, Handle &nodHdl, LBLFile *lbl,
Handle &lblHdl, const NODFile::BlockInfo &blockInfo, quint8 linkId,
quint8 lineId, QList<MapData::Poly> *lines) const
{

View File

@ -30,13 +30,13 @@ public:
bool lblOffset(Handle &hdl, quint32 netOffset, quint32 &lblOffset) const;
bool link(const SubDiv *subdiv, quint32 shift, Handle &hdl,
const NODFile *nod, Handle &nodHdl2, Handle &nodHdl, const LBLFile *lbl,
const NODFile *nod, Handle &nodHdl2, Handle &nodHdl, LBLFile *lbl,
Handle &lblHdl, const NODFile::BlockInfo &blockInfo, quint8 linkId,
quint8 lineId, QList<MapData::Poly> *lines) const;
bool hasLinks() const {return (_links.size > 0);}
private:
bool linkLabel(Handle &hdl, quint32 offset, const LBLFile *lbl,
bool linkLabel(Handle &hdl, quint32 offset, LBLFile *lbl,
Handle &lblHdl, Label &label) const;
bool readShape(const NODFile *nod, SubFile::Handle &nodHdl,
NODFile::AdjacencyInfo &adj, BitStream4R &bs, const SubDiv *subdiv,

View File

@ -1,7 +1,6 @@
#include <QFont>
#include <QPainter>
#include <QCache>
#include "map/imgmap.h"
#include "map/textpathitem.h"
#include "map/textpointitem.h"
#include "map/bitmapline.h"
@ -28,57 +27,6 @@ static const QColor shieldBgColor1("#dd3e3e");
static const QColor shieldBgColor2("#379947");
static const QColor shieldBgColor3("#4a7fc1");
static QFont pixelSizeFont(int pixelSize)
{
QFont f;
f.setPixelSize(pixelSize);
return f;
}
static QFont *font(Style::FontSize size, Style::FontSize defaultSize
= Style::Normal)
{
/* The fonts must be initialized on first usage (after the QGuiApplication
instance is created) */
static QFont large = pixelSizeFont(16);
static QFont normal = pixelSizeFont(14);
static QFont small = pixelSizeFont(12);
static QFont extraSmall = pixelSizeFont(10);
switch (size) {
case Style::None:
return 0;
case Style::Large:
return &large;
case Style::Normal:
return &normal;
case Style::Small:
return &small;
case Style::ExtraSmall:
return &extraSmall;
default:
return font(defaultSize);
}
}
static QFont *poiFont(Style::FontSize size = Style::Normal, int zoom = -1,
bool extended = false)
{
static QFont poi = pixelSizeFont(10);
if (zoom > 25)
size = Style::Normal;
else if (extended)
size = Style::None;
switch (size) {
case Style::None:
return 0;
default:
return &poi;
}
}
static const QColor *shieldBgColor(Shield::Type type)
{
switch (type) {
@ -152,6 +100,21 @@ static bool rectNearPolygon(const QPolygonF &polygon, const QRectF &rect)
|| polygon.containsPoint(rect.bottomRight(), Qt::OddEvenFill)));
}
const QFont *RasterTile::poiFont(Style::FontSize size, int zoom, bool extended)
{
if (zoom > 25)
size = Style::Normal;
else if (extended)
size = Style::None;
switch (size) {
case Style::None:
return 0;
default:
return _data->style()->font(Style::ExtraSmall);
}
}
void RasterTile::ll2xy(QList<MapData::Poly> &polys)
{
for (int i = 0; i < polys.size(); i++) {
@ -324,7 +287,8 @@ void RasterTile::processStreetNames(const QList<MapData::Poly> &lines,
if (style.img().isNull() && style.foreground() == Qt::NoPen)
continue;
const QFont *fnt = font(style.textFontSize(), Style::Small);
const QFont *fnt = _data->style()->font(style.textFontSize(),
Style::Small);
const QColor *color = style.textColor().isValid()
? &style.textColor() : 0;
const QColor *hColor = Style::isContourLine(poly.type) ? 0 : &haloColor;
@ -435,7 +399,7 @@ void RasterTile::processPoints(QList<MapData::Point> &points,
const QImage *img = style.img().isNull() ? 0 : &style.img();
const QFont *fnt = poi
? poiFont(style.textFontSize(), _zoom, point.classLabel)
: font(style.textFontSize());
: _data->style()->font(style.textFontSize());
const QColor *color = style.textColor().isValid()
? &style.textColor() : &textColor;
const QColor *hcolor = Style::isDepthPoint(point.type)

View File

@ -5,6 +5,7 @@
#include "mapdata.h"
#include "map/projection.h"
#include "map/transform.h"
#include "style.h"
class QPainter;
class IMGMap;
@ -12,8 +13,6 @@ class TextItem;
namespace IMG {
class Style;
class RasterTile
{
public:
@ -53,6 +52,9 @@ private:
void processStreetNames(const QList<MapData::Poly> &lines,
QList<TextItem*> &textItems, const QImage (&arrows)[2]);
const QFont *poiFont(Style::FontSize size = Style::Normal,
int zoom = -1, bool extended = false);
Projection _proj;
Transform _transform;
MapData *_data;

View File

@ -107,7 +107,7 @@ bool RGNFile::readObstructionInfo(Handle &hdl, quint8 flags, quint32 size,
return true;
}
bool RGNFile::readLabel(Handle &hdl, const LBLFile *lbl, Handle &lblHdl,
bool RGNFile::readLabel(Handle &hdl, LBLFile *lbl, Handle &lblHdl,
quint8 flags, quint32 size, MapData::Point *point) const
{
if (!(flags & 1))
@ -122,7 +122,7 @@ bool RGNFile::readLabel(Handle &hdl, const LBLFile *lbl, Handle &lblHdl,
}
bool RGNFile::readClassFields(Handle &hdl, SegmentType segmentType,
void *object, const LBLFile *lbl, Handle &lblHdl) const
void *object, LBLFile *lbl, Handle &lblHdl) const
{
quint8 flags;
quint32 rs = 0;
@ -257,7 +257,7 @@ void RGNFile::clear()
}
bool RGNFile::polyObjects(Handle &hdl, const SubDiv *subdiv,
SegmentType segmentType, const LBLFile *lbl, Handle &lblHdl, NETFile *net,
SegmentType segmentType, LBLFile *lbl, Handle &lblHdl, NETFile *net,
Handle &netHdl, QList<MapData::Poly> *polys) const
{
const SubDiv::Segment &segment = (segmentType == Line)
@ -340,7 +340,7 @@ bool RGNFile::polyObjects(Handle &hdl, const SubDiv *subdiv,
}
bool RGNFile::extPolyObjects(Handle &hdl, const SubDiv *subdiv, quint32 shift,
SegmentType segmentType, const LBLFile *lbl, Handle &lblHdl,
SegmentType segmentType, LBLFile *lbl, Handle &lblHdl,
QList<MapData::Poly> *polys) const
{
quint32 labelPtr, len;
@ -457,7 +457,7 @@ bool RGNFile::extPolyObjects(Handle &hdl, const SubDiv *subdiv, quint32 shift,
}
bool RGNFile::pointObjects(Handle &hdl, const SubDiv *subdiv,
SegmentType segmentType, const LBLFile *lbl, Handle &lblHdl,
SegmentType segmentType, LBLFile *lbl, Handle &lblHdl,
QList<MapData::Point> *points) const
{
const SubDiv::Segment &segment = (segmentType == IndexedPoint)
@ -502,7 +502,7 @@ bool RGNFile::pointObjects(Handle &hdl, const SubDiv *subdiv,
}
bool RGNFile::extPointObjects(Handle &hdl, const SubDiv *subdiv,
const LBLFile *lbl, Handle &lblHdl, QList<MapData::Point> *points) const
LBLFile *lbl, Handle &lblHdl, QList<MapData::Point> *points) const
{
const SubDiv::Segment &segment = subdiv->extPoints();
@ -554,7 +554,7 @@ bool RGNFile::extPointObjects(Handle &hdl, const SubDiv *subdiv,
bool RGNFile::links(Handle &hdl, const SubDiv *subdiv, quint32 shift,
const NETFile *net, Handle &netHdl, const NODFile *nod, Handle &nodHdl,
Handle &nodHdl2, const LBLFile *lbl, Handle &lblHdl,
Handle &nodHdl2, LBLFile *lbl, Handle &lblHdl,
QList<MapData::Poly> *lines) const
{
quint32 size, blockIndexId;

View File

@ -33,18 +33,18 @@ public:
bool load(Handle &hdl);
bool polyObjects(Handle &hdl, const SubDiv *subdiv, SegmentType segmentType,
const LBLFile *lbl, Handle &lblHdl, NETFile *net, Handle &netHdl,
LBLFile *lbl, Handle &lblHdl, NETFile *net, Handle &netHdl,
QList<MapData::Poly> *polys) const;
bool pointObjects(Handle &hdl, const SubDiv *subdiv, SegmentType segmentType,
const LBLFile *lbl, Handle &lblHdl, QList<MapData::Point> *points) const;
LBLFile *lbl, Handle &lblHdl, QList<MapData::Point> *points) const;
bool extPolyObjects(Handle &hdl, const SubDiv *subdiv, quint32 shift,
SegmentType segmentType, const LBLFile *lbl, Handle &lblHdl,
SegmentType segmentType, LBLFile *lbl, Handle &lblHdl,
QList<MapData::Poly> *polys) const;
bool extPointObjects(Handle &hdl, const SubDiv *subdiv, const LBLFile *lbl,
bool extPointObjects(Handle &hdl, const SubDiv *subdiv, LBLFile *lbl,
Handle &lblHdl, QList<MapData::Point> *points) const;
bool links(Handle &hdl, const SubDiv *subdiv, quint32 shift,
const NETFile *net, Handle &netHdl, const NODFile *nod, Handle &nodHdl,
Handle &nodHdl2, const LBLFile *lbl, Handle &lblHdl,
Handle &nodHdl2, LBLFile *lbl, Handle &lblHdl,
QList<MapData::Poly> *lines) const;
bool subdivInit(Handle &hdl, SubDiv *subdiv) const;
@ -55,7 +55,7 @@ public:
private:
bool segments(Handle &hdl, SubDiv *subdiv, SubDiv::Segment seg[5]) const;
bool readClassFields(Handle &hdl, SegmentType segmentType, void *object,
const LBLFile *lbl, Handle &lblHdl) const;
LBLFile *lbl, Handle &lblHdl) const;
bool skipLclFields(Handle &hdl, const quint32 flags[3]) const;
bool skipGblFields(Handle &hdl, quint32 flags) const;
bool readRasterInfo(Handle &hdl, const LBLFile *lbl, quint32 size,
@ -64,7 +64,7 @@ private:
MapData::Point *point) const;
bool readObstructionInfo(Handle &hdl, quint8 flags, quint32 size,
MapData::Point *point) const;
bool readLabel(Handle &hdl, const LBLFile *lbl, Handle &lblHdl,
bool readLabel(Handle &hdl, LBLFile *lbl, Handle &lblHdl,
quint8 flags, quint32 size, MapData::Point *point) const;
HuffmanTable *_huffmanTable;

View File

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

View File

@ -4,6 +4,13 @@
using namespace IMG;
static QFont pixelSizeFont(int pixelSize)
{
QFont f;
f.setPixelSize(pixelSize);
return f;
}
static bool readColor(SubFile *file, SubFile::Handle &hdl, QColor &color)
{
quint8 b, g, r;
@ -1226,6 +1233,11 @@ bool Style::parseTYPFile(SubFile *file)
Style::Style(SubFile *typ)
{
_large = pixelSizeFont(16);
_normal = pixelSizeFont(14);
_small = pixelSizeFont(12);
_extraSmall = pixelSizeFont(10);
defaultLineStyle();
defaultPolygonStyle();
defaultPointStyle();
@ -1238,7 +1250,7 @@ const Style::Line &Style::line(quint32 type) const
{
static Line null;
QMap<quint32, Line>::const_iterator it = _lines.find(type);
QMap<quint32, Line>::const_iterator it(_lines.find(type));
return (it == _lines.constEnd()) ? null : *it;
}
@ -1246,7 +1258,7 @@ const Style::Polygon &Style::polygon(quint32 type) const
{
static Polygon null;
QMap<quint32, Polygon>::const_iterator it = _polygons.find(type);
QMap<quint32, Polygon>::const_iterator it(_polygons.find(type));
return (it == _polygons.constEnd()) ? null : *it;
}
@ -1254,10 +1266,30 @@ const Style::Point &Style::point(quint32 type) const
{
static Point null;
QMap<quint32, Point>::const_iterator it = _points.find(type);
QMap<quint32, Point>::const_iterator it(_points.find(type));
return (it == _points.constEnd()) ? null : *it;
}
const QFont *Style::font(Style::FontSize size, Style::FontSize defaultSize) const
{
Q_ASSERT(defaultSize != Style::NotSet);
switch (size) {
case Style::None:
return 0;
case Style::Large:
return &_large;
case Style::Normal:
return &_normal;
case Style::Small:
return &_small;
case Style::ExtraSmall:
return &_extraSmall;
default:
return font(defaultSize);
}
}
#ifndef QT_NO_DEBUG
static QString penColor(const QPen &pen)
{

View File

@ -3,6 +3,7 @@
#include <QPen>
#include <QBrush>
#include <QFont>
#include <QDebug>
#include "subfile.h"
@ -94,6 +95,8 @@ public:
const Polygon &polygon(quint32 type) const;
const Point &point(quint32 type) const;
const QList<quint32> &drawOrder() const {return _drawOrder;}
const QFont *font(Style::FontSize size, Style::FontSize defaultSize
= Style::Normal) const;
static bool isPOI(quint32 type)
{return !((type >= TYPE(0x01) && type <= TYPE(0x1f))
@ -172,6 +175,9 @@ private:
QMap<quint32, Polygon> _polygons;
QMap<quint32, Point> _points;
QList<quint32> _drawOrder;
/* Fonts and images must be initialized after QGuiApplication! */
QFont _large, _normal, _small, _extraSmall;
};
}

View File

@ -4,7 +4,6 @@
#include <QImageReader>
#include <QBuffer>
#include <QtConcurrent>
#include "common/hash.h"
#include "osm.h"
#include "tile.h"
#include "aqmmap.h"
@ -295,7 +294,7 @@ int AQMMap::zoomFit(const QSize &size, const RectC &rect)
qreal AQMMap::resolution(const QRectF &rect)
{
const Zoom &z = _zooms.at(_zoom);
return OSM::resolution(rect.center(), z.zoom, z.tileSize);
return OSM::resolution(rect.center(), z.zoom, tileSize());
}
int AQMMap::zoomIn()

View File

@ -27,19 +27,25 @@ static bool yCmp(OziMap *m1, OziMap *m2)
return TL(m1).y() > TL(m2).y();
}
static QString calibrationFile(const QString &path)
static QString calibrationFile(const QString &path, OziMap::CalibrationType &type)
{
QDir dir(path);
QFileInfoList files = dir.entryInfoList(QDir::Files);
QFileInfoList files(dir.entryInfoList(QDir::Files));
for (int i = 0; i < files.size(); i++) {
const QFileInfo &fi = files.at(i);
QString suffix(fi.suffix().toLower());
if (suffix == "map" || suffix == "gmi")
if (suffix == "map") {
type = OziMap::MAP;
return fi.absoluteFilePath();
} else if (suffix == "gmi") {
type = OziMap::GMI;
return fi.absoluteFilePath();
}
}
type = OziMap::Unknown;
return QString();
}
@ -141,16 +147,19 @@ Atlas::Atlas(const QString &fileName, bool TAR, const Projection &proj,
QFileInfoList maps = zdir.entryInfoList(QDir::Dirs
| QDir::NoDotAndDotDot);
for (int i = 0; i < maps.count(); i++) {
QString path(maps.at(i).absoluteFilePath());
OziMap *map;
if (TAR)
map = new OziMap(maps.at(i).absoluteFilePath(), tar, proj, this);
map = new OziMap(path, tar, proj, this);
else {
QString cf(calibrationFile(maps.at(i).absoluteFilePath()));
OziMap::CalibrationType type;
QString cf(calibrationFile(path, type));
if (cf.isNull()) {
_errorString = "No calibration file found";
return;
qWarning("%s: no calibration file found", qPrintable(path));
continue;
}
map = new OziMap(cf, proj, this);
map = new OziMap(cf, type, proj, this);
}
if (map->isValid())

View File

@ -395,7 +395,7 @@ BSBMap::BSBMap(const QString &fileName, QObject *parent)
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
_errorString = fileName + ": " + file.errorString();
_errorString = file.errorString();
return;
}

View File

@ -99,7 +99,7 @@ QMap<int, Conversion::Entry> Conversion::defaults()
Conversion Conversion::conversion(int id)
{
QMap<int, Entry>::const_iterator it = _conversions.find(id);
QMap<int, Entry>::const_iterator it(_conversions.find(id));
if (it == _conversions.constEnd())
return Conversion();
@ -189,7 +189,7 @@ QList<KV<int, QString> > Conversion::list()
QList<KV<int, QString> > list;
for (QMap<int, Entry>::const_iterator it = _conversions.constBegin();
it != _conversions.constEnd(); ++it)
it != _conversions.constEnd(); ++it)
list.append(KV<int, QString>(it.key(), it.value().name()));
return list;

View File

@ -9,7 +9,8 @@
class Ellipsoid
{
public:
Ellipsoid() : _radius(NAN), _flattening(NAN), _es(NAN), _b(NAN) {}
Ellipsoid()
: _radius(NAN), _flattening(NAN), _es(NAN), _e2s(NAN), _b(NAN) {}
Ellipsoid(double radius, double flattening);
double radius() const {return _radius;}

View File

@ -323,9 +323,8 @@ void ENCMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
if (QPixmapCache::find(key(_zoom, ttl), &pm))
painter->drawPixmap(ttl, pm);
else
tiles.append(RasterTile(_projection, _transform, _data,
_zoom, _zooms, QRect(ttl, QSize(TILE_SIZE, TILE_SIZE)),
_tileRatio));
tiles.append(RasterTile(_projection, _transform, _data, _zoom,
_zooms, QRect(ttl, QSize(TILE_SIZE, TILE_SIZE)), _tileRatio));
}
}

View File

@ -1,5 +1,4 @@
#include <QFile>
#include "common/wgs84.h"
#include "common/csv.h"
#include "gcs.h"

View File

@ -128,7 +128,7 @@ GEMFMap::GEMFMap(const QString &fileName, QObject *parent)
qreal GEMFMap::resolution(const QRectF &rect)
{
return OSM::resolution(rect.center(), _zooms.at(_zi).level, _tileSize);
return OSM::resolution(rect.center(), _zooms.at(_zi).level, tileSize());
}
int GEMFMap::zoomFit(const QSize &size, const RectC &rect)

View File

@ -1,6 +1,5 @@
#include <QPainter>
#include <QImageReader>
#include "common/util.h"
#include "geotiff.h"
#include "image.h"
#include "geotiffmap.h"

View File

@ -24,11 +24,6 @@ bool GmiFile::parse(QIODevice &device)
int width, height;
bool ok;
if (!device.open(QIODevice::ReadOnly)) {
_errorString = device.errorString();
return false;
}
while (!device.atEnd()) {
QByteArray line = device.readLine(4096);
@ -41,14 +36,14 @@ bool GmiFile::parse(QIODevice &device)
_image = line.trimmed();
else if (ln == 3) {
width = line.toInt(&ok);
if (!ok || ok <= 0) {
_errorString = "Invalid image width";
if (!ok || width <= 0) {
_errorString = line + ": invalid image width";
return false;
}
} else if (ln == 4) {
height = line.toInt(&ok);
if (!ok || ok <= 0) {
_errorString = "Invalid image height";
if (!ok || height <= 0) {
_errorString = line + ": invalid image height";
return false;
}
_size = QSize(width, height);
@ -56,19 +51,34 @@ bool GmiFile::parse(QIODevice &device)
CalibrationPoint cp(calibrationPoint(line));
if (cp.isValid())
_points.append(cp);
else
break;
else {
if (_points.size() < 2) {
_errorString = line + ": invalid calibration point";
return false;
} else
break;
}
}
ln++;
}
device.close();
if (ln < 6) {
_errorString = "Unexpected EOF";
return false;
}
return (_points.size() >= 2);
return true;
}
GmiFile::GmiFile(QIODevice &file)
GmiFile::GmiFile(QIODevice &file) : _valid(false)
{
if (!file.open(QIODevice::ReadOnly)) {
_errorString = file.errorString();
return;
}
_valid = parse(file);
file.close();
}

View File

@ -2,10 +2,7 @@
#include <QPainter>
#include <QFileInfo>
#include <QPixmapCache>
#include "common/util.h"
#include "rectd.h"
#include "gcs.h"
#include "pcs.h"
#include "jnxmap.h"

View File

@ -18,7 +18,6 @@
#include <QPainter>
#include <QPixmapCache>
#include <private/qzipreader_p.h>
#include "common/util.h"
#include "kmzmap.h"

View File

@ -4,7 +4,6 @@
#include <QImage>
#include "projection.h"
#include "transform.h"
#include "rectd.h"
#include "map.h"
class QXmlStreamReader;

View File

@ -43,7 +43,7 @@ MapList::ParserMap MapList::parsers()
map.insert("rtmap", &RMap::create);
map.insert("map", &MapsforgeMap::create);
map.insert("map", &OziMap::createMAP);
map.insert("gmi", &OziMap::createMAP);
map.insert("gmi", &OziMap::createGMI);
map.insert("kap", &BSBMap::create);
map.insert("kmz", &KMZMap::create);
map.insert("aqm", &AQMMap::create);

View File

@ -3,7 +3,6 @@
#include <QFile>
#include <QDataStream>
#include <QColor>
#include "common/hash.h"
#include "map/osm.h"
#include "subfile.h"
#include "mapdata.h"

View File

@ -9,7 +9,7 @@
#include "osm.h"
#include "mbtilesmap.h"
#define MAX_OVERZOOM 3
#define MAX_TILE_SIZE 4096
#define META_TYPE(type) static_cast<QMetaType::Type>(type)
static RectC str2bounds(const QString &str)
@ -79,24 +79,15 @@ bool MBTilesMap::getZooms()
" WHERE zoom_level = %1 LIMIT 1").arg(i);
QSqlQuery query(sql, _db);
if (query.first())
_zooms.append(Zoom(i, i));
_zoomsBase.append(Zoom(i, i));
}
if (!_zooms.size()) {
if (!_zoomsBase.size()) {
_errorString = "Empty tile set";
return false;
}
if (_scalable) {
for (int i = _zooms.last().base + 1; i <= OSM::ZOOMS.max(); i++) {
Zoom z(i, _zooms.last().base);
if (z.z - z.base > MAX_OVERZOOM)
break;
_zooms.append(Zoom(i, _zooms.last().base));
}
}
_zi = _zooms.size() - 1;
_zi = _zoomsBase.size() - 1;
return true;
}
@ -114,7 +105,7 @@ bool MBTilesMap::getBounds()
} else {
qWarning("%s: missing bounds metadata", qPrintable(path()));
int z = _zooms.first().z;
int z = _zoomsBase.first().z;
QString sql = QString("SELECT min(tile_column), min(tile_row), "
"max(tile_column), max(tile_row) FROM tiles WHERE zoom_level = %1")
.arg(z);
@ -222,12 +213,12 @@ MBTilesMap::MBTilesMap(const QString &fileName, QObject *parent)
}
getTileFormat();
if (!getTileSize())
return;
if (!getZooms())
return;
if (!getBounds())
return;
if (!getTileSize())
return;
getTilePixelRatio();
getName();
@ -243,10 +234,18 @@ void MBTilesMap::load(const Projection &in, const Projection &out,
Q_UNUSED(out);
_mapRatio = hidpi ? deviceRatio : 1.0;
_zooms = _zoomsBase;
if (_scalable) {
_scaledSize = _tileSize * deviceRatio;
_tileRatio = deviceRatio;
for (int i = _zooms.last().base + 1; i <= OSM::ZOOMS.max(); i++) {
Zoom z(i, _zooms.last().base);
if (_tileSize * _tileRatio * (1U<<(z.z - z.base)) > MAX_TILE_SIZE)
break;
_zooms.append(Zoom(i, _zooms.last().base));
}
}
_db.open();
@ -286,7 +285,7 @@ int MBTilesMap::zoomFit(const QSize &size, const RectC &rect)
qreal MBTilesMap::resolution(const QRectF &rect)
{
return OSM::resolution(rect.center(), _zooms.at(_zi).z, _tileSize);
return OSM::resolution(rect.center(), _zooms.at(_zi).z, tileSize());
}
int MBTilesMap::zoomIn()
@ -383,12 +382,19 @@ void MBTilesMap::cancelJobs(bool wait)
_jobs.at(i)->cancel(wait);
}
QPointF MBTilesMap::tilePos(const QPointF &tl, const QPoint &tc,
const QPoint &tile, unsigned overzoom) const
{
return QPointF(tl.x() + ((tc.x() - tile.x()) << overzoom) * tileSize(),
tl.y() + ((tc.y() - tile.y()) << overzoom) * tileSize());
}
void MBTilesMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
{
const Zoom &zoom = _zooms.at(_zi);
unsigned overzoom = zoom.z - zoom.base;
unsigned f = 1U<<overzoom;
qreal scale = OSM::zoom2scale(zoom.base, _tileSize * f);
qreal scale = OSM::zoom2scale(zoom.base, _tileSize << overzoom);
QPoint tile = OSM::mercator2tile(QPointF(rect.topLeft().x() * scale,
-rect.topLeft().y() * scale) * coordinatesRatio(), zoom.base);
Coordinates ctl(OSM::tile2ll(tile, zoom.base));
@ -410,8 +416,7 @@ void MBTilesMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
continue;
if (QPixmapCache::find(key, &pm)) {
QPointF tp(tl.x() + (t.x() - tile.x()) * tileSize() * f,
tl.y() + (t.y() - tile.y()) * tileSize() * f);
QPointF tp(tilePos(tl, t, tile, overzoom));
drawTile(painter, pm, tp);
} else
tiles.append(MBTile(zoom.z, overzoom, _scaledSize, t,
@ -432,8 +437,7 @@ void MBTilesMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
QPixmapCache::insert(mt.key(), pm);
QPointF tp(tl.x() + (mt.xy().x() - tile.x()) * tileSize() * f,
tl.y() + (mt.xy().y() - tile.y()) * tileSize() * f);
QPointF tp(tilePos(tl, mt.xy(), tile, overzoom));
drawTile(painter, pm, tp);
}
} else

View File

@ -139,6 +139,8 @@ private:
void runJob(MBTilesMapJob *job);
void removeJob(MBTilesMapJob *job);
void cancelJobs(bool wait);
QPointF tilePos(const QPointF &tl, const QPoint &tc, const QPoint &tile,
unsigned overzoom) const;
friend QDebug operator<<(QDebug dbg, const Zoom &zoom);
@ -146,7 +148,7 @@ private:
QString _name;
RectC _bounds;
QVector<Zoom> _zooms;
QVector<Zoom> _zooms, _zoomsBase;
int _zi;
int _tileSize;
qreal _mapRatio, _tileRatio;

View File

@ -8,7 +8,7 @@
#include "onlinemap.h"
#define MAX_OVERZOOM 3
#define MAX_TILE_SIZE 4096
OnlineMap::OnlineMap(const QString &fileName, const QString &name,
const QString &url, const Range &zooms, const RectC &bounds, qreal tileRatio,
@ -24,10 +24,7 @@ OnlineMap::OnlineMap(const QString &fileName, const QString &name,
_tileLoader->setHeaders(headers);
connect(_tileLoader, &TileLoader::finished, this, &OnlineMap::tilesLoaded);
if (_scalable) {
_baseZoom = _zooms.max();
_zooms.setMax(qMin(_zooms.max() + MAX_OVERZOOM, OSM::ZOOMS.max()));
}
_baseZoom = _zooms.max();
}
QRectF OnlineMap::bounds()
@ -61,7 +58,7 @@ int OnlineMap::zoomFit(const QSize &size, const RectC &rect)
qreal OnlineMap::resolution(const QRectF &rect)
{
return OSM::resolution(rect.center(), _zoom, _tileSize);
return OSM::resolution(rect.center(), _zoom, tileSize());
}
int OnlineMap::zoomIn()
@ -87,10 +84,17 @@ void OnlineMap::load(const Projection &in, const Projection &out,
Q_UNUSED(out);
_mapRatio = hidpi ? deviceRatio : 1.0;
_zooms.setMax(_baseZoom);
if (_scalable) {
_scaledSize = _tileSize * deviceRatio;
_tileRatio = deviceRatio;
for (int i = _baseZoom + 1; i <= OSM::ZOOMS.max(); i++) {
if (_tileSize * _tileRatio * (1U<<(i - _baseZoom)) > MAX_TILE_SIZE)
break;
_zooms.setMax(i);
}
}
}
@ -114,11 +118,18 @@ qreal OnlineMap::tileSize() const
return (_tileSize / coordinatesRatio());
}
QPoint OnlineMap::tileCoordinates(int x, int y, int zoom)
QPoint OnlineMap::tileCoordinates(int x, int y, int zoom) const
{
return QPoint(x, _invertY ? (1<<zoom) - y - 1 : y);
}
QPointF OnlineMap::tilePos(const QPointF &tl, const QPoint &tc,
const QPoint &tile, unsigned overzoom) const
{
return QPointF(tl.x() + ((tc.x() - tile.x()) << overzoom) * tileSize(),
tl.y() + ((tc.y() - tile.y()) << overzoom) * tileSize());
}
bool OnlineMap::isRunning(const QString &key) const
{
for (int i = 0; i < _jobs.size(); i++) {
@ -168,16 +179,16 @@ void OnlineMap::cancelJobs(bool wait)
void OnlineMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
{
int baseZoom = _scalable ? qMin(_baseZoom, _zoom) : _zoom;
int baseZoom = qMin(_baseZoom, _zoom);
unsigned overzoom = _zoom - baseZoom;
unsigned f = 1U<<overzoom;
qreal scale = OSM::zoom2scale(baseZoom, _tileSize * f);
qreal scale = OSM::zoom2scale(baseZoom, _tileSize << overzoom);
QPoint tile = OSM::mercator2tile(QPointF(rect.topLeft().x() * scale,
-rect.topLeft().y() * scale) * coordinatesRatio(), baseZoom);
Coordinates ctl(OSM::tile2ll(tile, baseZoom));
QPointF tl(ll2xy(Coordinates(ctl.lon(), -ctl.lat())));
QSizeF s(rect.right() - tl.x(), rect.bottom() - tl.y());
unsigned f = 1U<<overzoom;
int width = ceil(s.width() / (tileSize() * f));
int height = ceil(s.height() / (tileSize() * f));
@ -209,8 +220,7 @@ void OnlineMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
QPixmap pm;
if (QPixmapCache::find(key, &pm)) {
QPoint tc(tileCoordinates(t.xy().x(), t.xy().y(), baseZoom));
QPointF tp(tl.x() + (tc.x() - tile.x()) * tileSize() * f,
tl.y() + (tc.y() - tile.y()) * tileSize() * f);
QPointF tp(tilePos(tl, tc, tile, overzoom));
drawTile(painter, pm, tp);
} else
renderTiles.append(OnlineMapTile(t.xy(), t.file(), _zoom, overzoom,
@ -232,8 +242,7 @@ void OnlineMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
QPixmapCache::insert(mt.key(), pm);
QPoint tc(tileCoordinates(mt.xy().x(), mt.xy().y(), baseZoom));
QPointF tp(tl.x() + (tc.x() - tile.x()) * tileSize() * f,
tl.y() + (tc.y() - tile.y()) * tileSize() * f);
QPointF tp(tilePos(tl, tc, tile, overzoom));
drawTile(painter, pm, tp);
}
} else

View File

@ -115,7 +115,9 @@ private:
qreal tileSize() const;
qreal coordinatesRatio() const;
qreal imageRatio() const;
QPoint tileCoordinates(int x, int y, int zoom);
QPoint tileCoordinates(int x, int y, int zoom) const;
QPointF tilePos(const QPointF &tl, const QPoint &tc, const QPoint &tile,
unsigned overzoom) const;
void drawTile(QPainter *painter, QPixmap &pixmap, QPointF &tp);
bool isRunning(const QString &key) const;
void runJob(OnlineMapJob *job);

View File

@ -366,8 +366,10 @@ bool OruxMap::readXML(const QString &path, const QString &dir)
{
QFile file(path);
if (!file.open(QFile::ReadOnly | QFile::Text))
if (!file.open(QFile::ReadOnly | QFile::Text)) {
_errorString = file.errorString();
return false;
}
QXmlStreamReader reader(&file);
if (reader.readNextStartElement()) {

View File

@ -198,7 +198,7 @@ int OsmdroidMap::zoomFit(const QSize &size, const RectC &rect)
qreal OsmdroidMap::resolution(const QRectF &rect)
{
return OSM::resolution(rect.center(), _zoom, _tileSize);
return OSM::resolution(rect.center(), _zoom, tileSize());
}
int OsmdroidMap::zoomIn()

View File

@ -54,19 +54,15 @@ QString OziMap::calibrationFile(const QStringList &files, const QString path,
return QString();
}
OziMap::OziMap(const QString &fileName, const Projection &proj, QObject *parent)
: Map(fileName, parent), _img(0), _tar(0), _ozf(0), _zoom(0), _mapRatio(1.0),
_valid(false)
OziMap::OziMap(const QString &fileName, CalibrationType type,
const Projection &proj, QObject *parent) : Map(fileName, parent), _img(0),
_tar(0), _ozf(0), _zoom(0), _mapRatio(1.0), _valid(false)
{
QFileInfo fi(fileName);
QString suffix(fi.suffix().toLower());
if (suffix == "tar") {
CalibrationType type;
// TAR maps
if (type == Unknown) {
_tar = new Tar(fileName);
if (!_tar->open()) {
_errorString = "Error reading tar file: " + _tar->errorString();
_errorString = _tar->errorString();
return;
}
QStringList files(_tar->files());
@ -110,10 +106,12 @@ OziMap::OziMap(const QString &fileName, const Projection &proj, QObject *parent)
return;
_tar->close();
// regular MAP or GMI maps
} else {
QFile file(fileName);
if (suffix == "map") {
if (type == MAP) {
MapFile mf(file);
if (!mf.isValid()) {
_errorString = mf.errorString();
@ -125,7 +123,7 @@ OziMap::OziMap(const QString &fileName, const Projection &proj, QObject *parent)
_projection = mf.projection();
_transform = mf.transform();
}
} else if (suffix == "gmi") {
} else if (type == GMI) {
GmiFile gmi(file);
if (!gmi.isValid()) {
_errorString = gmi.errorString();
@ -138,11 +136,9 @@ OziMap::OziMap(const QString &fileName, const Projection &proj, QObject *parent)
_projection = proj;
computeTransform();
}
} else {
_errorString = "Unknown file type";
return;
}
QFileInfo fi(fileName);
QDir set(fi.absolutePath() + "/" + "set");
if (set.exists()) {
if (!setTileInfo(set.entryList(), set.absolutePath()))
@ -266,32 +262,33 @@ bool OziMap::setImageInfo(const QString &path)
bool OziMap::setTileInfo(const QStringList &tiles, const QString &path)
{
static const QRegularExpression rx("_[0-9]+_[0-9]+\\.");
if (!_map.size.isValid()) {
_errorString = "Missing total image size (IWH)";
return false;
}
QRegularExpression rx("_[0-9]+_[0-9]+\\.");
for (int i = 0; i < tiles.size(); i++) {
if (tiles.at(i).contains(rx)) {
_tile.path = QString(tiles.at(i)).replace(rx, "_%1_%2.");
const QString &tile = tiles.at(i);
if (tile.contains(rx)) {
QString pattern(QString(tile).replace(rx, "_%1_%2."));
if (_tar) {
QByteArray ba = _tar->file(tiles.at(i));
QByteArray ba(_tar->file(tile));
QBuffer buffer(&ba);
_tile.path = pattern;
_tile.size = QImageReader(&buffer).size();
} else {
_tile.path = path + "/" + _tile.path;
_tile.size = QImageReader(path + "/" + tiles.at(i)).size();
}
if (!_tile.size.isValid()) {
_errorString = QString("Error retrieving tile size: "
"%1: Invalid image").arg(QFileInfo(tiles.at(i)).fileName());
return false;
_tile.path = path + "/" + pattern;
_tile.size = QImageReader(path + "/" + tile).size();
}
_map.path = QString();
return true;
if (_tile.size.isValid())
return true;
else
qWarning("%s: error reading tile image", qPrintable(tile));
}
}
@ -373,8 +370,7 @@ void OziMap::drawTiled(QPainter *painter, const QRectF &rect) const
pixmap = QPixmap(tileName);
if (pixmap.isNull())
qWarning("%s: error loading tile image", qPrintable(
_tile.path.arg(QString::number(x), QString::number(y))));
qWarning("%s: error loading tile image", qPrintable(tileName));
else {
pixmap.setDevicePixelRatio(_mapRatio);
QPointF tp(tl.x() + i * ts.width(), tl.y() + j * ts.height());
@ -398,8 +394,9 @@ void OziMap::drawOZF(QPainter *painter, const QRectF &rect) const
int y = round(tl.y() * _mapRatio + j * _ozf->tileSize().height());
QPixmap pixmap;
QString key = _ozf->fileName() + "/" + QString::number(_zoom) + "_"
+ QString::number(x) + "_" + QString::number(y);
QString key(_ozf->fileName() + "/" + QString::number(_zoom) + "_"
+ QString::number(x) + "_" + QString::number(y));
if (!QPixmapCache::find(key, &pixmap)) {
pixmap = _ozf->tile(_zoom, x, y);
if (!pixmap.isNull())
@ -512,7 +509,7 @@ Map *OziMap::createTAR(const QString &path, const Projection &proj, bool *isDir)
if (isDir)
*isDir = false;
return new OziMap(path, proj);
return new OziMap(path, Unknown, proj);
}
Map *OziMap::createMAP(const QString &path, const Projection &proj, bool *isDir)
@ -520,5 +517,13 @@ Map *OziMap::createMAP(const QString &path, const Projection &proj, bool *isDir)
if (isDir)
*isDir = false;
return new OziMap(path, proj);
return new OziMap(path, MAP, proj);
}
Map *OziMap::createGMI(const QString &path, const Projection &proj, bool *isDir)
{
if (isDir)
*isDir = false;
return new OziMap(path, GMI, proj);
}

View File

@ -15,7 +15,11 @@ class OziMap : public Map
Q_OBJECT
public:
OziMap(const QString &fileName, const Projection &proj,
enum CalibrationType {
Unknown, MAP, GMI
};
OziMap(const QString &fileName, CalibrationType type, const Projection &proj,
QObject *parent = 0);
OziMap(const QString &dirName, Tar &tar, const Projection &proj,
QObject *parent = 0);
@ -54,12 +58,10 @@ public:
bool *isDir);
static Map *createMAP(const QString &path, const Projection &proj,
bool *isDir);
static Map *createGMI(const QString &path, const Projection &proj,
bool *isDir);
private:
enum CalibrationType {
Unknown, MAP, GMI
};
struct ImageInfo {
QSize size;
QString path;

View File

@ -1,6 +1,5 @@
#include <QFile>
#include "common/csv.h"
#include "angularunits.h"
#include "pcs.h"
QMap<int, PCS::Entry> PCS::_pcss = defaults();
@ -14,7 +13,7 @@ QMap<int, PCS::Entry> PCS::defaults()
PCS PCS::pcs(int id)
{
QMap<int, Entry>::const_iterator it = _pcss.find(id);
QMap<int, Entry>::const_iterator it(_pcss.find(id));
if (it == _pcss.constEnd())
return PCS();

View File

@ -5,8 +5,6 @@
#include <QMap>
#include "common/kv.h"
#include "gcs.h"
#include "linearunits.h"
#include "coordinatesystem.h"
#include "conversion.h"
class PCS

View File

@ -327,7 +327,7 @@ QCTMap::QCTMap(const QString &fileName, QObject *parent)
_mapRatio(1.0), _valid(false)
{
if (!_file.open(QIODevice::ReadOnly)) {
_errorString = fileName + ": " + _file.errorString();
_errorString = _file.errorString();
return;
}

View File

@ -5,7 +5,6 @@
#include <QRegularExpression>
#include <QtEndian>
#include "common/rectc.h"
#include "common/wgs84.h"
#include "common/color.h"
#include "calibrationpoint.h"
#include "utm.h"
@ -98,10 +97,10 @@ static Projection parseProjection(const QString &str, const GCS &gcs)
bool RMap::parseIMP(const QByteArray &data)
{
QStringList lines = QString(data).split("\r\n");
static const QRegularExpression re("^P[0-9]+=");
QStringList lines(QString(data).split("\r\n"));
QVector<CalibrationPoint> calibrationPoints;
QString projection, datum;
QRegularExpression re("^P[0-9]+=");
for (int i = 0; i < lines.count(); i++) {
const QString &line = lines.at(i);

View File

@ -146,7 +146,7 @@ int SqliteMap::zoomFit(const QSize &size, const RectC &rect)
qreal SqliteMap::resolution(const QRectF &rect)
{
return OSM::resolution(rect.center(), _zoom, _tileSize);
return OSM::resolution(rect.center(), _zoom, tileSize());
}
int SqliteMap::zoomIn()

View File

@ -70,11 +70,11 @@ bool Tar::loadTar()
quint64 size;
qint64 ret;
while ((ret = _file.read(buffer, BLOCKSIZE)) > 0) {
while ((ret = _file.read(buffer, BLOCKSIZE))) {
if (ret < BLOCKSIZE) {
_file.close();
_index.clear();
_errorString = "Error reading header block";
_errorString = "Error reading TAR header block";
return false;
}
size = number(hdr->size, sizeof(hdr->size));
@ -100,7 +100,7 @@ bool Tar::loadTmi(const QString &path)
return false;
while (!file.atEnd()) {
QByteArray line = file.readLine(4096);
QByteArray line(file.readLine(4096));
int pos = line.indexOf(':');
if (line.size() < 10 || pos < 7 || !line.startsWith("block")) {
qWarning("%s:%d: syntax error", qPrintable(path), ln);

View File

@ -1,6 +1,7 @@
#ifndef TEXTPOINTITEM_H
#define TEXTPOINTITEM_H
#include <cmath>
#include "textitem.h"
class QFont;

View File

@ -110,8 +110,8 @@ void TileLoader::loadTilesSync(QVector<Tile> &list)
for (int i = 0; i < tl.size(); i++) {
Tile *t = tl[i];
QString file = tileFile(*t);
if (QFileInfo(file).exists())
QString file(tileFile(*t));
if (QFileInfo::exists(file))
t->setFile(file);
}
}

View File

@ -1,4 +1,3 @@
#include "projection.h"
#include "matrix.h"
#include "transform.h"

View File

@ -321,7 +321,7 @@ bool WMS::parseCapabilities()
void WMS::capabilitiesReady()
{
if (!QFileInfo(_path).exists()) {
if (!QFileInfo::exists(_path)) {
_errorString = "Error downloading capabilities XML file";
_valid = false;
} else {
@ -338,7 +338,7 @@ WMS::WMS(const QString &file, const WMS::Setup &setup, QObject *parent)
QString url = QString("%1%2service=WMS&request=GetCapabilities")
.arg(setup.url(), setup.url().contains('?') ? "&" : "?");
if (!QFileInfo(file).exists()) {
if (!QFileInfo::exists(file)) {
Downloader *downloader = new Downloader(this);
connect(downloader, &Downloader::finished, this,
&WMS::capabilitiesReady);

View File

@ -6,7 +6,6 @@
#include <QStringList>
#include <QtAlgorithms>
#include <QXmlStreamReader>
#include "pcs.h"
#include "crs.h"
#include "wmts.h"
@ -301,7 +300,7 @@ bool WMTS::parseCapabilities(CTX &ctx)
void WMTS::capabilitiesReady()
{
if (!QFileInfo(_path).exists()) {
if (!QFileInfo::exists(_path)) {
_errorString = "Error downloading capabilities XML file";
_valid = false;
} else {
@ -354,7 +353,7 @@ WMTS::WMTS(const QString &file, const WMTS::Setup &setup, QObject *parent)
_path = url.isLocalFile() ? url.toLocalFile() : file;
if (!url.isLocalFile() && !QFileInfo(file).exists()) {
if (!url.isLocalFile() && !QFileInfo::exists(file)) {
Downloader *downloader = new Downloader(this);
connect(downloader, &Downloader::finished, this,
&WMTS::capabilitiesReady);

View File

@ -3,7 +3,6 @@
#include <QPainter>
#include <QImageReader>
#include "image.h"
#include "gcs.h"
#include "prjfile.h"
#include "wldfile.h"
#include "worldfilemap.h"