| 15 | namespace OpenRCT2::CommandLine::Sprite |
| 16 | { |
| 17 | std::optional<SpriteFile> SpriteFile::Open(const utf8* path) |
| 18 | { |
| 19 | try |
| 20 | { |
| 21 | FileStream stream(path, FileMode::open); |
| 22 | |
| 23 | SpriteFile spriteFile; |
| 24 | stream.Read(&spriteFile.Header, sizeof(G1Header)); |
| 25 | |
| 26 | if (spriteFile.Header.numEntries > 0) |
| 27 | { |
| 28 | spriteFile.Entries.reserve(spriteFile.Header.numEntries); |
| 29 | |
| 30 | for (uint32_t i = 0; i < spriteFile.Header.numEntries; ++i) |
| 31 | { |
| 32 | StoredG1Element entry32bit{}; |
| 33 | stream.Read(&entry32bit, sizeof(entry32bit)); |
| 34 | G1Element entry{}; |
| 35 | |
| 36 | entry.offset = reinterpret_cast<uint8_t*>(static_cast<uintptr_t>(entry32bit.offset)); |
| 37 | entry.width = entry32bit.width; |
| 38 | entry.height = entry32bit.height; |
| 39 | entry.xOffset = entry32bit.xOffset; |
| 40 | entry.yOffset = entry32bit.yOffset; |
| 41 | entry.flags = entry32bit.flags; |
| 42 | entry.zoomedOffset = entry32bit.zoomedOffset; |
| 43 | spriteFile.Entries.push_back(std::move(entry)); |
| 44 | } |
| 45 | spriteFile.Data.resize(spriteFile.Header.totalSize); |
| 46 | stream.Read(spriteFile.Data.data(), spriteFile.Header.totalSize); |
| 47 | } |
| 48 | spriteFile.MakeEntriesAbsolute(); |
| 49 | return spriteFile; |
| 50 | } |
| 51 | catch (IOException&) |
| 52 | { |
| 53 | return std::nullopt; |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | void SpriteFile::MakeEntriesAbsolute() |
| 58 | { |
nothing calls this directly
no test coverage detected