From 34a9f94ac170c65a637536918ac35876da743f61 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Sat, 17 May 2014 09:34:58 +0200 Subject: [PATCH 01/18] Add gfx_get_string_width() --- src/gfx.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index 929998071e..c3f5f09a8d 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1041,18 +1041,70 @@ void gfx_redraw_screen_rect(short left, short top, short right, short bottom) } /** - * + * * rct2: 0x006C2321 * buffer (esi) */ int gfx_get_string_width(char *buffer) { - int eax, ebx, ecx, edx, esi, edi, ebp; + int base; + int width; - esi = (int)buffer; - RCT2_CALLFUNC_X(0x006C2321, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + char curr_char; - return ecx & 0xFFFF; + curr_char = 0; + base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + width = 0; + + for (curr_char = *buffer; curr_char > 0; buffer++, curr_char = *buffer) { + + if (curr_char >= 0x20) { + width += RCT2_ADDRESS(0x0141E9E8, uint8)[base + (curr_char-0x20)]; + continue; + } + switch(curr_char) { + case 1: + width = *buffer; + buffer++; + break; + case 2: + case 3: + case 4: + buffer++; + break; + case 7: + base = 0x1C0; + break; + case 8: + base = 0x2A0; + break; + case 9: + base = 0x0E0; + break; + case 0x0A: + base = 0; + break; + case 0x17: + curr_char = *buffer; + curr_char &= 0x7FFFF; + buffer += 4; + curr_char <<= 4; + width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[curr_char]; + curr_char = 0; + break; + default: + if (curr_char <= 0x10) { + continue; + } + buffer += 2; + if (curr_char <= 0x16) { + continue; + } + buffer += 2; + break; + } + } + return width; } /** From 6e778006a5f17445189d16a6867e570f2c89358c Mon Sep 17 00:00:00 2001 From: ZedThree Date: Sat, 17 May 2014 22:37:37 +0200 Subject: [PATCH 02/18] First pass for gfx_draw_string() --- src/addresses.h | 1 + src/gfx.c | 330 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 331 insertions(+) diff --git a/src/addresses.h b/src/addresses.h index 3a36125e05..912461a9b3 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -249,6 +249,7 @@ #define RCT2_ADDRESS_NEWS_ITEM_LIST 0x013CA754 #define RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE 0x013CE950 +#define RCT2_ADDRESS_CURRENT_FONT_FLAGS 0x013CE9A2 #define RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS 0x013CE9A4 #define RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT 0x0141E9AC diff --git a/src/gfx.c b/src/gfx.c index c3f5f09a8d..ced773d864 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1285,4 +1285,334 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *format, int colour, int x, in gLastDrawStringX = ecx; gLastDrawStringY = edx; + + + RCT2_GLOBAL(0x00EDF840, uint16) = x; + RCT2_GLOBAL(0x00EDF842, uint16) = y; + + if (colour & 0xFE) { + // jz loc_682853 + } + + if ((x >= dpi->x + dpi->width) || (x <= dpi->x) || + (y >= dpi->y + dpi->height) || (y <= dpi->y)) { + return; + } + if (colour == 0xFF) { + // jz loc_682853 + } + + uint16* current_font_flags = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); + uint16* current_font_sprite_base = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + + // switch_colour: + *current_font_flags = 0; + if (*current_font_sprite_base < 0) { + *current_font_flags |= 4; + if (*current_font_sprite_base != 0xFFFF) { + *current_font_flags |= 8; + } + *current_font_sprite_base = 0xE0; + } + // loc_6827A5 + if (!(ax & (1 << 5))) { + *current_font_flags |= 2; + } + + // loc_6827B4 + if (!(colour & 0x40)) { + ebp = al; + // jmp short loc_682AC7 + } + + *current_font_flags |= 1; + colour &= 0x1F; + + ebp = colour; + + if (*current_font_flags & 4) { + if (*current_font_flags & 8) { + // loc_682805 + eax = RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; + eax = eax << 10; + eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[ebp * 8]; + } else { + // loc_6827E7 + eax = RCT2_ADDRESS(0x0141FC49, uint8)[ebp * 8]; + eax = eax << 10; + eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[ebp * 8]; + } + } else { + eax = RCT2_ADDRESS(0x0141FC4A, uint8)[ebp * 8]; + eax = eax << 10; + eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; + } + // jmp short loc_682842 + + + // ; --------------------------------------------------------------------------- + + + // ; --------------------------------------------------------------------------- + // loc_682842 + RCT2_GLOBAL(0x009ABE05, uint32) = eax; + RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; + eax = 0; + + // loc_682853 + if (y + 0x13 <= dpi->y) { + skip_char; + } + if (dpi->y + dpi->height <= y) { + skip_char; + } + + // loc_682875 + al = *format; + format++; + + // skip_cont + if (al == 0) { + return; + } + if (al >= 0x9C) { + // jnb short loc_682888 + } + if (al >= 0x8E) { + // jnb colour_char + } + + // loc_682888 + al -= 0x20; + if (al < 0) { + // jb short loc_6828F5 + } + bx = dpi->x + dpi->width; + if (x >= bx) { + // jge skip_char + } + bx = x + 0x1A; + if (bx < dpi->x) { + // jl short loc_6828E0 + } + ebx = al + *current_font_sprite_base; + cl = cl + (RCT2_ADDRESS(0x0141E9E8, uint32)[ebx] & 0xFF) + // push dword_141E9E8[ebx] + // push ecx + // push edx + // push edi + // push esi + + eax = (int)al; + ebx += 0xF15; + esi = (int)format; + edi = (int)dpi; + + RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000; + + RCT2_CALLPROC_X(0x067A46E, eax, ebx, ecx, edx, esi, edi, ebp); + + // pop esi + // pop edi + // pop edx + // pop ecx + // pop eax + + // jmp short loc_682875 + + // loc_6828E0 + ebx = al; + ebx += *current_font_sprite_base; + cl = cl + (RCT2_ADDRESS(0x0141E9E8, uint32)[ebx] & 0xFF); + // jmp short loc_682875 + + // loc_6828F5 + switch (al) { + case 0x0E5: + // jz loc_6829E3 + cx = RCT2_GLOBAL(0x0EDF840, uint16); + dx += 0x0A; + if (*current_font_sprite_base <= 0x0E) { + // jbe loc_682875 + } + dx -= 4; + if (*current_font_sprite_base == 0x1C0) { + // jz loc_682875 + } + dx -= 0xFFF4; + // jmp loc_682875 + case 0x0E6: + // jz loc_6829AD + cx = RCT2_GLOBAL(0x0EDF840, uint16); + dx += 5; + if (*current_font_sprite_base <= 0x0E) { + // jbe loc_682875 + } + dx -= 2; + if (*current_font_sprite_base == 0x1C0) { + // jz loc_682875 + } + dx -= 0xFFFA; + // jmp loc_682875 + case 0x0E1: + // jz loc_682A19 + al = *buffer; + buffer++; + cx = RCT2_GLOBAL(0x0EDF840, uint16); + cx += al; + // jmp loc_682875 + + case 0x0F1: + // jz loc_682A34 + ax = *buffer; + buffer += 2; + cx = RCT2_GLOBAL(0x0EDF840, uint16); + cx += (ax & 0xFF); + dx = RCT2_GLOBAL(0x0EDF842, uint16); + dx += (ax & 0xFF00) >> 8; + // jmp loc_682875 + + + case 0x0E7: + // jz loc_682A57 + *current_font_sprite_base = 0x1C0; + // jmp loc_682875 + + case 0x0E8: + // jz loc_682A65 + *current_font_sprite_base = 0x2A0; + // jmp loc_682875 + + case 0x0E9: + // jz loc_682A81 + *current_font_sprite_base = 0xE0; + // jmp loc_682875 + + case 0x0EA: + // jz loc_682A73 + *current_font_sprite_base = 0; + // jmp loc_682875 + + case 0x0EB: + // jz loc_682A8F + *current_font_flags |= 2; + // jmp loc_682875 + + case 0x0EC: + // jz loc_682A9C + *current_font_flags &= 0x0FFFD; + // jmp loc_682875 + + case 0x0ED: + // jz loc_682AAE + ebp = RCT2_GLOBAL(0x0141F740, uint8); + + // jmp short loc_682AC7 + + case 0x0EE: + // jz loc_682AC0 + ebp = RCT2_GLOBAL(0x0141F741, uint8); + + // jmp short loc_682AC7 + + case 0x0EF: + // jz loc_682AB7 + ebp = RCT2_GLOBAL(0x0141F742, uint8); + + // jmp short loc_682AC7 + + case 0x0E2: + // jz loc_682AF7 + eax = *buffer; + buffer++; + if (*current_font_flags & 1) { + // jnz loc_682853 + } + + // push ebx + // mov eax, ds:dword_97FCBC[eax*4] + // shl eax, 4 + // mov eax, g1_elements[eax] + // mov bl, [eax+0F9h] + // mov bh, 1 + + eax = RCT2_ADDRESS(0x097FCBC, uint32)[eax*4]; + rct_g1_element* g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[eax]); + // What on earth is going on here? + bx = *(g1_element + 0xF9) + (1 << 8); + + if (!(*current_font_flags & 2)) { + bx = bx & 0xFF; + } + RCT2_GLOBAL(0x09ABE05, uint16) = bx; + bx = *(g1_element + 0xF7); + RCT2_GLOBAL(0x09ABE07, uint16) = bx; + bx = *(g1_element + 0xFA); + RCT2_GLOBAL(0x09ABE09, uint16) = bx; + + // pop ebx + RCT2_GLOBAL(0x09ABDA4, uint32) = RCT2_GLOBAL(0x09ABE04, uint32); + + // jmp loc_682853 + + case 0x0F7: + // jz short loc_68296E + buffer += 4; + if (cx >= dpi->x + dpi->width) { + skip_char; + } + ebx = *(format - 4); + eax = ebx & 0x7FFFF; + rct_g1_element* g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, rct_g1_element)[eax]); + + gfx_draw_sprite(dpi, ebx, cx, dx); + + cx += g1_element->offset; + // jmp loc_682875 + + } + // jmp loc_682875 + + // colour_char + al -= 0x8E; + if (*current_font_flags == 1) { + // jnz short loc_682853 + } + eax = eax & 0xFF; + // mov ebp, g1_elements+13320h + ebp = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 0x13320, uint32)); + // mov eax, [ebp+eax*4+0] + eax = *(ebp + eax*4); + + if (!(*current_font_flags & 2)) { + eax = eax & 0x0FF0000FF; + } + // jump 6842 + + + // loc_682AC7 + if (*current_font_flags & 1) { + // jnz loc_682853 + } + eax = RCT2_ADDRESS(0x0141FD45, uint8)[ebp * 8]; + if (*current_font_flags & 2) { + eax |= 0x0A0A00; + } + // jmp loc_682842 + + // skip_char + al = *buffer; + buffer++; + if (al < 0x20) { + // jb skip_cont + } + if (al >= 0x9C) { + // jnb short skip_char + } + if (al >= 0x8E) { + // jnb colour_char + } + // jmp short skip_char + + } From 99c7b23452077048aa9c248433530844a0256d6e Mon Sep 17 00:00:00 2001 From: ZedThree Date: Sun, 18 May 2014 16:02:02 +0200 Subject: [PATCH 03/18] Second pass of gfx_draw_string. Still buggy --- src/gfx.c | 683 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 384 insertions(+), 299 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index ced773d864..9a5b968f5e 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1261,358 +1261,443 @@ void gfx_draw_string_left(rct_drawpixelinfo *dpi, int format, void *args, int co gfx_draw_string(dpi, buffer, colour, x, y); } + +void colour_char(int al, uint16* current_font_flags) { + + int eax; + uint32* ebp; + + // colour_char + eax = al & 0xFF; + // mov ebp, g1_elements+13320h + ebp = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 0x13320, uint32); + // mov eax, [ebp+eax*4+0] + eax = ebp[eax*4]; + + if (!(*current_font_flags & 2)) { + eax = eax & 0x0FF0000FF; + } + // Store current colour? + RCT2_GLOBAL(0x009ABE05, uint32) = eax; + RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; + +} + + +void sub_682AC7(int ebp, int* eax, uint16* current_font_flags) { + + // loc_682AC7 + *eax = RCT2_ADDRESS(0x0141FD45, uint8)[ebp * 8]; + if (*current_font_flags & 2) { + *eax |= 0x0A0A00; + } + // Store current colour? + RCT2_GLOBAL(0x009ABE05, uint32) = *eax; + RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; + *eax = 0; + // jmp loc_682842 + +} + + /** * * rct2: 0x00682702 * dpi (edi) - * format (esi) + * buffer (esi) * colour (al) * x (cx) * y (dx) */ -void gfx_draw_string(rct_drawpixelinfo *dpi, char *format, int colour, int x, int y) +void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, int y) { int eax, ebx, ecx, edx, esi, edi, ebp; - eax = colour; - ebx = 0; - ecx = x; - edx = y; - esi = (int)format; - edi = (int)dpi; - ebp = 0; - RCT2_CALLFUNC_X(0x00682702, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - - gLastDrawStringX = ecx; - gLastDrawStringY = edx; + // 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); + int max_x = x; + int max_y = y; RCT2_GLOBAL(0x00EDF840, uint16) = x; RCT2_GLOBAL(0x00EDF842, uint16) = y; if (colour & 0xFE) { - // jz loc_682853 + // jz loc_682853 } if ((x >= dpi->x + dpi->width) || (x <= dpi->x) || (y >= dpi->y + dpi->height) || (y <= dpi->y)) { return; } - if (colour == 0xFF) { - // jz loc_682853 - } - uint16* current_font_flags = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); uint16* current_font_sprite_base = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - // switch_colour: - *current_font_flags = 0; - if (*current_font_sprite_base < 0) { - *current_font_flags |= 4; - if (*current_font_sprite_base != 0xFFFF) { - *current_font_flags |= 8; + if (!(colour == 0xFF)) { + + // switch_colour: + *current_font_flags = 0; + if (*current_font_sprite_base < 0) { + *current_font_flags |= 4; + if (*current_font_sprite_base != 0xFFFF) { + *current_font_flags |= 8; + } + *current_font_sprite_base = 0xE0; + } + // loc_6827A5 + if (!(colour & (1 << 5))) { + *current_font_flags |= 2; } - *current_font_sprite_base = 0xE0; - } - // loc_6827A5 - if (!(ax & (1 << 5))) { - *current_font_flags |= 2; - } - // loc_6827B4 - if (!(colour & 0x40)) { - ebp = al; - // jmp short loc_682AC7 - } - - *current_font_flags |= 1; - colour &= 0x1F; - - ebp = colour; - - if (*current_font_flags & 4) { - if (*current_font_flags & 8) { - // loc_682805 - eax = RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; - eax = eax << 10; - eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[ebp * 8]; + // loc_6827B4 + if (!(colour & 0x40)) { + ebp = colour; + sub_682AC7(ebp, &colour, current_font_flags); + // jmp short loc_682AC7 } else { - // loc_6827E7 - eax = RCT2_ADDRESS(0x0141FC49, uint8)[ebp * 8]; - eax = eax << 10; - eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[ebp * 8]; + *current_font_flags |= 1; + colour &= 0x1F; + + ebp = colour; + + if (*current_font_flags & 4) { + if (*current_font_flags & 8) { + // loc_682805 + eax = RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; + eax = eax << 10; + eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[ebp * 8]; + } else { + // loc_6827E7 + eax = RCT2_ADDRESS(0x0141FC49, uint8)[ebp * 8]; + eax = eax << 10; + eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[ebp * 8]; + } + } else { + eax = RCT2_ADDRESS(0x0141FC4A, uint8)[ebp * 8]; + eax = eax << 10; + eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; + } + // loc_682842 + // Store current colour? ; + RCT2_GLOBAL(0x009ABE05, uint32) = eax; + RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; + eax = 0; + } - } else { - eax = RCT2_ADDRESS(0x0141FC4A, uint8)[ebp * 8]; - eax = eax << 10; - eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; - } - // jmp short loc_682842 - - - // ; --------------------------------------------------------------------------- - - - // ; --------------------------------------------------------------------------- - // loc_682842 - RCT2_GLOBAL(0x009ABE05, uint32) = eax; - RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; - eax = 0; - - // loc_682853 - if (y + 0x13 <= dpi->y) { - skip_char; - } - if (dpi->y + dpi->height <= y) { - skip_char; + // jmp short loc_682842 + // jz loc_682853 } - // loc_682875 - al = *format; - format++; + int skip_char = 0; - // skip_cont - if (al == 0) { - return; - } - if (al >= 0x9C) { - // jnb short loc_682888 - } - if (al >= 0x8E) { - // jnb colour_char + // loc_682853 + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; } - // loc_682888 - al -= 0x20; - if (al < 0) { - // jb short loc_6828F5 - } - bx = dpi->x + dpi->width; - if (x >= bx) { - // jge skip_char - } - bx = x + 0x1A; - if (bx < dpi->x) { - // jl short loc_6828E0 - } - ebx = al + *current_font_sprite_base; - cl = cl + (RCT2_ADDRESS(0x0141E9E8, uint32)[ebx] & 0xFF) - // push dword_141E9E8[ebx] - // push ecx - // push edx - // push edi - // push esi + // loc_682875 + // al = *buffer; + // buffer++; - eax = (int)al; - ebx += 0xF15; - esi = (int)format; - edi = (int)dpi; - - RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000; + for (uint8 al = *buffer; al > 0; al= *buffer, ++buffer) { + // skip_char + // al = *buffer; + // buffer++; + if (skip_char) { + if (al < 0x20) { + skip_char = 0; + // jb skip_cont + } else if (al >= 0x9C) { + continue; + // jnb short skip_char + } else if (al >= 0x8E) { + al -= 0x8E; + if (*current_font_flags == 1) { + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; + } else { + skip_char = 0; + } + continue; + // jnz short loc_682853 + } + colour_char(al, current_font_flags); + continue; + // jnb colour_char + } else { + continue; + // jmp short skip_char + } + } - RCT2_CALLPROC_X(0x067A46E, eax, ebx, ecx, edx, esi, edi, ebp); + // skip_cont + if (al >= 0x9C) { + // jnb short loc_682888 + // loc_682888 + al -= 0x20; + if (al < 0) { + // jb short loc_6828F5 + // loc_6828F5 + switch (al) { + case 0x0E5: + // jz loc_6829E3 + max_x = RCT2_GLOBAL(0x0EDF840, uint16); + max_y += 0x0A; + if (*current_font_sprite_base <= 0x0E) { + // jbe loc_682875 + break; + } + max_y -= 4; + if (*current_font_sprite_base == 0x1C0) { + // jz loc_682875 + break; + } + max_y -= 0xFFF4; + // jmp loc_682875 + break; + case 0x0E6: + // jz loc_6829AD + max_x = RCT2_GLOBAL(0x0EDF840, uint16); + max_y += 5; + if (*current_font_sprite_base <= 0x0E) { + // jbe loc_682875 + break; + } + max_y -= 2; + if (*current_font_sprite_base == 0x1C0) { + // jz loc_682875 + break; + } + max_y -= 0xFFFA; + // jmp loc_682875 + break; + case 0x0E1: + // jz loc_682A19 + al = *buffer; + buffer++; + max_x = RCT2_GLOBAL(0x0EDF840, uint16); + max_x += al; + // jmp loc_682875 + break; - // pop esi - // pop edi - // pop edx - // pop ecx - // pop eax - - // jmp short loc_682875 - - // loc_6828E0 - ebx = al; - ebx += *current_font_sprite_base; - cl = cl + (RCT2_ADDRESS(0x0141E9E8, uint32)[ebx] & 0xFF); - // jmp short loc_682875 - - // loc_6828F5 - switch (al) { - case 0x0E5: - // jz loc_6829E3 - cx = RCT2_GLOBAL(0x0EDF840, uint16); - dx += 0x0A; - if (*current_font_sprite_base <= 0x0E) { - // jbe loc_682875 - } - dx -= 4; - if (*current_font_sprite_base == 0x1C0) { - // jz loc_682875 - } - dx -= 0xFFF4; - // jmp loc_682875 - case 0x0E6: - // jz loc_6829AD - cx = RCT2_GLOBAL(0x0EDF840, uint16); - dx += 5; - if (*current_font_sprite_base <= 0x0E) { - // jbe loc_682875 - } - dx -= 2; - if (*current_font_sprite_base == 0x1C0) { - // jz loc_682875 - } - dx -= 0xFFFA; - // jmp loc_682875 - case 0x0E1: - // jz loc_682A19 - al = *buffer; - buffer++; - cx = RCT2_GLOBAL(0x0EDF840, uint16); - cx += al; - // jmp loc_682875 - - case 0x0F1: - // jz loc_682A34 - ax = *buffer; - buffer += 2; - cx = RCT2_GLOBAL(0x0EDF840, uint16); - cx += (ax & 0xFF); - dx = RCT2_GLOBAL(0x0EDF842, uint16); - dx += (ax & 0xFF00) >> 8; - // jmp loc_682875 + case 0x0F1: + // jz loc_682A34 + eax = *((uint16*)buffer); + buffer += 2; + max_x = RCT2_GLOBAL(0x0EDF840, uint16); + max_x += (eax & 0xFF); + max_y = RCT2_GLOBAL(0x0EDF842, uint16); + max_y += (eax & 0xFF00) >> 8; + // jmp loc_682875 + break; - case 0x0E7: - // jz loc_682A57 - *current_font_sprite_base = 0x1C0; - // jmp loc_682875 + case 0x0E7: + // jz loc_682A57 + *current_font_sprite_base = 0x1C0; + // jmp loc_682875 + break; - case 0x0E8: - // jz loc_682A65 - *current_font_sprite_base = 0x2A0; - // jmp loc_682875 + case 0x0E8: + // jz loc_682A65 + *current_font_sprite_base = 0x2A0; + // jmp loc_682875 + break; - case 0x0E9: - // jz loc_682A81 - *current_font_sprite_base = 0xE0; - // jmp loc_682875 + case 0x0E9: + // jz loc_682A81 + *current_font_sprite_base = 0xE0; + // jmp loc_682875 + break; - case 0x0EA: - // jz loc_682A73 - *current_font_sprite_base = 0; - // jmp loc_682875 + case 0x0EA: + // jz loc_682A73 + *current_font_sprite_base = 0; + // jmp loc_682875 + break; - case 0x0EB: - // jz loc_682A8F - *current_font_flags |= 2; - // jmp loc_682875 + case 0x0EB: + // jz loc_682A8F + *current_font_flags |= 2; + // jmp loc_682875 + break; - case 0x0EC: - // jz loc_682A9C - *current_font_flags &= 0x0FFFD; - // jmp loc_682875 + case 0x0EC: + // jz loc_682A9C + *current_font_flags &= 0x0FFFD; + // jmp loc_682875 + break; - case 0x0ED: - // jz loc_682AAE - ebp = RCT2_GLOBAL(0x0141F740, uint8); - - // jmp short loc_682AC7 - - case 0x0EE: - // jz loc_682AC0 - ebp = RCT2_GLOBAL(0x0141F741, uint8); + case 0x0ED: + // jz loc_682AAE + ebp = RCT2_GLOBAL(0x0141F740, uint8); + if (*current_font_flags & 1) { + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; + } else { + skip_char = 0; + } + continue; + // jnz loc_682853 + } + sub_682AC7(ebp, &al, current_font_flags); + // jmp short loc_682AC7 + break; + case 0x0EE: + // jz loc_682AC0 + ebp = RCT2_GLOBAL(0x0141F741, uint8); + if (*current_font_flags & 1) { + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; + } else { + skip_char = 0; + } + continue; + // jnz loc_682853 + } + sub_682AC7(ebp, &al, current_font_flags); + // jmp short loc_682AC7 + break; + case 0x0EF: + // jz loc_682AB7 + ebp = RCT2_GLOBAL(0x0141F742, uint8); + if (*current_font_flags & 1) { + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; + } else { + skip_char = 0; + } + continue; + // jnz loc_682853 + } + sub_682AC7(ebp, &al, current_font_flags); + // jmp short loc_682AC7 + break; + case 0x0E2: + // jz loc_682AF7 + eax = *buffer; + buffer++; + if (*current_font_flags & 1) { + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; + break; + } + } - // jmp short loc_682AC7 + // push ebx + // mov eax, ds:dword_97FCBC[eax*4] + // shl eax, 4 + // mov eax, g1_elements[eax] + // mov bl, [eax+0F9h] + // mov bh, 1 - case 0x0EF: - // jz loc_682AB7 - ebp = RCT2_GLOBAL(0x0141F742, uint8); + eax = RCT2_ADDRESS(0x097FCBC, uint32)[eax*4]; + uint32* g1_element_poss = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, uint32)[eax*16]); + // What on earth is going on here? + g1_element_poss += 0xF9; + ebx = *g1_element_poss + (1 << 8); - // jmp short loc_682AC7 - - case 0x0E2: - // jz loc_682AF7 - eax = *buffer; - buffer++; - if (*current_font_flags & 1) { - // jnz loc_682853 - } + if (!(*current_font_flags & 2)) { + ebx = ebx & 0xFF; + } + RCT2_GLOBAL(0x09ABE05, uint16) = ebx; + ebx = *(g1_element_poss + 0xF7); + RCT2_GLOBAL(0x09ABE07, uint16) = ebx; + ebx = *(g1_element_poss + 0xFA); + RCT2_GLOBAL(0x09ABE09, uint16) = ebx; + + // pop ebx + RCT2_GLOBAL(0x09ABDA4, uint32) = RCT2_GLOBAL(0x09ABE04, uint32); + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; + } + break; + // jmp loc_682853 + + case 0x0F7: + // jz short loc_68296E + buffer += 4; + if (max_x >= dpi->x + dpi->width) { + skip_char = 1; + break; + } + ebx = *(buffer - 4); + eax = ebx & 0x7FFFF; + rct_g1_element* g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, rct_g1_element)[eax]); - // push ebx - // mov eax, ds:dword_97FCBC[eax*4] - // shl eax, 4 - // mov eax, g1_elements[eax] - // mov bl, [eax+0F9h] - // mov bh, 1 + gfx_draw_sprite(dpi, ebx, max_x, max_y); - eax = RCT2_ADDRESS(0x097FCBC, uint32)[eax*4]; - rct_g1_element* g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[eax]); - // What on earth is going on here? - bx = *(g1_element + 0xF9) + (1 << 8); + max_x = max_x + g1_element->offset; + // jmp loc_682875 + break; + } - if (!(*current_font_flags & 2)) { - bx = bx & 0xFF; - } - RCT2_GLOBAL(0x09ABE05, uint16) = bx; - bx = *(g1_element + 0xF7); - RCT2_GLOBAL(0x09ABE07, uint16) = bx; - bx = *(g1_element + 0xFA); - RCT2_GLOBAL(0x09ABE09, uint16) = bx; + } + if (x >= dpi->x + dpi->width) { + skip_char = 1; + } + if (x + 0x1A < dpi->x) { + // jl short loc_6828E0 + // loc_6828E0 + ebx = al; + ebx += *current_font_sprite_base; + max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); + continue; + // jmp short loc_682875 + } + ebx = al + *current_font_sprite_base; + max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint32)[ebx] & 0xFF); + // push dword_141E9E8[ebx] + // push ecx + // push edx + // push edi + // push esi - // pop ebx - RCT2_GLOBAL(0x09ABDA4, uint32) = RCT2_GLOBAL(0x09ABE04, uint32); - - // jmp loc_682853 - - case 0x0F7: - // jz short loc_68296E - buffer += 4; - if (cx >= dpi->x + dpi->width) { - skip_char; - } - ebx = *(format - 4); - eax = ebx & 0x7FFFF; - rct_g1_element* g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, rct_g1_element)[eax]); - - gfx_draw_sprite(dpi, ebx, cx, dx); - - cx += g1_element->offset; - // jmp loc_682875 - - } - // jmp loc_682875 - - // colour_char - al -= 0x8E; - if (*current_font_flags == 1) { - // jnz short loc_682853 - } - eax = eax & 0xFF; - // mov ebp, g1_elements+13320h - ebp = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 0x13320, uint32)); - // mov eax, [ebp+eax*4+0] - eax = *(ebp + eax*4); - - if (!(*current_font_flags & 2)) { - eax = eax & 0x0FF0000FF; - } - // jump 6842 - - - // loc_682AC7 - if (*current_font_flags & 1) { - // jnz loc_682853 - } - eax = RCT2_ADDRESS(0x0141FD45, uint8)[ebp * 8]; - if (*current_font_flags & 2) { - eax |= 0x0A0A00; - } - // jmp loc_682842 - - // skip_char - al = *buffer; - buffer++; - if (al < 0x20) { - // jb skip_cont - } - if (al >= 0x9C) { - // jnb short skip_char - } - if (al >= 0x8E) { - // jnb colour_char - } - // jmp short skip_char + eax = (int)al; + ebx += 0xF15; + ecx = max_x; + edx = max_y; + esi = (int)buffer; + edi = (int)dpi; + RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000; + RCT2_CALLPROC_X(0x067A46E, eax, ebx, ecx, edx, esi, edi, ebp); + + // pop esi + // pop edi + // pop edx + // pop ecx + // pop eax + + continue; + // jmp short loc_682875 + + } else if (al >= 0x8E) { + al -= 0x8E; + if (*current_font_flags == 1) { + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; + } else { + skip_char = 0; + } + continue; + // jnz short loc_682853 + } + colour_char(al, current_font_flags); + continue; + // jnb colour_char + } + + } + + gLastDrawStringX = max_x; + gLastDrawStringY = max_y; + } From 702a97b185d5a952c03577f5609daf84d69fc9f0 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Sun, 18 May 2014 22:06:08 +0200 Subject: [PATCH 04/18] Fix some bugs, tidy up Still buggy... --- src/gfx.c | 290 ++++++++++++++++++++---------------------------------- 1 file changed, 109 insertions(+), 181 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index 9a5b968f5e..35cd38f30f 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1265,14 +1265,9 @@ void gfx_draw_string_left(rct_drawpixelinfo *dpi, int format, void *args, int co void colour_char(int al, uint16* current_font_flags) { int eax; - uint32* ebp; - // colour_char - eax = al & 0xFF; - // mov ebp, g1_elements+13320h - ebp = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 0x13320, uint32); - // mov eax, [ebp+eax*4+0] - eax = ebp[eax*4]; + rct_g1_element* g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[0x1332]); + eax = g1_element->offset[(al & 0xFF) * 4]; if (!(*current_font_flags & 2)) { eax = eax & 0x0FF0000FF; @@ -1280,7 +1275,6 @@ void colour_char(int al, uint16* current_font_flags) { // Store current colour? RCT2_GLOBAL(0x009ABE05, uint32) = eax; RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; - } @@ -1328,72 +1322,69 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in RCT2_GLOBAL(0x00EDF840, uint16) = x; RCT2_GLOBAL(0x00EDF842, uint16) = y; - if (colour & 0xFE) { - // jz loc_682853 - } - - if ((x >= dpi->x + dpi->width) || (x <= dpi->x) || - (y >= dpi->y + dpi->height) || (y <= dpi->y)) { - return; - } uint16* current_font_flags = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); uint16* current_font_sprite_base = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - if (!(colour == 0xFF)) { + if (colour != 0xFE) { - // switch_colour: - *current_font_flags = 0; - if (*current_font_sprite_base < 0) { - *current_font_flags |= 4; - if (*current_font_sprite_base != 0xFFFF) { - *current_font_flags |= 8; - } - *current_font_sprite_base = 0xE0; - } - // loc_6827A5 - if (!(colour & (1 << 5))) { - *current_font_flags |= 2; + if ((x >= dpi->x + dpi->width) || (x <= dpi->x) || + (y >= dpi->y + dpi->height) || (y <= dpi->y)) { + return; } - // loc_6827B4 - if (!(colour & 0x40)) { - ebp = colour; - sub_682AC7(ebp, &colour, current_font_flags); - // jmp short loc_682AC7 - } else { - *current_font_flags |= 1; - colour &= 0x1F; + if (colour != 0xFF) { - ebp = colour; - - if (*current_font_flags & 4) { - if (*current_font_flags & 8) { - // loc_682805 - eax = RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; - eax = eax << 10; - eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[ebp * 8]; - } else { - // loc_6827E7 - eax = RCT2_ADDRESS(0x0141FC49, uint8)[ebp * 8]; - eax = eax << 10; - eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[ebp * 8]; + // switch_colour: + *current_font_flags = 0; + if (*current_font_sprite_base < 0) { + *current_font_flags |= 4; + if (*current_font_sprite_base != 0xFFFF) { + *current_font_flags |= 8; } - } else { - eax = RCT2_ADDRESS(0x0141FC4A, uint8)[ebp * 8]; - eax = eax << 10; - eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; + *current_font_sprite_base = 0xE0; + } + // loc_6827A5 + if (!(colour & (1 << 5))) { + *current_font_flags |= 2; } - // loc_682842 - // Store current colour? ; - RCT2_GLOBAL(0x009ABE05, uint32) = eax; - RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; - eax = 0; + // loc_6827B4 + if (!(colour & 0x40)) { + ebp = colour; + sub_682AC7(ebp, &colour, current_font_flags); + // jmp short loc_682AC7 + } else { + *current_font_flags |= 1; + colour &= 0x1F; + + ebp = colour; + + if (*current_font_flags & 4) { + if (*current_font_flags & 8) { + // loc_682805 + eax = RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; + eax = eax << 10; + eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[ebp * 8]; + } else { + // loc_6827E7 + eax = RCT2_ADDRESS(0x0141FC49, uint8)[ebp * 8]; + eax = eax << 10; + eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[ebp * 8]; + } + } else { + eax = RCT2_ADDRESS(0x0141FC4A, uint8)[ebp * 8]; + eax = eax << 10; + eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; + } + // loc_682842 + // Store current colour? ; + RCT2_GLOBAL(0x009ABE05, uint32) = eax; + RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; + eax = 0; + + } } - // jmp short loc_682842 - // jz loc_682853 } - int skip_char = 0; // loc_682853 @@ -1402,20 +1393,15 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } // loc_682875 - // al = *buffer; - // buffer++; - - for (uint8 al = *buffer; al > 0; al= *buffer, ++buffer) { + for (uint8 al = *buffer; al > 0; ++buffer, al = *buffer) { // skip_char // al = *buffer; // buffer++; if (skip_char) { if (al < 0x20) { skip_char = 0; - // jb skip_cont } else if (al >= 0x9C) { continue; - // jnb short skip_char } else if (al >= 0x8E) { al -= 0x8E; if (*current_font_flags == 1) { @@ -1425,117 +1411,89 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in skip_char = 0; } continue; - // jnz short loc_682853 } colour_char(al, current_font_flags); continue; - // jnb colour_char } else { continue; - // jmp short skip_char } } // skip_cont - if (al >= 0x9C) { - // jnb short loc_682888 + if ((al >= 0x8E) && (al < 0x9C)){ + al -= 0x8E; + if (*current_font_flags == 1) { + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; + } else { + skip_char = 0; + } + continue; + } + colour_char(al, current_font_flags); + continue; + } else { // loc_682888 - al -= 0x20; - if (al < 0) { - // jb short loc_6828F5 - // loc_6828F5 + if (al < 0x20) { + al -= 0x20; switch (al) { case 0x0E5: - // jz loc_6829E3 max_x = RCT2_GLOBAL(0x0EDF840, uint16); max_y += 0x0A; if (*current_font_sprite_base <= 0x0E) { - // jbe loc_682875 break; } max_y -= 4; if (*current_font_sprite_base == 0x1C0) { - // jz loc_682875 break; } max_y -= 0xFFF4; - // jmp loc_682875 break; case 0x0E6: - // jz loc_6829AD max_x = RCT2_GLOBAL(0x0EDF840, uint16); max_y += 5; if (*current_font_sprite_base <= 0x0E) { - // jbe loc_682875 break; } max_y -= 2; if (*current_font_sprite_base == 0x1C0) { - // jz loc_682875 break; } max_y -= 0xFFFA; - // jmp loc_682875 break; case 0x0E1: - // jz loc_682A19 al = *buffer; buffer++; max_x = RCT2_GLOBAL(0x0EDF840, uint16); max_x += al; - // jmp loc_682875 break; - case 0x0F1: - // jz loc_682A34 eax = *((uint16*)buffer); buffer += 2; max_x = RCT2_GLOBAL(0x0EDF840, uint16); max_x += (eax & 0xFF); max_y = RCT2_GLOBAL(0x0EDF842, uint16); max_y += (eax & 0xFF00) >> 8; - // jmp loc_682875 break; - - case 0x0E7: - // jz loc_682A57 *current_font_sprite_base = 0x1C0; - // jmp loc_682875 break; - case 0x0E8: - // jz loc_682A65 *current_font_sprite_base = 0x2A0; - // jmp loc_682875 break; - case 0x0E9: - // jz loc_682A81 *current_font_sprite_base = 0xE0; - // jmp loc_682875 break; - case 0x0EA: - // jz loc_682A73 *current_font_sprite_base = 0; - // jmp loc_682875 break; - case 0x0EB: - // jz loc_682A8F *current_font_flags |= 2; - // jmp loc_682875 break; - case 0x0EC: - // jz loc_682A9C *current_font_flags &= 0x0FFFD; - // jmp loc_682875 break; - case 0x0ED: - // jz loc_682AAE ebp = RCT2_GLOBAL(0x0141F740, uint8); if (*current_font_flags & 1) { if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { @@ -1543,14 +1501,11 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } else { skip_char = 0; } - continue; - // jnz loc_682853 + break; } sub_682AC7(ebp, &al, current_font_flags); - // jmp short loc_682AC7 break; case 0x0EE: - // jz loc_682AC0 ebp = RCT2_GLOBAL(0x0141F741, uint8); if (*current_font_flags & 1) { if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { @@ -1558,14 +1513,11 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } else { skip_char = 0; } - continue; - // jnz loc_682853 + break; } sub_682AC7(ebp, &al, current_font_flags); - // jmp short loc_682AC7 break; case 0x0EF: - // jz loc_682AB7 ebp = RCT2_GLOBAL(0x0141F742, uint8); if (*current_font_flags & 1) { if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { @@ -1573,14 +1525,11 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } else { skip_char = 0; } - continue; - // jnz loc_682853 + break; } sub_682AC7(ebp, &al, current_font_flags); - // jmp short loc_682AC7 break; case 0x0E2: - // jz loc_682AF7 eax = *buffer; buffer++; if (*current_font_flags & 1) { @@ -1618,10 +1567,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in skip_char = 1; } break; - // jmp loc_682853 - case 0x0F7: - // jz short loc_68296E buffer += 4; if (max_x >= dpi->x + dpi->width) { skip_char = 1; @@ -1634,67 +1580,49 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in gfx_draw_sprite(dpi, ebx, max_x, max_y); max_x = max_x + g1_element->offset; - // jmp loc_682875 break; } - } - if (x >= dpi->x + dpi->width) { - skip_char = 1; - } - if (x + 0x1A < dpi->x) { - // jl short loc_6828E0 - // loc_6828E0 - ebx = al; - ebx += *current_font_sprite_base; - max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); - continue; - // jmp short loc_682875 - } - ebx = al + *current_font_sprite_base; - max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint32)[ebx] & 0xFF); - // push dword_141E9E8[ebx] - // push ecx - // push edx - // push edi - // push esi - - eax = (int)al; - ebx += 0xF15; - ecx = max_x; - edx = max_y; - esi = (int)buffer; - edi = (int)dpi; - - RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000; - - RCT2_CALLPROC_X(0x067A46E, eax, ebx, ecx, edx, esi, edi, ebp); - - // pop esi - // pop edi - // pop edx - // pop ecx - // pop eax - - continue; - // jmp short loc_682875 - - } else if (al >= 0x8E) { - al -= 0x8E; - if (*current_font_flags == 1) { - if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + } else { + al -= 0x20; + if (max_x >= dpi->x + dpi->width) { skip_char = 1; - } else { - skip_char = 0; } - continue; - // jnz short loc_682853 - } - colour_char(al, current_font_flags); - continue; - // jnb colour_char - } + if (max_x + 0x1A < dpi->x) { + ebx = al; + ebx += *current_font_sprite_base; + max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); + continue; + } + ebx = al + *current_font_sprite_base; + max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); + // push dword_141E9E8[ebx] + // push ecx + // push edx + // push edi + // push esi + eax = (int)al; + ebx += 0xF15; + ecx = max_x; + edx = max_y; + esi = (int)buffer; + edi = (int)dpi; + ebp = 0; + + RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000; + + RCT2_CALLPROC_X(0x067A46E, eax, ebx, ecx, edx, esi, edi, ebp); + + // pop esi + // pop edi + // pop edx + // pop ecx + // pop eax + + continue; + } + } } gLastDrawStringX = max_x; From c3ea45062b7a377a28c74c1c28f3aea94c93554f Mon Sep 17 00:00:00 2001 From: ZedThree Date: Thu, 22 May 2014 22:01:37 +0200 Subject: [PATCH 05/18] gfx_draw_string complete. Needs tidying --- src/gfx.c | 55 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index 35cd38f30f..297c0564d9 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1278,17 +1278,19 @@ void colour_char(int al, uint16* current_font_flags) { } -void sub_682AC7(int ebp, int* eax, uint16* current_font_flags) { +void sub_682AC7(int ebp, uint16* current_font_flags) { + + int eax; // loc_682AC7 - *eax = RCT2_ADDRESS(0x0141FD45, uint8)[ebp * 8]; + eax = RCT2_ADDRESS(0x0141FD45, uint8)[ebp * 8]; if (*current_font_flags & 2) { - *eax |= 0x0A0A00; + eax |= 0x0A0A00; } - // Store current colour? - RCT2_GLOBAL(0x009ABE05, uint32) = *eax; + //Store current colour? + RCT2_GLOBAL(0x009ABE05, uint32) = eax; RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; - *eax = 0; + eax = 0; // jmp loc_682842 } @@ -1325,10 +1327,20 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in uint16* current_font_flags = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); uint16* current_font_sprite_base = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + int skip_char = 0; + if (colour != 0xFE) { - if ((x >= dpi->x + dpi->width) || (x <= dpi->x) || - (y >= dpi->y + dpi->height) || (y <= dpi->y)) { + if (x >= dpi->x + dpi->width) + return; + + if (x + 0x280 <= dpi->x) + return; + + if (y >= dpi->y + dpi->height) + return; + + if (y + 0x5A <= dpi->y) { return; } @@ -1344,14 +1356,25 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in *current_font_sprite_base = 0xE0; } // loc_6827A5 - if (!(colour & (1 << 5))) { + // also reset bit 5 + if (colour & (1 << 5)) { *current_font_flags |= 2; } + colour &= ~(1 << 5); // loc_6827B4 if (!(colour & 0x40)) { ebp = colour; - sub_682AC7(ebp, &colour, current_font_flags); + if (*current_font_flags & 1) { + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { + skip_char = 1; + } + else { + skip_char = 0; + } + } else { + sub_682AC7(ebp, current_font_flags); + } // jmp short loc_682AC7 } else { *current_font_flags |= 1; @@ -1385,7 +1408,6 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } } } - int skip_char = 0; // loc_682853 if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { @@ -1503,7 +1525,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } break; } - sub_682AC7(ebp, &al, current_font_flags); + sub_682AC7(ebp, current_font_flags); break; case 0x0EE: ebp = RCT2_GLOBAL(0x0141F741, uint8); @@ -1515,7 +1537,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } break; } - sub_682AC7(ebp, &al, current_font_flags); + sub_682AC7(ebp, current_font_flags); break; case 0x0EF: ebp = RCT2_GLOBAL(0x0141F742, uint8); @@ -1527,7 +1549,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } break; } - sub_682AC7(ebp, &al, current_font_flags); + sub_682AC7(ebp, current_font_flags); break; case 0x0E2: eax = *buffer; @@ -1595,6 +1617,9 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in continue; } ebx = al + *current_font_sprite_base; + + ecx = max_x; + max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); // push dword_141E9E8[ebx] // push ecx @@ -1604,7 +1629,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in eax = (int)al; ebx += 0xF15; - ecx = max_x; + edx = max_y; esi = (int)buffer; edi = (int)dpi; From 67b7ca8d1eeb605c6236543bc83ce7d7f428ae0d Mon Sep 17 00:00:00 2001 From: ZedThree Date: Tue, 27 May 2014 19:16:05 +0200 Subject: [PATCH 06/18] Fix use of g1_elements and tidy comments --- src/gfx.c | 95 ++++++++++++++++--------------------------------------- 1 file changed, 28 insertions(+), 67 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index 297c0564d9..916b1eecf4 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1308,25 +1308,21 @@ 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; + rct_g1_element* g1_element; - // 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); - + // Maximum length/height of string int max_x = x; int max_y = y; + // Store original x, y RCT2_GLOBAL(0x00EDF840, uint16) = x; RCT2_GLOBAL(0x00EDF842, uint16) = y; + // uint16* current_font_flags = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); uint16* current_font_sprite_base = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + // Flag for skipping non-printing characters int skip_char = 0; if (colour != 0xFE) { @@ -1355,76 +1351,62 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } *current_font_sprite_base = 0xE0; } - // loc_6827A5 - // also reset bit 5 if (colour & (1 << 5)) { *current_font_flags |= 2; } colour &= ~(1 << 5); - // loc_6827B4 if (!(colour & 0x40)) { ebp = colour; if (*current_font_flags & 1) { if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { skip_char = 1; - } - else { + } else { skip_char = 0; } } else { sub_682AC7(ebp, current_font_flags); } - // jmp short loc_682AC7 } else { *current_font_flags |= 1; colour &= 0x1F; - ebp = colour; - if (*current_font_flags & 4) { if (*current_font_flags & 8) { - // loc_682805 - eax = RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; + eax = RCT2_ADDRESS(0x0141FC48, uint8)[colour * 8]; eax = eax << 10; - eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[ebp * 8]; + eax = eax | RCT2_ADDRESS(0x0141FC46, uint8)[colour * 8]; } else { - // loc_6827E7 - eax = RCT2_ADDRESS(0x0141FC49, uint8)[ebp * 8]; + eax = RCT2_ADDRESS(0x0141FC49, uint8)[colour * 8]; eax = eax << 10; - eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[ebp * 8]; + eax = eax | RCT2_ADDRESS(0x0141FC47, uint8)[colour * 8]; } } else { - eax = RCT2_ADDRESS(0x0141FC4A, uint8)[ebp * 8]; + eax = RCT2_ADDRESS(0x0141FC4A, uint8)[colour * 8]; eax = eax << 10; - eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[ebp * 8]; + eax = eax | RCT2_ADDRESS(0x0141FC48, uint8)[colour * 8]; } - // loc_682842 // Store current colour? ; RCT2_GLOBAL(0x009ABE05, uint32) = eax; RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009ABE04; eax = 0; - } } } - - // loc_682853 + if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { skip_char = 1; } - // loc_682875 for (uint8 al = *buffer; al > 0; ++buffer, al = *buffer) { - // skip_char - // al = *buffer; - // buffer++; + + // Skip to the next printing character if (skip_char) { if (al < 0x20) { + // Control codes skip_char = 0; - } else if (al >= 0x9C) { - continue; - } else if (al >= 0x8E) { + } else if (al >= 0x8E && al < 0x9C) { + // Colour codes al -= 0x8E; if (*current_font_flags == 1) { if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { @@ -1440,9 +1422,9 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in continue; } } - - // skip_cont + if ((al >= 0x8E) && (al < 0x9C)){ + // Colour codes al -= 0x8E; if (*current_font_flags == 1) { if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { @@ -1455,8 +1437,8 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in colour_char(al, current_font_flags); continue; } else { - // loc_682888 if (al < 0x20) { + // Control codes al -= 0x20; switch (al) { case 0x0E5: @@ -1552,7 +1534,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in sub_682AC7(ebp, current_font_flags); break; case 0x0E2: - eax = *buffer; + al = *buffer; buffer++; if (*current_font_flags & 1) { if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { @@ -1561,29 +1543,19 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } } - // push ebx - // mov eax, ds:dword_97FCBC[eax*4] - // shl eax, 4 - // mov eax, g1_elements[eax] - // mov bl, [eax+0F9h] - // mov bh, 1 - - eax = RCT2_ADDRESS(0x097FCBC, uint32)[eax*4]; - uint32* g1_element_poss = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, uint32)[eax*16]); - // What on earth is going on here? - g1_element_poss += 0xF9; - ebx = *g1_element_poss + (1 << 8); + eax = RCT2_ADDRESS(0x097FCBC, uint32)[al*4]; + g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[eax]); + ebx = g1_element->offset[0xF9] + (1 << 8); if (!(*current_font_flags & 2)) { ebx = ebx & 0xFF; } RCT2_GLOBAL(0x09ABE05, uint16) = ebx; - ebx = *(g1_element_poss + 0xF7); + ebx = g1_element->offset[0xF7]; RCT2_GLOBAL(0x09ABE07, uint16) = ebx; - ebx = *(g1_element_poss + 0xFA); + ebx = g1_element->offset[0xFA]; RCT2_GLOBAL(0x09ABE09, uint16) = ebx; - // pop ebx RCT2_GLOBAL(0x09ABDA4, uint32) = RCT2_GLOBAL(0x09ABE04, uint32); if ((y + 0x13 <= dpi->y) || (dpi->y + dpi->height <= y)) { skip_char = 1; @@ -1597,7 +1569,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } ebx = *(buffer - 4); eax = ebx & 0x7FFFF; - rct_g1_element* g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, rct_g1_element)[eax]); + g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, rct_g1_element)[eax]); gfx_draw_sprite(dpi, ebx, max_x, max_y); @@ -1621,11 +1593,6 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in ecx = max_x; max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); - // push dword_141E9E8[ebx] - // push ecx - // push edx - // push edi - // push esi eax = (int)al; ebx += 0xF15; @@ -1639,12 +1606,6 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in RCT2_CALLPROC_X(0x067A46E, eax, ebx, ecx, edx, esi, edi, ebp); - // pop esi - // pop edi - // pop edx - // pop ecx - // pop eax - continue; } } From 504ce150ea2485cc24c2a3da348ed30b8f6b7cf3 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Tue, 27 May 2014 19:58:31 +0200 Subject: [PATCH 07/18] Fix bug in gfx_get_string_width --- src/gfx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index 916b1eecf4..456f788442 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1041,6 +1041,7 @@ void gfx_redraw_screen_rect(short left, short top, short right, short bottom) } /** + * Return the width of the string in buffer * * rct2: 0x006C2321 * buffer (esi) @@ -1050,9 +1051,8 @@ int gfx_get_string_width(char *buffer) int base; int width; - char curr_char; + uint8 curr_char; - curr_char = 0; base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); width = 0; From 55183d05897368315fcbf71ec6004c4c3bb2f097 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Tue, 27 May 2014 20:00:44 +0200 Subject: [PATCH 08/18] draw_string_centred --- src/gfx.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/gfx.c b/src/gfx.c index 456f788442..5b45d2b781 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -900,7 +900,18 @@ void gfx_transpose_palette(int pal, unsigned char product) */ void gfx_draw_string_centred(rct_drawpixelinfo *dpi, int format, int x, int y, int colour, void *args) { - RCT2_CALLPROC_X(0x006C1D6C, colour, format, x, y, (int)args, (int)dpi, 0); + char* buffer; + buffer = (char*)0x0141ED68; + format_string(buffer, format, args); + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; + + int width = gfx_get_string_width(buffer); + + if (width <= 0xFFF) { + x -= width / 2; + gfx_draw_string(dpi, buffer, colour, x, y); + } } /** From 4fdba86b0168696dbc6511d12d0aafa3145e1adb Mon Sep 17 00:00:00 2001 From: ZedThree Date: Thu, 29 May 2014 15:43:38 +0200 Subject: [PATCH 09/18] Add address for common string format buffer --- src/addresses.h | 2 ++ src/gfx.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 912461a9b3..974a9c7507 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -258,6 +258,8 @@ #define RCT2_ADDRESS_GAME_COMMAND_ERROR_STRING_ID 0x0141E9AE #define RCT2_ADDRESS_CURRENT_ROTATION 0x0141E9E0 +#define RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER 0x0141ED68 + #define RCT2_ADDRESS_WATER_RAISE_COST 0x0141F738 #define RCT2_ADDRESS_WATER_LOWER_COST 0x0141F73C diff --git a/src/gfx.c b/src/gfx.c index 5b45d2b781..c19b433554 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1188,7 +1188,7 @@ void gfx_draw_string_right(rct_drawpixelinfo* dpi, int format, void* args, int c char* buffer; short text_width; - buffer = (char*)0x0141ED68; + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); format_string(buffer, format, args); // Measure text width @@ -1267,7 +1267,7 @@ void gfx_draw_string_left(rct_drawpixelinfo *dpi, int format, void *args, int co { char* buffer; - buffer = (char*)0x0141ED68; + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); format_string(buffer, format, args); gfx_draw_string(dpi, buffer, colour, x, y); } From 130796052f66d7a68e1675f56f0cffd1860dcb7d Mon Sep 17 00:00:00 2001 From: ZedThree Date: Thu, 29 May 2014 15:44:33 +0200 Subject: [PATCH 10/18] More string functions --- src/gfx.c | 55 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index c19b433554..e1c3c1bcc9 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -901,15 +901,19 @@ void gfx_transpose_palette(int pal, unsigned char product) void gfx_draw_string_centred(rct_drawpixelinfo *dpi, int format, int x, int y, int colour, void *args) { char* buffer; - buffer = (char*)0x0141ED68; + short text_width; + + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); format_string(buffer, format, args); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; - int width = gfx_get_string_width(buffer); + // Measure text width + text_width = gfx_get_string_width(buffer); - if (width <= 0xFFF) { - x -= width / 2; + // Draw the text centred + if (text_width <= 0xFFF) { + x -= text_width / 2; gfx_draw_string(dpi, buffer, colour, x, y); } } @@ -1132,15 +1136,19 @@ int gfx_get_string_width(char *buffer) */ void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, int format, void* args, int colour, int x, int y, int width) { - RCT2_CALLPROC_X(0x006C1B83, colour, format, x, y, (int)args, (int)dpi, width); + // RCT2_CALLPROC_X(0x006C1B83, colour, format, x, y, (int)args, (int)dpi, width); - //char* buffer; + char* buffer; - //buffer = (char*)0x0141ED68; - //format_string(buffer, format, args); - //rctmem->current_font_sprite_base = 224; - //clip_text(buffer, width); - //gfx_draw_string(dpi, buffer, colour, x, y); + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + format_string(buffer, format, args); + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; + + // Clip text + RCT2_CALLPROC_X(0x006C2460, 0, 0, 0, 0, (int)buffer, width, 0); + + gfx_draw_string(dpi, buffer, colour, x, y); } /** @@ -1157,19 +1165,24 @@ void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, int format, void* args */ void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y, int width) { - RCT2_CALLPROC_X(0x006C1BBA, colour, format, x, y, (int)args, (int)dpi, width); + char* buffer; + short text_width; - //char* buffer; - //short text_width; + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + format_string(buffer, format, args); - //buffer = (char*)0x0141ED68; - //format_string(buffer, format, args); - //rctmem->current_font_sprite_base = 224; - //text_width = clip_text(buffer, width); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; - //// Draw the text centred - //x -= (text_width - 1) / 2; - //gfx_draw_string(dpi, buffer, colour, x, y); + // Clip text + RCT2_CALLPROC_X(0x006C2460, 0, 0, 0, 0, (int)buffer, width, 0); + // // Measure text width + // text_width = gfx_get_string_width(buffer); + + // Draw the text centred + if (text_width <= 0xFFF) { + x -= text_width / 2; + gfx_draw_string(dpi, buffer, colour, x, y); + } } From b5d11159b38d9e1153ea39b5270fd2d231ade9a1 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Thu, 29 May 2014 15:44:47 +0200 Subject: [PATCH 11/18] Start of clip_text --- src/gfx.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/src/gfx.c b/src/gfx.c index e1c3c1bcc9..d35357875b 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1122,6 +1122,116 @@ int gfx_get_string_width(char *buffer) return width; } +/** + * Clip the text in buffer to width and return the new width of the clipped string + * + * rct2: 0x006C2460 + * buffer (esi) + * width (edi) + */ +int gfx_clip_string(char *buffer, int width) +{ + uint16 base; + + if (width < 6) { + *buffer = 0; + return 0; + } + + base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + edx = rct2_address(0x141E9F6, uint32)[base]; + + edx = &(edx + edx*2); + // lea edx, [edx+edx*2] + dx = -(edx & 0xFFFF); + dx += width; + eax = 0; + cx = 0; + max_x = 0; + ebp = buffer; + + + // loc_6C2485: ; CODE XREF: clip_text+42j + for (uint32 al = *buffer; al > 0; buffer++, al = *buffer) { + + if (al < 0x20) { + switch(curr_char) { + case 1: + width = *buffer; + buffer++; + continue; + case 2: + case 3: + case 4: + buffer++; + continue; + case 7: + base = 0x1C0; + // jmp short loc_6C2523 + break; + case 8: + base = 0x2A0; + // jmp short loc_6C2523 + break; + case 9: + base = 0x0E0; + // jmp short loc_6C2523 + break; + case 0x0A: + base = 0; + // jmp short loc_6C2523 + break; + case 0x17: + curr_char = *buffer; + curr_char &= 0x7FFFF; + buffer += 4; + curr_char <<= 4; + width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[curr_char]; + curr_char = 0; + break; + default: + if (curr_char <= 0x10) { + continue; + } + buffer += 2; + if (curr_char <= 0x16) { + continue; + } + buffer += 2; + break; + } + + + // loc_6C2523: ; CODE XREF: clip_text+AEj + // ; clip_text+B5j ... + // movzx edx, byte_141E9F6[ebx] + // lea edx, [edx+edx*2] + // neg dx + // add dx, di + // jmp loc_6C2485 + + } else { + + max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); + + // loc_6C249A: ; CODE XREF: clip_text+AAj + if (max_x > width) { + rct2_global(ebp + 0, uint32) = 0x2E2E2E; + max_x = width; + // pop esi + return; + } + if (max_x > dx) { + continue; + // ja short loc_6C2485 + } + ebp = buffer; + continue; + } + } +} + + /** * Draws i formatted text string left aligned at i specified position but clips * the text with an elipsis if the text width exceeds the specified width. From 9fecf42e518e665aaa4289c3e25832be4d01f158 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Thu, 29 May 2014 15:52:42 +0200 Subject: [PATCH 12/18] Tidy up loop on pointer --- src/gfx.c | 241 ++++++++++++++++++++++++++---------------------------- 1 file changed, 118 insertions(+), 123 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index d35357875b..7c14ab2ec6 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1066,26 +1066,24 @@ int gfx_get_string_width(char *buffer) int base; int width; - uint8 curr_char; - base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); width = 0; - for (curr_char = *buffer; curr_char > 0; buffer++, curr_char = *buffer) { + for (uint8* curr_char = buffer; *curr_char > 0; curr_char++) { - if (curr_char >= 0x20) { - width += RCT2_ADDRESS(0x0141E9E8, uint8)[base + (curr_char-0x20)]; + if (*curr_char >= 0x20) { + width += RCT2_ADDRESS(0x0141E9E8, uint8)[base + (*curr_char-0x20)]; continue; } - switch(curr_char) { + switch(*curr_char) { case 1: - width = *buffer; - buffer++; + width = *curr_char; + curr_char++; break; case 2: case 3: case 4: - buffer++; + curr_char++; break; case 7: base = 0x1C0; @@ -1100,22 +1098,19 @@ int gfx_get_string_width(char *buffer) base = 0; break; case 0x17: - curr_char = *buffer; - curr_char &= 0x7FFFF; - buffer += 4; - curr_char <<= 4; - width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[curr_char]; - curr_char = 0; + width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[(*curr_char & 0x7FFFF) << 4]; + curr_char += 4; + *curr_char = 0; break; default: - if (curr_char <= 0x10) { + if (*curr_char <= 0x10) { continue; } - buffer += 2; - if (curr_char <= 0x16) { + curr_char += 2; + if (*curr_char <= 0x16) { continue; } - buffer += 2; + curr_char += 2; break; } } @@ -1129,107 +1124,107 @@ int gfx_get_string_width(char *buffer) * buffer (esi) * width (edi) */ -int gfx_clip_string(char *buffer, int width) -{ - uint16 base; +// int gfx_clip_string(char *buffer, int width) +// { +// uint16 base; - if (width < 6) { - *buffer = 0; - return 0; - } +// if (width < 6) { +// *buffer = 0; +// return 0; +// } - base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - edx = rct2_address(0x141E9F6, uint32)[base]; +// base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); +// edx = rct2_address(0x141E9F6, uint32)[base]; - edx = &(edx + edx*2); - // lea edx, [edx+edx*2] - dx = -(edx & 0xFFFF); - dx += width; - eax = 0; - cx = 0; - max_x = 0; - ebp = buffer; +// edx = &(edx + edx*2); +// // lea edx, [edx+edx*2] +// dx = -(edx & 0xFFFF); +// dx += width; +// eax = 0; +// cx = 0; +// max_x = 0; +// ebp = buffer; - // loc_6C2485: ; CODE XREF: clip_text+42j - for (uint32 al = *buffer; al > 0; buffer++, al = *buffer) { +// // loc_6C2485: ; CODE XREF: clip_text+42j +// for (uint32 al = *buffer; al > 0; buffer++, al = *buffer) { - if (al < 0x20) { - switch(curr_char) { - case 1: - width = *buffer; - buffer++; - continue; - case 2: - case 3: - case 4: - buffer++; - continue; - case 7: - base = 0x1C0; - // jmp short loc_6C2523 - break; - case 8: - base = 0x2A0; - // jmp short loc_6C2523 - break; - case 9: - base = 0x0E0; - // jmp short loc_6C2523 - break; - case 0x0A: - base = 0; - // jmp short loc_6C2523 - break; - case 0x17: - curr_char = *buffer; - curr_char &= 0x7FFFF; - buffer += 4; - curr_char <<= 4; - width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[curr_char]; - curr_char = 0; - break; - default: - if (curr_char <= 0x10) { - continue; - } - buffer += 2; - if (curr_char <= 0x16) { - continue; - } - buffer += 2; - break; - } +// if (al < 0x20) { +// switch(curr_char) { +// case 1: +// width = *buffer; +// buffer++; +// continue; +// case 2: +// case 3: +// case 4: +// buffer++; +// continue; +// case 7: +// base = 0x1C0; +// // jmp short loc_6C2523 +// break; +// case 8: +// base = 0x2A0; +// // jmp short loc_6C2523 +// break; +// case 9: +// base = 0x0E0; +// // jmp short loc_6C2523 +// break; +// case 0x0A: +// base = 0; +// // jmp short loc_6C2523 +// break; +// case 0x17: +// curr_char = *buffer; +// curr_char &= 0x7FFFF; +// buffer += 4; +// curr_char <<= 4; +// width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[curr_char]; +// curr_char = 0; +// break; +// default: +// if (curr_char <= 0x10) { +// continue; +// } +// buffer += 2; +// if (curr_char <= 0x16) { +// continue; +// } +// buffer += 2; +// break; +// } - // loc_6C2523: ; CODE XREF: clip_text+AEj - // ; clip_text+B5j ... - // movzx edx, byte_141E9F6[ebx] - // lea edx, [edx+edx*2] - // neg dx - // add dx, di - // jmp loc_6C2485 +// // loc_6C2523: ; CODE XREF: clip_text+AEj +// // ; clip_text+B5j ... +// // movzx edx, byte_141E9F6[ebx] +// // lea edx, [edx+edx*2] +// // neg dx +// // add dx, di +// // jmp loc_6C2485 - } else { +// } else { - max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); +// max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); - // loc_6C249A: ; CODE XREF: clip_text+AAj - if (max_x > width) { - rct2_global(ebp + 0, uint32) = 0x2E2E2E; - max_x = width; - // pop esi - return; - } - if (max_x > dx) { - continue; - // ja short loc_6C2485 - } - ebp = buffer; - continue; - } - } -} +// // loc_6C249A: ; CODE XREF: clip_text+AAj +// if (max_x > width) { +// rct2_global(ebp + 0, uint32) = 0x2E2E2E; +// max_x = width; +// // pop esi +// return; +// } +// if (max_x > dx) { +// continue; +// // ja short loc_6C2485 +// } +// ebp = buffer; +// continue; +// } +// } +// } /** @@ -1275,24 +1270,24 @@ void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, int format, void* args */ void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y, int width) { - char* buffer; - short text_width; + // char* buffer; + // short text_width; - buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); - format_string(buffer, format, args); + // buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + // format_string(buffer, format, args); - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; + // RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; - // Clip text - RCT2_CALLPROC_X(0x006C2460, 0, 0, 0, 0, (int)buffer, width, 0); - // // Measure text width - // text_width = gfx_get_string_width(buffer); + // // Clip text + // RCT2_CALLPROC_X(0x006C2460, 0, 0, 0, 0, (int)buffer, width, 0); + // // // Measure text width + // // text_width = gfx_get_string_width(buffer); - // Draw the text centred - if (text_width <= 0xFFF) { - x -= text_width / 2; - gfx_draw_string(dpi, buffer, colour, x, y); - } + // // Draw the text centred + // if (text_width <= 0xFFF) { + // x -= text_width / 2; + // gfx_draw_string(dpi, buffer, colour, x, y); + // } } From 9c9ece2d7bd7310917ad21a1f02fbbf8e0abfd15 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Thu, 29 May 2014 21:21:01 +0200 Subject: [PATCH 13/18] clip text mostly working --- src/gfx.c | 188 +++++++++++++++++++++++------------------------------- 1 file changed, 80 insertions(+), 108 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index 7c14ab2ec6..c9b2e5ab1e 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1124,107 +1124,81 @@ int gfx_get_string_width(char *buffer) * buffer (esi) * width (edi) */ -// int gfx_clip_string(char *buffer, int width) -// { -// uint16 base; +int gfx_clip_string(char *buffer, int width) +{ + uint16 base; + int edx, ebp; + int max_x; -// if (width < 6) { -// *buffer = 0; -// return 0; -// } + if (width < 6) { + *buffer = 0; + return 0; + } -// base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); -// edx = rct2_address(0x141E9F6, uint32)[base]; + base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + edx = width - (3 * RCT2_ADDRESS(0x141E9F6, uint32)[base]); -// edx = &(edx + edx*2); -// // lea edx, [edx+edx*2] -// dx = -(edx & 0xFFFF); -// dx += width; -// eax = 0; -// cx = 0; -// max_x = 0; -// ebp = buffer; + max_x = 0; + ebp = buffer; + for (uint8* curr_char = buffer; *curr_char > 0; curr_char++) { + if (*curr_char < 0x20) { + switch(*curr_char) { + case 1: + width = *curr_char; + curr_char++; + continue; + case 2: + case 3: + case 4: + curr_char++; + continue; + case 7: + base = 0x1C0; + break; + case 8: + base = 0x2A0; + break; + case 9: + base = 0x0E0; + break; + case 0x0A: + base = 0; + break; + case 0x17: + max_x = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[(*curr_char & 0x7FFFF) << 4]; + curr_char += 4; + *curr_char = 0; + continue; + default: + if (*curr_char <= 0x10) { + continue; + } + curr_char += 2; + if (*curr_char <= 0x16) { + continue; + } + curr_char += 2; + continue; + } -// // loc_6C2485: ; CODE XREF: clip_text+42j -// for (uint32 al = *buffer; al > 0; buffer++, al = *buffer) { + edx = RCT2_ADDRESS(0x141E9F6, uint32)[base]; + edx = width - (3 * RCT2_ADDRESS(0x141E9F6, uint32)[base]); + } -// if (al < 0x20) { -// switch(curr_char) { -// case 1: -// width = *buffer; -// buffer++; -// continue; -// case 2: -// case 3: -// case 4: -// buffer++; -// continue; -// case 7: -// base = 0x1C0; -// // jmp short loc_6C2523 -// break; -// case 8: -// base = 0x2A0; -// // jmp short loc_6C2523 -// break; -// case 9: -// base = 0x0E0; -// // jmp short loc_6C2523 -// break; -// case 0x0A: -// base = 0; -// // jmp short loc_6C2523 -// break; -// case 0x17: -// curr_char = *buffer; -// curr_char &= 0x7FFFF; -// buffer += 4; -// curr_char <<= 4; -// width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[curr_char]; -// curr_char = 0; -// break; -// default: -// if (curr_char <= 0x10) { -// continue; -// } -// buffer += 2; -// if (curr_char <= 0x16) { -// continue; -// } -// buffer += 2; -// break; -// } + max_x += (RCT2_ADDRESS(0x0141E9E8, uint8)[base] & 0xFF); - -// // loc_6C2523: ; CODE XREF: clip_text+AEj -// // ; clip_text+B5j ... -// // movzx edx, byte_141E9F6[ebx] -// // lea edx, [edx+edx*2] -// // neg dx -// // add dx, di -// // jmp loc_6C2485 - -// } else { - -// max_x = max_x + (RCT2_ADDRESS(0x0141E9E8, uint8)[ebx] & 0xFF); - -// // loc_6C249A: ; CODE XREF: clip_text+AAj -// if (max_x > width) { -// rct2_global(ebp + 0, uint32) = 0x2E2E2E; -// max_x = width; -// // pop esi -// return; -// } -// if (max_x > dx) { -// continue; -// // ja short loc_6C2485 -// } -// ebp = buffer; -// continue; -// } -// } -// } + if (max_x > width) { + RCT2_GLOBAL(ebp + 0, uint32) = 0x2E2E2E; + max_x = width; + return; + } + if (max_x <= edx) { + ebp = curr_char; + } + } + return max_x; +} /** @@ -1270,24 +1244,22 @@ void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, int format, void* args */ void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, int format, void *args, int colour, int x, int y, int width) { - // char* buffer; - // short text_width; + char* buffer; + short text_width; - // buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); - // format_string(buffer, format, args); + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + format_string(buffer, format, args); - // RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; - // // Clip text - // RCT2_CALLPROC_X(0x006C2460, 0, 0, 0, 0, (int)buffer, width, 0); - // // // Measure text width - // // text_width = gfx_get_string_width(buffer); + // Clip text + text_width = gfx_clip_string(buffer, width); - // // Draw the text centred - // if (text_width <= 0xFFF) { - // x -= text_width / 2; - // gfx_draw_string(dpi, buffer, colour, x, y); - // } + // Draw the text centred + if (text_width <= 0xFFF) { + x -= (text_width - 1) / 2; + gfx_draw_string(dpi, buffer, colour, x, y); + } } From 1dc794b038c2c6c1c5f445cbc05e82f1a6594912 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Thu, 29 May 2014 23:30:05 +0200 Subject: [PATCH 14/18] Finish clip string --- src/gfx.c | 60 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index c9b2e5ab1e..a546ac8231 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1118,30 +1118,35 @@ int gfx_get_string_width(char *buffer) } /** - * Clip the text in buffer to width and return the new width of the clipped string + * Clip the text in buffer to width, add ellipsis and return the new width of the clipped string * * rct2: 0x006C2460 * buffer (esi) * width (edi) */ -int gfx_clip_string(char *buffer, int width) +int gfx_clip_string(char* buffer, int width) { - uint16 base; - int edx, ebp; - int max_x; + // Location of font sprites + uint16 current_font_sprite_base; + // Width the string has to fit into + int max_width; + // Character to change to ellipsis + char* last_char; + // Width of the string, including ellipsis + int clipped_width; if (width < 6) { *buffer = 0; return 0; } - base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); - edx = width - (3 * RCT2_ADDRESS(0x141E9F6, uint32)[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]); - max_x = 0; - ebp = buffer; + clipped_width = 0; + last_char = buffer; - for (uint8* curr_char = buffer; *curr_char > 0; curr_char++) { + for (char* curr_char = buffer; *curr_char > 0; curr_char++) { if (*curr_char < 0x20) { switch(*curr_char) { case 1: @@ -1154,19 +1159,19 @@ int gfx_clip_string(char *buffer, int width) curr_char++; continue; case 7: - base = 0x1C0; + current_font_sprite_base = 0x1C0; break; case 8: - base = 0x2A0; + current_font_sprite_base = 0x2A0; break; case 9: - base = 0x0E0; + current_font_sprite_base = 0x0E0; break; case 0x0A: - base = 0; + current_font_sprite_base = 0; break; case 0x17: - max_x = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[(*curr_char & 0x7FFFF) << 4]; + clipped_width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[(*curr_char & 0x7FFFF) << 4]; curr_char += 4; *curr_char = 0; continue; @@ -1181,26 +1186,23 @@ int gfx_clip_string(char *buffer, int width) curr_char += 2; continue; } - - edx = RCT2_ADDRESS(0x141E9F6, uint32)[base]; - edx = width - (3 * RCT2_ADDRESS(0x141E9F6, uint32)[base]); + max_width = width - (3 * RCT2_ADDRESS(0x141E9F6, uint8)[current_font_sprite_base]); } - max_x += (RCT2_ADDRESS(0x0141E9E8, uint8)[base] & 0xFF); + clipped_width += RCT2_ADDRESS(0x0141E9E8, uint8)[current_font_sprite_base + (*curr_char-0x20)]; - if (max_x > width) { - RCT2_GLOBAL(ebp + 0, uint32) = 0x2E2E2E; - max_x = width; - return; + if (clipped_width >= width) { + RCT2_GLOBAL(last_char, uint32) = 0x2E2E2E; + clipped_width = width; + return clipped_width; } - if (max_x <= edx) { - ebp = curr_char; + if (clipped_width <= max_width) { + last_char = curr_char; } } - return max_x; + return clipped_width; } - /** * Draws i formatted text string left aligned at i specified position but clips * the text with an elipsis if the text width exceeds the specified width. @@ -1224,8 +1226,8 @@ void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, int format, void* args RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 0xE0; - // Clip text - RCT2_CALLPROC_X(0x006C2460, 0, 0, 0, 0, (int)buffer, width, 0); + // Clip text - return value is not needed + gfx_clip_string(buffer, width); gfx_draw_string(dpi, buffer, colour, x, y); } From 5b41528e2e726445cadeb4de407a2be74c5967bb Mon Sep 17 00:00:00 2001 From: ZedThree Date: Thu, 29 May 2014 23:30:20 +0200 Subject: [PATCH 15/18] Rename variables in get_width to align with clip_string --- src/gfx.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index a546ac8231..ce3c8cdac8 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1061,18 +1061,20 @@ void gfx_redraw_screen_rect(short left, short top, short right, short bottom) * rct2: 0x006C2321 * buffer (esi) */ -int gfx_get_string_width(char *buffer) +int gfx_get_string_width(char* buffer) { - int base; + // Current font sprites + uint16 current_font_sprite_base; + // Width of string int width; - base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + current_font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); width = 0; - for (uint8* curr_char = buffer; *curr_char > 0; curr_char++) { + for (char* curr_char = buffer; *curr_char > 0; curr_char++) { if (*curr_char >= 0x20) { - width += RCT2_ADDRESS(0x0141E9E8, uint8)[base + (*curr_char-0x20)]; + width += RCT2_ADDRESS(0x0141E9E8, uint8)[current_font_sprite_base + (*curr_char-0x20)]; continue; } switch(*curr_char) { @@ -1086,16 +1088,16 @@ int gfx_get_string_width(char *buffer) curr_char++; break; case 7: - base = 0x1C0; + current_font_sprite_base = 0x1C0; break; case 8: - base = 0x2A0; + current_font_sprite_base = 0x2A0; break; case 9: - base = 0x0E0; + current_font_sprite_base = 0x0E0; break; case 0x0A: - base = 0; + current_font_sprite_base = 0; break; case 0x17: width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[(*curr_char & 0x7FFFF) << 4]; From 583fbaa2a4357419632109cf9b37e38881b60454 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Fri, 30 May 2014 14:10:27 +0200 Subject: [PATCH 16/18] Fix some pointer issues --- src/gfx.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index ce3c8cdac8..c2ec96794f 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1064,17 +1064,17 @@ void gfx_redraw_screen_rect(short left, short top, short right, short bottom) int gfx_get_string_width(char* buffer) { // Current font sprites - uint16 current_font_sprite_base; + uint16* current_font_sprite_base; // Width of string int width; - current_font_sprite_base = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + current_font_sprite_base = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); width = 0; - for (char* curr_char = buffer; *curr_char > 0; curr_char++) { + for (char* curr_char = buffer; *curr_char != NULL; curr_char++) { if (*curr_char >= 0x20) { - width += RCT2_ADDRESS(0x0141E9E8, uint8)[current_font_sprite_base + (*curr_char-0x20)]; + width += RCT2_ADDRESS(0x0141E9E8, uint8)[*current_font_sprite_base + (*curr_char-0x20)]; continue; } switch(*curr_char) { @@ -1088,16 +1088,16 @@ int gfx_get_string_width(char* buffer) curr_char++; break; 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: width = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS + 4, uint16)[(*curr_char & 0x7FFFF) << 4]; @@ -1129,7 +1129,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 int max_width; // Character to change to ellipsis @@ -1142,13 +1142,13 @@ int gfx_clip_string(char* buffer, int width) return 0; } - 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]); + current_font_sprite_base = RCT2_ADDRESS(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 (char* curr_char = buffer; *curr_char > 0; curr_char++) { + for (char* curr_char = buffer; *curr_char != NULL; curr_char++) { if (*curr_char < 0x20) { switch(*curr_char) { case 1: @@ -1161,16 +1161,16 @@ 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]; @@ -1188,10 +1188,10 @@ int gfx_clip_string(char* buffer, int width) curr_char += 2; 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) { RCT2_GLOBAL(last_char, uint32) = 0x2E2E2E; @@ -1424,8 +1424,8 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in RCT2_GLOBAL(0x00EDF842, uint16) = y; // - uint16* current_font_flags = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); - uint16* current_font_sprite_base = &RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + uint16* current_font_flags = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16); + uint16* current_font_sprite_base = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); // Flag for skipping non-printing characters int skip_char = 0; From a06f6ade8b42bbe491c84c9d5f5e7a53b62692b5 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Sat, 31 May 2014 16:39:40 +0200 Subject: [PATCH 17/18] String functions for wrapped text --- src/gfx.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 124 insertions(+), 16 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index c2ec96794f..2a80c2e1f5 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1307,15 +1307,62 @@ void gfx_draw_string_right(rct_drawpixelinfo* dpi, int format, void* args, int c int gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, int x, int y, int width, int format, int colour) { int eax, ebx, ecx, edx, esi, edi, ebp; + // Location of font sprites + uint16* current_font_sprite_base; + // Location of font flags + uint16 current_font_flags; - eax = colour; - ebx = format; - ecx = x; - edx = y; - esi = (int)args; - edi = (int)dpi; - ebp = width; - RCT2_CALLFUNC_X(0x006C1E53, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + current_font_sprite_base = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + *current_font_sprite_base = 0xE0; + + char* buffer = RCT2_ADDRESS(0x009C383D, char); + + gfx_draw_string(dpi, buffer, colour, dpi->x, dpi->y); + + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + + format_string(buffer, format, args); + + *current_font_sprite_base = 0xE0; + + esi = buffer; + edi = width; + RCT2_CALLFUNC_X(0x006C21E2, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + ecx &= 0xFFFF; + edi &= 0xFFFF; + + RCT2_GLOBAL(0x00F43938, uint16) = 0x0A; + + if (ebx > 0xE0) { + RCT2_GLOBAL(0x00F43938, uint16) = 6; + if (ebx != 0x1C0) { + RCT2_GLOBAL(0x00F43938, uint16) = 0x12; + } + } + + if (*buffer == 0x0B) { + RCT2_GLOBAL(0x00F43938, uint16) = RCT2_GLOBAL(0x00F43938, uint16) + 1; + } + + ebx = (RCT2_GLOBAL(0x00F43938, uint16) / 2) * edi; + edx = y - ebx; + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; + + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + + do { + int new_width = gfx_get_string_width(buffer); + new_width /= 2; + gfx_draw_string(dpi, buffer, 0xFE, x - new_width, edx); + + buffer += strlen(buffer) + 1; + + edx += RCT2_GLOBAL(0x00F43938, uint16); + eax = (RCT2_GLOBAL(0x00F43938, uint16) / 2) * edi; + ebx -= eax; + + } while (ebx > 0); return (sint16)(edx & 0xFFFF) - y; } @@ -1334,17 +1381,78 @@ int gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, int x, i int gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *args, int x, int y, int width, int format, int colour) { int eax, ebx, ecx, edx, esi, edi, ebp; + + // eax = colour; + // ebx = format; + // ecx = x; + // edx = y; + // esi = (int)args; + // edi = (int)dpi; + // ebp = width; + // RCT2_CALLFUNC_X(0x006C2105, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + // return (sint16)(edx & 0xFFFF) - y; - eax = colour; - ebx = format; - ecx = x; - edx = y; - esi = (int)args; - edi = (int)dpi; - ebp = width; - RCT2_CALLFUNC_X(0x006C2105, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + // Location of font sprites + uint16* current_font_sprite_base; + // Location of font flags + uint16 current_font_flags; + + current_font_sprite_base = RCT2_ADDRESS(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16); + *current_font_sprite_base = 0xE0; + + char* buffer = RCT2_ADDRESS(0x009C383D, char); + + gfx_draw_string(dpi, buffer, colour, dpi->x, dpi->y); + + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + + format_string(buffer, format, args); + + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + + *current_font_sprite_base = 0xE0; + + // Add line breaks? Adds \0 rather than \n + // not working for strings with colour code? + esi = buffer; + edi = width; + RCT2_CALLFUNC_X(0x006C21E2, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + ecx &= 0xFFFF; + edi &= 0xFFFF; + + // Font height? + RCT2_GLOBAL(0x00F43938, uint16) = 0x0A; + + if (ebx > 0xE0) { + RCT2_GLOBAL(0x00F43938, uint16) = 6; + if (ebx != 0x1C0) { + RCT2_GLOBAL(0x00F43938, uint16) = 0x12; + } + } + + // Number of lines? + ebx = (RCT2_GLOBAL(0x00F43938, uint16) / 2) * edi; + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_FLAGS, uint16) = 0; + + buffer = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + esi = buffer; + + edx = y; + + do { + gfx_draw_string(dpi, buffer, 0xFE, x, edx); + + buffer += strlen(buffer) + 1; + + edx += RCT2_GLOBAL(0x00F43938, uint16); + eax = (RCT2_GLOBAL(0x00F43938, uint16) / 2); + ebx -= eax; + + } while (ebx >= 0); return (sint16)(edx & 0xFFFF) - y; + } /** From 8b1c76b1b608fed23139629fa4a164153edd2ea2 Mon Sep 17 00:00:00 2001 From: ZedThree Date: Sat, 31 May 2014 16:43:39 +0200 Subject: [PATCH 18/18] Replace pad_0E with zoom_level --- src/gfx.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gfx.c b/src/gfx.c index 2a80c2e1f5..8bdd35d596 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -354,7 +354,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot } else { // 00678B7E 00678C83 - if (dpi->pad_0E < 1) { + if (dpi->zoom_level < 1) { // Location in screen buffer? uint8* pixel = top_ * (dpi->width + dpi->pitch) + left_ + dpi->bits; @@ -372,10 +372,10 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot } pixel += length; } - } else if (dpi->pad_0E > 1) { + } else if (dpi->zoom_level > 1) { // 00678C8A 00678D57 right_ = right; - } else if (dpi->pad_0E == 1) { + } else if (dpi->zoom_level == 1) { // 00678C88 00678CEE right = right; } @@ -750,12 +750,12 @@ void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y) ebx &= 0x7FFFF; ebx <<= 4; ebx += RCT2_ADDRESS_G1_ELEMENTS; - if (dpi->pad_0E >= 1){ - if (dpi->pad_0E == 1){ + if (dpi->zoom_level >= 1){ + if (dpi->zoom_level == 1){ return; //jump into 0x67bd81 } - if (dpi->pad_0E >= 3){ + if (dpi->zoom_level >= 3){ return;//jump into 0x67FAAE } //jump into 0x67DADA