1 /*
2 SPDX-FileCopyrightText: 2010 Stefan Majewsky <majewsky@gmx.net>
3
4 SPDX-License-Identifier: LGPL-2.0-only
5 */
6
7 #include "kgamerendererclient.h"
8
9 // own
10 #include "kgamerenderer.h"
11 #include "kgamerenderer_p.h"
12 // Qt
13 #include <QTimer>
14
KGameRendererClientPrivate(KGameRenderer * renderer,const QString & spriteKey,KGameRendererClient * parent)15 KGameRendererClientPrivate::KGameRendererClientPrivate(KGameRenderer* renderer, const QString& spriteKey, KGameRendererClient* parent)
16 : m_parent(parent)
17 , m_renderer(renderer)
18 , m_spec(spriteKey, -1, QSize())
19 {
20 }
21
KGameRendererClient(KGameRenderer * renderer,const QString & spriteKey)22 KGameRendererClient::KGameRendererClient(KGameRenderer* renderer, const QString& spriteKey)
23 : d(new KGameRendererClientPrivate(renderer, spriteKey, this))
24 {
25 renderer->d->m_clients.insert(this, QString());
26 //The following may not be triggered directly because it may call receivePixmap() which is a pure virtual method at this point.
27 QTimer::singleShot(0, d.get(), &KGameRendererClientPrivate::fetchPixmap);
28 }
29
~KGameRendererClient()30 KGameRendererClient::~KGameRendererClient()
31 {
32 d->m_renderer->d->m_clients.remove(this);
33 }
34
renderer() const35 KGameRenderer* KGameRendererClient::renderer() const
36 {
37 return d->m_renderer;
38 }
39
spriteKey() const40 QString KGameRendererClient::spriteKey() const
41 {
42 return d->m_spec.spriteKey;
43 }
44
setSpriteKey(const QString & spriteKey)45 void KGameRendererClient::setSpriteKey(const QString& spriteKey)
46 {
47 if (d->m_spec.spriteKey != spriteKey)
48 {
49 d->m_spec.spriteKey = spriteKey;
50 d->fetchPixmap();
51 }
52 }
53
frameCount() const54 int KGameRendererClient::frameCount() const
55 {
56 return d->m_renderer->frameCount(d->m_spec.spriteKey);
57 }
58
frame() const59 int KGameRendererClient::frame() const
60 {
61 return d->m_spec.frame;
62 }
63
setFrame(int frame)64 void KGameRendererClient::setFrame(int frame)
65 {
66 if (d->m_spec.frame != frame)
67 {
68 //do some normalization ourselves
69 const int frameCount = this->frameCount();
70 if (frameCount <= 0 || frame < 0)
71 {
72 frame = -1;
73 }
74 else
75 {
76 const int frameBaseIndex = d->m_renderer->frameBaseIndex();
77 frame = (frame - frameBaseIndex) % frameCount + frameBaseIndex;
78 }
79 if (d->m_spec.frame != frame)
80 {
81 d->m_spec.frame = frame;
82 d->fetchPixmap();
83 }
84 }
85 }
86
renderSize() const87 QSize KGameRendererClient::renderSize() const
88 {
89 return d->m_spec.size;
90 }
91
setRenderSize(const QSize & renderSize)92 void KGameRendererClient::setRenderSize(const QSize& renderSize)
93 {
94 if (d->m_spec.size != renderSize)
95 {
96 d->m_spec.size = renderSize;
97 d->fetchPixmap();
98 }
99 }
100
customColors() const101 QHash<QColor, QColor> KGameRendererClient::customColors() const
102 {
103 return d->m_spec.customColors;
104 }
105
setCustomColors(const QHash<QColor,QColor> & customColors)106 void KGameRendererClient::setCustomColors(const QHash<QColor, QColor>& customColors)
107 {
108 if (d->m_spec.customColors != customColors)
109 {
110 d->m_spec.customColors = customColors;
111 d->fetchPixmap();
112 }
113 }
114
fetchPixmap()115 void KGameRendererClientPrivate::fetchPixmap()
116 {
117 m_renderer->d->requestPixmap(m_spec, m_parent);
118 }
119