2
Copyright 2007 Dmitry Suzdalev <dimsuz@gmail.com>
4
This program is free software; you can redistribute it and/or modify
5
it under the terms of the GNU General Public License as published by
6
the Free Software Foundation; either version 2 of the License, or
7
(at your option) any later version.
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
GNU General Public License for more details.
14
You should have received a copy of the GNU General Public License
15
along with this program; if not, write to the Free Software
16
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23
#include <KSvgRenderer>
25
#include <kpixmapcache.h>
29
QString KMinesRenderer::elementToSvgId( SvgElement e ) const
33
case KMinesRenderer::CellUp:
35
case KMinesRenderer::CellDown:
37
case KMinesRenderer::Flag:
39
case KMinesRenderer::Question:
41
case KMinesRenderer::Digit1:
43
case KMinesRenderer::Digit2:
45
case KMinesRenderer::Digit3:
47
case KMinesRenderer::Digit4:
49
case KMinesRenderer::Digit5:
51
case KMinesRenderer::Digit6:
53
case KMinesRenderer::Digit7:
55
case KMinesRenderer::Digit8:
57
case KMinesRenderer::Mine:
59
case KMinesRenderer::ExplodedMine:
60
return QString(); // dummy. shouldn't be called
61
case KMinesRenderer::Explosion:
63
case KMinesRenderer::Error:
65
case KMinesRenderer::Hint:
67
case KMinesRenderer::BorderEdgeNorth:
68
return "border.edge.north";
69
case KMinesRenderer::BorderEdgeSouth:
70
return "border.edge.south";
71
case KMinesRenderer::BorderEdgeEast:
72
return "border.edge.east";
73
case KMinesRenderer::BorderEdgeWest:
74
return "border.edge.west";
75
case KMinesRenderer::BorderOutsideCornerNE:
76
return "border.outsideCorner.ne";
77
case KMinesRenderer::BorderOutsideCornerNW:
78
return "border.outsideCorner.nw";
79
case KMinesRenderer::BorderOutsideCornerSW:
80
return "border.outsideCorner.sw";
81
case KMinesRenderer::BorderOutsideCornerSE:
82
return "border.outsideCorner.se";
83
case KMinesRenderer::NumElements:
89
KMinesRenderer* KMinesRenderer::self()
91
static KMinesRenderer instance;
95
KMinesRenderer::KMinesRenderer()
98
m_renderer = new KSvgRenderer();
99
m_cache = new KPixmapCache("kmines-cache");
100
m_cache->setCacheLimit(3*1024);
102
if(!loadTheme( Settings::theme() ))
103
kDebug() << "Failed to load any game theme!";
106
bool KMinesRenderer::loadTheme( const QString& themeName )
108
// variable saying whether to discard old cache upon successful new theme loading
109
// we won't discard it if m_currentTheme is empty meaning that
110
// this is the first time loadTheme() is called
111
// (i.e. during startup) as we want to pick the cache from disc
112
bool discardCache = !m_currentTheme.isEmpty();
114
if( !m_currentTheme.isEmpty() && m_currentTheme == themeName )
116
kDebug() << "Notice: not loading the same theme";
117
return true; // this is not an error
120
m_currentTheme = themeName;
123
if ( themeName.isEmpty() || !theme.load( themeName ) )
125
kDebug()<< "Failed to load theme" << Settings::theme();
126
kDebug() << "Trying to load default";
127
if(!theme.loadDefault())
129
// in this case we need to discard any previously cached theme:
130
// we loading default
132
// set it to something - not be empty - so we
133
// do discard cache on next loadTheme
134
// (see discardCache above)
135
m_currentTheme = "default";
136
Settings::setTheme("themes/default.desktop");
139
bool res = m_renderer->load( theme.graphics() );
140
kDebug() << "loading" << theme.graphics();
146
kDebug() << "discarding cache";
153
QPixmap KMinesRenderer::backgroundPixmap( const QSize& size ) const
156
QString cacheName = QString("mainWidget%1x%2").arg(size.width()).arg(size.height());
157
if(!m_cache->find( cacheName, bkgnd ))
159
kDebug() << "re-rendering bkgnd";
160
bkgnd = QPixmap(size);
161
bkgnd.fill(Qt::transparent);
163
m_renderer->render(&p, "mainWidget");
165
m_cache->insert(cacheName, bkgnd);
166
kDebug() << "cache size:" << m_cache->size() << "kb";
171
KMinesRenderer::~KMinesRenderer()
177
#define RENDER_SVG_ELEMENT(SVG_ID) \
179
m_renderer->render( &p, elementToSvgId(SVG_ID) ); \
182
QPixmap KMinesRenderer::pixmapForCellState( KMinesState::CellState state ) const
187
case KMinesState::Released:
190
QString cacheName = elementToSvgId(CellUp)+QString::number(m_cellSize);
191
if(!m_cache->find(cacheName, pix))
193
// kDebug() << "putting" << cacheName << "to cache";
194
pix = QPixmap(m_cellSize, m_cellSize);
195
pix.fill( Qt::transparent);
196
RENDER_SVG_ELEMENT(CellUp);
197
m_cache->insert(cacheName, pix);
201
case KMinesState::Pressed:
202
case KMinesState::Revealed:// i.e. revealed & digit=0 case
205
QString cacheName = elementToSvgId(CellDown)+QString::number(m_cellSize);
206
if(!m_cache->find(cacheName, pix))
208
// kDebug() << "putting" << cacheName << "to cache";
209
pix = QPixmap(m_cellSize, m_cellSize);
210
pix.fill( Qt::transparent);
211
RENDER_SVG_ELEMENT(CellDown);
212
m_cache->insert(cacheName, pix);
216
case KMinesState::Questioned:
219
QString cacheName = elementToSvgId(Question)+QString::number(m_cellSize);
220
if(!m_cache->find(cacheName, pix))
222
// kDebug() << "putting" << cacheName << "to cache";
223
// question (on top of cellup)
224
pix = pixmapForCellState( KMinesState::Released );
225
RENDER_SVG_ELEMENT(Question);
226
m_cache->insert(cacheName, pix);
230
case KMinesState::Flagged:
233
QString cacheName = elementToSvgId(Flag)+QString::number(m_cellSize);
234
if(!m_cache->find(cacheName, pix))
236
// flag (on top of cellup)
237
// kDebug() << "putting" << cacheName << "to cache";
238
pix = pixmapForCellState( KMinesState::Released );
239
RENDER_SVG_ELEMENT(Flag);
240
m_cache->insert(cacheName, pix);
244
case KMinesState::Error:
247
QString cacheName = elementToSvgId(Error)+QString::number(m_cellSize);
248
if(!m_cache->find(cacheName, pix))
250
// kDebug() << "putting" << cacheName << "to cache";
251
// flag (on top of mine)
253
RENDER_SVG_ELEMENT(Error);
254
m_cache->insert(cacheName, pix);
258
case KMinesState::Hint:
261
QString cacheName = elementToSvgId(Hint)+QString::number(m_cellSize);
262
if(!m_cache->find(cacheName, pix))
264
// kDebug() << "putting" << cacheName << "to cache";
265
// hint (on top of cellup)
266
pix = pixmapForCellState( KMinesState::Released );
267
RENDER_SVG_ELEMENT(Hint);
268
m_cache->insert(cacheName, pix);
272
// no default! this way we'll get compiler warnings if
273
// something is forgotten
278
QPixmap KMinesRenderer::pixmapForDigitElement( int digit ) const
280
KMinesRenderer::SvgElement e;
282
e = KMinesRenderer::Digit1;
284
e = KMinesRenderer::Digit2;
286
e = KMinesRenderer::Digit3;
288
e = KMinesRenderer::Digit4;
290
e = KMinesRenderer::Digit5;
292
e = KMinesRenderer::Digit6;
294
e = KMinesRenderer::Digit7;
296
e = KMinesRenderer::Digit8;
302
QString cacheName = elementToSvgId(e)+QString::number(m_cellSize);
303
if(!m_cache->find(cacheName, pix))
305
// kDebug() << "putting" << cacheName << "to cache";
306
// digit (on top of celldown)
307
pix = pixmapForCellState( KMinesState::Pressed );
308
RENDER_SVG_ELEMENT(e);
309
m_cache->insert(cacheName, pix);
314
QPixmap KMinesRenderer::pixmapMine() const
318
QString cacheName = elementToSvgId(Mine)+QString::number(m_cellSize);
319
if(!m_cache->find(cacheName, pix))
321
// kDebug() << "putting" << cacheName << "to cache";
322
// mine (on top of celldown)
323
pix = pixmapForCellState( KMinesState::Pressed );
324
RENDER_SVG_ELEMENT(Mine);
325
m_cache->insert(cacheName, pix);
330
QPixmap KMinesRenderer::pixmapExplodedMine() const
334
QString cacheName = elementToSvgId(Explosion)+QString::number(m_cellSize);
335
if(!m_cache->find(cacheName, pix))
337
// kDebug() << "putting" << cacheName << "to cache";
338
// mine (on top of celldown)
339
pix = pixmapForCellState( KMinesState::Pressed );
340
RENDER_SVG_ELEMENT(Explosion);
341
RENDER_SVG_ELEMENT(Mine);
342
m_cache->insert(cacheName, pix);
347
QPixmap KMinesRenderer::pixmapForBorderElement(KMinesState::BorderElement e) const
349
SvgElement svgel = NumElements; // invalid
352
case KMinesState::BorderNorth:
353
svgel = BorderEdgeNorth;
355
case KMinesState::BorderSouth:
356
svgel = BorderEdgeSouth;
358
case KMinesState::BorderEast:
359
svgel = BorderEdgeEast;
361
case KMinesState::BorderWest:
362
svgel = BorderEdgeWest;
364
case KMinesState::BorderCornerNW:
365
svgel = BorderOutsideCornerNW;
367
case KMinesState::BorderCornerSW:
368
svgel = BorderOutsideCornerSW;
370
case KMinesState::BorderCornerNE:
371
svgel = BorderOutsideCornerNE;
373
case KMinesState::BorderCornerSE:
374
svgel = BorderOutsideCornerSE;
380
QString cacheName = elementToSvgId(svgel)+QString::number(m_cellSize);
381
if(!m_cache->find(cacheName, pix))
383
// kDebug() << "putting" << cacheName << "to cache";
384
pix = QPixmap(m_cellSize, m_cellSize);
385
pix.fill( Qt::transparent);
386
RENDER_SVG_ELEMENT(svgel);
387
m_cache->insert(cacheName, pix);
392
void KMinesRenderer::setCellSize( int size )