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 }