Changeset - r9548:44248dc324db
[Not reviewed]
master
0 1 0
smatz - 16 years ago 2008-06-18 13:11:02
smatz@openttd.org
(svn r13564) -Codechange: do not use SetPixel in PaletteAnimate, access destination directly instead. Makes palette animation ~40% faster.
1 file changed with 16 insertions and 6 deletions:
0 comments (0 inline, 0 general)
src/blitter/32bpp_anim.cpp
Show inline comments
 
@@ -4,6 +4,7 @@
 

	
 
#include "../stdafx.h"
 
#include "../core/alloc_func.hpp"
 
#include "../core/math_func.hpp"
 
#include "../gfx_func.h"
 
#include "../zoom_func.h"
 
#include "../debug.h"
 
@@ -291,20 +292,29 @@ int Blitter_32bppAnim::BufferSize(int wi
 
void Blitter_32bppAnim::PaletteAnimate(uint start, uint count)
 
{
 
	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 */
 
	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 */
 
	for (int y = 0; y < this->anim_buf_height; y++) {
 
		for (int x = 0; x < this->anim_buf_width; x++) {
 
			if (*anim >= start && *anim <= start + count) {
 
	for (int y = this->anim_buf_height; y != 0 ; y--) {
 
		for (int x = this->anim_buf_width; x != 0 ; x--) {
 
			uint colour = *anim;
 
			if (IsInsideBS(colour, start, count)) {
 
				/* Update this pixel */
 
				this->SetPixel(_screen.dst_ptr, x, y, *anim);
 
				*dst = LookupColourInPalette(colour);
 
			}
 
			dst++;
 
			anim++;
 
		}
 
		dst += _screen.pitch - _screen.width;
 
	}
 

	
 
	/* Make sure the backend redraws the whole screen */
0 comments (0 inline, 0 general)