1/***************************************************************************
2 * Copyright 2010 Stefan Majewsky <majewsky@gmx.net> *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU Library General Public License *
6 * version 2 as published by the Free Software Foundation *
7 * *
8 * This program is distributed in the hope that it will be useful, *
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
11 * GNU Library General Public License for more details. *
12 * *
13 * You should have received a copy of the GNU Library General Public *
14 * License along with this program; if not, write to the *
15 * Free Software Foundation, Inc., *
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
17 ***************************************************************************/
18
19#include "kgamerendererclient.h"
20#include "kgamerenderer.h"
21#include "kgamerenderer_p.h"
22
23#include <QtCore/QTimer>
24
25KGameRendererClientPrivate::KGameRendererClientPrivate(KGameRenderer* renderer, const QString& spriteKey, KGameRendererClient* parent)
26 : m_parent(parent)
27 , m_renderer(renderer)
28 , m_spec(spriteKey, -1, QSize())
29{
30}
31
32KGameRendererClient::KGameRendererClient(KGameRenderer* renderer, const QString& spriteKey)
33 : d(new KGameRendererClientPrivate(renderer, spriteKey, this))
34{
35 renderer->d->m_clients.insert(this, QString());
36 //The following may not be triggered directly because it may call receivePixmap() which is a pure virtual method at this point.
37 QTimer::singleShot(0, d, SLOT(fetchPixmap()));
38}
39
40KGameRendererClient::~KGameRendererClient()
41{
42 d->m_renderer->d->m_clients.remove(this);
43 delete d;
44}
45
46KGameRenderer* KGameRendererClient::renderer() const
47{
48 return d->m_renderer;
49}
50
51QString KGameRendererClient::spriteKey() const
52{
53 return d->m_spec.spriteKey;
54}
55
56void KGameRendererClient::setSpriteKey(const QString& spriteKey)
57{
58 if (d->m_spec.spriteKey != spriteKey)
59 {
60 d->m_spec.spriteKey = spriteKey;
61 d->fetchPixmap();
62 }
63}
64
65int KGameRendererClient::frameCount() const
66{
67 return d->m_renderer->frameCount(d->m_spec.spriteKey);
68}
69
70int KGameRendererClient::frame() const
71{
72 return d->m_spec.frame;
73}
74
75void KGameRendererClient::setFrame(int frame)
76{
77 if (d->m_spec.frame != frame)
78 {
79 //do some normalization ourselves
80 const int frameCount = this->frameCount();
81 if (frameCount <= 0 || frame < 0)
82 {
83 frame = -1;
84 }
85 else
86 {
87 const int frameBaseIndex = d->m_renderer->frameBaseIndex();
88 frame = (frame - frameBaseIndex) % frameCount + frameBaseIndex;
89 }
90 if (d->m_spec.frame != frame)
91 {
92 d->m_spec.frame = frame;
93 d->fetchPixmap();
94 }
95 }
96}
97
98QSize KGameRendererClient::renderSize() const
99{
100 return d->m_spec.size;
101}
102
103void KGameRendererClient::setRenderSize(const QSize& renderSize)
104{
105 if (d->m_spec.size != renderSize)
106 {
107 d->m_spec.size = renderSize;
108 d->fetchPixmap();
109 }
110}
111
112QHash<QColor, QColor> KGameRendererClient::customColors() const
113{
114 return d->m_spec.customColors;
115}
116
117void KGameRendererClient::setCustomColors(const QHash<QColor, QColor>& customColors)
118{
119 if (d->m_spec.customColors != customColors)
120 {
121 d->m_spec.customColors = customColors;
122 d->fetchPixmap();
123 }
124}
125
126void KGameRendererClientPrivate::fetchPixmap()
127{
128 m_renderer->d->requestPixmap(m_spec, m_parent);
129}
130