bool AreaNodeIndex::GetIndexEntry(FileOffset offset, LeafCache::CacheRef& cacheRef) const { if (!leafCache.GetEntry(offset,cacheRef)) { LeafCache::CacheEntry cacheEntry(offset); cacheRef=leafCache.SetEntry(cacheEntry); if (!scanner.IsOpen()) { if (!scanner.Open(datafilename)) { std::cerr << "Error while opening " << datafilename << " for reading!" << std::endl; return false; } } scanner.SetPos(offset); uint32_t offsetCount; scanner.ReadNumber(cacheRef->value.children[0]); scanner.ReadNumber(cacheRef->value.children[1]); scanner.ReadNumber(cacheRef->value.children[2]); scanner.ReadNumber(cacheRef->value.children[3]); scanner.ReadNumber(offsetCount); cacheRef->value.offsets.resize(offsetCount); for (size_t i=0; i<offsetCount; i++) { scanner.ReadNumber(cacheRef->value.offsets[i]); } } return !scanner.HasError(); }
void SFtpFileEngine::initSFtp() { _fileInfoCache = FtpFileInfoCache::getInstance(); QString cacheEntry(getCachePath(_path)); QUrlInfo urlInfo = _fileInfoCache->findFileInfo(cacheEntry); if (urlInfo.isValid()) { // non-existent file ? if (urlInfo.permissions() == 0) { _fileFlags = QAbstractFileEngine::FileType; return; } _fileFlags = QAbstractFileEngine::ExistsFlag; _fileFlags |= urlInfo.isDir() ? QAbstractFileEngine::DirectoryType : QAbstractFileEngine::FileType; if (_path == "/") _fileFlags |= QAbstractFileEngine::RootFlag; _fileFlags |= QAbstractFileEngine::FileFlag(urlInfo.permissions()); _urlInfo = urlInfo; return; } refreshFileInfoCache(); }
QImage QgsSvgCache::svgAsImage( const QString &file, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, bool &fitsInCache, double fixedAspectRatio ) { QMutexLocker locker( &mMutex ); fitsInCache = true; QgsSvgCacheEntry *currentEntry = cacheEntry( file, size, fill, stroke, strokeWidth, widthScaleFactor, fixedAspectRatio ); QImage result; //if current entry image is 0: cache image for entry // checks to see if image will fit into cache //update stats for memory usage if ( !currentEntry->image ) { QSvgRenderer r( currentEntry->svgContent ); double hwRatio = 1.0; if ( r.viewBoxF().width() > 0 ) { if ( currentEntry->fixedAspectRatio > 0 ) { hwRatio = currentEntry->fixedAspectRatio; } else { hwRatio = r.viewBoxF().height() / r.viewBoxF().width(); } } long cachedDataSize = 0; cachedDataSize += currentEntry->svgContent.size(); cachedDataSize += static_cast< int >( currentEntry->size * currentEntry->size * hwRatio * 32 ); if ( cachedDataSize > MAXIMUM_SIZE / 2 ) { fitsInCache = false; currentEntry->image.reset(); // instead cache picture if ( !currentEntry->picture ) { cachePicture( currentEntry, false ); } // ...and render cached picture to result image result = imageFromCachedPicture( *currentEntry ); } else { cacheImage( currentEntry ); result = *( currentEntry->image ); } trimToMaximumSize(); } else { result = *( currentEntry->image ); } return result; }
QSizeF QgsSvgCache::svgViewboxSize( const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, double fixedAspectRatio ) { QMutexLocker locker( &mMutex ); QgsSvgCacheEntry *currentEntry = cacheEntry( path, size, fill, stroke, strokeWidth, widthScaleFactor, fixedAspectRatio ); return currentEntry->viewboxSize; }
QSizeF QgsSvgCache::svgViewboxSize( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth, double widthScaleFactor, double rasterScaleFactor ) { QMutexLocker locker( &mMutex ); QgsSvgCacheEntry *currentEntry = cacheEntry( file, size, fill, outline, outlineWidth, widthScaleFactor, rasterScaleFactor ); return currentEntry->viewboxSize; }
const QByteArray& QgsSvgCache::svgContent( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth, double widthScaleFactor, double rasterScaleFactor ) { QMutexLocker locker( &mMutex ); QgsSvgCacheEntry *currentEntry = cacheEntry( file, size, fill, outline, outlineWidth, widthScaleFactor, rasterScaleFactor ); return currentEntry->svgContent; }
const QPicture& QgsSvgCache::svgAsPicture( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth, double widthScaleFactor, double rasterScaleFactor, bool forceVectorOutput ) { QgsSvgCacheEntry* currentEntry = cacheEntry( file, size, fill, outline, outlineWidth, widthScaleFactor, rasterScaleFactor ); //if current entry picture is 0: cache picture for entry //update stats for memory usage if ( !currentEntry->picture ) { cachePicture( currentEntry, forceVectorOutput ); trimToMaximumSize(); } return *( currentEntry->picture ); }
const QImage& QgsSvgCache::svgAsImage( const QString& file, int size, const QColor& fill, const QColor& outline, double outlineWidth, double widthScaleFactor, double rasterScaleFactor ) { QgsSvgCacheEntry* currentEntry = cacheEntry( file, size, fill, outline, outlineWidth, widthScaleFactor, rasterScaleFactor ); //if current entry image is 0: cache image for entry //update stats for memory usage if ( !currentEntry->image ) { cacheImage( currentEntry ); trimToMaximumSize(); } return *( currentEntry->image ); }
QPicture QgsSvgCache::svgAsPicture( const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, bool forceVectorOutput, double fixedAspectRatio ) { QMutexLocker locker( &mMutex ); QgsSvgCacheEntry *currentEntry = cacheEntry( path, size, fill, stroke, strokeWidth, widthScaleFactor, fixedAspectRatio ); //if current entry picture is 0: cache picture for entry //update stats for memory usage if ( !currentEntry->picture ) { cachePicture( currentEntry, forceVectorOutput ); trimToMaximumSize(); } return *( currentEntry->picture ); }
const QImage& QgsSvgCache::svgAsImage( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth, double widthScaleFactor, double rasterScaleFactor, bool& fitsInCache ) { QMutexLocker locker( &mMutex ); fitsInCache = true; QgsSvgCacheEntry* currentEntry = cacheEntry( file, size, fill, outline, outlineWidth, widthScaleFactor, rasterScaleFactor ); //if current entry image is 0: cache image for entry // checks to see if image will fit into cache //update stats for memory usage if ( !currentEntry->image ) { QSvgRenderer r( currentEntry->svgContent ); double hwRatio = 1.0; if ( r.viewBoxF().width() > 0 ) { hwRatio = r.viewBoxF().height() / r.viewBoxF().width(); } long cachedDataSize = 0; cachedDataSize += currentEntry->svgContent.size(); cachedDataSize += ( int )( currentEntry->size * currentEntry->size * hwRatio * 32 ); if ( cachedDataSize > mMaximumSize / 2 ) { fitsInCache = false; delete currentEntry->image; currentEntry->image = 0; //currentEntry->image = new QImage( 0, 0 ); // instead cache picture if ( !currentEntry->picture ) { cachePicture( currentEntry, false ); } } else { cacheImage( currentEntry ); } trimToMaximumSize(); } return *( currentEntry->image ); }
/** * Return the tile with the given id. If the tile is not currently cached * return an empty and unassigned tile and move it to the front of the cache. */ TileRef DataTileCache::GetTile(const TileId& id) const { std::map<TileId,CacheRef>::iterator existingEntry=tileIndex.find(id); if (existingEntry==tileIndex.end()) { TileRef tile(new Tile(id)); // Updating cache CacheEntry cacheEntry(id,tile); tileCache.push_front(cacheEntry); tileIndex[id]=tileCache.begin(); return tile; } else { tileCache.splice(tileCache.begin(),tileCache,existingEntry->second); existingEntry->second=tileCache.begin(); return existingEntry->second->tile; } }
QPicture QgsSvgCache::svgAsPicture( const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, bool forceVectorOutput, double fixedAspectRatio ) { QMutexLocker locker( &mMutex ); QgsSvgCacheEntry *currentEntry = cacheEntry( path, size, fill, stroke, strokeWidth, widthScaleFactor, fixedAspectRatio ); //if current entry picture is 0: cache picture for entry //update stats for memory usage if ( !currentEntry->picture ) { cachePicture( currentEntry, forceVectorOutput ); trimToMaximumSize(); } QPicture p; // For some reason p.detach() doesn't seem to always work as intended, at // least with QT 5.5 on Ubuntu 16.04 // Serialization/deserialization is a safe way to be ensured we don't // share a copy. p.setData( currentEntry->picture->data(), currentEntry->picture->size() ); return p; }
bool AreaAreaIndex::GetIndexCell(const TypeConfig& typeConfig, uint32_t level, FileOffset offset, IndexCache::CacheRef& cacheRef) const { if (!indexCache.GetEntry(offset,cacheRef)) { IndexCache::CacheEntry cacheEntry(offset); cacheRef=indexCache.SetEntry(cacheEntry); if (!scanner.IsOpen()) { if (!scanner.Open(datafilename,FileScanner::LowMemRandom,true)) { log.Error() << "Error while opening '" << scanner.GetFilename() << "' for reading!"; return false; } } scanner.SetPos(offset); // Read offsets of children if not in the bottom level if (level<maxLevel) { for (size_t c=0; c<4; c++) { if (!scanner.ReadNumber(cacheRef->value.children[c])) { log.Error() << "Cannot read index data at offset " << offset << " in file '" << scanner.GetFilename() << "'"; return false; } } } else { for (size_t c=0; c<4; c++) { cacheRef->value.children[c]=0; } } // Now read the way offsets by type in this index entry uint32_t offsetCount; // Areas if (!scanner.ReadNumber(offsetCount)) { log.Error() << "Cannot read index data for level " << level << " at offset " << offset << " in file '" << scanner.GetFilename() << "'"; return false; } cacheRef->value.areas.resize(offsetCount); FileOffset prevOffset=0; for (size_t c=0; c<offsetCount; c++) { if (!scanner.ReadTypeId(cacheRef->value.areas[c].type, typeConfig.GetAreaTypeIdBytes())) { log.Error() << "Cannot read index data for level " << level << " at offset " << offset << " in file '" << scanner.GetFilename() << "'"; return false; } if (!scanner.ReadNumber(cacheRef->value.areas[c].offset)) { log.Error() << "Cannot read index data for level " << level << " at offset " << offset << " in file '" << scanner.GetFilename() << "'"; return false; } cacheRef->value.areas[c].offset+=prevOffset; prevOffset=cacheRef->value.areas[c].offset; } } return true; }