#ifndef RII_ENCODER_H
#define RII_ENCODER_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
uint32_t rii_compute_image_size(uint32_t format, uint32_t width,
uint32_t height);
uint32_t rii_compute_image_size_mip(uint32_t format, uint32_t width,
uint32_t height, uint32_t number_of_images);
void rii_encode(uint32_t format, void* dst, uint32_t dst_len, const void* src,
uint32_t src_len, uint32_t width, uint32_t height);
void rii_decode(void* dst, uint32_t dst_len, const void* src, uint32_t src_len,
uint32_t width, uint32_t height, uint32_t texformat,
const void* tlut, uint32_t tlut_len, uint32_t tlutformat);
int32_t gctex_get_version_unstable_api(char* buf, uint32_t len);
void rii_encode_cmpr(void* dst, uint32_t dst_len, const void* src,
uint32_t src_len, uint32_t width, uint32_t height);
void rii_encode_i4(void* dst, uint32_t dst_len, const void* src,
uint32_t src_len, uint32_t width, uint32_t height);
void rii_encode_i8(void* dst, uint32_t dst_len, const void* src,
uint32_t src_len, uint32_t width, uint32_t height);
void rii_encode_ia4(void* dst, uint32_t dst_len, const void* src,
uint32_t src_len, uint32_t width, uint32_t height);
void rii_encode_ia8(void* dst, uint32_t dst_len, const void* src,
uint32_t src_len, uint32_t width, uint32_t height);
void rii_encode_rgb565(void* dst, uint32_t dst_len, const void* src,
uint32_t src_len, uint32_t width, uint32_t height);
void rii_encode_rgb5a3(void* dst, uint32_t dst_len, const void* src,
uint32_t src_len, uint32_t width, uint32_t height);
void rii_encode_rgba8(void* dst, uint32_t dst_len, const void* src,
uint32_t src_len, uint32_t width, uint32_t height);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
#include <array>
#include <span>
#include <string>
#include <vector>
namespace gctex {
static inline std::string get_version() {
std::string s;
s.resize(1024);
int32_t len = gctex_get_version_unstable_api(&s[0], s.size());
if (len <= 0 || len > s.size()) {
return "Unable to query";
}
s.resize(len);
return s;
}
static inline uint32_t compute_image_size(uint32_t format, uint32_t width,
uint32_t height) {
return ::rii_compute_image_size(format, width, height);
}
static inline uint32_t compute_image_size_mip(uint32_t format, uint32_t width,
uint32_t height,
uint32_t number_of_images) {
return ::rii_compute_image_size_mip(format, width, height, number_of_images);
}
#ifndef GCTEX_DO_NOT_DEFINE_SPAN_APIS
static inline void encode_into(uint32_t format, std::span<uint8_t> dst,
std::span<const uint8_t> src, uint32_t width,
uint32_t height) {
::rii_encode(format, dst.data(), dst.size(), src.data(), src.size(), width,
height);
}
static inline std::vector<uint8_t> encode(uint32_t format,
std::span<const uint8_t> src,
uint32_t width, uint32_t height) {
std::vector<uint8_t> dst(::rii_compute_image_size(format, width, height));
::rii_encode(format, dst.data(), dst.size(), src.data(), src.size(), width,
height);
return dst;
}
static inline void decode_into(std::span<uint8_t> dst,
std::span<const uint8_t> src, uint32_t width,
uint32_t height, uint32_t texformat,
std::span<const uint8_t> tlut,
uint32_t tlutformat) {
std::array<u8, 1> bruh{};
if (tlut.size() == 0) {
tlut = bruh;
}
::rii_decode(dst.data(), dst.size(), src.data(), src.size(), width, height,
texformat, tlut.data(), tlut.size(), tlutformat);
}
static inline std::vector<uint8_t>
decode(std::span<const uint8_t> src, uint32_t width, uint32_t height,
uint32_t texformat, std::span<const uint8_t> tlut, uint32_t tlutformat) {
std::vector<uint8_t> dst(width * height * 4);
::rii_decode(dst.data(), dst.size(), src.data(), src.size(), width, height,
texformat, tlut.data(), tlut.size(), tlutformat);
return dst;
}
#endif
} #endif
#endif