Cache pointers to tables for speed
This commit is contained in:
parent
3d000933a7
commit
524906517d
@ -109,6 +109,7 @@ extern "C" {
|
|||||||
#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
|
#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
|
mz_int16 *pTree; \
|
||||||
temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
|
temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
|
||||||
if (temp >= 0) \
|
if (temp >= 0) \
|
||||||
{ \
|
{ \
|
||||||
@ -118,10 +119,11 @@ extern "C" {
|
|||||||
} \
|
} \
|
||||||
else if (num_bits > TINFL_FAST_LOOKUP_BITS) \
|
else if (num_bits > TINFL_FAST_LOOKUP_BITS) \
|
||||||
{ \
|
{ \
|
||||||
|
pTree = (pHuff)->m_pTree; \
|
||||||
code_len = TINFL_FAST_LOOKUP_BITS; \
|
code_len = TINFL_FAST_LOOKUP_BITS; \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
temp = (pHuff)->m_pTree[~temp + ((bit_buf >> code_len++) & 1)];\
|
temp = pTree[~temp + ((bit_buf >> code_len++) & 1)]; \
|
||||||
} while ((temp < 0) && (num_bits >= (code_len + 1))); \
|
} while ((temp < 0) && (num_bits >= (code_len + 1))); \
|
||||||
if (temp >= 0) \
|
if (temp >= 0) \
|
||||||
break; \
|
break; \
|
||||||
@ -142,6 +144,7 @@ extern "C" {
|
|||||||
{ \
|
{ \
|
||||||
int temp; \
|
int temp; \
|
||||||
mz_uint code_len, c; \
|
mz_uint code_len, c; \
|
||||||
|
mz_int16 *pTree; \
|
||||||
if (num_bits < 15) \
|
if (num_bits < 15) \
|
||||||
{ \
|
{ \
|
||||||
if ((pIn_buf_end - pIn_buf_cur) < 2) \
|
if ((pIn_buf_end - pIn_buf_cur) < 2) \
|
||||||
@ -159,10 +162,11 @@ extern "C" {
|
|||||||
code_len = temp >> 9, temp &= 511; \
|
code_len = temp >> 9, temp &= 511; \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
|
pTree = (pHuff)->m_pTree; \
|
||||||
code_len = TINFL_FAST_LOOKUP_BITS; \
|
code_len = TINFL_FAST_LOOKUP_BITS; \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
temp = (pHuff)->m_pTree[~temp + ((bit_buf >> code_len++) & 1)]; \
|
temp = pTree[~temp + ((bit_buf >> code_len++) & 1)]; \
|
||||||
} while (temp < 0); \
|
} while (temp < 0); \
|
||||||
} \
|
} \
|
||||||
sym = temp; \
|
sym = temp; \
|
||||||
@ -305,13 +309,17 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
|
|||||||
{
|
{
|
||||||
int tree_next, tree_cur;
|
int tree_next, tree_cur;
|
||||||
tinfl_huff_table *pTable;
|
tinfl_huff_table *pTable;
|
||||||
|
mz_int16 *pTree;
|
||||||
|
mz_uint8 *pCode_size;
|
||||||
mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16];
|
mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16];
|
||||||
pTable = &r->m_tables[r->m_type];
|
pTable = &r->m_tables[r->m_type];
|
||||||
|
pTree = pTable->m_pTree;
|
||||||
|
pCode_size = pTable->m_pCode_size;
|
||||||
MZ_CLEAR_OBJ(total_syms);
|
MZ_CLEAR_OBJ(total_syms);
|
||||||
MZ_CLEAR_OBJ(pTable->m_look_up);
|
MZ_CLEAR_OBJ(pTable->m_look_up);
|
||||||
TINFL_MEMSET(pTable->m_pTree, 0, r->m_table_sizes[r->m_type] * sizeof(pTable->m_pTree[0]) * 2);
|
TINFL_MEMSET(pTree, 0, r->m_table_sizes[r->m_type] * sizeof(pTree[0]) * 2);
|
||||||
for (i = 0; i < r->m_table_sizes[r->m_type]; ++i)
|
for (i = 0; i < r->m_table_sizes[r->m_type]; ++i)
|
||||||
total_syms[pTable->m_pCode_size[i]]++;
|
total_syms[pCode_size[i]]++;
|
||||||
used_syms = 0, total = 0;
|
used_syms = 0, total = 0;
|
||||||
next_code[0] = next_code[1] = 0;
|
next_code[0] = next_code[1] = 0;
|
||||||
for (i = 1; i <= 15; ++i)
|
for (i = 1; i <= 15; ++i)
|
||||||
@ -325,7 +333,7 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
|
|||||||
}
|
}
|
||||||
for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)
|
for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)
|
||||||
{
|
{
|
||||||
mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_pCode_size[sym_index];
|
mz_uint rev_code = 0, l, cur_code, code_size = pCode_size[sym_index];
|
||||||
if (!code_size)
|
if (!code_size)
|
||||||
continue;
|
continue;
|
||||||
cur_code = next_code[code_size]++;
|
cur_code = next_code[code_size]++;
|
||||||
@ -351,17 +359,17 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
|
|||||||
for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)
|
for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)
|
||||||
{
|
{
|
||||||
tree_cur -= ((rev_code >>= 1) & 1);
|
tree_cur -= ((rev_code >>= 1) & 1);
|
||||||
if (!pTable->m_pTree[-tree_cur - 1])
|
if (!pTree[-tree_cur - 1])
|
||||||
{
|
{
|
||||||
pTable->m_pTree[-tree_cur - 1] = (mz_int16)tree_next;
|
pTree[-tree_cur - 1] = (mz_int16)tree_next;
|
||||||
tree_cur = tree_next;
|
tree_cur = tree_next;
|
||||||
tree_next -= 2;
|
tree_next -= 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
tree_cur = pTable->m_pTree[-tree_cur - 1];
|
tree_cur = pTree[-tree_cur - 1];
|
||||||
}
|
}
|
||||||
tree_cur -= ((rev_code >>= 1) & 1);
|
tree_cur -= ((rev_code >>= 1) & 1);
|
||||||
pTable->m_pTree[-tree_cur - 1] = (mz_int16)sym_index;
|
pTree[-tree_cur - 1] = (mz_int16)sym_index;
|
||||||
}
|
}
|
||||||
if (r->m_type == 2)
|
if (r->m_type == 2)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user