diff --git a/src/PixiParser.Skia/Encoders/QoiEncoder.Net8.cs b/src/PixiParser.Skia/Encoders/QoiEncoder.Net8.cs new file mode 100644 index 0000000..9f0ace3 --- /dev/null +++ b/src/PixiParser.Skia/Encoders/QoiEncoder.Net8.cs @@ -0,0 +1,35 @@ +#if NET8_0 +using System; +using QoiSharpNoGC; +using QoiSharpNoGC.Codec; +using SkiaSharp; + +namespace PixiEditor.Parser.Skia.Encoders; + +public class QoiEncoder : ImageEncoder +{ + public override string EncodedFormatName { get; } = "QOI"; + + public override byte[] Encode(byte[] rawBitmap, int width, int height, bool isSrgb) => + QoiSharpNoGC.QoiEncoder.Encode( + new QoiImage(rawBitmap, width, height, Channels.RgbWithAlpha, isSrgb ? ColorSpace.SRgb : ColorSpace.Linear)); + + public override byte[] Decode(byte[] encodedData, out SKImageInfo info) + { + var qoiImage = QoiDecoder.Decode(encodedData); + + var colorSpace = qoiImage.ColorSpace switch + { + ColorSpace.SRgb => SKColorSpace.CreateSrgb(), + ColorSpace.Linear => SKColorSpace.CreateSrgbLinear(), + _ => throw new IndexOutOfRangeException($"QOI color space '{qoiImage.ColorSpace}' is not supported.") + }; + + info = new SKImageInfo(qoiImage.Width, qoiImage.Height, SKColorType.Rgba8888, SKAlphaType.Premul, colorSpace); + + return qoiImage.Data; + } + + public override byte[] Decode(Span encodedData, out SKImageInfo info) => Decode(encodedData.ToArray(), out info); +} +#endif diff --git a/src/PixiParser.Skia/Encoders/QoiEncoder.cs b/src/PixiParser.Skia/Encoders/QoiEncoder.Netstandard.cs similarity index 96% rename from src/PixiParser.Skia/Encoders/QoiEncoder.cs rename to src/PixiParser.Skia/Encoders/QoiEncoder.Netstandard.cs index d94a1ff..f9538b1 100644 --- a/src/PixiParser.Skia/Encoders/QoiEncoder.cs +++ b/src/PixiParser.Skia/Encoders/QoiEncoder.Netstandard.cs @@ -1,4 +1,5 @@ -using System; +#if NETSTANDARD +using System; using Qoi.NetStandard; using SkiaSharp; @@ -24,3 +25,4 @@ public override byte[] Decode(byte[] encodedData, out SKImageInfo info) public override byte[] Decode(Span encodedData, out SKImageInfo info) => Decode(encodedData.ToArray(), out info); } +#endif diff --git a/src/PixiParser.Skia/PixiParser.Skia.csproj b/src/PixiParser.Skia/PixiParser.Skia.csproj index f37397c..0a0d84c 100644 --- a/src/PixiParser.Skia/PixiParser.Skia.csproj +++ b/src/PixiParser.Skia/PixiParser.Skia.csproj @@ -24,6 +24,13 @@ + + + + + + +