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 | |
25 | KGameRendererClientPrivate::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 | |
32 | KGameRendererClient::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 | |
40 | KGameRendererClient::~KGameRendererClient() |
41 | { |
42 | d->m_renderer->d->m_clients.remove(this); |
43 | delete d; |
44 | } |
45 | |
46 | KGameRenderer* KGameRendererClient::renderer() const |
47 | { |
48 | return d->m_renderer; |
49 | } |
50 | |
51 | QString KGameRendererClient::spriteKey() const |
52 | { |
53 | return d->m_spec.spriteKey; |
54 | } |
55 | |
56 | void 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 | |
65 | int KGameRendererClient::frameCount() const |
66 | { |
67 | return d->m_renderer->frameCount(d->m_spec.spriteKey); |
68 | } |
69 | |
70 | int KGameRendererClient::frame() const |
71 | { |
72 | return d->m_spec.frame; |
73 | } |
74 | |
75 | void 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 | |
98 | QSize KGameRendererClient::renderSize() const |
99 | { |
100 | return d->m_spec.size; |
101 | } |
102 | |
103 | void 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 | |
112 | QHash<QColor, QColor> KGameRendererClient::customColors() const |
113 | { |
114 | return d->m_spec.customColors; |
115 | } |
116 | |
117 | void 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 | |
126 | void KGameRendererClientPrivate::fetchPixmap() |
127 | { |
128 | m_renderer->d->requestPixmap(m_spec, m_parent); |
129 | } |
130 | |