asset compression
This commit is contained in:
parent
b9b9ecb84c
commit
30a283c1b3
57 changed files with 13237 additions and 8 deletions
|
|
@ -19,6 +19,35 @@ import std;
|
|||
using namespace Crafter;
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
// CPU GDeflate roundtrip sanity test across the size boundaries from the
|
||||
// implementation plan. Returns 0 on pass, 1 on first byte-mismatch.
|
||||
static int RunCompressionRoundtrip() {
|
||||
const std::array<std::size_t, 5> sizes = { 1, 65535, 65536, 65537, 16 * 1024 * 1024 };
|
||||
std::mt19937_64 rng(0xC0FFEEu);
|
||||
for (std::size_t n : sizes) {
|
||||
std::vector<std::byte> input(n);
|
||||
for (std::size_t i = 0; i < n; ++i) {
|
||||
// Mix random bytes with a deterministic pattern so the codec is
|
||||
// exercised on both compressible and noisy regions.
|
||||
input[i] = static_cast<std::byte>((i * 0x9E3779B97F4A7C15ULL ^ rng()) & 0xFF);
|
||||
}
|
||||
std::array<std::span<const std::byte>, 1> streams = { std::span(input) };
|
||||
Compression::CompressedBlob blob = Compression::CompressStreams(streams);
|
||||
std::vector<std::byte> output(n);
|
||||
std::array<std::span<std::byte>, 1> outputs = { std::span(output) };
|
||||
Compression::DecompressCPU(blob, outputs);
|
||||
if (output != input) {
|
||||
std::cerr << "[FAIL] roundtrip size=" << n << "\n";
|
||||
return 1;
|
||||
}
|
||||
std::cout << "[ok] size=" << n
|
||||
<< " compressed=" << blob.bytes.size()
|
||||
<< " ratio=" << (double(blob.bytes.size()) / double(n)) << "\n";
|
||||
}
|
||||
std::cout << "All roundtrips passed.\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
// Parse arguments: crafter-asset <input_file> [output_file] [--format u8|f16]
|
||||
fs::path inputPath;
|
||||
|
|
@ -29,6 +58,9 @@ int main(int argc, char** argv) {
|
|||
std::vector<std::string> positional;
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
std::string arg = argv[i];
|
||||
if (arg == "--test-compression") {
|
||||
return RunCompressionRoundtrip();
|
||||
}
|
||||
if (arg == "--format" || arg == "-f") {
|
||||
if (i + 1 >= argc) {
|
||||
std::cerr << "Error: --format requires a value (u8 or f16)\n";
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue