1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-27 00:34:46 +01:00

Refactor memory handling in window sources

This commit is contained in:
Ted John
2018-01-19 00:32:53 +00:00
parent 0b8575270c
commit ba5bc415c7
5 changed files with 56 additions and 75 deletions

View File

@@ -14,6 +14,9 @@
*****************************************************************************/
#pragma endregion
#include <string>
#include <vector>
#include <openrct2/Context.h>
#include <openrct2/object/ObjectManager.h>
#include <openrct2/ride/TrackDesignRepository.h>
@@ -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<uint8> _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<uint8>(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);

View File

@@ -14,8 +14,7 @@
*****************************************************************************/
#pragma endregion
#include <openrct2-ui/windows/Window.h>
#include <vector>
#include <openrct2/audio/audio.h>
#include <openrct2/Context.h>
#include <openrct2/core/Math.hpp>
@@ -30,7 +29,7 @@
#include <openrct2/ride/TrackDesignRepository.h>
#include <openrct2/sprites.h>
#include <openrct2/windows/Intent.h>
#include <vector>
#include <openrct2-ui/windows/Window.h>
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<track_design_file_ref> _trackDesigns;
static utf8 _filterString[USER_STRING_MAX_LENGTH];
static std::vector<uint16> _filteredTrackIds;
static uint16 _loadedTrackDesignIndex;
static rct_track_td6 * _loadedTrackDesign;
static uint8 * _trackDesignPreviewPixels;
static std::vector<uint8> _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<uint8>(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;

View File

@@ -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;
}
}

View File

@@ -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<track_design_file_ref> GetItemsForObjectEntry(uint8 rideType, const std::string &entry) const override
{
std::vector<track_design_file_ref> 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<track_design_file_ref> GetItemsForRideGroup(uint8 rideType, const RideGroup * rideGroup) const override
{
std::vector<track_design_file_ref> 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));
}
}

View File

@@ -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<track_design_file_ref> GetItemsForObjectEntry(uint8 rideType,
const std::string &entry) const abstract;
virtual std::vector<track_design_file_ref> 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);