MCPcopy Create free account
hub / github.com/TheRealMJP/DeferredTexturing / tdefl_find_match

Function tdefl_find_match

SampleFramework12/v1.00/TinyEXR.cpp:3275–3333  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3273#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
3274#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16 *)(p)
3275static MZ_FORCEINLINE void
3276tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist,
3277 mz_uint max_match_len, mz_uint *pMatch_dist,
3278 mz_uint *pMatch_len) {
3279 mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK,
3280 match_len = *pMatch_len, probe_pos = pos, next_probe_pos,
3281 probe_len;
3282 mz_uint num_probes_left = d->m_max_probes[match_len >= 32];
3283 const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q;
3284 mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]),
3285 s01 = TDEFL_READ_UNALIGNED_WORD(s);
3286 MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN);
3287 if (max_match_len <= match_len)
3288 return;
3289 for (;;) {
3290 for (;;) {
3291 if (--num_probes_left == 0)
3292 return;
3293#define TDEFL_PROBE \
3294 next_probe_pos = d->m_next[probe_pos]; \
3295 if ((!next_probe_pos) || \
3296 ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) \
3297 return; \
3298 probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \
3299 if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) \
3300 break;
3301 TDEFL_PROBE;
3302 TDEFL_PROBE;
3303 TDEFL_PROBE;
3304 }
3305 if (!dist)
3306 break;
3307 q = (const mz_uint16 *)(d->m_dict + probe_pos);
3308 if (TDEFL_READ_UNALIGNED_WORD(q) != s01)
3309 continue;
3310 p = s;
3311 probe_len = 32;
3312 do {
3313 } while (
3314 (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
3315 (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
3316 (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
3317 (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
3318 (--probe_len > 0));
3319 if (!probe_len) {
3320 *pMatch_dist = dist;
3321 *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN);
3322 break;
3323 } else if ((probe_len = ((mz_uint)(p - s) * 2) +
3324 (mz_uint)(*(const mz_uint8 *)p ==
3325 *(const mz_uint8 *)q)) > match_len) {
3326 *pMatch_dist = dist;
3327 if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) ==
3328 max_match_len)
3329 break;
3330 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]);
3331 }
3332 }

Callers 1

tdefl_compress_normalFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected