diff options
author | Andrei Karas <akaras@inbox.ru> | 2012-06-03 17:26:04 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2012-06-03 17:26:04 +0300 |
commit | 57a81ed6cf1c02d7ec8bfe1e6f0a1d3232309534 (patch) | |
tree | 4677cd003c75753536dd90b864959b0982ca42d7 /src/resources/image.cpp | |
parent | a1e8fc08282d11b0132670cf1bfde2b7fe989dc2 (diff) | |
download | mv-57a81ed6cf1c02d7ec8bfe1e6f0a1d3232309534.tar.gz mv-57a81ed6cf1c02d7ec8bfe1e6f0a1d3232309534.tar.bz2 mv-57a81ed6cf1c02d7ec8bfe1e6f0a1d3232309534.tar.xz mv-57a81ed6cf1c02d7ec8bfe1e6f0a1d3232309534.zip |
Improve dye speed.
Diffstat (limited to 'src/resources/image.cpp')
-rw-r--r-- | src/resources/image.cpp | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/src/resources/image.cpp b/src/resources/image.cpp index 34a2e22b7..da20719ac 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -164,19 +164,34 @@ Resource *Image::load(SDL_RWops *rw, Dye const &dye) SDL_FreeSurface(tmpImage); Uint32 *pixels = static_cast<Uint32 *>(surf->pixels); - for (Uint32 *p_end = pixels + surf->w * surf->h; pixels != p_end; ++pixels) - { - const Uint32 p = *pixels; - - int alpha = p & 255; - if (!alpha) - continue; - int v[3]; - v[0] = (p >> 24) & 255; - v[1] = (p >> 16) & 255; - v[2] = (p >> 8 ) & 255; - dye.update(v); - *pixels = (v[0] << 24) | (v[1] << 16) | (v[2] << 8) | alpha; + DyePalette *pal = dye.getSPalete(); + + if (pal) + { + for (Uint32 *p_end = pixels + surf->w * surf->h; pixels != p_end; ++pixels) + { + Uint8 *p = (Uint8 *)pixels; + const int alpha = *p & 255; + if (!alpha) + continue; + pal->replaceColor(p + 1); + } + } + else + { + for (Uint32 *p_end = pixels + surf->w * surf->h; pixels != p_end; ++pixels) + { + const Uint32 p = *pixels; + const int alpha = p & 255; + if (!alpha) + continue; + int v[3]; + v[0] = (p >> 24) & 255; + v[1] = (p >> 16) & 255; + v[2] = (p >> 8 ) & 255; + dye.update(v); + *pixels = (v[0] << 24) | (v[1] << 16) | (v[2] << 8) | alpha; + } } Image *image = load(surf); |