1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-10-06 14:53:21 +02:00

Added missing HiDPI mode support

This commit is contained in:
Martin Tůma 2020-12-28 14:05:51 +01:00
parent 26cbbee135
commit 85d6357cb9
2 changed files with 44 additions and 20 deletions

View File

@ -30,9 +30,9 @@
KMZMap::Overlay::Overlay(const QString &path, const QSize &size,
const RectC &bbox, double rotation, const Projection *proj)
const RectC &bbox, double rotation, const Projection *proj, qreal ratio)
: _path(path), _size(size), _bbox(bbox), _rotation(rotation), _img(0),
_proj(proj)
_proj(proj), _ratio(ratio)
{
ReferencePoint tl(PointD(0, 0), _proj->ll2xy(bbox.topLeft()));
ReferencePoint br(PointD(size.width(), size.height()),
@ -62,13 +62,15 @@ qreal KMZMap::Overlay::resolution(const QRectF &rect) const
void KMZMap::Overlay::draw(QPainter *painter, const QRectF &rect, Flags flags)
{
if (_img) {
QRectF rr(rect.topLeft() / _ratio, rect.size());
if (_rotation) {
painter->save();
painter->rotate(-_rotation);
_img->draw(painter, rect, flags);
_img->draw(painter, rr, flags);
painter->restore();
} else
_img->draw(painter, rect, flags);
_img->draw(painter, rr, flags);
}
//painter->setPen(Qt::red);
@ -80,6 +82,7 @@ void KMZMap::Overlay::load(QZipReader *zip)
if (!_img) {
QByteArray ba(zip->fileData(_path));
_img = new Image(QImage::fromData(ba));
_img->setDevicePixelRatio(_ratio);
}
}
@ -106,6 +109,14 @@ void KMZMap::Overlay::setProjection(const Projection *proj)
_transform = Transform(tl, br);
}
void KMZMap::Overlay::setDevicePixelRatio(qreal ratio)
{
_ratio = ratio;
if (_img)
_img->setDevicePixelRatio(_ratio);
}
bool KMZMap::resCmp(const Overlay &m1, const Overlay &m2)
{
@ -246,7 +257,8 @@ void KMZMap::groundOverlay(QXmlStreamReader &reader, QZipReader &zip)
QSize size(ir.size());
if (size.isValid())
_maps.append(Overlay(image, size, rect, rotation, &_projection));
_maps.append(Overlay(image, size, rect, rotation, &_projection,
_ratio));
else
reader.raiseError(image + ": Invalid image file");
} else
@ -295,7 +307,7 @@ void KMZMap::kml(QXmlStreamReader &reader, QZipReader &zip)
KMZMap::KMZMap(const QString &fileName, QObject *parent)
: Map(fileName, parent), _zoom(0), _mapIndex(-1), _zip(0)
: Map(fileName, parent), _zoom(0), _mapIndex(-1), _zip(0), _ratio(1.0)
{
QZipReader zip(fileName, QIODevice::ReadOnly);
QByteArray xml(zip.fileData("doc.kml"));
@ -438,17 +450,9 @@ Coordinates KMZMap::xy2ll(const QPointF &p)
void KMZMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
{
QRectF er = rect.adjusted(-_adjust, -_adjust, _adjust, _adjust);
QRectF er = rect.adjusted(-_adjust * _ratio, -_adjust * _ratio,
_adjust * _ratio, _adjust * _ratio);
// All in one map
for (int i = _zooms.at(_zoom).first; i <= _zooms.at(_zoom).last; i++) {
if (_bounds.at(i).xy.contains(er)) {
draw(painter, er, i, flags);
return;
}
}
// Multiple maps
for (int i = _zooms.at(_zoom).first; i <= _zooms.at(_zoom).last; i++) {
QRectF ir = er.intersected(_bounds.at(i).xy);
if (!ir.isNull())
@ -485,6 +489,22 @@ void KMZMap::setInputProjection(const Projection &projection)
computeBounds();
}
void KMZMap::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
{
Q_UNUSED(deviceRatio);
if (mapRatio == _ratio)
return;
_ratio = mapRatio;
for (int i = 0; i < _maps.size(); i++)
_maps[i].setDevicePixelRatio(_ratio);
_bounds.clear();
computeBounds();
}
void KMZMap::draw(QPainter *painter, const QRectF &rect, int mapIndex,
Flags flags)
{

View File

@ -36,6 +36,7 @@ public:
void unload();
void setInputProjection(const Projection &projection);
void setDevicePixelRatio(qreal deviceRatio, qreal mapRatio);
bool isValid() const {return _valid;}
QString errorString() const {return _errorString;}
@ -44,14 +45,14 @@ private:
class Overlay {
public:
Overlay(const QString &path, const QSize &size, const RectC &bbox,
double rotation, const Projection *proj);
double rotation, const Projection *proj, qreal ratio);
bool operator==(const Overlay &other) const
{return _path == other._path;}
QPointF ll2xy(const Coordinates &c) const
{return QPointF(_transform.proj2img(_proj->ll2xy(c)));}
{return QPointF(_transform.proj2img(_proj->ll2xy(c))) / _ratio;}
Coordinates xy2ll(const QPointF &p) const
{return _proj->xy2ll(_transform.img2proj(p));}
{return _proj->xy2ll(_transform.img2proj(p * _ratio));}
const QString &path() const {return _path;}
const RectC &bbox() const {return _bbox;}
@ -65,6 +66,7 @@ private:
void unload();
void setProjection(const Projection *proj);
void setDevicePixelRatio(qreal ratio);
private:
QString _path;
@ -75,6 +77,7 @@ private:
Image *_img;
const Projection *_proj;
Transform _transform;
qreal _ratio;
};
struct Zoom {
@ -117,6 +120,7 @@ private:
QZipReader *_zip;
qreal _adjust;
Projection _projection;
qreal _ratio;
bool _valid;
QString _errorString;