10#include "StackedTileLoader.h"
12#include "MarbleDebug.h"
13#include "MergedLayerDecorator.h"
14#include "StackedTile.h"
15#include "TileLoader.h"
16#include "TileLoaderHelper.h"
17#include "MarbleGlobal.h"
21#include <QReadWriteLock>
28class StackedTileLoaderPrivate
31 explicit StackedTileLoaderPrivate( MergedLayerDecorator *mergedLayerDecorator )
32 : m_layerDecorator( mergedLayerDecorator )
34 m_tileCache.setMaxCost( 20000 * 1024 );
37 MergedLayerDecorator *
const m_layerDecorator;
38 QHash <TileId, StackedTile*> m_tilesOnDisplay;
39 QCache <TileId, StackedTile> m_tileCache;
45 d( new StackedTileLoaderPrivate( mergedLayerDecorator ) )
49StackedTileLoader::~StackedTileLoader()
51 qDeleteAll( d->m_tilesOnDisplay );
55int StackedTileLoader::tileColumnCount(
int level )
const
57 return d->m_layerDecorator->tileColumnCount( level );
60int StackedTileLoader::tileRowCount(
int level )
const
62 return d->m_layerDecorator->tileRowCount( level );
65const GeoSceneAbstractTileProjection *StackedTileLoader::tileProjection()
const
67 return d->m_layerDecorator->tileProjection();
70QSize StackedTileLoader::tileSize()
const
72 return d->m_layerDecorator->tileSize();
79 for (; it != end; ++it ) {
80 Q_ASSERT( it.value()->used() &&
"contained in m_tilesOnDisplay should imply used()" );
81 it.value()->setUsed(
false );
93 if ( !it.
value()->used() ) {
97 d->m_tileCache.insert( it.
key(), it.
value(), it.
value()->byteCount() );
98 d->m_tilesOnDisplay.remove( it.
key() );
107 StackedTile * stackedTile = d->m_tilesOnDisplay.value( stackedTileId, 0 );
110 stackedTile->setUsed(
true );
118 stackedTile = d->m_tilesOnDisplay.value( stackedTileId, 0 );
120 Q_ASSERT( stackedTile->used() &&
"other thread should have marked tile as used" );
126 stackedTile = d->m_tileCache.take( stackedTileId );
128 Q_ASSERT( !stackedTile->used() &&
"tiles in m_tileCache are invisible and should thus be marked as unused" );
129 stackedTile->setUsed(
true );
130 d->m_tilesOnDisplay[ stackedTileId ] = stackedTile;
138 mDebug() <<
"load tile from disk:" << stackedTileId;
140 stackedTile = d->m_layerDecorator->loadTile( stackedTileId );
141 Q_ASSERT( stackedTile );
142 stackedTile->setUsed(
true );
144 d->m_tilesOnDisplay[ stackedTileId ] = stackedTile;
147 emit tileLoaded( stackedTileId );
154 return d->m_tileCache.maxCost() / 1024;
159 return d->m_tilesOnDisplay.keys();
164 return d->m_tileCache.count() + d->m_tilesOnDisplay.count();
169 mDebug() <<
QString(
"Setting tile cache to %1 kilobytes.").
arg( kiloBytes );
170 d->m_tileCache.setMaxCost( kiloBytes * 1024 );
173void StackedTileLoader::updateTile( TileId
const &tileId,
QImage const &tileImage )
175 const TileId stackedTileId( 0, tileId.zoomLevel(), tileId.x(), tileId.y() );
177 StackedTile * displayedTile = d->m_tilesOnDisplay.take( stackedTileId );
178 if ( displayedTile ) {
179 Q_ASSERT( !d->m_tileCache.contains( stackedTileId ) );
181 StackedTile *
const stackedTile = d->m_layerDecorator->updateTile( *displayedTile, tileId, tileImage );
182 stackedTile->setUsed(
true );
183 d->m_tilesOnDisplay.insert( stackedTileId, stackedTile );
185 delete displayedTile;
186 displayedTile =
nullptr;
188 emit tileLoaded( stackedTileId );
190 d->m_tileCache.remove( stackedTileId );
194RenderState StackedTileLoader::renderState()
const
196 RenderState renderState(
"Stacked Tiles" );
199 for (; it !=
end; ++it ) {
200 renderState.addChild( d->m_layerDecorator->renderState( it.key() ) );
207 qDeleteAll( d->m_tilesOnDisplay );
208 d->m_tilesOnDisplay.clear();
209 d->m_tileCache.clear();
216#include "moc_StackedTileLoader.cpp"
void clear()
Effectively triggers a reload of all tiles that are currently in use and clears the tile cache in phy...
int tileCount() const
Return the number of tiles in the cache.
void cleanupTilehash()
Cleans up the internal tile hash.
void resetTilehash()
Resets the internal tile hash.
quint64 volatileCacheLimit() const
Returns the limit of the volatile (in RAM) cache.
StackedTileLoader(MergedLayerDecorator *mergedLayerDecorator, QObject *parent=nullptr)
Creates a new tile loader.
QList< TileId > visibleTiles() const
Reloads the tiles that are currently displayed.
const StackedTile * loadTile(TileId const &stackedTileId)
Loads a tile and returns it.
void setVolatileCacheLimit(quint64 kiloBytes)
Set the limit of the volatile (in RAM) cache.
A single tile that consists of a stack of Tile layers.
QAction * end(const QObject *recvr, const char *slot, QObject *parent)
Binds a QML item to a specific geodetic location in screen coordinates.
bool hasNext() const const
const Key & key() const const
const T & value() const const
QString arg(Args &&... args) const const