• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegames API Reference
  • KDE Home
  • Contact Us
 

kigo

  • sources
  • kde-4.14
  • kdegames
  • kigo
  • src
  • gui
  • graphicsview
themerenderer.cpp
Go to the documentation of this file.
1 /*
2  Copyright 2008 Sascha Peilicke <sasch.pe@gmx.de>
3 
4  This program is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public License as
6  published by the Free Software Foundation; either version 2 of
7  the License or (at your option) version 3 or any later version
8  accepted by the membership of KDE e.V. (or its successor approved
9  by the membership of KDE e.V.), which shall act as a proxy
10  defined in Section 14 of version 3 of the license.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #include "themerenderer.h"
22 #include "preferences.h"
23 
24 #include <QSvgRenderer>
25 #include <KPixmapCache>
26 #include <KDebug>
27 
28 #define USE_UNSTABLE_LIBKDEGAMESPRIVATE_API
29 #include <libkdegamesprivate/kgametheme.h>
30 
31 #include <QPixmap>
32 #include <QPainter>
33 
34 namespace Kigo {
35 
36 ThemeRenderer::ThemeRenderer()
37  : m_renderer(new QSvgRenderer)
38  , m_cache(new KPixmapCache("kigo-cache"))
39 {
40  m_cache->setCacheLimit(3 * 1024);
41  if (!loadTheme(Preferences::theme())) {
42  kDebug() << "Failed to load any game theme!";
43  }
44 }
45 
46 ThemeRenderer::~ThemeRenderer()
47 {
48  delete m_cache;
49  delete m_renderer;
50 }
51 
52 bool ThemeRenderer::loadTheme(const QString &themeName)
53 {
54  bool discardCache = !m_currentTheme.isEmpty();
55 
56  if (!m_currentTheme.isEmpty() && m_currentTheme == themeName) {
57  // kDebug() << "Notice: Loading the same theme";
58  return true; // We don't have to do anything
59  }
60 
61  m_currentTheme = themeName;
62 
63  KGameTheme theme;
64  if (themeName.isEmpty() || !theme.load(themeName)) {
65  // kDebug() << "Failed to load theme" << Preferences::theme();
66  // kDebug() << "Trying to load default";
67  if (!theme.loadDefault())
68  return true;
69 
70  discardCache = true;
71  m_currentTheme = "default";
72  }
73 
74  // kDebug() << "Loading" << theme.graphics();
75  if (!m_renderer->load(theme.graphics()))
76  return false;
77 
78  if (discardCache) {
79  // kDebug() << "Discarding cache";
80  m_cache->discard();
81  }
82  emit themeChanged(m_currentTheme);
83  return true;
84 }
85 
86 void ThemeRenderer::renderElement(Element element, QPainter *painter, const QRectF &rect) const
87 {
88  if (!m_renderer->isValid() || rect.isEmpty() || painter == 0)
89  return;
90 
91  QPixmap pixmap = renderElement(element, rect.size().toSize());
92 
93  // Draw pixmap with the parameter provided painter
94  painter->drawPixmap(static_cast<int>(rect.x()), static_cast<int>(rect.y()), pixmap);
95 }
96 
97 QPixmap ThemeRenderer::renderElement(Element element, const QSize &size) const
98 {
99  if (!m_renderer->isValid() || size.isEmpty())
100  return QPixmap();
101 
102  // Determine which board element we have to render and set the cache item name
103  QString cacheName;
104  switch (element) {
105  case Background:
106  cacheName = QString("background_%1x%2").arg(size.width()).arg(size.height());
107  break;
108  case Board:
109  cacheName = QString("board_%1x%2").arg(size.width()).arg(size.height());
110  break;
111  case HandicapMark:
112  cacheName = QString("handicap_mark_%1x%2").arg(size.width()).arg(size.height());
113  break;
114  case WhiteStone:
115  cacheName = QString("white_stone_%1x%2").arg(size.width()).arg(size.height());
116  break;
117  case WhiteStoneTransparent:
118  cacheName = QString("white_stone_%1x%2_trans").arg(size.width()).arg(size.height());
119  break;
120  case WhiteTerritory:
121  cacheName = QString("white_territory_%1x%2").arg(size.width()).arg(size.height());
122  break;
123  case BlackStone:
124  cacheName = QString("black_stone_%1x%2").arg(size.width()).arg(size.height());
125  break;
126  case BlackStoneTransparent:
127  cacheName = QString("black_stone_%1x%2_trans").arg(size.width()).arg(size.height());
128  break;
129  case BlackTerritory:
130  cacheName = QString("black_territory_%1x%2").arg(size.width()).arg(size.height());
131  break;
132  case PlacementMarker:
133  cacheName = QString("placement_marker_%1x%2").arg(size.width()).arg(size.height());
134  break;
135  }
136 
137  // Check if board element is already in cache, if not render it
138  QPixmap pixmap;
139  if (!m_cache->find(cacheName, pixmap)) {
140  pixmap = QPixmap(size);
141  pixmap.fill(Qt::transparent);
142  QPainter p(&pixmap);
143  switch (element) {
144  case Background:
145  m_renderer->render(&p, "background");
146  break;
147  case Board:
148  m_renderer->render(&p, "board");
149  break;
150  case HandicapMark:
151  m_renderer->render(&p, "handicap_mark");
152  break;
153  case WhiteStone:
154  m_renderer->render(&p, "white_stone");
155  break;
156  case WhiteStoneTransparent:
157  p.setOpacity(0.5);
158  m_renderer->render(&p, "white_stone");
159  break;
160  case WhiteTerritory:
161  m_renderer->render(&p, "white_territory");
162  break;
163  case BlackStone:
164  m_renderer->render(&p, "black_stone");
165  break;
166  case BlackStoneTransparent:
167  p.setOpacity(0.5);
168  m_renderer->render(&p, "black_stone");
169  break;
170  case BlackTerritory:
171  m_renderer->render(&p, "black_territory");
172  break;
173  case PlacementMarker:
174  m_renderer->render(&p, "placement_marker");
175  break;
176  }
177  m_cache->insert(cacheName, pixmap);
178  }
179  return pixmap;
180 }
181 
182 QSize ThemeRenderer::elementSize(Element element) const
183 {
184  QRectF sizeRect;
185  switch(element) {
186  case Background:
187  sizeRect = m_renderer->boundsOnElement("background");
188  break;
189  case Board:
190  sizeRect = m_renderer->boundsOnElement("board");
191  break;
192  case HandicapMark:
193  sizeRect = m_renderer->boundsOnElement("handicap_mark");
194  break;
195  case WhiteStone:
196  sizeRect = m_renderer->boundsOnElement("white_stone");
197  break;
198  case WhiteStoneTransparent:
199  sizeRect = m_renderer->boundsOnElement("white_stone");
200  break;
201  case WhiteTerritory:
202  sizeRect = m_renderer->boundsOnElement("white_territory");
203  break;
204  case BlackStone:
205  sizeRect = m_renderer->boundsOnElement("black_stone");
206  break;
207  case BlackStoneTransparent:
208  sizeRect = m_renderer->boundsOnElement("black_stone");
209  break;
210  case BlackTerritory:
211  sizeRect = m_renderer->boundsOnElement("black_territory");
212  break;
213  case PlacementMarker:
214  sizeRect = m_renderer->boundsOnElement("placement_marker");
215  break;
216  }
217  return QSize((int)sizeRect.width(), (int)sizeRect.height());
218 }
219 
220 } // End of namespace Kigo
221 
222 #include "moc_themerenderer.cpp"
QPainter::setOpacity
void setOpacity(qreal opacity)
QSize::width
int width() const
QPixmap::fill
void fill(const QColor &color)
QSvgRenderer::render
void render(QPainter *painter)
QRectF::x
qreal x() const
QRectF::y
qreal y() const
Kigo::ThemeRenderer::WhiteStoneTransparent
Definition: themerenderer.h:64
QSize::isEmpty
bool isEmpty() const
QRectF::size
QSizeF size() const
QSvgRenderer::isValid
bool isValid() const
QSvgRenderer
Kigo::ThemeRenderer::elementSize
QSize elementSize(Element element) const
Retrieves the default size of a given theme element from the current SVG theme.
Definition: themerenderer.cpp:182
Kigo::ThemeRenderer::loadTheme
bool loadTheme(const QString &themeName)
Load the game theme specified by 'name'.
Definition: themerenderer.cpp:52
QSvgRenderer::load
bool load(const QString &filename)
Kigo::ThemeRenderer::PlacementMarker
Definition: themerenderer.h:69
QSizeF::toSize
QSize toSize() const
QPainter::drawPixmap
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
QPainter
QString::isEmpty
bool isEmpty() const
Kigo::ThemeRenderer::Element
Element
Enumeration of all possible renderable scene element types.
Definition: themerenderer.h:59
Kigo::ThemeRenderer::themeChanged
void themeChanged(const QString &)
QString
themerenderer.h
QPixmap
QSize
preferences.h
QRectF::isEmpty
bool isEmpty() const
QSvgRenderer::boundsOnElement
QRectF boundsOnElement(const QString &id) const
Kigo::ThemeRenderer::Board
Definition: themerenderer.h:61
Kigo::ThemeRenderer::WhiteTerritory
Definition: themerenderer.h:65
QRectF::width
qreal width() const
Kigo::ThemeRenderer::BlackTerritory
Definition: themerenderer.h:68
QRectF
Preferences::theme
static QString theme()
Get The graphical theme to be used.
Definition: preferences.h:68
Kigo::ThemeRenderer::HandicapMark
Definition: themerenderer.h:62
Kigo::ThemeRenderer::BlackStone
Definition: themerenderer.h:66
QSize::height
int height() const
Kigo::ThemeRenderer::WhiteStone
Definition: themerenderer.h:63
QRectF::height
qreal height() const
Kigo::ThemeRenderer::renderElement
void renderElement(Element element, QPainter *painter, const QRectF &rect) const
Renders a specific element of the current SVG theme.
Definition: themerenderer.cpp:86
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
Kigo::ThemeRenderer::Background
Definition: themerenderer.h:60
Kigo::ThemeRenderer::BlackStoneTransparent
Definition: themerenderer.h:67
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:18:29 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kigo

Skip menu "kigo"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdegames API Reference

Skip menu "kdegames API Reference"
  • granatier
  • kapman
  • kblackbox
  • kgoldrunner
  • kigo
  • kmahjongg
  • KShisen
  • ksquares
  • libkdegames
  •   highscore
  •   libkdegamesprivate
  •     kgame
  • libkmahjongg
  • palapeli
  •   libpala

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal