(svn r13564) -Codechange: do not use SetPixel in PaletteAnimate, access destination directly instead. Makes palette animation ~40% faster.

This commit is contained in:
smatz 2008-06-18 13:11:02 +00:00
parent be4e7b86f3
commit cc2f9187cc

View File

@ -4,6 +4,7 @@
#include "../stdafx.h" #include "../stdafx.h"
#include "../core/alloc_func.hpp" #include "../core/alloc_func.hpp"
#include "../core/math_func.hpp"
#include "../gfx_func.h" #include "../gfx_func.h"
#include "../zoom_func.h" #include "../zoom_func.h"
#include "../debug.h" #include "../debug.h"
@ -291,20 +292,29 @@ int Blitter_32bppAnim::BufferSize(int width, int height)
void Blitter_32bppAnim::PaletteAnimate(uint start, uint count) void Blitter_32bppAnim::PaletteAnimate(uint start, uint count)
{ {
assert(!_screen_disable_anim); assert(!_screen_disable_anim);
uint8 *anim = this->anim_buf; assert(_screen.width == this->anim_buf_width && _screen.height == this->anim_buf_height);
/* Never repaint the transparency pixel */ /* Never repaint the transparency pixel */
if (start == 0) start++; if (start == 0) {
start++;
count--;
}
const uint8 *anim = this->anim_buf;
uint32 *dst = (uint32 *)_screen.dst_ptr;
/* Let's walk the anim buffer and try to find the pixels */ /* Let's walk the anim buffer and try to find the pixels */
for (int y = 0; y < this->anim_buf_height; y++) { for (int y = this->anim_buf_height; y != 0 ; y--) {
for (int x = 0; x < this->anim_buf_width; x++) { for (int x = this->anim_buf_width; x != 0 ; x--) {
if (*anim >= start && *anim <= start + count) { uint colour = *anim;
if (IsInsideBS(colour, start, count)) {
/* Update this pixel */ /* Update this pixel */
this->SetPixel(_screen.dst_ptr, x, y, *anim); *dst = LookupColourInPalette(colour);
} }
dst++;
anim++; anim++;
} }
dst += _screen.pitch - _screen.width;
} }
/* Make sure the backend redraws the whole screen */ /* Make sure the backend redraws the whole screen */