diff --git a/src/openrct2-ui/windows/InstallTrack.cpp b/src/openrct2-ui/windows/InstallTrack.cpp index 3219b8add6..638de6e317 100644 --- a/src/openrct2-ui/windows/InstallTrack.cpp +++ b/src/openrct2-ui/windows/InstallTrack.cpp @@ -228,16 +228,17 @@ static void window_install_track_paint(rct_window *w, rct_drawpixelinfo *dpi) sint32 colour = ColourMapA[w->colours[0]].darkest; gfx_fill_rect(dpi, x, y, x + 369, y + 216, colour); - rct_g1_element * substituteElement = &g1Elements[SPR_TEMP]; - rct_g1_element tmpElement = * substituteElement; - substituteElement->offset = _trackDesignPreviewPixels + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); - substituteElement->width = 370; - substituteElement->height = 217; - substituteElement->x_offset = 0; - substituteElement->y_offset = 0; - substituteElement->flags = G1_FLAG_BMP; + auto g1backup = gfx_get_g1_element(SPR_TEMP); + + rct_g1_element g1temp = { 0 }; + g1temp.offset = _trackDesignPreviewPixels + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); + g1temp.width = 370; + g1temp.height = 217; + g1temp.flags = G1_FLAG_BMP; + + gfx_set_g1_element(SPR_TEMP, &g1temp); gfx_draw_sprite(dpi, 0, x, y, 0); - *substituteElement = tmpElement; + gfx_set_g1_element(SPR_TEMP, g1backup); x = w->x + (widget->left + widget->right) / 2; y = w->y + widget->bottom - 12; diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index 876c75fedf..a21f37581a 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -882,19 +882,18 @@ static void window_map_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 { gfx_clear(dpi, PALETTE_INDEX_10); - rct_g1_element * g1 = &g1Elements[SPR_TEMP]; - rct_g1_element g1backup = *g1; - - g1->offset = (uint8 *) _mapImageData; - g1->width = MAP_WINDOW_MAP_SIZE; - g1->height = MAP_WINDOW_MAP_SIZE; - g1->x_offset = -8; - g1->y_offset = -8; - g1->flags = 0; + auto g1backup = gfx_get_g1_element(SPR_TEMP); + + rct_g1_element g1temp = { 0 }; + g1temp.offset = (uint8 *)_mapImageData; + g1temp.width = MAP_WINDOW_MAP_SIZE; + g1temp.height = MAP_WINDOW_MAP_SIZE; + g1temp.x_offset = -8; + g1temp.y_offset = -8; + gfx_set_g1_element(SPR_TEMP, &g1temp); gfx_draw_sprite(dpi, SPR_TEMP, 0, 0, 0); - - *g1 = g1backup; + gfx_set_g1_element(SPR_TEMP, g1backup); if (w->selected_tab == PAGE_PEEPS) { diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index 33da7d25d4..961967ab1a 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -467,16 +467,14 @@ static void window_track_place_paint(rct_window *w, rct_drawpixelinfo *dpi) // Draw mini tile preview rct_drawpixelinfo clippedDpi; if (clip_drawpixelinfo(&clippedDpi, dpi, w->x + 4, w->y + 18, 168, 78)) { - rct_g1_element *substituteElement = &g1Elements[SPR_TEMP]; - rct_g1_element tmpElement = *substituteElement; - substituteElement->offset = _window_track_place_mini_preview; - substituteElement->width = TRACK_MINI_PREVIEW_WIDTH; - substituteElement->height = TRACK_MINI_PREVIEW_HEIGHT; - substituteElement->x_offset = 0; - substituteElement->y_offset = 0; - substituteElement->flags = 0; + auto g1backup = gfx_get_g1_element(SPR_TEMP); + rct_g1_element g1temp = { 0 }; + g1temp.offset = _window_track_place_mini_preview; + g1temp.width = TRACK_MINI_PREVIEW_WIDTH; + g1temp.height = TRACK_MINI_PREVIEW_HEIGHT; + gfx_set_g1_element(SPR_TEMP, &g1temp); gfx_draw_sprite(&clippedDpi, SPRITE_ID_PALETTE_COLOUR_1(NOT_TRANSLUCENT(w->colours[0])), 0, 0, 0); - *substituteElement = tmpElement; + gfx_set_g1_element(SPR_TEMP, g1backup); } // Price diff --git a/src/openrct2-ui/windows/TrackList.cpp b/src/openrct2-ui/windows/TrackList.cpp index 266bb81681..f0a977aa3f 100644 --- a/src/openrct2-ui/windows/TrackList.cpp +++ b/src/openrct2-ui/windows/TrackList.cpp @@ -422,16 +422,17 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) return; } - rct_g1_element *substituteElement = &g1Elements[SPR_TEMP]; - rct_g1_element tmpElement = *substituteElement; - substituteElement->offset = _trackDesignPreviewPixels + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); - substituteElement->width = 370; - substituteElement->height = 217; - substituteElement->x_offset = 0; - substituteElement->y_offset = 0; - substituteElement->flags = G1_FLAG_BMP; + auto g1backup = gfx_get_g1_element(SPR_TEMP); + + rct_g1_element g1temp = { 0 }; + g1temp.offset = _trackDesignPreviewPixels + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); + g1temp.width = 370; + g1temp.height = 217; + g1temp.flags = G1_FLAG_BMP; + + gfx_set_g1_element(SPR_TEMP, &g1temp); gfx_draw_sprite(dpi, 0, x, y, 0); - *substituteElement = tmpElement; + gfx_set_g1_element(SPR_TEMP, g1backup); x = w->x + (widget->left + widget->right) / 2; y = w->y + widget->bottom - 12; diff --git a/src/openrct2/drawing/Image.cpp b/src/openrct2/drawing/Image.cpp index 4c0c5cff6a..d8085db40e 100644 --- a/src/openrct2/drawing/Image.cpp +++ b/src/openrct2/drawing/Image.cpp @@ -220,7 +220,7 @@ extern "C" uint32 imageId = baseImageId; for (uint32 i = 0; i < count; i++) { - g1Elements[imageId] = images[i]; + gfx_set_g1_element(imageId, &images[i]); drawing_engine_invalidate_image(imageId); imageId++; } @@ -237,7 +237,8 @@ extern "C" for (uint32 i = 0; i < count; i++) { uint32 imageId = baseImageId + i; - g1Elements[imageId] = { 0 }; + rct_g1_element g1 = { 0 }; + gfx_set_g1_element(imageId, &g1); drawing_engine_invalidate_image(imageId); } diff --git a/src/openrct2/drawing/Sprite.cpp b/src/openrct2/drawing/Sprite.cpp index 1053e91e3e..8669b405f2 100644 --- a/src/openrct2/drawing/Sprite.cpp +++ b/src/openrct2/drawing/Sprite.cpp @@ -162,10 +162,10 @@ extern "C" static bool _csgLoaded = false; #ifdef NO_RCT2 - size_t g1ElementsCount = 0; - rct_g1_element * g1Elements = nullptr; + static size_t g1ElementsCount = 0; + static rct_g1_element * g1Elements = nullptr; #else - rct_g1_element * g1Elements = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element); + static rct_g1_element * g1Elements = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element); #endif bool gTinyFontAntiAliased = false; @@ -791,6 +791,23 @@ extern "C" return nullptr; } + void gfx_set_g1_element(sint32 imageId, const rct_g1_element * g1) + { + openrct2_assert(!gOpenRCT2NoGraphics, "gfx_set_g1_element called on headless instance"); +#ifdef DEBUG + openrct2_assert(imageId >= 0 && imageId < SPR_G2_BEGIN, "gfx_set_g1_element called with unexpected image id"); + openrct2_assert(g1 != nullptr, "g1 was nullptr"); +#endif + + if (imageId >= 0 || imageId < SPR_G2_BEGIN) + { + if (imageId < (sint32)g1ElementsCount) + { + g1Elements[imageId] = *g1; + } + } + } + bool is_csg_loaded() { return _csgLoaded; diff --git a/src/openrct2/drawing/drawing.h b/src/openrct2/drawing/drawing.h index f2310e807c..05241cc859 100644 --- a/src/openrct2/drawing/drawing.h +++ b/src/openrct2/drawing/drawing.h @@ -280,7 +280,6 @@ extern uint32 gPickupPeepImage; extern sint32 gPickupPeepX; extern sint32 gPickupPeepY; -extern rct_g1_element *g1Elements; extern bool gTinyFontAntiAliased; extern rct_drawpixelinfo gScreenDPI; @@ -326,6 +325,7 @@ void gfx_unload_g1(); void gfx_unload_g2(); void gfx_unload_csg(); const rct_g1_element * gfx_get_g1_element(sint32 image_id); +void gfx_set_g1_element(sint32 imageId, const rct_g1_element * g1); bool is_csg_loaded(); uint32 gfx_object_allocate_images(const rct_g1_element * images, uint32 count); void gfx_object_free_images(uint32 baseImageId, uint32 count); diff --git a/src/openrct2/drawing/scrolling_text.c b/src/openrct2/drawing/scrolling_text.c index 0f04c0572f..6ac09f806c 100644 --- a/src/openrct2/drawing/scrolling_text.c +++ b/src/openrct2/drawing/scrolling_text.c @@ -79,18 +79,21 @@ void scrolling_text_initialise_bitmaps() for (sint32 i = 0; i < MAX_SCROLLING_TEXT_ENTRIES; i++) { - rct_g1_element * g1 = &g1Elements[SPR_SCROLLING_TEXT_START + i]; - if (g1 != NULL) + sint32 imageId = SPR_SCROLLING_TEXT_START + i; + const rct_g1_element * g1original = gfx_get_g1_element(imageId); + if (g1original != NULL) { - g1->offset = _drawScrollTextList[i].bitmap; - g1->width = 64; - g1->height = 40; - g1->offset[0] = 0xFF; - g1->offset[1] = 0xFF; - g1->offset[14] = 0; - g1->offset[15] = 0; - g1->offset[16] = 0; - g1->offset[17] = 0; + rct_g1_element g1 = *g1original; + g1.offset = _drawScrollTextList[i].bitmap; + g1.width = 64; + g1.height = 40; + g1.offset[0] = 0xFF; + g1.offset[1] = 0xFF; + g1.offset[14] = 0; + g1.offset[15] = 0; + g1.offset[16] = 0; + g1.offset[17] = 0; + gfx_set_g1_element(imageId, &g1); } } } diff --git a/src/openrct2/drawing/string.c b/src/openrct2/drawing/string.c index ce7d0d3ec7..2559506bc1 100644 --- a/src/openrct2/drawing/string.c +++ b/src/openrct2/drawing/string.c @@ -674,11 +674,14 @@ static const utf8 *ttf_process_format_code(rct_drawpixelinfo *dpi, const utf8 *t case FORMAT_INLINE_SPRITE: { uint32 imageId = *((uint32*)(nextCh)); - rct_g1_element *g1Element = &g1Elements[imageId & 0x7FFFF]; - if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { - gfx_draw_sprite(dpi, imageId, info->x, info->y, 0); + const rct_g1_element * g1 = gfx_get_g1_element(imageId & 0x7FFFF); + if (g1 != NULL) + { + if (!(info->flags & TEXT_DRAW_FLAG_NO_DRAW)) { + gfx_draw_sprite(dpi, imageId, info->x, info->y, 0); + } + info->x += g1->width; } - info->x += g1Element->width; nextCh += 4; break; }