[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdeedu/marble
From:       Torsten Rahn <tackat () kde ! org>
Date:       2008-05-31 23:33:35
Message-ID: 1212276815.128399.22722.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 815026 by rahn:

- Taking cache contents into account when creating fallback
      tiles: preparation for threaded loading



 M  +8 -0      ChangeLog  
 M  +66 -38    src/lib/TextureTile.cpp  
 M  +2 -2      src/lib/TextureTile.h  
 M  +2 -2      src/lib/TileLoader.cpp  


--- trunk/KDE/kdeedu/marble/ChangeLog #815025:815026
@@ -1,3 +1,11 @@
+2008-06-01  Torsten Rahn  <rahn@kde.org> 
+
+    * src/lib/TextureTile.cpp:
+    * src/lib/TileLoader.cpp:
+
+    - Taking cache contents into account when creating fallback
+      tiles: preparation for threaded loading
+
 2008-06-01  Inge Wallin  <inge@lysator.liu.se>
 
 	Fix some issues with the active area in the image.
--- trunk/KDE/kdeedu/marble/src/lib/TextureTile.cpp #815025:815026
@@ -74,23 +74,20 @@
     delete [] jumpTable8;
 }
 
-void TextureTile::loadRawTile( GeoSceneTexture *textureLayer, int level, int x, int \
y, QCache<TileId, TextureTile> *cache ) +void TextureTile::loadRawTile( \
GeoSceneTexture *textureLayer, int level, int x, int y, QCache<TileId, TextureTile> \
*tileCache )  {
     // qDebug() << "TextureTile::loadRawTile" << level << x << y;
+    QImage temptile;
 
     m_used = true; // Needed to avoid frequent deletion of tiles
 
-    // qDebug() << "Entered loadTile( int, int, int) of Tile" << m_id;
-    // m_used = true; // Needed to avoid frequent deletion of tiles
-
     QString  absfilename;
 
-    // qDebug() << "Requested tile level" << level;
-
     // If the tile level offers the requested tile then load it.
     // Otherwise cycle from the requested tilelevel down to one where
     // the requested area is covered.  Then scale the area to create a
     // replacement for the tile that has been requested.
+
     const int levelZeroColumns = textureLayer->levelZeroColumns();
     const int levelZeroRows = textureLayer->levelZeroRows();
     const int rowsRequestedLevel = TileLoaderHelper::levelToRow( levelZeroRows, \
level ); @@ -108,53 +105,84 @@
         double currentX    = normalizedX * (double)( rowsCurrentLevel );
         double currentY    = normalizedY * (double)( columnsCurrentLevel );
 
-        QString relfilename = TileLoaderHelper::relativeTileFileName( textureLayer, 
-                                                                      currentLevel,
-                                                                      \
                (int)(currentX),
-                                                                      \
                (int)(currentY) );
-        absfilename = MarbleDirs::path( relfilename );
-        const QFileInfo fileInfo( absfilename );
+        const QDateTime now = QDateTime::currentDateTime();
+        QDateTime lastModified;
 
-        const QDateTime now = QDateTime::currentDateTime();
         bool download = false;
+        bool currentTileAvailable = false;
 
-        // - if the file does not exist, we want to download it and search an
-        //   existing tile of a lower zoom level for imediate display
-        // - if the file exists and is expired according to the value of the
-        //   expire element we want to download it again and display the old
-        //   tile until the new one is there. Once the updated tile is
-        //   available, it should get displayed.
+        TextureTile *currentTile = 0;
 
-        if ( !fileInfo.exists() ) {
-            qDebug() << "File does not exist:" << fileInfo.filePath();
-            download = true;
+        // Check whether the current tile id is available in the CACHE:
+        if ( tileCache ) {
+            TileId currentTileId( currentLevel, (int)(currentX), (int)(currentY) );  \
 +            currentTile = tileCache->take( currentTileId );
+
+            if ( currentTile ) {
+                // the tile was in the cache, but is it up to date?
+                lastModified = currentTile->created();
+                if ( lastModified.secsTo( now ) < textureLayer->expire()) {
+                    temptile = currentTile->rawtile();
+                    qDebug() << "FOUND IN CACHE";
+                    currentTileAvailable = true;
+                } else {
+                    delete currentTile;
+                    currentTile = 0;
+                }
+            }
         }
-        else if ( fileInfo.lastModified().secsTo( now ) > textureLayer->expire() ) {
-            qDebug() << "File does exist, but is expired:" << fileInfo.filePath()
-                     << "age (seconds):" << fileInfo.lastModified().secsTo( now )
-                     << "allowed age:" << textureLayer->expire();
-            download = true;
-        }
+        // If the current tile id is not in the cache or if it was 
+        // in the cache but has expired load from DISK:
 
-        if ( fileInfo.exists() ) {
-            // qDebug() << "The image filename does exist: " << absfilename ;
+        if ( !currentTile ) {
+            QString relfilename = TileLoaderHelper::relativeTileFileName( \
textureLayer,  +                                                                      \
currentLevel, +                                                                       \
(int)(currentX), +                                                                    \
(int)(currentY) ); +            absfilename = MarbleDirs::path( relfilename );
+            const QFileInfo fileInfo( absfilename );
+            lastModified = fileInfo.lastModified();
 
-            QImage temptile( absfilename );
-            // qDebug() << "TextureTile::loadRawTile "
-            //          << "depth:" << temptile.depth()
-            //          << "format:" << temptile.format()
-            //          << "bytesPerLine:" << temptile.bytesPerLine()
-            //          << "numBytes:" << temptile.numBytes() ;
+            // - if the file does not exist, we want to download it and search an
+            //   existing tile of a lower zoom level for imediate display
+            // - if the file exists and is expired according to the value of the
+            //   expire element we want to download it again and display the old
+            //   tile until the new one is there. Once the updated tile is
+            //   available, it should get displayed.
+ 
+            if ( !fileInfo.exists() ) {
+                qDebug() << "File does not exist:" << fileInfo.filePath();
+                download = true;
+            }
+            else if ( lastModified.secsTo( now ) > textureLayer->expire() ) {
+                qDebug() << "File does exist, but is expired:" << \
fileInfo.filePath() +                        << "age (seconds):" << \
lastModified.secsTo( now ) +                        << "allowed age:" << \
textureLayer->expire(); +                download = true;
+            }
 
+            if ( fileInfo.exists() ) {
+
+                temptile.load( absfilename );
+                // qDebug() << "TextureTile::loadRawTile "
+                //          << "depth:" << temptile.depth()
+                //          << "format:" << temptile.format()
+                //          << "bytesPerLine:" << temptile.bytesPerLine()
+                //          << "numBytes:" << temptile.numBytes() ;
+                currentTileAvailable = true;
+            }
+        }
+
+        if ( currentTileAvailable ) {
             if ( !temptile.isNull() ) {
-                // qDebug() << "Image has been successfully loaded.";
 
+                // Don't scale if the current tile isn't a fallback
                 if ( level != currentLevel ) { 
                     scaleTileFrom( textureLayer, temptile, currentX, currentY, \
currentLevel, x, y, level );  }
 
                 m_rawtile = temptile;
-                m_created = fileInfo.lastModified();
+                m_created = lastModified;
                 tileFound = true;
             }
         }
--- trunk/KDE/kdeedu/marble/src/lib/TextureTile.h #815025:815026
@@ -45,7 +45,7 @@
 
     virtual ~TextureTile();
     
-    void loadRawTile( GeoSceneTexture *textureLayer, int level, int x, int y, \
QCache<TileId, TextureTile> *cache = 0 ); +    void loadRawTile( GeoSceneTexture \
*textureLayer, int level, int x, int y, QCache<TileId, TextureTile> *tileCache = 0 ); \
  TileId const& id() const  { return m_id; }
     int  depth() const        { return m_depth; }
@@ -56,7 +56,7 @@
     int numBytes() const      { return m_rawtile.numBytes(); }
 
     const QImage& rawtile()   { return m_rawtile; }
-    QImage* tile()            { return &m_rawtile; }
+    QImage *tile()            { return &m_rawtile; }
     const QDateTime & created() const;
 
     // Here we retrieve the color value of the requested pixel on the tile.
--- trunk/KDE/kdeedu/marble/src/lib/TileLoader.cpp #815025:815026
@@ -222,7 +222,7 @@
     connect( tile, SIGNAL( tileUpdateDone() ),
              this, SIGNAL( tileUpdateAvailable() ) );
 
-    tile->loadRawTile( d->m_textureLayer, tileLevel, tilx, tily );
+    tile->loadRawTile( d->m_textureLayer, tileLevel, tilx, tily, &( d->m_tileCache ) \
);  tile->loadTile( false );
 
     // TODO should emit signal rather than directly calling paintTile
@@ -355,7 +355,7 @@
 
         // TODO should emit signal rather than directly calling paintTile
 //         emit paintTile( d->m_tileHash[id], x, y, level, d->m_theme, true );
-        (d->m_tileHash[id])->loadRawTile( d->m_textureLayer, level, x, y ); 
+        (d->m_tileHash[id])->loadRawTile( d->m_textureLayer, level, x, y, &( \
                d->m_tileCache ) ); 
         m_parent->paintTile( d->m_tileHash[id], x, y, level, d->m_textureLayer, true \
);  //         (d->m_tileHash[id]) -> reloadTile( x, y, level, d->m_theme );
     } else {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic