| 12180 | } |
| 12181 | |
| 12182 | bool unpack_uastc(const uastc_block& blk, unpacked_uastc_block& unpacked, bool blue_contract_check, bool read_hints) |
| 12183 | { |
| 12184 | //memset(&unpacked, 0, sizeof(unpacked)); |
| 12185 | |
| 12186 | #if 0 |
| 12187 | uint8_t table[128]; |
| 12188 | memset(table, 0xFF, sizeof(table)); |
| 12189 | |
| 12190 | { |
| 12191 | for (uint32_t mode = 0; mode <= TOTAL_UASTC_MODES; mode++) |
| 12192 | { |
| 12193 | const uint32_t code = g_uastc_mode_huff_codes[mode][0]; |
| 12194 | const uint32_t codesize = g_uastc_mode_huff_codes[mode][1]; |
| 12195 | |
| 12196 | table[code] = mode; |
| 12197 | |
| 12198 | uint32_t bits_left = 7 - codesize; |
| 12199 | for (uint32_t i = 0; i < (1 << bits_left); i++) |
| 12200 | table[code | (i << codesize)] = mode; |
| 12201 | } |
| 12202 | |
| 12203 | for (uint32_t i = 0; i < 128; i++) |
| 12204 | printf("%u,", table[i]); |
| 12205 | exit(0); |
| 12206 | } |
| 12207 | #endif |
| 12208 | |
| 12209 | const int mode = g_uastc_huff_modes[blk.m_bytes[0] & 127]; |
| 12210 | if (mode >= (int)TOTAL_UASTC_MODES) |
| 12211 | return false; |
| 12212 | |
| 12213 | unpacked.m_mode = mode; |
| 12214 | |
| 12215 | uint32_t bit_ofs = g_uastc_mode_huff_codes[mode][1]; |
| 12216 | |
| 12217 | if (mode == UASTC_MODE_INDEX_SOLID_COLOR) |
| 12218 | { |
| 12219 | unpacked.m_solid_color.r = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); |
| 12220 | unpacked.m_solid_color.g = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); |
| 12221 | unpacked.m_solid_color.b = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); |
| 12222 | unpacked.m_solid_color.a = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); |
| 12223 | |
| 12224 | if (read_hints) |
| 12225 | { |
| 12226 | unpacked.m_etc1_flip = false; |
| 12227 | unpacked.m_etc1_diff = read_bit(blk.m_bytes, bit_ofs) != 0; |
| 12228 | unpacked.m_etc1_inten0 = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 3); |
| 12229 | unpacked.m_etc1_inten1 = 0; |
| 12230 | unpacked.m_etc1_selector = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 2); |
| 12231 | unpacked.m_etc1_r = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); |
| 12232 | unpacked.m_etc1_g = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); |
| 12233 | unpacked.m_etc1_b = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); |
| 12234 | unpacked.m_etc1_bias = 0; |
| 12235 | unpacked.m_etc2_hints = 0; |
| 12236 | } |
| 12237 | |
| 12238 | return true; |
| 12239 | } |
no test coverage detected