Change reader to return unique_ptr<File>
diff --git a/include/rive/file.hpp b/include/rive/file.hpp index b11ef0e..29f28e2 100644 --- a/include/rive/file.hpp +++ b/include/rive/file.hpp
@@ -55,13 +55,12 @@ /// /// Imports a Rive file from a binary buffer. /// @param reader a pointer to a binary reader attached to the file. - /// @param importedFile a handle to a file that will contain the - /// imported data. + /// @param result is an optional status result. /// @param assetResolver is an optional helper to resolve assets which /// cannot be found in-band. - /// @returns whether the import was successful or an error occurred. - static ImportResult import(BinaryReader& reader, - File** importedFile, + /// @returns a pointer to the file, or null on failure. + static std::unique_ptr<File> import(BinaryReader& reader, + ImportResult* result = nullptr, FileAssetResolver* assetResolver = nullptr); /// @returns the file's backboard. All files have exactly one backboard.
diff --git a/skia/viewer/src/main.cpp b/skia/viewer/src/main.cpp index 1ff6fbb..4cc2c90 100644 --- a/skia/viewer/src/main.cpp +++ b/skia/viewer/src/main.cpp
@@ -47,18 +47,19 @@ animationIndex = -1; assert(fileBytes != nullptr); auto reader = rive::BinaryReader(fileBytes, fileBytesLength); - rive::File* file = nullptr; - auto result = rive::File::import(reader, &file); - if (result != rive::ImportResult::success) { + auto file = rive::File::import(reader); + if (!file) { delete[] fileBytes; fprintf(stderr, "failed to import file\n"); return; } - artboard = file->artboard()->instance(); - artboard->advance(0.0f); - delete animationInstance; delete stateMachineInstance; + currentFile = std::move(file); + + artboard = currentFile->artboard()->instance(); + artboard->advance(0.0f); + animationInstance = nullptr; stateMachineInstance = nullptr; @@ -68,8 +69,6 @@ if (stateMachine != nullptr) { stateMachineInstance = new rive::StateMachineInstance(stateMachine); } - - currentFile.reset(file); } void initAnimation(int index) { @@ -77,18 +76,19 @@ stateMachineIndex = -1; assert(fileBytes != nullptr); auto reader = rive::BinaryReader(fileBytes, fileBytesLength); - rive::File* file = nullptr; - auto result = rive::File::import(reader, &file); - if (result != rive::ImportResult::success) { + auto file = rive::File::import(reader); + if (!file) { delete[] fileBytes; fprintf(stderr, "failed to import file\n"); return; } - artboard = file->artboard()->instance(); - artboard->advance(0.0f); - delete animationInstance; delete stateMachineInstance; + currentFile = std::move(file); + + artboard = currentFile->artboard()->instance(); + artboard->advance(0.0f); + animationInstance = nullptr; stateMachineInstance = nullptr; @@ -97,8 +97,6 @@ if (animation != nullptr) { animationInstance = new rive::LinearAnimationInstance(animation); } - - currentFile.reset(file); } void glfwErrorCallback(int error, const char* description) { puts(description); }
diff --git a/src/file.cpp b/src/file.cpp index f83d658..eb4577d 100644 --- a/src/file.cpp +++ b/src/file.cpp
@@ -111,12 +111,15 @@ File::~File() {} // Import a Rive file from a file handle -ImportResult -File::import(BinaryReader& reader, File** importedFile, FileAssetResolver* assetResolver) { +std::unique_ptr<File> +File::import(BinaryReader& reader, ImportResult* result, FileAssetResolver* assetResolver) { RuntimeHeader header; if (!RuntimeHeader::read(reader, header)) { fprintf(stderr, "Bad header\n"); - return ImportResult::malformed; + if (result) { + *result = ImportResult::malformed; + } + return nullptr; } if (header.majorVersion() != majorVersion) { fprintf(stderr, @@ -125,16 +128,20 @@ header.minorVersion(), majorVersion, minorVersion); - return ImportResult::unsupportedVersion; + if (result) { + *result = ImportResult::unsupportedVersion; + } + return nullptr; } - auto file = new File(assetResolver); - auto result = file->read(reader, header); - if (result != ImportResult::success) { - delete file; - return result; + auto file = std::unique_ptr<File>(new File(assetResolver)); + auto readResult = file->read(reader, header); + if (readResult != ImportResult::success) { + file.reset(nullptr); } - *importedFile = file; - return result; + if (result) { + *result = ImportResult::success; + } + return file; } ImportResult File::read(BinaryReader& reader, const RuntimeHeader& header) {
diff --git a/test/image_asset_test.cpp b/test/image_asset_test.cpp index 5e8e5c1..04d1276 100644 --- a/test/image_asset_test.cpp +++ b/test/image_asset_test.cpp
@@ -55,10 +55,8 @@ uint8_t* bytes = new uint8_t[length]; REQUIRE(fread(bytes, 1, length, fp) == length); auto reader = rive::BinaryReader(bytes, length); - rive::File* file = nullptr; - auto result = rive::File::import(reader, &file, &resolver); + auto file = rive::File::import(reader, nullptr, &resolver); - REQUIRE(result == rive::ImportResult::success); REQUIRE(file != nullptr); REQUIRE(file->artboard() != nullptr); @@ -88,6 +86,5 @@ rive::NoOpRenderer renderer; file->artboard()->draw(&renderer); - delete file; delete[] bytes; }
diff --git a/test/instancing_test.cpp b/test/instancing_test.cpp index 25493b3..c7a11fd 100644 --- a/test/instancing_test.cpp +++ b/test/instancing_test.cpp
@@ -18,10 +18,8 @@ uint8_t* bytes = new uint8_t[length]; REQUIRE(fread(bytes, 1, length, fp) == length); auto reader = rive::BinaryReader(bytes, length); - rive::File* file = nullptr; - auto result = rive::File::import(reader, &file); + auto file = rive::File::import(reader); - REQUIRE(result == rive::ImportResult::success); REQUIRE(file != nullptr); REQUIRE(file->artboard() != nullptr); @@ -33,8 +31,6 @@ REQUIRE(node->y() == clonedNode->y()); delete clonedNode; - - delete file; delete[] bytes; } @@ -48,10 +44,8 @@ uint8_t* bytes = new uint8_t[length]; REQUIRE(fread(bytes, 1, length, fp) == length); auto reader = rive::BinaryReader(bytes, length); - rive::File* file = nullptr; - auto result = rive::File::import(reader, &file); + auto file = rive::File::import(reader); - REQUIRE(result == rive::ImportResult::success); REQUIRE(file != nullptr); REQUIRE(file->artboard() != nullptr); REQUIRE(!file->artboard()->isInstance()); @@ -74,7 +68,6 @@ rive::NoOpRenderer renderer; artboard->draw(&renderer); - delete file; delete[] bytes; } @@ -88,10 +81,8 @@ uint8_t* bytes = new uint8_t[length]; REQUIRE(fread(bytes, 1, length, fp) == length); auto reader = rive::BinaryReader(bytes, length); - rive::File* file = nullptr; - auto result = rive::File::import(reader, &file); + auto file = rive::File::import(reader); - REQUIRE(result == rive::ImportResult::success); REQUIRE(file != nullptr); REQUIRE(file->artboard() != nullptr); @@ -105,7 +96,7 @@ REQUIRE(rive::LinearAnimation::deleteCount == 0); int numberOfAnimations = file->artboard()->animationCount(); - delete file; + file.reset(nullptr); // Now the animations should've been deleted. REQUIRE(rive::LinearAnimation::deleteCount == numberOfAnimations);
diff --git a/test/rive_file_reader.hpp b/test/rive_file_reader.hpp index b18d062..f62e1e8 100644 --- a/test/rive_file_reader.hpp +++ b/test/rive_file_reader.hpp
@@ -6,7 +6,7 @@ #include "rive_testing.hpp" class RiveFileReader { - rive::File* m_File = nullptr; + std::unique_ptr<rive::File> m_File; uint8_t* m_Bytes = nullptr; rive::BinaryReader* m_Reader; @@ -21,19 +21,19 @@ m_Bytes = new uint8_t[length]; REQUIRE(fread(m_Bytes, 1, length, fp) == length); m_Reader = new rive::BinaryReader(m_Bytes, length); - auto result = rive::File::import(*m_Reader, &m_File); + rive::ImportResult result; + m_File = rive::File::import(*m_Reader, &result); REQUIRE(result == rive::ImportResult::success); REQUIRE(m_File != nullptr); REQUIRE(m_File->artboard() != nullptr); } ~RiveFileReader() { - delete m_File; delete m_Reader; delete[] m_Bytes; } - rive::File* file() const { return m_File; } + rive::File* file() const { return m_File.get(); } }; #endif