summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2010-01-04 02:32:36 +0000
committerpeter1138 <peter1138@openttd.org>2010-01-04 02:32:36 +0000
commitabb147d9742f349513d076a76b2957eb573d78e7 (patch)
tree57b0ff251d966e055785a8e289aacc6431540af4 /src
parent5ab64809fe72c38d373bdbed6ffa9b6660dd69d6 (diff)
downloadopenttd-abb147d9742f349513d076a76b2957eb573d78e7.tar.xz
(svn r18709) -Fix (r10227,FS#3464): Animation buffer for 32bpp-anim blitter was only validated during sprite blitting, other drawing operations didn't check it. Initial startup and window resize could therefore lead to crash.
Diffstat (limited to 'src')
-rw-r--r--src/blitter/32bpp_anim.cpp19
-rw-r--r--src/blitter/32bpp_anim.hpp1
-rw-r--r--src/blitter/base.hpp5
-rw-r--r--src/video/allegro_v.cpp2
-rw-r--r--src/video/cocoa/cocoa_v.mm2
-rw-r--r--src/video/sdl_v.cpp3
-rw-r--r--src/video/win32_v.cpp6
7 files changed, 30 insertions, 8 deletions
diff --git a/src/blitter/32bpp_anim.cpp b/src/blitter/32bpp_anim.cpp
index ef42ee0a3..42fbe3fe9 100644
--- a/src/blitter/32bpp_anim.cpp
+++ b/src/blitter/32bpp_anim.cpp
@@ -202,14 +202,6 @@ void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
return;
}
- if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height) {
- /* The size of the screen changed; we can assume we can wipe all data from our buffer */
- free(this->anim_buf);
- this->anim_buf = CallocT<uint8>(_screen.width * _screen.height);
- this->anim_buf_width = _screen.width;
- this->anim_buf_height = _screen.height;
- }
-
switch (mode) {
default: NOT_REACHED();
case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom); return;
@@ -448,3 +440,14 @@ Blitter::PaletteAnimation Blitter_32bppAnim::UsePaletteAnimation()
{
return Blitter::PALETTE_ANIMATION_BLITTER;
}
+
+void Blitter_32bppAnim::PostResize()
+{
+ if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height) {
+ /* The size of the screen changed; we can assume we can wipe all data from our buffer */
+ free(this->anim_buf);
+ this->anim_buf = CallocT<uint8>(_screen.width * _screen.height);
+ this->anim_buf_width = _screen.width;
+ this->anim_buf_height = _screen.height;
+ }
+}
diff --git a/src/blitter/32bpp_anim.hpp b/src/blitter/32bpp_anim.hpp
index 29f8a8d41..9063bf14c 100644
--- a/src/blitter/32bpp_anim.hpp
+++ b/src/blitter/32bpp_anim.hpp
@@ -42,6 +42,7 @@ public:
/* virtual */ const char *GetName() { return "32bpp-anim"; }
/* virtual */ int GetBytesPerPixel() { return 5; }
+ /* virtual */ void PostResize();
template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
};
diff --git a/src/blitter/base.hpp b/src/blitter/base.hpp
index 9046bca5e..278f3b7c8 100644
--- a/src/blitter/base.hpp
+++ b/src/blitter/base.hpp
@@ -200,6 +200,11 @@ public:
*/
virtual int GetBytesPerPixel() = 0;
+ /**
+ * Post resize event
+ */
+ virtual void PostResize() { };
+
virtual ~Blitter() { }
};
diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp
index d1717f9b1..dac11071e 100644
--- a/src/video/allegro_v.cpp
+++ b/src/video/allegro_v.cpp
@@ -221,6 +221,8 @@ static bool CreateMainSurface(uint w, uint h)
_cursor.pos.x = mouse_x;
_cursor.pos.y = mouse_y;
+ BlitterFactoryBase::GetCurrentBlitter()->PostResize();
+
InitPalette();
char caption[32];
diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm
index 0a0834686..7589420b0 100644
--- a/src/video/cocoa/cocoa_v.mm
+++ b/src/video/cocoa/cocoa_v.mm
@@ -197,6 +197,8 @@ void QZ_GameSizeChanged()
_screen.dst_ptr = _cocoa_subdriver->GetPixelBuffer();
_fullscreen = _cocoa_subdriver->IsFullscreen();
+ BlitterFactoryBase::GetCurrentBlitter()->PostResize();
+
GameSizeChanged();
}
diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp
index 7c39bdba0..3168cf3e8 100644
--- a/src/video/sdl_v.cpp
+++ b/src/video/sdl_v.cpp
@@ -251,6 +251,9 @@ static bool CreateMainSurface(uint w, uint h)
_screen.pitch = newscreen->pitch / (bpp / 8);
_screen.dst_ptr = newscreen->pixels;
_sdl_screen = newscreen;
+
+ BlitterFactoryBase::GetCurrentBlitter()->PostResize();
+
InitPalette();
snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision);
diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp
index 57108f355..15dc4c7eb 100644
--- a/src/video/win32_v.cpp
+++ b/src/video/win32_v.cpp
@@ -160,6 +160,9 @@ static void ClientSizeChanged(int w, int h)
/* mark all palette colors dirty */
_pal_first_dirty = 0;
_pal_count_dirty = 256;
+
+ BlitterFactoryBase::GetCurrentBlitter()->PostResize();
+
GameSizeChanged();
/* redraw screen */
@@ -302,6 +305,9 @@ static bool MakeWindow(bool full_screen)
ShowWindow(_wnd.main_wnd, showstyle);
}
}
+
+ BlitterFactoryBase::GetCurrentBlitter()->PostResize();
+
GameSizeChanged(); // invalidate all windows, force redraw
return true; // the request succedded
}