24 #include <QSvgRenderer>
25 #include <KPixmapCache>
28 #define USE_UNSTABLE_LIBKDEGAMESPRIVATE_API
29 #include <libkdegamesprivate/kgametheme.h>
36 ThemeRenderer::ThemeRenderer()
37 : m_renderer(
new QSvgRenderer)
38 , m_cache(
new KPixmapCache(
"kigo-cache"))
40 m_cache->setCacheLimit(3 * 1024);
42 kDebug() <<
"Failed to load any game theme!";
46 ThemeRenderer::~ThemeRenderer()
54 bool discardCache = !m_currentTheme.isEmpty();
56 if (!m_currentTheme.isEmpty() && m_currentTheme == themeName) {
61 m_currentTheme = themeName;
64 if (themeName.isEmpty() || !theme.load(themeName)) {
67 if (!theme.loadDefault())
71 m_currentTheme =
"default";
75 if (!m_renderer->load(theme.graphics()))
88 if (!m_renderer->isValid() || rect.isEmpty() || painter == 0)
91 QPixmap pixmap =
renderElement(element, rect.size().toSize());
94 painter->drawPixmap(static_cast<int>(rect.x()), static_cast<int>(rect.y()), pixmap);
99 if (!m_renderer->isValid() || size.isEmpty())
106 cacheName = QString(
"background_%1x%2").arg(size.width()).arg(size.height());
109 cacheName = QString(
"board_%1x%2").arg(size.width()).arg(size.height());
112 cacheName = QString(
"handicap_mark_%1x%2").arg(size.width()).arg(size.height());
115 cacheName = QString(
"white_stone_%1x%2").arg(size.width()).arg(size.height());
118 cacheName = QString(
"white_stone_%1x%2_trans").arg(size.width()).arg(size.height());
121 cacheName = QString(
"white_territory_%1x%2").arg(size.width()).arg(size.height());
124 cacheName = QString(
"black_stone_%1x%2").arg(size.width()).arg(size.height());
127 cacheName = QString(
"black_stone_%1x%2_trans").arg(size.width()).arg(size.height());
130 cacheName = QString(
"black_territory_%1x%2").arg(size.width()).arg(size.height());
133 cacheName = QString(
"placement_marker_%1x%2").arg(size.width()).arg(size.height());
139 if (!m_cache->find(cacheName, pixmap)) {
140 pixmap = QPixmap(size);
141 pixmap.fill(Qt::transparent);
145 m_renderer->render(&p,
"background");
148 m_renderer->render(&p,
"board");
151 m_renderer->render(&p,
"handicap_mark");
154 m_renderer->render(&p,
"white_stone");
158 m_renderer->render(&p,
"white_stone");
161 m_renderer->render(&p,
"white_territory");
164 m_renderer->render(&p,
"black_stone");
168 m_renderer->render(&p,
"black_stone");
171 m_renderer->render(&p,
"black_territory");
174 m_renderer->render(&p,
"placement_marker");
177 m_cache->insert(cacheName, pixmap);
187 sizeRect = m_renderer->boundsOnElement(
"background");
190 sizeRect = m_renderer->boundsOnElement(
"board");
193 sizeRect = m_renderer->boundsOnElement(
"handicap_mark");
196 sizeRect = m_renderer->boundsOnElement(
"white_stone");
199 sizeRect = m_renderer->boundsOnElement(
"white_stone");
202 sizeRect = m_renderer->boundsOnElement(
"white_territory");
205 sizeRect = m_renderer->boundsOnElement(
"black_stone");
208 sizeRect = m_renderer->boundsOnElement(
"black_stone");
211 sizeRect = m_renderer->boundsOnElement(
"black_territory");
214 sizeRect = m_renderer->boundsOnElement(
"placement_marker");
217 return QSize((
int)sizeRect.width(), (int)sizeRect.height());
222 #include "moc_themerenderer.cpp"
QSize elementSize(Element element) const
Retrieves the default size of a given theme element from the current SVG theme.
bool loadTheme(const QString &themeName)
Load the game theme specified by 'name'.
Element
Enumeration of all possible renderable scene element types.
void themeChanged(const QString &)
static QString theme()
Get The graphical theme to be used.
void renderElement(Element element, QPainter *painter, const QRectF &rect) const
Renders a specific element of the current SVG theme.