From abb147d9742f349513d076a76b2957eb573d78e7 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Mon, 4 Jan 2010 02:32:36 +0000 Subject: (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. --- src/blitter/32bpp_anim.cpp | 19 +++++++++++-------- src/blitter/32bpp_anim.hpp | 1 + src/blitter/base.hpp | 5 +++++ src/video/allegro_v.cpp | 2 ++ src/video/cocoa/cocoa_v.mm | 2 ++ src/video/sdl_v.cpp | 3 +++ src/video/win32_v.cpp | 6 ++++++ 7 files changed, 30 insertions(+), 8 deletions(-) (limited to 'src') 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(_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 (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(_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 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 } -- cgit v1.2.3-54-g00ecf