1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-24 03:35:53 +01:00

Reload the ENC style on device pixel ratio changes

This commit is contained in:
Martin Tůma 2024-02-12 10:02:19 +01:00
parent c4b1671fec
commit ba2fd6d2e2
9 changed files with 53 additions and 33 deletions

View File

@ -1,6 +1,9 @@
#ifndef ENC_OBJECTS_H
#define ENC_OBJECTS_H
#define TYPE(t) ((t)<<16)
#define SUBTYPE(t, s) (((t)<<16)|(s))
#define AIRARE 2
#define ACHBRT 3
#define ACHARE 4

View File

@ -3,7 +3,9 @@
#include "common/linec.h"
#include "map/bitmapline.h"
#include "map/textpathitem.h"
#include "map/textpointitem.h"
#include "map/rectd.h"
#include "objects.h"
#include "style.h"
#include "rastertile.h"
@ -18,12 +20,6 @@ static const float C1 = 0.866025f; /* sqrt(3)/2 */
static const QColor tsslptPen = QColor(0xeb, 0x49, 0xeb);
static const QColor tsslptBrush = QColor(0xeb, 0x49, 0xeb, 0x80);
static const Style *style(qreal ratio)
{
static ENC::Style s(ratio);
return &s;
}
static double area(const QVector<Coordinates> &polygon)
{
double area = 0;
@ -406,21 +402,19 @@ void RasterTile::render()
}
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),
const Style *style, const MapData *data, int zoom, const Range &zoomRange,
const QRect &rect, qreal ratio) :
_proj(proj), _transform(transform), _style(style), _map(data), _atlas(0),
_zoom(zoom), _zoomRange(zoomRange), _rect(rect), _ratio(ratio),
_pixmap(rect.width() * ratio, rect.height() * ratio), _valid(false)
{
_style = style(ratio);
}
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),
const Style *style, AtlasData *data, int zoom, const Range &zoomRange,
const QRect &rect, qreal ratio) :
_proj(proj), _transform(transform), _style(style), _map(0), _atlas(data),
_zoom(zoom), _zoomRange(zoomRange), _rect(rect), _ratio(ratio),
_pixmap(rect.width() * ratio, rect.height() * ratio), _valid(false)
{
_style = style(ratio);
}

View File

@ -5,7 +5,6 @@
#include "common/range.h"
#include "map/projection.h"
#include "map/transform.h"
#include "map/textpointitem.h"
#include "mapdata.h"
#include "style.h"
#include "atlasdata.h"
@ -18,11 +17,11 @@ class RasterTile
{
public:
RasterTile(const Projection &proj, const Transform &transform,
const MapData *data, int zoom, const Range &zoomRange, const QRect &rect,
qreal ratio);
const Style *style, const MapData *data, int zoom, const Range &zoomRange,
const QRect &rect, qreal ratio);
RasterTile(const Projection &proj, const Transform &transform,
AtlasData *data, int zoom, const Range &zoomRange, const QRect &rect,
qreal ratio);
const Style *style, AtlasData *data, int zoom, const Range &zoomRange,
const QRect &rect, qreal ratio);
int zoom() const {return _zoom;}
QPoint xy() const {return _rect.topLeft();}

View File

@ -1,5 +1,6 @@
#include <QPainter>
#include "common/util.h"
#include "objects.h"
#include "style.h"
using namespace ENC;

View File

