This method will change the number and ordering of the selector codebook clusters.
| 672 | |
| 673 | // This method will change the number and ordering of the selector codebook clusters. |
| 674 | void basisu_frontend::optimize_selector_codebook() |
| 675 | { |
| 676 | debug_printf("optimize_selector_codebook\n"); |
| 677 | |
| 678 | const uint32_t orig_total_selector_clusters = (uint32_t)m_optimized_cluster_selectors.size(); |
| 679 | |
| 680 | bool_vec selector_cluster_was_used(m_optimized_cluster_selectors.size()); |
| 681 | for (uint32_t i = 0; i < m_total_blocks; i++) |
| 682 | selector_cluster_was_used[m_block_selector_cluster_index[i]] = true; |
| 683 | |
| 684 | int_vec old_to_new(m_optimized_cluster_selectors.size()); |
| 685 | int_vec new_to_old; |
| 686 | uint32_t total_new_entries = 0; |
| 687 | |
| 688 | std::unordered_map<uint32_t, uint32_t> selector_hashmap; |
| 689 | |
| 690 | for (int i = 0; i < static_cast<int>(m_optimized_cluster_selectors.size()); i++) |
| 691 | { |
| 692 | if (!selector_cluster_was_used[i]) |
| 693 | { |
| 694 | old_to_new[i] = -1; |
| 695 | continue; |
| 696 | } |
| 697 | |
| 698 | const uint32_t raw_selector_bits = m_optimized_cluster_selectors[i].get_raw_selector_bits(); |
| 699 | |
| 700 | auto find_res = selector_hashmap.insert(std::make_pair(raw_selector_bits, total_new_entries)); |
| 701 | if (!find_res.second) |
| 702 | { |
| 703 | old_to_new[i] = (find_res.first)->second; |
| 704 | continue; |
| 705 | } |
| 706 | |
| 707 | old_to_new[i] = total_new_entries++; |
| 708 | new_to_old.push_back(i); |
| 709 | } |
| 710 | |
| 711 | debug_printf("Original selector clusters: %u, new cluster selectors: %u\n", orig_total_selector_clusters, total_new_entries); |
| 712 | |
| 713 | for (uint32_t i = 0; i < m_block_selector_cluster_index.size(); i++) |
| 714 | { |
| 715 | BASISU_FRONTEND_VERIFY((old_to_new[m_block_selector_cluster_index[i]] >= 0) && (old_to_new[m_block_selector_cluster_index[i]] < (int)total_new_entries)); |
| 716 | m_block_selector_cluster_index[i] = old_to_new[m_block_selector_cluster_index[i]]; |
| 717 | } |
| 718 | |
| 719 | basisu::vector<etc_block> new_optimized_cluster_selectors(m_optimized_cluster_selectors.size() ? total_new_entries : 0); |
| 720 | basisu::vector<uint_vec> new_selector_cluster_indices(m_selector_cluster_block_indices.size() ? total_new_entries : 0); |
| 721 | |
| 722 | for (uint32_t i = 0; i < total_new_entries; i++) |
| 723 | { |
| 724 | if (m_optimized_cluster_selectors.size()) |
| 725 | new_optimized_cluster_selectors[i] = m_optimized_cluster_selectors[new_to_old[i]]; |
| 726 | |
| 727 | //if (m_selector_cluster_block_indices.size()) |
| 728 | // new_selector_cluster_indices[i] = m_selector_cluster_block_indices[new_to_old[i]]; |
| 729 | } |
| 730 | |
| 731 | for (uint32_t i = 0; i < m_block_selector_cluster_index.size(); i++) |
nothing calls this directly
no test coverage detected