| 190 | } |
| 191 | |
| 192 | bool BasisUEncode(BasisUEncodeSettings* input, uint8_t** out, uint32_t* out_size) |
| 193 | { |
| 194 | InitBasisU(); |
| 195 | |
| 196 | // During refactoring, we'll reuse the old code |
| 197 | TextureImpl impl; |
| 198 | impl.m_CompressionType = CT_BASIS_UASTC; |
| 199 | bool res = CreateBasis(&impl, input->m_Width, input->m_Height, input->m_PixelFormat, input->m_ColorSpace, impl.m_CompressionType, input->m_Data); |
| 200 | if (!res) |
| 201 | { |
| 202 | dmLogError("Failed to encode Basis texture: %s\n", input->m_Path); |
| 203 | return false; |
| 204 | } |
| 205 | |
| 206 | basisu::basis_compressor_params comp_params; |
| 207 | |
| 208 | comp_params.m_mip_gen = 0; |
| 209 | comp_params.m_pack_uastc_flags = input->m_pack_uastc_flags; |
| 210 | comp_params.m_uastc = 1; |
| 211 | comp_params.m_rdo_uastc = input->m_rdo_uastc; |
| 212 | if (comp_params.m_rdo_uastc) |
| 213 | { |
| 214 | comp_params.m_rdo_uastc_quality_scalar = input->m_rdo_uastc_quality_scalar; |
| 215 | comp_params.m_rdo_uastc_dict_size = input->m_rdo_uastc_dict_size; |
| 216 | } |
| 217 | |
| 218 | comp_params.m_source_images.push_back(impl.m_BasisImage); |
| 219 | |
| 220 | dmArray<uint8_t> arr; |
| 221 | res = BasisUEncodeInternal(input->m_NumThreads, comp_params, input->m_OutPixelFormat, arr, input->m_Debug); |
| 222 | |
| 223 | // TODO: Avoid extra copies! |
| 224 | uint32_t size = arr.Size(); |
| 225 | uint8_t* compressed = (uint8_t*)malloc(size); |
| 226 | memcpy(compressed, arr.Begin(), size); |
| 227 | |
| 228 | *out = compressed; |
| 229 | *out_size = size; |
| 230 | |
| 231 | DestroyBasis(&impl); |
| 232 | |
| 233 | return true; |
| 234 | } |
| 235 | } |