From 2273626bddfec0e06d636a60b16a9ff435164ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 3 May 2016 17:37:16 +0200 Subject: [PATCH] Refactor gX.dat loading, make sure g2.dat loads too --- src/drawing/sprite.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index d0c33b63db..cf4dc11582 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -31,6 +31,25 @@ rct_gx g2; rct_g1_element *g1Elements = (rct_g1_element*)RCT2_ADDRESS_G1_ELEMENTS; #endif +static void read_and_convert_gxdat(SDL_RWops *file, size_t count, rct_g1_element *elements) +{ + rct_g1_element_32bit *g1Elements32 = calloc(count, sizeof(rct_g1_element_32bit)); + SDL_RWread(file, g1Elements32, count * sizeof(rct_g1_element_32bit), 1); + for (size_t i = 0; i < count; i++) { + /* Double cast to silence compiler warning about casting to + * pointer from integer of mismatched length. + */ + elements[i].offset = (uint8*)(uintptr_t)g1Elements32[i].offset; + elements[i].width = g1Elements32[i].width; + elements[i].height = g1Elements32[i].height; + elements[i].x_offset = g1Elements32[i].x_offset; + elements[i].y_offset = g1Elements32[i].y_offset; + elements[i].flags = g1Elements32[i].flags; + elements[i].zoomed_offset = g1Elements32[i].zoomed_offset; + } + free(g1Elements32); +} + /** * * rct2: 0x00678998 @@ -63,18 +82,7 @@ int gfx_load_g1() g1Elements = calloc(324206, sizeof(rct_g1_element)); #endif - rct_g1_element_32bit *g1Elements32 = calloc(324206, sizeof(rct_g1_element_32bit)); - SDL_RWread(file, g1Elements32, header.num_entries * sizeof(rct_g1_element_32bit), 1); - for (uint32 i = 0; i < header.num_entries; i++) { - g1Elements[i].offset = (uint8*)g1Elements32[i].offset; - g1Elements[i].width = g1Elements32[i].width; - g1Elements[i].height = g1Elements32[i].height; - g1Elements[i].x_offset = g1Elements32[i].x_offset; - g1Elements[i].y_offset = g1Elements32[i].y_offset; - g1Elements[i].flags = g1Elements32[i].flags; - g1Elements[i].zoomed_offset = g1Elements32[i].zoomed_offset; - } - free(g1Elements32); + read_and_convert_gxdat(file, header.num_entries, g1Elements); // Read element data _g1Buffer = malloc(header.total_size); @@ -128,7 +136,8 @@ int gfx_load_g2() if (SDL_RWread(file, &g2.header, 8, 1) == 1) { // Read element headers g2.elements = malloc(g2.header.num_entries * sizeof(rct_g1_element)); - SDL_RWread(file, g2.elements, g2.header.num_entries * sizeof(rct_g1_element), 1); + + read_and_convert_gxdat(file, g2.header.num_entries, g2.elements); // Read element data g2.data = malloc(g2.header.total_size);