mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
Further work on the svg cache
This commit is contained in:
parent
651259a80c
commit
48aa535a29
@ -16,6 +16,41 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include "qgssvgcache.h"
|
||||
#include <QDomDocument>
|
||||
#include <QFile>
|
||||
#include <QImage>
|
||||
#include <QPicture>
|
||||
|
||||
QgsSvgCacheEntry::QgsSvgCacheEntry(): file( QString() ), size( 0 ), outlineWidth( 0 ), widthScaleFactor( 1.0 ), rasterScaleFactor( 1.0 ), fill( Qt::black ),
|
||||
outline( Qt::black ), image( 0 ), picture( 0 )
|
||||
{
|
||||
}
|
||||
|
||||
QgsSvgCacheEntry::QgsSvgCacheEntry( const QString& f, double s, double ow, double wsf, double rsf, const QColor& fi, const QColor& ou ): file( f ), size( s ), outlineWidth( ow ),
|
||||
widthScaleFactor( wsf ), rasterScaleFactor( rsf ), fill( fi ), outline( ou ), image( 0 ), picture( 0 )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
QgsSvgCacheEntry::~QgsSvgCacheEntry()
|
||||
{
|
||||
delete image;
|
||||
delete picture;
|
||||
}
|
||||
|
||||
bool QgsSvgCacheEntry::operator==( const QgsSvgCacheEntry& other ) const
|
||||
{
|
||||
return ( other.file == file && other.size == size && other.outlineWidth == outlineWidth && other.widthScaleFactor == widthScaleFactor
|
||||
&& other.rasterScaleFactor == rasterScaleFactor && other.fill == fill && other.outline == outline );
|
||||
}
|
||||
|
||||
QString file;
|
||||
double size;
|
||||
double outlineWidth;
|
||||
double widthScaleFactor;
|
||||
double rasterScaleFactor;
|
||||
QColor fill;
|
||||
QColor outline;
|
||||
|
||||
QgsSvgCache* QgsSvgCache::mInstance = 0;
|
||||
|
||||
@ -37,23 +72,93 @@ QgsSvgCache::~QgsSvgCache()
|
||||
}
|
||||
|
||||
|
||||
const QImage& QgsSvgCache::svgAsImage( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth ) const
|
||||
const QImage& QgsSvgCache::svgAsImage( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
|
||||
double widthScaleFactor, double rasterScaleFactor )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
const QPicture& QgsSvgCache::svgAsPicture( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
|
||||
double widthScaleFactor, double rasterScaleFactor )
|
||||
{
|
||||
//search entries in mEntryLookup
|
||||
QgsSvgCacheEntry* currentEntry = 0;
|
||||
QList<QgsSvgCacheEntry*> entries = mEntryLookup.values( file );
|
||||
|
||||
QList<QgsSvgCacheEntry*>::iterator entryIt = entries.begin();
|
||||
for(; entryIt != entries.end(); ++entryIt )
|
||||
{
|
||||
QgsSvgCacheEntry* cacheEntry = *entryIt;
|
||||
if( cacheEntry->file == file && cacheEntry->size == size && cacheEntry->fill == fill && cacheEntry->outline == outline &&
|
||||
cacheEntry->outlineWidth == outlineWidth && cacheEntry->widthScaleFactor == widthScaleFactor && cacheEntry->rasterScaleFactor == rasterScaleFactor)
|
||||
{
|
||||
currentEntry = cacheEntry;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//if not found: create new entry
|
||||
//cache and replace params in svg content
|
||||
if( !currentEntry )
|
||||
{
|
||||
currentEntry = insertSVG( file, size, fill, outline, outlineWidth, widthScaleFactor, rasterScaleFactor );
|
||||
}
|
||||
|
||||
//if current entry image is 0: cache image for entry
|
||||
//update stats for memory usage
|
||||
if( !currentEntry->picture )
|
||||
{
|
||||
cachePicture( currentEntry );
|
||||
}
|
||||
|
||||
//update lastUsed with current date time
|
||||
|
||||
return *( currentEntry->picture );
|
||||
}
|
||||
|
||||
QgsSvgCacheEntry* QgsSvgCache::insertSVG( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
|
||||
double widthScaleFactor, double rasterScaleFactor )
|
||||
{
|
||||
QgsSvgCacheEntry* entry = new QgsSvgCacheEntry( file, size, outlineWidth, widthScaleFactor, rasterScaleFactor, fill, outline );
|
||||
entry->lastUsed = QDateTime::currentDateTime();
|
||||
|
||||
replaceParamsAndCacheSvg( entry );
|
||||
|
||||
mEntries.insert( entry->lastUsed, entry );
|
||||
mEntryLookup.insert( file, entry );
|
||||
return entry;
|
||||
}
|
||||
|
||||
void QgsSvgCache::replaceParamsAndCacheSvg( QgsSvgCacheEntry* entry )
|
||||
{
|
||||
if( !entry )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QFile svgFile( entry->file );
|
||||
if( !svgFile.open( QIODevice::ReadOnly ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QDomDocument svgDoc;
|
||||
if( !svgDoc.setContent( &svgFile ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//todo: replace params here
|
||||
|
||||
entry->svgContent = svgDoc.toByteArray();
|
||||
}
|
||||
|
||||
void QgsSvgCache::cacheImage( QgsSvgCacheEntry* entry )
|
||||
{
|
||||
}
|
||||
|
||||
const QPicture& QgsSvgCache::svgAsPicture( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth ) const
|
||||
{
|
||||
}
|
||||
|
||||
void QgsSvgCache::insertSVG( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth )
|
||||
{
|
||||
}
|
||||
|
||||
void QgsSvgCache::cacheImage( QgsSvgCacheEntry )
|
||||
{
|
||||
}
|
||||
|
||||
void QgsSvgCache::cachePicture( QgsSvgCacheEntry )
|
||||
void QgsSvgCache::cachePicture( QgsSvgCacheEntry *entry )
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -29,14 +29,25 @@ class QPicture;
|
||||
|
||||
struct QgsSvgCacheEntry
|
||||
{
|
||||
QgsSvgCacheEntry();
|
||||
QgsSvgCacheEntry( const QString& file, double size, double outlineWidth, double widthScaleFactor, double rasterScaleFctor, const QColor& fill, const QColor& outline );
|
||||
~QgsSvgCacheEntry();
|
||||
|
||||
QString file;
|
||||
double size;
|
||||
double outlineWidth;
|
||||
double widthScaleFactor;
|
||||
double rasterScaleFactor;
|
||||
QColor fill;
|
||||
QColor outline;
|
||||
QImage* image;
|
||||
QPicture* picture;
|
||||
QDateTime lastUsed;
|
||||
//content (with params replaced)
|
||||
QByteArray svgContent;
|
||||
|
||||
/**Don't consider image, picture, last used timestamp for comparison*/
|
||||
bool operator==( const QgsSvgCacheEntry& other ) const;
|
||||
};
|
||||
|
||||
/**A cache for images / pictures derived from svg files. This class supports parameter replacement in svg files
|
||||
@ -49,21 +60,27 @@ class QgsSvgCache
|
||||
static QgsSvgCache* instance();
|
||||
~QgsSvgCache();
|
||||
|
||||
const QImage& svgAsImage( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth ) const;
|
||||
const QPicture& svgAsPicture( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth ) const;
|
||||
const QImage& svgAsImage( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
|
||||
double widthScaleFactor, double rasterScaleFactor );
|
||||
const QPicture& svgAsPicture( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
|
||||
double widthScaleFactor, double rasterScaleFactor );
|
||||
|
||||
protected:
|
||||
QgsSvgCache();
|
||||
|
||||
void insertSVG( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth );
|
||||
void cacheImage( QgsSvgCacheEntry );
|
||||
void cachePicture( QgsSvgCacheEntry );
|
||||
/**Creates new cache entry and returns pointer to it*/
|
||||
QgsSvgCacheEntry* insertSVG( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
|
||||
double widthScaleFactor, double rasterScaleFactor );
|
||||
|
||||
void replaceParamsAndCacheSvg( QgsSvgCacheEntry* entry );
|
||||
void cacheImage( QgsSvgCacheEntry* entry );
|
||||
void cachePicture( QgsSvgCacheEntry* entry );
|
||||
|
||||
private:
|
||||
static QgsSvgCache* mInstance;
|
||||
|
||||
/**Entries sorted by last used time*/
|
||||
QMap< QDateTime, QgsSvgCacheEntry > mEntries;
|
||||
QMap< QDateTime, QgsSvgCacheEntry* > mEntries;
|
||||
/**Entry pointers accessible by file name*/
|
||||
QMultiHash< QString, QgsSvgCacheEntry* > mEntryLookup;
|
||||
/**Estimated total size of all images and pictures*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user