diff options
author | Andrei Karas <akaras@inbox.ru> | 2013-08-19 22:17:05 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2013-08-19 22:17:55 +0300 |
commit | fe9994c45c1e464125186ae14e482ae155d9ec53 (patch) | |
tree | 0eef772d50979f869138a80a8ca983de4e5da900 /src/resources/dye.cpp | |
parent | 582900e6c698823fc95bc6653707a328e96dd075 (diff) | |
download | manaverse-fe9994c45c1e464125186ae14e482ae155d9ec53.tar.gz manaverse-fe9994c45c1e464125186ae14e482ae155d9ec53.tar.bz2 manaverse-fe9994c45c1e464125186ae14e482ae155d9ec53.tar.xz manaverse-fe9994c45c1e464125186ae14e482ae155d9ec53.zip |
improve a bit normal dye code.
move dye code to methods.
Diffstat (limited to 'src/resources/dye.cpp')
-rw-r--r-- | src/resources/dye.cpp | 99 |
1 files changed, 76 insertions, 23 deletions
diff --git a/src/resources/dye.cpp b/src/resources/dye.cpp index 785c15ab9..e57f4afe2 100644 --- a/src/resources/dye.cpp +++ b/src/resources/dye.cpp @@ -446,29 +446,6 @@ Dye::~Dye() } } -void Dye::update(int color[3]) const -{ - const int cmax = std::max(color[0], std::max(color[1], color[2])); - if (cmax == 0) - return; - - const int cmin = std::min(color[0], std::min(color[1], color[2])); - const int intensity = color[0] + color[1] + color[2]; - - if (cmin != cmax && (cmin != 0 || (intensity != cmax - && intensity != 2 * cmax))) - { - // not pure - return; - } - - const int i = (color[0] != 0) | ((color[1] != 0) << 1) - | ((color[2] != 0) << 2); - - if (mDyePalettes[i - 1]) - mDyePalettes[i - 1]->getColor(cmax, color); -} - void Dye::instantiate(std::string &target, const std::string &palettes) { size_t next_pos = target.find('|'); @@ -527,3 +504,79 @@ int Dye::getType() const return 2; return 0; } + +void Dye::normalDye(uint32_t *pixels, const int bufSize) const +{ + for (uint32_t *p_end = pixels + bufSize; pixels != p_end; ++ pixels) + { + const uint32_t p = *pixels; + const int alpha = p & 255; + if (!alpha) + continue; + int color[3]; + color[0] = (p >> 24) & 255; + color[1] = (p >> 16) & 255; + color[2] = (p >> 8) & 255; + + const int cmax = std::max(color[0], std::max(color[1], color[2])); + if (cmax == 0) + continue; + + const int cmin = std::min(color[0], std::min(color[1], color[2])); + const int intensity = color[0] + color[1] + color[2]; + + if (cmin != cmax && (cmin != 0 || (intensity != cmax + && intensity != 2 * cmax))) + { + // not pure + continue; + } + + const int i = (color[0] != 0) | ((color[1] != 0) << 1) + | ((color[2] != 0) << 2); + + if (mDyePalettes[i - 1]) + mDyePalettes[i - 1]->getColor(cmax, color); + + *pixels = (color[0] << 24) | (color[1] << 16) + | (color[2] << 8) | alpha; + } +} + +void Dye::normalOGLDye(uint32_t *pixels, const int bufSize) const +{ + for (uint32_t *p_end = pixels + bufSize; pixels != p_end; ++ pixels) + { + const uint32_t p = *pixels; + const int alpha = (p >> 24) & 255; + if (!alpha) + continue; + int color[3]; + color[0] = (p) & 255; + color[1] = (p >> 8) & 255; + color[2] = (p >> 16) & 255; + + const int cmax = std::max(color[0], std::max(color[1], color[2])); + if (cmax == 0) + continue; + + const int cmin = std::min(color[0], std::min(color[1], color[2])); + const int intensity = color[0] + color[1] + color[2]; + + if (cmin != cmax && (cmin != 0 || (intensity != cmax + && intensity != 2 * cmax))) + { + // not pure + continue; + } + + const int i = (color[0] != 0) | ((color[1] != 0) << 1) + | ((color[2] != 0) << 2); + + if (mDyePalettes[i - 1]) + mDyePalettes[i - 1]->getColor(cmax, color); + + *pixels = (color[0]) | (color[1] << 8) + | (color[2] << 16) | (alpha << 24); + } +} |