File indexing completed on 2024-04-28 04:05:04
0001 /* 0002 SPDX-FileCopyrightText: 2010 Stefan Majewsky <majewsky@gmx.net> 0003 0004 SPDX-License-Identifier: LGPL-2.0-only 0005 */ 0006 0007 #include "kgamerendererclient.h" 0008 0009 // own 0010 #include "kgamerenderer.h" 0011 #include "kgamerenderer_p.h" 0012 // Qt 0013 #include <QTimer> 0014 0015 KGameRendererClientPrivate::KGameRendererClientPrivate(KGameRenderer *renderer, const QString &spriteKey, KGameRendererClient *parent) 0016 : m_parent(parent) 0017 , m_renderer(renderer) 0018 , m_spec(spriteKey, -1, QSize()) 0019 { 0020 } 0021 0022 KGameRendererClient::KGameRendererClient(KGameRenderer *renderer, const QString &spriteKey) 0023 : d_ptr(new KGameRendererClientPrivate(renderer, spriteKey, this)) 0024 { 0025 Q_D(KGameRendererClient); 0026 0027 renderer->d_ptr->m_clients.insert(this, QString()); 0028 // The following may not be triggered directly because it may call receivePixmap() which is a pure virtual method at this point. 0029 QTimer::singleShot(0, d, &KGameRendererClientPrivate::fetchPixmap); 0030 } 0031 0032 KGameRendererClient::~KGameRendererClient() 0033 { 0034 Q_D(KGameRendererClient); 0035 0036 d->m_renderer->d_ptr->m_clients.remove(this); 0037 } 0038 0039 KGameRenderer *KGameRendererClient::renderer() const 0040 { 0041 Q_D(const KGameRendererClient); 0042 0043 return d->m_renderer; 0044 } 0045 0046 QString KGameRendererClient::spriteKey() const 0047 { 0048 Q_D(const KGameRendererClient); 0049 0050 return d->m_spec.spriteKey; 0051 } 0052 0053 void KGameRendererClient::setSpriteKey(const QString &spriteKey) 0054 { 0055 Q_D(KGameRendererClient); 0056 0057 if (d->m_spec.spriteKey != spriteKey) { 0058 d->m_spec.spriteKey = spriteKey; 0059 d->fetchPixmap(); 0060 } 0061 } 0062 0063 int KGameRendererClient::frameCount() const 0064 { 0065 Q_D(const KGameRendererClient); 0066 0067 return d->m_renderer->frameCount(d->m_spec.spriteKey); 0068 } 0069 0070 int KGameRendererClient::frame() const 0071 { 0072 Q_D(const KGameRendererClient); 0073 0074 return d->m_spec.frame; 0075 } 0076 0077 void KGameRendererClient::setFrame(int frame) 0078 { 0079 Q_D(KGameRendererClient); 0080 0081 if (d->m_spec.frame != frame) { 0082 // do some normalization ourselves 0083 const int frameCount = this->frameCount(); 0084 if (frameCount <= 0 || frame < 0) { 0085 frame = -1; 0086 } else { 0087 const int frameBaseIndex = d->m_renderer->frameBaseIndex(); 0088 frame = (frame - frameBaseIndex) % frameCount + frameBaseIndex; 0089 } 0090 if (d->m_spec.frame != frame) { 0091 d->m_spec.frame = frame; 0092 d->fetchPixmap(); 0093 } 0094 } 0095 } 0096 0097 QSize KGameRendererClient::renderSize() const 0098 { 0099 Q_D(const KGameRendererClient); 0100 0101 return d->m_spec.size; 0102 } 0103 0104 void KGameRendererClient::setRenderSize(QSize renderSize) 0105 { 0106 Q_D(KGameRendererClient); 0107 0108 if (d->m_spec.size != renderSize) { 0109 d->m_spec.size = renderSize; 0110 d->fetchPixmap(); 0111 } 0112 } 0113 0114 QHash<QColor, QColor> KGameRendererClient::customColors() const 0115 { 0116 Q_D(const KGameRendererClient); 0117 0118 return d->m_spec.customColors; 0119 } 0120 0121 void KGameRendererClient::setCustomColors(const QHash<QColor, QColor> &customColors) 0122 { 0123 Q_D(KGameRendererClient); 0124 0125 if (d->m_spec.customColors != customColors) { 0126 d->m_spec.customColors = customColors; 0127 d->fetchPixmap(); 0128 } 0129 } 0130 0131 void KGameRendererClientPrivate::fetchPixmap() 0132 { 0133 m_renderer->d_ptr->requestPixmap(m_spec, m_parent); 0134 }