• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
StackedTileLoader.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the Marble Virtual Globe.
3  *
4  * Copyright 2005-2007 Torsten Rahn <tackat@kde.org>
5  * Copyright 2007 Inge Wallin <ingwa@kde.org>
6  * Copyright 2008, 2009, 2010 Jens-Michael Hoffmann <jensmh@gmx.de>
7  * Copyright 2010-2012 Bernhard Beschow <bbeschow@cs.tu-berlin.de>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB. If not, write to
21  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  */
24 
25 #include "StackedTileLoader.h"
26 
27 #include "MarbleDebug.h"
28 #include "MergedLayerDecorator.h"
29 #include "StackedTile.h"
30 #include "TileLoader.h"
31 #include "TileLoaderHelper.h"
32 #include "MarbleGlobal.h"
33 
34 #include <QCache>
35 #include <QHash>
36 #include <QReadWriteLock>
37 #include <QImage>
38 
39 
40 namespace Marble
41 {
42 
43 class StackedTileLoaderPrivate
44 {
45 public:
46  StackedTileLoaderPrivate( MergedLayerDecorator *mergedLayerDecorator )
47  : m_layerDecorator( mergedLayerDecorator )
48  {
49  m_tileCache.setMaxCost( 20000 * 1024 ); // Cache size measured in bytes
50  }
51 
52  MergedLayerDecorator *const m_layerDecorator;
53  QHash <TileId, StackedTile*> m_tilesOnDisplay;
54  QCache <TileId, StackedTile> m_tileCache;
55  QReadWriteLock m_cacheLock;
56 };
57 
58 StackedTileLoader::StackedTileLoader( MergedLayerDecorator *mergedLayerDecorator, QObject *parent )
59  : QObject( parent ),
60  d( new StackedTileLoaderPrivate( mergedLayerDecorator ) )
61 {
62 }
63 
64 StackedTileLoader::~StackedTileLoader()
65 {
66  qDeleteAll( d->m_tilesOnDisplay );
67  delete d;
68 }
69 
70 int StackedTileLoader::tileColumnCount( int level ) const
71 {
72  return d->m_layerDecorator->tileColumnCount( level );
73 }
74 
75 int StackedTileLoader::tileRowCount( int level ) const
76 {
77  return d->m_layerDecorator->tileRowCount( level );
78 }
79 
80 GeoSceneTiled::Projection StackedTileLoader::tileProjection() const
81 {
82  return d->m_layerDecorator->tileProjection();
83 }
84 
85 QSize StackedTileLoader::tileSize() const
86 {
87  return d->m_layerDecorator->tileSize();
88 }
89 
90 void StackedTileLoader::resetTilehash()
91 {
92  QHash<TileId, StackedTile*>::const_iterator it = d->m_tilesOnDisplay.constBegin();
93  QHash<TileId, StackedTile*>::const_iterator const end = d->m_tilesOnDisplay.constEnd();
94  for (; it != end; ++it ) {
95  Q_ASSERT( it.value()->used() && "contained in m_tilesOnDisplay should imply used()" );
96  it.value()->setUsed( false );
97  }
98 }
99 
100 void StackedTileLoader::cleanupTilehash()
101 {
102  // Make sure that tiles which haven't been used during the last
103  // rendering of the map at all get removed from the tile hash.
104 
105  QHashIterator<TileId, StackedTile*> it( d->m_tilesOnDisplay );
106  while ( it.hasNext() ) {
107  it.next();
108  if ( !it.value()->used() ) {
109  // If insert call result is false then the cache is too small to store the tile
110  // but the item will get deleted nevertheless and the pointer we have
111  // doesn't get set to zero (so don't delete it in this case or it will crash!)
112  d->m_tileCache.insert( it.key(), it.value(), it.value()->byteCount() );
113  d->m_tilesOnDisplay.remove( it.key() );
114  }
115  }
116 }
117 
118 const StackedTile* StackedTileLoader::loadTile( TileId const & stackedTileId )
119 {
120  // check if the tile is in the hash
121  d->m_cacheLock.lockForRead();
122  StackedTile * stackedTile = d->m_tilesOnDisplay.value( stackedTileId, 0 );
123  d->m_cacheLock.unlock();
124  if ( stackedTile ) {
125  stackedTile->setUsed( true );
126  return stackedTile;
127  }
128  // here ends the performance critical section of this method
129 
130  d->m_cacheLock.lockForWrite();
131 
132  // has another thread loaded our tile due to a race condition?
133  stackedTile = d->m_tilesOnDisplay.value( stackedTileId, 0 );
134  if ( stackedTile ) {
135  Q_ASSERT( stackedTile->used() && "other thread should have marked tile as used" );
136  d->m_cacheLock.unlock();
137  return stackedTile;
138  }
139 
140  // the tile was not in the hash so check if it is in the cache
141  stackedTile = d->m_tileCache.take( stackedTileId );
142  if ( stackedTile ) {
143  Q_ASSERT( !stackedTile->used() && "tiles in m_tileCache are invisible and should thus be marked as unused" );
144  stackedTile->setUsed( true );
145  d->m_tilesOnDisplay[ stackedTileId ] = stackedTile;
146  d->m_cacheLock.unlock();
147  return stackedTile;
148  }
149 
150  // tile (valid) has not been found in hash or cache, so load it from disk
151  // and place it in the hash from where it will get transferred to the cache
152 
153  mDebug() << "load tile from disk:" << stackedTileId;
154 
155  stackedTile = d->m_layerDecorator->loadTile( stackedTileId );
156  Q_ASSERT( stackedTile );
157  stackedTile->setUsed( true );
158 
159  d->m_tilesOnDisplay[ stackedTileId ] = stackedTile;
160  d->m_cacheLock.unlock();
161 
162  emit tileLoaded( stackedTileId );
163 
164  return stackedTile;
165 }
166 
167 quint64 StackedTileLoader::volatileCacheLimit() const
168 {
169  return d->m_tileCache.maxCost() / 1024;
170 }
171 
172 QList<TileId> StackedTileLoader::visibleTiles() const
173 {
174  return d->m_tilesOnDisplay.keys();
175 }
176 
177 int StackedTileLoader::tileCount() const
178 {
179  return d->m_tileCache.count() + d->m_tilesOnDisplay.count();
180 }
181 
182 void StackedTileLoader::setVolatileCacheLimit( quint64 kiloBytes )
183 {
184  mDebug() << QString("Setting tile cache to %1 kilobytes.").arg( kiloBytes );
185  d->m_tileCache.setMaxCost( kiloBytes * 1024 );
186 }
187 
188 void StackedTileLoader::updateTile( TileId const &tileId, QImage const &tileImage )
189 {
190  const TileId stackedTileId( 0, tileId.zoomLevel(), tileId.x(), tileId.y() );
191 
192  StackedTile * displayedTile = d->m_tilesOnDisplay.take( stackedTileId );
193  if ( displayedTile ) {
194  Q_ASSERT( !d->m_tileCache.contains( stackedTileId ) );
195 
196  StackedTile *const stackedTile = d->m_layerDecorator->updateTile( *displayedTile, tileId, tileImage );
197  stackedTile->setUsed( true );
198  d->m_tilesOnDisplay.insert( stackedTileId, stackedTile );
199 
200  delete displayedTile;
201  displayedTile = 0;
202 
203  emit tileLoaded( stackedTileId );
204  } else {
205  d->m_tileCache.remove( stackedTileId );
206  }
207 }
208 
209 RenderState StackedTileLoader::renderState() const
210 {
211  RenderState renderState( "Stacked Tiles" );
212  QHash<TileId, StackedTile*>::const_iterator it = d->m_tilesOnDisplay.constBegin();
213  QHash<TileId, StackedTile*>::const_iterator const end = d->m_tilesOnDisplay.constEnd();
214  for (; it != end; ++it ) {
215  renderState.addChild( d->m_layerDecorator->renderState( it.key() ) );
216  }
217  return renderState;
218 }
219 
220 void StackedTileLoader::clear()
221 {
222  mDebug() << Q_FUNC_INFO;
223 
224  qDeleteAll( d->m_tilesOnDisplay );
225  d->m_tilesOnDisplay.clear();
226  d->m_tileCache.clear(); // clear the tile cache in physical memory
227 
228  emit cleared();
229 }
230 
231 }
232 
233 #include "StackedTileLoader.moc"
TileLoader.h
QReadWriteLock
Marble::TileId::zoomLevel
int zoomLevel() const
Definition: TileId.h:57
QHashIterator::key
const Key & key() const
Marble::StackedTileLoader::tileLoaded
void tileLoaded(TileId const &tileId)
Marble::GeoSceneTiled::Projection
Projection
Definition: GeoSceneTiled.h:47
Marble::TileId::y
int y() const
Definition: TileId.h:67
QHashIterator::hasNext
bool hasNext() const
Marble::StackedTileLoader::StackedTileLoader
StackedTileLoader(MergedLayerDecorator *mergedLayerDecorator, QObject *parent=0)
Creates a new tile loader.
Definition: StackedTileLoader.cpp:58
MarbleDebug.h
Marble::StackedTile
A single tile that consists of a stack of Tile layers.
Definition: StackedTile.h:56
Marble::StackedTileLoader::clear
void clear()
Effectively triggers a reload of all tiles that are currently in use and clears the tile cache in phy...
Definition: StackedTileLoader.cpp:220
Marble::MergedLayerDecorator
Definition: MergedLayerDecorator.h:39
Marble::StackedTileLoader::~StackedTileLoader
virtual ~StackedTileLoader()
Definition: StackedTileLoader.cpp:64
Marble::StackedTile::used
bool used() const
Definition: StackedTile.cpp:232
QHash
Marble::StackedTileLoader::setVolatileCacheLimit
void setVolatileCacheLimit(quint64 kiloBytes)
Set the limit of the volatile (in RAM) cache.
Definition: StackedTileLoader.cpp:182
QObject
QHashIterator
Marble::StackedTileLoader::cleanupTilehash
void cleanupTilehash()
Cleans up the internal tile hash.
Definition: StackedTileLoader.cpp:100
Marble::StackedTileLoader::updateTile
void updateTile(TileId const &tileId, QImage const &tileImage)
Definition: StackedTileLoader.cpp:188
QString
QList
Marble::StackedTileLoader::tileSize
QSize tileSize() const
Definition: StackedTileLoader.cpp:85
Marble::StackedTile::setUsed
void setUsed(bool used)
Definition: StackedTile.cpp:227
MarbleGlobal.h
Marble::RenderState
Definition: RenderState.h:22
QCache
Marble::TileId::x
int x() const
Definition: TileId.h:62
QHashIterator::next
Item next()
QSize
Marble::StackedTileLoader::visibleTiles
QList< TileId > visibleTiles() const
Reloads the tiles that are currently displayed.
Definition: StackedTileLoader.cpp:172
MergedLayerDecorator.h
QImage
Marble::StackedTileLoader::tileColumnCount
int tileColumnCount(int level) const
Definition: StackedTileLoader.cpp:70
Marble::StackedTileLoader::tileRowCount
int tileRowCount(int level) const
Definition: StackedTileLoader.cpp:75
QHash::const_iterator
Marble::TileId
Definition: TileId.h:27
Marble::StackedTileLoader::renderState
RenderState renderState() const
Definition: StackedTileLoader.cpp:209
Marble::StackedTileLoader::tileProjection
GeoSceneTextureTile::Projection tileProjection() const
Definition: StackedTileLoader.cpp:80
Marble::StackedTileLoader::cleared
void cleared()
StackedTile.h
Marble::StackedTileLoader::tileCount
int tileCount() const
Return the number of tiles in the cache.
Definition: StackedTileLoader.cpp:177
QHashIterator::value
const T & value() const
Marble::StackedTileLoader::volatileCacheLimit
quint64 volatileCacheLimit() const
Returns the limit of the volatile (in RAM) cache.
Definition: StackedTileLoader.cpp:167
TileLoaderHelper.h
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
Marble::RenderState::addChild
void addChild(const RenderState &child)
Definition: RenderState.cpp:73
Marble::StackedTileLoader::resetTilehash
void resetTilehash()
Resets the internal tile hash.
Definition: StackedTileLoader.cpp:90
Marble::StackedTileLoader::loadTile
const StackedTile * loadTile(TileId const &stackedTileId)
Loads a tile and returns it.
Definition: StackedTileLoader.cpp:118
StackedTileLoader.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:42 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal