diff options
author | Andrei Karas <akaras@inbox.ru> | 2011-07-04 23:43:12 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2011-07-04 23:43:12 +0300 |
commit | 0202b0b4cdac57a04a3765f6bca893bd3b5c9812 (patch) | |
tree | 1d91b33250e8f23dcba6e8f8a3d05f94f4e6f070 | |
parent | 7364862b5947dcc51cd8209199028b135f1b86b0 (diff) | |
download | mv-0202b0b4cdac57a04a3765f6bca893bd3b5c9812.tar.gz mv-0202b0b4cdac57a04a3765f6bca893bd3b5c9812.tar.bz2 mv-0202b0b4cdac57a04a3765f6bca893bd3b5c9812.tar.xz mv-0202b0b4cdac57a04a3765f6bca893bd3b5c9812.zip |
Improve fillRectangle speed in SDL mode.
-rw-r--r-- | src/graphics.cpp | 50 |
1 files changed, 20 insertions, 30 deletions
diff --git a/src/graphics.cpp b/src/graphics.cpp index ff8bda066..ee848a673 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -737,25 +737,19 @@ void Graphics::fillRectangle(const gcn::Rectangle& rectangle) case 1: for (y = y1; y < y2; y++) { + Uint8 *p = (Uint8 *)mTarget->pixels + y * mTarget->pitch; for (x = x1; x < x2; x++) - { - Uint8 *p = (Uint8 *)mTarget->pixels - + y * mTarget->pitch + x * bpp; - *p = pixel; - //SDLputPixelAlpha(mTarget, x, y, mColor); - } + *(p + x) = pixel; } break; case 2: for (y = y1; y < y2; y++) { + Uint8 *p = (Uint8 *)mTarget->pixels + y * mTarget->pitch; for (x = x1; x < x2; x++) { - Uint8 *p = (Uint8 *)mTarget->pixels - + y * mTarget->pitch + x * bpp; - *(Uint16 *)p = gcn::SDLAlpha16(pixel, *(Uint32 *)p, - mColor.a, mTarget->format); - //SDLputPixelAlpha(mTarget, x, y, mColor); + *(Uint16 *)(p + x * 2) = gcn::SDLAlpha16( + pixel, *(Uint32 *)p, mColor.a, mTarget->format); } } break; @@ -768,23 +762,19 @@ void Graphics::fillRectangle(const gcn::Rectangle& rectangle) for (y = y1; y < y2; y++) { + Uint8 *p0 = (Uint8 *)mTarget->pixels + y * mTarget->pitch; for (x = x1; x < x2; x++) { - Uint8 *p = (Uint8 *)mTarget->pixels - + y * mTarget->pitch + x * bpp; - if (SDL_BYTEORDER == SDL_BIG_ENDIAN) - { - p[2] = (p[2] * ca + cb) >> 8; - p[1] = (p[1] * ca + cg) >> 8; - p[0] = (p[0] * ca + cr) >> 8; - } - else - { - p[0] = (p[0] * ca + cb) >> 8; - p[1] = (p[1] * ca + cg) >> 8; - p[2] = (p[2] * ca + cr) >> 8; - } - //SDLputPixelAlpha(mTarget, x, y, mColor); + Uint8 *p = p0 + x * 3; +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + p[2] = (p[2] * ca + cb) >> 8; + p[1] = (p[1] * ca + cg) >> 8; + p[0] = (p[0] * ca + cr) >> 8; +#else + p[0] = (p[0] * ca + cb) >> 8; + p[1] = (p[1] * ca + cg) >> 8; + p[2] = (p[2] * ca + cr) >> 8; +#endif } } break; @@ -797,18 +787,18 @@ void Graphics::fillRectangle(const gcn::Rectangle& rectangle) const unsigned a1 = (255 - mColor.a); for (y = y1; y < y2; y++) { + Uint8 *p0 = (Uint8 *)mTarget->pixels + y * mTarget->pitch; for (x = x1; x < x2; x++) { - Uint8 *p = (Uint8 *)mTarget->pixels - + y * mTarget->pitch + x * bpp; + Uint8 *p = p0 + x * 4; Uint32 dst = *(Uint32 *)p; const unsigned int b = (pb + (dst & 0xff) * a1) >> 8; const unsigned int g = (pg + (dst & 0xff00) * a1) >> 8; const unsigned int r = (pr + (dst & 0xff0000) * a1) >> 8; - *(Uint32 *)p = ((b & 0xff) - | (g & 0xff00) | (r & 0xff0000)); + *(Uint32 *)p = ((b & 0xff) | (g & 0xff00) + | (r & 0xff0000)); } } break; |