diff options
author | Andrei Karas <akaras@inbox.ru> | 2013-08-04 00:13:18 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2013-08-18 19:36:33 +0300 |
commit | f97a167c445790fb380c2f730c377271e80e0d97 (patch) | |
tree | 24525423d2e50bab0dd519d016da33c0c5387e6d /src/resources/dye.cpp | |
parent | d99a3f4a96b754a788c4a147be27dd212d90f743 (diff) | |
download | mv-f97a167c445790fb380c2f730c377271e80e0d97.tar.gz mv-f97a167c445790fb380c2f730c377271e80e0d97.tar.bz2 mv-f97a167c445790fb380c2f730c377271e80e0d97.tar.xz mv-f97a167c445790fb380c2f730c377271e80e0d97.zip |
improve OpenGL A,S dye speed.
Diffstat (limited to 'src/resources/dye.cpp')
-rw-r--r-- | src/resources/dye.cpp | 96 |
1 files changed, 63 insertions, 33 deletions
diff --git a/src/resources/dye.cpp b/src/resources/dye.cpp index b3ac8ea46..905f3bcab 100644 --- a/src/resources/dye.cpp +++ b/src/resources/dye.cpp @@ -272,50 +272,80 @@ void DyePalette::replaceAColor(uint32_t *pixels, const int bufSize) const } } -void DyePalette::replaceSOGLColor(uint8_t *const color) const +void DyePalette::replaceSOGLColor(uint32_t *pixels, const int bufSize) const { - std::vector<DyeColor>::const_iterator it = mColors.begin(); - const std::vector<DyeColor>::const_iterator it_end = mColors.end(); - while (it != it_end) + std::vector<DyeColor>::const_iterator it_end = mColors.end(); + const int sz = mColors.size(); + if (!sz) + return; + if (sz % 2) + -- it_end; + + for (uint32_t *p_end = pixels + bufSize; pixels != p_end; ++pixels) { - const DyeColor &col = *it; - ++ it; - if (it == it_end) - return; - const DyeColor &col2 = *it; - if (color[0] == col.value[0] && color[1] == col.value[1] - && color[2] == col.value[2]) + uint8_t *const p = reinterpret_cast<uint8_t *>(pixels); + if (!(*pixels & 0xff000000)) + continue; + + std::vector<DyeColor>::const_iterator it = mColors.begin(); + while (it != it_end) { - color[0] = col2.value[0]; - color[1] = col2.value[1]; - color[2] = col2.value[2]; - return; + const DyeColor &col = *it; + ++ it; + const DyeColor &col2 = *it; + + const unsigned int data = (*pixels) & 0x00ffffff; + const unsigned int coldata = (col.value[0]) + | (col.value[1] << 8) | (col.value[2] << 16); + + if (data == coldata) + { + p[0] = col2.value[0]; + p[1] = col2.value[1]; + p[2] = col2.value[2]; + break; + } + + ++ it; } - ++ it; } } -void DyePalette::replaceAOGLColor(uint8_t *const color) const +void DyePalette::replaceAOGLColor(uint32_t *pixels, const int bufSize) const { - std::vector<DyeColor>::const_iterator it = mColors.begin(); - const std::vector<DyeColor>::const_iterator it_end = mColors.end(); - while (it != it_end) + std::vector<DyeColor>::const_iterator it_end = mColors.end(); + const int sz = mColors.size(); + if (!sz) + return; + if (sz % 2) + -- it_end; + + for (uint32_t *p_end = pixels + bufSize; pixels != p_end; ++pixels) { - const DyeColor &col = *it; - ++ it; - if (it == it_end) - return; - const DyeColor &col2 = *it; - if (color[0] == col.value[0] && color[1] == col.value[1] - && color[2] == col.value[2] && color[3] == col.value[3]) + uint8_t *const p = reinterpret_cast<uint8_t *>(pixels); + + std::vector<DyeColor>::const_iterator it = mColors.begin(); + while (it != it_end) { - color[0] = col2.value[0]; - color[1] = col2.value[1]; - color[2] = col2.value[2]; - color[3] = col2.value[3]; - return; + const DyeColor &col = *it; + ++ it; + const DyeColor &col2 = *it; + + const unsigned int data = *pixels; + const unsigned int coldata = (col.value[0]) | (col.value[1] << 8) + | (col.value[2] << 16) | (col.value[3] << 24); + + if (data == coldata) + { + p[0] = col2.value[0]; + p[1] = col2.value[1]; + p[2] = col2.value[2]; + p[3] = col2.value[3]; + break; + } + + ++ it; } - ++ it; } } |