diff --git a/bin/crunch_x64.exe b/bin/crunch_x64.exe index 33eba9a..b69019a 100644 Binary files a/bin/crunch_x64.exe and b/bin/crunch_x64.exe differ diff --git a/crnlib/crn_comp.cpp b/crnlib/crn_comp.cpp index de1d83b..2557ef4 100644 --- a/crnlib/crn_comp.cpp +++ b/crnlib/crn_comp.cpp @@ -186,15 +186,15 @@ bool crn_comp::pack_color_selectors(crnlib::vector& packed_data, const cr remapped_selectors[remapping[i]] = m_color_selectors[i]; crnlib::vector residual_syms; residual_syms.reserve(m_color_selectors.size() * 8); - symbol_histogram hist(49); + symbol_histogram hist(16); uint32 prev_selector = 0; for (uint selector_index = 0; selector_index < m_color_selectors.size(); selector_index++) { uint32 cur_selector = remapped_selectors[selector_index]; uint prev_sym = 0; for (uint32 selector = cur_selector, i = 0; i < 16; i++, selector >>= 2, prev_selector >>= 2) { - int sym = 3 + (selector & 3) - (prev_selector & 3); + int sym = selector - prev_selector & 3; if (i & 1) { - uint paired_sym = 7 * sym + prev_sym; + uint paired_sym = sym << 2 | prev_sym; residual_syms.push_back(paired_sym); hist.inc_freq(paired_sym); } else @@ -226,15 +226,15 @@ bool crn_comp::pack_alpha_selectors(crnlib::vector& packed_data, const cr remapped_selectors[remapping[i]] = m_alpha_selectors[i]; crnlib::vector residual_syms; residual_syms.reserve(m_alpha_selectors.size() * 8); - symbol_histogram hist(225); + symbol_histogram hist(64); uint64 prev_selector = 0; for (uint selector_index = 0; selector_index < m_alpha_selectors.size(); selector_index++) { uint64 cur_selector = remapped_selectors[selector_index]; uint prev_sym = 0; for (uint64 selector = cur_selector, i = 0; i < 16; i++, selector >>= 3, prev_selector >>= 3) { - int sym = 7 + (selector & 7) - (prev_selector & 7); + int sym = selector - prev_selector & 7; if (i & 1) { - uint paired_sym = 15 * sym + prev_sym; + uint paired_sym = sym << 3 | prev_sym; residual_syms.push_back(paired_sym); hist.inc_freq(paired_sym); } else @@ -741,12 +741,10 @@ void crn_comp::optimize_color_selectors() { uint16 n = m_color_selectors.size(); remapping.resize(n); + uint8 d[] = {0, 1, 4, 1}; uint8 D4[0x100]; - for (uint16 i = 0; i < 0x100; i++) { - int d0 = (i & 3) - (i >> 4 & 3); - int d1 = (i >> 2 & 3) - (i >> 6 & 3); - D4[i] = d0 * d0 + d1 * d1; - } + for (uint16 i = 0; i < 0x100; i++) + D4[i] = d[i - (i >> 4) & 3] + d[(i >> 2) - (i >> 6) & 3]; uint8 D8[0x10000]; for (uint32 i = 0; i < 0x10000; i++) D8[i] = D4[i >> 8 & 0xF0 | i >> 4 & 0xF] + D4[i >> 4 & 0xF0 | i & 0xF]; @@ -991,12 +989,10 @@ void crn_comp::optimize_alpha_selectors() { uint16 n = m_alpha_selectors.size(); remapping.resize(n); + uint8 d[] = {0, 1, 4, 9, 16, 9, 4, 1}; uint8 D6[0x1000]; - for (uint16 i = 0; i < 0x1000; i++) { - int d0 = (i & 7) - (i >> 6 & 7); - int d1 = (i >> 3 & 7) - (i >> 9 & 7); - D6[i] = d0 * d0 + d1 * d1; - } + for (uint16 i = 0; i < 0x1000; i++) + D6[i] = d[i - (i >> 6) & 7] + d[(i >> 3) - (i >> 9) & 7]; crnlib::vector selectors(n); crnlib::vector indices(n); diff --git a/inc/crn_decomp.h b/inc/crn_decomp.h index ed96227..7fd1992 100644 --- a/inc/crn_decomp.h +++ b/inc/crn_decomp.h @@ -3188,19 +3188,6 @@ class crn_unpacker { if (!m_codec.decode_receive_static_data_model(dm)) return false; - int32 delta0[cMaxUniqueSelectorDeltas * cMaxUniqueSelectorDeltas]; - int32 delta1[cMaxUniqueSelectorDeltas * cMaxUniqueSelectorDeltas]; - int32 l = -(int32)cMaxSelectorValue, m = -(int32)cMaxSelectorValue; - for (uint32 i = 0; i < (cMaxUniqueSelectorDeltas * cMaxUniqueSelectorDeltas); i++) { - delta0[i] = l; - delta1[i] = m; - - if (++l > (int32)cMaxSelectorValue) { - l = -(int32)cMaxSelectorValue; - m++; - } - } - uint32 cur[16]; utils::zero_object(cur); @@ -3214,8 +3201,8 @@ class crn_unpacker { for (uint32 i = 0; i < num_color_selectors; i++) { for (uint32 j = 0; j < 8; j++) { int32 sym = m_codec.decode(dm); - cur[j * 2 + 0] = (delta0[sym] + cur[j * 2 + 0]) & 3; - cur[j * 2 + 1] = (delta1[sym] + cur[j * 2 + 1]) & 3; + cur[j * 2 + 0] = cur[j * 2 + 0] + (sym & 3) & 3; + cur[j * 2 + 1] = cur[j * 2 + 1] + (sym >> 2) & 3; } *pDst++ = @@ -3270,19 +3257,6 @@ class crn_unpacker { if (!m_codec.decode_receive_static_data_model(dm)) return false; - int32 delta0[cMaxUniqueSelectorDeltas * cMaxUniqueSelectorDeltas]; - int32 delta1[cMaxUniqueSelectorDeltas * cMaxUniqueSelectorDeltas]; - int32 l = -(int32)cMaxSelectorValue, m = -(int32)cMaxSelectorValue; - for (uint32 i = 0; i < (cMaxUniqueSelectorDeltas * cMaxUniqueSelectorDeltas); i++) { - delta0[i] = l; - delta1[i] = m; - - if (++l > (int32)cMaxSelectorValue) { - l = -(int32)cMaxSelectorValue; - m++; - } - } - uint32 cur[16]; utils::zero_object(cur); @@ -3296,8 +3270,8 @@ class crn_unpacker { for (uint32 i = 0; i < num_alpha_selectors; i++) { for (uint32 j = 0; j < 8; j++) { int32 sym = m_codec.decode(dm); - cur[j * 2 + 0] = (delta0[sym] + cur[j * 2 + 0]) & 7; - cur[j * 2 + 1] = (delta1[sym] + cur[j * 2 + 1]) & 7; + cur[j * 2 + 0] = cur[j * 2 + 0] + (sym & 7) & 7; + cur[j * 2 + 1] = cur[j * 2 + 1] + (sym >> 3) & 7; } *pDst++ = (uint16)((pFrom_linear[cur[0]]) | (pFrom_linear[cur[1]] << 3) | (pFrom_linear[cur[2]] << 6) | (pFrom_linear[cur[3]] << 9) |