Skip to content

Commit f524da5

Browse files
committed
Change reader to return unique_ptr<File>
1 parent 3cadd62 commit f524da5

File tree

6 files changed

+45
-53
lines changed

6 files changed

+45
-53
lines changed

include/rive/file.hpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,12 @@ namespace rive {
5555
///
5656
/// Imports a Rive file from a binary buffer.
5757
/// @param reader a pointer to a binary reader attached to the file.
58-
/// @param importedFile a handle to a file that will contain the
59-
/// imported data.
58+
/// @param result is an optional status result.
6059
/// @param assetResolver is an optional helper to resolve assets which
6160
/// cannot be found in-band.
62-
/// @returns whether the import was successful or an error occurred.
63-
static ImportResult import(BinaryReader& reader,
64-
File** importedFile,
61+
/// @returns a pointer to the file, or null on failure.
62+
static std::unique_ptr<File> import(BinaryReader& reader,
63+
ImportResult* result = nullptr,
6564
FileAssetResolver* assetResolver = nullptr);
6665

6766
/// @returns the file's backboard. All files have exactly one backboard.

skia/viewer/src/main.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,19 @@ void initStateMachine(int index) {
4747
animationIndex = -1;
4848
assert(fileBytes != nullptr);
4949
auto reader = rive::BinaryReader(fileBytes, fileBytesLength);
50-
rive::File* file = nullptr;
51-
auto result = rive::File::import(reader, &file);
52-
if (result != rive::ImportResult::success) {
50+
auto file = rive::File::import(reader);
51+
if (!file) {
5352
delete[] fileBytes;
5453
fprintf(stderr, "failed to import file\n");
5554
return;
5655
}
57-
artboard = file->artboard()->instance();
58-
artboard->advance(0.0f);
59-
6056
delete animationInstance;
6157
delete stateMachineInstance;
58+
currentFile = std::move(file);
59+
60+
artboard = currentFile->artboard()->instance();
61+
artboard->advance(0.0f);
62+
6263
animationInstance = nullptr;
6364
stateMachineInstance = nullptr;
6465

@@ -68,27 +69,26 @@ void initStateMachine(int index) {
6869
if (stateMachine != nullptr) {
6970
stateMachineInstance = new rive::StateMachineInstance(stateMachine);
7071
}
71-
72-
currentFile.reset(file);
7372
}
7473

7574
void initAnimation(int index) {
7675
animationIndex = index;
7776
stateMachineIndex = -1;
7877
assert(fileBytes != nullptr);
7978
auto reader = rive::BinaryReader(fileBytes, fileBytesLength);
80-
rive::File* file = nullptr;
81-
auto result = rive::File::import(reader, &file);
82-
if (result != rive::ImportResult::success) {
79+
auto file = rive::File::import(reader);
80+
if (!file) {
8381
delete[] fileBytes;
8482
fprintf(stderr, "failed to import file\n");
8583
return;
8684
}
87-
artboard = file->artboard()->instance();
88-
artboard->advance(0.0f);
89-
9085
delete animationInstance;
9186
delete stateMachineInstance;
87+
currentFile = std::move(file);
88+
89+
artboard = currentFile->artboard()->instance();
90+
artboard->advance(0.0f);
91+
9292
animationInstance = nullptr;
9393
stateMachineInstance = nullptr;
9494

@@ -97,8 +97,6 @@ void initAnimation(int index) {
9797
if (animation != nullptr) {
9898
animationInstance = new rive::LinearAnimationInstance(animation);
9999
}
100-
101-
currentFile.reset(file);
102100
}
103101

104102
void glfwErrorCallback(int error, const char* description) { puts(description); }

src/file.cpp

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,15 @@ File::File(FileAssetResolver* assetResolver) : m_AssetResolver(assetResolver) {}
111111
File::~File() {}
112112

113113
// Import a Rive file from a file handle
114-
ImportResult
115-
File::import(BinaryReader& reader, File** importedFile, FileAssetResolver* assetResolver) {
114+
std::unique_ptr<File>
115+
File::import(BinaryReader& reader, ImportResult* result, FileAssetResolver* assetResolver) {
116116
RuntimeHeader header;
117117
if (!RuntimeHeader::read(reader, header)) {
118118
fprintf(stderr, "Bad header\n");
119-
return ImportResult::malformed;
119+
if (result) {
120+
*result = ImportResult::malformed;
121+
}
122+
return nullptr;
120123
}
121124
if (header.majorVersion() != majorVersion) {
122125
fprintf(stderr,
@@ -125,16 +128,20 @@ File::import(BinaryReader& reader, File** importedFile, FileAssetResolver* asset
125128
header.minorVersion(),
126129
majorVersion,
127130
minorVersion);
128-
return ImportResult::unsupportedVersion;
131+
if (result) {
132+
*result = ImportResult::unsupportedVersion;
133+
}
134+
return nullptr;
135+
}
136+
auto file = std::unique_ptr<File>(new File(assetResolver));
137+
auto readResult = file->read(reader, header);
138+
if (readResult != ImportResult::success) {
139+
file.reset(nullptr);
129140
}
130-
auto file = new File(assetResolver);
131-
auto result = file->read(reader, header);
132-
if (result != ImportResult::success) {
133-
delete file;
134-
return result;
141+
if (result) {
142+
*result = ImportResult::success;
135143
}
136-
*importedFile = file;
137-
return result;
144+
return file;
138145
}
139146

140147
ImportResult File::read(BinaryReader& reader, const RuntimeHeader& header) {

test/image_asset_test.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,8 @@ TEST_CASE("out of band image assets loads correctly", "[assets]") {
5555
uint8_t* bytes = new uint8_t[length];
5656
REQUIRE(fread(bytes, 1, length, fp) == length);
5757
auto reader = rive::BinaryReader(bytes, length);
58-
rive::File* file = nullptr;
59-
auto result = rive::File::import(reader, &file, &resolver);
58+
auto file = rive::File::import(reader, nullptr, &resolver);
6059

61-
REQUIRE(result == rive::ImportResult::success);
6260
REQUIRE(file != nullptr);
6361
REQUIRE(file->artboard() != nullptr);
6462

@@ -88,6 +86,5 @@ TEST_CASE("out of band image assets loads correctly", "[assets]") {
8886
rive::NoOpRenderer renderer;
8987
file->artboard()->draw(&renderer);
9088

91-
delete file;
9289
delete[] bytes;
9390
}

test/instancing_test.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@ TEST_CASE("cloning an ellipse works", "[instancing]") {
1818
uint8_t* bytes = new uint8_t[length];
1919
REQUIRE(fread(bytes, 1, length, fp) == length);
2020
auto reader = rive::BinaryReader(bytes, length);
21-
rive::File* file = nullptr;
22-
auto result = rive::File::import(reader, &file);
21+
auto file = rive::File::import(reader);
2322

24-
REQUIRE(result == rive::ImportResult::success);
2523
REQUIRE(file != nullptr);
2624
REQUIRE(file->artboard() != nullptr);
2725

@@ -33,8 +31,6 @@ TEST_CASE("cloning an ellipse works", "[instancing]") {
3331
REQUIRE(node->y() == clonedNode->y());
3432

3533
delete clonedNode;
36-
37-
delete file;
3834
delete[] bytes;
3935
}
4036

@@ -48,10 +44,8 @@ TEST_CASE("instancing artboard clones clipped properties", "[instancing]") {
4844
uint8_t* bytes = new uint8_t[length];
4945
REQUIRE(fread(bytes, 1, length, fp) == length);
5046
auto reader = rive::BinaryReader(bytes, length);
51-
rive::File* file = nullptr;
52-
auto result = rive::File::import(reader, &file);
47+
auto file = rive::File::import(reader);
5348

54-
REQUIRE(result == rive::ImportResult::success);
5549
REQUIRE(file != nullptr);
5650
REQUIRE(file->artboard() != nullptr);
5751
REQUIRE(!file->artboard()->isInstance());
@@ -74,7 +68,6 @@ TEST_CASE("instancing artboard clones clipped properties", "[instancing]") {
7468
rive::NoOpRenderer renderer;
7569
artboard->draw(&renderer);
7670

77-
delete file;
7871
delete[] bytes;
7972
}
8073

@@ -88,10 +81,8 @@ TEST_CASE("instancing artboard doesn't clone animations", "[instancing]") {
8881
uint8_t* bytes = new uint8_t[length];
8982
REQUIRE(fread(bytes, 1, length, fp) == length);
9083
auto reader = rive::BinaryReader(bytes, length);
91-
rive::File* file = nullptr;
92-
auto result = rive::File::import(reader, &file);
84+
auto file = rive::File::import(reader);
9385

94-
REQUIRE(result == rive::ImportResult::success);
9586
REQUIRE(file != nullptr);
9687
REQUIRE(file->artboard() != nullptr);
9788

@@ -105,7 +96,7 @@ TEST_CASE("instancing artboard doesn't clone animations", "[instancing]") {
10596
REQUIRE(rive::LinearAnimation::deleteCount == 0);
10697

10798
int numberOfAnimations = file->artboard()->animationCount();
108-
delete file;
99+
file.reset(nullptr);
109100
// Now the animations should've been deleted.
110101
REQUIRE(rive::LinearAnimation::deleteCount == numberOfAnimations);
111102

test/rive_file_reader.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "rive_testing.hpp"
77

88
class RiveFileReader {
9-
rive::File* m_File = nullptr;
9+
std::unique_ptr<rive::File> m_File;
1010
uint8_t* m_Bytes = nullptr;
1111
rive::BinaryReader* m_Reader;
1212

@@ -21,19 +21,19 @@ class RiveFileReader {
2121
m_Bytes = new uint8_t[length];
2222
REQUIRE(fread(m_Bytes, 1, length, fp) == length);
2323
m_Reader = new rive::BinaryReader(m_Bytes, length);
24-
auto result = rive::File::import(*m_Reader, &m_File);
24+
rive::ImportResult result;
25+
m_File = rive::File::import(*m_Reader, &result);
2526

2627
REQUIRE(result == rive::ImportResult::success);
2728
REQUIRE(m_File != nullptr);
2829
REQUIRE(m_File->artboard() != nullptr);
2930
}
3031
~RiveFileReader() {
31-
delete m_File;
3232
delete m_Reader;
3333
delete[] m_Bytes;
3434
}
3535

36-
rive::File* file() const { return m_File; }
36+
rive::File* file() const { return m_File.get(); }
3737
};
3838

3939
#endif

0 commit comments

Comments
 (0)