Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgstilecache.h 3 : : -------------------------------------- 4 : : Date : September 2016 5 : : Copyright : (C) 2016 by Martin Dobias 6 : : Email : wonder dot sk at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #include "qgstilecache.h" 17 : : 18 : : #include "qgsnetworkaccessmanager.h" 19 : : #include "qgsapplication.h" 20 : : #include <QAbstractNetworkCache> 21 : : #include <QImage> 22 : : #include <QUrl> 23 : : 24 : 5 : QCache<QUrl, QImage> QgsTileCache::sTileCache( 256 ); 25 : 5 : QMutex QgsTileCache::sTileCacheMutex; 26 : : 27 : : 28 : 0 : void QgsTileCache::insertTile( const QUrl &url, const QImage &image ) 29 : : { 30 : 0 : QMutexLocker locker( &sTileCacheMutex ); 31 : 0 : sTileCache.insert( url, new QImage( image ) ); 32 : 0 : } 33 : : 34 : 0 : bool QgsTileCache::tile( const QUrl &url, QImage &image ) 35 : : { 36 : 0 : QMutexLocker locker( &sTileCacheMutex ); 37 : 0 : bool success = false; 38 : 0 : if ( QImage *i = sTileCache.object( url ) ) 39 : : { 40 : 0 : image = *i; 41 : 0 : success = true; 42 : 0 : } 43 : 0 : else if ( QgsNetworkAccessManager::instance()->cache()->metaData( url ).isValid() ) 44 : : { 45 : 0 : if ( QIODevice *data = QgsNetworkAccessManager::instance()->cache()->data( url ) ) 46 : : { 47 : 0 : QByteArray imageData = data->readAll(); 48 : 0 : delete data; 49 : : 50 : 0 : image = QImage::fromData( imageData ); 51 : : 52 : : // cache it as well (mutex is already locked) 53 : : // Check for null because it could be a redirect (see: https://github.com/qgis/QGIS/issues/24336 ) 54 : 0 : if ( ! image.isNull( ) ) 55 : : { 56 : 0 : sTileCache.insert( url, new QImage( image ) ); 57 : 0 : success = true; 58 : 0 : } 59 : 0 : } 60 : 0 : } 61 : 0 : return success; 62 : 0 : } 63 : : 64 : 0 : int QgsTileCache::totalCost() 65 : : { 66 : 0 : QMutexLocker locker( &sTileCacheMutex ); 67 : 0 : return sTileCache.totalCost(); 68 : 0 : } 69 : : 70 : 0 : int QgsTileCache::maxCost() 71 : : { 72 : 0 : QMutexLocker locker( &sTileCacheMutex ); 73 : 0 : return sTileCache.maxCost(); 74 : 0 : }