From ba5bc415c7ff4745561a3b1b975f930425e761c4 Mon Sep 17 00:00:00 2001 From: Ted John Date: Fri, 19 Jan 2018 00:32:53 +0000 Subject: [PATCH] Refactor memory handling in window sources --- src/openrct2-ui/windows/InstallTrack.cpp | 37 +++++++++------- src/openrct2-ui/windows/TrackList.cpp | 49 +++++++++++---------- src/openrct2/ride/TrackDesign.cpp | 2 +- src/openrct2/ride/TrackDesignRepository.cpp | 29 +++--------- src/openrct2/ride/TrackDesignRepository.h | 14 +++--- 5 files changed, 56 insertions(+), 75 deletions(-) diff --git a/src/openrct2-ui/windows/InstallTrack.cpp b/src/openrct2-ui/windows/InstallTrack.cpp index bc239d1fcc..0cad3e4dbd 100644 --- a/src/openrct2-ui/windows/InstallTrack.cpp +++ b/src/openrct2-ui/windows/InstallTrack.cpp @@ -14,6 +14,9 @@ *****************************************************************************/ #pragma endregion +#include +#include + #include #include #include @@ -94,10 +97,10 @@ static rct_window_event_list window_install_track_events = { nullptr }; -static rct_track_td6 *_trackDesign; -static utf8 *_trackPath; -static utf8 *_trackName; -static uint8 *_trackDesignPreviewPixels; +static rct_track_td6 * _trackDesign; +static std::string _trackPath; +static std::string _trackName; +static std::vector _trackDesignPreviewPixels; static void window_install_track_update_preview(); static void window_install_track_design(rct_window *w); @@ -142,9 +145,9 @@ rct_window * window_install_track_open(const utf8 *path) w->track_list.track_list_being_updated = false; window_push_others_right(w); - _trackPath = _strdup(path); - _trackName = track_repository_get_name_from_path(path); - _trackDesignPreviewPixels = Memory::AllocateArray(4 * TRACK_PREVIEW_IMAGE_SIZE); + _trackPath = path; + _trackName = GetNameFromTrackPath(path); + _trackDesignPreviewPixels.resize(4 * TRACK_PREVIEW_IMAGE_SIZE); window_install_track_update_preview(); window_invalidate(w); @@ -158,9 +161,10 @@ rct_window * window_install_track_open(const utf8 *path) */ static void window_install_track_close(rct_window *w) { - SafeFree(_trackPath); - SafeFree(_trackName); - SafeFree(_trackDesignPreviewPixels); + _trackPath.clear(); + _trackName.clear(); + _trackDesignPreviewPixels.clear(); + _trackDesignPreviewPixels.shrink_to_fit(); track_design_dispose(_trackDesign); _trackDesign = nullptr; } @@ -229,7 +233,7 @@ static void window_install_track_paint(rct_window *w, rct_drawpixelinfo *dpi) gfx_fill_rect(dpi, x, y, x + 369, y + 216, colour); rct_g1_element g1temp = { nullptr }; - g1temp.offset = _trackDesignPreviewPixels + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); + g1temp.offset = _trackDesignPreviewPixels.data() + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); g1temp.width = 370; g1temp.height = 217; g1temp.flags = G1_FLAG_BMP; @@ -400,15 +404,14 @@ static void window_install_track_text_input(rct_window *w, rct_widgetindex widge return; } - free(_trackName); - _trackName = _strdup(text); + _trackName = text; window_event_mouse_up_call(w, WIDX_INSTALL); } static void window_install_track_update_preview() { - track_design_draw_preview(_trackDesign, _trackDesignPreviewPixels); + track_design_draw_preview(_trackDesign, _trackDesignPreviewPixels.data()); } static void window_install_track_design(rct_window *w) @@ -422,7 +425,7 @@ static void window_install_track_design(rct_window *w) return; } - safe_strcat_path(destPath, _trackName, sizeof(destPath)); + safe_strcat_path(destPath, _trackName.c_str(), sizeof(destPath)); path_append_extension(destPath, ".td6", sizeof(destPath)); if (platform_file_exists(destPath)) { @@ -433,11 +436,11 @@ static void window_install_track_design(rct_window *w) WIDX_INSTALL, STR_SELECT_NEW_NAME_FOR_TRACK_DESIGN, STR_AN_EXISTING_TRACK_DESIGN_ALREADY_HAS_THIS_NAME, - _trackName, + _trackName.c_str(), 255 ); } else { - if (track_repository_install(_trackPath)) { + if (track_repository_install(_trackPath.c_str())) { window_close(w); } else { context_show_error(STR_CANT_SAVE_TRACK_DESIGN, STR_NONE); diff --git a/src/openrct2-ui/windows/TrackList.cpp b/src/openrct2-ui/windows/TrackList.cpp index 68d207e56c..cffd2a6ed3 100644 --- a/src/openrct2-ui/windows/TrackList.cpp +++ b/src/openrct2-ui/windows/TrackList.cpp @@ -14,8 +14,7 @@ *****************************************************************************/ #pragma endregion -#include - +#include #include #include #include @@ -30,7 +29,7 @@ #include #include #include -#include +#include enum { WIDX_BACKGROUND, @@ -108,13 +107,12 @@ static rct_window_event_list window_track_list_events = { ride_list_item _window_track_list_item; -static track_design_file_ref * _trackDesigns = nullptr; -static size_t _trackDesignsCount = 0; +static std::vector _trackDesigns; static utf8 _filterString[USER_STRING_MAX_LENGTH]; static std::vector _filteredTrackIds; static uint16 _loadedTrackDesignIndex; static rct_track_td6 * _loadedTrackDesign; -static uint8 * _trackDesignPreviewPixels; +static std::vector _trackDesignPreviewPixels; static void track_list_load_designs(ride_list_item item); static bool track_list_load_design_for_preview(utf8 *path); @@ -171,7 +169,7 @@ rct_window * window_track_list_open(ride_list_item item) // Start with first track highlighted w->selected_list_item = 0; - if (_trackDesignsCount != 0 && !(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)) { + if (_trackDesigns.size() != 0 && !(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)) { w->selected_list_item = 1; } @@ -179,7 +177,7 @@ rct_window * window_track_list_open(ride_list_item item) window_push_others_right(w); _currentTrackPieceDirection = 2; - _trackDesignPreviewPixels = Memory::AllocateArray(4 * TRACK_PREVIEW_IMAGE_SIZE); + _trackDesignPreviewPixels.resize(4 * TRACK_PREVIEW_IMAGE_SIZE); _loadedTrackDesign = nullptr; _loadedTrackDesignIndex = TRACK_DESIGN_INDEX_UNLOADED; @@ -194,7 +192,7 @@ static void window_track_list_filter_list() // Nothing to filter, so fill the list with all indices if (String::LengthOf(_filterString) == 0) { - for (uint16 i = 0; i < _trackDesignsCount; i++) + for (uint16 i = 0; i < _trackDesigns.size(); i++) _filteredTrackIds.push_back(i); return; @@ -207,7 +205,7 @@ static void window_track_list_filter_list() filterStringLower[i] = (utf8)tolower(filterStringLower[i]); // Fill the set with indices for tracks that match the filter - for (uint16 i = 0; i < _trackDesignsCount; i++) + for (uint16 i = 0; i < _trackDesigns.size(); i++) { utf8 trackNameLower[USER_STRING_MAX_LENGTH]; String::Set(trackNameLower, sizeof(trackNameLower), _trackDesigns[i].name); @@ -230,15 +228,16 @@ static void window_track_list_close(rct_window *w) // Dispose track design and preview track_design_dispose(_loadedTrackDesign); _loadedTrackDesign = nullptr; - SafeFree(_trackDesignPreviewPixels); + _trackDesignPreviewPixels.clear(); + _trackDesignPreviewPixels.shrink_to_fit(); // Dispose track list - for (size_t i = 0; i < _trackDesignsCount; i++) { - free(_trackDesigns[i].name); - free(_trackDesigns[i].path); + for (auto &trackDesign : _trackDesigns) + { + free(trackDesign.name); + free(trackDesign.path); } - SafeFree(_trackDesigns); - _trackDesignsCount = 0; + _trackDesigns.clear(); // If gScreenAge is zero, we're already in the process // of loading the track manager, so we shouldn't try @@ -501,7 +500,7 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) sint32 listItemIndex = w->selected_list_item; if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER) { - if (_trackDesignsCount == 0 || listItemIndex == -1) + if (_trackDesigns.size() == 0 || listItemIndex == -1) return; } else { @@ -538,7 +537,7 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) } rct_g1_element g1temp = { nullptr }; - g1temp.offset = _trackDesignPreviewPixels + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); + g1temp.offset = _trackDesignPreviewPixels.data() + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); g1temp.width = 370; g1temp.height = 217; g1temp.flags = G1_FLAG_BMP; @@ -684,7 +683,7 @@ static void window_track_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 y = 0; size_t listIndex = 0; if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER) { - if (_trackDesignsCount == 0) { + if (_trackDesigns.size() == 0) { // No track designs gfx_draw_string_left(dpi, STR_NO_TRACK_DESIGNS_OF_THIS_TYPE, nullptr, COLOUR_BLACK, x, y - 1); return; @@ -735,6 +734,7 @@ static void window_track_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, static void track_list_load_designs(ride_list_item item) { + auto repo = GetTrackDesignRepository(); if (!RideGroupManager::RideTypeHasRideGroups(item.type)) { char entry[9]; @@ -747,13 +747,14 @@ static void track_list_load_designs(ride_list_item item) entryPtr = entry; } } - _trackDesignsCount = track_repository_get_items_for_ride(&_trackDesigns, item.type, entryPtr); + + _trackDesigns = repo->GetItemsForObjectEntry(item.type, String::ToStd(entryPtr)); } else { - rct_ride_entry *rideEntry = get_ride_entry(item.entry_index); - const RideGroup * rideGroup = RideGroupManager::GetRideGroup(item.type, rideEntry); - _trackDesignsCount = track_repository_get_items_for_ride_group(&_trackDesigns, item.type, rideGroup); + auto rideEntry = get_ride_entry(item.entry_index); + auto rideGroup = RideGroupManager::GetRideGroup(item.type, rideEntry); + _trackDesigns = repo->GetItemsForRideGroup(item.type, rideGroup); } window_track_list_filter_list(); @@ -767,7 +768,7 @@ static bool track_list_load_design_for_preview(utf8 *path) _loadedTrackDesign = track_design_open(path); if (_loadedTrackDesign != nullptr && drawing_engine_get_type() != DRAWING_ENGINE_OPENGL) { - track_design_draw_preview(_loadedTrackDesign, _trackDesignPreviewPixels); + track_design_draw_preview(_loadedTrackDesign, _trackDesignPreviewPixels.data()); return true; } return false; diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 8cc325d94a..24b27c0742 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -114,7 +114,7 @@ rct_track_td6 * track_design_open(const utf8 * path) if (td6 != nullptr) { - td6->name = track_repository_get_name_from_path(path); + td6->name = String::Duplicate(GetNameFromTrackPath(path).c_str()); return td6; } } diff --git a/src/openrct2/ride/TrackDesignRepository.cpp b/src/openrct2/ride/TrackDesignRepository.cpp index 1df5fb3d9e..1b6b1d42d1 100644 --- a/src/openrct2/ride/TrackDesignRepository.cpp +++ b/src/openrct2/ride/TrackDesignRepository.cpp @@ -49,7 +49,7 @@ enum TRACK_REPO_ITEM_FLAGS TRIF_READ_ONLY = (1 << 0), }; -static std::string GetNameFromTrackPath(const std::string &path) +std::string GetNameFromTrackPath(const std::string &path) { std::string name = Path::GetFileNameWithoutExtension(path); //The track name should be the file name until the first instance of a dot @@ -222,7 +222,7 @@ public: * @param entry The entry name to build a track list for. Leave empty to build track list for the non-separated types (e.g. Hyper-Twister, Car Ride) * @return */ - size_t GetItemsForObjectEntry(track_design_file_ref * * outRefs, uint8 rideType, const std::string &entry) const override + std::vector GetItemsForObjectEntry(uint8 rideType, const std::string &entry) const override { std::vector refs; const IObjectRepository * repo = GetObjectRepository(); @@ -252,11 +252,10 @@ public: } } - *outRefs = Collections::ToArray(refs); - return refs.size(); + return refs; } - size_t GetItemsForRideGroup(track_design_file_ref **outRefs, uint8 rideType, const RideGroup * rideGroup) const override + std::vector GetItemsForRideGroup(uint8 rideType, const RideGroup * rideGroup) const override { std::vector refs; const IObjectRepository * repo = GetObjectRepository(); @@ -281,8 +280,7 @@ public: } } - *outRefs = Collections::ToArray(refs); - return refs.size(); + return refs; } void Scan() override @@ -418,18 +416,6 @@ extern "C" repo->Scan(); } - size_t track_repository_get_items_for_ride(track_design_file_ref * * outRefs, uint8 rideType, const utf8 * entry) - { - ITrackDesignRepository * repo = GetTrackDesignRepository(); - return repo->GetItemsForObjectEntry(outRefs, rideType, String::ToStd(entry)); - } - - size_t track_repository_get_items_for_ride_group(track_design_file_ref * * outRefs, uint8 rideType, const RideGroup * rideGroup) - { - ITrackDesignRepository * repo = GetTrackDesignRepository(); - return repo->GetItemsForRideGroup(outRefs, rideType, rideGroup); - } - bool track_repository_delete(const utf8 * path) { ITrackDesignRepository * repo = GetTrackDesignRepository(); @@ -449,9 +435,4 @@ extern "C" std::string newPath = repo->Install(srcPath); return !newPath.empty(); } - - utf8 * track_repository_get_name_from_path(const utf8 * path) - { - return String::Duplicate(GetNameFromTrackPath(path)); - } } diff --git a/src/openrct2/ride/TrackDesignRepository.h b/src/openrct2/ride/TrackDesignRepository.h index 8f81709290..88a109e234 100644 --- a/src/openrct2/ride/TrackDesignRepository.h +++ b/src/openrct2/ride/TrackDesignRepository.h @@ -42,12 +42,10 @@ interface ITrackDesignRepository virtual size_t GetCount() const abstract; virtual size_t GetCountForObjectEntry(uint8 rideType, const std::string &entry) const abstract; virtual size_t GetCountForRideGroup(uint8 rideType, const RideGroup * rideGroup) const abstract; - virtual size_t GetItemsForObjectEntry(track_design_file_ref * * outRefs, - uint8 rideType, - const std::string &entry) const abstract; - virtual size_t GetItemsForRideGroup(track_design_file_ref **outRefs, - uint8 rideType, - const RideGroup * rideGroup) const abstract; + virtual std::vector GetItemsForObjectEntry(uint8 rideType, + const std::string &entry) const abstract; + virtual std::vector GetItemsForRideGroup(uint8 rideType, + const RideGroup * rideGroup) const abstract; virtual void Scan() abstract; virtual bool Delete(const std::string &path) abstract; @@ -57,6 +55,7 @@ interface ITrackDesignRepository ITrackDesignRepository * CreateTrackDesignRepository(OpenRCT2::IPlatformEnvironment * env); ITrackDesignRepository * GetTrackDesignRepository(); +std::string GetNameFromTrackPath(const std::string &path); #endif @@ -65,9 +64,6 @@ extern "C" { #endif void track_repository_scan(); - size_t track_repository_get_items_for_ride(track_design_file_ref * * outRefs, uint8 rideType, const utf8 * entry); - size_t track_repository_get_items_for_ride_group(track_design_file_ref * * outRefs, uint8 rideType, const RideGroup * rideGroup); - utf8 * track_repository_get_name_from_path(const utf8 *path); bool track_repository_delete(const utf8 *path); bool track_repository_rename(const utf8 *path, const utf8 *newName); bool track_repository_install(const utf8 *srcPath);