From kde-commits Sat May 31 23:33:35 2008 From: Torsten Rahn Date: Sat, 31 May 2008 23:33:35 +0000 To: kde-commits Subject: KDE/kdeedu/marble Message-Id: <1212276815.128399.22722.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=121227682315725 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 + + * 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 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 *cache ) +void TextureTile::loadRawTile( GeoSceneTexture *textureLayer, int level, int x, int y, QCache *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 *cache = 0 ); + void loadRawTile( GeoSceneTexture *textureLayer, int level, int x, int y, QCache *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 {