summaryrefslogtreecommitdiff
path: root/tools/dyecmd/src/dye.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/dyecmd/src/dye.cpp')
-rwxr-xr-xtools/dyecmd/src/dye.cpp202
1 files changed, 0 insertions, 202 deletions
diff --git a/tools/dyecmd/src/dye.cpp b/tools/dyecmd/src/dye.cpp
deleted file mode 100755
index 77da2ebbb..000000000
--- a/tools/dyecmd/src/dye.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * The Mana Client
- * Copyright (C) 2007-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 <algorithm>
-#include <sstream>
-#include <iostream>
-
-#include "dye.h"
-
-Palette::Palette(const std::string &description)
-{
- mLoaded = false;
- int size = description.length();
- if (size == 0) return;
- if (description[0] != '#')
- {
- std::cout << "Missing # in the palette description "
- << "in the third parameter." << std::endl;
- return;
- }
-
- int pos = 1;
- for (;;)
- {
- if (pos + 6 > size) break;
- int v = 0;
- for (int i = 0; i < 6; ++i)
- {
- char c = description[pos + i];
- int n;
- if ('0' <= c && c <= '9')
- n = c - '0';
- else if ('A' <= c && c <= 'F')
- n = c - 'A' + 10;
- else if ('a' <= c && c <= 'f')
- n = c - 'a' + 10;
- else
- {
- std::cout << "invalid Hexadecimal description: "
- << description << std::endl;
- return;
- }
-
- v = (v << 4) | n;
- }
- Color c = { { v >> 16, v >> 8, v } };
- mColors.push_back(c);
- pos += 6;
- if (pos == size)
- {
- mLoaded = true;
- return;
- }
- if (description[pos] != ',')
- break;
-
- ++pos;
- }
-
- mLoaded = true;
-}
-
-void Palette::getColor(int intensity, int color[3]) const
-{
- // Return implicit black
- if (intensity == 0)
- {
- color[0] = 0;
- color[1] = 0;
- color[2] = 0;
- return;
- }
-
- int last = mColors.size();
- if (last == 0) return;
-
- int i = intensity * last / 255;
- int t = intensity * last % 255;
-
- int j = t != 0 ? i : i - 1;
- // Get the exact color if any, the next color otherwise.
- int r2 = mColors[j].value[0],
- g2 = mColors[j].value[1],
- b2 = mColors[j].value[2];
-
- if (t == 0)
- {
- // Exact color.
- color[0] = r2;
- color[1] = g2;
- color[2] = b2;
- return;
- }
-
- // Get the previous color. First color is implicitly black.
- int r1 = 0, g1 = 0, b1 = 0;
- if (i > 0)
- {
- r1 = mColors[i - 1].value[0];
- g1 = mColors[i - 1].value[1];
- b1 = mColors[i - 1].value[2];
- }
-
- // Perform a linear interpolation.
- color[0] = ((255 - t) * r1 + t * r2) / 255;
- color[1] = ((255 - t) * g1 + t * g2) / 255;
- color[2] = ((255 - t) * b1 + t * b2) / 255;
-}
-
-Dye::Dye(const std::string &description)
-{
- mLoaded = false;
- for (int i = 0; i < 7; ++i)
- mPalettes[i] = 0;
-
- if (description.empty()) return;
-
- std::string::size_type next_pos = 0, length = description.length();
- do
- {
- std::string::size_type pos = next_pos;
- next_pos = description.find(';', pos);
- if (next_pos == std::string::npos)
- next_pos = length;
- if (next_pos <= pos + 3 || description[pos + 1] != ':')
- {
- std::cout << "Dyeing: Missing ':' in channel description."
- << std::endl;
- return;
- }
- int i = 0;
- switch (description[pos])
- {
- case 'R': i = 0; break;
- case 'G': i = 1; break;
- case 'Y': i = 2; break;
- case 'B': i = 3; break;
- case 'M': i = 4; break;
- case 'C': i = 5; break;
- case 'W': i = 6; break;
- default:
- std::cout << "Dyeing: Invalid channel. Not in [R,G,Y,B,M,C,W]"
- << std::endl;
- return;
- }
- mPalettes[i] = new Palette(
- description.substr(pos + 2, next_pos - pos - 2));
-
- if (!mPalettes[i]->loaded())
- return;
-
- ++next_pos;
- }
- while (next_pos < length);
-
- mLoaded = true;
-}
-
-Dye::~Dye()
-{
- for (int i = 0; i < 7; ++i)
- delete mPalettes[i];
-}
-
-void Dye::update(int color[3]) const
-{
- int cmax = std::max(color[0], std::max(color[1], color[2]));
- if (cmax == 0) return;
-
- int cmin = std::min(color[0], std::min(color[1], color[2]));
- int intensity = color[0] + color[1] + color[2];
-
- if (cmin != cmax &&
- (cmin != 0 || (intensity != cmax && intensity != 2 * cmax)))
- {
- // not pure
- return;
- }
-
- int i = (color[0] != 0) | ((color[1] != 0) << 1) | ((color[2] != 0) << 2);
-
- if (mPalettes[i - 1])
- mPalettes[i - 1]->getColor(cmax, color);
-}