From 08b69b636166442a71d2bd5ff8a1258dda98e8f8 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Thu, 12 Jun 2014 21:19:13 +0200 Subject: [PATCH] Bug fix: off-by-one --- src/gfx.c | 55 ++++++++++++++++++++++--------------------------------- 1 file changed, 22 insertions(+), 33 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index 0ce2b204cb..77d2a37ad2 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1351,7 +1351,7 @@ int gfx_get_string_width(char* buffer) int gfx_clip_string(char* buffer, int width) { // Location of font sprites - uint16* current_font_sprite_base; + uint16 current_font_sprite_base; // Width the string has to fit into unsigned int max_width; // Character to change to ellipsis @@ -1363,19 +1363,19 @@ int gfx_clip_string(char* buffer, int width) *buffer = 0; return 0; } - - current_font_sprite_base = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - max_width = (uint32)width - (3 * RCT2_ADDRESS(0x141E9F6, uint8)[*current_font_sprite_base]); + + current_font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + max_width = width - (3 * RCT2_ADDRESS(0x141E9F6, uint8)[current_font_sprite_base]); clipped_width = 0; last_char = buffer; for (unsigned char* curr_char = buffer; *curr_char != NULL; curr_char++) { if (*curr_char < 0x20) { - switch(*curr_char) { + switch (*curr_char) { case 1: - clipped_width = *curr_char; curr_char++; + clipped_width = *curr_char; continue; case 2: case 3: @@ -1383,36 +1383,37 @@ int gfx_clip_string(char* buffer, int width) curr_char++; continue; case 7: - *current_font_sprite_base = 0x1C0; + current_font_sprite_base = 0x1C0; break; case 8: - *current_font_sprite_base = 0x2A0; + current_font_sprite_base = 0x2A0; break; case 9: - *current_font_sprite_base = 0x0E0; + current_font_sprite_base = 0x0E0; break; case 0x0A: - *current_font_sprite_base = 0; + current_font_sprite_base = 0; break; case 0x17: - clipped_width += RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[(*curr_char & 0x7FFFF) << 4]; + clipped_width += RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[(*(curr_char+1) & 0x7FFFF) << 4]; curr_char += 4; continue; default: if (*curr_char <= 0x10) { continue; } - curr_char += 2; + if (*curr_char <= 0x16) { + curr_char += 2; continue; } - curr_char += 2; + curr_char += 4; continue; } - max_width = width - (3 * RCT2_ADDRESS(0x141E9F6, uint8)[*current_font_sprite_base]); + max_width = width - (3 * RCT2_ADDRESS(0x141E9F6, uint8)[current_font_sprite_base]); } - clipped_width += RCT2_ADDRESS(0x0141E9E8, uint8)[*current_font_sprite_base + (*curr_char-0x20)]; + clipped_width += RCT2_ADDRESS(0x0141E9E8, uint8)[current_font_sprite_base + (*curr_char - 0x20)]; if (clipped_width > width) { *((uint32*)last_char) = '...'; @@ -1420,12 +1421,13 @@ int gfx_clip_string(char* buffer, int width) return clipped_width; } if (clipped_width <= max_width) { - last_char = curr_char; + last_char = curr_char+1; } } return clipped_width; } + /** * Wrap the text in buffer to width, returns width of longest line. * @@ -1821,20 +1823,7 @@ void sub_682AC7(int ebp, uint16* current_font_flags) { */ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, int y) { - //int eax, ebx, ecx, edx, esi, edi, ebp; - //char* find = "FINDMEDRAWSTRING"; - //eax = colour; - //ebx = 0; - //ecx = x; - //edx = y; - //esi = (int)buffer; - //edi = (int)dpi; - //ebp = 0; - //RCT2_CALLFUNC_X(0x00682702, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - //gLastDrawStringX = ecx; - //gLastDrawStringY = edx; - // int eax, ebx, ecx, edx, esi, edi, ebp; rct_g1_element* g1_element; @@ -1994,13 +1983,13 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in max_y -= 0xFFFA;//This does not look correct probably should be an add break; case 0x0E1://Start New Line at start+buffer x, same y. (Overwrite?) - al = *buffer; + al = *(buffer+1); buffer++; max_x = x;//RCT2_GLOBAL(0x0EDF840, uint16); max_x += al; break; case 0x0F1: //Start new line at specified x,y - eax = *((uint16*)buffer); + eax = *((uint16*)(buffer+1)); buffer += 2; max_x = x;//RCT2_GLOBAL(0x0EDF840, uint16); max_x += (eax & 0xFF); @@ -2062,7 +2051,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in sub_682AC7(ebp, current_font_flags); break; case 0x0E2: - al = *buffer; + al = *(buffer+1); buffer++; if (*current_font_flags & 1) { if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { @@ -2098,7 +2087,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in skip_char = 1; break; } - ebx = *((uint32*)(buffer - 4)); + ebx = *(buffer - 3); eax = ebx & 0x7FFFF; g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[eax]);