public static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) { var b = 0; var s = 0; var k = 0; k = stbi__bit_reverse((int)a->code_buffer, 16); for (s = 9 + 1; ; ++s) { if (k < z->maxcode[s]) { break; } } if (s >= 16) { return(-1); } b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s]; if (b >= 288) { return(-1); } if (z->size[b] != s) { return(-1); } a->code_buffer >>= s; a->num_bits -= s; return(z->value[b]); }
public static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) { var b = 0; var s = 0; if (a->num_bits < 16) { if (stbi__zeof(a) != 0) { return(-1); } stbi__fill_bits(a); } b = z->fast[a->code_buffer & ((1 << 9) - 1)]; if (b != 0) { s = b >> 9; a->code_buffer >>= s; a->num_bits -= s; return(b & 511); } return(stbi__zhuffman_decode_slowpath(a, z)); }
public static int stbi__zbuild_huffman(stbi__zhuffman *z, byte *sizelist, int num) { var i = 0; var k = 0; var code = 0; var next_code = stackalloc int[16]; var sizes = stackalloc int[17]; CRuntime.memset(sizes, 0, (ulong)sizeof(int)); CRuntime.memset(z->fast, 0, (ulong)((1 << 9) * sizeof(ushort))); for (i = 0; i < num; ++i) { ++sizes[sizelist[i]]; } sizes[0] = 0; for (i = 1; i < 16; ++i) { if (sizes[i] > 1 << i) { return(stbi__err("bad sizes")); } } code = 0; for (i = 1; i < 16; ++i) { next_code[i] = code; z->firstcode[i] = (ushort)code; z->firstsymbol[i] = (ushort)k; code = code + sizes[i]; if (sizes[i] != 0) { if (code - 1 >= 1 << i) { return(stbi__err("bad codelengths")); } } z->maxcode[i] = code << (16 - i); code <<= 1; k += sizes[i]; } z->maxcode[16] = 0x10000; for (i = 0; i < num; ++i) { var s = (int)sizelist[i]; if (s != 0) { var c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; var fastv = (ushort)((s << 9) | i); z->size[c] = (byte)s; z->value[c] = (ushort)i; if (s <= 9) { var j = stbi__bit_reverse(next_code[s], s); while (j < 1 << 9) { z->fast[j] = fastv; j += 1 << s; } } ++next_code[s]; } } return(1); }