diff --git a/src/drawing/IDrawingEngine.h b/src/drawing/IDrawingEngine.h index 7ccd5d3ef0..39f498de7c 100644 --- a/src/drawing/IDrawingEngine.h +++ b/src/drawing/IDrawingEngine.h @@ -50,6 +50,8 @@ interface IDrawingEngine virtual rct_drawpixelinfo * GetDrawingPixelInfo() abstract; virtual DRAWING_ENGINE_FLAGS GetFlags() abstract; + + virtual void InvalidateImage(uint32 image) abstract; }; namespace DrawingEngineFactory diff --git a/src/drawing/NewDrawing.cpp b/src/drawing/NewDrawing.cpp index afdf52dea7..35b09d2510 100644 --- a/src/drawing/NewDrawing.cpp +++ b/src/drawing/NewDrawing.cpp @@ -90,6 +90,14 @@ extern "C" return result; } + void drawing_engine_invalidate_image(uint32 image) + { + if (_drawingEngine != nullptr) + { + _drawingEngine->InvalidateImage(image); + } + } + void gfx_set_dirty_blocks(sint16 left, sint16 top, sint16 right, sint16 bottom) { if (_drawingEngine != nullptr) diff --git a/src/drawing/NewDrawing.h b/src/drawing/NewDrawing.h index 164dc5dde0..33bd3457f5 100644 --- a/src/drawing/NewDrawing.h +++ b/src/drawing/NewDrawing.h @@ -30,6 +30,7 @@ void drawing_engine_dispose(); rct_drawpixelinfo * drawing_engine_get_dpi(); bool drawing_engine_has_dirty_optimisations(); +void drawing_engine_invalidate_image(uint32 image); #ifdef _cplusplus } diff --git a/src/drawing/engines/OpenGLDrawingEngine.cpp b/src/drawing/engines/OpenGLDrawingEngine.cpp index 0855f7cd38..a4d62546ed 100644 --- a/src/drawing/engines/OpenGLDrawingEngine.cpp +++ b/src/drawing/engines/OpenGLDrawingEngine.cpp @@ -80,6 +80,7 @@ public: void DrawSpriteRawMasked(sint32 x, sint32 y, uint32 maskImage, uint32 colourImage) override; void SetDPI(rct_drawpixelinfo * dpi); + void InvalidateImage(uint32 image); private: GLuint GetOrLoadImageTexture(uint32 image); @@ -217,6 +218,11 @@ public: return DEF_NONE; } + void InvalidateImage(uint32 image) override + { + _drawingContext->InvalidateImage(image); + } + rct_drawpixelinfo * GetDPI() { return &_bitsDPI; @@ -590,6 +596,18 @@ void * OpenGLDrawingContext::GetImageAsARGB(uint32 image, uint32 tertiaryColour, return pixels32; } +void OpenGLDrawingContext::InvalidateImage(uint32 image) +{ + auto kvp = _imageTextureMap.find(image); + if (kvp != _imageTextureMap.end()) + { + GLuint texture = kvp->second; + glDeleteTextures(1, &texture); + + _imageTextureMap.erase(kvp); + } +} + void OpenGLDrawingContext::FreeTextures() { glDeleteTextures(_textures.size(), _textures.data()); diff --git a/src/drawing/engines/SoftwareDrawingEngine.cpp b/src/drawing/engines/SoftwareDrawingEngine.cpp index 9da30a42e6..40d8dc58dd 100644 --- a/src/drawing/engines/SoftwareDrawingEngine.cpp +++ b/src/drawing/engines/SoftwareDrawingEngine.cpp @@ -376,6 +376,11 @@ public: return DEF_DIRTY_OPTIMISATIONS; } + void InvalidateImage(uint32 image) override + { + // Not applicable for this engine + } + rct_drawpixelinfo * GetDPI() { return &_bitsDPI; diff --git a/src/drawing/scrolling_text.c b/src/drawing/scrolling_text.c index 6c5503fc09..fe5b571562 100644 --- a/src/drawing/scrolling_text.c +++ b/src/drawing/scrolling_text.c @@ -56,7 +56,7 @@ void scrolling_text_initialise_bitmaps() for (int i = 0; i < 224; i++) { memset(drawingSurface, 0, sizeof(drawingSurface)); - gfx_draw_sprite(&dpi, i + 0x10D5, -1, 0, 0); + gfx_draw_sprite_software(&dpi, i + 0x10D5, -1, 0, 0); for (int x = 0; x < 8; x++) { uint8 val = 0; @@ -179,7 +179,9 @@ int scrolling_text_setup(rct_string_id stringId, uint16 scroll, uint16 scrolling scrolling_text_set_bitmap_for_sprite(scrollString, scroll, scrollText->bitmap, scrollingModePositions); } - return scrollIndex + 0x606; + uint32 imageId = 0x606 + scrollIndex; + drawing_engine_invalidate_image(imageId); + return imageId; } void scrolling_text_set_bitmap_for_sprite(utf8 *text, int scroll, uint8 *bitmap, sint16 *scrollPositionOffsets)