Skip to content

Commit 6206f0d

Browse files
committed
vtfpp: start using LERep where applicable
milestone: entire vtfpp test suite passes!
1 parent 7ab8776 commit 6206f0d

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

include/vtfpp/VTF.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <variant>
1010
#include <vector>
1111

12+
#include <sourcepp/Bits.h>
1213
#include <sourcepp/parser/Binary.h>
1314
#include <sourcepp/Macros.h>
1415

@@ -76,7 +77,7 @@ struct Resource {
7677
std::tuple<uint8_t, uint8_t, uint8_t, uint8_t>, // LOD
7778
std::string, // KVD
7879
HOT, // Hotspot data
79-
std::span<uint32_t> // AXC
80+
std::span<sourcepp::bits::ui32le> // AXC
8081
>;
8182
[[nodiscard]] ConvertedData convertData() const;
8283

@@ -105,19 +106,19 @@ struct Resource {
105106
}
106107

107108
[[nodiscard]] int16_t getDataAsAuxCompressionLevel() const {
108-
return static_cast<int16_t>(std::get<std::span<uint32_t>>(this->convertData())[1] & 0xffff);
109+
return static_cast<int16_t>(std::get<std::span<sourcepp::bits::ui32le>>(this->convertData())[1].operator uint32_t() & 0xffff);
109110
}
110111

111112
[[nodiscard]] CompressionMethod getDataAsAuxCompressionMethod() const {
112-
auto method = static_cast<int16_t>((std::get<std::span<uint32_t>>(this->convertData())[1] & 0xffff0000) >> 16);
113+
auto method = static_cast<int16_t>((std::get<std::span<sourcepp::bits::ui32le>>(this->convertData())[1].operator uint32_t() & 0xffff0000) >> 16);
113114
if (method <= 0) {
114115
return CompressionMethod::DEFLATE;
115116
}
116117
return static_cast<CompressionMethod>(method);
117118
}
118119

119120
[[nodiscard]] uint32_t getDataAsAuxCompressionLength(uint8_t mip, uint8_t mipCount, uint16_t frame, uint16_t frameCount, uint16_t face, uint16_t faceCount) const {
120-
return std::get<std::span<uint32_t>>(this->convertData())[((mipCount - 1 - mip) * frameCount * faceCount + frame * faceCount + face) + 2];
121+
return std::get<std::span<sourcepp::bits::ui32le>>(this->convertData())[((mipCount - 1 - mip) * frameCount * faceCount + frame * faceCount + face) + 2];
121122
}
122123
};
123124
SOURCEPP_BITFLAGS_ENUM(Resource::Flags)

src/vtfpp/VTF.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
#include <miniz.h>
1919
#include <zstd.h>
2020

21+
#include <sourcepp/Bits.h>
2122
#include <sourcepp/compression/LZMA.h>
2223
#include <vtfpp/ImageConversion.h>
2324

2425
using namespace sourcepp;
26+
using namespace sourcepp::bits;
2527
using namespace vtfpp;
2628

2729
namespace {
@@ -180,13 +182,13 @@ Resource::ConvertedData Resource::convertData() const {
180182
if (this->data.size() <= sizeof(uint32_t)) {
181183
return {};
182184
}
183-
return SHT{{reinterpret_cast<const std::byte*>(this->data.data()) + sizeof(uint32_t), *reinterpret_cast<const uint32_t*>(this->data.data())}};
185+
return SHT{{reinterpret_cast<const std::byte*>(this->data.data()) + sizeof(uint32_t), reinterpret_le<uint32_t>(this->data.data())}};
184186
case TYPE_CRC:
185187
case TYPE_EXTENDED_FLAGS:
186188
if (this->data.size() != sizeof(uint32_t)) {
187189
return {};
188190
}
189-
return *reinterpret_cast<const uint32_t*>(this->data.data());
191+
return reinterpret_le<uint32_t>(this->data.data());
190192
case TYPE_LOD_CONTROL_INFO:
191193
if (this->data.size() != sizeof(uint32_t)) {
192194
return {};
@@ -200,17 +202,17 @@ Resource::ConvertedData Resource::convertData() const {
200202
if (this->data.size() <= sizeof(uint32_t)) {
201203
return "";
202204
}
203-
return std::string(reinterpret_cast<const char*>(this->data.data()) + sizeof(uint32_t), *reinterpret_cast<const uint32_t*>(this->data.data()));
205+
return std::string(reinterpret_cast<const char*>(this->data.data()) + sizeof(uint32_t), reinterpret_le<uint32_t>(this->data.data()));
204206
case TYPE_HOTSPOT_DATA:
205207
if (this->data.size() <= sizeof(uint32_t)) {
206208
return {};
207209
}
208-
return HOT{{reinterpret_cast<const std::byte*>(this->data.data()) + sizeof(uint32_t), *reinterpret_cast<const uint32_t*>(this->data.data())}};
210+
return HOT{{reinterpret_cast<const std::byte*>(this->data.data()) + sizeof(uint32_t), reinterpret_le<uint32_t>(this->data.data())}};
209211
case TYPE_AUX_COMPRESSION:
210212
if (this->data.size() <= sizeof(uint32_t) || this->data.size() % sizeof(uint32_t) != 0) {
211213
return {};
212214
}
213-
return std::span{reinterpret_cast<uint32_t*>(this->data.data()), this->data.size() / 4};
215+
return std::span{reinterpret_cast<ui32le*>(this->data.data()), this->data.size() / 4};
214216
default:
215217
break;
216218
}
@@ -303,16 +305,16 @@ VTF::VTF(std::vector<std::byte>&& vtfData, bool parseHeaderOnly)
303305
if (!(lhs.flags & Resource::FLAG_LOCAL_DATA) && (rhs.flags & Resource::FLAG_LOCAL_DATA)) {
304306
return false;
305307
}
306-
return *reinterpret_cast<uint32_t*>(lhs.data.data()) < *reinterpret_cast<uint32_t*>(rhs.data.data());
308+
return reinterpret_le<uint32_t>(lhs.data.data()) < reinterpret_le<uint32_t>(rhs.data.data());
307309
});
308310

309311
// Fix up data spans to point to the actual data
310312
Resource* lastResource = nullptr;
311313
for (auto& resource : this->resources) {
312314
if (!(resource.flags & Resource::FLAG_LOCAL_DATA)) {
313315
if (lastResource) {
314-
const auto lastOffset = *reinterpret_cast<uint32_t*>(lastResource->data.data());
315-
const auto currentOffset = *reinterpret_cast<uint32_t*>(resource.data.data());
316+
const auto lastOffset = reinterpret_le<uint32_t>(lastResource->data.data());
317+
const auto currentOffset = reinterpret_le<uint32_t>(resource.data.data());
316318
const auto curPos = stream.tell();
317319
stream.seek(lastOffset);
318320
lastResource->data = stream.read_span<std::byte>(currentOffset - lastOffset);
@@ -322,7 +324,7 @@ VTF::VTF(std::vector<std::byte>&& vtfData, bool parseHeaderOnly)
322324
}
323325
}
324326
if (lastResource) {
325-
auto offset = *reinterpret_cast<uint32_t*>(lastResource->data.data());
327+
auto offset = reinterpret_le<uint32_t>(lastResource->data.data());
326328
auto curPos = stream.tell();
327329
stream.seek(offset);
328330
lastResource->data = stream.read_span<std::byte>(stream.size() - offset);

0 commit comments

Comments
 (0)