From 04b26631c0116df796def3129b9f1b8abec342ba Mon Sep 17 00:00:00 2001 From: Duncan Date: Sat, 12 Dec 2020 22:18:08 +0000 Subject: [PATCH] Fix #13576: Remove unrequired code and casts from sprite export As not all objects load images in the same order the previous code could end up with sprite index's that were incorrect. There also was no reason to make the code object specific as we can just access the image table directly. --- src/openrct2/CmdlineSprite.cpp | 73 ++++------------------------------ 1 file changed, 7 insertions(+), 66 deletions(-) diff --git a/src/openrct2/CmdlineSprite.cpp b/src/openrct2/CmdlineSprite.cpp index 26ab95d346..791d5ee47a 100644 --- a/src/openrct2/CmdlineSprite.cpp +++ b/src/openrct2/CmdlineSprite.cpp @@ -194,7 +194,7 @@ static void sprite_file_close() SafeFree(spriteFileData); } -static bool sprite_file_export(rct_g1_element* spriteHeader, const char* outPath) +static bool sprite_file_export(const rct_g1_element* spriteHeader, const char* outPath) { rct_drawpixelinfo dpi; uint8_t* pixels; @@ -471,7 +471,7 @@ int32_t cmdline_for_sprite(const char** argv, int32_t argc) ObjectType objectType = entry->GetType(); auto& objManager = context->GetObjectManager(); - auto metaObject = objManager.GetLoadedObject(objectType, entryIndex); + const auto* const metaObject = objManager.GetLoadedObject(objectType, entryIndex); char outputPath[MAX_PATH]; safe_strcpy(outputPath, argv[2], MAX_PATH); @@ -483,58 +483,7 @@ int32_t cmdline_for_sprite(const char** argv, int32_t argc) return -1; } - int32_t maxIndex = static_cast(metaObject->GetNumImages()); - int32_t imagesOffset = 0; - switch (objectType) - { - case ObjectType::Ride: - { - auto rideEntry = get_ride_entry(entryIndex); - imagesOffset = rideEntry->images_offset; - break; - } - case ObjectType::SmallScenery: - case ObjectType::LargeScenery: - case ObjectType::Walls: - case ObjectType::Banners: - case ObjectType::PathBits: - { - auto obj = objManager.GetLoadedObject(objectType, entryIndex); - if (obj != nullptr) - { - auto sceneryEntry = static_cast(obj->GetLegacyData()); - imagesOffset = sceneryEntry->image; - } - break; - } - case ObjectType::Paths: - { - auto pathEntry = get_path_surface_entry(entryIndex); - imagesOffset = pathEntry->image; - break; - } - case ObjectType::SceneryGroup: - { - auto sceneryGroupEntry = get_scenery_group_entry(entryIndex); - imagesOffset = sceneryGroupEntry->image; - break; - } - case ObjectType::ParkEntrance: - { - auto obj = objManager.GetLoadedObject(objectType, entryIndex); - if (obj != nullptr) - { - auto entranceEnty = static_cast(obj->GetLegacyData()); - imagesOffset = entranceEnty->image_id; - } - break; - } - default: - { - fprintf(stderr, "Cannot extract images from this type of object.\n"); - return -1; - } - } + auto maxIndex = metaObject->GetNumImages(); int32_t numDigits = std::max(1, static_cast(std::floor(std::log(maxIndex)))); size_t pathLen = strlen(outputPath); @@ -551,23 +500,17 @@ int32_t cmdline_for_sprite(const char** argv, int32_t argc) } safe_strcpy(outputPath + pathLen + numDigits, ".png", MAX_PATH - pathLen - numDigits); - for (int32_t spriteIndex = 0; spriteIndex < maxIndex; spriteIndex++) + for (uint32_t spriteIndex = 0; spriteIndex < maxIndex; spriteIndex++) { - const rct_g1_element* g1 = gfx_get_g1_element(spriteIndex + imagesOffset); - if (g1 == nullptr) - { - fprintf(stderr, "Could not load image metadata\n"); - return -1; - } - - if (!sprite_file_export(const_cast(g1), outputPath)) + const rct_g1_element g1 = metaObject->GetImageTable().GetImages()[spriteIndex]; + if (!sprite_file_export(&g1, outputPath)) { fprintf(stderr, "Could not export\n"); sprite_file_close(); return -1; } - fprintf(stdout, "{ \"path\": \"%s\", \"x\": %d, \"y\": %d },\n", outputPath, g1->x_offset, g1->y_offset); + fprintf(stdout, "{ \"path\": \"%s\", \"x\": %d, \"y\": %d },\n", outputPath, g1.x_offset, g1.y_offset); // Add to the index at the end of the file name char* counter = outputPath + pathLen + numDigits - 1; @@ -579,8 +522,6 @@ int32_t cmdline_for_sprite(const char** argv, int32_t argc) (*counter)++; } } - - metaObject->Unload(); return 1; } else if (_strcmpi(argv[0], "create") == 0)