From 683eee827e25e271bac7e711988026f11035d3f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Fri, 24 Jun 2016 22:52:28 +0200 Subject: [PATCH] Refactor gX.dat loading, make sure g2.dat loads too --- src/drawing/drawing.h | 13 +++++++++++++ src/drawing/sprite.c | 35 ++++++++++++++++++++++------------- src/object.c | 16 +++++++++++----- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index 8321c688ef..04367bc40e 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -57,6 +57,19 @@ typedef struct rct_drawpixelinfo { assert_struct_size(rct_drawpixelinfo, 0x10); #endif +// Size: 0x10 +typedef struct rct_g1_element_32bit { + uint32 offset; // 0x00 note: uint32 always! + sint16 width; // 0x04 + sint16 height; // 0x06 + sint16 x_offset; // 0x08 + sint16 y_offset; // 0x0A + uint16 flags; // 0x0C + uint16 zoomed_offset; // 0x0E +} rct_g1_element_32bit; +assert_struct_size(rct_g1_element_32bit, 0x10); + + enum { G1_FLAG_BMP = (1 << 0), //No invisible sections G1_FLAG_RLE_COMPRESSION = (1<<2), diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index 4787ed7684..26458bb1ab 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 @@ -77,18 +96,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); @@ -141,7 +149,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); diff --git a/src/object.c b/src/object.c index e7cbfb01fa..ad3928100a 100644 --- a/src/object.c +++ b/src/object.c @@ -460,17 +460,23 @@ int object_chunk_load_image_directory(uint8_t** chunk) rct_g1_element* g1_dest = &g1Elements[image_start_no]; // After length of data is the start of all g1 element structs - rct_g1_element* g1_source = (rct_g1_element*)(*chunk); + rct_g1_element_32bit* g1_source = (rct_g1_element_32bit*)(*chunk); // After the g1 element structs is the actual images. - uint8* image_offset = no_images * sizeof(rct_g1_element) + (uint8*)g1_source; + uintptr_t image_offset = no_images * sizeof(rct_g1_element_32bit) + (uintptr_t)g1_source; - for (int i = 0; i < no_images; ++i){ - *g1_dest = *g1_source++; - g1_dest->offset += (uint32)image_offset; + for (int i = 0; i < no_images; ++i) { + g1_dest->offset = (uint8*)(g1_source->offset + image_offset); + g1_dest->width = g1_source->width; + g1_dest->height = g1_source->height; + g1_dest->x_offset = g1_source->x_offset; + g1_dest->y_offset = g1_source->y_offset; + g1_dest->flags = g1_source->flags; + g1_dest->zoomed_offset = g1_source->zoomed_offset; g1_dest++; drawing_engine_invalidate_image(image_start_no + i); + g1_source++; } *chunk = ((uint8*)g1_source) + length_of_data;