mirror of
https://github.com/tumic0/GPXSee.git
synced 2024-11-24 03:35:53 +01:00
DEM locking cleanup
This commit is contained in:
parent
e2b6dcf8d3
commit
b348ad6288
@ -2019,10 +2019,7 @@ void GUI::demLoaded()
|
|||||||
}
|
}
|
||||||
|
|
||||||
_demRects.clear();
|
_demRects.clear();
|
||||||
|
|
||||||
DEM::lock();
|
|
||||||
DEM::clearCache();
|
DEM::clearCache();
|
||||||
DEM::unlock();
|
|
||||||
|
|
||||||
reloadFiles();
|
reloadFiles();
|
||||||
reloadMap();
|
reloadMap();
|
||||||
@ -3070,9 +3067,7 @@ void GUI::loadOptions()
|
|||||||
Downloader::setTimeout(_options.connectionTimeout);
|
Downloader::setTimeout(_options.connectionTimeout);
|
||||||
|
|
||||||
QPixmapCache::setCacheLimit(_options.pixmapCache * 1024);
|
QPixmapCache::setCacheLimit(_options.pixmapCache * 1024);
|
||||||
DEM::lock();
|
|
||||||
DEM::setCacheSize(_options.demCache * 1024);
|
DEM::setCacheSize(_options.demCache * 1024);
|
||||||
DEM::unlock();
|
|
||||||
|
|
||||||
HillShading::setAlpha(_options.hillshadingAlpha);
|
HillShading::setAlpha(_options.hillshadingAlpha);
|
||||||
HillShading::setBlur(_options.hillshadingBlur);
|
HillShading::setBlur(_options.hillshadingBlur);
|
||||||
@ -3211,11 +3206,8 @@ void GUI::updateOptions(const Options &options)
|
|||||||
|
|
||||||
if (options.pixmapCache != _options.pixmapCache)
|
if (options.pixmapCache != _options.pixmapCache)
|
||||||
QPixmapCache::setCacheLimit(options.pixmapCache * 1024);
|
QPixmapCache::setCacheLimit(options.pixmapCache * 1024);
|
||||||
if (options.demCache != _options.demCache) {
|
if (options.demCache != _options.demCache)
|
||||||
DEM::lock();
|
|
||||||
DEM::setCacheSize(options.demCache * 1024);
|
DEM::setCacheSize(options.demCache * 1024);
|
||||||
DEM::unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
SET_HS_OPTION(hillshadingAlpha, setAlpha);
|
SET_HS_OPTION(hillshadingAlpha, setAlpha);
|
||||||
SET_HS_OPTION(hillshadingBlur, setBlur);
|
SET_HS_OPTION(hillshadingBlur, setBlur);
|
||||||
|
@ -461,18 +461,16 @@ void RasterTile::fetchData(QList<MapData::Poly> &polygons,
|
|||||||
|
|
||||||
MatrixD RasterTile::elevation(int extend) const
|
MatrixD RasterTile::elevation(int extend) const
|
||||||
{
|
{
|
||||||
MatrixD m(_rect.height() + 2 * extend, _rect.width() + 2 * extend);
|
|
||||||
QVector<Coordinates> ll;
|
|
||||||
|
|
||||||
int left = _rect.left() - extend;
|
int left = _rect.left() - extend;
|
||||||
int right = _rect.right() + extend;
|
int right = _rect.right() + extend;
|
||||||
int top = _rect.top() - extend;
|
int top = _rect.top() - extend;
|
||||||
int bottom = _rect.bottom() + extend;
|
int bottom = _rect.bottom() + extend;
|
||||||
|
|
||||||
ll.reserve(m.w() * m.h());
|
Matrix<Coordinates> ll(_rect.height() + 2 * extend,
|
||||||
for (int y = top; y <= bottom; y++)
|
_rect.width() + 2 * extend);
|
||||||
for (int x = left; x <= right; x++)
|
for (int y = top, i = 0; y <= bottom; y++)
|
||||||
ll.append(xy2ll(QPointF(x, y)));
|
for (int x = left; x <= right; x++, i++)
|
||||||
|
ll.at(i) = xy2ll(QPointF(x, y));
|
||||||
|
|
||||||
if (_data->hasDEM()) {
|
if (_data->hasDEM()) {
|
||||||
RectC rect;
|
RectC rect;
|
||||||
@ -487,16 +485,14 @@ MatrixD RasterTile::elevation(int extend) const
|
|||||||
-rect.height() / factor), _zoom, &tiles);
|
-rect.height() / factor), _zoom, &tiles);
|
||||||
|
|
||||||
DEMTree tree(tiles);
|
DEMTree tree(tiles);
|
||||||
|
MatrixD m(ll.h(), ll.w());
|
||||||
|
|
||||||
for (int i = 0; i < ll.size(); i++)
|
for (int i = 0; i < ll.size(); i++)
|
||||||
m.at(i) = tree.elevation(ll.at(i));
|
m.at(i) = tree.elevation(ll.at(i));
|
||||||
} else {
|
|
||||||
DEM::lock();
|
|
||||||
for (int i = 0; i < ll.size(); i++)
|
|
||||||
m.at(i) = DEM::elevation(ll.at(i));
|
|
||||||
DEM::unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
|
} else
|
||||||
|
return DEM::elevation(ll);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterTile::drawHillShading(QPainter *painter) const
|
void RasterTile::drawHillShading(QPainter *painter) const
|
||||||
|
@ -75,7 +75,9 @@ DEM::TileCache DEM::_data;
|
|||||||
|
|
||||||
void DEM::setCacheSize(int size)
|
void DEM::setCacheSize(int size)
|
||||||
{
|
{
|
||||||
|
_lock.lock();
|
||||||
_data.setMaxCost(size);
|
_data.setMaxCost(size);
|
||||||
|
_lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DEM::setDir(const QString &path)
|
void DEM::setDir(const QString &path)
|
||||||
@ -85,7 +87,9 @@ void DEM::setDir(const QString &path)
|
|||||||
|
|
||||||
void DEM::clearCache()
|
void DEM::clearCache()
|
||||||
{
|
{
|
||||||
|
_lock.lock();
|
||||||
_data.clear();
|
_data.clear();
|
||||||
|
_lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
double DEM::height(const Coordinates &c, const Entry *e)
|
double DEM::height(const Coordinates &c, const Entry *e)
|
||||||
@ -132,6 +136,27 @@ double DEM::elevation(const Coordinates &c)
|
|||||||
return NAN;
|
return NAN;
|
||||||
|
|
||||||
Tile tile(floor(c.lon()), floor(c.lat()));
|
Tile tile(floor(c.lon()), floor(c.lat()));
|
||||||
|
|
||||||
|
_lock.lock();
|
||||||
|
|
||||||
|
Entry *e = _data.object(tile);
|
||||||
|
double ele;
|
||||||
|
|
||||||
|
if (!e) {
|
||||||
|
e = loadTile(tile);
|
||||||
|
ele = height(c, e);
|
||||||
|
_data.insert(tile, e, e->data().size() / 1024);
|
||||||
|
} else
|
||||||
|
ele = height(c, e);
|
||||||
|
|
||||||
|
_lock.unlock();
|
||||||
|
|
||||||
|
return ele;
|
||||||
|
}
|
||||||
|
|
||||||
|
double DEM::elevationLockFree(const Coordinates &c)
|
||||||
|
{
|
||||||
|
Tile tile(floor(c.lon()), floor(c.lat()));
|
||||||
Entry *e = _data.object(tile);
|
Entry *e = _data.object(tile);
|
||||||
double ele;
|
double ele;
|
||||||
|
|
||||||
@ -145,6 +170,21 @@ double DEM::elevation(const Coordinates &c)
|
|||||||
return ele;
|
return ele;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MatrixD DEM::elevation(const Matrix<Coordinates> &m)
|
||||||
|
{
|
||||||
|
if (_dir.isEmpty())
|
||||||
|
return MatrixD(m.h(), m.w(), NAN);
|
||||||
|
|
||||||
|
MatrixD ret(m.h(), m.w());
|
||||||
|
|
||||||
|
_lock.lock();
|
||||||
|
for (int i = 0; i < m.size(); i++)
|
||||||
|
ret.at(i) = elevationLockFree(m.at(i));
|
||||||
|
_lock.unlock();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
QList<Area> DEM::tiles()
|
QList<Area> DEM::tiles()
|
||||||
{
|
{
|
||||||
static const QRegularExpression re(
|
static const QRegularExpression re(
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include "common/hash.h"
|
#include "common/hash.h"
|
||||||
#include "data/area.h"
|
#include "data/area.h"
|
||||||
|
#include "matrix.h"
|
||||||
|
|
||||||
class Coordinates;
|
class Coordinates;
|
||||||
|
|
||||||
@ -38,8 +39,7 @@ public:
|
|||||||
static void clearCache();
|
static void clearCache();
|
||||||
|
|
||||||
static double elevation(const Coordinates &c);
|
static double elevation(const Coordinates &c);
|
||||||
static void lock() {_lock.lock();}
|
static MatrixD elevation(const Matrix<Coordinates> &m);
|
||||||
static void unlock() {_lock.unlock();}
|
|
||||||
|
|
||||||
static QList<Area> tiles();
|
static QList<Area> tiles();
|
||||||
|
|
||||||
@ -61,6 +61,7 @@ private:
|
|||||||
|
|
||||||
static double height(const Coordinates &c, const Entry *e);
|
static double height(const Coordinates &c, const Entry *e);
|
||||||
static Entry *loadTile(const Tile &tile);
|
static Entry *loadTile(const Tile &tile);
|
||||||
|
static double elevationLockFree(const Coordinates &c);
|
||||||
|
|
||||||
static QString _dir;
|
static QString _dir;
|
||||||
static TileCache _data;
|
static TileCache _data;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <QLineF>
|
#include <QLineF>
|
||||||
#include "dem.h"
|
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
|
|
||||||
|
|
||||||
@ -80,14 +79,3 @@ qreal Map::resolution(const QRectF &rect)
|
|||||||
|
|
||||||
return ds/ps;
|
return ds/ps;
|
||||||
}
|
}
|
||||||
|
|
||||||
double Map::elevation(const Coordinates &c)
|
|
||||||
{
|
|
||||||
double ele;
|
|
||||||
|
|
||||||
DEM::lock();
|
|
||||||
ele = DEM::elevation(c);
|
|
||||||
DEM::unlock();
|
|
||||||
|
|
||||||
return ele;
|
|
||||||
}
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <QFlags>
|
#include <QFlags>
|
||||||
#include "common/rectc.h"
|
#include "common/rectc.h"
|
||||||
#include "common/util.h"
|
#include "common/util.h"
|
||||||
|
#include "dem.h"
|
||||||
|
|
||||||
|
|
||||||
class QPainter;
|
class QPainter;
|
||||||
@ -58,7 +59,7 @@ public:
|
|||||||
|
|
||||||
virtual void draw(QPainter *painter, const QRectF &rect, Flags flags) = 0;
|
virtual void draw(QPainter *painter, const QRectF &rect, Flags flags) = 0;
|
||||||
|
|
||||||
virtual double elevation(const Coordinates &c);
|
virtual double elevation(const Coordinates &c) {return DEM::elevation(c);}
|
||||||
|
|
||||||
virtual void clearCache() {}
|
virtual void clearCache() {}
|
||||||
|
|
||||||
|
@ -470,26 +470,18 @@ void RasterTile::fetchData(QList<MapData::Path> &paths,
|
|||||||
|
|
||||||
MatrixD RasterTile::elevation(int extend) const
|
MatrixD RasterTile::elevation(int extend) const
|
||||||
{
|
{
|
||||||
MatrixD m(_rect.height() + 2 * extend, _rect.width() + 2 * extend);
|
|
||||||
|
|
||||||
int left = _rect.left() - extend;
|
int left = _rect.left() - extend;
|
||||||
int right = _rect.right() + extend;
|
int right = _rect.right() + extend;
|
||||||
int top = _rect.top() - extend;
|
int top = _rect.top() - extend;
|
||||||
int bottom = _rect.bottom() + extend;
|
int bottom = _rect.bottom() + extend;
|
||||||
|
|
||||||
QVector<Coordinates> ll;
|
Matrix<Coordinates> ll(_rect.height() + 2 * extend,
|
||||||
ll.reserve(m.w() * m.h());
|
_rect.width() + 2 * extend);
|
||||||
for (int y = top; y <= bottom; y++) {
|
for (int y = top, i = 0; y <= bottom; y++)
|
||||||
for (int x = left; x <= right; x++)
|
for (int x = left; x <= right; x++, i++)
|
||||||
ll.append(xy2ll(QPointF(x, y)));
|
ll.at(i) = xy2ll(QPointF(x, y));
|
||||||
}
|
|
||||||
|
|
||||||
DEM::lock();
|
return DEM::elevation(ll);
|
||||||
for (int i = 0; i < ll.size(); i++)
|
|
||||||
m.at(i) = DEM::elevation(ll.at(i));
|
|
||||||
DEM::unlock();
|
|
||||||
|
|
||||||
return m;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterTile::render()
|
void RasterTile::render()
|
||||||
|
Loading…
Reference in New Issue
Block a user