libktx_rs/
enums.rs

1// Copyright (C) 2021 Paolo Jovon <paolo.jovon@gmail.com>
2// SPDX-License-Identifier: Apache-2.0
3
4//! Wrappers for the underlying C library's enum types.
5
6use crate::sys;
7use bitflags::bitflags;
8use std::{
9    convert::TryFrom,
10    error::Error,
11    ffi::CStr,
12    fmt::{Display, Formatter},
13};
14
15/// Error codes as returned from the underlying C library.
16///
17/// See [`sys::ktx_error_code_e`].
18#[derive(Debug, Copy, Clone, Eq, PartialEq)]
19#[repr(u32)]
20pub enum KtxError {
21    FileDataError = sys::ktx_error_code_e_KTX_FILE_DATA_ERROR,
22    FileIsPipe = sys::ktx_error_code_e_KTX_FILE_ISPIPE,
23    FileOpenFailed = sys::ktx_error_code_e_KTX_FILE_OPEN_FAILED,
24    FileOverflow = sys::ktx_error_code_e_KTX_FILE_OVERFLOW,
25    FileReadError = sys::ktx_error_code_e_KTX_FILE_READ_ERROR,
26    FileSeekError = sys::ktx_error_code_e_KTX_FILE_SEEK_ERROR,
27    FileUnexpectedEof = sys::ktx_error_code_e_KTX_FILE_UNEXPECTED_EOF,
28    FileWriteError = sys::ktx_error_code_e_KTX_FILE_WRITE_ERROR,
29    GlError = sys::ktx_error_code_e_KTX_GL_ERROR,
30    InvalidOperation = sys::ktx_error_code_e_KTX_INVALID_OPERATION,
31    InvalidValue = sys::ktx_error_code_e_KTX_INVALID_VALUE,
32    NotFound = sys::ktx_error_code_e_KTX_NOT_FOUND,
33    OutOfMemory = sys::ktx_error_code_e_KTX_OUT_OF_MEMORY,
34    TranscodeFailed = sys::ktx_error_code_e_KTX_TRANSCODE_FAILED,
35    UnknownFileFormat = sys::ktx_error_code_e_KTX_UNKNOWN_FILE_FORMAT,
36    UnsupportedTextureType = sys::ktx_error_code_e_KTX_UNSUPPORTED_TEXTURE_TYPE,
37    UnsupportedFeature = sys::ktx_error_code_e_KTX_UNSUPPORTED_FEATURE,
38    LibraryNotLinked = sys::ktx_error_code_e_KTX_LIBRARY_NOT_LINKED,
39}
40
41impl TryFrom<u32> for KtxError {
42    type Error = &'static str;
43
44    fn try_from(value: u32) -> Result<Self, Self::Error> {
45        // TODO: A bit ugly (but still manageable), convert to a macro?
46        Ok(match value {
47            sys::ktx_error_code_e_KTX_FILE_DATA_ERROR => Self::FileDataError,
48            sys::ktx_error_code_e_KTX_FILE_ISPIPE => Self::FileIsPipe,
49            sys::ktx_error_code_e_KTX_FILE_OPEN_FAILED => Self::FileOpenFailed,
50            sys::ktx_error_code_e_KTX_FILE_OVERFLOW => Self::FileOverflow,
51            sys::ktx_error_code_e_KTX_FILE_READ_ERROR => Self::FileReadError,
52            sys::ktx_error_code_e_KTX_FILE_SEEK_ERROR => Self::FileSeekError,
53            sys::ktx_error_code_e_KTX_FILE_UNEXPECTED_EOF => Self::FileUnexpectedEof,
54            sys::ktx_error_code_e_KTX_FILE_WRITE_ERROR => Self::FileWriteError,
55            sys::ktx_error_code_e_KTX_GL_ERROR => Self::GlError,
56            sys::ktx_error_code_e_KTX_INVALID_OPERATION => Self::InvalidOperation,
57            sys::ktx_error_code_e_KTX_INVALID_VALUE => Self::InvalidValue,
58            sys::ktx_error_code_e_KTX_NOT_FOUND => Self::NotFound,
59            sys::ktx_error_code_e_KTX_OUT_OF_MEMORY => Self::OutOfMemory,
60            sys::ktx_error_code_e_KTX_TRANSCODE_FAILED => Self::TranscodeFailed,
61            sys::ktx_error_code_e_KTX_UNKNOWN_FILE_FORMAT => Self::UnknownFileFormat,
62            sys::ktx_error_code_e_KTX_UNSUPPORTED_TEXTURE_TYPE => Self::UnsupportedTextureType,
63            sys::ktx_error_code_e_KTX_UNSUPPORTED_FEATURE => Self::UnsupportedFeature,
64            sys::ktx_error_code_e_KTX_LIBRARY_NOT_LINKED => Self::LibraryNotLinked,
65            _ => return Err("Not a KTX_ error variant"),
66        })
67    }
68}
69
70impl Display for KtxError {
71    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
72        // SAFETY: Safe - this just accessess a C array of strings under the hood
73        let c_str = unsafe { CStr::from_ptr(sys::ktxErrorString(*self as u32)) };
74        match c_str.to_str() {
75            Ok(msg) => write!(f, "{}", msg),
76            _ => Err(std::fmt::Error),
77        }
78    }
79}
80
81impl Error for KtxError {}
82
83pub(crate) fn ktx_result<T>(errcode: sys::ktx_error_code_e, ok: T) -> Result<T, KtxError> {
84    if errcode == sys::ktx_error_code_e_KTX_SUCCESS {
85        Ok(ok)
86    } else {
87        Err(KtxError::try_from(errcode as u32).unwrap_or(KtxError::InvalidValue))
88    }
89}
90
91/// The supercompression scheme for a [`crate::Texture`].
92///
93/// See [`sys::ktxSupercmpScheme`].
94#[derive(Debug, Copy, Clone, Eq, PartialEq)]
95pub enum SuperCompressionScheme {
96    None,
97    BasisLZ,
98    ZStd,
99    Vendor(u32),
100}
101
102impl Default for SuperCompressionScheme {
103    fn default() -> Self {
104        SuperCompressionScheme::None
105    }
106}
107
108impl From<SuperCompressionScheme> for u32 {
109    fn from(scheme: SuperCompressionScheme) -> Self {
110        match scheme {
111            SuperCompressionScheme::None => sys::ktxSupercmpScheme_KTX_SS_NONE,
112            SuperCompressionScheme::BasisLZ => sys::ktxSupercmpScheme_KTX_SUPERCOMPRESSION_BASIS,
113            SuperCompressionScheme::ZStd => sys::ktxSupercmpScheme_KTX_SUPERCOMPRESSION_ZSTD,
114            SuperCompressionScheme::Vendor(value) => value,
115        }
116    }
117}
118
119impl From<u32> for SuperCompressionScheme {
120    fn from(scheme: u32) -> Self {
121        match scheme {
122            sys::ktxSupercmpScheme_KTX_SS_NONE => SuperCompressionScheme::None,
123            sys::ktxSupercmpScheme_KTX_SUPERCOMPRESSION_BASIS => SuperCompressionScheme::BasisLZ,
124            sys::ktxSupercmpScheme_KTX_SUPERCOMPRESSION_ZSTD => SuperCompressionScheme::ZStd,
125            other => SuperCompressionScheme::Vendor(other),
126        }
127    }
128}
129
130impl Display for SuperCompressionScheme {
131    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
132        // SAFETY: Safe - this is a C switch/case under the hood, with invalid value checking
133        let c_str = unsafe { CStr::from_ptr(sys::ktxSupercompressionSchemeString((*self).into())) };
134        match c_str.to_str() {
135            Ok(msg) => write!(f, "{}", msg),
136            _ => Err(std::fmt::Error),
137        }
138    }
139}
140
141/// [`crate::Texture`] storage creation flags.
142///
143/// See [`sys::ktxTextureCreateStorageEnum`].
144#[derive(Debug, Copy, Clone, Eq, PartialEq)]
145#[repr(u32)]
146pub enum CreateStorage {
147    NoStorage = sys::ktxTextureCreateStorageEnum_KTX_TEXTURE_CREATE_NO_STORAGE,
148    AllocStorage = sys::ktxTextureCreateStorageEnum_KTX_TEXTURE_CREATE_ALLOC_STORAGE,
149}
150
151bitflags! {
152    /// [`crate::Texture`] creation flags.
153    ///
154    /// See [`sys::ktxTextureCreateFlags`].
155    #[derive(Default)]
156    pub struct TextureCreateFlags: u32 {
157        const LOAD_IMAGE_DATA = sys::ktxTextureCreateFlagBits_KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT;
158        const RAW_KVDATA = sys::ktxTextureCreateFlagBits_KTX_TEXTURE_CREATE_RAW_KVDATA_BIT;
159        const SKIP_KVDATA = sys::ktxTextureCreateFlagBits_KTX_TEXTURE_CREATE_SKIP_KVDATA_BIT;
160    }
161}
162
163bitflags! {
164    pub struct PackUastcFlags: u32 {
165        const LEVEL_FASTEST  = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_LEVEL_FASTEST;
166        const LEVEL_FASTER   = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_LEVEL_FASTER;
167        const LEVEL_DEFAULT  = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_LEVEL_DEFAULT;
168        const LEVEL_SLOWER   = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_LEVEL_SLOWER;
169        const LEVEL_VERYSLOW = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_LEVEL_VERYSLOW;
170        const LEVEL_MASK     = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_LEVEL_MASK;
171        const FAVOR_UASTC_ERROR = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_FAVOR_UASTC_ERROR;
172        const FAVOR_BC7_ERROR = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_FAVOR_BC7_ERROR;
173        const ETC1_FASTER_HINTS = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_ETC1_FASTER_HINTS;
174        const ETC1_FASTEST_HINTS = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC_ETC1_FASTEST_HINTS;
175        const _ETC1_DISABLE_FLIP_AND_INDIVIDUAL = sys::ktx_pack_uastc_flag_bits_e_KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL;
176}
177}
178
179/// The destination format for transcoding a [`crate::texture::Ktx2`] via Basis Universal.
180///
181/// See [`sys::ktx_transcode_fmt_e`].
182#[derive(Debug, Copy, Clone, Eq, PartialEq)]
183#[repr(u32)]
184pub enum TranscodeFormat {
185    // ETC
186    Etc1Rgb = sys::ktx_transcode_fmt_e_KTX_TTF_ETC1_RGB,
187    Etc2Rgba = sys::ktx_transcode_fmt_e_KTX_TTF_ETC2_RGBA,
188    // BC
189    Bc1Rgb = sys::ktx_transcode_fmt_e_KTX_TTF_BC1_RGB,
190    Bc3Rgba = sys::ktx_transcode_fmt_e_KTX_TTF_BC3_RGBA,
191    Bc3R = sys::ktx_transcode_fmt_e_KTX_TTF_BC4_R,
192    Bc5Rg = sys::ktx_transcode_fmt_e_KTX_TTF_BC5_RG,
193    Bc7Rgba = sys::ktx_transcode_fmt_e_KTX_TTF_BC7_RGBA,
194    // PVRTC 1
195    Pvrtc14Rgb = sys::ktx_transcode_fmt_e_KTX_TTF_PVRTC1_4_RGB,
196    Pvrtc14Rgba = sys::ktx_transcode_fmt_e_KTX_TTF_PVRTC1_4_RGBA,
197    // ASTC
198    Astc4x4Rgba = sys::ktx_transcode_fmt_e_KTX_TTF_ASTC_4x4_RGBA,
199    // PVRTC 2
200    Pvrtc24Rgb = sys::ktx_transcode_fmt_e_KTX_TTF_PVRTC2_4_RGB,
201    Pvrtc24Rgba = sys::ktx_transcode_fmt_e_KTX_TTF_PVRTC2_4_RGBA,
202    // EAC
203    Etc2EacR11 = sys::ktx_transcode_fmt_e_KTX_TTF_ETC2_EAC_R11,
204    Etc2EacRg11 = sys::ktx_transcode_fmt_e_KTX_TTF_ETC2_EAC_RG11,
205    // Uncompressed (raw)
206    Rgba32 = sys::ktx_transcode_fmt_e_KTX_TTF_RGBA32,
207    Rgb565 = sys::ktx_transcode_fmt_e_KTX_TTF_RGB565,
208    Bgr565 = sys::ktx_transcode_fmt_e_KTX_TTF_BGR565,
209    Rgba4444 = sys::ktx_transcode_fmt_e_KTX_TTF_RGBA4444,
210    // Automatic selection
211    Etc = sys::ktx_transcode_fmt_e_KTX_TTF_ETC,
212    Bc1or3 = sys::ktx_transcode_fmt_e_KTX_TTF_BC1_OR_3,
213    // Misc.
214    NoSelection = sys::ktx_transcode_fmt_e_KTX_TTF_NOSELECTION,
215}
216
217impl TryFrom<u32> for TranscodeFormat {
218    type Error = &'static str;
219
220    fn try_from(value: u32) -> Result<Self, Self::Error> {
221        // TODO: A bit ugly (but still manageable), convert to a macro?
222        Ok(match value {
223            sys::ktx_transcode_fmt_e_KTX_TTF_ETC1_RGB => Self::Etc1Rgb,
224            sys::ktx_transcode_fmt_e_KTX_TTF_ETC2_RGBA => Self::Etc2Rgba,
225            // BC
226            sys::ktx_transcode_fmt_e_KTX_TTF_BC1_RGB => Self::Bc1Rgb,
227            sys::ktx_transcode_fmt_e_KTX_TTF_BC3_RGBA => Self::Bc3Rgba,
228            sys::ktx_transcode_fmt_e_KTX_TTF_BC4_R => Self::Bc3R,
229            sys::ktx_transcode_fmt_e_KTX_TTF_BC5_RG => Self::Bc5Rg,
230            sys::ktx_transcode_fmt_e_KTX_TTF_BC7_RGBA => Self::Bc7Rgba,
231            // PVRTC 1
232            sys::ktx_transcode_fmt_e_KTX_TTF_PVRTC1_4_RGB => Self::Pvrtc14Rgb,
233            sys::ktx_transcode_fmt_e_KTX_TTF_PVRTC1_4_RGBA => Self::Pvrtc14Rgba,
234            // ASTC
235            sys::ktx_transcode_fmt_e_KTX_TTF_ASTC_4x4_RGBA => Self::Astc4x4Rgba,
236            // PVRTC 2
237            sys::ktx_transcode_fmt_e_KTX_TTF_PVRTC2_4_RGB => Self::Pvrtc24Rgb,
238            sys::ktx_transcode_fmt_e_KTX_TTF_PVRTC2_4_RGBA => Self::Pvrtc24Rgba,
239            // EAC
240            sys::ktx_transcode_fmt_e_KTX_TTF_ETC2_EAC_R11 => Self::Etc2EacR11,
241            sys::ktx_transcode_fmt_e_KTX_TTF_ETC2_EAC_RG11 => Self::Etc2EacRg11,
242            // Uncompressed (raw)
243            sys::ktx_transcode_fmt_e_KTX_TTF_RGBA32 => Self::Rgba32,
244            sys::ktx_transcode_fmt_e_KTX_TTF_RGB565 => Self::Rgb565,
245            sys::ktx_transcode_fmt_e_KTX_TTF_BGR565 => Self::Bgr565,
246            sys::ktx_transcode_fmt_e_KTX_TTF_RGBA4444 => Self::Rgba4444,
247            // Automatic selection
248            sys::ktx_transcode_fmt_e_KTX_TTF_ETC => Self::Etc,
249            sys::ktx_transcode_fmt_e_KTX_TTF_BC1_OR_3 => Self::Bc1or3,
250            // Misc.
251            sys::ktx_transcode_fmt_e_KTX_TTF_NOSELECTION => Self::NoSelection,
252            _ => return Err("Not a KTX_ error variant"),
253        })
254    }
255}
256
257/// Quality level for ASTC compression.
258///
259/// This only applies to Arm's ASTC encoder, which is in `libktx-rs-sys/build/KTX-Software/lib/astc-encoder`.
260#[derive(Debug, Copy, Clone, Eq, PartialEq)]
261#[repr(u32)]
262pub enum PackAstcQualityLevel {
263    Fastest = sys::ktx_pack_astc_quality_levels_e_KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST,
264    Fast = sys::ktx_pack_astc_quality_levels_e_KTX_PACK_ASTC_QUALITY_LEVEL_FAST,
265    Medium = sys::ktx_pack_astc_quality_levels_e_KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM,
266    Thorough = sys::ktx_pack_astc_quality_levels_e_KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH,
267    Exhaustive = sys::ktx_pack_astc_quality_levels_e_KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE,
268}
269
270/// Block dimensions for ASTC compression.
271///
272/// This only applies to Arm's ASTC encoder, which is in `libktx-rs-sys/build/KTX-Software/lib/astc-encoder`.
273#[derive(Debug, Copy, Clone, Eq, PartialEq)]
274#[repr(u32)]
275pub enum PackAstcBlockDimension {
276    /// 2D, 8.0 bpp
277    Dim4x4 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_4x4,
278    /// 2D, 6.40 bpp
279    Dim5x4 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x4,
280    /// 2D, 5.12 bpp
281    Dim5x5 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x5,
282    /// 2D, 4.27 bpp
283    Dim6x5 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x5,
284    /// 2D, 3.56 bpp
285    Dim6x6 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x6,
286    /// 2D, 3.20 bpp
287    Dim8x5 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_8x5,
288    /// 2D, 2.67 bpp
289    Dim8x6 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_8x6,
290    /// 2D, 2.56 bpp
291    Dim10x5 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_10x5,
292    /// 2D, 2.13 bpp
293    Dim10x6 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_10x6,
294    /// 2D, 2.00 bpp
295    Dim8x8 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_8x8,
296    /// 2D, 1.60 bpp
297    Dim10x8 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_10x8,
298    /// 2D, 1.28 bpp
299    Dim10x10 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_10x10,
300    /// 2D, 1.07 bpp
301    Dim12x10 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_12x10,
302    /// 2D, 0.89 bpp
303    Dim12x12 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_12x12,
304
305    /// 3D, 4.74 bpp
306    Dim3x3x3 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_3x3x3,
307    /// 3D, 3.56 bpp
308    Dim4x3x3 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_4x3x3,
309    /// 3D, 2.67 bpp
310    Dim4x4x3 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_4x4x3,
311    /// 3D, 2.00 bpp
312    Dim4x4x4 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_4x4x4,
313    /// 3D, 1.60 bpp
314    Dim5x4x4 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x4x4,
315    /// 3D, 1.28 bpp
316    Dim5x5x4 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x5x4,
317    /// 3D, 1.02 bpp
318    Dim5x5x5 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x5x5,
319    /// 3D, 0.85 bpp
320    Dim6x5x5 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x5x5,
321    /// 3D, 0.71 bpp
322    Dim6x6x5 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x6x5,
323    /// 3D, 0.59 bpp
324    Dim6x6x6 = sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x6x6,
325}
326
327impl TryFrom<u32> for PackAstcBlockDimension {
328    type Error = &'static str;
329
330    fn try_from(value: u32) -> Result<Self, Self::Error> {
331        // TODO: A bit ugly (but still manageable), convert to a macro?
332        Ok(match value {
333            // 2D
334            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_4x4 => Self::Dim4x4,
335            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x4 => Self::Dim5x4,
336            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x5 => Self::Dim5x5,
337            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x5 => Self::Dim6x5,
338            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x6 => Self::Dim6x6,
339            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_8x5 => Self::Dim8x5,
340            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_8x6 => Self::Dim8x6,
341            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_10x5 => {
342                Self::Dim10x5
343            }
344            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_10x6 => {
345                Self::Dim10x6
346            }
347            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_8x8 => Self::Dim8x8,
348            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_10x8 => {
349                Self::Dim10x8
350            }
351            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_10x10 => {
352                Self::Dim10x10
353            }
354            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_12x10 => {
355                Self::Dim12x10
356            }
357            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_12x12 => {
358                Self::Dim12x12
359            }
360
361            // 3D
362            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_3x3x3 => {
363                Self::Dim3x3x3
364            }
365            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_4x3x3 => {
366                Self::Dim4x3x3
367            }
368            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_4x4x3 => {
369                Self::Dim4x4x3
370            }
371            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_4x4x4 => {
372                Self::Dim4x4x4
373            }
374            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x4x4 => {
375                Self::Dim5x4x4
376            }
377            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x5x4 => {
378                Self::Dim5x5x4
379            }
380            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_5x5x5 => {
381                Self::Dim5x5x5
382            }
383            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x5x5 => {
384                Self::Dim6x5x5
385            }
386            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x6x5 => {
387                Self::Dim6x6x5
388            }
389            sys::ktx_pack_astc_block_dimension_e_KTX_PACK_ASTC_BLOCK_DIMENSION_6x6x6 => {
390                Self::Dim6x6x6
391            }
392            _ => return Err("Not a ASTC block dimension enumerant"),
393        })
394    }
395}
396
397/// ASTC encoder profile function.
398///
399/// This only applies to Arm's ASTC encoder, which is in `libktx-rs-sys/build/KTX-Software/lib/astc-encoder`.
400#[derive(Debug, Copy, Clone, Eq, PartialEq)]
401#[repr(u32)]
402pub enum PackAstcEncoderFunction {
403    Unknown = sys::ktx_pack_astc_encoder_function_e_KTX_PACK_ASTC_ENCODER_FUNCTION_UNKNOWN,
404    Srgb = sys::ktx_pack_astc_encoder_function_e_KTX_PACK_ASTC_ENCODER_FUNCTION_SRGB,
405    Linear = sys::ktx_pack_astc_encoder_function_e_KTX_PACK_ASTC_ENCODER_FUNCTION_LINEAR,
406}
407
408impl TryFrom<u32> for PackAstcEncoderFunction {
409    type Error = &'static str;
410
411    fn try_from(value: u32) -> Result<Self, Self::Error> {
412        Ok(match value {
413            sys::ktx_pack_astc_encoder_function_e_KTX_PACK_ASTC_ENCODER_FUNCTION_UNKNOWN => {
414                Self::Unknown
415            }
416            sys::ktx_pack_astc_encoder_function_e_KTX_PACK_ASTC_ENCODER_FUNCTION_SRGB => Self::Srgb,
417            sys::ktx_pack_astc_encoder_function_e_KTX_PACK_ASTC_ENCODER_FUNCTION_LINEAR => {
418                Self::Linear
419            }
420            _ => return Err("Not a ASTC encoder function enumerant"),
421        })
422    }
423}
424
425/// ASTC encoder mode.
426///
427/// This only applies to Arm's ASTC encoder, which is in `libktx-rs-sys/build/KTX-Software/lib/astc-encoder`.
428#[derive(Debug, Copy, Clone, Eq, PartialEq)]
429#[repr(u32)]
430pub enum PackAstcEncoderMode {
431    Default = sys::ktx_pack_astc_encoder_mode_e_KTX_PACK_ASTC_ENCODER_MODE_DEFAULT,
432    Ldr = sys::ktx_pack_astc_encoder_mode_e_KTX_PACK_ASTC_ENCODER_MODE_LDR,
433    Hdr = sys::ktx_pack_astc_encoder_mode_e_KTX_PACK_ASTC_ENCODER_MODE_HDR,
434}
435
436impl TryFrom<u32> for PackAstcEncoderMode {
437    type Error = &'static str;
438
439    fn try_from(value: u32) -> Result<Self, Self::Error> {
440        Ok(match value {
441            sys::ktx_pack_astc_encoder_mode_e_KTX_PACK_ASTC_ENCODER_MODE_DEFAULT => Self::Default,
442            sys::ktx_pack_astc_encoder_mode_e_KTX_PACK_ASTC_ENCODER_MODE_LDR => Self::Ldr,
443            sys::ktx_pack_astc_encoder_mode_e_KTX_PACK_ASTC_ENCODER_MODE_HDR => Self::Hdr,
444            _ => return Err("Not a ASTC encoder mode enumerant"),
445        })
446    }
447}
448
449bitflags! {
450    /// Flags applied when transcoding a [`crate::texture::Ktx2`] via Basis Universal.
451    ///
452    /// See [`sys::ktx_transcode_flags`].
453    #[derive(Default)]
454    pub struct TranscodeFlags: u32 {
455        const PVRTC_DECODE_TO_NEXT_POW2 = sys::ktx_transcode_flag_bits_e_KTX_TF_PVRTC_DECODE_TO_NEXT_POW2;
456        const TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS = sys::ktx_transcode_flag_bits_e_KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS;
457        const HIGH_QUALITY = sys::ktx_transcode_flag_bits_e_KTX_TF_HIGH_QUALITY;
458    }
459}