changeset 9548:13d2b29b23ed draft

(svn r13564) -Codechange: do not use SetPixel in PaletteAnimate, access destination directly instead. Makes palette animation ~40% faster.
author smatz <smatz@openttd.org>
date Wed, 18 Jun 2008 13:11:02 +0000
parents 3510b3758252
children cd35cea9d51b
files src/blitter/32bpp_anim.cpp
diffstat 1 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/blitter/32bpp_anim.cpp
+++ b/src/blitter/32bpp_anim.cpp
@@ -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 @@
 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 */