aboutsummaryrefslogtreecommitdiff
path: root/src/common/zbic_compression.cpp
blob: 5e0e4d947b933728bd7e29c50562467010f624c4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later

#include <cstring>

#include "common/zbic_compression.h"

#define ZSTD_ZBIC_SUPPORT 1
#define ZSTDLIB_VISIBLE static
#define ZSTDLIB_HIDDEN static
#define ZSTDERRORLIB_VISIBLE static
#define ZSTDERRORLIB_HIDDEN static
#undef ZSTD_MULTITHREAD

#if defined(__ANDROID__)
#undef _GNU_SOURCE
#endif

#include "zstd.h"
#define g_ZSTD_threading_useless_symbol g_ZSTD_zbic_threading_useless_symbol
#include "zstd.c"
#undef g_ZSTD_threading_useless_symbol

namespace Common::Compression {

bool IsZBIC(std::span<const u8> src) {
    if (src.size() < sizeof(u32)) {
        return false;
    }
    u32 magic = 0;
    std::memcpy(&magic, src.data(), sizeof(u32));
    return magic == ZSTD_MAGICNUMBER; // 0x4349425A ("ZBIC")
}

int DecompressDataZBIC(std::span<u8> dst, std::span<const u8> src) {
    if (dst.empty() || src.empty()) {
        return -1;
    }
    const size_t res = ZSTD_decompress(dst.data(), dst.size(), src.data(), src.size());
    if (ZSTD_isError(res)) {
        return -1;
    }
    return static_cast<int>(res);
}

} // namespace Common::Compression