(svn r14080) -Fix (r14052): assert triggered when drawing chat window with 32bpp-anim blitter (backup buffer was too small)

pull/155/head
glx 16 years ago
parent 6957fbb5d0
commit c7453851d3

@ -34,6 +34,7 @@ public:
/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation(); /* virtual */ Blitter::PaletteAnimation UsePaletteAnimation();
/* virtual */ const char *GetName() { return "32bpp-anim"; } /* virtual */ const char *GetName() { return "32bpp-anim"; }
/* virtual */ int GetBytesPerPixel() { return 5; }
template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom); template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
}; };

@ -26,6 +26,7 @@ public:
/* virtual */ int BufferSize(int width, int height); /* virtual */ int BufferSize(int width, int height);
/* virtual */ void PaletteAnimate(uint start, uint count); /* virtual */ void PaletteAnimate(uint start, uint count);
/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation(); /* virtual */ Blitter::PaletteAnimation UsePaletteAnimation();
/* virtual */ int GetBytesPerPixel() { return 4; }
/** /**
* Compose a colour based on RGB values. * Compose a colour based on RGB values.

@ -25,6 +25,7 @@ public:
/* virtual */ int BufferSize(int width, int height); /* virtual */ int BufferSize(int width, int height);
/* virtual */ void PaletteAnimate(uint start, uint count); /* virtual */ void PaletteAnimate(uint start, uint count);
/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation(); /* virtual */ Blitter::PaletteAnimation UsePaletteAnimation();
/* virtual */ int GetBytesPerPixel() { return 1; }
}; };
#endif /* BLITTER_8BPP_BASE_HPP */ #endif /* BLITTER_8BPP_BASE_HPP */

@ -183,10 +183,15 @@ public:
virtual Blitter::PaletteAnimation UsePaletteAnimation() = 0; virtual Blitter::PaletteAnimation UsePaletteAnimation() = 0;
/** /**
* Get the naem of the blitter, the same as the Factory-instance returns. * Get the name of the blitter, the same as the Factory-instance returns.
*/ */
virtual const char *GetName() = 0; virtual const char *GetName() = 0;
/**
* Get how many bytes are needed to store a pixel.
*/
virtual int GetBytesPerPixel() = 0;
virtual ~Blitter() { } virtual ~Blitter() { }
}; };

@ -28,6 +28,7 @@ public:
/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation() { return Blitter::PALETTE_ANIMATION_NONE; }; /* virtual */ Blitter::PaletteAnimation UsePaletteAnimation() { return Blitter::PALETTE_ANIMATION_NONE; };
/* virtual */ const char *GetName() { return "null"; } /* virtual */ const char *GetName() { return "null"; }
/* virtual */ int GetBytesPerPixel() { return 0; }
}; };
class FBlitter_Null: public BlitterFactory<FBlitter_Null> { class FBlitter_Null: public BlitterFactory<FBlitter_Null> {

@ -119,7 +119,7 @@ void NetworkInitChatMessage()
_chatmsg_box.y = 30; _chatmsg_box.y = 30;
_chatmsg_box.width = _settings_client.gui.network_chat_box_width; _chatmsg_box.width = _settings_client.gui.network_chat_box_width;
_chatmsg_box.height = _settings_client.gui.network_chat_box_height * NETWORK_CHAT_LINE_HEIGHT; _chatmsg_box.height = _settings_client.gui.network_chat_box_height * NETWORK_CHAT_LINE_HEIGHT;
_chatmessage_backup = ReallocT(_chatmessage_backup, _chatmsg_box.width * _chatmsg_box.height * sizeof(uint32)); _chatmessage_backup = ReallocT(_chatmessage_backup, _chatmsg_box.width * _chatmsg_box.height * BlitterFactoryBase::GetCurrentBlitter()->GetBytesPerPixel());
for (uint i = 0; i < MAX_CHAT_MESSAGES; i++) { for (uint i = 0; i < MAX_CHAT_MESSAGES; i++) {
_chatmsg_list[i].message[0] = '\0'; _chatmsg_list[i].message[0] = '\0';
@ -224,7 +224,7 @@ void NetworkDrawChatMessage()
} }
if (width <= 0 || height <= 0) return; if (width <= 0 || height <= 0) return;
assert(blitter->BufferSize(width, height) < (int)(_chatmsg_box.width * _chatmsg_box.height * sizeof(uint32))); assert(blitter->BufferSize(width, height) <= (int)(_chatmsg_box.width * _chatmsg_box.height * blitter->GetBytesPerPixel()));
/* Make a copy of the screen as it is before painting (for undraw) */ /* Make a copy of the screen as it is before painting (for undraw) */
blitter->CopyToBuffer(blitter->MoveTo(_screen.dst_ptr, x, y), _chatmessage_backup, width, height); blitter->CopyToBuffer(blitter->MoveTo(_screen.dst_ptr, x, y), _chatmessage_backup, width, height);

Loading…
Cancel
Save