diff --git a/src/gfx.cpp b/src/gfx.cpp index f323c30fa7..ab798a2013 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1212,7 +1212,7 @@ static void GfxBlitter(const GfxBlitterCtx &ctx, const Sprite *sprite, int x, in if (topleft <= clicked && clicked <= bottomright) { uint offset = (((size_t)clicked - (size_t)topleft) / (blitter->GetScreenDepth() / 8)) % bp.pitch; if (offset < (uint)bp.width) { - include(_newgrf_debug_sprite_picker.sprites, sprite_id); + _newgrf_debug_sprite_picker.FoundSpriteDuringDrawing(sprite_id); } } } diff --git a/src/newgrf_debug.h b/src/newgrf_debug.h index 2403cb8c11..b36ceb4c83 100644 --- a/src/newgrf_debug.h +++ b/src/newgrf_debug.h @@ -24,9 +24,15 @@ enum NewGrfDebugSpritePickerMode { /** Spritepicker of SpriteAligner */ struct NewGrfDebugSpritePicker { - NewGrfDebugSpritePickerMode mode; ///< Current state - void *clicked_pixel; ///< Clicked pixel (pointer to blitter buffer) - std::vector sprites; ///< Sprites found + NewGrfDebugSpritePickerMode mode = SPM_NONE; ///< Current state + void *clicked_pixel = nullptr; ///< Clicked pixel (pointer to blitter buffer) + std::vector sprites; ///< Sprites found + + void DrawingComplete(); + void FoundSpriteDuringDrawing(SpriteID sprite); + +private: + std::vector draw_found_sprites; ///< Sprites found (used from threaded drawing jobs, mutex must be held for all accesses) }; extern NewGrfDebugSpritePicker _newgrf_debug_sprite_picker; diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 41d522dbec..98d190cc64 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -11,6 +11,7 @@ #include #include #include "core/backup_type.hpp" +#include "core/container_func.hpp" #include "window_gui.h" #include "window_func.h" #include "random_access_file_type.h" @@ -51,11 +52,27 @@ #include "table/strings.h" #include +#include #include "safeguards.h" /** The sprite picker. */ -NewGrfDebugSpritePicker _newgrf_debug_sprite_picker = { SPM_NONE, nullptr, std::vector() }; +NewGrfDebugSpritePicker _newgrf_debug_sprite_picker; + +static std::mutex _newgrf_debug_sprite_picker_draw_mutex; + +void NewGrfDebugSpritePicker::DrawingComplete() +{ + std::lock_guard lock(_newgrf_debug_sprite_picker_draw_mutex); + this->sprites.swap(this->draw_found_sprites); + this->draw_found_sprites.clear(); +} + +void NewGrfDebugSpritePicker::FoundSpriteDuringDrawing(SpriteID sprite) +{ + std::lock_guard lock(_newgrf_debug_sprite_picker_draw_mutex); + include(this->draw_found_sprites, sprite); +} /** * Get the feature index related to the window number. diff --git a/src/window.cpp b/src/window.cpp index 7ae1f08db2..5ee48fbd14 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -3082,6 +3082,7 @@ void HandleMouseEvents() /* We are done with the last draw-frame, so we know what sprites we * clicked on. Reset the picker mode and invalidate the window. */ _newgrf_debug_sprite_picker.mode = SPM_NONE; + _newgrf_debug_sprite_picker.DrawingComplete(); InvalidateWindowData(WC_SPRITE_ALIGNER, 0, 1); }