File indexing completed on 2024-04-14 03:59:49

0001 /*
0002     This file is part of the KDE project "KLines"
0003 
0004     SPDX-FileCopyrightText: 2006-2007 Dmitry Suzdalev <dimsuz@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "renderer.h"
0010 #include "klines_debug.h"
0011 // KDEGames
0012 #include <KGameRenderer>
0013 #include <KGameThemeProvider>
0014 
0015 
0016 // note: this should be in sync with svg
0017 static inline char color2char(BallColor col)
0018 {
0019     switch (col) {
0020     case Blue:
0021         return 'b';
0022     case Brown:
0023         return 'e';
0024     case Cyan:
0025         return 'c';
0026     case Green:
0027         return 'g';
0028     case Red:
0029         return 'r';
0030     case Violet:
0031         return 'p';
0032     case Yellow:
0033         return 'y';
0034     default:
0035         return 'x'; // error
0036     }
0037 }
0038 
0039 int KLinesRenderer::m_cellSize = 0;
0040 KGameRenderer *KLinesRenderer::m_renderer;
0041 int KLinesRenderer::m_numBornFrames(0);
0042 int KLinesRenderer::m_numSelFrames(0);
0043 int KLinesRenderer::m_numDieFrames(0);
0044 int KLinesRenderer::m_bornDuration(0);
0045 int KLinesRenderer::m_selDuration(0);
0046 int KLinesRenderer::m_dieDuration(0);
0047 int KLinesRenderer::m_moveDuration(0);
0048 
0049 KLinesRenderer  *g_KLinesRenderer = nullptr;
0050 
0051 void KLinesRenderer::Init()
0052 {
0053     g_KLinesRenderer = new KLinesRenderer();
0054 }
0055 
0056 void KLinesRenderer::UnInit()
0057 {
0058     delete g_KLinesRenderer;
0059 }
0060 
0061 KLinesRenderer::KLinesRenderer()
0062 {
0063     KGameThemeProvider* provider = new KGameThemeProvider;
0064     provider->discoverThemes(QStringLiteral("themes"));
0065     //the default theme is marked with a key "Default=true"
0066     const auto themes = provider->themes();
0067     for (const KGameTheme* theme : themes) {
0068         if (theme->customData(QStringLiteral("Default")) == QLatin1String("true"))
0069         {
0070             provider->setDefaultTheme(theme);
0071             break;
0072         }
0073     }
0074     m_renderer = new KGameRenderer(provider);
0075     loadTheme();
0076 }
0077 
0078 KLinesRenderer::~KLinesRenderer()
0079 {
0080     delete m_renderer;
0081 }
0082 
0083 QString KLinesRenderer::ballPixmapId(BallColor color)
0084 {
0085     return QLatin1Char(color2char(color)) + QLatin1String("_rest");
0086 }
0087 
0088 QPixmap KLinesRenderer::ballPixmap(BallColor color)
0089 {
0090     return getPixmap(ballPixmapId(color));
0091 }
0092 
0093 QString KLinesRenderer::animationFrameId(AnimationType type, BallColor color, int frame)
0094 {
0095     switch (type) {
0096     case BornAnim:
0097         return QLatin1Char(color2char(color)) + QLatin1String("_born_") + QString::number(frame + 1);
0098     case SelectedAnim:
0099         return QLatin1Char(color2char(color)) + QLatin1String("_select_") + QString::number(frame + 1);
0100     case DieAnim:
0101         return QLatin1Char(color2char(color)) + QLatin1String("_die_") + QString::number(frame + 1);
0102     case MoveAnim:
0103         qCDebug(KLINES_LOG) << "Move animation type isn't supposed to be handled by KLinesRenderer!";
0104         return QString();
0105     default:
0106         qCDebug(KLINES_LOG) << "Warning! Animation type not handled in switch!";
0107         return QString();
0108     }
0109 }
0110 
0111 QPixmap KLinesRenderer::backgroundTilePixmap()
0112 {
0113     return getPixmap(QStringLiteral("field_cell"));
0114 }
0115 
0116 QPixmap KLinesRenderer::backgroundPixmap(QSize size)
0117 {
0118     return getPixmap(QStringLiteral("background"), size);
0119 }
0120 
0121 QPixmap KLinesRenderer::previewPixmap()
0122 {
0123     return getPixmap(QStringLiteral("preview"), QSize(m_cellSize, m_cellSize * 3));
0124 }
0125 
0126 bool KLinesRenderer::loadTheme()
0127 {
0128     const KGameTheme* theme = m_renderer->theme();
0129 
0130     m_numBornFrames = theme->customData(QStringLiteral("NumBornFrames")).toInt();
0131     m_numSelFrames = theme->customData(QStringLiteral("NumSelectedFrames")).toInt();
0132     m_numDieFrames = theme->customData(QStringLiteral("NumDieFrames")).toInt();
0133 
0134     m_bornDuration = theme->customData(QStringLiteral("BornAnimDuration")).toInt();
0135     m_selDuration = theme->customData(QStringLiteral("SelectedAnimDuration")).toInt();
0136     m_dieDuration = theme->customData(QStringLiteral("DieAnimDuration")).toInt();
0137     m_moveDuration = theme->customData(QStringLiteral("MoveAnimDuration")).toInt();
0138 
0139     return true;
0140 }
0141 
0142 void KLinesRenderer::setCellSize(int cellSize)
0143 {
0144     if (m_cellSize == cellSize)
0145         return;
0146 
0147     m_cellSize = cellSize;
0148 }
0149 
0150 QPixmap KLinesRenderer::getPixmap(const QString& svgName, QSize customSize)
0151 {
0152     if (m_cellSize == 0)
0153         return QPixmap();
0154 
0155     QSize sz = customSize.isValid() ? customSize : cellExtent();
0156 
0157     QPixmap pix = m_renderer->spritePixmap(svgName, sz);
0158 
0159     return pix;
0160 }
0161 
0162 QPixmap KLinesRenderer::backgroundBorderPixmap(QSize size)
0163 {
0164     if (!hasBorderElement())
0165         return QPixmap();
0166 
0167     return getPixmap(QStringLiteral("border"), size);
0168 }
0169 
0170 bool KLinesRenderer::hasBorderElement()
0171 {
0172     return m_renderer->spriteExists(QStringLiteral("border"));
0173 
0174 }