diff options
Diffstat (limited to 'src/guichan/sdl/sdlpixel.hpp')
-rw-r--r-- | src/guichan/sdl/sdlpixel.hpp | 213 |
1 files changed, 113 insertions, 100 deletions
diff --git a/src/guichan/sdl/sdlpixel.hpp b/src/guichan/sdl/sdlpixel.hpp index a5d9ca5a1..675b10fcd 100644 --- a/src/guichan/sdl/sdlpixel.hpp +++ b/src/guichan/sdl/sdlpixel.hpp @@ -70,40 +70,36 @@ namespace gcn switch(bpp) { - case 1: - color = *p; - break; - - case 2: - color = *(Uint16 *)p; - break; - - case 3: - if(SDL_BYTEORDER == SDL_BIG_ENDIAN) - { - color = p[0] << 16 | p[1] << 8 | p[2]; - } - else - { - color = p[0] | p[1] << 8 | p[2] << 16; - } - break; + case 1: + color = *p; + break; + + case 2: + color = *(Uint16 *)p; + break; + + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + color = p[0] << 16 | p[1] << 8 | p[2]; + else + color = p[0] | p[1] << 8 | p[2] << 16; + break; case 4: - color = *(Uint32 *)p; - break; + color = *(Uint32 *)p; + break; default: - color = *p; - break; + color = *p; + break; } - unsigned char r,g,b,a; + unsigned char r, g, b, a; SDL_GetRGBA(color, surface->format, &r, &g, &b, &a); SDL_UnlockSurface(surface); - return Color(r,g,b,a); + return Color(r, g, b, a); } /** @@ -113,7 +109,8 @@ namespace gcn * @param y the y coordinate on the surface. * @param color the color the pixel should be in. */ - inline void SDLputPixel(SDL_Surface* surface, int x, int y, const Color& color) + inline void SDLputPixel(SDL_Surface* surface, int x, int y, + const Color& color) { int bpp = surface->format->BytesPerPixel; @@ -125,35 +122,35 @@ namespace gcn switch(bpp) { - case 1: - *p = pixel; - break; - - case 2: - *(Uint16 *)p = pixel; - break; - - case 3: - if(SDL_BYTEORDER == SDL_BIG_ENDIAN) - { - p[0] = (pixel >> 16) & 0xff; - p[1] = (pixel >> 8) & 0xff; - p[2] = pixel & 0xff; - } - else - { - p[0] = pixel & 0xff; - p[1] = (pixel >> 8) & 0xff; - p[2] = (pixel >> 16) & 0xff; - } - break; - - case 4: - *(Uint32 *)p = pixel; - break; - - default: - break; + case 1: + *p = pixel; + break; + + case 2: + *(Uint16 *)p = pixel; + break; + + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + { + p[0] = (pixel >> 16) & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = pixel & 0xff; + } + else + { + p[0] = pixel & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = (pixel >> 16) & 0xff; + } + break; + + case 4: + *(Uint32 *)p = pixel; + break; + + default: + break; } SDL_UnlockSurface(surface); @@ -166,11 +163,14 @@ namespace gcn * @param dst the destination color. * @param a alpha. */ - inline unsigned int SDLAlpha32(unsigned int src, unsigned int dst, unsigned char a) + inline unsigned int SDLAlpha32(unsigned int src, unsigned int dst, + unsigned char a) { unsigned int b = ((src & 0xff) * a + (dst & 0xff) * (255 - a)) >> 8; - unsigned int g = ((src & 0xff00) * a + (dst & 0xff00) * (255 - a)) >> 8; - unsigned int r = ((src & 0xff0000) * a + (dst & 0xff0000) * (255 - a)) >> 8; + unsigned int g = ((src & 0xff00) * a + (dst & 0xff00) + * (255 - a)) >> 8; + unsigned int r = ((src & 0xff0000) * a + (dst & 0xff0000) + * (255 - a)) >> 8; return (b & 0xff) | (g & 0xff00) | (r & 0xff0000); } @@ -182,13 +182,18 @@ namespace gcn * @param dst the destination color. * @param a alpha. */ - inline unsigned short SDLAlpha16(unsigned short src, unsigned short dst, unsigned char a, const SDL_PixelFormat *f) + inline unsigned short SDLAlpha16(unsigned short src, unsigned short dst, + unsigned char a, const SDL_PixelFormat *f) { - unsigned int b = ((src & f->Rmask) * a + (dst & f->Rmask) * (255 - a)) >> 8; - unsigned int g = ((src & f->Gmask) * a + (dst & f->Gmask) * (255 - a)) >> 8; - unsigned int r = ((src & f->Bmask) * a + (dst & f->Bmask) * (255 - a)) >> 8; - - return (unsigned short)((b & f->Rmask) | (g & f->Gmask) | (r & f->Bmask)); + unsigned int b = ((src & f->Rmask) * a + (dst & f->Rmask) + * (255 - a)) >> 8; + unsigned int g = ((src & f->Gmask) * a + (dst & f->Gmask) + * (255 - a)) >> 8; + unsigned int r = ((src & f->Bmask) * a + (dst & f->Bmask) + * (255 - a)) >> 8; + + return (unsigned short)((b & f->Rmask) + | (g & f->Gmask) | (r & f->Bmask)); } /* @@ -211,7 +216,8 @@ namespace gcn * @param y the y coordinate on the surface. * @param color the color the pixel should be in. */ - inline void SDLputPixelAlpha(SDL_Surface* surface, int x, int y, const Color& color) + inline void SDLputPixelAlpha(SDL_Surface* surface, int x, int y, + const Color& color) { int bpp = surface->format->BytesPerPixel; @@ -223,42 +229,49 @@ namespace gcn switch(bpp) { - case 1: - *p = pixel; - break; - - case 2: - *(Uint16 *)p = SDLAlpha16(pixel, *(Uint32 *)p, color.a, surface->format); - break; - - case 3: - if(SDL_BYTEORDER == SDL_BIG_ENDIAN) - { - unsigned int r = (p[0] * (255 - color.a) + color.r * color.a) >> 8; - unsigned int g = (p[1] * (255 - color.a) + color.g * color.a) >> 8; - unsigned int b = (p[2] * (255 - color.a) + color.b * color.a) >> 8; - - p[2] = b; - p[1] = g; - p[0] = r; - } - else - { - unsigned int r = (p[2] * (255 - color.a) + color.r * color.a) >> 8; - unsigned int g = (p[1] * (255 - color.a) + color.g * color.a) >> 8; - unsigned int b = (p[0] * (255 - color.a) + color.b * color.a) >> 8; - - p[0] = b; - p[1] = g; - p[2] = r; - } - break; - - case 4: - *(Uint32 *)p = SDLAlpha32(pixel, *(Uint32 *)p, color.a); - break; - default: - break; + case 1: + *p = pixel; + break; + + case 2: + *(Uint16 *)p = SDLAlpha16(pixel, *(Uint32 *)p, + color.a, surface->format); + break; + + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + { + unsigned int r = (p[0] * (255 - color.a) + + color.r * color.a) >> 8; + unsigned int g = (p[1] * (255 - color.a) + + color.g * color.a) >> 8; + unsigned int b = (p[2] * (255 - color.a) + + color.b * color.a) >> 8; + + p[2] = b; + p[1] = g; + p[0] = r; + } + else + { + unsigned int r = (p[2] * (255 - color.a) + + color.r * color.a) >> 8; + unsigned int g = (p[1] * (255 - color.a) + + color.g * color.a) >> 8; + unsigned int b = (p[0] * (255 - color.a) + + color.b * color.a) >> 8; + + p[0] = b; + p[1] = g; + p[2] = r; + } + break; + + case 4: + *(Uint32 *)p = SDLAlpha32(pixel, *(Uint32 *)p, color.a); + break; + default: + break; } SDL_UnlockSurface(surface); |