summaryrefslogtreecommitdiff
path: root/src/gui/palette.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/palette.cpp')
-rw-r--r--src/gui/palette.cpp274
1 files changed, 274 insertions, 0 deletions
diff --git a/src/gui/palette.cpp b/src/gui/palette.cpp
new file mode 100644
index 000000000..72c490912
--- /dev/null
+++ b/src/gui/palette.cpp
@@ -0,0 +1,274 @@
+/*
+ * Configurable text colors
+ * Copyright (C) 2008 Douglas Boffey <dougaboffey@netscape.net>
+ * Copyright (C) 2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ *
+ * This file is part of The Mana Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "palette.h"
+
+#include "configuration.h"
+#include "client.h"
+
+#include "gui/gui.h"
+
+#include "utils/gettext.h"
+#include "utils/mathutils.h"
+#include "utils/stringutils.h"
+
+#include <math.h>
+
+const gcn::Color Palette::BLACK = gcn::Color(0, 0, 0);
+Palette::Palettes Palette::mInstances;
+
+const gcn::Color Palette::RAINBOW_COLORS[7] = {
+ gcn::Color(255, 0, 0),
+ gcn::Color(255, 153, 0),
+ gcn::Color(255, 255, 0),
+ gcn::Color(0, 153, 0),
+ gcn::Color(0, 204, 204),
+ gcn::Color(51, 0, 153),
+ gcn::Color(153, 0, 153)
+};
+/** Number of Elemets of RAINBOW_COLORS */
+const int Palette::RAINBOW_COLOR_COUNT = 7;
+
+Palette::Palette(int size) :
+ mRainbowTime(tick_time),
+ mColors(Colors(size))
+{
+ mInstances.insert(this);
+}
+
+Palette::~Palette()
+{
+ mInstances.erase(this);
+}
+
+const gcn::Color& Palette::getColor(char c, bool &valid)
+{
+ for (Colors::const_iterator col = mColors.begin(),
+ colEnd = mColors.end(); col != colEnd; ++col)
+ {
+ if (col->ch == c)
+ {
+ valid = true;
+ return col->color;
+ }
+ }
+ valid = false;
+ return BLACK;
+}
+
+void Palette::advanceGradients()
+{
+ Palettes::iterator it = mInstances.begin();
+ Palettes::iterator it_end = mInstances.end();
+
+ for (; it != it_end; it++)
+ (*it)->advanceGradient();
+}
+
+void Palette::advanceGradient()
+{
+ if (get_elapsed_time(mRainbowTime) > 5)
+ {
+ int pos, colIndex, colVal, delay, numOfColors;
+ // For slower systems, advance can be greater than one (advance > 1
+ // skips advance-1 steps). Should make gradient look the same
+ // independent of the framerate.
+ int advance = get_elapsed_time(mRainbowTime) / 5;
+ double startColVal, destColVal;
+
+ for (size_t i = 0; i < mGradVector.size(); i++)
+ {
+ if (!mGradVector[i])
+ continue;
+
+ delay = mGradVector[i]->delay;
+
+ if (mGradVector[i]->grad == PULSE)
+ delay = delay / 20;
+
+ numOfColors = (mGradVector[i]->grad == SPECTRUM ? 6 :
+ mGradVector[i]->grad == PULSE ? 127 :
+ RAINBOW_COLOR_COUNT);
+
+ mGradVector[i]->gradientIndex =
+ (mGradVector[i]->gradientIndex + advance) %
+ (delay * numOfColors);
+
+ pos = mGradVector[i]->gradientIndex % delay;
+ if (delay)
+ colIndex = mGradVector[i]->gradientIndex / delay;
+ else
+ colIndex = mGradVector[i]->gradientIndex;
+
+ if (mGradVector[i]->grad == PULSE)
+ {
+ colVal = static_cast<int>(255.0 *
+ sin(M_PI * colIndex / numOfColors));
+
+ const gcn::Color &col = mGradVector[i]->testColor;
+
+ mGradVector[i]->color.r =
+ ((colVal * col.r) / 255) % (col.r + 1);
+ mGradVector[i]->color.g =
+ ((colVal * col.g) / 255) % (col.g + 1);
+ mGradVector[i]->color.b =
+ ((colVal * col.b) / 255) % (col.b + 1);
+ }
+ if (mGradVector[i]->grad == SPECTRUM)
+ {
+ if (colIndex % 2)
+ { // falling curve
+ if (delay)
+ {
+ colVal = static_cast<int>(255.0 *
+ (cos(M_PI * pos / delay) + 1) / 2);
+ }
+ else
+ {
+ colVal = static_cast<int>(255.0 *
+ (cos(M_PI * pos) + 1) / 2);
+ }
+ }
+ else
+ { // ascending curve
+ if (delay)
+ {
+ colVal = static_cast<int>(255.0 * (cos(M_PI *
+ (delay - pos) / delay) + 1) / 2);
+ }
+ else
+ {
+ colVal = static_cast<int>(255.0 * (cos(M_PI *
+ (delay - pos)) + 1) / 2);
+ }
+ }
+
+ mGradVector[i]->color.r =
+ (colIndex == 0 || colIndex == 5) ? 255 :
+ (colIndex == 1 || colIndex == 4) ? colVal : 0;
+ mGradVector[i]->color.g =
+ (colIndex == 1 || colIndex == 2) ? 255 :
+ (colIndex == 0 || colIndex == 3) ? colVal : 0;
+ mGradVector[i]->color.b =
+ (colIndex == 3 || colIndex == 4) ? 255 :
+ (colIndex == 2 || colIndex == 5) ? colVal : 0;
+ }
+ else if (mGradVector[i]->grad == RAINBOW)
+ {
+ const gcn::Color &startCol = RAINBOW_COLORS[colIndex];
+ const gcn::Color &destCol =
+ RAINBOW_COLORS[(colIndex + 1) % numOfColors];
+
+ if (delay)
+ startColVal = (cos(M_PI * pos / delay) + 1) / 2;
+ else
+ startColVal = 0;
+
+ destColVal = 1 - startColVal;
+
+ mGradVector[i]->color.r = static_cast<int>(startColVal
+ * startCol.r + destColVal * destCol.r);
+
+ mGradVector[i]->color.g = static_cast<int>(startColVal
+ * startCol.g + destColVal * destCol.g);
+
+ mGradVector[i]->color.b = static_cast<int>(startColVal
+ * startCol.b + destColVal * destCol.b);
+ }
+ }
+
+ if (advance)
+ mRainbowTime = tick_time;
+ }
+}
+
+/*
+gcn::Color Palette::produceHPColor(int hp, int maxHp, int alpha)
+{
+ float r1 = 255;
+ float g1 = 255;
+ float b1 = 255;
+ float r2 = 255;
+ float g2 = 255;
+ float b2 = 255;
+
+ float weight = 1.0f;
+
+ int thresholdLevel = maxHp / 4;
+ int thresholdProgress = hp % thresholdLevel;
+
+ if (thresholdLevel)
+ weight = 1 - ((float)thresholdProgress) / ((float)thresholdLevel);
+ else
+ weight = 0;
+
+ if (hp < (thresholdLevel))
+ {
+ gcn::Color color1 = guiPalette->getColor(Palette::HPBAR_ONE_HALF);
+ gcn::Color color2 = guiPalette->getColor(Palette::HPBAR_ONE_QUARTER);
+ r1 = color1.r; r2 = color2.r;
+ g1 = color1.g; g2 = color2.g;
+ b1 = color1.b; b2 = color2.b;
+ }
+ else if (hp < (thresholdLevel*2))
+ {
+ gcn::Color color1 = guiPalette->getColor(Palette::HPBAR_THREE_QUARTERS);
+ gcn::Color color2 = guiPalette->getColor(Palette::HPBAR_ONE_HALF);
+ r1 = color1.r; r2 = color2.r;
+ g1 = color1.g; g2 = color2.g;
+ b1 = color1.b; b2 = color2.b;
+ }
+ else if (hp < thresholdLevel*3)
+ {
+ gcn::Color color1 = guiPalette->getColor(Palette::HPBAR_FULL);
+ gcn::Color color2 = guiPalette->getColor(Palette::HPBAR_THREE_QUARTERS);
+ r1 = color1.r; r2 = color2.r;
+ g1 = color1.g; g2 = color2.g;
+ b1 = color1.b; b2 = color2.b;
+ }
+ else
+ {
+ gcn::Color color1 = guiPalette->getColor(Palette::HPBAR_FULL);
+ gcn::Color color2 = guiPalette->getColor(Palette::HPBAR_FULL);
+ r1 = color1.r; r2 = color2.r;
+ g1 = color1.g; g2 = color2.g;
+ b1 = color1.b; b2 = color2.b;
+ }
+
+ // Safety checks
+ if (weight > 1.0f) weight = 1.0f;
+ if (weight < 0.0f) weight = 0.0f;
+
+ // Do the color blend
+ r1 = (int) weightedAverage(r1, r2,weight);
+ g1 = (int) weightedAverage(g1, g2, weight);
+ b1 = (int) weightedAverage(b1, b2, weight);
+
+ // More safety checks
+ if (r1 > 255) r1 = 255;
+ if (g1 > 255) g1 = 255;
+ if (b1 > 255) b1 = 255;
+
+ return gcn::Color(r1, g1, b1, alpha);
+}
+*/
+