diff options
author | Darkvater <Darkvater@openttd.org> | 2006-10-27 11:49:51 +0000 |
---|---|---|
committer | Darkvater <Darkvater@openttd.org> | 2006-10-27 11:49:51 +0000 |
commit | 33873e35793f81a56845e0da9321e4aec3ac0ab0 (patch) | |
tree | e1e6a11374ab668afaf9c6a18533bbfce3092f87 | |
parent | 52a7e2135d93b3528105a446ae6b5e392f3fa24c (diff) | |
download | openttd-33873e35793f81a56845e0da9321e4aec3ac0ab0.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.c | 40 |
1 files changed, 18 insertions, 22 deletions
@@ -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); |