Refactored `StbImage` classes to be publicly accessible. Updated namespaces and introduced `NumericTypeAttribute` for metadata. Enhanced `VectorGenerator` with new utility methods (`any`, `all`, `length`, etc.) and improved code generation. Consolidated vector operations in `math` utilities. Refactored `Plane` and `svd` classes for better encapsulation and readability. Improved `DynamicArray` with `uint` indexer support and cleaner loops. Added SIMD-based benchmarking placeholders in `MathematicsBenchmark`. Removed redundant code and unused files, including `IUnsafeSet.cs`. Updated project file to include `CodeGen` as an analyzer. Introduced `SupportedVectorMath` and `SupportedMatrixMath` enums for better operation definitions. Improved code style, fixed minor bugs, and cleaned up unused code in `Program.cs`. Enhanced maintainability and readability across the codebase.
312 lines
10 KiB
C#
312 lines
10 KiB
C#
// Generated by Sichem at 12/24/2021 8:28:15 PM
|
|
|
|
using Misaki.HighPerformance.Image.Runtime;
|
|
// Generated by Sichem at 12/24/2021 8:28:15 PM
|
|
|
|
|
|
namespace Misaki.HighPerformance.Image
|
|
{
|
|
public unsafe partial class StbImage
|
|
{
|
|
public static int stbi__psd_test(stbi__context s)
|
|
{
|
|
var r = stbi__get32be(s) == 0x38425053 ? 1 : 0;
|
|
stbi__rewind(s);
|
|
return r;
|
|
}
|
|
|
|
public static void* stbi__psd_load(stbi__context s, int* x, int* y, int* comp, int req_comp,
|
|
stbi__result_info* ri, int bpc)
|
|
{
|
|
var pixelCount = 0;
|
|
var channelCount = 0;
|
|
var compression = 0;
|
|
var channel = 0;
|
|
var i = 0;
|
|
var bitdepth = 0;
|
|
var w = 0;
|
|
var h = 0;
|
|
byte* _out_;
|
|
if (stbi__get32be(s) != 0x38425053)
|
|
return (byte*)(ulong)(stbi__err("not PSD") != 0 ? 0 : 0);
|
|
if (stbi__get16be(s) != 1)
|
|
return (byte*)(ulong)(stbi__err("wrong version") != 0 ? 0 : 0);
|
|
stbi__skip(s, 6);
|
|
channelCount = stbi__get16be(s);
|
|
if (channelCount < 0 || channelCount > 16)
|
|
return (byte*)(ulong)(stbi__err("wrong channel count") != 0 ? 0 : 0);
|
|
h = (int)stbi__get32be(s);
|
|
w = (int)stbi__get32be(s);
|
|
if (h > 1 << 24)
|
|
return (byte*)(ulong)(stbi__err("too large") != 0 ? 0 : 0);
|
|
if (w > 1 << 24)
|
|
return (byte*)(ulong)(stbi__err("too large") != 0 ? 0 : 0);
|
|
bitdepth = stbi__get16be(s);
|
|
if (bitdepth != 8 && bitdepth != 16)
|
|
return (byte*)(ulong)(stbi__err("unsupported bit depth") != 0 ? 0 : 0);
|
|
if (stbi__get16be(s) != 3)
|
|
return (byte*)(ulong)(stbi__err("wrong color format") != 0 ? 0 : 0);
|
|
stbi__skip(s, (int)stbi__get32be(s));
|
|
stbi__skip(s, (int)stbi__get32be(s));
|
|
stbi__skip(s, (int)stbi__get32be(s));
|
|
compression = stbi__get16be(s);
|
|
if (compression > 1)
|
|
return (byte*)(ulong)(stbi__err("bad compression") != 0 ? 0 : 0);
|
|
if (stbi__mad3sizes_valid(4, w, h, 0) == 0)
|
|
return (byte*)(ulong)(stbi__err("too large") != 0 ? 0 : 0);
|
|
if (compression == 0 && bitdepth == 16 && bpc == 16)
|
|
{
|
|
_out_ = (byte*)stbi__malloc_mad3(8, w, h, 0);
|
|
ri->bits_per_channel = 16;
|
|
}
|
|
else
|
|
{
|
|
_out_ = (byte*)stbi__malloc((ulong)(4 * w * h));
|
|
}
|
|
|
|
if (_out_ == null)
|
|
return (byte*)(ulong)(stbi__err("outofmem") != 0 ? 0 : 0);
|
|
pixelCount = w * h;
|
|
if (compression != 0)
|
|
{
|
|
stbi__skip(s, h * channelCount * 2);
|
|
for (channel = 0; channel < 4; channel++)
|
|
{
|
|
byte* p;
|
|
p = _out_ + channel;
|
|
if (channel >= channelCount)
|
|
{
|
|
for (i = 0; i < pixelCount; i++, p += 4)
|
|
*p = (byte)(channel == 3 ? 255 : 0);
|
|
}
|
|
else
|
|
{
|
|
if (stbi__psd_decode_rle(s, p, pixelCount) == 0)
|
|
{
|
|
CRuntime.free(_out_);
|
|
return (byte*)(ulong)(stbi__err("corrupt") != 0 ? 0 : 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (channel = 0; channel < 4; channel++)
|
|
if (channel >= channelCount)
|
|
{
|
|
if (bitdepth == 16 && bpc == 16)
|
|
{
|
|
var q = (ushort*)_out_ + channel;
|
|
var val = (ushort)(channel == 3 ? 65535 : 0);
|
|
for (i = 0; i < pixelCount; i++, q += 4)
|
|
*q = val;
|
|
}
|
|
else
|
|
{
|
|
var p = _out_ + channel;
|
|
var val = (byte)(channel == 3 ? 255 : 0);
|
|
for (i = 0; i < pixelCount; i++, p += 4)
|
|
*p = val;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (ri->bits_per_channel == 16)
|
|
{
|
|
var q = (ushort*)_out_ + channel;
|
|
for (i = 0; i < pixelCount; i++, q += 4)
|
|
*q = (ushort)stbi__get16be(s);
|
|
}
|
|
else
|
|
{
|
|
var p = _out_ + channel;
|
|
if (bitdepth == 16)
|
|
for (i = 0; i < pixelCount; i++, p += 4)
|
|
*p = (byte)(stbi__get16be(s) >> 8);
|
|
else
|
|
for (i = 0; i < pixelCount; i++, p += 4)
|
|
*p = stbi__get8(s);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (channelCount >= 4)
|
|
{
|
|
if (ri->bits_per_channel == 16)
|
|
for (i = 0; i < w * h; ++i)
|
|
{
|
|
var pixel = (ushort*)_out_ + 4 * i;
|
|
if (pixel[3] != 0 && pixel[3] != 65535)
|
|
{
|
|
var a = pixel[3] / 65535.0f;
|
|
var ra = 1.0f / a;
|
|
var inv_a = 65535.0f * (1 - ra);
|
|
pixel[0] = (ushort)(pixel[0] * ra + inv_a);
|
|
pixel[1] = (ushort)(pixel[1] * ra + inv_a);
|
|
pixel[2] = (ushort)(pixel[2] * ra + inv_a);
|
|
}
|
|
}
|
|
else
|
|
for (i = 0; i < w * h; ++i)
|
|
{
|
|
var pixel = _out_ + 4 * i;
|
|
if (pixel[3] != 0 && pixel[3] != 255)
|
|
{
|
|
var a = pixel[3] / 255.0f;
|
|
var ra = 1.0f / a;
|
|
var inv_a = 255.0f * (1 - ra);
|
|
pixel[0] = (byte)(pixel[0] * ra + inv_a);
|
|
pixel[1] = (byte)(pixel[1] * ra + inv_a);
|
|
pixel[2] = (byte)(pixel[2] * ra + inv_a);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (req_comp != 0 && req_comp != 4)
|
|
{
|
|
if (ri->bits_per_channel == 16)
|
|
_out_ = (byte*)stbi__convert_format16((ushort*)_out_, 4, req_comp, (uint)w, (uint)h);
|
|
else
|
|
_out_ = stbi__convert_format(_out_, 4, req_comp, (uint)w, (uint)h);
|
|
if (_out_ == null)
|
|
return _out_;
|
|
}
|
|
|
|
if (comp != null)
|
|
*comp = 4;
|
|
*y = h;
|
|
*x = w;
|
|
return _out_;
|
|
}
|
|
|
|
public static int stbi__psd_info(stbi__context s, int* x, int* y, int* comp)
|
|
{
|
|
var channelCount = 0;
|
|
var dummy = 0;
|
|
var depth = 0;
|
|
if (x == null)
|
|
x = &dummy;
|
|
if (y == null)
|
|
y = &dummy;
|
|
if (comp == null)
|
|
comp = &dummy;
|
|
if (stbi__get32be(s) != 0x38425053)
|
|
{
|
|
stbi__rewind(s);
|
|
return 0;
|
|
}
|
|
|
|
if (stbi__get16be(s) != 1)
|
|
{
|
|
stbi__rewind(s);
|
|
return 0;
|
|
}
|
|
|
|
stbi__skip(s, 6);
|
|
channelCount = stbi__get16be(s);
|
|
if (channelCount < 0 || channelCount > 16)
|
|
{
|
|
stbi__rewind(s);
|
|
return 0;
|
|
}
|
|
|
|
*y = (int)stbi__get32be(s);
|
|
*x = (int)stbi__get32be(s);
|
|
depth = stbi__get16be(s);
|
|
if (depth != 8 && depth != 16)
|
|
{
|
|
stbi__rewind(s);
|
|
return 0;
|
|
}
|
|
|
|
if (stbi__get16be(s) != 3)
|
|
{
|
|
stbi__rewind(s);
|
|
return 0;
|
|
}
|
|
|
|
*comp = 4;
|
|
return 1;
|
|
}
|
|
|
|
public static int stbi__psd_is16(stbi__context s)
|
|
{
|
|
var channelCount = 0;
|
|
var depth = 0;
|
|
if (stbi__get32be(s) != 0x38425053)
|
|
{
|
|
stbi__rewind(s);
|
|
return 0;
|
|
}
|
|
|
|
if (stbi__get16be(s) != 1)
|
|
{
|
|
stbi__rewind(s);
|
|
return 0;
|
|
}
|
|
|
|
stbi__skip(s, 6);
|
|
channelCount = stbi__get16be(s);
|
|
if (channelCount < 0 || channelCount > 16)
|
|
{
|
|
stbi__rewind(s);
|
|
return 0;
|
|
}
|
|
|
|
depth = stbi__get16be(s);
|
|
if (depth != 16)
|
|
{
|
|
stbi__rewind(s);
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
public static int stbi__psd_decode_rle(stbi__context s, byte* p, int pixelCount)
|
|
{
|
|
var count = 0;
|
|
var nleft = 0;
|
|
var len = 0;
|
|
count = 0;
|
|
while ((nleft = pixelCount - count) > 0)
|
|
{
|
|
len = stbi__get8(s);
|
|
if (len == 128)
|
|
{
|
|
}
|
|
else if (len < 128)
|
|
{
|
|
len++;
|
|
if (len > nleft)
|
|
return 0;
|
|
count += len;
|
|
while (len != 0)
|
|
{
|
|
*p = stbi__get8(s);
|
|
p += 4;
|
|
len--;
|
|
}
|
|
}
|
|
else if (len > 128)
|
|
{
|
|
byte val = 0;
|
|
len = 257 - len;
|
|
if (len > nleft)
|
|
return 0;
|
|
val = stbi__get8(s);
|
|
count += len;
|
|
while (len != 0)
|
|
{
|
|
*p = val;
|
|
p += 4;
|
|
len--;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
}
|
|
}
|