QSharedPointer<QGeoTileTexture> QGeoTileCache::get(const QGeoTileSpec &spec) { QSharedPointer<QGeoTileTexture> tt = textureCache_.object(spec); if (tt) return tt; QSharedPointer<QGeoCachedTileMemory> tm = memoryCache_.object(spec); if (tm) { QPixmap pixmap; if (!pixmap.loadFromData(tm->bytes)) { handleError(spec, QLatin1String("Problem with tile image")); return QSharedPointer<QGeoTileTexture>(0); } QSharedPointer<QGeoTileTexture> tt = addToTextureCache(spec, pixmap); if (tt) return tt; } QSharedPointer<QGeoCachedTileDisk> td = diskCache_.object(spec); if (td) { QStringList parts = td->filename.split('.'); QFile file(td->filename); file.open(QIODevice::ReadOnly); QByteArray bytes = file.readAll(); file.close(); QPixmap pixmap; const char *format = (parts.size() == 2 ? parts.at(1).toLocal8Bit().constData() : 0); if (!pixmap.loadFromData(bytes, format)) { handleError(spec, QLatin1String("Problem with tile image")); return QSharedPointer<QGeoTileTexture>(0); } addToMemoryCache(spec, bytes, (parts.size() == 2 ? parts.at(1) : QLatin1String(""))); QSharedPointer<QGeoTileTexture> tt = addToTextureCache(td->spec, pixmap); if (tt) return tt; } return QSharedPointer<QGeoTileTexture>(); }
void QGeoTileCache::insert(const QGeoTileSpec &spec, const QByteArray &bytes, const QString &format, QGeoTiledMappingManagerEngine::CacheAreas areas) { if (areas & QGeoTiledMappingManagerEngine::DiskCache) { QString filename = tileSpecToFilename(spec, format, directory_); QFile file(filename); file.open(QIODevice::WriteOnly); file.write(bytes); file.close(); addToDiskCache(spec, filename); } if (areas & QGeoTiledMappingManagerEngine::MemoryCache) { addToMemoryCache(spec, bytes, format); } /* inserts do not hit the texture cache -- this actually reduces overall * cache hit rates because many tiles come too late to be useful * and act as a poison */ }