| 927 | * not happen in release package. |
| 928 | */ |
| 929 | extern "C" KTX_error_code |
| 930 | ktxTexture2_CompressAstcEx(ktxTexture2* This, ktxAstcParams* params) { |
| 931 | assert(This->classId == ktxTexture2_c && "Only support ktx2 ASTC."); |
| 932 | |
| 933 | ktx_error_code_e result; |
| 934 | ktx_pack_astc_encoder_mode_e mode; |
| 935 | |
| 936 | if (!params) |
| 937 | return KTX_INVALID_VALUE; |
| 938 | |
| 939 | if (params->structSize != sizeof(struct ktxAstcParams)) |
| 940 | return KTX_INVALID_VALUE; |
| 941 | |
| 942 | if (This->generateMipmaps) |
| 943 | return KTX_INVALID_OPERATION; |
| 944 | |
| 945 | if (This->supercompressionScheme != KTX_SS_NONE) |
| 946 | return KTX_INVALID_OPERATION; // Can't apply multiple schemes. |
| 947 | |
| 948 | if (This->isCompressed) |
| 949 | return KTX_INVALID_OPERATION; // Only non-block compressed formats |
| 950 | // can be encoded into an ASTC format. |
| 951 | |
| 952 | if (This->_protected->_formatSize.flags & KTX_FORMAT_SIZE_PACKED_BIT) |
| 953 | return KTX_INVALID_OPERATION; |
| 954 | |
| 955 | // Basic descriptor block begins after the total size field. |
| 956 | const uint32_t* BDB = This->pDfd+1; |
| 957 | |
| 958 | uint32_t num_components, component_size; |
| 959 | getDFDComponentInfoUnpacked(This->pDfd, &num_components, &component_size); |
| 960 | ktx_uint32_t transfer = KHR_DFDVAL(BDB, TRANSFER); |
| 961 | bool sRGB = transfer == KHR_DF_TRANSFER_SRGB; |
| 962 | |
| 963 | if (component_size != 1) |
| 964 | return KTX_UNSUPPORTED_FEATURE; // Can only deal with 8-bit components at the moment |
| 965 | if (params->mode == KTX_PACK_ASTC_ENCODER_MODE_DEFAULT) { |
| 966 | if (component_size == 1 || sRGB) |
| 967 | mode = KTX_PACK_ASTC_ENCODER_MODE_LDR; |
| 968 | else |
| 969 | mode = KTX_PACK_ASTC_ENCODER_MODE_HDR; |
| 970 | } else { |
| 971 | mode = static_cast<ktx_pack_astc_encoder_mode_e>(params->mode); |
| 972 | } |
| 973 | |
| 974 | if (mode == KTX_PACK_ASTC_ENCODER_MODE_HDR && sRGB) |
| 975 | return KTX_INVALID_OPERATION; |
| 976 | |
| 977 | if (!(sRGB || transfer == KHR_DF_TRANSFER_LINEAR)) |
| 978 | return KTX_INVALID_OPERATION; |
| 979 | |
| 980 | if (This->pData == NULL) { |
| 981 | result = ktxTexture2_LoadImageData((ktxTexture2*)This, nullptr, 0); |
| 982 | |
| 983 | if (result != KTX_SUCCESS) |
| 984 | return result; |
| 985 | } |
| 986 | |