myou-engine/libs/astc/astc.nim

167 lines
6.9 KiB
Nim

# We need this for the extern "C", not for exposing symbols
{.passC:"-DASTCENC_DYNAMIC_LIBRARY".}
{.compile:"astc-encoder/Source/astcenc_averages_and_directions.cpp",
compile:"astc-encoder/Source/astcenc_block_sizes.cpp",
compile:"astc-encoder/Source/astcenc_color_quantize.cpp",
compile:"astc-encoder/Source/astcenc_color_unquantize.cpp",
compile:"astc-encoder/Source/astcenc_compress_symbolic.cpp",
compile:"astc-encoder/Source/astcenc_compute_variance.cpp",
compile:"astc-encoder/Source/astcenc_decompress_symbolic.cpp",
compile:"astc-encoder/Source/astcenc_diagnostic_trace.cpp",
compile:"astc-encoder/Source/astcenc_entry.cpp",
compile:"astc-encoder/Source/astcenc_find_best_partitioning.cpp",
compile:"astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp",
compile:"astc-encoder/Source/astcenc_image.cpp",
compile:"astc-encoder/Source/astcenc_integer_sequence.cpp",
compile:"astc-encoder/Source/astcenc_mathlib.cpp",
compile:"astc-encoder/Source/astcenc_mathlib_softfloat.cpp",
compile:"astc-encoder/Source/astcenc_partition_tables.cpp",
compile:"astc-encoder/Source/astcenc_percentile_tables.cpp",
compile:"astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp",
compile:"astc-encoder/Source/astcenc_quantization.cpp",
compile:"astc-encoder/Source/astcenc_symbolic_physical.cpp",
compile:"astc-encoder/Source/astcenc_weight_align.cpp",
compile:"astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp".}
type AstcencContext* = object
type AstcencError* {.size:4.} = enum
ASTCENC_SUCCESS = 0, ASTCENC_ERR_OUT_OF_MEM, ASTCENC_ERR_BAD_CPU_FLOAT,
ASTCENC_ERR_BAD_PARAM, ASTCENC_ERR_BAD_BLOCK_SIZE, ASTCENC_ERR_BAD_PROFILE,
ASTCENC_ERR_BAD_QUALITY, ASTCENC_ERR_BAD_SWIZZLE, ASTCENC_ERR_BAD_FLAGS,
ASTCENC_ERR_BAD_CONTEXT, ASTCENC_ERR_NOT_IMPLEMENTED,
ASTCENC_ERR_BAD_DECODE_MODE, ASTCENC_ERR_DTRACE_FAILURE
template astc_assert*(err: AstcencError) =
assert err == ASTCENC_SUCCESS, "ASTC error: " & $err
type AstcencProfile* {.size:4.} = enum
ASTCENC_PRF_LDR_SRGB = 0, ASTCENC_PRF_LDR, ASTCENC_PRF_HDR_RGB_LDR_A,
ASTCENC_PRF_HDR
let ASTCENC_PRE_FASTEST*: float32 = 0.0f
let ASTCENC_PRE_FAST*: float32 = 10.0f
let ASTCENC_PRE_MEDIUM*: float32 = 60.0f
let ASTCENC_PRE_THOROUGH*: float32 = 98.0f
let ASTCENC_PRE_VERYTHOROUGH*: float32 = 99.0f
let ASTCENC_PRE_EXHAUSTIVE*: float32 = 100.0f
type AstcencSwz* {.size:4.} = enum
SWZ_R = 0, SWZ_G = 1, SWZ_B = 2, SWZ_A = 3,
SWZ_0 = 4, SWZ_1 = 5, SWZ_Z = 6
type AstcencSwizzle* {.bycopy.} = object
r*: AstcencSwz
g*: AstcencSwz
b*: AstcencSwz
a*: AstcencSwz
type AstcencType* {.size:4.} = enum
ASTCENC_TYPE_U8 = 0, ASTCENC_TYPE_F16 = 1, ASTCENC_TYPE_F32 = 2
type AstcencProgressCallback* = proc(p: float32) {.cdecl.}
let ASTCENC_FLG_MAP_NORMAL*: uint32 = 1 shl 0
let ASTCENC_FLG_USE_DECODE_UNORM8*: uint32 = 1 shl 1
let ASTCENC_FLG_USE_ALPHA_WEIGHT*: uint32 = 1 shl 2
let ASTCENC_FLG_USE_PERCEPTUAL*: uint32 = 1 shl 3
let ASTCENC_FLG_DECOMPRESS_ONLY*: uint32 = 1 shl 4
let ASTCENC_FLG_SELF_DECOMPRESS_ONLY*: uint32 = 1 shl 5
let ASTCENC_FLG_MAP_RGBM*: uint32 = 1 shl 6
let ASTCENC_ALL_FLAGS*: uint32 = ASTCENC_FLG_MAP_NORMAL or ASTCENC_FLG_MAP_RGBM or
ASTCENC_FLG_USE_ALPHA_WEIGHT or ASTCENC_FLG_USE_PERCEPTUAL or
ASTCENC_FLG_USE_DECODE_UNORM8 or ASTCENC_FLG_DECOMPRESS_ONLY or
ASTCENC_FLG_SELF_DECOMPRESS_ONLY
type AstcencConfig* {.bycopy.} = object
profile*: AstcencProfile
flags*: uint32
block_x*: uint32
block_y*: uint32
block_z*: uint32
cw_r_weight*: float32
cw_g_weight*: float32
cw_b_weight*: float32
cw_a_weight*: float32
a_scale_radius*: uint32
rgbm_m_scale*: float32
tune_partition_count_limit*: uint32
tune_2partition_index_limit*: uint32
tune_3partition_index_limit*: uint32
tune_4partition_index_limit*: uint32
tune_block_mode_limit*: uint32
tune_refinement_limit*: uint32
tune_candidate_limit*: uint32
tune_2partitioning_candidate_limit*: uint32
tune_3partitioning_candidate_limit*: uint32
tune_4partitioning_candidate_limit*: uint32
tune_db_limit*: float32
tune_mse_overshoot*: float32
tune_2partition_early_out_limit_factor*: float32
tune_3partition_early_out_limit_factor*: float32
tune_2plane_early_out_limit_correlation*: float32
tune_search_mode0_enable*: float32
progress_callback*: AstcencProgressCallback
when defined(ASTCENC_DIAGNOSTICS):
trace_file_path*: cstring
type AstcencImage* {.bycopy.} = object
dim_x*: uint32
dim_y*: uint32
dim_z*: uint32
data_type*: AstcencType
data*: ptr pointer
type AstcencBlockInfo* {.bycopy.} = object
profile*: AstcencProfile
block_x*: uint32
block_y*: uint32
block_z*: uint32
texel_count*: uint32
is_error_block*: bool
is_constant_block*: bool
is_hdr_block*: bool
is_dual_plane_block*: bool
partition_count*: uint32
partition_index*: uint32
dual_plane_component*: uint32
color_endpoint_modes*: array[4, uint32]
color_level_count*: uint32
weight_level_count*: uint32
weight_x*: uint32
weight_y*: uint32
weight_z*: uint32
color_endpoints*: array[4, array[2, array[4, float32]]]
weight_values_plane1*: array[216, float32]
weight_values_plane2*: array[216, float32]
partition_assignment*: array[216, uint8]
proc astcenc_config_init*(profile: AstcencProfile; block_x: uint32; block_y: uint32;
block_z: uint32; quality: float32; flags: uint32;
config: ptr AstcencConfig): AstcencError {.cdecl,
importc: "astcenc_config_init".}
proc astcenc_context_alloc*(config: ptr AstcencConfig; thread_count: uint32;
context: var ptr AstcencContext): AstcencError {.cdecl,
importc: "astcenc_context_alloc".}
proc astcenc_compress_image*(context: ptr AstcencContext; image: ptr AstcencImage;
swizzle: ptr AstcencSwizzle; data_out: ptr uint8;
data_len: csize_t; thread_index: uint32): AstcencError {.
cdecl, importc: "astcenc_compress_image".}
proc astcenc_compress_reset*(context: ptr AstcencContext): AstcencError {.cdecl,
importc: "astcenc_compress_reset".}
proc astcenc_decompress_image*(context: ptr AstcencContext; data: ptr uint8;
data_len: csize_t; image_out: ptr AstcencImage;
swizzle: ptr AstcencSwizzle; thread_index: uint32): AstcencError {.
cdecl, importc: "astcenc_decompress_image".}
proc astcenc_decompress_reset*(context: ptr AstcencContext): AstcencError {.cdecl,
importc: "astcenc_decompress_reset".}
proc astcenc_context_free*(context: ptr AstcencContext) {.cdecl,
importc: "astcenc_context_free".}
proc astcenc_get_block_info*(context: ptr AstcencContext; data: array[16, uint8];
info: ptr AstcencBlockInfo): AstcencError {.cdecl,
importc: "astcenc_get_block_info".}
proc astcenc_get_error_string*(status: AstcencError): cstring {.cdecl,
importc: "astcenc_get_error_string".}