Add image processing and memory management features
Added new namespace `Misaki.HighPerformance.Image` for image processing, including classes for animated GIF handling and memory management. Added `AnimatedFrameResult` class for individual frames in animated images. Added `AnimatedGifEnumerator` class for enumerating frames in animated GIFs. Added `ColorComponents` enum for different color formats. Added `ImageInfo` struct for image dimensions and color components. Added `CRuntime` class for low-level memory management functions. Added `MemoryStats` class to track memory allocation statistics. Added utility functions for creating multi-dimensional arrays. Added new structures for fixed-size UTF-8 encoded strings. Added benchmarking classes to test new memory management features. Changed `StbImage.cs` to include new namespaces and functionality for image data manipulation. Changed project files to target .NET 9.0 and enable new features. Changed `Arena.cs` and `DynamicArena.cs` to use `nuint` for size parameters. Changed `BitSet.cs` to enhance bit manipulation methods. Changed `Program.cs` to run `FunctionPtrBenchmark` for performance testing. Removed memory tracking code from `AllocationManager.cs`, including the `_allocated` dictionary and related logic. Removed `Free` method from `IAllocator.cs` interface. Removed `UNSAFE_COLLECTION_CHECK` preprocessor directive from the codebase. Refactored various files to improve organization, moving from `Unsafe` to `LowLevel` namespace. Refactored `MemoryUtilities` class to include new memory operation methods. Refactored `UnsafeUtilities.cs` to support new collection structures.
This commit is contained in:
595
Misaki.HighPerformance.Image/StbImage.Generated.Zlib.cs
Normal file
595
Misaki.HighPerformance.Image/StbImage.Generated.Zlib.cs
Normal file
@@ -0,0 +1,595 @@
|
||||
// Generated by Sichem at 9/16/2024 9:09:30 AM
|
||||
|
||||
using Misaki.HighPerformance.Image.Runtime;
|
||||
using System.Runtime.InteropServices;
|
||||
using Misaki.HighPerformance.Image;
|
||||
|
||||
namespace Misaki.HighPerformance.Image
|
||||
{
|
||||
unsafe partial class StbImage
|
||||
{
|
||||
public static byte[] stbi__zdefault_distance =
|
||||
{ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
|
||||
|
||||
public static byte[] stbi__zdefault_length =
|
||||
{
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
|
||||
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
|
||||
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
|
||||
9, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8
|
||||
};
|
||||
|
||||
public static int[] stbi__zdist_base =
|
||||
{
|
||||
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097,
|
||||
6145, 8193, 12289, 16385, 24577, 0, 0
|
||||
};
|
||||
|
||||
public static int[] stbi__zdist_extra =
|
||||
{ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0 };
|
||||
|
||||
public static int[] stbi__zlength_base =
|
||||
{
|
||||
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195,
|
||||
227, 258, 0, 0
|
||||
};
|
||||
|
||||
public static int[] stbi__zlength_extra =
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0 };
|
||||
|
||||
public static sbyte* stbi_zlib_decode_malloc_guesssize(sbyte* buffer, int len, int initial_size, int* outlen)
|
||||
{
|
||||
var a = new stbi__zbuf();
|
||||
var p = (sbyte*)stbi__malloc((ulong)initial_size);
|
||||
if (p == null)
|
||||
return null;
|
||||
a.zbuffer = (byte*)buffer;
|
||||
a.zbuffer_end = (byte*)buffer + len;
|
||||
if (stbi__do_zlib(&a, p, initial_size, 1, 1) != 0)
|
||||
{
|
||||
if (outlen != null)
|
||||
*outlen = (int)(a.zout - a.zout_start);
|
||||
return a.zout_start;
|
||||
}
|
||||
|
||||
CRuntime.free(a.zout_start);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static sbyte* stbi_zlib_decode_malloc_guesssize_headerflag(sbyte* buffer, int len, int initial_size,
|
||||
int* outlen, int parse_header)
|
||||
{
|
||||
var a = new stbi__zbuf();
|
||||
var p = (sbyte*)stbi__malloc((ulong)initial_size);
|
||||
if (p == null)
|
||||
return null;
|
||||
a.zbuffer = (byte*)buffer;
|
||||
a.zbuffer_end = (byte*)buffer + len;
|
||||
if (stbi__do_zlib(&a, p, initial_size, 1, parse_header) != 0)
|
||||
{
|
||||
if (outlen != null)
|
||||
*outlen = (int)(a.zout - a.zout_start);
|
||||
return a.zout_start;
|
||||
}
|
||||
|
||||
CRuntime.free(a.zout_start);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static sbyte* stbi_zlib_decode_malloc(sbyte* buffer, int len, int* outlen)
|
||||
{
|
||||
return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
|
||||
}
|
||||
|
||||
public static int stbi_zlib_decode_buffer(sbyte* obuffer, int olen, sbyte* ibuffer, int ilen)
|
||||
{
|
||||
var a = new stbi__zbuf();
|
||||
a.zbuffer = (byte*)ibuffer;
|
||||
a.zbuffer_end = (byte*)ibuffer + ilen;
|
||||
if (stbi__do_zlib(&a, obuffer, olen, 0, 1) != 0)
|
||||
return (int)(a.zout - a.zout_start);
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static sbyte* stbi_zlib_decode_noheader_malloc(sbyte* buffer, int len, int* outlen)
|
||||
{
|
||||
var a = new stbi__zbuf();
|
||||
var p = (sbyte*)stbi__malloc(16384);
|
||||
if (p == null)
|
||||
return null;
|
||||
a.zbuffer = (byte*)buffer;
|
||||
a.zbuffer_end = (byte*)buffer + len;
|
||||
if (stbi__do_zlib(&a, p, 16384, 1, 0) != 0)
|
||||
{
|
||||
if (outlen != null)
|
||||
*outlen = (int)(a.zout - a.zout_start);
|
||||
return a.zout_start;
|
||||
}
|
||||
|
||||
CRuntime.free(a.zout_start);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static int stbi_zlib_decode_noheader_buffer(sbyte* obuffer, int olen, sbyte* ibuffer, int ilen)
|
||||
{
|
||||
var a = new stbi__zbuf();
|
||||
a.zbuffer = (byte*)ibuffer;
|
||||
a.zbuffer_end = (byte*)ibuffer + ilen;
|
||||
if (stbi__do_zlib(&a, obuffer, olen, 0, 0) != 0)
|
||||
return (int)(a.zout - a.zout_start);
|
||||
return -1;
|
||||
}
|
||||
|
||||
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)(17 * sizeof(int)));
|
||||
CRuntime.memset(z->fast, 0, (ulong)(512 * 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)
|
||||
{
|
||||
int s = 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;
|
||||
}
|
||||
|
||||
public static int stbi__zeof(stbi__zbuf* z)
|
||||
{
|
||||
return z->zbuffer >= z->zbuffer_end ? 1 : 0;
|
||||
}
|
||||
|
||||
public static byte stbi__zget8(stbi__zbuf* z)
|
||||
{
|
||||
return (byte)(stbi__zeof(z) != 0 ? 0 : *z->zbuffer++);
|
||||
}
|
||||
|
||||
public static void stbi__fill_bits(stbi__zbuf* z)
|
||||
{
|
||||
do
|
||||
{
|
||||
if (z->code_buffer >= 1U << z->num_bits)
|
||||
{
|
||||
z->zbuffer = z->zbuffer_end;
|
||||
return;
|
||||
}
|
||||
|
||||
z->code_buffer |= (uint)stbi__zget8(z) << z->num_bits;
|
||||
z->num_bits += 8;
|
||||
} while (z->num_bits <= 24);
|
||||
}
|
||||
|
||||
public static uint stbi__zreceive(stbi__zbuf* z, int n)
|
||||
{
|
||||
uint k = 0;
|
||||
if (z->num_bits < n)
|
||||
stbi__fill_bits(z);
|
||||
k = (uint)(z->code_buffer & ((1 << n) - 1));
|
||||
z->code_buffer >>= n;
|
||||
z->num_bits -= n;
|
||||
return k;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (a->hit_zeof_once == 0)
|
||||
{
|
||||
a->hit_zeof_once = 1;
|
||||
a->num_bits += 16;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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__zexpand(stbi__zbuf* z, sbyte* zout, int n)
|
||||
{
|
||||
sbyte* q;
|
||||
uint cur = 0;
|
||||
uint limit = 0;
|
||||
uint old_limit = 0;
|
||||
z->zout = zout;
|
||||
if (z->z_expandable == 0)
|
||||
return stbi__err("output buffer limit");
|
||||
cur = (uint)(z->zout - z->zout_start);
|
||||
limit = old_limit = (uint)(z->zout_end - z->zout_start);
|
||||
if (0xffffffff - cur < (uint)n)
|
||||
return stbi__err("outofmem");
|
||||
while (cur + n > limit)
|
||||
{
|
||||
if (limit > 0xffffffff / 2)
|
||||
return stbi__err("outofmem");
|
||||
limit *= 2;
|
||||
}
|
||||
|
||||
q = (sbyte*)CRuntime.realloc(z->zout_start, (ulong)limit);
|
||||
if (q == null)
|
||||
return stbi__err("outofmem");
|
||||
z->zout_start = q;
|
||||
z->zout = q + cur;
|
||||
z->zout_end = q + limit;
|
||||
return 1;
|
||||
}
|
||||
|
||||
public static int stbi__parse_huffman_block(stbi__zbuf* a)
|
||||
{
|
||||
var zout = a->zout;
|
||||
for (; ; )
|
||||
{
|
||||
var z = stbi__zhuffman_decode(a, &a->z_length);
|
||||
if (z < 256)
|
||||
{
|
||||
if (z < 0)
|
||||
return stbi__err("bad huffman code");
|
||||
if (zout >= a->zout_end)
|
||||
{
|
||||
if (stbi__zexpand(a, zout, 1) == 0)
|
||||
return 0;
|
||||
zout = a->zout;
|
||||
}
|
||||
|
||||
*zout++ = (sbyte)z;
|
||||
}
|
||||
else
|
||||
{
|
||||
byte* p;
|
||||
var len = 0;
|
||||
var dist = 0;
|
||||
if (z == 256)
|
||||
{
|
||||
a->zout = zout;
|
||||
if (a->hit_zeof_once != 0 && a->num_bits < 16)
|
||||
return stbi__err("unexpected end");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (z >= 286)
|
||||
return stbi__err("bad huffman code");
|
||||
z -= 257;
|
||||
len = stbi__zlength_base[z];
|
||||
if (stbi__zlength_extra[z] != 0)
|
||||
len += (int)stbi__zreceive(a, stbi__zlength_extra[z]);
|
||||
z = stbi__zhuffman_decode(a, &a->z_distance);
|
||||
if (z < 0 || z >= 30)
|
||||
return stbi__err("bad huffman code");
|
||||
dist = stbi__zdist_base[z];
|
||||
if (stbi__zdist_extra[z] != 0)
|
||||
dist += (int)stbi__zreceive(a, stbi__zdist_extra[z]);
|
||||
if (zout - a->zout_start < dist)
|
||||
return stbi__err("bad dist");
|
||||
if (len > a->zout_end - zout)
|
||||
{
|
||||
if (stbi__zexpand(a, zout, len) == 0)
|
||||
return 0;
|
||||
zout = a->zout;
|
||||
}
|
||||
|
||||
p = (byte*)(zout - dist);
|
||||
if (dist == 1)
|
||||
{
|
||||
var v = *p;
|
||||
if (len != 0)
|
||||
do
|
||||
{
|
||||
*zout++ = (sbyte)v;
|
||||
} while (--len != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (len != 0)
|
||||
do
|
||||
{
|
||||
*zout++ = (sbyte)*p++;
|
||||
} while (--len != 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static int stbi__compute_huffman_codes(stbi__zbuf* a)
|
||||
{
|
||||
var z_codelength = new stbi__zhuffman();
|
||||
var lencodes = stackalloc byte[455];
|
||||
var codelength_sizes = stackalloc byte[19];
|
||||
var i = 0;
|
||||
var n = 0;
|
||||
var hlit = (int)(stbi__zreceive(a, 5) + 257);
|
||||
var hdist = (int)(stbi__zreceive(a, 5) + 1);
|
||||
var hclen = (int)(stbi__zreceive(a, 4) + 4);
|
||||
var ntot = hlit + hdist;
|
||||
CRuntime.memset(codelength_sizes, 0, (ulong)(19 * sizeof(byte)));
|
||||
for (i = 0; i < hclen; ++i)
|
||||
{
|
||||
var s = (int)stbi__zreceive(a, 3);
|
||||
codelength_sizes[stbi__compute_huffman_codes_length_dezigzag[i]] = (byte)s;
|
||||
}
|
||||
|
||||
if (stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19) == 0)
|
||||
return 0;
|
||||
n = 0;
|
||||
while (n < ntot)
|
||||
{
|
||||
var c = stbi__zhuffman_decode(a, &z_codelength);
|
||||
if (c < 0 || c >= 19)
|
||||
return stbi__err("bad codelengths");
|
||||
if (c < 16)
|
||||
{
|
||||
lencodes[n++] = (byte)c;
|
||||
}
|
||||
else
|
||||
{
|
||||
byte fill = 0;
|
||||
if (c == 16)
|
||||
{
|
||||
c = (int)(stbi__zreceive(a, 2) + 3);
|
||||
if (n == 0)
|
||||
return stbi__err("bad codelengths");
|
||||
fill = lencodes[n - 1];
|
||||
}
|
||||
else if (c == 17)
|
||||
{
|
||||
c = (int)(stbi__zreceive(a, 3) + 3);
|
||||
}
|
||||
else if (c == 18)
|
||||
{
|
||||
c = (int)(stbi__zreceive(a, 7) + 11);
|
||||
}
|
||||
else
|
||||
{
|
||||
return stbi__err("bad codelengths");
|
||||
}
|
||||
|
||||
if (ntot - n < c)
|
||||
return stbi__err("bad codelengths");
|
||||
CRuntime.memset(lencodes + n, fill, (ulong)c);
|
||||
n += c;
|
||||
}
|
||||
}
|
||||
|
||||
if (n != ntot)
|
||||
return stbi__err("bad codelengths");
|
||||
if (stbi__zbuild_huffman(&a->z_length, lencodes, hlit) == 0)
|
||||
return 0;
|
||||
if (stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist) == 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
public static int stbi__parse_uncompressed_block(stbi__zbuf* a)
|
||||
{
|
||||
var header = stackalloc byte[4];
|
||||
var len = 0;
|
||||
var nlen = 0;
|
||||
var k = 0;
|
||||
if ((a->num_bits & 7) != 0)
|
||||
stbi__zreceive(a, a->num_bits & 7);
|
||||
k = 0;
|
||||
while (a->num_bits > 0)
|
||||
{
|
||||
header[k++] = (byte)(a->code_buffer & 255);
|
||||
a->code_buffer >>= 8;
|
||||
a->num_bits -= 8;
|
||||
}
|
||||
|
||||
if (a->num_bits < 0)
|
||||
return stbi__err("zlib corrupt");
|
||||
while (k < 4)
|
||||
header[k++] = stbi__zget8(a);
|
||||
|
||||
len = header[1] * 256 + header[0];
|
||||
nlen = header[3] * 256 + header[2];
|
||||
if (nlen != (len ^ 0xffff))
|
||||
return stbi__err("zlib corrupt");
|
||||
if (a->zbuffer + len > a->zbuffer_end)
|
||||
return stbi__err("read past buffer");
|
||||
if (a->zout + len > a->zout_end)
|
||||
if (stbi__zexpand(a, a->zout, len) == 0)
|
||||
return 0;
|
||||
CRuntime.memcpy(a->zout, a->zbuffer, (ulong)len);
|
||||
a->zbuffer += len;
|
||||
a->zout += len;
|
||||
return 1;
|
||||
}
|
||||
|
||||
public static int stbi__parse_zlib_header(stbi__zbuf* a)
|
||||
{
|
||||
int cmf = stbi__zget8(a);
|
||||
var cm = cmf & 15;
|
||||
int flg = stbi__zget8(a);
|
||||
if (stbi__zeof(a) != 0)
|
||||
return stbi__err("bad zlib header");
|
||||
if ((cmf * 256 + flg) % 31 != 0)
|
||||
return stbi__err("bad zlib header");
|
||||
if ((flg & 32) != 0)
|
||||
return stbi__err("no preset dict");
|
||||
if (cm != 8)
|
||||
return stbi__err("bad compression");
|
||||
return 1;
|
||||
}
|
||||
|
||||
public static int stbi__parse_zlib(stbi__zbuf* a, int parse_header)
|
||||
{
|
||||
var final = 0;
|
||||
var type = 0;
|
||||
if (parse_header != 0)
|
||||
if (stbi__parse_zlib_header(a) == 0)
|
||||
return 0;
|
||||
a->num_bits = 0;
|
||||
a->code_buffer = 0;
|
||||
a->hit_zeof_once = 0;
|
||||
do
|
||||
{
|
||||
final = (int)stbi__zreceive(a, 1);
|
||||
type = (int)stbi__zreceive(a, 2);
|
||||
if (type == 0)
|
||||
{
|
||||
if (stbi__parse_uncompressed_block(a) == 0)
|
||||
return 0;
|
||||
}
|
||||
else if (type == 3)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (type == 1)
|
||||
{
|
||||
fixed (byte* b = stbi__zdefault_length)
|
||||
{
|
||||
if (stbi__zbuild_huffman(&a->z_length, b, 288) == 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
fixed (byte* b = stbi__zdefault_distance)
|
||||
{
|
||||
if (stbi__zbuild_huffman(&a->z_distance, b, 32) == 0)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (stbi__compute_huffman_codes(a) == 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (stbi__parse_huffman_block(a) == 0)
|
||||
return 0;
|
||||
}
|
||||
} while (final == 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
public static int stbi__do_zlib(stbi__zbuf* a, sbyte* obuf, int olen, int exp, int parse_header)
|
||||
{
|
||||
a->zout_start = obuf;
|
||||
a->zout = obuf;
|
||||
a->zout_end = obuf + olen;
|
||||
a->z_expandable = exp;
|
||||
return stbi__parse_zlib(a, parse_header);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct stbi__zbuf
|
||||
{
|
||||
public byte* zbuffer;
|
||||
public byte* zbuffer_end;
|
||||
public int num_bits;
|
||||
public int hit_zeof_once;
|
||||
public uint code_buffer;
|
||||
public sbyte* zout;
|
||||
public sbyte* zout_start;
|
||||
public sbyte* zout_end;
|
||||
public int z_expandable;
|
||||
public stbi__zhuffman z_length;
|
||||
public stbi__zhuffman z_distance;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct stbi__zhuffman
|
||||
{
|
||||
public fixed ushort fast[512];
|
||||
public fixed ushort firstcode[16];
|
||||
public fixed int maxcode[17];
|
||||
public fixed ushort firstsymbol[16];
|
||||
public fixed byte size[288];
|
||||
public fixed ushort value[288];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user