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 }