Beispiel #1
0
        public static int stbi__zhuffman_decode(StbiZbuf *a, StbiZhuffman *z)
        {
            var b = 0;
            var s = 0;

            if (a->num_bits < 16)
            {
                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));
        }
Beispiel #2
0
        public static int stbi__zhuffman_decode_slowpath(StbiZbuf *a, StbiZhuffman *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];
            a->code_buffer >>= s;
            a->num_bits     -= s;
            return(z->value[b]);
        }
Beispiel #3
0
        public static int stbi__zbuild_huffman(StbiZhuffman *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);
        }