summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <darkvater@openttd.org>2006-10-27 11:49:51 +0000
committerDarkvater <darkvater@openttd.org>2006-10-27 11:49:51 +0000
commiteb45bf634014b68c3d0466354c13c0e20c3825f8 (patch)
treee1e6a11374ab668afaf9c6a18533bbfce3092f87
parente205c693e116ef4773a1d76b8b6cfef3762e25f5 (diff)
downloadopenttd-eb45bf634014b68c3d0466354c13c0e20c3825f8.tar.xz
(svn r6959) -Codechange: Move GfxFillRect() out of the chat-message drawing loop since we already
know how many lines we are going to draw. On certain architectures this results in a minor penalty of local function performance if only 1 line is drawn. But starting from 2 and more you'll get a net gain.
-rw-r--r--texteff.c40
1 files changed, 18 insertions, 22 deletions
diff --git a/texteff.c b/texteff.c
index 51f98aeed..c535fab06 100644
--- a/texteff.c
+++ b/texteff.c
@@ -177,8 +177,7 @@ void TextMessageDailyLoop(void)
// Draw the textmessage-box
void DrawTextMessage(void)
{
- int i, j;
- bool has_message;
+ uint y, count;
if (!_textmessage_dirty) return;
@@ -188,13 +187,8 @@ void DrawTextMessage(void)
if (_iconsole_mode == ICONSOLE_FULL) return;
/* Check if we have anything to draw at all */
- has_message = false;
- for ( i = 0; i < MAX_CHAT_MESSAGES; i++) {
- if (_textmsg_list[i].message[0] == '\0') break;
-
- has_message = true;
- }
- if (!has_message) return;
+ count = GetTextMessageCount();
+ if (count == 0) return;
// Make a copy of the screen as it is before painting (for undraw)
memcpy_pitch(
@@ -202,19 +196,21 @@ void DrawTextMessage(void)
_screen.dst_ptr + _textmsg_box.x + (_screen.height - _textmsg_box.y - _textmsg_box.height) * _screen.pitch,
_textmsg_box.width, _textmsg_box.height, _screen.pitch, _textmsg_box.width);
- // Switch to _screen painting
- _cur_dpi = &_screen;
-
- j = 0;
- // Paint the messages
- for (i = MAX_CHAT_MESSAGES - 1; i >= 0; i--) {
- if (_textmsg_list[i].message[0] == '\0') continue;
-
- j++;
- GfxFillRect(_textmsg_box.x, _screen.height-_textmsg_box.y-j*13-2, _textmsg_box.x+_textmsg_box.width - 1, _screen.height-_textmsg_box.y-j*13+10, /* black, but with some alpha */ 0x322 | USE_COLORTABLE);
-
- DoDrawString(_textmsg_list[i].message, _textmsg_box.x + 3, _screen.height - _textmsg_box.y - j * 13, _textmsg_list[i].color);
- }
+ _cur_dpi = &_screen; // switch to _screen painting
+
+ /* Paint a half-transparent box behind the text messages */
+ GfxFillRect(
+ _textmsg_box.x,
+ _screen.height - _textmsg_box.y - count * 13 - 2,
+ _textmsg_box.x + _textmsg_box.width - 1,
+ _screen.height - _textmsg_box.y - 2,
+ 0x322 | USE_COLORTABLE // black, but with some alpha for background
+ );
+
+ /* Paint the messages starting with the lowest at the bottom */
+ for (y = 13; count-- != 0; y += 13) {
+ DoDrawString(_textmsg_list[count].message, _textmsg_box.x + 3, _screen.height - _textmsg_box.y - y + 1, _textmsg_list[count].color);
+ }
// Make sure the data is updated next flush
_video_driver->make_dirty(_textmsg_box.x, _screen.height - _textmsg_box.y - _textmsg_box.height, _textmsg_box.width, _textmsg_box.height);