-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
qgssvgcache.cpp
118 lines (98 loc) · 3.35 KB
/
qgssvgcache.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/***************************************************************************
qgssvgcache.cpp - SVG rendering and pixmap caching
-------------------
begin : Sat Jul 17 2004
copyright : (C) 2004 by Lars Luthman
email : larsl at users dot sourceforge dot org
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
/* $Id$ */
#include <iostream>
#include <qimage.h>
#include <qpainter.h>
#include <q3picture.h>
#include <qsettings.h>
#include <qmessagebox.h>
#include "qgssvgcache.h"
//Added by qt3to4:
#include <QPixmap>
#include <QSvgRenderer>
QgsSVGCache::QgsSVGCache() {
QSettings settings;
pixelLimit = settings.readNumEntry("/qgis/svgcachesize", 200000);
totalPixels = 0;
}
QgsSVGCache::~QgsSVGCache()
{
//QMapIterator<QString, QSvgRenderer *> i(pictureMap);
//while (i.hasNext()) {
// i.next();
// delete i.value() ;
//}
//pictureMap.clear();
}
QSvgRenderer * QgsSVGCache::getPicture(QString filename)
{
PictureMap::const_iterator i = pictureMap.find(filename);
while (i != pictureMap.end())
{
return (*i).second ;
}
QSvgRenderer * mySVG;
mySVG->load(filename);
pictureMap[filename] = mySVG;
return mySVG;
}
QPixmap QgsSVGCache::getPixmap(QString filename, double scaleFactor)
{
// make the symbols smaller
std::pair<QString, double> myPair(filename, scaleFactor) ;
PixmapMap::iterator i = pixmapMap.find(myPair);
while (i != pixmapMap.end())
{
QPixmap myPixmap = i->second ;
return myPixmap;
}
// if not, try to load it
#if QGISDEBUG > 2
std::cerr<<"SVGCACHE: loading "<<filename<<"["<<scaleFactor<<"]"<<std::endl;
#endif
QSvgRenderer mySVG;
mySVG.load(filename);
// TODO Change this logic so width is scaleFactor and height is same
// proportion of scale factor as in oritignal SVG TS XXX
/*
int width=mySVG.defaultSize().width();
width=static_cast<int>(static_cast<double>(width)*scaleFactor);
int height=mySVG.defaultSize().height();
height=static_cast<int>(static_cast<double>(height)*scaleFactor);
//prevent 0 width or height, which would cause a crash
if (width == 0) {
width = 1;
}
if (height == 0) {
height = 1;
}
*/
if (scaleFactor < 1) scaleFactor=1;
//QPixmap myPixmap = QPixmap(width,height);
QPixmap myPixmap = QPixmap(scaleFactor,scaleFactor);
myPixmap.fill(QColor(255,255,255,0)); //transparent
QPainter myPainter(&myPixmap);
myPainter.setRenderHint(QPainter::Antialiasing);
mySVG.render(&myPainter);
pixmapMap[std::pair<QString, double>(filename, scaleFactor)] = myPixmap;
return myPixmap;
}
void QgsSVGCache::clear() {
pixmapMap.clear();
fifo = std::queue<std::pair<QString, double> >();
totalPixels = 0;
}