myou-engine/libs/bc7enc/bc7enc.nim

91 lines
3.4 KiB
Nim

{.passC:"-DBC7ENC_USE_MINIZ=0".}
{.compile:"./bc7enc_rdo/bc7decomp.cpp",
compile:"./bc7enc_rdo/bc7decomp_ref.cpp",
compile:"./bc7enc_rdo/bc7enc.cpp",
compile:"./bc7enc_rdo/ert.cpp",
compile:"./bc7enc_rdo/lodepng.cpp",
compile:"./bc7enc_rdo/rdo_bc_encoder.cpp",
compile:"./bc7enc_rdo/rgbcx.cpp",
compile:"./bc7enc_rdo/utils.cpp",
compile:"./bc7enc.cpp".}
## Valid formats: 1 3 4 5 7
## BC1 RGB 4bpp fast, small
## BC3 RGBA 8bpp fast
## BC4 gray 4bpp best for grayscale
## BC5 X+Y 8bpp
## BC7 RGB(A) 8bpp slow, best quality
type EncodeBcInput* {.bycopy.} = object
data*: pointer
len*: int32
width*: int32
height*: int32
format*: int8 ## BCn format to use.
bc1_quality*: int8 ## between 0 and 18
bc7_quality*: int8 ## between 0 and 6
type EncodeBcOutput* {.bycopy.} = object
data*: pointer
len*: int32
row_len*: int32
type EncodeBcError* {.size:4.} = enum
NO_ERROR = 0, ENCODER_INIT_ERROR = 1, ENCODE_ERROR = 2,
INVALID_SIZE_ERROR = 3, UNSUPPORTED_FORMAT_ERROR = 4,
INVALID_INPUT_LENGTH_ERROR = 5, INVALID_OUTPUT_LENGTH_ERROR = 6,
INVALID_SETTINGS = 7,
proc encode_bc*(input: var EncodeBcInput, output: var EncodeBcOutput, verbose: bool): EncodeBcError {.importc, cdecl.}
{.hint[XDeclaredButNotUsed]: off.}
# S3TC (BC1-3)
const GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0'i32
const GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1'i32
const GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2'i32
const GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3'i32
# S3TC (BC1-3) sRGB
const GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C'i32
const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D'i32
const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E'i32
const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F'i32
# RGTC (BC4-5)
const GL_COMPRESSED_RED_RGTC1_EXT = 0x8DBB'i32
const GL_COMPRESSED_SIGNED_RED_RGTC1_EXT = 0x8DBC'i32
const GL_COMPRESSED_RED_GREEN_RGTC2_EXT = 0x8DBD'i32
const GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT = 0x8DBE'i32
# BPTC float (BC6H)
const GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB = 0x8E8E'i32
const GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB = 0x8E8F'i32
# BPTC (BC7)
const GL_COMPRESSED_RGBA_BPTC_UNORM_ARB = 0x8E8C'i32
# BPTC (BC7) sRGB
const GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB = 0x8E8D'i32
func get_bc_bpp_internal_format*(bc_format: int8, is_sRGB: bool): (int8, int32) =
let (bpp, internal_format) = if is_sRGB:
case bc_format:
of 1: (4, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT)
of 2: (8, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT)
of 3: (8, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT)
of 4: (4, GL_COMPRESSED_RED_RGTC1_EXT) # sRGB is ignored
of 5: (8, GL_COMPRESSED_RED_GREEN_RGTC2_EXT) # sRGB is ignored
of 6: (8, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB) # sRGB is ignored
of 7: (8, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB)
else: (0, 0'i32)
else:
case bc_format:
of 1: (4, GL_COMPRESSED_RGB_S3TC_DXT1_EXT)
of 2: (8, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)
of 3: (8, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
of 4: (4, GL_COMPRESSED_RED_RGTC1_EXT)
of 5: (8, GL_COMPRESSED_RED_GREEN_RGTC2_EXT)
of 6: (8, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB)
of 7: (8, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB)
else: (0, 0'i32)
assert bpp != 0, "Invalid bc_format " & $bc_format
return (bpp.int8, internal_format)