@ -5,13 +5,9 @@
#include <QBrush>
#include <QFont>
#include <QMap>
#include "objects.h"
namespace ENC {
#define TYPE(t) ((t)<<16)
#define SUBTYPE(t, s) (((t)<<16)|(s))
class Style
{
public:

View File

@ -121,8 +121,8 @@ void ENCAtlas::addMap(const QDir &dir, const QByteArray &file,
}
ENCAtlas::ENCAtlas(const QString &fileName, QObject *parent)
: Map(fileName, parent), _projection(PCS::pcs(3857)),
_tileRatio(1.0), _zoom(0), _valid(false)
: Map(fileName, parent), _projection(PCS::pcs(3857)), _tileRatio(1.0),
_style(0), _zoom(0), _valid(false)
{
QDir dir(QFileInfo(fileName).absoluteDir());
ISO8211 ddf(fileName);
@ -160,6 +160,7 @@ ENCAtlas::ENCAtlas(const QString &fileName, QObject *parent)
ENCAtlas::~ENCAtlas()
{
qDeleteAll(_data);
delete _style;
}
void ENCAtlas::load(const Projection &in, const Projection &out,
@ -171,6 +172,9 @@ void ENCAtlas::load(const Projection &in, const Projection &out,
_tileRatio = deviceRatio;
_projection = out;
Q_ASSERT(!_style);
_style = new Style(deviceRatio);
QPixmapCache::clear();
}
@ -179,6 +183,9 @@ void ENCAtlas::unload()
cancelJobs(true);
_cache.clear();
delete _style;
_style = 0;
}
int ENCAtlas::zoomFit(const QSize &size, const RectC &rect)
@ -356,7 +363,7 @@ void ENCAtlas::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,
tiles.append(RasterTile(_projection, _transform, _style,
_data.value(_usage), _zoom, zooms(_usage),
QRect(ttl, QSize(TILE_SIZE, TILE_SIZE)), _tileRatio));
}

View File

@ -1,12 +1,15 @@
#ifndef ENCATLAS_H
#define ENCATLAS_H
#include <QMap>
#include <QMutex>
#include "common/range.h"
#include "map.h"
#include "projection.h"
#include "transform.h"
#include "ENC/iso8211.h"
#include "ENC/atlasdata.h"
#include "ENC/style.h"
class ENCJob;
class QDir;
@ -84,6 +87,7 @@ private:
Transform _transform;
qreal _tileRatio;
QMap<IntendedUsage, ENC::AtlasData*> _data;
ENC::Style *_style;
ENC::MapCache _cache;
QMutex _lock;
IntendedUsage _usage;

View File

@ -2,6 +2,8 @@
#include <QPixmapCache>
#include "common/range.h"
#include "common/wgs84.h"
#include "ENC/mapdata.h"
#include "ENC/style.h"
#include "rectd.h"
#include "pcs.h"
#include "encjob.h"
@ -118,7 +120,7 @@ bool ENCMap::processRecord(const ISO8211::Record &record,
}
ENCMap::ENCMap(const QString &fileName, QObject *parent)
: Map(fileName, parent), _data(0), _projection(PCS::pcs(3857)),
: Map(fileName, parent), _data(0), _style(0), _projection(PCS::pcs(3857)),
_tileRatio(1.0), _valid(false)
{
QVector<ISO8211::Record> gv;
@ -161,6 +163,12 @@ ENCMap::ENCMap(const QString &fileName, QObject *parent)
_valid = true;
}
ENCMap::~ENCMap()
{
delete _data;
delete _style;
}
void ENCMap::load(const Projection &in, const Projection &out,
qreal deviceRatio, bool hidpi)
{
@ -171,6 +179,9 @@ void ENCMap::load(const Projection &in, const Projection &out,
_projection = out;
Q_ASSERT(!_data);
_data = new MapData(path());
Q_ASSERT(!_style);
_style = new Style(deviceRatio);
QPixmapCache::clear();
}
@ -180,6 +191,8 @@ void ENCMap::unload()
delete _data;
_data = 0;
delete _style;
_style = 0;
}
int ENCMap::zoomFit(const QSize &size, const RectC &rect)
@ -323,8 +336,9 @@ 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, _style, _data,
_zoom, _zooms, QRect(ttl, QSize(TILE_SIZE, TILE_SIZE)),
_tileRatio));
}
}

View File

@ -7,8 +7,9 @@
#include "map.h"
#include "projection.h"
#include "transform.h"
#include "ENC/mapdata.h"
#include "ENC/iso8211.h"
#include "ENC/mapdata.h"
#include "ENC/style.h"
class ENCJob;
@ -18,7 +19,7 @@ class ENCMap : public Map
public:
ENCMap(const QString &fileName, QObject *parent = 0);
~ENCMap() {delete _data;}
~ENCMap();
QString name() const {return _name;}
@ -100,6 +101,7 @@ private:
QString _name;
ENC::MapData *_data;
ENC::Style *_style;
Projection _projection;
Transform _transform;
qreal _tileRatio;