From a0031abfd4229e0f430509d00f9c4b90dd37f927 Mon Sep 17 00:00:00 2001 From: Nominom Date: Fri, 1 May 2020 10:30:24 +0300 Subject: [PATCH 001/116] Removed some unecessary code. --- .../Shared/BinaryReaderWriterExtensions.cs | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs b/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs index 862980f..ebdf410 100644 --- a/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs +++ b/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs @@ -42,28 +42,5 @@ public static void SkipPadding(this BinaryReader br, uint padding) public static void SkipPadding(this BinaryReader br, int padding) => SkipPadding(br, (uint) padding); - - public static void WriteString(this BinaryWriter writer, string input, Encoding encoding = null) { - encoding ??= Encoding.UTF8; - - var inputSpan = input.AsSpan(); - int inputByteCount = encoding.GetByteCount(input); - Span inputBytes = stackalloc byte[inputByteCount]; - - encoding.GetBytes(inputSpan, inputBytes); - - writer.Write(inputByteCount); - writer.Write(inputBytes); - } - - public static string ReadString(this BinaryReader reader, Encoding encoding = null) { - encoding ??= Encoding.UTF8; - - int byteCount = reader.ReadInt32(); - Span bytes = stackalloc byte[byteCount]; - reader.Read(bytes); - - return encoding.GetString(bytes); - } } } \ No newline at end of file From 6d6aa6f370aa69109fbe2317e5aab6b3450e21de Mon Sep 17 00:00:00 2001 From: Nominom Date: Sun, 24 May 2020 12:50:19 +0300 Subject: [PATCH 002/116] Version 1.2.2 --- BCnEnc.Net/BCnEncoder.csproj | 4 +- BCnEnc.Net/Encoder/Bc1BlockEncoder.cs | 20 +++--- BCnEnc.Net/Encoder/Bc2BlockEncoder.cs | 10 +-- BCnEnc.Net/Encoder/Bc3BlockEncoder.cs | 10 +-- BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 10 +-- BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 10 +-- BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs | 10 +-- BCnEnc.Net/Encoder/BcEncoder.cs | 4 +- ...codingQuality.cs => CompressionQuality.cs} | 6 +- BCnEnc.Net/Encoder/IBcBlockEncoder.cs | 2 +- BCnEncTests/DdsWritingTests.cs | 16 ++--- BCnEncTests/EncodingTest.cs | 64 +++++++++---------- BCnEncTests/TestHelper.cs | 4 +- README.md | 3 +- 14 files changed, 87 insertions(+), 86 deletions(-) rename BCnEnc.Net/Encoder/{EncodingQuality.cs => CompressionQuality.cs} (57%) diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index dc6a69f..624a44d 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -12,7 +12,7 @@ MIT OR Unlicense false - 1.2.1 + 1.2.2 Nominom BCnEncoder.Net @@ -31,7 +31,7 @@ Supported formats are: git BCn BC BC1 BC2 BC3 BC4 BC5 BC7 BPTC RGTC S3TC DXT1 DXT3 DXT5 ktx dds texture compression encoding decoding decompression image gpu https://github.com/Nominom/BCnEncoder.NET - Added xml documentation to nuget. + Changed EncodingQuality to CompressionQuality. diff --git a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs index 2763d89..0a0c95d 100644 --- a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs @@ -8,7 +8,7 @@ namespace BCnEncoder.Encoder internal class Bc1BlockEncoder : IBcBlockEncoder { - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, EncodingQuality quality, bool parallel) + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; Span outputBlocks = MemoryMarshal.Cast(outputData); @@ -32,15 +32,15 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight return outputData; } - private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, EncodingQuality quality) + private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { - case EncodingQuality.Fast: + case CompressionQuality.Fast: return Bc1BlockEncoderFast.EncodeBlock(block); - case EncodingQuality.Balanced: + case CompressionQuality.Balanced: return Bc1BlockEncoderBalanced.EncodeBlock(block); - case EncodingQuality.BestQuality: + case CompressionQuality.BestQuality: return Bc1BlockEncoderSlow.EncodeBlock(block); default: @@ -242,7 +242,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) internal class Bc1AlphaBlockEncoder : IBcBlockEncoder { - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, EncodingQuality quality, bool parallel) + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; Span outputBlocks = MemoryMarshal.Cast(outputData); @@ -266,15 +266,15 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight return outputData; } - private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, EncodingQuality quality) + private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { - case EncodingQuality.Fast: + case CompressionQuality.Fast: return Bc1AlphaBlockEncoderFast.EncodeBlock(block); - case EncodingQuality.Balanced: + case CompressionQuality.Balanced: return Bc1AlphaBlockEncoderBalanced.EncodeBlock(block); - case EncodingQuality.BestQuality: + case CompressionQuality.BestQuality: return Bc1AlphaBlockEncoderSlow.EncodeBlock(block); default: diff --git a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs index 60d50dc..2820452 100644 --- a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs @@ -8,7 +8,7 @@ namespace BCnEncoder.Encoder internal class Bc2BlockEncoder : IBcBlockEncoder { - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, EncodingQuality quality, bool parallel) + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; Span outputBlocks = MemoryMarshal.Cast(outputData); @@ -32,15 +32,15 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight return outputData; } - private Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, EncodingQuality quality) + private Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { - case EncodingQuality.Fast: + case CompressionQuality.Fast: return Bc2BlockEncoderFast.EncodeBlock(block); - case EncodingQuality.Balanced: + case CompressionQuality.Balanced: return Bc2BlockEncoderBalanced.EncodeBlock(block); - case EncodingQuality.BestQuality: + case CompressionQuality.BestQuality: return Bc2BlockEncoderSlow.EncodeBlock(block); default: diff --git a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs index de10edd..5957da8 100644 --- a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs @@ -9,7 +9,7 @@ namespace BCnEncoder.Encoder internal class Bc3BlockEncoder : IBcBlockEncoder { - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, EncodingQuality quality, bool parallel) + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; Span outputBlocks = MemoryMarshal.Cast(outputData); @@ -33,15 +33,15 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight return outputData; } - private Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, EncodingQuality quality) + private Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { - case EncodingQuality.Fast: + case CompressionQuality.Fast: return Bc3BlockEncoderFast.EncodeBlock(block); - case EncodingQuality.Balanced: + case CompressionQuality.Balanced: return Bc3BlockEncoderBalanced.EncodeBlock(block); - case EncodingQuality.BestQuality: + case CompressionQuality.BestQuality: return Bc3BlockEncoderSlow.EncodeBlock(block); default: diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index 44d151b..456907d 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -13,7 +13,7 @@ public Bc4BlockEncoder(bool luminanceAsRed) { this.luminanceAsRed = luminanceAsRed; } - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, EncodingQuality quality, + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; Span outputBlocks = MemoryMarshal.Cast(outputData); @@ -33,7 +33,7 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight return outputData; } - private Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, EncodingQuality quality) { + private Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { Bc4Block output = new Bc4Block(); byte[] colors = new byte[16]; var pixels = block.AsSpan; @@ -46,11 +46,11 @@ private Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, EncodingQuality quality) { } } switch (quality) { - case EncodingQuality.Fast: + case CompressionQuality.Fast: return FindRedValues(output, colors, 3); - case EncodingQuality.Balanced: + case CompressionQuality.Balanced: return FindRedValues(output, colors, 4); - case EncodingQuality.BestQuality: + case CompressionQuality.BestQuality: return FindRedValues(output, colors, 8); default: diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index f091e5e..de1c28a 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -8,7 +8,7 @@ namespace BCnEncoder.Encoder { internal class Bc5BlockEncoder : IBcBlockEncoder { - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, EncodingQuality quality, bool parallel) + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; Span outputBlocks = MemoryMarshal.Cast(outputData); @@ -28,7 +28,7 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight return outputData; } - private Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, EncodingQuality quality) { + private Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { Bc5Block output = new Bc5Block(); byte[] reds = new byte[16]; byte[] greens = new byte[16]; @@ -41,15 +41,15 @@ private Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, EncodingQuality quality) { int variations = 0; int errorThreshold = 0; switch (quality) { - case EncodingQuality.Fast: + case CompressionQuality.Fast: variations = 3; errorThreshold = 5; break; - case EncodingQuality.Balanced: + case CompressionQuality.Balanced: variations = 5; errorThreshold = 1; break; - case EncodingQuality.BestQuality: + case CompressionQuality.BestQuality: variations = 8; errorThreshold = 0; break; diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs index 7ae7a7e..cde1c20 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs @@ -9,7 +9,7 @@ namespace BCnEncoder.Encoder.Bc7 internal class Bc7Encoder : IBcBlockEncoder { - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, EncodingQuality quality, bool parallel) + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; Span outputBlocks = MemoryMarshal.Cast(outputData); @@ -75,15 +75,15 @@ private static ClusterIndices4X4 CreateClusterIndexBlock(RawBlock4X4Rgba32 raw, } - private static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock, EncodingQuality quality) + private static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock, CompressionQuality quality) { switch (quality) { - case EncodingQuality.Fast: + case CompressionQuality.Fast: return Bc7EncoderFast.EncodeBlock(rawBlock); - case EncodingQuality.Balanced: + case CompressionQuality.Balanced: return Bc7EncoderBalanced.EncodeBlock(rawBlock); - case EncodingQuality.BestQuality: + case CompressionQuality.BestQuality: return Bc7EncoderBestQuality.EncodeBlock(rawBlock); default: throw new ArgumentOutOfRangeException(nameof(quality), quality, null); diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 9b55e7f..e8f8982 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -35,11 +35,11 @@ public class EncoderOutputOptions /// public CompressionFormat format = CompressionFormat.BC1; /// - /// The quality of the encoding. Use either fast or balanced for testing. + /// The quality of the compression. Use either fast or balanced for testing. /// Fast can be used for near real-time encoding for most algorithms. /// Use bestQuality when needed. Default is balanced. /// - public EncodingQuality quality = EncodingQuality.Balanced; + public CompressionQuality quality = CompressionQuality.Balanced; /// /// The output file format of the data. Either Ktx or Dds. /// Default is Ktx. diff --git a/BCnEnc.Net/Encoder/EncodingQuality.cs b/BCnEnc.Net/Encoder/CompressionQuality.cs similarity index 57% rename from BCnEnc.Net/Encoder/EncodingQuality.cs rename to BCnEnc.Net/Encoder/CompressionQuality.cs index 5af737a..b857a45 100644 --- a/BCnEnc.Net/Encoder/EncodingQuality.cs +++ b/BCnEnc.Net/Encoder/CompressionQuality.cs @@ -1,17 +1,17 @@ namespace BCnEncoder.Encoder { - public enum EncodingQuality + public enum CompressionQuality { /// /// Fast, but low quality. Especially bad with gradients. /// Fast, /// - /// Strikes a balance between speed and quality. Enough for most purposes. + /// Strikes a balance between speed and quality. Good enough for most purposes. /// Balanced, /// - /// Aims for best quality encoding. Can be very slow at times. + /// Aims for best quality encoding. Can be very slow. /// BestQuality } diff --git a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs index c3eb246..1801c16 100644 --- a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs @@ -6,7 +6,7 @@ namespace BCnEncoder.Encoder { internal interface IBcBlockEncoder { - byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, EncodingQuality quality, bool parallel = true); + byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel = true); GlInternalFormat GetInternalFormat(); GLFormat GetBaseInternalFormat(); DXGI_FORMAT GetDxgiFormat(); diff --git a/BCnEncTests/DdsWritingTests.cs b/BCnEncTests/DdsWritingTests.cs index f4103c4..0037918 100644 --- a/BCnEncTests/DdsWritingTests.cs +++ b/BCnEncTests/DdsWritingTests.cs @@ -15,7 +15,7 @@ public void DdsWriteRgba() { var image = ImageLoader.testLenna; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = EncodingQuality.Fast; + encoder.OutputOptions.quality = CompressionQuality.Fast; encoder.OutputOptions.generateMipMaps = true; encoder.OutputOptions.format = CompressionFormat.RGBA; encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; @@ -30,7 +30,7 @@ public void DdsWriteBc1() { var image = ImageLoader.testLenna; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = EncodingQuality.Fast; + encoder.OutputOptions.quality = CompressionQuality.Fast; encoder.OutputOptions.generateMipMaps = true; encoder.OutputOptions.format = CompressionFormat.BC1; encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; @@ -45,7 +45,7 @@ public void DdsWriteBc2() { var image = ImageLoader.testAlpha1; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = EncodingQuality.Fast; + encoder.OutputOptions.quality = CompressionQuality.Fast; encoder.OutputOptions.generateMipMaps = true; encoder.OutputOptions.format = CompressionFormat.BC2; encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; @@ -60,7 +60,7 @@ public void DdsWriteBc3() { var image = ImageLoader.testAlpha1; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = EncodingQuality.Fast; + encoder.OutputOptions.quality = CompressionQuality.Fast; encoder.OutputOptions.generateMipMaps = true; encoder.OutputOptions.format = CompressionFormat.BC3; encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; @@ -75,7 +75,7 @@ public void DdsWriteBc4() { var image = ImageLoader.testHeight1; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = EncodingQuality.Fast; + encoder.OutputOptions.quality = CompressionQuality.Fast; encoder.OutputOptions.generateMipMaps = true; encoder.OutputOptions.format = CompressionFormat.BC4; encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; @@ -90,7 +90,7 @@ public void DdsWriteBc5() { var image = ImageLoader.testRedGreen1; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = EncodingQuality.Fast; + encoder.OutputOptions.quality = CompressionQuality.Fast; encoder.OutputOptions.generateMipMaps = true; encoder.OutputOptions.format = CompressionFormat.BC5; encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; @@ -105,7 +105,7 @@ public void DdsWriteBc7() { var image = ImageLoader.testLenna; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = EncodingQuality.Fast; + encoder.OutputOptions.quality = CompressionQuality.Fast; encoder.OutputOptions.generateMipMaps = true; encoder.OutputOptions.format = CompressionFormat.BC7; encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; @@ -120,7 +120,7 @@ public void DdsWriteCubemap() { var images = ImageLoader.testCubemap; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = EncodingQuality.Fast; + encoder.OutputOptions.quality = CompressionQuality.Fast; encoder.OutputOptions.generateMipMaps = true; encoder.OutputOptions.format = CompressionFormat.BC1; encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; diff --git a/BCnEncTests/EncodingTest.cs b/BCnEncTests/EncodingTest.cs index f00e31c..1cc3240 100644 --- a/BCnEncTests/EncodingTest.cs +++ b/BCnEncTests/EncodingTest.cs @@ -25,7 +25,7 @@ public void Bc1GradientBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc1_gradient_bestQuality.ktx", output); } @@ -38,7 +38,7 @@ public void Bc1GradientBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc1_gradient_balanced.ktx", output); } @@ -50,7 +50,7 @@ public void Bc1GradientFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc1_gradient_fast.ktx", output); } @@ -74,7 +74,7 @@ public void Bc1DiffuseBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc1_diffuse_bestQuality.ktx", output); } @@ -86,7 +86,7 @@ public void Bc1DiffuseBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc1_diffuse_balanced.ktx", output); } @@ -98,7 +98,7 @@ public void Bc1DiffuseFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc1_diffuse_fast.ktx", output); } @@ -123,7 +123,7 @@ public void Bc1BlurBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc1_blur_bestQuality.ktx", output); } @@ -135,7 +135,7 @@ public void Bc1BlurBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc1_blur_balanced.ktx", output); } @@ -147,7 +147,7 @@ public void Bc1BlurFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc1_blur_fast.ktx", output); } @@ -172,7 +172,7 @@ public void Bc1aSpriteBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1WithAlpha, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc1a_sprite_bestQuality.ktx", output); } @@ -184,7 +184,7 @@ public void Bc1aSpriteBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1WithAlpha, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc1a_sprite_balanced.ktx", output); } @@ -196,7 +196,7 @@ public void Bc1aSpriteFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC1WithAlpha, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc1a_sprite_fast.ktx", output); } @@ -221,7 +221,7 @@ public void Bc2GradientBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC2, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc2_gradient_bestQuality.ktx", output); } @@ -233,7 +233,7 @@ public void Bc2GradientBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC2, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc2_gradient_balanced.ktx", output); } @@ -245,7 +245,7 @@ public void Bc2GradientFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC2, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc2_gradient_fast.ktx", output); } @@ -270,7 +270,7 @@ public void Bc3GradientBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC3, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc3_gradient_bestQuality.ktx", output); } @@ -282,7 +282,7 @@ public void Bc3GradientBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC3, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc3_gradient_balanced.ktx", output); } @@ -294,7 +294,7 @@ public void Bc3GradientFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC3, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc3_gradient_fast.ktx", output); } @@ -319,7 +319,7 @@ public void Bc4RedBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC4, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc4_red_bestQuality.ktx", output); } @@ -331,7 +331,7 @@ public void Bc4RedBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC4, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc4_red_balanced.ktx", output); } @@ -343,7 +343,7 @@ public void Bc4RedFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC4, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc4_red_fast.ktx", output); } @@ -368,7 +368,7 @@ public void Bc5RedGreenBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC5, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc5_red_green_bestQuality.ktx", output); } @@ -380,7 +380,7 @@ public void Bc5RedGreenBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC5, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc5_red_green_balanced.ktx", output); } @@ -392,7 +392,7 @@ public void Bc5RedGreenFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC5, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc5_red_green_fast.ktx", output); } @@ -416,7 +416,7 @@ public void Bc7RgbBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC7, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc7_rgb_bestQuality.ktx", output); } @@ -428,7 +428,7 @@ public void Bc7RgbBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC7, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc7_rgb_balanced.ktx", output); } @@ -440,7 +440,7 @@ public void Bc7LennaBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC7, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc7_lenna_balanced.ktx", output); } @@ -452,7 +452,7 @@ public void Bc7RgbFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC7, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc7_rgb_fast.ktx", output); } @@ -476,7 +476,7 @@ public void Bc7RgbaBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC7, - EncodingQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc7_rgba_bestQuality.ktx", output); } @@ -488,7 +488,7 @@ public void Bc7RgbaBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC7, - EncodingQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc7_rgba_balanced.ktx", output); } @@ -500,7 +500,7 @@ public void Bc7RgbaFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.BC7, - EncodingQuality.Fast, + CompressionQuality.Fast, "encoding_bc7_rgba_fast.ktx", output); } @@ -517,7 +517,7 @@ public void WriteCubeMapFile() string filename = "encoding_bc1_cubemap.ktx"; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = EncodingQuality.Fast; + encoder.OutputOptions.quality = CompressionQuality.Fast; encoder.OutputOptions.generateMipMaps = true; encoder.OutputOptions.format = CompressionFormat.BC1; diff --git a/BCnEncTests/TestHelper.cs b/BCnEncTests/TestHelper.cs index c34e00c..42cf292 100644 --- a/BCnEncTests/TestHelper.cs +++ b/BCnEncTests/TestHelper.cs @@ -26,7 +26,7 @@ public static float DecodeCheckPSNR(string filename, Image original) { return ImageQuality.PeakSignalToNoiseRatio(pixels, pixels2, true); } - public static void ExecuteEncodingTest(Image image, CompressionFormat format, EncodingQuality quality, string filename, ITestOutputHelper output) { + public static void ExecuteEncodingTest(Image image, CompressionFormat format, CompressionQuality quality, string filename, ITestOutputHelper output) { BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.quality = quality; encoder.OutputOptions.generateMipMaps = true; @@ -37,7 +37,7 @@ public static void ExecuteEncodingTest(Image image, CompressionFormat fo fs.Close(); var psnr = TestHelper.DecodeCheckPSNR(filename, image); output.WriteLine("RGBA PSNR: " + psnr + "db"); - if(quality == EncodingQuality.Fast) + if(quality == CompressionQuality.Fast) { Assert.True(psnr > 25); } diff --git a/README.md b/README.md index 04c2c38..4da6e01 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Supported formats are: The current state of this library is in development but quite usable. I'm planning on implementing support for more codecs and different algorithms. The current version is capable of encoding and decoding BC1-BC5 and BC7 images in both KTX or DDS formats. +Please note, that the API might change between versions. I'm still trying to figure it out as I go. # Dependencies Current dependencies are: * [SixLabors.ImageSharp](https://github.com/SixLabors/ImageSharp) licenced under the [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) licence for image loading and saving @@ -34,7 +35,7 @@ using Image image = Image.Load("example.png"); BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.generateMipMaps = true; -encoder.OutputOptions.quality = EncodingQuality.Balanced; +encoder.OutputOptions.quality = CompressionQuality.Balanced; encoder.OutputOptions.format = CompressionFormat.BC1; encoder.OutputOptions.fileFormat = OutputFileFormat.Ktx; //Change to Dds for a dds file. From 281d3c8d357fe5b74e1487ac4f15de58caa68b15 Mon Sep 17 00:00:00 2001 From: Nominom Date: Tue, 20 Oct 2020 10:12:34 +0300 Subject: [PATCH 003/116] Upgraded ImageSharp dependency --- BCnEnc.Net/BCnEncoder.csproj | 6 ++--- BCnEnc.Net/Decoder/BcDecoder.cs | 16 +++++++++--- BCnEnc.Net/Encoder/BcEncoder.cs | 30 +++++++++++++++++----- BCnEnc.Net/Shared/ImageToBlocks.cs | 15 ++++++++--- BCnEncTests/BC1Tests.cs | 40 +++++++++++++++--------------- BCnEncTests/BlockTests.cs | 17 +++++++++---- BCnEncTests/ClusterTests.cs | 6 ++++- BCnEncTests/DdsReadTests.cs | 5 +++- BCnEncTests/TestHelper.cs | 9 +++++-- 9 files changed, 99 insertions(+), 45 deletions(-) diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index 624a44d..da61c8d 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -12,7 +12,7 @@ MIT OR Unlicense false - 1.2.2 + 1.2.3 Nominom BCnEncoder.Net @@ -31,7 +31,7 @@ Supported formats are: git BCn BC BC1 BC2 BC3 BC4 BC5 BC7 BPTC RGTC S3TC DXT1 DXT3 DXT5 ktx dds texture compression encoding decoding decompression image gpu https://github.com/Nominom/BCnEncoder.NET - Changed EncodingQuality to CompressionQuality. + Upgraded ImageSharp dependency from 1.0.0 beta 7 to version 1.0.1 @@ -44,7 +44,7 @@ Supported formats are: - + diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 2b50ee1..d768a85 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -260,7 +260,9 @@ public Image Decode(KtxFile file) var image = new Image((int)pixelWidth, (int)pixelHeight); var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); - var pixels = image.GetPixelSpan(); + if (!image.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } output.CopyTo(pixels); return image; @@ -299,7 +301,9 @@ public Image[] DecodeAllMipMaps(KtxFile file) var image = new Image((int)pixelWidth, (int)pixelHeight); var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); - var pixels = image.GetPixelSpan(); + if (!image.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } output.CopyTo(pixels); images[mip] = image; @@ -345,7 +349,9 @@ public Image Decode(DdsFile file) var image = new Image((int)pixelWidth, (int)pixelHeight); var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); - var pixels = image.GetPixelSpan(); + if (!image.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } output.CopyTo(pixels); return image; @@ -393,7 +399,9 @@ public Image[] DecodeAllMipMaps(DdsFile file) var image = new Image((int) pixelWidth, (int) pixelHeight); var output = decoder.Decode(data, (int) pixelWidth, (int) pixelHeight); - var pixels = image.GetPixelSpan(); + if (!image.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } output.CopyTo(pixels); images[mip] = image; diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index e8f8982..3424d55 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -189,7 +189,10 @@ public KtxFile EncodeToKtx(Image inputImage) } else { - encoded = uncompressedEncoder.Encode(mipChain[i].GetPixelSpan()); + if (!mipChain[i].TryGetSinglePixelSpan(out var mipPixels)) { + throw new Exception("Cannot get pixel span."); + } + encoded = uncompressedEncoder.Encode(mipPixels); } output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, @@ -264,7 +267,10 @@ public DdsFile EncodeToDds(Image inputImage) } else { - encoded = uncompressedEncoder.Encode(mipChain[mip].GetPixelSpan()); + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) { + throw new Exception("Cannot get pixel span."); + } + encoded = uncompressedEncoder.Encode(mipPixels); } if (mip == 0) @@ -334,7 +340,10 @@ public List EncodeToRawBytes(Image inputImage) } else { - encoded = uncompressedEncoder.Encode(mipChain[i].GetPixelSpan()); + if (!mipChain[i].TryGetSinglePixelSpan(out var mipPixels)) { + throw new Exception("Cannot get pixel span."); + } + encoded = uncompressedEncoder.Encode(mipPixels); } output.Add(encoded); @@ -400,7 +409,10 @@ public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int m } else { - encoded = uncompressedEncoder.Encode(mipChain[mipLevel].GetPixelSpan()); + if (!mipChain[mipLevel].TryGetSinglePixelSpan(out var mipPixels)) { + throw new Exception("Cannot get pixel span."); + } + encoded = uncompressedEncoder.Encode(mipPixels); } mipWidth = mipChain[mipLevel].Width; @@ -506,7 +518,10 @@ public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image } else { - encoded = uncompressedEncoder.Encode(mipChain[i].GetPixelSpan()); + if (!mipChain[i].TryGetSinglePixelSpan(out var mipPixels)) { + throw new Exception("Cannot get pixel span."); + } + encoded = uncompressedEncoder.Encode(mipPixels); } if (f == 0) @@ -603,7 +618,10 @@ public DdsFile EncodeCubeMapToDds(Image right, Image left, Image } else { - encoded = uncompressedEncoder.Encode(mipChain[mip].GetPixelSpan()); + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) { + throw new Exception("Cannot get pixel span."); + } + encoded = uncompressedEncoder.Encode(mipPixels); } if (mip == 0) diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 2285ebf..fb8b7bb 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -13,7 +13,10 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int blocksWidth = (int)MathF.Ceiling(image.Width / 4.0f); blocksHeight = (int)MathF.Ceiling(image.Height / 4.0f); RawBlock4X4Rgba32[] output = new RawBlock4X4Rgba32[blocksWidth * blocksHeight]; - Span pixels = image.GetPixelSpan(); + + if (!image.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } for (int y = 0; y < image.Height; y++) { @@ -75,7 +78,10 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, in internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) { Image output = new Image(pixelWidth, pixelHeight); - Span pixels = output.GetPixelSpan(); + + if (!output.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } for (int y = 0; y < output.Height; y++) { @@ -102,7 +108,10 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) { Image output = new Image(pixelWidth, pixelHeight); - Span pixels = output.GetPixelSpan(); + + if (!output.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } for (int y = 0; y < output.Height; y++) { diff --git a/BCnEncTests/BC1Tests.cs b/BCnEncTests/BC1Tests.cs index 189f9ac..77492f4 100644 --- a/BCnEncTests/BC1Tests.cs +++ b/BCnEncTests/BC1Tests.cs @@ -35,10 +35,10 @@ public void Decode() { block[15] = 0; var raw = block.Decode(false); - Assert.Equal(Rgba32.Black, raw.p00); - Assert.Equal(Rgba32.Black, raw.p10); - Assert.Equal(Rgba32.Black, raw.p20); - Assert.Equal(Rgba32.Black, raw.p30); + Assert.Equal(new Rgba32(0, 0, 0), raw.p00); + Assert.Equal(new Rgba32(0, 0, 0), raw.p10); + Assert.Equal(new Rgba32(0, 0, 0), raw.p20); + Assert.Equal(new Rgba32(0, 0, 0), raw.p30); Assert.Equal(new Rgba32(85, 85, 85), raw.p01); Assert.Equal(new Rgba32(85, 85, 85), raw.p11); @@ -50,10 +50,10 @@ public void Decode() { Assert.Equal(new Rgba32(170, 170, 170), raw.p22); Assert.Equal(new Rgba32(170, 170, 170), raw.p32); - Assert.Equal(Rgba32.White, raw.p03); - Assert.Equal(Rgba32.White, raw.p13); - Assert.Equal(Rgba32.White, raw.p23); - Assert.Equal(Rgba32.White, raw.p33); + Assert.Equal(new Rgba32(255, 255, 255), raw.p03); + Assert.Equal(new Rgba32(255, 255, 255), raw.p13); + Assert.Equal(new Rgba32(255, 255, 255), raw.p23); + Assert.Equal(new Rgba32(255, 255, 255), raw.p33); } [Fact] @@ -89,20 +89,20 @@ public void DecodeBlack() { Assert.Equal(new Rgba32(206, 203, 206), raw.p20); Assert.Equal(new Rgba32(206, 203, 206), raw.p30); - Assert.Equal(Rgba32.Black, raw.p01); - Assert.Equal(Rgba32.Black, raw.p11); - Assert.Equal(Rgba32.Black, raw.p21); - Assert.Equal(Rgba32.Black, raw.p31); + Assert.Equal(new Rgba32(0, 0, 0), raw.p01); + Assert.Equal(new Rgba32(0, 0, 0), raw.p11); + Assert.Equal(new Rgba32(0, 0, 0), raw.p21); + Assert.Equal(new Rgba32(0, 0, 0), raw.p31); Assert.Equal(new Rgba32(230, 228, 230), raw.p02); Assert.Equal(new Rgba32(230, 228, 230), raw.p12); Assert.Equal(new Rgba32(230, 228, 230), raw.p22); Assert.Equal(new Rgba32(230, 228, 230), raw.p32); - Assert.Equal(Rgba32.White, raw.p03); - Assert.Equal(Rgba32.White, raw.p13); - Assert.Equal(Rgba32.White, raw.p23); - Assert.Equal(Rgba32.White, raw.p33); + Assert.Equal(new Rgba32(255, 255, 255), raw.p03); + Assert.Equal(new Rgba32(255, 255, 255), raw.p13); + Assert.Equal(new Rgba32(255, 255, 255), raw.p23); + Assert.Equal(new Rgba32(255, 255, 255), raw.p33); } [Fact] @@ -148,10 +148,10 @@ public void DecodeAlpha() { Assert.Equal(new Rgba32(230, 228, 230), raw.p22); Assert.Equal(new Rgba32(230, 228, 230), raw.p32); - Assert.Equal(Rgba32.White, raw.p03); - Assert.Equal(Rgba32.White, raw.p13); - Assert.Equal(Rgba32.White, raw.p23); - Assert.Equal(Rgba32.White, raw.p33); + Assert.Equal(new Rgba32(255, 255, 255), raw.p03); + Assert.Equal(new Rgba32(255, 255, 255), raw.p13); + Assert.Equal(new Rgba32(255, 255, 255), raw.p23); + Assert.Equal(new Rgba32(255, 255, 255), raw.p33); } } diff --git a/BCnEncTests/BlockTests.cs b/BCnEncTests/BlockTests.cs index 7cfd6e1..2213ed6 100644 --- a/BCnEncTests/BlockTests.cs +++ b/BCnEncTests/BlockTests.cs @@ -38,9 +38,11 @@ public void PaddingColor() { using Image testImage = new Image(13, 13); - var pixels = testImage.GetPixelSpan(); + if (!testImage.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } for (int i = 0; i < pixels.Length; i++) { - pixels[i] = Rgba32.Aquamarine; + pixels[i] = new Rgba32(0, 125, 125); } var blocks = ImageToBlocks.ImageTo4X4(testImage.Frames[0], out var blocksWidth, out var blocksHeight); @@ -52,7 +54,7 @@ public void PaddingColor() for (int x = 0; x < blocksWidth; x++) { for (int y = 0; y < blocksHeight; y++) { foreach (var color in blocks[x + y * blocksWidth].AsSpan) { - Assert.Equal(Rgba32.Aquamarine, color); + Assert.Equal(new Rgba32(0, 125, 125), color); } } } @@ -64,7 +66,9 @@ public void BlocksToImage() Random r = new Random(0); using Image testImage = new Image(16, 16); - var pixels = testImage.GetPixelSpan(); + if (!testImage.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } for (int i = 0; i < pixels.Length; i++) { pixels[i] = new Rgba32( (byte)r.Next(255), @@ -80,7 +84,10 @@ public void BlocksToImage() Assert.Equal(4, blocksHeight); using var output = ImageToBlocks.ImageFromRawBlocks(blocks, blocksWidth, blocksHeight); - var pixels2 = output.GetPixelSpan(); + + if (!output.TryGetSinglePixelSpan(out var pixels2)) { + throw new Exception("Cannot get pixel span."); + } Assert.Equal(pixels.Length, pixels2.Length); for (int i = 0; i < pixels.Length; i++) { diff --git a/BCnEncTests/ClusterTests.cs b/BCnEncTests/ClusterTests.cs index dbd5ab8..26e613c 100644 --- a/BCnEncTests/ClusterTests.cs +++ b/BCnEncTests/ClusterTests.cs @@ -16,7 +16,11 @@ public class ClusterTests [Fact] public void Clusterize() { using var testImage = ImageLoader.testBlur1.Clone(); - var pixels = testImage.GetPixelSpan(); + + if (!testImage.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } + int numClusters = (testImage.Width / 32) * (testImage.Height / 32); var clusters = LinearClustering.ClusterPixels(pixels, testImage.Width, testImage.Height, numClusters, 10, 10); diff --git a/BCnEncTests/DdsReadTests.cs b/BCnEncTests/DdsReadTests.cs index d1423ef..3e94ff2 100644 --- a/BCnEncTests/DdsReadTests.cs +++ b/BCnEncTests/DdsReadTests.cs @@ -70,7 +70,10 @@ public void ReadBc1a() { Assert.Equal((uint)image.Width, file.Header.dwWidth); Assert.Equal((uint)image.Height, file.Header.dwHeight); - Assert.Contains(image.GetPixelSpan().ToArray(), x => x.A == 0); + if (!image.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } + Assert.Contains(pixels.ToArray(), x => x.A == 0); using FileStream outFs = File.OpenWrite($"decoding_test_dds_bc1a.png"); image.SaveAsPng(outFs); diff --git a/BCnEncTests/TestHelper.cs b/BCnEncTests/TestHelper.cs index 42cf292..e99bbd2 100644 --- a/BCnEncTests/TestHelper.cs +++ b/BCnEncTests/TestHelper.cs @@ -20,8 +20,13 @@ public static float DecodeCheckPSNR(string filename, Image original) { var ktx = KtxFile.Load(fs); var decoder = new BcDecoder(); using var img = decoder.Decode(ktx); - var pixels = original.GetPixelSpan(); - var pixels2 = img.GetPixelSpan(); + + if (!original.TryGetSinglePixelSpan(out var pixels)) { + throw new Exception("Cannot get pixel span."); + } + if (!img.TryGetSinglePixelSpan(out var pixels2)) { + throw new Exception("Cannot get pixel span."); + } return ImageQuality.PeakSignalToNoiseRatio(pixels, pixels2, true); } From a96f735b411fd47249b9378f61ce7fafa2abbf20 Mon Sep 17 00:00:00 2001 From: Nominom <7089998+Nominom@users.noreply.github.com> Date: Wed, 25 Nov 2020 12:18:09 +0200 Subject: [PATCH 004/116] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4da6e01..cc6903a 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ image.SaveAsPng(outFs); - [x] BC7 / BPTC Encoding - [x] DDS file support - [x] Implement PCA to remove Accord.Statistics dependency +- [ ] BC6H HDR encoding - [ ] ETC / ETC2 Encoding? - [ ] Implement saving and loading basic image formats to remove ImageSharp dependency From d2c9db1a9c119add8d582d16ae916803b285ba71 Mon Sep 17 00:00:00 2001 From: Nominom <7089998+Nominom@users.noreply.github.com> Date: Wed, 25 Nov 2020 12:18:36 +0200 Subject: [PATCH 005/116] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cc6903a..6d87019 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ image.SaveAsPng(outFs); - [x] BC7 / BPTC Encoding - [x] DDS file support - [x] Implement PCA to remove Accord.Statistics dependency -- [ ] BC6H HDR encoding +- [ ] BC6H HDR Encoding - [ ] ETC / ETC2 Encoding? - [ ] Implement saving and loading basic image formats to remove ImageSharp dependency From 22c09a45c1c3ffe54154ab2c54b45336fdff15ae Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Sun, 10 Jan 2021 16:43:50 +0100 Subject: [PATCH 006/116] Remove code duplications in BcDecoder; Add more detailed summary to public methods in BcDecoder and BcEncoder; --- BCnEnc.Net/Decoder/BcDecoder.cs | 816 +++++------ .../Decoder/Options/DecoderInputOptions.cs | 13 + .../Decoder/Options/DecoderOutputOptions.cs | 11 + BCnEnc.Net/Encoder/BcEncoder.cs | 1270 ++++++++--------- .../Encoder/Options/EncoderInputOptions.cs | 11 + BCnEnc.Net/Encoder/Options/EncoderOptions.cs | 13 + .../Encoder/Options/EncoderOutputOptions.cs | 45 + BCnEnc.Net/Shared/CompressionFormat.cs | 134 +- 8 files changed, 1169 insertions(+), 1144 deletions(-) create mode 100644 BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs create mode 100644 BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs create mode 100644 BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs create mode 100644 BCnEnc.Net/Encoder/Options/EncoderOptions.cs create mode 100644 BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index d768a85..cff60dd 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -1,445 +1,397 @@ using System; using System.IO; using System.Text; +using BCnEncoder.Decoder.Options; using BCnEncoder.Shared; using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Decoder { - public class DecoderInputOptions { - /// - /// The DDS file format doesn't seem to have a standard for indicating whether a BC1 texture - /// includes 1bit of alpha. This option will assume that all Bc1 textures contain alpha. - /// If this option is false, but the dds header includes a DDPF_ALPHAPIXELS flag, alpha will be included. - /// Default is true. - /// - public bool ddsBc1ExpectAlpha = true; - } - - public class DecoderOutputOptions { - /// - /// If true, when decoding from a format that only includes a red channel, - /// output pixels will have all colors set to the same value (greyscale). Default is true. - /// - public bool redAsLuminance = true; - } - - /// + /// /// Decodes compressed files into Rgba format. /// public class BcDecoder - { - public DecoderOutputOptions OutputOptions { get; set; } = new DecoderOutputOptions(); - public DecoderInputOptions InputOptions { get; set; } = new DecoderInputOptions(); - - private bool IsSupportedRawFormat(GlInternalFormat format) - { - switch (format) - { - case GlInternalFormat.GL_R8: - case GlInternalFormat.GL_RG8: - case GlInternalFormat.GL_RGB8: - case GlInternalFormat.GL_RGBA8: - return true; - default: - return false; - } - } - - private bool IsSupportedRawFormat(DXGI_FORMAT format) - { - switch (format) - { - case DXGI_FORMAT.DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM: - return true; - default: - return false; - } - } - - private IBcBlockDecoder GetDecoder(GlInternalFormat format) - { - switch (format) - { - case GlInternalFormat.GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - return new Bc1NoAlphaDecoder(); - case GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - return new Bc1ADecoder(); - case GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - return new Bc2Decoder(); - case GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - return new Bc3Decoder(); - case GlInternalFormat.GL_COMPRESSED_RED_RGTC1_EXT: - return new Bc4Decoder(OutputOptions.redAsLuminance); - case GlInternalFormat.GL_COMPRESSED_RED_GREEN_RGTC2_EXT: - return new Bc5Decoder(); - case GlInternalFormat.GL_COMPRESSED_RGBA_BPTC_UNORM_ARB: - return new Bc7Decoder(); - // TODO: Not sure what to do with SRGB input. - case GlInternalFormat.GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB: - return new Bc7Decoder(); - default: - return null; - } - } - - private IBcBlockDecoder GetDecoder(DXGI_FORMAT format, DdsHeader header) - { - switch (format) - { - case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC1_TYPELESS: - if ((header.ddsPixelFormat.dwFlags & PixelFormatFlags.DDPF_ALPHAPIXELS) != 0) { - return new Bc1ADecoder(); - } - else if(InputOptions.ddsBc1ExpectAlpha){ - return new Bc1ADecoder(); - } - else { - return new Bc1NoAlphaDecoder(); - } - - case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC2_TYPELESS: - return new Bc2Decoder(); - case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC3_TYPELESS: - return new Bc3Decoder(); - case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC4_TYPELESS: - return new Bc4Decoder(OutputOptions.redAsLuminance); - case DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC5_SNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC5_TYPELESS: - return new Bc5Decoder(); - case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC7_TYPELESS: - return new Bc7Decoder(); - default: - return null; - } - } - - private IRawDecoder GetRawDecoder(GlInternalFormat format) - { - switch (format) - { - case GlInternalFormat.GL_R8: - return new RawRDecoder(OutputOptions.redAsLuminance); - case GlInternalFormat.GL_RG8: - return new RawRGDecoder(); - case GlInternalFormat.GL_RGB8: - return new RawRGBDecoder(); - case GlInternalFormat.GL_RGBA8: - return new RawRGBADecoder(); - default: - return null; - } - } - - private IRawDecoder GetRawDecoder(DXGI_FORMAT format) - { - switch (format) - { - case DXGI_FORMAT.DXGI_FORMAT_R8_UNORM: - return new RawRDecoder(OutputOptions.redAsLuminance); - case DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM: - return new RawRGDecoder(); - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM: - return new RawRGBADecoder(); - default: - return null; - } - } - - /// - /// Read a Ktx or a Dds file from a stream and decode it. - /// - public Image Decode(Stream inputStream) { - var position = inputStream.Position; - try { - if (inputStream is FileStream fs) { - var extension = Path.GetExtension(fs.Name).ToLower(); - if (extension == ".ktx") { - KtxFile file = KtxFile.Load(inputStream); - return Decode(file); - } - else if (extension == ".dds") { - DdsFile file = DdsFile.Load(inputStream); - return Decode(file); - } - } - - bool isDDS = false; - using (var br = new BinaryReader(inputStream, Encoding.UTF8, true)) { - var magic = br.ReadUInt32(); - if (magic == 0x20534444U) { - isDDS = true; - } - } - - inputStream.Seek(position, SeekOrigin.Begin); - - if (isDDS) { - DdsFile dds = DdsFile.Load(inputStream); - return Decode(dds); - } - else { - KtxFile ktx = KtxFile.Load(inputStream); - return Decode(ktx); - } - } - catch (Exception) { - inputStream.Seek(position, SeekOrigin.Begin); - throw; - } - } - - /// - /// Read a Ktx or a Dds file from a stream and decode it. - /// - public Image[] DecodeAllMipMaps(Stream inputStream) { - var position = inputStream.Position; - try { - if (inputStream is FileStream fs) { - var extension = Path.GetExtension(fs.Name).ToLower(); - if (extension == ".ktx") { - KtxFile file = KtxFile.Load(inputStream); - return DecodeAllMipMaps(file); - } - else if (extension == ".dds") { - DdsFile file = DdsFile.Load(inputStream); - return DecodeAllMipMaps(file); - } - } - - bool isDDS = false; - using (var br = new BinaryReader(inputStream, Encoding.UTF8, true)) { - var magic = br.ReadUInt32(); - if (magic == 0x20534444U) { - isDDS = true; - } - } - - inputStream.Seek(position, SeekOrigin.Begin); - - if (isDDS) { - DdsFile dds = DdsFile.Load(inputStream); - return DecodeAllMipMaps(dds); - } - else { - KtxFile ktx = KtxFile.Load(inputStream); - return DecodeAllMipMaps(ktx); - } - } - catch (Exception) { - inputStream.Seek(position, SeekOrigin.Begin); - throw; - } - } - - /// - /// Read a KtxFile and decode it. - /// - public Image Decode(KtxFile file) - { - if (IsSupportedRawFormat(file.Header.GlInternalFormat)) { - var decoder = GetRawDecoder(file.Header.GlInternalFormat); - var data = file.MipMaps[0].Faces[0].Data; - var pixelWidth = file.MipMaps[0].Width; - var pixelHeight = file.MipMaps[0].Height; - - var image = new Image((int)pixelWidth, (int)pixelHeight); - var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); - if (!image.TryGetSinglePixelSpan(out var pixels)) { - throw new Exception("Cannot get pixel span."); - } - - output.CopyTo(pixels); - return image; - } - else { - var decoder = GetDecoder(file.Header.GlInternalFormat); - if (decoder == null) - { - throw new NotSupportedException($"This format is not supported: {file.Header.GlInternalFormat}"); - } - - var data = file.MipMaps[0].Faces[0].Data; - var pixelWidth = file.MipMaps[0].Width; - var pixelHeight = file.MipMaps[0].Height; - - var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, out var blockWidth, out var blockHeight); - - return ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, - (int)pixelWidth, (int)pixelHeight); - } - } - - /// - /// Read a KtxFile and decode it. - /// - public Image[] DecodeAllMipMaps(KtxFile file) - { - if (IsSupportedRawFormat(file.Header.GlInternalFormat)) { - var decoder = GetRawDecoder(file.Header.GlInternalFormat); - var images = new Image[file.MipMaps.Count]; - - for (int mip = 0; mip < file.MipMaps.Count; mip++) { - var data = file.MipMaps[mip].Faces[0].Data; - var pixelWidth = file.MipMaps[mip].Width; - var pixelHeight = file.MipMaps[mip].Height; - - var image = new Image((int)pixelWidth, (int)pixelHeight); - var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); - if (!image.TryGetSinglePixelSpan(out var pixels)) { - throw new Exception("Cannot get pixel span."); - } - - output.CopyTo(pixels); - images[mip] = image; - } - - return images; - } - else { - var decoder = GetDecoder(file.Header.GlInternalFormat); - if (decoder == null) - { - throw new NotSupportedException($"This format is not supported: {file.Header.GlInternalFormat}"); - } - var images = new Image[file.MipMaps.Count]; - - for (int mip = 0; mip < file.MipMaps.Count; mip++) { - - var data = file.MipMaps[mip].Faces[0].Data; - var pixelWidth = file.MipMaps[mip].Width; - var pixelHeight = file.MipMaps[mip].Height; - - var blocks = decoder.Decode(data, (int) pixelWidth, (int) pixelHeight, out var blockWidth, - out var blockHeight); - - var image = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, - (int)pixelWidth, (int)pixelHeight); - images[mip] = image; - } - return images; - } - } - - /// - /// Read a DdsFile and decode it - /// - public Image Decode(DdsFile file) - { - if (IsSupportedRawFormat(file.Header.ddsPixelFormat.DxgiFormat)) { - var decoder = GetRawDecoder(file.Header.ddsPixelFormat.DxgiFormat); - var data = file.Faces[0].MipMaps[0].Data; - var pixelWidth = file.Faces[0].Width; - var pixelHeight = file.Faces[0].Height; - - var image = new Image((int)pixelWidth, (int)pixelHeight); - var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); - if (!image.TryGetSinglePixelSpan(out var pixels)) { - throw new Exception("Cannot get pixel span."); - } - - output.CopyTo(pixels); - return image; - } - else { - DXGI_FORMAT format = DXGI_FORMAT.DXGI_FORMAT_UNKNOWN; - if (file.Header.ddsPixelFormat.IsDxt10Format) { - format = file.Dxt10Header.dxgiFormat; - } - else { - format = file.Header.ddsPixelFormat.DxgiFormat; - } - IBcBlockDecoder decoder = GetDecoder(format, file.Header); - - if (decoder == null) - { - throw new NotSupportedException($"This format is not supported: {format}"); - } - - var data = file.Faces[0].MipMaps[0].Data; - var pixelWidth = file.Faces[0].Width; - var pixelHeight = file.Faces[0].Height; - - var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, out var blockWidth, out var blockHeight); - - return ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, - (int)pixelWidth, (int)pixelHeight); - } - } - - /// - /// Read a DdsFile and decode it - /// - public Image[] DecodeAllMipMaps(DdsFile file) - { - if (IsSupportedRawFormat(file.Header.ddsPixelFormat.DxgiFormat)) { - var decoder = GetRawDecoder(file.Header.ddsPixelFormat.DxgiFormat); - - var images = new Image[file.Header.dwMipMapCount]; - - for (int mip = 0; mip < file.Header.dwMipMapCount; mip++) { - var data = file.Faces[0].MipMaps[mip].Data; - var pixelWidth = file.Faces[0].MipMaps[mip].Width; - var pixelHeight = file.Faces[0].MipMaps[mip].Height; - - var image = new Image((int) pixelWidth, (int) pixelHeight); - var output = decoder.Decode(data, (int) pixelWidth, (int) pixelHeight); - if (!image.TryGetSinglePixelSpan(out var pixels)) { - throw new Exception("Cannot get pixel span."); - } - - output.CopyTo(pixels); - images[mip] = image; - } - return images; - } - else { - DXGI_FORMAT format = DXGI_FORMAT.DXGI_FORMAT_UNKNOWN; - if (file.Header.ddsPixelFormat.IsDxt10Format) { - format = file.Dxt10Header.dxgiFormat; - } - else { - format = file.Header.ddsPixelFormat.DxgiFormat; - } - IBcBlockDecoder decoder = GetDecoder(format, file.Header); - - if (decoder == null) - { - throw new NotSupportedException($"This format is not supported: {format}"); - } - var images = new Image[file.Header.dwMipMapCount]; - - for (int mip = 0; mip < file.Header.dwMipMapCount; mip++) { - var data = file.Faces[0].MipMaps[mip].Data; - var pixelWidth = file.Faces[0].MipMaps[mip].Width; - var pixelHeight = file.Faces[0].MipMaps[mip].Height; - - var blocks = decoder.Decode(data, (int) pixelWidth, (int) pixelHeight, out var blockWidth, - out var blockHeight); - - var image = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, - (int)pixelWidth, (int)pixelHeight); - - images[mip] = image; - } - - return images; - } - } - } + { + /// + /// The input options of the decoder. + /// + public DecoderInputOptions InputOptions { get; } = new DecoderInputOptions(); + + /// + /// The output options of the decoder. + /// + public DecoderOutputOptions OutputOptions { get; } = new DecoderOutputOptions(); + + /// + /// Read a Ktx or a Dds file from a stream and decode it. + /// + /// The stream containing a Ktx or Dds file. + /// The decoded Rgba32 image. + public Image Decode(Stream inputStream) + { + return Decode(inputStream, false)[0]; + } + + /// + /// Read a Ktx or a Dds file from a stream and decode it. + /// + /// The stream containing a Ktx or Dds file. + /// An array of decoded Rgba32 images. + public Image[] DecodeAllMipMaps(Stream inputStream) + { + return Decode(inputStream, true); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The decoded Rgba32 image. + public Image Decode(KtxFile file) + { + return Decode(file, false)[0]; + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// An array of decoded Rgba32 images. + public Image[] DecodeAllMipMaps(KtxFile file) + { + return Decode(file, true); + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The decoded Rgba32 image. + public Image Decode(DdsFile file) + { + return Decode(file, false)[0]; + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// An array of decoded Rgba32 images. + public Image[] DecodeAllMipMaps(DdsFile file) + { + return Decode(file, true); + } + + /// + /// Load a KTX or DDS file from a stream and extract either the main image or all mip maps. + /// + /// The input stream to decode. + /// If all mip maps or only the main image should be decoded. + /// An array of decoded Rgba32 images. + private Image[] Decode(Stream inputStream, bool allMipMaps) + { + var position = inputStream.Position; + try + { + // Detect if file is a KTX or DDS by file extension + if (inputStream is FileStream fs) + { + var extension = Path.GetExtension(fs.Name).ToLower(); + switch (extension) + { + case ".dds": + var ddsFile = DdsFile.Load(inputStream); + return Decode(ddsFile, allMipMaps); + + case ".file": + var ktxFile = KtxFile.Load(inputStream); + return Decode(ktxFile, allMipMaps); + } + } + + // Otherwise detect KTX or DDS by content of the stream + bool isDds; + using (var br = new BinaryReader(inputStream, Encoding.UTF8, true)) + { + var magic = br.ReadUInt32(); + isDds = magic == 0x20534444U; + } + + inputStream.Seek(position, SeekOrigin.Begin); + + if (isDds) + { + var dds = DdsFile.Load(inputStream); + return Decode(dds, allMipMaps); + } + + var ktx = KtxFile.Load(inputStream); + return Decode(ktx, allMipMaps); + } + catch (Exception) + { + inputStream.Seek(position, SeekOrigin.Begin); + throw; + } + } + + /// + /// Load a KTX file and extract either the main image or all mip maps. + /// + /// The Ktx file to decode. + /// If all mip maps or only the main image should be decoded. + /// An array of decoded Rgba32 images. + private Image[] Decode(KtxFile file, bool allMipMaps) + { + var images = new Image[file.MipMaps.Count]; + + if (IsSupportedRawFormat(file.Header.GlInternalFormat)) + { + var decoder = GetRawDecoder(file.Header.GlInternalFormat); + + var mipMaps = allMipMaps ? file.MipMaps.Count : 1; + for (var mip = 0; mip < mipMaps; mip++) + { + var data = file.MipMaps[mip].Faces[0].Data; + var pixelWidth = file.MipMaps[mip].Width; + var pixelHeight = file.MipMaps[mip].Height; + + var image = new Image((int)pixelWidth, (int)pixelHeight); + var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); + if (!image.TryGetSinglePixelSpan(out var pixels)) + throw new Exception("Cannot get pixel span."); + + output.CopyTo(pixels); + images[mip] = image; + } + } + else + { + var decoder = GetDecoder(file.Header.GlInternalFormat); + if (decoder == null) + throw new NotSupportedException($"This format is not supported: {file.Header.GlInternalFormat}"); + + var mipMaps = allMipMaps ? file.MipMaps.Count : 1; + for (var mip = 0; mip < mipMaps; mip++) + { + var data = file.MipMaps[mip].Faces[0].Data; + var pixelWidth = file.MipMaps[mip].Width; + var pixelHeight = file.MipMaps[mip].Height; + + var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, out var blockWidth, out var blockHeight); + + images[mip] = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, (int)pixelWidth, (int)pixelHeight); + } + } + + return images; + } + + /// + /// Load a DDS file and extract either the main image or all mip maps. + /// + /// The Dds file to decode. + /// If all mip maps or only the main image should be decoded. + /// An array of decoded Rgba32 images. + private Image[] Decode(DdsFile file, bool allMipMaps) + { + var images = new Image[file.Header.dwMipMapCount]; + + if (IsSupportedRawFormat(file.Header.ddsPixelFormat.DxgiFormat)) + { + var decoder = GetRawDecoder(file.Header.ddsPixelFormat.DxgiFormat); + + var mipMaps = allMipMaps ? file.Header.dwMipMapCount : 1; + for (var mip = 0; mip < mipMaps; mip++) + { + var data = file.Faces[0].MipMaps[mip].Data; + var pixelWidth = file.Faces[0].MipMaps[mip].Width; + var pixelHeight = file.Faces[0].MipMaps[mip].Height; + + var image = new Image((int)pixelWidth, (int)pixelHeight); + var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); + if (!image.TryGetSinglePixelSpan(out var pixels)) + throw new Exception("Cannot get pixel span."); + + output.CopyTo(pixels); + images[mip] = image; + } + } + else + { + var format = file.Header.ddsPixelFormat.IsDxt10Format ? + file.Dxt10Header.dxgiFormat : + file.Header.ddsPixelFormat.DxgiFormat; + var decoder = GetDecoder(format, file.Header); + + if (decoder == null) + throw new NotSupportedException($"This format is not supported: {format}"); + + for (var mip = 0; mip < file.Header.dwMipMapCount; mip++) + { + var data = file.Faces[0].MipMaps[mip].Data; + var pixelWidth = file.Faces[0].MipMaps[mip].Width; + var pixelHeight = file.Faces[0].MipMaps[mip].Height; + + var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, out var blockWidth, + out var blockHeight); + + var image = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, + (int)pixelWidth, (int)pixelHeight); + + images[mip] = image; + } + } + + return images; + } + + private bool IsSupportedRawFormat(GlInternalFormat format) + { + switch (format) + { + case GlInternalFormat.GL_R8: + case GlInternalFormat.GL_RG8: + case GlInternalFormat.GL_RGB8: + case GlInternalFormat.GL_RGBA8: + return true; + + default: + return false; + } + } + + private bool IsSupportedRawFormat(DXGI_FORMAT format) + { + switch (format) + { + case DXGI_FORMAT.DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM: + return true; + + default: + return false; + } + } + + private IBcBlockDecoder GetDecoder(GlInternalFormat format) + { + switch (format) + { + case GlInternalFormat.GL_COMPRESSED_RGB_S3TC_DXT1_EXT: + return new Bc1NoAlphaDecoder(); + + case GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + return new Bc1ADecoder(); + + case GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + return new Bc2Decoder(); + + case GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + return new Bc3Decoder(); + + case GlInternalFormat.GL_COMPRESSED_RED_RGTC1_EXT: + return new Bc4Decoder(OutputOptions.redAsLuminance); + + case GlInternalFormat.GL_COMPRESSED_RED_GREEN_RGTC2_EXT: + return new Bc5Decoder(); + + case GlInternalFormat.GL_COMPRESSED_RGBA_BPTC_UNORM_ARB: + return new Bc7Decoder(); + + // TODO: Not sure what to do with SRGB input. + case GlInternalFormat.GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB: + return new Bc7Decoder(); + + default: + return null; + } + } + + private IBcBlockDecoder GetDecoder(DXGI_FORMAT format, DdsHeader header) + { + switch (format) + { + case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT.DXGI_FORMAT_BC1_TYPELESS: + if ((header.ddsPixelFormat.dwFlags & PixelFormatFlags.DDPF_ALPHAPIXELS) != 0) + return new Bc1ADecoder(); + + if (InputOptions.ddsBc1ExpectAlpha) + return new Bc1ADecoder(); + + return new Bc1NoAlphaDecoder(); + + case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT.DXGI_FORMAT_BC2_TYPELESS: + return new Bc2Decoder(); + + case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT.DXGI_FORMAT_BC3_TYPELESS: + return new Bc3Decoder(); + + case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM: + case DXGI_FORMAT.DXGI_FORMAT_BC4_TYPELESS: + return new Bc4Decoder(OutputOptions.redAsLuminance); + + case DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT.DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT.DXGI_FORMAT_BC5_TYPELESS: + return new Bc5Decoder(); + + case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB: + case DXGI_FORMAT.DXGI_FORMAT_BC7_TYPELESS: + return new Bc7Decoder(); + + default: + return null; + } + } + + private IRawDecoder GetRawDecoder(GlInternalFormat format) + { + switch (format) + { + case GlInternalFormat.GL_R8: + return new RawRDecoder(OutputOptions.redAsLuminance); + + case GlInternalFormat.GL_RG8: + return new RawRGDecoder(); + + case GlInternalFormat.GL_RGB8: + return new RawRGBDecoder(); + + case GlInternalFormat.GL_RGBA8: + return new RawRGBADecoder(); + + default: + return null; + } + } + + private IRawDecoder GetRawDecoder(DXGI_FORMAT format) + { + switch (format) + { + case DXGI_FORMAT.DXGI_FORMAT_R8_UNORM: + return new RawRDecoder(OutputOptions.redAsLuminance); + + case DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM: + return new RawRGDecoder(); + + case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM: + return new RawRGBADecoder(); + + default: + return null; + } + } + } } diff --git a/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs new file mode 100644 index 0000000..9529ab4 --- /dev/null +++ b/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs @@ -0,0 +1,13 @@ +namespace BCnEncoder.Decoder.Options +{ + public class DecoderInputOptions + { + /// + /// The DDS file format doesn't seem to have a standard for indicating whether a BC1 texture + /// includes 1bit of alpha. This option will assume that all Bc1 textures contain alpha. + /// If this option is false, but the dds header includes a DDPF_ALPHAPIXELS flag, alpha will be included. + /// Default is true. + /// + public bool ddsBc1ExpectAlpha = true; + } +} diff --git a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs new file mode 100644 index 0000000..a0a8299 --- /dev/null +++ b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs @@ -0,0 +1,11 @@ +namespace BCnEncoder.Decoder.Options +{ + public class DecoderOutputOptions + { + /// + /// If true, when decoding from a format that only includes a red channel, + /// output pixels will have all colors set to the same value (greyscale). Default is true. + /// + public bool redAsLuminance = true; + } +} diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 3424d55..6446af2 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -3,659 +3,637 @@ using System.Diagnostics; using System.IO; using BCnEncoder.Encoder.Bc7; +using BCnEncoder.Encoder.Options; using BCnEncoder.Shared; using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Encoder { - public class EncoderInputOptions - { - /// - /// If true, when encoding to a format that only includes a red channel, - /// use the pixel luminance instead of just the red channel. Default is false. - /// - public bool luminanceAsRed = false; - } - - public class EncoderOutputOptions - { - /// - /// Whether to generate mipMaps. Default is true. - /// - public bool generateMipMaps = true; - /// - /// The maximum number of mipmap levels to generate. -1 or 0 is unbounded. - /// Default is -1. - /// - public int maxMipMapLevel = -1; - /// - /// The compression format to use. Default is BC1. - /// - public CompressionFormat format = CompressionFormat.BC1; - /// - /// The quality of the compression. Use either fast or balanced for testing. - /// Fast can be used for near real-time encoding for most algorithms. - /// Use bestQuality when needed. Default is balanced. - /// - public CompressionQuality quality = CompressionQuality.Balanced; - /// - /// The output file format of the data. Either Ktx or Dds. - /// Default is Ktx. - /// - public OutputFileFormat fileFormat = OutputFileFormat.Ktx; - /// - /// The DDS file format doesn't seem to have a standard for indicating whether a BC1 texture - /// includes 1bit of alpha. This option will write DDPF_ALPHAPIXELS flag to the header - /// to indicate the presence of an alpha channel. Some programs read and write this flag, - /// but some programs don't like it and get confused. Your mileage may vary. - /// Default is false. - /// - public bool ddsBc1WriteAlphaFlag = false; - } - - public class EncoderOptions { - /// - /// Whether the blocks should be encoded in parallel. This can be much faster than single-threaded encoding, - /// but is slow if multiple textures are being processed at the same time. - /// When a debugger is attached, the encoder defaults to single-threaded operation to ease debugging. - /// Default is true. - /// - public bool multiThreaded = true; - } - - /// + /// /// Handles all encoding of images into compressed or uncompressed formats. For decoding, /// public class BcEncoder - { - public EncoderInputOptions InputOptions { get; set; } = new EncoderInputOptions(); - public EncoderOutputOptions OutputOptions { get; set; } = new EncoderOutputOptions(); - public EncoderOptions Options { get; set; } = new EncoderOptions(); - - public BcEncoder() { } - public BcEncoder(CompressionFormat format) - { - OutputOptions.format = format; - } - - private IBcBlockEncoder GetEncoder(CompressionFormat format) - { - switch (format) - { - case CompressionFormat.BC1: - return new Bc1BlockEncoder(); - case CompressionFormat.BC1WithAlpha: - return new Bc1AlphaBlockEncoder(); - case CompressionFormat.BC2: - return new Bc2BlockEncoder(); - case CompressionFormat.BC3: - return new Bc3BlockEncoder(); - case CompressionFormat.BC4: - return new Bc4BlockEncoder(InputOptions.luminanceAsRed); - case CompressionFormat.BC5: - return new Bc5BlockEncoder(); - case CompressionFormat.BC7: - return new Bc7Encoder(); - default: - return null; - } - } - - private IRawEncoder GetRawEncoder(CompressionFormat format) - { - switch (format) - { - case CompressionFormat.R: - return new RawLuminanceEncoder(InputOptions.luminanceAsRed); - case CompressionFormat.RG: - return new RawRGEncoder(); - case CompressionFormat.RGB: - return new RawRGBEncoder(); - case CompressionFormat.RGBA: - return new RawRGBAEncoder(); - default: - throw new ArgumentOutOfRangeException(nameof(format), format, null); - } - } - - /// - /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. - /// - public void Encode(Image inputImage, Stream outputStream) - { - if (OutputOptions.fileFormat == OutputFileFormat.Ktx) - { - KtxFile output = EncodeToKtx(inputImage); - output.Write(outputStream); - } - else if (OutputOptions.fileFormat == OutputFileFormat.Dds) - { - DdsFile output = EncodeToDds(inputImage); - output.Write(outputStream); - } - } - - /// - /// Encodes all mipmap levels into a Ktx file. - /// - public KtxFile EncodeToKtx(Image inputImage) - { - KtxFile output; - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - if (OutputOptions.format.IsCompressedFormat()) - { - compressedEncoder = GetEncoder(OutputOptions.format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); - } - output = new KtxFile( - KtxHeader.InitializeCompressed(inputImage.Width, inputImage.Height, - compressedEncoder.GetInternalFormat(), - compressedEncoder.GetBaseInternalFormat())); - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); - output = new KtxFile( - KtxHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, - uncompressedEncoder.GetGlType(), - uncompressedEncoder.GetGlFormat(), - uncompressedEncoder.GetGlTypeSize(), - uncompressedEncoder.GetInternalFormat(), - uncompressedEncoder.GetBaseInternalFormat())); - - } - - uint numMipMaps = (uint)OutputOptions.maxMipMapLevel; - if (!OutputOptions.generateMipMaps) - { - numMipMaps = 1; - } - - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - for (int i = 0; i < numMipMaps; i++) - { - byte[] encoded = null; - if (OutputOptions.format.IsCompressedFormat()) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[i].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, - !Debugger.IsAttached && Options.multiThreaded); - } - else - { - if (!mipChain[i].TryGetSinglePixelSpan(out var mipPixels)) { - throw new Exception("Cannot get pixel span."); - } - encoded = uncompressedEncoder.Encode(mipPixels); - } - - output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, - (uint)inputImage.Width, - (uint)inputImage.Height, 1)); - output.MipMaps[i].Faces[0] = new KtxMipFace(encoded, - (uint)inputImage.Width, - (uint)inputImage.Height); - } - - foreach (var image in mipChain) - { - image.Dispose(); - } - - output.Header.NumberOfFaces = 1; - output.Header.NumberOfMipmapLevels = numMipMaps; - - return output; - } - - /// - /// Encodes all mipmap levels into a Ktx file. - /// - public DdsFile EncodeToDds(Image inputImage) - { - DdsFile output; - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - if (OutputOptions.format.IsCompressedFormat()) - { - compressedEncoder = GetEncoder(OutputOptions.format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); - } - - var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(inputImage.Width, inputImage.Height, - compressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader, dxt10Header); - - if (OutputOptions.ddsBc1WriteAlphaFlag && - OutputOptions.format == CompressionFormat.BC1WithAlpha) - { - output.Header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DDPF_ALPHAPIXELS; - } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); - var ddsHeader = DdsHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, - uncompressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader); - } - - uint numMipMaps = (uint)OutputOptions.maxMipMapLevel; - if (!OutputOptions.generateMipMaps) - { - numMipMaps = 1; - } - - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - for (int mip = 0; mip < numMipMaps; mip++) - { - byte[] encoded = null; - if (OutputOptions.format.IsCompressedFormat()) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, - !Debugger.IsAttached && Options.multiThreaded); - } - else - { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) { - throw new Exception("Cannot get pixel span."); - } - encoded = uncompressedEncoder.Encode(mipPixels); - } - - if (mip == 0) - { - output.Faces.Add(new DdsFace((uint)inputImage.Width, (uint)inputImage.Height, - (uint)encoded.Length, (int)numMipMaps)); - } - - output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, - (uint)inputImage.Width, - (uint)inputImage.Height); - } - - foreach (var image in mipChain) - { - image.Dispose(); - } - - output.Header.dwMipMapCount = numMipMaps; - if (numMipMaps > 1) - { - output.Header.dwCaps |= HeaderCaps.DDSCAPS_COMPLEX | HeaderCaps.DDSCAPS_MIPMAP; - } - - return output; - } - - /// - /// Encodes all mipmap levels into a list of byte buffers. - /// - public List EncodeToRawBytes(Image inputImage) - { - List output = new List(); - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - if (OutputOptions.format.IsCompressedFormat()) - { - compressedEncoder = GetEncoder(OutputOptions.format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); - } - - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); - - } - - uint numMipMaps = (uint)OutputOptions.maxMipMapLevel; - if (!OutputOptions.generateMipMaps) - { - numMipMaps = 1; - } - - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - for (int i = 0; i < numMipMaps; i++) - { - byte[] encoded = null; - if (OutputOptions.format.IsCompressedFormat()) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[i].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, - !Debugger.IsAttached && Options.multiThreaded); - } - else - { - if (!mipChain[i].TryGetSinglePixelSpan(out var mipPixels)) { - throw new Exception("Cannot get pixel span."); - } - encoded = uncompressedEncoder.Encode(mipPixels); - } - - output.Add(encoded); - } - - foreach (var image in mipChain) - { - image.Dispose(); - } - - return output; - } - - /// - /// Encodes a single mip level of the input image to a byte buffer. - /// - public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) - { - if (mipLevel < 0) - { - throw new ArgumentException($"{nameof(mipLevel)} cannot be less than zero."); - } - - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - if (OutputOptions.format.IsCompressedFormat()) - { - compressedEncoder = GetEncoder(OutputOptions.format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); - } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); - - } - - uint numMipMaps = (uint)OutputOptions.maxMipMapLevel; - if (!OutputOptions.generateMipMaps) - { - numMipMaps = 1; - } - - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - if (mipLevel > numMipMaps - 1) - { - foreach (var image in mipChain) - { - image.Dispose(); - } - throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps"); - } - - byte[] encoded = null; - if (OutputOptions.format.IsCompressedFormat()) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, - !Debugger.IsAttached && Options.multiThreaded); - } - else - { - if (!mipChain[mipLevel].TryGetSinglePixelSpan(out var mipPixels)) { - throw new Exception("Cannot get pixel span."); - } - encoded = uncompressedEncoder.Encode(mipPixels); - } - - mipWidth = mipChain[mipLevel].Width; - mipHeight = mipChain[mipLevel].Height; - - foreach (var image in mipChain) - { - image.Dispose(); - } - - return encoded; - } - - /// - /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream. - /// Order is +X, -X, +Y, -Y, +Z, -Z - /// - public void EncodeCubeMap(Image right, Image left, Image top, Image down, - Image back, Image front, Stream outputStream) - { - if (OutputOptions.fileFormat == OutputFileFormat.Ktx) - { - KtxFile output = EncodeCubeMapToKtx(right, left, top, down, back, front); - output.Write(outputStream); - } - else if (OutputOptions.fileFormat == OutputFileFormat.Dds) - { - DdsFile output = EncodeCubeMapToDds(right, left, top, down, back, front); - output.Write(outputStream); - } - } - - /// - /// Encodes all cubemap faces and mipmap levels into a Ktx file. - /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. - /// - public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image top, Image down, - Image back, Image front) - { - KtxFile output; - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - - if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width - || right.Width != back.Width || right.Width != front.Width || - right.Height != left.Height || right.Height != top.Height || right.Height != down.Height - || right.Height != back.Height || right.Height != front.Height) - { - throw new ArgumentException("All input images of a cubemap should be the same size."); - } - - Image[] faces = new[] { right, left, top, down, back, front }; - - if (OutputOptions.format.IsCompressedFormat()) - { - compressedEncoder = GetEncoder(OutputOptions.format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); - } - output = new KtxFile( - KtxHeader.InitializeCompressed(right.Width, right.Height, - compressedEncoder.GetInternalFormat(), - compressedEncoder.GetBaseInternalFormat())); - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); - output = new KtxFile( - KtxHeader.InitializeUncompressed(right.Width, right.Height, - uncompressedEncoder.GetGlType(), - uncompressedEncoder.GetGlFormat(), - uncompressedEncoder.GetGlTypeSize(), - uncompressedEncoder.GetInternalFormat(), - uncompressedEncoder.GetBaseInternalFormat())); - - } - uint numMipMaps = (uint)OutputOptions.maxMipMapLevel; - if (!OutputOptions.generateMipMaps) - { - numMipMaps = 1; - } - - uint mipLength = MipMapper.CalculateMipChainLength(right.Width, right.Height, numMipMaps); - for (uint i = 0; i < mipLength; i++) - { - output.MipMaps.Add(new KtxMipmap(0, 0, 0, (uint)faces.Length)); - } - - for (int f = 0; f < faces.Length; f++) - { - - var mipChain = MipMapper.GenerateMipChain(faces[f], ref numMipMaps); - - for (int i = 0; i < numMipMaps; i++) - { - byte[] encoded = null; - if (OutputOptions.format.IsCompressedFormat()) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[i].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, - !Debugger.IsAttached && Options.multiThreaded); - } - else - { - if (!mipChain[i].TryGetSinglePixelSpan(out var mipPixels)) { - throw new Exception("Cannot get pixel span."); - } - encoded = uncompressedEncoder.Encode(mipPixels); - } - - if (f == 0) - { - output.MipMaps[i] = new KtxMipmap((uint)encoded.Length, - (uint)mipChain[i].Width, - (uint)mipChain[i].Height, (uint)faces.Length); - } - - output.MipMaps[i].Faces[f] = new KtxMipFace(encoded, - (uint)mipChain[i].Width, - (uint)mipChain[i].Height); - } - - foreach (var image in mipChain) - { - image.Dispose(); - } - } - - output.Header.NumberOfFaces = (uint)faces.Length; - output.Header.NumberOfMipmapLevels = mipLength; - - return output; - } - - /// - /// Encodes all cubemap faces and mipmap levels into a Dds file. - /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. - /// - public DdsFile EncodeCubeMapToDds(Image right, Image left, Image top, Image down, - Image back, Image front) - { - DdsFile output; - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - - if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width - || right.Width != back.Width || right.Width != front.Width || - right.Height != left.Height || right.Height != top.Height || right.Height != down.Height - || right.Height != back.Height || right.Height != front.Height) - { - throw new ArgumentException("All input images of a cubemap should be the same size."); - } - - Image[] faces = new[] { right, left, top, down, back, front }; - - if (OutputOptions.format.IsCompressedFormat()) - { - compressedEncoder = GetEncoder(OutputOptions.format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); - } - - var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(right.Width, right.Height, - compressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader, dxt10Header); - - if (OutputOptions.ddsBc1WriteAlphaFlag && - OutputOptions.format == CompressionFormat.BC1WithAlpha) - { - output.Header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DDPF_ALPHAPIXELS; - } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); - var ddsHeader = DdsHeader.InitializeUncompressed(right.Width, right.Height, - uncompressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader); - } - - uint numMipMaps = (uint)OutputOptions.maxMipMapLevel; - if (!OutputOptions.generateMipMaps) - { - numMipMaps = 1; - } - - for (int f = 0; f < faces.Length; f++) - { - - var mipChain = MipMapper.GenerateMipChain(faces[f], ref numMipMaps); - - - for (int mip = 0; mip < numMipMaps; mip++) - { - byte[] encoded = null; - if (OutputOptions.format.IsCompressedFormat()) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, - !Debugger.IsAttached && Options.multiThreaded); - } - else - { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) { - throw new Exception("Cannot get pixel span."); - } - encoded = uncompressedEncoder.Encode(mipPixels); - } - - if (mip == 0) - { - output.Faces.Add(new DdsFace((uint)mipChain[mip].Width, (uint)mipChain[mip].Height, - (uint)encoded.Length, mipChain.Count)); - } - - output.Faces[f].MipMaps[mip] = new DdsMipMap(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); - } - - foreach (var image in mipChain) - { - image.Dispose(); - } - } - - output.Header.dwCaps |= HeaderCaps.DDSCAPS_COMPLEX; - output.Header.dwMipMapCount = numMipMaps; - if (numMipMaps > 1) - { - output.Header.dwCaps |= HeaderCaps.DDSCAPS_MIPMAP; - } - output.Header.dwCaps2 |= HeaderCaps2.DDSCAPS2_CUBEMAP | - HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEX | - HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEX | - HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEY | - HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEY | - HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEZ | - HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEZ; - - return output; - } - } + { + /// + /// The input options of the encoder. + /// + public EncoderInputOptions InputOptions { get; } = new EncoderInputOptions(); + + /// + /// The output options of the encoder. + /// + public EncoderOutputOptions OutputOptions { get; } = new EncoderOutputOptions(); + + /// + /// The encoder options. + /// + public EncoderOptions Options { get; } = new EncoderOptions(); + + /// + /// Creates a new instance of . + /// + /// The block compression format to encode an image with. + public BcEncoder(CompressionFormat format = CompressionFormat.BC1) + { + OutputOptions.format = format; + } + + /// + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. + /// + /// The image to encode. + /// The stream to write the encoded image to. + public void Encode(Image inputImage, Stream outputStream) + { + switch (OutputOptions.fileFormat) + { + case OutputFileFormat.Dds: + var dds = EncodeToDds(inputImage); + dds.Write(outputStream); + break; + + case OutputFileFormat.Ktx: + var ktx = EncodeToKtx(inputImage); + ktx.Write(outputStream); + break; + } + } + + /// + /// Encodes all mipmap levels into a Ktx file. + /// + /// The image to encode. + /// The Ktx file containing the encoded image. + public KtxFile EncodeToKtx(Image inputImage) + { + KtxFile output; + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + + // Setup encoders + var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.format); + if (compressedEncoder == null) + throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + + output = new KtxFile( + KtxHeader.InitializeCompressed(inputImage.Width, inputImage.Height, + compressedEncoder.GetInternalFormat(), + compressedEncoder.GetBaseInternalFormat())); + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.format); + output = new KtxFile( + KtxHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, + uncompressedEncoder.GetGlType(), + uncompressedEncoder.GetGlFormat(), + uncompressedEncoder.GetGlTypeSize(), + uncompressedEncoder.GetInternalFormat(), + uncompressedEncoder.GetBaseInternalFormat())); + } + + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + !Debugger.IsAttached && Options.multiThreaded); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + throw new Exception("Cannot get pixel span."); + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, + (uint)inputImage.Width, + (uint)inputImage.Height, 1)); + output.MipMaps[mip].Faces[0] = new KtxMipFace(encoded, + (uint)inputImage.Width, + (uint)inputImage.Height); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + image.Dispose(); + + output.Header.NumberOfFaces = 1; + output.Header.NumberOfMipmapLevels = numMipMaps; + + return output; + } + + /// + /// Encodes all mipmap levels into a Dds file. + /// + /// The image to encode. + /// The Dds file containing the encoded image. + public DdsFile EncodeToDds(Image inputImage) + { + DdsFile output; + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + + // Setup encoder + var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.format); + if (compressedEncoder == null) + throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(inputImage.Width, inputImage.Height, + compressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader, dxt10Header); + + if (OutputOptions.ddsBc1WriteAlphaFlag && + OutputOptions.format == CompressionFormat.BC1WithAlpha) + { + output.Header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DDPF_ALPHAPIXELS; + } + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.format); + var ddsHeader = DdsHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, + uncompressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader); + } + + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + !Debugger.IsAttached && Options.multiThreaded); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + throw new Exception("Cannot get pixel span."); + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + if (mip == 0) + { + output.Faces.Add(new DdsFace((uint)inputImage.Width, (uint)inputImage.Height, + (uint)encoded.Length, (int)numMipMaps)); + } + + output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, + (uint)inputImage.Width, + (uint)inputImage.Height); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + image.Dispose(); + + output.Header.dwMipMapCount = numMipMaps; + if (numMipMaps > 1) + output.Header.dwCaps |= HeaderCaps.DDSCAPS_COMPLEX | HeaderCaps.DDSCAPS_MIPMAP; + + return output; + } + + /// + /// Encodes all mipmap levels into a list of byte buffers. + /// + /// The image to encode. + /// A list of raw encoded data. + public IList EncodeToRawBytes(Image inputImage) + { + var output = new List(); + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + + // Setup encoder + var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.format); + if (compressedEncoder == null) + throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.format); + } + + // Encode all mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + !Debugger.IsAttached && Options.multiThreaded); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + throw new Exception("Cannot get pixel span."); + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + output.Add(encoded); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + image.Dispose(); + + return output; + } + + /// + /// Encodes a single mip level of the input image to a byte buffer. + /// + /// The image to encode. + /// The mipmap to encode. + /// The width of the mipmap. + /// The height of the mipmap. + /// The raw encoded data. + public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) + { + if (mipLevel < 0) + throw new ArgumentException($"{nameof(mipLevel)} cannot be less than zero."); + + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + + // Setup encoder + var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.format); + if (compressedEncoder == null) + throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.format); + } + + // Dispose all mipmap levels + if (mipLevel > numMipMaps - 1) + { + foreach (var image in mipChain) + image.Dispose(); + + throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps."); + } + + // Encode mipmap level + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out int blocksWidth, out int blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + !Debugger.IsAttached && Options.multiThreaded); + } + else + { + if (!mipChain[mipLevel].TryGetSinglePixelSpan(out var mipPixels)) + throw new Exception("Cannot get pixel span."); + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + mipWidth = mipChain[mipLevel].Width; + mipHeight = mipChain[mipLevel].Height; + + // Dispose all mipmap levels + foreach (var image in mipChain) + image.Dispose(); + + return encoded; + } + + /// + /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream. + /// Order is +X, -X, +Y, -Y, +Z, -Z + /// + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The stream to write the encoded image to. + public void EncodeCubeMap(Image right, Image left, Image top, Image down, + Image back, Image front, Stream outputStream) + { + switch (OutputOptions.fileFormat) + { + case OutputFileFormat.Ktx: + var ktx = EncodeCubeMapToKtx(right, left, top, down, back, front); + ktx.Write(outputStream); + break; + + case OutputFileFormat.Dds: + var dds = EncodeCubeMapToDds(right, left, top, down, back, front); + dds.Write(outputStream); + break; + } + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Ktx file. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The Ktx file containing the encoded image. + public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image top, Image down, + Image back, Image front) + { + KtxFile output; + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width + || right.Width != back.Width || right.Width != front.Width || + right.Height != left.Height || right.Height != top.Height || right.Height != down.Height + || right.Height != back.Height || right.Height != front.Height) + { + throw new ArgumentException("All input images of a cubemap should be the same size."); + } + + var faces = new[] { right, left, top, down, back, front }; + + // Setup encoder + var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.format); + if (compressedEncoder == null) + throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + + output = new KtxFile( + KtxHeader.InitializeCompressed(right.Width, right.Height, + compressedEncoder.GetInternalFormat(), + compressedEncoder.GetBaseInternalFormat())); + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.format); + output = new KtxFile( + KtxHeader.InitializeUncompressed(right.Width, right.Height, + uncompressedEncoder.GetGlType(), + uncompressedEncoder.GetGlFormat(), + uncompressedEncoder.GetGlTypeSize(), + uncompressedEncoder.GetInternalFormat(), + uncompressedEncoder.GetBaseInternalFormat())); + + } + + var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var mipLength = MipMapper.CalculateMipChainLength(right.Width, right.Height, numMipMaps); + for (uint i = 0; i < mipLength; i++) + { + output.MipMaps.Add(new KtxMipmap(0, 0, 0, (uint)faces.Length)); + } + + // Encode all faces + for (var face = 0; face < faces.Length; face++) + { + var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); + + // Encode all mipmap levels per face + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + !Debugger.IsAttached && Options.multiThreaded); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + throw new Exception("Cannot get pixel span."); + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + if (face == 0) + { + output.MipMaps[mip] = new KtxMipmap((uint)encoded.Length, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height, (uint)faces.Length); + } + + output.MipMaps[mip].Faces[face] = new KtxMipFace(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + image.Dispose(); + } + + output.Header.NumberOfFaces = (uint)faces.Length; + output.Header.NumberOfMipmapLevels = mipLength; + + return output; + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Dds file. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The right face of the cubemap. + /// The Dds file containing the encoded image. + public DdsFile EncodeCubeMapToDds(Image right, Image left, Image top, Image down, + Image back, Image front) + { + DdsFile output; + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width + || right.Width != back.Width || right.Width != front.Width || + right.Height != left.Height || right.Height != top.Height || right.Height != down.Height + || right.Height != back.Height || right.Height != front.Height) + { + throw new ArgumentException("All input images of a cubemap should be the same size."); + } + + var faces = new[] { right, left, top, down, back, front }; + + // Setup encoder + var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.format); + if (compressedEncoder == null) + throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(right.Width, right.Height, + compressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader, dxt10Header); + + if (OutputOptions.ddsBc1WriteAlphaFlag && + OutputOptions.format == CompressionFormat.BC1WithAlpha) + { + output.Header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DDPF_ALPHAPIXELS; + } + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.format); + var ddsHeader = DdsHeader.InitializeUncompressed(right.Width, right.Height, + uncompressedEncoder.GetDxgiFormat()); + + output = new DdsFile(ddsHeader); + } + + var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + + // Encode all faces + for (var face = 0; face < faces.Length; face++) + { + var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); + + // Encode all mipmap levels per face + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + !Debugger.IsAttached && Options.multiThreaded); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + throw new Exception("Cannot get pixel span."); + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + if (mip == 0) + { + output.Faces.Add(new DdsFace((uint)mipChain[mip].Width, (uint)mipChain[mip].Height, + (uint)encoded.Length, mipChain.Count)); + } + + output.Faces[face].MipMaps[mip] = new DdsMipMap(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + image.Dispose(); + } + + output.Header.dwCaps |= HeaderCaps.DDSCAPS_COMPLEX; + output.Header.dwMipMapCount = numMipMaps; + if (numMipMaps > 1) + { + output.Header.dwCaps |= HeaderCaps.DDSCAPS_MIPMAP; + } + output.Header.dwCaps2 |= HeaderCaps2.DDSCAPS2_CUBEMAP | + HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEX | + HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEX | + HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEY | + HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEY | + HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEZ | + HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEZ; + + return output; + } + + private IBcBlockEncoder GetEncoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.BC1: + return new Bc1BlockEncoder(); + + case CompressionFormat.BC1WithAlpha: + return new Bc1AlphaBlockEncoder(); + + case CompressionFormat.BC2: + return new Bc2BlockEncoder(); + + case CompressionFormat.BC3: + return new Bc3BlockEncoder(); + + case CompressionFormat.BC4: + return new Bc4BlockEncoder(InputOptions.luminanceAsRed); + + case CompressionFormat.BC5: + return new Bc5BlockEncoder(); + + case CompressionFormat.BC7: + return new Bc7Encoder(); + + default: + return null; + } + } + + private IRawEncoder GetRawEncoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.R: + return new RawLuminanceEncoder(InputOptions.luminanceAsRed); + + case CompressionFormat.RG: + return new RawRGEncoder(); + + case CompressionFormat.RGB: + return new RawRGBEncoder(); + + case CompressionFormat.RGBA: + return new RawRGBAEncoder(); + + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } + } + } } diff --git a/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs new file mode 100644 index 0000000..dbc59d8 --- /dev/null +++ b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs @@ -0,0 +1,11 @@ +namespace BCnEncoder.Encoder.Options +{ + public class EncoderInputOptions + { + /// + /// If true, when encoding to a format that only includes a red channel, + /// use the pixel luminance instead of just the red channel. Default is false. + /// + public bool luminanceAsRed = false; + } +} diff --git a/BCnEnc.Net/Encoder/Options/EncoderOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOptions.cs new file mode 100644 index 0000000..df95b80 --- /dev/null +++ b/BCnEnc.Net/Encoder/Options/EncoderOptions.cs @@ -0,0 +1,13 @@ +namespace BCnEncoder.Encoder.Options +{ + public class EncoderOptions + { + /// + /// Whether the blocks should be encoded in parallel. This can be much faster than single-threaded encoding, + /// but is slow if multiple textures are being processed at the same time. + /// When a debugger is attached, the encoder defaults to single-threaded operation to ease debugging. + /// Default is true. + /// + public bool multiThreaded = true; + } +} diff --git a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs new file mode 100644 index 0000000..d7fb794 --- /dev/null +++ b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs @@ -0,0 +1,45 @@ +using BCnEncoder.Shared; + +namespace BCnEncoder.Encoder.Options +{ + public class EncoderOutputOptions + { + /// + /// Whether to generate mipMaps. Default is true. + /// + public bool generateMipMaps = true; + + /// + /// The maximum number of mipmap levels to generate. -1 or 0 is unbounded. + /// Default is -1. + /// + public int maxMipMapLevel = -1; + + /// + /// The compression format to use. Default is BC1. + /// + public CompressionFormat format = CompressionFormat.BC1; + + /// + /// The quality of the compression. Use either fast or balanced for testing. + /// Fast can be used for near real-time encoding for most algorithms. + /// Use bestQuality when needed. Default is balanced. + /// + public CompressionQuality quality = CompressionQuality.Balanced; + + /// + /// The output file format of the data. Either Ktx or Dds. + /// Default is Ktx. + /// + public OutputFileFormat fileFormat = OutputFileFormat.Ktx; + + /// + /// The DDS file format doesn't seem to have a standard for indicating whether a BC1 texture + /// includes 1bit of alpha. This option will write DDPF_ALPHAPIXELS flag to the header + /// to indicate the presence of an alpha channel. Some programs read and write this flag, + /// but some programs don't like it and get confused. Your mileage may vary. + /// Default is false. + /// + public bool ddsBc1WriteAlphaFlag = false; + } +} diff --git a/BCnEnc.Net/Shared/CompressionFormat.cs b/BCnEnc.Net/Shared/CompressionFormat.cs index 04bf275..f99ab71 100644 --- a/BCnEnc.Net/Shared/CompressionFormat.cs +++ b/BCnEnc.Net/Shared/CompressionFormat.cs @@ -1,70 +1,72 @@ namespace BCnEncoder.Shared { - public enum CompressionFormat - { - /// - /// Raw unsigned byte 8-bit Luminance data - /// - R, - /// - /// Raw unsigned byte 16-bit RG data - /// - RG, - /// - /// Raw unsigned byte 24-bit RGB data - /// - RGB, - /// - /// Raw unsigned byte 32-bit RGBA data - /// - RGBA, - /// - /// BC1 / DXT1 with no alpha. Very widely supported and good compression ratio. - /// - BC1, - /// - /// BC1 / DXT1 with 1-bit of alpha. - /// - BC1WithAlpha, - /// - /// BC2 / DXT3 encoding with alpha. Good for sharp alpha transitions. - /// - BC2, - /// - /// BC3 / DXT5 encoding with alpha. Good for smooth alpha transitions. - /// - BC3, - /// - /// BC4 single-channel encoding. Only luminance is encoded. - /// - BC4, - /// - /// BC5 dual-channel encoding. Only red and green channels are encoded. - /// - BC5, - /// - /// BC6H / BPTC float encoding. Can compress HDR textures without alpha. Currently not supported. - /// - BC6, - /// - /// BC7 / BPTC unorm encoding. Very high quality rgba or rgb encoding. Also very slow. - /// - BC7 - } + public enum CompressionFormat + { + /// + /// Raw unsigned byte 8-bit Luminance data + /// + R, + /// + /// Raw unsigned byte 16-bit RG data + /// + RG, + /// + /// Raw unsigned byte 24-bit RGB data + /// + RGB, + /// + /// Raw unsigned byte 32-bit RGBA data + /// + RGBA, + /// + /// BC1 / DXT1 with no alpha. Very widely supported and good compression ratio. + /// + BC1, + /// + /// BC1 / DXT1 with 1-bit of alpha. + /// + BC1WithAlpha, + /// + /// BC2 / DXT3 encoding with alpha. Good for sharp alpha transitions. + /// + BC2, + /// + /// BC3 / DXT5 encoding with alpha. Good for smooth alpha transitions. + /// + BC3, + /// + /// BC4 single-channel encoding. Only luminance is encoded. + /// + BC4, + /// + /// BC5 dual-channel encoding. Only red and green channels are encoded. + /// + BC5, + /// + /// BC6H / BPTC float encoding. Can compress HDR textures without alpha. Currently not supported. + /// + BC6, + /// + /// BC7 / BPTC unorm encoding. Very high quality rgba or rgb encoding. Also very slow. + /// + BC7 + } - public static class CompressionFormatExtensions { - public static bool IsCompressedFormat(this CompressionFormat format) - { - switch (format) { - case CompressionFormat.R: - case CompressionFormat.RG: - case CompressionFormat.RGB: - case CompressionFormat.RGBA: - return false; - - default: - return true; - } - } - } + public static class CompressionFormatExtensions + { + public static bool IsCompressedFormat(this CompressionFormat format) + { + switch (format) + { + case CompressionFormat.R: + case CompressionFormat.RG: + case CompressionFormat.RGB: + case CompressionFormat.RGBA: + return false; + + default: + return true; + } + } + } } From b6316edfb08518b273595a6ebe37575c977ea41a Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Sun, 10 Jan 2021 17:54:12 +0100 Subject: [PATCH 007/116] Add DecodeRaw methods to BcDecoder; --- BCnEnc.Net/Decoder/BcDecoder.cs | 99 +++++++++++++++++++ .../Decoder/Options/DecoderInputOptions.cs | 6 ++ .../Decoder/Options/DecoderOutputOptions.cs | 4 +- 3 files changed, 108 insertions(+), 1 deletion(-) diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index cff60dd..4caf508 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -23,6 +23,54 @@ public class BcDecoder /// public DecoderOutputOptions OutputOptions { get; } = new DecoderOutputOptions(); + /// + /// Decode raw encoded image data. + /// + /// The stream containing the encoded data. + /// The format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The decoded Rgba32 image. + public Image DecodeRaw(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight) + { + var dataArray = new byte[inputStream.Position]; + inputStream.Read(dataArray, 0, dataArray.Length); + + return DecodeRaw(dataArray, format, pixelWidth, pixelHeight); + } + + /// + /// Decode raw encoded image data. + /// + /// The array containing the encoded data. + /// The format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The decoded Rgba32 image. + public Image DecodeRaw(byte[] input, CompressionFormat format, int pixelWidth, int pixelHeight) + { + var isCompressedFormat = format.IsCompressedFormat(); + if (isCompressedFormat) + { + // Decode as compressed data + var decoder = GetDecoder(format); + var blocks = decoder.Decode(input, pixelWidth, pixelHeight, out var blockWidth, out var blockHeight); + + return ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, pixelWidth, pixelHeight); + } + + // Decode as raw data + var rawDecoder = GetRawDecoder(format); + + var image = new Image(pixelWidth, pixelHeight); + var output = rawDecoder.Decode(input, pixelWidth, pixelHeight); + if (!image.TryGetSinglePixelSpan(out var pixels)) + throw new Exception("Cannot get pixel span."); + + output.CopyTo(pixels); + return image; + } + /// /// Read a Ktx or a Dds file from a stream and decode it. /// @@ -393,5 +441,56 @@ private IRawDecoder GetRawDecoder(DXGI_FORMAT format) return null; } } + + private IBcBlockDecoder GetDecoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.BC1: + return new Bc1NoAlphaDecoder(); + + case CompressionFormat.BC1WithAlpha: + return new Bc1ADecoder(); + + case CompressionFormat.BC2: + return new Bc2Decoder(); + + case CompressionFormat.BC3: + return new Bc3Decoder(); + + case CompressionFormat.BC4: + return new Bc4Decoder(InputOptions.luminanceAsRed); + + case CompressionFormat.BC5: + return new Bc5Decoder(); + + case CompressionFormat.BC7: + return new Bc7Decoder(); + + default: + return null; + } + } + + private IRawDecoder GetRawDecoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.R: + return new RawRDecoder(InputOptions.luminanceAsRed); + + case CompressionFormat.RG: + return new RawRGDecoder(); + + case CompressionFormat.RGB: + return new RawRGBDecoder(); + + case CompressionFormat.RGBA: + return new RawRGBADecoder(); + + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } + } } } diff --git a/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs index 9529ab4..e55d295 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs @@ -9,5 +9,11 @@ public class DecoderInputOptions /// Default is true. /// public bool ddsBc1ExpectAlpha = true; + + /// + /// If true, when encoding to a format that only includes a red channel, + /// use the pixel luminance instead of just the red channel. Default is false. + /// + public bool luminanceAsRed = false; } } diff --git a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs index a0a8299..c1374f8 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs @@ -1,4 +1,6 @@ -namespace BCnEncoder.Decoder.Options +using BCnEncoder.Shared; + +namespace BCnEncoder.Decoder.Options { public class DecoderOutputOptions { From f27fec4cb78d093d5e58947fe3b977b1f5d88c7c Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Sun, 10 Jan 2021 20:56:37 +0100 Subject: [PATCH 008/116] Use already existing redAsLuminance from DecoderOutputOptions; --- BCnEnc.Net/Decoder/BcDecoder.cs | 4 ++-- BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 4caf508..0db77db 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -459,7 +459,7 @@ private IBcBlockDecoder GetDecoder(CompressionFormat format) return new Bc3Decoder(); case CompressionFormat.BC4: - return new Bc4Decoder(InputOptions.luminanceAsRed); + return new Bc4Decoder(OutputOptions.redAsLuminance); case CompressionFormat.BC5: return new Bc5Decoder(); @@ -477,7 +477,7 @@ private IRawDecoder GetRawDecoder(CompressionFormat format) switch (format) { case CompressionFormat.R: - return new RawRDecoder(InputOptions.luminanceAsRed); + return new RawRDecoder(OutputOptions.redAsLuminance); case CompressionFormat.RG: return new RawRGDecoder(); diff --git a/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs index e55d295..9529ab4 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs @@ -9,11 +9,5 @@ public class DecoderInputOptions /// Default is true. /// public bool ddsBc1ExpectAlpha = true; - - /// - /// If true, when encoding to a format that only includes a red channel, - /// use the pixel luminance instead of just the red channel. Default is false. - /// - public bool luminanceAsRed = false; } } From 12f7f3e52b45a2300ce9008d44a8a20bc4a346fb Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Mon, 11 Jan 2021 12:31:52 +0100 Subject: [PATCH 009/116] Fix color endpoint interpolation; --- BCnEnc.Net/Shared/EncodedBlocks.cs | 910 ++++++++++++++--------------- BCnEnc.Net/Shared/Interpolation.cs | 40 ++ BCnEncTests/BC1Tests.cs | 16 +- 3 files changed, 503 insertions(+), 463 deletions(-) create mode 100644 BCnEnc.Net/Shared/Interpolation.cs diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index bf41884..e88cfa6 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -4,460 +4,460 @@ namespace BCnEncoder.Shared { - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc1Block - { - public ColorRgb565 color0; - public ColorRgb565 color1; - public uint colorIndices; - - public int this[int index] - { - readonly get => (int)(colorIndices >> (index * 2)) & 0b11; - set - { - colorIndices = (uint)(colorIndices & (~(0b11 << (index * 2)))); - int val = value & 0b11; - colorIndices = (colorIndices | ((uint)val << (index * 2))); - } - } - - public readonly bool HasAlphaOrBlack => color0.data <= color1.data; - - public readonly RawBlock4X4Rgba32 Decode(bool useAlpha) - { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var color0 = this.color0.ToColorRgb24(); - var color1 = this.color1.ToColorRgb24(); - - useAlpha = useAlpha && HasAlphaOrBlack; - - Span colors = HasAlphaOrBlack ? - stackalloc ColorRgb24[] { - color0, - color1, - color0 * (1.0 / 2.0) + color1 * (1.0 / 2.0), - new ColorRgb24(0, 0, 0) - } : stackalloc ColorRgb24[] { - color0, - color1, - color0 * (2.0 / 3.0) + color1 * (1.0 / 3.0), - color0 * (1.0 / 3.0) + color1 * (2.0 / 3.0) - }; - - for (int i = 0; i < pixels.Length; i++) - { - int colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); - var color = colors[colorIndex]; - if (useAlpha && colorIndex == 3) - { - pixels[i] = new Rgba32(0, 0, 0, 0); - } - else - { - pixels[i] = new Rgba32(color.r, color.g, color.b, 255); - } - } - return output; - } - } - - - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc2Block - { - public ulong alphaColors; - public ColorRgb565 color0; - public ColorRgb565 color1; - public uint colorIndices; - - public int this[int index] - { - readonly get => (int)(colorIndices >> (index * 2)) & 0b11; - set - { - colorIndices = (uint)(colorIndices & (~(0b11 << (index * 2)))); - int val = value & 0b11; - colorIndices = (colorIndices | ((uint)val << (index * 2))); - } - } - - public readonly byte GetAlpha(int index) - { - ulong mask = 0xFUL << (index * 4); - int shift = (index * 4); - ulong alphaUnscaled = (((alphaColors & mask) >> shift)); - return (byte)((alphaUnscaled / 15.0) * 255); - } - - public void SetAlpha(int index, byte alpha) - { - ulong mask = 0xFUL << (index * 4); - int shift = (index * 4); - alphaColors &= ~mask; - byte a = (byte)((alpha / 255.0) * 15); - alphaColors |= (ulong)(a & 0xF) << shift; - } - - public readonly RawBlock4X4Rgba32 Decode() - { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var color0 = this.color0.ToColorRgb24(); - var color1 = this.color1.ToColorRgb24(); - - Span colors = stackalloc ColorRgb24[] { - color0, - color1, - color0 * (2.0 / 3.0) + color1 * (1.0 / 3.0), - color0 * (1.0 / 3.0) + color1 * (2.0 / 3.0) - }; - - for (int i = 0; i < pixels.Length; i++) - { - int colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); - var color = colors[colorIndex]; - - pixels[i] = new Rgba32(color.r, color.g, color.b, GetAlpha(i)); - } - return output; - } - } - - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc3Block - { - public ulong alphaBlock; - public ColorRgb565 color0; - public ColorRgb565 color1; - public uint colorIndices; - - public int this[int index] - { - readonly get => (int)(colorIndices >> (index * 2)) & 0b11; - set - { - colorIndices = (uint)(colorIndices & (~(0b11 << (index * 2)))); - int val = value & 0b11; - colorIndices = (colorIndices | ((uint)val << (index * 2))); - } - } - - public byte Alpha0 - { - readonly get => (byte)(alphaBlock & 0xFFUL); - set - { - alphaBlock &= ~0xFFUL; - alphaBlock |= value; - } - } - - public byte Alpha1 - { - readonly get => (byte)((alphaBlock >> 8) & 0xFFUL); - set - { - alphaBlock &= ~0xFF00UL; - alphaBlock |= (ulong)value << 8; - } - } - - public readonly byte GetAlphaIndex(int pixelIndex) - { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - ulong alphaIndex = (((alphaBlock & mask) >> shift)); - return (byte)alphaIndex; - } - - public void SetAlphaIndex(int pixelIndex, byte alphaIndex) - { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - alphaBlock &= ~mask; - alphaBlock |= (ulong)(alphaIndex & 0b111) << shift; - } - - public readonly RawBlock4X4Rgba32 Decode() - { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var color0 = this.color0.ToColorRgb24(); - var color1 = this.color1.ToColorRgb24(); - - var a0 = Alpha0; - var a1 = Alpha1; - Span colors = stackalloc ColorRgb24[] { - color0, - color1, - color0 * (2.0 / 3.0) + color1 * (1.0 / 3.0), - color0 * (1.0 / 3.0) + color1 * (2.0 / 3.0) - }; - - Span alphas = a0 > a1 ? stackalloc byte[] { - a0, - a1, - (byte)(6 / 7.0 * a0 + 1 / 7.0 * a1), - (byte)(5 / 7.0 * a0 + 2 / 7.0 * a1), - (byte)(4 / 7.0 * a0 + 3 / 7.0 * a1), - (byte)(3 / 7.0 * a0 + 4 / 7.0 * a1), - (byte)(2 / 7.0 * a0 + 5 / 7.0 * a1), - (byte)(1 / 7.0 * a0 + 6 / 7.0 * a1), - } : stackalloc byte[] { - a0, - a1, - (byte)(4 / 5.0 * a0 + 1 / 5.0 * a1), - (byte)(3 / 5.0 * a0 + 2 / 5.0 * a1), - (byte)(2 / 5.0 * a0 + 3 / 5.0 * a1), - (byte)(1 / 5.0 * a0 + 4 / 5.0 * a1), - 0, - 255 - }; - - for (int i = 0; i < pixels.Length; i++) - { - int colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); - var color = colors[colorIndex]; - - pixels[i] = new Rgba32(color.r, color.g, color.b, alphas[GetAlphaIndex(i)]); - } - return output; - } - } - - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc4Block - { - public ulong redBlock; - - public byte Red0 - { - readonly get => (byte)(redBlock & 0xFFUL); - set - { - redBlock &= ~0xFFUL; - redBlock |= value; - } - } - - public byte Red1 - { - readonly get => (byte)((redBlock >> 8) & 0xFFUL); - set - { - redBlock &= ~0xFF00UL; - redBlock |= (ulong)value << 8; - } - } - - public readonly byte GetRedIndex(int pixelIndex) - { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - ulong redIndex = (((redBlock & mask) >> shift)); - return (byte)redIndex; - } - - public void SetRedIndex(int pixelIndex, byte redIndex) - { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - redBlock &= ~mask; - redBlock |= (ulong)(redIndex & 0b111) << shift; - } - - public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) - { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var r0 = Red0; - var r1 = Red1; - - Span reds = r0 > r1 ? stackalloc byte[] { - r0, - r1, - (byte)(6 / 7.0 * r0 + 1 / 7.0 * r1), - (byte)(5 / 7.0 * r0 + 2 / 7.0 * r1), - (byte)(4 / 7.0 * r0 + 3 / 7.0 * r1), - (byte)(3 / 7.0 * r0 + 4 / 7.0 * r1), - (byte)(2 / 7.0 * r0 + 5 / 7.0 * r1), - (byte)(1 / 7.0 * r0 + 6 / 7.0 * r1), - } : stackalloc byte[] { - r0, - r1, - (byte)(4 / 5.0 * r0 + 1 / 5.0 * r1), - (byte)(3 / 5.0 * r0 + 2 / 5.0 * r1), - (byte)(2 / 5.0 * r0 + 3 / 5.0 * r1), - (byte)(1 / 5.0 * r0 + 4 / 5.0 * r1), - 0, - 255 - }; - - if (redAsLuminance) - { - for (int i = 0; i < pixels.Length; i++) - { - var index = GetRedIndex(i); - pixels[i] = new Rgba32(reds[index], reds[index], reds[index], 255); - } - } - else - { - for (int i = 0; i < pixels.Length; i++) - { - var index = GetRedIndex(i); - pixels[i] = new Rgba32(reds[index], 0, 0, 255); - } - } - - return output; - } - } - - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc5Block - { - public ulong redBlock; - public ulong greenBlock; - - public byte Red0 - { - readonly get => (byte)(redBlock & 0xFFUL); - set - { - redBlock &= ~0xFFUL; - redBlock |= value; - } - } - - public byte Red1 - { - readonly get => (byte)((redBlock >> 8) & 0xFFUL); - set - { - redBlock &= ~0xFF00UL; - redBlock |= (ulong)value << 8; - } - } - - public byte Green0 - { - readonly get => (byte)(greenBlock & 0xFFUL); - set - { - greenBlock &= ~0xFFUL; - greenBlock |= value; - } - } - - public byte Green1 - { - readonly get => (byte)((greenBlock >> 8) & 0xFFUL); - set - { - greenBlock &= ~0xFF00UL; - greenBlock |= (ulong)value << 8; - } - } - - public readonly byte GetRedIndex(int pixelIndex) - { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - ulong redIndex = (((redBlock & mask) >> shift)); - return (byte)redIndex; - } - - public void SetRedIndex(int pixelIndex, byte redIndex) - { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - redBlock &= ~mask; - redBlock |= (ulong)(redIndex & 0b111) << shift; - } - - public readonly byte GetGreenIndex(int pixelIndex) - { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - ulong greenIndex = (((greenBlock & mask) >> shift)); - return (byte)greenIndex; - } - - public void SetGreenIndex(int pixelIndex, byte greenIndex) - { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - greenBlock &= ~mask; - greenBlock |= (ulong)(greenIndex & 0b111) << shift; - } - - public readonly RawBlock4X4Rgba32 Decode() - { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var r0 = Red0; - var r1 = Red1; - - Span reds = r0 > r1 ? stackalloc byte[] { - r0, - r1, - (byte)(6 / 7.0 * r0 + 1 / 7.0 * r1), - (byte)(5 / 7.0 * r0 + 2 / 7.0 * r1), - (byte)(4 / 7.0 * r0 + 3 / 7.0 * r1), - (byte)(3 / 7.0 * r0 + 4 / 7.0 * r1), - (byte)(2 / 7.0 * r0 + 5 / 7.0 * r1), - (byte)(1 / 7.0 * r0 + 6 / 7.0 * r1), - } : stackalloc byte[] { - r0, - r1, - (byte)(4 / 5.0 * r0 + 1 / 5.0 * r1), - (byte)(3 / 5.0 * r0 + 2 / 5.0 * r1), - (byte)(2 / 5.0 * r0 + 3 / 5.0 * r1), - (byte)(1 / 5.0 * r0 + 4 / 5.0 * r1), - 0, - 255 - }; - - var g0 = Green0; - var g1 = Green1; - - Span greens = g0 > g1 ? stackalloc byte[] { - g0, - g1, - (byte)(6 / 7.0 * g0 + 1 / 7.0 * g1), - (byte)(5 / 7.0 * g0 + 2 / 7.0 * g1), - (byte)(4 / 7.0 * g0 + 3 / 7.0 * g1), - (byte)(3 / 7.0 * g0 + 4 / 7.0 * g1), - (byte)(2 / 7.0 * g0 + 5 / 7.0 * g1), - (byte)(1 / 7.0 * g0 + 6 / 7.0 * g1), - } : stackalloc byte[] { - g0, - g1, - (byte)(4 / 5.0 * g0 + 1 / 5.0 * g1), - (byte)(3 / 5.0 * g0 + 2 / 5.0 * g1), - (byte)(2 / 5.0 * g0 + 3 / 5.0 * g1), - (byte)(1 / 5.0 * g0 + 4 / 5.0 * g1), - 0, - 255 - }; - - for (int i = 0; i < pixels.Length; i++) - { - var redIndex = GetRedIndex(i); - var greenIndex = GetGreenIndex(i); - pixels[i] = new Rgba32(reds[redIndex], greens[greenIndex], 0, 255); - } - - return output; - } - } + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc1Block + { + public ColorRgb565 color0; + public ColorRgb565 color1; + public uint colorIndices; + + public int this[int index] + { + readonly get => (int)(colorIndices >> (index * 2)) & 0b11; + set + { + colorIndices = (uint)(colorIndices & (~(0b11 << (index * 2)))); + int val = value & 0b11; + colorIndices = (colorIndices | ((uint)val << (index * 2))); + } + } + + public readonly bool HasAlphaOrBlack => color0.data <= color1.data; + + public readonly RawBlock4X4Rgba32 Decode(bool useAlpha) + { + RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var color0 = this.color0.ToColorRgb24(); + var color1 = this.color1.ToColorRgb24(); + + useAlpha = useAlpha && HasAlphaOrBlack; + + Span colors = HasAlphaOrBlack ? + stackalloc ColorRgb24[] { + color0, + color1, + color0.Half(color1), + new ColorRgb24(0, 0, 0) + } : stackalloc ColorRgb24[] { + color0, + color1, + color0.Third(color1, 1), + color0.Third(color1, 2) + }; + + for (int i = 0; i < pixels.Length; i++) + { + int colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); + var color = colors[colorIndex]; + if (useAlpha && colorIndex == 3) + { + pixels[i] = new Rgba32(0, 0, 0, 0); + } + else + { + pixels[i] = new Rgba32(color.r, color.g, color.b, 255); + } + } + return output; + } + } + + + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc2Block + { + public ulong alphaColors; + public ColorRgb565 color0; + public ColorRgb565 color1; + public uint colorIndices; + + public int this[int index] + { + readonly get => (int)(colorIndices >> (index * 2)) & 0b11; + set + { + colorIndices = (uint)(colorIndices & (~(0b11 << (index * 2)))); + int val = value & 0b11; + colorIndices = (colorIndices | ((uint)val << (index * 2))); + } + } + + public readonly byte GetAlpha(int index) + { + ulong mask = 0xFUL << (index * 4); + int shift = (index * 4); + ulong alphaUnscaled = (((alphaColors & mask) >> shift)); + return (byte)((alphaUnscaled / 15.0) * 255); + } + + public void SetAlpha(int index, byte alpha) + { + ulong mask = 0xFUL << (index * 4); + int shift = (index * 4); + alphaColors &= ~mask; + byte a = (byte)((alpha / 255.0) * 15); + alphaColors |= (ulong)(a & 0xF) << shift; + } + + public readonly RawBlock4X4Rgba32 Decode() + { + RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var color0 = this.color0.ToColorRgb24(); + var color1 = this.color1.ToColorRgb24(); + + Span colors = stackalloc ColorRgb24[] { + color0, + color1, + color0.Third(color1, 1), + color0.Third(color1, 2) + }; + + for (int i = 0; i < pixels.Length; i++) + { + int colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); + var color = colors[colorIndex]; + + pixels[i] = new Rgba32(color.r, color.g, color.b, GetAlpha(i)); + } + return output; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc3Block + { + public ulong alphaBlock; + public ColorRgb565 color0; + public ColorRgb565 color1; + public uint colorIndices; + + public int this[int index] + { + readonly get => (int)(colorIndices >> (index * 2)) & 0b11; + set + { + colorIndices = (uint)(colorIndices & (~(0b11 << (index * 2)))); + int val = value & 0b11; + colorIndices = (colorIndices | ((uint)val << (index * 2))); + } + } + + public byte Alpha0 + { + readonly get => (byte)(alphaBlock & 0xFFUL); + set + { + alphaBlock &= ~0xFFUL; + alphaBlock |= value; + } + } + + public byte Alpha1 + { + readonly get => (byte)((alphaBlock >> 8) & 0xFFUL); + set + { + alphaBlock &= ~0xFF00UL; + alphaBlock |= (ulong)value << 8; + } + } + + public readonly byte GetAlphaIndex(int pixelIndex) + { + ulong mask = 0b0111UL << (pixelIndex * 3 + 16); + int shift = (pixelIndex * 3 + 16); + ulong alphaIndex = (((alphaBlock & mask) >> shift)); + return (byte)alphaIndex; + } + + public void SetAlphaIndex(int pixelIndex, byte alphaIndex) + { + ulong mask = 0b0111UL << (pixelIndex * 3 + 16); + int shift = (pixelIndex * 3 + 16); + alphaBlock &= ~mask; + alphaBlock |= (ulong)(alphaIndex & 0b111) << shift; + } + + public readonly RawBlock4X4Rgba32 Decode() + { + RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var color0 = this.color0.ToColorRgb24(); + var color1 = this.color1.ToColorRgb24(); + + var a0 = Alpha0; + var a1 = Alpha1; + Span colors = stackalloc ColorRgb24[] { + color0, + color1, + color0.Third(color1, 1), + color0.Third(color1, 2) + }; + + Span alphas = a0 > a1 ? stackalloc byte[] { + a0, + a1, + (byte)Interpolation.Interpolate(a0, a1, 1, 7), + (byte)Interpolation.Interpolate(a0, a1, 2, 7), + (byte)Interpolation.Interpolate(a0, a1, 3, 7), + (byte)Interpolation.Interpolate(a0, a1, 4, 7), + (byte)Interpolation.Interpolate(a0, a1, 5, 7), + (byte)Interpolation.Interpolate(a0, a1, 6, 7) + } : stackalloc byte[] { + a0, + a1, + (byte)Interpolation.Interpolate(a0, a1, 1, 5), + (byte)Interpolation.Interpolate(a0, a1, 2, 5), + (byte)Interpolation.Interpolate(a0, a1, 3, 5), + (byte)Interpolation.Interpolate(a0, a1, 4, 5), + 0, + 255 + }; + + for (int i = 0; i < pixels.Length; i++) + { + int colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); + var color = colors[colorIndex]; + + pixels[i] = new Rgba32(color.r, color.g, color.b, alphas[GetAlphaIndex(i)]); + } + return output; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc4Block + { + public ulong redBlock; + + public byte Red0 + { + readonly get => (byte)(redBlock & 0xFFUL); + set + { + redBlock &= ~0xFFUL; + redBlock |= value; + } + } + + public byte Red1 + { + readonly get => (byte)((redBlock >> 8) & 0xFFUL); + set + { + redBlock &= ~0xFF00UL; + redBlock |= (ulong)value << 8; + } + } + + public readonly byte GetRedIndex(int pixelIndex) + { + ulong mask = 0b0111UL << (pixelIndex * 3 + 16); + int shift = (pixelIndex * 3 + 16); + ulong redIndex = (((redBlock & mask) >> shift)); + return (byte)redIndex; + } + + public void SetRedIndex(int pixelIndex, byte redIndex) + { + ulong mask = 0b0111UL << (pixelIndex * 3 + 16); + int shift = (pixelIndex * 3 + 16); + redBlock &= ~mask; + redBlock |= (ulong)(redIndex & 0b111) << shift; + } + + public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) + { + RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var r0 = Red0; + var r1 = Red1; + + Span reds = r0 > r1 ? stackalloc byte[] { + r0, + r1, + (byte)Interpolation.Interpolate(r0, r1, 1, 7), + (byte)Interpolation.Interpolate(r0, r1, 2, 7), + (byte)Interpolation.Interpolate(r0, r1, 3, 7), + (byte)Interpolation.Interpolate(r0, r1, 4, 7), + (byte)Interpolation.Interpolate(r0, r1, 5, 7), + (byte)Interpolation.Interpolate(r0, r1, 6, 7) + } : stackalloc byte[] { + r0, + r1, + (byte)Interpolation.Interpolate(r0, r1, 1, 5), + (byte)Interpolation.Interpolate(r0, r1, 2, 5), + (byte)Interpolation.Interpolate(r0, r1, 3, 5), + (byte)Interpolation.Interpolate(r0, r1, 4, 5), + 0, + 255 + }; + + if (redAsLuminance) + { + for (int i = 0; i < pixels.Length; i++) + { + var index = GetRedIndex(i); + pixels[i] = new Rgba32(reds[index], reds[index], reds[index], 255); + } + } + else + { + for (int i = 0; i < pixels.Length; i++) + { + var index = GetRedIndex(i); + pixels[i] = new Rgba32(reds[index], 0, 0, 255); + } + } + + return output; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc5Block + { + public ulong redBlock; + public ulong greenBlock; + + public byte Red0 + { + readonly get => (byte)(redBlock & 0xFFUL); + set + { + redBlock &= ~0xFFUL; + redBlock |= value; + } + } + + public byte Red1 + { + readonly get => (byte)((redBlock >> 8) & 0xFFUL); + set + { + redBlock &= ~0xFF00UL; + redBlock |= (ulong)value << 8; + } + } + + public byte Green0 + { + readonly get => (byte)(greenBlock & 0xFFUL); + set + { + greenBlock &= ~0xFFUL; + greenBlock |= value; + } + } + + public byte Green1 + { + readonly get => (byte)((greenBlock >> 8) & 0xFFUL); + set + { + greenBlock &= ~0xFF00UL; + greenBlock |= (ulong)value << 8; + } + } + + public readonly byte GetRedIndex(int pixelIndex) + { + ulong mask = 0b0111UL << (pixelIndex * 3 + 16); + int shift = (pixelIndex * 3 + 16); + ulong redIndex = (((redBlock & mask) >> shift)); + return (byte)redIndex; + } + + public void SetRedIndex(int pixelIndex, byte redIndex) + { + ulong mask = 0b0111UL << (pixelIndex * 3 + 16); + int shift = (pixelIndex * 3 + 16); + redBlock &= ~mask; + redBlock |= (ulong)(redIndex & 0b111) << shift; + } + + public readonly byte GetGreenIndex(int pixelIndex) + { + ulong mask = 0b0111UL << (pixelIndex * 3 + 16); + int shift = (pixelIndex * 3 + 16); + ulong greenIndex = (((greenBlock & mask) >> shift)); + return (byte)greenIndex; + } + + public void SetGreenIndex(int pixelIndex, byte greenIndex) + { + ulong mask = 0b0111UL << (pixelIndex * 3 + 16); + int shift = (pixelIndex * 3 + 16); + greenBlock &= ~mask; + greenBlock |= (ulong)(greenIndex & 0b111) << shift; + } + + public readonly RawBlock4X4Rgba32 Decode() + { + RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var r0 = Red0; + var r1 = Red1; + + Span reds = r0 > r1 ? stackalloc byte[] { + r0, + r1, + (byte)Interpolation.Interpolate(r0, r1, 1, 7), + (byte)Interpolation.Interpolate(r0, r1, 2, 7), + (byte)Interpolation.Interpolate(r0, r1, 3, 7), + (byte)Interpolation.Interpolate(r0, r1, 4, 7), + (byte)Interpolation.Interpolate(r0, r1, 5, 7), + (byte)Interpolation.Interpolate(r0, r1, 6, 7) + } : stackalloc byte[] { + r0, + r1, + (byte)Interpolation.Interpolate(r0, r1, 1, 5), + (byte)Interpolation.Interpolate(r0, r1, 2, 5), + (byte)Interpolation.Interpolate(r0, r1, 3, 5), + (byte)Interpolation.Interpolate(r0, r1, 4, 5), + 0, + 255 + }; + + var g0 = Green0; + var g1 = Green1; + + Span greens = g0 > g1 ? stackalloc byte[] { + g0, + g1, + (byte)Interpolation.Interpolate(g0, g1, 1, 7), + (byte)Interpolation.Interpolate(g0, g1, 2, 7), + (byte)Interpolation.Interpolate(g0, g1, 3, 7), + (byte)Interpolation.Interpolate(g0, g1, 4, 7), + (byte)Interpolation.Interpolate(g0, g1, 5, 7), + (byte)Interpolation.Interpolate(g0, g1, 6, 7) + } : stackalloc byte[] { + g0, + g1, + (byte)Interpolation.Interpolate(g0, g1, 1, 5), + (byte)Interpolation.Interpolate(g0, g1, 2, 5), + (byte)Interpolation.Interpolate(g0, g1, 3, 5), + (byte)Interpolation.Interpolate(g0, g1, 4, 5), + 0, + 255 + }; + + for (int i = 0; i < pixels.Length; i++) + { + var redIndex = GetRedIndex(i); + var greenIndex = GetGreenIndex(i); + pixels[i] = new Rgba32(reds[redIndex], greens[greenIndex], 0, 255); + } + + return output; + } + } } diff --git a/BCnEnc.Net/Shared/Interpolation.cs b/BCnEnc.Net/Shared/Interpolation.cs new file mode 100644 index 0000000..aad559a --- /dev/null +++ b/BCnEnc.Net/Shared/Interpolation.cs @@ -0,0 +1,40 @@ +namespace BCnEncoder.Shared +{ + internal static class Interpolation + { + /// + /// Interpolates two colors by half. + /// + /// The first color endpoint. + /// The second color endpoint. + /// The interpolated color. + public static ColorRgb24 Half(this ColorRgb24 c0, ColorRgb24 c1) => + InterpolateColor(c0, c1, 1, 2); + + /// + /// Interpolates two colors by third. + /// + /// The first color endpoint. + /// The second color endpoint. + /// The dividend in the third. + /// The interpolated color. + public static ColorRgb24 Third(this ColorRgb24 c0, ColorRgb24 c1, int num) => + InterpolateColor(c0, c1, num, 3); + + /// + /// Interpolates two components. + /// + /// The first component. + /// The second component. + /// The dividend. + /// The divisor. + /// The interpolated component. + public static int Interpolate(int a, int b, int num, float den) => + (int)(((den - num) * a + num * b) / den); + + private static ColorRgb24 InterpolateColor(ColorRgb24 c0, ColorRgb24 c1, int num, float den) => new ColorRgb24( + (byte)Interpolate(c0.r, c1.r, num, den), + (byte)Interpolate(c0.g, c1.g, num, den), + (byte)Interpolate(c0.b, c1.b, num, den)); + } +} diff --git a/BCnEncTests/BC1Tests.cs b/BCnEncTests/BC1Tests.cs index 77492f4..4171d73 100644 --- a/BCnEncTests/BC1Tests.cs +++ b/BCnEncTests/BC1Tests.cs @@ -94,10 +94,10 @@ public void DecodeBlack() { Assert.Equal(new Rgba32(0, 0, 0), raw.p21); Assert.Equal(new Rgba32(0, 0, 0), raw.p31); - Assert.Equal(new Rgba32(230, 228, 230), raw.p02); - Assert.Equal(new Rgba32(230, 228, 230), raw.p12); - Assert.Equal(new Rgba32(230, 228, 230), raw.p22); - Assert.Equal(new Rgba32(230, 228, 230), raw.p32); + Assert.Equal(new Rgba32(230, 229, 230), raw.p02); + Assert.Equal(new Rgba32(230, 229, 230), raw.p12); + Assert.Equal(new Rgba32(230, 229, 230), raw.p22); + Assert.Equal(new Rgba32(230, 229, 230), raw.p32); Assert.Equal(new Rgba32(255, 255, 255), raw.p03); Assert.Equal(new Rgba32(255, 255, 255), raw.p13); @@ -143,10 +143,10 @@ public void DecodeAlpha() { Assert.Equal(new Rgba32(0,0,0,0), raw.p21); Assert.Equal(new Rgba32(0,0,0,0), raw.p31); - Assert.Equal(new Rgba32(230, 228, 230), raw.p02); - Assert.Equal(new Rgba32(230, 228, 230), raw.p12); - Assert.Equal(new Rgba32(230, 228, 230), raw.p22); - Assert.Equal(new Rgba32(230, 228, 230), raw.p32); + Assert.Equal(new Rgba32(230, 229, 230), raw.p02); + Assert.Equal(new Rgba32(230, 229, 230), raw.p12); + Assert.Equal(new Rgba32(230, 229, 230), raw.p22); + Assert.Equal(new Rgba32(230, 229, 230), raw.p32); Assert.Equal(new Rgba32(255, 255, 255), raw.p03); Assert.Equal(new Rgba32(255, 255, 255), raw.p13); From 22505e78c95a1c4e764034e86da071aa3cd26d64 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Mon, 11 Jan 2021 15:28:29 +0100 Subject: [PATCH 010/116] Add test to assert the functionality of raw byte encoding and decoding methods; --- BCnEncTests/RawTests.cs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 BCnEncTests/RawTests.cs diff --git a/BCnEncTests/RawTests.cs b/BCnEncTests/RawTests.cs new file mode 100644 index 0000000..9869230 --- /dev/null +++ b/BCnEncTests/RawTests.cs @@ -0,0 +1,32 @@ +using System.IO; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using Xunit; + +namespace BCnEncTests +{ + public class RawTests + { + [Fact] + public void Decode() + { + using var fs = File.OpenRead(@"../../../testImages/test_decompress_bc1.ktx"); + var ktx = KtxFile.Load(fs); + var decoder = new BcDecoder(); + var encoder = new BcEncoder(); + + var originalImage = decoder.Decode(ktx); + + var rawBytes = encoder.EncodeToRawBytes(originalImage); + var recodedImage = decoder.DecodeRaw(rawBytes[0], CompressionFormat.BC1, originalImage.Width, originalImage.Height); + + originalImage.TryGetSinglePixelSpan(out var originalPixels); + recodedImage.TryGetSinglePixelSpan(out var recodedPixels); + + // I don't know if this is the best possibility to compare the images + for (var i = 0; i < ktx.Header.PixelWidth * ktx.Header.PixelHeight; i++) + Assert.Equal(originalPixels[i], recodedPixels[i]); + } + } +} From 25f1bd2f831bfbb598a113a56c9ec6d7f203efd1 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Mon, 11 Jan 2021 16:10:27 +0100 Subject: [PATCH 011/116] Cast Interpolate den parameter to float inline; --- BCnEnc.Net/Shared/Interpolation.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BCnEnc.Net/Shared/Interpolation.cs b/BCnEnc.Net/Shared/Interpolation.cs index aad559a..140b00d 100644 --- a/BCnEnc.Net/Shared/Interpolation.cs +++ b/BCnEnc.Net/Shared/Interpolation.cs @@ -29,10 +29,10 @@ public static ColorRgb24 Third(this ColorRgb24 c0, ColorRgb24 c1, int num) => /// The dividend. /// The divisor. /// The interpolated component. - public static int Interpolate(int a, int b, int num, float den) => - (int)(((den - num) * a + num * b) / den); + public static int Interpolate(int a, int b, int num, int den) => + (int)(((den - num) * a + num * b) / (float)den); - private static ColorRgb24 InterpolateColor(ColorRgb24 c0, ColorRgb24 c1, int num, float den) => new ColorRgb24( + private static ColorRgb24 InterpolateColor(ColorRgb24 c0, ColorRgb24 c1, int num, int den) => new ColorRgb24( (byte)Interpolate(c0.r, c1.r, num, den), (byte)Interpolate(c0.g, c1.g, num, den), (byte)Interpolate(c0.b, c1.b, num, den)); From abb062bd36f393123248de60ec0c89448ca0b843 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Mon, 11 Jan 2021 16:21:36 +0100 Subject: [PATCH 012/116] RawTests uses ImageQuality.PeakSignalToNoiseRatio method to assert image equality; --- BCnEncTests/RawTests.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/BCnEncTests/RawTests.cs b/BCnEncTests/RawTests.cs index 9869230..9e0c5d5 100644 --- a/BCnEncTests/RawTests.cs +++ b/BCnEncTests/RawTests.cs @@ -24,9 +24,15 @@ public void Decode() originalImage.TryGetSinglePixelSpan(out var originalPixels); recodedImage.TryGetSinglePixelSpan(out var recodedPixels); - // I don't know if this is the best possibility to compare the images - for (var i = 0; i < ktx.Header.PixelWidth * ktx.Header.PixelHeight; i++) - Assert.Equal(originalPixels[i], recodedPixels[i]); + var psnr=ImageQuality.PeakSignalToNoiseRatio(originalPixels, recodedPixels); + if (encoder.OutputOptions.quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } } } } From e0425ff39c85aeb0b18d8128beb58cdc93ca2523 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Mon, 11 Jan 2021 16:33:13 +0100 Subject: [PATCH 013/116] Rename color interpolation extensions; --- BCnEnc.Net/Shared/EncodedBlocks.cs | 14 +++++++------- BCnEnc.Net/Shared/Interpolation.cs | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index e88cfa6..c106d49 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -38,13 +38,13 @@ public readonly RawBlock4X4Rgba32 Decode(bool useAlpha) stackalloc ColorRgb24[] { color0, color1, - color0.Half(color1), + color0.InterpolateHalf(color1), new ColorRgb24(0, 0, 0) } : stackalloc ColorRgb24[] { color0, color1, - color0.Third(color1, 1), - color0.Third(color1, 2) + color0.InterpolateThird(color1, 1), + color0.InterpolateThird(color1, 2) }; for (int i = 0; i < pixels.Length; i++) @@ -112,8 +112,8 @@ public readonly RawBlock4X4Rgba32 Decode() Span colors = stackalloc ColorRgb24[] { color0, color1, - color0.Third(color1, 1), - color0.Third(color1, 2) + color0.InterpolateThird(color1, 1), + color0.InterpolateThird(color1, 2) }; for (int i = 0; i < pixels.Length; i++) @@ -195,8 +195,8 @@ public readonly RawBlock4X4Rgba32 Decode() Span colors = stackalloc ColorRgb24[] { color0, color1, - color0.Third(color1, 1), - color0.Third(color1, 2) + color0.InterpolateThird(color1, 1), + color0.InterpolateThird(color1, 2) }; Span alphas = a0 > a1 ? stackalloc byte[] { diff --git a/BCnEnc.Net/Shared/Interpolation.cs b/BCnEnc.Net/Shared/Interpolation.cs index 140b00d..c9c0779 100644 --- a/BCnEnc.Net/Shared/Interpolation.cs +++ b/BCnEnc.Net/Shared/Interpolation.cs @@ -8,7 +8,7 @@ internal static class Interpolation /// The first color endpoint. /// The second color endpoint. /// The interpolated color. - public static ColorRgb24 Half(this ColorRgb24 c0, ColorRgb24 c1) => + public static ColorRgb24 InterpolateHalf(this ColorRgb24 c0, ColorRgb24 c1) => InterpolateColor(c0, c1, 1, 2); /// @@ -18,7 +18,7 @@ public static ColorRgb24 Half(this ColorRgb24 c0, ColorRgb24 c1) => /// The second color endpoint. /// The dividend in the third. /// The interpolated color. - public static ColorRgb24 Third(this ColorRgb24 c0, ColorRgb24 c1, int num) => + public static ColorRgb24 InterpolateThird(this ColorRgb24 c0, ColorRgb24 c1, int num) => InterpolateColor(c0, c1, num, 3); /// From c1aef0bafeefb0f7084370a80b7258d2f0bf59b5 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Mon, 11 Jan 2021 20:14:14 +0100 Subject: [PATCH 014/116] General code cleanup and style fixes; Further removing of code duplicates; --- BCnEnc.Net/Decoder/Bc7Decoder.cs | 32 - BCnEnc.Net/Decoder/BcBlockDecoder.cs | 247 +++--- BCnEnc.Net/Decoder/BcDecoder.cs | 182 ++-- .../Decoder/Options/DecoderInputOptions.cs | 7 +- .../Decoder/Options/DecoderOutputOptions.cs | 11 +- BCnEnc.Net/Decoder/RawDecoder.cs | 197 +++-- BCnEnc.Net/Encoder/Bc1BlockEncoder.cs | 116 +-- BCnEnc.Net/Encoder/Bc2BlockEncoder.cs | 52 +- BCnEnc.Net/Encoder/Bc3BlockEncoder.cs | 106 +-- BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 78 +- BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 84 +- BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs | 107 ++- BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs | 286 +++---- BCnEnc.Net/Encoder/Bc7/Bc7Mode0Encoder.cs | 20 +- BCnEnc.Net/Encoder/Bc7/Bc7Mode1Encoder.cs | 18 +- BCnEnc.Net/Encoder/Bc7/Bc7Mode2Encoder.cs | 18 +- BCnEnc.Net/Encoder/Bc7/Bc7Mode3Encoder.cs | 20 +- BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs | 34 +- BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs | 32 +- BCnEnc.Net/Encoder/Bc7/Bc7Mode6Encoder.cs | 14 +- BCnEnc.Net/Encoder/Bc7/Bc7Mode7Encoder.cs | 20 +- BCnEnc.Net/Encoder/BcEncoder.cs | 203 +++-- BCnEnc.Net/Encoder/ColorChooser.cs | 70 +- BCnEnc.Net/Encoder/ColorVariationGenerator.cs | 10 +- BCnEnc.Net/Encoder/CompressionQuality.cs | 6 +- BCnEnc.Net/Encoder/IBcBlockEncoder.cs | 4 +- .../Encoder/Options/EncoderInputOptions.cs | 7 +- BCnEnc.Net/Encoder/Options/EncoderOptions.cs | 3 + .../Encoder/Options/EncoderOutputOptions.cs | 23 +- BCnEnc.Net/Encoder/RawEncoders.cs | 86 +- BCnEnc.Net/Shared/Bc7Block.cs | 298 +++---- .../Shared/BinaryReaderWriterExtensions.cs | 14 +- BCnEnc.Net/Shared/ByteHelper.cs | 26 +- BCnEnc.Net/Shared/Colors.cs | 280 +++---- BCnEnc.Net/Shared/CompressionFormat.cs | 30 +- BCnEnc.Net/Shared/DdsFile.cs | 790 +++++++++--------- BCnEnc.Net/Shared/EncodedBlocks.cs | 110 +-- BCnEnc.Net/Shared/GLFormat.cs | 326 ++++---- BCnEnc.Net/Shared/ImageQuality.cs | 8 +- BCnEnc.Net/Shared/ImageToBlocks.cs | 60 +- BCnEnc.Net/Shared/KtxFile.cs | 132 +-- BCnEnc.Net/Shared/LinearClustering.cs | 156 ++-- BCnEnc.Net/Shared/MipMapper.cs | 10 +- BCnEnc.Net/Shared/OutputFileFormat.cs | 4 +- BCnEnc.Net/Shared/PcaVectors.cs | 204 ++--- BCnEnc.Net/Shared/RawBlocks.cs | 14 +- BCnEnc.Net/Shared/RgbBoundingBox.cs | 116 +-- BCnEncTests/Bc7BlockTests.cs | 4 +- BCnEncTests/DdsReadTests.cs | 26 +- BCnEncTests/DdsWritingTests.cs | 64 +- BCnEncTests/DecodingTests.cs | 72 +- BCnEncTests/EncodingTest.cs | 68 +- BCnEncTests/RawTests.cs | 4 +- BCnEncTests/TestHelper.cs | 6 +- 54 files changed, 2478 insertions(+), 2437 deletions(-) delete mode 100644 BCnEnc.Net/Decoder/Bc7Decoder.cs diff --git a/BCnEnc.Net/Decoder/Bc7Decoder.cs b/BCnEnc.Net/Decoder/Bc7Decoder.cs deleted file mode 100644 index 11a72b6..0000000 --- a/BCnEnc.Net/Decoder/Bc7Decoder.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.IO; -using System.Runtime.InteropServices; -using BCnEncoder.Shared; - -namespace BCnEncoder.Decoder -{ - internal class Bc7Decoder : IBcBlockDecoder - { - public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) { - blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); - - if (data.Length != (blockWidth * blockHeight * Marshal.SizeOf())) { - throw new InvalidDataException(); - } - - var encodedBlocks = MemoryMarshal.Cast(data); - - RawBlock4X4Rgba32[,] output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; - - for (int x = 0; x < blockWidth; x++) { - for (int y = 0; y < blockHeight; y++) { - var rawBlock = encodedBlocks[x + y * blockWidth]; - output[x, y] = rawBlock.Decode(); - } - } - - return output; - } - } -} diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index 5bfa778..37dea11 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -5,152 +5,103 @@ namespace BCnEncoder.Decoder { - internal interface IBcBlockDecoder { - RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, - out int blockHeight); - } - - internal class Bc1NoAlphaDecoder : IBcBlockDecoder { - public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) { - blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); - - if (data.Length != (blockWidth * blockHeight * Marshal.SizeOf())) { - throw new InvalidDataException(); - } - - var encodedBlocks = MemoryMarshal.Cast(data); - - RawBlock4X4Rgba32[,] output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; - - for (int x = 0; x < blockWidth; x++) { - for (int y = 0; y < blockHeight; y++) { - output[x, y] = encodedBlocks[x + y * blockWidth].Decode(false); - } - } - - return output; - } - } - - internal class Bc1ADecoder : IBcBlockDecoder { - public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) { - blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); - - if (data.Length != (blockWidth * blockHeight * Marshal.SizeOf())) { - throw new InvalidDataException(); - } - - var encodedBlocks = MemoryMarshal.Cast(data); - - RawBlock4X4Rgba32[,] output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; - - for (int x = 0; x < blockWidth; x++) { - for (int y = 0; y < blockHeight; y++) { - output[x, y] = encodedBlocks[x + y * blockWidth].Decode(true); - } - } - - return output; - } - } - - internal class Bc2Decoder : IBcBlockDecoder { - public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) { - blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); - - if (data.Length != (blockWidth * blockHeight * Marshal.SizeOf())) { - throw new InvalidDataException(); - } - - var encodedBlocks = MemoryMarshal.Cast(data); - - RawBlock4X4Rgba32[,] output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; - - for (int x = 0; x < blockWidth; x++) { - for (int y = 0; y < blockHeight; y++) { - output[x, y] = encodedBlocks[x + y * blockWidth].Decode(); - } - } - - return output; - } - } - - internal class Bc3Decoder : IBcBlockDecoder { - public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) { - blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); - - if (data.Length != (blockWidth * blockHeight * Marshal.SizeOf())) { - throw new InvalidDataException(); - } - - var encodedBlocks = MemoryMarshal.Cast(data); - - RawBlock4X4Rgba32[,] output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; - - for (int x = 0; x < blockWidth; x++) { - for (int y = 0; y < blockHeight; y++) { - output[x, y] = encodedBlocks[x + y * blockWidth].Decode(); - } - } - - return output; - } - } - - internal class Bc4Decoder : IBcBlockDecoder { - private readonly bool redAsLuminance; - public Bc4Decoder(bool redAsLuminance) { - this.redAsLuminance = redAsLuminance; - } - - public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) { - blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); - - if (data.Length != (blockWidth * blockHeight * Marshal.SizeOf())) { - throw new InvalidDataException(); - } - - var encodedBlocks = MemoryMarshal.Cast(data); - - RawBlock4X4Rgba32[,] output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; - - for (int x = 0; x < blockWidth; x++) { - for (int y = 0; y < blockHeight; y++) { - output[x, y] = encodedBlocks[x + y * blockWidth].Decode(redAsLuminance); - } - } - - return output; - } - } - - internal class Bc5Decoder : IBcBlockDecoder { - - public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) { - blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); - - if (data.Length != (blockWidth * blockHeight * Marshal.SizeOf())) { - throw new InvalidDataException(); - } - - var encodedBlocks = MemoryMarshal.Cast(data); - - RawBlock4X4Rgba32[,] output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; - - for (int x = 0; x < blockWidth; x++) { - for (int y = 0; y < blockHeight; y++) { - output[x, y] = encodedBlocks[x + y * blockWidth].Decode(); - } - } - - return output; - } - } + internal interface IBcBlockDecoder + { + RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, + out int blockHeight); + } + + internal abstract class BaseBcBlockDecoder : IBcBlockDecoder + where T : struct + { + public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) + { + blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); + blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); + + if (data.Length != blockWidth * blockHeight * Marshal.SizeOf()) + { + throw new InvalidDataException("Given data does not match expected length."); + } + + var encodedBlocks = MemoryMarshal.Cast(data); + + var output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; + + for (var x = 0; x < blockWidth; x++) + { + for (var y = 0; y < blockHeight; y++) + { + output[x, y] = DecodeBlock(encodedBlocks[x + y * blockWidth]); + } + } + + return output; + } + + protected abstract RawBlock4X4Rgba32 DecodeBlock(T block); + } + + internal class Bc1NoAlphaDecoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) + { + return block.Decode(false); + } + } + + internal class Bc1ADecoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) + { + return block.Decode(true); + } + } + + internal class Bc2Decoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc2Block block) + { + return block.Decode(); + } + } + + internal class Bc3Decoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc3Block block) + { + return block.Decode(); + } + } + + internal class Bc4Decoder : BaseBcBlockDecoder + { + private readonly bool redAsLuminance; + + public Bc4Decoder(bool redAsLuminance) + { + this.redAsLuminance = redAsLuminance; + } + + protected override RawBlock4X4Rgba32 DecodeBlock(Bc4Block block) + { + return block.Decode(redAsLuminance); + } + } + + internal class Bc5Decoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc5Block block) + { + return block.Decode(); + } + } + + internal class Bc7Decoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc7Block block) + { + return block.Decode(); + } + } } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 0db77db..7698856 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -9,7 +9,7 @@ namespace BCnEncoder.Decoder { /// - /// Decodes compressed files into Rgba format. + /// Decodes compressed files into Rgba Format. /// public class BcDecoder { @@ -27,7 +27,7 @@ public class BcDecoder /// Decode raw encoded image data. /// /// The stream containing the encoded data. - /// The format the encoded data is in. + /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The decoded Rgba32 image. @@ -43,7 +43,7 @@ public Image DecodeRaw(Stream inputStream, CompressionFormat format, int /// Decode raw encoded image data. /// /// The array containing the encoded data. - /// The format the encoded data is in. + /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The decoded Rgba32 image. @@ -65,7 +65,9 @@ public Image DecodeRaw(byte[] input, CompressionFormat format, int pixel var image = new Image(pixelWidth, pixelHeight); var output = rawDecoder.Decode(input, pixelWidth, pixelHeight); if (!image.TryGetSinglePixelSpan(out var pixels)) + { throw new Exception("Cannot get pixel span."); + } output.CopyTo(pixels); return image; @@ -194,9 +196,9 @@ private Image[] Decode(KtxFile file, bool allMipMaps) { var images = new Image[file.MipMaps.Count]; - if (IsSupportedRawFormat(file.Header.GlInternalFormat)) + if (IsSupportedRawFormat(file.header.GlInternalFormat)) { - var decoder = GetRawDecoder(file.Header.GlInternalFormat); + var decoder = GetRawDecoder(file.header.GlInternalFormat); var mipMaps = allMipMaps ? file.MipMaps.Count : 1; for (var mip = 0; mip < mipMaps; mip++) @@ -208,7 +210,9 @@ private Image[] Decode(KtxFile file, bool allMipMaps) var image = new Image((int)pixelWidth, (int)pixelHeight); var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); if (!image.TryGetSinglePixelSpan(out var pixels)) + { throw new Exception("Cannot get pixel span."); + } output.CopyTo(pixels); images[mip] = image; @@ -216,9 +220,11 @@ private Image[] Decode(KtxFile file, bool allMipMaps) } else { - var decoder = GetDecoder(file.Header.GlInternalFormat); + var decoder = GetDecoder(file.header.GlInternalFormat); if (decoder == null) - throw new NotSupportedException($"This format is not supported: {file.Header.GlInternalFormat}"); + { + throw new NotSupportedException($"This Format is not supported: {file.header.GlInternalFormat}"); + } var mipMaps = allMipMaps ? file.MipMaps.Count : 1; for (var mip = 0; mip < mipMaps; mip++) @@ -244,13 +250,13 @@ private Image[] Decode(KtxFile file, bool allMipMaps) /// An array of decoded Rgba32 images. private Image[] Decode(DdsFile file, bool allMipMaps) { - var images = new Image[file.Header.dwMipMapCount]; + var images = new Image[file.header.dwMipMapCount]; - if (IsSupportedRawFormat(file.Header.ddsPixelFormat.DxgiFormat)) + if (IsSupportedRawFormat(file.header.ddsPixelFormat.DxgiFormat)) { - var decoder = GetRawDecoder(file.Header.ddsPixelFormat.DxgiFormat); + var decoder = GetRawDecoder(file.header.ddsPixelFormat.DxgiFormat); - var mipMaps = allMipMaps ? file.Header.dwMipMapCount : 1; + var mipMaps = allMipMaps ? file.header.dwMipMapCount : 1; for (var mip = 0; mip < mipMaps; mip++) { var data = file.Faces[0].MipMaps[mip].Data; @@ -260,7 +266,9 @@ private Image[] Decode(DdsFile file, bool allMipMaps) var image = new Image((int)pixelWidth, (int)pixelHeight); var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); if (!image.TryGetSinglePixelSpan(out var pixels)) + { throw new Exception("Cannot get pixel span."); + } output.CopyTo(pixels); images[mip] = image; @@ -268,15 +276,17 @@ private Image[] Decode(DdsFile file, bool allMipMaps) } else { - var format = file.Header.ddsPixelFormat.IsDxt10Format ? - file.Dxt10Header.dxgiFormat : - file.Header.ddsPixelFormat.DxgiFormat; - var decoder = GetDecoder(format, file.Header); + var format = file.header.ddsPixelFormat.IsDxt10Format ? + file.dxt10Header.dxgiFormat : + file.header.ddsPixelFormat.DxgiFormat; + var decoder = GetDecoder(format, file.header); if (decoder == null) - throw new NotSupportedException($"This format is not supported: {format}"); + { + throw new NotSupportedException($"This Format is not supported: {format}"); + } - for (var mip = 0; mip < file.Header.dwMipMapCount; mip++) + for (var mip = 0; mip < file.header.dwMipMapCount; mip++) { var data = file.Faces[0].MipMaps[mip].Data; var pixelWidth = file.Faces[0].MipMaps[mip].Width; @@ -299,10 +309,10 @@ private bool IsSupportedRawFormat(GlInternalFormat format) { switch (format) { - case GlInternalFormat.GL_R8: - case GlInternalFormat.GL_RG8: - case GlInternalFormat.GL_RGB8: - case GlInternalFormat.GL_RGBA8: + case GlInternalFormat.GlR8: + case GlInternalFormat.GlRg8: + case GlInternalFormat.GlRgb8: + case GlInternalFormat.GlRgba8: return true; default: @@ -310,13 +320,13 @@ private bool IsSupportedRawFormat(GlInternalFormat format) } } - private bool IsSupportedRawFormat(DXGI_FORMAT format) + private bool IsSupportedRawFormat(DxgiFormat format) { switch (format) { - case DXGI_FORMAT.DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM: + case DxgiFormat.DxgiFormatR8Unorm: + case DxgiFormat.DxgiFormatR8G8Unorm: + case DxgiFormat.DxgiFormatR8G8B8A8Unorm: return true; default: @@ -328,29 +338,29 @@ private IBcBlockDecoder GetDecoder(GlInternalFormat format) { switch (format) { - case GlInternalFormat.GL_COMPRESSED_RGB_S3TC_DXT1_EXT: + case GlInternalFormat.GlCompressedRgbS3TcDxt1Ext: return new Bc1NoAlphaDecoder(); - case GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GlInternalFormat.GlCompressedRgbaS3TcDxt1Ext: return new Bc1ADecoder(); - case GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + case GlInternalFormat.GlCompressedRgbaS3TcDxt3Ext: return new Bc2Decoder(); - case GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + case GlInternalFormat.GlCompressedRgbaS3TcDxt5Ext: return new Bc3Decoder(); - case GlInternalFormat.GL_COMPRESSED_RED_RGTC1_EXT: - return new Bc4Decoder(OutputOptions.redAsLuminance); + case GlInternalFormat.GlCompressedRedRgtc1Ext: + return new Bc4Decoder(OutputOptions.RedAsLuminance); - case GlInternalFormat.GL_COMPRESSED_RED_GREEN_RGTC2_EXT: + case GlInternalFormat.GlCompressedRedGreenRgtc2Ext: return new Bc5Decoder(); - case GlInternalFormat.GL_COMPRESSED_RGBA_BPTC_UNORM_ARB: + case GlInternalFormat.GlCompressedRgbaBptcUnormArb: return new Bc7Decoder(); // TODO: Not sure what to do with SRGB input. - case GlInternalFormat.GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB: + case GlInternalFormat.GlCompressedSrgbAlphaBptcUnormArb: return new Bc7Decoder(); default: @@ -358,44 +368,44 @@ private IBcBlockDecoder GetDecoder(GlInternalFormat format) } } - private IBcBlockDecoder GetDecoder(DXGI_FORMAT format, DdsHeader header) + private IBcBlockDecoder GetDecoder(DxgiFormat format, DdsHeader header) { switch (format) { - case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC1_TYPELESS: - if ((header.ddsPixelFormat.dwFlags & PixelFormatFlags.DDPF_ALPHAPIXELS) != 0) + case DxgiFormat.DxgiFormatBc1Unorm: + case DxgiFormat.DxgiFormatBc1UnormSrgb: + case DxgiFormat.DxgiFormatBc1Typeless: + if ((header.ddsPixelFormat.dwFlags & PixelFormatFlags.DdpfAlphapixels) != 0) return new Bc1ADecoder(); - if (InputOptions.ddsBc1ExpectAlpha) + if (InputOptions.DdsBc1ExpectAlpha) return new Bc1ADecoder(); return new Bc1NoAlphaDecoder(); - case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC2_TYPELESS: + case DxgiFormat.DxgiFormatBc2Unorm: + case DxgiFormat.DxgiFormatBc2UnormSrgb: + case DxgiFormat.DxgiFormatBc2Typeless: return new Bc2Decoder(); - case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC3_TYPELESS: + case DxgiFormat.DxgiFormatBc3Unorm: + case DxgiFormat.DxgiFormatBc3UnormSrgb: + case DxgiFormat.DxgiFormatBc3Typeless: return new Bc3Decoder(); - case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC4_TYPELESS: - return new Bc4Decoder(OutputOptions.redAsLuminance); + case DxgiFormat.DxgiFormatBc4Unorm: + case DxgiFormat.DxgiFormatBc4Snorm: + case DxgiFormat.DxgiFormatBc4Typeless: + return new Bc4Decoder(OutputOptions.RedAsLuminance); - case DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC5_SNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC5_TYPELESS: + case DxgiFormat.DxgiFormatBc5Unorm: + case DxgiFormat.DxgiFormatBc5Snorm: + case DxgiFormat.DxgiFormatBc5Typeless: return new Bc5Decoder(); - case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC7_TYPELESS: + case DxgiFormat.DxgiFormatBc7Unorm: + case DxgiFormat.DxgiFormatBc7UnormSrgb: + case DxgiFormat.DxgiFormatBc7Typeless: return new Bc7Decoder(); default: @@ -407,35 +417,35 @@ private IRawDecoder GetRawDecoder(GlInternalFormat format) { switch (format) { - case GlInternalFormat.GL_R8: - return new RawRDecoder(OutputOptions.redAsLuminance); + case GlInternalFormat.GlR8: + return new RawRDecoder(OutputOptions.RedAsLuminance); - case GlInternalFormat.GL_RG8: - return new RawRGDecoder(); + case GlInternalFormat.GlRg8: + return new RawRgDecoder(); - case GlInternalFormat.GL_RGB8: - return new RawRGBDecoder(); + case GlInternalFormat.GlRgb8: + return new RawRgbDecoder(); - case GlInternalFormat.GL_RGBA8: - return new RawRGBADecoder(); + case GlInternalFormat.GlRgba8: + return new RawRgbaDecoder(); default: return null; } } - private IRawDecoder GetRawDecoder(DXGI_FORMAT format) + private IRawDecoder GetRawDecoder(DxgiFormat format) { switch (format) { - case DXGI_FORMAT.DXGI_FORMAT_R8_UNORM: - return new RawRDecoder(OutputOptions.redAsLuminance); + case DxgiFormat.DxgiFormatR8Unorm: + return new RawRDecoder(OutputOptions.RedAsLuminance); - case DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM: - return new RawRGDecoder(); + case DxgiFormat.DxgiFormatR8G8Unorm: + return new RawRgDecoder(); - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM: - return new RawRGBADecoder(); + case DxgiFormat.DxgiFormatR8G8B8A8Unorm: + return new RawRgbaDecoder(); default: return null; @@ -446,25 +456,25 @@ private IBcBlockDecoder GetDecoder(CompressionFormat format) { switch (format) { - case CompressionFormat.BC1: + case CompressionFormat.Bc1: return new Bc1NoAlphaDecoder(); - case CompressionFormat.BC1WithAlpha: + case CompressionFormat.Bc1WithAlpha: return new Bc1ADecoder(); - case CompressionFormat.BC2: + case CompressionFormat.Bc2: return new Bc2Decoder(); - case CompressionFormat.BC3: + case CompressionFormat.Bc3: return new Bc3Decoder(); - case CompressionFormat.BC4: - return new Bc4Decoder(OutputOptions.redAsLuminance); + case CompressionFormat.Bc4: + return new Bc4Decoder(OutputOptions.RedAsLuminance); - case CompressionFormat.BC5: + case CompressionFormat.Bc5: return new Bc5Decoder(); - case CompressionFormat.BC7: + case CompressionFormat.Bc7: return new Bc7Decoder(); default: @@ -477,16 +487,16 @@ private IRawDecoder GetRawDecoder(CompressionFormat format) switch (format) { case CompressionFormat.R: - return new RawRDecoder(OutputOptions.redAsLuminance); + return new RawRDecoder(OutputOptions.RedAsLuminance); - case CompressionFormat.RG: - return new RawRGDecoder(); + case CompressionFormat.Rg: + return new RawRgDecoder(); - case CompressionFormat.RGB: - return new RawRGBDecoder(); + case CompressionFormat.Rgb: + return new RawRgbDecoder(); - case CompressionFormat.RGBA: - return new RawRGBADecoder(); + case CompressionFormat.Rgba: + return new RawRgbaDecoder(); default: throw new ArgumentOutOfRangeException(nameof(format), format, null); diff --git a/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs index 9529ab4..ed2e650 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderInputOptions.cs @@ -1,13 +1,16 @@ namespace BCnEncoder.Decoder.Options { + /// + /// A class for the decoder input options. + /// public class DecoderInputOptions { /// - /// The DDS file format doesn't seem to have a standard for indicating whether a BC1 texture + /// The DDS file Format doesn't seem to have a standard for indicating whether a BC1 texture /// includes 1bit of alpha. This option will assume that all Bc1 textures contain alpha. /// If this option is false, but the dds header includes a DDPF_ALPHAPIXELS flag, alpha will be included. /// Default is true. /// - public bool ddsBc1ExpectAlpha = true; + public bool DdsBc1ExpectAlpha { get; set; } = true; } } diff --git a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs index c1374f8..6cb2526 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs @@ -1,13 +1,14 @@ -using BCnEncoder.Shared; - -namespace BCnEncoder.Decoder.Options +namespace BCnEncoder.Decoder.Options { + /// + /// A class for the decoder output options. + /// public class DecoderOutputOptions { /// - /// If true, when decoding from a format that only includes a red channel, + /// If true, when decoding from a Format that only includes a red channel, /// output pixels will have all colors set to the same value (greyscale). Default is true. /// - public bool redAsLuminance = true; + public bool RedAsLuminance { get; set; } = true; } } diff --git a/BCnEnc.Net/Decoder/RawDecoder.cs b/BCnEnc.Net/Decoder/RawDecoder.cs index 75f77fe..64332e3 100644 --- a/BCnEnc.Net/Decoder/RawDecoder.cs +++ b/BCnEnc.Net/Decoder/RawDecoder.cs @@ -1,76 +1,139 @@ -using System; -using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.PixelFormats; +using System; namespace BCnEncoder.Decoder { - internal interface IRawDecoder { - Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight); - } + internal interface IRawDecoder + { + Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight); + } - public class RawRDecoder : IRawDecoder { - private readonly bool redAsLuminance; - public RawRDecoder(bool redAsLuminance) { - this.redAsLuminance = redAsLuminance; - } + /// + /// A class to decode data to R components. + /// + public class RawRDecoder : IRawDecoder + { + private readonly bool redAsLuminance; - public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) { - Rgba32[] output = new Rgba32[pixelWidth * pixelHeight]; - for (int i = 0; i < output.Length; i++) { - if (redAsLuminance) { - output[i].R = data[i]; - output[i].G = data[i]; - output[i].B = data[i]; - } - else { - output[i].R = data[i]; - output[i].G = 0; - output[i].B = 0; - } - output[i].A = 255; - } - return output; - } - } + /// + /// Create a new instance of . + /// + /// If the decoded component should be used as the red component or luminence. + public RawRDecoder(bool redAsLuminance) + { + this.redAsLuminance = redAsLuminance; + } - public class RawRGDecoder : IRawDecoder - { - public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) { - Rgba32[] output = new Rgba32[pixelWidth * pixelHeight]; - for (int i = 0; i < output.Length; i++) { - output[i].R = data[i * 2]; - output[i].G = data[i * 2 + 1]; - output[i].B = 0; - output[i].A = 255; - } - return output; - } - } + /// + /// Decode the data to color components. + /// + /// The data to decode. + /// The width of the image in pixels. + /// The height of the image in pixels. + /// The decoded color components. + public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) + { + var output = new Rgba32[pixelWidth * pixelHeight]; + for (var i = 0; i < output.Length; i++) + { + if (redAsLuminance) + { + output[i].R = data[i]; + output[i].G = data[i]; + output[i].B = data[i]; + } + else + { + output[i].R = data[i]; + output[i].G = 0; + output[i].B = 0; + } - public class RawRGBDecoder : IRawDecoder - { - public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) { - Rgba32[] output = new Rgba32[pixelWidth * pixelHeight]; - for (int i = 0; i < output.Length; i++) { - output[i].R = data[i * 3]; - output[i].G = data[i * 3 + 1]; - output[i].B = data[i * 3 + 2]; - output[i].A = 255; - } - return output; - } - } + output[i].A = 255; + } - public class RawRGBADecoder : IRawDecoder - { - public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) { - Rgba32[] output = new Rgba32[pixelWidth * pixelHeight]; - for (int i = 0; i < output.Length; i++) { - output[i].R = data[i * 4]; - output[i].G = data[i * 4 + 1]; - output[i].B = data[i * 4 + 2]; - output[i].A = data[i * 4 + 3]; - } - return output; - } - } + return output; + } + } + + /// + /// A class to decode data to RG components. + /// + public class RawRgDecoder : IRawDecoder + { + /// + /// Decode the data to color components. + /// + /// The data to decode. + /// The width of the image in pixels. + /// The height of the image in pixels. + /// The decoded color components. + public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) + { + var output = new Rgba32[pixelWidth * pixelHeight]; + for (var i = 0; i < output.Length; i++) + { + output[i].R = data[i * 2]; + output[i].G = data[i * 2 + 1]; + output[i].B = 0; + output[i].A = 255; + } + + return output; + } + } + + /// + /// A class to decode data to RGB components. + /// + public class RawRgbDecoder : IRawDecoder + { + /// + /// Decode the data to color components. + /// + /// The data to decode. + /// The width of the image in pixels. + /// The height of the image in pixels. + /// The decoded color components. + public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) + { + var output = new Rgba32[pixelWidth * pixelHeight]; + for (var i = 0; i < output.Length; i++) + { + output[i].R = data[i * 3]; + output[i].G = data[i * 3 + 1]; + output[i].B = data[i * 3 + 2]; + output[i].A = 255; + } + + return output; + } + } + + /// + /// A class to decode data to RGBA components. + /// + public class RawRgbaDecoder : IRawDecoder + { + /// + /// Decode the data to color components. + /// + /// The data to decode. + /// The width of the image in pixels. + /// The height of the image in pixels. + /// The decoded color components. + public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) + { + var output = new Rgba32[pixelWidth * pixelHeight]; + for (var i = 0; i < output.Length; i++) + { + output[i].R = data[i * 4]; + output[i].G = data[i * 4 + 1]; + output[i].B = data[i * 4 + 2]; + output[i].A = data[i * 4 + 3]; + } + + return output; + } + } } diff --git a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs index 0a0c95d..d53f86d 100644 --- a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs @@ -10,20 +10,20 @@ internal class Bc1BlockEncoder : IBcBlockEncoder public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { - byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; + var outputBlocks = MemoryMarshal.Cast(outputData); if (parallel) { Parallel.For(0, blocks.Length, i => { - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputBlocks = MemoryMarshal.Cast(outputData); outputBlocks[i] = EncodeBlock(blocks[i], quality); }); } else { - for (int i = 0; i < blocks.Length; i++) + for (var i = 0; i < blocks.Length; i++) { outputBlocks[i] = EncodeBlock(blocks[i], quality); } @@ -50,24 +50,24 @@ private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality public GlInternalFormat GetInternalFormat() { - return GlInternalFormat.GL_COMPRESSED_RGB_S3TC_DXT1_EXT; + return GlInternalFormat.GlCompressedRgbS3TcDxt1Ext; } - public GLFormat GetBaseInternalFormat() + public GlFormat GetBaseInternalFormat() { - return GLFormat.GL_RGB; + return GlFormat.GlRgb; } - public DXGI_FORMAT GetDxgiFormat() + public DxgiFormat GetDxgiFormat() { - return DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM; + return DxgiFormat.DxgiFormatBc1Unorm; } #region Encoding private stuff private static Bc1Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0, ColorRgb565 color1, out float error, float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f) { - Bc1Block output = new Bc1Block(); + var output = new Bc1Block(); var pixels = rawBlock.AsSpan; @@ -91,7 +91,7 @@ stackalloc ColorRgb24[] { }; error = 0; - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { var color = pixels[i]; output[i] = ColorChooser.ChooseClosestColor4(colors, color, rWeight, gWeight, bWeight, out var e); @@ -111,14 +111,14 @@ private static class Bc1BlockEncoderFast internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { - Bc1Block output = new Bc1Block(); + var output = new Bc1Block(); var pixels = rawBlock.AsSpan; RgbBoundingBox.Create565(pixels, out var min, out var max); - ColorRgb565 c0 = max; - ColorRgb565 c1 = min; + var c0 = max; + var c1 = min; output = TryColors(rawBlock, c0, c1, out var error); @@ -127,14 +127,14 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } private static class Bc1BlockEncoderBalanced { - private const int maxTries = 24 * 2; - private const float errorThreshold = 0.05f; + private const int MaxTries_ = 24 * 2; + private const float ErrorThreshold_ = 0.05f; internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { var pixels = rawBlock.AsSpan; - PcaVectors.Create(pixels, out System.Numerics.Vector3 mean, out System.Numerics.Vector3 pa); + PcaVectors.Create(pixels, out var mean, out var pa); PcaVectors.GetMinMaxColor565(pixels, mean, pa, out var min, out var max); var c0 = max; @@ -147,9 +147,9 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = c; } - Bc1Block best = TryColors(rawBlock, c0, c1, out float bestError); + var best = TryColors(rawBlock, c0, c1, out var bestError); - for (int i = 0; i < maxTries; i++) { + for (var i = 0; i < MaxTries_; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (newC0.data < newC1.data) @@ -169,7 +169,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < errorThreshold) { + if (bestError < ErrorThreshold_) { break; } } @@ -180,14 +180,14 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc1BlockEncoderSlow { - private const int maxTries = 9999; - private const float errorThreshold = 0.01f; + private const int MaxTries_ = 9999; + private const float ErrorThreshold_ = 0.01f; internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { var pixels = rawBlock.AsSpan; - PcaVectors.Create(pixels, out System.Numerics.Vector3 mean, out System.Numerics.Vector3 pa); + PcaVectors.Create(pixels, out var mean, out var pa); PcaVectors.GetMinMaxColor565(pixels, mean, pa, out var min, out var max); var c0 = max; @@ -200,11 +200,11 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = c; } - Bc1Block best = TryColors(rawBlock, c0, c1, out float bestError); + var best = TryColors(rawBlock, c0, c1, out var bestError); - int lastChanged = 0; + var lastChanged = 0; - for (int i = 0; i < maxTries; i++) { + for (var i = 0; i < MaxTries_; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (newC0.data < newC1.data) @@ -227,7 +227,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < errorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold_ || lastChanged > ColorVariationGenerator.VarPatternCount) { break; } } @@ -244,20 +244,20 @@ internal class Bc1AlphaBlockEncoder : IBcBlockEncoder public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { - byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; + var outputBlocks = MemoryMarshal.Cast(outputData); if (parallel) { Parallel.For(0, blocks.Length, i => { - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputBlocks = MemoryMarshal.Cast(outputData); outputBlocks[i] = EncodeBlock(blocks[i], quality); }); } else { - for (int i = 0; i < blocks.Length; i++) + for (var i = 0; i < blocks.Length; i++) { outputBlocks[i] = EncodeBlock(blocks[i], quality); } @@ -284,22 +284,22 @@ private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality public GlInternalFormat GetInternalFormat() { - return GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; + return GlInternalFormat.GlCompressedRgbaS3TcDxt1Ext; } - public GLFormat GetBaseInternalFormat() + public GlFormat GetBaseInternalFormat() { - return GLFormat.GL_RGBA; + return GlFormat.GlRgba; } - public DXGI_FORMAT GetDxgiFormat() + public DxgiFormat GetDxgiFormat() { - return DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM; + return DxgiFormat.DxgiFormatBc1Unorm; } private static Bc1Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0, ColorRgb565 color1, out float error, float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f) { - Bc1Block output = new Bc1Block(); + var output = new Bc1Block(); var pixels = rawBlock.AsSpan; @@ -309,7 +309,7 @@ private static Bc1Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 var c0 = color0.ToColorRgb24(); var c1 = color1.ToColorRgb24(); - bool hasAlpha = output.HasAlphaOrBlack; + var hasAlpha = output.HasAlphaOrBlack; ReadOnlySpan colors = hasAlpha ? stackalloc ColorRgb24[] { @@ -325,7 +325,7 @@ stackalloc ColorRgb24[] { }; error = 0; - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { var color = pixels[i]; output[i] = ColorChooser.ChooseClosestColor4AlphaCutoff(colors, color, rWeight, gWeight, bWeight, @@ -344,16 +344,16 @@ private static class Bc1AlphaBlockEncoderFast internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { - Bc1Block output = new Bc1Block(); + var output = new Bc1Block(); var pixels = rawBlock.AsSpan; - bool hasAlpha = rawBlock.HasTransparentPixels(); + var hasAlpha = rawBlock.HasTransparentPixels(); RgbBoundingBox.Create565AlphaCutoff(pixels, out var min, out var max); - ColorRgb565 c0 = max; - ColorRgb565 c1 = min; + var c0 = max; + var c1 = min; if (hasAlpha && c0.data > c1.data) { @@ -370,17 +370,17 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc1AlphaBlockEncoderBalanced { - private const int maxTries = 24 * 2; - private const float errorThreshold = 0.05f; + private const int MaxTries_ = 24 * 2; + private const float ErrorThreshold_ = 0.05f; internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { var pixels = rawBlock.AsSpan; - bool hasAlpha = rawBlock.HasTransparentPixels(); + var hasAlpha = rawBlock.HasTransparentPixels(); - PcaVectors.Create(pixels, out System.Numerics.Vector3 mean, out System.Numerics.Vector3 pa); + PcaVectors.Create(pixels, out var mean, out var pa); PcaVectors.GetMinMaxColor565(pixels, mean, pa, out var min, out var max); var c0 = max; @@ -397,9 +397,9 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = c; } - Bc1Block best = TryColors(rawBlock, c0, c1, out float bestError); + var best = TryColors(rawBlock, c0, c1, out var bestError); - for (int i = 0; i < maxTries; i++) { + for (var i = 0; i < MaxTries_; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (!hasAlpha && newC0.data < newC1.data) @@ -423,7 +423,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < errorThreshold) { + if (bestError < ErrorThreshold_) { break; } } @@ -434,16 +434,16 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc1AlphaBlockEncoderSlow { - private const int maxTries = 9999; - private const float errorThreshold = 0.05f; + private const int MaxTries_ = 9999; + private const float ErrorThreshold_ = 0.05f; internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { var pixels = rawBlock.AsSpan; - bool hasAlpha = rawBlock.HasTransparentPixels(); + var hasAlpha = rawBlock.HasTransparentPixels(); - PcaVectors.Create(pixels, out System.Numerics.Vector3 mean, out System.Numerics.Vector3 pa); + PcaVectors.Create(pixels, out var mean, out var pa); PcaVectors.GetMinMaxColor565(pixels, mean, pa, out var min, out var max); var c0 = max; @@ -460,10 +460,10 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = c; } - Bc1Block best = TryColors(rawBlock, c0, c1, out float bestError); + var best = TryColors(rawBlock, c0, c1, out var bestError); - int lastChanged = 0; - for (int i = 0; i < maxTries; i++) { + var lastChanged = 0; + for (var i = 0; i < MaxTries_; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (!hasAlpha && newC0.data < newC1.data) @@ -490,7 +490,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < errorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold_ || lastChanged > ColorVariationGenerator.VarPatternCount) { break; } } diff --git a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs index 2820452..5b15c90 100644 --- a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs @@ -10,20 +10,20 @@ internal class Bc2BlockEncoder : IBcBlockEncoder public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { - byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; + var outputBlocks = MemoryMarshal.Cast(outputData); if (parallel) { Parallel.For(0, blocks.Length, i => { - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputBlocks = MemoryMarshal.Cast(outputData); outputBlocks[i] = EncodeBlock(blocks[i], quality); }); } else { - for (int i = 0; i < blocks.Length; i++) + for (var i = 0; i < blocks.Length; i++) { outputBlocks[i] = EncodeBlock(blocks[i], quality); } @@ -50,23 +50,23 @@ private Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality public GlInternalFormat GetInternalFormat() { - return GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; + return GlInternalFormat.GlCompressedRgbaS3TcDxt3Ext; } - public GLFormat GetBaseInternalFormat() + public GlFormat GetBaseInternalFormat() { - return GLFormat.GL_RGBA; + return GlFormat.GlRgba; } - public DXGI_FORMAT GetDxgiFormat() { - return DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM; + public DxgiFormat GetDxgiFormat() { + return DxgiFormat.DxgiFormatBc2Unorm; } #region Encoding private stuff private static Bc2Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0, ColorRgb565 color1, out float error, float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f) { - Bc2Block output = new Bc2Block(); + var output = new Bc2Block(); var pixels = rawBlock.AsSpan; @@ -84,7 +84,7 @@ private static Bc2Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 }; error = 0; - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { var color = pixels[i]; output.SetAlpha(i, color.A); @@ -110,8 +110,8 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) PcaVectors.Create(pixels, out var mean, out var principalAxis); PcaVectors.GetMinMaxColor565(pixels, mean, principalAxis, out var min, out var max); - ColorRgb565 c0 = max; - ColorRgb565 c1 = min; + var c0 = max; + var c1 = min; var output = TryColors(rawBlock, c0, c1, out var _); @@ -120,22 +120,22 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } private static class Bc2BlockEncoderBalanced { - private const int maxTries = 24 * 2; - private const float errorThreshold = 0.05f; + private const int MaxTries_ = 24 * 2; + private const float ErrorThreshold_ = 0.05f; internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { var pixels = rawBlock.AsSpan; - PcaVectors.Create(pixels, out System.Numerics.Vector3 mean, out System.Numerics.Vector3 pa); + PcaVectors.Create(pixels, out var mean, out var pa); PcaVectors.GetMinMaxColor565(pixels, mean, pa, out var min, out var max); var c0 = max; var c1 = min; - Bc2Block best = TryColors(rawBlock, c0, c1, out float bestError); + var best = TryColors(rawBlock, c0, c1, out var bestError); - for (int i = 0; i < maxTries; i++) { + for (var i = 0; i < MaxTries_; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); var block = TryColors(rawBlock, newC0, newC1, out var error); @@ -148,7 +148,7 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < errorThreshold) { + if (bestError < ErrorThreshold_) { break; } } @@ -159,15 +159,15 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc2BlockEncoderSlow { - private const int maxTries = 9999; - private const float errorThreshold = 0.01f; + private const int MaxTries_ = 9999; + private const float ErrorThreshold_ = 0.01f; internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { var pixels = rawBlock.AsSpan; - PcaVectors.Create(pixels, out System.Numerics.Vector3 mean, out System.Numerics.Vector3 pa); + PcaVectors.Create(pixels, out var mean, out var pa); PcaVectors.GetMinMaxColor565(pixels, mean, pa, out var min, out var max); var c0 = max; @@ -180,11 +180,11 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = c; } - Bc2Block best = TryColors(rawBlock, c0, c1, out float bestError); + var best = TryColors(rawBlock, c0, c1, out var bestError); - int lastChanged = 0; + var lastChanged = 0; - for (int i = 0; i < maxTries; i++) { + for (var i = 0; i < MaxTries_; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (newC0.data < newC1.data) @@ -207,7 +207,7 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < errorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold_ || lastChanged > ColorVariationGenerator.VarPatternCount) { break; } } diff --git a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs index 5957da8..04b854f 100644 --- a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs @@ -11,20 +11,20 @@ internal class Bc3BlockEncoder : IBcBlockEncoder public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { - byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; + var outputBlocks = MemoryMarshal.Cast(outputData); if (parallel) { Parallel.For(0, blocks.Length, i => { - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputBlocks = MemoryMarshal.Cast(outputData); outputBlocks[i] = EncodeBlock(blocks[i], quality); }); } else { - for (int i = 0; i < blocks.Length; i++) + for (var i = 0; i < blocks.Length; i++) { outputBlocks[i] = EncodeBlock(blocks[i], quality); } @@ -51,23 +51,23 @@ private Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality public GlInternalFormat GetInternalFormat() { - return GlInternalFormat.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + return GlInternalFormat.GlCompressedRgbaS3TcDxt5Ext; } - public GLFormat GetBaseInternalFormat() + public GlFormat GetBaseInternalFormat() { - return GLFormat.GL_RGBA; + return GlFormat.GlRgba; } - public DXGI_FORMAT GetDxgiFormat() { - return DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM; + public DxgiFormat GetDxgiFormat() { + return DxgiFormat.DxgiFormatBc3Unorm; } #region Encoding private stuff private static Bc3Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0, ColorRgb565 color1, out float error, float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f) { - Bc3Block output = new Bc3Block(); + var output = new Bc3Block(); var pixels = rawBlock.AsSpan; @@ -85,7 +85,7 @@ private static Bc3Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 }; error = 0; - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { var color = pixels[i]; output[i] = ColorChooser.ChooseClosestColor4(colors, color, rWeight, gWeight, bWeight, out var e); @@ -101,8 +101,8 @@ private static Bc3Block FindAlphaValues(Bc3Block colorBlock, RawBlock4X4Rgba32 r //Find min and max alpha byte minAlpha = 255; byte maxAlpha = 0; - bool hasExtremeValues = false; - for (int i = 0; i < pixels.Length; i++) { + var hasExtremeValues = false; + for (var i = 0; i < pixels.Length; i++) { if (pixels[i].A < 255 && pixels[i].A > 0) { if (pixels[i].A < minAlpha) minAlpha = pixels[i].A; if (pixels[i].A > maxAlpha) maxAlpha = pixels[i].A; @@ -114,10 +114,10 @@ private static Bc3Block FindAlphaValues(Bc3Block colorBlock, RawBlock4X4Rgba32 r int SelectAlphaIndices(ref Bc3Block block) { - int cumulativeError = 0; + var cumulativeError = 0; var a0 = block.Alpha0; var a1 = block.Alpha1; - Span alphas = a0 > a1 ? stackalloc byte[] { + var alphas = a0 > a1 ? stackalloc byte[] { a0, a1, (byte) (6/7.0 * a0 + 1/7.0 * a1), @@ -137,11 +137,11 @@ int SelectAlphaIndices(ref Bc3Block block) { 255 }; var pixels = rawBlock.AsSpan; - for (int i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) { byte bestIndex = 0; - int bestError = Math.Abs(pixels[i].A - alphas[0]); + var bestError = Math.Abs(pixels[i].A - alphas[0]); for (byte j = 1; j < alphas.Length; j++) { - int error = Math.Abs(pixels[i].A - alphas[j]); + var error = Math.Abs(pixels[i].A - alphas[j]); if (error < bestError) { bestIndex = j; bestError = error; @@ -167,78 +167,78 @@ int SelectAlphaIndices(ref Bc3Block block) { var best = colorBlock; best.Alpha0 = maxAlpha; best.Alpha1 = minAlpha; - int bestError = SelectAlphaIndices(ref best); + var bestError = SelectAlphaIndices(ref best); if (bestError == 0) { return best; } for (byte i = 1; i < variations; i++) { { - byte a0 = ByteHelper.ClampToByte(maxAlpha - i * 2); - byte a1 = ByteHelper.ClampToByte(minAlpha + i * 2); + var a0 = ByteHelper.ClampToByte(maxAlpha - i * 2); + var a1 = ByteHelper.ClampToByte(minAlpha + i * 2); var block = colorBlock; block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; - int error = SelectAlphaIndices(ref block); + var error = SelectAlphaIndices(ref block); if (error < bestError) { best = block; bestError = error; } } { - byte a0 = ByteHelper.ClampToByte(maxAlpha + i * 2); - byte a1 = ByteHelper.ClampToByte(minAlpha - i * 2); + var a0 = ByteHelper.ClampToByte(maxAlpha + i * 2); + var a1 = ByteHelper.ClampToByte(minAlpha - i * 2); var block = colorBlock; block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; - int error = SelectAlphaIndices(ref block); + var error = SelectAlphaIndices(ref block); if (error < bestError) { best = block; bestError = error; } } { - byte a0 = ByteHelper.ClampToByte(maxAlpha); - byte a1 = ByteHelper.ClampToByte(minAlpha - i * 2); + var a0 = ByteHelper.ClampToByte(maxAlpha); + var a1 = ByteHelper.ClampToByte(minAlpha - i * 2); var block = colorBlock; block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; - int error = SelectAlphaIndices(ref block); + var error = SelectAlphaIndices(ref block); if (error < bestError) { best = block; bestError = error; } } { - byte a0 = ByteHelper.ClampToByte(maxAlpha + i * 2); - byte a1 = ByteHelper.ClampToByte(minAlpha); + var a0 = ByteHelper.ClampToByte(maxAlpha + i * 2); + var a1 = ByteHelper.ClampToByte(minAlpha); var block = colorBlock; block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; - int error = SelectAlphaIndices(ref block); + var error = SelectAlphaIndices(ref block); if (error < bestError) { best = block; bestError = error; } } { - byte a0 = ByteHelper.ClampToByte(maxAlpha); - byte a1 = ByteHelper.ClampToByte(minAlpha + i * 2); + var a0 = ByteHelper.ClampToByte(maxAlpha); + var a1 = ByteHelper.ClampToByte(minAlpha + i * 2); var block = colorBlock; block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; - int error = SelectAlphaIndices(ref block); + var error = SelectAlphaIndices(ref block); if (error < bestError) { best = block; bestError = error; } } { - byte a0 = ByteHelper.ClampToByte(maxAlpha - i * 2); - byte a1 = ByteHelper.ClampToByte(minAlpha); + var a0 = ByteHelper.ClampToByte(maxAlpha - i * 2); + var a1 = ByteHelper.ClampToByte(minAlpha); var block = colorBlock; block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; - int error = SelectAlphaIndices(ref block); + var error = SelectAlphaIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -268,8 +268,8 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) PcaVectors.Create(pixels, out var mean, out var principalAxis); PcaVectors.GetMinMaxColor565(pixels, mean, principalAxis, out var min, out var max); - ColorRgb565 c0 = max; - ColorRgb565 c1 = min; + var c0 = max; + var c1 = min; if (c0.data <= c1.data) { @@ -278,7 +278,7 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = c; } - var output = TryColors(rawBlock, c0, c1, out float _); + var output = TryColors(rawBlock, c0, c1, out var _); output = FindAlphaValues(output, rawBlock, 3); return output; @@ -286,22 +286,22 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } private static class Bc3BlockEncoderBalanced { - private const int maxTries = 24 * 2; - private const float errorThreshold = 0.05f; + private const int MaxTries_ = 24 * 2; + private const float ErrorThreshold_ = 0.05f; internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { var pixels = rawBlock.AsSpan; - PcaVectors.Create(pixels, out System.Numerics.Vector3 mean, out System.Numerics.Vector3 pa); + PcaVectors.Create(pixels, out var mean, out var pa); PcaVectors.GetMinMaxColor565(pixels, mean, pa, out var min, out var max); var c0 = max; var c1 = min; - Bc3Block best = TryColors(rawBlock, c0, c1, out float bestError); + var best = TryColors(rawBlock, c0, c1, out var bestError); - for (int i = 0; i < maxTries; i++) { + for (var i = 0; i < MaxTries_; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); var block = TryColors(rawBlock, newC0, newC1, out var error); @@ -314,7 +314,7 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < errorThreshold) { + if (bestError < ErrorThreshold_) { break; } } @@ -325,15 +325,15 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc3BlockEncoderSlow { - private const int maxTries = 9999; - private const float errorThreshold = 0.01f; + private const int MaxTries_ = 9999; + private const float ErrorThreshold_ = 0.01f; internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { var pixels = rawBlock.AsSpan; - PcaVectors.Create(pixels, out System.Numerics.Vector3 mean, out System.Numerics.Vector3 pa); + PcaVectors.Create(pixels, out var mean, out var pa); PcaVectors.GetMinMaxColor565(pixels, mean, pa, out var min, out var max); var c0 = max; @@ -346,11 +346,11 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = c; } - Bc3Block best = TryColors(rawBlock, c0, c1, out float bestError); + var best = TryColors(rawBlock, c0, c1, out var bestError); - int lastChanged = 0; + var lastChanged = 0; - for (int i = 0; i < maxTries; i++) { + for (var i = 0; i < MaxTries_; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (newC0.data < newC1.data) @@ -373,7 +373,7 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < errorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold_ || lastChanged > ColorVariationGenerator.VarPatternCount) { break; } } diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index 456907d..632238f 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -15,17 +15,17 @@ public Bc4BlockEncoder(bool luminanceAsRed) { public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { - byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; + var outputBlocks = MemoryMarshal.Cast(outputData); if (parallel) { Parallel.For(0, blocks.Length, i => { - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputBlocks = MemoryMarshal.Cast(outputData); outputBlocks[i] = EncodeBlock(blocks[i], quality); }); } else { - for (int i = 0; i < blocks.Length; i++) { + for (var i = 0; i < blocks.Length; i++) { outputBlocks[i] = EncodeBlock(blocks[i], quality); } } @@ -34,10 +34,10 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight } private Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { - Bc4Block output = new Bc4Block(); - byte[] colors = new byte[16]; + var output = new Bc4Block(); + var colors = new byte[16]; var pixels = block.AsSpan; - for (int i = 0; i < 16; i++) { + for (var i = 0; i < 16; i++) { if (luminanceAsRed) { colors[i] = (byte)(new ColorYCbCr(pixels[i]).y * 255); } @@ -59,15 +59,15 @@ private Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality } public GlInternalFormat GetInternalFormat() { - return GlInternalFormat.GL_COMPRESSED_RED_RGTC1_EXT; + return GlInternalFormat.GlCompressedRedRgtc1Ext; } - public GLFormat GetBaseInternalFormat() { - return GLFormat.GL_RED; + public GlFormat GetBaseInternalFormat() { + return GlFormat.GlRed; } - public DXGI_FORMAT GetDxgiFormat() { - return DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM; + public DxgiFormat GetDxgiFormat() { + return DxgiFormat.DxgiFormatBc4Unorm; } #region Encoding private stuff @@ -77,8 +77,8 @@ private static Bc4Block FindRedValues(Bc4Block colorBlock, byte[] pixels, int va //Find min and max alpha byte min = 255; byte max = 0; - bool hasExtremeValues = false; - for (int i = 0; i < pixels.Length; i++) { + var hasExtremeValues = false; + for (var i = 0; i < pixels.Length; i++) { if (pixels[i] < 255 && pixels[i] > 0) { if (pixels[i] < min) min = pixels[i]; if (pixels[i] > max) max = pixels[i]; @@ -90,10 +90,10 @@ private static Bc4Block FindRedValues(Bc4Block colorBlock, byte[] pixels, int va int SelectIndices(ref Bc4Block block) { - int cumulativeError = 0; + var cumulativeError = 0; var c0 = block.Red0; var c1 = block.Red1; - Span colors = c0 > c1 + var colors = c0 > c1 ? stackalloc byte[] { c0, c1, @@ -114,11 +114,11 @@ int SelectIndices(ref Bc4Block block) { 0, 255 }; - for (int i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) { byte bestIndex = 0; - int bestError = Math.Abs(pixels[i] - colors[0]); + var bestError = Math.Abs(pixels[i] - colors[0]); for (byte j = 1; j < colors.Length; j++) { - int error = Math.Abs(pixels[i] - colors[j]); + var error = Math.Abs(pixels[i] - colors[j]); if (error < bestError) { bestIndex = j; bestError = error; @@ -146,19 +146,19 @@ int SelectIndices(ref Bc4Block block) { var best = colorBlock; best.Red0 = max; best.Red1 = min; - int bestError = SelectIndices(ref best); + var bestError = SelectIndices(ref best); if (bestError == 0) { return best; } - for (byte i = (byte)variations; i > 0; i--) { + for (var i = (byte)variations; i > 0; i--) { { - byte c0 = ByteHelper.ClampToByte(max - i); - byte c1 = ByteHelper.ClampToByte(min + i); + var c0 = ByteHelper.ClampToByte(max - i); + var c1 = ByteHelper.ClampToByte(min + i); var block = colorBlock; block.Red0 = hasExtremeValues ? c1 : c0; block.Red1 = hasExtremeValues ? c0 : c1; - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -167,12 +167,12 @@ int SelectIndices(ref Bc4Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max + i); - byte c1 = ByteHelper.ClampToByte(min - i); + var c0 = ByteHelper.ClampToByte(max + i); + var c1 = ByteHelper.ClampToByte(min - i); var block = colorBlock; block.Red0 = hasExtremeValues ? c1 : c0; block.Red1 = hasExtremeValues ? c0 : c1; - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -181,12 +181,12 @@ int SelectIndices(ref Bc4Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max); - byte c1 = ByteHelper.ClampToByte(min - i); + var c0 = ByteHelper.ClampToByte(max); + var c1 = ByteHelper.ClampToByte(min - i); var block = colorBlock; block.Red0 = hasExtremeValues ? c1 : c0; block.Red1 = hasExtremeValues ? c0 : c1; - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -195,12 +195,12 @@ int SelectIndices(ref Bc4Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max + i); - byte c1 = ByteHelper.ClampToByte(min); + var c0 = ByteHelper.ClampToByte(max + i); + var c1 = ByteHelper.ClampToByte(min); var block = colorBlock; block.Red0 = hasExtremeValues ? c1 : c0; block.Red1 = hasExtremeValues ? c0 : c1; - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -209,12 +209,12 @@ int SelectIndices(ref Bc4Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max); - byte c1 = ByteHelper.ClampToByte(min + i); + var c0 = ByteHelper.ClampToByte(max); + var c1 = ByteHelper.ClampToByte(min + i); var block = colorBlock; block.Red0 = hasExtremeValues ? c1 : c0; block.Red1 = hasExtremeValues ? c0 : c1; - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -223,12 +223,12 @@ int SelectIndices(ref Bc4Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max - i); - byte c1 = ByteHelper.ClampToByte(min); + var c0 = ByteHelper.ClampToByte(max - i); + var c1 = ByteHelper.ClampToByte(min); var block = colorBlock; block.Red0 = hasExtremeValues ? c1 : c0; block.Red1 = hasExtremeValues ? c0 : c1; - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index de1c28a..2f86bae 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -10,17 +10,17 @@ internal class Bc5BlockEncoder : IBcBlockEncoder { public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { - byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; + var outputBlocks = MemoryMarshal.Cast(outputData); if (parallel) { Parallel.For(0, blocks.Length, i => { - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputBlocks = MemoryMarshal.Cast(outputData); outputBlocks[i] = EncodeBlock(blocks[i], quality); }); } else { - for (int i = 0; i < blocks.Length; i++) { + for (var i = 0; i < blocks.Length; i++) { outputBlocks[i] = EncodeBlock(blocks[i], quality); } } @@ -29,17 +29,17 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight } private Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { - Bc5Block output = new Bc5Block(); - byte[] reds = new byte[16]; - byte[] greens = new byte[16]; + var output = new Bc5Block(); + var reds = new byte[16]; + var greens = new byte[16]; var pixels = block.AsSpan; - for (int i = 0; i < 16; i++) { + for (var i = 0; i < 16; i++) { reds[i] = pixels[i].R; greens[i] = pixels[i].G; } - int variations = 0; - int errorThreshold = 0; + var variations = 0; + var errorThreshold = 0; switch (quality) { case CompressionQuality.Fast: variations = 3; @@ -101,15 +101,15 @@ private Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality } public GlInternalFormat GetInternalFormat() { - return GlInternalFormat.GL_COMPRESSED_RED_GREEN_RGTC2_EXT; + return GlInternalFormat.GlCompressedRedGreenRgtc2Ext; } - public GLFormat GetBaseInternalFormat() { - return GLFormat.GL_RG; + public GlFormat GetBaseInternalFormat() { + return GlFormat.GlRg; } - public DXGI_FORMAT GetDxgiFormat() { - return DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM; + public DxgiFormat GetDxgiFormat() { + return DxgiFormat.DxgiFormatBc5Unorm; } #region Encoding private stuff @@ -124,8 +124,8 @@ private static Bc5Block FindValues(Bc5Block colorBlock, byte[] pixels, int varia //Find min and max alpha byte min = 255; byte max = 0; - bool hasExtremeValues = false; - for (int i = 0; i < pixels.Length; i++) { + var hasExtremeValues = false; + for (var i = 0; i < pixels.Length; i++) { if (pixels[i] < 255 && pixels[i] > 0) { if (pixels[i] < min) min = pixels[i]; if (pixels[i] > max) max = pixels[i]; @@ -137,12 +137,12 @@ private static Bc5Block FindValues(Bc5Block colorBlock, byte[] pixels, int varia int SelectIndices(ref Bc5Block block) { - int cumulativeError = 0; + var cumulativeError = 0; //var c0 = block.Red0; //var c1 = block.Red1; var c0 = col0Getter(block); var c1 = col1Getter(block); - Span colors = c0 > c1 + var colors = c0 > c1 ? stackalloc byte[] { c0, c1, @@ -163,11 +163,11 @@ int SelectIndices(ref Bc5Block block) { 0, 255 }; - for (int i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) { byte bestIndex = 0; - int bestError = Math.Abs(pixels[i] - colors[0]); + var bestError = Math.Abs(pixels[i] - colors[0]); for (byte j = 1; j < colors.Length; j++) { - int error = Math.Abs(pixels[i] - colors[j]); + var error = Math.Abs(pixels[i] - colors[j]); if (error < bestError) { bestIndex = j; bestError = error; @@ -200,21 +200,21 @@ int SelectIndices(ref Bc5Block block) { //best.Red1 = min; best = col0Setter(best, max); best = col1Setter(best, min); - int bestError = SelectIndices(ref best); + var bestError = SelectIndices(ref best); if (bestError == 0) { return best; } - for (byte i = (byte)variations; i > 0; i--) { + for (var i = (byte)variations; i > 0; i--) { { - byte c0 = ByteHelper.ClampToByte(max - i); - byte c1 = ByteHelper.ClampToByte(min + i); + var c0 = ByteHelper.ClampToByte(max - i); + var c1 = ByteHelper.ClampToByte(min + i); var block = colorBlock; //block.Red0 = hasExtremeValues ? c1 : c0; //block.Red1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -223,14 +223,14 @@ int SelectIndices(ref Bc5Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max + i); - byte c1 = ByteHelper.ClampToByte(min - i); + var c0 = ByteHelper.ClampToByte(max + i); + var c1 = ByteHelper.ClampToByte(min - i); var block = colorBlock; //block.Red0 = hasExtremeValues ? c1 : c0; //block.Red1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -239,14 +239,14 @@ int SelectIndices(ref Bc5Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max); - byte c1 = ByteHelper.ClampToByte(min - i); + var c0 = ByteHelper.ClampToByte(max); + var c1 = ByteHelper.ClampToByte(min - i); var block = colorBlock; //block.Red0 = hasExtremeValues ? c1 : c0; //block.Red1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -255,14 +255,14 @@ int SelectIndices(ref Bc5Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max + i); - byte c1 = ByteHelper.ClampToByte(min); + var c0 = ByteHelper.ClampToByte(max + i); + var c1 = ByteHelper.ClampToByte(min); var block = colorBlock; //block.Red0 = hasExtremeValues ? c1 : c0; //block.Red1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -271,14 +271,14 @@ int SelectIndices(ref Bc5Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max); - byte c1 = ByteHelper.ClampToByte(min + i); + var c0 = ByteHelper.ClampToByte(max); + var c1 = ByteHelper.ClampToByte(min + i); var block = colorBlock; //block.Red0 = hasExtremeValues ? c1 : c0; //block.Red1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; @@ -287,14 +287,14 @@ int SelectIndices(ref Bc5Block block) { } } { - byte c0 = ByteHelper.ClampToByte(max - i); - byte c1 = ByteHelper.ClampToByte(min); + var c0 = ByteHelper.ClampToByte(max - i); + var c1 = ByteHelper.ClampToByte(min); var block = colorBlock; //block.Red0 = hasExtremeValues ? c1 : c0; //block.Red1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); - int error = SelectIndices(ref block); + var error = SelectIndices(ref block); if (error < bestError) { best = block; bestError = error; diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs index cde1c20..f163c3e 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs @@ -11,21 +11,20 @@ internal class Bc7Encoder : IBcBlockEncoder public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) { - byte[] outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - Span outputBlocks = MemoryMarshal.Cast(outputData); - + var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; + var outputBlocks = MemoryMarshal.Cast(outputData); if (parallel) { Parallel.For(0, blocks.Length, i => { - Span outputBlocks = MemoryMarshal.Cast(outputData); + var outputBlocks = MemoryMarshal.Cast(outputData); outputBlocks[i] = EncodeBlock(blocks[i], quality); }); } else { - for (int i = 0; i < blocks.Length; i++) + for (var i = 0; i < blocks.Length; i++) { outputBlocks[i] = EncodeBlock(blocks[i], quality); } @@ -37,34 +36,34 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight public GlInternalFormat GetInternalFormat() { - return GlInternalFormat.GL_COMPRESSED_RGBA_BPTC_UNORM_ARB; + return GlInternalFormat.GlCompressedRgbaBptcUnormArb; } - public GLFormat GetBaseInternalFormat() + public GlFormat GetBaseInternalFormat() { - return GLFormat.GL_RGBA; + return GlFormat.GlRgba; } - public DXGI_FORMAT GetDxgiFormat() { - return DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM; + public DxgiFormat GetDxgiFormat() { + return DxgiFormat.DxgiFormatBc7Unorm; } private static ClusterIndices4X4 CreateClusterIndexBlock(RawBlock4X4Rgba32 raw, out int outputNumClusters, int numClusters = 3) { - ClusterIndices4X4 indexBlock = new ClusterIndices4X4(); + var indexBlock = new ClusterIndices4X4(); var indices = LinearClustering.ClusterPixels(raw.AsSpan, 4, 4, numClusters, 1, 10, false); var output = indexBlock.AsSpan; - for (int i = 0; i < output.Length; i++) + for (var i = 0; i < output.Length; i++) { output[i] = indices[i]; } - int nClusters = indexBlock.NumClusters; + var nClusters = indexBlock.NumClusters; if (nClusters < numClusters) { indexBlock = indexBlock.Reduce(out nClusters); @@ -92,8 +91,8 @@ private static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock, CompressionQuali private static class Bc7EncoderFast { - private const float errorThreshold = 0.005f; - private const int maxTries = 5; + private const float ErrorThreshold_ = 0.005f; + private const int MaxTries_ = 5; private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[] best2SubsetPartitions, int[] best3SubsetPartitions, bool alpha) { @@ -105,7 +104,7 @@ private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[ else { yield return Bc7Mode6Encoder.EncodeBlock(rawBlock, 6); - for (int i = 0; i < 64; i++) { + for (var i = 0; i < 64; i++) { if(best3SubsetPartitions[i] < 16) { yield return Bc7Mode0Encoder.EncodeBlock(rawBlock, 3, best3SubsetPartitions[i]); } @@ -118,25 +117,25 @@ private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { - bool hasAlpha = rawBlock.HasTransparentPixels(); + var hasAlpha = rawBlock.HasTransparentPixels(); - var indexBlock2 = CreateClusterIndexBlock(rawBlock, out int clusters2, 2); - var indexBlock3 = CreateClusterIndexBlock(rawBlock, out int clusters3, 3); + var indexBlock2 = CreateClusterIndexBlock(rawBlock, out var clusters2, 2); + var indexBlock3 = CreateClusterIndexBlock(rawBlock, out var clusters3, 3); if (clusters2 < 2) { clusters2 = clusters3; indexBlock2 = indexBlock3; } - int[] best2SubsetPartitions = Bc7EncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); - int[] best3SubsetPartitions = Bc7EncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); + var best2SubsetPartitions = Bc7EncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); + var best3SubsetPartitions = Bc7EncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); float bestError = 99999; - Bc7Block best = new Bc7Block(); - int tries = 0; - foreach (Bc7Block block in TryMethods(rawBlock, best2SubsetPartitions, best3SubsetPartitions, hasAlpha)) { + var best = new Bc7Block(); + var tries = 0; + foreach (var block in TryMethods(rawBlock, best2SubsetPartitions, best3SubsetPartitions, hasAlpha)) { var decoded = block.Decode(); - float error = rawBlock.CalculateYCbCrAlphaError(decoded); + var error = rawBlock.CalculateYCbCrAlphaError(decoded); tries++; if(error < bestError) { @@ -144,7 +143,7 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) bestError = error; } - if (error < errorThreshold || tries > maxTries) { + if (error < ErrorThreshold_ || tries > MaxTries_) { break; } @@ -156,8 +155,8 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc7EncoderBalanced { - private const float errorThreshold = 0.005f; - private const int maxTries = 25; + private const float ErrorThreshold_ = 0.005f; + private const int MaxTries_ = 25; private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[] best2SubsetPartitions, int[] best3SubsetPartitions, bool alpha) { @@ -166,7 +165,7 @@ private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[ yield return Bc7Mode6Encoder.EncodeBlock(rawBlock, 6); yield return Bc7Mode5Encoder.EncodeBlock(rawBlock, 4); yield return Bc7Mode4Encoder.EncodeBlock(rawBlock, 4); - for (int i = 0; i < 64; i++) + for (var i = 0; i < 64; i++) { yield return Bc7Mode7Encoder.EncodeBlock(rawBlock, 3, best2SubsetPartitions[i]); } @@ -176,7 +175,7 @@ private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[ yield return Bc7Mode6Encoder.EncodeBlock(rawBlock, 6); yield return Bc7Mode5Encoder.EncodeBlock(rawBlock, 4); yield return Bc7Mode4Encoder.EncodeBlock(rawBlock, 4); - for (int i = 0; i < 64; i++) { + for (var i = 0; i < 64; i++) { if(best3SubsetPartitions[i] < 16) { yield return Bc7Mode0Encoder.EncodeBlock(rawBlock, 3, best3SubsetPartitions[i]); } @@ -191,25 +190,25 @@ private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { - bool hasAlpha = rawBlock.HasTransparentPixels(); + var hasAlpha = rawBlock.HasTransparentPixels(); - var indexBlock2 = CreateClusterIndexBlock(rawBlock, out int clusters2, 2); - var indexBlock3 = CreateClusterIndexBlock(rawBlock, out int clusters3, 3); + var indexBlock2 = CreateClusterIndexBlock(rawBlock, out var clusters2, 2); + var indexBlock3 = CreateClusterIndexBlock(rawBlock, out var clusters3, 3); if (clusters2 < 2) { clusters2 = clusters3; indexBlock2 = indexBlock3; } - int[] best2SubsetPartitions = Bc7EncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); - int[] best3SubsetPartitions = Bc7EncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); + var best2SubsetPartitions = Bc7EncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); + var best3SubsetPartitions = Bc7EncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); float bestError = 99999; - Bc7Block best = new Bc7Block(); - int tries = 0; - foreach (Bc7Block block in TryMethods(rawBlock, best2SubsetPartitions, best3SubsetPartitions, hasAlpha)) { + var best = new Bc7Block(); + var tries = 0; + foreach (var block in TryMethods(rawBlock, best2SubsetPartitions, best3SubsetPartitions, hasAlpha)) { var decoded = block.Decode(); - float error = rawBlock.CalculateYCbCrAlphaError(decoded); + var error = rawBlock.CalculateYCbCrAlphaError(decoded); tries++; if(error < bestError) { @@ -217,7 +216,7 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) bestError = error; } - if (error < errorThreshold || tries > maxTries) { + if (error < ErrorThreshold_ || tries > MaxTries_) { break; } @@ -230,8 +229,8 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc7EncoderBestQuality { - private const float errorThreshold = 0.001f; - private const int maxTries = 40; + private const float ErrorThreshold_ = 0.001f; + private const int MaxTries_ = 40; private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[] best2SubsetPartitions, int[] best3SubsetPartitions, bool alpha) { @@ -240,7 +239,7 @@ private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[ yield return Bc7Mode6Encoder.EncodeBlock(rawBlock, 8); yield return Bc7Mode5Encoder.EncodeBlock(rawBlock, 5); yield return Bc7Mode4Encoder.EncodeBlock(rawBlock, 5); - for (int i = 0; i < 64; i++) + for (var i = 0; i < 64; i++) { yield return Bc7Mode7Encoder.EncodeBlock(rawBlock, 4, best2SubsetPartitions[i]); @@ -251,7 +250,7 @@ private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[ yield return Bc7Mode6Encoder.EncodeBlock(rawBlock, 8); yield return Bc7Mode5Encoder.EncodeBlock(rawBlock, 5); yield return Bc7Mode4Encoder.EncodeBlock(rawBlock, 5); - for (int i = 0; i < 64; i++) { + for (var i = 0; i < 64; i++) { if(best3SubsetPartitions[i] < 16) { yield return Bc7Mode0Encoder.EncodeBlock(rawBlock, 4, best3SubsetPartitions[i]); } @@ -266,26 +265,26 @@ private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { - bool hasAlpha = rawBlock.HasTransparentPixels(); + var hasAlpha = rawBlock.HasTransparentPixels(); - var indexBlock2 = CreateClusterIndexBlock(rawBlock, out int clusters2, 2); - var indexBlock3 = CreateClusterIndexBlock(rawBlock, out int clusters3, 3); + var indexBlock2 = CreateClusterIndexBlock(rawBlock, out var clusters2, 2); + var indexBlock3 = CreateClusterIndexBlock(rawBlock, out var clusters3, 3); if (clusters2 < 2) { clusters2 = clusters3; indexBlock2 = indexBlock3; } - int[] best2SubsetPartitions = Bc7EncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); - int[] best3SubsetPartitions = Bc7EncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); + var best2SubsetPartitions = Bc7EncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); + var best3SubsetPartitions = Bc7EncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); float bestError = 99999; - Bc7Block best = new Bc7Block(); - int tries = 0; - foreach (Bc7Block block in TryMethods(rawBlock, best2SubsetPartitions, best3SubsetPartitions, hasAlpha)) { + var best = new Bc7Block(); + var tries = 0; + foreach (var block in TryMethods(rawBlock, best2SubsetPartitions, best3SubsetPartitions, hasAlpha)) { var decoded = block.Decode(); - float error = rawBlock.CalculateYCbCrAlphaError(decoded); + var error = rawBlock.CalculateYCbCrAlphaError(decoded); tries++; if(error < bestError) { @@ -293,7 +292,7 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) bestError = error; } - if (error < errorThreshold || tries > maxTries) { + if (error < ErrorThreshold_ || tries > MaxTries_) { break; } diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs b/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs index 24371cd..0187ed7 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs @@ -33,12 +33,12 @@ public int NumClusters { var t = AsSpan; Span clusters = stackalloc int[16]; - int distinct = 0; - for (int i = 0; i < 16; i++) + var distinct = 0; + for (var i = 0; i < 16; i++) { var cluster = t[i]; - bool found = false; - for (int j = 0; j < distinct; j++) + var found = false; + for (var j = 0; j < distinct; j++) { if (clusters[j] == cluster) { @@ -67,12 +67,12 @@ public ClusterIndices4X4 Reduce(out int numClusters) Span mapKey = stackalloc int[numClusters]; var indices = AsSpan; var outIndices = result.AsSpan; - int next = 0; - for (int i = 0; i < 16; i++) + var next = 0; + for (var i = 0; i < 16; i++) { var cluster = indices[i]; - bool found = false; - for (int j = 0; j < next; j++) + var found = false; + for (var j = 0; j < next; j++) { if (mapKey[j] == cluster) { @@ -210,7 +210,7 @@ public static void ExpandEndpoints(Bc7BlockType type, ColorRgba32[] endpoints, b { if (type == Bc7BlockType.Type0 || type == Bc7BlockType.Type1 || type == Bc7BlockType.Type3 || type == Bc7BlockType.Type6 || type == Bc7BlockType.Type7) { - for (int i = 0; i < endpoints.Length; i++) + for (var i = 0; i < endpoints.Length; i++) { endpoints[i] <<= 1; } @@ -224,7 +224,7 @@ public static void ExpandEndpoints(Bc7BlockType type, ColorRgba32[] endpoints, b } else { - for (int i = 0; i < endpoints.Length; i++) + for (var i = 0; i < endpoints.Length; i++) { endpoints[i] |= pBits[i]; } @@ -233,7 +233,7 @@ public static void ExpandEndpoints(Bc7BlockType type, ColorRgba32[] endpoints, b var colorPrecision = GetColorComponentPrecisionWithPBit(type); var alphaPrecision = GetAlphaComponentPrecisionWithPBit(type); - for (int i = 0; i < endpoints.Length; i++) + for (var i = 0; i < endpoints.Length; i++) { // ColorComponentPrecision & AlphaComponentPrecision includes pbit // left shift endpoint components so that their MSB lies in bit 7 @@ -253,7 +253,7 @@ public static void ExpandEndpoints(Bc7BlockType type, ColorRgba32[] endpoints, b //set alpha equal to 255 if (type == Bc7BlockType.Type0 || type == Bc7BlockType.Type1 || type == Bc7BlockType.Type2 || type == Bc7BlockType.Type3) { - for (int i = 0; i < endpoints.Length; i++) + for (var i = 0; i < endpoints.Length; i++) { endpoints[i].a = 255; } @@ -294,28 +294,28 @@ public static ColorRgba32 ExpandEndpoint(Bc7BlockType type, ColorRgba32 endpoint public static int SelectBest2SubsetPartition(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters, out int bestError) { - bool first = true; + var first = true; bestError = 999; - int bestPartition = 0; + var bestPartition = 0; int CalculatePartitionError(int partitionIndex) { - int error = 0; + var error = 0; ReadOnlySpan partitionTable = Bc7Block.Subsets2PartitionTable[partitionIndex]; Span subset0 = stackalloc int[numDistinctClusters]; Span subset1 = stackalloc int[numDistinctClusters]; - int max0Idx = 0; - int max1Idx = 0; + var max0Idx = 0; + var max1Idx = 0; //Calculate largest cluster index for each subset - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == 0) { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset0[r]++; - int count = subset0[r]; + var count = subset0[r]; if (count > subset0[max0Idx]) { max0Idx = r; @@ -323,9 +323,9 @@ int CalculatePartitionError(int partitionIndex) } else { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset1[r]++; - int count = subset1[r]; + var count = subset1[r]; if (count > subset1[max1Idx]) { max1Idx = r; @@ -334,7 +334,7 @@ int CalculatePartitionError(int partitionIndex) } // Calculate error by counting as error everything that does not match the largest cluster - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == 0) { @@ -349,9 +349,9 @@ int CalculatePartitionError(int partitionIndex) return error; } - for (int i = 0; i < 64; i++) // Loop through all possible indices + for (var i = 0; i < 64; i++) // Loop through all possible indices { - int error = CalculatePartitionError(i); + var error = CalculatePartitionError(i); if (first) { bestError = error; @@ -375,26 +375,26 @@ int CalculatePartitionError(int partitionIndex) public static int[] Rank2SubsetPartitions(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters) { - int[] output = Enumerable.Range(0, 64).ToArray(); + var output = Enumerable.Range(0, 64).ToArray(); int CalculatePartitionError(int partitionIndex) { - int error = 0; + var error = 0; ReadOnlySpan partitionTable = Bc7Block.Subsets2PartitionTable[partitionIndex]; Span subset0 = stackalloc int[numDistinctClusters]; Span subset1 = stackalloc int[numDistinctClusters]; - int max0Idx = 0; - int max1Idx = 0; + var max0Idx = 0; + var max1Idx = 0; //Calculate largest cluster index for each subset - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == 0) { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset0[r]++; - int count = subset0[r]; + var count = subset0[r]; if (count > subset0[max0Idx]) { max0Idx = r; @@ -402,9 +402,9 @@ int CalculatePartitionError(int partitionIndex) } else { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset1[r]++; - int count = subset1[r]; + var count = subset1[r]; if (count > subset1[max1Idx]) { max1Idx = r; @@ -413,7 +413,7 @@ int CalculatePartitionError(int partitionIndex) } // Calculate error by counting as error everything that does not match the largest cluster - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == 0) { @@ -435,32 +435,32 @@ int CalculatePartitionError(int partitionIndex) public static int SelectBest3SubsetPartition(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters, out int bestError) { - bool first = true; + var first = true; bestError = 999; - int bestPartition = 0; + var bestPartition = 0; int CalculatePartitionError(int partitionIndex) { - int error = 0; + var error = 0; ReadOnlySpan partitionTable = Bc7Block.Subsets3PartitionTable[partitionIndex]; Span subset0 = stackalloc int[numDistinctClusters]; Span subset1 = stackalloc int[numDistinctClusters]; Span subset2 = stackalloc int[numDistinctClusters]; - int max0Idx = 0; - int max1Idx = 0; - int max2Idx = 0; + var max0Idx = 0; + var max1Idx = 0; + var max2Idx = 0; //Calculate largest cluster index for each subset - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == 0) { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset0[r]++; - int count = subset0[r]; + var count = subset0[r]; if (count > subset0[max0Idx]) { max0Idx = r; @@ -468,9 +468,9 @@ int CalculatePartitionError(int partitionIndex) } else if (partitionTable[i] == 1) { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset1[r]++; - int count = subset1[r]; + var count = subset1[r]; if (count > subset1[max1Idx]) { max1Idx = r; @@ -478,9 +478,9 @@ int CalculatePartitionError(int partitionIndex) } else { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset2[r]++; - int count = subset2[r]; + var count = subset2[r]; if (count > subset2[max2Idx]) { max2Idx = r; @@ -489,7 +489,7 @@ int CalculatePartitionError(int partitionIndex) } // Calculate error by counting as error everything that does not match the largest cluster - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == 0) { @@ -508,9 +508,9 @@ int CalculatePartitionError(int partitionIndex) return error; } - for (int i = 0; i < 64; i++) // Loop through all possible indices + for (var i = 0; i < 64; i++) // Loop through all possible indices { - int error = CalculatePartitionError(i); + var error = CalculatePartitionError(i); if (first) { bestError = error; @@ -534,28 +534,28 @@ int CalculatePartitionError(int partitionIndex) public static int[] Rank3SubsetPartitions(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters) { - int[] output = Enumerable.Range(0, 64).ToArray(); + var output = Enumerable.Range(0, 64).ToArray(); int CalculatePartitionError(int partitionIndex) { - int error = 0; + var error = 0; ReadOnlySpan partitionTable = Bc7Block.Subsets3PartitionTable[partitionIndex]; Span subset0 = stackalloc int[numDistinctClusters]; Span subset1 = stackalloc int[numDistinctClusters]; Span subset2 = stackalloc int[numDistinctClusters]; - int max0Idx = 0; - int max1Idx = 0; - int max2Idx = 0; + var max0Idx = 0; + var max1Idx = 0; + var max2Idx = 0; //Calculate largest cluster index for each subset - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == 0) { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset0[r]++; - int count = subset0[r]; + var count = subset0[r]; if (count > subset0[max0Idx]) { max0Idx = r; @@ -563,9 +563,9 @@ int CalculatePartitionError(int partitionIndex) } else if (partitionTable[i] == 1) { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset1[r]++; - int count = subset1[r]; + var count = subset1[r]; if (count > subset1[max1Idx]) { max1Idx = r; @@ -573,9 +573,9 @@ int CalculatePartitionError(int partitionIndex) } else { - int r = reducedIndicesBlock[i]; + var r = reducedIndicesBlock[i]; subset2[r]++; - int count = subset2[r]; + var count = subset2[r]; if (count > subset2[max2Idx]) { max2Idx = r; @@ -584,7 +584,7 @@ int CalculatePartitionError(int partitionIndex) } // Calculate error by counting as error everything that does not match the largest cluster - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == 0) { @@ -627,8 +627,8 @@ public static void GetInitialUnscaledEndpointsForSubset(RawBlock4X4Rgba32 block, var originalPixels = block.AsSpan; - int count = 0; - for (int i = 0; i < 16; i++) + var count = 0; + for (var i = 0; i < 16; i++) { if (partitionTable[i] == subsetIndex) { @@ -637,8 +637,8 @@ public static void GetInitialUnscaledEndpointsForSubset(RawBlock4X4Rgba32 block, } Span subsetColors = stackalloc Rgba32[count]; - int next = 0; - for (int i = 0; i < 16; i++) + var next = 0; + for (var i = 0; i < 16; i++) { if (partitionTable[i] == subsetIndex) { @@ -655,8 +655,8 @@ public static void GetInitialUnscaledEndpointsForSubset(RawBlock4X4Rgba32 block, public static ColorRgba32 ScaleDownEndpoint(ColorRgba32 endpoint, Bc7BlockType type, bool ignoreAlpha, out byte pBit) { - int colorPrecision = GetColorComponentPrecisionWithPBit(type); - int alphaPrecision = GetAlphaComponentPrecisionWithPBit(type); + var colorPrecision = GetColorComponentPrecisionWithPBit(type); + var alphaPrecision = GetAlphaComponentPrecisionWithPBit(type); var r = (byte)(endpoint.r >> (8 - colorPrecision)); var g = (byte)(endpoint.g >> (8 - colorPrecision)); @@ -665,14 +665,14 @@ public static ColorRgba32 ScaleDownEndpoint(ColorRgba32 endpoint, Bc7BlockType t if (TypeHasPBits(type)) { - int pBitVotingMask = (1 << (8 - colorPrecision + 1)) - 1; + var pBitVotingMask = (1 << (8 - colorPrecision + 1)) - 1; float pBitVotes = 0; pBitVotes += endpoint.r & pBitVotingMask; pBitVotes += endpoint.g & pBitVotingMask; pBitVotes += endpoint.b & pBitVotingMask; pBitVotes /= 3; - if (pBitVotes >= (pBitVotingMask / 2f)) + if (pBitVotes >= pBitVotingMask / 2f) { pBit = 1; } @@ -708,19 +708,19 @@ public static ColorRgba32 InterpolateColor(ColorRgba32 endPointStart, ColorRgba3 byte InterpolateByte(byte e0, byte e1, int index, int indexPrecision) { if (indexPrecision == 0) return e0; - ReadOnlySpan aWeights2 = Bc7Block.colorInterpolationWeights2; - ReadOnlySpan aWeights3 = Bc7Block.colorInterpolationWeights3; - ReadOnlySpan aWeights4 = Bc7Block.colorInterpolationWeights4; + var aWeights2 = Bc7Block.ColorInterpolationWeights2; + var aWeights3 = Bc7Block.ColorInterpolationWeights3; + var aWeights4 = Bc7Block.ColorInterpolationWeights4; if(indexPrecision == 2) - return (byte) (((64 - aWeights2[index])* (e0) + aWeights2[index]*(e1) + 32) >> 6); + return (byte) (((64 - aWeights2[index])* e0 + aWeights2[index]*e1 + 32) >> 6); else if(indexPrecision == 3) - return (byte) (((64 - aWeights3[index])*(e0) + aWeights3[index]*(e1) + 32) >> 6); + return (byte) (((64 - aWeights3[index])*e0 + aWeights3[index]*e1 + 32) >> 6); else // indexprecision == 4 - return (byte) (((64 - aWeights4[index])*(e0) + aWeights4[index]*(e1) + 32) >> 6); + return (byte) (((64 - aWeights4[index])*e0 + aWeights4[index]*e1 + 32) >> 6); } - ColorRgba32 result = new ColorRgba32( + var result = new ColorRgba32( InterpolateByte(endPointStart.r, endPointEnd.r, colorIndex, colorBitCount), InterpolateByte(endPointStart.g, endPointEnd.g, colorIndex, colorBitCount), InterpolateByte(endPointStart.b, endPointEnd.b, colorIndex, colorBitCount), @@ -741,10 +741,10 @@ public static void ClampEndpoint(ref ColorRgba32 endpoint, byte colorMax, byte a private static int FindClosestColorIndex(ColorYCbCrAlpha color, ReadOnlySpan colors, out float bestError) { bestError = color.CalcDistWeighted(colors[0], 4, 2); - int bestIndex = 0; - for (int i = 1; i < colors.Length; i++) + var bestIndex = 0; + for (var i = 1; i < colors.Length; i++) { - float error = color.CalcDistWeighted(colors[i], 4, 2); + var error = color.CalcDistWeighted(colors[i], 4, 2); if (error < bestError) { bestIndex = i; @@ -757,10 +757,10 @@ private static int FindClosestColorIndex(ColorYCbCrAlpha color, ReadOnlySpan colors, out float bestError) { bestError = color.CalcDistWeighted(colors[0], 4); - int bestIndex = 0; - for (int i = 1; i < colors.Length; i++) + var bestIndex = 0; + for (var i = 1; i < colors.Length; i++) { - float error = color.CalcDistWeighted(colors[i], 4); + var error = color.CalcDistWeighted(colors[i], 4); if (error < bestError) { bestIndex = i; @@ -777,8 +777,8 @@ private static int FindClosestColorIndex(ColorYCbCr color, ReadOnlySpan alphas, out float bestError) { bestError = (alpha - alphas[0]) * (alpha - alphas[0]); - int bestIndex = 0; - for (int i = 1; i < alphas.Length; i++) + var bestIndex = 0; + for (var i = 1; i < alphas.Length; i++) { float error = (alpha - alphas[i]) * (alpha - alphas[i]); if (error < bestError) @@ -799,21 +799,21 @@ private static int FindClosestAlphaIndex(byte alpha, ReadOnlySpan alphas, private static float TrySubsetEndpoints(Bc7BlockType type, RawBlock4X4Rgba32 raw, ColorRgba32 ep0, ColorRgba32 ep1, ReadOnlySpan partitionTable, int subsetIndex, int type4IdxMode) { - int colorIndexPrecision = GetColorIndexBitCount(type, type4IdxMode); - int alphaIndexPrecision = GetAlphaIndexBitCount(type, type4IdxMode); + var colorIndexPrecision = GetColorIndexBitCount(type, type4IdxMode); + var alphaIndexPrecision = GetAlphaIndexBitCount(type, type4IdxMode); if (type == Bc7BlockType.Type4 || type == Bc7BlockType.Type5) { //separate indices for color and alpha Span colors = stackalloc ColorYCbCr[1 << colorIndexPrecision]; Span alphas = stackalloc byte[1 << alphaIndexPrecision]; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { colors[i] = new ColorYCbCr(InterpolateColor(ep0, ep1, i, 0, colorIndexPrecision, 0)); } - for (int i = 0; i < alphas.Length; i++) + for (var i = 0; i < alphas.Length; i++) { alphas[i] = InterpolateColor(ep0, ep1, 0, i, 0, alphaIndexPrecision).a; @@ -822,7 +822,7 @@ private static float TrySubsetEndpoints(Bc7BlockType type, RawBlock4X4Rgba32 raw var pixels = raw.AsSpan; float error = 0; - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { var pixelColor = new ColorYCbCr(pixels[i]); @@ -837,7 +837,7 @@ private static float TrySubsetEndpoints(Bc7BlockType type, RawBlock4X4Rgba32 raw else { Span colors = stackalloc ColorYCbCrAlpha[1 << colorIndexPrecision]; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { colors[i] = new ColorYCbCrAlpha(InterpolateColor(ep0, ep1, i, i, colorIndexPrecision, alphaIndexPrecision)); @@ -847,7 +847,7 @@ private static float TrySubsetEndpoints(Bc7BlockType type, RawBlock4X4Rgba32 raw float error = 0; float count = 0; - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == subsetIndex) { @@ -868,8 +868,8 @@ private static float TrySubsetEndpoints(Bc7BlockType type, RawBlock4X4Rgba32 raw public static void FillSubsetIndices(Bc7BlockType type, RawBlock4X4Rgba32 raw, ColorRgba32 ep0, ColorRgba32 ep1, ReadOnlySpan partitionTable, int subsetIndex, Span indicesToFill) { - int colorIndexPrecision = GetColorIndexBitCount(type); - int alphaIndexPrecision = GetAlphaIndexBitCount(type); + var colorIndexPrecision = GetColorIndexBitCount(type); + var alphaIndexPrecision = GetAlphaIndexBitCount(type); if (type == Bc7BlockType.Type4 || type == Bc7BlockType.Type5) { //separate indices for color and alpha @@ -878,7 +878,7 @@ public static void FillSubsetIndices(Bc7BlockType type, RawBlock4X4Rgba32 raw, C else { Span colors = stackalloc ColorYCbCrAlpha[1 << colorIndexPrecision]; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { colors[i] = new ColorYCbCrAlpha(InterpolateColor(ep0, ep1, i, i, colorIndexPrecision, alphaIndexPrecision)); @@ -886,7 +886,7 @@ public static void FillSubsetIndices(Bc7BlockType type, RawBlock4X4Rgba32 raw, C var pixels = raw.AsSpan; - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { if (partitionTable[i] == subsetIndex) { @@ -905,21 +905,21 @@ public static void FillSubsetIndices(Bc7BlockType type, RawBlock4X4Rgba32 raw, C public static void FillAlphaColorIndices(Bc7BlockType type, RawBlock4X4Rgba32 raw, ColorRgba32 ep0, ColorRgba32 ep1, Span colorIndicesToFill, Span alphaIndicesToFill, int idxMode = 0) { - int colorIndexPrecision = GetColorIndexBitCount(type, idxMode); - int alphaIndexPrecision = GetAlphaIndexBitCount(type, idxMode); + var colorIndexPrecision = GetColorIndexBitCount(type, idxMode); + var alphaIndexPrecision = GetAlphaIndexBitCount(type, idxMode); if (type == Bc7BlockType.Type4 || type == Bc7BlockType.Type5) { Span colors = stackalloc ColorYCbCr[1 << colorIndexPrecision]; Span alphas = stackalloc byte[1 << alphaIndexPrecision]; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { colors[i] = new ColorYCbCr(InterpolateColor(ep0, ep1, i, 0, colorIndexPrecision, 0)); } - for (int i = 0; i < alphas.Length; i++) + for (var i = 0; i < alphas.Length; i++) { alphas[i] = InterpolateColor(ep0, ep1, 0, i, 0, alphaIndexPrecision).a; @@ -927,7 +927,7 @@ public static void FillAlphaColorIndices(Bc7BlockType type, RawBlock4X4Rgba32 ra var pixels = raw.AsSpan; - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { var pixelColor = new ColorYCbCr(pixels[i]); @@ -948,51 +948,51 @@ public static void OptimizeSubsetEndpointsWithPBit(Bc7BlockType type, RawBlock4X int variation, ReadOnlySpan partitionTable, int subsetIndex, bool variatePBits, bool variateAlpha, int type4IdxMode = 0) { - byte colorMax = (byte)((1 << GetColorComponentPrecision(type)) - 1); - byte alphaMax = (byte)((1 << GetAlphaComponentPrecision(type)) - 1); + var colorMax = (byte)((1 << GetColorComponentPrecision(type)) - 1); + var alphaMax = (byte)((1 << GetAlphaComponentPrecision(type)) - 1); - float bestError = TrySubsetEndpoints(type, raw, + var bestError = TrySubsetEndpoints(type, raw, ExpandEndpoint(type, ep0, pBit0), ExpandEndpoint(type, ep1, pBit1), partitionTable, subsetIndex, type4IdxMode ); - ReadOnlySpan varPatternR = variateAlpha + ReadOnlySpan patternR = variateAlpha ? varPatternRAlpha : varPatternRNoAlpha; - ReadOnlySpan varPatternG = variateAlpha + ReadOnlySpan patternG = variateAlpha ? varPatternGAlpha : varPatternGNoAlpha; - ReadOnlySpan varPatternB = variateAlpha + ReadOnlySpan patternB = variateAlpha ? varPatternBAlpha : varPatternBNoAlpha; - ReadOnlySpan varPatternA = variateAlpha + ReadOnlySpan patternA = variateAlpha ? varPatternAAlpha : varPatternANoAlpha; while (variation > 0) { - bool foundBetter = false; + var foundBetter = false; - for (int i = 0; i < varPatternR.Length; i++) + for (var i = 0; i < patternR.Length; i++) { - ColorRgba32 testEndPoint0 = new ColorRgba32( - (byte)(ep0.r - variation * varPatternR[i]), - (byte)(ep0.g - variation * varPatternG[i]), - (byte)(ep0.b - variation * varPatternB[i]), - (byte)(ep0.a - variation * varPatternA[i]) + var testEndPoint0 = new ColorRgba32( + (byte)(ep0.r - variation * patternR[i]), + (byte)(ep0.g - variation * patternG[i]), + (byte)(ep0.b - variation * patternB[i]), + (byte)(ep0.a - variation * patternA[i]) ); - ColorRgba32 testEndPoint1 = new ColorRgba32( - (byte)(ep1.r + variation * varPatternR[i]), - (byte)(ep1.g + variation * varPatternG[i]), - (byte)(ep1.b + variation * varPatternB[i]), - (byte)(ep1.a + variation * varPatternA[i]) + var testEndPoint1 = new ColorRgba32( + (byte)(ep1.r + variation * patternR[i]), + (byte)(ep1.g + variation * patternG[i]), + (byte)(ep1.b + variation * patternB[i]), + (byte)(ep1.a + variation * patternA[i]) ); ClampEndpoint(ref testEndPoint0, colorMax, alphaMax); ClampEndpoint(ref testEndPoint1, colorMax, alphaMax); - float error = TrySubsetEndpoints(type, raw, + var error = TrySubsetEndpoints(type, raw, ExpandEndpoint(type, testEndPoint0, pBit0), ExpandEndpoint(type, testEndPoint1, pBit1), partitionTable, subsetIndex, type4IdxMode ); @@ -1005,17 +1005,17 @@ public static void OptimizeSubsetEndpointsWithPBit(Bc7BlockType type, RawBlock4X } } - for (int i = 0; i < varPatternR.Length; i++) + for (var i = 0; i < patternR.Length; i++) { - ColorRgba32 testEndPoint0 = new ColorRgba32( - (byte)(ep0.r + variation * varPatternR[i]), - (byte)(ep0.g + variation * varPatternG[i]), - (byte)(ep0.b + variation * varPatternB[i]), - (byte)(ep0.a + variation * varPatternA[i]) + var testEndPoint0 = new ColorRgba32( + (byte)(ep0.r + variation * patternR[i]), + (byte)(ep0.g + variation * patternG[i]), + (byte)(ep0.b + variation * patternB[i]), + (byte)(ep0.a + variation * patternA[i]) ); ClampEndpoint(ref testEndPoint0, colorMax, alphaMax); - float error = TrySubsetEndpoints(type, raw, + var error = TrySubsetEndpoints(type, raw, ExpandEndpoint(type, testEndPoint0, pBit0), ExpandEndpoint(type, ep1, pBit1), partitionTable, subsetIndex, type4IdxMode ); @@ -1027,17 +1027,17 @@ public static void OptimizeSubsetEndpointsWithPBit(Bc7BlockType type, RawBlock4X } } - for (int i = 0; i < varPatternR.Length; i++) + for (var i = 0; i < patternR.Length; i++) { - ColorRgba32 testEndPoint1 = new ColorRgba32( - (byte)(ep1.r + variation * varPatternR[i]), - (byte)(ep1.g + variation * varPatternG[i]), - (byte)(ep1.b + variation * varPatternB[i]), - (byte)(ep1.a + variation * varPatternA[i]) + var testEndPoint1 = new ColorRgba32( + (byte)(ep1.r + variation * patternR[i]), + (byte)(ep1.g + variation * patternG[i]), + (byte)(ep1.b + variation * patternB[i]), + (byte)(ep1.a + variation * patternA[i]) ); ClampEndpoint(ref testEndPoint1, colorMax, alphaMax); - float error = TrySubsetEndpoints(type, raw, + var error = TrySubsetEndpoints(type, raw, ExpandEndpoint(type, ep0, pBit0), ExpandEndpoint(type, testEndPoint1, pBit1), partitionTable, subsetIndex, type4IdxMode ); @@ -1052,8 +1052,8 @@ public static void OptimizeSubsetEndpointsWithPBit(Bc7BlockType type, RawBlock4X if (variatePBits) { { - byte testPBit0 = pBit0 == 0 ? (byte)1 : (byte)0; - float error = TrySubsetEndpoints(type, raw, + var testPBit0 = pBit0 == 0 ? (byte)1 : (byte)0; + var error = TrySubsetEndpoints(type, raw, ExpandEndpoint(type, ep0, testPBit0), ExpandEndpoint(type, ep1, pBit1), partitionTable, subsetIndex, type4IdxMode ); @@ -1065,8 +1065,8 @@ public static void OptimizeSubsetEndpointsWithPBit(Bc7BlockType type, RawBlock4X } } { - byte testPBit1 = pBit1 == 0 ? (byte)1 : (byte)0; - float error = TrySubsetEndpoints(type, raw, + var testPBit1 = pBit1 == 0 ? (byte)1 : (byte)0; + var error = TrySubsetEndpoints(type, raw, ExpandEndpoint(type, ep0, pBit0), ExpandEndpoint(type, ep1, testPBit1), partitionTable, subsetIndex, type4IdxMode ); @@ -1092,10 +1092,10 @@ public static RawBlock4X4Rgba32 RotateBlockColors(RawBlock4X4Rgba32 block, int r return block; } - RawBlock4X4Rgba32 rotated = new RawBlock4X4Rgba32(); + var rotated = new RawBlock4X4Rgba32(); var pixels = block.AsSpan; var output = rotated.AsSpan; - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { var c = pixels[i]; switch (rotation) diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode0Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode0Encoder.cs index 1469173..12977d5 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode0Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode0Encoder.cs @@ -8,7 +8,7 @@ internal static class Bc7Mode0Encoder public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation, int bestPartition) { - Bc7Block output = new Bc7Block(); + var output = new Bc7Block(); const Bc7BlockType type = Bc7BlockType.Type0; if(bestPartition >= 16) @@ -16,26 +16,26 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariatio throw new IndexOutOfRangeException("Mode0 only has 16 partitions"); } - ColorRgba32[] endpoints = new ColorRgba32[6]; - byte[] pBits = new byte[6]; + var endpoints = new ColorRgba32[6]; + var pBits = new byte[6]; ReadOnlySpan partitionTable = Bc7Block.Subsets3PartitionTable[bestPartition]; - byte[] indices = new byte[16]; + var indices = new byte[16]; - int[] anchorIndices = new int[] { + var anchorIndices = new int[] { 0, Bc7Block.Subsets3AnchorIndices2[bestPartition], Bc7Block.Subsets3AnchorIndices3[bestPartition] }; - for (int subset = 0; subset < 3; subset++) { + for (var subset = 0; subset < 3; subset++) { Bc7EncodingHelpers.GetInitialUnscaledEndpointsForSubset(block, out var ep0, out var ep1, partitionTable, subset); - ColorRgba32 scaledEp0 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, true, out byte pBit0); - ColorRgba32 scaledEp1 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, true, out byte pBit1); + var scaledEp0 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, true, out var pBit0); + var scaledEp1 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, true, out var pBit1); Bc7EncodingHelpers.OptimizeSubsetEndpointsWithPBit(type, block, ref scaledEp0, ref scaledEp1, ref pBit0, ref pBit1, startingVariation, partitionTable, subset, true, false); diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode1Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode1Encoder.cs index e8d9a51..735a82e 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode1Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode1Encoder.cs @@ -8,28 +8,28 @@ internal static class Bc7Mode1Encoder public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation, int bestPartition) { - Bc7Block output = new Bc7Block(); + var output = new Bc7Block(); const Bc7BlockType type = Bc7BlockType.Type1; - ColorRgba32[] endpoints = new ColorRgba32[4]; - byte[] pBits = new byte[2]; + var endpoints = new ColorRgba32[4]; + var pBits = new byte[2]; ReadOnlySpan partitionTable = Bc7Block.Subsets2PartitionTable[bestPartition]; - byte[] indices = new byte[16]; + var indices = new byte[16]; - int[] anchorIndices = new int[] { + var anchorIndices = new int[] { 0, Bc7Block.Subsets2AnchorIndices[bestPartition] }; - for (int subset = 0; subset < 2; subset++) { + for (var subset = 0; subset < 2; subset++) { Bc7EncodingHelpers.GetInitialUnscaledEndpointsForSubset(block, out var ep0, out var ep1, partitionTable, subset); - ColorRgba32 scaledEp0 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, true, out byte pBit); - ColorRgba32 scaledEp1 = + var scaledEp0 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, true, out var pBit); + var scaledEp1 = Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, true, out pBit); Bc7EncodingHelpers.OptimizeSubsetEndpointsWithPBit(type, block, ref scaledEp0, diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode2Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode2Encoder.cs index dee4405..d6fd5eb 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode2Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode2Encoder.cs @@ -8,28 +8,28 @@ internal static class Bc7Mode2Encoder public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation, int bestPartition) { - Bc7Block output = new Bc7Block(); + var output = new Bc7Block(); const Bc7BlockType type = Bc7BlockType.Type2; - ColorRgba32[] endpoints = new ColorRgba32[6]; + var endpoints = new ColorRgba32[6]; ReadOnlySpan partitionTable = Bc7Block.Subsets3PartitionTable[bestPartition]; - byte[] indices = new byte[16]; + var indices = new byte[16]; - int[] anchorIndices = new int[] { + var anchorIndices = new int[] { 0, Bc7Block.Subsets3AnchorIndices2[bestPartition], Bc7Block.Subsets3AnchorIndices3[bestPartition] }; - for (int subset = 0; subset < 3; subset++) { + for (var subset = 0; subset < 3; subset++) { Bc7EncodingHelpers.GetInitialUnscaledEndpointsForSubset(block, out var ep0, out var ep1, partitionTable, subset); - ColorRgba32 scaledEp0 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, true, out byte _); - ColorRgba32 scaledEp1 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, true, out byte _); + var scaledEp0 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, true, out var _); + var scaledEp1 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, true, out var _); byte pBit = 0; Bc7EncodingHelpers.OptimizeSubsetEndpointsWithPBit(type, block, ref scaledEp0, diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode3Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode3Encoder.cs index 61dd40b..49ae4ed 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode3Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode3Encoder.cs @@ -8,28 +8,28 @@ internal static class Bc7Mode3Encoder public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation, int bestPartition) { - Bc7Block output = new Bc7Block(); + var output = new Bc7Block(); const Bc7BlockType type = Bc7BlockType.Type3; - ColorRgba32[] endpoints = new ColorRgba32[4]; - byte[] pBits = new byte[4]; + var endpoints = new ColorRgba32[4]; + var pBits = new byte[4]; ReadOnlySpan partitionTable = Bc7Block.Subsets2PartitionTable[bestPartition]; - byte[] indices = new byte[16]; + var indices = new byte[16]; - int[] anchorIndices = new int[] { + var anchorIndices = new int[] { 0, Bc7Block.Subsets2AnchorIndices[bestPartition] }; - for (int subset = 0; subset < 2; subset++) { + for (var subset = 0; subset < 2; subset++) { Bc7EncodingHelpers.GetInitialUnscaledEndpointsForSubset(block, out var ep0, out var ep1, partitionTable, subset); - ColorRgba32 scaledEp0 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, true, out byte pBit0); - ColorRgba32 scaledEp1 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, true, out byte pBit1); + var scaledEp0 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, true, out var pBit0); + var scaledEp1 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, true, out var pBit1); Bc7EncodingHelpers.OptimizeSubsetEndpointsWithPBit(type, block, ref scaledEp0, ref scaledEp1, ref pBit0, ref pBit1, startingVariation, partitionTable, subset, true, false); diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs index c25df51..55bf8f6 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs @@ -6,8 +6,8 @@ namespace BCnEncoder.Encoder.Bc7 internal static class Bc7Mode4Encoder { - private static ReadOnlySpan partitionTable => new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - const int subset = 0; + private static ReadOnlySpan PartitionTable => new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + const int Subset_ = 0; public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation) { @@ -15,36 +15,36 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariatio Span outputs = stackalloc Bc7Block[8]; - for (int idxMode = 0; idxMode < 2; idxMode++) + for (var idxMode = 0; idxMode < 2; idxMode++) { - for (int rotation = 0; rotation < 4; rotation++) + for (var rotation = 0; rotation < 4; rotation++) { var rotatedBlock = Bc7EncodingHelpers.RotateBlockColors(block, rotation); - Bc7Block output = new Bc7Block(); + var output = new Bc7Block(); Bc7EncodingHelpers.GetInitialUnscaledEndpoints(rotatedBlock, out var ep0, out var ep1); - ColorRgba32 scaledEp0 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, false, out byte _); - ColorRgba32 scaledEp1 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, false, out byte _); + var scaledEp0 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, false, out var _); + var scaledEp1 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, false, out var _); byte pBit = 0; //fake pBit Bc7EncodingHelpers.OptimizeSubsetEndpointsWithPBit(type, rotatedBlock, ref scaledEp0, - ref scaledEp1, ref pBit, ref pBit, startingVariation, partitionTable, subset, + ref scaledEp1, ref pBit, ref pBit, startingVariation, PartitionTable, Subset_, false, true, idxMode); ep0 = Bc7EncodingHelpers.ExpandEndpoint(type, scaledEp0, 0); ep1 = Bc7EncodingHelpers.ExpandEndpoint(type, scaledEp1, 0); - byte[] colorIndices = new byte[16]; - byte[] alphaIndices = new byte[16]; + var colorIndices = new byte[16]; + var alphaIndices = new byte[16]; Bc7EncodingHelpers.FillAlphaColorIndices(type, rotatedBlock, ep0, ep1, colorIndices, alphaIndices, idxMode); - bool needsRedo = false; + var needsRedo = false; if ((colorIndices[0] & (idxMode == 0 ? 0b10 : 0b100)) > 0) //If anchor index most significant bit is 1, switch endpoints @@ -105,16 +105,16 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariatio } } - int bestIndex = 0; + var bestIndex = 0; float bestError = 0; - bool first = true; + var first = true; // Find best out of generated blocks - for (int i = 0; i < outputs.Length; i++) + for (var i = 0; i < outputs.Length; i++) { var decoded = outputs[i].Decode(); - float error = block.CalculateYCbCrAlphaError(decoded); + var error = block.CalculateYCbCrAlphaError(decoded); if (error < bestError || first) { first = false; diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs index 1b5c881..1d97ac6 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs @@ -5,8 +5,8 @@ namespace BCnEncoder.Encoder.Bc7 { internal static class Bc7Mode5Encoder { - private static ReadOnlySpan partitionTable => new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - const int subset = 0; + private static ReadOnlySpan PartitionTable => new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + const int Subset_ = 0; public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation) { @@ -14,32 +14,32 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariatio Span outputs = stackalloc Bc7Block[4]; - for (int rotation = 0; rotation < 4; rotation++) { + for (var rotation = 0; rotation < 4; rotation++) { var rotatedBlock = Bc7EncodingHelpers.RotateBlockColors(block, rotation); - Bc7Block output = new Bc7Block(); + var output = new Bc7Block(); Bc7EncodingHelpers.GetInitialUnscaledEndpoints(rotatedBlock, out var ep0, out var ep1); - ColorRgba32 scaledEp0 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, false, out byte _); - ColorRgba32 scaledEp1 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, false, out byte _); + var scaledEp0 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, false, out var _); + var scaledEp1 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, false, out var _); byte pBit = 0; //fake pBit Bc7EncodingHelpers.OptimizeSubsetEndpointsWithPBit(type, rotatedBlock, ref scaledEp0, - ref scaledEp1, ref pBit, ref pBit, startingVariation, partitionTable, subset, false, true); + ref scaledEp1, ref pBit, ref pBit, startingVariation, PartitionTable, Subset_, false, true); ep0 = Bc7EncodingHelpers.ExpandEndpoint(type, scaledEp0, 0); ep1 = Bc7EncodingHelpers.ExpandEndpoint(type, scaledEp1, 0); - byte[] colorIndices = new byte[16]; - byte[] alphaIndices = new byte[16]; + var colorIndices = new byte[16]; + var alphaIndices = new byte[16]; Bc7EncodingHelpers.FillAlphaColorIndices(type, rotatedBlock, ep0, ep1, colorIndices, alphaIndices); - bool needsRedo = false; + var needsRedo = false; if ((colorIndices[0] & 0b10) > 0) //If anchor index most significant bit is 1, switch endpoints { @@ -85,15 +85,15 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariatio outputs[rotation] = output; } - int bestIndex = 0; + var bestIndex = 0; float bestError = 0; - bool first = true; + var first = true; // Find best out of generated blocks - for (int i = 0; i < outputs.Length; i++) { + for (var i = 0; i < outputs.Length; i++) { var decoded = outputs[i].Decode(); - float error = block.CalculateYCbCrAlphaError(decoded); + var error = block.CalculateYCbCrAlphaError(decoded); if(error < bestError || first) { first = false; bestError = error; diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode6Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode6Encoder.cs index 844a51d..e0d141a 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode6Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode6Encoder.cs @@ -8,15 +8,15 @@ internal static class Bc7Mode6Encoder public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation) { - bool hasAlpha = block.HasTransparentPixels(); + var hasAlpha = block.HasTransparentPixels(); - Bc7Block output = new Bc7Block(); + var output = new Bc7Block(); Bc7EncodingHelpers.GetInitialUnscaledEndpoints(block, out var ep0, out var ep1); - ColorRgba32 scaledEp0 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep0, Bc7BlockType.Type6, false, out byte pBit0); - ColorRgba32 scaledEp1 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep1, Bc7BlockType.Type6, false, out byte pBit1); + var scaledEp0 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep0, Bc7BlockType.Type6, false, out var pBit0); + var scaledEp1 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep1, Bc7BlockType.Type6, false, out var pBit1); ReadOnlySpan partitionTable = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int subset = 0; @@ -33,7 +33,7 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariatio ep0 = Bc7EncodingHelpers.ExpandEndpoint(Bc7BlockType.Type6, scaledEp0, pBit0); ep1 = Bc7EncodingHelpers.ExpandEndpoint(Bc7BlockType.Type6, scaledEp1, pBit1); - byte[] indices = new byte[16]; + var indices = new byte[16]; Bc7EncodingHelpers.FillSubsetIndices(Bc7BlockType.Type6, block, ep0, ep1, diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode7Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode7Encoder.cs index d58bf5e..7dc363c 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode7Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode7Encoder.cs @@ -8,28 +8,28 @@ internal static class Bc7Mode7Encoder public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation, int bestPartition) { - Bc7Block output = new Bc7Block(); + var output = new Bc7Block(); const Bc7BlockType type = Bc7BlockType.Type7; - ColorRgba32[] endpoints = new ColorRgba32[4]; - byte[] pBits = new byte[4]; + var endpoints = new ColorRgba32[4]; + var pBits = new byte[4]; ReadOnlySpan partitionTable = Bc7Block.Subsets2PartitionTable[bestPartition]; - byte[] indices = new byte[16]; + var indices = new byte[16]; - int[] anchorIndices = new int[] { + var anchorIndices = new int[] { 0, Bc7Block.Subsets2AnchorIndices[bestPartition] }; - for (int subset = 0; subset < 2; subset++) { + for (var subset = 0; subset < 2; subset++) { Bc7EncodingHelpers.GetInitialUnscaledEndpointsForSubset(block, out var ep0, out var ep1, partitionTable, subset); - ColorRgba32 scaledEp0 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, false, out byte pBit0); - ColorRgba32 scaledEp1 = - Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, false, out byte pBit1); + var scaledEp0 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep0, type, false, out var pBit0); + var scaledEp1 = + Bc7EncodingHelpers.ScaleDownEndpoint(ep1, type, false, out var pBit1); Bc7EncodingHelpers.OptimizeSubsetEndpointsWithPBit(type, block, ref scaledEp0, ref scaledEp1, ref pBit0, ref pBit1, startingVariation, partitionTable, subset, true, true); diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 6446af2..7e4ec08 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -33,10 +33,10 @@ public class BcEncoder /// /// Creates a new instance of . /// - /// The block compression format to encode an image with. - public BcEncoder(CompressionFormat format = CompressionFormat.BC1) + /// The block compression Format to encode an image with. + public BcEncoder(CompressionFormat format = CompressionFormat.Bc1) { - OutputOptions.format = format; + OutputOptions.Format = format; } /// @@ -46,7 +46,7 @@ public BcEncoder(CompressionFormat format = CompressionFormat.BC1) /// The stream to write the encoded image to. public void Encode(Image inputImage, Stream outputStream) { - switch (OutputOptions.fileFormat) + switch (OutputOptions.FileFormat) { case OutputFileFormat.Dds: var dds = EncodeToDds(inputImage); @@ -71,16 +71,18 @@ public KtxFile EncodeToKtx(Image inputImage) IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); // Setup encoders - var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.format); + compressedEncoder = GetEncoder(OutputOptions.Format); if (compressedEncoder == null) - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } output = new KtxFile( KtxHeader.InitializeCompressed(inputImage.Width, inputImage.Height, @@ -89,7 +91,7 @@ public KtxFile EncodeToKtx(Image inputImage) } else { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); output = new KtxFile( KtxHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, uncompressedEncoder.GetGlType(), @@ -105,8 +107,8 @@ public KtxFile EncodeToKtx(Image inputImage) byte[] encoded; if (isCompressedFormat) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, !Debugger.IsAttached && Options.multiThreaded); } else @@ -129,8 +131,8 @@ public KtxFile EncodeToKtx(Image inputImage) foreach (var image in mipChain) image.Dispose(); - output.Header.NumberOfFaces = 1; - output.Header.NumberOfMipmapLevels = numMipMaps; + output.header.NumberOfFaces = 1; + output.header.NumberOfMipmapLevels = numMipMaps; return output; } @@ -146,30 +148,32 @@ public DdsFile EncodeToDds(Image inputImage) IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); // Setup encoder - var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.format); + compressedEncoder = GetEncoder(OutputOptions.Format); if (compressedEncoder == null) - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(inputImage.Width, inputImage.Height, compressedEncoder.GetDxgiFormat()); output = new DdsFile(ddsHeader, dxt10Header); - if (OutputOptions.ddsBc1WriteAlphaFlag && - OutputOptions.format == CompressionFormat.BC1WithAlpha) + if (OutputOptions.DdsBc1WriteAlphaFlag && + OutputOptions.Format == CompressionFormat.Bc1WithAlpha) { - output.Header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DDPF_ALPHAPIXELS; + output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; } } else { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); var ddsHeader = DdsHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, uncompressedEncoder.GetDxgiFormat()); output = new DdsFile(ddsHeader); @@ -182,13 +186,15 @@ public DdsFile EncodeToDds(Image inputImage) if (isCompressedFormat) { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, !Debugger.IsAttached && Options.multiThreaded); } else { if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { throw new Exception("Cannot get pixel span."); + } encoded = uncompressedEncoder.Encode(mipPixels); } @@ -206,11 +212,15 @@ public DdsFile EncodeToDds(Image inputImage) // Dispose all mipmap levels foreach (var image in mipChain) + { image.Dispose(); + } - output.Header.dwMipMapCount = numMipMaps; + output.header.dwMipMapCount = numMipMaps; if (numMipMaps > 1) - output.Header.dwCaps |= HeaderCaps.DDSCAPS_COMPLEX | HeaderCaps.DDSCAPS_MIPMAP; + { + output.header.dwCaps |= HeaderCaps.DdscapsComplex | HeaderCaps.DdscapsMipmap; + } return output; } @@ -226,20 +236,22 @@ public IList EncodeToRawBytes(Image inputImage) IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); // Setup encoder - var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.format); + compressedEncoder = GetEncoder(OutputOptions.Format); if (compressedEncoder == null) - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } } else { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); } // Encode all mipmap levels @@ -248,14 +260,16 @@ public IList EncodeToRawBytes(Image inputImage) byte[] encoded; if (isCompressedFormat) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, !Debugger.IsAttached && Options.multiThreaded); } else { if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { throw new Exception("Cannot get pixel span."); + } encoded = uncompressedEncoder.Encode(mipPixels); } @@ -265,7 +279,9 @@ public IList EncodeToRawBytes(Image inputImage) // Dispose all mipmap levels foreach (var image in mipChain) + { image.Dispose(); + } return output; } @@ -286,27 +302,31 @@ public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int m IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); // Setup encoder - var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.format); + compressedEncoder = GetEncoder(OutputOptions.Format); if (compressedEncoder == null) - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } } else { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); } // Dispose all mipmap levels if (mipLevel > numMipMaps - 1) { foreach (var image in mipChain) + { image.Dispose(); + } throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps."); } @@ -315,14 +335,16 @@ public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int m byte[] encoded; if (isCompressedFormat) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, !Debugger.IsAttached && Options.multiThreaded); } else { if (!mipChain[mipLevel].TryGetSinglePixelSpan(out var mipPixels)) + { throw new Exception("Cannot get pixel span."); + } encoded = uncompressedEncoder.Encode(mipPixels); } @@ -332,7 +354,9 @@ public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int m // Dispose all mipmap levels foreach (var image in mipChain) + { image.Dispose(); + } return encoded; } @@ -351,7 +375,7 @@ public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int m public void EncodeCubeMap(Image right, Image left, Image top, Image down, Image back, Image front, Stream outputStream) { - switch (OutputOptions.fileFormat) + switch (OutputOptions.FileFormat) { case OutputFileFormat.Ktx: var ktx = EncodeCubeMapToKtx(right, left, top, down, back, front); @@ -394,12 +418,14 @@ public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image var faces = new[] { right, left, top, down, back, front }; // Setup encoder - var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.format); + compressedEncoder = GetEncoder(OutputOptions.Format); if (compressedEncoder == null) - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } output = new KtxFile( KtxHeader.InitializeCompressed(right.Width, right.Height, @@ -408,7 +434,7 @@ public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image } else { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); output = new KtxFile( KtxHeader.InitializeUncompressed(right.Width, right.Height, uncompressedEncoder.GetGlType(), @@ -419,7 +445,7 @@ public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image } - var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; var mipLength = MipMapper.CalculateMipChainLength(right.Width, right.Height, numMipMaps); for (uint i = 0; i < mipLength; i++) { @@ -437,14 +463,16 @@ public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image byte[] encoded; if (isCompressedFormat) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, !Debugger.IsAttached && Options.multiThreaded); } else { if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { throw new Exception("Cannot get pixel span."); + } encoded = uncompressedEncoder.Encode(mipPixels); } @@ -463,11 +491,13 @@ public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image // Dispose all mipmap levels foreach (var image in mipChain) + { image.Dispose(); + } } - output.Header.NumberOfFaces = (uint)faces.Length; - output.Header.NumberOfMipmapLevels = mipLength; + output.header.NumberOfFaces = (uint)faces.Length; + output.header.NumberOfMipmapLevels = mipLength; return output; } @@ -501,33 +531,35 @@ public DdsFile EncodeCubeMapToDds(Image right, Image left, Image var faces = new[] { right, left, top, down, back, front }; // Setup encoder - var isCompressedFormat = OutputOptions.format.IsCompressedFormat(); + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.format); + compressedEncoder = GetEncoder(OutputOptions.Format); if (compressedEncoder == null) - throw new NotSupportedException($"This format is not supported: {OutputOptions.format}"); + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(right.Width, right.Height, compressedEncoder.GetDxgiFormat()); output = new DdsFile(ddsHeader, dxt10Header); - if (OutputOptions.ddsBc1WriteAlphaFlag && - OutputOptions.format == CompressionFormat.BC1WithAlpha) + if (OutputOptions.DdsBc1WriteAlphaFlag && + OutputOptions.Format == CompressionFormat.Bc1WithAlpha) { - output.Header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DDPF_ALPHAPIXELS; + output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; } } else { - uncompressedEncoder = GetRawEncoder(OutputOptions.format); + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); var ddsHeader = DdsHeader.InitializeUncompressed(right.Width, right.Height, uncompressedEncoder.GetDxgiFormat()); output = new DdsFile(ddsHeader); } - var numMipMaps = OutputOptions.generateMipMaps ? (uint)OutputOptions.maxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; // Encode all faces for (var face = 0; face < faces.Length; face++) @@ -540,14 +572,16 @@ public DdsFile EncodeCubeMapToDds(Image right, Image left, Image byte[] encoded; if (isCompressedFormat) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out int blocksWidth, out int blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.quality, + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, !Debugger.IsAttached && Options.multiThreaded); } else { if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { throw new Exception("Cannot get pixel span."); + } encoded = uncompressedEncoder.Encode(mipPixels); } @@ -565,22 +599,25 @@ public DdsFile EncodeCubeMapToDds(Image right, Image left, Image // Dispose all mipmap levels foreach (var image in mipChain) + { image.Dispose(); + } } - output.Header.dwCaps |= HeaderCaps.DDSCAPS_COMPLEX; - output.Header.dwMipMapCount = numMipMaps; + output.header.dwCaps |= HeaderCaps.DdscapsComplex; + output.header.dwMipMapCount = numMipMaps; if (numMipMaps > 1) { - output.Header.dwCaps |= HeaderCaps.DDSCAPS_MIPMAP; + output.header.dwCaps |= HeaderCaps.DdscapsMipmap; } - output.Header.dwCaps2 |= HeaderCaps2.DDSCAPS2_CUBEMAP | - HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEX | - HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEX | - HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEY | - HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEY | - HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEZ | - HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEZ; + + output.header.dwCaps2 |= HeaderCaps2.Ddscaps2Cubemap | + HeaderCaps2.Ddscaps2CubemapPositivex | + HeaderCaps2.Ddscaps2CubemapNegativex | + HeaderCaps2.Ddscaps2CubemapPositivey | + HeaderCaps2.Ddscaps2CubemapNegativey | + HeaderCaps2.Ddscaps2CubemapPositivez | + HeaderCaps2.Ddscaps2CubemapNegativez; return output; } @@ -589,25 +626,25 @@ private IBcBlockEncoder GetEncoder(CompressionFormat format) { switch (format) { - case CompressionFormat.BC1: + case CompressionFormat.Bc1: return new Bc1BlockEncoder(); - case CompressionFormat.BC1WithAlpha: + case CompressionFormat.Bc1WithAlpha: return new Bc1AlphaBlockEncoder(); - case CompressionFormat.BC2: + case CompressionFormat.Bc2: return new Bc2BlockEncoder(); - case CompressionFormat.BC3: + case CompressionFormat.Bc3: return new Bc3BlockEncoder(); - case CompressionFormat.BC4: - return new Bc4BlockEncoder(InputOptions.luminanceAsRed); + case CompressionFormat.Bc4: + return new Bc4BlockEncoder(InputOptions.LuminanceAsRed); - case CompressionFormat.BC5: + case CompressionFormat.Bc5: return new Bc5BlockEncoder(); - case CompressionFormat.BC7: + case CompressionFormat.Bc7: return new Bc7Encoder(); default: @@ -620,16 +657,16 @@ private IRawEncoder GetRawEncoder(CompressionFormat format) switch (format) { case CompressionFormat.R: - return new RawLuminanceEncoder(InputOptions.luminanceAsRed); + return new RawLuminanceEncoder(InputOptions.LuminanceAsRed); - case CompressionFormat.RG: - return new RawRGEncoder(); + case CompressionFormat.Rg: + return new RawRgEncoder(); - case CompressionFormat.RGB: - return new RawRGBEncoder(); + case CompressionFormat.Rgb: + return new RawRgbEncoder(); - case CompressionFormat.RGBA: - return new RawRGBAEncoder(); + case CompressionFormat.Rgba: + return new RawRgbaEncoder(); default: throw new ArgumentOutOfRangeException(nameof(format), format, null); diff --git a/BCnEnc.Net/Encoder/ColorChooser.cs b/BCnEnc.Net/Encoder/ColorChooser.cs index ae4ac45..505cee0 100644 --- a/BCnEnc.Net/Encoder/ColorChooser.cs +++ b/BCnEnc.Net/Encoder/ColorChooser.cs @@ -24,17 +24,17 @@ public static int ChooseClosestColor4(ReadOnlySpan colors, Rgba32 co + MathF.Abs(colors[3].b - color.B) * bWeight, }; - int b0 = d[0] > d[3] ? 1 : 0; - int b1 = d[1] > d[2] ? 1 : 0; - int b2 = d[0] > d[2] ? 1 : 0; - int b3 = d[1] > d[3] ? 1 : 0; - int b4 = d[2] > d[3] ? 1 : 0; + var b0 = d[0] > d[3] ? 1 : 0; + var b1 = d[1] > d[2] ? 1 : 0; + var b2 = d[0] > d[2] ? 1 : 0; + var b3 = d[1] > d[3] ? 1 : 0; + var b4 = d[2] > d[3] ? 1 : 0; - int x0 = b1 & b2; - int x1 = b0 & b3; - int x2 = b0 & b4; + var x0 = b1 & b2; + var x1 = b0 & b3; + var x2 = b0 & b4; - int idx = (x2 | ((x0 | x1) << 1)); + var idx = x2 | ((x0 | x1) << 1); error = d[idx]; return idx; } @@ -66,15 +66,15 @@ public static int ChooseClosestColor4AlphaCutoff(ReadOnlySpan colors + MathF.Abs(colors[3].b - color.B) * bWeight, }; - int b0 = d[0] > d[2] ? 1 : 0; - int b1 = d[1] > d[3] ? 1 : 0; - int b2 = d[0] > d[3] ? 1 : 0; - int b3 = d[1] > d[2] ? 1 : 0; - int nb3 = d[1] > d[2] ? 0 : 1; - int b4 = d[0] > d[1] ? 1 : 0; - int b5 = d[2] > d[3] ? 1 : 0; + var b0 = d[0] > d[2] ? 1 : 0; + var b1 = d[1] > d[3] ? 1 : 0; + var b2 = d[0] > d[3] ? 1 : 0; + var b3 = d[1] > d[2] ? 1 : 0; + var nb3 = d[1] > d[2] ? 0 : 1; + var b4 = d[0] > d[1] ? 1 : 0; + var b5 = d[2] > d[3] ? 1 : 0; - int idx = (nb3 & b4) | (b2 & b5) | (((b0 & b3) | (b1 & b2)) << 1); + var idx = (nb3 & b4) | (b2 & b5) | (((b0 & b3) | (b1 & b2)) << 1); error = d[idx]; return idx; @@ -82,15 +82,15 @@ public static int ChooseClosestColor4AlphaCutoff(ReadOnlySpan colors public static int ChooseClosestColor(Span colors, Rgba32 color) { - int closest = 0; - int closestError = + var closest = 0; + var closestError = Math.Abs(colors[0].r - color.R) + Math.Abs(colors[0].g - color.G) + Math.Abs(colors[0].b - color.B); - for (int i = 1; i < colors.Length; i++) + for (var i = 1; i < colors.Length; i++) { - int error = + var error = Math.Abs(colors[i].r - color.R) + Math.Abs(colors[i].g - color.G) + Math.Abs(colors[i].b - color.B); @@ -105,16 +105,16 @@ public static int ChooseClosestColor(Span colors, Rgba32 color) public static int ChooseClosestColor(Span colors, Rgba32 color) { - int closest = 0; - int closestError = + var closest = 0; + var closestError = Math.Abs(colors[0].r - color.R) + Math.Abs(colors[0].g - color.G) + Math.Abs(colors[0].b - color.B) + Math.Abs(colors[0].a - color.A); - for (int i = 1; i < colors.Length; i++) + for (var i = 1; i < colors.Length; i++) { - int error = + var error = Math.Abs(colors[i].r - color.R) + Math.Abs(colors[i].g - color.G) + Math.Abs(colors[i].b - color.B) @@ -135,16 +135,16 @@ public static int ChooseClosestColorAlphaCutOff(Span colors, Rgba32 return 3; } - int closest = 0; - int closestError = + var closest = 0; + var closestError = Math.Abs(colors[0].r - color.R) + Math.Abs(colors[0].g - color.G) + Math.Abs(colors[0].b - color.B); - for (int i = 1; i < colors.Length; i++) + for (var i = 1; i < colors.Length; i++) { if (i == 3) continue; // Skip transparent - int error = + var error = Math.Abs(colors[i].r - color.R) + Math.Abs(colors[i].g - color.G) + Math.Abs(colors[i].b - color.B); @@ -159,15 +159,15 @@ public static int ChooseClosestColorAlphaCutOff(Span colors, Rgba32 public static int ChooseClosestColor(Span colors, ColorYCbCr color, float luminanceMultiplier = 4) { - int closest = 0; + var closest = 0; float closestError = 0; - bool first = true; + var first = true; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { - float error = MathF.Abs(colors[i].y - color.y) * luminanceMultiplier - + MathF.Abs(colors[i].cb - color.cb) - + MathF.Abs(colors[i].cr - color.cr); + var error = MathF.Abs(colors[i].y - color.y) * luminanceMultiplier + + MathF.Abs(colors[i].cb - color.cb) + + MathF.Abs(colors[i].cr - color.cr); if (first) { closestError = error; diff --git a/BCnEnc.Net/Encoder/ColorVariationGenerator.cs b/BCnEnc.Net/Encoder/ColorVariationGenerator.cs index 96185ed..d505361 100644 --- a/BCnEnc.Net/Encoder/ColorVariationGenerator.cs +++ b/BCnEnc.Net/Encoder/ColorVariationGenerator.cs @@ -15,7 +15,7 @@ internal static class ColorVariationGenerator public static int VarPatternCount => varPatternEp0R.Length; public static (ColorRgb565, ColorRgb565) Variate565(ColorRgb565 c0, ColorRgb565 c1, int i) { - int idx = i % varPatternEp0R.Length; + var idx = i % varPatternEp0R.Length; var newEp0 = new ColorRgb565(); var newEp1 = new ColorRgb565(); @@ -33,11 +33,11 @@ public static (ColorRgb565, ColorRgb565) Variate565(ColorRgb565 c0, ColorRgb565 public static List GenerateVariationsSidewaysMax(int variations, ColorYCbCr min, ColorYCbCr max) { - List colors = new List(); + var colors = new List(); colors.Add(min.ToColorRgb565()); colors.Add(max.ToColorRgb565()); - for (int i = 0; i < variations; i++) + for (var i = 0; i < variations; i++) { max.y -= 0.05f; min.y += 0.05f; @@ -86,11 +86,11 @@ public static List GenerateVariationsSidewaysMax(int variations, Co public static List GenerateVariationsSidewaysMinMax(int variations, ColorYCbCr min, ColorYCbCr max) { - List colors = new List(); + var colors = new List(); colors.Add(min.ToColorRgb565()); colors.Add(max.ToColorRgb565()); - for (int i = 0; i < variations; i++) + for (var i = 0; i < variations; i++) { max.y -= 0.05f; min.y += 0.05f; diff --git a/BCnEnc.Net/Encoder/CompressionQuality.cs b/BCnEnc.Net/Encoder/CompressionQuality.cs index b857a45..27dda30 100644 --- a/BCnEnc.Net/Encoder/CompressionQuality.cs +++ b/BCnEnc.Net/Encoder/CompressionQuality.cs @@ -3,15 +3,15 @@ public enum CompressionQuality { /// - /// Fast, but low quality. Especially bad with gradients. + /// Fast, but low Quality. Especially bad with gradients. /// Fast, /// - /// Strikes a balance between speed and quality. Good enough for most purposes. + /// Strikes a balance between speed and Quality. Good enough for most purposes. /// Balanced, /// - /// Aims for best quality encoding. Can be very slow. + /// Aims for best Quality encoding. Can be very slow. /// BestQuality } diff --git a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs index 1801c16..add7372 100644 --- a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs @@ -8,8 +8,8 @@ internal interface IBcBlockEncoder { byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel = true); GlInternalFormat GetInternalFormat(); - GLFormat GetBaseInternalFormat(); - DXGI_FORMAT GetDxgiFormat(); + GlFormat GetBaseInternalFormat(); + DxgiFormat GetDxgiFormat(); } diff --git a/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs index dbc59d8..2cd9948 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs @@ -1,11 +1,14 @@ namespace BCnEncoder.Encoder.Options { + /// + /// The input options for the decoder. + /// public class EncoderInputOptions { /// - /// If true, when encoding to a format that only includes a red channel, + /// If true, when encoding to a Format that only includes a red channel, /// use the pixel luminance instead of just the red channel. Default is false. /// - public bool luminanceAsRed = false; + public bool LuminanceAsRed { get; set; } = false; } } diff --git a/BCnEnc.Net/Encoder/Options/EncoderOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOptions.cs index df95b80..1aea697 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderOptions.cs @@ -1,5 +1,8 @@ namespace BCnEncoder.Encoder.Options { + /// + /// General options for the encoder. + /// public class EncoderOptions { /// diff --git a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs index d7fb794..6839889 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs @@ -2,44 +2,47 @@ namespace BCnEncoder.Encoder.Options { + /// + /// The output options for the encoder. + /// public class EncoderOutputOptions { /// /// Whether to generate mipMaps. Default is true. /// - public bool generateMipMaps = true; + public bool GenerateMipMaps { get; set; } = true; /// /// The maximum number of mipmap levels to generate. -1 or 0 is unbounded. /// Default is -1. /// - public int maxMipMapLevel = -1; + public int MaxMipMapLevel { get; set; } = -1; /// - /// The compression format to use. Default is BC1. + /// The compression Format to use. Default is BC1. /// - public CompressionFormat format = CompressionFormat.BC1; + public CompressionFormat Format { get; set; } = CompressionFormat.Bc1; /// - /// The quality of the compression. Use either fast or balanced for testing. + /// The Quality of the compression. Use either fast or balanced for testing. /// Fast can be used for near real-time encoding for most algorithms. /// Use bestQuality when needed. Default is balanced. /// - public CompressionQuality quality = CompressionQuality.Balanced; + public CompressionQuality Quality { get; set; } = CompressionQuality.Balanced; /// - /// The output file format of the data. Either Ktx or Dds. + /// The output file Format of the data. Either Ktx or Dds. /// Default is Ktx. /// - public OutputFileFormat fileFormat = OutputFileFormat.Ktx; + public OutputFileFormat FileFormat { get; set; } = OutputFileFormat.Ktx; /// - /// The DDS file format doesn't seem to have a standard for indicating whether a BC1 texture + /// The DDS file Format doesn't seem to have a standard for indicating whether a BC1 texture /// includes 1bit of alpha. This option will write DDPF_ALPHAPIXELS flag to the header /// to indicate the presence of an alpha channel. Some programs read and write this flag, /// but some programs don't like it and get confused. Your mileage may vary. /// Default is false. /// - public bool ddsBc1WriteAlphaFlag = false; + public bool DdsBc1WriteAlphaFlag { get; set; } = false; } } diff --git a/BCnEnc.Net/Encoder/RawEncoders.cs b/BCnEnc.Net/Encoder/RawEncoders.cs index 0b5c16a..2369c40 100644 --- a/BCnEnc.Net/Encoder/RawEncoders.cs +++ b/BCnEnc.Net/Encoder/RawEncoders.cs @@ -8,11 +8,11 @@ internal interface IRawEncoder { byte[] Encode(ReadOnlySpan pixels); GlInternalFormat GetInternalFormat(); - GLFormat GetBaseInternalFormat(); - GLFormat GetGlFormat(); - GLType GetGlType(); + GlFormat GetBaseInternalFormat(); + GlFormat GetGlFormat(); + GlType GetGlType(); uint GetGlTypeSize(); - DXGI_FORMAT GetDxgiFormat(); + DxgiFormat GetDxgiFormat(); } internal class RawLuminanceEncoder : IRawEncoder { @@ -23,8 +23,8 @@ public RawLuminanceEncoder(bool useLuminance) { } public byte[] Encode(ReadOnlySpan pixels) { - byte[] output = new byte[pixels.Length]; - for (int i = 0; i < pixels.Length; i++) { + var output = new byte[pixels.Length]; + for (var i = 0; i < pixels.Length; i++) { if (useLuminance) { output[i] = (byte)(new ColorYCbCr(pixels[i]).y * 255); } @@ -37,27 +37,27 @@ public byte[] Encode(ReadOnlySpan pixels) { } public GlInternalFormat GetInternalFormat() - => GlInternalFormat.GL_R8; + => GlInternalFormat.GlR8; - public GLFormat GetBaseInternalFormat() - => GLFormat.GL_RED; + public GlFormat GetBaseInternalFormat() + => GlFormat.GlRed; - public GLFormat GetGlFormat() => GLFormat.GL_RED; + public GlFormat GetGlFormat() => GlFormat.GlRed; - public GLType GetGlType() - => GLType.GL_BYTE; + public GlType GetGlType() + => GlType.GlByte; public uint GetGlTypeSize() => 1; - public DXGI_FORMAT GetDxgiFormat() => DXGI_FORMAT.DXGI_FORMAT_R8_UNORM; + public DxgiFormat GetDxgiFormat() => DxgiFormat.DxgiFormatR8Unorm; } - internal class RawRGEncoder : IRawEncoder + internal class RawRgEncoder : IRawEncoder { public byte[] Encode(ReadOnlySpan pixels) { - byte[] output = new byte[pixels.Length * 2]; - for (int i = 0; i < pixels.Length; i++) { + var output = new byte[pixels.Length * 2]; + for (var i = 0; i < pixels.Length; i++) { output[i * 2] = pixels[i].R; output[i * 2 + 1] = pixels[i].G; } @@ -65,27 +65,27 @@ public byte[] Encode(ReadOnlySpan pixels) { } public GlInternalFormat GetInternalFormat() - => GlInternalFormat.GL_RG8; + => GlInternalFormat.GlRg8; - public GLFormat GetBaseInternalFormat() - => GLFormat.GL_RG; + public GlFormat GetBaseInternalFormat() + => GlFormat.GlRg; - public GLFormat GetGlFormat() => GLFormat.GL_RG; + public GlFormat GetGlFormat() => GlFormat.GlRg; - public GLType GetGlType() - => GLType.GL_BYTE; + public GlType GetGlType() + => GlType.GlByte; public uint GetGlTypeSize() => 1; - public DXGI_FORMAT GetDxgiFormat() => DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM; + public DxgiFormat GetDxgiFormat() => DxgiFormat.DxgiFormatR8G8Unorm; } - internal class RawRGBEncoder : IRawEncoder + internal class RawRgbEncoder : IRawEncoder { public byte[] Encode(ReadOnlySpan pixels) { - byte[] output = new byte[pixels.Length * 3]; - for (int i = 0; i < pixels.Length; i++) { + var output = new byte[pixels.Length * 3]; + for (var i = 0; i < pixels.Length; i++) { output[i * 3] = pixels[i].R; output[i * 3 + 1] = pixels[i].G; output[i * 3 + 2] = pixels[i].B; @@ -94,27 +94,27 @@ public byte[] Encode(ReadOnlySpan pixels) { } public GlInternalFormat GetInternalFormat() - => GlInternalFormat.GL_RGB8; + => GlInternalFormat.GlRgb8; - public GLFormat GetBaseInternalFormat() - => GLFormat.GL_RGB; + public GlFormat GetBaseInternalFormat() + => GlFormat.GlRgb; - public GLFormat GetGlFormat() => GLFormat.GL_RGB; + public GlFormat GetGlFormat() => GlFormat.GlRgb; - public GLType GetGlType() - => GLType.GL_BYTE; + public GlType GetGlType() + => GlType.GlByte; public uint GetGlTypeSize() => 1; - public DXGI_FORMAT GetDxgiFormat() => throw new NotSupportedException("RGB format is not supported for dds files."); + public DxgiFormat GetDxgiFormat() => throw new NotSupportedException("RGB Format is not supported for dds files."); } - internal class RawRGBAEncoder : IRawEncoder + internal class RawRgbaEncoder : IRawEncoder { public byte[] Encode(ReadOnlySpan pixels) { - byte[] output = new byte[pixels.Length * 4]; - for (int i = 0; i < pixels.Length; i++) { + var output = new byte[pixels.Length * 4]; + for (var i = 0; i < pixels.Length; i++) { output[i * 4] = pixels[i].R; output[i * 4 + 1] = pixels[i].G; output[i * 4 + 2] = pixels[i].B; @@ -124,19 +124,19 @@ public byte[] Encode(ReadOnlySpan pixels) { } public GlInternalFormat GetInternalFormat() - => GlInternalFormat.GL_RGBA8; + => GlInternalFormat.GlRgba8; - public GLFormat GetBaseInternalFormat() - => GLFormat.GL_RGBA; + public GlFormat GetBaseInternalFormat() + => GlFormat.GlRgba; - public GLFormat GetGlFormat() => GLFormat.GL_RGBA; + public GlFormat GetGlFormat() => GlFormat.GlRgba; - public GLType GetGlType() - => GLType.GL_BYTE; + public GlType GetGlType() + => GlType.GlByte; public uint GetGlTypeSize() => 1; - public DXGI_FORMAT GetDxgiFormat() => DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM; + public DxgiFormat GetDxgiFormat() => DxgiFormat.DxgiFormatR8G8B8A8Unorm; } } diff --git a/BCnEnc.Net/Shared/Bc7Block.cs b/BCnEnc.Net/Shared/Bc7Block.cs index c63e1a8..9539177 100644 --- a/BCnEnc.Net/Shared/Bc7Block.cs +++ b/BCnEnc.Net/Shared/Bc7Block.cs @@ -23,9 +23,9 @@ internal struct Bc7Block public ulong lowBits; public ulong highBits; - public static ReadOnlySpan colorInterpolationWeights2 => new byte[] { 0, 21, 43, 64 }; - public static ReadOnlySpan colorInterpolationWeights3 => new byte[] { 0, 9, 18, 27, 37, 46, 55, 64 }; - public static ReadOnlySpan colorInterpolationWeights4 => new byte[] { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 }; + public static ReadOnlySpan ColorInterpolationWeights2 => new byte[] { 0, 21, 43, 64 }; + public static ReadOnlySpan ColorInterpolationWeights3 => new byte[] { 0, 9, 18, 27, 37, 46, 55, 64 }; + public static ReadOnlySpan ColorInterpolationWeights4 => new byte[] { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 }; public static readonly int[][] Subsets2PartitionTable = { @@ -199,9 +199,9 @@ public Bc7BlockType Type { get { - for (int i = 0; i < 8; i++) + for (var i = 0; i < 8; i++) { - ulong mask = (ulong)(1 << i); + var mask = (ulong)(1 << i); if ((lowBits & mask) == mask) { return (Bc7BlockType)i; @@ -531,7 +531,7 @@ private void FinalizeEndpoints(ColorRgba32[] endpoints) { if (HasPBits) { - for (int i = 0; i < endpoints.Length; i++) + for (var i = 0; i < endpoints.Length; i++) { endpoints[i] <<= 1; } @@ -546,7 +546,7 @@ private void FinalizeEndpoints(ColorRgba32[] endpoints) } else { - for (int i = 0; i < endpoints.Length; i++) + for (var i = 0; i < endpoints.Length; i++) { endpoints[i] |= pBits[i]; } @@ -555,7 +555,7 @@ private void FinalizeEndpoints(ColorRgba32[] endpoints) var colorPrecision = ColorComponentPrecision; var alphaPrecision = AlphaComponentPrecision; - for (int i = 0; i < endpoints.Length; i++) + for (var i = 0; i < endpoints.Length; i++) { // ColorComponentPrecision & AlphaComponentPrecision includes pbit // left shift endpoint components so that their MSB lies in bit 7 @@ -575,7 +575,7 @@ private void FinalizeEndpoints(ColorRgba32[] endpoints) //set alpha equal to 255 if (!HasAlpha) { - for (int i = 0; i < endpoints.Length; i++) + for (var i = 0; i < endpoints.Length; i++) { endpoints[i].a = 255; } @@ -584,7 +584,7 @@ private void FinalizeEndpoints(ColorRgba32[] endpoints) public ColorRgba32[] ExtractEndpoints() { - ColorRgba32[] endpoints = new ColorRgba32[NumSubsets * 2]; + var endpoints = new ColorRgba32[NumSubsets * 2]; ExtractRawEndpoints(endpoints); FinalizeEndpoints(endpoints); return endpoints; @@ -614,7 +614,7 @@ private int GetIndexOffset(Bc7BlockType type, int numSubsets, int partitionIndex } if (numSubsets == 2) { - int anchorIndex = Subsets2AnchorIndices[partitionIndex]; + var anchorIndex = Subsets2AnchorIndices[partitionIndex]; if (index <= anchorIndex) { return bitCount * index - 1; @@ -626,8 +626,8 @@ private int GetIndexOffset(Bc7BlockType type, int numSubsets, int partitionIndex } if (numSubsets == 3) { - int anchor2Index = Subsets3AnchorIndices2[partitionIndex]; - int anchor3Index = Subsets3AnchorIndices3[partitionIndex]; + var anchor2Index = Subsets3AnchorIndices2[partitionIndex]; + var anchor3Index = Subsets3AnchorIndices3[partitionIndex]; if (index <= anchor2Index && index <= anchor3Index) { @@ -653,7 +653,7 @@ private int GetIndexBitCount(int numSubsets, int partitionIndex, int bitCount, i if (index == 0) return bitCount - 1; if (numSubsets == 2) { - int anchorIndex = Subsets2AnchorIndices[partitionIndex]; + var anchorIndex = Subsets2AnchorIndices[partitionIndex]; if (index == anchorIndex) { return bitCount - 1; @@ -661,8 +661,8 @@ private int GetIndexBitCount(int numSubsets, int partitionIndex, int bitCount, i } else if (numSubsets == 3) { - int anchor2Index = Subsets3AnchorIndices2[partitionIndex]; - int anchor3Index = Subsets3AnchorIndices3[partitionIndex]; + var anchor2Index = Subsets3AnchorIndices2[partitionIndex]; + var anchor3Index = Subsets3AnchorIndices3[partitionIndex]; if (index == anchor2Index) { return bitCount - 1; @@ -675,7 +675,7 @@ private int GetIndexBitCount(int numSubsets, int partitionIndex, int bitCount, i return bitCount; } - private int GetIndexBegin(Bc7BlockType type, int bitCount, bool IsAlpha) + private int GetIndexBegin(Bc7BlockType type, int bitCount, bool isAlpha) { switch (type) { @@ -697,7 +697,7 @@ private int GetIndexBegin(Bc7BlockType type, int bitCount, bool IsAlpha) return 81; } case Bc7BlockType.Type5: - if (IsAlpha) + if (isAlpha) { return 97; } @@ -716,17 +716,17 @@ private int GetIndexBegin(Bc7BlockType type, int bitCount, bool IsAlpha) private int GetAlphaIndex(Bc7BlockType type, int numSubsets, int partitionIndex, int bitCount, int index) { if (bitCount == 0) return 0; // No Alpha - int indexOffset = GetIndexOffset(type, numSubsets, partitionIndex, bitCount, index); - int indexBitCount = GetIndexBitCount(numSubsets, partitionIndex, bitCount, index); - int indexBegin = GetIndexBegin(type, bitCount, true); + var indexOffset = GetIndexOffset(type, numSubsets, partitionIndex, bitCount, index); + var indexBitCount = GetIndexBitCount(numSubsets, partitionIndex, bitCount, index); + var indexBegin = GetIndexBegin(type, bitCount, true); return (int)ByteHelper.ExtractFrom128(lowBits, highBits, indexBegin + indexOffset, indexBitCount); } private int GetColorIndex(Bc7BlockType type, int numSubsets, int partitionIndex, int bitCount, int index) { - int indexOffset = GetIndexOffset(type, numSubsets, partitionIndex, bitCount, index); - int indexBitCount = GetIndexBitCount(numSubsets, partitionIndex, bitCount, index); - int indexBegin = GetIndexBegin(type, bitCount, false); + var indexOffset = GetIndexOffset(type, numSubsets, partitionIndex, bitCount, index); + var indexBitCount = GetIndexBitCount(numSubsets, partitionIndex, bitCount, index); + var indexBegin = GetIndexBegin(type, bitCount, false); return (int)ByteHelper.ExtractFrom128(lowBits, highBits, indexBegin + indexOffset, indexBitCount); } @@ -736,19 +736,19 @@ private ColorRgba32 InterpolateColor(ColorRgba32 endPointStart, ColorRgba32 endP byte InterpolateByte(byte e0, byte e1, int index, int indexPrecision) { if (indexPrecision == 0) return e0; - ReadOnlySpan aWeights2 = colorInterpolationWeights2; - ReadOnlySpan aWeights3 = colorInterpolationWeights3; - ReadOnlySpan aWeights4 = colorInterpolationWeights4; + var aWeights2 = ColorInterpolationWeights2; + var aWeights3 = ColorInterpolationWeights3; + var aWeights4 = ColorInterpolationWeights4; if(indexPrecision == 2) - return (byte) (((64 - aWeights2[index])* (e0) + aWeights2[index]*(e1) + 32) >> 6); + return (byte) (((64 - aWeights2[index])* e0 + aWeights2[index]*e1 + 32) >> 6); else if(indexPrecision == 3) - return (byte) (((64 - aWeights3[index])*(e0) + aWeights3[index]*(e1) + 32) >> 6); + return (byte) (((64 - aWeights3[index])*e0 + aWeights3[index]*e1 + 32) >> 6); else // indexprecision == 4 - return (byte) (((64 - aWeights4[index])*(e0) + aWeights4[index]*(e1) + 32) >> 6); + return (byte) (((64 - aWeights4[index])*e0 + aWeights4[index]*e1 + 32) >> 6); } - ColorRgba32 result = new ColorRgba32( + var result = new ColorRgba32( InterpolateByte(endPointStart.r, endPointEnd.r, colorIndex, colorBitCount), InterpolateByte(endPointStart.g, endPointEnd.g, colorIndex, colorBitCount), InterpolateByte(endPointStart.b, endPointEnd.b, colorIndex, colorBitCount), @@ -781,13 +781,13 @@ private static ColorRgba32 SwapChannels(ColorRgba32 source, int rotation) { public RawBlock4X4Rgba32 Decode() { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var output = new RawBlock4X4Rgba32(); var type = Type; ////decode partition data from explicit partition bits //subset_index = 0; - int numSubsets = 1; - int partitionIndex = 0; + var numSubsets = 1; + var partitionIndex = 0; if (HasSubsets) { @@ -798,31 +798,31 @@ public RawBlock4X4Rgba32 Decode() var pixels = output.AsSpan; - bool hasRotationBits = HasRotationBits; + var hasRotationBits = HasRotationBits; int rotation = RotationBits; - ColorRgba32[] endpoints = ExtractEndpoints(); - for (int i = 0; i < pixels.Length; i++) + var endpoints = ExtractEndpoints(); + for (var i = 0; i < pixels.Length; i++) { - int subsetIndex = GetPartitionIndex(numSubsets, partitionIndex, i); + var subsetIndex = GetPartitionIndex(numSubsets, partitionIndex, i); - ColorRgba32 endPointStart = endpoints[2 * subsetIndex]; - ColorRgba32 endPointEnd = endpoints[2 * subsetIndex + 1]; + var endPointStart = endpoints[2 * subsetIndex]; + var endPointEnd = endpoints[2 * subsetIndex + 1]; - int alphaBitCount = AlphaIndexBitCount; - int colorBitCount = ColorIndexBitCount; - int alphaIndex = GetAlphaIndex(type, numSubsets, partitionIndex, alphaBitCount, i); - int colorIndex = GetColorIndex(type, numSubsets, partitionIndex, colorBitCount, i); + var alphaBitCount = AlphaIndexBitCount; + var colorBitCount = ColorIndexBitCount; + var alphaIndex = GetAlphaIndex(type, numSubsets, partitionIndex, alphaBitCount, i); + var colorIndex = GetColorIndex(type, numSubsets, partitionIndex, colorBitCount, i); - ColorRgba32 outputColor = InterpolateColor(endPointStart, endPointEnd, colorIndex, alphaIndex, + var outputColor = InterpolateColor(endPointStart, endPointEnd, colorIndex, alphaIndex, colorBitCount, alphaBitCount); if (hasRotationBits) { //Decode the 2 color rotation bits as follows: - // 00 – Block format is Scalar(A) Vector(RGB) - no swapping - // 01 – Block format is Scalar(R) Vector(AGB) - swap A and R - // 10 – Block format is Scalar(G) Vector(RAB) - swap A and G - // 11 - Block format is Scalar(B) Vector(RGA) - swap A and B + // 00 – Block Format is Scalar(A) Vector(RGB) - no swapping + // 01 – Block Format is Scalar(R) Vector(AGB) - swap A and R + // 10 – Block Format is Scalar(G) Vector(RAB) - swap A and G + // 11 - Block Format is Scalar(B) Vector(RGA) - swap A and B outputColor = SwapChannels(outputColor, rotation); } @@ -837,37 +837,37 @@ public void PackType0(int partitionIndex4Bit, byte[][] subsetEndpoints, byte[] p Debug.Assert(partitionIndex4Bit < 16, "Mode 0 should have 4bit partition index"); Debug.Assert(subsetEndpoints.Length == 6, "Mode 0 should have 6 endpoints"); Debug.Assert(subsetEndpoints.All(x => x.Length == 3) , "Mode 0 should have RGB endpoints"); - Debug.Assert(subsetEndpoints.All(x => x.All(y => y < (1 << 4))) , "Mode 0 should have 4bit endpoints"); + Debug.Assert(subsetEndpoints.All(x => x.All(y => y < 1 << 4)) , "Mode 0 should have 4bit endpoints"); Debug.Assert(pBits.Length == 6, "Mode 0 should have 6 pBits"); Debug.Assert(indices.Length == 16, "Provide 16 indices"); - Debug.Assert(indices.All(x => x < (1 << 3)) , "Mode 0 should have 3bit indices"); + Debug.Assert(indices.All(x => x < 1 << 3) , "Mode 0 should have 3bit indices"); lowBits = 1; // Set Mode 0 highBits = 0; lowBits = ByteHelper.Store4(lowBits, 1, (byte) partitionIndex4Bit); - int nextIdx = 5; + var nextIdx = 5; //Store endpoints - for (int i = 0; i < subsetEndpoints[0].Length; i++) { - for (int j = 0; j < subsetEndpoints.Length; j++) { + for (var i = 0; i < subsetEndpoints[0].Length; i++) { + for (var j = 0; j < subsetEndpoints.Length; j++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 4, subsetEndpoints[j][i]); nextIdx += 4; } } //Store pBits - for (int i = 0; i < pBits.Length; i++) { + for (var i = 0; i < pBits.Length; i++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 1, pBits[i]); nextIdx++; } Debug.Assert(nextIdx == 83); - int colorBitCount = ColorIndexBitCount; - int indexBegin = GetIndexBegin(Bc7BlockType.Type0, colorBitCount, false); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type0, NumSubsets, + var colorBitCount = ColorIndexBitCount; + var indexBegin = GetIndexBegin(Bc7BlockType.Type0, colorBitCount, false); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type0, NumSubsets, partitionIndex4Bit, colorBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, partitionIndex4Bit, colorBitCount, i); (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, @@ -879,37 +879,37 @@ public void PackType1(int partitionIndex6Bit, byte[][] subsetEndpoints, byte[] p Debug.Assert(partitionIndex6Bit < 64, "Mode 1 should have 6bit partition index"); Debug.Assert(subsetEndpoints.Length == 4, "Mode 1 should have 4 endpoints"); Debug.Assert(subsetEndpoints.All(x => x.Length == 3) , "Mode 1 should have RGB endpoints"); - Debug.Assert(subsetEndpoints.All(x => x.All(y => y < (1 << 6))) , "Mode 1 should have 6bit endpoints"); + Debug.Assert(subsetEndpoints.All(x => x.All(y => y < 1 << 6)) , "Mode 1 should have 6bit endpoints"); Debug.Assert(pBits.Length == 2, "Mode 1 should have 2 pBits"); Debug.Assert(indices.Length == 16, "Provide 16 indices"); - Debug.Assert(indices.All(x => x < (1 << 3)) , "Mode 1 should have 3bit indices"); + Debug.Assert(indices.All(x => x < 1 << 3) , "Mode 1 should have 3bit indices"); lowBits = 2; // Set Mode 1 highBits = 0; lowBits = ByteHelper.Store6(lowBits, 2, (byte) partitionIndex6Bit); - int nextIdx = 8; + var nextIdx = 8; //Store endpoints - for (int i = 0; i < subsetEndpoints[0].Length; i++) { - for (int j = 0; j < subsetEndpoints.Length; j++) { + for (var i = 0; i < subsetEndpoints[0].Length; i++) { + for (var j = 0; j < subsetEndpoints.Length; j++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 6, subsetEndpoints[j][i]); nextIdx += 6; } } //Store pBits - for (int i = 0; i < pBits.Length; i++) { + for (var i = 0; i < pBits.Length; i++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 1, pBits[i]); nextIdx++; } Debug.Assert(nextIdx == 82); - int colorBitCount = ColorIndexBitCount; - int indexBegin = GetIndexBegin(Bc7BlockType.Type1, colorBitCount, false); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type1, NumSubsets, + var colorBitCount = ColorIndexBitCount; + var indexBegin = GetIndexBegin(Bc7BlockType.Type1, colorBitCount, false); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type1, NumSubsets, partitionIndex6Bit, colorBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, partitionIndex6Bit, colorBitCount, i); (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, @@ -921,19 +921,19 @@ public void PackType2(int partitionIndex6Bit, byte[][] subsetEndpoints, byte[] Debug.Assert(partitionIndex6Bit < 64, "Mode 2 should have 6bit partition index"); Debug.Assert(subsetEndpoints.Length == 6, "Mode 2 should have 6 endpoints"); Debug.Assert(subsetEndpoints.All(x => x.Length == 3) , "Mode 2 should have RGB endpoints"); - Debug.Assert(subsetEndpoints.All(x => x.All(y => y < (1 << 5))) , "Mode 2 should have 5bit endpoints"); + Debug.Assert(subsetEndpoints.All(x => x.All(y => y < 1 << 5)) , "Mode 2 should have 5bit endpoints"); Debug.Assert(indices.Length == 16, "Provide 16 indices"); - Debug.Assert(indices.All(x => x < (1 << 2)) , "Mode 2 should have 2bit indices"); + Debug.Assert(indices.All(x => x < 1 << 2) , "Mode 2 should have 2bit indices"); lowBits = 0b100; // Set Mode 2 highBits = 0; lowBits = ByteHelper.Store6(lowBits, 3, (byte) partitionIndex6Bit); - int nextIdx = 9; + var nextIdx = 9; //Store endpoints - for (int i = 0; i < subsetEndpoints[0].Length; i++) { - for (int j = 0; j < subsetEndpoints.Length; j++) { + for (var i = 0; i < subsetEndpoints[0].Length; i++) { + for (var j = 0; j < subsetEndpoints.Length; j++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 5, subsetEndpoints[j][i]); nextIdx += 5; @@ -941,12 +941,12 @@ public void PackType2(int partitionIndex6Bit, byte[][] subsetEndpoints, byte[] } Debug.Assert(nextIdx == 99); - int colorBitCount = ColorIndexBitCount; - int indexBegin = GetIndexBegin(Bc7BlockType.Type2, colorBitCount, false); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type2, NumSubsets, + var colorBitCount = ColorIndexBitCount; + var indexBegin = GetIndexBegin(Bc7BlockType.Type2, colorBitCount, false); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type2, NumSubsets, partitionIndex6Bit, colorBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, partitionIndex6Bit, colorBitCount, i); (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, @@ -958,39 +958,39 @@ public void PackType3(int partitionIndex6Bit, byte[][] subsetEndpoints, byte[] p Debug.Assert(partitionIndex6Bit < 64, "Mode 3 should have 6bit partition index"); Debug.Assert(subsetEndpoints.Length == 4, "Mode 3 should have 4 endpoints"); Debug.Assert(subsetEndpoints.All(x => x.Length == 3) , "Mode 3 should have RGB endpoints"); - Debug.Assert(subsetEndpoints.All(x => x.All(y => y < (1 << 7))) , "Mode 3 should have 7bit endpoints"); + Debug.Assert(subsetEndpoints.All(x => x.All(y => y < 1 << 7)) , "Mode 3 should have 7bit endpoints"); Debug.Assert(pBits.Length == 4, "Mode 3 should have 4 pBits"); Debug.Assert(indices.Length == 16, "Provide 16 indices"); - Debug.Assert(indices.All(x => x < (1 << 2)) , "Mode 3 should have 2bit indices"); + Debug.Assert(indices.All(x => x < 1 << 2) , "Mode 3 should have 2bit indices"); lowBits = 0b1000; // Set Mode 3 highBits = 0; lowBits = ByteHelper.Store6(lowBits, 4, (byte) partitionIndex6Bit); - int nextIdx = 10; + var nextIdx = 10; //Store endpoints - for (int i = 0; i < subsetEndpoints[0].Length; i++) { - for (int j = 0; j < subsetEndpoints.Length; j++) { + for (var i = 0; i < subsetEndpoints[0].Length; i++) { + for (var j = 0; j < subsetEndpoints.Length; j++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 7, subsetEndpoints[j][i]); nextIdx += 7; } } //Store pBits - for (int i = 0; i < pBits.Length; i++) { + for (var i = 0; i < pBits.Length; i++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 1, pBits[i]); nextIdx++; } Debug.Assert(nextIdx == 98); - int colorBitCount = ColorIndexBitCount; - int indexBegin = GetIndexBegin(Bc7BlockType.Type3, colorBitCount, false); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type3, NumSubsets, + var colorBitCount = ColorIndexBitCount; + var indexBegin = GetIndexBegin(Bc7BlockType.Type3, colorBitCount, false); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type3, NumSubsets, partitionIndex6Bit, colorBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, partitionIndex6Bit, colorBitCount, i); (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, @@ -1003,14 +1003,14 @@ public void PackType4(int rotation, byte idxMode, byte[][] colorEndPoints, byte[ Debug.Assert(idxMode < 2, "IndexMode can only be 0 or 1"); Debug.Assert(colorEndPoints.Length == 2, "Mode 4 should have 2 endpoints"); Debug.Assert(colorEndPoints.All(x => x.Length == 3) , "Mode 4 should have RGB color endpoints"); - Debug.Assert(colorEndPoints.All(x => x.All(y => y < (1 << 5))) , "Mode 4 should have 5bit color endpoints"); + Debug.Assert(colorEndPoints.All(x => x.All(y => y < 1 << 5)) , "Mode 4 should have 5bit color endpoints"); Debug.Assert(alphaEndPoints.Length == 2, "Mode 4 should have 2 endpoints"); - Debug.Assert(alphaEndPoints.All(x => x < (1 << 6)) , "Mode 4 should have 6bit alpha endpoints"); + Debug.Assert(alphaEndPoints.All(x => x < 1 << 6) , "Mode 4 should have 6bit alpha endpoints"); Debug.Assert(indices2Bit.Length == 16, "Provide 16 indices"); - Debug.Assert(indices2Bit.All(x => x < (1 << 2)) , "Mode 4 should have 2bit indices"); + Debug.Assert(indices2Bit.All(x => x < 1 << 2) , "Mode 4 should have 2bit indices"); Debug.Assert(indices3Bit.Length == 16, "Provide 16 indices"); - Debug.Assert(indices3Bit.All(x => x < (1 << 3)) , "Mode 4 should have 3bit indices"); + Debug.Assert(indices3Bit.All(x => x < 1 << 3) , "Mode 4 should have 3bit indices"); lowBits = 0b10000; // Set Mode 4 highBits = 0; @@ -1018,29 +1018,29 @@ public void PackType4(int rotation, byte idxMode, byte[][] colorEndPoints, byte[ lowBits = ByteHelper.Store2(lowBits, 5, (byte) rotation); lowBits = ByteHelper.Store1(lowBits, 7, (byte) idxMode); - int nextIdx = 8; + var nextIdx = 8; //Store color endpoints - for (int i = 0; i < colorEndPoints[0].Length; i++) { - for (int j = 0; j < colorEndPoints.Length; j++) { + for (var i = 0; i < colorEndPoints[0].Length; i++) { + for (var j = 0; j < colorEndPoints.Length; j++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 5, colorEndPoints[j][i]); nextIdx += 5; } } //Store alpha endpoints - for (int i = 0; i < alphaEndPoints.Length; i++) { + for (var i = 0; i < alphaEndPoints.Length; i++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 6, alphaEndPoints[i]); nextIdx+=6; } Debug.Assert(nextIdx == 50); - int colorBitCount = ColorIndexBitCount; - int colorIndexBegin = GetIndexBegin(Bc7BlockType.Type4, colorBitCount, false); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type4, NumSubsets, + var colorBitCount = ColorIndexBitCount; + var colorIndexBegin = GetIndexBegin(Bc7BlockType.Type4, colorBitCount, false); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type4, NumSubsets, 0, colorBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, 0, colorBitCount, i); if (idxMode == 0) { @@ -1053,12 +1053,12 @@ public void PackType4(int rotation, byte idxMode, byte[][] colorEndPoints, byte[ } } - int alphaBitCount = AlphaIndexBitCount; - int alphaIndexBegin = GetIndexBegin(Bc7BlockType.Type4, alphaBitCount, true); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type4, NumSubsets, + var alphaBitCount = AlphaIndexBitCount; + var alphaIndexBegin = GetIndexBegin(Bc7BlockType.Type4, alphaBitCount, true); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type4, NumSubsets, 0, alphaBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, 0, alphaBitCount, i); if (idxMode == 0) { @@ -1076,42 +1076,42 @@ public void PackType5(int rotation, byte[][] colorEndPoints, byte[] alphaEndPoin Debug.Assert(rotation < 4, "Rotation can only be 0-3"); Debug.Assert(colorEndPoints.Length == 2, "Mode 5 should have 2 endpoints"); Debug.Assert(colorEndPoints.All(x => x.Length == 3) , "Mode 5 should have RGB color endpoints"); - Debug.Assert(colorEndPoints.All(x => x.All(y => y < (1 << 7))) , "Mode 5 should have 7bit color endpoints"); + Debug.Assert(colorEndPoints.All(x => x.All(y => y < 1 << 7)) , "Mode 5 should have 7bit color endpoints"); Debug.Assert(alphaEndPoints.Length == 2, "Mode 5 should have 2 endpoints"); Debug.Assert(colorIndices.Length == 16, "Provide 16 indices"); - Debug.Assert(colorIndices.All(x => x < (1 << 2)) , "Mode 5 should have 2bit color indices"); + Debug.Assert(colorIndices.All(x => x < 1 << 2) , "Mode 5 should have 2bit color indices"); Debug.Assert(alphaIndices.Length == 16, "Provide 16 indices"); - Debug.Assert(alphaIndices.All(x => x < (1 << 2)) , "Mode 5 should have 2bit alpha indices"); + Debug.Assert(alphaIndices.All(x => x < 1 << 2) , "Mode 5 should have 2bit alpha indices"); lowBits = 0b100000; // Set Mode 5 highBits = 0; lowBits = ByteHelper.Store2(lowBits, 6, (byte) rotation); - int nextIdx = 8; + var nextIdx = 8; //Store color endpoints - for (int i = 0; i < colorEndPoints[0].Length; i++) { - for (int j = 0; j < colorEndPoints.Length; j++) { + for (var i = 0; i < colorEndPoints[0].Length; i++) { + for (var j = 0; j < colorEndPoints.Length; j++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 7, colorEndPoints[j][i]); nextIdx += 7; } } //Store alpha endpoints - for (int i = 0; i < alphaEndPoints.Length; i++) { + for (var i = 0; i < alphaEndPoints.Length; i++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 8, alphaEndPoints[i]); nextIdx+=8; } Debug.Assert(nextIdx == 66); - int colorBitCount = ColorIndexBitCount; - int colorIndexBegin = GetIndexBegin(Bc7BlockType.Type5, colorBitCount, false); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type5, NumSubsets, + var colorBitCount = ColorIndexBitCount; + var colorIndexBegin = GetIndexBegin(Bc7BlockType.Type5, colorBitCount, false); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type5, NumSubsets, 0, colorBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, 0, colorBitCount, i); (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, @@ -1119,12 +1119,12 @@ public void PackType5(int rotation, byte[][] colorEndPoints, byte[] alphaEndPoin } - int alphaBitCount = AlphaIndexBitCount; - int alphaIndexBegin = GetIndexBegin(Bc7BlockType.Type5, alphaBitCount, true); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type5, NumSubsets, + var alphaBitCount = AlphaIndexBitCount; + var alphaIndexBegin = GetIndexBegin(Bc7BlockType.Type5, alphaBitCount, true); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type5, NumSubsets, 0, alphaBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, 0, alphaBitCount, i); @@ -1139,38 +1139,38 @@ public void PackType6(byte[][] colorAlphaEndPoints, byte[] pBits, byte[] indices "Mode 6 should have 2 endpoints"); Debug.Assert(colorAlphaEndPoints.All(x => x.Length == 4) , "Mode 6 should have RGBA color endpoints"); - Debug.Assert(colorAlphaEndPoints.All(x => x.All(y => y < (1 << 7))) , + Debug.Assert(colorAlphaEndPoints.All(x => x.All(y => y < 1 << 7)) , "Mode 6 should have 7bit color and alpha endpoints"); Debug.Assert(pBits.Length == 2, "Mode 6 should have 2 pBits"); Debug.Assert(indices.Length == 16, "Provide 16 indices"); - Debug.Assert(indices.All(x => x < (1 << 4)) , "Mode 6 should have 4bit color indices"); + Debug.Assert(indices.All(x => x < 1 << 4) , "Mode 6 should have 4bit color indices"); lowBits = 0b1000000; // Set Mode 6 highBits = 0; - int nextIdx = 7; + var nextIdx = 7; //Store color and alpha endpoints - for (int i = 0; i < colorAlphaEndPoints[0].Length; i++) { - for (int j = 0; j < colorAlphaEndPoints.Length; j++) { + for (var i = 0; i < colorAlphaEndPoints[0].Length; i++) { + for (var j = 0; j < colorAlphaEndPoints.Length; j++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 7, colorAlphaEndPoints[j][i]); nextIdx += 7; } } //Store pBits - for (int i = 0; i < pBits.Length; i++) { + for (var i = 0; i < pBits.Length; i++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 1, pBits[i]); nextIdx++; } Debug.Assert(nextIdx == 65); - int colorBitCount = ColorIndexBitCount; - int colorIndexBegin = GetIndexBegin(Bc7BlockType.Type6, colorBitCount, false); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type6, NumSubsets, + var colorBitCount = ColorIndexBitCount; + var colorIndexBegin = GetIndexBegin(Bc7BlockType.Type6, colorBitCount, false); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type6, NumSubsets, 0, colorBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, 0, colorBitCount, i); (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, @@ -1183,39 +1183,39 @@ public void PackType7(int partitionIndex6Bit, byte[][] subsetEndpoints, byte[] p Debug.Assert(partitionIndex6Bit < 64, "Mode 7 should have 6bit partition index"); Debug.Assert(subsetEndpoints.Length == 4, "Mode 7 should have 4 endpoints"); Debug.Assert(subsetEndpoints.All(x => x.Length == 4) , "Mode 7 should have RGBA endpoints"); - Debug.Assert(subsetEndpoints.All(x => x.All(y => y < (1 << 5))) , "Mode 7 should have 5bit endpoints"); + Debug.Assert(subsetEndpoints.All(x => x.All(y => y < 1 << 5)) , "Mode 7 should have 5bit endpoints"); Debug.Assert(pBits.Length == 4, "Mode 7 should have 4 pBits"); Debug.Assert(indices.Length == 16, "Provide 16 indices"); - Debug.Assert(indices.All(x => x < (1 << 2)) , "Mode 3 should have 2bit indices"); + Debug.Assert(indices.All(x => x < 1 << 2) , "Mode 3 should have 2bit indices"); lowBits = 0b10000000; // Set Mode 7 highBits = 0; lowBits = ByteHelper.Store6(lowBits, 8, (byte) partitionIndex6Bit); - int nextIdx = 14; + var nextIdx = 14; //Store endpoints - for (int i = 0; i < subsetEndpoints[0].Length; i++) { - for (int j = 0; j < subsetEndpoints.Length; j++) { + for (var i = 0; i < subsetEndpoints[0].Length; i++) { + for (var j = 0; j < subsetEndpoints.Length; j++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 5, subsetEndpoints[j][i]); nextIdx += 5; } } //Store pBits - for (int i = 0; i < pBits.Length; i++) { + for (var i = 0; i < pBits.Length; i++) { (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, nextIdx, 1, pBits[i]); nextIdx++; } Debug.Assert(nextIdx == 98); - int colorBitCount = ColorIndexBitCount; - int indexBegin = GetIndexBegin(Bc7BlockType.Type7, colorBitCount, false); - for (int i = 0; i < 16; i++) { - int indexOffset = GetIndexOffset(Bc7BlockType.Type7, NumSubsets, + var colorBitCount = ColorIndexBitCount; + var indexBegin = GetIndexBegin(Bc7BlockType.Type7, colorBitCount, false); + for (var i = 0; i < 16; i++) { + var indexOffset = GetIndexOffset(Bc7BlockType.Type7, NumSubsets, partitionIndex6Bit, colorBitCount, i); - int indexBitCount = GetIndexBitCount(NumSubsets, + var indexBitCount = GetIndexBitCount(NumSubsets, partitionIndex6Bit, colorBitCount, i); (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, diff --git a/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs b/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs index ebdf410..d81fac1 100644 --- a/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs +++ b/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs @@ -9,25 +9,25 @@ internal static class BinaryReaderWriterExtensions { public static unsafe void WriteStruct(this BinaryWriter bw, T t) where T : unmanaged { - int size = Unsafe.SizeOf(); - byte* bytes = stackalloc byte[size]; + var size = Unsafe.SizeOf(); + var bytes = stackalloc byte[size]; Unsafe.Write(bytes, t); - Span bSpan = new Span(bytes, size); + var bSpan = new Span(bytes, size); bw.Write(bSpan); } public static unsafe T ReadStruct(this BinaryReader br) where T : unmanaged { - int size = Unsafe.SizeOf(); - byte* bytes = stackalloc byte[size]; - Span bSpan = new Span(bytes, size); + var size = Unsafe.SizeOf(); + var bytes = stackalloc byte[size]; + var bSpan = new Span(bytes, size); br.Read(bSpan); return Unsafe.Read(bytes); } public static void AddPadding(this BinaryWriter bw, uint padding) { - for (int i = 0; i < padding; i++) + for (var i = 0; i < padding; i++) { bw.Write((byte)0); } diff --git a/BCnEnc.Net/Shared/ByteHelper.cs b/BCnEnc.Net/Shared/ByteHelper.cs index 4359cf2..7c60b60 100644 --- a/BCnEnc.Net/Shared/ByteHelper.cs +++ b/BCnEnc.Net/Shared/ByteHelper.cs @@ -128,8 +128,8 @@ public static ulong Extract(ulong source, int index, int bitCount) { unchecked { - ulong mask = (0b1UL << bitCount) - 1; - return ((source >> index) & mask); + var mask = (0b1UL << bitCount) - 1; + return (source >> index) & mask; } } @@ -137,7 +137,7 @@ public static ulong Store(ulong dest, int index, int bitCount, ulong value) { unchecked { - ulong mask = (0b1UL << bitCount) - 1; + var mask = (0b1UL << bitCount) - 1; dest &= ~(mask << index); dest |= (value & mask) << index; return dest; @@ -156,13 +156,13 @@ public static ulong ExtractFrom128(ulong low, ulong high, int index, int bitCoun } else { //handle boundary case - int lowIndex = index; - int lowBitCount = 64 - index; - int highBitCount = bitCount - lowBitCount; - int highIndex = 0; + var lowIndex = index; + var lowBitCount = 64 - index; + var highBitCount = bitCount - lowBitCount; + var highIndex = 0; - ulong value = Extract(low, lowIndex, lowBitCount); - ulong hVal = Extract(high, highIndex, highBitCount); + var value = Extract(low, lowIndex, lowBitCount); + var hVal = Extract(high, highIndex, highBitCount); value = Store(value, lowBitCount, highBitCount, hVal); return value; } @@ -180,10 +180,10 @@ public static (ulong, ulong) StoreTo128(ulong low, ulong high, int index, int bi } else { //handle boundary case - int lowIndex = index; - int lowBitCount = 64 - index; - int highBitCount = bitCount - lowBitCount; - int highIndex = 0; + var lowIndex = index; + var lowBitCount = 64 - index; + var highBitCount = bitCount - lowBitCount; + var highIndex = 0; var l = Store(low, lowIndex, lowBitCount, value); value >>= lowBitCount; diff --git a/BCnEnc.Net/Shared/Colors.cs b/BCnEnc.Net/Shared/Colors.cs index 620cff7..03a2bc5 100644 --- a/BCnEnc.Net/Shared/Colors.cs +++ b/BCnEnc.Net/Shared/Colors.cs @@ -31,76 +31,76 @@ public override int GetHashCode() return !left.Equals(right); } - private const ushort RedMask = 0b11111_000000_00000; - private const int RedShift = 11; - private const ushort GreenMask = 0b00000_111111_00000; - private const int GreenShift = 5; - private const ushort BlueMask = 0b00000_000000_11111; + private const ushort RedMask_ = 0b11111_000000_00000; + private const int RedShift_ = 11; + private const ushort GreenMask_ = 0b00000_111111_00000; + private const int GreenShift_ = 5; + private const ushort BlueMask_ = 0b00000_000000_11111; public ushort data; public byte R { readonly get { - int r5 = ((data & RedMask) >> RedShift); + var r5 = (data & RedMask_) >> RedShift_; return (byte)((r5 << 3) | (r5 >> 2)); } set { - int r5 = value >> 3; - data = (ushort)(data & ~RedMask); - data = (ushort)(data | (r5 << RedShift)); + var r5 = value >> 3; + data = (ushort)(data & ~RedMask_); + data = (ushort)(data | (r5 << RedShift_)); } } public byte G { readonly get { - int g6 = ((data & GreenMask) >> GreenShift); + var g6 = (data & GreenMask_) >> GreenShift_; return (byte)((g6 << 2) | (g6 >> 4)); } set { - int g6 = value >> 2; - data = (ushort)(data & ~GreenMask); - data = (ushort)(data | (g6 << GreenShift)); + var g6 = value >> 2; + data = (ushort)(data & ~GreenMask_); + data = (ushort)(data | (g6 << GreenShift_)); } } public byte B { readonly get { - int b5 = (data & BlueMask); + var b5 = data & BlueMask_; return (byte)((b5 << 3) | (b5 >> 2)); } set { - int b5 = value >> 3; - data = (ushort)(data & ~BlueMask); + var b5 = value >> 3; + data = (ushort)(data & ~BlueMask_); data = (ushort)(data | b5); } } public int RawR { - readonly get { return ((data & RedMask) >> RedShift); } + readonly get { return (data & RedMask_) >> RedShift_; } set { if (value > 31) value = 31; if (value < 0) value = 0; - data = (ushort)(data & ~RedMask); - data = (ushort)(data | ((value) << RedShift)); + data = (ushort)(data & ~RedMask_); + data = (ushort)(data | (value << RedShift_)); } } public int RawG { - readonly get { return ((data & GreenMask) >> GreenShift); } + readonly get { return (data & GreenMask_) >> GreenShift_; } set { if (value > 63) value = 63; if (value < 0) value = 0; - data = (ushort)(data & ~GreenMask); - data = (ushort)(data | ((value) << GreenShift)); + data = (ushort)(data & ~GreenMask_); + data = (ushort)(data | (value << GreenShift_)); } } public int RawB { - readonly get { return (data & BlueMask); } + readonly get { return data & BlueMask_; } set { if (value > 31) value = 31; if (value < 0) value = 0; - data = (ushort)(data & ~BlueMask); + data = (ushort)(data & ~BlueMask_); data = (ushort)(data | value); } } @@ -174,7 +174,7 @@ public override int GetHashCode() { unchecked { - int hashCode = r.GetHashCode(); + var hashCode = r.GetHashCode(); hashCode = (hashCode * 397) ^ g.GetHashCode(); hashCode = (hashCode * 397) ^ b.GetHashCode(); hashCode = (hashCode * 397) ^ a.GetHashCode(); @@ -236,10 +236,10 @@ public override int GetHashCode() public static ColorRgba32 operator <<(ColorRgba32 left, int right) { return new ColorRgba32( - ByteHelper.ClampToByte((left.r << right)), - ByteHelper.ClampToByte((left.g << right)), - ByteHelper.ClampToByte((left.b << right)), - ByteHelper.ClampToByte((left.a << right)) + ByteHelper.ClampToByte(left.r << right), + ByteHelper.ClampToByte(left.g << right), + ByteHelper.ClampToByte(left.b << right), + ByteHelper.ClampToByte(left.a << right) ); } @@ -249,10 +249,10 @@ public override int GetHashCode() public static ColorRgba32 operator >>(ColorRgba32 left, int right) { return new ColorRgba32( - ByteHelper.ClampToByte((left.r >> right)), - ByteHelper.ClampToByte((left.g >> right)), - ByteHelper.ClampToByte((left.b >> right)), - ByteHelper.ClampToByte((left.a >> right)) + ByteHelper.ClampToByte(left.r >> right), + ByteHelper.ClampToByte(left.g >> right), + ByteHelper.ClampToByte(left.b >> right), + ByteHelper.ClampToByte(left.a >> right) ); } @@ -262,10 +262,10 @@ public override int GetHashCode() public static ColorRgba32 operator |(ColorRgba32 left, ColorRgba32 right) { return new ColorRgba32( - ByteHelper.ClampToByte((left.r | right.r)), - ByteHelper.ClampToByte((left.g | right.g)), - ByteHelper.ClampToByte((left.b | right.b)), - ByteHelper.ClampToByte((left.a | right.a)) + ByteHelper.ClampToByte(left.r | right.r), + ByteHelper.ClampToByte(left.g | right.g), + ByteHelper.ClampToByte(left.b | right.b), + ByteHelper.ClampToByte(left.a | right.a) ); } @@ -275,10 +275,10 @@ public override int GetHashCode() public static ColorRgba32 operator |(ColorRgba32 left, int right) { return new ColorRgba32( - ByteHelper.ClampToByte((left.r | right)), - ByteHelper.ClampToByte((left.g | right)), - ByteHelper.ClampToByte((left.b | right)), - ByteHelper.ClampToByte((left.a | right)) + ByteHelper.ClampToByte(left.r | right), + ByteHelper.ClampToByte(left.g | right), + ByteHelper.ClampToByte(left.b | right), + ByteHelper.ClampToByte(left.a | right) ); } @@ -288,10 +288,10 @@ public override int GetHashCode() public static ColorRgba32 operator &(ColorRgba32 left, ColorRgba32 right) { return new ColorRgba32( - ByteHelper.ClampToByte((left.r & right.r)), - ByteHelper.ClampToByte((left.g & right.g)), - ByteHelper.ClampToByte((left.b & right.b)), - ByteHelper.ClampToByte((left.a & right.a)) + ByteHelper.ClampToByte(left.r & right.r), + ByteHelper.ClampToByte(left.g & right.g), + ByteHelper.ClampToByte(left.b & right.b), + ByteHelper.ClampToByte(left.a & right.a) ); } @@ -301,10 +301,10 @@ public override int GetHashCode() public static ColorRgba32 operator &(ColorRgba32 left, int right) { return new ColorRgba32( - ByteHelper.ClampToByte((left.r & right)), - ByteHelper.ClampToByte((left.g & right)), - ByteHelper.ClampToByte((left.b & right)), - ByteHelper.ClampToByte((left.a & right)) + ByteHelper.ClampToByte(left.r & right), + ByteHelper.ClampToByte(left.g & right), + ByteHelper.ClampToByte(left.b & right), + ByteHelper.ClampToByte(left.a & right) ); } @@ -359,7 +359,7 @@ public override int GetHashCode() { unchecked { - int hashCode = r.GetHashCode(); + var hashCode = r.GetHashCode(); hashCode = (hashCode * 397) ^ g.GetHashCode(); hashCode = (hashCode * 397) ^ b.GetHashCode(); return hashCode; @@ -430,78 +430,78 @@ public ColorYCbCr(float y, float cb, float cr) public ColorYCbCr(ColorRgb24 rgb) { - float fr = (float)rgb.r / 255; - float fg = (float)rgb.g / 255; - float fb = (float)rgb.b / 255; + var fr = (float)rgb.r / 255; + var fg = (float)rgb.g / 255; + var fb = (float)rgb.b / 255; - y = (0.2989f * fr + 0.5866f * fg + 0.1145f * fb); - cb = (-0.1687f * fr - 0.3313f * fg + 0.5000f * fb); - cr = (0.5000f * fr - 0.4184f * fg - 0.0816f * fb); + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } public ColorYCbCr(ColorRgb565 rgb) { - float fr = (float)rgb.R / 255; - float fg = (float)rgb.G / 255; - float fb = (float)rgb.B / 255; + var fr = (float)rgb.R / 255; + var fg = (float)rgb.G / 255; + var fb = (float)rgb.B / 255; - y = (0.2989f * fr + 0.5866f * fg + 0.1145f * fb); - cb = (-0.1687f * fr - 0.3313f * fg + 0.5000f * fb); - cr = (0.5000f * fr - 0.4184f * fg - 0.0816f * fb); + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } public ColorYCbCr(ColorRgba32 rgba) { - float fr = (float)rgba.r / 255; - float fg = (float)rgba.g / 255; - float fb = (float)rgba.b / 255; + var fr = (float)rgba.r / 255; + var fg = (float)rgba.g / 255; + var fb = (float)rgba.b / 255; - y = (0.2989f * fr + 0.5866f * fg + 0.1145f * fb); - cb = (-0.1687f * fr - 0.3313f * fg + 0.5000f * fb); - cr = (0.5000f * fr - 0.4184f * fg - 0.0816f * fb); + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } public ColorYCbCr(Rgba32 rgb) { - float fr = (float)rgb.R / 255; - float fg = (float)rgb.G / 255; - float fb = (float)rgb.B / 255; + var fr = (float)rgb.R / 255; + var fg = (float)rgb.G / 255; + var fb = (float)rgb.B / 255; - y = (0.2989f * fr + 0.5866f * fg + 0.1145f * fb); - cb = (-0.1687f * fr - 0.3313f * fg + 0.5000f * fb); - cr = (0.5000f * fr - 0.4184f * fg - 0.0816f * fb); + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } public ColorYCbCr(Vector3 vec) { - float fr = (float) vec.X; - float fg = (float) vec.Y; - float fb = (float) vec.Z; + var fr = (float) vec.X; + var fg = (float) vec.Y; + var fb = (float) vec.Z; - y = (0.2989f * fr + 0.5866f * fg + 0.1145f * fb); - cb = (-0.1687f * fr - 0.3313f * fg + 0.5000f * fb); - cr = (0.5000f * fr - 0.4184f * fg - 0.0816f * fb); + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } public ColorRgb565 ToColorRgb565() { - float r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - float g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - float b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); return new ColorRgb565((byte)(r * 255), (byte)(g * 255), (byte)(b * 255)); } public override string ToString() { - float r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - float g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - float b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); return $"r : {r * 255} g : {g * 255} b : {b * 255}"; } public float CalcDistWeighted(ColorYCbCr other, float yWeight = 4) { - float dy = (y - other.y) * (y - other.y) * yWeight; - float dcb = (cb - other.cb) * (cb - other.cb); - float dcr = (cr - other.cr) * (cr - other.cr); + var dy = (y - other.y) * (y - other.y) * yWeight; + var dcb = (cb - other.cb) * (cb - other.cb); + var dcr = (cr - other.cr) * (cr - other.cr); return MathF.Sqrt(dy + dcb + dcr); } @@ -523,9 +523,9 @@ public float CalcDistWeighted(ColorYCbCr other, float yWeight = 4) { } public Rgba32 ToRgba32() { - float r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - float g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - float b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); return new Rgba32((byte)(r * 255), (byte)(g * 255), (byte)(b * 255), 255); } @@ -548,74 +548,74 @@ public ColorYCbCrAlpha(float y, float cb, float cr, float alpha) public ColorYCbCrAlpha(ColorRgb24 rgb) { - float fr = (float)rgb.r / 255; - float fg = (float)rgb.g / 255; - float fb = (float)rgb.b / 255; + var fr = (float)rgb.r / 255; + var fg = (float)rgb.g / 255; + var fb = (float)rgb.b / 255; - y = (0.2989f * fr + 0.5866f * fg + 0.1145f * fb); - cb = (-0.1687f * fr - 0.3313f * fg + 0.5000f * fb); - cr = (0.5000f * fr - 0.4184f * fg - 0.0816f * fb); + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; alpha = 1; } public ColorYCbCrAlpha(ColorRgb565 rgb) { - float fr = (float)rgb.R / 255; - float fg = (float)rgb.G / 255; - float fb = (float)rgb.B / 255; + var fr = (float)rgb.R / 255; + var fg = (float)rgb.G / 255; + var fb = (float)rgb.B / 255; - y = (0.2989f * fr + 0.5866f * fg + 0.1145f * fb); - cb = (-0.1687f * fr - 0.3313f * fg + 0.5000f * fb); - cr = (0.5000f * fr - 0.4184f * fg - 0.0816f * fb); + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; alpha = 1; } public ColorYCbCrAlpha(ColorRgba32 rgba) { - float fr = (float)rgba.r / 255; - float fg = (float)rgba.g / 255; - float fb = (float)rgba.b / 255; + var fr = (float)rgba.r / 255; + var fg = (float)rgba.g / 255; + var fb = (float)rgba.b / 255; - y = (0.2989f * fr + 0.5866f * fg + 0.1145f * fb); - cb = (-0.1687f * fr - 0.3313f * fg + 0.5000f * fb); - cr = (0.5000f * fr - 0.4184f * fg - 0.0816f * fb); + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; alpha = rgba.a / 255f; } public ColorYCbCrAlpha(Rgba32 rgb) { - float fr = (float)rgb.R / 255; - float fg = (float)rgb.G / 255; - float fb = (float)rgb.B / 255; + var fr = (float)rgb.R / 255; + var fg = (float)rgb.G / 255; + var fb = (float)rgb.B / 255; - y = (0.2989f * fr + 0.5866f * fg + 0.1145f * fb); - cb = (-0.1687f * fr - 0.3313f * fg + 0.5000f * fb); - cr = (0.5000f * fr - 0.4184f * fg - 0.0816f * fb); + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; alpha = rgb.A / 255f; } public ColorRgb565 ToColorRgb565() { - float r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - float g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - float b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); return new ColorRgb565((byte)(r * 255), (byte)(g * 255), (byte)(b * 255)); } public override string ToString() { - float r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - float g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - float b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); return $"r : {r * 255} g : {g * 255} b : {b * 255}"; } public float CalcDistWeighted(ColorYCbCrAlpha other, float yWeight = 4, float aWeight = 1) { - float dy = (y - other.y) * (y - other.y) * yWeight; - float dcb = (cb - other.cb) * (cb - other.cb); - float dcr = (cr - other.cr) * (cr - other.cr); - float da = (alpha - other.alpha) * (alpha - other.alpha) * aWeight; + var dy = (y - other.y) * (y - other.y) * yWeight; + var dcb = (cb - other.cb) * (cb - other.cb); + var dcr = (cr - other.cr) * (cr - other.cr); + var da = (alpha - other.alpha) * (alpha - other.alpha) * aWeight; return MathF.Sqrt(dy + dcb + dcr + da); } @@ -639,9 +639,9 @@ public float CalcDistWeighted(ColorYCbCrAlpha other, float yWeight = 4, float aW } public Rgba32 ToRgba32() { - float r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - float g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - float b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); return new Rgba32((byte)(r * 255), (byte)(g * 255), (byte)(b * 255), (byte)(alpha * 255)); } @@ -663,9 +663,9 @@ public ColorXyz(ColorRgb24 color) { } public static ColorXyz ColorToXyz(ColorRgb24 color) { - float r = PivotRgb(color.r / 255.0f); - float g = PivotRgb(color.g / 255.0f); - float b = PivotRgb(color.b / 255.0f); + var r = PivotRgb(color.r / 255.0f); + var g = PivotRgb(color.g / 255.0f); + var b = PivotRgb(color.b / 255.0f); // Observer. = 2°, Illuminant = D65 return new ColorXyz(r * 0.4124f + g * 0.3576f + b * 0.1805f, r * 0.2126f + g * 0.7152f + b * 0.0722f, r * 0.0193f + g * 0.1192f + b * 0.9505f); @@ -701,25 +701,25 @@ public ColorLab(Rgba32 color) { } public static ColorLab ColorToLab(ColorRgb24 color) { - ColorXyz xyz = new ColorXyz(color); + var xyz = new ColorXyz(color); return XyzToLab(xyz); } public static ColorLab XyzToLab(ColorXyz xyz) { - float REF_X = 95.047f; // Observer= 2°, Illuminant= D65 - float REF_Y = 100.000f; - float REF_Z = 108.883f; + var refX = 95.047f; // Observer= 2°, Illuminant= D65 + var refY = 100.000f; + var refZ = 108.883f; - float x = PivotXyz(xyz.x / REF_X); - float y = PivotXyz(xyz.y / REF_Y); - float z = PivotXyz(xyz.z / REF_Z); + var x = PivotXyz(xyz.x / refX); + var y = PivotXyz(xyz.y / refY); + var z = PivotXyz(xyz.z / refZ); return new ColorLab(116 * y - 16, 500 * (x - y), 200 * (y - z)); } private static float PivotXyz(float n) { - float i = MathF.Cbrt(n); + var i = MathF.Cbrt(n); return n > 0.008856f ? i : 7.787f * n + 16 / 116f; } } diff --git a/BCnEnc.Net/Shared/CompressionFormat.cs b/BCnEnc.Net/Shared/CompressionFormat.cs index f99ab71..a9e5fe7 100644 --- a/BCnEnc.Net/Shared/CompressionFormat.cs +++ b/BCnEnc.Net/Shared/CompressionFormat.cs @@ -9,47 +9,47 @@ public enum CompressionFormat /// /// Raw unsigned byte 16-bit RG data /// - RG, + Rg, /// /// Raw unsigned byte 24-bit RGB data /// - RGB, + Rgb, /// /// Raw unsigned byte 32-bit RGBA data /// - RGBA, + Rgba, /// /// BC1 / DXT1 with no alpha. Very widely supported and good compression ratio. /// - BC1, + Bc1, /// /// BC1 / DXT1 with 1-bit of alpha. /// - BC1WithAlpha, + Bc1WithAlpha, /// /// BC2 / DXT3 encoding with alpha. Good for sharp alpha transitions. /// - BC2, + Bc2, /// /// BC3 / DXT5 encoding with alpha. Good for smooth alpha transitions. /// - BC3, + Bc3, /// /// BC4 single-channel encoding. Only luminance is encoded. /// - BC4, + Bc4, /// /// BC5 dual-channel encoding. Only red and green channels are encoded. /// - BC5, + Bc5, /// /// BC6H / BPTC float encoding. Can compress HDR textures without alpha. Currently not supported. /// - BC6, + Bc6, /// - /// BC7 / BPTC unorm encoding. Very high quality rgba or rgb encoding. Also very slow. + /// BC7 / BPTC unorm encoding. Very high Quality rgba or rgb encoding. Also very slow. /// - BC7 + Bc7 } public static class CompressionFormatExtensions @@ -59,9 +59,9 @@ public static bool IsCompressedFormat(this CompressionFormat format) switch (format) { case CompressionFormat.R: - case CompressionFormat.RG: - case CompressionFormat.RGB: - case CompressionFormat.RGBA: + case CompressionFormat.Rg: + case CompressionFormat.Rgb: + case CompressionFormat.Rgba: return false; default: diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index 229c529..867d5b0 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -8,39 +8,39 @@ namespace BCnEncoder.Shared { public class DdsFile { - public DdsHeader Header; - public DdsHeaderDxt10 Dxt10Header; + public DdsHeader header; + public DdsHeaderDxt10 dxt10Header; public List Faces { get; } = new List(); public DdsFile() { } public DdsFile(DdsHeader header) { - this.Header = header; + this.header = header; } public DdsFile(DdsHeader header, DdsHeaderDxt10 dxt10Header) { - this.Header = header; - this.Dxt10Header = dxt10Header; + this.header = header; + this.dxt10Header = dxt10Header; } public static DdsFile Load(Stream s) { - using (BinaryReader br = new BinaryReader(s, Encoding.UTF8, true)) + using (var br = new BinaryReader(s, Encoding.UTF8, true)) { var magic = br.ReadUInt32(); if (magic != 0x20534444U) { throw new FormatException("The file does not contain a dds file."); } - DdsHeader header = br.ReadStruct(); + var header = br.ReadStruct(); DdsHeaderDxt10 dxt10Header = default; if (header.dwSize != 124) { throw new FormatException("The file header contains invalid dwSize."); } - bool dxt10Format = header.ddsPixelFormat.IsDxt10Format; + var dxt10Format = header.ddsPixelFormat.IsDxt10Format; DdsFile output; @@ -54,19 +54,19 @@ public static DdsFile Load(Stream s) output = new DdsFile(header); } - uint mipMapCount = (header.dwCaps & HeaderCaps.DDSCAPS_MIPMAP) != 0 ? header.dwMipMapCount : 1; - uint faceCount = ((header.dwCaps2 & HeaderCaps2.DDSCAPS2_CUBEMAP) != 0) ? (uint)6 : (uint)1; - uint width = header.dwWidth; - uint height = header.dwHeight; + var mipMapCount = (header.dwCaps & HeaderCaps.DdscapsMipmap) != 0 ? header.dwMipMapCount : 1; + var faceCount = (header.dwCaps2 & HeaderCaps2.Ddscaps2Cubemap) != 0 ? (uint)6 : (uint)1; + var width = header.dwWidth; + var height = header.dwHeight; - for (int face = 0; face < faceCount; face++) + for (var face = 0; face < faceCount; face++) { - uint sizeInBytes = Math.Max(1, ((width + 3) / 4)) * Math.Max(1, ((height + 3) / 4)); + var sizeInBytes = Math.Max(1, (width + 3) / 4) * Math.Max(1, (height + 3) / 4); if (!dxt10Format) { if (header.ddsPixelFormat.IsDxt1To5CompressedFormat) { - if (header.ddsPixelFormat.DxgiFormat == DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM) + if (header.ddsPixelFormat.DxgiFormat == DxgiFormat.DxgiFormatBc1Unorm) { sizeInBytes *= 8; } @@ -90,19 +90,19 @@ public static DdsFile Load(Stream s) } output.Faces.Add(new DdsFace(width, height, sizeInBytes, (int)mipMapCount)); - for (int mip = 0; mip < mipMapCount; mip++) + for (var mip = 0; mip < mipMapCount; mip++) { - uint mipWidth = header.dwWidth / (uint)(Math.Pow(2, mip)); - uint mipHeight = header.dwHeight / (uint)(Math.Pow(2, mip)); + var mipWidth = header.dwWidth / (uint)Math.Pow(2, mip); + var mipHeight = header.dwHeight / (uint)Math.Pow(2, mip); if (mip > 0) //Calculate new byteSize { - sizeInBytes = Math.Max(1, ((mipWidth + 3) / 4)) * Math.Max(1, ((mipHeight + 3) / 4)); + sizeInBytes = Math.Max(1, (mipWidth + 3) / 4) * Math.Max(1, (mipHeight + 3) / 4); if (!dxt10Format) { if (header.ddsPixelFormat.IsDxt1To5CompressedFormat) { - if (header.ddsPixelFormat.DxgiFormat == DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM) + if (header.ddsPixelFormat.DxgiFormat == DxgiFormat.DxgiFormatBc1Unorm) { sizeInBytes *= 8; } @@ -113,7 +113,7 @@ public static DdsFile Load(Stream s) } else { - sizeInBytes = header.dwPitchOrLinearSize / (uint)(Math.Pow(2, mip)) * mipHeight; + sizeInBytes = header.dwPitchOrLinearSize / (uint)Math.Pow(2, mip) * mipHeight; } } else if (dxt10Header.dxgiFormat.IsCompressedFormat()) @@ -122,10 +122,10 @@ public static DdsFile Load(Stream s) } else { - sizeInBytes = header.dwPitchOrLinearSize / (uint)(Math.Pow(2, mip)) * mipHeight; + sizeInBytes = header.dwPitchOrLinearSize / (uint)Math.Pow(2, mip) * mipHeight; } } - byte[] data = new byte[sizeInBytes]; + var data = new byte[sizeInBytes]; br.Read(data); output.Faces[face].MipMaps[mip] = new DdsMipMap(data, mipWidth, mipHeight); } @@ -142,53 +142,53 @@ public void Write(Stream outputStream) throw new InvalidOperationException("The DDS structure should have at least 1 mipmap level and 1 Face before writing to file."); } - Header.dwFlags |= HeaderFlags.REQUIRED; + header.dwFlags |= HeaderFlags.Required; - Header.dwMipMapCount = (uint)Faces[0].MipMaps.Length; - if (Header.dwMipMapCount > 1) // MipMaps + header.dwMipMapCount = (uint)Faces[0].MipMaps.Length; + if (header.dwMipMapCount > 1) // MipMaps { - Header.dwCaps |= HeaderCaps.DDSCAPS_MIPMAP | HeaderCaps.DDSCAPS_COMPLEX; + header.dwCaps |= HeaderCaps.DdscapsMipmap | HeaderCaps.DdscapsComplex; } if (Faces.Count == 6) // CubeMap { - Header.dwCaps |= HeaderCaps.DDSCAPS_COMPLEX; - Header.dwCaps2 |= HeaderCaps2.DDSCAPS2_CUBEMAP | - HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEX | - HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEX | - HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEY | - HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEY | - HeaderCaps2.DDSCAPS2_CUBEMAP_POSITIVEZ | - HeaderCaps2.DDSCAPS2_CUBEMAP_NEGATIVEZ; + header.dwCaps |= HeaderCaps.DdscapsComplex; + header.dwCaps2 |= HeaderCaps2.Ddscaps2Cubemap | + HeaderCaps2.Ddscaps2CubemapPositivex | + HeaderCaps2.Ddscaps2CubemapNegativex | + HeaderCaps2.Ddscaps2CubemapPositivey | + HeaderCaps2.Ddscaps2CubemapNegativey | + HeaderCaps2.Ddscaps2CubemapPositivez | + HeaderCaps2.Ddscaps2CubemapNegativez; } - Header.dwWidth = Faces[0].Width; - Header.dwHeight = Faces[0].Height; + header.dwWidth = Faces[0].Width; + header.dwHeight = Faces[0].Height; - for (int i = 0; i < Faces.Count; i++) + for (var i = 0; i < Faces.Count; i++) { - if (Faces[i].Width != Header.dwWidth || Faces[i].Height != Header.dwHeight) + if (Faces[i].Width != header.dwWidth || Faces[i].Height != header.dwHeight) { throw new InvalidOperationException("Faces with different sizes are not supported."); } } - int faceCount = Faces.Count; - int mipCount = (int)Header.dwMipMapCount; + var faceCount = Faces.Count; + var mipCount = (int)header.dwMipMapCount; - using (BinaryWriter bw = new BinaryWriter(outputStream, Encoding.UTF8, true)) + using (var bw = new BinaryWriter(outputStream, Encoding.UTF8, true)) { bw.Write(0x20534444U); // magic 'DDS ' - bw.WriteStruct(Header); + bw.WriteStruct(header); - if (Header.ddsPixelFormat.IsDxt10Format) + if (header.ddsPixelFormat.IsDxt10Format) { - bw.WriteStruct(Dxt10Header); + bw.WriteStruct(dxt10Header); } - for (int face = 0; face < faceCount; face++) + for (var face = 0; face < faceCount; face++) { - for (int mip = 0; mip < mipCount; mip++) + for (var mip = 0; mip < mipCount; mip++) { bw.Write(Faces[face].MipMaps[mip].Data); } @@ -218,44 +218,44 @@ public unsafe struct DdsHeader public uint dwCaps4; public uint dwReserved2; - public static (DdsHeader, DdsHeaderDxt10) InitializeCompressed(int width, int height, DXGI_FORMAT format) + public static (DdsHeader, DdsHeaderDxt10) InitializeCompressed(int width, int height, DxgiFormat format) { - DdsHeader header = new DdsHeader(); - DdsHeaderDxt10 dxt10Header = new DdsHeaderDxt10(); + var header = new DdsHeader(); + var dxt10Header = new DdsHeaderDxt10(); header.dwSize = 124; - header.dwFlags = HeaderFlags.REQUIRED; + header.dwFlags = HeaderFlags.Required; header.dwWidth = (uint)width; header.dwHeight = (uint)height; header.dwDepth = 1; header.dwMipMapCount = 1; - header.dwCaps = HeaderCaps.DDSCAPS_TEXTURE; + header.dwCaps = HeaderCaps.DdscapsTexture; - if (format == DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM) + if (format == DxgiFormat.DxgiFormatBc1Unorm) { header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DDPF_FOURCC, - dwFourCC = DdsPixelFormat.DXT1 + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dxt1 }; } - else if (format == DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM) + else if (format == DxgiFormat.DxgiFormatBc2Unorm) { header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DDPF_FOURCC, - dwFourCC = DdsPixelFormat.DXT3 + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dxt3 }; } - else if (format == DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM) + else if (format == DxgiFormat.DxgiFormatBc3Unorm) { header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DDPF_FOURCC, - dwFourCC = DdsPixelFormat.DXT5 + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dxt5 }; } else @@ -263,59 +263,59 @@ public static (DdsHeader, DdsHeaderDxt10) InitializeCompressed(int width, int he header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DDPF_FOURCC, - dwFourCC = DdsPixelFormat.DX10 + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dx10 }; dxt10Header.arraySize = 1; dxt10Header.dxgiFormat = format; - dxt10Header.resourceDimension = D3D10_RESOURCE_DIMENSION.D3D10_RESOURCE_DIMENSION_TEXTURE2D; + dxt10Header.resourceDimension = D3D10ResourceDimension.D3D10ResourceDimensionTexture2D; } return (header, dxt10Header); } - public static DdsHeader InitializeUncompressed(int width, int height, DXGI_FORMAT format) + public static DdsHeader InitializeUncompressed(int width, int height, DxgiFormat format) { - DdsHeader header = new DdsHeader(); + var header = new DdsHeader(); header.dwSize = 124; - header.dwFlags = HeaderFlags.REQUIRED | HeaderFlags.DDSD_PITCH; + header.dwFlags = HeaderFlags.Required | HeaderFlags.DdsdPitch; header.dwWidth = (uint)width; header.dwHeight = (uint)height; header.dwDepth = 1; header.dwMipMapCount = 1; - header.dwCaps = HeaderCaps.DDSCAPS_TEXTURE; + header.dwCaps = HeaderCaps.DdscapsTexture; - if (format == DXGI_FORMAT.DXGI_FORMAT_R8_UNORM) + if (format == DxgiFormat.DxgiFormatR8Unorm) { header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DDPF_LUMINANCE, - dwRGBBitCount = 8, + dwFlags = PixelFormatFlags.DdpfLuminance, + dwRgbBitCount = 8, dwRBitMask = 0xFF }; header.dwPitchOrLinearSize = (uint)((width * 8 + 7) / 8); } - else if (format == DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM) + else if (format == DxgiFormat.DxgiFormatR8G8Unorm) { header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DDPF_LUMINANCE | PixelFormatFlags.DDPF_ALPHAPIXELS, - dwRGBBitCount = 16, + dwFlags = PixelFormatFlags.DdpfLuminance | PixelFormatFlags.DdpfAlphapixels, + dwRgbBitCount = 16, dwRBitMask = 0xFF, dwGBitMask = 0xFF00 }; header.dwPitchOrLinearSize = (uint)((width * 16 + 7) / 8); } - else if (format == DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM) + else if (format == DxgiFormat.DxgiFormatR8G8B8A8Unorm) { header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DDPF_RGB | PixelFormatFlags.DDPF_ALPHAPIXELS, - dwRGBBitCount = 32, + dwFlags = PixelFormatFlags.DdpfRgb | PixelFormatFlags.DdpfAlphapixels, + dwRgbBitCount = 32, dwRBitMask = 0xFF, dwGBitMask = 0xFF00, dwBBitMask = 0xFF0000, @@ -325,7 +325,7 @@ public static DdsHeader InitializeUncompressed(int width, int height, DXGI_FORMA } else { - throw new NotImplementedException("This format is not implemented in this method"); + throw new NotImplementedException("This Format is not implemented in this method"); } return header; @@ -334,112 +334,112 @@ public static DdsHeader InitializeUncompressed(int width, int height, DXGI_FORMA public struct DdsPixelFormat { - public const uint DXT1 = 0x31545844U; - public const uint DXT2 = 0x32545844U; - public const uint DXT3 = 0x33545844U; - public const uint DXT4 = 0x34545844U; - public const uint DXT5 = 0x35545844U; - public const uint DX10 = 0x30315844U; + public const uint Dxt1 = 0x31545844U; + public const uint Dxt2 = 0x32545844U; + public const uint Dxt3 = 0x33545844U; + public const uint Dxt4 = 0x34545844U; + public const uint Dxt5 = 0x35545844U; + public const uint Dx10 = 0x30315844U; public uint dwSize; public PixelFormatFlags dwFlags; - public uint dwFourCC; - public uint dwRGBBitCount; + public uint dwFourCc; + public uint dwRgbBitCount; public uint dwRBitMask; public uint dwGBitMask; public uint dwBBitMask; public uint dwABitMask; - public DXGI_FORMAT DxgiFormat + public DxgiFormat DxgiFormat { get { - if ((dwFlags & PixelFormatFlags.DDPF_FOURCC) != 0) + if ((dwFlags & PixelFormatFlags.DdpfFourcc) != 0) { - switch (dwFourCC) + switch (dwFourCc) { case 0x31545844U: - return DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM; + return DxgiFormat.DxgiFormatBc1Unorm; case 0x33545844U: - return DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM; + return DxgiFormat.DxgiFormatBc2Unorm; case 0x35545844U: - return DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM; + return DxgiFormat.DxgiFormatBc3Unorm; } } else { - if ((dwFlags & PixelFormatFlags.DDPF_RGB) != 0) // RGB/A + if ((dwFlags & PixelFormatFlags.DdpfRgb) != 0) // RGB/A { - if ((dwFlags & PixelFormatFlags.DDPF_ALPHAPIXELS) != 0) //RGBA + if ((dwFlags & PixelFormatFlags.DdpfAlphapixels) != 0) //RGBA { - if (dwRGBBitCount == 32) + if (dwRgbBitCount == 32) { if (dwRBitMask == 0xff && dwGBitMask == 0xff00 && dwBBitMask == 0xff0000 && dwABitMask == 0xff000000) { - return DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM; + return DxgiFormat.DxgiFormatR8G8B8A8Unorm; } else if (dwRBitMask == 0x0000ff && dwGBitMask == 0xff00 && dwBBitMask == 0xff && dwABitMask == 0xff000000) { - return DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM; + return DxgiFormat.DxgiFormatB8G8R8A8Unorm; } } } else //RGB { - if (dwRGBBitCount == 32) + if (dwRgbBitCount == 32) { if (dwRBitMask == 0x0000ff && dwGBitMask == 0xff00 && dwBBitMask == 0xff) { - return DXGI_FORMAT.DXGI_FORMAT_B8G8R8X8_UNORM; + return DxgiFormat.DxgiFormatB8G8R8X8Unorm; } } } } - else if ((dwFlags & PixelFormatFlags.DDPF_LUMINANCE) != 0) // R/RG + else if ((dwFlags & PixelFormatFlags.DdpfLuminance) != 0) // R/RG { - if ((dwFlags & PixelFormatFlags.DDPF_ALPHAPIXELS) != 0) // RG + if ((dwFlags & PixelFormatFlags.DdpfAlphapixels) != 0) // RG { - if (dwRGBBitCount == 16) + if (dwRgbBitCount == 16) { if (dwRBitMask == 0x0000ff && dwGBitMask == 0xff00) { - return DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM; + return DxgiFormat.DxgiFormatR8G8Unorm; } } } else // Luminance only { - if (dwRGBBitCount == 8) + if (dwRgbBitCount == 8) { if (dwRBitMask == 0x0000ff && dwGBitMask == 0xff00) { - return DXGI_FORMAT.DXGI_FORMAT_R8_UNORM; + return DxgiFormat.DxgiFormatR8Unorm; } } } } } - return DXGI_FORMAT.DXGI_FORMAT_UNKNOWN; + return DxgiFormat.DxgiFormatUnknown; } } - public bool IsDxt10Format => ((dwFlags & PixelFormatFlags.DDPF_FOURCC) == PixelFormatFlags.DDPF_FOURCC) - && dwFourCC == DX10; + public bool IsDxt10Format => (dwFlags & PixelFormatFlags.DdpfFourcc) == PixelFormatFlags.DdpfFourcc + && dwFourCc == Dx10; - public bool IsDxt1To5CompressedFormat => ((dwFlags & PixelFormatFlags.DDPF_FOURCC) == PixelFormatFlags.DDPF_FOURCC) - && (dwFourCC == DXT1 - || dwFourCC == DXT2 - || dwFourCC == DXT3 - || dwFourCC == DXT4 - || dwFourCC == DXT5); + public bool IsDxt1To5CompressedFormat => (dwFlags & PixelFormatFlags.DdpfFourcc) == PixelFormatFlags.DdpfFourcc + && (dwFourCc == Dxt1 + || dwFourCc == Dxt2 + || dwFourCc == Dxt3 + || dwFourCc == Dxt4 + || dwFourCc == Dxt5); } public struct DdsHeaderDxt10 { - public DXGI_FORMAT dxgiFormat; - public D3D10_RESOURCE_DIMENSION resourceDimension; + public DxgiFormat dxgiFormat; + public D3D10ResourceDimension resourceDimension; public uint miscFlag; public uint arraySize; public uint miscFlags2; @@ -486,37 +486,37 @@ public enum HeaderFlags : uint /// /// Required in every .dds file. /// - DDSD_CAPS = 0x1, + DdsdCaps = 0x1, /// /// Required in every .dds file. /// - DDSD_HEIGHT = 0x2, + DdsdHeight = 0x2, /// /// Required in every .dds file. /// - DDSD_WIDTH = 0x4, + DdsdWidth = 0x4, /// /// Required when pitch is provided for an uncompressed texture. /// - DDSD_PITCH = 0x8, + DdsdPitch = 0x8, /// /// Required in every .dds file. /// - DDSD_PIXELFORMAT = 0x1000, + DdsdPixelformat = 0x1000, /// /// Required in a mipmapped texture. /// - DDSD_MIPMAPCOUNT = 0x20000, + DdsdMipmapcount = 0x20000, /// /// Required when pitch is provided for a compressed texture. /// - DDSD_LINEARSIZE = 0x80000, + DdsdLinearsize = 0x80000, /// /// Required in a depth texture. /// - DDSD_DEPTH = 0x800000, + DdsdDepth = 0x800000, - REQUIRED = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT + Required = DdsdCaps | DdsdHeight | DdsdWidth | DdsdPixelformat } /// @@ -528,15 +528,15 @@ public enum HeaderCaps : uint /// /// Optional; must be used on any file that contains more than one surface (a mipmap, a cubic environment map, or mipmapped volume texture). /// - DDSCAPS_COMPLEX = 0x8, + DdscapsComplex = 0x8, /// /// Optional; should be used for a mipmap. /// - DDSCAPS_MIPMAP = 0x400000, + DdscapsMipmap = 0x400000, /// /// Required /// - DDSCAPS_TEXTURE = 0x1000 + DdscapsTexture = 0x1000 } /// @@ -548,35 +548,35 @@ public enum HeaderCaps2 : uint /// /// Required for a cube map. /// - DDSCAPS2_CUBEMAP = 0x200, + Ddscaps2Cubemap = 0x200, /// /// Required when these surfaces are stored in a cube map. /// - DDSCAPS2_CUBEMAP_POSITIVEX = 0x400, + Ddscaps2CubemapPositivex = 0x400, /// /// Required when these surfaces are stored in a cube map. /// - DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800, + Ddscaps2CubemapNegativex = 0x800, /// /// Required when these surfaces are stored in a cube map. /// - DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000, + Ddscaps2CubemapPositivey = 0x1000, /// /// Required when these surfaces are stored in a cube map. /// - DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000, + Ddscaps2CubemapNegativey = 0x2000, /// /// Required when these surfaces are stored in a cube map. /// - DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000, + Ddscaps2CubemapPositivez = 0x4000, /// /// Required when these surfaces are stored in a cube map. /// - DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000, + Ddscaps2CubemapNegativez = 0x8000, /// /// Required for a volume texture. /// - DDSCAPS2_VOLUME = 0x200000 + Ddscaps2Volume = 0x200000 } [Flags] @@ -585,403 +585,403 @@ public enum PixelFormatFlags : uint /// /// Texture contains alpha data; dwRGBAlphaBitMask contains valid data. /// - DDPF_ALPHAPIXELS = 0x1, + DdpfAlphapixels = 0x1, /// /// Used in some older DDS files for alpha channel only uncompressed data (dwRGBBitCount contains the alpha channel bitcount; dwABitMask contains valid data) /// - DDPF_ALPHA = 0x2, + DdpfAlpha = 0x2, /// /// Texture contains compressed RGB data; dwFourCC contains valid data. /// - DDPF_FOURCC = 0x4, + DdpfFourcc = 0x4, /// /// Texture contains uncompressed RGB data; dwRGBBitCount and the RGB masks (dwRBitMask, dwGBitMask, dwBBitMask) contain valid data. /// - DDPF_RGB = 0x40, + DdpfRgb = 0x40, /// /// Used in some older DDS files for YUV uncompressed data (dwRGBBitCount contains the YUV bit count; dwRBitMask contains the Y mask, dwGBitMask contains the U mask, dwBBitMask contains the V mask) /// - DDPF_YUV = 0x200, + DdpfYuv = 0x200, /// /// Used in some older DDS files for single channel color uncompressed data (dwRGBBitCount contains the luminance channel bit count; dwRBitMask contains the channel mask). Can be combined with DDPF_ALPHAPIXELS for a two channel DDS file. /// - DDPF_LUMINANCE = 0x20000 + DdpfLuminance = 0x20000 } - public enum D3D10_RESOURCE_DIMENSION : uint + public enum D3D10ResourceDimension : uint { - D3D10_RESOURCE_DIMENSION_UNKNOWN, - D3D10_RESOURCE_DIMENSION_BUFFER, - D3D10_RESOURCE_DIMENSION_TEXTURE1D, - D3D10_RESOURCE_DIMENSION_TEXTURE2D, - D3D10_RESOURCE_DIMENSION_TEXTURE3D + D3D10ResourceDimensionUnknown, + D3D10ResourceDimensionBuffer, + D3D10ResourceDimensionTexture1D, + D3D10ResourceDimensionTexture2D, + D3D10ResourceDimensionTexture3D }; - public enum DXGI_FORMAT : uint + public enum DxgiFormat : uint { - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32A32_TYPELESS, - DXGI_FORMAT_R32G32B32A32_FLOAT, - DXGI_FORMAT_R32G32B32A32_UINT, - DXGI_FORMAT_R32G32B32A32_SINT, - DXGI_FORMAT_R32G32B32_TYPELESS, - DXGI_FORMAT_R32G32B32_FLOAT, - DXGI_FORMAT_R32G32B32_UINT, - DXGI_FORMAT_R32G32B32_SINT, - DXGI_FORMAT_R16G16B16A16_TYPELESS, - DXGI_FORMAT_R16G16B16A16_FLOAT, - DXGI_FORMAT_R16G16B16A16_UNORM, - DXGI_FORMAT_R16G16B16A16_UINT, - DXGI_FORMAT_R16G16B16A16_SNORM, - DXGI_FORMAT_R16G16B16A16_SINT, - DXGI_FORMAT_R32G32_TYPELESS, - DXGI_FORMAT_R32G32_FLOAT, - DXGI_FORMAT_R32G32_UINT, - DXGI_FORMAT_R32G32_SINT, - DXGI_FORMAT_R32G8X24_TYPELESS, - DXGI_FORMAT_D32_FLOAT_S8X24_UINT, - DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, - DXGI_FORMAT_X32_TYPELESS_G8X24_UINT, - DXGI_FORMAT_R10G10B10A2_TYPELESS, - DXGI_FORMAT_R10G10B10A2_UNORM, - DXGI_FORMAT_R10G10B10A2_UINT, - DXGI_FORMAT_R11G11B10_FLOAT, - DXGI_FORMAT_R8G8B8A8_TYPELESS, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, - DXGI_FORMAT_R8G8B8A8_UINT, - DXGI_FORMAT_R8G8B8A8_SNORM, - DXGI_FORMAT_R8G8B8A8_SINT, - DXGI_FORMAT_R16G16_TYPELESS, - DXGI_FORMAT_R16G16_FLOAT, - DXGI_FORMAT_R16G16_UNORM, - DXGI_FORMAT_R16G16_UINT, - DXGI_FORMAT_R16G16_SNORM, - DXGI_FORMAT_R16G16_SINT, - DXGI_FORMAT_R32_TYPELESS, - DXGI_FORMAT_D32_FLOAT, - DXGI_FORMAT_R32_FLOAT, - DXGI_FORMAT_R32_UINT, - DXGI_FORMAT_R32_SINT, - DXGI_FORMAT_R24G8_TYPELESS, - DXGI_FORMAT_D24_UNORM_S8_UINT, - DXGI_FORMAT_R24_UNORM_X8_TYPELESS, - DXGI_FORMAT_X24_TYPELESS_G8_UINT, - DXGI_FORMAT_R8G8_TYPELESS, - DXGI_FORMAT_R8G8_UNORM, - DXGI_FORMAT_R8G8_UINT, - DXGI_FORMAT_R8G8_SNORM, - DXGI_FORMAT_R8G8_SINT, - DXGI_FORMAT_R16_TYPELESS, - DXGI_FORMAT_R16_FLOAT, - DXGI_FORMAT_D16_UNORM, - DXGI_FORMAT_R16_UNORM, - DXGI_FORMAT_R16_UINT, - DXGI_FORMAT_R16_SNORM, - DXGI_FORMAT_R16_SINT, - DXGI_FORMAT_R8_TYPELESS, - DXGI_FORMAT_R8_UNORM, - DXGI_FORMAT_R8_UINT, - DXGI_FORMAT_R8_SNORM, - DXGI_FORMAT_R8_SINT, - DXGI_FORMAT_A8_UNORM, - DXGI_FORMAT_R1_UNORM, - DXGI_FORMAT_R9G9B9E5_SHAREDEXP, - DXGI_FORMAT_R8G8_B8G8_UNORM, - DXGI_FORMAT_G8R8_G8B8_UNORM, - DXGI_FORMAT_BC1_TYPELESS, - DXGI_FORMAT_BC1_UNORM, - DXGI_FORMAT_BC1_UNORM_SRGB, - DXGI_FORMAT_BC2_TYPELESS, - DXGI_FORMAT_BC2_UNORM, - DXGI_FORMAT_BC2_UNORM_SRGB, - DXGI_FORMAT_BC3_TYPELESS, - DXGI_FORMAT_BC3_UNORM, - DXGI_FORMAT_BC3_UNORM_SRGB, - DXGI_FORMAT_BC4_TYPELESS, - DXGI_FORMAT_BC4_UNORM, - DXGI_FORMAT_BC4_SNORM, - DXGI_FORMAT_BC5_TYPELESS, - DXGI_FORMAT_BC5_UNORM, - DXGI_FORMAT_BC5_SNORM, - DXGI_FORMAT_B5G6R5_UNORM, - DXGI_FORMAT_B5G5R5A1_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_B8G8R8X8_UNORM, - DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM, - DXGI_FORMAT_B8G8R8A8_TYPELESS, - DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, - DXGI_FORMAT_B8G8R8X8_TYPELESS, - DXGI_FORMAT_B8G8R8X8_UNORM_SRGB, - DXGI_FORMAT_BC6H_TYPELESS, - DXGI_FORMAT_BC6H_UF16, - DXGI_FORMAT_BC6H_SF16, - DXGI_FORMAT_BC7_TYPELESS, - DXGI_FORMAT_BC7_UNORM, - DXGI_FORMAT_BC7_UNORM_SRGB, - DXGI_FORMAT_AYUV, - DXGI_FORMAT_Y410, - DXGI_FORMAT_Y416, - DXGI_FORMAT_NV12, - DXGI_FORMAT_P010, - DXGI_FORMAT_P016, - DXGI_FORMAT_420_OPAQUE, - DXGI_FORMAT_YUY2, - DXGI_FORMAT_Y210, - DXGI_FORMAT_Y216, - DXGI_FORMAT_NV11, - DXGI_FORMAT_AI44, - DXGI_FORMAT_IA44, - DXGI_FORMAT_P8, - DXGI_FORMAT_A8P8, - DXGI_FORMAT_B4G4R4A4_UNORM, - DXGI_FORMAT_P208, - DXGI_FORMAT_V208, - DXGI_FORMAT_V408, - DXGI_FORMAT_FORCE_UINT + DxgiFormatUnknown, + DxgiFormatR32G32B32A32Typeless, + DxgiFormatR32G32B32A32Float, + DxgiFormatR32G32B32A32Uint, + DxgiFormatR32G32B32A32Sint, + DxgiFormatR32G32B32Typeless, + DxgiFormatR32G32B32Float, + DxgiFormatR32G32B32Uint, + DxgiFormatR32G32B32Sint, + DxgiFormatR16G16B16A16Typeless, + DxgiFormatR16G16B16A16Float, + DxgiFormatR16G16B16A16Unorm, + DxgiFormatR16G16B16A16Uint, + DxgiFormatR16G16B16A16Snorm, + DxgiFormatR16G16B16A16Sint, + DxgiFormatR32G32Typeless, + DxgiFormatR32G32Float, + DxgiFormatR32G32Uint, + DxgiFormatR32G32Sint, + DxgiFormatR32G8X24Typeless, + DxgiFormatD32FloatS8X24Uint, + DxgiFormatR32FloatX8X24Typeless, + DxgiFormatX32TypelessG8X24Uint, + DxgiFormatR10G10B10A2Typeless, + DxgiFormatR10G10B10A2Unorm, + DxgiFormatR10G10B10A2Uint, + DxgiFormatR11G11B10Float, + DxgiFormatR8G8B8A8Typeless, + DxgiFormatR8G8B8A8Unorm, + DxgiFormatR8G8B8A8UnormSrgb, + DxgiFormatR8G8B8A8Uint, + DxgiFormatR8G8B8A8Snorm, + DxgiFormatR8G8B8A8Sint, + DxgiFormatR16G16Typeless, + DxgiFormatR16G16Float, + DxgiFormatR16G16Unorm, + DxgiFormatR16G16Uint, + DxgiFormatR16G16Snorm, + DxgiFormatR16G16Sint, + DxgiFormatR32Typeless, + DxgiFormatD32Float, + DxgiFormatR32Float, + DxgiFormatR32Uint, + DxgiFormatR32Sint, + DxgiFormatR24G8Typeless, + DxgiFormatD24UnormS8Uint, + DxgiFormatR24UnormX8Typeless, + DxgiFormatX24TypelessG8Uint, + DxgiFormatR8G8Typeless, + DxgiFormatR8G8Unorm, + DxgiFormatR8G8Uint, + DxgiFormatR8G8Snorm, + DxgiFormatR8G8Sint, + DxgiFormatR16Typeless, + DxgiFormatR16Float, + DxgiFormatD16Unorm, + DxgiFormatR16Unorm, + DxgiFormatR16Uint, + DxgiFormatR16Snorm, + DxgiFormatR16Sint, + DxgiFormatR8Typeless, + DxgiFormatR8Unorm, + DxgiFormatR8Uint, + DxgiFormatR8Snorm, + DxgiFormatR8Sint, + DxgiFormatA8Unorm, + DxgiFormatR1Unorm, + DxgiFormatR9G9B9E5Sharedexp, + DxgiFormatR8G8B8G8Unorm, + DxgiFormatG8R8G8B8Unorm, + DxgiFormatBc1Typeless, + DxgiFormatBc1Unorm, + DxgiFormatBc1UnormSrgb, + DxgiFormatBc2Typeless, + DxgiFormatBc2Unorm, + DxgiFormatBc2UnormSrgb, + DxgiFormatBc3Typeless, + DxgiFormatBc3Unorm, + DxgiFormatBc3UnormSrgb, + DxgiFormatBc4Typeless, + DxgiFormatBc4Unorm, + DxgiFormatBc4Snorm, + DxgiFormatBc5Typeless, + DxgiFormatBc5Unorm, + DxgiFormatBc5Snorm, + DxgiFormatB5G6R5Unorm, + DxgiFormatB5G5R5A1Unorm, + DxgiFormatB8G8R8A8Unorm, + DxgiFormatB8G8R8X8Unorm, + DxgiFormatR10G10B10XrBiasA2Unorm, + DxgiFormatB8G8R8A8Typeless, + DxgiFormatB8G8R8A8UnormSrgb, + DxgiFormatB8G8R8X8Typeless, + DxgiFormatB8G8R8X8UnormSrgb, + DxgiFormatBc6HTypeless, + DxgiFormatBc6HUf16, + DxgiFormatBc6HSf16, + DxgiFormatBc7Typeless, + DxgiFormatBc7Unorm, + DxgiFormatBc7UnormSrgb, + DxgiFormatAyuv, + DxgiFormatY410, + DxgiFormatY416, + DxgiFormatNv12, + DxgiFormatP010, + DxgiFormatP016, + DxgiFormat420Opaque, + DxgiFormatYuy2, + DxgiFormatY210, + DxgiFormatY216, + DxgiFormatNv11, + DxgiFormatAi44, + DxgiFormatIa44, + DxgiFormatP8, + DxgiFormatA8P8, + DxgiFormatB4G4R4A4Unorm, + DxgiFormatP208, + DxgiFormatV208, + DxgiFormatV408, + DxgiFormatForceUint }; public static class DxgiFormatExtensions { - public static int GetByteSize(this DXGI_FORMAT format) + public static int GetByteSize(this DxgiFormat format) { switch (format) { - case DXGI_FORMAT.DXGI_FORMAT_UNKNOWN: + case DxgiFormat.DxgiFormatUnknown: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DxgiFormat.DxgiFormatR32G32B32A32Typeless: return 4 * 4; - case DXGI_FORMAT.DXGI_FORMAT_R32G32B32A32_FLOAT: + case DxgiFormat.DxgiFormatR32G32B32A32Float: return 4 * 4; - case DXGI_FORMAT.DXGI_FORMAT_R32G32B32A32_UINT: + case DxgiFormat.DxgiFormatR32G32B32A32Uint: return 4 * 4; - case DXGI_FORMAT.DXGI_FORMAT_R32G32B32A32_SINT: + case DxgiFormat.DxgiFormatR32G32B32A32Sint: return 4 * 4; - case DXGI_FORMAT.DXGI_FORMAT_R32G32B32_TYPELESS: + case DxgiFormat.DxgiFormatR32G32B32Typeless: return 4 * 3; - case DXGI_FORMAT.DXGI_FORMAT_R32G32B32_FLOAT: + case DxgiFormat.DxgiFormatR32G32B32Float: return 4 * 3; - case DXGI_FORMAT.DXGI_FORMAT_R32G32B32_UINT: + case DxgiFormat.DxgiFormatR32G32B32Uint: return 4 * 3; - case DXGI_FORMAT.DXGI_FORMAT_R32G32B32_SINT: + case DxgiFormat.DxgiFormatR32G32B32Sint: return 4 * 3; - case DXGI_FORMAT.DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DxgiFormat.DxgiFormatR16G16B16A16Typeless: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R16G16B16A16_FLOAT: + case DxgiFormat.DxgiFormatR16G16B16A16Float: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R16G16B16A16_UNORM: + case DxgiFormat.DxgiFormatR16G16B16A16Unorm: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R16G16B16A16_UINT: + case DxgiFormat.DxgiFormatR16G16B16A16Uint: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R16G16B16A16_SNORM: + case DxgiFormat.DxgiFormatR16G16B16A16Snorm: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R16G16B16A16_SINT: + case DxgiFormat.DxgiFormatR16G16B16A16Sint: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R32G32_TYPELESS: + case DxgiFormat.DxgiFormatR32G32Typeless: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R32G32_FLOAT: + case DxgiFormat.DxgiFormatR32G32Float: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R32G32_UINT: + case DxgiFormat.DxgiFormatR32G32Uint: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R32G32_SINT: + case DxgiFormat.DxgiFormatR32G32Sint: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_R32G8X24_TYPELESS: + case DxgiFormat.DxgiFormatR32G8X24Typeless: return 4 * 2; - case DXGI_FORMAT.DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DxgiFormat.DxgiFormatD32FloatS8X24Uint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DxgiFormat.DxgiFormatR32FloatX8X24Typeless: return 4; - case DXGI_FORMAT.DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + case DxgiFormat.DxgiFormatX32TypelessG8X24Uint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DxgiFormat.DxgiFormatR10G10B10A2Typeless: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R10G10B10A2_UNORM: + case DxgiFormat.DxgiFormatR10G10B10A2Unorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R10G10B10A2_UINT: + case DxgiFormat.DxgiFormatR10G10B10A2Uint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R11G11B10_FLOAT: + case DxgiFormat.DxgiFormatR11G11B10Float: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DxgiFormat.DxgiFormatR8G8B8A8Typeless: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM: + case DxgiFormat.DxgiFormatR8G8B8A8Unorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DxgiFormat.DxgiFormatR8G8B8A8UnormSrgb: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UINT: + case DxgiFormat.DxgiFormatR8G8B8A8Uint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_SNORM: + case DxgiFormat.DxgiFormatR8G8B8A8Snorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_SINT: + case DxgiFormat.DxgiFormatR8G8B8A8Sint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R16G16_TYPELESS: + case DxgiFormat.DxgiFormatR16G16Typeless: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R16G16_FLOAT: + case DxgiFormat.DxgiFormatR16G16Float: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R16G16_UNORM: + case DxgiFormat.DxgiFormatR16G16Unorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R16G16_UINT: + case DxgiFormat.DxgiFormatR16G16Uint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R16G16_SNORM: + case DxgiFormat.DxgiFormatR16G16Snorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R16G16_SINT: + case DxgiFormat.DxgiFormatR16G16Sint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R32_TYPELESS: + case DxgiFormat.DxgiFormatR32Typeless: return 4; - case DXGI_FORMAT.DXGI_FORMAT_D32_FLOAT: + case DxgiFormat.DxgiFormatD32Float: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R32_FLOAT: + case DxgiFormat.DxgiFormatR32Float: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R32_UINT: + case DxgiFormat.DxgiFormatR32Uint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R32_SINT: + case DxgiFormat.DxgiFormatR32Sint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R24G8_TYPELESS: + case DxgiFormat.DxgiFormatR24G8Typeless: return 4; - case DXGI_FORMAT.DXGI_FORMAT_D24_UNORM_S8_UINT: + case DxgiFormat.DxgiFormatD24UnormS8Uint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DxgiFormat.DxgiFormatR24UnormX8Typeless: return 4; - case DXGI_FORMAT.DXGI_FORMAT_X24_TYPELESS_G8_UINT: + case DxgiFormat.DxgiFormatX24TypelessG8Uint: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R8G8_TYPELESS: + case DxgiFormat.DxgiFormatR8G8Typeless: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R8G8_UNORM: + case DxgiFormat.DxgiFormatR8G8Unorm: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R8G8_UINT: + case DxgiFormat.DxgiFormatR8G8Uint: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R8G8_SNORM: + case DxgiFormat.DxgiFormatR8G8Snorm: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R8G8_SINT: + case DxgiFormat.DxgiFormatR8G8Sint: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R16_TYPELESS: + case DxgiFormat.DxgiFormatR16Typeless: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R16_FLOAT: + case DxgiFormat.DxgiFormatR16Float: return 2; - case DXGI_FORMAT.DXGI_FORMAT_D16_UNORM: + case DxgiFormat.DxgiFormatD16Unorm: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R16_UNORM: + case DxgiFormat.DxgiFormatR16Unorm: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R16_UINT: + case DxgiFormat.DxgiFormatR16Uint: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R16_SNORM: + case DxgiFormat.DxgiFormatR16Snorm: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R16_SINT: + case DxgiFormat.DxgiFormatR16Sint: return 2; - case DXGI_FORMAT.DXGI_FORMAT_R8_TYPELESS: + case DxgiFormat.DxgiFormatR8Typeless: return 1; - case DXGI_FORMAT.DXGI_FORMAT_R8_UNORM: + case DxgiFormat.DxgiFormatR8Unorm: return 1; - case DXGI_FORMAT.DXGI_FORMAT_R8_UINT: + case DxgiFormat.DxgiFormatR8Uint: return 1; - case DXGI_FORMAT.DXGI_FORMAT_R8_SNORM: + case DxgiFormat.DxgiFormatR8Snorm: return 1; - case DXGI_FORMAT.DXGI_FORMAT_R8_SINT: + case DxgiFormat.DxgiFormatR8Sint: return 1; - case DXGI_FORMAT.DXGI_FORMAT_A8_UNORM: + case DxgiFormat.DxgiFormatA8Unorm: return 1; - case DXGI_FORMAT.DXGI_FORMAT_R1_UNORM: + case DxgiFormat.DxgiFormatR1Unorm: return 1; - case DXGI_FORMAT.DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + case DxgiFormat.DxgiFormatR9G9B9E5Sharedexp: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R8G8_B8G8_UNORM: + case DxgiFormat.DxgiFormatR8G8B8G8Unorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_G8R8_G8B8_UNORM: + case DxgiFormat.DxgiFormatG8R8G8B8Unorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_BC1_TYPELESS: + case DxgiFormat.DxgiFormatBc1Typeless: return 8; - case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM: + case DxgiFormat.DxgiFormatBc1Unorm: return 8; - case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB: + case DxgiFormat.DxgiFormatBc1UnormSrgb: return 8; - case DXGI_FORMAT.DXGI_FORMAT_BC2_TYPELESS: + case DxgiFormat.DxgiFormatBc2Typeless: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM: + case DxgiFormat.DxgiFormatBc2Unorm: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB: + case DxgiFormat.DxgiFormatBc2UnormSrgb: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC3_TYPELESS: + case DxgiFormat.DxgiFormatBc3Typeless: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM: + case DxgiFormat.DxgiFormatBc3Unorm: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB: + case DxgiFormat.DxgiFormatBc3UnormSrgb: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC4_TYPELESS: + case DxgiFormat.DxgiFormatBc4Typeless: return 8; - case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM: + case DxgiFormat.DxgiFormatBc4Unorm: return 8; - case DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM: + case DxgiFormat.DxgiFormatBc4Snorm: return 8; - case DXGI_FORMAT.DXGI_FORMAT_BC5_TYPELESS: + case DxgiFormat.DxgiFormatBc5Typeless: return 8; - case DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM: + case DxgiFormat.DxgiFormatBc5Unorm: return 8; - case DXGI_FORMAT.DXGI_FORMAT_BC5_SNORM: + case DxgiFormat.DxgiFormatBc5Snorm: return 8; - case DXGI_FORMAT.DXGI_FORMAT_B5G6R5_UNORM: + case DxgiFormat.DxgiFormatB5G6R5Unorm: return 2; - case DXGI_FORMAT.DXGI_FORMAT_B5G5R5A1_UNORM: + case DxgiFormat.DxgiFormatB5G5R5A1Unorm: return 2; - case DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM: + case DxgiFormat.DxgiFormatB8G8R8A8Unorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_B8G8R8X8_UNORM: + case DxgiFormat.DxgiFormatB8G8R8X8Unorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: + case DxgiFormat.DxgiFormatR10G10B10XrBiasA2Unorm: return 4; - case DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DxgiFormat.DxgiFormatB8G8R8A8Typeless: return 4; - case DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DxgiFormat.DxgiFormatB8G8R8A8UnormSrgb: return 4; - case DXGI_FORMAT.DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DxgiFormat.DxgiFormatB8G8R8X8Typeless: return 4; - case DXGI_FORMAT.DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + case DxgiFormat.DxgiFormatB8G8R8X8UnormSrgb: return 4; - case DXGI_FORMAT.DXGI_FORMAT_BC6H_TYPELESS: + case DxgiFormat.DxgiFormatBc6HTypeless: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC6H_UF16: + case DxgiFormat.DxgiFormatBc6HUf16: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC6H_SF16: + case DxgiFormat.DxgiFormatBc6HSf16: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC7_TYPELESS: + case DxgiFormat.DxgiFormatBc7Typeless: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM: + case DxgiFormat.DxgiFormatBc7Unorm: return 16; - case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB: + case DxgiFormat.DxgiFormatBc7UnormSrgb: return 16; - case DXGI_FORMAT.DXGI_FORMAT_P8: + case DxgiFormat.DxgiFormatP8: return 1; - case DXGI_FORMAT.DXGI_FORMAT_A8P8: + case DxgiFormat.DxgiFormatA8P8: return 2; - case DXGI_FORMAT.DXGI_FORMAT_B4G4R4A4_UNORM: + case DxgiFormat.DxgiFormatB4G4R4A4Unorm: return 2; } return 4; } - public static bool IsCompressedFormat(this DXGI_FORMAT format) + public static bool IsCompressedFormat(this DxgiFormat format) { switch (format) { - case DXGI_FORMAT.DXGI_FORMAT_BC1_TYPELESS: - case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC2_TYPELESS: - case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC3_TYPELESS: - case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB: - case DXGI_FORMAT.DXGI_FORMAT_BC4_TYPELESS: - case DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC5_TYPELESS: - case DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC5_SNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC6H_TYPELESS: - case DXGI_FORMAT.DXGI_FORMAT_BC6H_UF16: - case DXGI_FORMAT.DXGI_FORMAT_BC6H_SF16: - case DXGI_FORMAT.DXGI_FORMAT_BC7_TYPELESS: - case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB: + case DxgiFormat.DxgiFormatBc1Typeless: + case DxgiFormat.DxgiFormatBc1Unorm: + case DxgiFormat.DxgiFormatBc1UnormSrgb: + case DxgiFormat.DxgiFormatBc2Typeless: + case DxgiFormat.DxgiFormatBc2Unorm: + case DxgiFormat.DxgiFormatBc2UnormSrgb: + case DxgiFormat.DxgiFormatBc3Typeless: + case DxgiFormat.DxgiFormatBc3Unorm: + case DxgiFormat.DxgiFormatBc3UnormSrgb: + case DxgiFormat.DxgiFormatBc4Typeless: + case DxgiFormat.DxgiFormatBc4Unorm: + case DxgiFormat.DxgiFormatBc4Snorm: + case DxgiFormat.DxgiFormatBc5Typeless: + case DxgiFormat.DxgiFormatBc5Unorm: + case DxgiFormat.DxgiFormatBc5Snorm: + case DxgiFormat.DxgiFormatBc6HTypeless: + case DxgiFormat.DxgiFormatBc6HUf16: + case DxgiFormat.DxgiFormatBc6HSf16: + case DxgiFormat.DxgiFormatBc7Typeless: + case DxgiFormat.DxgiFormatBc7Unorm: + case DxgiFormat.DxgiFormatBc7UnormSrgb: return true; default: diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index c106d49..499cee3 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -16,9 +16,9 @@ public int this[int index] readonly get => (int)(colorIndices >> (index * 2)) & 0b11; set { - colorIndices = (uint)(colorIndices & (~(0b11 << (index * 2)))); - int val = value & 0b11; - colorIndices = (colorIndices | ((uint)val << (index * 2))); + colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); + var val = value & 0b11; + colorIndices = colorIndices | ((uint)val << (index * 2)); } } @@ -26,7 +26,7 @@ public int this[int index] public readonly RawBlock4X4Rgba32 Decode(bool useAlpha) { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; var color0 = this.color0.ToColorRgb24(); @@ -34,7 +34,7 @@ public readonly RawBlock4X4Rgba32 Decode(bool useAlpha) useAlpha = useAlpha && HasAlphaOrBlack; - Span colors = HasAlphaOrBlack ? + var colors = HasAlphaOrBlack ? stackalloc ColorRgb24[] { color0, color1, @@ -47,9 +47,9 @@ stackalloc ColorRgb24[] { color0.InterpolateThird(color1, 2) }; - for (int i = 0; i < pixels.Length; i++) + for (var i = 0; i < pixels.Length; i++) { - int colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); + var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); var color = colors[colorIndex]; if (useAlpha && colorIndex == 3) { @@ -78,32 +78,32 @@ public int this[int index] readonly get => (int)(colorIndices >> (index * 2)) & 0b11; set { - colorIndices = (uint)(colorIndices & (~(0b11 << (index * 2)))); - int val = value & 0b11; - colorIndices = (colorIndices | ((uint)val << (index * 2))); + colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); + var val = value & 0b11; + colorIndices = colorIndices | ((uint)val << (index * 2)); } } public readonly byte GetAlpha(int index) { - ulong mask = 0xFUL << (index * 4); - int shift = (index * 4); - ulong alphaUnscaled = (((alphaColors & mask) >> shift)); - return (byte)((alphaUnscaled / 15.0) * 255); + var mask = 0xFUL << (index * 4); + var shift = index * 4; + var alphaUnscaled = (alphaColors & mask) >> shift; + return (byte)(alphaUnscaled / 15.0 * 255); } public void SetAlpha(int index, byte alpha) { - ulong mask = 0xFUL << (index * 4); - int shift = (index * 4); + var mask = 0xFUL << (index * 4); + var shift = index * 4; alphaColors &= ~mask; - byte a = (byte)((alpha / 255.0) * 15); + var a = (byte)(alpha / 255.0 * 15); alphaColors |= (ulong)(a & 0xF) << shift; } public readonly RawBlock4X4Rgba32 Decode() { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; var color0 = this.color0.ToColorRgb24(); @@ -116,9 +116,9 @@ public readonly RawBlock4X4Rgba32 Decode() color0.InterpolateThird(color1, 2) }; - for (int i = 0; i < pixels.Length; i++) + for (var i = 0; i < pixels.Length; i++) { - int colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); + var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); var color = colors[colorIndex]; pixels[i] = new Rgba32(color.r, color.g, color.b, GetAlpha(i)); @@ -140,9 +140,9 @@ public int this[int index] readonly get => (int)(colorIndices >> (index * 2)) & 0b11; set { - colorIndices = (uint)(colorIndices & (~(0b11 << (index * 2)))); - int val = value & 0b11; - colorIndices = (colorIndices | ((uint)val << (index * 2))); + colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); + var val = value & 0b11; + colorIndices = colorIndices | ((uint)val << (index * 2)); } } @@ -168,23 +168,23 @@ public byte Alpha1 public readonly byte GetAlphaIndex(int pixelIndex) { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - ulong alphaIndex = (((alphaBlock & mask) >> shift)); + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + var alphaIndex = (alphaBlock & mask) >> shift; return (byte)alphaIndex; } public void SetAlphaIndex(int pixelIndex, byte alphaIndex) { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; alphaBlock &= ~mask; alphaBlock |= (ulong)(alphaIndex & 0b111) << shift; } public readonly RawBlock4X4Rgba32 Decode() { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; var color0 = this.color0.ToColorRgb24(); @@ -199,7 +199,7 @@ public readonly RawBlock4X4Rgba32 Decode() color0.InterpolateThird(color1, 2) }; - Span alphas = a0 > a1 ? stackalloc byte[] { + var alphas = a0 > a1 ? stackalloc byte[] { a0, a1, (byte)Interpolation.Interpolate(a0, a1, 1, 7), @@ -219,9 +219,9 @@ public readonly RawBlock4X4Rgba32 Decode() 255 }; - for (int i = 0; i < pixels.Length; i++) + for (var i = 0; i < pixels.Length; i++) { - int colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); + var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); var color = colors[colorIndex]; pixels[i] = new Rgba32(color.r, color.g, color.b, alphas[GetAlphaIndex(i)]); @@ -257,29 +257,29 @@ public byte Red1 public readonly byte GetRedIndex(int pixelIndex) { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - ulong redIndex = (((redBlock & mask) >> shift)); + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + var redIndex = (redBlock & mask) >> shift; return (byte)redIndex; } public void SetRedIndex(int pixelIndex, byte redIndex) { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; redBlock &= ~mask; redBlock |= (ulong)(redIndex & 0b111) << shift; } public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; var r0 = Red0; var r1 = Red1; - Span reds = r0 > r1 ? stackalloc byte[] { + var reds = r0 > r1 ? stackalloc byte[] { r0, r1, (byte)Interpolation.Interpolate(r0, r1, 1, 7), @@ -301,7 +301,7 @@ public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) if (redAsLuminance) { - for (int i = 0; i < pixels.Length; i++) + for (var i = 0; i < pixels.Length; i++) { var index = GetRedIndex(i); pixels[i] = new Rgba32(reds[index], reds[index], reds[index], 255); @@ -309,7 +309,7 @@ public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) } else { - for (int i = 0; i < pixels.Length; i++) + for (var i = 0; i < pixels.Length; i++) { var index = GetRedIndex(i); pixels[i] = new Rgba32(reds[index], 0, 0, 255); @@ -368,45 +368,45 @@ public byte Green1 public readonly byte GetRedIndex(int pixelIndex) { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - ulong redIndex = (((redBlock & mask) >> shift)); + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + var redIndex = (redBlock & mask) >> shift; return (byte)redIndex; } public void SetRedIndex(int pixelIndex, byte redIndex) { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; redBlock &= ~mask; redBlock |= (ulong)(redIndex & 0b111) << shift; } public readonly byte GetGreenIndex(int pixelIndex) { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); - ulong greenIndex = (((greenBlock & mask) >> shift)); + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + var greenIndex = (greenBlock & mask) >> shift; return (byte)greenIndex; } public void SetGreenIndex(int pixelIndex, byte greenIndex) { - ulong mask = 0b0111UL << (pixelIndex * 3 + 16); - int shift = (pixelIndex * 3 + 16); + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; greenBlock &= ~mask; greenBlock |= (ulong)(greenIndex & 0b111) << shift; } public readonly RawBlock4X4Rgba32 Decode() { - RawBlock4X4Rgba32 output = new RawBlock4X4Rgba32(); + var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; var r0 = Red0; var r1 = Red1; - Span reds = r0 > r1 ? stackalloc byte[] { + var reds = r0 > r1 ? stackalloc byte[] { r0, r1, (byte)Interpolation.Interpolate(r0, r1, 1, 7), @@ -429,7 +429,7 @@ public readonly RawBlock4X4Rgba32 Decode() var g0 = Green0; var g1 = Green1; - Span greens = g0 > g1 ? stackalloc byte[] { + var greens = g0 > g1 ? stackalloc byte[] { g0, g1, (byte)Interpolation.Interpolate(g0, g1, 1, 7), @@ -449,7 +449,7 @@ public readonly RawBlock4X4Rgba32 Decode() 255 }; - for (int i = 0; i < pixels.Length; i++) + for (var i = 0; i < pixels.Length; i++) { var redIndex = GetRedIndex(i); var greenIndex = GetGreenIndex(i); diff --git a/BCnEnc.Net/Shared/GLFormat.cs b/BCnEnc.Net/Shared/GLFormat.cs index 77e50ce..3c02c11 100644 --- a/BCnEnc.Net/Shared/GLFormat.cs +++ b/BCnEnc.Net/Shared/GLFormat.cs @@ -1,193 +1,193 @@ namespace BCnEncoder.Shared { - public enum GLFormat : uint + public enum GlFormat : uint { - GL_RED = 0x1903, - GL_BGRA = 0x80E1, - GL_RGB = 0x1907, - GL_RGBA = 0x1908, - GL_RG = 0x8227, - GL_RED_INTEGER = 0x8D94, - GL_RG_INTEGER = 0x8228, - GL_RED_SNORM = 0x8F90, - GL_RG_SNORM = 0x8F91, - GL_RGB_SNORM = 0x8F92, - GL_RGBA_SNORM = 0x8F93, + GlRed = 0x1903, + GlBgra = 0x80E1, + GlRgb = 0x1907, + GlRgba = 0x1908, + GlRg = 0x8227, + GlRedInteger = 0x8D94, + GlRgInteger = 0x8228, + GlRedSnorm = 0x8F90, + GlRgSnorm = 0x8F91, + GlRgbSnorm = 0x8F92, + GlRgbaSnorm = 0x8F93, } - public enum GLType : uint + public enum GlType : uint { - GL_BYTE = 5120, - GL_UNSIGNED_BYTE = 5121, - GL_SHORT = 5122, - GL_UNSIGNED_SHORT = 5123, - GL_INT = 5124, - GL_UNSIGNED_INT = 5125, - GL_FLOAT = 5126, - GL_HALF_FLOAT = 5131, - GL_UNSIGNED_BYTE_2_3_3_REV = 33634, - GL_UNSIGNED_BYTE_3_3_2 = 32818, - GL_UNSIGNED_INT_10_10_10_2 = 32822, - GL_UNSIGNED_INT_2_10_10_10_REV = 33640, - GL_UNSIGNED_INT_8_8_8_8 = 32821, - GL_UNSIGNED_INT_8_8_8_8_REV = 33639, - GL_UNSIGNED_SHORT_1_5_5_5_REV = 33638, - GL_UNSIGNED_SHORT_4_4_4_4 = 32819, - GL_UNSIGNED_SHORT_4_4_4_4_REV = 33637, - GL_UNSIGNED_SHORT_5_5_5_1 = 32820, - GL_UNSIGNED_SHORT_5_6_5 = 33635, - GL_UNSIGNED_SHORT_5_6_5_REV = 33636 + GlByte = 5120, + GlUnsignedByte = 5121, + GlShort = 5122, + GlUnsignedShort = 5123, + GlInt = 5124, + GlUnsignedInt = 5125, + GlFloat = 5126, + GlHalfFloat = 5131, + GlUnsignedByte233Rev = 33634, + GlUnsignedByte332 = 32818, + GlUnsignedInt1010102 = 32822, + GlUnsignedInt2101010Rev = 33640, + GlUnsignedInt8888 = 32821, + GlUnsignedInt8888Rev = 33639, + GlUnsignedShort1555Rev = 33638, + GlUnsignedShort4444 = 32819, + GlUnsignedShort4444Rev = 33637, + GlUnsignedShort5551 = 32820, + GlUnsignedShort565 = 33635, + GlUnsignedShort565Rev = 33636 } public enum GlInternalFormat : uint { - GL_RGBA4 = 0x8056, - GL_RGB5 = 0x8050, - GL_RGB565 = 0x8D62, - GL_RGBA8 = 0x8058, - GL_RGB5_A1 = 0x8057, - GL_RGBA16 = 0x805B, - GL_DEPTH_COMPONENT16 = 0x81A5, - GL_DEPTH_COMPONENT24 = 0x81A6, - GL_DEPTH_COMPONENT32F = 36012, - GL_STENCIL_INDEX8 = 36168, - GL_DEPTH24_STENCIL8 = 0x88F0, - GL_DEPTH32F_STENCIL8 = 36013, - - GL_R8 = 0x8229, - GL_RG8 = 0x822B, - GL_RG16 = 0x822C, - GL_R16F = 0x822D, - GL_R32F = 0x822E, - GL_RG16F = 0x822F, - GL_RG32F = 0x8230, - GL_RGBA32F = 0x8814, - GL_RGBA16F = 0x881A, - - GL_R8UI = 33330, - GL_R8I = 33329, - GL_R16 = 33322, - GL_R16I = 33331, - GL_R16UI = 33332, - GL_R32I = 33333, - GL_R32UI = 33334, - - - GL_RG8I = 33335, - GL_RG8UI = 33336, - GL_RG16I = 33337, - GL_RG16UI = 33338, - GL_RG32I = 33339, - GL_RG32UI = 33340, - - GL_RGB8 = 32849, - GL_RGB8I = 36239, - GL_RGB8UI = 36221, - - GL_RGBA12 = 32858, - GL_RGBA2 = 32853, - GL_RGBA8I = 36238, - GL_RGBA8UI = 36220, - - GL_RGBA16I = 36232, - GL_RGBA16UI = 36214, - GL_RGBA32I = 36226, - GL_RGBA32UI = 36208, - - - GL_R8_SNORM = 0x8F94, - GL_RG8_SNORM = 0x8F95, - GL_RGB8_SNORM = 0x8F96, - GL_RGBA8_SNORM = 0x8F97, - GL_R16_SNORM = 0x8F98, - GL_RG16_SNORM = 0x8F99, - GL_RGB16_SNORM = 0x8F9A, - GL_RGBA16_SNORM = 0x8F9B, - - GL_RGB10_A2 = 32857, - GL_RGB10_A2UI = 36975, - - GL_RGB16 = 32852, - GL_RGB16F = 34843, - GL_RGB16I = 36233, - GL_RGB16UI = 36215, - - GL_RGB32F = 34837, - GL_RGB32I = 36227, - GL_RGB32UI = 36209, + GlRgba4 = 0x8056, + GlRgb5 = 0x8050, + GlRgb565 = 0x8D62, + GlRgba8 = 0x8058, + GlRgb5A1 = 0x8057, + GlRgba16 = 0x805B, + GlDepthComponent16 = 0x81A5, + GlDepthComponent24 = 0x81A6, + GlDepthComponent32F = 36012, + GlStencilIndex8 = 36168, + GlDepth24Stencil8 = 0x88F0, + GlDepth32FStencil8 = 36013, + + GlR8 = 0x8229, + GlRg8 = 0x822B, + GlRg16 = 0x822C, + GlR16F = 0x822D, + GlR32F = 0x822E, + GlRg16F = 0x822F, + GlRg32F = 0x8230, + GlRgba32F = 0x8814, + GlRgba16F = 0x881A, + + GlR8Ui = 33330, + GlR8I = 33329, + GlR16 = 33322, + GlR16I = 33331, + GlR16Ui = 33332, + GlR32I = 33333, + GlR32Ui = 33334, + + + GlRg8I = 33335, + GlRg8Ui = 33336, + GlRg16I = 33337, + GlRg16Ui = 33338, + GlRg32I = 33339, + GlRg32Ui = 33340, + + GlRgb8 = 32849, + GlRgb8I = 36239, + GlRgb8Ui = 36221, + + GlRgba12 = 32858, + GlRgba2 = 32853, + GlRgba8I = 36238, + GlRgba8Ui = 36220, + + GlRgba16I = 36232, + GlRgba16Ui = 36214, + GlRgba32I = 36226, + GlRgba32Ui = 36208, + + + GlR8Snorm = 0x8F94, + GlRg8Snorm = 0x8F95, + GlRgb8Snorm = 0x8F96, + GlRgba8Snorm = 0x8F97, + GlR16Snorm = 0x8F98, + GlRg16Snorm = 0x8F99, + GlRgb16Snorm = 0x8F9A, + GlRgba16Snorm = 0x8F9B, + + GlRgb10A2 = 32857, + GlRgb10A2Ui = 36975, + + GlRgb16 = 32852, + GlRgb16F = 34843, + GlRgb16I = 36233, + GlRgb16Ui = 36215, + + GlRgb32F = 34837, + GlRgb32I = 36227, + GlRgb32Ui = 36209, //BC1 - GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0, - GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C, - GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1, - GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D, + GlCompressedRgbS3TcDxt1Ext = 0x83F0, + GlCompressedSrgbS3TcDxt1Ext = 0x8C4C, + GlCompressedRgbaS3TcDxt1Ext = 0x83F1, + GlCompressedSrgbAlphaS3TcDxt1Ext = 0x8C4D, //BC2 - GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2, - GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E, + GlCompressedRgbaS3TcDxt3Ext = 0x83F2, + GlCompressedSrgbAlphaS3TcDxt3Ext = 0x8C4E, //BC3 - GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3, - GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F, + GlCompressedRgbaS3TcDxt5Ext = 0x83F3, + GlCompressedSrgbAlphaS3TcDxt5Ext = 0x8C4F, //BC4 & BC5 - GL_COMPRESSED_RED_GREEN_RGTC2_EXT = 36285, - GL_COMPRESSED_RED_RGTC1_EXT = 36283, - GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT = 36286, - GL_COMPRESSED_SIGNED_RED_RGTC1_EXT = 36284, + GlCompressedRedGreenRgtc2Ext = 36285, + GlCompressedRedRgtc1Ext = 36283, + GlCompressedSignedRedGreenRgtc2Ext = 36286, + GlCompressedSignedRedRgtc1Ext = 36284, //BC6 & BC7 - GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB = 36494, - GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB = 36495, - GL_COMPRESSED_RGBA_BPTC_UNORM_ARB = 36492, - GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB = 36493, + GlCompressedRgbBptcSignedFloatArb = 36494, + GlCompressedRgbBptcUnsignedFloatArb = 36495, + GlCompressedRgbaBptcUnormArb = 36492, + GlCompressedSrgbAlphaBptcUnormArb = 36493, // ETC1 & 2 - GL_ETC1_RGB8_OES = 0x8D64, + GlEtc1Rgb8Oes = 0x8D64, - GL_COMPRESSED_R11_EAC = 0x9270, - GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, - GL_COMPRESSED_RG11_EAC = 0x9272, - GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273, + GlCompressedR11Eac = 0x9270, + GlCompressedSignedR11Eac = 0x9271, + GlCompressedRg11Eac = 0x9272, + GlCompressedSignedRg11Eac = 0x9273, - GL_COMPRESSED_RGB8_ETC2 = 0x9274, - GL_COMPRESSED_SRGB8_ETC2 = 0x9275, - GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276, - GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277, - GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, - GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279, + GlCompressedRgb8Etc2 = 0x9274, + GlCompressedSrgb8Etc2 = 0x9275, + GlCompressedRgb8PunchthroughAlpha1Etc2 = 0x9276, + GlCompressedSrgb8PunchthroughAlpha1Etc2 = 0x9277, + GlCompressedRgba8Etc2Eac = 0x9278, + GlCompressedSrgb8Alpha8Etc2Eac = 0x9279, // ASTC - GL_COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0, - GL_COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93B1, - GL_COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93B2, - GL_COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93B3, - GL_COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93B4, - GL_COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93B5, - GL_COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93B6, - GL_COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93B7, - GL_COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93B8, - GL_COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93B9, - GL_COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93BA, - GL_COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93BB, - GL_COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93BC, - GL_COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93BD, - - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93D1, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93D2, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93D3, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93D4, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93D5, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93D6, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93D7, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93D8, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93D9, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93DA, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC, - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD + GlCompressedRgbaAstc4X4Khr = 0x93B0, + GlCompressedRgbaAstc5X4Khr = 0x93B1, + GlCompressedRgbaAstc5X5Khr = 0x93B2, + GlCompressedRgbaAstc6X5Khr = 0x93B3, + GlCompressedRgbaAstc6X6Khr = 0x93B4, + GlCompressedRgbaAstc8X5Khr = 0x93B5, + GlCompressedRgbaAstc8X6Khr = 0x93B6, + GlCompressedRgbaAstc8X8Khr = 0x93B7, + GlCompressedRgbaAstc10X5Khr = 0x93B8, + GlCompressedRgbaAstc10X6Khr = 0x93B9, + GlCompressedRgbaAstc10X8Khr = 0x93BA, + GlCompressedRgbaAstc10X10Khr = 0x93BB, + GlCompressedRgbaAstc12X10Khr = 0x93BC, + GlCompressedRgbaAstc12X12Khr = 0x93BD, + + GlCompressedSrgb8Alpha8Astc4X4Khr = 0x93D0, + GlCompressedSrgb8Alpha8Astc5X4Khr = 0x93D1, + GlCompressedSrgb8Alpha8Astc5X5Khr = 0x93D2, + GlCompressedSrgb8Alpha8Astc6X5Khr = 0x93D3, + GlCompressedSrgb8Alpha8Astc6X6Khr = 0x93D4, + GlCompressedSrgb8Alpha8Astc8X5Khr = 0x93D5, + GlCompressedSrgb8Alpha8Astc8X6Khr = 0x93D6, + GlCompressedSrgb8Alpha8Astc8X8Khr = 0x93D7, + GlCompressedSrgb8Alpha8Astc10X5Khr = 0x93D8, + GlCompressedSrgb8Alpha8Astc10X6Khr = 0x93D9, + GlCompressedSrgb8Alpha8Astc10X8Khr = 0x93DA, + GlCompressedSrgb8Alpha8Astc10X10Khr = 0x93DB, + GlCompressedSrgb8Alpha8Astc12X10Khr = 0x93DC, + GlCompressedSrgb8Alpha8Astc12X12Khr = 0x93DD } } diff --git a/BCnEnc.Net/Shared/ImageQuality.cs b/BCnEnc.Net/Shared/ImageQuality.cs index 1def66f..dc7e477 100644 --- a/BCnEnc.Net/Shared/ImageQuality.cs +++ b/BCnEnc.Net/Shared/ImageQuality.cs @@ -10,14 +10,14 @@ public static float PeakSignalToNoiseRatio(ReadOnlySpan original, ReadOn throw new ArgumentException("Both spans should be the same length"); } float error = 0; - for (int i = 0; i < original.Length; i++) { + for (var i = 0; i < original.Length; i++) { var o = new ColorYCbCr(original[i]); var c = new ColorYCbCr(other[i]); error += (o.y - c.y) * (o.y - c.y); error += (o.cb - c.cb) * (o.cb - c.cb); error += (o.cr - c.cr) * (o.cr - c.cr); if (countAlpha) { - error += ((original[i].A - other[i].A) / 255.0f) * ((original[i].A - other[i].A) / 255.0f); + error += (original[i].A - other[i].A) / 255.0f * ((original[i].A - other[i].A) / 255.0f); } } @@ -40,12 +40,12 @@ public static float PeakSignalToNoiseRatioLuminance(ReadOnlySpan origina throw new ArgumentException("Both spans should be the same length"); } float error = 0; - for (int i = 0; i < original.Length; i++) { + for (var i = 0; i < original.Length; i++) { var o = new ColorYCbCr(original[i]); var c = new ColorYCbCr(other[i]); error += (o.y - c.y) * (o.y - c.y); if (countAlpha) { - error += ((original[i].A - other[i].A) / 255.0f) * ((original[i].A - other[i].A) / 255.0f); + error += (original[i].A - other[i].A) / 255.0f * ((original[i].A - other[i].A) / 255.0f); } } diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index fb8b7bb..4f3b1e7 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -12,21 +12,21 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int { blocksWidth = (int)MathF.Ceiling(image.Width / 4.0f); blocksHeight = (int)MathF.Ceiling(image.Height / 4.0f); - RawBlock4X4Rgba32[] output = new RawBlock4X4Rgba32[blocksWidth * blocksHeight]; + var output = new RawBlock4X4Rgba32[blocksWidth * blocksHeight]; if (!image.TryGetSinglePixelSpan(out var pixels)) { throw new Exception("Cannot get pixel span."); } - for (int y = 0; y < image.Height; y++) + for (var y = 0; y < image.Height; y++) { - for (int x = 0; x < image.Width; x++) + for (var x = 0; x < image.Width; x++) { - Rgba32 color = pixels[x + y * image.Width]; - int blockIndexX = (int)MathF.Floor(x / 4.0f); - int blockIndexY = (int)MathF.Floor(y / 4.0f); - int blockInternalIndexX = x % 4; - int blockInternalIndexY = y % 4; + var color = pixels[x + y * image.Width]; + var blockIndexX = (int)MathF.Floor(x / 4.0f); + var blockIndexY = (int)MathF.Floor(y / 4.0f); + var blockInternalIndexX = x % 4; + var blockInternalIndexY = y % 4; output[blockIndexX + blockIndexY * blocksWidth][blockInternalIndexX, blockInternalIndexY] = color; } @@ -35,13 +35,13 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int //Fill in block y with edge color if (image.Height % 4 != 0) { - int yPaddingStart = image.Height % 4; - for (int i = 0; i < blocksWidth; i++) + var yPaddingStart = image.Height % 4; + for (var i = 0; i < blocksWidth; i++) { var lastBlock = output[i + blocksWidth * (blocksHeight - 1)]; - for (int y = yPaddingStart; y < 4; y++) + for (var y = yPaddingStart; y < 4; y++) { - for (int x = 0; x < 4; x++) + for (var x = 0; x < 4; x++) { lastBlock[x, y] = lastBlock[x, y - 1]; } @@ -53,13 +53,13 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int //Fill in block x with edge color if (image.Width % 4 != 0) { - int xPaddingStart = image.Width % 4; - for (int i = 0; i < blocksHeight; i++) + var xPaddingStart = image.Width % 4; + for (var i = 0; i < blocksHeight; i++) { var lastBlock = output[blocksWidth - 1 + i * blocksWidth]; - for (int x = xPaddingStart; x < 4; x++) + for (var x = xPaddingStart; x < 4; x++) { - for (int y = 0; y < 4; y++) + for (var y = 0; y < 4; y++) { lastBlock[x, y] = lastBlock[x - 1, y]; } @@ -77,20 +77,20 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, in internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) { - Image output = new Image(pixelWidth, pixelHeight); + var output = new Image(pixelWidth, pixelHeight); if (!output.TryGetSinglePixelSpan(out var pixels)) { throw new Exception("Cannot get pixel span."); } - for (int y = 0; y < output.Height; y++) + for (var y = 0; y < output.Height; y++) { - for (int x = 0; x < output.Width; x++) + for (var x = 0; x < output.Width; x++) { - int blockIndexX = (int)MathF.Floor(x / 4.0f); - int blockIndexY = (int)MathF.Floor(y / 4.0f); - int blockInternalIndexX = x % 4; - int blockInternalIndexY = y % 4; + var blockIndexX = (int)MathF.Floor(x / 4.0f); + var blockIndexY = (int)MathF.Floor(y / 4.0f); + var blockInternalIndexX = x % 4; + var blockInternalIndexY = y % 4; pixels[x + y * output.Width] = blocks[blockIndexX, blockIndexY] @@ -107,20 +107,20 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) { - Image output = new Image(pixelWidth, pixelHeight); + var output = new Image(pixelWidth, pixelHeight); if (!output.TryGetSinglePixelSpan(out var pixels)) { throw new Exception("Cannot get pixel span."); } - for (int y = 0; y < output.Height; y++) + for (var y = 0; y < output.Height; y++) { - for (int x = 0; x < output.Width; x++) + for (var x = 0; x < output.Width; x++) { - int blockIndexX = (int)MathF.Floor(x / 4.0f); - int blockIndexY = (int)MathF.Floor(y / 4.0f); - int blockInternalIndexX = x % 4; - int blockInternalIndexY = y % 4; + var blockIndexX = (int)MathF.Floor(x / 4.0f); + var blockIndexY = (int)MathF.Floor(y / 4.0f); + var blockInternalIndexX = x % 4; + var blockInternalIndexY = y % 4; pixels[x + y * output.Width] = blocks[blockIndexX + blockIndexY * blocksWidth] diff --git a/BCnEnc.Net/Shared/KtxFile.cs b/BCnEnc.Net/Shared/KtxFile.cs index 27ce05f..47bc782 100644 --- a/BCnEnc.Net/Shared/KtxFile.cs +++ b/BCnEnc.Net/Shared/KtxFile.cs @@ -15,14 +15,14 @@ namespace BCnEncoder.Shared public class KtxFile { - public KtxHeader Header; + public KtxHeader header; public List KeyValuePairs { get; } = new List(); public List MipMaps { get; } = new List(); public KtxFile() { } public KtxFile(KtxHeader header) { - Header = header; + this.header = header; } /// @@ -35,44 +35,44 @@ public void Write(Stream s) throw new InvalidOperationException("The KTX structure should have at least 1 mipmap level and 1 Face before writing to file."); } - using (BinaryWriter bw = new BinaryWriter(s, UTF8, true)) + using (var bw = new BinaryWriter(s, UTF8, true)) { - uint bytesOfKeyValueData = (uint)KeyValuePairs.Sum(x => x.GetSizeWithPadding()); + var bytesOfKeyValueData = (uint)KeyValuePairs.Sum(x => x.GetSizeWithPadding()); - Header.BytesOfKeyValueData = bytesOfKeyValueData; - Header.NumberOfFaces = MipMaps[0].NumberOfFaces; - Header.NumberOfMipmapLevels = (uint)MipMaps.Count; - Header.NumberOfArrayElements = 0; + header.BytesOfKeyValueData = bytesOfKeyValueData; + header.NumberOfFaces = MipMaps[0].NumberOfFaces; + header.NumberOfMipmapLevels = (uint)MipMaps.Count; + header.NumberOfArrayElements = 0; - if (!Header.VerifyHeader()) + if (!header.VerifyHeader()) { throw new InvalidOperationException("Please verify the header validity before writing to file."); } - bw.WriteStruct(Header); + bw.WriteStruct(header); - foreach (KtxKeyValuePair keyValuePair in KeyValuePairs) + foreach (var keyValuePair in KeyValuePairs) { KtxKeyValuePair.WriteKeyValuePair(bw, keyValuePair); } - for (int mip = 0; mip < Header.NumberOfMipmapLevels; mip++) + for (var mip = 0; mip < header.NumberOfMipmapLevels; mip++) { - uint imageSize = MipMaps[mip].SizeInBytes; + var imageSize = MipMaps[mip].SizeInBytes; bw.Write(imageSize); - bool isCubemap = Header.NumberOfFaces == 6 && Header.NumberOfArrayElements == 0; - for (int f = 0; f < Header.NumberOfFaces; f++) + var isCubemap = header.NumberOfFaces == 6 && header.NumberOfArrayElements == 0; + for (var f = 0; f < header.NumberOfFaces; f++) { bw.Write(MipMaps[mip].Faces[f].Data); - uint cubePadding = 0u; + var cubePadding = 0u; if (isCubemap) { - cubePadding = 3 - ((imageSize + 3) % 4); + cubePadding = 3 - (imageSize + 3) % 4; } bw.AddPadding(cubePadding); } - uint mipPaddingBytes = 3 - ((imageSize + 3) % 4); + var mipPaddingBytes = 3 - (imageSize + 3) % 4; bw.AddPadding(mipPaddingBytes); } @@ -85,49 +85,49 @@ public void Write(Stream s) public static KtxFile Load(Stream s) { - using (BinaryReader br = new BinaryReader(s, UTF8, true)) + using (var br = new BinaryReader(s, UTF8, true)) { - KtxHeader header = br.ReadStruct(); + var header = br.ReadStruct(); if (header.NumberOfArrayElements > 0) { throw new NotSupportedException("KTX files with arrays are not supported."); } - KtxFile ktx = new KtxFile(header); + var ktx = new KtxFile(header); - int keyValuePairBytesRead = 0; + var keyValuePairBytesRead = 0; while (keyValuePairBytesRead < header.BytesOfKeyValueData) { - KtxKeyValuePair kvp = KtxKeyValuePair.ReadKeyValuePair(br, out int read); + var kvp = KtxKeyValuePair.ReadKeyValuePair(br, out var read); keyValuePairBytesRead += read; ktx.KeyValuePairs.Add(kvp); } - uint numberOfFaces = Math.Max(1, header.NumberOfFaces); + var numberOfFaces = Math.Max(1, header.NumberOfFaces); ktx.MipMaps.Capacity = (int)header.NumberOfMipmapLevels; for (uint mipLevel = 0; mipLevel < header.NumberOfMipmapLevels; mipLevel++) { - uint imageSize = br.ReadUInt32(); - uint mipWidth = header.PixelWidth / (uint)(Math.Pow(2, mipLevel)); - uint mipHeight = header.PixelHeight / (uint)(Math.Pow(2, mipLevel)); + var imageSize = br.ReadUInt32(); + var mipWidth = header.PixelWidth / (uint)Math.Pow(2, mipLevel); + var mipHeight = header.PixelHeight / (uint)Math.Pow(2, mipLevel); ktx.MipMaps.Add(new KtxMipmap(imageSize, mipWidth, mipHeight, numberOfFaces)); - bool cubemap = header.NumberOfFaces > 1 && header.NumberOfArrayElements == 0; + var cubemap = header.NumberOfFaces > 1 && header.NumberOfArrayElements == 0; for (uint face = 0; face < numberOfFaces; face++) { - byte[] faceData = br.ReadBytes((int)imageSize); + var faceData = br.ReadBytes((int)imageSize); ktx.MipMaps[(int)mipLevel].Faces[(int)face] = new KtxMipFace(faceData, mipWidth, mipHeight); if (cubemap) { - uint cubePadding = 0u; - cubePadding = 3 - ((imageSize + 3) % 4); + var cubePadding = 0u; + cubePadding = 3 - (imageSize + 3) % 4; br.SkipPadding(cubePadding); } } - uint mipPaddingBytes = 3 - ((imageSize + 3) % 4); + var mipPaddingBytes = 3 - (imageSize + 3) % 4; br.SkipPadding(mipPaddingBytes); } @@ -142,11 +142,11 @@ public ulong GetTotalSize() { ulong totalSize = 0; - for (int mipLevel = 0; mipLevel < Header.NumberOfMipmapLevels; mipLevel++) + for (var mipLevel = 0; mipLevel < header.NumberOfMipmapLevels; mipLevel++) { - for (int face = 0; face < Header.NumberOfFaces; face++) + for (var face = 0; face < header.NumberOfFaces; face++) { - KtxMipFace ktxface = MipMaps[mipLevel].Faces[face]; + var ktxface = MipMaps[mipLevel].Faces[face]; totalSize += ktxface.SizeInBytes; } } @@ -159,13 +159,13 @@ public ulong GetTotalSize() /// public byte[] GetAllTextureDataFaceMajor() { - byte[] result = new byte[GetTotalSize()]; + var result = new byte[GetTotalSize()]; uint start = 0; - for (int face = 0; face < Header.NumberOfFaces; face++) + for (var face = 0; face < header.NumberOfFaces; face++) { - for (int mipLevel = 0; mipLevel < Header.NumberOfMipmapLevels; mipLevel++) + for (var mipLevel = 0; mipLevel < header.NumberOfMipmapLevels; mipLevel++) { - KtxMipFace ktxMipFace = MipMaps[mipLevel].Faces[face]; + var ktxMipFace = MipMaps[mipLevel].Faces[face]; ktxMipFace.Data.CopyTo(result, (int)start); start += ktxMipFace.SizeInBytes; } @@ -179,13 +179,13 @@ public byte[] GetAllTextureDataFaceMajor() /// public byte[] GetAllTextureDataMipMajor() { - byte[] result = new byte[GetTotalSize()]; + var result = new byte[GetTotalSize()]; uint start = 0; - for (int mipLevel = 0; mipLevel < Header.NumberOfMipmapLevels; mipLevel++) + for (var mipLevel = 0; mipLevel < header.NumberOfMipmapLevels; mipLevel++) { - for (int face = 0; face < Header.NumberOfFaces; face++) + for (var face = 0; face < header.NumberOfFaces; face++) { - KtxMipFace ktxMipFace = MipMaps[mipLevel].Faces[face]; + var ktxMipFace = MipMaps[mipLevel].Faces[face]; ktxMipFace.Data.CopyTo(result, (int)start); start += ktxMipFace.SizeInBytes; } @@ -207,16 +207,16 @@ public KtxKeyValuePair(string key, byte[] value) public uint GetSizeWithPadding() { - int keySpanLength = UTF8.GetByteCount(Key); - uint totalSize = (uint)(keySpanLength + 1 + Value.Length); - int paddingBytes = (int)(3 - ((totalSize + 3) % 4)); + var keySpanLength = UTF8.GetByteCount(Key); + var totalSize = (uint)(keySpanLength + 1 + Value.Length); + var paddingBytes = (int)(3 - (totalSize + 3) % 4); return (uint)(totalSize + paddingBytes); } public static KtxKeyValuePair ReadKeyValuePair(BinaryReader br, out int bytesRead) { - uint totalSize = br.ReadUInt32(); + var totalSize = br.ReadUInt32(); Span keyValueBytes = stackalloc byte[(int)totalSize]; br.Read(keyValueBytes); @@ -236,15 +236,15 @@ public static KtxKeyValuePair ReadKeyValuePair(BinaryReader br, out int bytesRea } - int keySize = i; - string key = UTF8.GetString(keyValueBytes.Slice(0, keySize)); + var keySize = i; + var key = UTF8.GetString(keyValueBytes.Slice(0, keySize)); - int valueSize = (int)(totalSize - keySize - 1); - Span valueBytes = keyValueBytes.Slice(i + 1, valueSize); - byte[] value = new byte[valueSize]; + var valueSize = (int)(totalSize - keySize - 1); + var valueBytes = keyValueBytes.Slice(i + 1, valueSize); + var value = new byte[valueSize]; valueBytes.CopyTo(value); - int paddingBytes = (int)(3 - ((totalSize + 3) % 4)); + var paddingBytes = (int)(3 - (totalSize + 3) % 4); br.SkipPadding(paddingBytes); bytesRead = (int)(totalSize + paddingBytes + sizeof(uint)); @@ -253,12 +253,12 @@ public static KtxKeyValuePair ReadKeyValuePair(BinaryReader br, out int bytesRea public static uint WriteKeyValuePair(BinaryWriter bw, KtxKeyValuePair pair) { - int keySpanLength = UTF8.GetByteCount(pair.Key); + var keySpanLength = UTF8.GetByteCount(pair.Key); Span keySpan = stackalloc byte[keySpanLength]; Span valueSpan = pair.Value; - uint totalSize = (uint)(keySpan.Length + 1 + valueSpan.Length); - int paddingBytes = (int)(3 - ((totalSize + 3) % 4)); + var totalSize = (uint)(keySpan.Length + 1 + valueSpan.Length); + var paddingBytes = (int)(3 - (totalSize + 3) % 4); bw.Write(totalSize); bw.Write(keySpan); @@ -274,11 +274,11 @@ public unsafe struct KtxHeader { public fixed byte Identifier[12]; public uint Endianness; - public GLType GlType; + public GlType GlType; public uint GlTypeSize; - public GLFormat GlFormat; + public GlFormat GlFormat; public GlInternalFormat GlInternalFormat; - public GLFormat GlBaseInternalFormat; + public GlFormat GlBaseInternalFormat; public uint PixelWidth; public uint PixelHeight; @@ -291,18 +291,18 @@ public unsafe struct KtxHeader public bool VerifyHeader() { Span id = stackalloc byte[] { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A }; - for (int i = 0; i < id.Length; i++) + for (var i = 0; i < id.Length; i++) { if (Identifier[i] != id[i]) return false; } return true; } - public static KtxHeader InitializeCompressed(int width, int height, GlInternalFormat internalFormat, GLFormat baseInternalFormat) + public static KtxHeader InitializeCompressed(int width, int height, GlInternalFormat internalFormat, GlFormat baseInternalFormat) { - KtxHeader header = new KtxHeader(); + var header = new KtxHeader(); Span id = stackalloc byte[] { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A }; - for (int i = 0; i < id.Length; i++) + for (var i = 0; i < id.Length; i++) { header.Identifier[i] = id[i]; } @@ -318,11 +318,11 @@ public static KtxHeader InitializeCompressed(int width, int height, GlInternalFo return header; } - public static KtxHeader InitializeUncompressed(int width, int height, GLType type, GLFormat format, uint glTypeSize, GlInternalFormat internalFormat, GLFormat baseInternalFormat) + public static KtxHeader InitializeUncompressed(int width, int height, GlType type, GlFormat format, uint glTypeSize, GlInternalFormat internalFormat, GlFormat baseInternalFormat) { - KtxHeader header = new KtxHeader(); + var header = new KtxHeader(); Span id = stackalloc byte[] { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A }; - for (int i = 0; i < id.Length; i++) + for (var i = 0; i < id.Length; i++) { header.Identifier[i] = id[i]; } diff --git a/BCnEnc.Net/Shared/LinearClustering.cs b/BCnEnc.Net/Shared/LinearClustering.cs index 5df2b97..53c9b6e 100644 --- a/BCnEnc.Net/Shared/LinearClustering.cs +++ b/BCnEnc.Net/Shared/LinearClustering.cs @@ -65,25 +65,25 @@ public ClusterCenter(LabXy labxy) public readonly float Distance(LabXy other, float m, float s) { - float dLab = MathF.Sqrt( + var dLab = MathF.Sqrt( MathF.Pow(l - other.l, 2) + MathF.Pow(a - other.a, 2) + MathF.Pow(b - other.b, 2)); - float dXy = MathF.Sqrt( + var dXy = MathF.Sqrt( MathF.Pow(x - other.x, 2) + MathF.Pow(y - other.y, 2)); - return dLab + (m / s) * dXy; + return dLab + m / s * dXy; } public readonly float Distance(ClusterCenter other, float m, float s) { - float dLab = MathF.Sqrt( + var dLab = MathF.Sqrt( (l - other.l) * (l - other.l) + (a - other.a) * (a - other.a) + (b - other.b) * (b - other.b)); - float dXy = MathF.Sqrt( + var dXy = MathF.Sqrt( (x - other.x) * (x - other.x) + (y - other.y) * (y - other.y)); return dLab + m / s * dXy; @@ -131,19 +131,19 @@ public static int[] ClusterPixels(ReadOnlySpan pixels, int width, int he } //Grid interval S - float S = MathF.Sqrt(pixels.Length / (float)clusters); - int[] clusterIndices = new int[pixels.Length]; + var s = MathF.Sqrt(pixels.Length / (float)clusters); + var clusterIndices = new int[pixels.Length]; var labXys = ConvertToLabXy(pixels, width, height); - Span clusterCenters = InitialClusterCenters(width, height, clusters, S, labXys); + Span clusterCenters = InitialClusterCenters(width, height, clusters, s, labXys); Span previousCenters = new ClusterCenter[clusters]; - float Error = 999; + float error = 999; const float threshold = 0.1f; - int iter = 0; - while (Error > threshold) + var iter = 0; + while (error > threshold) { if (maxIterations > 0 && iter >= maxIterations) { @@ -156,18 +156,18 @@ public static int[] ClusterPixels(ReadOnlySpan pixels, int width, int he Array.Fill(clusterIndices, -1); // Find closest cluster for pixels - for (int j = 0; j < clusters; j++) + for (var j = 0; j < clusters; j++) { - int xL = Math.Max(0, (int)(clusterCenters[j].x - S)); - int xH = Math.Min(width, (int)(clusterCenters[j].x + S)); - int yL = Math.Max(0, (int)(clusterCenters[j].y - S)); - int yH = Math.Min(height, (int)(clusterCenters[j].y + S)); + var xL = Math.Max(0, (int)(clusterCenters[j].x - s)); + var xH = Math.Min(width, (int)(clusterCenters[j].x + s)); + var yL = Math.Max(0, (int)(clusterCenters[j].y - s)); + var yH = Math.Min(height, (int)(clusterCenters[j].y + s)); - for (int x = xL; x < xH; x++) + for (var x = xL; x < xH; x++) { - for (int y = yL; y < yH; y++) + for (var y = yL; y < yH; y++) { - int i = x + y * width; + var i = x + y * width; if (clusterIndices[i] == -1) { @@ -175,8 +175,8 @@ public static int[] ClusterPixels(ReadOnlySpan pixels, int width, int he } else { - float prevDistance = clusterCenters[clusterIndices[i]].Distance(labXys[i], m, S); - float distance = clusterCenters[j].Distance(labXys[i], m, S); + var prevDistance = clusterCenters[clusterIndices[i]].Distance(labXys[i], m, s); + var distance = clusterCenters[j].Distance(labXys[i], m, s); if (distance < prevDistance) { clusterIndices[i] = j; @@ -186,7 +186,7 @@ public static int[] ClusterPixels(ReadOnlySpan pixels, int width, int he } } - Error = RecalculateCenters(clusters, m, labXys, clusterIndices, previousCenters, S, ref clusterCenters); + error = RecalculateCenters(clusters, m, labXys, clusterIndices, previousCenters, s, ref clusterCenters); } if (enforceConnectivity) { @@ -197,20 +197,20 @@ public static int[] ClusterPixels(ReadOnlySpan pixels, int width, int he } private static float RecalculateCenters(int clusters, float m, LabXy[] labXys, int[] clusterIndices, - Span previousCenters, float S, ref Span clusterCenters) + Span previousCenters, float s, ref Span clusterCenters) { clusterCenters.Clear(); - for (int i = 0; i < labXys.Length; i++) + for (var i = 0; i < labXys.Length; i++) { - int clusterIndex = clusterIndices[i]; + var clusterIndex = clusterIndices[i]; // Sometimes a pixel is out of the range of any cluster, // in that case, find the nearest cluster and add it to it if (clusterIndex == -1) { - int bestCluster = 0; - float bestDistance = previousCenters[0].Distance(labXys[i], m, S); - for (int j = 1; j < clusters; j++) { - float dist = previousCenters[j].Distance(labXys[i], m, S); + var bestCluster = 0; + var bestDistance = previousCenters[0].Distance(labXys[i], m, s); + for (var j = 1; j < clusters; j++) { + var dist = previousCenters[j].Distance(labXys[i], m, s); if (dist < bestDistance) { bestDistance = dist; bestCluster = j; @@ -225,12 +225,12 @@ private static float RecalculateCenters(int clusters, float m, LabXy[] labXys, i } float error = 0; - for (int i = 0; i < clusters; i++) + for (var i = 0; i < clusters; i++) { if (clusterCenters[i].count > 0) { clusterCenters[i] /= clusterCenters[i].count; - error += clusterCenters[i].Distance(previousCenters[i], m, S); + error += clusterCenters[i].Distance(previousCenters[i], m, s); } } @@ -238,52 +238,52 @@ private static float RecalculateCenters(int clusters, float m, LabXy[] labXys, i return error; } - private static ClusterCenter[] InitialClusterCenters(int width, int height, int clusters, float S, LabXy[] labXys) + private static ClusterCenter[] InitialClusterCenters(int width, int height, int clusters, float s, LabXy[] labXys) { - ClusterCenter[] clusterCenters = new ClusterCenter[clusters]; + var clusterCenters = new ClusterCenter[clusters]; if (clusters == 2) { - int x0 = (int)MathF.Floor(width * 0.333f); - int y0 = (int)MathF.Floor(height * 0.333f); + var x0 = (int)MathF.Floor(width * 0.333f); + var y0 = (int)MathF.Floor(height * 0.333f); - int x1 = (int)MathF.Floor(width * 0.666f); - int y1 = (int)MathF.Floor(height * 0.666f); + var x1 = (int)MathF.Floor(width * 0.666f); + var y1 = (int)MathF.Floor(height * 0.666f); - int i0 = x0 + y0 * width; + var i0 = x0 + y0 * width; clusterCenters[0] = new ClusterCenter(labXys[i0]); - int i1 = x1 + y1 * width; + var i1 = x1 + y1 * width; clusterCenters[1] = new ClusterCenter(labXys[i1]); }else if(clusters == 3) { - int x0 = (int)MathF.Floor(width * 0.333f); - int y0 = (int)MathF.Floor(height * 0.333f); - int i0 = x0 + y0 * width; + var x0 = (int)MathF.Floor(width * 0.333f); + var y0 = (int)MathF.Floor(height * 0.333f); + var i0 = x0 + y0 * width; clusterCenters[0] = new ClusterCenter(labXys[i0]); - int x1 = (int)MathF.Floor(width * 0.666f); - int y1 = (int)MathF.Floor(height * 0.333f); - int i1 = x1 + y1 * width; + var x1 = (int)MathF.Floor(width * 0.666f); + var y1 = (int)MathF.Floor(height * 0.333f); + var i1 = x1 + y1 * width; clusterCenters[1] = new ClusterCenter(labXys[i1]); - int x2 = (int)MathF.Floor(width * 0.5f); - int y2 = (int)MathF.Floor(height * 0.666f); - int i2 = x2 + y2 * width; + var x2 = (int)MathF.Floor(width * 0.5f); + var y2 = (int)MathF.Floor(height * 0.666f); + var i2 = x2 + y2 * width; clusterCenters[2] = new ClusterCenter(labXys[i2]); } else { - int cIdx = 0; + var cIdx = 0; //Choose initial centers - for (float x = S / 2; x < width; x += S) + for (var x = s / 2; x < width; x += s) { - for (float y = S / 2; y < height; y += S) + for (var y = s / 2; y < height; y += s) { if (cIdx >= clusterCenters.Length) { break; } - int i = (int)x + (int)y * width; + var i = (int)x + (int)y * width; clusterCenters[cIdx] = new ClusterCenter(labXys[i]); cIdx++; } @@ -294,13 +294,13 @@ private static ClusterCenter[] InitialClusterCenters(int width, int height, int private static LabXy[] ConvertToLabXy(ReadOnlySpan pixels, int width, int height) { - LabXy[] labXys = new LabXy[pixels.Length]; + var labXys = new LabXy[pixels.Length]; //Convert pixels to LabXy - for (int x = 0; x < width; x++) + for (var x = 0; x < width; x++) { - for (int y = 0; y < height; y++) + for (var y = 0; y < height; y++) { - int i = x + y * width; + var i = x + y * width; var lab = new ColorLab(pixels[i]); labXys[i] = new LabXy() { @@ -321,23 +321,23 @@ private static int[] EnforceConnectivity(int[] oldLabels, int width, int height, ReadOnlySpan neighborX = new[] { -1, 0, 1, 0 }; ReadOnlySpan neighborY = new[] { 0, -1, 0, 1 }; - int sSquared = (width * height) / clusters; + var sSquared = width * height / clusters; - List clusterX = new List(sSquared); - List clusterY = new List(sSquared); + var clusterX = new List(sSquared); + var clusterY = new List(sSquared); - int adjacentLabel = 0; - int[] newLabels = new int[oldLabels.Length]; - bool[] usedLabels = new bool[clusters]; + var adjacentLabel = 0; + var newLabels = new int[oldLabels.Length]; + var usedLabels = new bool[clusters]; Array.Fill(newLabels, -1); - for (int y = 0; y < height; ++y) + for (var y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) + for (var x = 0; x < width; ++x) { - int xyIndex = x + y * width; + var xyIndex = x + y * width; if (newLabels[xyIndex] < 0) { - int label = oldLabels[xyIndex]; + var label = oldLabels[xyIndex]; newLabels[xyIndex] = label; //New cluster @@ -345,11 +345,11 @@ private static int[] EnforceConnectivity(int[] oldLabels, int width, int height, clusterY.Add(y); //Search neighbors for already completed clusters - for (int i = 0; i < neighborX.Length; ++i) + for (var i = 0; i < neighborX.Length; ++i) { - int nX = x + neighborX[i]; - int nY = y + neighborY[i]; - int nI = nX + nY * width; + var nX = x + neighborX[i]; + var nY = y + neighborY[i]; + var nI = nX + nY * width; if (nX < width && nX >= 0 && nY < height && nY >= 0) { if (newLabels[nI] >= 0) @@ -361,13 +361,13 @@ private static int[] EnforceConnectivity(int[] oldLabels, int width, int height, } //Count pixels in this cluster - for (int c = 0; c < clusterX.Count; ++c) + for (var c = 0; c < clusterX.Count; ++c) { - for (int i = 0; i < neighborX.Length; ++i) + for (var i = 0; i < neighborX.Length; ++i) { - int nX = clusterX[c] + neighborX[i]; - int nY = clusterY[c] + neighborY[i]; - int nI = nX + nY * width; + var nX = clusterX[c] + neighborX[i]; + var nY = clusterY[c] + neighborY[i]; + var nI = nX + nY * width; if (nX < width && nX >= 0 && nY < height && nY >= 0) { if (newLabels[nI] == -1 && label == oldLabels[nI]) @@ -382,11 +382,11 @@ private static int[] EnforceConnectivity(int[] oldLabels, int width, int height, // If this is unusually small cluster or this label is already used, // merge with adjacent cluster - if (clusterX.Count < (sSquared / 4) || usedLabels[label]) + if (clusterX.Count < sSquared / 4 || usedLabels[label]) { - for (int i = 0; i < clusterX.Count; ++i) + for (var i = 0; i < clusterX.Count; ++i) { - newLabels[(clusterY[i] * width + clusterX[i])] = adjacentLabel; + newLabels[clusterY[i] * width + clusterX[i]] = adjacentLabel; } } else { diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index 23329e2..65e3919 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -18,8 +18,8 @@ public static uint CalculateMipChainLength(int width, int height, uint maxNumMip } uint output = 0; for (uint mipLevel = 1; mipLevel < maxNumMipMaps; mipLevel++) { - int mipWidth = Math.Max(1, width / (int)(Math.Pow(2, mipLevel))); - int mipHeight = Math.Max(1, height / (int)(Math.Pow(2, mipLevel))); + var mipWidth = Math.Max(1, width / (int)Math.Pow(2, mipLevel)); + var mipHeight = Math.Max(1, height / (int)Math.Pow(2, mipLevel)); if (mipWidth == 1 && mipHeight == 1) { output = mipLevel + 1; break; @@ -29,7 +29,7 @@ public static uint CalculateMipChainLength(int width, int height, uint maxNumMip } public static List> GenerateMipChain(Image sourceImage, ref uint numMipMaps) { - List> result = new List>(); + var result = new List>(); result.Add(sourceImage.Clone()); if (numMipMaps == 1) { @@ -41,8 +41,8 @@ public static List> GenerateMipChain(Image sourceImage, re } for (uint mipLevel = 1; mipLevel < numMipMaps; mipLevel++) { - int mipWidth = Math.Max(1, sourceImage.Width / (int)(Math.Pow(2, mipLevel))); - int mipHeight = Math.Max(1, sourceImage.Height / (int)(Math.Pow(2, mipLevel))); + var mipWidth = Math.Max(1, sourceImage.Width / (int)Math.Pow(2, mipLevel)); + var mipHeight = Math.Max(1, sourceImage.Height / (int)Math.Pow(2, mipLevel)); var newImage = sourceImage.Clone(x => x.Resize(mipWidth, mipHeight)); result.Add(newImage); diff --git a/BCnEnc.Net/Shared/OutputFileFormat.cs b/BCnEnc.Net/Shared/OutputFileFormat.cs index 157974f..cc63b8d 100644 --- a/BCnEnc.Net/Shared/OutputFileFormat.cs +++ b/BCnEnc.Net/Shared/OutputFileFormat.cs @@ -3,11 +3,11 @@ public enum OutputFileFormat { /// - /// Khronos texture format https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/ + /// Khronos texture Format https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/ /// Ktx, /// - /// Direct draw surface format https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dx-graphics-dds + /// Direct draw surface Format https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dx-graphics-dds /// Dds } diff --git a/BCnEnc.Net/Shared/PcaVectors.cs b/BCnEnc.Net/Shared/PcaVectors.cs index 999e5c8..cd735f3 100644 --- a/BCnEnc.Net/Shared/PcaVectors.cs +++ b/BCnEnc.Net/Shared/PcaVectors.cs @@ -8,12 +8,12 @@ namespace BCnEncoder.Shared { internal static class PcaVectors { - private const int c565_5_mask = 0xF8; - private const int c565_6_mask = 0xFC; + private const int C5655Mask_ = 0xF8; + private const int C5656Mask_ = 0xFC; private static void ConvertToVector4(ReadOnlySpan colors, Span vectors) { - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { vectors[i].X += colors[i].R / 255f; vectors[i].Y += colors[i].G / 255f; @@ -30,7 +30,7 @@ private static Vector4 CalculateMean(Span colors) float b = 0; float a = 0; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { r += colors[i].X; g += colors[i].Y; @@ -48,15 +48,15 @@ private static Vector4 CalculateMean(Span colors) internal static Matrix4x4 CalculateCovariance(Span values, out Vector4 mean) { mean = CalculateMean(values); - for (int i = 0; i < values.Length; i++) + for (var i = 0; i < values.Length; i++) { values[i] -= mean; } //4x4 matrix - Matrix4x4 mat = new Matrix4x4(); + var mat = new Matrix4x4(); - for (int i = 0; i < values.Length; i++) + for (var i = 0; i < values.Length; i++) { mat.M11 += values[i].X * values[i].X; mat.M12 += values[i].X * values[i].Y; @@ -91,9 +91,9 @@ internal static Matrix4x4 CalculateCovariance(Span values, out Vector4 /// /// internal static Vector4 CalculatePrincipalAxis(Matrix4x4 covarianceMatrix) { - Vector4 lastDa = Vector4.UnitY; + var lastDa = Vector4.UnitY; - for (int i = 0; i < 30; i++) { + for (var i = 0; i < 30; i++) { var dA = Vector4.Transform(lastDa, covarianceMatrix); if(dA.LengthSquared() == 0) { @@ -118,7 +118,7 @@ public static void Create(Span colors, out Vector3 mean, out Vector3 pri ConvertToVector4(colors, vectors); - var cov = CalculateCovariance(vectors, out Vector4 v4Mean); + var cov = CalculateCovariance(vectors, out var v4Mean); mean = new Vector3(v4Mean.X, v4Mean.Y, v4Mean.Z); var pa = CalculatePrincipalAxis(cov); @@ -149,7 +149,7 @@ public static void GetExtremePoints(Span colors, Vector3 mean, Vector3 p float minD = 0; float maxD = 0; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { var colorVec = new Vector3(colors[i].R / 255f, colors[i].G / 255f, colors[i].B / 255f); @@ -159,24 +159,24 @@ public static void GetExtremePoints(Span colors, Vector3 mean, Vector3 p if (d > maxD) maxD = d; } - Vector3 minVec = mean + (principalAxis * minD); - Vector3 maxVec = mean + (principalAxis * maxD); + var minVec = mean + principalAxis * minD; + var maxVec = mean + principalAxis * maxD; - int minR = (int) (minVec.X * 255); - int minG = (int) (minVec.Y * 255); - int minB = (int) (minVec.Z * 255); + var minR = (int) (minVec.X * 255); + var minG = (int) (minVec.Y * 255); + var minB = (int) (minVec.Z * 255); - int maxR = (int) (maxVec.X * 255); - int maxG = (int) (maxVec.Y * 255); - int maxB = (int) (maxVec.Z * 255); + var maxR = (int) (maxVec.X * 255); + var maxG = (int) (maxVec.Y * 255); + var maxB = (int) (maxVec.Z * 255); - minR = (minR >= 0) ? minR : 0; - minG = (minG >= 0) ? minG : 0; - minB = (minB >= 0) ? minB : 0; + minR = minR >= 0 ? minR : 0; + minG = minG >= 0 ? minG : 0; + minB = minB >= 0 ? minB : 0; - maxR = (maxR <= 255) ? maxR : 255; - maxG = (maxG <= 255) ? maxG : 255; - maxB = (maxB <= 255) ? maxB : 255; + maxR = maxR <= 255 ? maxR : 255; + maxG = maxG <= 255 ? maxG : 255; + maxB = maxB <= 255 ? maxB : 255; min = new ColorRgb24((byte)minR, (byte)minG, (byte)minB); max = new ColorRgb24((byte)maxR, (byte)maxG, (byte)maxB); @@ -189,7 +189,7 @@ public static void GetMinMaxColor565(Span colors, Vector3 mean, Vector3 float minD = 0; float maxD = 0; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { var colorVec = new Vector3(colors[i].R / 255f, colors[i].G / 255f, colors[i].B / 255f); @@ -203,33 +203,33 @@ public static void GetMinMaxColor565(Span colors, Vector3 mean, Vector3 minD *= 15 / 16f; maxD *= 15 / 16f; - Vector3 minVec = mean + (principalAxis * minD); - Vector3 maxVec = mean + (principalAxis * maxD); + var minVec = mean + principalAxis * minD; + var maxVec = mean + principalAxis * maxD; - int minR = (int) (minVec.X * 255); - int minG = (int) (minVec.Y * 255); - int minB = (int) (minVec.Z * 255); + var minR = (int) (minVec.X * 255); + var minG = (int) (minVec.Y * 255); + var minB = (int) (minVec.Z * 255); - int maxR = (int) (maxVec.X * 255); - int maxG = (int) (maxVec.Y * 255); - int maxB = (int) (maxVec.Z * 255); + var maxR = (int) (maxVec.X * 255); + var maxG = (int) (maxVec.Y * 255); + var maxB = (int) (maxVec.Z * 255); - minR = (minR >= 0) ? minR : 0; - minG = (minG >= 0) ? minG : 0; - minB = (minB >= 0) ? minB : 0; + minR = minR >= 0 ? minR : 0; + minG = minG >= 0 ? minG : 0; + minB = minB >= 0 ? minB : 0; - maxR = (maxR <= 255) ? maxR : 255; - maxG = (maxG <= 255) ? maxG : 255; - maxB = (maxB <= 255) ? maxB : 255; + maxR = maxR <= 255 ? maxR : 255; + maxG = maxG <= 255 ? maxG : 255; + maxB = maxB <= 255 ? maxB : 255; // Optimal round - minR = (minR & c565_5_mask) | (minR >> 5); - minG = (minG & c565_6_mask) | (minG >> 6); - minB = (minB & c565_5_mask) | (minB >> 5); + minR = (minR & C5655Mask_) | (minR >> 5); + minG = (minG & C5656Mask_) | (minG >> 6); + minB = (minB & C5655Mask_) | (minB >> 5); - maxR = (maxR & c565_5_mask) | (maxR >> 5); - maxG = (maxG & c565_6_mask) | (maxG >> 6); - maxB = (maxB & c565_5_mask) | (maxB >> 5); + maxR = (maxR & C5655Mask_) | (maxR >> 5); + maxG = (maxG & C5656Mask_) | (maxG >> 6); + maxB = (maxB & C5655Mask_) | (maxB >> 5); min = new ColorRgb565((byte)minR, (byte)minG, (byte)minB); max = new ColorRgb565((byte)maxR, (byte)maxG, (byte)maxB); @@ -243,7 +243,7 @@ public static void GetExtremePointsWithAlpha(Span colors, Vector4 mean, float minD = 0; float maxD = 0; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { var colorVec = new Vector4(colors[i].R / 255f, colors[i].G / 255f, colors[i].B / 255f, colors[i].A / 255f); @@ -253,16 +253,16 @@ public static void GetExtremePointsWithAlpha(Span colors, Vector4 mean, if (d > maxD) maxD = d; } - min = mean + (principalAxis * minD); - max = mean + (principalAxis * maxD); + min = mean + principalAxis * minD; + max = mean + principalAxis * maxD; } public static void GetOptimizedEndpoints565(Span colors, Vector3 mean, Vector3 principalAxis, out ColorRgb565 min, out ColorRgb565 max, float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f) { - int length = colors.Length; - Vector3[] vectorColors = new Vector3[length]; - for (int i = 0; i < colors.Length; i++) + var length = colors.Length; + var vectorColors = new Vector3[length]; + for (var i = 0; i < colors.Length; i++) { vectorColors[i] = new Vector3(colors[i].R / 255f, colors[i].G / 255f, colors[i].B / 255f); } @@ -289,12 +289,12 @@ float Distance(Vector3 v, Vector3 p) ; } - float selectClosestDistance(Vector3 selector, Vector3 f0, Vector3 f1, Vector3 f2, Vector3 f3) + float SelectClosestDistance(Vector3 selector, Vector3 f0, Vector3 f1, Vector3 f2, Vector3 f3) { - float d0 = Distance(selector, f0); - float d1 = Distance(selector, f1); - float d2 = Distance(selector, f2); - float d3 = Distance(selector, f3); + var d0 = Distance(selector, f0); + var d1 = Distance(selector, f1); + var d2 = Distance(selector, f2); + var d3 = Distance(selector, f3); if (d0 < d1 && d0 < d2 && d0 < d3) return d0; if (d1 < d0 && d1 < d2 && d1 < d3) return d1; @@ -305,42 +305,42 @@ float selectClosestDistance(Vector3 selector, Vector3 f0, Vector3 f1, Vector3 f2 Vector3 endPoint0; Vector3 endPoint1; - double calculateError() + double CalculateError() { double cumulativeError = 0; - Vector3 ep0 = new Vector3(endPoint0.X / 31, endPoint0.Y / 63, endPoint0.Z / 31); - Vector3 ep1 = new Vector3(endPoint1.X / 31, endPoint1.Y / 63, endPoint1.Z / 31); - Vector3 ep2 = ep0 + ((ep1 - ep0) * 1 / 3f); - Vector3 ep3 = ep0 + ((ep1 - ep0) * 2 / 3f); + var ep0 = new Vector3(endPoint0.X / 31, endPoint0.Y / 63, endPoint0.Z / 31); + var ep1 = new Vector3(endPoint1.X / 31, endPoint1.Y / 63, endPoint1.Z / 31); + var ep2 = ep0 + (ep1 - ep0) * 1 / 3f; + var ep3 = ep0 + (ep1 - ep0) * 2 / 3f; - for (int i = 0; i < length; i++) + for (var i = 0; i < length; i++) { - double distance = selectClosestDistance(vectorColors[i], ep0, ep1, ep2, ep3); + double distance = SelectClosestDistance(vectorColors[i], ep0, ep1, ep2, ep3); cumulativeError += distance; } return cumulativeError; } - for (int i = 0; i < vectorColors.Length; i++) + for (var i = 0; i < vectorColors.Length; i++) { - float d = ProjectPointOnLine(vectorColors[i], mean, principalAxis); + var d = ProjectPointOnLine(vectorColors[i], mean, principalAxis); if (d < minD) minD = d; if (d > maxD) maxD = d; } - endPoint0 = mean + (principalAxis * minD); - endPoint1 = mean + (principalAxis * maxD); + endPoint0 = mean + principalAxis * minD; + endPoint1 = mean + principalAxis * maxD; endPoint0 = new Vector3(MathF.Round(endPoint0.X * 31), MathF.Round(endPoint0.Y * 63), MathF.Round(endPoint0.Z * 31)); endPoint1 = new Vector3(MathF.Round(endPoint1.X * 31), MathF.Round(endPoint1.Y * 63), MathF.Round(endPoint1.Z * 31)); endPoint0 = Clamp565(endPoint0); endPoint1 = Clamp565(endPoint1); - double best = calculateError(); - int increment = 5; - bool foundBetter = true; - int rounds = 0; + var best = CalculateError(); + var increment = 5; + var foundBetter = true; + var rounds = 0; // Variate color and look for better endpoints while (increment > 1 || foundBetter) { @@ -350,7 +350,7 @@ double calculateError() var prev = endPoint0; endPoint0 -= principalAxis * increment * 2; endPoint0 = Clamp565(endPoint0); - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -366,7 +366,7 @@ double calculateError() var prev = endPoint1; endPoint1 -= principalAxis * increment * 2; endPoint1 = Clamp565(endPoint1); - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -382,7 +382,7 @@ double calculateError() var prev = endPoint0; endPoint0 += principalAxis * increment * 2; endPoint0 = Clamp565(endPoint0); - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -398,7 +398,7 @@ double calculateError() var prev = endPoint1; endPoint1 += principalAxis * increment * 2; endPoint1 = Clamp565(endPoint1); - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -417,7 +417,7 @@ double calculateError() endPoint1 += principalAxis * increment * 2; endPoint0 = Clamp565(endPoint0); endPoint1 = Clamp565(endPoint1); - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -437,7 +437,7 @@ double calculateError() endPoint1 -= principalAxis * increment * 2; endPoint0 = Clamp565(endPoint0); endPoint1 = Clamp565(endPoint1); - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -453,9 +453,9 @@ double calculateError() #region G if (endPoint0.Y - increment >= 0) { // decrement ep0 G - float prevY = endPoint0.Y; + var prevY = endPoint0.Y; endPoint0.Y -= increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -469,9 +469,9 @@ double calculateError() if (endPoint1.Y - increment >= 0) { // decrement ep1 G - float prevY = endPoint1.Y; + var prevY = endPoint1.Y; endPoint1.Y -= increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -490,9 +490,9 @@ double calculateError() if (endPoint1.Y + increment <= 63) { // increment ep1 G - float prevY = endPoint1.Y; + var prevY = endPoint1.Y; endPoint1.Y += increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -506,9 +506,9 @@ double calculateError() if (endPoint0.Y + increment <= 63) { // increment ep0 G - float prevY = endPoint0.Y; + var prevY = endPoint0.Y; endPoint0.Y += increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -525,9 +525,9 @@ double calculateError() #region R if (endPoint0.X - increment >= 0) { // decrement ep0 R - float prevX = endPoint0.X; + var prevX = endPoint0.X; endPoint0.X -= increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -541,9 +541,9 @@ double calculateError() if (endPoint1.X - increment >= 0) { // decrement ep1 R - float prevX = endPoint1.X; + var prevX = endPoint1.X; endPoint1.X -= increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -562,9 +562,9 @@ double calculateError() if (endPoint1.X + increment <= 31) { // increment ep1 R - float prevX = endPoint1.X; + var prevX = endPoint1.X; endPoint1.X += increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -578,9 +578,9 @@ double calculateError() if (endPoint0.X + increment <= 31) { // increment ep0 R - float prevX = endPoint0.X; + var prevX = endPoint0.X; endPoint0.X += increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -597,9 +597,9 @@ double calculateError() if (endPoint0.Z - increment >= 0) { // decrement ep0 B - float prevZ = endPoint0.Z; + var prevZ = endPoint0.Z; endPoint0.Z -= increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -613,9 +613,9 @@ double calculateError() if (endPoint1.Z - increment >= 0) { // decrement ep1 B - float prevZ = endPoint1.Z; + var prevZ = endPoint1.Z; endPoint1.Z -= increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -634,9 +634,9 @@ double calculateError() if (endPoint1.Z + increment <= 31) { // increment ep1 B - float prevZ = endPoint1.Z; + var prevZ = endPoint1.Z; endPoint1.Z += increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; @@ -650,9 +650,9 @@ double calculateError() if (endPoint0.Z + increment <= 31) { // increment ep0 B - float prevZ = endPoint0.Z; + var prevZ = endPoint0.Z; endPoint0.Z += increment; - double error = calculateError(); + var error = CalculateError(); if (error < best) { foundBetter = true; diff --git a/BCnEnc.Net/Shared/RawBlocks.cs b/BCnEnc.Net/Shared/RawBlocks.cs index 551e330..decaecc 100644 --- a/BCnEnc.Net/Shared/RawBlocks.cs +++ b/BCnEnc.Net/Shared/RawBlocks.cs @@ -26,7 +26,7 @@ public int CalculateError(RawBlock4X4Rgba32 other, bool useAlpha = false) { float error = 0; var pix1 = AsSpan; var pix2 = other.AsSpan; - for (int i = 0; i < pix1.Length; i++) { + for (var i = 0; i < pix1.Length; i++) { var col1 = pix1[i]; var col2 = pix2[i]; @@ -56,7 +56,7 @@ public float CalculateYCbCrError(RawBlock4X4Rgba32 other) { float crError = 0; var pix1 = AsSpan; var pix2 = other.AsSpan; - for (int i = 0; i < pix1.Length; i++) { + for (var i = 0; i < pix1.Length; i++) { var col1 = new ColorYCbCr(pix1[i]); var col2 = new ColorYCbCr(pix2[i]); @@ -81,7 +81,7 @@ public float CalculateYCbCrAlphaError(RawBlock4X4Rgba32 other, float yMultiplier float alphaError = 0; var pix1 = AsSpan; var pix2 = other.AsSpan; - for (int i = 0; i < pix1.Length; i++) { + for (var i = 0; i < pix1.Length; i++) { var col1 = new ColorYCbCrAlpha(pix1[i]); var col2 = new ColorYCbCrAlpha(pix2[i]); @@ -101,10 +101,10 @@ public float CalculateYCbCrAlphaError(RawBlock4X4Rgba32 other, float yMultiplier } public RawBlock4X4Ycbcr ToRawBlockYcbcr() { - RawBlock4X4Ycbcr rawYcbcr = new RawBlock4X4Ycbcr(); + var rawYcbcr = new RawBlock4X4Ycbcr(); var pixels = AsSpan; var ycbcrPs = rawYcbcr.AsSpan; - for (int i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) { ycbcrPs[i] = new ColorYCbCr(pixels[i]); } return rawYcbcr; @@ -112,7 +112,7 @@ public RawBlock4X4Ycbcr ToRawBlockYcbcr() { public bool HasTransparentPixels() { var pixels = AsSpan; - for (int i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) { if (pixels[i].A < 255) return true; } return false; @@ -138,7 +138,7 @@ public float CalculateError(RawBlock4X4Rgba32 other) { float crError = 0; var pix1 = AsSpan; var pix2 = other.AsSpan; - for (int i = 0; i < pix1.Length; i++) { + for (var i = 0; i < pix1.Length; i++) { var col1 = pix1[i]; var col2 = new ColorYCbCr(pix2[i]); diff --git a/BCnEnc.Net/Shared/RgbBoundingBox.cs b/BCnEnc.Net/Shared/RgbBoundingBox.cs index 3e72628..a1743b5 100644 --- a/BCnEnc.Net/Shared/RgbBoundingBox.cs +++ b/BCnEnc.Net/Shared/RgbBoundingBox.cs @@ -14,8 +14,8 @@ internal static class RgbBoundingBox public static void Create565(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max) { const int colorInsetShift = 4; - const int c565_5_mask = 0xF8; - const int c565_6_mask = 0xFC; + const int c5655Mask = 0xF8; + const int c5656Mask = 0xFC; int minR = 255, minG = 255, @@ -24,7 +24,7 @@ public static void Create565(ReadOnlySpan colors, out ColorRgb565 min, o maxG = 0, maxB = 0; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { var c = colors[i]; @@ -37,9 +37,9 @@ public static void Create565(ReadOnlySpan colors, out ColorRgb565 min, o if (c.B > maxB) maxB = c.B; } - int insetR = (maxR - minR) >> colorInsetShift; - int insetG = (maxG - minG) >> colorInsetShift; - int insetB = (maxB - minB) >> colorInsetShift; + var insetR = (maxR - minR) >> colorInsetShift; + var insetG = (maxG - minG) >> colorInsetShift; + var insetB = (maxB - minB) >> colorInsetShift; // Inset by 1/16th minR = ((minR << colorInsetShift) + insetR) >> colorInsetShift; @@ -50,22 +50,22 @@ public static void Create565(ReadOnlySpan colors, out ColorRgb565 min, o maxG = ((maxG << colorInsetShift) - insetG) >> colorInsetShift; maxB = ((maxB << colorInsetShift) - insetB) >> colorInsetShift; - minR = (minR >= 0) ? minR : 0; - minG = (minG >= 0) ? minG : 0; - minB = (minB >= 0) ? minB : 0; + minR = minR >= 0 ? minR : 0; + minG = minG >= 0 ? minG : 0; + minB = minB >= 0 ? minB : 0; - maxR = (maxR <= 255) ? maxR : 255; - maxG = (maxG <= 255) ? maxG : 255; - maxB = (maxB <= 255) ? maxB : 255; + maxR = maxR <= 255 ? maxR : 255; + maxG = maxG <= 255 ? maxG : 255; + maxB = maxB <= 255 ? maxB : 255; // Optimal rounding - minR = (minR & c565_5_mask) | (minR >> 5); - minG = (minG & c565_6_mask) | (minG >> 6); - minB = (minB & c565_5_mask) | (minB >> 5); + minR = (minR & c5655Mask) | (minR >> 5); + minG = (minG & c5656Mask) | (minG >> 6); + minB = (minB & c5655Mask) | (minB >> 5); - maxR = (maxR & c565_5_mask) | (maxR >> 5); - maxG = (maxG & c565_6_mask) | (maxG >> 6); - maxB = (maxB & c565_5_mask) | (maxB >> 5); + maxR = (maxR & c5655Mask) | (maxR >> 5); + maxG = (maxG & c5656Mask) | (maxG >> 6); + maxB = (maxB & c5655Mask) | (maxB >> 5); min = new ColorRgb565((byte)minR, (byte)minG, (byte)minB); max = new ColorRgb565((byte)maxR, (byte)maxG, (byte)maxB); @@ -74,8 +74,8 @@ public static void Create565(ReadOnlySpan colors, out ColorRgb565 min, o public static void Create565AlphaCutoff(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max, int alphaCutoff = 128) { const int colorInsetShift = 4; - const int c565_5_mask = 0xF8; - const int c565_6_mask = 0xFC; + const int c5655Mask = 0xF8; + const int c5656Mask = 0xFC; int minR = 255, minG = 255, @@ -84,7 +84,7 @@ public static void Create565AlphaCutoff(ReadOnlySpan colors, out ColorRg maxG = 0, maxB = 0; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { var c = colors[i]; if (c.A < alphaCutoff) continue; @@ -97,9 +97,9 @@ public static void Create565AlphaCutoff(ReadOnlySpan colors, out ColorRg if (c.B > maxB) maxB = c.B; } - int insetR = (maxR - minR) >> colorInsetShift; - int insetG = (maxG - minG) >> colorInsetShift; - int insetB = (maxB - minB) >> colorInsetShift; + var insetR = (maxR - minR) >> colorInsetShift; + var insetG = (maxG - minG) >> colorInsetShift; + var insetB = (maxB - minB) >> colorInsetShift; minR = ((minR << colorInsetShift) + insetR) >> colorInsetShift; minG = ((minG << colorInsetShift) + insetG) >> colorInsetShift; @@ -109,32 +109,32 @@ public static void Create565AlphaCutoff(ReadOnlySpan colors, out ColorRg maxG = ((maxG << colorInsetShift) - insetG) >> colorInsetShift; maxB = ((maxB << colorInsetShift) - insetB) >> colorInsetShift; - minR = (minR >= 0) ? minR : 0; - minG = (minG >= 0) ? minG : 0; - minB = (minB >= 0) ? minB : 0; + minR = minR >= 0 ? minR : 0; + minG = minG >= 0 ? minG : 0; + minB = minB >= 0 ? minB : 0; - maxR = (maxR <= 255) ? maxR : 255; - maxG = (maxG <= 255) ? maxG : 255; - maxB = (maxB <= 255) ? maxB : 255; + maxR = maxR <= 255 ? maxR : 255; + maxG = maxG <= 255 ? maxG : 255; + maxB = maxB <= 255 ? maxB : 255; - minR = (minR & c565_5_mask) | (minR >> 5); - minG = (minG & c565_6_mask) | (minG >> 6); - minB = (minB & c565_5_mask) | (minB >> 5); + minR = (minR & c5655Mask) | (minR >> 5); + minG = (minG & c5656Mask) | (minG >> 6); + minB = (minB & c5655Mask) | (minB >> 5); - maxR = (maxR & c565_5_mask) | (maxR >> 5); - maxG = (maxG & c565_6_mask) | (maxG >> 6); - maxB = (maxB & c565_5_mask) | (maxB >> 5); + maxR = (maxR & c5655Mask) | (maxR >> 5); + maxG = (maxG & c5656Mask) | (maxG >> 6); + maxB = (maxB & c5655Mask) | (maxB >> 5); min = new ColorRgb565((byte)minR, (byte)minG, (byte)minB); max = new ColorRgb565((byte)maxR, (byte)maxG, (byte)maxB); } - public static void Create565a(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max, out byte minAlpha, out byte maxAlpha) + public static void Create565A(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max, out byte minAlpha, out byte maxAlpha) { const int colorInsetShift = 4; const int alphaInsetShift = 5; - const int c565_5_mask = 0xF8; - const int c565_6_mask = 0xFC; + const int c5655Mask = 0xF8; + const int c5656Mask = 0xFC; int minR = 255, minG = 255, @@ -145,7 +145,7 @@ public static void Create565a(ReadOnlySpan colors, out ColorRgb565 min, maxB = 0, maxA = 0; - for (int i = 0; i < colors.Length; i++) + for (var i = 0; i < colors.Length; i++) { var c = colors[i]; if (c.R < minR) minR = c.R; @@ -160,10 +160,10 @@ public static void Create565a(ReadOnlySpan colors, out ColorRgb565 min, } - int insetR = (maxR - minR) >> colorInsetShift; - int insetG = (maxG - minG) >> colorInsetShift; - int insetB = (maxB - minB) >> colorInsetShift; - int insetA = (maxA - minA) >> alphaInsetShift; + var insetR = (maxR - minR) >> colorInsetShift; + var insetG = (maxG - minG) >> colorInsetShift; + var insetB = (maxB - minB) >> colorInsetShift; + var insetA = (maxA - minA) >> alphaInsetShift; minR = ((minR << colorInsetShift) + insetR) >> colorInsetShift; minG = ((minG << colorInsetShift) + insetG) >> colorInsetShift; @@ -175,23 +175,23 @@ public static void Create565a(ReadOnlySpan colors, out ColorRgb565 min, maxB = ((maxB << colorInsetShift) - insetB) >> colorInsetShift; maxA = ((maxA << alphaInsetShift) - insetA) >> alphaInsetShift; - minR = (minR >= 0) ? minR : 0; - minG = (minG >= 0) ? minG : 0; - minB = (minB >= 0) ? minB : 0; - minA = (minA >= 0) ? minA : 0; + minR = minR >= 0 ? minR : 0; + minG = minG >= 0 ? minG : 0; + minB = minB >= 0 ? minB : 0; + minA = minA >= 0 ? minA : 0; - maxR = (maxR <= 255) ? maxR : 255; - maxG = (maxG <= 255) ? maxG : 255; - maxB = (maxB <= 255) ? maxB : 255; - maxA = (maxA <= 255) ? maxA : 255; + maxR = maxR <= 255 ? maxR : 255; + maxG = maxG <= 255 ? maxG : 255; + maxB = maxB <= 255 ? maxB : 255; + maxA = maxA <= 255 ? maxA : 255; - minR = (minR & c565_5_mask) | (minR >> 5); - minG = (minG & c565_6_mask) | (minG >> 6); - minB = (minB & c565_5_mask) | (minB >> 5); + minR = (minR & c5655Mask) | (minR >> 5); + minG = (minG & c5656Mask) | (minG >> 6); + minB = (minB & c5655Mask) | (minB >> 5); - maxR = (maxR & c565_5_mask) | (maxR >> 5); - maxG = (maxG & c565_6_mask) | (maxG >> 6); - maxB = (maxB & c565_5_mask) | (maxB >> 5); + maxR = (maxR & c5655Mask) | (maxR >> 5); + maxG = (maxG & c5656Mask) | (maxG >> 6); + maxB = (maxB & c5655Mask) | (maxB >> 5); min = new ColorRgb565((byte)minR, (byte)minG, (byte)minB); max = new ColorRgb565((byte)maxR, (byte)maxG, (byte)maxB); diff --git a/BCnEncTests/Bc7BlockTests.cs b/BCnEncTests/Bc7BlockTests.cs index 8489102..d933884 100644 --- a/BCnEncTests/Bc7BlockTests.cs +++ b/BCnEncTests/Bc7BlockTests.cs @@ -294,8 +294,8 @@ public void PackTypes() { KtxFile output = new KtxFile( KtxHeader.InitializeCompressed(numWidthBlocks * 8 * 4, numHeightBlocks * 8 * 4, - GlInternalFormat.GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, - GLFormat.GL_RGBA)); + GlInternalFormat.GlCompressedRgbaBptcUnormArb, + GlFormat.GlRgba)); Span type0 = new Span(outputBlocks, 0 , 64); diff --git a/BCnEncTests/DdsReadTests.cs b/BCnEncTests/DdsReadTests.cs index 3e94ff2..4ba15d7 100644 --- a/BCnEncTests/DdsReadTests.cs +++ b/BCnEncTests/DdsReadTests.cs @@ -18,14 +18,14 @@ public class DdsReadTests public void ReadRgba() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_rgba.dds"); DdsFile file = DdsFile.Load(fs); - Assert.Equal(DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM, file.Header.ddsPixelFormat.DxgiFormat); - Assert.Equal(file.Header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); + Assert.Equal(DxgiFormat.DxgiFormatR8G8B8A8Unorm, file.header.ddsPixelFormat.DxgiFormat); + Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); BcDecoder decoder = new BcDecoder(); var images = decoder.DecodeAllMipMaps(file); - Assert.Equal((uint)images[0].Width, file.Header.dwWidth); - Assert.Equal((uint)images[0].Height, file.Header.dwHeight); + Assert.Equal((uint)images[0].Width, file.header.dwWidth); + Assert.Equal((uint)images[0].Height, file.header.dwHeight); for (int i = 0; i < images.Length; i++) { using FileStream outFs = File.OpenWrite($"decoding_test_dds_rgba_mip{i}.png"); @@ -38,15 +38,15 @@ public void ReadRgba() { public void ReadBc1() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1.dds"); DdsFile file = DdsFile.Load(fs); - Assert.Equal(DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM, file.Header.ddsPixelFormat.DxgiFormat); - Assert.Equal(file.Header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); + Assert.Equal(DxgiFormat.DxgiFormatBc1Unorm, file.header.ddsPixelFormat.DxgiFormat); + Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); BcDecoder decoder = new BcDecoder(); var images = decoder.DecodeAllMipMaps(file); - Assert.Equal((uint)images[0].Width, file.Header.dwWidth); - Assert.Equal((uint)images[0].Height, file.Header.dwHeight); + Assert.Equal((uint)images[0].Width, file.header.dwWidth); + Assert.Equal((uint)images[0].Height, file.header.dwHeight); for (int i = 0; i < images.Length; i++) { using FileStream outFs = File.OpenWrite($"decoding_test_dds_bc1_mip{i}.png"); @@ -59,16 +59,16 @@ public void ReadBc1() { public void ReadBc1a() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1a.dds"); DdsFile file = DdsFile.Load(fs); - Assert.Equal(DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM, file.Header.ddsPixelFormat.DxgiFormat); - Assert.Equal(file.Header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); + Assert.Equal(DxgiFormat.DxgiFormatBc1Unorm, file.header.ddsPixelFormat.DxgiFormat); + Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); BcDecoder decoder = new BcDecoder(); - decoder.InputOptions.ddsBc1ExpectAlpha = true; + decoder.InputOptions.DdsBc1ExpectAlpha = true; var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.dwWidth); - Assert.Equal((uint)image.Height, file.Header.dwHeight); + Assert.Equal((uint)image.Width, file.header.dwWidth); + Assert.Equal((uint)image.Height, file.header.dwHeight); if (!image.TryGetSinglePixelSpan(out var pixels)) { throw new Exception("Cannot get pixel span."); diff --git a/BCnEncTests/DdsWritingTests.cs b/BCnEncTests/DdsWritingTests.cs index 0037918..590eeb9 100644 --- a/BCnEncTests/DdsWritingTests.cs +++ b/BCnEncTests/DdsWritingTests.cs @@ -15,10 +15,10 @@ public void DdsWriteRgba() { var image = ImageLoader.testLenna; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = CompressionQuality.Fast; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = CompressionFormat.RGBA; - encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Rgba; + encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; using FileStream fs = File.OpenWrite("encoding_dds_rgba.dds"); encoder.Encode(image, fs); @@ -30,10 +30,10 @@ public void DdsWriteBc1() { var image = ImageLoader.testLenna; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = CompressionQuality.Fast; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = CompressionFormat.BC1; - encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc1; + encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; using FileStream fs = File.OpenWrite("encoding_dds_bc1.dds"); encoder.Encode(image, fs); @@ -45,10 +45,10 @@ public void DdsWriteBc2() { var image = ImageLoader.testAlpha1; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = CompressionQuality.Fast; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = CompressionFormat.BC2; - encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc2; + encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; using FileStream fs = File.OpenWrite("encoding_dds_bc2.dds"); encoder.Encode(image, fs); @@ -60,10 +60,10 @@ public void DdsWriteBc3() { var image = ImageLoader.testAlpha1; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = CompressionQuality.Fast; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = CompressionFormat.BC3; - encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc3; + encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; using FileStream fs = File.OpenWrite("encoding_dds_bc3.dds"); encoder.Encode(image, fs); @@ -75,10 +75,10 @@ public void DdsWriteBc4() { var image = ImageLoader.testHeight1; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = CompressionQuality.Fast; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = CompressionFormat.BC4; - encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc4; + encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; using FileStream fs = File.OpenWrite("encoding_dds_bc4.dds"); encoder.Encode(image, fs); @@ -90,10 +90,10 @@ public void DdsWriteBc5() { var image = ImageLoader.testRedGreen1; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = CompressionQuality.Fast; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = CompressionFormat.BC5; - encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc5; + encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; using FileStream fs = File.OpenWrite("encoding_dds_bc5.dds"); encoder.Encode(image, fs); @@ -105,10 +105,10 @@ public void DdsWriteBc7() { var image = ImageLoader.testLenna; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = CompressionQuality.Fast; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = CompressionFormat.BC7; - encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc7; + encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; using FileStream fs = File.OpenWrite("encoding_dds_bc7.dds"); encoder.Encode(image, fs); @@ -120,10 +120,10 @@ public void DdsWriteCubemap() { var images = ImageLoader.testCubemap; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = CompressionQuality.Fast; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = CompressionFormat.BC1; - encoder.OutputOptions.fileFormat = OutputFileFormat.Dds; + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc1; + encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; using FileStream fs = File.OpenWrite("encoding_dds_cubemap_bc1.dds"); encoder.EncodeCubeMap(images[0],images[1],images[2],images[3],images[4],images[5], fs); diff --git a/BCnEncTests/DecodingTests.cs b/BCnEncTests/DecodingTests.cs index 3cf65e7..9e69aed 100644 --- a/BCnEncTests/DecodingTests.cs +++ b/BCnEncTests/DecodingTests.cs @@ -14,14 +14,14 @@ public class DecodingTests public void Bc1Decode() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1.ktx"); KtxFile file = KtxFile.Load(fs); - Assert.True(file.Header.VerifyHeader()); - Assert.Equal((uint)1, file.Header.NumberOfFaces); + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); BcDecoder decoder = new BcDecoder(); using var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.PixelWidth); - Assert.Equal((uint)image.Height, file.Header.PixelHeight); + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); using FileStream outFs = File.OpenWrite("decoding_test_bc1.png"); image.SaveAsPng(outFs); @@ -31,14 +31,14 @@ public void Bc1Decode() { public void Bc1AlphaDecode() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1a.ktx"); KtxFile file = KtxFile.Load(fs); - Assert.True(file.Header.VerifyHeader()); - Assert.Equal((uint)1, file.Header.NumberOfFaces); + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); BcDecoder decoder = new BcDecoder(); using var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.PixelWidth); - Assert.Equal((uint)image.Height, file.Header.PixelHeight); + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); using FileStream outFs = File.OpenWrite("decoding_test_bc1a.png"); image.SaveAsPng(outFs); @@ -48,14 +48,14 @@ public void Bc1AlphaDecode() { public void Bc2Decode() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc2.ktx"); KtxFile file = KtxFile.Load(fs); - Assert.True(file.Header.VerifyHeader()); - Assert.Equal((uint)1, file.Header.NumberOfFaces); + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); BcDecoder decoder = new BcDecoder(); using var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.PixelWidth); - Assert.Equal((uint)image.Height, file.Header.PixelHeight); + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); using FileStream outFs = File.OpenWrite("decoding_test_bc2.png"); image.SaveAsPng(outFs); @@ -65,14 +65,14 @@ public void Bc2Decode() { public void Bc3Decode() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc3.ktx"); KtxFile file = KtxFile.Load(fs); - Assert.True(file.Header.VerifyHeader()); - Assert.Equal((uint)1, file.Header.NumberOfFaces); + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); BcDecoder decoder = new BcDecoder(); using var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.PixelWidth); - Assert.Equal((uint)image.Height, file.Header.PixelHeight); + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); using FileStream outFs = File.OpenWrite("decoding_test_bc3.png"); image.SaveAsPng(outFs); @@ -82,14 +82,14 @@ public void Bc3Decode() { public void Bc4Decode() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc4_unorm.ktx"); KtxFile file = KtxFile.Load(fs); - Assert.True(file.Header.VerifyHeader()); - Assert.Equal((uint)1, file.Header.NumberOfFaces); + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); BcDecoder decoder = new BcDecoder(); using var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.PixelWidth); - Assert.Equal((uint)image.Height, file.Header.PixelHeight); + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); using FileStream outFs = File.OpenWrite("decoding_test_bc4.png"); image.SaveAsPng(outFs); @@ -99,14 +99,14 @@ public void Bc4Decode() { public void Bc5Decode() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc5_unorm.ktx"); KtxFile file = KtxFile.Load(fs); - Assert.True(file.Header.VerifyHeader()); - Assert.Equal((uint)1, file.Header.NumberOfFaces); + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); BcDecoder decoder = new BcDecoder(); using var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.PixelWidth); - Assert.Equal((uint)image.Height, file.Header.PixelHeight); + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); using FileStream outFs = File.OpenWrite("decoding_test_bc5.png"); image.SaveAsPng(outFs); @@ -116,14 +116,14 @@ public void Bc5Decode() { public void Bc7DecodeRgb() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc7_rgb.ktx"); KtxFile file = KtxFile.Load(fs); - Assert.True(file.Header.VerifyHeader()); - Assert.Equal((uint)1, file.Header.NumberOfFaces); + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); BcDecoder decoder = new BcDecoder(); using var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.PixelWidth); - Assert.Equal((uint)image.Height, file.Header.PixelHeight); + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); using FileStream outFs = File.OpenWrite("decoding_test_bc7_rgb.png"); image.SaveAsPng(outFs); @@ -133,14 +133,14 @@ public void Bc7DecodeRgb() { public void Bc7DecodeUnorm() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc7_unorm.ktx"); KtxFile file = KtxFile.Load(fs); - Assert.True(file.Header.VerifyHeader()); - Assert.Equal((uint)1, file.Header.NumberOfFaces); + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); BcDecoder decoder = new BcDecoder(); using var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.PixelWidth); - Assert.Equal((uint)image.Height, file.Header.PixelHeight); + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); using FileStream outFs = File.OpenWrite("decoding_test_bc7_unorm.png"); image.SaveAsPng(outFs); @@ -150,14 +150,14 @@ public void Bc7DecodeUnorm() { public void Bc7DecodeEveryBlockType() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc7_types.ktx"); KtxFile file = KtxFile.Load(fs); - Assert.True(file.Header.VerifyHeader()); - Assert.Equal((uint)1, file.Header.NumberOfFaces); + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); BcDecoder decoder = new BcDecoder(); using var image = decoder.Decode(file); - Assert.Equal((uint)image.Width, file.Header.PixelWidth); - Assert.Equal((uint)image.Height, file.Header.PixelHeight); + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); using FileStream outFs = File.OpenWrite("decoding_test_bc7_types.png"); image.SaveAsPng(outFs); diff --git a/BCnEncTests/EncodingTest.cs b/BCnEncTests/EncodingTest.cs index 1cc3240..8c8c4c1 100644 --- a/BCnEncTests/EncodingTest.cs +++ b/BCnEncTests/EncodingTest.cs @@ -24,7 +24,7 @@ public void Bc1GradientBestQuality() var image = ImageLoader.testGradient1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1, + CompressionFormat.Bc1, CompressionQuality.BestQuality, "encoding_bc1_gradient_bestQuality.ktx", output); @@ -37,7 +37,7 @@ public void Bc1GradientBalanced() TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1, + CompressionFormat.Bc1, CompressionQuality.Balanced, "encoding_bc1_gradient_balanced.ktx", output); @@ -49,7 +49,7 @@ public void Bc1GradientFast() var image = ImageLoader.testGradient1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1, + CompressionFormat.Bc1, CompressionQuality.Fast, "encoding_bc1_gradient_fast.ktx", output); @@ -73,7 +73,7 @@ public void Bc1DiffuseBestQuality() var image = ImageLoader.testDiffuse1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1, + CompressionFormat.Bc1, CompressionQuality.BestQuality, "encoding_bc1_diffuse_bestQuality.ktx", output); @@ -85,7 +85,7 @@ public void Bc1DiffuseBalanced() var image = ImageLoader.testDiffuse1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1, + CompressionFormat.Bc1, CompressionQuality.Balanced, "encoding_bc1_diffuse_balanced.ktx", output); @@ -97,7 +97,7 @@ public void Bc1DiffuseFast() var image = ImageLoader.testDiffuse1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1, + CompressionFormat.Bc1, CompressionQuality.Fast, "encoding_bc1_diffuse_fast.ktx", output); @@ -122,7 +122,7 @@ public void Bc1BlurBestQuality() var image = ImageLoader.testBlur1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1, + CompressionFormat.Bc1, CompressionQuality.BestQuality, "encoding_bc1_blur_bestQuality.ktx", output); @@ -134,7 +134,7 @@ public void Bc1BlurBalanced() var image = ImageLoader.testBlur1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1, + CompressionFormat.Bc1, CompressionQuality.Balanced, "encoding_bc1_blur_balanced.ktx", output); @@ -146,7 +146,7 @@ public void Bc1BlurFast() var image = ImageLoader.testBlur1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1, + CompressionFormat.Bc1, CompressionQuality.Fast, "encoding_bc1_blur_fast.ktx", output); @@ -171,7 +171,7 @@ public void Bc1aSpriteBestQuality() var image = ImageLoader.testTransparentSprite1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1WithAlpha, + CompressionFormat.Bc1WithAlpha, CompressionQuality.BestQuality, "encoding_bc1a_sprite_bestQuality.ktx", output); @@ -183,7 +183,7 @@ public void Bc1aSpriteBalanced() var image = ImageLoader.testTransparentSprite1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1WithAlpha, + CompressionFormat.Bc1WithAlpha, CompressionQuality.Balanced, "encoding_bc1a_sprite_balanced.ktx", output); @@ -195,7 +195,7 @@ public void Bc1aSpriteFast() var image = ImageLoader.testTransparentSprite1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC1WithAlpha, + CompressionFormat.Bc1WithAlpha, CompressionQuality.Fast, "encoding_bc1a_sprite_fast.ktx", output); @@ -220,7 +220,7 @@ public void Bc2GradientBestQuality() var image = ImageLoader.testAlphaGradient1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC2, + CompressionFormat.Bc2, CompressionQuality.BestQuality, "encoding_bc2_gradient_bestQuality.ktx", output); @@ -232,7 +232,7 @@ public void Bc2GradientBalanced() var image = ImageLoader.testAlphaGradient1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC2, + CompressionFormat.Bc2, CompressionQuality.Balanced, "encoding_bc2_gradient_balanced.ktx", output); @@ -244,7 +244,7 @@ public void Bc2GradientFast() var image = ImageLoader.testAlphaGradient1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC2, + CompressionFormat.Bc2, CompressionQuality.Fast, "encoding_bc2_gradient_fast.ktx", output); @@ -269,7 +269,7 @@ public void Bc3GradientBestQuality() var image = ImageLoader.testAlphaGradient1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC3, + CompressionFormat.Bc3, CompressionQuality.BestQuality, "encoding_bc3_gradient_bestQuality.ktx", output); @@ -281,7 +281,7 @@ public void Bc3GradientBalanced() var image = ImageLoader.testAlphaGradient1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC3, + CompressionFormat.Bc3, CompressionQuality.Balanced, "encoding_bc3_gradient_balanced.ktx", output); @@ -293,7 +293,7 @@ public void Bc3GradientFast() var image = ImageLoader.testAlphaGradient1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC3, + CompressionFormat.Bc3, CompressionQuality.Fast, "encoding_bc3_gradient_fast.ktx", output); @@ -318,7 +318,7 @@ public void Bc4RedBestQuality() var image = ImageLoader.testHeight1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC4, + CompressionFormat.Bc4, CompressionQuality.BestQuality, "encoding_bc4_red_bestQuality.ktx", output); @@ -330,7 +330,7 @@ public void Bc4RedBalanced() var image = ImageLoader.testHeight1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC4, + CompressionFormat.Bc4, CompressionQuality.Balanced, "encoding_bc4_red_balanced.ktx", output); @@ -342,7 +342,7 @@ public void Bc4RedFast() var image = ImageLoader.testHeight1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC4, + CompressionFormat.Bc4, CompressionQuality.Fast, "encoding_bc4_red_fast.ktx", output); @@ -367,7 +367,7 @@ public void Bc5RedGreenBestQuality() var image = ImageLoader.testRedGreen1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC5, + CompressionFormat.Bc5, CompressionQuality.BestQuality, "encoding_bc5_red_green_bestQuality.ktx", output); @@ -379,7 +379,7 @@ public void Bc5RedGreenBalanced() var image = ImageLoader.testRedGreen1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC5, + CompressionFormat.Bc5, CompressionQuality.Balanced, "encoding_bc5_red_green_balanced.ktx", output); @@ -391,7 +391,7 @@ public void Bc5RedGreenFast() var image = ImageLoader.testRedGreen1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC5, + CompressionFormat.Bc5, CompressionQuality.Fast, "encoding_bc5_red_green_fast.ktx", output); @@ -415,7 +415,7 @@ public void Bc7RgbBestQuality() var image = ImageLoader.testRgbHard1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC7, + CompressionFormat.Bc7, CompressionQuality.BestQuality, "encoding_bc7_rgb_bestQuality.ktx", output); @@ -427,7 +427,7 @@ public void Bc7RgbBalanced() var image = ImageLoader.testRgbHard1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC7, + CompressionFormat.Bc7, CompressionQuality.Balanced, "encoding_bc7_rgb_balanced.ktx", output); @@ -439,7 +439,7 @@ public void Bc7LennaBalanced() var image = ImageLoader.testLenna; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC7, + CompressionFormat.Bc7, CompressionQuality.Balanced, "encoding_bc7_lenna_balanced.ktx", output); @@ -451,7 +451,7 @@ public void Bc7RgbFast() var image = ImageLoader.testRgbHard1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC7, + CompressionFormat.Bc7, CompressionQuality.Fast, "encoding_bc7_rgb_fast.ktx", output); @@ -475,7 +475,7 @@ public void Bc7RgbaBestQuality() var image = ImageLoader.testAlpha1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC7, + CompressionFormat.Bc7, CompressionQuality.BestQuality, "encoding_bc7_rgba_bestQuality.ktx", output); @@ -487,7 +487,7 @@ public void Bc7RgbaBalanced() var image = ImageLoader.testAlpha1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC7, + CompressionFormat.Bc7, CompressionQuality.Balanced, "encoding_bc7_rgba_balanced.ktx", output); @@ -499,7 +499,7 @@ public void Bc7RgbaFast() var image = ImageLoader.testAlpha1; TestHelper.ExecuteEncodingTest(image, - CompressionFormat.BC7, + CompressionFormat.Bc7, CompressionQuality.Fast, "encoding_bc7_rgba_fast.ktx", output); @@ -517,9 +517,9 @@ public void WriteCubeMapFile() string filename = "encoding_bc1_cubemap.ktx"; BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = CompressionQuality.Fast; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = CompressionFormat.BC1; + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc1; using FileStream fs = File.OpenWrite(filename); encoder.EncodeCubeMap(images[0],images[1],images[2],images[3],images[4],images[5], fs); diff --git a/BCnEncTests/RawTests.cs b/BCnEncTests/RawTests.cs index 9e0c5d5..e5dd478 100644 --- a/BCnEncTests/RawTests.cs +++ b/BCnEncTests/RawTests.cs @@ -19,13 +19,13 @@ public void Decode() var originalImage = decoder.Decode(ktx); var rawBytes = encoder.EncodeToRawBytes(originalImage); - var recodedImage = decoder.DecodeRaw(rawBytes[0], CompressionFormat.BC1, originalImage.Width, originalImage.Height); + var recodedImage = decoder.DecodeRaw(rawBytes[0], CompressionFormat.Bc1, originalImage.Width, originalImage.Height); originalImage.TryGetSinglePixelSpan(out var originalPixels); recodedImage.TryGetSinglePixelSpan(out var recodedPixels); var psnr=ImageQuality.PeakSignalToNoiseRatio(originalPixels, recodedPixels); - if (encoder.OutputOptions.quality == CompressionQuality.Fast) + if (encoder.OutputOptions.Quality == CompressionQuality.Fast) { Assert.True(psnr > 25); } diff --git a/BCnEncTests/TestHelper.cs b/BCnEncTests/TestHelper.cs index e99bbd2..e08e2db 100644 --- a/BCnEncTests/TestHelper.cs +++ b/BCnEncTests/TestHelper.cs @@ -33,9 +33,9 @@ public static float DecodeCheckPSNR(string filename, Image original) { public static void ExecuteEncodingTest(Image image, CompressionFormat format, CompressionQuality quality, string filename, ITestOutputHelper output) { BcEncoder encoder = new BcEncoder(); - encoder.OutputOptions.quality = quality; - encoder.OutputOptions.generateMipMaps = true; - encoder.OutputOptions.format = format; + encoder.OutputOptions.Quality = quality; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = format; using FileStream fs = File.OpenWrite(filename); encoder.Encode(image, fs); From f4678fdc01ddd459a60980501924c1a39c76f9c7 Mon Sep 17 00:00:00 2001 From: Nominom Date: Tue, 12 Jan 2021 21:04:54 +0200 Subject: [PATCH 015/116] Some more code style changes, more raw api's and duplicate encoder code removed --- .editorconfig | 17 +++ BCnEnc.Net/Decoder/BcBlockDecoder.cs | 5 +- BCnEnc.Net/Decoder/BcDecoder.cs | 50 ++++++- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 43 ++++++ BCnEnc.Net/Encoder/Bc1BlockEncoder.cs | 102 ++++---------- BCnEnc.Net/Encoder/Bc2BlockEncoder.cs | 50 ++----- BCnEnc.Net/Encoder/Bc3BlockEncoder.cs | 51 ++----- BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 35 ++--- BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 32 +---- BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs | 72 ++++------ BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs | 4 +- BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs | 4 +- BCnEnc.Net/Encoder/BcEncoder.cs | 117 ++++++++++++++-- BCnEnc.Net/Encoder/ColorVariationGenerator.cs | 28 ++-- BCnEnc.Net/Encoder/IBcBlockEncoder.cs | 4 +- .../Encoder/Options/EncoderOutputOptions.cs | 2 +- .../Shared/BinaryReaderWriterExtensions.cs | 1 - BCnEnc.Net/Shared/Colors.cs | 42 +++--- BCnEnc.Net/Shared/ImageToBlocks.cs | 8 +- BCnEnc.Net/Shared/MipMapper.cs | 21 ++- BCnEnc.Net/Shared/PcaVectors.cs | 20 ++- BCnEncNet.sln | 5 + BCnEncNet.sln.DotSettings | 4 + BCnEncTests/BC1Tests.cs | 2 +- BCnEncTests/Bc7BlockTests.cs | 5 +- BCnEncTests/BlockTests.cs | 3 +- BCnEncTests/ClusterTests.cs | 9 +- BCnEncTests/DdsReadTests.cs | 9 +- BCnEncTests/DdsWritingTests.cs | 19 ++- BCnEncTests/DecodingTests.cs | 2 - BCnEncTests/EncodingTest.cs | 73 +++++----- BCnEncTests/ImageLoader.cs | 26 ++-- BCnEncTests/PcaTests.cs | 4 +- BCnEncTests/RawTests.cs | 129 ++++++++++++++---- BCnEncTests/TestHelper.cs | 5 +- 35 files changed, 552 insertions(+), 451 deletions(-) create mode 100644 .editorconfig create mode 100644 BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs create mode 100644 BCnEncNet.sln.DotSettings diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..1bf2168 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = tab +indent_size = 4 + +[*.{diff,md}] +trim_trailing_whitespace = false \ No newline at end of file diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index 37dea11..c4e6bc6 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using BCnEncoder.Shared; @@ -12,14 +13,14 @@ internal interface IBcBlockDecoder } internal abstract class BaseBcBlockDecoder : IBcBlockDecoder - where T : struct + where T : unmanaged { public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) { blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); - if (data.Length != blockWidth * blockHeight * Marshal.SizeOf()) + if (data.Length != blockWidth * blockHeight * Unsafe.SizeOf()) { throw new InvalidDataException("Given data does not match expected length."); } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 7698856..d453ba4 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Runtime.CompilerServices; using System.Text; using BCnEncoder.Decoder.Options; using BCnEncoder.Shared; @@ -33,7 +34,7 @@ public class BcDecoder /// The decoded Rgba32 image. public Image DecodeRaw(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight) { - var dataArray = new byte[inputStream.Position]; + var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); return DecodeRaw(dataArray, format, pixelWidth, pixelHeight); @@ -47,8 +48,13 @@ public Image DecodeRaw(Stream inputStream, CompressionFormat format, int /// The pixelWidth of the image. /// The pixelHeight of the image. /// The decoded Rgba32 image. - public Image DecodeRaw(byte[] input, CompressionFormat format, int pixelWidth, int pixelHeight) + public Image DecodeRaw(ReadOnlySpan input, CompressionFormat format, int pixelWidth, int pixelHeight) { + if (input.Length != GetBufferSize(format, pixelWidth, pixelHeight)) + { + throw new ArgumentException("The size of the input buffer does not match the expected size"); + } + var isCompressedFormat = format.IsCompressedFormat(); if (isCompressedFormat) { @@ -502,5 +508,45 @@ private IRawDecoder GetRawDecoder(CompressionFormat format) throw new ArgumentOutOfRangeException(nameof(format), format, null); } } + + private int GetBufferSize(CompressionFormat format, int pixelWidth, int pixelHeight) + { + switch (format) + { + case CompressionFormat.R: + return pixelWidth * pixelHeight; + + case CompressionFormat.Rg: + return 2 * pixelWidth * pixelHeight; + + case CompressionFormat.Rgb: + return 3 * pixelWidth * pixelHeight; + + case CompressionFormat.Rgba: + return 4 * pixelWidth * pixelHeight; + + case CompressionFormat.Bc1: + case CompressionFormat.Bc1WithAlpha: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + case CompressionFormat.Bc2: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + case CompressionFormat.Bc3: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + case CompressionFormat.Bc4: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + case CompressionFormat.Bc5: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + case CompressionFormat.Bc7: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } + } } } diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs new file mode 100644 index 0000000..f8adebc --- /dev/null +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using BCnEncoder.Shared; + +namespace BCnEncoder.Encoder +{ + internal abstract class BaseBcBlockEncoder : IBcBlockEncoder where T : unmanaged + { + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) + { + var outputData = new byte[blockWidth * blockHeight * Unsafe.SizeOf()]; + var outputBlocks = MemoryMarshal.Cast(outputData); + + if (parallel) + { + Parallel.For(0, blocks.Length, i => + { + var outputBlocks = MemoryMarshal.Cast(outputData); + outputBlocks[i] = EncodeBlock(blocks[i], quality); + }); + } + else + { + for (var i = 0; i < blocks.Length; i++) + { + outputBlocks[i] = EncodeBlock(blocks[i], quality); + } + } + + return outputData; + } + + public abstract GlInternalFormat GetInternalFormat(); + public abstract GlFormat GetBaseInternalFormat(); + public abstract DxgiFormat GetDxgiFormat(); + + protected abstract T EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality); + } +} diff --git a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs index d53f86d..dc8015f 100644 --- a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs @@ -5,34 +5,9 @@ namespace BCnEncoder.Encoder { - internal class Bc1BlockEncoder : IBcBlockEncoder + internal class Bc1BlockEncoder : BaseBcBlockEncoder { - - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) - { - var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - var outputBlocks = MemoryMarshal.Cast(outputData); - - if (parallel) - { - Parallel.For(0, blocks.Length, i => - { - var outputBlocks = MemoryMarshal.Cast(outputData); - outputBlocks[i] = EncodeBlock(blocks[i], quality); - }); - } - else - { - for (var i = 0; i < blocks.Length; i++) - { - outputBlocks[i] = EncodeBlock(blocks[i], quality); - } - } - - return outputData; - } - - private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + protected override Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { @@ -48,17 +23,17 @@ private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality } } - public GlInternalFormat GetInternalFormat() + public override GlInternalFormat GetInternalFormat() { return GlInternalFormat.GlCompressedRgbS3TcDxt1Ext; } - public GlFormat GetBaseInternalFormat() + public override GlFormat GetBaseInternalFormat() { return GlFormat.GlRgb; } - public DxgiFormat GetDxgiFormat() + public override DxgiFormat GetDxgiFormat() { return DxgiFormat.DxgiFormatBc1Unorm; } @@ -127,8 +102,8 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } private static class Bc1BlockEncoderBalanced { - private const int MaxTries_ = 24 * 2; - private const float ErrorThreshold_ = 0.05f; + private const int MaxTries = 24 * 2; + private const float ErrorThreshold = 0.05f; internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { @@ -149,7 +124,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var best = TryColors(rawBlock, c0, c1, out var bestError); - for (var i = 0; i < MaxTries_; i++) { + for (var i = 0; i < MaxTries; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (newC0.data < newC1.data) @@ -169,7 +144,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < ErrorThreshold_) { + if (bestError < ErrorThreshold) { break; } } @@ -180,8 +155,8 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc1BlockEncoderSlow { - private const int MaxTries_ = 9999; - private const float ErrorThreshold_ = 0.01f; + private const int MaxTries = 9999; + private const float ErrorThreshold = 0.01f; internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { @@ -204,7 +179,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var lastChanged = 0; - for (var i = 0; i < MaxTries_; i++) { + for (var i = 0; i < MaxTries; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (newC0.data < newC1.data) @@ -227,7 +202,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < ErrorThreshold_ || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { break; } } @@ -239,34 +214,9 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) #endregion } - internal class Bc1AlphaBlockEncoder : IBcBlockEncoder + internal class Bc1AlphaBlockEncoder : BaseBcBlockEncoder { - - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) - { - var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - var outputBlocks = MemoryMarshal.Cast(outputData); - - if (parallel) - { - Parallel.For(0, blocks.Length, i => - { - var outputBlocks = MemoryMarshal.Cast(outputData); - outputBlocks[i] = EncodeBlock(blocks[i], quality); - }); - } - else - { - for (var i = 0; i < blocks.Length; i++) - { - outputBlocks[i] = EncodeBlock(blocks[i], quality); - } - } - - return outputData; - } - - private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + protected override Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { @@ -282,17 +232,17 @@ private Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality } } - public GlInternalFormat GetInternalFormat() + public override GlInternalFormat GetInternalFormat() { return GlInternalFormat.GlCompressedRgbaS3TcDxt1Ext; } - public GlFormat GetBaseInternalFormat() + public override GlFormat GetBaseInternalFormat() { return GlFormat.GlRgba; } - public DxgiFormat GetDxgiFormat() + public override DxgiFormat GetDxgiFormat() { return DxgiFormat.DxgiFormatBc1Unorm; } @@ -370,8 +320,8 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc1AlphaBlockEncoderBalanced { - private const int MaxTries_ = 24 * 2; - private const float ErrorThreshold_ = 0.05f; + private const int MaxTries = 24 * 2; + private const float ErrorThreshold = 0.05f; internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) @@ -399,7 +349,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var best = TryColors(rawBlock, c0, c1, out var bestError); - for (var i = 0; i < MaxTries_; i++) { + for (var i = 0; i < MaxTries; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (!hasAlpha && newC0.data < newC1.data) @@ -423,7 +373,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < ErrorThreshold_) { + if (bestError < ErrorThreshold) { break; } } @@ -434,8 +384,8 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc1AlphaBlockEncoderSlow { - private const int MaxTries_ = 9999; - private const float ErrorThreshold_ = 0.05f; + private const int MaxTries = 9999; + private const float ErrorThreshold = 0.05f; internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { @@ -463,7 +413,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var best = TryColors(rawBlock, c0, c1, out var bestError); var lastChanged = 0; - for (var i = 0; i < MaxTries_; i++) { + for (var i = 0; i < MaxTries; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (!hasAlpha && newC0.data < newC1.data) @@ -490,7 +440,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < ErrorThreshold_ || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { break; } } diff --git a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs index 5b15c90..cbbc2b5 100644 --- a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs @@ -5,34 +5,10 @@ namespace BCnEncoder.Encoder { - internal class Bc2BlockEncoder : IBcBlockEncoder + internal class Bc2BlockEncoder : BaseBcBlockEncoder { - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) - { - var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - var outputBlocks = MemoryMarshal.Cast(outputData); - - if (parallel) - { - Parallel.For(0, blocks.Length, i => - { - var outputBlocks = MemoryMarshal.Cast(outputData); - outputBlocks[i] = EncodeBlock(blocks[i], quality); - }); - } - else - { - for (var i = 0; i < blocks.Length; i++) - { - outputBlocks[i] = EncodeBlock(blocks[i], quality); - } - } - - return outputData; - } - - private Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + protected override Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { @@ -48,17 +24,17 @@ private Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality } } - public GlInternalFormat GetInternalFormat() + public override GlInternalFormat GetInternalFormat() { return GlInternalFormat.GlCompressedRgbaS3TcDxt3Ext; } - public GlFormat GetBaseInternalFormat() + public override GlFormat GetBaseInternalFormat() { return GlFormat.GlRgba; } - public DxgiFormat GetDxgiFormat() { + public override DxgiFormat GetDxgiFormat() { return DxgiFormat.DxgiFormatBc2Unorm; } @@ -120,8 +96,8 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } private static class Bc2BlockEncoderBalanced { - private const int MaxTries_ = 24 * 2; - private const float ErrorThreshold_ = 0.05f; + private const int MaxTries = 24 * 2; + private const float ErrorThreshold = 0.05f; internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { @@ -135,7 +111,7 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var best = TryColors(rawBlock, c0, c1, out var bestError); - for (var i = 0; i < MaxTries_; i++) { + for (var i = 0; i < MaxTries; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); var block = TryColors(rawBlock, newC0, newC1, out var error); @@ -148,7 +124,7 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < ErrorThreshold_) { + if (bestError < ErrorThreshold) { break; } } @@ -159,8 +135,8 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc2BlockEncoderSlow { - private const int MaxTries_ = 9999; - private const float ErrorThreshold_ = 0.01f; + private const int MaxTries = 9999; + private const float ErrorThreshold = 0.01f; internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) @@ -184,7 +160,7 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var lastChanged = 0; - for (var i = 0; i < MaxTries_; i++) { + for (var i = 0; i < MaxTries; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (newC0.data < newC1.data) @@ -207,7 +183,7 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < ErrorThreshold_ || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { break; } } diff --git a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs index 04b854f..01b0fc3 100644 --- a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs @@ -6,34 +6,9 @@ namespace BCnEncoder.Encoder { - internal class Bc3BlockEncoder : IBcBlockEncoder + internal class Bc3BlockEncoder : BaseBcBlockEncoder { - - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) - { - var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - var outputBlocks = MemoryMarshal.Cast(outputData); - - if (parallel) - { - Parallel.For(0, blocks.Length, i => - { - var outputBlocks = MemoryMarshal.Cast(outputData); - outputBlocks[i] = EncodeBlock(blocks[i], quality); - }); - } - else - { - for (var i = 0; i < blocks.Length; i++) - { - outputBlocks[i] = EncodeBlock(blocks[i], quality); - } - } - - return outputData; - } - - private Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + protected override Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { @@ -49,17 +24,17 @@ private Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality } } - public GlInternalFormat GetInternalFormat() + public override GlInternalFormat GetInternalFormat() { return GlInternalFormat.GlCompressedRgbaS3TcDxt5Ext; } - public GlFormat GetBaseInternalFormat() + public override GlFormat GetBaseInternalFormat() { return GlFormat.GlRgba; } - public DxgiFormat GetDxgiFormat() { + public override DxgiFormat GetDxgiFormat() { return DxgiFormat.DxgiFormatBc3Unorm; } @@ -286,8 +261,8 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } private static class Bc3BlockEncoderBalanced { - private const int MaxTries_ = 24 * 2; - private const float ErrorThreshold_ = 0.05f; + private const int MaxTries = 24 * 2; + private const float ErrorThreshold = 0.05f; internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { @@ -301,7 +276,7 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var best = TryColors(rawBlock, c0, c1, out var bestError); - for (var i = 0; i < MaxTries_; i++) { + for (var i = 0; i < MaxTries; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); var block = TryColors(rawBlock, newC0, newC1, out var error); @@ -314,7 +289,7 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < ErrorThreshold_) { + if (bestError < ErrorThreshold) { break; } } @@ -325,8 +300,8 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc3BlockEncoderSlow { - private const int MaxTries_ = 9999; - private const float ErrorThreshold_ = 0.01f; + private const int MaxTries = 9999; + private const float ErrorThreshold = 0.01f; internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) @@ -350,7 +325,7 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var lastChanged = 0; - for (var i = 0; i < MaxTries_; i++) { + for (var i = 0; i < MaxTries; i++) { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); if (newC0.data < newC1.data) @@ -373,7 +348,7 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < ErrorThreshold_ || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { break; } } diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index 632238f..a842158 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -6,34 +6,15 @@ namespace BCnEncoder.Encoder { - internal class Bc4BlockEncoder : IBcBlockEncoder { - + internal class Bc4BlockEncoder : BaseBcBlockEncoder + { private readonly bool luminanceAsRed; + public Bc4BlockEncoder(bool luminanceAsRed) { this.luminanceAsRed = luminanceAsRed; } - - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, - bool parallel) { - var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - var outputBlocks = MemoryMarshal.Cast(outputData); - - if (parallel) { - Parallel.For(0, blocks.Length, i => { - var outputBlocks = MemoryMarshal.Cast(outputData); - outputBlocks[i] = EncodeBlock(blocks[i], quality); - }); - } - else { - for (var i = 0; i < blocks.Length; i++) { - outputBlocks[i] = EncodeBlock(blocks[i], quality); - } - } - - return outputData; - } - - private Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { + + protected override Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { var output = new Bc4Block(); var colors = new byte[16]; var pixels = block.AsSpan; @@ -58,15 +39,15 @@ private Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality } } - public GlInternalFormat GetInternalFormat() { + public override GlInternalFormat GetInternalFormat() { return GlInternalFormat.GlCompressedRedRgtc1Ext; } - public GlFormat GetBaseInternalFormat() { + public override GlFormat GetBaseInternalFormat() { return GlFormat.GlRed; } - public DxgiFormat GetDxgiFormat() { + public override DxgiFormat GetDxgiFormat() { return DxgiFormat.DxgiFormatBc4Unorm; } diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index 2f86bae..f5ee63d 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -6,29 +6,9 @@ namespace BCnEncoder.Encoder { - internal class Bc5BlockEncoder : IBcBlockEncoder { - - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) - { - var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - var outputBlocks = MemoryMarshal.Cast(outputData); - - if (parallel) { - Parallel.For(0, blocks.Length, i => { - var outputBlocks = MemoryMarshal.Cast(outputData); - outputBlocks[i] = EncodeBlock(blocks[i], quality); - }); - } - else { - for (var i = 0; i < blocks.Length; i++) { - outputBlocks[i] = EncodeBlock(blocks[i], quality); - } - } - - return outputData; - } - - private Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { + internal class Bc5BlockEncoder : BaseBcBlockEncoder + { + protected override Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { var output = new Bc5Block(); var reds = new byte[16]; var greens = new byte[16]; @@ -100,15 +80,15 @@ private Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality return output; } - public GlInternalFormat GetInternalFormat() { + public override GlInternalFormat GetInternalFormat() { return GlInternalFormat.GlCompressedRedGreenRgtc2Ext; } - public GlFormat GetBaseInternalFormat() { + public override GlFormat GetBaseInternalFormat() { return GlFormat.GlRg; } - public DxgiFormat GetDxgiFormat() { + public override DxgiFormat GetDxgiFormat() { return DxgiFormat.DxgiFormatBc5Unorm; } diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs index f163c3e..ce3a635 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs @@ -6,45 +6,35 @@ namespace BCnEncoder.Encoder.Bc7 { - internal class Bc7Encoder : IBcBlockEncoder + internal class Bc7Encoder : BaseBcBlockEncoder { - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) + protected override Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock, CompressionQuality quality) { - var outputData = new byte[blockWidth * blockHeight * Marshal.SizeOf()]; - var outputBlocks = MemoryMarshal.Cast(outputData); - - if (parallel) - { - Parallel.For(0, blocks.Length, i => - { - var outputBlocks = MemoryMarshal.Cast(outputData); - outputBlocks[i] = EncodeBlock(blocks[i], quality); - }); - } - else + switch (quality) { - for (var i = 0; i < blocks.Length; i++) - { - outputBlocks[i] = EncodeBlock(blocks[i], quality); - } + case CompressionQuality.Fast: + return Bc7EncoderFast.EncodeBlock(rawBlock); + case CompressionQuality.Balanced: + return Bc7EncoderBalanced.EncodeBlock(rawBlock); + case CompressionQuality.BestQuality: + return Bc7EncoderBestQuality.EncodeBlock(rawBlock); + default: + throw new ArgumentOutOfRangeException(nameof(quality), quality, null); } - - - return outputData; } - public GlInternalFormat GetInternalFormat() + public override GlInternalFormat GetInternalFormat() { return GlInternalFormat.GlCompressedRgbaBptcUnormArb; } - public GlFormat GetBaseInternalFormat() + public override GlFormat GetBaseInternalFormat() { return GlFormat.GlRgba; } - public DxgiFormat GetDxgiFormat() { + public override DxgiFormat GetDxgiFormat() { return DxgiFormat.DxgiFormatBc7Unorm; } @@ -73,26 +63,10 @@ private static ClusterIndices4X4 CreateClusterIndexBlock(RawBlock4X4Rgba32 raw, return indexBlock; } - - private static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock, CompressionQuality quality) - { - switch (quality) - { - case CompressionQuality.Fast: - return Bc7EncoderFast.EncodeBlock(rawBlock); - case CompressionQuality.Balanced: - return Bc7EncoderBalanced.EncodeBlock(rawBlock); - case CompressionQuality.BestQuality: - return Bc7EncoderBestQuality.EncodeBlock(rawBlock); - default: - throw new ArgumentOutOfRangeException(nameof(quality), quality, null); - } - } - private static class Bc7EncoderFast { - private const float ErrorThreshold_ = 0.005f; - private const int MaxTries_ = 5; + private const float ErrorThreshold = 0.005f; + private const int MaxTries = 5; private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[] best2SubsetPartitions, int[] best3SubsetPartitions, bool alpha) { @@ -143,7 +117,7 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) bestError = error; } - if (error < ErrorThreshold_ || tries > MaxTries_) { + if (error < ErrorThreshold || tries > MaxTries) { break; } @@ -155,8 +129,8 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc7EncoderBalanced { - private const float ErrorThreshold_ = 0.005f; - private const int MaxTries_ = 25; + private const float ErrorThreshold = 0.005f; + private const int MaxTries = 25; private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[] best2SubsetPartitions, int[] best3SubsetPartitions, bool alpha) { @@ -216,7 +190,7 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) bestError = error; } - if (error < ErrorThreshold_ || tries > MaxTries_) { + if (error < ErrorThreshold || tries > MaxTries) { break; } @@ -229,8 +203,8 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) private static class Bc7EncoderBestQuality { - private const float ErrorThreshold_ = 0.001f; - private const int MaxTries_ = 40; + private const float ErrorThreshold = 0.001f; + private const int MaxTries = 40; private static IEnumerable TryMethods(RawBlock4X4Rgba32 rawBlock, int[] best2SubsetPartitions, int[] best3SubsetPartitions, bool alpha) { @@ -292,7 +266,7 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) bestError = error; } - if (error < ErrorThreshold_ || tries > MaxTries_) { + if (error < ErrorThreshold || tries > MaxTries) { break; } diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs index 55bf8f6..7505b53 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs @@ -7,7 +7,7 @@ internal static class Bc7Mode4Encoder { private static ReadOnlySpan PartitionTable => new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - const int Subset_ = 0; + const int Subset = 0; public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation) { @@ -32,7 +32,7 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariatio byte pBit = 0; //fake pBit Bc7EncodingHelpers.OptimizeSubsetEndpointsWithPBit(type, rotatedBlock, ref scaledEp0, - ref scaledEp1, ref pBit, ref pBit, startingVariation, PartitionTable, Subset_, + ref scaledEp1, ref pBit, ref pBit, startingVariation, PartitionTable, Subset, false, true, idxMode); ep0 = Bc7EncodingHelpers.ExpandEndpoint(type, scaledEp0, 0); diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs index 1d97ac6..0e93a82 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs @@ -6,7 +6,7 @@ namespace BCnEncoder.Encoder.Bc7 internal static class Bc7Mode5Encoder { private static ReadOnlySpan PartitionTable => new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - const int Subset_ = 0; + const int Subset = 0; public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariation) { @@ -28,7 +28,7 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 block, int startingVariatio byte pBit = 0; //fake pBit Bc7EncodingHelpers.OptimizeSubsetEndpointsWithPBit(type, rotatedBlock, ref scaledEp0, - ref scaledEp1, ref pBit, ref pBit, startingVariation, PartitionTable, Subset_, false, true); + ref scaledEp1, ref pBit, ref pBit, startingVariation, PartitionTable, Subset, false, true); ep0 = Bc7EncodingHelpers.ExpandEndpoint(type, scaledEp0, 0); ep1 = Bc7EncodingHelpers.ExpandEndpoint(type, scaledEp1, 0); diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 7e4ec08..4db96b9 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -361,16 +361,103 @@ public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int m return encoded; } + /// + /// Encodes all mipmap levels into a list of byte buffers. + /// + /// The raw pixels of the input image in rgba format. + /// The width of the input image. + /// The height of the input image. + /// A list of raw encoded mipmap data. + public IList EncodeToRawBytes(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight) + { + if (inputPixelsRgba.Length != inputImageWidth * inputImageHeight * 4) + { + throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); + } + using var image = Image.LoadPixelData(inputPixelsRgba, inputImageWidth, inputImageHeight); + return EncodeToRawBytes(image); + } + + /// + /// Encodes a single mip level of the input image to a byte buffer. + /// + /// The raw pixels of the input image in rgba format. + /// The width of the input image. + /// The height of the input image. + /// The mipmap to encode. + /// The width of the mipmap. + /// The height of the mipmap. + /// The raw encoded data. + public byte[] EncodeToRawBytes(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, int mipLevel, out int mipWidth, out int mipHeight) + { + if (inputPixelsRgba.Length != inputImageWidth * inputImageHeight * 4) + { + throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); + } + using var image = Image.LoadPixelData(inputPixelsRgba, inputImageWidth, inputImageHeight); + return EncodeToRawBytes(image, mipLevel, out mipWidth, out mipHeight); + } + + /// + /// Calculates the number of mipmap levels that will be generated for the given input image. + /// + /// The image to use for the calculation. + /// The number of mipmap levels that will be generated for the input image. + public int CalculateNumberOfMipLevels(Image inputImage) + { + return (int) MipMapper.CalculateMipChainLength(inputImage.Width, inputImage.Height, + (OutputOptions.GenerateMipMaps ? (uint) OutputOptions.MaxMipMapLevel : 1)); + } + + /// + /// Calculates the number of mipmap levels that will be generated for the given input image. + /// + /// The width of the input image in pixels + /// The height of the input image in pixels + /// The number of mipmap levels that will be generated for the input image. + public int CalculateNumberOfMipLevels(int imagePixelWidth, int imagePixelHeight) + { + return (int)MipMapper.CalculateMipChainLength(imagePixelWidth, imagePixelHeight, + (OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1)); + } + + /// + /// Calculates the size of a given mipmap level. + /// + /// The image to use for the calculation. + /// The mipLevel to calculate (0 is original image) + /// The mipmap width calculated + /// The mipmap height calculated + public void CalculateMipMapSize(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) + { + MipMapper.CalculateMipLevelSize(inputImage.Width, inputImage.Height, mipLevel, out mipWidth, + out mipHeight); + } + + /// + /// Calculates the size of a given mipmap level. + /// + /// The width of the input image in pixels + /// The height of the input image in pixels + /// The mipLevel to calculate (0 is original image) + /// The mipmap width calculated + /// The mipmap height calculated + public void CalculateMipMapSize(int imagePixelWidth, int imagePixelHeight, int mipLevel, out int mipWidth, out int mipHeight) + { + MipMapper.CalculateMipLevelSize(imagePixelWidth, imagePixelHeight, mipLevel, out mipWidth, + out mipHeight); + } + /// /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream. /// Order is +X, -X, +Y, -Y, +Z, -Z /// /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. /// The stream to write the encoded image to. public void EncodeCubeMap(Image right, Image left, Image top, Image down, Image back, Image front, Stream outputStream) @@ -394,11 +481,11 @@ public void EncodeCubeMap(Image right, Image left, Image /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. /// The Ktx file containing the encoded image. public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image top, Image down, Image back, Image front) @@ -507,11 +594,11 @@ public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. - /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. /// The Dds file containing the encoded image. public DdsFile EncodeCubeMapToDds(Image right, Image left, Image top, Image down, Image back, Image front) diff --git a/BCnEnc.Net/Encoder/ColorVariationGenerator.cs b/BCnEnc.Net/Encoder/ColorVariationGenerator.cs index d505361..5115361 100644 --- a/BCnEnc.Net/Encoder/ColorVariationGenerator.cs +++ b/BCnEnc.Net/Encoder/ColorVariationGenerator.cs @@ -6,26 +6,26 @@ namespace BCnEncoder.Encoder internal static class ColorVariationGenerator { - private static int[] varPatternEp0R = new int[] { 1, 1, 0, 0, -1, 0, 0, -1, 1, -1, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - private static int[] varPatternEp0G = new int[] { 1, 0, 1, 0, 0, -1, 0, -1, 1, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - private static int[] varPatternEp0B = new int[] { 1, 0, 0, 1, 0, 0, -1, -1, 1, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0 }; - private static int[] varPatternEp1R = new int[] { -1, -1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, -1, 0, 0 }; - private static int[] varPatternEp1G = new int[] { -1, 0, -1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, 0, -1, 0 }; - private static int[] varPatternEp1B = new int[] { -1, 0, 0, -1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 1, 0, 0, -1 }; - public static int VarPatternCount => varPatternEp0R.Length; + private static readonly int[] variatePatternEp0R = new int[] { 1, 1, 0, 0, -1, 0, 0, -1, 1, -1, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + private static readonly int[] variatePatternEp0G = new int[] { 1, 0, 1, 0, 0, -1, 0, -1, 1, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + private static readonly int[] variatePatternEp0B = new int[] { 1, 0, 0, 1, 0, 0, -1, -1, 1, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0 }; + private static readonly int[] variatePatternEp1R = new int[] { -1, -1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, -1, 0, 0 }; + private static readonly int[] variatePatternEp1G = new int[] { -1, 0, -1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, 0, -1, 0 }; + private static readonly int[] variatePatternEp1B = new int[] { -1, 0, 0, -1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 1, 0, 0, -1 }; + public static int VarPatternCount => variatePatternEp0R.Length; public static (ColorRgb565, ColorRgb565) Variate565(ColorRgb565 c0, ColorRgb565 c1, int i) { - var idx = i % varPatternEp0R.Length; + var idx = i % variatePatternEp0R.Length; var newEp0 = new ColorRgb565(); var newEp1 = new ColorRgb565(); - newEp0.RawR = ByteHelper.ClampToByte(c0.RawR + varPatternEp0R[idx]); - newEp0.RawG = ByteHelper.ClampToByte(c0.RawG + varPatternEp0G[idx]); - newEp0.RawB = ByteHelper.ClampToByte(c0.RawB + varPatternEp0B[idx]); + newEp0.RawR = ByteHelper.ClampToByte(c0.RawR + variatePatternEp0R[idx]); + newEp0.RawG = ByteHelper.ClampToByte(c0.RawG + variatePatternEp0G[idx]); + newEp0.RawB = ByteHelper.ClampToByte(c0.RawB + variatePatternEp0B[idx]); - newEp1.RawR = ByteHelper.ClampToByte(c1.RawR + varPatternEp1R[idx]); - newEp1.RawG = ByteHelper.ClampToByte(c1.RawG + varPatternEp1G[idx]); - newEp1.RawB = ByteHelper.ClampToByte(c1.RawB + varPatternEp1B[idx]); + newEp1.RawR = ByteHelper.ClampToByte(c1.RawR + variatePatternEp1R[idx]); + newEp1.RawG = ByteHelper.ClampToByte(c1.RawG + variatePatternEp1G[idx]); + newEp1.RawB = ByteHelper.ClampToByte(c1.RawB + variatePatternEp1B[idx]); return (newEp0, newEp1); } diff --git a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs index add7372..e9f991b 100644 --- a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs @@ -1,6 +1,4 @@ -using System; -using BCnEncoder.Shared; -using SixLabors.ImageSharp.PixelFormats; +using BCnEncoder.Shared; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs index 6839889..8f4cb18 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs @@ -19,7 +19,7 @@ public class EncoderOutputOptions public int MaxMipMapLevel { get; set; } = -1; /// - /// The compression Format to use. Default is BC1. + /// The compression Format to use. Default is Bc1. /// public CompressionFormat Format { get; set; } = CompressionFormat.Bc1; diff --git a/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs b/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs index d81fac1..eccf7e6 100644 --- a/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs +++ b/BCnEnc.Net/Shared/BinaryReaderWriterExtensions.cs @@ -1,7 +1,6 @@ using System; using System.IO; using System.Runtime.CompilerServices; -using System.Text; namespace BCnEncoder.Shared { diff --git a/BCnEnc.Net/Shared/Colors.cs b/BCnEnc.Net/Shared/Colors.cs index 03a2bc5..41de5dc 100644 --- a/BCnEnc.Net/Shared/Colors.cs +++ b/BCnEnc.Net/Shared/Colors.cs @@ -31,76 +31,76 @@ public override int GetHashCode() return !left.Equals(right); } - private const ushort RedMask_ = 0b11111_000000_00000; - private const int RedShift_ = 11; - private const ushort GreenMask_ = 0b00000_111111_00000; - private const int GreenShift_ = 5; - private const ushort BlueMask_ = 0b00000_000000_11111; + private const ushort RedMask = 0b11111_000000_00000; + private const int RedShift = 11; + private const ushort GreenMask = 0b00000_111111_00000; + private const int GreenShift = 5; + private const ushort BlueMask = 0b00000_000000_11111; public ushort data; public byte R { readonly get { - var r5 = (data & RedMask_) >> RedShift_; + var r5 = (data & RedMask) >> RedShift; return (byte)((r5 << 3) | (r5 >> 2)); } set { var r5 = value >> 3; - data = (ushort)(data & ~RedMask_); - data = (ushort)(data | (r5 << RedShift_)); + data = (ushort)(data & ~RedMask); + data = (ushort)(data | (r5 << RedShift)); } } public byte G { readonly get { - var g6 = (data & GreenMask_) >> GreenShift_; + var g6 = (data & GreenMask) >> GreenShift; return (byte)((g6 << 2) | (g6 >> 4)); } set { var g6 = value >> 2; - data = (ushort)(data & ~GreenMask_); - data = (ushort)(data | (g6 << GreenShift_)); + data = (ushort)(data & ~GreenMask); + data = (ushort)(data | (g6 << GreenShift)); } } public byte B { readonly get { - var b5 = data & BlueMask_; + var b5 = data & BlueMask; return (byte)((b5 << 3) | (b5 >> 2)); } set { var b5 = value >> 3; - data = (ushort)(data & ~BlueMask_); + data = (ushort)(data & ~BlueMask); data = (ushort)(data | b5); } } public int RawR { - readonly get { return (data & RedMask_) >> RedShift_; } + readonly get { return (data & RedMask) >> RedShift; } set { if (value > 31) value = 31; if (value < 0) value = 0; - data = (ushort)(data & ~RedMask_); - data = (ushort)(data | (value << RedShift_)); + data = (ushort)(data & ~RedMask); + data = (ushort)(data | (value << RedShift)); } } public int RawG { - readonly get { return (data & GreenMask_) >> GreenShift_; } + readonly get { return (data & GreenMask) >> GreenShift; } set { if (value > 63) value = 63; if (value < 0) value = 0; - data = (ushort)(data & ~GreenMask_); - data = (ushort)(data | (value << GreenShift_)); + data = (ushort)(data & ~GreenMask); + data = (ushort)(data | (value << GreenShift)); } } public int RawB { - readonly get { return data & BlueMask_; } + readonly get { return data & BlueMask; } set { if (value > 31) value = 31; if (value < 0) value = 0; - data = (ushort)(data & ~BlueMask_); + data = (ushort)(data & ~BlueMask); data = (ushort)(data | value); } } diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 4f3b1e7..6738d4e 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -1,6 +1,5 @@ using System; using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared @@ -130,5 +129,12 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int return output; } + + public static int CalculateNumOfBlocks(int pixelWidth, int pixelHeight) + { + int blocksWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); + int blocksHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); + return blocksWidth * blocksHeight; + } } } diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index 65e3919..7e66fb4 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -6,7 +6,7 @@ namespace BCnEncoder.Shared { - public static class MipMapper + internal static class MipMapper { public static uint CalculateMipChainLength(int width, int height, uint maxNumMipMaps) { @@ -28,6 +28,25 @@ public static uint CalculateMipChainLength(int width, int height, uint maxNumMip return output; } + public static void CalculateMipLevelSize(int width, int height, int mipIdx, out int mipWidth, out int mipHeight) + { + mipWidth = width; + mipHeight = height; + + if (mipIdx == 0) return; + + for (uint mipLevel = 1; mipLevel < 99999; mipLevel++) + { + mipWidth = Math.Max(1, width / (int)Math.Pow(2, mipLevel)); + mipHeight = Math.Max(1, height / (int)Math.Pow(2, mipLevel)); + if (mipLevel == mipIdx) return; + if (mipWidth == 1 && mipHeight == 1) + { + return; + } + } + } + public static List> GenerateMipChain(Image sourceImage, ref uint numMipMaps) { var result = new List>(); result.Add(sourceImage.Clone()); diff --git a/BCnEnc.Net/Shared/PcaVectors.cs b/BCnEnc.Net/Shared/PcaVectors.cs index cd735f3..b6d9390 100644 --- a/BCnEnc.Net/Shared/PcaVectors.cs +++ b/BCnEnc.Net/Shared/PcaVectors.cs @@ -1,15 +1,13 @@ using System; +using System.Numerics; using SixLabors.ImageSharp.PixelFormats; -using Vector3 = System.Numerics.Vector3; -using Vector4 = System.Numerics.Vector4; -using Matrix4x4 = System.Numerics.Matrix4x4; namespace BCnEncoder.Shared { internal static class PcaVectors { - private const int C5655Mask_ = 0xF8; - private const int C5656Mask_ = 0xFC; + private const int C565_5Mask = 0xF8; + private const int C565_6Mask = 0xFC; private static void ConvertToVector4(ReadOnlySpan colors, Span vectors) { @@ -223,13 +221,13 @@ public static void GetMinMaxColor565(Span colors, Vector3 mean, Vector3 maxB = maxB <= 255 ? maxB : 255; // Optimal round - minR = (minR & C5655Mask_) | (minR >> 5); - minG = (minG & C5656Mask_) | (minG >> 6); - minB = (minB & C5655Mask_) | (minB >> 5); + minR = (minR & C565_5Mask) | (minR >> 5); + minG = (minG & C565_6Mask) | (minG >> 6); + minB = (minB & C565_5Mask) | (minB >> 5); - maxR = (maxR & C5655Mask_) | (maxR >> 5); - maxG = (maxG & C5656Mask_) | (maxG >> 6); - maxB = (maxB & C5655Mask_) | (maxB >> 5); + maxR = (maxR & C565_5Mask) | (maxR >> 5); + maxG = (maxG & C565_6Mask) | (maxG >> 6); + maxB = (maxB & C565_5Mask) | (maxB >> 5); min = new ColorRgb565((byte)minR, (byte)minG, (byte)minB); max = new ColorRgb565((byte)maxR, (byte)maxG, (byte)maxB); diff --git a/BCnEncNet.sln b/BCnEncNet.sln index 96b2490..e93a46c 100644 --- a/BCnEncNet.sln +++ b/BCnEncNet.sln @@ -7,6 +7,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCnEncoder", "BCnEnc.Net\BC EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCnEncTests", "BCnEncTests\BCnEncTests.csproj", "{8E5E366B-9782-4194-AC85-602E8387496A}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{5B2FBB0B-E3B9-44EB-BBE6-E7EC9F3E56AD}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/BCnEncNet.sln.DotSettings b/BCnEncNet.sln.DotSettings new file mode 100644 index 0000000..7ba4779 --- /dev/null +++ b/BCnEncNet.sln.DotSettings @@ -0,0 +1,4 @@ + + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> \ No newline at end of file diff --git a/BCnEncTests/BC1Tests.cs b/BCnEncTests/BC1Tests.cs index 4171d73..1bd4006 100644 --- a/BCnEncTests/BC1Tests.cs +++ b/BCnEncTests/BC1Tests.cs @@ -4,7 +4,7 @@ namespace BCnEncTests { - public class BC1Tests + public class Bc1Tests { [Fact] diff --git a/BCnEncTests/Bc7BlockTests.cs b/BCnEncTests/Bc7BlockTests.cs index d933884..ac0ce90 100644 --- a/BCnEncTests/Bc7BlockTests.cs +++ b/BCnEncTests/Bc7BlockTests.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections.Generic; +using System; using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using System.Security.Cryptography.X509Certificates; -using System.Text; using BCnEncoder.Shared; using Xunit; diff --git a/BCnEncTests/BlockTests.cs b/BCnEncTests/BlockTests.cs index 2213ed6..df98d80 100644 --- a/BCnEncTests/BlockTests.cs +++ b/BCnEncTests/BlockTests.cs @@ -1,7 +1,6 @@ -using System; +using System; using BCnEncoder.Shared; using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using Xunit; diff --git a/BCnEncTests/ClusterTests.cs b/BCnEncTests/ClusterTests.cs index 26e613c..fabaf69 100644 --- a/BCnEncTests/ClusterTests.cs +++ b/BCnEncTests/ClusterTests.cs @@ -1,12 +1,7 @@ -using System; -using System.Collections.Generic; +using System; using System.IO; -using System.Linq; -using System.Text; using BCnEncoder.Shared; using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Advanced; -using SixLabors.ImageSharp.PixelFormats; using Xunit; namespace BCnEncTests @@ -15,7 +10,7 @@ public class ClusterTests { [Fact] public void Clusterize() { - using var testImage = ImageLoader.testBlur1.Clone(); + using var testImage = ImageLoader.TestBlur1.Clone(); if (!testImage.TryGetSinglePixelSpan(out var pixels)) { throw new Exception("Cannot get pixel span."); diff --git a/BCnEncTests/DdsReadTests.cs b/BCnEncTests/DdsReadTests.cs index 4ba15d7..879abe2 100644 --- a/BCnEncTests/DdsReadTests.cs +++ b/BCnEncTests/DdsReadTests.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; +using System; using System.IO; -using System.Linq; -using System.Text; using BCnEncoder.Decoder; using BCnEncoder.Shared; using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Advanced; -using SixLabors.ImageSharp.PixelFormats; using Xunit; namespace BCnEncTests @@ -56,7 +51,7 @@ public void ReadBc1() { } [Fact] - public void ReadBc1a() { + public void ReadBc1A() { using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1a.dds"); DdsFile file = DdsFile.Load(fs); Assert.Equal(DxgiFormat.DxgiFormatBc1Unorm, file.header.ddsPixelFormat.DxgiFormat); diff --git a/BCnEncTests/DdsWritingTests.cs b/BCnEncTests/DdsWritingTests.cs index 590eeb9..a6a12fc 100644 --- a/BCnEncTests/DdsWritingTests.cs +++ b/BCnEncTests/DdsWritingTests.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; using System.IO; -using System.Text; using BCnEncoder.Encoder; using BCnEncoder.Shared; using Xunit; @@ -12,7 +9,7 @@ public class DdsWritingTests { [Fact] public void DdsWriteRgba() { - var image = ImageLoader.testLenna; + var image = ImageLoader.TestLenna; BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; @@ -27,7 +24,7 @@ public void DdsWriteRgba() { [Fact] public void DdsWriteBc1() { - var image = ImageLoader.testLenna; + var image = ImageLoader.TestLenna; BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; @@ -42,7 +39,7 @@ public void DdsWriteBc1() { [Fact] public void DdsWriteBc2() { - var image = ImageLoader.testAlpha1; + var image = ImageLoader.TestAlpha1; BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; @@ -57,7 +54,7 @@ public void DdsWriteBc2() { [Fact] public void DdsWriteBc3() { - var image = ImageLoader.testAlpha1; + var image = ImageLoader.TestAlpha1; BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; @@ -72,7 +69,7 @@ public void DdsWriteBc3() { [Fact] public void DdsWriteBc4() { - var image = ImageLoader.testHeight1; + var image = ImageLoader.TestHeight1; BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; @@ -87,7 +84,7 @@ public void DdsWriteBc4() { [Fact] public void DdsWriteBc5() { - var image = ImageLoader.testRedGreen1; + var image = ImageLoader.TestRedGreen1; BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; @@ -102,7 +99,7 @@ public void DdsWriteBc5() { [Fact] public void DdsWriteBc7() { - var image = ImageLoader.testLenna; + var image = ImageLoader.TestLenna; BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; @@ -117,7 +114,7 @@ public void DdsWriteBc7() { [Fact] public void DdsWriteCubemap() { - var images = ImageLoader.testCubemap; + var images = ImageLoader.TestCubemap; BcEncoder encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; diff --git a/BCnEncTests/DecodingTests.cs b/BCnEncTests/DecodingTests.cs index 9e69aed..d5260fa 100644 --- a/BCnEncTests/DecodingTests.cs +++ b/BCnEncTests/DecodingTests.cs @@ -1,5 +1,3 @@ -using System; -using System.Collections.Generic; using System.IO; using BCnEncoder.Decoder; using BCnEncoder.Shared; diff --git a/BCnEncTests/EncodingTest.cs b/BCnEncTests/EncodingTest.cs index 8c8c4c1..82c5524 100644 --- a/BCnEncTests/EncodingTest.cs +++ b/BCnEncTests/EncodingTest.cs @@ -1,9 +1,6 @@ using System.IO; using BCnEncoder.Encoder; using BCnEncoder.Shared; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Advanced; -using SixLabors.ImageSharp.PixelFormats; using Xunit; using Xunit.Abstractions; @@ -21,7 +18,7 @@ public Bc1GradientTest(ITestOutputHelper output) [Fact] public void Bc1GradientBestQuality() { - var image = ImageLoader.testGradient1; + var image = ImageLoader.TestGradient1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, @@ -33,7 +30,7 @@ public void Bc1GradientBestQuality() [Fact] public void Bc1GradientBalanced() { - var image = ImageLoader.testGradient1; + var image = ImageLoader.TestGradient1; TestHelper.ExecuteEncodingTest(image, @@ -46,7 +43,7 @@ public void Bc1GradientBalanced() [Fact] public void Bc1GradientFast() { - var image = ImageLoader.testGradient1; + var image = ImageLoader.TestGradient1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, @@ -70,7 +67,7 @@ public Bc1DiffuseTest(ITestOutputHelper output) [Fact] public void Bc1DiffuseBestQuality() { - var image = ImageLoader.testDiffuse1; + var image = ImageLoader.TestDiffuse1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, @@ -82,7 +79,7 @@ public void Bc1DiffuseBestQuality() [Fact] public void Bc1DiffuseBalanced() { - var image = ImageLoader.testDiffuse1; + var image = ImageLoader.TestDiffuse1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, @@ -94,7 +91,7 @@ public void Bc1DiffuseBalanced() [Fact] public void Bc1DiffuseFast() { - var image = ImageLoader.testDiffuse1; + var image = ImageLoader.TestDiffuse1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, @@ -119,7 +116,7 @@ public Bc1BlurryTest(ITestOutputHelper output) [Fact] public void Bc1BlurBestQuality() { - var image = ImageLoader.testBlur1; + var image = ImageLoader.TestBlur1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, @@ -131,7 +128,7 @@ public void Bc1BlurBestQuality() [Fact] public void Bc1BlurBalanced() { - var image = ImageLoader.testBlur1; + var image = ImageLoader.TestBlur1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, @@ -143,7 +140,7 @@ public void Bc1BlurBalanced() [Fact] public void Bc1BlurFast() { - var image = ImageLoader.testBlur1; + var image = ImageLoader.TestBlur1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, @@ -166,9 +163,9 @@ public Bc1ASpriteTest(ITestOutputHelper output) [Fact] - public void Bc1aSpriteBestQuality() + public void Bc1ASpriteBestQuality() { - var image = ImageLoader.testTransparentSprite1; + var image = ImageLoader.TestTransparentSprite1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1WithAlpha, @@ -178,9 +175,9 @@ public void Bc1aSpriteBestQuality() } [Fact] - public void Bc1aSpriteBalanced() + public void Bc1ASpriteBalanced() { - var image = ImageLoader.testTransparentSprite1; + var image = ImageLoader.TestTransparentSprite1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1WithAlpha, @@ -190,9 +187,9 @@ public void Bc1aSpriteBalanced() } [Fact] - public void Bc1aSpriteFast() + public void Bc1ASpriteFast() { - var image = ImageLoader.testTransparentSprite1; + var image = ImageLoader.TestTransparentSprite1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1WithAlpha, @@ -217,7 +214,7 @@ public Bc2GradientTest(ITestOutputHelper output) [Fact] public void Bc2GradientBestQuality() { - var image = ImageLoader.testAlphaGradient1; + var image = ImageLoader.TestAlphaGradient1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc2, @@ -229,7 +226,7 @@ public void Bc2GradientBestQuality() [Fact] public void Bc2GradientBalanced() { - var image = ImageLoader.testAlphaGradient1; + var image = ImageLoader.TestAlphaGradient1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc2, @@ -241,7 +238,7 @@ public void Bc2GradientBalanced() [Fact] public void Bc2GradientFast() { - var image = ImageLoader.testAlphaGradient1; + var image = ImageLoader.TestAlphaGradient1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc2, @@ -266,7 +263,7 @@ public Bc3GradientTest(ITestOutputHelper output) [Fact] public void Bc3GradientBestQuality() { - var image = ImageLoader.testAlphaGradient1; + var image = ImageLoader.TestAlphaGradient1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc3, @@ -278,7 +275,7 @@ public void Bc3GradientBestQuality() [Fact] public void Bc3GradientBalanced() { - var image = ImageLoader.testAlphaGradient1; + var image = ImageLoader.TestAlphaGradient1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc3, @@ -290,7 +287,7 @@ public void Bc3GradientBalanced() [Fact] public void Bc3GradientFast() { - var image = ImageLoader.testAlphaGradient1; + var image = ImageLoader.TestAlphaGradient1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc3, @@ -315,7 +312,7 @@ public Bc4RedTest(ITestOutputHelper output) [Fact] public void Bc4RedBestQuality() { - var image = ImageLoader.testHeight1; + var image = ImageLoader.TestHeight1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc4, @@ -327,7 +324,7 @@ public void Bc4RedBestQuality() [Fact] public void Bc4RedBalanced() { - var image = ImageLoader.testHeight1; + var image = ImageLoader.TestHeight1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc4, @@ -339,7 +336,7 @@ public void Bc4RedBalanced() [Fact] public void Bc4RedFast() { - var image = ImageLoader.testHeight1; + var image = ImageLoader.TestHeight1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc4, @@ -364,7 +361,7 @@ public Bc5RedGreenTest(ITestOutputHelper output) [Fact] public void Bc5RedGreenBestQuality() { - var image = ImageLoader.testRedGreen1; + var image = ImageLoader.TestRedGreen1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc5, @@ -376,7 +373,7 @@ public void Bc5RedGreenBestQuality() [Fact] public void Bc5RedGreenBalanced() { - var image = ImageLoader.testRedGreen1; + var image = ImageLoader.TestRedGreen1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc5, @@ -388,7 +385,7 @@ public void Bc5RedGreenBalanced() [Fact] public void Bc5RedGreenFast() { - var image = ImageLoader.testRedGreen1; + var image = ImageLoader.TestRedGreen1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc5, @@ -412,7 +409,7 @@ public Bc7RgbTest(ITestOutputHelper output) [Fact] public void Bc7RgbBestQuality() { - var image = ImageLoader.testRgbHard1; + var image = ImageLoader.TestRgbHard1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, @@ -424,7 +421,7 @@ public void Bc7RgbBestQuality() [Fact] public void Bc7RgbBalanced() { - var image = ImageLoader.testRgbHard1; + var image = ImageLoader.TestRgbHard1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, @@ -436,7 +433,7 @@ public void Bc7RgbBalanced() [Fact] public void Bc7LennaBalanced() { - var image = ImageLoader.testLenna; + var image = ImageLoader.TestLenna; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, @@ -448,7 +445,7 @@ public void Bc7LennaBalanced() [Fact] public void Bc7RgbFast() { - var image = ImageLoader.testRgbHard1; + var image = ImageLoader.TestRgbHard1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, @@ -472,7 +469,7 @@ public Bc7RgbaTest(ITestOutputHelper output) [Fact] public void Bc7RgbaBestQuality() { - var image = ImageLoader.testAlpha1; + var image = ImageLoader.TestAlpha1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, @@ -484,7 +481,7 @@ public void Bc7RgbaBestQuality() [Fact] public void Bc7RgbaBalanced() { - var image = ImageLoader.testAlpha1; + var image = ImageLoader.TestAlpha1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, @@ -496,7 +493,7 @@ public void Bc7RgbaBalanced() [Fact] public void Bc7RgbaFast() { - var image = ImageLoader.testAlpha1; + var image = ImageLoader.TestAlpha1; TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, @@ -512,7 +509,7 @@ public class CubemapTest [Fact] public void WriteCubeMapFile() { - var images = ImageLoader.testCubemap; + var images = ImageLoader.TestCubemap; string filename = "encoding_bc1_cubemap.ktx"; diff --git a/BCnEncTests/ImageLoader.cs b/BCnEncTests/ImageLoader.cs index c840eb7..5008ef3 100644 --- a/BCnEncTests/ImageLoader.cs +++ b/BCnEncTests/ImageLoader.cs @@ -1,22 +1,22 @@ -using SixLabors.ImageSharp; +using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncTests { public static class ImageLoader { - public static Image testDiffuse1 { get; } = LoadTestImage("../../../testImages/test_diffuse_1_512.jpg"); - public static Image testBlur1 { get; } = LoadTestImage("../../../testImages/test_blur_1_512.jpg"); - public static Image testNormal1 { get; } = LoadTestImage("../../../testImages/test_normal_1_512.jpg"); - public static Image testHeight1 { get; } = LoadTestImage("../../../testImages/test_height_1_512.jpg"); - public static Image testGradient1 { get; } = LoadTestImage("../../../testImages/test_gradient_1_512.jpg"); - public static Image testTransparentSprite1 { get; } = LoadTestImage("../../../testImages/test_transparent.png"); - public static Image testAlphaGradient1 { get; } = LoadTestImage("../../../testImages/test_alphagradient_1_512.png"); - public static Image testAlpha1 { get; } = LoadTestImage("../../../testImages/test_alpha_1_512.png"); - public static Image testRedGreen1 { get; } = LoadTestImage("../../../testImages/test_red_green_1_64.png"); - public static Image testRgbHard1 { get; } = LoadTestImage("../../../testImages/test_rgb_hard_1.png"); - public static Image testLenna { get; } = LoadTestImage("../../../testImages/test_lenna_512.png"); + public static Image TestDiffuse1 { get; } = LoadTestImage("../../../testImages/test_diffuse_1_512.jpg"); + public static Image TestBlur1 { get; } = LoadTestImage("../../../testImages/test_blur_1_512.jpg"); + public static Image TestNormal1 { get; } = LoadTestImage("../../../testImages/test_normal_1_512.jpg"); + public static Image TestHeight1 { get; } = LoadTestImage("../../../testImages/test_height_1_512.jpg"); + public static Image TestGradient1 { get; } = LoadTestImage("../../../testImages/test_gradient_1_512.jpg"); + public static Image TestTransparentSprite1 { get; } = LoadTestImage("../../../testImages/test_transparent.png"); + public static Image TestAlphaGradient1 { get; } = LoadTestImage("../../../testImages/test_alphagradient_1_512.png"); + public static Image TestAlpha1 { get; } = LoadTestImage("../../../testImages/test_alpha_1_512.png"); + public static Image TestRedGreen1 { get; } = LoadTestImage("../../../testImages/test_red_green_1_64.png"); + public static Image TestRgbHard1 { get; } = LoadTestImage("../../../testImages/test_rgb_hard_1.png"); + public static Image TestLenna { get; } = LoadTestImage("../../../testImages/test_lenna_512.png"); - public static Image[] testCubemap { get; } = new [] { + public static Image[] TestCubemap { get; } = new [] { LoadTestImage("../../../testImages/cubemap/right.png"), LoadTestImage("../../../testImages/cubemap/left.png"), LoadTestImage("../../../testImages/cubemap/top.png"), diff --git a/BCnEncTests/PcaTests.cs b/BCnEncTests/PcaTests.cs index a3b500a..7ca0e18 100644 --- a/BCnEncTests/PcaTests.cs +++ b/BCnEncTests/PcaTests.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System; using BCnEncoder.Shared; using Xunit; using Vector4 = System.Numerics.Vector4; diff --git a/BCnEncTests/RawTests.cs b/BCnEncTests/RawTests.cs index e5dd478..0344ec5 100644 --- a/BCnEncTests/RawTests.cs +++ b/BCnEncTests/RawTests.cs @@ -1,38 +1,107 @@ -using System.IO; +using System.IO; using BCnEncoder.Decoder; using BCnEncoder.Encoder; using BCnEncoder.Shared; +using SixLabors.ImageSharp.Processing; using Xunit; namespace BCnEncTests { - public class RawTests - { - [Fact] - public void Decode() - { - using var fs = File.OpenRead(@"../../../testImages/test_decompress_bc1.ktx"); - var ktx = KtxFile.Load(fs); - var decoder = new BcDecoder(); - var encoder = new BcEncoder(); - - var originalImage = decoder.Decode(ktx); - - var rawBytes = encoder.EncodeToRawBytes(originalImage); - var recodedImage = decoder.DecodeRaw(rawBytes[0], CompressionFormat.Bc1, originalImage.Width, originalImage.Height); - - originalImage.TryGetSinglePixelSpan(out var originalPixels); - recodedImage.TryGetSinglePixelSpan(out var recodedPixels); - - var psnr=ImageQuality.PeakSignalToNoiseRatio(originalPixels, recodedPixels); - if (encoder.OutputOptions.Quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } - } - } + public class RawTests + { + [Fact] + public void EncodeDecode() + { + var inputImage = ImageLoader.TestGradient1; + var decoder = new BcDecoder(); + var encoder = new BcEncoder() + { + OutputOptions = { Quality = CompressionQuality.BestQuality } + }; + + var encodedRawBytes = encoder.EncodeToRawBytes(inputImage); + var decodedImage = decoder.DecodeRaw(encodedRawBytes[0], CompressionFormat.Bc1, inputImage.Width, inputImage.Height); + + ImageLoader.TestGradient1.TryGetSinglePixelSpan(out var originalPixels); + decodedImage.TryGetSinglePixelSpan(out var decodedPixels); + + var psnr = ImageQuality.PeakSignalToNoiseRatio(originalPixels, decodedPixels); + + Assert.True(psnr > 30); + } + + [Fact] + public void EncodeDecodeStream() + { + var inputImage = ImageLoader.TestGradient1; + var decoder = new BcDecoder(); + var encoder = new BcEncoder() + { + OutputOptions = { Quality = CompressionQuality.BestQuality } + }; + + var encodedRawBytes = encoder.EncodeToRawBytes(inputImage); + + using MemoryStream ms = new MemoryStream(encodedRawBytes[0]); + + Assert.Equal(0, ms.Position); + + var decodedImage = decoder.DecodeRaw(ms, CompressionFormat.Bc1, inputImage.Width, inputImage.Height); + + inputImage.TryGetSinglePixelSpan(out var originalPixels); + decodedImage.TryGetSinglePixelSpan(out var decodedPixels); + + var psnr = ImageQuality.PeakSignalToNoiseRatio(originalPixels, decodedPixels); + + Assert.True(psnr > 30); + } + + + [Fact] + public void EncodeDecodeAllMipMapsStream() + { + var inputImage = ImageLoader.TestGradient1; + var decoder = new BcDecoder(); + var encoder = new BcEncoder + { + OutputOptions = + { + Quality = CompressionQuality.BestQuality, + GenerateMipMaps = true, + MaxMipMapLevel = 0 + } + }; + + using MemoryStream ms = new MemoryStream(); + + var encodedRawBytes = encoder.EncodeToRawBytes(inputImage); + + int mipLevels = encoder.CalculateNumberOfMipLevels(inputImage); + Assert.True(mipLevels > 1); + + for (int i = 0; i < mipLevels; i++) + { + ms.Write(encodedRawBytes[i]); + } + + ms.Position = 0; + Assert.Equal(0, ms.Position); + + for (int i = 0; i < mipLevels; i++) + { + encoder.CalculateMipMapSize(inputImage, i, out int mipWidth, out int mipHeight); + using var resized = inputImage.Clone(x => x.Resize(mipWidth, mipHeight)); + + var decodedImage = decoder.DecodeRaw(ms, CompressionFormat.Bc1, mipWidth, mipHeight); + resized.TryGetSinglePixelSpan(out var originalPixels); + decodedImage.TryGetSinglePixelSpan(out var decodedPixels); + var psnr = ImageQuality.PeakSignalToNoiseRatio(originalPixels, decodedPixels); + Assert.True(psnr > 30); + } + + encoder.CalculateMipMapSize(inputImage, mipLevels - 1, out int lastMWidth, out int lastMHeight); + Assert.Equal(1, lastMWidth); + Assert.Equal(1, lastMWidth); + } + } } diff --git a/BCnEncTests/TestHelper.cs b/BCnEncTests/TestHelper.cs index e08e2db..4d23ce8 100644 --- a/BCnEncTests/TestHelper.cs +++ b/BCnEncTests/TestHelper.cs @@ -1,12 +1,9 @@ -using System; -using System.Collections.Generic; +using System; using System.IO; -using System.Text; using BCnEncoder.Decoder; using BCnEncoder.Encoder; using BCnEncoder.Shared; using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using Xunit; using Xunit.Abstractions; From 8ae967e85abc7499c3a937d07c48504b9a55238c Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Wed, 13 Jan 2021 17:19:52 +0100 Subject: [PATCH 016/116] Add async API for decoding; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 223 ++-- BCnEnc.Net/Decoder/BcDecoder.cs | 1226 ++++++++++-------- BCnEnc.Net/Decoder/Options/DecoderOptions.cs | 23 + BCnEnc.Net/Decoder/RawDecoder.cs | 367 ++++-- BCnEnc.Net/Encoder/Options/EncoderOptions.cs | 33 +- BCnEnc.Net/Shared/AsyncOperation.cs | 52 + BCnEnc.Net/Shared/OperationContext.cs | 26 + 7 files changed, 1167 insertions(+), 783 deletions(-) create mode 100644 BCnEnc.Net/Decoder/Options/DecoderOptions.cs create mode 100644 BCnEnc.Net/Shared/AsyncOperation.cs create mode 100644 BCnEnc.Net/Shared/OperationContext.cs diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index c4e6bc6..bae8b7b 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -1,108 +1,131 @@ -using System; +using System; using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Threading.Tasks; using BCnEncoder.Shared; namespace BCnEncoder.Decoder { - internal interface IBcBlockDecoder - { - RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, - out int blockHeight); - } - - internal abstract class BaseBcBlockDecoder : IBcBlockDecoder - where T : unmanaged - { - public RawBlock4X4Rgba32[,] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight, out int blockWidth, out int blockHeight) - { - blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); - - if (data.Length != blockWidth * blockHeight * Unsafe.SizeOf()) - { - throw new InvalidDataException("Given data does not match expected length."); - } - - var encodedBlocks = MemoryMarshal.Cast(data); - - var output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; - - for (var x = 0; x < blockWidth; x++) - { - for (var y = 0; y < blockHeight; y++) - { - output[x, y] = DecodeBlock(encodedBlocks[x + y * blockWidth]); - } - } - - return output; - } - - protected abstract RawBlock4X4Rgba32 DecodeBlock(T block); - } - - internal class Bc1NoAlphaDecoder : BaseBcBlockDecoder - { - protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) - { - return block.Decode(false); - } - } - - internal class Bc1ADecoder : BaseBcBlockDecoder - { - protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) - { - return block.Decode(true); - } - } - - internal class Bc2Decoder : BaseBcBlockDecoder - { - protected override RawBlock4X4Rgba32 DecodeBlock(Bc2Block block) - { - return block.Decode(); - } - } - - internal class Bc3Decoder : BaseBcBlockDecoder - { - protected override RawBlock4X4Rgba32 DecodeBlock(Bc3Block block) - { - return block.Decode(); - } - } - - internal class Bc4Decoder : BaseBcBlockDecoder - { - private readonly bool redAsLuminance; - - public Bc4Decoder(bool redAsLuminance) - { - this.redAsLuminance = redAsLuminance; - } - - protected override RawBlock4X4Rgba32 DecodeBlock(Bc4Block block) - { - return block.Decode(redAsLuminance); - } - } - - internal class Bc5Decoder : BaseBcBlockDecoder - { - protected override RawBlock4X4Rgba32 DecodeBlock(Bc5Block block) - { - return block.Decode(); - } - } - - internal class Bc7Decoder : BaseBcBlockDecoder - { - protected override RawBlock4X4Rgba32 DecodeBlock(Bc7Block block) - { - return block.Decode(); - } - } + internal interface IBcBlockDecoder + { + RawBlock4X4Rgba32[,] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context, + out int blockWidth, out int blockHeight); + } + + internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmanaged + { + public RawBlock4X4Rgba32[,] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context, + out int blockWidth, out int blockHeight) + { + blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); + blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); + + if (data.Length != blockWidth * blockHeight * Unsafe.SizeOf()) + { + throw new InvalidDataException("Given data does not match expected length."); + } + + var output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; + + if (context.IsParallel) + { + var localBlockWidth = blockWidth; + + var options = new ParallelOptions + { + CancellationToken = context.CancellationToken, + MaxDegreeOfParallelism = context.TaskCount + }; + Parallel.For(0, blockWidth * blockHeight, options, i => + { + var encodedBlocks = MemoryMarshal.Cast(data.Span); + output[i % localBlockWidth, i / localBlockWidth] = DecodeBlock(encodedBlocks[i]); + }); + } + else + { + var encodedBlocks = MemoryMarshal.Cast(data.Span); + for (var x = 0; x < blockWidth; x++) + { + for (var y = 0; y < blockHeight; y++) + { + if (context.CancellationToken.IsCancellationRequested) + { + return output; + } + + output[x, y] = DecodeBlock(encodedBlocks[x + y * blockWidth]); + } + } + } + + return output; + } + + protected abstract RawBlock4X4Rgba32 DecodeBlock(T block); + } + + internal class Bc1NoAlphaDecoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) + { + return block.Decode(false); + } + } + + internal class Bc1ADecoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) + { + return block.Decode(true); + } + } + + internal class Bc2Decoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc2Block block) + { + return block.Decode(); + } + } + + internal class Bc3Decoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc3Block block) + { + return block.Decode(); + } + } + + internal class Bc4Decoder : BaseBcBlockDecoder + { + private readonly bool redAsLuminance; + + public Bc4Decoder(bool redAsLuminance) + { + this.redAsLuminance = redAsLuminance; + } + + protected override RawBlock4X4Rgba32 DecodeBlock(Bc4Block block) + { + return block.Decode(redAsLuminance); + } + } + + internal class Bc5Decoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc5Block block) + { + return block.Decode(); + } + } + + internal class Bc7Decoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(Bc7Block block) + { + return block.Decode(); + } + } } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index d453ba4..aea1501 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -1,552 +1,706 @@ -using System; -using System.IO; -using System.Runtime.CompilerServices; -using System.Text; using BCnEncoder.Decoder.Options; using BCnEncoder.Shared; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; +using System; +using System.IO; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; namespace BCnEncoder.Decoder { - /// + /// /// Decodes compressed files into Rgba Format. /// public class BcDecoder - { - /// - /// The input options of the decoder. - /// - public DecoderInputOptions InputOptions { get; } = new DecoderInputOptions(); - - /// - /// The output options of the decoder. - /// - public DecoderOutputOptions OutputOptions { get; } = new DecoderOutputOptions(); - - /// - /// Decode raw encoded image data. - /// - /// The stream containing the encoded data. - /// The Format the encoded data is in. - /// The pixelWidth of the image. - /// The pixelHeight of the image. - /// The decoded Rgba32 image. - public Image DecodeRaw(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight) - { - var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; - inputStream.Read(dataArray, 0, dataArray.Length); - - return DecodeRaw(dataArray, format, pixelWidth, pixelHeight); - } - - /// - /// Decode raw encoded image data. - /// - /// The array containing the encoded data. - /// The Format the encoded data is in. - /// The pixelWidth of the image. - /// The pixelHeight of the image. - /// The decoded Rgba32 image. - public Image DecodeRaw(ReadOnlySpan input, CompressionFormat format, int pixelWidth, int pixelHeight) - { - if (input.Length != GetBufferSize(format, pixelWidth, pixelHeight)) - { - throw new ArgumentException("The size of the input buffer does not match the expected size"); - } - - var isCompressedFormat = format.IsCompressedFormat(); - if (isCompressedFormat) - { - // Decode as compressed data - var decoder = GetDecoder(format); - var blocks = decoder.Decode(input, pixelWidth, pixelHeight, out var blockWidth, out var blockHeight); - - return ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, pixelWidth, pixelHeight); - } - - // Decode as raw data - var rawDecoder = GetRawDecoder(format); - - var image = new Image(pixelWidth, pixelHeight); - var output = rawDecoder.Decode(input, pixelWidth, pixelHeight); - if (!image.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - - output.CopyTo(pixels); - return image; - } - - /// - /// Read a Ktx or a Dds file from a stream and decode it. - /// - /// The stream containing a Ktx or Dds file. - /// The decoded Rgba32 image. - public Image Decode(Stream inputStream) - { - return Decode(inputStream, false)[0]; - } - - /// - /// Read a Ktx or a Dds file from a stream and decode it. - /// - /// The stream containing a Ktx or Dds file. - /// An array of decoded Rgba32 images. - public Image[] DecodeAllMipMaps(Stream inputStream) - { - return Decode(inputStream, true); - } - - /// - /// Read a Ktx file and decode it. - /// - /// The loaded Ktx file. - /// The decoded Rgba32 image. - public Image Decode(KtxFile file) - { - return Decode(file, false)[0]; - } - - /// - /// Read a Ktx file and decode it. - /// - /// The loaded Ktx file. - /// An array of decoded Rgba32 images. - public Image[] DecodeAllMipMaps(KtxFile file) - { - return Decode(file, true); - } - - /// - /// Read a Dds file and decode it. - /// - /// The loaded Dds file. - /// The decoded Rgba32 image. - public Image Decode(DdsFile file) - { - return Decode(file, false)[0]; - } - - /// - /// Read a Dds file and decode it. - /// - /// The loaded Dds file. - /// An array of decoded Rgba32 images. - public Image[] DecodeAllMipMaps(DdsFile file) - { - return Decode(file, true); - } - - /// - /// Load a KTX or DDS file from a stream and extract either the main image or all mip maps. - /// - /// The input stream to decode. - /// If all mip maps or only the main image should be decoded. - /// An array of decoded Rgba32 images. - private Image[] Decode(Stream inputStream, bool allMipMaps) - { - var position = inputStream.Position; - try - { - // Detect if file is a KTX or DDS by file extension - if (inputStream is FileStream fs) - { - var extension = Path.GetExtension(fs.Name).ToLower(); - switch (extension) - { - case ".dds": - var ddsFile = DdsFile.Load(inputStream); - return Decode(ddsFile, allMipMaps); - - case ".file": - var ktxFile = KtxFile.Load(inputStream); - return Decode(ktxFile, allMipMaps); - } - } - - // Otherwise detect KTX or DDS by content of the stream - bool isDds; - using (var br = new BinaryReader(inputStream, Encoding.UTF8, true)) - { - var magic = br.ReadUInt32(); - isDds = magic == 0x20534444U; - } - - inputStream.Seek(position, SeekOrigin.Begin); - - if (isDds) - { - var dds = DdsFile.Load(inputStream); - return Decode(dds, allMipMaps); - } - - var ktx = KtxFile.Load(inputStream); - return Decode(ktx, allMipMaps); - } - catch (Exception) - { - inputStream.Seek(position, SeekOrigin.Begin); - throw; - } - } - - /// - /// Load a KTX file and extract either the main image or all mip maps. - /// - /// The Ktx file to decode. - /// If all mip maps or only the main image should be decoded. - /// An array of decoded Rgba32 images. - private Image[] Decode(KtxFile file, bool allMipMaps) - { - var images = new Image[file.MipMaps.Count]; - - if (IsSupportedRawFormat(file.header.GlInternalFormat)) - { - var decoder = GetRawDecoder(file.header.GlInternalFormat); - - var mipMaps = allMipMaps ? file.MipMaps.Count : 1; - for (var mip = 0; mip < mipMaps; mip++) - { - var data = file.MipMaps[mip].Faces[0].Data; - var pixelWidth = file.MipMaps[mip].Width; - var pixelHeight = file.MipMaps[mip].Height; - - var image = new Image((int)pixelWidth, (int)pixelHeight); - var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); - if (!image.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - - output.CopyTo(pixels); - images[mip] = image; - } - } - else - { - var decoder = GetDecoder(file.header.GlInternalFormat); - if (decoder == null) - { - throw new NotSupportedException($"This Format is not supported: {file.header.GlInternalFormat}"); - } - - var mipMaps = allMipMaps ? file.MipMaps.Count : 1; - for (var mip = 0; mip < mipMaps; mip++) - { - var data = file.MipMaps[mip].Faces[0].Data; - var pixelWidth = file.MipMaps[mip].Width; - var pixelHeight = file.MipMaps[mip].Height; - - var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, out var blockWidth, out var blockHeight); - - images[mip] = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, (int)pixelWidth, (int)pixelHeight); - } - } - - return images; - } - - /// - /// Load a DDS file and extract either the main image or all mip maps. - /// - /// The Dds file to decode. - /// If all mip maps or only the main image should be decoded. - /// An array of decoded Rgba32 images. - private Image[] Decode(DdsFile file, bool allMipMaps) - { - var images = new Image[file.header.dwMipMapCount]; - - if (IsSupportedRawFormat(file.header.ddsPixelFormat.DxgiFormat)) - { - var decoder = GetRawDecoder(file.header.ddsPixelFormat.DxgiFormat); - - var mipMaps = allMipMaps ? file.header.dwMipMapCount : 1; - for (var mip = 0; mip < mipMaps; mip++) - { - var data = file.Faces[0].MipMaps[mip].Data; - var pixelWidth = file.Faces[0].MipMaps[mip].Width; - var pixelHeight = file.Faces[0].MipMaps[mip].Height; - - var image = new Image((int)pixelWidth, (int)pixelHeight); - var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight); - if (!image.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - - output.CopyTo(pixels); - images[mip] = image; - } - } - else - { - var format = file.header.ddsPixelFormat.IsDxt10Format ? - file.dxt10Header.dxgiFormat : - file.header.ddsPixelFormat.DxgiFormat; - var decoder = GetDecoder(format, file.header); - - if (decoder == null) - { - throw new NotSupportedException($"This Format is not supported: {format}"); - } - - for (var mip = 0; mip < file.header.dwMipMapCount; mip++) - { - var data = file.Faces[0].MipMaps[mip].Data; - var pixelWidth = file.Faces[0].MipMaps[mip].Width; - var pixelHeight = file.Faces[0].MipMaps[mip].Height; - - var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, out var blockWidth, - out var blockHeight); - - var image = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, - (int)pixelWidth, (int)pixelHeight); - - images[mip] = image; - } - } - - return images; - } - - private bool IsSupportedRawFormat(GlInternalFormat format) - { - switch (format) - { - case GlInternalFormat.GlR8: - case GlInternalFormat.GlRg8: - case GlInternalFormat.GlRgb8: - case GlInternalFormat.GlRgba8: - return true; - - default: - return false; - } - } - - private bool IsSupportedRawFormat(DxgiFormat format) - { - switch (format) - { - case DxgiFormat.DxgiFormatR8Unorm: - case DxgiFormat.DxgiFormatR8G8Unorm: - case DxgiFormat.DxgiFormatR8G8B8A8Unorm: - return true; - - default: - return false; - } - } - - private IBcBlockDecoder GetDecoder(GlInternalFormat format) - { - switch (format) - { - case GlInternalFormat.GlCompressedRgbS3TcDxt1Ext: - return new Bc1NoAlphaDecoder(); - - case GlInternalFormat.GlCompressedRgbaS3TcDxt1Ext: - return new Bc1ADecoder(); - - case GlInternalFormat.GlCompressedRgbaS3TcDxt3Ext: - return new Bc2Decoder(); - - case GlInternalFormat.GlCompressedRgbaS3TcDxt5Ext: - return new Bc3Decoder(); - - case GlInternalFormat.GlCompressedRedRgtc1Ext: - return new Bc4Decoder(OutputOptions.RedAsLuminance); - - case GlInternalFormat.GlCompressedRedGreenRgtc2Ext: - return new Bc5Decoder(); - - case GlInternalFormat.GlCompressedRgbaBptcUnormArb: - return new Bc7Decoder(); - - // TODO: Not sure what to do with SRGB input. - case GlInternalFormat.GlCompressedSrgbAlphaBptcUnormArb: - return new Bc7Decoder(); - - default: - return null; - } - } - - private IBcBlockDecoder GetDecoder(DxgiFormat format, DdsHeader header) - { - switch (format) - { - case DxgiFormat.DxgiFormatBc1Unorm: - case DxgiFormat.DxgiFormatBc1UnormSrgb: - case DxgiFormat.DxgiFormatBc1Typeless: - if ((header.ddsPixelFormat.dwFlags & PixelFormatFlags.DdpfAlphapixels) != 0) - return new Bc1ADecoder(); - - if (InputOptions.DdsBc1ExpectAlpha) - return new Bc1ADecoder(); - - return new Bc1NoAlphaDecoder(); - - case DxgiFormat.DxgiFormatBc2Unorm: - case DxgiFormat.DxgiFormatBc2UnormSrgb: - case DxgiFormat.DxgiFormatBc2Typeless: - return new Bc2Decoder(); - - case DxgiFormat.DxgiFormatBc3Unorm: - case DxgiFormat.DxgiFormatBc3UnormSrgb: - case DxgiFormat.DxgiFormatBc3Typeless: - return new Bc3Decoder(); - - case DxgiFormat.DxgiFormatBc4Unorm: - case DxgiFormat.DxgiFormatBc4Snorm: - case DxgiFormat.DxgiFormatBc4Typeless: - return new Bc4Decoder(OutputOptions.RedAsLuminance); - - case DxgiFormat.DxgiFormatBc5Unorm: - case DxgiFormat.DxgiFormatBc5Snorm: - case DxgiFormat.DxgiFormatBc5Typeless: - return new Bc5Decoder(); - - case DxgiFormat.DxgiFormatBc7Unorm: - case DxgiFormat.DxgiFormatBc7UnormSrgb: - case DxgiFormat.DxgiFormatBc7Typeless: - return new Bc7Decoder(); - - default: - return null; - } - } - - private IRawDecoder GetRawDecoder(GlInternalFormat format) - { - switch (format) - { - case GlInternalFormat.GlR8: - return new RawRDecoder(OutputOptions.RedAsLuminance); - - case GlInternalFormat.GlRg8: - return new RawRgDecoder(); - - case GlInternalFormat.GlRgb8: - return new RawRgbDecoder(); - - case GlInternalFormat.GlRgba8: - return new RawRgbaDecoder(); - - default: - return null; - } - } - - private IRawDecoder GetRawDecoder(DxgiFormat format) - { - switch (format) - { - case DxgiFormat.DxgiFormatR8Unorm: - return new RawRDecoder(OutputOptions.RedAsLuminance); - - case DxgiFormat.DxgiFormatR8G8Unorm: - return new RawRgDecoder(); - - case DxgiFormat.DxgiFormatR8G8B8A8Unorm: - return new RawRgbaDecoder(); - - default: - return null; - } - } - - private IBcBlockDecoder GetDecoder(CompressionFormat format) - { - switch (format) - { - case CompressionFormat.Bc1: - return new Bc1NoAlphaDecoder(); - - case CompressionFormat.Bc1WithAlpha: - return new Bc1ADecoder(); - - case CompressionFormat.Bc2: - return new Bc2Decoder(); - - case CompressionFormat.Bc3: - return new Bc3Decoder(); - - case CompressionFormat.Bc4: - return new Bc4Decoder(OutputOptions.RedAsLuminance); - - case CompressionFormat.Bc5: - return new Bc5Decoder(); - - case CompressionFormat.Bc7: - return new Bc7Decoder(); - - default: - return null; - } - } - - private IRawDecoder GetRawDecoder(CompressionFormat format) - { - switch (format) - { - case CompressionFormat.R: - return new RawRDecoder(OutputOptions.RedAsLuminance); - - case CompressionFormat.Rg: - return new RawRgDecoder(); - - case CompressionFormat.Rgb: - return new RawRgbDecoder(); - - case CompressionFormat.Rgba: - return new RawRgbaDecoder(); - - default: - throw new ArgumentOutOfRangeException(nameof(format), format, null); - } - } - - private int GetBufferSize(CompressionFormat format, int pixelWidth, int pixelHeight) - { - switch (format) - { - case CompressionFormat.R: - return pixelWidth * pixelHeight; - - case CompressionFormat.Rg: - return 2 * pixelWidth * pixelHeight; + { + /// + /// The input options of the decoder. + /// + public DecoderInputOptions InputOptions { get; } = new DecoderInputOptions(); + + /// + /// The options for the decoder. + /// + public DecoderOptions Options { get; } = new DecoderOptions(); + + /// + /// The output options of the decoder. + /// + public DecoderOutputOptions OutputOptions { get; } = new DecoderOutputOptions(); + + #region Async Api + + /// + /// Decode raw encoded image asynchronously. + /// + /// The stream containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public AsyncOperation> DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight) + { + var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; + inputStream.Read(dataArray, 0, dataArray.Length); + + return CreateAsyncOperation(token => DecodeRawInternal(dataArray, format, pixelWidth, pixelHeight, token)); + } + + /// + /// Decode raw encoded image data asynchronously. + /// + /// The array containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public AsyncOperation> DecodeRawAsync(byte[] input, CompressionFormat format, int pixelWidth, int pixelHeight) + { + return CreateAsyncOperation(token => DecodeRawInternal(input, format, pixelWidth, pixelHeight, token)); + } + + /// + /// Read a Ktx or a Dds file from a stream and decode it asynchronously. + /// + /// The stream containing a Ktx or Dds file. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public AsyncOperation> DecodeAsync(Stream inputStream) + { + return CreateAsyncOperation(token => Decode(inputStream, false, token)[0]); + } + + /// + /// Read a Ktx or a Dds file from a stream and decode it. + /// + /// The stream containing a Ktx or Dds file. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public AsyncOperation[]> DecodeAllMipMapsAsync(Stream inputStream) + { + return CreateAsyncOperation(token => Decode(inputStream, true, token)); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public AsyncOperation> DecodeAsync(KtxFile file) + { + return CreateAsyncOperation(token => Decode(file, false, token)[0]); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public AsyncOperation[]> DecodeAllMipMapsAsync(KtxFile file) + { + return CreateAsyncOperation(token => Decode(file, true, token)); + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public AsyncOperation> DecodeAsync(DdsFile file) + { + return CreateAsyncOperation(token => Decode(file, false, token)[0]); + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public AsyncOperation[]> DecodeAllMipMapsAsync(DdsFile file) + { + return CreateAsyncOperation(token => Decode(file, true, token)); + } + + #endregion + + #region Sync API + + /// + /// Decode raw encoded image data. + /// + /// The stream containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The decoded Rgba32 image. + public Image DecodeRaw(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight) + { + var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; + inputStream.Read(dataArray, 0, dataArray.Length); + + return DecodeRaw(dataArray, format, pixelWidth, pixelHeight); + } + + /// + /// Decode raw encoded image data. + /// + /// The array containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The decoded Rgba32 image. + public Image DecodeRaw(byte[] input, CompressionFormat format, int pixelWidth, int pixelHeight) + { + return DecodeRawInternal(input, format, pixelWidth, pixelHeight, default); + } + + /// + /// Read a Ktx or a Dds file from a stream and decode it. + /// + /// The stream containing a Ktx or Dds file. + /// The decoded Rgba32 image. + public Image Decode(Stream inputStream) + { + return Decode(inputStream, false, default)[0]; + } + + /// + /// Read a Ktx or a Dds file from a stream and decode it. + /// + /// The stream containing a Ktx or Dds file. + /// An array of decoded Rgba32 images. + public Image[] DecodeAllMipMaps(Stream inputStream) + { + return Decode(inputStream, true, default); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The decoded Rgba32 image. + public Image Decode(KtxFile file) + { + return Decode(file, false, default)[0]; + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// An array of decoded Rgba32 images. + public Image[] DecodeAllMipMaps(KtxFile file) + { + return Decode(file, true, default); + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The decoded Rgba32 image. + public Image Decode(DdsFile file) + { + return Decode(file, false, default)[0]; + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// An array of decoded Rgba32 images. + public Image[] DecodeAllMipMaps(DdsFile file) + { + return Decode(file, true, default); + } + + #endregion + + /// + /// Load a KTX or DDS file from a stream and extract either the main image or all mip maps. + /// + /// The input stream to decode. + /// If all mip maps or only the main image should be decoded. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// An array of decoded Rgba32 images. + private Image[] Decode(Stream inputStream, bool allMipMaps, CancellationToken token) + { + var position = inputStream.Position; + try + { + // Detect if file is a KTX or DDS by file extension + if (inputStream is FileStream fs) + { + var extension = Path.GetExtension(fs.Name).ToLower(); + switch (extension) + { + case ".dds": + var ddsFile = DdsFile.Load(inputStream); + return Decode(ddsFile, allMipMaps, token); + + case ".file": + var ktxFile = KtxFile.Load(inputStream); + return Decode(ktxFile, allMipMaps, token); + } + } + + // Otherwise detect KTX or DDS by content of the stream + bool isDds; + using (var br = new BinaryReader(inputStream, Encoding.UTF8, true)) + { + var magic = br.ReadUInt32(); + isDds = magic == 0x20534444U; + } + + inputStream.Seek(position, SeekOrigin.Begin); + + if (isDds) + { + var dds = DdsFile.Load(inputStream); + return Decode(dds, allMipMaps, token); + } + + var ktx = KtxFile.Load(inputStream); + return Decode(ktx, allMipMaps, token); + } + catch (Exception) + { + inputStream.Seek(position, SeekOrigin.Begin); + throw; + } + } + + /// + /// Load a KTX file and extract either the main image or all mip maps. + /// + /// The Ktx file to decode. + /// If all mip maps or only the main image should be decoded. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// An array of decoded Rgba32 images. + private Image[] Decode(KtxFile file, bool allMipMaps, CancellationToken token) + { + var images = new Image[file.MipMaps.Count]; + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = Options.IsParallel, + TaskCount = Options.TaskCount + }; + + if (IsSupportedRawFormat(file.header.GlInternalFormat)) + { + var decoder = GetRawDecoder(file.header.GlInternalFormat); + + var mipMaps = allMipMaps ? file.MipMaps.Count : 1; + for (var mip = 0; mip < mipMaps; mip++) + { + var data = file.MipMaps[mip].Faces[0].Data; + var pixelWidth = file.MipMaps[mip].Width; + var pixelHeight = file.MipMaps[mip].Height; + + var image = new Image((int)pixelWidth, (int)pixelHeight); + var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, context); + if (!image.TryGetSinglePixelSpan(out var pixels)) + { + throw new Exception("Cannot get pixel span."); + } + + output.CopyTo(pixels); + images[mip] = image; + } + } + else + { + var decoder = GetDecoder(file.header.GlInternalFormat); + if (decoder == null) + { + throw new NotSupportedException($"This Format is not supported: {file.header.GlInternalFormat}"); + } + + var mipMaps = allMipMaps ? file.MipMaps.Count : 1; + for (var mip = 0; mip < mipMaps; mip++) + { + var data = file.MipMaps[mip].Faces[0].Data; + var pixelWidth = file.MipMaps[mip].Width; + var pixelHeight = file.MipMaps[mip].Height; + + var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, context, + out var blockWidth, out var blockHeight); + + images[mip] = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, (int)pixelWidth, (int)pixelHeight); + } + } + + return images; + } + + /// + /// Load a DDS file and extract either the main image or all mip maps. + /// + /// The Dds file to decode. + /// If all mip maps or only the main image should be decoded. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// An array of decoded Rgba32 images. + private Image[] Decode(DdsFile file, bool allMipMaps, CancellationToken token) + { + var images = new Image[file.header.dwMipMapCount]; + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = Options.IsParallel, + TaskCount = Options.TaskCount + }; + + if (IsSupportedRawFormat(file.header.ddsPixelFormat.DxgiFormat)) + { + var decoder = GetRawDecoder(file.header.ddsPixelFormat.DxgiFormat); + + var mipMaps = allMipMaps ? file.header.dwMipMapCount : 1; + for (var mip = 0; mip < mipMaps; mip++) + { + var data = file.Faces[0].MipMaps[mip].Data; + var pixelWidth = file.Faces[0].MipMaps[mip].Width; + var pixelHeight = file.Faces[0].MipMaps[mip].Height; + + var image = new Image((int)pixelWidth, (int)pixelHeight); + var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, context); + if (!image.TryGetSinglePixelSpan(out var pixels)) + { + throw new Exception("Cannot get pixel span."); + } + + output.CopyTo(pixels); + images[mip] = image; + } + } + else + { + var format = file.header.ddsPixelFormat.IsDxt10Format ? + file.dxt10Header.dxgiFormat : + file.header.ddsPixelFormat.DxgiFormat; + var decoder = GetDecoder(format, file.header); + + if (decoder == null) + { + throw new NotSupportedException($"This Format is not supported: {format}"); + } + + for (var mip = 0; mip < file.header.dwMipMapCount; mip++) + { + var data = file.Faces[0].MipMaps[mip].Data; + var pixelWidth = file.Faces[0].MipMaps[mip].Width; + var pixelHeight = file.Faces[0].MipMaps[mip].Height; + + var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, context, + out var blockWidth, out var blockHeight); + + var image = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, + (int)pixelWidth, (int)pixelHeight); + + images[mip] = image; + } + } + + return images; + } + + /// + /// Decode raw encoded image asynchronously. + /// + /// The array containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The cancellation token for this operation. May be default, if the operation is not asynchronous. + /// The decoded Rgba32 image. + private Image DecodeRawInternal(byte[] input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token) + { + if (input.Length != GetBufferSize(format, pixelWidth, pixelHeight)) + { + throw new ArgumentException("The size of the input buffer does not match the expected size"); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = Options.IsParallel, + TaskCount = Options.TaskCount + }; + + var isCompressedFormat = format.IsCompressedFormat(); + if (isCompressedFormat) + { + // Decode as compressed data + var decoder = GetDecoder(format); + var blocks = decoder.Decode(input, pixelWidth, pixelHeight, context, out var blockWidth, out var blockHeight); + + return ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, pixelWidth, pixelHeight); + } + + // Decode as raw data + var rawDecoder = GetRawDecoder(format); + + var image = new Image(pixelWidth, pixelHeight); + var output = rawDecoder.Decode(input, pixelWidth, pixelHeight, context); + if (!image.TryGetSinglePixelSpan(out var pixels)) + { + throw new Exception("Cannot get pixel span."); + } + + output.CopyTo(pixels); + return image; + } + + #region Support + + private AsyncOperation CreateAsyncOperation(Func func) + { + var operation = new AsyncOperation(); + operation.Start(func); + + return operation; + } + + private bool IsSupportedRawFormat(GlInternalFormat format) + { + switch (format) + { + case GlInternalFormat.GlR8: + case GlInternalFormat.GlRg8: + case GlInternalFormat.GlRgb8: + case GlInternalFormat.GlRgba8: + return true; + + default: + return false; + } + } + + private bool IsSupportedRawFormat(DxgiFormat format) + { + switch (format) + { + case DxgiFormat.DxgiFormatR8Unorm: + case DxgiFormat.DxgiFormatR8G8Unorm: + case DxgiFormat.DxgiFormatR8G8B8A8Unorm: + return true; + + default: + return false; + } + } + + private IBcBlockDecoder GetDecoder(GlInternalFormat format) + { + switch (format) + { + case GlInternalFormat.GlCompressedRgbS3TcDxt1Ext: + return new Bc1NoAlphaDecoder(); + + case GlInternalFormat.GlCompressedRgbaS3TcDxt1Ext: + return new Bc1ADecoder(); + + case GlInternalFormat.GlCompressedRgbaS3TcDxt3Ext: + return new Bc2Decoder(); + + case GlInternalFormat.GlCompressedRgbaS3TcDxt5Ext: + return new Bc3Decoder(); + + case GlInternalFormat.GlCompressedRedRgtc1Ext: + return new Bc4Decoder(OutputOptions.RedAsLuminance); + + case GlInternalFormat.GlCompressedRedGreenRgtc2Ext: + return new Bc5Decoder(); + + case GlInternalFormat.GlCompressedRgbaBptcUnormArb: + return new Bc7Decoder(); + + // TODO: Not sure what to do with SRGB input. + case GlInternalFormat.GlCompressedSrgbAlphaBptcUnormArb: + return new Bc7Decoder(); + + default: + return null; + } + } + + private IBcBlockDecoder GetDecoder(DxgiFormat format, DdsHeader header) + { + switch (format) + { + case DxgiFormat.DxgiFormatBc1Unorm: + case DxgiFormat.DxgiFormatBc1UnormSrgb: + case DxgiFormat.DxgiFormatBc1Typeless: + if ((header.ddsPixelFormat.dwFlags & PixelFormatFlags.DdpfAlphapixels) != 0) + return new Bc1ADecoder(); + + if (InputOptions.DdsBc1ExpectAlpha) + return new Bc1ADecoder(); + + return new Bc1NoAlphaDecoder(); + + case DxgiFormat.DxgiFormatBc2Unorm: + case DxgiFormat.DxgiFormatBc2UnormSrgb: + case DxgiFormat.DxgiFormatBc2Typeless: + return new Bc2Decoder(); + + case DxgiFormat.DxgiFormatBc3Unorm: + case DxgiFormat.DxgiFormatBc3UnormSrgb: + case DxgiFormat.DxgiFormatBc3Typeless: + return new Bc3Decoder(); + + case DxgiFormat.DxgiFormatBc4Unorm: + case DxgiFormat.DxgiFormatBc4Snorm: + case DxgiFormat.DxgiFormatBc4Typeless: + return new Bc4Decoder(OutputOptions.RedAsLuminance); + + case DxgiFormat.DxgiFormatBc5Unorm: + case DxgiFormat.DxgiFormatBc5Snorm: + case DxgiFormat.DxgiFormatBc5Typeless: + return new Bc5Decoder(); + + case DxgiFormat.DxgiFormatBc7Unorm: + case DxgiFormat.DxgiFormatBc7UnormSrgb: + case DxgiFormat.DxgiFormatBc7Typeless: + return new Bc7Decoder(); + + default: + return null; + } + } + + private IRawDecoder GetRawDecoder(GlInternalFormat format) + { + switch (format) + { + case GlInternalFormat.GlR8: + return new RawRDecoder(OutputOptions.RedAsLuminance); + + case GlInternalFormat.GlRg8: + return new RawRgDecoder(); + + case GlInternalFormat.GlRgb8: + return new RawRgbDecoder(); + + case GlInternalFormat.GlRgba8: + return new RawRgbaDecoder(); + + default: + return null; + } + } + + private IRawDecoder GetRawDecoder(DxgiFormat format) + { + switch (format) + { + case DxgiFormat.DxgiFormatR8Unorm: + return new RawRDecoder(OutputOptions.RedAsLuminance); + + case DxgiFormat.DxgiFormatR8G8Unorm: + return new RawRgDecoder(); + + case DxgiFormat.DxgiFormatR8G8B8A8Unorm: + return new RawRgbaDecoder(); + + default: + return null; + } + } + + private IBcBlockDecoder GetDecoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.Bc1: + return new Bc1NoAlphaDecoder(); + + case CompressionFormat.Bc1WithAlpha: + return new Bc1ADecoder(); + + case CompressionFormat.Bc2: + return new Bc2Decoder(); + + case CompressionFormat.Bc3: + return new Bc3Decoder(); + + case CompressionFormat.Bc4: + return new Bc4Decoder(OutputOptions.RedAsLuminance); + + case CompressionFormat.Bc5: + return new Bc5Decoder(); + + case CompressionFormat.Bc7: + return new Bc7Decoder(); + + default: + return null; + } + } + + private IRawDecoder GetRawDecoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.R: + return new RawRDecoder(OutputOptions.RedAsLuminance); + + case CompressionFormat.Rg: + return new RawRgDecoder(); + + case CompressionFormat.Rgb: + return new RawRgbDecoder(); + + case CompressionFormat.Rgba: + return new RawRgbaDecoder(); + + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } + } + + private int GetBufferSize(CompressionFormat format, int pixelWidth, int pixelHeight) + { + switch (format) + { + case CompressionFormat.R: + return pixelWidth * pixelHeight; + + case CompressionFormat.Rg: + return 2 * pixelWidth * pixelHeight; + + case CompressionFormat.Rgb: + return 3 * pixelWidth * pixelHeight; + + case CompressionFormat.Rgba: + return 4 * pixelWidth * pixelHeight; + + case CompressionFormat.Bc1: + case CompressionFormat.Bc1WithAlpha: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + case CompressionFormat.Bc2: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + case CompressionFormat.Bc3: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Rgb: - return 3 * pixelWidth * pixelHeight; - - case CompressionFormat.Rgba: - return 4 * pixelWidth * pixelHeight; - - case CompressionFormat.Bc1: - case CompressionFormat.Bc1WithAlpha: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + case CompressionFormat.Bc4: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Bc2: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + case CompressionFormat.Bc5: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Bc3: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + case CompressionFormat.Bc7: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Bc4: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - - case CompressionFormat.Bc5: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - - case CompressionFormat.Bc7: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } + } - default: - throw new ArgumentOutOfRangeException(nameof(format), format, null); - } - } - } + #endregion + } } diff --git a/BCnEnc.Net/Decoder/Options/DecoderOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderOptions.cs new file mode 100644 index 0000000..08dc044 --- /dev/null +++ b/BCnEnc.Net/Decoder/Options/DecoderOptions.cs @@ -0,0 +1,23 @@ +using System; + +namespace BCnEncoder.Decoder.Options +{ + /// + /// General options for the decoder. + /// + public class DecoderOptions + { + /// + /// Whether the blocks should be decoded in parallel. This can be much faster than single-threaded decoding, + /// but is slow if multiple textures are being processed at the same time. + /// When a debugger is attached, the decoder defaults to single-threaded operation to ease debugging. + /// Default is false. + /// + public bool IsParallel { get; set; } + + /// + /// Determines how many tasks should be used for parallel processing. + /// + public int TaskCount { get; set; } = Environment.ProcessorCount; + } +} diff --git a/BCnEnc.Net/Decoder/RawDecoder.cs b/BCnEnc.Net/Decoder/RawDecoder.cs index 64332e3..055e60f 100644 --- a/BCnEnc.Net/Decoder/RawDecoder.cs +++ b/BCnEnc.Net/Decoder/RawDecoder.cs @@ -1,139 +1,238 @@ -using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.PixelFormats; using System; +using System.Threading.Tasks; namespace BCnEncoder.Decoder { - internal interface IRawDecoder - { - Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight); - } - - /// - /// A class to decode data to R components. - /// - public class RawRDecoder : IRawDecoder - { - private readonly bool redAsLuminance; - - /// - /// Create a new instance of . - /// - /// If the decoded component should be used as the red component or luminence. - public RawRDecoder(bool redAsLuminance) - { - this.redAsLuminance = redAsLuminance; - } - - /// - /// Decode the data to color components. - /// - /// The data to decode. - /// The width of the image in pixels. - /// The height of the image in pixels. - /// The decoded color components. - public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) - { - var output = new Rgba32[pixelWidth * pixelHeight]; - for (var i = 0; i < output.Length; i++) - { - if (redAsLuminance) - { - output[i].R = data[i]; - output[i].G = data[i]; - output[i].B = data[i]; - } - else - { - output[i].R = data[i]; - output[i].G = 0; - output[i].B = 0; - } - - output[i].A = 255; - } - - return output; - } - } - - /// - /// A class to decode data to RG components. - /// - public class RawRgDecoder : IRawDecoder - { - /// - /// Decode the data to color components. - /// - /// The data to decode. - /// The width of the image in pixels. - /// The height of the image in pixels. - /// The decoded color components. - public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) - { - var output = new Rgba32[pixelWidth * pixelHeight]; - for (var i = 0; i < output.Length; i++) - { - output[i].R = data[i * 2]; - output[i].G = data[i * 2 + 1]; - output[i].B = 0; - output[i].A = 255; - } - - return output; - } - } - - /// - /// A class to decode data to RGB components. - /// - public class RawRgbDecoder : IRawDecoder - { - /// - /// Decode the data to color components. - /// - /// The data to decode. - /// The width of the image in pixels. - /// The height of the image in pixels. - /// The decoded color components. - public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) - { - var output = new Rgba32[pixelWidth * pixelHeight]; - for (var i = 0; i < output.Length; i++) - { - output[i].R = data[i * 3]; - output[i].G = data[i * 3 + 1]; - output[i].B = data[i * 3 + 2]; - output[i].A = 255; - } - - return output; - } - } - - /// - /// A class to decode data to RGBA components. - /// - public class RawRgbaDecoder : IRawDecoder - { - /// - /// Decode the data to color components. - /// - /// The data to decode. - /// The width of the image in pixels. - /// The height of the image in pixels. - /// The decoded color components. - public Rgba32[] Decode(ReadOnlySpan data, int pixelWidth, int pixelHeight) - { - var output = new Rgba32[pixelWidth * pixelHeight]; - for (var i = 0; i < output.Length; i++) - { - output[i].R = data[i * 4]; - output[i].G = data[i * 4 + 1]; - output[i].B = data[i * 4 + 2]; - output[i].A = data[i * 4 + 3]; - } - - return output; - } - } + internal interface IRawDecoder + { + Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context); + } + + /// + /// A class to decode data to R components. + /// + public class RawRDecoder : IRawDecoder + { + private readonly bool redAsLuminance; + + /// + /// Create a new instance of . + /// + /// If the decoded component should be used as the red component or luminence. + public RawRDecoder(bool redAsLuminance) + { + this.redAsLuminance = redAsLuminance; + } + + /// + /// Decode the data to color components. + /// + /// The data to decode. + /// The width of the image in pixels. + /// The height of the image in pixels. + /// The context of the current operation. + /// The decoded color components. + public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + { + var output = new Rgba32[pixelWidth * pixelHeight]; + + if (context.IsParallel) + { + var options = new ParallelOptions + { + MaxDegreeOfParallelism = context.TaskCount, + CancellationToken = context.CancellationToken + }; + Parallel.For(0, pixelWidth * pixelHeight, options, i => + { + var span = data.Span; + if (redAsLuminance) + { + output[i].R = span[i]; + output[i].G = span[i]; + output[i].B = span[i]; + } + else + { + output[i].R = span[i]; + output[i].G = 0; + output[i].B = 0; + } + + output[i].A = 255; + }); + } + else + { + var span = data.Span; + for (var i = 0; i < output.Length; i++) + { + if (redAsLuminance) + { + output[i].R = span[i]; + output[i].G = span[i]; + output[i].B = span[i]; + } + else + { + output[i].R = span[i]; + output[i].G = 0; + output[i].B = 0; + } + + output[i].A = 255; + } + } + + return output; + } + } + + /// + /// A class to decode data to RG components. + /// + public class RawRgDecoder : IRawDecoder + { + /// + /// Decode the data to color components. + /// + /// The data to decode. + /// The width of the image in pixels. + /// The height of the image in pixels. + /// The context of the current operation. + /// The decoded color components. + public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + { + var output = new Rgba32[pixelWidth * pixelHeight]; + + if (context.IsParallel) + { + var options = new ParallelOptions + { + MaxDegreeOfParallelism = context.TaskCount, + CancellationToken = context.CancellationToken + }; + Parallel.For(0, pixelWidth * pixelHeight, options, i => + { + var span = data.Span; + output[i].R = span[i * 2]; + output[i].G = span[i * 2 + 1]; + output[i].B = 0; + output[i].A = 255; + }); + } + else + { + var span = data.Span; + for (var i = 0; i < output.Length; i++) + { + output[i].R = span[i * 2]; + output[i].G = span[i * 2 + 1]; + output[i].B = 0; + output[i].A = 255; + } + } + + return output; + } + } + + /// + /// A class to decode data to RGB components. + /// + public class RawRgbDecoder : IRawDecoder + { + /// + /// Decode the data to color components. + /// + /// The data to decode. + /// The width of the image in pixels. + /// The height of the image in pixels. + /// The context of the current operation. + /// The decoded color components. + public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + { + var output = new Rgba32[pixelWidth * pixelHeight]; + + if (context.IsParallel) + { + var options = new ParallelOptions + { + MaxDegreeOfParallelism = context.TaskCount, + CancellationToken = context.CancellationToken + }; + Parallel.For(0, pixelWidth * pixelHeight, options, i => + { + var span = data.Span; + output[i].R = span[i * 3]; + output[i].G = span[i * 3 + 1]; + output[i].B = span[i * 3 + 2]; + output[i].A = 255; + }); + } + else + { + var span = data.Span; + for (var i = 0; i < output.Length; i++) + { + output[i].R = span[i * 3]; + output[i].G = span[i * 3 + 1]; + output[i].B = span[i * 3 + 2]; + output[i].A = 255; + } + } + + return output; + } + } + + /// + /// A class to decode data to RGBA components. + /// + public class RawRgbaDecoder : IRawDecoder + { + /// + /// Decode the data to color components. + /// + /// The data to decode. + /// The width of the image in pixels. + /// The height of the image in pixels. + /// The context of the current operation. + /// The decoded color components. + public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + { + var output = new Rgba32[pixelWidth * pixelHeight]; + + if (context.IsParallel) + { + var options = new ParallelOptions + { + MaxDegreeOfParallelism = context.TaskCount, + CancellationToken = context.CancellationToken + }; + Parallel.For(0, pixelWidth * pixelHeight, options, i => + { + var span = data.Span; + output[i].R = span[i * 4]; + output[i].G = span[i * 4 + 1]; + output[i].B = span[i * 4 + 2]; + output[i].A = span[i * 4 + 3]; + }); + } + else + { + var span = data.Span; + for (var i = 0; i < output.Length; i++) + { + output[i].R = span[i * 4]; + output[i].G = span[i * 4 + 1]; + output[i].B = span[i * 4 + 2]; + output[i].A = span[i * 4 + 3]; + } + } + + return output; + } + } } diff --git a/BCnEnc.Net/Encoder/Options/EncoderOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOptions.cs index 1aea697..a82d18a 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderOptions.cs @@ -1,16 +1,23 @@ -namespace BCnEncoder.Encoder.Options +using System; + +namespace BCnEncoder.Encoder.Options { - /// - /// General options for the encoder. - /// + /// + /// General options for the encoder. + /// public class EncoderOptions - { - /// - /// Whether the blocks should be encoded in parallel. This can be much faster than single-threaded encoding, - /// but is slow if multiple textures are being processed at the same time. - /// When a debugger is attached, the encoder defaults to single-threaded operation to ease debugging. - /// Default is true. - /// - public bool multiThreaded = true; - } + { + /// + /// Whether the blocks should be encoded in parallel. This can be much faster than single-threaded encoding, + /// but is slow if multiple textures are being processed at the same time. + /// When a debugger is attached, the encoder defaults to single-threaded operation to ease debugging. + /// Default is true. + /// + public bool IsParallel { get; set; } = true; + + /// + /// Determines how many tasks should be used for parallel processing. + /// + public int TaskCount { get; set; } = Environment.ProcessorCount; + } } diff --git a/BCnEnc.Net/Shared/AsyncOperation.cs b/BCnEnc.Net/Shared/AsyncOperation.cs new file mode 100644 index 0000000..bd5f45a --- /dev/null +++ b/BCnEnc.Net/Shared/AsyncOperation.cs @@ -0,0 +1,52 @@ +using System; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; + +namespace BCnEncoder.Shared +{ + public class AsyncOperation : IDisposable + { + private CancellationTokenSource tokenSource; + private Task task; + + public T Result => task.Result; + + public Task Start(Func func) + { + if (task != null) + { + throw new InvalidOperationException("This instance is already running an operation or finished it."); + } + + var token = CreateTokenSource().Token; + return task = Task.Factory.StartNew(() => func(token), token); + } + + public void Cancel() + { + tokenSource.Cancel(); + } + + /// + /// Allows awaiting the asynchronous operation. + /// + /// The awaiter for the running operation. + /// The operation should be started before awaiting it. + public TaskAwaiter? GetAwaiter() + { + return task?.GetAwaiter(); + } + + public void Dispose() + { + tokenSource?.Dispose(); + task?.Dispose(); + } + + private CancellationTokenSource CreateTokenSource() + { + return tokenSource = new CancellationTokenSource(); + } + } +} diff --git a/BCnEnc.Net/Shared/OperationContext.cs b/BCnEnc.Net/Shared/OperationContext.cs new file mode 100644 index 0000000..f9381a4 --- /dev/null +++ b/BCnEnc.Net/Shared/OperationContext.cs @@ -0,0 +1,26 @@ +using System; +using System.Threading; + +namespace BCnEncoder.Shared +{ + /// + /// The operation context. + /// + public class OperationContext + { + /// + /// Whether the blocks should be decoded in parallel. + /// + public bool IsParallel { get; set; } + + /// + /// Determines how many tasks should be used for parallel processing. + /// + public int TaskCount { get; set; } = Environment.ProcessorCount; + + /// + /// The cancellation token to check if the asynchronous operation was cancelled. + /// + public CancellationToken CancellationToken { get; set; } + } +} From 8fbd0293be2ada975cf9b3c37caaf4844c1c48e2 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Wed, 13 Jan 2021 17:21:28 +0100 Subject: [PATCH 017/116] Fix unreferenced or missing namespaces; --- BCnEnc.Net/Decoder/RawDecoder.cs | 1 + BCnEnc.Net/Encoder/BcEncoder.cs | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/BCnEnc.Net/Decoder/RawDecoder.cs b/BCnEnc.Net/Decoder/RawDecoder.cs index 055e60f..679b1c4 100644 --- a/BCnEnc.Net/Decoder/RawDecoder.cs +++ b/BCnEnc.Net/Decoder/RawDecoder.cs @@ -1,6 +1,7 @@ using SixLabors.ImageSharp.PixelFormats; using System; using System.Threading.Tasks; +using BCnEncoder.Shared; namespace BCnEncoder.Decoder { diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 4db96b9..e5651b7 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -109,7 +109,7 @@ public KtxFile EncodeToKtx(Image inputImage) { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.multiThreaded); + !Debugger.IsAttached && Options.IsParallel); } else { @@ -187,7 +187,7 @@ public DdsFile EncodeToDds(Image inputImage) { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.multiThreaded); + !Debugger.IsAttached && Options.IsParallel); } else { @@ -262,7 +262,7 @@ public IList EncodeToRawBytes(Image inputImage) { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.multiThreaded); + !Debugger.IsAttached && Options.IsParallel); } else { @@ -337,7 +337,7 @@ public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int m { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.multiThreaded); + !Debugger.IsAttached && Options.IsParallel); } else { @@ -552,7 +552,7 @@ public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.multiThreaded); + !Debugger.IsAttached && Options.IsParallel); } else { @@ -661,7 +661,7 @@ public DdsFile EncodeCubeMapToDds(Image right, Image left, Image { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.multiThreaded); + !Debugger.IsAttached && Options.IsParallel); } else { From cbce08e26cf290b50204062b8ba50784862eff6c Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Wed, 13 Jan 2021 18:59:29 +0100 Subject: [PATCH 018/116] Add additional constants for interpolations; --- BCnEnc.Net/Shared/EncodedBlocks.cs | 912 ++++++++++++++--------------- BCnEnc.Net/Shared/Interpolation.cs | 99 ++-- 2 files changed, 520 insertions(+), 491 deletions(-) diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index 499cee3..366b157 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -1,463 +1,463 @@ -using System; +using System; using System.Runtime.InteropServices; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared { - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc1Block - { - public ColorRgb565 color0; - public ColorRgb565 color1; - public uint colorIndices; - - public int this[int index] - { - readonly get => (int)(colorIndices >> (index * 2)) & 0b11; - set - { - colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); - var val = value & 0b11; - colorIndices = colorIndices | ((uint)val << (index * 2)); - } - } - - public readonly bool HasAlphaOrBlack => color0.data <= color1.data; - - public readonly RawBlock4X4Rgba32 Decode(bool useAlpha) - { - var output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var color0 = this.color0.ToColorRgb24(); - var color1 = this.color1.ToColorRgb24(); - - useAlpha = useAlpha && HasAlphaOrBlack; - - var colors = HasAlphaOrBlack ? - stackalloc ColorRgb24[] { - color0, - color1, - color0.InterpolateHalf(color1), - new ColorRgb24(0, 0, 0) - } : stackalloc ColorRgb24[] { - color0, - color1, - color0.InterpolateThird(color1, 1), - color0.InterpolateThird(color1, 2) - }; - - for (var i = 0; i < pixels.Length; i++) - { - var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); - var color = colors[colorIndex]; - if (useAlpha && colorIndex == 3) - { - pixels[i] = new Rgba32(0, 0, 0, 0); - } - else - { - pixels[i] = new Rgba32(color.r, color.g, color.b, 255); - } - } - return output; - } - } - - - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc2Block - { - public ulong alphaColors; - public ColorRgb565 color0; - public ColorRgb565 color1; - public uint colorIndices; - - public int this[int index] - { - readonly get => (int)(colorIndices >> (index * 2)) & 0b11; - set - { - colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); - var val = value & 0b11; - colorIndices = colorIndices | ((uint)val << (index * 2)); - } - } - - public readonly byte GetAlpha(int index) - { - var mask = 0xFUL << (index * 4); - var shift = index * 4; - var alphaUnscaled = (alphaColors & mask) >> shift; - return (byte)(alphaUnscaled / 15.0 * 255); - } - - public void SetAlpha(int index, byte alpha) - { - var mask = 0xFUL << (index * 4); - var shift = index * 4; - alphaColors &= ~mask; - var a = (byte)(alpha / 255.0 * 15); - alphaColors |= (ulong)(a & 0xF) << shift; - } - - public readonly RawBlock4X4Rgba32 Decode() - { - var output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var color0 = this.color0.ToColorRgb24(); - var color1 = this.color1.ToColorRgb24(); - - Span colors = stackalloc ColorRgb24[] { - color0, - color1, - color0.InterpolateThird(color1, 1), - color0.InterpolateThird(color1, 2) - }; - - for (var i = 0; i < pixels.Length; i++) - { - var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); - var color = colors[colorIndex]; - - pixels[i] = new Rgba32(color.r, color.g, color.b, GetAlpha(i)); - } - return output; - } - } - - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc3Block - { - public ulong alphaBlock; - public ColorRgb565 color0; - public ColorRgb565 color1; - public uint colorIndices; - - public int this[int index] - { - readonly get => (int)(colorIndices >> (index * 2)) & 0b11; - set - { - colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); - var val = value & 0b11; - colorIndices = colorIndices | ((uint)val << (index * 2)); - } - } - - public byte Alpha0 - { - readonly get => (byte)(alphaBlock & 0xFFUL); - set - { - alphaBlock &= ~0xFFUL; - alphaBlock |= value; - } - } - - public byte Alpha1 - { - readonly get => (byte)((alphaBlock >> 8) & 0xFFUL); - set - { - alphaBlock &= ~0xFF00UL; - alphaBlock |= (ulong)value << 8; - } - } - - public readonly byte GetAlphaIndex(int pixelIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - var alphaIndex = (alphaBlock & mask) >> shift; - return (byte)alphaIndex; - } - - public void SetAlphaIndex(int pixelIndex, byte alphaIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - alphaBlock &= ~mask; - alphaBlock |= (ulong)(alphaIndex & 0b111) << shift; - } - - public readonly RawBlock4X4Rgba32 Decode() - { - var output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var color0 = this.color0.ToColorRgb24(); - var color1 = this.color1.ToColorRgb24(); - - var a0 = Alpha0; - var a1 = Alpha1; - Span colors = stackalloc ColorRgb24[] { - color0, - color1, - color0.InterpolateThird(color1, 1), - color0.InterpolateThird(color1, 2) - }; - - var alphas = a0 > a1 ? stackalloc byte[] { - a0, - a1, - (byte)Interpolation.Interpolate(a0, a1, 1, 7), - (byte)Interpolation.Interpolate(a0, a1, 2, 7), - (byte)Interpolation.Interpolate(a0, a1, 3, 7), - (byte)Interpolation.Interpolate(a0, a1, 4, 7), - (byte)Interpolation.Interpolate(a0, a1, 5, 7), - (byte)Interpolation.Interpolate(a0, a1, 6, 7) - } : stackalloc byte[] { - a0, - a1, - (byte)Interpolation.Interpolate(a0, a1, 1, 5), - (byte)Interpolation.Interpolate(a0, a1, 2, 5), - (byte)Interpolation.Interpolate(a0, a1, 3, 5), - (byte)Interpolation.Interpolate(a0, a1, 4, 5), - 0, - 255 - }; - - for (var i = 0; i < pixels.Length; i++) - { - var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); - var color = colors[colorIndex]; - - pixels[i] = new Rgba32(color.r, color.g, color.b, alphas[GetAlphaIndex(i)]); - } - return output; - } - } - - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc4Block - { - public ulong redBlock; - - public byte Red0 - { - readonly get => (byte)(redBlock & 0xFFUL); - set - { - redBlock &= ~0xFFUL; - redBlock |= value; - } - } - - public byte Red1 - { - readonly get => (byte)((redBlock >> 8) & 0xFFUL); - set - { - redBlock &= ~0xFF00UL; - redBlock |= (ulong)value << 8; - } - } - - public readonly byte GetRedIndex(int pixelIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - var redIndex = (redBlock & mask) >> shift; - return (byte)redIndex; - } - - public void SetRedIndex(int pixelIndex, byte redIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - redBlock &= ~mask; - redBlock |= (ulong)(redIndex & 0b111) << shift; - } - - public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) - { - var output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var r0 = Red0; - var r1 = Red1; - - var reds = r0 > r1 ? stackalloc byte[] { - r0, - r1, - (byte)Interpolation.Interpolate(r0, r1, 1, 7), - (byte)Interpolation.Interpolate(r0, r1, 2, 7), - (byte)Interpolation.Interpolate(r0, r1, 3, 7), - (byte)Interpolation.Interpolate(r0, r1, 4, 7), - (byte)Interpolation.Interpolate(r0, r1, 5, 7), - (byte)Interpolation.Interpolate(r0, r1, 6, 7) - } : stackalloc byte[] { - r0, - r1, - (byte)Interpolation.Interpolate(r0, r1, 1, 5), - (byte)Interpolation.Interpolate(r0, r1, 2, 5), - (byte)Interpolation.Interpolate(r0, r1, 3, 5), - (byte)Interpolation.Interpolate(r0, r1, 4, 5), - 0, - 255 - }; - - if (redAsLuminance) - { - for (var i = 0; i < pixels.Length; i++) - { - var index = GetRedIndex(i); - pixels[i] = new Rgba32(reds[index], reds[index], reds[index], 255); - } - } - else - { - for (var i = 0; i < pixels.Length; i++) - { - var index = GetRedIndex(i); - pixels[i] = new Rgba32(reds[index], 0, 0, 255); - } - } - - return output; - } - } - - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc5Block - { - public ulong redBlock; - public ulong greenBlock; - - public byte Red0 - { - readonly get => (byte)(redBlock & 0xFFUL); - set - { - redBlock &= ~0xFFUL; - redBlock |= value; - } - } - - public byte Red1 - { - readonly get => (byte)((redBlock >> 8) & 0xFFUL); - set - { - redBlock &= ~0xFF00UL; - redBlock |= (ulong)value << 8; - } - } - - public byte Green0 - { - readonly get => (byte)(greenBlock & 0xFFUL); - set - { - greenBlock &= ~0xFFUL; - greenBlock |= value; - } - } - - public byte Green1 - { - readonly get => (byte)((greenBlock >> 8) & 0xFFUL); - set - { - greenBlock &= ~0xFF00UL; - greenBlock |= (ulong)value << 8; - } - } - - public readonly byte GetRedIndex(int pixelIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - var redIndex = (redBlock & mask) >> shift; - return (byte)redIndex; - } - - public void SetRedIndex(int pixelIndex, byte redIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - redBlock &= ~mask; - redBlock |= (ulong)(redIndex & 0b111) << shift; - } - - public readonly byte GetGreenIndex(int pixelIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - var greenIndex = (greenBlock & mask) >> shift; - return (byte)greenIndex; - } - - public void SetGreenIndex(int pixelIndex, byte greenIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - greenBlock &= ~mask; - greenBlock |= (ulong)(greenIndex & 0b111) << shift; - } - - public readonly RawBlock4X4Rgba32 Decode() - { - var output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var r0 = Red0; - var r1 = Red1; - - var reds = r0 > r1 ? stackalloc byte[] { - r0, - r1, - (byte)Interpolation.Interpolate(r0, r1, 1, 7), - (byte)Interpolation.Interpolate(r0, r1, 2, 7), - (byte)Interpolation.Interpolate(r0, r1, 3, 7), - (byte)Interpolation.Interpolate(r0, r1, 4, 7), - (byte)Interpolation.Interpolate(r0, r1, 5, 7), - (byte)Interpolation.Interpolate(r0, r1, 6, 7) - } : stackalloc byte[] { - r0, - r1, - (byte)Interpolation.Interpolate(r0, r1, 1, 5), - (byte)Interpolation.Interpolate(r0, r1, 2, 5), - (byte)Interpolation.Interpolate(r0, r1, 3, 5), - (byte)Interpolation.Interpolate(r0, r1, 4, 5), - 0, - 255 - }; - - var g0 = Green0; - var g1 = Green1; - - var greens = g0 > g1 ? stackalloc byte[] { - g0, - g1, - (byte)Interpolation.Interpolate(g0, g1, 1, 7), - (byte)Interpolation.Interpolate(g0, g1, 2, 7), - (byte)Interpolation.Interpolate(g0, g1, 3, 7), - (byte)Interpolation.Interpolate(g0, g1, 4, 7), - (byte)Interpolation.Interpolate(g0, g1, 5, 7), - (byte)Interpolation.Interpolate(g0, g1, 6, 7) - } : stackalloc byte[] { - g0, - g1, - (byte)Interpolation.Interpolate(g0, g1, 1, 5), - (byte)Interpolation.Interpolate(g0, g1, 2, 5), - (byte)Interpolation.Interpolate(g0, g1, 3, 5), - (byte)Interpolation.Interpolate(g0, g1, 4, 5), - 0, - 255 - }; - - for (var i = 0; i < pixels.Length; i++) - { - var redIndex = GetRedIndex(i); - var greenIndex = GetGreenIndex(i); - pixels[i] = new Rgba32(reds[redIndex], greens[greenIndex], 0, 255); - } - - return output; - } - } + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc1Block + { + public ColorRgb565 color0; + public ColorRgb565 color1; + public uint colorIndices; + + public int this[int index] + { + readonly get => (int)(colorIndices >> (index * 2)) & 0b11; + set + { + colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); + var val = value & 0b11; + colorIndices = colorIndices | ((uint)val << (index * 2)); + } + } + + public readonly bool HasAlphaOrBlack => color0.data <= color1.data; + + public readonly RawBlock4X4Rgba32 Decode(bool useAlpha) + { + var output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var color0 = this.color0.ToColorRgb24(); + var color1 = this.color1.ToColorRgb24(); + + useAlpha = useAlpha && HasAlphaOrBlack; + + var colors = HasAlphaOrBlack ? + stackalloc ColorRgb24[] { + color0, + color1, + color0.InterpolateHalf(color1), + new ColorRgb24(0, 0, 0) + } : stackalloc ColorRgb24[] { + color0, + color1, + color0.InterpolateThird(color1, 1), + color0.InterpolateThird(color1, 2) + }; + + for (var i = 0; i < pixels.Length; i++) + { + var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); + var color = colors[colorIndex]; + if (useAlpha && colorIndex == 3) + { + pixels[i] = new Rgba32(0, 0, 0, 0); + } + else + { + pixels[i] = new Rgba32(color.r, color.g, color.b, 255); + } + } + return output; + } + } + + + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc2Block + { + public ulong alphaColors; + public ColorRgb565 color0; + public ColorRgb565 color1; + public uint colorIndices; + + public int this[int index] + { + readonly get => (int)(colorIndices >> (index * 2)) & 0b11; + set + { + colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); + var val = value & 0b11; + colorIndices = colorIndices | ((uint)val << (index * 2)); + } + } + + public readonly byte GetAlpha(int index) + { + var mask = 0xFUL << (index * 4); + var shift = index * 4; + var alphaUnscaled = (alphaColors & mask) >> shift; + return (byte)(alphaUnscaled / 15.0 * 255); + } + + public void SetAlpha(int index, byte alpha) + { + var mask = 0xFUL << (index * 4); + var shift = index * 4; + alphaColors &= ~mask; + var a = (byte)(alpha / 255.0 * 15); + alphaColors |= (ulong)(a & 0xF) << shift; + } + + public readonly RawBlock4X4Rgba32 Decode() + { + var output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var color0 = this.color0.ToColorRgb24(); + var color1 = this.color1.ToColorRgb24(); + + Span colors = stackalloc ColorRgb24[] { + color0, + color1, + color0.InterpolateThird(color1, 1), + color0.InterpolateThird(color1, 2) + }; + + for (var i = 0; i < pixels.Length; i++) + { + var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); + var color = colors[colorIndex]; + + pixels[i] = new Rgba32(color.r, color.g, color.b, GetAlpha(i)); + } + return output; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc3Block + { + public ulong alphaBlock; + public ColorRgb565 color0; + public ColorRgb565 color1; + public uint colorIndices; + + public int this[int index] + { + readonly get => (int)(colorIndices >> (index * 2)) & 0b11; + set + { + colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); + var val = value & 0b11; + colorIndices = colorIndices | ((uint)val << (index * 2)); + } + } + + public byte Alpha0 + { + readonly get => (byte)(alphaBlock & 0xFFUL); + set + { + alphaBlock &= ~0xFFUL; + alphaBlock |= value; + } + } + + public byte Alpha1 + { + readonly get => (byte)((alphaBlock >> 8) & 0xFFUL); + set + { + alphaBlock &= ~0xFF00UL; + alphaBlock |= (ulong)value << 8; + } + } + + public readonly byte GetAlphaIndex(int pixelIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + var alphaIndex = (alphaBlock & mask) >> shift; + return (byte)alphaIndex; + } + + public void SetAlphaIndex(int pixelIndex, byte alphaIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + alphaBlock &= ~mask; + alphaBlock |= (ulong)(alphaIndex & 0b111) << shift; + } + + public readonly RawBlock4X4Rgba32 Decode() + { + var output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var color0 = this.color0.ToColorRgb24(); + var color1 = this.color1.ToColorRgb24(); + + var a0 = Alpha0; + var a1 = Alpha1; + Span colors = stackalloc ColorRgb24[] { + color0, + color1, + color0.InterpolateThird(color1, 1), + color0.InterpolateThird(color1, 2) + }; + + var alphas = a0 > a1 ? stackalloc byte[] { + a0, + a1, + a0.InterpolateSeventh(a1, 1), + a0.InterpolateSeventh(a1, 2), + a0.InterpolateSeventh(a1, 3), + a0.InterpolateSeventh(a1, 4), + a0.InterpolateSeventh(a1, 5), + a0.InterpolateSeventh(a1, 6), + } : stackalloc byte[] { + a0, + a1, + a0.InterpolateFifth(a1, 1), + a0.InterpolateFifth(a1, 2), + a0.InterpolateFifth(a1, 3), + a0.InterpolateFifth(a1, 4), + 0, + 255 + }; + + for (var i = 0; i < pixels.Length; i++) + { + var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); + var color = colors[colorIndex]; + + pixels[i] = new Rgba32(color.r, color.g, color.b, alphas[GetAlphaIndex(i)]); + } + return output; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc4Block + { + public ulong redBlock; + + public byte Red0 + { + readonly get => (byte)(redBlock & 0xFFUL); + set + { + redBlock &= ~0xFFUL; + redBlock |= value; + } + } + + public byte Red1 + { + readonly get => (byte)((redBlock >> 8) & 0xFFUL); + set + { + redBlock &= ~0xFF00UL; + redBlock |= (ulong)value << 8; + } + } + + public readonly byte GetRedIndex(int pixelIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + var redIndex = (redBlock & mask) >> shift; + return (byte)redIndex; + } + + public void SetRedIndex(int pixelIndex, byte redIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + redBlock &= ~mask; + redBlock |= (ulong)(redIndex & 0b111) << shift; + } + + public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) + { + var output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var r0 = Red0; + var r1 = Red1; + + var reds = r0 > r1 ? stackalloc byte[] { + r0, + r1, + r0.InterpolateSeventh(r1, 1), + r0.InterpolateSeventh(r1, 2), + r0.InterpolateSeventh(r1, 3), + r0.InterpolateSeventh(r1, 4), + r0.InterpolateSeventh(r1, 5), + r0.InterpolateSeventh(r1, 6), + } : stackalloc byte[] { + r0, + r1, + r0.InterpolateFifth(r1, 1), + r0.InterpolateFifth(r1, 2), + r0.InterpolateFifth(r1, 3), + r0.InterpolateFifth(r1, 4), + 0, + 255 + }; + + if (redAsLuminance) + { + for (var i = 0; i < pixels.Length; i++) + { + var index = GetRedIndex(i); + pixels[i] = new Rgba32(reds[index], reds[index], reds[index], 255); + } + } + else + { + for (var i = 0; i < pixels.Length; i++) + { + var index = GetRedIndex(i); + pixels[i] = new Rgba32(reds[index], 0, 0, 255); + } + } + + return output; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc5Block + { + public ulong redBlock; + public ulong greenBlock; + + public byte Red0 + { + readonly get => (byte)(redBlock & 0xFFUL); + set + { + redBlock &= ~0xFFUL; + redBlock |= value; + } + } + + public byte Red1 + { + readonly get => (byte)((redBlock >> 8) & 0xFFUL); + set + { + redBlock &= ~0xFF00UL; + redBlock |= (ulong)value << 8; + } + } + + public byte Green0 + { + readonly get => (byte)(greenBlock & 0xFFUL); + set + { + greenBlock &= ~0xFFUL; + greenBlock |= value; + } + } + + public byte Green1 + { + readonly get => (byte)((greenBlock >> 8) & 0xFFUL); + set + { + greenBlock &= ~0xFF00UL; + greenBlock |= (ulong)value << 8; + } + } + + public readonly byte GetRedIndex(int pixelIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + var redIndex = (redBlock & mask) >> shift; + return (byte)redIndex; + } + + public void SetRedIndex(int pixelIndex, byte redIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + redBlock &= ~mask; + redBlock |= (ulong)(redIndex & 0b111) << shift; + } + + public readonly byte GetGreenIndex(int pixelIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + var greenIndex = (greenBlock & mask) >> shift; + return (byte)greenIndex; + } + + public void SetGreenIndex(int pixelIndex, byte greenIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + greenBlock &= ~mask; + greenBlock |= (ulong)(greenIndex & 0b111) << shift; + } + + public readonly RawBlock4X4Rgba32 Decode() + { + var output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var r0 = Red0; + var r1 = Red1; + + var reds = r0 > r1 ? stackalloc byte[] { + r0, + r1, + r0.InterpolateSeventh(r1, 1), + r0.InterpolateSeventh(r1, 2), + r0.InterpolateSeventh(r1, 3), + r0.InterpolateSeventh(r1, 4), + r0.InterpolateSeventh(r1, 5), + r0.InterpolateSeventh(r1, 6), + } : stackalloc byte[] { + r0, + r1, + r0.InterpolateFifth(r1, 1), + r0.InterpolateFifth(r1, 2), + r0.InterpolateFifth(r1, 3), + r0.InterpolateFifth(r1, 4), + 0, + 255 + }; + + var g0 = Green0; + var g1 = Green1; + + var greens = g0 > g1 ? stackalloc byte[] { + g0, + g1, + g0.InterpolateSeventh(g1, 1), + g0.InterpolateSeventh(g1, 2), + g0.InterpolateSeventh(g1, 3), + g0.InterpolateSeventh(g1, 4), + g0.InterpolateSeventh(g1, 5), + g0.InterpolateSeventh(g1, 6), + } : stackalloc byte[] { + g0, + g1, + g0.InterpolateFifth(g1, 1), + g0.InterpolateFifth(g1, 2), + g0.InterpolateFifth(g1, 3), + g0.InterpolateFifth(g1, 4), + 0, + 255 + }; + + for (var i = 0; i < pixels.Length; i++) + { + var redIndex = GetRedIndex(i); + var greenIndex = GetGreenIndex(i); + pixels[i] = new Rgba32(reds[redIndex], greens[greenIndex], 0, 255); + } + + return output; + } + } } diff --git a/BCnEnc.Net/Shared/Interpolation.cs b/BCnEnc.Net/Shared/Interpolation.cs index c9c0779..364988a 100644 --- a/BCnEnc.Net/Shared/Interpolation.cs +++ b/BCnEnc.Net/Shared/Interpolation.cs @@ -1,40 +1,69 @@ -namespace BCnEncoder.Shared +namespace BCnEncoder.Shared { - internal static class Interpolation - { - /// - /// Interpolates two colors by half. - /// - /// The first color endpoint. - /// The second color endpoint. - /// The interpolated color. - public static ColorRgb24 InterpolateHalf(this ColorRgb24 c0, ColorRgb24 c1) => - InterpolateColor(c0, c1, 1, 2); + internal static class Interpolation + { + /// + /// Interpolates two colors by half. + /// + /// The first color endpoint. + /// The second color endpoint. + /// The interpolated color. + public static ColorRgb24 InterpolateHalf(this ColorRgb24 c0, ColorRgb24 c1) => + InterpolateColor(c0, c1, 1, 2); - /// - /// Interpolates two colors by third. - /// - /// The first color endpoint. - /// The second color endpoint. - /// The dividend in the third. - /// The interpolated color. - public static ColorRgb24 InterpolateThird(this ColorRgb24 c0, ColorRgb24 c1, int num) => - InterpolateColor(c0, c1, num, 3); + /// + /// Interpolates two colors by third. + /// + /// The first color endpoint. + /// The second color endpoint. + /// The dividend in the third. + /// The interpolated color. + public static ColorRgb24 InterpolateThird(this ColorRgb24 c0, ColorRgb24 c1, int num) => + InterpolateColor(c0, c1, num, 3); - /// - /// Interpolates two components. - /// - /// The first component. - /// The second component. - /// The dividend. - /// The divisor. - /// The interpolated component. - public static int Interpolate(int a, int b, int num, int den) => - (int)(((den - num) * a + num * b) / (float)den); + /// + /// Interpolates two colors by fifth. + /// + /// The first component. + /// The second component. + /// The dividend in the fifth. + /// The interpolated component. + public static byte InterpolateFifth(this byte a0, byte a1, int num) => + (byte)Interpolate(a0, a1, num, 5, 2); - private static ColorRgb24 InterpolateColor(ColorRgb24 c0, ColorRgb24 c1, int num, int den) => new ColorRgb24( - (byte)Interpolate(c0.r, c1.r, num, den), - (byte)Interpolate(c0.g, c1.g, num, den), - (byte)Interpolate(c0.b, c1.b, num, den)); - } + /// + /// Interpolates two colors by seventh. + /// + /// The first component. + /// The second component. + /// The dividend in the seventh. + /// The interpolated component. + public static byte InterpolateSeventh(this byte a0, byte a1, int num) => + (byte)Interpolate(a0, a1, num, 7, 3); + + /// + /// Interpolates two colors. + /// + /// The first color. + /// The second color. + /// The dividend on each color component. + /// The divisor on each color component. + /// The interpolated color. + private static ColorRgb24 InterpolateColor(ColorRgb24 c0, ColorRgb24 c1, int num, int den) => new ColorRgb24( + (byte)Interpolate(c0.r, c1.r, num, den), + (byte)Interpolate(c0.g, c1.g, num, den), + (byte)Interpolate(c0.b, c1.b, num, den)); + + /// + /// Interpolates two components. + /// + /// The first component. + /// The second component. + /// The dividend. + /// The divisor. + /// A correction value for increased accuracy when working with integer interpolated values. + /// The interpolated component. + private static int Interpolate(int a, int b, int num, int den, int correction = 0) => + (int)(((den - num) * a + num * b + correction) / (float)den); + } } From c7c7fcd42e0197931bcd4294be3ec44eb2efe513 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Wed, 13 Jan 2021 22:45:19 +0100 Subject: [PATCH 019/116] Remove parallel execution from RawDecoders; Add documentation to AsyncOperation class; --- BCnEnc.Net/Decoder/BcDecoder.cs | 2 +- BCnEnc.Net/Decoder/Options/DecoderOptions.cs | 1 + BCnEnc.Net/Decoder/RawDecoder.cs | 165 ++++++------------- BCnEnc.Net/Shared/AsyncOperation.cs | 26 ++- 4 files changed, 80 insertions(+), 114 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index aea1501..118f988 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -238,7 +238,7 @@ private Image[] Decode(Stream inputStream, bool allMipMaps, Cancellation var ddsFile = DdsFile.Load(inputStream); return Decode(ddsFile, allMipMaps, token); - case ".file": + case ".ktx": var ktxFile = KtxFile.Load(inputStream); return Decode(ktxFile, allMipMaps, token); } diff --git a/BCnEnc.Net/Decoder/Options/DecoderOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderOptions.cs index 08dc044..3357250 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderOptions.cs @@ -13,6 +13,7 @@ public class DecoderOptions /// When a debugger is attached, the decoder defaults to single-threaded operation to ease debugging. /// Default is false. /// + /// Parallel execution will be ignored in RawDecoders, due to minimal performance gain. public bool IsParallel { get; set; } /// diff --git a/BCnEnc.Net/Decoder/RawDecoder.cs b/BCnEnc.Net/Decoder/RawDecoder.cs index 679b1c4..53c0020 100644 --- a/BCnEnc.Net/Decoder/RawDecoder.cs +++ b/BCnEnc.Net/Decoder/RawDecoder.cs @@ -1,6 +1,5 @@ using SixLabors.ImageSharp.PixelFormats; using System; -using System.Threading.Tasks; using BCnEncoder.Shared; namespace BCnEncoder.Decoder @@ -20,7 +19,7 @@ public class RawRDecoder : IRawDecoder /// /// Create a new instance of . /// - /// If the decoded component should be used as the red component or luminence. + /// If the decoded component should be used as the red component or luminance. public RawRDecoder(bool redAsLuminance) { this.redAsLuminance = redAsLuminance; @@ -38,52 +37,30 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh { var output = new Rgba32[pixelWidth * pixelHeight]; - if (context.IsParallel) + // HINT: Ignoring parallel execution since we wouldn't gain performance from it. + + var span = data.Span; + for (var i = 0; i < output.Length; i++) { - var options = new ParallelOptions + if (context.CancellationToken.IsCancellationRequested) { - MaxDegreeOfParallelism = context.TaskCount, - CancellationToken = context.CancellationToken - }; - Parallel.For(0, pixelWidth * pixelHeight, options, i => + break; + } + + if (redAsLuminance) { - var span = data.Span; - if (redAsLuminance) - { - output[i].R = span[i]; - output[i].G = span[i]; - output[i].B = span[i]; - } - else - { - output[i].R = span[i]; - output[i].G = 0; - output[i].B = 0; - } - - output[i].A = 255; - }); - } - else - { - var span = data.Span; - for (var i = 0; i < output.Length; i++) + output[i].R = span[i]; + output[i].G = span[i]; + output[i].B = span[i]; + } + else { - if (redAsLuminance) - { - output[i].R = span[i]; - output[i].G = span[i]; - output[i].B = span[i]; - } - else - { - output[i].R = span[i]; - output[i].G = 0; - output[i].B = 0; - } - - output[i].A = 255; + output[i].R = span[i]; + output[i].G = 0; + output[i].B = 0; } + + output[i].A = 255; } return output; @@ -107,32 +84,20 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh { var output = new Rgba32[pixelWidth * pixelHeight]; - if (context.IsParallel) - { - var options = new ParallelOptions - { - MaxDegreeOfParallelism = context.TaskCount, - CancellationToken = context.CancellationToken - }; - Parallel.For(0, pixelWidth * pixelHeight, options, i => - { - var span = data.Span; - output[i].R = span[i * 2]; - output[i].G = span[i * 2 + 1]; - output[i].B = 0; - output[i].A = 255; - }); - } - else + // HINT: Ignoring parallel execution since we wouldn't gain performance from it. + + var span = data.Span; + for (var i = 0; i < output.Length; i++) { - var span = data.Span; - for (var i = 0; i < output.Length; i++) + if (context.CancellationToken.IsCancellationRequested) { - output[i].R = span[i * 2]; - output[i].G = span[i * 2 + 1]; - output[i].B = 0; - output[i].A = 255; + break; } + + output[i].R = span[i * 2]; + output[i].G = span[i * 2 + 1]; + output[i].B = 0; + output[i].A = 255; } return output; @@ -156,32 +121,20 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh { var output = new Rgba32[pixelWidth * pixelHeight]; - if (context.IsParallel) - { - var options = new ParallelOptions - { - MaxDegreeOfParallelism = context.TaskCount, - CancellationToken = context.CancellationToken - }; - Parallel.For(0, pixelWidth * pixelHeight, options, i => - { - var span = data.Span; - output[i].R = span[i * 3]; - output[i].G = span[i * 3 + 1]; - output[i].B = span[i * 3 + 2]; - output[i].A = 255; - }); - } - else + // HINT: Ignoring parallel execution since we wouldn't gain performance from it. + + var span = data.Span; + for (var i = 0; i < output.Length; i++) { - var span = data.Span; - for (var i = 0; i < output.Length; i++) + if (context.CancellationToken.IsCancellationRequested) { - output[i].R = span[i * 3]; - output[i].G = span[i * 3 + 1]; - output[i].B = span[i * 3 + 2]; - output[i].A = 255; + break; } + + output[i].R = span[i * 3]; + output[i].G = span[i * 3 + 1]; + output[i].B = span[i * 3 + 2]; + output[i].A = 255; } return output; @@ -205,32 +158,20 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh { var output = new Rgba32[pixelWidth * pixelHeight]; - if (context.IsParallel) - { - var options = new ParallelOptions - { - MaxDegreeOfParallelism = context.TaskCount, - CancellationToken = context.CancellationToken - }; - Parallel.For(0, pixelWidth * pixelHeight, options, i => - { - var span = data.Span; - output[i].R = span[i * 4]; - output[i].G = span[i * 4 + 1]; - output[i].B = span[i * 4 + 2]; - output[i].A = span[i * 4 + 3]; - }); - } - else + // HINT: Ignoring parallel execution since we wouldn't gain performance from it. + + var span = data.Span; + for (var i = 0; i < output.Length; i++) { - var span = data.Span; - for (var i = 0; i < output.Length; i++) + if (context.CancellationToken.IsCancellationRequested) { - output[i].R = span[i * 4]; - output[i].G = span[i * 4 + 1]; - output[i].B = span[i * 4 + 2]; - output[i].A = span[i * 4 + 3]; + break; } + + output[i].R = span[i * 4]; + output[i].G = span[i * 4 + 1]; + output[i].B = span[i * 4 + 2]; + output[i].A = span[i * 4 + 3]; } return output; diff --git a/BCnEnc.Net/Shared/AsyncOperation.cs b/BCnEnc.Net/Shared/AsyncOperation.cs index bd5f45a..3a55854 100644 --- a/BCnEnc.Net/Shared/AsyncOperation.cs +++ b/BCnEnc.Net/Shared/AsyncOperation.cs @@ -5,13 +5,26 @@ namespace BCnEncoder.Shared { + /// + /// An async operation with cancel capability. + /// + /// The type the operation returns after it finished. public class AsyncOperation : IDisposable { private CancellationTokenSource tokenSource; private Task task; + /// + /// The result of the operation after it finished. + /// public T Result => task.Result; + /// + /// Starts the given delegate asynchronously. + /// + /// The delegate to execute in this operation. + /// The awaitable task for this operation. + /// If an operation is already running. public Task Start(Func func) { if (task != null) @@ -23,9 +36,19 @@ public Task Start(Func func) return task = Task.Factory.StartNew(() => func(token), token); } + /// + /// Cancels the currently running operation. + /// + /// May only be called after invoking . + /// If an operation is not running already. public void Cancel() { - tokenSource.Cancel(); + if (task == null) + { + throw new InvalidOperationException("No operation is currently running."); + } + + tokenSource?.Cancel(); } /// @@ -38,6 +61,7 @@ public void Cancel() return task?.GetAwaiter(); } + /// public void Dispose() { tokenSource?.Dispose(); From dc6bbf18c3e0f12bcd9a45933613a8457a8c3f27 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 14 Jan 2021 09:26:39 +0100 Subject: [PATCH 020/116] Change byte[] to ReadOnlyMemory in public DecodeRaw methods; --- BCnEnc.Net/Decoder/BcDecoder.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 118f988..a560128 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -51,12 +51,12 @@ public AsyncOperation> DecodeRawAsync(Stream inputStream, Compress /// /// Decode raw encoded image data asynchronously. /// - /// The array containing the encoded data. + /// The containing the encoded data. /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The awaitable operation to retrieve the decoded Rgba32 image. - public AsyncOperation> DecodeRawAsync(byte[] input, CompressionFormat format, int pixelWidth, int pixelHeight) + public AsyncOperation> DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight) { return CreateAsyncOperation(token => DecodeRawInternal(input, format, pixelWidth, pixelHeight, token)); } @@ -409,13 +409,13 @@ private Image[] Decode(DdsFile file, bool allMipMaps, CancellationToken /// /// Decode raw encoded image asynchronously. /// - /// The array containing the encoded data. + /// The containing the encoded data. /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The cancellation token for this operation. May be default, if the operation is not asynchronous. /// The decoded Rgba32 image. - private Image DecodeRawInternal(byte[] input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token) + private Image DecodeRawInternal(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token) { if (input.Length != GetBufferSize(format, pixelWidth, pixelHeight)) { From fd950948b8e5c81cff88d5d38315e0ad5192ed27 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 14 Jan 2021 09:32:17 +0100 Subject: [PATCH 021/116] Make TaskAwaiter not nullable; --- BCnEnc.Net/Decoder/BcDecoder.cs | 1 + BCnEnc.Net/Shared/AsyncOperation.cs | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index a560128..d100724 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -7,6 +7,7 @@ using System.Runtime.CompilerServices; using System.Text; using System.Threading; +using System.Threading.Tasks; namespace BCnEncoder.Decoder { diff --git a/BCnEnc.Net/Shared/AsyncOperation.cs b/BCnEnc.Net/Shared/AsyncOperation.cs index 3a55854..c775e95 100644 --- a/BCnEnc.Net/Shared/AsyncOperation.cs +++ b/BCnEnc.Net/Shared/AsyncOperation.cs @@ -56,9 +56,14 @@ public void Cancel() /// /// The awaiter for the running operation. /// The operation should be started before awaiting it. - public TaskAwaiter? GetAwaiter() + public TaskAwaiter GetAwaiter() { - return task?.GetAwaiter(); + if (task == null) + { + throw new InvalidOperationException("No operation is currently running."); + } + + return task.GetAwaiter(); } /// From 8d51f3e59d4ef23436fcec28f35fcc5fa54ebf71 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 14 Jan 2021 10:22:42 +0100 Subject: [PATCH 022/116] Remove AsyncOperation; --- BCnEnc.Net/Decoder/BcDecoder.cs | 48 ++++++++--------- BCnEnc.Net/Shared/AsyncOperation.cs | 81 ----------------------------- 2 files changed, 24 insertions(+), 105 deletions(-) delete mode 100644 BCnEnc.Net/Shared/AsyncOperation.cs diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index d100724..4f8ccfb 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -40,13 +40,14 @@ public class BcDecoder /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. + /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public AsyncOperation> DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight) + public Task> DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); - return CreateAsyncOperation(token => DecodeRawInternal(dataArray, format, pixelWidth, pixelHeight, token)); + return Task.Run(() => DecodeRawInternal(dataArray, format, pixelWidth, pixelHeight, token), token); } /// @@ -56,70 +57,77 @@ public AsyncOperation> DecodeRawAsync(Stream inputStream, Compress /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. + /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public AsyncOperation> DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight) + public Task> DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { - return CreateAsyncOperation(token => DecodeRawInternal(input, format, pixelWidth, pixelHeight, token)); + return Task.Run(() => DecodeRawInternal(input, format, pixelWidth, pixelHeight, token), token); } /// /// Read a Ktx or a Dds file from a stream and decode it asynchronously. /// /// The stream containing a Ktx or Dds file. + /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public AsyncOperation> DecodeAsync(Stream inputStream) + public Task> DecodeAsync(Stream inputStream, CancellationToken token = default) { - return CreateAsyncOperation(token => Decode(inputStream, false, token)[0]); + return Task.Run(() => Decode(inputStream, false, token)[0], token); } /// /// Read a Ktx or a Dds file from a stream and decode it. /// /// The stream containing a Ktx or Dds file. + /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public AsyncOperation[]> DecodeAllMipMapsAsync(Stream inputStream) + public Task[]> DecodeAllMipMapsAsync(Stream inputStream, CancellationToken token = default) { - return CreateAsyncOperation(token => Decode(inputStream, true, token)); + return Task.Run(() => Decode(inputStream, true, token), token); } /// /// Read a Ktx file and decode it. /// /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public AsyncOperation> DecodeAsync(KtxFile file) + public Task> DecodeAsync(KtxFile file, CancellationToken token = default) { - return CreateAsyncOperation(token => Decode(file, false, token)[0]); + return Task.Run(() => Decode(file, false, token)[0], token); } /// /// Read a Ktx file and decode it. /// /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public AsyncOperation[]> DecodeAllMipMapsAsync(KtxFile file) + public Task[]> DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) { - return CreateAsyncOperation(token => Decode(file, true, token)); + return Task.Run(() => Decode(file, true, token), token); } /// /// Read a Dds file and decode it. /// /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public AsyncOperation> DecodeAsync(DdsFile file) + public Task> DecodeAsync(DdsFile file, CancellationToken token = default) { - return CreateAsyncOperation(token => Decode(file, false, token)[0]); + return Task.Run(() => Decode(file, false, token)[0], token); } /// /// Read a Dds file and decode it. /// /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public AsyncOperation[]> DecodeAllMipMapsAsync(DdsFile file) + public Task[]> DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) { - return CreateAsyncOperation(token => Decode(file, true, token)); + return Task.Run(() => Decode(file, true, token), token); } #endregion @@ -456,14 +464,6 @@ private Image DecodeRawInternal(ReadOnlyMemory input, CompressionF #region Support - private AsyncOperation CreateAsyncOperation(Func func) - { - var operation = new AsyncOperation(); - operation.Start(func); - - return operation; - } - private bool IsSupportedRawFormat(GlInternalFormat format) { switch (format) diff --git a/BCnEnc.Net/Shared/AsyncOperation.cs b/BCnEnc.Net/Shared/AsyncOperation.cs deleted file mode 100644 index c775e95..0000000 --- a/BCnEnc.Net/Shared/AsyncOperation.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; - -namespace BCnEncoder.Shared -{ - /// - /// An async operation with cancel capability. - /// - /// The type the operation returns after it finished. - public class AsyncOperation : IDisposable - { - private CancellationTokenSource tokenSource; - private Task task; - - /// - /// The result of the operation after it finished. - /// - public T Result => task.Result; - - /// - /// Starts the given delegate asynchronously. - /// - /// The delegate to execute in this operation. - /// The awaitable task for this operation. - /// If an operation is already running. - public Task Start(Func func) - { - if (task != null) - { - throw new InvalidOperationException("This instance is already running an operation or finished it."); - } - - var token = CreateTokenSource().Token; - return task = Task.Factory.StartNew(() => func(token), token); - } - - /// - /// Cancels the currently running operation. - /// - /// May only be called after invoking . - /// If an operation is not running already. - public void Cancel() - { - if (task == null) - { - throw new InvalidOperationException("No operation is currently running."); - } - - tokenSource?.Cancel(); - } - - /// - /// Allows awaiting the asynchronous operation. - /// - /// The awaiter for the running operation. - /// The operation should be started before awaiting it. - public TaskAwaiter GetAwaiter() - { - if (task == null) - { - throw new InvalidOperationException("No operation is currently running."); - } - - return task.GetAwaiter(); - } - - /// - public void Dispose() - { - tokenSource?.Dispose(); - task?.Dispose(); - } - - private CancellationTokenSource CreateTokenSource() - { - return tokenSource = new CancellationTokenSource(); - } - } -} From 2a1be65d021ac5b2da028344373c013464e00fd4 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 14 Jan 2021 18:00:17 +0100 Subject: [PATCH 023/116] Add Async API to encoding operations; --- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 22 +- BCnEnc.Net/Encoder/BcEncoder.cs | 1718 +++++++++++++--------- BCnEnc.Net/Encoder/IBcBlockEncoder.cs | 4 +- 3 files changed, 999 insertions(+), 745 deletions(-) diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index f8adebc..e171f21 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -1,8 +1,5 @@ -using System; -using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using System.Text; using System.Threading.Tasks; using BCnEncoder.Shared; @@ -10,21 +7,26 @@ namespace BCnEncoder.Encoder { internal abstract class BaseBcBlockEncoder : IBcBlockEncoder where T : unmanaged { - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel) + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, OperationContext context) { var outputData = new byte[blockWidth * blockHeight * Unsafe.SizeOf()]; - var outputBlocks = MemoryMarshal.Cast(outputData); - if (parallel) + if (context.IsParallel) { - Parallel.For(0, blocks.Length, i => + var options = new ParallelOptions { - var outputBlocks = MemoryMarshal.Cast(outputData); - outputBlocks[i] = EncodeBlock(blocks[i], quality); - }); + CancellationToken = context.CancellationToken, + MaxDegreeOfParallelism = context.TaskCount + }; + Parallel.For(0, blocks.Length, options, i => + { + var outputBlocks = MemoryMarshal.Cast(outputData); + outputBlocks[i] = EncodeBlock(blocks[i], quality); + }); } else { + var outputBlocks = MemoryMarshal.Cast(outputData); for (var i = 0; i < blocks.Length; i++) { outputBlocks[i] = EncodeBlock(blocks[i], quality); diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index e5651b7..7066302 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Threading; +using System.Threading.Tasks; using BCnEncoder.Encoder.Bc7; using BCnEncoder.Encoder.Options; using BCnEncoder.Shared; @@ -10,754 +12,1004 @@ namespace BCnEncoder.Encoder { - /// + /// /// Handles all encoding of images into compressed or uncompressed formats. For decoding, /// public class BcEncoder - { - /// - /// The input options of the encoder. - /// + { + /// + /// The input options of the encoder. + /// public EncoderInputOptions InputOptions { get; } = new EncoderInputOptions(); - /// - /// The output options of the encoder. - /// + /// + /// The output options of the encoder. + /// public EncoderOutputOptions OutputOptions { get; } = new EncoderOutputOptions(); - /// - /// The encoder options. - /// - public EncoderOptions Options { get; } = new EncoderOptions(); - - /// - /// Creates a new instance of . - /// - /// The block compression Format to encode an image with. - public BcEncoder(CompressionFormat format = CompressionFormat.Bc1) - { - OutputOptions.Format = format; - } - - /// - /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. - /// - /// The image to encode. - /// The stream to write the encoded image to. - public void Encode(Image inputImage, Stream outputStream) - { - switch (OutputOptions.FileFormat) - { - case OutputFileFormat.Dds: - var dds = EncodeToDds(inputImage); - dds.Write(outputStream); - break; - - case OutputFileFormat.Ktx: - var ktx = EncodeToKtx(inputImage); - ktx.Write(outputStream); - break; - } - } - - /// - /// Encodes all mipmap levels into a Ktx file. - /// - /// The image to encode. - /// The Ktx file containing the encoded image. - public KtxFile EncodeToKtx(Image inputImage) - { - KtxFile output; - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - // Setup encoders - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - - output = new KtxFile( - KtxHeader.InitializeCompressed(inputImage.Width, inputImage.Height, - compressedEncoder.GetInternalFormat(), - compressedEncoder.GetBaseInternalFormat())); - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - output = new KtxFile( - KtxHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, - uncompressedEncoder.GetGlType(), - uncompressedEncoder.GetGlFormat(), - uncompressedEncoder.GetGlTypeSize(), - uncompressedEncoder.GetInternalFormat(), - uncompressedEncoder.GetBaseInternalFormat())); - } - - // Encode mipmap levels - for (var mip = 0; mip < numMipMaps; mip++) - { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.IsParallel); - } - else - { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - throw new Exception("Cannot get pixel span."); - - encoded = uncompressedEncoder.Encode(mipPixels); - } - - output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, - (uint)inputImage.Width, - (uint)inputImage.Height, 1)); - output.MipMaps[mip].Faces[0] = new KtxMipFace(encoded, - (uint)inputImage.Width, - (uint)inputImage.Height); - } - - // Dispose all mipmap levels - foreach (var image in mipChain) - image.Dispose(); - - output.header.NumberOfFaces = 1; - output.header.NumberOfMipmapLevels = numMipMaps; - - return output; - } - - /// - /// Encodes all mipmap levels into a Dds file. - /// - /// The image to encode. - /// The Dds file containing the encoded image. - public DdsFile EncodeToDds(Image inputImage) - { - DdsFile output; - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - - var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(inputImage.Width, inputImage.Height, - compressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader, dxt10Header); - - if (OutputOptions.DdsBc1WriteAlphaFlag && - OutputOptions.Format == CompressionFormat.Bc1WithAlpha) - { - output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; - } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - var ddsHeader = DdsHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, - uncompressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader); - } - - // Encode mipmap levels - for (var mip = 0; mip < numMipMaps; mip++) - { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.IsParallel); - } - else - { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - - encoded = uncompressedEncoder.Encode(mipPixels); - } - - if (mip == 0) - { - output.Faces.Add(new DdsFace((uint)inputImage.Width, (uint)inputImage.Height, - (uint)encoded.Length, (int)numMipMaps)); - } - - output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, - (uint)inputImage.Width, - (uint)inputImage.Height); - } - - // Dispose all mipmap levels - foreach (var image in mipChain) - { - image.Dispose(); - } - - output.header.dwMipMapCount = numMipMaps; - if (numMipMaps > 1) - { - output.header.dwCaps |= HeaderCaps.DdscapsComplex | HeaderCaps.DdscapsMipmap; - } - - return output; - } - - /// - /// Encodes all mipmap levels into a list of byte buffers. - /// - /// The image to encode. - /// A list of raw encoded data. - public IList EncodeToRawBytes(Image inputImage) - { - var output = new List(); - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - } - - // Encode all mipmap levels - for (var mip = 0; mip < numMipMaps; mip++) - { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.IsParallel); - } - else - { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - - encoded = uncompressedEncoder.Encode(mipPixels); - } - - output.Add(encoded); - } - - // Dispose all mipmap levels - foreach (var image in mipChain) - { - image.Dispose(); - } - - return output; - } - - /// - /// Encodes a single mip level of the input image to a byte buffer. - /// - /// The image to encode. - /// The mipmap to encode. - /// The width of the mipmap. - /// The height of the mipmap. - /// The raw encoded data. - public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) - { - if (mipLevel < 0) - throw new ArgumentException($"{nameof(mipLevel)} cannot be less than zero."); - - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - } - - // Dispose all mipmap levels - if (mipLevel > numMipMaps - 1) - { - foreach (var image in mipChain) - { - image.Dispose(); - } - - throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps."); - } - - // Encode mipmap level - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.IsParallel); - } - else - { - if (!mipChain[mipLevel].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - - encoded = uncompressedEncoder.Encode(mipPixels); - } - - mipWidth = mipChain[mipLevel].Width; - mipHeight = mipChain[mipLevel].Height; - - // Dispose all mipmap levels - foreach (var image in mipChain) - { - image.Dispose(); - } - - return encoded; - } - - /// - /// Encodes all mipmap levels into a list of byte buffers. - /// - /// The raw pixels of the input image in rgba format. - /// The width of the input image. - /// The height of the input image. - /// A list of raw encoded mipmap data. - public IList EncodeToRawBytes(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight) - { - if (inputPixelsRgba.Length != inputImageWidth * inputImageHeight * 4) - { - throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); - } - using var image = Image.LoadPixelData(inputPixelsRgba, inputImageWidth, inputImageHeight); - return EncodeToRawBytes(image); - } - - /// - /// Encodes a single mip level of the input image to a byte buffer. - /// - /// The raw pixels of the input image in rgba format. - /// The width of the input image. - /// The height of the input image. - /// The mipmap to encode. - /// The width of the mipmap. - /// The height of the mipmap. - /// The raw encoded data. - public byte[] EncodeToRawBytes(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, int mipLevel, out int mipWidth, out int mipHeight) - { - if (inputPixelsRgba.Length != inputImageWidth * inputImageHeight * 4) - { - throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); - } - using var image = Image.LoadPixelData(inputPixelsRgba, inputImageWidth, inputImageHeight); - return EncodeToRawBytes(image, mipLevel, out mipWidth, out mipHeight); - } - - /// + /// + /// The encoder options. + /// + public EncoderOptions Options { get; } = new EncoderOptions(); + + /// + /// Creates a new instance of . + /// + /// The block compression Format to encode an image with. + public BcEncoder(CompressionFormat format = CompressionFormat.Bc1) + { + OutputOptions.Format = format; + } + + #region Async Api + + /// + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. + /// + /// The image to encode. + /// The stream to write the encoded image to. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + public Task EncodeAsync(Image inputImage, Stream outputStream, CancellationToken token = default) + { + return Task.Run(() => EncodeInternal(inputImage, outputStream, token), token); + } + + /// + /// Encodes all mipmap levels into a Ktx file asynchronously. + /// + /// The image to encode. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The Ktx file containing the encoded image. + public Task EncodeToKtxAsync(Image inputImage, CancellationToken token = default) + { + return Task.Run(() => EncodeToKtxInternal(inputImage, token), token); + } + + /// + /// Encodes all mipmap levels into a Dds file asynchronously. + /// + /// The image to encode. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The Dds file containing the encoded image. + public Task EncodeToDdsAsync(Image inputImage, CancellationToken token = default) + { + return Task.Run(() => EncodeToDdsInternal(inputImage, token), token); + } + + /// + /// Encodes all mipmap levels into a list of byte buffers asynchronously. + /// + /// The image to encode. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// A list of raw encoded data. + public Task> EncodeToRawBytesAsync(Image inputImage, CancellationToken token = default) + { + return Task.Run(() => EncodeToRawBytesInternal(inputImage, token), token); + } + + /// + /// Encodes a single mip level of the input image to a byte buffer asynchronously. + /// + /// The image to encode. + /// The mipmap to encode. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The raw encoded data. + /// To get the width and height of the encoded mipLevel, see . + public Task EncodeToRawBytesAsync(Image inputImage, int mipLevel, CancellationToken token = default) + { + return Task.Run(() => EncodeToRawBytesInternal(inputImage, mipLevel, out _, out _, token), token); + } + + /// + /// Encodes all mipmap levels into a list of byte buffers asynchronously. + /// + /// The raw pixels of the input image in rgba format. + /// The width of the input image. + /// The height of the input image. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// A list of raw encoded mipmap data. + public Task> EncodeToRawBytesAsync(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, CancellationToken token = default) + { + return Task.Run(() => EncodeToRawBytesInternal(inputPixelsRgba, inputImageWidth, inputImageHeight, token), token); + } + + /// + /// Encodes a single mip level of the input image to a byte buffer asynchronously. + /// + /// The raw pixels of the input image in rgba format. + /// The width of the input image. + /// The height of the input image. + /// The mipmap to encode. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The raw encoded data. + /// To get the width and height of the encoded mipLevel, see . + public Task EncodeToRawBytesAsync(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, int mipLevel, CancellationToken token = default) + { + return Task.Run(() => EncodeToRawBytesInternal(inputPixelsRgba, inputImageWidth, inputImageHeight, mipLevel, out _, out _, token), token); + } + + /// + /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream asynchronously. + /// Order is +X, -X, +Y, -Y, +Z, -Z + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The stream to write the encoded image to. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + public Task EncodeCubeMapAsync(Image right, Image left, Image top, Image down, + Image back, Image front, Stream outputStream, CancellationToken token = default) + { + return Task.Run(() => EncodeCubeMapInternal(right, left, top, down, back, front, outputStream, token), token); + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Ktx file asynchronously. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The Ktx file containing the encoded image. + public Task EncodeCubeMapToKtxAsync(Image right, Image left, Image top, + Image down, Image back, Image front, CancellationToken token = default) + { + return Task.Run(() => EncodeCubeMapToKtxInternal(right, left, top, down, back, front, token), token); + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Dds file asynchronously. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The Dds file containing the encoded image. + public Task EncodeCubeMapToDdsAsync(Image right, Image left, Image top, + Image down, Image back, Image front, CancellationToken token = default) + { + return Task.Run(() => EncodeCubeMapToDdsInternal(right, left, top, down, back, front, token), token); + } + + #endregion + + #region Sync Api + + /// + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. + /// + /// The image to encode. + /// The stream to write the encoded image to. + public void Encode(Image inputImage, Stream outputStream) + { + EncodeInternal(inputImage, outputStream, default); + } + + /// + /// Encodes all mipmap levels into a Ktx file. + /// + /// The image to encode. + /// The Ktx file containing the encoded image. + public KtxFile EncodeToKtx(Image inputImage) + { + return EncodeToKtxInternal(inputImage, default); + } + + /// + /// Encodes all mipmap levels into a Dds file. + /// + /// The image to encode. + /// The Dds file containing the encoded image. + public DdsFile EncodeToDds(Image inputImage) + { + return EncodeToDdsInternal(inputImage, default); + } + + /// + /// Encodes all mipmap levels into a list of byte buffers. + /// + /// The raw pixels of the input image in rgba format. + /// The width of the input image. + /// The height of the input image. + /// A list of raw encoded mipmap data. + public IList EncodeToRawBytes(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight) + { + return EncodeToRawBytesInternal(inputPixelsRgba, inputImageWidth, inputImageHeight, default); + } + + /// + /// Encodes all mipmap levels into a list of byte buffers. + /// + /// The image to encode. + /// A list of raw encoded data. + public IList EncodeToRawBytes(Image inputImage) + { + return EncodeToRawBytesInternal(inputImage, default); + } + + /// + /// Encodes a single mip level of the input image to a byte buffer. + /// + /// The image to encode. + /// The mipmap to encode. + /// The width of the mipmap. + /// The height of the mipmap. + /// The raw encoded data. + public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) + { + return EncodeToRawBytesInternal(inputImage, mipLevel, out mipWidth, out mipHeight, default); + } + + /// + /// Encodes a single mip level of the input image to a byte buffer. + /// + /// The raw pixels of the input image in rgba format. + /// The width of the input image. + /// The height of the input image. + /// The mipmap to encode. + /// The width of the mipmap. + /// The height of the mipmap. + /// The raw encoded data. + public byte[] EncodeToRawBytes(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, int mipLevel, out int mipWidth, out int mipHeight) + { + return EncodeToRawBytesInternal(inputPixelsRgba, inputImageWidth, inputImageHeight, mipLevel, out mipWidth, + out mipHeight, default); + } + + /// + /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream. + /// Order is +X, -X, +Y, -Y, +Z, -Z + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The stream to write the encoded image to. + public void EncodeCubeMap(Image right, Image left, Image top, Image down, + Image back, Image front, Stream outputStream) + { + EncodeCubeMapInternal(right, left, top, down, back, front, outputStream, default); + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Ktx file. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The Ktx file containing the encoded image. + public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image top, Image down, + Image back, Image front) + { + return EncodeCubeMapToKtxInternal(right, left, top, down, back, front, default); + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Dds file. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The Dds file containing the encoded image. + public DdsFile EncodeCubeMapToDds(Image right, Image left, Image top, Image down, + Image back, Image front) + { + return EncodeCubeMapToDdsInternal(right, left, top, down, back, front, default); + } + + #endregion + + #region MipMap operations + + /// /// Calculates the number of mipmap levels that will be generated for the given input image. /// /// The image to use for the calculation. /// The number of mipmap levels that will be generated for the input image. - public int CalculateNumberOfMipLevels(Image inputImage) - { - return (int) MipMapper.CalculateMipChainLength(inputImage.Width, inputImage.Height, - (OutputOptions.GenerateMipMaps ? (uint) OutputOptions.MaxMipMapLevel : 1)); - } - - /// - /// Calculates the number of mipmap levels that will be generated for the given input image. - /// - /// The width of the input image in pixels - /// The height of the input image in pixels - /// The number of mipmap levels that will be generated for the input image. - public int CalculateNumberOfMipLevels(int imagePixelWidth, int imagePixelHeight) - { - return (int)MipMapper.CalculateMipChainLength(imagePixelWidth, imagePixelHeight, - (OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1)); - } - - /// + public int CalculateNumberOfMipLevels(Image inputImage) + { + return (int)MipMapper.CalculateMipChainLength(inputImage.Width, inputImage.Height, + (OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1)); + } + + /// + /// Calculates the number of mipmap levels that will be generated for the given input image. + /// + /// The width of the input image in pixels + /// The height of the input image in pixels + /// The number of mipmap levels that will be generated for the input image. + public int CalculateNumberOfMipLevels(int imagePixelWidth, int imagePixelHeight) + { + return (int)MipMapper.CalculateMipChainLength(imagePixelWidth, imagePixelHeight, + (OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1)); + } + + /// /// Calculates the size of a given mipmap level. /// /// The image to use for the calculation. /// The mipLevel to calculate (0 is original image) /// The mipmap width calculated /// The mipmap height calculated - public void CalculateMipMapSize(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) - { - MipMapper.CalculateMipLevelSize(inputImage.Width, inputImage.Height, mipLevel, out mipWidth, - out mipHeight); - } - - /// - /// Calculates the size of a given mipmap level. - /// - /// The width of the input image in pixels - /// The height of the input image in pixels - /// The mipLevel to calculate (0 is original image) - /// The mipmap width calculated - /// The mipmap height calculated - public void CalculateMipMapSize(int imagePixelWidth, int imagePixelHeight, int mipLevel, out int mipWidth, out int mipHeight) - { - MipMapper.CalculateMipLevelSize(imagePixelWidth, imagePixelHeight, mipLevel, out mipWidth, - out mipHeight); - } - - /// - /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream. - /// Order is +X, -X, +Y, -Y, +Z, -Z - /// - /// The right face of the cubemap. - /// The left face of the cubemap. - /// The top face of the cubemap. - /// The bottom face of the cubemap. - /// The back face of the cubemap. - /// The front face of the cubemap. - /// The stream to write the encoded image to. - public void EncodeCubeMap(Image right, Image left, Image top, Image down, - Image back, Image front, Stream outputStream) - { - switch (OutputOptions.FileFormat) - { - case OutputFileFormat.Ktx: - var ktx = EncodeCubeMapToKtx(right, left, top, down, back, front); - ktx.Write(outputStream); - break; - - case OutputFileFormat.Dds: - var dds = EncodeCubeMapToDds(right, left, top, down, back, front); - dds.Write(outputStream); - break; - } - } - - /// - /// Encodes all cubemap faces and mipmap levels into a Ktx file. - /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. - /// - /// The right face of the cubemap. - /// The left face of the cubemap. - /// The top face of the cubemap. - /// The bottom face of the cubemap. - /// The back face of the cubemap. - /// The front face of the cubemap. - /// The Ktx file containing the encoded image. - public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image top, Image down, - Image back, Image front) - { - KtxFile output; - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - - if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width - || right.Width != back.Width || right.Width != front.Width || - right.Height != left.Height || right.Height != top.Height || right.Height != down.Height - || right.Height != back.Height || right.Height != front.Height) - { - throw new ArgumentException("All input images of a cubemap should be the same size."); - } - - var faces = new[] { right, left, top, down, back, front }; - - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - - output = new KtxFile( - KtxHeader.InitializeCompressed(right.Width, right.Height, - compressedEncoder.GetInternalFormat(), - compressedEncoder.GetBaseInternalFormat())); - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - output = new KtxFile( - KtxHeader.InitializeUncompressed(right.Width, right.Height, - uncompressedEncoder.GetGlType(), - uncompressedEncoder.GetGlFormat(), - uncompressedEncoder.GetGlTypeSize(), - uncompressedEncoder.GetInternalFormat(), - uncompressedEncoder.GetBaseInternalFormat())); - - } - - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; - var mipLength = MipMapper.CalculateMipChainLength(right.Width, right.Height, numMipMaps); - for (uint i = 0; i < mipLength; i++) - { - output.MipMaps.Add(new KtxMipmap(0, 0, 0, (uint)faces.Length)); - } - - // Encode all faces - for (var face = 0; face < faces.Length; face++) - { - var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); - - // Encode all mipmap levels per face - for (var mip = 0; mip < numMipMaps; mip++) - { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.IsParallel); - } - else - { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - - encoded = uncompressedEncoder.Encode(mipPixels); - } - - if (face == 0) - { - output.MipMaps[mip] = new KtxMipmap((uint)encoded.Length, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height, (uint)faces.Length); - } - - output.MipMaps[mip].Faces[face] = new KtxMipFace(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); - } - - // Dispose all mipmap levels - foreach (var image in mipChain) - { - image.Dispose(); - } - } - - output.header.NumberOfFaces = (uint)faces.Length; - output.header.NumberOfMipmapLevels = mipLength; - - return output; - } - - /// - /// Encodes all cubemap faces and mipmap levels into a Dds file. - /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. - /// - /// The right face of the cubemap. - /// The left face of the cubemap. - /// The top face of the cubemap. - /// The bottom face of the cubemap. - /// The back face of the cubemap. - /// The front face of the cubemap. - /// The Dds file containing the encoded image. - public DdsFile EncodeCubeMapToDds(Image right, Image left, Image top, Image down, - Image back, Image front) - { - DdsFile output; - IBcBlockEncoder compressedEncoder = null; - IRawEncoder uncompressedEncoder = null; - - if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width - || right.Width != back.Width || right.Width != front.Width || - right.Height != left.Height || right.Height != top.Height || right.Height != down.Height - || right.Height != back.Height || right.Height != front.Height) - { - throw new ArgumentException("All input images of a cubemap should be the same size."); - } - - var faces = new[] { right, left, top, down, back, front }; - - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - - var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(right.Width, right.Height, - compressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader, dxt10Header); - - if (OutputOptions.DdsBc1WriteAlphaFlag && - OutputOptions.Format == CompressionFormat.Bc1WithAlpha) - { - output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; - } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - var ddsHeader = DdsHeader.InitializeUncompressed(right.Width, right.Height, - uncompressedEncoder.GetDxgiFormat()); - - output = new DdsFile(ddsHeader); - } - - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; - - // Encode all faces - for (var face = 0; face < faces.Length; face++) - { - var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); - - // Encode all mipmap levels per face - for (var mip = 0; mip < numMipMaps; mip++) - { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - !Debugger.IsAttached && Options.IsParallel); - } - else - { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - - encoded = uncompressedEncoder.Encode(mipPixels); - } - - if (mip == 0) - { - output.Faces.Add(new DdsFace((uint)mipChain[mip].Width, (uint)mipChain[mip].Height, - (uint)encoded.Length, mipChain.Count)); - } - - output.Faces[face].MipMaps[mip] = new DdsMipMap(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); - } - - // Dispose all mipmap levels - foreach (var image in mipChain) - { - image.Dispose(); - } - } - - output.header.dwCaps |= HeaderCaps.DdscapsComplex; - output.header.dwMipMapCount = numMipMaps; - if (numMipMaps > 1) - { - output.header.dwCaps |= HeaderCaps.DdscapsMipmap; - } - - output.header.dwCaps2 |= HeaderCaps2.Ddscaps2Cubemap | - HeaderCaps2.Ddscaps2CubemapPositivex | - HeaderCaps2.Ddscaps2CubemapNegativex | - HeaderCaps2.Ddscaps2CubemapPositivey | - HeaderCaps2.Ddscaps2CubemapNegativey | - HeaderCaps2.Ddscaps2CubemapPositivez | - HeaderCaps2.Ddscaps2CubemapNegativez; - - return output; - } - - private IBcBlockEncoder GetEncoder(CompressionFormat format) - { - switch (format) - { - case CompressionFormat.Bc1: - return new Bc1BlockEncoder(); - - case CompressionFormat.Bc1WithAlpha: - return new Bc1AlphaBlockEncoder(); - - case CompressionFormat.Bc2: - return new Bc2BlockEncoder(); - - case CompressionFormat.Bc3: - return new Bc3BlockEncoder(); - - case CompressionFormat.Bc4: - return new Bc4BlockEncoder(InputOptions.LuminanceAsRed); - - case CompressionFormat.Bc5: - return new Bc5BlockEncoder(); - - case CompressionFormat.Bc7: - return new Bc7Encoder(); - - default: - return null; - } - } - - private IRawEncoder GetRawEncoder(CompressionFormat format) - { - switch (format) - { - case CompressionFormat.R: - return new RawLuminanceEncoder(InputOptions.LuminanceAsRed); - - case CompressionFormat.Rg: - return new RawRgEncoder(); - - case CompressionFormat.Rgb: - return new RawRgbEncoder(); - - case CompressionFormat.Rgba: - return new RawRgbaEncoder(); - - default: - throw new ArgumentOutOfRangeException(nameof(format), format, null); - } - } - } + public void CalculateMipMapSize(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) + { + MipMapper.CalculateMipLevelSize(inputImage.Width, inputImage.Height, mipLevel, out mipWidth, + out mipHeight); + } + + /// + /// Calculates the size of a given mipmap level. + /// + /// The width of the input image in pixels + /// The height of the input image in pixels + /// The mipLevel to calculate (0 is original image) + /// The mipmap width calculated + /// The mipmap height calculated + public void CalculateMipMapSize(int imagePixelWidth, int imagePixelHeight, int mipLevel, out int mipWidth, out int mipHeight) + { + MipMapper.CalculateMipLevelSize(imagePixelWidth, imagePixelHeight, mipLevel, out mipWidth, + out mipHeight); + } + + #endregion + + #region Private + + private void EncodeInternal(Image inputImage, Stream outputStream, CancellationToken token) + { + switch (OutputOptions.FileFormat) + { + case OutputFileFormat.Dds: + var dds = EncodeToDds(inputImage); + dds.Write(outputStream); + break; + + case OutputFileFormat.Ktx: + var ktx = EncodeToKtx(inputImage); + ktx.Write(outputStream); + break; + } + } + + private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken token) + { + KtxFile output; + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + + // Setup encoders + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + output = new KtxFile( + KtxHeader.InitializeCompressed(inputImage.Width, inputImage.Height, + compressedEncoder.GetInternalFormat(), + compressedEncoder.GetBaseInternalFormat())); + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + output = new KtxFile( + KtxHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, + uncompressedEncoder.GetGlType(), + uncompressedEncoder.GetGlFormat(), + uncompressedEncoder.GetGlTypeSize(), + uncompressedEncoder.GetInternalFormat(), + uncompressedEncoder.GetBaseInternalFormat())); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + throw new Exception("Cannot get pixel span."); + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, + (uint)inputImage.Width, + (uint)inputImage.Height, 1)); + output.MipMaps[mip].Faces[0] = new KtxMipFace(encoded, + (uint)inputImage.Width, + (uint)inputImage.Height); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + image.Dispose(); + + output.header.NumberOfFaces = 1; + output.header.NumberOfMipmapLevels = numMipMaps; + + return output; + } + + private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken token) + { + DdsFile output; + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(inputImage.Width, inputImage.Height, + compressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader, dxt10Header); + + if (OutputOptions.DdsBc1WriteAlphaFlag && + OutputOptions.Format == CompressionFormat.Bc1WithAlpha) + { + output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; + } + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + var ddsHeader = DdsHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, + uncompressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + if (mip == 0) + { + output.Faces.Add(new DdsFace((uint)inputImage.Width, (uint)inputImage.Height, + (uint)encoded.Length, (int)numMipMaps)); + } + + output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, + (uint)inputImage.Width, + (uint)inputImage.Height); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + { + image.Dispose(); + } + + output.header.dwMipMapCount = numMipMaps; + if (numMipMaps > 1) + { + output.header.dwCaps |= HeaderCaps.DdscapsComplex | HeaderCaps.DdscapsMipmap; + } + + return output; + } + + private IList EncodeToRawBytesInternal(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, CancellationToken token) + { + if (inputPixelsRgba.Length != inputImageWidth * inputImageHeight * 4) + { + throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); + } + + using var image = Image.LoadPixelData(inputPixelsRgba, inputImageWidth, inputImageHeight); + return EncodeToRawBytesInternal(image, token); + } + + private IList EncodeToRawBytesInternal(Image inputImage, CancellationToken token) + { + var output = new List(); + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Encode all mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + output.Add(encoded); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + { + image.Dispose(); + } + + return output; + } + + private byte[] EncodeToRawBytesInternal(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) + { + if (inputPixelsRgba.Length != inputImageWidth * inputImageHeight * 4) + { + throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); + } + using var image = Image.LoadPixelData(inputPixelsRgba, inputImageWidth, inputImageHeight); + return EncodeToRawBytesInternal(image, mipLevel, out mipWidth, out mipHeight, token); + } + + private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) + { + if (mipLevel < 0) + throw new ArgumentException($"{nameof(mipLevel)} cannot be less than zero."); + + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + } + + // Dispose all mipmap levels + if (mipLevel > numMipMaps - 1) + { + foreach (var image in mipChain) + { + image.Dispose(); + } + + throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps."); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Encode mipmap level + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + } + else + { + if (!mipChain[mipLevel].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + mipWidth = mipChain[mipLevel].Width; + mipHeight = mipChain[mipLevel].Height; + + // Dispose all mipmap levels + foreach (var image in mipChain) + { + image.Dispose(); + } + + return encoded; + } + + private void EncodeCubeMapInternal(Image right, Image left, Image top, Image down, + Image back, Image front, Stream outputStream, CancellationToken token) + { + switch (OutputOptions.FileFormat) + { + case OutputFileFormat.Ktx: + var ktx = EncodeCubeMapToKtxInternal(right, left, top, down, back, front, token); + ktx.Write(outputStream); + break; + + case OutputFileFormat.Dds: + var dds = EncodeCubeMapToDdsInternal(right, left, top, down, back, front, token); + dds.Write(outputStream); + break; + } + } + + private KtxFile EncodeCubeMapToKtxInternal(Image right, Image left, Image top, Image down, + Image back, Image front, CancellationToken token) + { + KtxFile output; + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width + || right.Width != back.Width || right.Width != front.Width || + right.Height != left.Height || right.Height != top.Height || right.Height != down.Height + || right.Height != back.Height || right.Height != front.Height) + { + throw new ArgumentException("All input images of a cubemap should be the same size."); + } + + var faces = new[] { right, left, top, down, back, front }; + + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + output = new KtxFile( + KtxHeader.InitializeCompressed(right.Width, right.Height, + compressedEncoder.GetInternalFormat(), + compressedEncoder.GetBaseInternalFormat())); + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + output = new KtxFile( + KtxHeader.InitializeUncompressed(right.Width, right.Height, + uncompressedEncoder.GetGlType(), + uncompressedEncoder.GetGlFormat(), + uncompressedEncoder.GetGlTypeSize(), + uncompressedEncoder.GetInternalFormat(), + uncompressedEncoder.GetBaseInternalFormat())); + + } + + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var mipLength = MipMapper.CalculateMipChainLength(right.Width, right.Height, numMipMaps); + for (uint i = 0; i < mipLength; i++) + { + output.MipMaps.Add(new KtxMipmap(0, 0, 0, (uint)faces.Length)); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Encode all faces + for (var face = 0; face < faces.Length; face++) + { + var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); + + // Encode all mipmap levels per face + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + if (face == 0) + { + output.MipMaps[mip] = new KtxMipmap((uint)encoded.Length, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height, (uint)faces.Length); + } + + output.MipMaps[mip].Faces[face] = new KtxMipFace(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + { + image.Dispose(); + } + } + + output.header.NumberOfFaces = (uint)faces.Length; + output.header.NumberOfMipmapLevels = mipLength; + + return output; + } + + private DdsFile EncodeCubeMapToDdsInternal(Image right, Image left, Image top, Image down, + Image back, Image front, CancellationToken token) + { + DdsFile output; + IBcBlockEncoder compressedEncoder = null; + IRawEncoder uncompressedEncoder = null; + + if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width + || right.Width != back.Width || right.Width != front.Width || + right.Height != left.Height || right.Height != top.Height || right.Height != down.Height + || right.Height != back.Height || right.Height != front.Height) + { + throw new ArgumentException("All input images of a cubemap should be the same size."); + } + + var faces = new[] { right, left, top, down, back, front }; + + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(right.Width, right.Height, + compressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader, dxt10Header); + + if (OutputOptions.DdsBc1WriteAlphaFlag && + OutputOptions.Format == CompressionFormat.Bc1WithAlpha) + { + output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; + } + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + var ddsHeader = DdsHeader.InitializeUncompressed(right.Width, right.Height, + uncompressedEncoder.GetDxgiFormat()); + + output = new DdsFile(ddsHeader); + } + + var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Encode all faces + for (var face = 0; face < faces.Length; face++) + { + var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); + + // Encode all mipmap levels per face + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } + + encoded = uncompressedEncoder.Encode(mipPixels); + } + + if (mip == 0) + { + output.Faces.Add(new DdsFace((uint)mipChain[mip].Width, (uint)mipChain[mip].Height, + (uint)encoded.Length, mipChain.Count)); + } + + output.Faces[face].MipMaps[mip] = new DdsMipMap(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); + } + + // Dispose all mipmap levels + foreach (var image in mipChain) + { + image.Dispose(); + } + } + + output.header.dwCaps |= HeaderCaps.DdscapsComplex; + output.header.dwMipMapCount = numMipMaps; + if (numMipMaps > 1) + { + output.header.dwCaps |= HeaderCaps.DdscapsMipmap; + } + + output.header.dwCaps2 |= HeaderCaps2.Ddscaps2Cubemap | + HeaderCaps2.Ddscaps2CubemapPositivex | + HeaderCaps2.Ddscaps2CubemapNegativex | + HeaderCaps2.Ddscaps2CubemapPositivey | + HeaderCaps2.Ddscaps2CubemapNegativey | + HeaderCaps2.Ddscaps2CubemapPositivez | + HeaderCaps2.Ddscaps2CubemapNegativez; + + return output; + } + + #endregion + + #region Support + + private IBcBlockEncoder GetEncoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.Bc1: + return new Bc1BlockEncoder(); + + case CompressionFormat.Bc1WithAlpha: + return new Bc1AlphaBlockEncoder(); + + case CompressionFormat.Bc2: + return new Bc2BlockEncoder(); + + case CompressionFormat.Bc3: + return new Bc3BlockEncoder(); + + case CompressionFormat.Bc4: + return new Bc4BlockEncoder(InputOptions.LuminanceAsRed); + + case CompressionFormat.Bc5: + return new Bc5BlockEncoder(); + + case CompressionFormat.Bc7: + return new Bc7Encoder(); + + default: + return null; + } + } + + private IRawEncoder GetRawEncoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.R: + return new RawLuminanceEncoder(InputOptions.LuminanceAsRed); + + case CompressionFormat.Rg: + return new RawRgEncoder(); + + case CompressionFormat.Rgb: + return new RawRgbEncoder(); + + case CompressionFormat.Rgba: + return new RawRgbaEncoder(); + + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } + } + + #endregion + } } diff --git a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs index e9f991b..b387b83 100644 --- a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs @@ -1,10 +1,10 @@ -using BCnEncoder.Shared; +using BCnEncoder.Shared; namespace BCnEncoder.Encoder { internal interface IBcBlockEncoder { - byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, bool parallel = true); + byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, OperationContext context); GlInternalFormat GetInternalFormat(); GlFormat GetBaseInternalFormat(); DxgiFormat GetDxgiFormat(); From 26ce23b4e185666ebcbe2a1f95f7a826a5db3e24 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 14 Jan 2021 20:01:40 +0100 Subject: [PATCH 024/116] Add cancellation to BaseBcBlockEncoder; --- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index e171f21..9eb4e6c 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -29,6 +29,11 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight var outputBlocks = MemoryMarshal.Cast(outputData); for (var i = 0; i < blocks.Length; i++) { + if (context.CancellationToken.IsCancellationRequested) + { + break; + } + outputBlocks[i] = EncodeBlock(blocks[i], quality); } } From b70d10f22e5cbd5be2acd37c00ea7824457e1662 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 14 Jan 2021 21:44:50 +0100 Subject: [PATCH 025/116] Throw if cancellation is requested in non-parallel code branches; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 5 +---- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 6 ++---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index bae8b7b..c9fbe79 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -50,10 +50,7 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana { for (var y = 0; y < blockHeight; y++) { - if (context.CancellationToken.IsCancellationRequested) - { - return output; - } + context.CancellationToken.ThrowIfCancellationRequested(); output[x, y] = DecodeBlock(encodedBlocks[x + y * blockWidth]); } diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index 9eb4e6c..b37dfb6 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -1,3 +1,4 @@ +using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -29,10 +30,7 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight var outputBlocks = MemoryMarshal.Cast(outputData); for (var i = 0; i < blocks.Length; i++) { - if (context.CancellationToken.IsCancellationRequested) - { - break; - } + context.CancellationToken.ThrowIfCancellationRequested(); outputBlocks[i] = EncodeBlock(blocks[i], quality); } From 1e3b2b316eb4ed0ada32b3f565b44e2db929d883 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 14 Jan 2021 22:20:33 +0100 Subject: [PATCH 026/116] Add tests for cancellation of decoding and encoding; --- BCnEncTests/AsyncTests.cs | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 BCnEncTests/AsyncTests.cs diff --git a/BCnEncTests/AsyncTests.cs b/BCnEncTests/AsyncTests.cs new file mode 100644 index 0000000..11feb5e --- /dev/null +++ b/BCnEncTests/AsyncTests.cs @@ -0,0 +1,59 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using Xunit; + +namespace BCnEncTests +{ + public class AsyncTests + { + [Fact] + public async void EncodeParallelCancellation() + { + var alphaGradient = ImageLoader.TestAlphaGradient1; + + var encoder = new BcEncoder(CompressionFormat.Bc7); + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.Options.IsParallel = true; + + var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)); + await Assert.ThrowsAsync(() => + encoder.EncodeToRawBytesAsync(alphaGradient, 0, source.Token)); + } + + [Fact] + public async void EncodeNonParallelCancellation() + { + var alphaGradient = ImageLoader.TestAlphaGradient1; + + var encoder = new BcEncoder(CompressionFormat.Bc7); + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.Options.IsParallel = false; + + var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)); + await Assert.ThrowsAsync(() => + encoder.EncodeToRawBytesAsync(alphaGradient, 0, source.Token)); + } + + // HINT: Parallel decoding is too fast to be cancelled. + // HINT: Even with TimeSpan.FromTicks(1) the test never successfully threw an exception when executed in bulk with other tests. + + [Fact] + public async void DecodeNonParallelCancellation() + { + using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc7.dds"); + DdsFile file = DdsFile.Load(fs); + + var decoder = new BcDecoder(); + decoder.Options.IsParallel = false; + + var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(10)); + await Assert.ThrowsAsync(() => + decoder.DecodeAsync(file, source.Token)); + } + } +} From 0ee2ead4bd946dfae7abddf4ddb32731b9026c57 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Fri, 15 Jan 2021 18:42:16 +0100 Subject: [PATCH 027/116] Add async tests for encoding and decoding; --- BCnEncTests/BC1Tests.cs | 29 ++- BCnEncTests/Bc7BlockTests.cs | 233 ++++++++++-------- BCnEncTests/BlockTests.cs | 26 +- .../{AsyncTests.cs => CancellationTest.cs} | 7 +- BCnEncTests/ClusterTests.cs | 25 +- BCnEncTests/ColorTest.cs | 9 +- BCnEncTests/DdsReadTests.cs | 63 ++--- BCnEncTests/DdsWritingTests.cs | 58 +++-- BCnEncTests/DecodingAsyncTests.cs | 76 ++++++ BCnEncTests/DecodingTests.cs | 90 +++---- BCnEncTests/EncodingAsyncTest.cs | 133 ++++++++++ BCnEncTests/EncodingTest.cs | 102 +++----- BCnEncTests/ImageLoader.cs | 44 +++- BCnEncTests/PcaTests.cs | 20 +- BCnEncTests/RawTests.cs | 16 +- BCnEncTests/TestHelper.cs | 28 ++- 16 files changed, 618 insertions(+), 341 deletions(-) rename BCnEncTests/{AsyncTests.cs => CancellationTest.cs} (90%) create mode 100644 BCnEncTests/DecodingAsyncTests.cs create mode 100644 BCnEncTests/EncodingAsyncTest.cs diff --git a/BCnEncTests/BC1Tests.cs b/BCnEncTests/BC1Tests.cs index 1bd4006..ed4b176 100644 --- a/BCnEncTests/BC1Tests.cs +++ b/BCnEncTests/BC1Tests.cs @@ -1,4 +1,4 @@ -using BCnEncoder.Shared; +using BCnEncoder.Shared; using SixLabors.ImageSharp.PixelFormats; using Xunit; @@ -9,10 +9,12 @@ public class Bc1Tests [Fact] public void Decode() { - Bc1Block block = new Bc1Block(); - block.color0 = new ColorRgb565(255, 255, 255); - block.color1 = new ColorRgb565(0, 0, 0); - + var block = new Bc1Block + { + color0 = new ColorRgb565(255, 255, 255), + color1 = new ColorRgb565(0, 0, 0) + }; + Assert.False(block.HasAlphaOrBlack); block[0] = 1; block[1] = 1; @@ -58,9 +60,11 @@ public void Decode() { [Fact] public void DecodeBlack() { - Bc1Block block = new Bc1Block(); - block.color0 = new ColorRgb565(200, 200, 200); - block.color1 = new ColorRgb565(255, 255, 255); + var block = new Bc1Block + { + color0 = new ColorRgb565(200, 200, 200), + color1 = new ColorRgb565(255, 255, 255) + }; Assert.True(block.HasAlphaOrBlack); block[0] = 0; @@ -107,9 +111,11 @@ public void DecodeBlack() { [Fact] public void DecodeAlpha() { - Bc1Block block = new Bc1Block(); - block.color0 = new ColorRgb565(200, 200, 200); - block.color1 = new ColorRgb565(255, 255, 255); + var block = new Bc1Block + { + color0 = new ColorRgb565(200, 200, 200), + color1 = new ColorRgb565(255, 255, 255) + }; Assert.True(block.HasAlphaOrBlack); block[0] = 0; @@ -153,6 +159,5 @@ public void DecodeAlpha() { Assert.Equal(new Rgba32(255, 255, 255), raw.p23); Assert.Equal(new Rgba32(255, 255, 255), raw.p33); } - } } diff --git a/BCnEncTests/Bc7BlockTests.cs b/BCnEncTests/Bc7BlockTests.cs index ac0ce90..89832c9 100644 --- a/BCnEncTests/Bc7BlockTests.cs +++ b/BCnEncTests/Bc7BlockTests.cs @@ -9,9 +9,67 @@ namespace BCnEncTests { public class Bc7BlockTests { + [Fact] + public void PackTypes() + { + var numWidthBlocks = 4; + var numHeightBlocks = 2; + var outputBlocks = new Bc7Block[64 * numWidthBlocks * numHeightBlocks]; + var encoded = new byte[64 * numWidthBlocks * numHeightBlocks * Unsafe.SizeOf()]; + + var output = new KtxFile( + KtxHeader.InitializeCompressed(numWidthBlocks * 8 * 4, numHeightBlocks * 8 * 4, + GlInternalFormat.GlCompressedRgbaBptcUnormArb, + GlFormat.GlRgba)); + + var type0 = new Span(outputBlocks, 0, 64); + Type0Pack(type0); + PlaceBlock(0, 0, type0, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); + + var type1 = new Span(outputBlocks, 64 * 1, 64); + Type1Pack(type1); + PlaceBlock(1, 0, type1, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); + + var type2 = new Span(outputBlocks, 64 * 2, 64); + Type2Pack(type2); + PlaceBlock(2, 0, type2, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); + + var type3 = new Span(outputBlocks, 64 * 3, 64); + Type3Pack(type3); + PlaceBlock(3, 0, type3, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); + + var type4 = new Span(outputBlocks, 64 * 4, 64); + Type4Pack(type4); + PlaceBlock(0, 1, type4, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); + + var type5 = new Span(outputBlocks, 64 * 5, 64); + Type5Pack(type5); + PlaceBlock(1, 1, type5, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); + + var type6 = new Span(outputBlocks, 64 * 6, 64); + Type6Pack(type6); + PlaceBlock(2, 1, type6, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); + + var type7 = new Span(outputBlocks, 64 * 7, 64); + Type7Pack(type7); + PlaceBlock(3, 1, type7, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); + + output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, + (uint)(8 * 4 * numWidthBlocks), + (uint)(8 * 4 * numHeightBlocks), 1)); + output.MipMaps[0].Faces[0] = new KtxMipFace(encoded, + (uint)(8 * 4 * numWidthBlocks), + (uint)(8 * 4 * numHeightBlocks)); + + var fs = File.OpenWrite("bc7_blocktests.ktx"); + output.Write(fs); + } + + #region Type Packs - private void Type0Pack(Span output) { - byte[][] subsetEndpoints = new[] { + private void Type0Pack(Span output) + { + var subsetEndpoints = new[] { //subset 1 new byte[]{0b1111, 0, 0}, new byte[]{0b1000, 0, 0}, @@ -22,16 +80,17 @@ private void Type0Pack(Span output) { new byte[]{0, 0, 0b1111}, new byte[]{0, 0, 0b1000} }; - byte[] pBits = new byte[] { + var pBits = new byte[] { 1, 0, 1, 0, 1, 1 }; - byte[] indices = new byte[] { + var indices = new byte[] { 0, 1, 2, 3, 0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0 }; - for (int i = 0; i < 16; i++) { + for (var i = 0; i < 16; i++) + { output[i].PackType0(i, subsetEndpoints, pBits, indices); Assert.Equal(Bc7BlockType.Type0, output[i].Type); Assert.Equal(i, output[i].PartitionSetId); @@ -47,7 +106,8 @@ private void Type0Pack(Span output) { 3, 2, 3, 0 }; - for (int i = 0; i < 16; i++) { + for (var i = 0; i < 16; i++) + { output[i + 16].PackType0(i, subsetEndpoints, pBits, indices); Assert.Equal(Bc7BlockType.Type0, output[i].Type); Assert.Equal(i, output[i].PartitionSetId); @@ -63,7 +123,8 @@ private void Type0Pack(Span output) { 0, 3, 0, 0 }; - for (int i = 0; i < 16; i++) { + for (var i = 0; i < 16; i++) + { output[i + 32].PackType0(i, subsetEndpoints, pBits, indices); Assert.Equal(Bc7BlockType.Type0, output[i].Type); Assert.Equal(i, output[i].PartitionSetId); @@ -79,15 +140,17 @@ private void Type0Pack(Span output) { 0, 1, 2, 3 }; - for (int i = 0; i < 16; i++) { + for (var i = 0; i < 16; i++) + { output[i + 48].PackType0(i, subsetEndpoints, pBits, indices); Assert.Equal(Bc7BlockType.Type0, output[i].Type); Assert.Equal(i, output[i].PartitionSetId); } } - private void Type1Pack(Span output) { - byte[][] subsetEndpoints = new[] { + private void Type1Pack(Span output) + { + var subsetEndpoints = new[] { //subset 1 new byte[]{0b111111, 0b0100, 0}, new byte[]{0b0100, 0b111111, 0}, @@ -95,24 +158,26 @@ private void Type1Pack(Span output) { new byte[]{0, 0, 0b111111}, new byte[]{0, 0, 0b1010} }; - byte[] pBits = new byte[] { + var pBits = new byte[] { 1, 1 }; - byte[] indices = new byte[] { + var indices = new byte[] { 0, 1, 2, 3, 0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0 }; - for (int i = 0; i < 64; i++) { + for (var i = 0; i < 64; i++) + { output[i].PackType1(i, subsetEndpoints, pBits, indices); Assert.Equal(Bc7BlockType.Type1, output[i].Type); Assert.Equal(i, output[i].PartitionSetId); } } - private void Type2Pack(Span output) { - byte[][] subsetEndpoints = new[] { + private void Type2Pack(Span output) + { + var subsetEndpoints = new[] { //subset 1 new byte[]{0b11111, 0, 0}, new byte[]{0b01000, 0, 0}, @@ -123,21 +188,23 @@ private void Type2Pack(Span output) { new byte[]{0, 0, 0b11111}, new byte[]{0, 0, 0b01000} }; - byte[] indices = new byte[] { + var indices = new byte[] { 0, 1, 2, 3, 0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0 }; - for (int i = 0; i < 64; i++) { + for (var i = 0; i < 64; i++) + { output[i].PackType2(i, subsetEndpoints, indices); Assert.Equal(Bc7BlockType.Type2, output[i].Type); Assert.Equal(i, output[i].PartitionSetId); } } - private void Type3Pack(Span output) { - byte[][] subsetEndpoints = new[] { + private void Type3Pack(Span output) + { + var subsetEndpoints = new[] { //subset 1 new byte[]{0b1111111, 0b10100, 0}, new byte[]{0b10100, 0b1111111, 0}, @@ -145,48 +212,51 @@ private void Type3Pack(Span output) { new byte[]{0, 0, 0b1111111}, new byte[]{0, 0, 0b11010} }; - byte[] pBits = new byte[] { + var pBits = new byte[] { 1, 0, 0, 1 }; - byte[] indices = new byte[] { + var indices = new byte[] { 0, 1, 2, 3, 0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0 }; - for (int i = 0; i < 64; i++) { + for (var i = 0; i < 64; i++) + { output[i].PackType3(i, subsetEndpoints, pBits, indices); Assert.Equal(Bc7BlockType.Type3, output[i].Type); Assert.Equal(i, output[i].PartitionSetId); } } - private void Type4Pack(Span output) { - byte[][] colorEndpoints = new[] { + private void Type4Pack(Span output) + { + var colorEndpoints = new[] { //subset 1 new byte[]{0b11111, 0, 0b0100}, new byte[]{0, 0b11111, 0b0100} }; - byte[] alphaEndPoints = new byte[]{ + var alphaEndPoints = new byte[]{ 0b111111, 0 }; - byte[] indices2Bit = new byte[] { + var indices2Bit = new byte[] { 0, 1, 2, 3, 0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0 }; - byte[] indices3Bit = new byte[] { + var indices3Bit = new byte[] { 0, 1, 2, 3, 7, 6, 5, 4, 7, 6, 5, 4, 3, 2, 1, 0 }; - int rotation = 0; + var rotation = 0; byte idxMode = 0; - for (int i = 0; i < 64; i++) { + for (var i = 0; i < 64; i++) + { rotation = (rotation + 1) % 4; idxMode = (byte)((idxMode + 1) % 2); output[i].PackType4(rotation, idxMode, colorEndpoints, alphaEndPoints, indices2Bit, indices3Bit); @@ -196,30 +266,32 @@ private void Type4Pack(Span output) { } } - private void Type5Pack(Span output) { - byte[][] colorEndpoints = new[] { + private void Type5Pack(Span output) + { + var colorEndpoints = new[] { //subset 1 new byte[]{0b1111111, 0b0100, 0}, new byte[]{0, 0, 0b1111111} }; - byte[] alphaEndPoints = new byte[]{ + var alphaEndPoints = new byte[]{ 255, 100 }; - byte[] colorIndices = new byte[] { + var colorIndices = new byte[] { 0, 1, 2, 3, 0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0 }; - byte[] alphaIndices = new byte[] { + var alphaIndices = new byte[] { 1, 2, 3, 0, 0, 1, 2, 3, 2, 3, 0, 1, 3, 2, 1, 0 }; - int rotation = 0; - for (int i = 0; i < 64; i++) { + var rotation = 0; + for (var i = 0; i < 64; i++) + { rotation = (rotation + 1) % 4; output[i].PackType5(rotation, colorEndpoints, alphaEndPoints, colorIndices, alphaIndices); Assert.Equal(Bc7BlockType.Type5, output[i].Type); @@ -227,29 +299,32 @@ private void Type5Pack(Span output) { } } - private void Type6Pack(Span output) { - byte[][] colorEndpoints = new[] { + private void Type6Pack(Span output) + { + var colorEndpoints = new[] { //subset 1 new byte[]{0b1111111, 0b0100, 0, 0b1111111}, new byte[]{0, 0, 0b1111111, 0b1111} }; - byte[] pBits = new byte[] { + var pBits = new byte[] { 1, 0 }; - byte[] colorIndices = new byte[] { + var colorIndices = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; - for (int i = 0; i < 64; i++) { + for (var i = 0; i < 64; i++) + { output[i].PackType6(colorEndpoints, pBits, colorIndices); Assert.Equal(Bc7BlockType.Type6, output[i].Type); } } - private void Type7Pack(Span output) { - byte[][] colorEndpoints = new[] { + private void Type7Pack(Span output) + { + var colorEndpoints = new[] { //subset 1 new byte[]{0b11111, 0b0100, 0, 0b11111}, new byte[]{0, 0b11111, 0, 0b111}, @@ -257,85 +332,33 @@ private void Type7Pack(Span output) { new byte[]{0b11111, 0b0100, 0, 0b1111}, new byte[]{0b10100, 0, 0b11111, 0b11111} }; - byte[] pBits = new byte[] { + var pBits = new byte[] { 1, 0, 1, 0 }; - byte[] indices = new byte[] { + var indices = new byte[] { 0, 1, 2, 3, 0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0 }; - for (int i = 0; i < 64; i++) { + for (var i = 0; i < 64; i++) + { output[i].PackType7(i, colorEndpoints, pBits, indices); Assert.Equal(Bc7BlockType.Type7, output[i].Type); Assert.Equal(i, output[i].PartitionSetId); } } - private void PlaceBlock(int x, int y, Span data, Span destination, int destBlockWidth) { - for (int i = 0; i < 8; i++) { - int xStart =((x * 8) + (y * 8 + i) * 8 * destBlockWidth); + private void PlaceBlock(int x, int y, Span data, Span destination, int destBlockWidth) + { + for (var i = 0; i < 8; i++) + { + var xStart = x * 8 + (y * 8 + i) * 8 * destBlockWidth; var row = data.Slice(i * 8, 8); row.CopyTo(destination.Slice(xStart, 8)); } } - - [Fact] - public void PackTypes() { - int numWidthBlocks = 4; - int numHeightBlocks = 2; - Bc7Block[] outputBlocks = new Bc7Block[64 * numWidthBlocks * numHeightBlocks]; - byte[] encoded = new byte[64 * numWidthBlocks * numHeightBlocks * Unsafe.SizeOf()]; - - KtxFile output = new KtxFile( - KtxHeader.InitializeCompressed(numWidthBlocks * 8 * 4, numHeightBlocks * 8 * 4, - GlInternalFormat.GlCompressedRgbaBptcUnormArb, - GlFormat.GlRgba)); - - - Span type0 = new Span(outputBlocks, 0 , 64); - Type0Pack(type0); - PlaceBlock(0, 0, type0, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); - - Span type1 = new Span(outputBlocks, 64 * 1 , 64); - Type1Pack(type1); - PlaceBlock(1, 0, type1, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); - - Span type2 = new Span(outputBlocks, 64 * 2 , 64); - Type2Pack(type2); - PlaceBlock(2, 0, type2, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); - - Span type3 = new Span(outputBlocks, 64 * 3 , 64); - Type3Pack(type3); - PlaceBlock(3, 0, type3, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); - - Span type4 = new Span(outputBlocks, 64 * 4 , 64); - Type4Pack(type4); - PlaceBlock(0, 1, type4, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); - - Span type5 = new Span(outputBlocks, 64 * 5 , 64); - Type5Pack(type5); - PlaceBlock(1, 1, type5, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); - - Span type6 = new Span(outputBlocks, 64 * 6 , 64); - Type6Pack(type6); - PlaceBlock(2, 1, type6, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); - - Span type7 = new Span(outputBlocks, 64 * 7 , 64); - Type7Pack(type7); - PlaceBlock(3, 1, type7, MemoryMarshal.Cast(new Span(encoded)), numWidthBlocks); - - output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, - (uint)(8 * 4 * numWidthBlocks), - (uint)(8 * 4 * numHeightBlocks), 1)); - output.MipMaps[0].Faces[0] = new KtxMipFace(encoded, - (uint)(8 * 4 * numWidthBlocks), - (uint)(8 * 4 * numHeightBlocks)); - - FileStream fs = File.OpenWrite("bc7_blocktests.ktx"); - output.Write(fs); - } + #endregion } } diff --git a/BCnEncTests/BlockTests.cs b/BCnEncTests/BlockTests.cs index df98d80..0aaa8de 100644 --- a/BCnEncTests/BlockTests.cs +++ b/BCnEncTests/BlockTests.cs @@ -11,7 +11,7 @@ public class BlockTests [Fact] public void CreateBlocksExact() { - using Image testImage = new Image(16, 16); + using var testImage = new Image(16, 16); var blocks = ImageToBlocks.ImageTo4X4(testImage.Frames[0], out var blocksWidth, out var blocksHeight); @@ -23,7 +23,7 @@ public void CreateBlocksExact() [Fact] public void CreateBlocksPadding() { - using Image testImage = new Image(11, 15); + using var testImage = new Image(11, 15); var blocks = ImageToBlocks.ImageTo4X4(testImage.Frames[0], out var blocksWidth, out var blocksHeight); @@ -35,12 +35,12 @@ public void CreateBlocksPadding() [Fact] public void PaddingColor() { - using Image testImage = new Image(13, 13); + using var testImage = new Image(13, 13); if (!testImage.TryGetSinglePixelSpan(out var pixels)) { throw new Exception("Cannot get pixel span."); } - for (int i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) { pixels[i] = new Rgba32(0, 125, 125); } @@ -50,8 +50,8 @@ public void PaddingColor() Assert.Equal(4, blocksWidth); Assert.Equal(4, blocksHeight); - for (int x = 0; x < blocksWidth; x++) { - for (int y = 0; y < blocksHeight; y++) { + for (var x = 0; x < blocksWidth; x++) { + for (var y = 0; y < blocksHeight; y++) { foreach (var color in blocks[x + y * blocksWidth].AsSpan) { Assert.Equal(new Rgba32(0, 125, 125), color); } @@ -62,13 +62,13 @@ public void PaddingColor() [Fact] public void BlocksToImage() { - Random r = new Random(0); - using Image testImage = new Image(16, 16); + var r = new Random(0); + using var testImage = new Image(16, 16); if (!testImage.TryGetSinglePixelSpan(out var pixels)) { throw new Exception("Cannot get pixel span."); } - for (int i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) { pixels[i] = new Rgba32( (byte)r.Next(255), (byte)r.Next(255), @@ -89,7 +89,7 @@ public void BlocksToImage() } Assert.Equal(pixels.Length, pixels2.Length); - for (int i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) { Assert.Equal(pixels[i], pixels2[i]); } } @@ -97,7 +97,7 @@ public void BlocksToImage() [Fact] public void BlockError() { - using Image testImage = new Image(16, 16); + using var testImage = new Image(16, 16); var blocks = ImageToBlocks.ImageTo4X4(testImage.Frames[0], out var blocksWidth, out var blocksHeight); @@ -106,12 +106,12 @@ public void BlockError() Assert.Equal(0, block1.CalculateError(block2)); - for (int i = 0; i < block2.AsSpan.Length; i++) { + for (var i = 0; i < block2.AsSpan.Length; i++) { block2.AsSpan[i].R = (byte) (block2.AsSpan[i].R + 2); } Assert.Equal(2, block1.CalculateError(block2)); - for (int i = 0; i < block2.AsSpan.Length; i++) { + for (var i = 0; i < block2.AsSpan.Length; i++) { block2.AsSpan[i].G = (byte) (block2.AsSpan[i].R + 20); } Assert.Equal(22, block1.CalculateError(block2)); diff --git a/BCnEncTests/AsyncTests.cs b/BCnEncTests/CancellationTest.cs similarity index 90% rename from BCnEncTests/AsyncTests.cs rename to BCnEncTests/CancellationTest.cs index 11feb5e..e3d84f1 100644 --- a/BCnEncTests/AsyncTests.cs +++ b/BCnEncTests/CancellationTest.cs @@ -1,7 +1,6 @@ using System; using System.IO; using System.Threading; -using System.Threading.Tasks; using BCnEncoder.Decoder; using BCnEncoder.Encoder; using BCnEncoder.Shared; @@ -9,7 +8,7 @@ namespace BCnEncTests { - public class AsyncTests + public class CancellationTest { [Fact] public async void EncodeParallelCancellation() @@ -45,8 +44,8 @@ await Assert.ThrowsAsync(() => [Fact] public async void DecodeNonParallelCancellation() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc7.dds"); - DdsFile file = DdsFile.Load(fs); + using var fs = File.OpenRead(@"../../../testImages/test_decompress_bc7.dds"); + var file = DdsFile.Load(fs); var decoder = new BcDecoder(); decoder.Options.IsParallel = false; diff --git a/BCnEncTests/ClusterTests.cs b/BCnEncTests/ClusterTests.cs index fabaf69..f885c22 100644 --- a/BCnEncTests/ClusterTests.cs +++ b/BCnEncTests/ClusterTests.cs @@ -9,27 +9,32 @@ namespace BCnEncTests public class ClusterTests { [Fact] - public void Clusterize() { + public void Clusterize() + { using var testImage = ImageLoader.TestBlur1.Clone(); - - if (!testImage.TryGetSinglePixelSpan(out var pixels)) { + + if (!testImage.TryGetSinglePixelSpan(out var pixels)) + { throw new Exception("Cannot get pixel span."); } - int numClusters = (testImage.Width / 32) * (testImage.Height / 32); - + var numClusters = (testImage.Width / 32) * (testImage.Height / 32); + var clusters = LinearClustering.ClusterPixels(pixels, testImage.Width, testImage.Height, numClusters, 10, 10); - ColorYCbCr[] pixC = new ColorYCbCr[numClusters]; - int[] counts = new int[numClusters]; - for (int i = 0; i < pixels.Length; i++) { + var pixC = new ColorYCbCr[numClusters]; + var counts = new int[numClusters]; + for (var i = 0; i < pixels.Length; i++) + { pixC[clusters[i]] += new ColorYCbCr(pixels[i]); counts[clusters[i]]++; } - for (int i = 0; i < numClusters; i++) { + for (var i = 0; i < numClusters; i++) + { pixC[i] /= counts[i]; } - for (int i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) + { pixels[i] = pixC[clusters[i]].ToRgba32(); } diff --git a/BCnEncTests/ColorTest.cs b/BCnEncTests/ColorTest.cs index e8f8be5..eefa12f 100644 --- a/BCnEncTests/ColorTest.cs +++ b/BCnEncTests/ColorTest.cs @@ -1,4 +1,4 @@ -using BCnEncoder.Shared; +using BCnEncoder.Shared; using Xunit; namespace BCnEncTests @@ -7,8 +7,9 @@ public class ColorTest { [Fact] - public void Rgb565Test() { - ColorRgb565 color = new ColorRgb565(255,255,255); + public void Rgb565Test() + { + var color = new ColorRgb565(255, 255, 255); Assert.Equal(255, color.R); Assert.Equal(255, color.G); @@ -29,7 +30,7 @@ public void Rgb565Test() { Assert.Equal(0, color.G); Assert.Equal(0, color.B); - color = new ColorRgb565(255,255,255); + color = new ColorRgb565(255, 255, 255); color.B = 0; Assert.Equal(255, color.R); diff --git a/BCnEncTests/DdsReadTests.cs b/BCnEncTests/DdsReadTests.cs index 879abe2..ad1064a 100644 --- a/BCnEncTests/DdsReadTests.cs +++ b/BCnEncTests/DdsReadTests.cs @@ -10,93 +10,100 @@ namespace BCnEncTests public class DdsReadTests { [Fact] - public void ReadRgba() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_rgba.dds"); - DdsFile file = DdsFile.Load(fs); + public void ReadRgba() + { + var file = DdsLoader.TestDecompressRgba; Assert.Equal(DxgiFormat.DxgiFormatR8G8B8A8Unorm, file.header.ddsPixelFormat.DxgiFormat); Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); var images = decoder.DecodeAllMipMaps(file); Assert.Equal((uint)images[0].Width, file.header.dwWidth); Assert.Equal((uint)images[0].Height, file.header.dwHeight); - for (int i = 0; i < images.Length; i++) { - using FileStream outFs = File.OpenWrite($"decoding_test_dds_rgba_mip{i}.png"); + for (var i = 0; i < images.Length; i++) + { + using var outFs = File.OpenWrite($"decoding_test_dds_rgba_mip{i}.png"); images[i].SaveAsPng(outFs); images[i].Dispose(); } } [Fact] - public void ReadBc1() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1.dds"); - DdsFile file = DdsFile.Load(fs); + public void ReadBc1() + { + var file = DdsLoader.TestDecompressBc1; Assert.Equal(DxgiFormat.DxgiFormatBc1Unorm, file.header.ddsPixelFormat.DxgiFormat); Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); var images = decoder.DecodeAllMipMaps(file); Assert.Equal((uint)images[0].Width, file.header.dwWidth); Assert.Equal((uint)images[0].Height, file.header.dwHeight); - for (int i = 0; i < images.Length; i++) { - using FileStream outFs = File.OpenWrite($"decoding_test_dds_bc1_mip{i}.png"); + for (var i = 0; i < images.Length; i++) + { + using var outFs = File.OpenWrite($"decoding_test_dds_bc1_mip{i}.png"); images[i].SaveAsPng(outFs); images[i].Dispose(); } } [Fact] - public void ReadBc1A() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1a.dds"); - DdsFile file = DdsFile.Load(fs); + public void ReadBc1A() + { + var file = DdsLoader.TestDecompressBc1A; Assert.Equal(DxgiFormat.DxgiFormatBc1Unorm, file.header.ddsPixelFormat.DxgiFormat); Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); decoder.InputOptions.DdsBc1ExpectAlpha = true; var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.dwWidth); Assert.Equal((uint)image.Height, file.header.dwHeight); - if (!image.TryGetSinglePixelSpan(out var pixels)) { + if (!image.TryGetSinglePixelSpan(out var pixels)) + { throw new Exception("Cannot get pixel span."); } Assert.Contains(pixels.ToArray(), x => x.A == 0); - using FileStream outFs = File.OpenWrite($"decoding_test_dds_bc1a.png"); + using var outFs = File.OpenWrite("decoding_test_dds_bc1a.png"); image.SaveAsPng(outFs); image.Dispose(); } [Fact] - public void ReadBc7() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc7.dds"); - BcDecoder decoder = new BcDecoder(); + public void ReadBc7() + { + using var fs = File.OpenRead(@"../../../testImages/test_decompress_bc7.dds"); + var decoder = new BcDecoder(); var images = decoder.DecodeAllMipMaps(fs); - for (int i = 0; i < images.Length; i++) { - using FileStream outFs = File.OpenWrite($"decoding_test_dds_bc7_mip{i}.png"); + for (var i = 0; i < images.Length; i++) + { + using var outFs = File.OpenWrite($"decoding_test_dds_bc7_mip{i}.png"); images[i].SaveAsPng(outFs); images[i].Dispose(); } } [Fact] - public void ReadFromStream() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1.dds"); + public void ReadFromStream() + { + using var fs = File.OpenRead(@"../../../testImages/test_decompress_bc1.dds"); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); var images = decoder.DecodeAllMipMaps(fs); - for (int i = 0; i < images.Length; i++) { - using FileStream outFs = File.OpenWrite($"decoding_test_dds_stream_bc1_mip{i}.png"); + for (var i = 0; i < images.Length; i++) + { + using var outFs = File.OpenWrite($"decoding_test_dds_stream_bc1_mip{i}.png"); images[i].SaveAsPng(outFs); images[i].Dispose(); } diff --git a/BCnEncTests/DdsWritingTests.cs b/BCnEncTests/DdsWritingTests.cs index a6a12fc..6b08113 100644 --- a/BCnEncTests/DdsWritingTests.cs +++ b/BCnEncTests/DdsWritingTests.cs @@ -8,122 +8,130 @@ namespace BCnEncTests public class DdsWritingTests { [Fact] - public void DdsWriteRgba() { + public void DdsWriteRgba() + { var image = ImageLoader.TestLenna; - BcEncoder encoder = new BcEncoder(); + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = CompressionFormat.Rgba; encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - using FileStream fs = File.OpenWrite("encoding_dds_rgba.dds"); + using var fs = File.OpenWrite("encoding_dds_rgba.dds"); encoder.Encode(image, fs); fs.Close(); } [Fact] - public void DdsWriteBc1() { + public void DdsWriteBc1() + { var image = ImageLoader.TestLenna; - BcEncoder encoder = new BcEncoder(); + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = CompressionFormat.Bc1; encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - using FileStream fs = File.OpenWrite("encoding_dds_bc1.dds"); + using var fs = File.OpenWrite("encoding_dds_bc1.dds"); encoder.Encode(image, fs); fs.Close(); } [Fact] - public void DdsWriteBc2() { + public void DdsWriteBc2() + { var image = ImageLoader.TestAlpha1; - BcEncoder encoder = new BcEncoder(); + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = CompressionFormat.Bc2; encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - using FileStream fs = File.OpenWrite("encoding_dds_bc2.dds"); + using var fs = File.OpenWrite("encoding_dds_bc2.dds"); encoder.Encode(image, fs); fs.Close(); } [Fact] - public void DdsWriteBc3() { + public void DdsWriteBc3() + { var image = ImageLoader.TestAlpha1; - BcEncoder encoder = new BcEncoder(); + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = CompressionFormat.Bc3; encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - using FileStream fs = File.OpenWrite("encoding_dds_bc3.dds"); + using var fs = File.OpenWrite("encoding_dds_bc3.dds"); encoder.Encode(image, fs); fs.Close(); } [Fact] - public void DdsWriteBc4() { + public void DdsWriteBc4() + { var image = ImageLoader.TestHeight1; - BcEncoder encoder = new BcEncoder(); + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = CompressionFormat.Bc4; encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - using FileStream fs = File.OpenWrite("encoding_dds_bc4.dds"); + using var fs = File.OpenWrite("encoding_dds_bc4.dds"); encoder.Encode(image, fs); fs.Close(); } [Fact] - public void DdsWriteBc5() { + public void DdsWriteBc5() + { var image = ImageLoader.TestRedGreen1; - BcEncoder encoder = new BcEncoder(); + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = CompressionFormat.Bc5; encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - using FileStream fs = File.OpenWrite("encoding_dds_bc5.dds"); + using var fs = File.OpenWrite("encoding_dds_bc5.dds"); encoder.Encode(image, fs); fs.Close(); } [Fact] - public void DdsWriteBc7() { + public void DdsWriteBc7() + { var image = ImageLoader.TestLenna; - BcEncoder encoder = new BcEncoder(); + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = CompressionFormat.Bc7; encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - using FileStream fs = File.OpenWrite("encoding_dds_bc7.dds"); + using var fs = File.OpenWrite("encoding_dds_bc7.dds"); encoder.Encode(image, fs); fs.Close(); } [Fact] - public void DdsWriteCubemap() { + public void DdsWriteCubemap() + { var images = ImageLoader.TestCubemap; - BcEncoder encoder = new BcEncoder(); + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = CompressionFormat.Bc1; encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - using FileStream fs = File.OpenWrite("encoding_dds_cubemap_bc1.dds"); - encoder.EncodeCubeMap(images[0],images[1],images[2],images[3],images[4],images[5], fs); + using var fs = File.OpenWrite("encoding_dds_cubemap_bc1.dds"); + encoder.EncodeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], fs); fs.Close(); } } diff --git a/BCnEncTests/DecodingAsyncTests.cs b/BCnEncTests/DecodingAsyncTests.cs new file mode 100644 index 0000000..103f8ff --- /dev/null +++ b/BCnEncTests/DecodingAsyncTests.cs @@ -0,0 +1,76 @@ +using System.IO; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using SixLabors.ImageSharp; +using Xunit; + +namespace BCnEncTests +{ + public class DecodingAsyncTests + { + [Fact] + public async void DecodeAsync() + { + var decoder = new BcDecoder(); + var encoder = new BcEncoder(); + var original = ImageLoader.TestGradient1; + + var file = encoder.EncodeToKtx(original); + var image = await decoder.DecodeAsync(file); + + var psnr = TestHelper.CalculatePSNR(original, image); + if (encoder.OutputOptions.Quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + + [Fact] + public async void DecodeAllMipMapsAsync() + { + var decoder = new BcDecoder(); + var encoder = new BcEncoder(); + var original = ImageLoader.TestGradient1; + + var file = encoder.EncodeToKtx(original); + var image = await decoder.DecodeAllMipMapsAsync(file); + + var psnr = TestHelper.CalculatePSNR(original, image[0]); + if (encoder.OutputOptions.Quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + + [Fact] + public async void DecodeRawAsync() + { + var decoder = new BcDecoder(); + var encoder = new BcEncoder(); + var original = ImageLoader.TestGradient1; + + var file = encoder.EncodeToKtx(original); + var image = await decoder.DecodeRawAsync(file.MipMaps[0].Faces[0].Data, CompressionFormat.Bc1, + (int) file.MipMaps[0].Width, (int) file.MipMaps[0].Height); + + var psnr = TestHelper.CalculatePSNR(original, image); + if (encoder.OutputOptions.Quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + } +} diff --git a/BCnEncTests/DecodingTests.cs b/BCnEncTests/DecodingTests.cs index d5260fa..1f611a3 100644 --- a/BCnEncTests/DecodingTests.cs +++ b/BCnEncTests/DecodingTests.cs @@ -9,155 +9,155 @@ namespace BCnEncTests public class DecodingTests { [Fact] - public void Bc1Decode() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1.ktx"); - KtxFile file = KtxFile.Load(fs); + public void Bc1Decode() + { + var file = KtxLoader.TestDecompressBc1; Assert.True(file.header.VerifyHeader()); Assert.Equal((uint)1, file.header.NumberOfFaces); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); using var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); - using FileStream outFs = File.OpenWrite("decoding_test_bc1.png"); + using var outFs = File.OpenWrite("decoding_test_bc1.png"); image.SaveAsPng(outFs); } [Fact] - public void Bc1AlphaDecode() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc1a.ktx"); - KtxFile file = KtxFile.Load(fs); + public void Bc1AlphaDecode() + { + var file = KtxLoader.TestDecompressBc1A; Assert.True(file.header.VerifyHeader()); Assert.Equal((uint)1, file.header.NumberOfFaces); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); using var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); - using FileStream outFs = File.OpenWrite("decoding_test_bc1a.png"); + using var outFs = File.OpenWrite("decoding_test_bc1a.png"); image.SaveAsPng(outFs); } [Fact] - public void Bc2Decode() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc2.ktx"); - KtxFile file = KtxFile.Load(fs); + public void Bc2Decode() + { + var file = KtxLoader.TestDecompressBc2; Assert.True(file.header.VerifyHeader()); Assert.Equal((uint)1, file.header.NumberOfFaces); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); using var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); - using FileStream outFs = File.OpenWrite("decoding_test_bc2.png"); + using var outFs = File.OpenWrite("decoding_test_bc2.png"); image.SaveAsPng(outFs); } [Fact] - public void Bc3Decode() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc3.ktx"); - KtxFile file = KtxFile.Load(fs); + public void Bc3Decode() + { + var file = KtxLoader.TestDecompressBc3; Assert.True(file.header.VerifyHeader()); Assert.Equal((uint)1, file.header.NumberOfFaces); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); using var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); - using FileStream outFs = File.OpenWrite("decoding_test_bc3.png"); + using var outFs = File.OpenWrite("decoding_test_bc3.png"); image.SaveAsPng(outFs); } [Fact] - public void Bc4Decode() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc4_unorm.ktx"); - KtxFile file = KtxFile.Load(fs); + public void Bc4Decode() + { + var file = KtxLoader.TestDecompressBc4Unorm; Assert.True(file.header.VerifyHeader()); Assert.Equal((uint)1, file.header.NumberOfFaces); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); using var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); - using FileStream outFs = File.OpenWrite("decoding_test_bc4.png"); + using var outFs = File.OpenWrite("decoding_test_bc4.png"); image.SaveAsPng(outFs); } [Fact] - public void Bc5Decode() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc5_unorm.ktx"); - KtxFile file = KtxFile.Load(fs); + public void Bc5Decode() + { + var file = KtxLoader.TestDecompressBc5Unorm; Assert.True(file.header.VerifyHeader()); Assert.Equal((uint)1, file.header.NumberOfFaces); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); using var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); - using FileStream outFs = File.OpenWrite("decoding_test_bc5.png"); + using var outFs = File.OpenWrite("decoding_test_bc5.png"); image.SaveAsPng(outFs); } [Fact] - public void Bc7DecodeRgb() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc7_rgb.ktx"); - KtxFile file = KtxFile.Load(fs); + public void Bc7DecodeRgb() + { + var file = KtxLoader.TestDecompressBc7Rgb; Assert.True(file.header.VerifyHeader()); Assert.Equal((uint)1, file.header.NumberOfFaces); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); using var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); - using FileStream outFs = File.OpenWrite("decoding_test_bc7_rgb.png"); + using var outFs = File.OpenWrite("decoding_test_bc7_rgb.png"); image.SaveAsPng(outFs); } [Fact] - public void Bc7DecodeUnorm() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc7_unorm.ktx"); - KtxFile file = KtxFile.Load(fs); + public void Bc7DecodeUnorm() + { + var file = KtxLoader.TestDecompressBc7Unorm; Assert.True(file.header.VerifyHeader()); Assert.Equal((uint)1, file.header.NumberOfFaces); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); using var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); - using FileStream outFs = File.OpenWrite("decoding_test_bc7_unorm.png"); + using var outFs = File.OpenWrite("decoding_test_bc7_unorm.png"); image.SaveAsPng(outFs); } [Fact] - public void Bc7DecodeEveryBlockType() { - using FileStream fs = File.OpenRead(@"../../../testImages/test_decompress_bc7_types.ktx"); - KtxFile file = KtxFile.Load(fs); + public void Bc7DecodeEveryBlockType() + { + var file = KtxLoader.TestDecompressBc7Types; Assert.True(file.header.VerifyHeader()); Assert.Equal((uint)1, file.header.NumberOfFaces); - BcDecoder decoder = new BcDecoder(); + var decoder = new BcDecoder(); using var image = decoder.Decode(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); - using FileStream outFs = File.OpenWrite("decoding_test_bc7_types.png"); + using var outFs = File.OpenWrite("decoding_test_bc7_types.png"); image.SaveAsPng(outFs); } } diff --git a/BCnEncTests/EncodingAsyncTest.cs b/BCnEncTests/EncodingAsyncTest.cs new file mode 100644 index 0000000..ad900d2 --- /dev/null +++ b/BCnEncTests/EncodingAsyncTest.cs @@ -0,0 +1,133 @@ +using System.IO; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; +using Xunit.Abstractions; + +namespace BCnEncTests +{ + public class EncodingAsyncTest + { + private readonly Image originalImage; + private readonly Image[] originalCubeMap; + + public EncodingAsyncTest() + { + originalImage = ImageLoader.TestGradient1; + originalCubeMap = ImageLoader.TestCubemap; + } + + [Fact] + public async void EncodeToDdsAsync() + { + var encoder = new BcEncoder(); + var decoder = new BcDecoder(); + + var file = await encoder.EncodeToDdsAsync(originalImage); + var image = decoder.Decode(file); + + var psnr = TestHelper.CalculatePSNR(originalImage, image); + if (encoder.OutputOptions.Quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + + [Fact] + public async void EncodeToKtxAsync() + { + var encoder = new BcEncoder(); + var decoder = new BcDecoder(); + + var file = await encoder.EncodeToKtxAsync(originalImage); + var image = decoder.Decode(file); + + var psnr = TestHelper.CalculatePSNR(originalImage, image); + if (encoder.OutputOptions.Quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + + [Fact] + public async void EncodeCubemapToDdsAsync() + { + var encoder = new BcEncoder(); + var decoder = new BcDecoder(); + + var file = await encoder.EncodeCubeMapToDdsAsync(originalCubeMap[0], originalCubeMap[1], originalCubeMap[2], + originalCubeMap[3], originalCubeMap[4], originalCubeMap[5]); + + for (var i = 0; i < 6; i++) + { + var image = decoder.DecodeRaw(file.Faces[i].MipMaps[0].Data, CompressionFormat.Bc1, (int)file.Faces[i].Width, (int)file.Faces[i].Height); + + var psnr = TestHelper.CalculatePSNR(originalCubeMap[i], image); + if (encoder.OutputOptions.Quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + } + + [Fact] + public async void EncodeCubemapToKtxAsync() + { + var encoder = new BcEncoder(); + var decoder = new BcDecoder(); + + var file = await encoder.EncodeCubeMapToKtxAsync(originalCubeMap[0], originalCubeMap[1], originalCubeMap[2], + originalCubeMap[3], originalCubeMap[4], originalCubeMap[5]); + + for (var i = 0; i < 6; i++) + { + var image = decoder.DecodeRaw(file.MipMaps[0].Faces[i].Data, CompressionFormat.Bc1, (int)file.MipMaps[0].Faces[i].Width, (int)file.MipMaps[0].Faces[i].Height); + + var psnr = TestHelper.CalculatePSNR(originalCubeMap[i], image); + if (encoder.OutputOptions.Quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + } + + [Fact] + public async void EncodeToRawBytesAsync() + { + var encoder = new BcEncoder(); + var decoder = new BcDecoder(); + + var data = await encoder.EncodeToRawBytesAsync(originalImage); + var image = decoder.DecodeRaw(data[0], CompressionFormat.Bc1, originalImage.Width, originalImage.Height); + + var psnr = TestHelper.CalculatePSNR(originalImage, image); + if (encoder.OutputOptions.Quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + } +} diff --git a/BCnEncTests/EncodingTest.cs b/BCnEncTests/EncodingTest.cs index 82c5524..c745719 100644 --- a/BCnEncTests/EncodingTest.cs +++ b/BCnEncTests/EncodingTest.cs @@ -19,10 +19,10 @@ public Bc1GradientTest(ITestOutputHelper output) public void Bc1GradientBestQuality() { var image = ImageLoader.TestGradient1; - + TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc1_gradient_bestQuality.ktx", output); } @@ -32,10 +32,9 @@ public void Bc1GradientBalanced() { var image = ImageLoader.TestGradient1; - TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc1_gradient_balanced.ktx", output); } @@ -47,7 +46,7 @@ public void Bc1GradientFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc1_gradient_fast.ktx", output); } @@ -55,7 +54,6 @@ public void Bc1GradientFast() public class Bc1DiffuseTest { - private readonly ITestOutputHelper output; public Bc1DiffuseTest(ITestOutputHelper output) @@ -63,7 +61,6 @@ public Bc1DiffuseTest(ITestOutputHelper output) this.output = output; } - [Fact] public void Bc1DiffuseBestQuality() { @@ -71,7 +68,7 @@ public void Bc1DiffuseBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc1_diffuse_bestQuality.ktx", output); } @@ -80,10 +77,10 @@ public void Bc1DiffuseBestQuality() public void Bc1DiffuseBalanced() { var image = ImageLoader.TestDiffuse1; - + TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc1_diffuse_balanced.ktx", output); } @@ -95,15 +92,12 @@ public void Bc1DiffuseFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc1_diffuse_fast.ktx", output); } - - } - public class Bc1BlurryTest { private readonly ITestOutputHelper output; @@ -117,10 +111,10 @@ public Bc1BlurryTest(ITestOutputHelper output) public void Bc1BlurBestQuality() { var image = ImageLoader.TestBlur1; - + TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc1_blur_bestQuality.ktx", output); } @@ -132,7 +126,7 @@ public void Bc1BlurBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc1_blur_balanced.ktx", output); } @@ -144,16 +138,14 @@ public void Bc1BlurFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc1_blur_fast.ktx", output); } - } public class Bc1ASpriteTest { - private readonly ITestOutputHelper output; public Bc1ASpriteTest(ITestOutputHelper output) @@ -161,7 +153,6 @@ public Bc1ASpriteTest(ITestOutputHelper output) this.output = output; } - [Fact] public void Bc1ASpriteBestQuality() { @@ -169,7 +160,7 @@ public void Bc1ASpriteBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1WithAlpha, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc1a_sprite_bestQuality.ktx", output); } @@ -181,7 +172,7 @@ public void Bc1ASpriteBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1WithAlpha, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc1a_sprite_balanced.ktx", output); } @@ -193,16 +184,14 @@ public void Bc1ASpriteFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc1WithAlpha, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc1a_sprite_fast.ktx", output); } - } public class Bc2GradientTest { - private readonly ITestOutputHelper output; public Bc2GradientTest(ITestOutputHelper output) @@ -210,7 +199,6 @@ public Bc2GradientTest(ITestOutputHelper output) this.output = output; } - [Fact] public void Bc2GradientBestQuality() { @@ -218,7 +206,7 @@ public void Bc2GradientBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc2, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc2_gradient_bestQuality.ktx", output); } @@ -230,7 +218,7 @@ public void Bc2GradientBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc2, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc2_gradient_balanced.ktx", output); } @@ -242,16 +230,14 @@ public void Bc2GradientFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc2, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc2_gradient_fast.ktx", output); } - } public class Bc3GradientTest { - private readonly ITestOutputHelper output; public Bc3GradientTest(ITestOutputHelper output) @@ -259,7 +245,6 @@ public Bc3GradientTest(ITestOutputHelper output) this.output = output; } - [Fact] public void Bc3GradientBestQuality() { @@ -267,7 +252,7 @@ public void Bc3GradientBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc3, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc3_gradient_bestQuality.ktx", output); } @@ -279,7 +264,7 @@ public void Bc3GradientBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc3, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc3_gradient_balanced.ktx", output); } @@ -291,16 +276,14 @@ public void Bc3GradientFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc3, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc3_gradient_fast.ktx", output); } - } public class Bc4RedTest { - private readonly ITestOutputHelper output; public Bc4RedTest(ITestOutputHelper output) @@ -308,7 +291,6 @@ public Bc4RedTest(ITestOutputHelper output) this.output = output; } - [Fact] public void Bc4RedBestQuality() { @@ -316,7 +298,7 @@ public void Bc4RedBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc4, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc4_red_bestQuality.ktx", output); } @@ -328,7 +310,7 @@ public void Bc4RedBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc4, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc4_red_balanced.ktx", output); } @@ -340,16 +322,14 @@ public void Bc4RedFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc4, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc4_red_fast.ktx", output); } - } public class Bc5RedGreenTest { - private readonly ITestOutputHelper output; public Bc5RedGreenTest(ITestOutputHelper output) @@ -357,7 +337,6 @@ public Bc5RedGreenTest(ITestOutputHelper output) this.output = output; } - [Fact] public void Bc5RedGreenBestQuality() { @@ -365,7 +344,7 @@ public void Bc5RedGreenBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc5, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc5_red_green_bestQuality.ktx", output); } @@ -377,7 +356,7 @@ public void Bc5RedGreenBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc5, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc5_red_green_balanced.ktx", output); } @@ -389,7 +368,7 @@ public void Bc5RedGreenFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc5, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc5_red_green_fast.ktx", output); } @@ -397,7 +376,6 @@ public void Bc5RedGreenFast() public class Bc7RgbTest { - private readonly ITestOutputHelper output; public Bc7RgbTest(ITestOutputHelper output) @@ -405,7 +383,6 @@ public Bc7RgbTest(ITestOutputHelper output) this.output = output; } - [Fact] public void Bc7RgbBestQuality() { @@ -413,7 +390,7 @@ public void Bc7RgbBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc7_rgb_bestQuality.ktx", output); } @@ -425,7 +402,7 @@ public void Bc7RgbBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc7_rgb_balanced.ktx", output); } @@ -437,7 +414,7 @@ public void Bc7LennaBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc7_lenna_balanced.ktx", output); } @@ -449,7 +426,7 @@ public void Bc7RgbFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc7_rgb_fast.ktx", output); } @@ -457,7 +434,6 @@ public void Bc7RgbFast() public class Bc7RgbaTest { - private readonly ITestOutputHelper output; public Bc7RgbaTest(ITestOutputHelper output) @@ -465,7 +441,6 @@ public Bc7RgbaTest(ITestOutputHelper output) this.output = output; } - [Fact] public void Bc7RgbaBestQuality() { @@ -473,7 +448,7 @@ public void Bc7RgbaBestQuality() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, - CompressionQuality.BestQuality, + CompressionQuality.BestQuality, "encoding_bc7_rgba_bestQuality.ktx", output); } @@ -485,7 +460,7 @@ public void Bc7RgbaBalanced() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, - CompressionQuality.Balanced, + CompressionQuality.Balanced, "encoding_bc7_rgba_balanced.ktx", output); } @@ -497,7 +472,7 @@ public void Bc7RgbaFast() TestHelper.ExecuteEncodingTest(image, CompressionFormat.Bc7, - CompressionQuality.Fast, + CompressionQuality.Fast, "encoding_bc7_rgba_fast.ktx", output); } @@ -505,21 +480,20 @@ public void Bc7RgbaFast() public class CubemapTest { - [Fact] public void WriteCubeMapFile() { var images = ImageLoader.TestCubemap; - string filename = "encoding_bc1_cubemap.ktx"; + var filename = "encoding_bc1_cubemap.ktx"; - BcEncoder encoder = new BcEncoder(); + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = CompressionQuality.Fast; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = CompressionFormat.Bc1; - using FileStream fs = File.OpenWrite(filename); - encoder.EncodeCubeMap(images[0],images[1],images[2],images[3],images[4],images[5], fs); + using var fs = File.OpenWrite(filename); + encoder.EncodeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], fs); fs.Close(); } } diff --git a/BCnEncTests/ImageLoader.cs b/BCnEncTests/ImageLoader.cs index 5008ef3..5ecfe51 100644 --- a/BCnEncTests/ImageLoader.cs +++ b/BCnEncTests/ImageLoader.cs @@ -1,22 +1,26 @@ +using System.IO; +using BCnEncoder.Shared; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncTests { - public static class ImageLoader { + public static class ImageLoader + { public static Image TestDiffuse1 { get; } = LoadTestImage("../../../testImages/test_diffuse_1_512.jpg"); public static Image TestBlur1 { get; } = LoadTestImage("../../../testImages/test_blur_1_512.jpg"); public static Image TestNormal1 { get; } = LoadTestImage("../../../testImages/test_normal_1_512.jpg"); public static Image TestHeight1 { get; } = LoadTestImage("../../../testImages/test_height_1_512.jpg"); public static Image TestGradient1 { get; } = LoadTestImage("../../../testImages/test_gradient_1_512.jpg"); + public static Image TestTransparentSprite1 { get; } = LoadTestImage("../../../testImages/test_transparent.png"); public static Image TestAlphaGradient1 { get; } = LoadTestImage("../../../testImages/test_alphagradient_1_512.png"); public static Image TestAlpha1 { get; } = LoadTestImage("../../../testImages/test_alpha_1_512.png"); public static Image TestRedGreen1 { get; } = LoadTestImage("../../../testImages/test_red_green_1_64.png"); public static Image TestRgbHard1 { get; } = LoadTestImage("../../../testImages/test_rgb_hard_1.png"); public static Image TestLenna { get; } = LoadTestImage("../../../testImages/test_lenna_512.png"); - - public static Image[] TestCubemap { get; } = new [] { + + public static Image[] TestCubemap { get; } = { LoadTestImage("../../../testImages/cubemap/right.png"), LoadTestImage("../../../testImages/cubemap/left.png"), LoadTestImage("../../../testImages/cubemap/top.png"), @@ -25,8 +29,40 @@ public static class ImageLoader { LoadTestImage("../../../testImages/cubemap/forward.png") }; - private static Image LoadTestImage(string filename) { + private static Image LoadTestImage(string filename) + { return Image.Load(filename); } } + + public static class DdsLoader + { + public static DdsFile TestDecompressBc1 { get; } = LoadDdsFile("../../../testImages/test_decompress_bc1.dds"); + public static DdsFile TestDecompressBc1A { get; } = LoadDdsFile("../../../testImages/test_decompress_bc1a.dds"); + public static DdsFile TestDecompressBc7 { get; } = LoadDdsFile("../../../testImages/test_decompress_bc7.dds"); + public static DdsFile TestDecompressRgba { get; } = LoadDdsFile("../../../testImages/test_decompress_rgba.dds"); + + private static DdsFile LoadDdsFile(string filename) + { + return DdsFile.Load(File.OpenRead(filename)); + } + } + + public static class KtxLoader + { + public static KtxFile TestDecompressBc1 { get; } = LoadKtxFile("../../../testImages/test_decompress_bc1.ktx"); + public static KtxFile TestDecompressBc1A { get; } = LoadKtxFile("../../../testImages/test_decompress_bc1a.ktx"); + public static KtxFile TestDecompressBc2 { get; } = LoadKtxFile("../../../testImages/test_decompress_bc2.ktx"); + public static KtxFile TestDecompressBc3 { get; } = LoadKtxFile("../../../testImages/test_decompress_bc3.ktx"); + public static KtxFile TestDecompressBc4Unorm { get; } = LoadKtxFile("../../../testImages/test_decompress_bc4_unorm.ktx"); + public static KtxFile TestDecompressBc5Unorm { get; } = LoadKtxFile("../../../testImages/test_decompress_bc5_unorm.ktx"); + public static KtxFile TestDecompressBc7Rgb { get; } = LoadKtxFile("../../../testImages/test_decompress_bc7_rgb.ktx"); + public static KtxFile TestDecompressBc7Types { get; } = LoadKtxFile("../../../testImages/test_decompress_bc7_types.ktx"); + public static KtxFile TestDecompressBc7Unorm { get; } = LoadKtxFile("../../../testImages/test_decompress_bc7_unorm.ktx"); + + private static KtxFile LoadKtxFile(string filename) + { + return KtxFile.Load(File.OpenRead(filename)); + } + } } diff --git a/BCnEncTests/PcaTests.cs b/BCnEncTests/PcaTests.cs index 7ca0e18..9c2e66d 100644 --- a/BCnEncTests/PcaTests.cs +++ b/BCnEncTests/PcaTests.cs @@ -3,12 +3,14 @@ using Xunit; using Vector4 = System.Numerics.Vector4; -namespace BCnEncTests { - public class PcaTests { - +namespace BCnEncTests +{ + public class PcaTests + { [Fact] - public void PrincipalAxisTest() { - Vector4[] testData = new[] { + public void PrincipalAxisTest() + { + var testData = new[] { new Vector4(0.4f, 0.3f, 0.5f, 0.1f), new Vector4(0.3f, 0.3f, 0.5f, 0.3f), new Vector4(0.5f, 0.3f, 0.6f, 0.2f), @@ -16,7 +18,7 @@ public void PrincipalAxisTest() { new Vector4(0.456f, 0.34f, 0.23f, 0.45f) }; - var refMean = new[] { 0.3712, 0.308, 0.48600000000000004, 0.25}; + var refMean = new[] { 0.3712, 0.308, 0.48600000000000004, 0.25 }; var refCovar = new[] { new[] {0.014747200000000002, 0.00084800000000000088, -0.0067839999999999992, 0.0028000000000000004}, new[] {0.00084800000000000088, 0.00032000000000000062, -0.0025600000000000024, 0.0020000000000000018}, @@ -24,11 +26,10 @@ public void PrincipalAxisTest() { new[] {0.0028000000000000004, 0.0020000000000000018, -0.015999999999999997, 0.0174999} }; - var covarianceMatrix = PcaVectors.CalculateCovariance(testData, out Vector4 mean); + var covarianceMatrix = PcaVectors.CalculateCovariance(testData, out var mean); var pa = PcaVectors.CalculatePrincipalAxis(covarianceMatrix); - var refPa = new double[4] - {0.282, 0.087, -0.744, 0.603}; + var refPa = new[] { 0.282, 0.087, -0.744, 0.603 }; Assert.Equal(refMean[0], mean.X, 2); Assert.Equal(refMean[1], mean.Y, 2); @@ -60,6 +61,5 @@ public void PrincipalAxisTest() { Assert.True(Math.Abs(pa.Z - refPa[2]) < 0.1f, $"actual: {pa.Z} expected: {refPa[2]}"); Assert.True(Math.Abs(pa.W - refPa[3]) < 0.1f, $"actual: {pa.W} expected: {refPa[3]}"); } - } } diff --git a/BCnEncTests/RawTests.cs b/BCnEncTests/RawTests.cs index 0344ec5..df3f69d 100644 --- a/BCnEncTests/RawTests.cs +++ b/BCnEncTests/RawTests.cs @@ -14,7 +14,7 @@ public void EncodeDecode() { var inputImage = ImageLoader.TestGradient1; var decoder = new BcDecoder(); - var encoder = new BcEncoder() + var encoder = new BcEncoder { OutputOptions = { Quality = CompressionQuality.BestQuality } }; @@ -42,7 +42,7 @@ public void EncodeDecodeStream() var encodedRawBytes = encoder.EncodeToRawBytes(inputImage); - using MemoryStream ms = new MemoryStream(encodedRawBytes[0]); + using var ms = new MemoryStream(encodedRawBytes[0]); Assert.Equal(0, ms.Position); @@ -72,14 +72,14 @@ public void EncodeDecodeAllMipMapsStream() } }; - using MemoryStream ms = new MemoryStream(); + using var ms = new MemoryStream(); var encodedRawBytes = encoder.EncodeToRawBytes(inputImage); - int mipLevels = encoder.CalculateNumberOfMipLevels(inputImage); + var mipLevels = encoder.CalculateNumberOfMipLevels(inputImage); Assert.True(mipLevels > 1); - for (int i = 0; i < mipLevels; i++) + for (var i = 0; i < mipLevels; i++) { ms.Write(encodedRawBytes[i]); } @@ -87,9 +87,9 @@ public void EncodeDecodeAllMipMapsStream() ms.Position = 0; Assert.Equal(0, ms.Position); - for (int i = 0; i < mipLevels; i++) + for (var i = 0; i < mipLevels; i++) { - encoder.CalculateMipMapSize(inputImage, i, out int mipWidth, out int mipHeight); + encoder.CalculateMipMapSize(inputImage, i, out var mipWidth, out var mipHeight); using var resized = inputImage.Clone(x => x.Resize(mipWidth, mipHeight)); var decodedImage = decoder.DecodeRaw(ms, CompressionFormat.Bc1, mipWidth, mipHeight); @@ -99,7 +99,7 @@ public void EncodeDecodeAllMipMapsStream() Assert.True(psnr > 30); } - encoder.CalculateMipMapSize(inputImage, mipLevels - 1, out int lastMWidth, out int lastMHeight); + encoder.CalculateMipMapSize(inputImage, mipLevels - 1, out var lastMWidth, out var lastMHeight); Assert.Equal(1, lastMWidth); Assert.Equal(1, lastMWidth); } diff --git a/BCnEncTests/TestHelper.cs b/BCnEncTests/TestHelper.cs index 4d23ce8..8c83b8f 100644 --- a/BCnEncTests/TestHelper.cs +++ b/BCnEncTests/TestHelper.cs @@ -4,6 +4,7 @@ using BCnEncoder.Encoder; using BCnEncoder.Shared; using SixLabors.ImageSharp; +using SixLabors.ImageSharp.ColorSpaces; using SixLabors.ImageSharp.PixelFormats; using Xunit; using Xunit.Abstractions; @@ -12,34 +13,43 @@ namespace BCnEncTests { public static class TestHelper { - public static float DecodeCheckPSNR(string filename, Image original) { - using FileStream fs = File.OpenRead(filename); + public static float DecodeCheckPSNR(string filename, Image original) + { + using var fs = File.OpenRead(filename); var ktx = KtxFile.Load(fs); var decoder = new BcDecoder(); using var img = decoder.Decode(ktx); - if (!original.TryGetSinglePixelSpan(out var pixels)) { + return CalculatePSNR(original, img); + } + + public static float CalculatePSNR(Image original, Image decoded) + { + if (!original.TryGetSinglePixelSpan(out var pixels)) + { throw new Exception("Cannot get pixel span."); } - if (!img.TryGetSinglePixelSpan(out var pixels2)) { + if (!decoded.TryGetSinglePixelSpan(out var pixels2)) + { throw new Exception("Cannot get pixel span."); } - return ImageQuality.PeakSignalToNoiseRatio(pixels, pixels2, true); + return ImageQuality.PeakSignalToNoiseRatio(pixels, pixels2); } - public static void ExecuteEncodingTest(Image image, CompressionFormat format, CompressionQuality quality, string filename, ITestOutputHelper output) { - BcEncoder encoder = new BcEncoder(); + public static void ExecuteEncodingTest(Image image, CompressionFormat format, CompressionQuality quality, string filename, ITestOutputHelper output) + { + var encoder = new BcEncoder(); encoder.OutputOptions.Quality = quality; encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = format; - using FileStream fs = File.OpenWrite(filename); + using var fs = File.OpenWrite(filename); encoder.Encode(image, fs); fs.Close(); var psnr = TestHelper.DecodeCheckPSNR(filename, image); output.WriteLine("RGBA PSNR: " + psnr + "db"); - if(quality == CompressionQuality.Fast) + if (quality == CompressionQuality.Fast) { Assert.True(psnr > 25); } From 84cac46bce710fd9c0487963c64a6a4256038996 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Fri, 15 Jan 2021 21:44:20 +0100 Subject: [PATCH 028/116] Refactoring of MipMapper; Fix setting image size for each subsequent mipmap, instead of mipmap size; --- BCnEnc.Net/Encoder/BcEncoder.cs | 40 +++++++++--------- BCnEnc.Net/Shared/MipMapper.cs | 72 ++++++++++++++++++++++++--------- 2 files changed, 72 insertions(+), 40 deletions(-) diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 7066302..d4d3536 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -329,8 +329,8 @@ public DdsFile EncodeCubeMapToDds(Image right, Image left, Image /// The number of mipmap levels that will be generated for the input image. public int CalculateNumberOfMipLevels(Image inputImage) { - return (int)MipMapper.CalculateMipChainLength(inputImage.Width, inputImage.Height, - (OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1)); + return MipMapper.CalculateMipChainLength(inputImage.Width, inputImage.Height, + OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1); } /// @@ -341,8 +341,8 @@ public int CalculateNumberOfMipLevels(Image inputImage) /// The number of mipmap levels that will be generated for the input image. public int CalculateNumberOfMipLevels(int imagePixelWidth, int imagePixelHeight) { - return (int)MipMapper.CalculateMipChainLength(imagePixelWidth, imagePixelHeight, - (OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1)); + return MipMapper.CalculateMipChainLength(imagePixelWidth, imagePixelHeight, + OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1); } /// @@ -398,7 +398,7 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); // Setup encoders @@ -453,11 +453,11 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken } output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, - (uint)inputImage.Width, - (uint)inputImage.Height, 1)); + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height, 1)); output.MipMaps[mip].Faces[0] = new KtxMipFace(encoded, - (uint)inputImage.Width, - (uint)inputImage.Height); + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); } // Dispose all mipmap levels @@ -465,7 +465,7 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken image.Dispose(); output.header.NumberOfFaces = 1; - output.header.NumberOfMipmapLevels = numMipMaps; + output.header.NumberOfMipmapLevels = (uint)numMipMaps; return output; } @@ -476,7 +476,7 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); // Setup encoder @@ -540,8 +540,8 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken } output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, - (uint)inputImage.Width, - (uint)inputImage.Height); + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); } // Dispose all mipmap levels @@ -550,7 +550,7 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken image.Dispose(); } - output.header.dwMipMapCount = numMipMaps; + output.header.dwMipMapCount = (uint)numMipMaps; if (numMipMaps > 1) { output.header.dwCaps |= HeaderCaps.DdscapsComplex | HeaderCaps.DdscapsMipmap; @@ -576,7 +576,7 @@ private IList EncodeToRawBytesInternal(Image inputImage, Cancell IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); // Setup encoder @@ -650,7 +650,7 @@ private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); // Setup encoder @@ -777,7 +777,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le } - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipLength = MipMapper.CalculateMipChainLength(right.Width, right.Height, numMipMaps); for (uint i = 0; i < mipLength; i++) { @@ -835,7 +835,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le } output.header.NumberOfFaces = (uint)faces.Length; - output.header.NumberOfMipmapLevels = mipLength; + output.header.NumberOfMipmapLevels = (uint)mipLength; return output; } @@ -886,7 +886,7 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le output = new DdsFile(ddsHeader); } - var numMipMaps = OutputOptions.GenerateMipMaps ? (uint)OutputOptions.MaxMipMapLevel : 1; + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var context = new OperationContext { @@ -938,7 +938,7 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le } output.header.dwCaps |= HeaderCaps.DdscapsComplex; - output.header.dwMipMapCount = numMipMaps; + output.header.dwMipMapCount = (uint)numMipMaps; if (numMipMaps > 1) { output.header.dwCaps |= HeaderCaps.DdscapsMipmap; diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index 7e66fb4..78806e6 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; @@ -9,22 +9,31 @@ namespace BCnEncoder.Shared internal static class MipMapper { - public static uint CalculateMipChainLength(int width, int height, uint maxNumMipMaps) { - if (maxNumMipMaps == 1) { + public static int CalculateMipChainLength(int width, int height, int maxNumMipMaps) + { + if (maxNumMipMaps == 1) + { return 1; } - if (maxNumMipMaps == 0) { - maxNumMipMaps = 999; + + if (maxNumMipMaps <= 0) + { + maxNumMipMaps = int.MaxValue; } - uint output = 0; - for (uint mipLevel = 1; mipLevel < maxNumMipMaps; mipLevel++) { + + var output = 0; + for (var mipLevel = 1; mipLevel < maxNumMipMaps; mipLevel++) + { var mipWidth = Math.Max(1, width / (int)Math.Pow(2, mipLevel)); var mipHeight = Math.Max(1, height / (int)Math.Pow(2, mipLevel)); - if (mipWidth == 1 && mipHeight == 1) { + + if (mipWidth == 1 && mipHeight == 1) + { output = mipLevel + 1; break; } } + return output; } @@ -33,13 +42,21 @@ public static void CalculateMipLevelSize(int width, int height, int mipIdx, out mipWidth = width; mipHeight = height; - if (mipIdx == 0) return; - - for (uint mipLevel = 1; mipLevel < 99999; mipLevel++) + if (mipIdx == 0) + { + return; + } + + for (var mipLevel = 1; mipLevel < int.MaxValue; mipLevel++) { mipWidth = Math.Max(1, width / (int)Math.Pow(2, mipLevel)); mipHeight = Math.Max(1, height / (int)Math.Pow(2, mipLevel)); - if (mipLevel == mipIdx) return; + + if (mipLevel == mipIdx) + { + return; + } + if (mipWidth == 1 && mipHeight == 1) { return; @@ -47,26 +64,41 @@ public static void CalculateMipLevelSize(int width, int height, int mipIdx, out } } - public static List> GenerateMipChain(Image sourceImage, ref uint numMipMaps) { - var result = new List>(); - result.Add(sourceImage.Clone()); + /// + /// Generate a chain of elements. + /// + /// The image to scale down. + /// The number of mipmaps to generate. + /// + /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. + public static List> GenerateMipChain(Image sourceImage, ref int numMipMaps) + { + var result = new List> { sourceImage.Clone() }; - if (numMipMaps == 1) { + // If only one mipmap was requested, return original image only + if (numMipMaps == 1) + { return result; } - if (numMipMaps == 0) { - numMipMaps = 999; + // If number of mipmaps is "marked as boundless", do as many mipmaps as it takes to reach a size of 1x1 + if (numMipMaps <= 0) + { + numMipMaps = int.MaxValue; } - for (uint mipLevel = 1; mipLevel < numMipMaps; mipLevel++) { + // Generate mipmaps + for (var mipLevel = 1; mipLevel < numMipMaps; mipLevel++) + { var mipWidth = Math.Max(1, sourceImage.Width / (int)Math.Pow(2, mipLevel)); var mipHeight = Math.Max(1, sourceImage.Height / (int)Math.Pow(2, mipLevel)); var newImage = sourceImage.Clone(x => x.Resize(mipWidth, mipHeight)); result.Add(newImage); - if (mipWidth == 1 && mipHeight == 1) { + // Stop generating of last generated mipmap was of size 1x1 + if (mipWidth == 1 && mipHeight == 1) + { numMipMaps = mipLevel + 1; break; } From 981b108dd9b389f50e47a65be566218233186b99 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Fri, 15 Jan 2021 22:02:07 +0100 Subject: [PATCH 029/116] CancellationTests check against all derivations of OperationCancelledException; --- BCnEncTests/CancellationTest.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/BCnEncTests/CancellationTest.cs b/BCnEncTests/CancellationTest.cs index e3d84f1..9da0dd9 100644 --- a/BCnEncTests/CancellationTest.cs +++ b/BCnEncTests/CancellationTest.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Threading; +using System.Threading.Tasks; using BCnEncoder.Decoder; using BCnEncoder.Encoder; using BCnEncoder.Shared; @@ -20,7 +21,7 @@ public async void EncodeParallelCancellation() encoder.Options.IsParallel = true; var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)); - await Assert.ThrowsAsync(() => + await Assert.ThrowsAnyAsync(() => encoder.EncodeToRawBytesAsync(alphaGradient, 0, source.Token)); } @@ -34,7 +35,7 @@ public async void EncodeNonParallelCancellation() encoder.Options.IsParallel = false; var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)); - await Assert.ThrowsAsync(() => + await Assert.ThrowsAnyAsync(() => encoder.EncodeToRawBytesAsync(alphaGradient, 0, source.Token)); } @@ -50,9 +51,9 @@ public async void DecodeNonParallelCancellation() var decoder = new BcDecoder(); decoder.Options.IsParallel = false; - var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(10)); - await Assert.ThrowsAsync(() => - decoder.DecodeAsync(file, source.Token)); + var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(1)); + await Assert.ThrowsAnyAsync(() => + decoder.DecodeAsync(file, source.Token)); } } } From f8099b686f69eff35ca222039780cc4ea62dbb24 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Fri, 15 Jan 2021 23:30:31 +0100 Subject: [PATCH 030/116] Further test refactoring; --- BCnEncTests/CancellationTest.cs | 28 +--- BCnEncTests/ClusterTests.cs | 7 +- BCnEncTests/DdsReadTests.cs | 72 +-------- BCnEncTests/DdsWritingTests.cs | 99 ++---------- BCnEncTests/DecodingAsyncTests.cs | 33 +--- BCnEncTests/DecodingTests.cs | 122 ++------------- BCnEncTests/EncodingAsyncTest.cs | 72 ++------- BCnEncTests/EncodingTest.cs | 1 + BCnEncTests/RawTests.cs | 15 +- BCnEncTests/{ => Support}/ImageLoader.cs | 15 +- BCnEncTests/Support/TestHelper.cs | 183 +++++++++++++++++++++++ BCnEncTests/TestHelper.cs | 62 -------- 12 files changed, 248 insertions(+), 461 deletions(-) rename BCnEncTests/{ => Support}/ImageLoader.cs (87%) create mode 100644 BCnEncTests/Support/TestHelper.cs delete mode 100644 BCnEncTests/TestHelper.cs diff --git a/BCnEncTests/CancellationTest.cs b/BCnEncTests/CancellationTest.cs index 9da0dd9..5c71a91 100644 --- a/BCnEncTests/CancellationTest.cs +++ b/BCnEncTests/CancellationTest.cs @@ -1,10 +1,7 @@ using System; -using System.IO; using System.Threading; -using System.Threading.Tasks; using BCnEncoder.Decoder; -using BCnEncoder.Encoder; -using BCnEncoder.Shared; +using BCnEncTests.Support; using Xunit; namespace BCnEncTests @@ -14,29 +11,13 @@ public class CancellationTest [Fact] public async void EncodeParallelCancellation() { - var alphaGradient = ImageLoader.TestAlphaGradient1; - - var encoder = new BcEncoder(CompressionFormat.Bc7); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.Options.IsParallel = true; - - var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)); - await Assert.ThrowsAnyAsync(() => - encoder.EncodeToRawBytesAsync(alphaGradient, 0, source.Token)); + await TestHelper.ExecuteCancellationTest(ImageLoader.TestAlphaGradient1, true); } [Fact] public async void EncodeNonParallelCancellation() { - var alphaGradient = ImageLoader.TestAlphaGradient1; - - var encoder = new BcEncoder(CompressionFormat.Bc7); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.Options.IsParallel = false; - - var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)); - await Assert.ThrowsAnyAsync(() => - encoder.EncodeToRawBytesAsync(alphaGradient, 0, source.Token)); + await TestHelper.ExecuteCancellationTest(ImageLoader.TestAlphaGradient1, false); } // HINT: Parallel decoding is too fast to be cancelled. @@ -45,8 +26,7 @@ await Assert.ThrowsAnyAsync(() => [Fact] public async void DecodeNonParallelCancellation() { - using var fs = File.OpenRead(@"../../../testImages/test_decompress_bc7.dds"); - var file = DdsFile.Load(fs); + var file = DdsLoader.TestDecompressBc7; var decoder = new BcDecoder(); decoder.Options.IsParallel = false; diff --git a/BCnEncTests/ClusterTests.cs b/BCnEncTests/ClusterTests.cs index f885c22..1aaac14 100644 --- a/BCnEncTests/ClusterTests.cs +++ b/BCnEncTests/ClusterTests.cs @@ -1,6 +1,7 @@ using System; using System.IO; using BCnEncoder.Shared; +using BCnEncTests.Support; using SixLabors.ImageSharp; using Xunit; @@ -11,7 +12,7 @@ public class ClusterTests [Fact] public void Clusterize() { - using var testImage = ImageLoader.TestBlur1.Clone(); + var testImage = ImageLoader.TestBlur1; if (!testImage.TryGetSinglePixelSpan(out var pixels)) { @@ -19,20 +20,22 @@ public void Clusterize() } var numClusters = (testImage.Width / 32) * (testImage.Height / 32); - var clusters = LinearClustering.ClusterPixels(pixels, testImage.Width, testImage.Height, numClusters, 10, 10); var pixC = new ColorYCbCr[numClusters]; var counts = new int[numClusters]; + for (var i = 0; i < pixels.Length; i++) { pixC[clusters[i]] += new ColorYCbCr(pixels[i]); counts[clusters[i]]++; } + for (var i = 0; i < numClusters; i++) { pixC[i] /= counts[i]; } + for (var i = 0; i < pixels.Length; i++) { pixels[i] = pixC[clusters[i]].ToRgba32(); diff --git a/BCnEncTests/DdsReadTests.cs b/BCnEncTests/DdsReadTests.cs index ad1064a..61897a2 100644 --- a/BCnEncTests/DdsReadTests.cs +++ b/BCnEncTests/DdsReadTests.cs @@ -1,7 +1,7 @@ -using System; using System.IO; using BCnEncoder.Decoder; using BCnEncoder.Shared; +using BCnEncTests.Support; using SixLabors.ImageSharp; using Xunit; @@ -12,91 +12,31 @@ public class DdsReadTests [Fact] public void ReadRgba() { - var file = DdsLoader.TestDecompressRgba; - Assert.Equal(DxgiFormat.DxgiFormatR8G8B8A8Unorm, file.header.ddsPixelFormat.DxgiFormat); - Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); - - var decoder = new BcDecoder(); - var images = decoder.DecodeAllMipMaps(file); - - Assert.Equal((uint)images[0].Width, file.header.dwWidth); - Assert.Equal((uint)images[0].Height, file.header.dwHeight); - - for (var i = 0; i < images.Length; i++) - { - using var outFs = File.OpenWrite($"decoding_test_dds_rgba_mip{i}.png"); - images[i].SaveAsPng(outFs); - images[i].Dispose(); - } + TestHelper.ExecuteDdsReadingTest(DdsLoader.TestDecompressRgba, DxgiFormat.DxgiFormatR8G8B8A8Unorm, "decoding_test_dds_rgba_mip{0}.png"); } [Fact] public void ReadBc1() { - var file = DdsLoader.TestDecompressBc1; - Assert.Equal(DxgiFormat.DxgiFormatBc1Unorm, file.header.ddsPixelFormat.DxgiFormat); - Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); - - - var decoder = new BcDecoder(); - var images = decoder.DecodeAllMipMaps(file); - - Assert.Equal((uint)images[0].Width, file.header.dwWidth); - Assert.Equal((uint)images[0].Height, file.header.dwHeight); - - for (var i = 0; i < images.Length; i++) - { - using var outFs = File.OpenWrite($"decoding_test_dds_bc1_mip{i}.png"); - images[i].SaveAsPng(outFs); - images[i].Dispose(); - } + TestHelper.ExecuteDdsReadingTest(DdsLoader.TestDecompressBc1, DxgiFormat.DxgiFormatBc1Unorm, "decoding_test_dds_bc1_mip{0}.png"); } [Fact] public void ReadBc1A() { - var file = DdsLoader.TestDecompressBc1A; - Assert.Equal(DxgiFormat.DxgiFormatBc1Unorm, file.header.ddsPixelFormat.DxgiFormat); - Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); - - - var decoder = new BcDecoder(); - decoder.InputOptions.DdsBc1ExpectAlpha = true; - var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.dwWidth); - Assert.Equal((uint)image.Height, file.header.dwHeight); - - if (!image.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - Assert.Contains(pixels.ToArray(), x => x.A == 0); - - using var outFs = File.OpenWrite("decoding_test_dds_bc1a.png"); - image.SaveAsPng(outFs); - image.Dispose(); + TestHelper.ExecuteDdsReadingTest(DdsLoader.TestDecompressBc1A, DxgiFormat.DxgiFormatBc1Unorm, "decoding_test_dds_bc1a_mip{0}.png"); } [Fact] public void ReadBc7() { - using var fs = File.OpenRead(@"../../../testImages/test_decompress_bc7.dds"); - var decoder = new BcDecoder(); - var images = decoder.DecodeAllMipMaps(fs); - - for (var i = 0; i < images.Length; i++) - { - using var outFs = File.OpenWrite($"decoding_test_dds_bc7_mip{i}.png"); - images[i].SaveAsPng(outFs); - images[i].Dispose(); - } + TestHelper.ExecuteDdsReadingTest(DdsLoader.TestDecompressBc7, DxgiFormat.DxgiFormatUnknown, "decoding_test_dds_bc7_mip{0}.png"); } [Fact] public void ReadFromStream() { - using var fs = File.OpenRead(@"../../../testImages/test_decompress_bc1.dds"); + using var fs = File.OpenRead(DdsLoader.TestDecompressBc1Name); var decoder = new BcDecoder(); var images = decoder.DecodeAllMipMaps(fs); diff --git a/BCnEncTests/DdsWritingTests.cs b/BCnEncTests/DdsWritingTests.cs index 6b08113..44a0616 100644 --- a/BCnEncTests/DdsWritingTests.cs +++ b/BCnEncTests/DdsWritingTests.cs @@ -1,6 +1,5 @@ -using System.IO; -using BCnEncoder.Encoder; using BCnEncoder.Shared; +using BCnEncTests.Support; using Xunit; namespace BCnEncTests @@ -10,129 +9,49 @@ public class DdsWritingTests [Fact] public void DdsWriteRgba() { - var image = ImageLoader.TestLenna; - - var encoder = new BcEncoder(); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.OutputOptions.GenerateMipMaps = true; - encoder.OutputOptions.Format = CompressionFormat.Rgba; - encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - - using var fs = File.OpenWrite("encoding_dds_rgba.dds"); - encoder.Encode(image, fs); - fs.Close(); + TestHelper.ExecuteDdsWritingTest(ImageLoader.TestLenna, CompressionFormat.Rgba, "encoding_dds_rgba.dds"); } [Fact] public void DdsWriteBc1() { - var image = ImageLoader.TestLenna; - - var encoder = new BcEncoder(); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.OutputOptions.GenerateMipMaps = true; - encoder.OutputOptions.Format = CompressionFormat.Bc1; - encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - - using var fs = File.OpenWrite("encoding_dds_bc1.dds"); - encoder.Encode(image, fs); - fs.Close(); + TestHelper.ExecuteDdsWritingTest(ImageLoader.TestLenna, CompressionFormat.Bc1, "encoding_dds_bc1.dds"); } [Fact] public void DdsWriteBc2() { - var image = ImageLoader.TestAlpha1; - - var encoder = new BcEncoder(); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.OutputOptions.GenerateMipMaps = true; - encoder.OutputOptions.Format = CompressionFormat.Bc2; - encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - - using var fs = File.OpenWrite("encoding_dds_bc2.dds"); - encoder.Encode(image, fs); - fs.Close(); + TestHelper.ExecuteDdsWritingTest(ImageLoader.TestAlpha1, CompressionFormat.Bc2, "encoding_dds_bc2.dds"); } [Fact] public void DdsWriteBc3() { - var image = ImageLoader.TestAlpha1; - - var encoder = new BcEncoder(); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.OutputOptions.GenerateMipMaps = true; - encoder.OutputOptions.Format = CompressionFormat.Bc3; - encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - - using var fs = File.OpenWrite("encoding_dds_bc3.dds"); - encoder.Encode(image, fs); - fs.Close(); + TestHelper.ExecuteDdsWritingTest(ImageLoader.TestAlpha1, CompressionFormat.Bc3, "encoding_dds_bc3.dds"); } [Fact] public void DdsWriteBc4() { - var image = ImageLoader.TestHeight1; - - var encoder = new BcEncoder(); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.OutputOptions.GenerateMipMaps = true; - encoder.OutputOptions.Format = CompressionFormat.Bc4; - encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - - using var fs = File.OpenWrite("encoding_dds_bc4.dds"); - encoder.Encode(image, fs); - fs.Close(); + TestHelper.ExecuteDdsWritingTest(ImageLoader.TestHeight1, CompressionFormat.Bc4, "encoding_dds_bc4.dds"); } [Fact] public void DdsWriteBc5() { - var image = ImageLoader.TestRedGreen1; - - var encoder = new BcEncoder(); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.OutputOptions.GenerateMipMaps = true; - encoder.OutputOptions.Format = CompressionFormat.Bc5; - encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - - using var fs = File.OpenWrite("encoding_dds_bc5.dds"); - encoder.Encode(image, fs); - fs.Close(); + TestHelper.ExecuteDdsWritingTest(ImageLoader.TestRedGreen1, CompressionFormat.Bc5, "encoding_dds_bc5.dds"); } [Fact] public void DdsWriteBc7() { - var image = ImageLoader.TestLenna; - - var encoder = new BcEncoder(); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.OutputOptions.GenerateMipMaps = true; - encoder.OutputOptions.Format = CompressionFormat.Bc7; - encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - - using var fs = File.OpenWrite("encoding_dds_bc7.dds"); - encoder.Encode(image, fs); - fs.Close(); + TestHelper.ExecuteDdsWritingTest(ImageLoader.TestLenna, CompressionFormat.Bc7, "encoding_dds_bc7.dds"); } [Fact] public void DdsWriteCubemap() { - var images = ImageLoader.TestCubemap; - - var encoder = new BcEncoder(); - encoder.OutputOptions.Quality = CompressionQuality.Fast; - encoder.OutputOptions.GenerateMipMaps = true; - encoder.OutputOptions.Format = CompressionFormat.Bc1; - encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; - - using var fs = File.OpenWrite("encoding_dds_cubemap_bc1.dds"); - encoder.EncodeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], fs); - fs.Close(); + TestHelper.ExecuteDdsWritingTest(ImageLoader.TestCubemap, CompressionFormat.Bc1, "encoding_dds_cubemap_bc1.dds"); } } } diff --git a/BCnEncTests/DecodingAsyncTests.cs b/BCnEncTests/DecodingAsyncTests.cs index 103f8ff..c5d8efd 100644 --- a/BCnEncTests/DecodingAsyncTests.cs +++ b/BCnEncTests/DecodingAsyncTests.cs @@ -1,8 +1,7 @@ -using System.IO; using BCnEncoder.Decoder; using BCnEncoder.Encoder; using BCnEncoder.Shared; -using SixLabors.ImageSharp; +using BCnEncTests.Support; using Xunit; namespace BCnEncTests @@ -19,15 +18,7 @@ public async void DecodeAsync() var file = encoder.EncodeToKtx(original); var image = await decoder.DecodeAsync(file); - var psnr = TestHelper.CalculatePSNR(original, image); - if (encoder.OutputOptions.Quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } + TestHelper.AssertImagesEqual(original, image,encoder.OutputOptions.Quality); } [Fact] @@ -40,15 +31,7 @@ public async void DecodeAllMipMapsAsync() var file = encoder.EncodeToKtx(original); var image = await decoder.DecodeAllMipMapsAsync(file); - var psnr = TestHelper.CalculatePSNR(original, image[0]); - if (encoder.OutputOptions.Quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } + TestHelper.AssertImagesEqual(original, image[0], encoder.OutputOptions.Quality); } [Fact] @@ -62,15 +45,7 @@ public async void DecodeRawAsync() var image = await decoder.DecodeRawAsync(file.MipMaps[0].Faces[0].Data, CompressionFormat.Bc1, (int) file.MipMaps[0].Width, (int) file.MipMaps[0].Height); - var psnr = TestHelper.CalculatePSNR(original, image); - if (encoder.OutputOptions.Quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); } } } diff --git a/BCnEncTests/DecodingTests.cs b/BCnEncTests/DecodingTests.cs index 1f611a3..c2fc08c 100644 --- a/BCnEncTests/DecodingTests.cs +++ b/BCnEncTests/DecodingTests.cs @@ -1,7 +1,4 @@ -using System.IO; -using BCnEncoder.Decoder; -using BCnEncoder.Shared; -using SixLabors.ImageSharp; +using BCnEncTests.Support; using Xunit; namespace BCnEncTests @@ -11,154 +8,55 @@ public class DecodingTests [Fact] public void Bc1Decode() { - var file = KtxLoader.TestDecompressBc1; - Assert.True(file.header.VerifyHeader()); - Assert.Equal((uint)1, file.header.NumberOfFaces); - - var decoder = new BcDecoder(); - using var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.PixelWidth); - Assert.Equal((uint)image.Height, file.header.PixelHeight); - - using var outFs = File.OpenWrite("decoding_test_bc1.png"); - image.SaveAsPng(outFs); + TestHelper.ExecuteDecodingTest(KtxLoader.TestDecompressBc1, "decoding_test_bc1.png"); } [Fact] public void Bc1AlphaDecode() { - var file = KtxLoader.TestDecompressBc1A; - Assert.True(file.header.VerifyHeader()); - Assert.Equal((uint)1, file.header.NumberOfFaces); - - var decoder = new BcDecoder(); - using var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.PixelWidth); - Assert.Equal((uint)image.Height, file.header.PixelHeight); - - using var outFs = File.OpenWrite("decoding_test_bc1a.png"); - image.SaveAsPng(outFs); + TestHelper.ExecuteDecodingTest(KtxLoader.TestDecompressBc1A, "decoding_test_bc1a.png"); } [Fact] public void Bc2Decode() { - var file = KtxLoader.TestDecompressBc2; - Assert.True(file.header.VerifyHeader()); - Assert.Equal((uint)1, file.header.NumberOfFaces); - - var decoder = new BcDecoder(); - using var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.PixelWidth); - Assert.Equal((uint)image.Height, file.header.PixelHeight); - - using var outFs = File.OpenWrite("decoding_test_bc2.png"); - image.SaveAsPng(outFs); + TestHelper.ExecuteDecodingTest(KtxLoader.TestDecompressBc2, "decoding_test_bc2.png"); } [Fact] public void Bc3Decode() { - var file = KtxLoader.TestDecompressBc3; - Assert.True(file.header.VerifyHeader()); - Assert.Equal((uint)1, file.header.NumberOfFaces); - - var decoder = new BcDecoder(); - using var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.PixelWidth); - Assert.Equal((uint)image.Height, file.header.PixelHeight); - - using var outFs = File.OpenWrite("decoding_test_bc3.png"); - image.SaveAsPng(outFs); + TestHelper.ExecuteDecodingTest(KtxLoader.TestDecompressBc3, "decoding_test_bc3.png"); } [Fact] public void Bc4Decode() { - var file = KtxLoader.TestDecompressBc4Unorm; - Assert.True(file.header.VerifyHeader()); - Assert.Equal((uint)1, file.header.NumberOfFaces); - - var decoder = new BcDecoder(); - using var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.PixelWidth); - Assert.Equal((uint)image.Height, file.header.PixelHeight); - - using var outFs = File.OpenWrite("decoding_test_bc4.png"); - image.SaveAsPng(outFs); + TestHelper.ExecuteDecodingTest(KtxLoader.TestDecompressBc4Unorm, "decoding_test_bc4.png"); } [Fact] public void Bc5Decode() { - var file = KtxLoader.TestDecompressBc5Unorm; - Assert.True(file.header.VerifyHeader()); - Assert.Equal((uint)1, file.header.NumberOfFaces); - - var decoder = new BcDecoder(); - using var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.PixelWidth); - Assert.Equal((uint)image.Height, file.header.PixelHeight); - - using var outFs = File.OpenWrite("decoding_test_bc5.png"); - image.SaveAsPng(outFs); + TestHelper.ExecuteDecodingTest(KtxLoader.TestDecompressBc5Unorm, "decoding_test_bc5.png"); } [Fact] public void Bc7DecodeRgb() { - var file = KtxLoader.TestDecompressBc7Rgb; - Assert.True(file.header.VerifyHeader()); - Assert.Equal((uint)1, file.header.NumberOfFaces); - - var decoder = new BcDecoder(); - using var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.PixelWidth); - Assert.Equal((uint)image.Height, file.header.PixelHeight); - - using var outFs = File.OpenWrite("decoding_test_bc7_rgb.png"); - image.SaveAsPng(outFs); + TestHelper.ExecuteDecodingTest(KtxLoader.TestDecompressBc7Rgb, "decoding_test_bc7_rgb.png"); } [Fact] public void Bc7DecodeUnorm() { - var file = KtxLoader.TestDecompressBc7Unorm; - Assert.True(file.header.VerifyHeader()); - Assert.Equal((uint)1, file.header.NumberOfFaces); - - var decoder = new BcDecoder(); - using var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.PixelWidth); - Assert.Equal((uint)image.Height, file.header.PixelHeight); - - using var outFs = File.OpenWrite("decoding_test_bc7_unorm.png"); - image.SaveAsPng(outFs); + TestHelper.ExecuteDecodingTest(KtxLoader.TestDecompressBc7Unorm, "decoding_test_bc7_unorm.png"); } [Fact] public void Bc7DecodeEveryBlockType() { - var file = KtxLoader.TestDecompressBc7Types; - Assert.True(file.header.VerifyHeader()); - Assert.Equal((uint)1, file.header.NumberOfFaces); - - var decoder = new BcDecoder(); - using var image = decoder.Decode(file); - - Assert.Equal((uint)image.Width, file.header.PixelWidth); - Assert.Equal((uint)image.Height, file.header.PixelHeight); - - using var outFs = File.OpenWrite("decoding_test_bc7_types.png"); - image.SaveAsPng(outFs); + TestHelper.ExecuteDecodingTest(KtxLoader.TestDecompressBc7Types, "decoding_test_bc7_types.png"); } } } diff --git a/BCnEncTests/EncodingAsyncTest.cs b/BCnEncTests/EncodingAsyncTest.cs index ad900d2..2e0268d 100644 --- a/BCnEncTests/EncodingAsyncTest.cs +++ b/BCnEncTests/EncodingAsyncTest.cs @@ -1,21 +1,24 @@ -using System.IO; using BCnEncoder.Decoder; using BCnEncoder.Encoder; using BCnEncoder.Shared; +using BCnEncTests.Support; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using Xunit; -using Xunit.Abstractions; namespace BCnEncTests { public class EncodingAsyncTest { + private readonly BcEncoder encoder; + private readonly BcDecoder decoder; private readonly Image originalImage; private readonly Image[] originalCubeMap; public EncodingAsyncTest() { + encoder = new BcEncoder(); + decoder = new BcDecoder(); originalImage = ImageLoader.TestGradient1; originalCubeMap = ImageLoader.TestCubemap; } @@ -23,49 +26,24 @@ public EncodingAsyncTest() [Fact] public async void EncodeToDdsAsync() { - var encoder = new BcEncoder(); - var decoder = new BcDecoder(); - var file = await encoder.EncodeToDdsAsync(originalImage); var image = decoder.Decode(file); - var psnr = TestHelper.CalculatePSNR(originalImage, image); - if (encoder.OutputOptions.Quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } + TestHelper.AssertImagesEqual(originalImage, image, encoder.OutputOptions.Quality); } [Fact] public async void EncodeToKtxAsync() { - var encoder = new BcEncoder(); - var decoder = new BcDecoder(); - var file = await encoder.EncodeToKtxAsync(originalImage); var image = decoder.Decode(file); - var psnr = TestHelper.CalculatePSNR(originalImage, image); - if (encoder.OutputOptions.Quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } + TestHelper.AssertImagesEqual(originalImage, image, encoder.OutputOptions.Quality); } [Fact] public async void EncodeCubemapToDdsAsync() { - var encoder = new BcEncoder(); - var decoder = new BcDecoder(); - var file = await encoder.EncodeCubeMapToDdsAsync(originalCubeMap[0], originalCubeMap[1], originalCubeMap[2], originalCubeMap[3], originalCubeMap[4], originalCubeMap[5]); @@ -73,24 +51,13 @@ public async void EncodeCubemapToDdsAsync() { var image = decoder.DecodeRaw(file.Faces[i].MipMaps[0].Data, CompressionFormat.Bc1, (int)file.Faces[i].Width, (int)file.Faces[i].Height); - var psnr = TestHelper.CalculatePSNR(originalCubeMap[i], image); - if (encoder.OutputOptions.Quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } + TestHelper.AssertImagesEqual(originalCubeMap[i], image, encoder.OutputOptions.Quality); } } [Fact] public async void EncodeCubemapToKtxAsync() { - var encoder = new BcEncoder(); - var decoder = new BcDecoder(); - var file = await encoder.EncodeCubeMapToKtxAsync(originalCubeMap[0], originalCubeMap[1], originalCubeMap[2], originalCubeMap[3], originalCubeMap[4], originalCubeMap[5]); @@ -98,36 +65,17 @@ public async void EncodeCubemapToKtxAsync() { var image = decoder.DecodeRaw(file.MipMaps[0].Faces[i].Data, CompressionFormat.Bc1, (int)file.MipMaps[0].Faces[i].Width, (int)file.MipMaps[0].Faces[i].Height); - var psnr = TestHelper.CalculatePSNR(originalCubeMap[i], image); - if (encoder.OutputOptions.Quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } + TestHelper.AssertImagesEqual(originalCubeMap[i], image, encoder.OutputOptions.Quality); } } [Fact] public async void EncodeToRawBytesAsync() { - var encoder = new BcEncoder(); - var decoder = new BcDecoder(); - var data = await encoder.EncodeToRawBytesAsync(originalImage); var image = decoder.DecodeRaw(data[0], CompressionFormat.Bc1, originalImage.Width, originalImage.Height); - var psnr = TestHelper.CalculatePSNR(originalImage, image); - if (encoder.OutputOptions.Quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } + TestHelper.AssertImagesEqual(originalImage, image, encoder.OutputOptions.Quality); } } } diff --git a/BCnEncTests/EncodingTest.cs b/BCnEncTests/EncodingTest.cs index c745719..e5fe143 100644 --- a/BCnEncTests/EncodingTest.cs +++ b/BCnEncTests/EncodingTest.cs @@ -1,6 +1,7 @@ using System.IO; using BCnEncoder.Encoder; using BCnEncoder.Shared; +using BCnEncTests.Support; using Xunit; using Xunit.Abstractions; diff --git a/BCnEncTests/RawTests.cs b/BCnEncTests/RawTests.cs index df3f69d..fae6883 100644 --- a/BCnEncTests/RawTests.cs +++ b/BCnEncTests/RawTests.cs @@ -2,6 +2,7 @@ using BCnEncoder.Decoder; using BCnEncoder.Encoder; using BCnEncoder.Shared; +using BCnEncTests.Support; using SixLabors.ImageSharp.Processing; using Xunit; @@ -25,9 +26,7 @@ public void EncodeDecode() ImageLoader.TestGradient1.TryGetSinglePixelSpan(out var originalPixels); decodedImage.TryGetSinglePixelSpan(out var decodedPixels); - var psnr = ImageQuality.PeakSignalToNoiseRatio(originalPixels, decodedPixels); - - Assert.True(psnr > 30); + TestHelper.AssertPixelsEqual(originalPixels, decodedPixels, encoder.OutputOptions.Quality); } [Fact] @@ -51,9 +50,7 @@ public void EncodeDecodeStream() inputImage.TryGetSinglePixelSpan(out var originalPixels); decodedImage.TryGetSinglePixelSpan(out var decodedPixels); - var psnr = ImageQuality.PeakSignalToNoiseRatio(originalPixels, decodedPixels); - - Assert.True(psnr > 30); + TestHelper.AssertPixelsEqual(originalPixels, decodedPixels, encoder.OutputOptions.Quality); } @@ -95,13 +92,13 @@ public void EncodeDecodeAllMipMapsStream() var decodedImage = decoder.DecodeRaw(ms, CompressionFormat.Bc1, mipWidth, mipHeight); resized.TryGetSinglePixelSpan(out var originalPixels); decodedImage.TryGetSinglePixelSpan(out var decodedPixels); - var psnr = ImageQuality.PeakSignalToNoiseRatio(originalPixels, decodedPixels); - Assert.True(psnr > 30); + + TestHelper.AssertPixelsEqual(originalPixels, decodedPixels, encoder.OutputOptions.Quality); } encoder.CalculateMipMapSize(inputImage, mipLevels - 1, out var lastMWidth, out var lastMHeight); Assert.Equal(1, lastMWidth); - Assert.Equal(1, lastMWidth); + Assert.Equal(1, lastMHeight); } } } diff --git a/BCnEncTests/ImageLoader.cs b/BCnEncTests/Support/ImageLoader.cs similarity index 87% rename from BCnEncTests/ImageLoader.cs rename to BCnEncTests/Support/ImageLoader.cs index 5ecfe51..95b5d3f 100644 --- a/BCnEncTests/ImageLoader.cs +++ b/BCnEncTests/Support/ImageLoader.cs @@ -3,7 +3,7 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; -namespace BCnEncTests +namespace BCnEncTests.Support { public static class ImageLoader { @@ -37,10 +37,15 @@ private static Image LoadTestImage(string filename) public static class DdsLoader { - public static DdsFile TestDecompressBc1 { get; } = LoadDdsFile("../../../testImages/test_decompress_bc1.dds"); - public static DdsFile TestDecompressBc1A { get; } = LoadDdsFile("../../../testImages/test_decompress_bc1a.dds"); - public static DdsFile TestDecompressBc7 { get; } = LoadDdsFile("../../../testImages/test_decompress_bc7.dds"); - public static DdsFile TestDecompressRgba { get; } = LoadDdsFile("../../../testImages/test_decompress_rgba.dds"); + public const string TestDecompressBc1Name = "../../../testImages/test_decompress_bc1.dds"; + public const string TestDecompressBc1AName = "../../../testImages/test_decompress_bc1a.dds"; + public const string TestDecompressBc7Name = "../../../testImages/test_decompress_bc7.dds"; + public const string TestDecompressRgbaName = "../../../testImages/test_decompress_rgba.dds"; + + public static DdsFile TestDecompressBc1 { get; } = LoadDdsFile(TestDecompressBc1Name); + public static DdsFile TestDecompressBc1A { get; } = LoadDdsFile(TestDecompressBc1AName); + public static DdsFile TestDecompressBc7 { get; } = LoadDdsFile(TestDecompressBc7Name); + public static DdsFile TestDecompressRgba { get; } = LoadDdsFile(TestDecompressRgbaName); private static DdsFile LoadDdsFile(string filename) { diff --git a/BCnEncTests/Support/TestHelper.cs b/BCnEncTests/Support/TestHelper.cs new file mode 100644 index 0000000..c0bb15b --- /dev/null +++ b/BCnEncTests/Support/TestHelper.cs @@ -0,0 +1,183 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; +using Xunit.Abstractions; + +namespace BCnEncTests.Support +{ + public static class TestHelper + { + #region Assertions + + public static void AssertPixelsEqual(Span originalPixels, Span pixels, CompressionQuality quality) + { + var psnr = ImageQuality.PeakSignalToNoiseRatio(originalPixels, pixels); + AssertPSNR(psnr, quality); + } + + public static void AssertImagesEqual(Image original, Image image, CompressionQuality quality) + { + var psnr = CalculatePSNR(original, image); + AssertPSNR(psnr, quality); + } + + #endregion + + #region Execute methods + + public static void ExecuteDecodingTest(KtxFile file, string outputFile) + { + Assert.True(file.header.VerifyHeader()); + Assert.Equal((uint)1, file.header.NumberOfFaces); + + var decoder = new BcDecoder(); + using var image = decoder.Decode(file); + + Assert.Equal((uint)image.Width, file.header.PixelWidth); + Assert.Equal((uint)image.Height, file.header.PixelHeight); + + using var outFs = File.OpenWrite(outputFile); + image.SaveAsPng(outFs); + } + + #region Dds + + public static void ExecuteDdsWritingTest(Image image, CompressionFormat format, string outputFile) + { + ExecuteDdsWritingTest(new[] { image }, format, outputFile); + } + + public static void ExecuteDdsWritingTest(Image[] images, CompressionFormat format, string outputFile) + { + var encoder = new BcEncoder(); + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = format; + encoder.OutputOptions.FileFormat = OutputFileFormat.Dds; + + using var fs = File.OpenWrite(outputFile); + + if (images.Length == 1) + { + encoder.Encode(images[0], fs); + } + else + { + encoder.EncodeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], fs); + } + } + + public static void ExecuteDdsReadingTest(DdsFile file, DxgiFormat format, string outputFile, bool assertAlpha = false) + { + Assert.Equal(format, file.header.ddsPixelFormat.DxgiFormat); + Assert.Equal(file.header.dwMipMapCount, (uint)file.Faces[0].MipMaps.Length); + + var decoder = new BcDecoder(); + decoder.InputOptions.DdsBc1ExpectAlpha = assertAlpha; + var images = decoder.DecodeAllMipMaps(file); + + Assert.Equal((uint)images[0].Width, file.header.dwWidth); + Assert.Equal((uint)images[0].Height, file.header.dwHeight); + + for (var i = 0; i < images.Length; i++) + { + if (assertAlpha) + { + if (!images[0].TryGetSinglePixelSpan(out var pixels)) + { + throw new Exception("Cannot get pixel span."); + } + Assert.Contains(pixels.ToArray(), x => x.A == 0); + } + + using var outFs = File.OpenWrite(string.Format(outputFile, i)); + images[i].SaveAsPng(outFs); + images[i].Dispose(); + } + } + + #endregion + + #region Cancellation + + public static async Task ExecuteCancellationTest(Image image, bool isParallel) + { + var encoder = new BcEncoder(CompressionFormat.Bc7); + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.Options.IsParallel = isParallel; + + var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)); + await Assert.ThrowsAnyAsync(() => + encoder.EncodeToRawBytesAsync(image, 0, source.Token)); + } + + #endregion + + #endregion + + public static float DecodeCheckPSNR(string filename, Image original) + { + using var fs = File.OpenRead(filename); + var ktx = KtxFile.Load(fs); + var decoder = new BcDecoder(); + using var img = decoder.Decode(ktx); + + return CalculatePSNR(original, img); + } + + public static void ExecuteEncodingTest(Image image, CompressionFormat format, CompressionQuality quality, string filename, ITestOutputHelper output) + { + var encoder = new BcEncoder(); + encoder.OutputOptions.Quality = quality; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = format; + + using var fs = File.OpenWrite(filename); + encoder.Encode(image, fs); + fs.Close(); + var psnr = DecodeCheckPSNR(filename, image); + output.WriteLine("RGBA PSNR: " + psnr + "db"); + if (quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + + private static float CalculatePSNR(Image original, Image decoded) + { + if (!original.TryGetSinglePixelSpan(out var pixels)) + { + throw new Exception("Cannot get pixel span."); + } + if (!decoded.TryGetSinglePixelSpan(out var pixels2)) + { + throw new Exception("Cannot get pixel span."); + } + + return ImageQuality.PeakSignalToNoiseRatio(pixels, pixels2); + } + + private static void AssertPSNR(float psnr, CompressionQuality quality) + { + if (quality == CompressionQuality.Fast) + { + Assert.True(psnr > 25); + } + else + { + Assert.True(psnr > 30); + } + } + } +} diff --git a/BCnEncTests/TestHelper.cs b/BCnEncTests/TestHelper.cs deleted file mode 100644 index 8c83b8f..0000000 --- a/BCnEncTests/TestHelper.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.IO; -using BCnEncoder.Decoder; -using BCnEncoder.Encoder; -using BCnEncoder.Shared; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.ColorSpaces; -using SixLabors.ImageSharp.PixelFormats; -using Xunit; -using Xunit.Abstractions; - -namespace BCnEncTests -{ - public static class TestHelper - { - public static float DecodeCheckPSNR(string filename, Image original) - { - using var fs = File.OpenRead(filename); - var ktx = KtxFile.Load(fs); - var decoder = new BcDecoder(); - using var img = decoder.Decode(ktx); - - return CalculatePSNR(original, img); - } - - public static float CalculatePSNR(Image original, Image decoded) - { - if (!original.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - if (!decoded.TryGetSinglePixelSpan(out var pixels2)) - { - throw new Exception("Cannot get pixel span."); - } - - return ImageQuality.PeakSignalToNoiseRatio(pixels, pixels2); - } - - public static void ExecuteEncodingTest(Image image, CompressionFormat format, CompressionQuality quality, string filename, ITestOutputHelper output) - { - var encoder = new BcEncoder(); - encoder.OutputOptions.Quality = quality; - encoder.OutputOptions.GenerateMipMaps = true; - encoder.OutputOptions.Format = format; - - using var fs = File.OpenWrite(filename); - encoder.Encode(image, fs); - fs.Close(); - var psnr = TestHelper.DecodeCheckPSNR(filename, image); - output.WriteLine("RGBA PSNR: " + psnr + "db"); - if (quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } - } - } -} From 5636ca1541790979cccb049b1e2fa6d79002c1d0 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Fri, 15 Jan 2021 23:45:53 +0100 Subject: [PATCH 031/116] Remove decoding cancellation tests; --- BCnEncTests/CancellationTest.cs | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/BCnEncTests/CancellationTest.cs b/BCnEncTests/CancellationTest.cs index 5c71a91..1d7f296 100644 --- a/BCnEncTests/CancellationTest.cs +++ b/BCnEncTests/CancellationTest.cs @@ -20,20 +20,8 @@ public async void EncodeNonParallelCancellation() await TestHelper.ExecuteCancellationTest(ImageLoader.TestAlphaGradient1, false); } - // HINT: Parallel decoding is too fast to be cancelled. - // HINT: Even with TimeSpan.FromTicks(1) the test never successfully threw an exception when executed in bulk with other tests. - - [Fact] - public async void DecodeNonParallelCancellation() - { - var file = DdsLoader.TestDecompressBc7; - - var decoder = new BcDecoder(); - decoder.Options.IsParallel = false; - - var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(1)); - await Assert.ThrowsAnyAsync(() => - decoder.DecodeAsync(file, source.Token)); - } + // HINT: Decoding in general is too fast to be cancelled. + // HINT: For parallel decoding even with TimeSpan.FromTicks(1) the test never successfully threw an exception when executed in bulk with other tests. + // HINT: For non parallel decoding the test was partially successful, due to fluctuations in how much time the decoding needed and when the cancellation was introduced. } } From 85e78f3343feda2a1e6348f5be6945148c12c1c2 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Sat, 16 Jan 2021 14:40:11 +0100 Subject: [PATCH 032/116] Dispose image and file resources were applicable; --- BCnEncTests/DecodingAsyncTests.cs | 9 +++++++-- BCnEncTests/EncodingAsyncTest.cs | 5 +++++ BCnEncTests/EncodingTest.cs | 1 - BCnEncTests/RawTests.cs | 2 +- BCnEncTests/Support/TestHelper.cs | 12 +++--------- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/BCnEncTests/DecodingAsyncTests.cs b/BCnEncTests/DecodingAsyncTests.cs index c5d8efd..0dca966 100644 --- a/BCnEncTests/DecodingAsyncTests.cs +++ b/BCnEncTests/DecodingAsyncTests.cs @@ -1,3 +1,4 @@ +using System.ComponentModel.DataAnnotations; using BCnEncoder.Decoder; using BCnEncoder.Encoder; using BCnEncoder.Shared; @@ -19,6 +20,7 @@ public async void DecodeAsync() var image = await decoder.DecodeAsync(file); TestHelper.AssertImagesEqual(original, image,encoder.OutputOptions.Quality); + image.Dispose(); } [Fact] @@ -29,9 +31,11 @@ public async void DecodeAllMipMapsAsync() var original = ImageLoader.TestGradient1; var file = encoder.EncodeToKtx(original); - var image = await decoder.DecodeAllMipMapsAsync(file); + var images = await decoder.DecodeAllMipMapsAsync(file); - TestHelper.AssertImagesEqual(original, image[0], encoder.OutputOptions.Quality); + TestHelper.AssertImagesEqual(original, images[0], encoder.OutputOptions.Quality); + foreach(var img in images) + img.Dispose(); } [Fact] @@ -46,6 +50,7 @@ public async void DecodeRawAsync() (int) file.MipMaps[0].Width, (int) file.MipMaps[0].Height); TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + image.Dispose(); } } } diff --git a/BCnEncTests/EncodingAsyncTest.cs b/BCnEncTests/EncodingAsyncTest.cs index 2e0268d..d1e5b12 100644 --- a/BCnEncTests/EncodingAsyncTest.cs +++ b/BCnEncTests/EncodingAsyncTest.cs @@ -30,6 +30,7 @@ public async void EncodeToDdsAsync() var image = decoder.Decode(file); TestHelper.AssertImagesEqual(originalImage, image, encoder.OutputOptions.Quality); + image.Dispose(); } [Fact] @@ -39,6 +40,7 @@ public async void EncodeToKtxAsync() var image = decoder.Decode(file); TestHelper.AssertImagesEqual(originalImage, image, encoder.OutputOptions.Quality); + image.Dispose(); } [Fact] @@ -52,6 +54,7 @@ public async void EncodeCubemapToDdsAsync() var image = decoder.DecodeRaw(file.Faces[i].MipMaps[0].Data, CompressionFormat.Bc1, (int)file.Faces[i].Width, (int)file.Faces[i].Height); TestHelper.AssertImagesEqual(originalCubeMap[i], image, encoder.OutputOptions.Quality); + image.Dispose(); } } @@ -66,6 +69,7 @@ public async void EncodeCubemapToKtxAsync() var image = decoder.DecodeRaw(file.MipMaps[0].Faces[i].Data, CompressionFormat.Bc1, (int)file.MipMaps[0].Faces[i].Width, (int)file.MipMaps[0].Faces[i].Height); TestHelper.AssertImagesEqual(originalCubeMap[i], image, encoder.OutputOptions.Quality); + image.Dispose(); } } @@ -76,6 +80,7 @@ public async void EncodeToRawBytesAsync() var image = decoder.DecodeRaw(data[0], CompressionFormat.Bc1, originalImage.Width, originalImage.Height); TestHelper.AssertImagesEqual(originalImage, image, encoder.OutputOptions.Quality); + image.Dispose(); } } } diff --git a/BCnEncTests/EncodingTest.cs b/BCnEncTests/EncodingTest.cs index e5fe143..920b16d 100644 --- a/BCnEncTests/EncodingTest.cs +++ b/BCnEncTests/EncodingTest.cs @@ -495,7 +495,6 @@ public void WriteCubeMapFile() using var fs = File.OpenWrite(filename); encoder.EncodeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], fs); - fs.Close(); } } } diff --git a/BCnEncTests/RawTests.cs b/BCnEncTests/RawTests.cs index fae6883..776bb36 100644 --- a/BCnEncTests/RawTests.cs +++ b/BCnEncTests/RawTests.cs @@ -34,7 +34,7 @@ public void EncodeDecodeStream() { var inputImage = ImageLoader.TestGradient1; var decoder = new BcDecoder(); - var encoder = new BcEncoder() + var encoder = new BcEncoder { OutputOptions = { Quality = CompressionQuality.BestQuality } }; diff --git a/BCnEncTests/Support/TestHelper.cs b/BCnEncTests/Support/TestHelper.cs index c0bb15b..1836b8d 100644 --- a/BCnEncTests/Support/TestHelper.cs +++ b/BCnEncTests/Support/TestHelper.cs @@ -139,19 +139,13 @@ public static void ExecuteEncodingTest(Image image, CompressionFormat fo encoder.OutputOptions.GenerateMipMaps = true; encoder.OutputOptions.Format = format; - using var fs = File.OpenWrite(filename); + var fs = File.OpenWrite(filename); encoder.Encode(image, fs); fs.Close(); + var psnr = DecodeCheckPSNR(filename, image); output.WriteLine("RGBA PSNR: " + psnr + "db"); - if (quality == CompressionQuality.Fast) - { - Assert.True(psnr > 25); - } - else - { - Assert.True(psnr > 30); - } + AssertPSNR(psnr, encoder.OutputOptions.Quality); } private static float CalculatePSNR(Image original, Image decoded) From a39591c8a91a10d522a007ce3237e76ce7f0b31f Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Sun, 17 Jan 2021 20:03:34 +0100 Subject: [PATCH 033/116] Add ATC; --- BCnEnc.Net/BCnEncoder.csproj | 4 +- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 27 ++- BCnEnc.Net/Decoder/BcDecoder.cs | 36 +++ BCnEnc.Net/Encoder/AtcBlockEncoder.cs | 135 +++++++++++ BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/Bc1BlockEncoder.cs | 8 +- BCnEnc.Net/Encoder/Bc2BlockEncoder.cs | 4 +- BCnEnc.Net/Encoder/Bc3BlockEncoder.cs | 4 +- BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 203 ++++++++++------- BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 42 ++-- BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs | 4 +- BCnEnc.Net/Encoder/BcEncoder.cs | 9 + BCnEnc.Net/Shared/Colors.cs | 178 ++++++++++++++- BCnEnc.Net/Shared/CompressionFormat.cs | 18 +- BCnEnc.Net/Shared/DdsFile.cs | 32 ++- BCnEnc.Net/Shared/EncodedBlocks.cs | 278 +++++++++++++++-------- BCnEnc.Net/Shared/GLFormat.cs | 5 +- BCnEnc.Net/Shared/Interpolation.cs | 34 +++ BCnEncTests/AtcTests.cs | 59 +++++ 19 files changed, 867 insertions(+), 215 deletions(-) create mode 100644 BCnEnc.Net/Encoder/AtcBlockEncoder.cs create mode 100644 BCnEncTests/AtcTests.cs diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index da61c8d..7c94018 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -1,7 +1,7 @@ - + - netstandard2.1 + netcoreapp31 true true diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index c9fbe79..bc63394 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading.Tasks; +using BCnEncoder.Encoder; using BCnEncoder.Shared; namespace BCnEncoder.Decoder @@ -106,7 +107,7 @@ public Bc4Decoder(bool redAsLuminance) protected override RawBlock4X4Rgba32 DecodeBlock(Bc4Block block) { - return block.Decode(redAsLuminance); + return block.Decode(redAsLuminance, Bc4Component.R); } } @@ -125,4 +126,28 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc7Block block) return block.Decode(); } } + + internal class AtcDecoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(AtcBlock block) + { + return block.Decode(); + } + } + + internal class AtcExplicitAlphaDecoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(AtcExplicitAlphaBlock block) + { + return block.Decode(); + } + } + + internal class AtcInterpolatedAlphaDecoder : BaseBcBlockDecoder + { + protected override RawBlock4X4Rgba32 DecodeBlock(AtcInterpolatedAlphaBlock block) + { + return block.Decode(); + } + } } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 4f8ccfb..955b91b 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -522,6 +522,15 @@ private IBcBlockDecoder GetDecoder(GlInternalFormat format) case GlInternalFormat.GlCompressedSrgbAlphaBptcUnormArb: return new Bc7Decoder(); + case GlInternalFormat.GlCompressedRgbAtc: + return new AtcDecoder(); + + case GlInternalFormat.GlCompressedRgbaAtcExplicitAlpha: + return new AtcExplicitAlphaDecoder(); + + case GlInternalFormat.GlCompressedRgbaAtcInterpolatedAlpha: + return new AtcInterpolatedAlphaDecoder(); + default: return null; } @@ -567,6 +576,15 @@ private IBcBlockDecoder GetDecoder(DxgiFormat format, DdsHeader header) case DxgiFormat.DxgiFormatBc7Typeless: return new Bc7Decoder(); + case DxgiFormat.DxgiFormatAtc: + return new AtcDecoder(); + + case DxgiFormat.DxgiFormatAtcExplicitAlpha: + return new AtcExplicitAlphaDecoder(); + + case DxgiFormat.DxgiFormatAtcInterpolatedAlpha: + return new AtcInterpolatedAlphaDecoder(); + default: return null; } @@ -636,6 +654,15 @@ private IBcBlockDecoder GetDecoder(CompressionFormat format) case CompressionFormat.Bc7: return new Bc7Decoder(); + case CompressionFormat.Atc: + return new AtcDecoder(); + + case CompressionFormat.AtcExplicitAlpha: + return new AtcExplicitAlphaDecoder(); + + case CompressionFormat.AtcInterpolatedAlpha: + return new AtcInterpolatedAlphaDecoder(); + default: return null; } @@ -697,6 +724,15 @@ private int GetBufferSize(CompressionFormat format, int pixelWidth, int pixelHei case CompressionFormat.Bc7: return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + case CompressionFormat.Atc: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + case CompressionFormat.AtcExplicitAlpha: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + + case CompressionFormat.AtcInterpolatedAlpha: + return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } diff --git a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs new file mode 100644 index 0000000..4ca3038 --- /dev/null +++ b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs @@ -0,0 +1,135 @@ +using BCnEncoder.Shared; + +namespace BCnEncoder.Encoder +{ + internal unsafe class AtcBlockEncoder : BaseBcBlockEncoder + { + private readonly Bc1BlockEncoder bc1BlockEncoder; + + public AtcBlockEncoder() + { + bc1BlockEncoder = new Bc1BlockEncoder(); + } + + public override AtcBlock EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + { + var atcBlock = new AtcBlock(); + + // Encode with BC1 first + var bc1Block = bc1BlockEncoder.EncodeBlock(block, quality); + + // Atc specific modifications to BC1 + // According to http://www.guildsoftware.com/papers/2012.Converting.DXTC.to.Atc.pdf + + // Change color0 from rgb565 to rgb555 with method 0 + atcBlock.color0 = new ColorRgb555(bc1Block.color0.R, bc1Block.color0.G, bc1Block.color0.B); + atcBlock.color1 = bc1Block.color1; + + // Remap color indices from BC1 to ATC + var remap = stackalloc byte[] { 0, 3, 1, 2 }; + for (var i = 0; i < 16; i++) + { + atcBlock[i] = remap[bc1Block[i]]; + } + + return atcBlock; + } + + public override GlInternalFormat GetInternalFormat() + { + return GlInternalFormat.GlCompressedRgbAtc; + } + + public override GlFormat GetBaseInternalFormat() + { + return GlFormat.GlRgb; + } + + public override DxgiFormat GetDxgiFormat() + { + return DxgiFormat.DxgiFormatAtc; + } + } + + internal class AtcExplicitAlphaBlockEncoder : BaseBcBlockEncoder + { + private readonly AtcBlockEncoder atcBlockEncoder; + + public AtcExplicitAlphaBlockEncoder() + { + atcBlockEncoder = new AtcBlockEncoder(); + } + + public override AtcExplicitAlphaBlock EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + { + var atcBlock = atcBlockEncoder.EncodeBlock(block, quality); + + // Encode alpha + var bc2AlphaBlock = new Bc2AlphaBlock(); + for (var i = 0; i < 16; i++) + { + bc2AlphaBlock.SetAlpha(i, block[i].A); + } + + return new AtcExplicitAlphaBlock + { + alphas = bc2AlphaBlock, + colors = atcBlock + }; + } + + public override GlInternalFormat GetInternalFormat() + { + return GlInternalFormat.GlCompressedRgbaAtcExplicitAlpha; + } + + public override GlFormat GetBaseInternalFormat() + { + return GlFormat.GlRgba; + } + + public override DxgiFormat GetDxgiFormat() + { + return DxgiFormat.DxgiFormatAtcExplicitAlpha; + } + } + + internal class AtcInterpolatedAlphaBlockEncoder : BaseBcBlockEncoder + { + private readonly Bc4BlockEncoder bc4BlockEncoder; + private readonly AtcBlockEncoder atcBlockEncoder; + + public AtcInterpolatedAlphaBlockEncoder() + { + bc4BlockEncoder = new Bc4BlockEncoder(false, Bc4Component.A); + atcBlockEncoder = new AtcBlockEncoder(); + } + + public override AtcInterpolatedAlphaBlock EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + { + var bc4Block = bc4BlockEncoder.EncodeBlock(block, quality); + var atcBlock = atcBlockEncoder.EncodeBlock(block, quality); + + return new AtcInterpolatedAlphaBlock + { + alphas = bc4Block, + colors = atcBlock + }; + } + + public override GlInternalFormat GetInternalFormat() + { + return GlInternalFormat.GlCompressedRgbaAtcInterpolatedAlpha; + } + + public override GlFormat GetBaseInternalFormat() + { + return GlFormat.GlRgba; + } + + public override DxgiFormat GetDxgiFormat() + { + return DxgiFormat.DxgiFormatAtcInterpolatedAlpha; + } + } +} diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index b37dfb6..0e3c747 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -43,6 +43,6 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight public abstract GlFormat GetBaseInternalFormat(); public abstract DxgiFormat GetDxgiFormat(); - protected abstract T EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality); + public abstract T EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality); } } diff --git a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs index dc8015f..94fe640 100644 --- a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs @@ -1,13 +1,11 @@ -using System; -using System.Runtime.InteropServices; -using System.Threading.Tasks; +using System; using BCnEncoder.Shared; namespace BCnEncoder.Encoder { internal class Bc1BlockEncoder : BaseBcBlockEncoder { - protected override Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + public override Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { @@ -216,7 +214,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) internal class Bc1AlphaBlockEncoder : BaseBcBlockEncoder { - protected override Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + public override Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { diff --git a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs index cbbc2b5..6457c1a 100644 --- a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; using System.Threading.Tasks; using BCnEncoder.Shared; @@ -8,7 +8,7 @@ namespace BCnEncoder.Encoder internal class Bc2BlockEncoder : BaseBcBlockEncoder { - protected override Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + public override Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { diff --git a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs index 01b0fc3..fa1a257 100644 --- a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -8,7 +8,7 @@ namespace BCnEncoder.Encoder { internal class Bc3BlockEncoder : BaseBcBlockEncoder { - protected override Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + public override Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) { diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index a842158..3e0ec81 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -1,106 +1,148 @@ -using System; +using System; using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Threading.Tasks; using BCnEncoder.Shared; namespace BCnEncoder.Encoder { + internal enum Bc4Component + { + R, + G, + B, + A + } + internal class Bc4BlockEncoder : BaseBcBlockEncoder { - private readonly bool luminanceAsRed; - - public Bc4BlockEncoder(bool luminanceAsRed) { - this.luminanceAsRed = luminanceAsRed; + private readonly bool luminanceAsComponent; + private readonly Bc4Component component; + + public Bc4BlockEncoder(bool luminanceAsComponent, Bc4Component component = Bc4Component.R) + { + this.luminanceAsComponent = luminanceAsComponent; + this.component = component; } - - protected override Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { + + public override Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + { var output = new Bc4Block(); var colors = new byte[16]; var pixels = block.AsSpan; - for (var i = 0; i < 16; i++) { - if (luminanceAsRed) { + for (var i = 0; i < 16; i++) + { + if (luminanceAsComponent) + { colors[i] = (byte)(new ColorYCbCr(pixels[i]).y * 255); } - else { - colors[i] = pixels[i].R; + else + { + switch (component) + { + case Bc4Component.R: + colors[i] = pixels[i].R; + break; + + case Bc4Component.G: + colors[i] = pixels[i].G; + break; + + case Bc4Component.B: + colors[i] = pixels[i].B; + break; + + case Bc4Component.A: + colors[i] = pixels[i].A; + break; + } } } - switch (quality) { + switch (quality) + { case CompressionQuality.Fast: - return FindRedValues(output, colors, 3); + return FindComponentValues(output, colors, 3); case CompressionQuality.Balanced: - return FindRedValues(output, colors, 4); + return FindComponentValues(output, colors, 4); case CompressionQuality.BestQuality: - return FindRedValues(output, colors, 8); + return FindComponentValues(output, colors, 8); default: throw new ArgumentOutOfRangeException(nameof(quality), quality, null); } } - public override GlInternalFormat GetInternalFormat() { + public override GlInternalFormat GetInternalFormat() + { return GlInternalFormat.GlCompressedRedRgtc1Ext; } - public override GlFormat GetBaseInternalFormat() { + public override GlFormat GetBaseInternalFormat() + { return GlFormat.GlRed; } - public override DxgiFormat GetDxgiFormat() { + public override DxgiFormat GetDxgiFormat() + { return DxgiFormat.DxgiFormatBc4Unorm; } #region Encoding private stuff - private static Bc4Block FindRedValues(Bc4Block colorBlock, byte[] pixels, int variations) { + private static Bc4Block FindComponentValues(Bc4Block colorBlock, byte[] pixels, int variations) + { //Find min and max alpha byte min = 255; byte max = 0; var hasExtremeValues = false; - for (var i = 0; i < pixels.Length; i++) { - if (pixels[i] < 255 && pixels[i] > 0) { + for (var i = 0; i < pixels.Length; i++) + { + if (pixels[i] < 255 && pixels[i] > 0) + { if (pixels[i] < min) min = pixels[i]; if (pixels[i] > max) max = pixels[i]; } - else { + else + { hasExtremeValues = true; } } - int SelectIndices(ref Bc4Block block) { + int SelectIndices(ref Bc4Block block) + { var cumulativeError = 0; - var c0 = block.Red0; - var c1 = block.Red1; + var c0 = block.Endpoint0; + var c1 = block.Endpoint1; var colors = c0 > c1 ? stackalloc byte[] { - c0, - c1, - (byte) (6 / 7.0 * c0 + 1 / 7.0 * c1), - (byte) (5 / 7.0 * c0 + 2 / 7.0 * c1), - (byte) (4 / 7.0 * c0 + 3 / 7.0 * c1), - (byte) (3 / 7.0 * c0 + 4 / 7.0 * c1), - (byte) (2 / 7.0 * c0 + 5 / 7.0 * c1), - (byte) (1 / 7.0 * c0 + 6 / 7.0 * c1), - } + c0, + c1, + (byte)(6 / 7.0 * c0 + 1 / 7.0 * c1), + (byte)(5 / 7.0 * c0 + 2 / 7.0 * c1), + (byte)(4 / 7.0 * c0 + 3 / 7.0 * c1), + (byte)(3 / 7.0 * c0 + 4 / 7.0 * c1), + (byte)(2 / 7.0 * c0 + 5 / 7.0 * c1), + (byte)(1 / 7.0 * c0 + 6 / 7.0 * c1), + } : stackalloc byte[] { - c0, - c1, - (byte) (4 / 5.0 * c0 + 1 / 5.0 * c1), - (byte) (3 / 5.0 * c0 + 2 / 5.0 * c1), - (byte) (2 / 5.0 * c0 + 3 / 5.0 * c1), - (byte) (1 / 5.0 * c0 + 4 / 5.0 * c1), - 0, - 255 - }; - for (var i = 0; i < pixels.Length; i++) { + c0, + c1, + (byte)(4 / 5.0 * c0 + 1 / 5.0 * c1), + (byte)(3 / 5.0 * c0 + 2 / 5.0 * c1), + (byte)(2 / 5.0 * c0 + 3 / 5.0 * c1), + (byte)(1 / 5.0 * c0 + 4 / 5.0 * c1), + 0, + 255 + }; + for (var i = 0; i < pixels.Length; i++) + { byte bestIndex = 0; var bestError = Math.Abs(pixels[i] - colors[0]); - for (byte j = 1; j < colors.Length; j++) { + for (byte j = 1; j < colors.Length; j++) + { var error = Math.Abs(pixels[i] - colors[j]); - if (error < bestError) { + if (error < bestError) + { bestIndex = j; bestError = error; } @@ -108,7 +150,7 @@ int SelectIndices(ref Bc4Block block) { if (bestError == 0) break; } - block.SetRedIndex(i, bestIndex); + block.SetComponentIndex(i, bestIndex); cumulativeError += bestError * bestError; } @@ -116,31 +158,35 @@ int SelectIndices(ref Bc4Block block) { } //everything is either fully black or fully red - if (hasExtremeValues && min == 255 && max == 0) { - colorBlock.Red0 = 0; - colorBlock.Red1 = 255; + if (hasExtremeValues && min == 255 && max == 0) + { + colorBlock.Endpoint0 = 0; + colorBlock.Endpoint1 = 255; var error = SelectIndices(ref colorBlock); Debug.Assert(0 == error); return colorBlock; } var best = colorBlock; - best.Red0 = max; - best.Red1 = min; + best.Endpoint0 = max; + best.Endpoint1 = min; var bestError = SelectIndices(ref best); - if (bestError == 0) { + if (bestError == 0) + { return best; } - for (var i = (byte)variations; i > 0; i--) { + for (var i = (byte)variations; i > 0; i--) + { { var c0 = ByteHelper.ClampToByte(max - i); var c1 = ByteHelper.ClampToByte(min + i); var block = colorBlock; - block.Red0 = hasExtremeValues ? c1 : c0; - block.Red1 = hasExtremeValues ? c0 : c1; + block.Endpoint0 = hasExtremeValues ? c1 : c0; + block.Endpoint1 = hasExtremeValues ? c0 : c1; var error = SelectIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; max = c0; @@ -151,10 +197,11 @@ int SelectIndices(ref Bc4Block block) { var c0 = ByteHelper.ClampToByte(max + i); var c1 = ByteHelper.ClampToByte(min - i); var block = colorBlock; - block.Red0 = hasExtremeValues ? c1 : c0; - block.Red1 = hasExtremeValues ? c0 : c1; + block.Endpoint0 = hasExtremeValues ? c1 : c0; + block.Endpoint1 = hasExtremeValues ? c0 : c1; var error = SelectIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; max = c0; @@ -165,10 +212,11 @@ int SelectIndices(ref Bc4Block block) { var c0 = ByteHelper.ClampToByte(max); var c1 = ByteHelper.ClampToByte(min - i); var block = colorBlock; - block.Red0 = hasExtremeValues ? c1 : c0; - block.Red1 = hasExtremeValues ? c0 : c1; + block.Endpoint0 = hasExtremeValues ? c1 : c0; + block.Endpoint1 = hasExtremeValues ? c0 : c1; var error = SelectIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; max = c0; @@ -179,10 +227,11 @@ int SelectIndices(ref Bc4Block block) { var c0 = ByteHelper.ClampToByte(max + i); var c1 = ByteHelper.ClampToByte(min); var block = colorBlock; - block.Red0 = hasExtremeValues ? c1 : c0; - block.Red1 = hasExtremeValues ? c0 : c1; + block.Endpoint0 = hasExtremeValues ? c1 : c0; + block.Endpoint1 = hasExtremeValues ? c0 : c1; var error = SelectIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; max = c0; @@ -193,10 +242,11 @@ int SelectIndices(ref Bc4Block block) { var c0 = ByteHelper.ClampToByte(max); var c1 = ByteHelper.ClampToByte(min + i); var block = colorBlock; - block.Red0 = hasExtremeValues ? c1 : c0; - block.Red1 = hasExtremeValues ? c0 : c1; + block.Endpoint0 = hasExtremeValues ? c1 : c0; + block.Endpoint1 = hasExtremeValues ? c0 : c1; var error = SelectIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; max = c0; @@ -207,10 +257,11 @@ int SelectIndices(ref Bc4Block block) { var c0 = ByteHelper.ClampToByte(max - i); var c1 = ByteHelper.ClampToByte(min); var block = colorBlock; - block.Red0 = hasExtremeValues ? c1 : c0; - block.Red1 = hasExtremeValues ? c0 : c1; + block.Endpoint0 = hasExtremeValues ? c1 : c0; + block.Endpoint1 = hasExtremeValues ? c0 : c1; var error = SelectIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; max = c0; @@ -218,7 +269,8 @@ int SelectIndices(ref Bc4Block block) { } } - if (bestError < 5) { + if (bestError < 5) + { break; } } @@ -226,7 +278,6 @@ int SelectIndices(ref Bc4Block block) { return best; } - #endregion } } diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index f5ee63d..614996e 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -8,7 +8,7 @@ namespace BCnEncoder.Encoder { internal class Bc5BlockEncoder : BaseBcBlockEncoder { - protected override Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { + public override Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { var output = new Bc5Block(); var reds = new byte[16]; var greens = new byte[16]; @@ -118,8 +118,8 @@ private static Bc5Block FindValues(Bc5Block colorBlock, byte[] pixels, int varia int SelectIndices(ref Bc5Block block) { var cumulativeError = 0; - //var c0 = block.Red0; - //var c1 = block.Red1; + //var c0 = block.Endpoint0; + //var c1 = block.Endpoint1; var c0 = col0Getter(block); var c1 = col1Getter(block); var colors = c0 > c1 @@ -157,7 +157,7 @@ int SelectIndices(ref Bc5Block block) { } block = indexSetter(block, i, bestIndex); - //block.SetRedIndex(i, bestIndex); + //block.SetComponentIndex(i, bestIndex); cumulativeError += bestError * bestError; } @@ -166,8 +166,8 @@ int SelectIndices(ref Bc5Block block) { //everything is either fully black or fully red if (hasExtremeValues && min == 255 && max == 0) { - //colorBlock.Red0 = 0; - //colorBlock.Red1 = 255; + //colorBlock.Endpoint0 = 0; + //colorBlock.Endpoint1 = 255; colorBlock = col0Setter(colorBlock, 0); colorBlock = col1Setter(colorBlock, 255); var error = SelectIndices(ref colorBlock); @@ -176,8 +176,8 @@ int SelectIndices(ref Bc5Block block) { } var best = colorBlock; - //best.Red0 = max; - //best.Red1 = min; + //best.Endpoint0 = max; + //best.Endpoint1 = min; best = col0Setter(best, max); best = col1Setter(best, min); var bestError = SelectIndices(ref best); @@ -190,8 +190,8 @@ int SelectIndices(ref Bc5Block block) { var c0 = ByteHelper.ClampToByte(max - i); var c1 = ByteHelper.ClampToByte(min + i); var block = colorBlock; - //block.Red0 = hasExtremeValues ? c1 : c0; - //block.Red1 = hasExtremeValues ? c0 : c1; + //block.Endpoint0 = hasExtremeValues ? c1 : c0; + //block.Endpoint1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); var error = SelectIndices(ref block); @@ -206,8 +206,8 @@ int SelectIndices(ref Bc5Block block) { var c0 = ByteHelper.ClampToByte(max + i); var c1 = ByteHelper.ClampToByte(min - i); var block = colorBlock; - //block.Red0 = hasExtremeValues ? c1 : c0; - //block.Red1 = hasExtremeValues ? c0 : c1; + //block.Endpoint0 = hasExtremeValues ? c1 : c0; + //block.Endpoint1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); var error = SelectIndices(ref block); @@ -222,8 +222,8 @@ int SelectIndices(ref Bc5Block block) { var c0 = ByteHelper.ClampToByte(max); var c1 = ByteHelper.ClampToByte(min - i); var block = colorBlock; - //block.Red0 = hasExtremeValues ? c1 : c0; - //block.Red1 = hasExtremeValues ? c0 : c1; + //block.Endpoint0 = hasExtremeValues ? c1 : c0; + //block.Endpoint1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); var error = SelectIndices(ref block); @@ -238,8 +238,8 @@ int SelectIndices(ref Bc5Block block) { var c0 = ByteHelper.ClampToByte(max + i); var c1 = ByteHelper.ClampToByte(min); var block = colorBlock; - //block.Red0 = hasExtremeValues ? c1 : c0; - //block.Red1 = hasExtremeValues ? c0 : c1; + //block.Endpoint0 = hasExtremeValues ? c1 : c0; + //block.Endpoint1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); var error = SelectIndices(ref block); @@ -254,8 +254,8 @@ int SelectIndices(ref Bc5Block block) { var c0 = ByteHelper.ClampToByte(max); var c1 = ByteHelper.ClampToByte(min + i); var block = colorBlock; - //block.Red0 = hasExtremeValues ? c1 : c0; - //block.Red1 = hasExtremeValues ? c0 : c1; + //block.Endpoint0 = hasExtremeValues ? c1 : c0; + //block.Endpoint1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); var error = SelectIndices(ref block); @@ -270,8 +270,8 @@ int SelectIndices(ref Bc5Block block) { var c0 = ByteHelper.ClampToByte(max - i); var c1 = ByteHelper.ClampToByte(min); var block = colorBlock; - //block.Red0 = hasExtremeValues ? c1 : c0; - //block.Red1 = hasExtremeValues ? c0 : c1; + //block.Endpoint0 = hasExtremeValues ? c1 : c0; + //block.Endpoint1 = hasExtremeValues ? c0 : c1; block = col0Setter(block, hasExtremeValues ? c1 : c0); block = col1Setter(block, hasExtremeValues ? c0 : c1); var error = SelectIndices(ref block); diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs index ce3a635..4c8d7a6 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -9,7 +9,7 @@ namespace BCnEncoder.Encoder.Bc7 internal class Bc7Encoder : BaseBcBlockEncoder { - protected override Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock, CompressionQuality quality) + public override Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock, CompressionQuality quality) { switch (quality) { diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index d4d3536..526f150 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -984,6 +984,15 @@ private IBcBlockEncoder GetEncoder(CompressionFormat format) case CompressionFormat.Bc7: return new Bc7Encoder(); + case CompressionFormat.Atc: + return new AtcBlockEncoder(); + + case CompressionFormat.AtcExplicitAlpha: + return new AtcExplicitAlphaBlockEncoder(); + + case CompressionFormat.AtcInterpolatedAlpha: + return new AtcInterpolatedAlphaBlockEncoder(); + default: return null; } diff --git a/BCnEnc.Net/Shared/Colors.cs b/BCnEnc.Net/Shared/Colors.cs index 41de5dc..4d0dc36 100644 --- a/BCnEnc.Net/Shared/Colors.cs +++ b/BCnEnc.Net/Shared/Colors.cs @@ -1,9 +1,182 @@ -using System; +using System; using System.Numerics; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared { + internal struct ColorRgb555 : IEquatable + { + public bool Equals(ColorRgb555 other) + { + return data == other.data; + } + + public override bool Equals(object obj) + { + return obj is ColorRgb555 other && Equals(other); + } + + public override int GetHashCode() + { + return data.GetHashCode(); + } + + public static bool operator ==(ColorRgb555 left, ColorRgb555 right) + { + return left.Equals(right); + } + + public static bool operator !=(ColorRgb555 left, ColorRgb555 right) + { + return !left.Equals(right); + } + + private const ushort ModeMask = 0b1_00000_00000_00000; + private const int ModeShift = 15; + private const ushort RedMask = 0b0_11111_00000_00000; + private const int RedShift = 10; + private const ushort GreenMask = 0b0_00000_11111_00000; + private const int GreenShift = 5; + private const ushort BlueMask = 0b0_00000_00000_11111; + + public ushort data; + + public byte Mode + { + readonly get + { + var mode = (data & ModeMask) >> ModeShift; + return (byte)mode; + } + set + { + var mode = value; + data = (ushort)(data & ~ModeMask); + data = (ushort)(data | (mode << ModeShift)); + } + } + + public byte R + { + readonly get + { + var r5 = (data & RedMask) >> RedShift; + return (byte)((r5 << 3) | (r5 >> 2)); + } + set + { + var r5 = value >> 3; + data = (ushort)(data & ~RedMask); + data = (ushort)(data | (r5 << RedShift)); + } + } + + public byte G + { + readonly get + { + var g5 = (data & GreenMask) >> GreenShift; + return (byte)((g5 << 3) | (g5 >> 2)); + } + set + { + var g5 = value >> 3; + data = (ushort)(data & ~GreenMask); + data = (ushort)(data | (g5 << GreenShift)); + } + } + + public byte B + { + readonly get + { + var b5 = data & BlueMask; + return (byte)((b5 << 3) | (b5 >> 2)); + } + set + { + var b5 = value >> 3; + data = (ushort)(data & ~BlueMask); + data = (ushort)(data | b5); + } + } + + public int RawR + { + readonly get => (data & RedMask) >> RedShift; + set + { + if (value > 31) value = 31; + if (value < 0) value = 0; + data = (ushort)(data & ~RedMask); + data = (ushort)(data | (value << RedShift)); + } + } + + public int RawG + { + readonly get => (data & GreenMask) >> GreenShift; + set + { + if (value > 31) value = 31; + if (value < 0) value = 0; + data = (ushort)(data & ~GreenMask); + data = (ushort)(data | (value << GreenShift)); + } + } + + public int RawB + { + readonly get => data & BlueMask; + set + { + if (value > 31) value = 31; + if (value < 0) value = 0; + data = (ushort)(data & ~BlueMask); + data = (ushort)(data | value); + } + } + + public ColorRgb555(byte r, byte g, byte b) + { + data = 0; + R = r; + G = g; + B = b; + } + + public ColorRgb555(Vector3 colorVector) + { + data = 0; + R = ByteHelper.ClampToByte(colorVector.X * 255); + G = ByteHelper.ClampToByte(colorVector.Y * 255); + B = ByteHelper.ClampToByte(colorVector.Z * 255); + } + + public ColorRgb555(ColorRgb24 color) + { + data = 0; + R = color.r; + G = color.g; + B = color.b; + } + + public readonly ColorRgb24 ToColorRgb24() + { + return new ColorRgb24(R, G, B); + } + + public override string ToString() + { + return $"r : {R} g : {G} b : {B}"; + } + + public ColorRgba32 ToColorRgba32() + { + return new ColorRgba32(R, G, B, 255); + } + } + internal struct ColorRgb565 : IEquatable { public bool Equals(ColorRgb565 other) @@ -676,7 +849,6 @@ private static float PivotRgb(float n) { } } - internal struct ColorLab { public float l; public float a; @@ -723,4 +895,4 @@ private static float PivotXyz(float n) { return n > 0.008856f ? i : 7.787f * n + 16 / 116f; } } -} \ No newline at end of file +} diff --git a/BCnEnc.Net/Shared/CompressionFormat.cs b/BCnEnc.Net/Shared/CompressionFormat.cs index a9e5fe7..da104ab 100644 --- a/BCnEnc.Net/Shared/CompressionFormat.cs +++ b/BCnEnc.Net/Shared/CompressionFormat.cs @@ -1,4 +1,4 @@ -namespace BCnEncoder.Shared +namespace BCnEncoder.Shared { public enum CompressionFormat { @@ -49,8 +49,20 @@ public enum CompressionFormat /// /// BC7 / BPTC unorm encoding. Very high Quality rgba or rgb encoding. Also very slow. /// - Bc7 - } + Bc7, + /// + /// ATC / Adreno Texture Compression encoding. Derivative of BC1. + /// + Atc, + /// + /// ATC / Adreno Texture Compression encoding. Derivative of BC1. Good for sharp alpha transitions. + /// + AtcExplicitAlpha, + /// + /// ATC / Adreno Texture Compression encoding. Derivative of BC1. Good for smooth alpha transitions. + /// + AtcInterpolatedAlpha + } public static class CompressionFormatExtensions { diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index 867d5b0..9d29622 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; @@ -339,6 +339,11 @@ public struct DdsPixelFormat public const uint Dxt3 = 0x33545844U; public const uint Dxt4 = 0x34545844U; public const uint Dxt5 = 0x35545844U; + public const uint Ati1 = 0x41544931U; + public const uint Ati2 = 0x41544932U; + public const uint Atc = 0x42544320U; + public const uint Atci = 0x42544349U; + public const uint Atca = 0x42544341U; public const uint Dx10 = 0x30315844U; public uint dwSize; @@ -358,12 +363,24 @@ public DxgiFormat DxgiFormat { switch (dwFourCc) { - case 0x31545844U: + case Dxt1: return DxgiFormat.DxgiFormatBc1Unorm; - case 0x33545844U: + case Dxt2: + case Dxt3: return DxgiFormat.DxgiFormatBc2Unorm; - case 0x35545844U: + case Dxt4: + case Dxt5: return DxgiFormat.DxgiFormatBc3Unorm; + case Ati1: + return DxgiFormat.DxgiFormatBc4Unorm; + case Ati2: + return DxgiFormat.DxgiFormatBc5Unorm; + case Atc: + return DxgiFormat.DxgiFormatAtc; + case Atci: + return DxgiFormat.DxgiFormatAtcExplicitAlpha; + case Atca: + return DxgiFormat.DxgiFormatAtcInterpolatedAlpha; } } else @@ -738,7 +755,12 @@ public enum DxgiFormat : uint DxgiFormatP208, DxgiFormatV208, DxgiFormatV408, - DxgiFormatForceUint + DxgiFormatForceUint, + + // Added here due to missing documentation of an official value + DxgiFormatAtc, + DxgiFormatAtcExplicitAlpha, + DxgiFormatAtcInterpolatedAlpha }; public static class DxgiFormatExtensions diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index 366b157..6a8f54f 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -1,5 +1,7 @@ using System; +using System.Diagnostics; using System.Runtime.InteropServices; +using BCnEncoder.Encoder; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared @@ -64,11 +66,10 @@ stackalloc ColorRgb24[] { } } - [StructLayout(LayoutKind.Sequential)] internal unsafe struct Bc2Block { - public ulong alphaColors; + public Bc2AlphaBlock alphaBlock; public ColorRgb565 color0; public ColorRgb565 color1; public uint colorIndices; @@ -84,22 +85,9 @@ public int this[int index] } } - public readonly byte GetAlpha(int index) - { - var mask = 0xFUL << (index * 4); - var shift = index * 4; - var alphaUnscaled = (alphaColors & mask) >> shift; - return (byte)(alphaUnscaled / 15.0 * 255); - } + public readonly byte GetAlpha(int index) => alphaBlock.GetAlpha(index); - public void SetAlpha(int index, byte alpha) - { - var mask = 0xFUL << (index * 4); - var shift = index * 4; - alphaColors &= ~mask; - var a = (byte)(alpha / 255.0 * 15); - alphaColors |= (ulong)(a & 0xF) << shift; - } + public void SetAlpha(int index, byte alpha) => alphaBlock.SetAlpha(index, alpha); public readonly RawBlock4X4Rgba32 Decode() { @@ -130,7 +118,7 @@ public readonly RawBlock4X4Rgba32 Decode() [StructLayout(LayoutKind.Sequential)] internal unsafe struct Bc3Block { - public ulong alphaBlock; + public Bc4Block alphaBlock; public ColorRgb565 color0; public ColorRgb565 color1; public uint colorIndices; @@ -148,39 +136,19 @@ public int this[int index] public byte Alpha0 { - readonly get => (byte)(alphaBlock & 0xFFUL); - set - { - alphaBlock &= ~0xFFUL; - alphaBlock |= value; - } + get => alphaBlock.Endpoint0; + set => alphaBlock.Endpoint0 = value; } public byte Alpha1 { - readonly get => (byte)((alphaBlock >> 8) & 0xFFUL); - set - { - alphaBlock &= ~0xFF00UL; - alphaBlock |= (ulong)value << 8; - } + get => alphaBlock.Endpoint1; + set => alphaBlock.Endpoint1 = value; } - public readonly byte GetAlphaIndex(int pixelIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - var alphaIndex = (alphaBlock & mask) >> shift; - return (byte)alphaIndex; - } + public readonly byte GetAlphaIndex(int pixelIndex) => alphaBlock.GetComponentIndex(pixelIndex); - public void SetAlphaIndex(int pixelIndex, byte alphaIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - alphaBlock &= ~mask; - alphaBlock |= (ulong)(alphaIndex & 0b111) << shift; - } + public void SetAlphaIndex(int pixelIndex, byte alphaIndex) => alphaBlock.SetComponentIndex(pixelIndex, alphaIndex); public readonly RawBlock4X4Rgba32 Decode() { @@ -190,8 +158,6 @@ public readonly RawBlock4X4Rgba32 Decode() var color0 = this.color0.ToColorRgb24(); var color1 = this.color1.ToColorRgb24(); - var a0 = Alpha0; - var a1 = Alpha1; Span colors = stackalloc ColorRgb24[] { color0, color1, @@ -199,32 +165,12 @@ public readonly RawBlock4X4Rgba32 Decode() color0.InterpolateThird(color1, 2) }; - var alphas = a0 > a1 ? stackalloc byte[] { - a0, - a1, - a0.InterpolateSeventh(a1, 1), - a0.InterpolateSeventh(a1, 2), - a0.InterpolateSeventh(a1, 3), - a0.InterpolateSeventh(a1, 4), - a0.InterpolateSeventh(a1, 5), - a0.InterpolateSeventh(a1, 6), - } : stackalloc byte[] { - a0, - a1, - a0.InterpolateFifth(a1, 1), - a0.InterpolateFifth(a1, 2), - a0.InterpolateFifth(a1, 3), - a0.InterpolateFifth(a1, 4), - 0, - 255 - }; - for (var i = 0; i < pixels.Length; i++) { var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); var color = colors[colorIndex]; - pixels[i] = new Rgba32(color.r, color.g, color.b, alphas[GetAlphaIndex(i)]); + pixels[i] = new Rgba32(color.r, color.g, color.b, alphaBlock.DecodeSingle(i)); } return output; } @@ -233,51 +179,48 @@ public readonly RawBlock4X4Rgba32 Decode() [StructLayout(LayoutKind.Sequential)] internal unsafe struct Bc4Block { - public ulong redBlock; + public ulong componentBlock; - public byte Red0 + public byte Endpoint0 { - readonly get => (byte)(redBlock & 0xFFUL); + readonly get => (byte)(componentBlock & 0xFFUL); set { - redBlock &= ~0xFFUL; - redBlock |= value; + componentBlock &= ~0xFFUL; + componentBlock |= value; } } - public byte Red1 + public byte Endpoint1 { - readonly get => (byte)((redBlock >> 8) & 0xFFUL); + readonly get => (byte)((componentBlock >> 8) & 0xFFUL); set { - redBlock &= ~0xFF00UL; - redBlock |= (ulong)value << 8; + componentBlock &= ~0xFF00UL; + componentBlock |= (ulong)value << 8; } } - public readonly byte GetRedIndex(int pixelIndex) + public readonly byte GetComponentIndex(int pixelIndex) { var mask = 0b0111UL << (pixelIndex * 3 + 16); var shift = pixelIndex * 3 + 16; - var redIndex = (redBlock & mask) >> shift; + var redIndex = (componentBlock & mask) >> shift; return (byte)redIndex; } - public void SetRedIndex(int pixelIndex, byte redIndex) + public void SetComponentIndex(int pixelIndex, byte redIndex) { var mask = 0b0111UL << (pixelIndex * 3 + 16); var shift = pixelIndex * 3 + 16; - redBlock &= ~mask; - redBlock |= (ulong)(redIndex & 0b111) << shift; + componentBlock &= ~mask; + componentBlock |= (ulong)(redIndex & 0b111) << shift; } - public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) + public readonly byte DecodeSingle(int pixelIndex) { - var output = new RawBlock4X4Rgba32(); - var pixels = output.AsSpan; - - var r0 = Red0; - var r1 = Red1; + var r0 = Endpoint0; + var r1 = Endpoint1; var reds = r0 > r1 ? stackalloc byte[] { r0, @@ -299,20 +242,68 @@ public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) 255 }; + return reds[GetComponentIndex(pixelIndex)]; + } + + public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance, Bc4Component component) + { + var output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var c0 = Endpoint0; + var c1 = Endpoint1; + + var components = c0 > c1 ? stackalloc byte[] { + c0, + c1, + c0.InterpolateSeventh(c1, 1), + c0.InterpolateSeventh(c1, 2), + c0.InterpolateSeventh(c1, 3), + c0.InterpolateSeventh(c1, 4), + c0.InterpolateSeventh(c1, 5), + c0.InterpolateSeventh(c1, 6), + } : stackalloc byte[] { + c0, + c1, + c0.InterpolateFifth(c1, 1), + c0.InterpolateFifth(c1, 2), + c0.InterpolateFifth(c1, 3), + c0.InterpolateFifth(c1, 4), + 0, + 255 + }; + if (redAsLuminance) { for (var i = 0; i < pixels.Length; i++) { - var index = GetRedIndex(i); - pixels[i] = new Rgba32(reds[index], reds[index], reds[index], 255); + var index = GetComponentIndex(i); + pixels[i] = new Rgba32(components[index], components[index], components[index], 255); } } else { for (var i = 0; i < pixels.Length; i++) { - var index = GetRedIndex(i); - pixels[i] = new Rgba32(reds[index], 0, 0, 255); + var index = GetComponentIndex(i); + switch (component) + { + case Bc4Component.R: + pixels[i] = new Rgba32(components[index], 0, 0, 255); + break; + + case Bc4Component.G: + pixels[i] = new Rgba32(0, components[index], 0, 255); + break; + + case Bc4Component.B: + pixels[i] = new Rgba32(0, 0, components[index], 255); + break; + + case Bc4Component.A: + pixels[i] = new Rgba32(0, 0, 0, components[index]); + break; + } } } @@ -460,4 +451,109 @@ public readonly RawBlock4X4Rgba32 Decode() } } + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct AtcBlock + { + public ColorRgb555 color0; + public ColorRgb565 color1; + public uint colorIndices; + + public int this[int index] + { + readonly get => (int)(colorIndices >> (index * 2)) & 0b11; + set + { + colorIndices = (uint)(colorIndices & ~(0b11 << (index * 2))); + var val = value & 0b11; + colorIndices = colorIndices | ((uint)val << (index * 2)); + } + } + + public readonly RawBlock4X4Rgba32 Decode() + { + var output = new RawBlock4X4Rgba32(); + var pixels = output.AsSpan; + + var color0 = this.color0.ToColorRgb24(); + var color1 = this.color1.ToColorRgb24(); + + Span colors = stackalloc ColorRgb24[] { + new ColorRgb24(0, 0, 0), + color0.InterpolateFourthAtc(color1, 1), + color0, + color1 + }; + + for (var i = 0; i < pixels.Length; i++) + { + var colorIndex = this[i]; + + var color = this.color0.Mode == 0 ? color0.InterpolateThird(color1, colorIndex) : colors[colorIndex]; + + pixels[i] = new Rgba32(color.r, color.g, color.b, 255); + } + return output; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal struct Bc2AlphaBlock + { + public ulong alphas; + + public readonly byte GetAlpha(int index) + { + var mask = 0xFUL << (index * 4); + var shift = index * 4; + var alphaUnscaled = (alphas & mask) >> shift; + return (byte)(alphaUnscaled * 17); + } + + public void SetAlpha(int index, byte alpha) + { + var mask = 0xFUL << (index * 4); + var shift = index * 4; + alphas &= ~mask; + var a = (byte)(alpha / 17); + alphas |= (ulong)(a & 0xF) << shift; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal struct AtcExplicitAlphaBlock + { + public Bc2AlphaBlock alphas; + public AtcBlock colors; + + public readonly RawBlock4X4Rgba32 Decode() + { + var output = colors.Decode(); + var pixels = output.AsSpan; + + for (var i = 0; i < pixels.Length; i++) + { + pixels[i].A = alphas.GetAlpha(i); + } + return output; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal struct AtcInterpolatedAlphaBlock + { + public Bc4Block alphas; + public AtcBlock colors; + + public readonly RawBlock4X4Rgba32 Decode() + { + var output = colors.Decode(); + var pixels = output.AsSpan; + + for (var i = 0; i < pixels.Length; i++) + { + pixels[i].A = (byte)alphas.DecodeSingle(i); + } + return output; + } + } } diff --git a/BCnEnc.Net/Shared/GLFormat.cs b/BCnEnc.Net/Shared/GLFormat.cs index 3c02c11..9a4cc41 100644 --- a/BCnEnc.Net/Shared/GLFormat.cs +++ b/BCnEnc.Net/Shared/GLFormat.cs @@ -1,4 +1,4 @@ -namespace BCnEncoder.Shared +namespace BCnEncoder.Shared { public enum GlFormat : uint { @@ -143,6 +143,9 @@ public enum GlInternalFormat : uint GlCompressedRgbaBptcUnormArb = 36492, GlCompressedSrgbAlphaBptcUnormArb = 36493, + GlCompressedRgbAtc = 0x8C92, + GlCompressedRgbaAtcExplicitAlpha = 0x8C93, + GlCompressedRgbaAtcInterpolatedAlpha = 0x87EE, // ETC1 & 2 GlEtc1Rgb8Oes = 0x8D64, diff --git a/BCnEnc.Net/Shared/Interpolation.cs b/BCnEnc.Net/Shared/Interpolation.cs index 364988a..8f09723 100644 --- a/BCnEnc.Net/Shared/Interpolation.cs +++ b/BCnEnc.Net/Shared/Interpolation.cs @@ -21,6 +21,16 @@ public static ColorRgb24 InterpolateHalf(this ColorRgb24 c0, ColorRgb24 c1) => public static ColorRgb24 InterpolateThird(this ColorRgb24 c0, ColorRgb24 c1, int num) => InterpolateColor(c0, c1, num, 3); + /// + /// Interpolates two colors by fourth with ATC interpolation. + /// + /// The first color endpoint. + /// The second color endpoint. + /// The dividend in the fourth. + /// The interpolated color. + public static ColorRgb24 InterpolateFourthAtc(this ColorRgb24 c0, ColorRgb24 c1, int num) => + InterpolateColorAtc(c0, c1, num, 4); + /// /// Interpolates two colors by fifth. /// @@ -54,6 +64,19 @@ public static byte InterpolateSeventh(this byte a0, byte a1, int num) => (byte)Interpolate(c0.g, c1.g, num, den), (byte)Interpolate(c0.b, c1.b, num, den)); + /// + /// Interpolates two colors with the ATC interpolation. + /// + /// The first color. + /// The second color. + /// The dividend on each color component. + /// The divisor on each color component. + /// The interpolated color. + private static ColorRgb24 InterpolateColorAtc(ColorRgb24 c0, ColorRgb24 c1, int num, int den) => new ColorRgb24( + (byte)InterpolateAtc(c0.r, c1.r, num, den), + (byte)InterpolateAtc(c0.g, c1.g, num, den), + (byte)InterpolateAtc(c0.b, c1.b, num, den)); + /// /// Interpolates two components. /// @@ -65,5 +88,16 @@ public static byte InterpolateSeventh(this byte a0, byte a1, int num) => /// The interpolated component. private static int Interpolate(int a, int b, int num, int den, int correction = 0) => (int)(((den - num) * a + num * b + correction) / (float)den); + + /// + /// Interpolates two components with the ATC interpolation. + /// + /// The first component. + /// The second component. + /// The dividend. + /// The divisor. + /// The interpolated component. + private static int InterpolateAtc(int a, int b, int num, int den) => + (int)(a - num / (float)den * b); } } diff --git a/BCnEncTests/AtcTests.cs b/BCnEncTests/AtcTests.cs new file mode 100644 index 0000000..8d747bd --- /dev/null +++ b/BCnEncTests/AtcTests.cs @@ -0,0 +1,59 @@ +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using BCnEncTests.Support; +using Xunit; + +namespace BCnEncTests +{ + public class AtcTests + { + [Fact] + public void AtcDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.Atc); + var original = ImageLoader.TestLenna; + + // Act + var ktx = encoder.EncodeToKtx(original); + var image = decoder.Decode(ktx); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } + + [Fact] + public void AtcExplicitDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.AtcExplicitAlpha); + var original = ImageLoader.TestAlphaGradient1; + + // Act + var ktx = encoder.EncodeToKtx(original); + var image = decoder.Decode(ktx); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } + + [Fact] + public void AtcInterpolatedDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.AtcInterpolatedAlpha); + var original = ImageLoader.TestAlphaGradient1; + + // Act + var ktx = encoder.EncodeToKtx(original); + var image = decoder.Decode(ktx); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } + } +} From 87e0f444191da6cc86ebfede43604b4d039dc1a4 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Sun, 17 Jan 2021 23:47:09 +0100 Subject: [PATCH 034/116] Use Interpolation class in BcEncoders; Update dwPixelFormat correctly on encoding for ATC, BC4, and BC5; Use BC4Blocks in BC5Block; --- BCnEnc.Net/BCnEncoder.csproj | 2 +- BCnEnc.Net/Encoder/Bc1BlockEncoder.cs | 82 ++++--- BCnEnc.Net/Encoder/Bc2BlockEncoder.cs | 42 ++-- BCnEnc.Net/Encoder/Bc3BlockEncoder.cs | 109 ++++++---- BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 26 ++- BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 297 ++------------------------ BCnEnc.Net/Shared/DdsFile.cs | 123 +++++++---- BCnEnc.Net/Shared/EncodedBlocks.cs | 72 ++----- 8 files changed, 274 insertions(+), 479 deletions(-) diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index 7c94018..0aedac5 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -1,7 +1,7 @@ - netcoreapp31 + netstandard2.1 true true diff --git a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs index 94fe640..b736da7 100644 --- a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs @@ -54,13 +54,13 @@ private static Bc1Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 stackalloc ColorRgb24[] { c0, c1, - c0 * (1.0 / 2.0) + c1 * (1.0 / 2.0), + c0.InterpolateHalf(c1), new ColorRgb24(0, 0, 0) } : stackalloc ColorRgb24[] { c0, c1, - c0 * (2.0 / 3.0) + c1 * (1.0 / 3.0), - c0 * (1.0 / 3.0) + c1 * (2.0 / 3.0) + c0.InterpolateThird(c1, 1), + c0.InterpolateThird(c1, 2) }; error = 0; @@ -99,7 +99,8 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } } - private static class Bc1BlockEncoderBalanced { + private static class Bc1BlockEncoderBalanced + { private const int MaxTries = 24 * 2; private const float ErrorThreshold = 0.05f; @@ -121,19 +122,20 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } var best = TryColors(rawBlock, c0, c1, out var bestError); - - for (var i = 0; i < MaxTries; i++) { + + for (var i = 0; i < MaxTries; i++) + { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); - + if (newC0.data < newC1.data) { var c = newC0; newC0 = newC1; newC1 = c; } - + var block = TryColors(rawBlock, newC0, newC1, out var error); - + if (error < bestError) { best = block; @@ -142,7 +144,8 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < ErrorThreshold) { + if (bestError < ErrorThreshold) + { break; } } @@ -177,16 +180,17 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var lastChanged = 0; - for (var i = 0; i < MaxTries; i++) { + for (var i = 0; i < MaxTries; i++) + { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); - + if (newC0.data < newC1.data) { var c = newC0; newC0 = newC1; newC1 = c; } - + var block = TryColors(rawBlock, newC0, newC1, out var error); lastChanged++; @@ -200,7 +204,8 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) + { break; } } @@ -245,6 +250,8 @@ public override DxgiFormat GetDxgiFormat() return DxgiFormat.DxgiFormatBc1Unorm; } + #region Encoding private stuff + private static Bc1Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0, ColorRgb565 color1, out float error, float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f) { var output = new Bc1Block(); @@ -263,13 +270,13 @@ private static Bc1Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 stackalloc ColorRgb24[] { c0, c1, - c0 * (1.0 / 2.0) + c1 * (1.0 / 2.0), + c0.InterpolateHalf(c1), new ColorRgb24(0, 0, 0) } : stackalloc ColorRgb24[] { c0, c1, - c0 * (2.0 / 3.0) + c1 * (1.0 / 3.0), - c0 * (1.0 / 3.0) + c1 * (2.0 / 3.0) + c0.InterpolateThird(c1, 1), + c0.InterpolateThird(c1, 2) }; error = 0; @@ -284,6 +291,7 @@ stackalloc ColorRgb24[] { return output; } + #endregion #region Encoders @@ -339,30 +347,35 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var c = c0; c0 = c1; c1 = c; - }else if (hasAlpha && c1.data < c0.data) { + } + else if (hasAlpha && c1.data < c0.data) + { var c = c0; c0 = c1; c1 = c; } var best = TryColors(rawBlock, c0, c1, out var bestError); - - for (var i = 0; i < MaxTries; i++) { + + for (var i = 0; i < MaxTries; i++) + { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); - + if (!hasAlpha && newC0.data < newC1.data) { var c = newC0; newC0 = newC1; newC1 = c; - }else if (hasAlpha && newC1.data < newC0.data) { + } + else if (hasAlpha && newC1.data < newC0.data) + { var c = newC0; newC0 = newC1; newC1 = c; } - + var block = TryColors(rawBlock, newC0, newC1, out var error); - + if (error < bestError) { best = block; @@ -371,7 +384,8 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < ErrorThreshold) { + if (bestError < ErrorThreshold) + { break; } } @@ -402,7 +416,9 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var c = c0; c0 = c1; c1 = c; - }else if (hasAlpha && c1.data < c0.data) { + } + else if (hasAlpha && c1.data < c0.data) + { var c = c0; c0 = c1; c1 = c; @@ -411,20 +427,23 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var best = TryColors(rawBlock, c0, c1, out var bestError); var lastChanged = 0; - for (var i = 0; i < MaxTries; i++) { + for (var i = 0; i < MaxTries; i++) + { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); - + if (!hasAlpha && newC0.data < newC1.data) { var c = newC0; newC0 = newC1; newC1 = c; - }else if (hasAlpha && newC1.data < newC0.data) { + } + else if (hasAlpha && newC1.data < newC0.data) + { var c = newC0; newC0 = newC1; newC1 = c; } - + var block = TryColors(rawBlock, newC0, newC1, out var error); lastChanged++; @@ -438,7 +457,8 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) + { break; } } diff --git a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs index 6457c1a..af76a12 100644 --- a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs @@ -34,7 +34,8 @@ public override GlFormat GetBaseInternalFormat() return GlFormat.GlRgba; } - public override DxgiFormat GetDxgiFormat() { + public override DxgiFormat GetDxgiFormat() + { return DxgiFormat.DxgiFormatBc2Unorm; } @@ -53,11 +54,11 @@ private static Bc2Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 var c1 = color1.ToColorRgb24(); ReadOnlySpan colors = stackalloc ColorRgb24[] { - c0, - c1, - c0 * (2.0 / 3.0) + c1 * (1.0 / 3.0), - c0 * (1.0 / 3.0) + c1 * (2.0 / 3.0) - }; + c0, + c1, + c0.InterpolateThird(c1, 1), + c0.InterpolateThird(c1, 2) + }; error = 0; for (var i = 0; i < 16; i++) @@ -85,7 +86,7 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) PcaVectors.Create(pixels, out var mean, out var principalAxis); PcaVectors.GetMinMaxColor565(pixels, mean, principalAxis, out var min, out var max); - + var c0 = max; var c1 = min; @@ -95,7 +96,8 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } } - private static class Bc2BlockEncoderBalanced { + private static class Bc2BlockEncoderBalanced + { private const int MaxTries = 24 * 2; private const float ErrorThreshold = 0.05f; @@ -110,12 +112,13 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var c1 = min; var best = TryColors(rawBlock, c0, c1, out var bestError); - - for (var i = 0; i < MaxTries; i++) { + + for (var i = 0; i < MaxTries; i++) + { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); - + var block = TryColors(rawBlock, newC0, newC1, out var error); - + if (error < bestError) { best = block; @@ -124,7 +127,8 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < ErrorThreshold) { + if (bestError < ErrorThreshold) + { break; } } @@ -160,16 +164,17 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var lastChanged = 0; - for (var i = 0; i < MaxTries; i++) { + for (var i = 0; i < MaxTries; i++) + { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); - + if (newC0.data < newC1.data) { var c = newC0; newC0 = newC1; newC1 = c; } - + var block = TryColors(rawBlock, newC0, newC1, out var error); lastChanged++; @@ -183,7 +188,8 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) + { break; } } @@ -191,7 +197,7 @@ internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) return best; } } - + #endregion } } diff --git a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs index fa1a257..02bd858 100644 --- a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs @@ -34,7 +34,8 @@ public override GlFormat GetBaseInternalFormat() return GlFormat.GlRgba; } - public override DxgiFormat GetDxgiFormat() { + public override DxgiFormat GetDxgiFormat() + { return DxgiFormat.DxgiFormatBc3Unorm; } @@ -55,8 +56,8 @@ private static Bc3Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 ReadOnlySpan colors = stackalloc ColorRgb24[] { c0, c1, - c0 * (2.0 / 3.0) + c1 * (1.0 / 3.0), - c0 * (1.0 / 3.0) + c1 * (2.0 / 3.0) + c0.InterpolateThird(c1, 1), + c0.InterpolateThird(c1, 2) }; error = 0; @@ -70,54 +71,62 @@ private static Bc3Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 return output; } - private static Bc3Block FindAlphaValues(Bc3Block colorBlock, RawBlock4X4Rgba32 rawBlock, int variations) { + private static Bc3Block FindAlphaValues(Bc3Block colorBlock, RawBlock4X4Rgba32 rawBlock, int variations) + { var pixels = rawBlock.AsSpan; //Find min and max alpha byte minAlpha = 255; byte maxAlpha = 0; var hasExtremeValues = false; - for (var i = 0; i < pixels.Length; i++) { - if (pixels[i].A < 255 && pixels[i].A > 0) { + for (var i = 0; i < pixels.Length; i++) + { + if (pixels[i].A < 255 && pixels[i].A > 0) + { if (pixels[i].A < minAlpha) minAlpha = pixels[i].A; if (pixels[i].A > maxAlpha) maxAlpha = pixels[i].A; } - else { + else + { hasExtremeValues = true; } } - int SelectAlphaIndices(ref Bc3Block block) { + int SelectAlphaIndices(ref Bc3Block block) + { var cumulativeError = 0; var a0 = block.Alpha0; var a1 = block.Alpha1; var alphas = a0 > a1 ? stackalloc byte[] { a0, a1, - (byte) (6/7.0 * a0 + 1/7.0 * a1), - (byte) (5/7.0 * a0 + 2/7.0 * a1), - (byte) (4/7.0 * a0 + 3/7.0 * a1), - (byte) (3/7.0 * a0 + 4/7.0 * a1), - (byte) (2/7.0 * a0 + 5/7.0 * a1), - (byte) (1/7.0 * a0 + 6/7.0 * a1), + a0.InterpolateSeventh(a1, 1), + a0.InterpolateSeventh(a1, 2), + a0.InterpolateSeventh(a1, 3), + a0.InterpolateSeventh(a1, 4), + a0.InterpolateSeventh(a1, 5), + a0.InterpolateSeventh(a1, 6) } : stackalloc byte[] { a0, a1, - (byte) (4/5.0 * a0 + 1/5.0 * a1), - (byte) (3/5.0 * a0 + 2/5.0 * a1), - (byte) (2/5.0 * a0 + 3/5.0 * a1), - (byte) (1/5.0 * a0 + 4/5.0 * a1), + a0.InterpolateFifth(a1, 1), + a0.InterpolateFifth(a1, 2), + a0.InterpolateFifth(a1, 3), + a0.InterpolateFifth(a1, 4), 0, 255 }; var pixels = rawBlock.AsSpan; - for (var i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) + { byte bestIndex = 0; var bestError = Math.Abs(pixels[i].A - alphas[0]); - for (byte j = 1; j < alphas.Length; j++) { + for (byte j = 1; j < alphas.Length; j++) + { var error = Math.Abs(pixels[i].A - alphas[j]); - if (error < bestError) { + if (error < bestError) + { bestIndex = j; bestError = error; } @@ -131,7 +140,8 @@ int SelectAlphaIndices(ref Bc3Block block) { } //everything is either fully opaque or fully transparent - if (hasExtremeValues && minAlpha == 255 && maxAlpha == 0) { + if (hasExtremeValues && minAlpha == 255 && maxAlpha == 0) + { colorBlock.Alpha0 = 0; colorBlock.Alpha1 = 255; var error = SelectAlphaIndices(ref colorBlock); @@ -143,10 +153,12 @@ int SelectAlphaIndices(ref Bc3Block block) { best.Alpha0 = maxAlpha; best.Alpha1 = minAlpha; var bestError = SelectAlphaIndices(ref best); - if (bestError == 0) { + if (bestError == 0) + { return best; } - for (byte i = 1; i < variations; i++) { + for (byte i = 1; i < variations; i++) + { { var a0 = ByteHelper.ClampToByte(maxAlpha - i * 2); var a1 = ByteHelper.ClampToByte(minAlpha + i * 2); @@ -154,7 +166,8 @@ int SelectAlphaIndices(ref Bc3Block block) { block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; var error = SelectAlphaIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; } @@ -166,7 +179,8 @@ int SelectAlphaIndices(ref Bc3Block block) { block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; var error = SelectAlphaIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; } @@ -178,7 +192,8 @@ int SelectAlphaIndices(ref Bc3Block block) { block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; var error = SelectAlphaIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; } @@ -190,7 +205,8 @@ int SelectAlphaIndices(ref Bc3Block block) { block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; var error = SelectAlphaIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; } @@ -202,7 +218,8 @@ int SelectAlphaIndices(ref Bc3Block block) { block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; var error = SelectAlphaIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; } @@ -214,21 +231,22 @@ int SelectAlphaIndices(ref Bc3Block block) { block.Alpha0 = hasExtremeValues ? a1 : a0; block.Alpha1 = hasExtremeValues ? a0 : a1; var error = SelectAlphaIndices(ref block); - if (error < bestError) { + if (error < bestError) + { best = block; bestError = error; } } - if (bestError < 10) { + if (bestError < 10) + { break; } } - + return best; } - #endregion #region Encoders @@ -260,7 +278,8 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } } - private static class Bc3BlockEncoderBalanced { + private static class Bc3BlockEncoderBalanced + { private const int MaxTries = 24 * 2; private const float ErrorThreshold = 0.05f; @@ -275,12 +294,13 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var c1 = min; var best = TryColors(rawBlock, c0, c1, out var bestError); - - for (var i = 0; i < MaxTries; i++) { + + for (var i = 0; i < MaxTries; i++) + { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); - + var block = TryColors(rawBlock, newC0, newC1, out var error); - + if (error < bestError) { best = block; @@ -289,7 +309,8 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = newC1; } - if (bestError < ErrorThreshold) { + if (bestError < ErrorThreshold) + { break; } } @@ -325,16 +346,17 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) var lastChanged = 0; - for (var i = 0; i < MaxTries; i++) { + for (var i = 0; i < MaxTries; i++) + { var (newC0, newC1) = ColorVariationGenerator.Variate565(c0, c1, i); - + if (newC0.data < newC1.data) { var c = newC0; newC0 = newC1; newC1 = c; } - + var block = TryColors(rawBlock, newC0, newC1, out var error); lastChanged++; @@ -348,7 +370,8 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) lastChanged = 0; } - if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) { + if (bestError < ErrorThreshold || lastChanged > ColorVariationGenerator.VarPatternCount) + { break; } } diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index 3e0ec81..a0b60d7 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -113,24 +113,22 @@ int SelectIndices(ref Bc4Block block) var cumulativeError = 0; var c0 = block.Endpoint0; var c1 = block.Endpoint1; - var colors = c0 > c1 - ? stackalloc byte[] { + var colors = c0 > c1 ? stackalloc byte[] { c0, c1, - (byte)(6 / 7.0 * c0 + 1 / 7.0 * c1), - (byte)(5 / 7.0 * c0 + 2 / 7.0 * c1), - (byte)(4 / 7.0 * c0 + 3 / 7.0 * c1), - (byte)(3 / 7.0 * c0 + 4 / 7.0 * c1), - (byte)(2 / 7.0 * c0 + 5 / 7.0 * c1), - (byte)(1 / 7.0 * c0 + 6 / 7.0 * c1), - } - : stackalloc byte[] { + c0.InterpolateSeventh(c1, 1), + c0.InterpolateSeventh(c1, 2), + c0.InterpolateSeventh(c1, 3), + c0.InterpolateSeventh(c1, 4), + c0.InterpolateSeventh(c1, 5), + c0.InterpolateSeventh(c1, 6) + } : stackalloc byte[] { c0, c1, - (byte)(4 / 5.0 * c0 + 1 / 5.0 * c1), - (byte)(3 / 5.0 * c0 + 2 / 5.0 * c1), - (byte)(2 / 5.0 * c0 + 3 / 5.0 * c1), - (byte)(1 / 5.0 * c0 + 4 / 5.0 * c1), + c0.InterpolateFifth(c1, 1), + c0.InterpolateFifth(c1, 2), + c0.InterpolateFifth(c1, 3), + c0.InterpolateFifth(c1, 4), 0, 255 }; diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index 614996e..c440339 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -1,297 +1,40 @@ -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Threading.Tasks; using BCnEncoder.Shared; namespace BCnEncoder.Encoder { internal class Bc5BlockEncoder : BaseBcBlockEncoder { - public override Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { - var output = new Bc5Block(); - var reds = new byte[16]; - var greens = new byte[16]; - var pixels = block.AsSpan; - for (var i = 0; i < 16; i++) { - reds[i] = pixels[i].R; - greens[i] = pixels[i].G; - } - - var variations = 0; - var errorThreshold = 0; - switch (quality) { - case CompressionQuality.Fast: - variations = 3; - errorThreshold = 5; - break; - case CompressionQuality.Balanced: - variations = 5; - errorThreshold = 1; - break; - case CompressionQuality.BestQuality: - variations = 8; - errorThreshold = 0; - break; - default: - throw new ArgumentOutOfRangeException(nameof(quality), quality, null); - } + private readonly Bc4BlockEncoder redBlockEncoder; + private readonly Bc4BlockEncoder greenBlockEncoder; + public Bc5BlockEncoder() + { + redBlockEncoder = new Bc4BlockEncoder(false, Bc4Component.R); + greenBlockEncoder = new Bc4BlockEncoder(false, Bc4Component.G); + } - output = FindValues(output, reds, variations, errorThreshold, - (block, i, idx) => { - block.SetRedIndex(i, idx); - return block; - }, - (block, col) => { - block.Red0 = col; - return block; - }, - (block, col) => { - block.Red1 = col; - return block; - }, - (block) => { - return block.Red0; - }, - (block) => { - return block.Red1; - } - ); - output = FindValues(output, greens, variations, errorThreshold, - (block, i, idx) => { - block.SetGreenIndex(i, idx); - return block; - }, - (block, col) => { - block.Green0 = col; - return block; - }, - (block, col) => { - block.Green1 = col; - return block; - }, - (block) => { - return block.Green0; - }, - (block) => { - return block.Green1; - }); - return output; + public override Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + { + return new Bc5Block + { + redBlock = redBlockEncoder.EncodeBlock(block, quality), + greenBlock = greenBlockEncoder.EncodeBlock(block, quality) + }; ; } - public override GlInternalFormat GetInternalFormat() { + public override GlInternalFormat GetInternalFormat() + { return GlInternalFormat.GlCompressedRedGreenRgtc2Ext; } - public override GlFormat GetBaseInternalFormat() { + public override GlFormat GetBaseInternalFormat() + { return GlFormat.GlRg; } - public override DxgiFormat GetDxgiFormat() { + public override DxgiFormat GetDxgiFormat() + { return DxgiFormat.DxgiFormatBc5Unorm; } - - #region Encoding private stuff - - private static Bc5Block FindValues(Bc5Block colorBlock, byte[] pixels, int variations, int errorThreshold, - Func indexSetter, - Func col0Setter, - Func col1Setter, - Func col0Getter, - Func col1Getter) { - - //Find min and max alpha - byte min = 255; - byte max = 0; - var hasExtremeValues = false; - for (var i = 0; i < pixels.Length; i++) { - if (pixels[i] < 255 && pixels[i] > 0) { - if (pixels[i] < min) min = pixels[i]; - if (pixels[i] > max) max = pixels[i]; - } - else { - hasExtremeValues = true; - } - } - - - int SelectIndices(ref Bc5Block block) { - var cumulativeError = 0; - //var c0 = block.Endpoint0; - //var c1 = block.Endpoint1; - var c0 = col0Getter(block); - var c1 = col1Getter(block); - var colors = c0 > c1 - ? stackalloc byte[] { - c0, - c1, - (byte) (6 / 7.0 * c0 + 1 / 7.0 * c1), - (byte) (5 / 7.0 * c0 + 2 / 7.0 * c1), - (byte) (4 / 7.0 * c0 + 3 / 7.0 * c1), - (byte) (3 / 7.0 * c0 + 4 / 7.0 * c1), - (byte) (2 / 7.0 * c0 + 5 / 7.0 * c1), - (byte) (1 / 7.0 * c0 + 6 / 7.0 * c1), - } - : stackalloc byte[] { - c0, - c1, - (byte) (4 / 5.0 * c0 + 1 / 5.0 * c1), - (byte) (3 / 5.0 * c0 + 2 / 5.0 * c1), - (byte) (2 / 5.0 * c0 + 3 / 5.0 * c1), - (byte) (1 / 5.0 * c0 + 4 / 5.0 * c1), - 0, - 255 - }; - for (var i = 0; i < pixels.Length; i++) { - byte bestIndex = 0; - var bestError = Math.Abs(pixels[i] - colors[0]); - for (byte j = 1; j < colors.Length; j++) { - var error = Math.Abs(pixels[i] - colors[j]); - if (error < bestError) { - bestIndex = j; - bestError = error; - } - - if (bestError == 0) break; - } - - block = indexSetter(block, i, bestIndex); - //block.SetComponentIndex(i, bestIndex); - cumulativeError += bestError * bestError; - } - - return cumulativeError; - } - - //everything is either fully black or fully red - if (hasExtremeValues && min == 255 && max == 0) { - //colorBlock.Endpoint0 = 0; - //colorBlock.Endpoint1 = 255; - colorBlock = col0Setter(colorBlock, 0); - colorBlock = col1Setter(colorBlock, 255); - var error = SelectIndices(ref colorBlock); - Debug.Assert(0 == error); - return colorBlock; - } - - var best = colorBlock; - //best.Endpoint0 = max; - //best.Endpoint1 = min; - best = col0Setter(best, max); - best = col1Setter(best, min); - var bestError = SelectIndices(ref best); - if (bestError == 0) { - return best; - } - - for (var i = (byte)variations; i > 0; i--) { - { - var c0 = ByteHelper.ClampToByte(max - i); - var c1 = ByteHelper.ClampToByte(min + i); - var block = colorBlock; - //block.Endpoint0 = hasExtremeValues ? c1 : c0; - //block.Endpoint1 = hasExtremeValues ? c0 : c1; - block = col0Setter(block, hasExtremeValues ? c1 : c0); - block = col1Setter(block, hasExtremeValues ? c0 : c1); - var error = SelectIndices(ref block); - if (error < bestError) { - best = block; - bestError = error; - max = c0; - min = c1; - } - } - { - var c0 = ByteHelper.ClampToByte(max + i); - var c1 = ByteHelper.ClampToByte(min - i); - var block = colorBlock; - //block.Endpoint0 = hasExtremeValues ? c1 : c0; - //block.Endpoint1 = hasExtremeValues ? c0 : c1; - block = col0Setter(block, hasExtremeValues ? c1 : c0); - block = col1Setter(block, hasExtremeValues ? c0 : c1); - var error = SelectIndices(ref block); - if (error < bestError) { - best = block; - bestError = error; - max = c0; - min = c1; - } - } - { - var c0 = ByteHelper.ClampToByte(max); - var c1 = ByteHelper.ClampToByte(min - i); - var block = colorBlock; - //block.Endpoint0 = hasExtremeValues ? c1 : c0; - //block.Endpoint1 = hasExtremeValues ? c0 : c1; - block = col0Setter(block, hasExtremeValues ? c1 : c0); - block = col1Setter(block, hasExtremeValues ? c0 : c1); - var error = SelectIndices(ref block); - if (error < bestError) { - best = block; - bestError = error; - max = c0; - min = c1; - } - } - { - var c0 = ByteHelper.ClampToByte(max + i); - var c1 = ByteHelper.ClampToByte(min); - var block = colorBlock; - //block.Endpoint0 = hasExtremeValues ? c1 : c0; - //block.Endpoint1 = hasExtremeValues ? c0 : c1; - block = col0Setter(block, hasExtremeValues ? c1 : c0); - block = col1Setter(block, hasExtremeValues ? c0 : c1); - var error = SelectIndices(ref block); - if (error < bestError) { - best = block; - bestError = error; - max = c0; - min = c1; - } - } - { - var c0 = ByteHelper.ClampToByte(max); - var c1 = ByteHelper.ClampToByte(min + i); - var block = colorBlock; - //block.Endpoint0 = hasExtremeValues ? c1 : c0; - //block.Endpoint1 = hasExtremeValues ? c0 : c1; - block = col0Setter(block, hasExtremeValues ? c1 : c0); - block = col1Setter(block, hasExtremeValues ? c0 : c1); - var error = SelectIndices(ref block); - if (error < bestError) { - best = block; - bestError = error; - max = c0; - min = c1; - } - } - { - var c0 = ByteHelper.ClampToByte(max - i); - var c1 = ByteHelper.ClampToByte(min); - var block = colorBlock; - //block.Endpoint0 = hasExtremeValues ? c1 : c0; - //block.Endpoint1 = hasExtremeValues ? c0 : c1; - block = col0Setter(block, hasExtremeValues ? c1 : c0); - block = col1Setter(block, hasExtremeValues ? c0 : c1); - var error = SelectIndices(ref block); - if (error < bestError) { - best = block; - bestError = error; - max = c0; - min = c1; - } - } - - if (bestError <= errorThreshold) { - break; - } - } - - return best; - } - - - #endregion } } diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index 9d29622..1cdc19c 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -231,44 +231,91 @@ public static (DdsHeader, DdsHeaderDxt10) InitializeCompressed(int width, int he header.dwMipMapCount = 1; header.dwCaps = HeaderCaps.DdscapsTexture; - if (format == DxgiFormat.DxgiFormatBc1Unorm) - { - header.ddsPixelFormat = new DdsPixelFormat() - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Dxt1 - }; - } - else if (format == DxgiFormat.DxgiFormatBc2Unorm) - { - header.ddsPixelFormat = new DdsPixelFormat() - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Dxt3 - }; - } - else if (format == DxgiFormat.DxgiFormatBc3Unorm) - { - header.ddsPixelFormat = new DdsPixelFormat() - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Dxt5 - }; - } - else + switch (format) { - header.ddsPixelFormat = new DdsPixelFormat() - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Dx10 - }; - dxt10Header.arraySize = 1; - dxt10Header.dxgiFormat = format; - dxt10Header.resourceDimension = D3D10ResourceDimension.D3D10ResourceDimensionTexture2D; + case DxgiFormat.DxgiFormatBc1Unorm: + header.ddsPixelFormat=new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dxt1 + }; + break; + + case DxgiFormat.DxgiFormatBc2Unorm: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dxt3 + }; + break; + + case DxgiFormat.DxgiFormatBc3Unorm: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dxt5 + }; + break; + + case DxgiFormat.DxgiFormatBc4Unorm: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Ati1 + }; + break; + + case DxgiFormat.DxgiFormatBc5Unorm: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Ati2 + }; + break; + + case DxgiFormat.DxgiFormatAtc: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Atc + }; + break; + + case DxgiFormat.DxgiFormatAtcExplicitAlpha: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Atci + }; + break; + + case DxgiFormat.DxgiFormatAtcInterpolatedAlpha: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Atca + }; + break; + + default: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dx10 + }; + dxt10Header.arraySize = 1; + dxt10Header.dxgiFormat = format; + dxt10Header.resourceDimension = D3D10ResourceDimension.D3D10ResourceDimensionTexture2D; + break; } return (header, dxt10Header); @@ -758,7 +805,7 @@ public enum DxgiFormat : uint DxgiFormatForceUint, // Added here due to missing documentation of an official value - DxgiFormatAtc, + DxgiFormatAtc = 300, DxgiFormatAtcExplicitAlpha, DxgiFormatAtcInterpolatedAlpha }; diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index 6a8f54f..8b4a7cb 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -314,80 +314,40 @@ public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance, Bc4Component compo [StructLayout(LayoutKind.Sequential)] internal unsafe struct Bc5Block { - public ulong redBlock; - public ulong greenBlock; + public Bc4Block redBlock; + public Bc4Block greenBlock; public byte Red0 { - readonly get => (byte)(redBlock & 0xFFUL); - set - { - redBlock &= ~0xFFUL; - redBlock |= value; - } + readonly get => redBlock.Endpoint0; + set => redBlock.Endpoint0 = value; } public byte Red1 { - readonly get => (byte)((redBlock >> 8) & 0xFFUL); - set - { - redBlock &= ~0xFF00UL; - redBlock |= (ulong)value << 8; - } + readonly get => redBlock.Endpoint1; + set => redBlock.Endpoint1 = value; } public byte Green0 { - readonly get => (byte)(greenBlock & 0xFFUL); - set - { - greenBlock &= ~0xFFUL; - greenBlock |= value; - } + readonly get => greenBlock.Endpoint0; + set => greenBlock.Endpoint0 = value; } public byte Green1 { - readonly get => (byte)((greenBlock >> 8) & 0xFFUL); - set - { - greenBlock &= ~0xFF00UL; - greenBlock |= (ulong)value << 8; - } + readonly get => greenBlock.Endpoint1; + set => greenBlock.Endpoint1 = value; } - public readonly byte GetRedIndex(int pixelIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - var redIndex = (redBlock & mask) >> shift; - return (byte)redIndex; - } + public readonly byte GetRedIndex(int pixelIndex) => redBlock.GetComponentIndex(pixelIndex); - public void SetRedIndex(int pixelIndex, byte redIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - redBlock &= ~mask; - redBlock |= (ulong)(redIndex & 0b111) << shift; - } + public void SetRedIndex(int pixelIndex, byte redIndex) => redBlock.SetComponentIndex(pixelIndex, redIndex); - public readonly byte GetGreenIndex(int pixelIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - var greenIndex = (greenBlock & mask) >> shift; - return (byte)greenIndex; - } + public readonly byte GetGreenIndex(int pixelIndex) => greenBlock.GetComponentIndex(pixelIndex); - public void SetGreenIndex(int pixelIndex, byte greenIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - greenBlock &= ~mask; - greenBlock |= (ulong)(greenIndex & 0b111) << shift; - } + public void SetGreenIndex(int pixelIndex, byte greenIndex) => greenBlock.SetComponentIndex(pixelIndex, greenIndex); public readonly RawBlock4X4Rgba32 Decode() { @@ -442,9 +402,7 @@ public readonly RawBlock4X4Rgba32 Decode() for (var i = 0; i < pixels.Length; i++) { - var redIndex = GetRedIndex(i); - var greenIndex = GetGreenIndex(i); - pixels[i] = new Rgba32(reds[redIndex], greens[greenIndex], 0, 255); + pixels[i] = new Rgba32(redBlock.DecodeSingle(i), greenBlock.DecodeSingle(i), 0, 255); } return output; From 4a360d7e0432aa07f7386b3497296b28017dd7a0 Mon Sep 17 00:00:00 2001 From: Petar Tasev Date: Sun, 17 Jan 2021 15:15:21 -0800 Subject: [PATCH 035/116] Fixed detection of B8G8R8 based formats. --- BCnEnc.Net/Shared/DdsFile.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index 867d5b0..ef503bb 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; @@ -379,7 +379,7 @@ public DxgiFormat DxgiFormat { return DxgiFormat.DxgiFormatR8G8B8A8Unorm; } - else if (dwRBitMask == 0x0000ff && dwGBitMask == 0xff00 && dwBBitMask == 0xff && + else if (dwRBitMask == 0xff0000 && dwGBitMask == 0xff00 && dwBBitMask == 0xff && dwABitMask == 0xff000000) { return DxgiFormat.DxgiFormatB8G8R8A8Unorm; @@ -390,7 +390,7 @@ public DxgiFormat DxgiFormat { if (dwRgbBitCount == 32) { - if (dwRBitMask == 0x0000ff && dwGBitMask == 0xff00 && dwBBitMask == 0xff) + if (dwRBitMask == 0xff0000 && dwGBitMask == 0xff00 && dwBBitMask == 0xff) { return DxgiFormat.DxgiFormatB8G8R8X8Unorm; } @@ -403,7 +403,7 @@ public DxgiFormat DxgiFormat { if (dwRgbBitCount == 16) { - if (dwRBitMask == 0x0000ff && dwGBitMask == 0xff00) + if (dwRBitMask == 0xff && dwGBitMask == 0xff00) { return DxgiFormat.DxgiFormatR8G8Unorm; } @@ -413,7 +413,7 @@ public DxgiFormat DxgiFormat { if (dwRgbBitCount == 8) { - if (dwRBitMask == 0x0000ff && dwGBitMask == 0xff00) + if (dwRBitMask == 0xff) { return DxgiFormat.DxgiFormatR8Unorm; } From ebe6519bb8cbc0e73bdc7f9b56e8757df5b8e5bc Mon Sep 17 00:00:00 2001 From: Petar Tasev Date: Sun, 17 Jan 2021 20:25:25 -0800 Subject: [PATCH 036/116] Added decoder/encoder for BGRA8. --- BCnEnc.Net/Decoder/BcDecoder.cs | 8 ++++++ BCnEnc.Net/Decoder/RawDecoder.cs | 37 ++++++++++++++++++++++++++ BCnEnc.Net/Encoder/BcEncoder.cs | 3 +++ BCnEnc.Net/Encoder/RawEncoders.cs | 34 ++++++++++++++++++++++- BCnEnc.Net/Shared/CompressionFormat.cs | 15 +++++++---- BCnEnc.Net/Shared/DdsFile.cs | 17 ++++++++++++ 6 files changed, 108 insertions(+), 6 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 4f8ccfb..4c66308 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -486,6 +486,7 @@ private bool IsSupportedRawFormat(DxgiFormat format) case DxgiFormat.DxgiFormatR8Unorm: case DxgiFormat.DxgiFormatR8G8Unorm: case DxgiFormat.DxgiFormatR8G8B8A8Unorm: + case DxgiFormat.DxgiFormatB8G8R8A8Unorm: return true; default: @@ -606,6 +607,9 @@ private IRawDecoder GetRawDecoder(DxgiFormat format) case DxgiFormat.DxgiFormatR8G8B8A8Unorm: return new RawRgbaDecoder(); + case DxgiFormat.DxgiFormatB8G8R8A8Unorm: + return new RawBgraDecoder(); + default: return null; } @@ -657,6 +661,9 @@ private IRawDecoder GetRawDecoder(CompressionFormat format) case CompressionFormat.Rgba: return new RawRgbaDecoder(); + case CompressionFormat.Bgra: + return new RawBgraDecoder(); + default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } @@ -676,6 +683,7 @@ private int GetBufferSize(CompressionFormat format, int pixelWidth, int pixelHei return 3 * pixelWidth * pixelHeight; case CompressionFormat.Rgba: + case CompressionFormat.Bgra: return 4 * pixelWidth * pixelHeight; case CompressionFormat.Bc1: diff --git a/BCnEnc.Net/Decoder/RawDecoder.cs b/BCnEnc.Net/Decoder/RawDecoder.cs index 53c0020..0497c86 100644 --- a/BCnEnc.Net/Decoder/RawDecoder.cs +++ b/BCnEnc.Net/Decoder/RawDecoder.cs @@ -177,4 +177,41 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh return output; } } + + /// + /// A class to decode data to BGRA components. + /// + public class RawBgraDecoder : IRawDecoder + { + /// + /// Decode the data to color components. + /// + /// The data to decode. + /// The width of the image in pixels. + /// The height of the image in pixels. + /// The context of the current operation. + /// The decoded color components. + public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + { + var output = new Rgba32[pixelWidth * pixelHeight]; + + // HINT: Ignoring parallel execution since we wouldn't gain performance from it. + + var span = data.Span; + for (var i = 0; i < output.Length; i++) + { + if (context.CancellationToken.IsCancellationRequested) + { + break; + } + + output[i].B = span[i * 4]; + output[i].G = span[i * 4 + 1]; + output[i].R = span[i * 4 + 2]; + output[i].A = span[i * 4 + 3]; + } + + return output; + } + } } diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index d4d3536..fdd09c4 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -1005,6 +1005,9 @@ private IRawEncoder GetRawEncoder(CompressionFormat format) case CompressionFormat.Rgba: return new RawRgbaEncoder(); + case CompressionFormat.Bgra: + return new RawBgraEncoder(); + default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } diff --git a/BCnEnc.Net/Encoder/RawEncoders.cs b/BCnEnc.Net/Encoder/RawEncoders.cs index 2369c40..1bb11a8 100644 --- a/BCnEnc.Net/Encoder/RawEncoders.cs +++ b/BCnEnc.Net/Encoder/RawEncoders.cs @@ -1,4 +1,4 @@ -using System; +using System; using BCnEncoder.Shared; using SixLabors.ImageSharp.PixelFormats; @@ -139,4 +139,36 @@ public uint GetGlTypeSize() public DxgiFormat GetDxgiFormat() => DxgiFormat.DxgiFormatR8G8B8A8Unorm; } + + internal class RawBgraEncoder : IRawEncoder + { + public byte[] Encode(ReadOnlySpan pixels) + { + var output = new byte[pixels.Length * 4]; + for (var i = 0; i < pixels.Length; i++) + { + output[i * 4] = pixels[i].B; + output[i * 4 + 1] = pixels[i].G; + output[i * 4 + 2] = pixels[i].R; + output[i * 4 + 3] = pixels[i].A; + } + return output; + } + + public GlInternalFormat GetInternalFormat() + => throw new NotImplementedException(); + + public GlFormat GetBaseInternalFormat() + => GlFormat.GlBgra; + + public GlFormat GetGlFormat() => GlFormat.GlBgra; + + public GlType GetGlType() + => GlType.GlByte; + + public uint GetGlTypeSize() + => 1; + + public DxgiFormat GetDxgiFormat() => DxgiFormat.DxgiFormatB8G8R8A8Unorm; + } } diff --git a/BCnEnc.Net/Shared/CompressionFormat.cs b/BCnEnc.Net/Shared/CompressionFormat.cs index a9e5fe7..7d1c975 100644 --- a/BCnEnc.Net/Shared/CompressionFormat.cs +++ b/BCnEnc.Net/Shared/CompressionFormat.cs @@ -1,4 +1,4 @@ -namespace BCnEncoder.Shared +namespace BCnEncoder.Shared { public enum CompressionFormat { @@ -18,10 +18,14 @@ public enum CompressionFormat /// Raw unsigned byte 32-bit RGBA data /// Rgba, - /// - /// BC1 / DXT1 with no alpha. Very widely supported and good compression ratio. - /// - Bc1, + /// + /// Raw unsigned byte 32-bit BGRA data + /// + Bgra, + /// + /// BC1 / DXT1 with no alpha. Very widely supported and good compression ratio. + /// + Bc1, /// /// BC1 / DXT1 with 1-bit of alpha. /// @@ -62,6 +66,7 @@ public static bool IsCompressedFormat(this CompressionFormat format) case CompressionFormat.Rg: case CompressionFormat.Rgb: case CompressionFormat.Rgba: + case CompressionFormat.Bgra: return false; default: diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index ef503bb..e397e74 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -94,6 +94,9 @@ public static DdsFile Load(Stream s) { var mipWidth = header.dwWidth / (uint)Math.Pow(2, mip); var mipHeight = header.dwHeight / (uint)Math.Pow(2, mip); + // Saw this in a 1024x512 dds with 11 mipMapCount. Height became 0 (should be 1) + mipWidth = Math.Max(mipWidth, 1); + mipHeight = Math.Max(mipHeight, 1); if (mip > 0) //Calculate new byteSize { @@ -323,6 +326,20 @@ public static DdsHeader InitializeUncompressed(int width, int height, DxgiFormat }; header.dwPitchOrLinearSize = (uint)((width * 32 + 7) / 8); } + else if (format == DxgiFormat.DxgiFormatB8G8R8A8Unorm) + { + header.ddsPixelFormat = new DdsPixelFormat() + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfRgb | PixelFormatFlags.DdpfAlphapixels, + dwRgbBitCount = 32, + dwRBitMask = 0xFF0000, + dwGBitMask = 0xFF00, + dwBBitMask = 0xFF, + dwABitMask = 0xFF000000, + }; + header.dwPitchOrLinearSize = (uint)((width * 32 + 7) / 8); + } else { throw new NotImplementedException("This Format is not implemented in this method"); From cce870a4a9a99ec8eb9bae361902626c364cd7df Mon Sep 17 00:00:00 2001 From: Nominom Date: Mon, 18 Jan 2021 08:31:43 +0200 Subject: [PATCH 037/116] Bc5 dds bug fixed --- BCnEnc.Net/Shared/DdsFile.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index 867d5b0..bd25520 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; @@ -912,11 +912,11 @@ public static int GetByteSize(this DxgiFormat format) case DxgiFormat.DxgiFormatBc4Snorm: return 8; case DxgiFormat.DxgiFormatBc5Typeless: - return 8; + return 16; case DxgiFormat.DxgiFormatBc5Unorm: - return 8; + return 16; case DxgiFormat.DxgiFormatBc5Snorm: - return 8; + return 16; case DxgiFormat.DxgiFormatB5G6R5Unorm: return 2; case DxgiFormat.DxgiFormatB5G5R5A1Unorm: From 69c6f40f10d122da65cf61326bf216c31794db1e Mon Sep 17 00:00:00 2001 From: Nominom Date: Mon, 18 Jan 2021 10:02:10 +0200 Subject: [PATCH 038/116] Bc5 tests added, dispose FileStream in ImageLoader, dispose MipMaps even when operation is cancelled while encoding, rename CancellationTest --- BCnEnc.Net/Encoder/BcEncoder.cs | 520 +++++++++--------- BCnEncTests/Bc5Tests.cs | 89 +++ ...ncellationTest.cs => CancellationTests.cs} | 2 +- BCnEncTests/Support/ImageLoader.cs | 9 +- BCnEncTests/testImages/decoding_dds_bc5.dds | Bin 0 -> 5636 bytes .../testImages/decoding_dds_bc5_reference.png | Bin 0 -> 1977 bytes .../test_decompress_bc4_unorm_reference.bmp | Bin 0 -> 12342 bytes .../test_decompress_bc5_unorm_reference.bmp | Bin 0 -> 12342 bytes 8 files changed, 365 insertions(+), 255 deletions(-) create mode 100644 BCnEncTests/Bc5Tests.cs rename BCnEncTests/{CancellationTest.cs => CancellationTests.cs} (96%) create mode 100644 BCnEncTests/testImages/decoding_dds_bc5.dds create mode 100644 BCnEncTests/testImages/decoding_dds_bc5_reference.png create mode 100644 BCnEncTests/testImages/test_decompress_bc4_unorm_reference.bmp create mode 100644 BCnEncTests/testImages/test_decompress_bc5_unorm_reference.bmp diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index d4d3536..70a2d4f 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -398,76 +398,84 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - // Setup encoders - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - - output = new KtxFile( - KtxHeader.InitializeCompressed(inputImage.Width, inputImage.Height, - compressedEncoder.GetInternalFormat(), - compressedEncoder.GetBaseInternalFormat())); - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - output = new KtxFile( - KtxHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, - uncompressedEncoder.GetGlType(), - uncompressedEncoder.GetGlFormat(), - uncompressedEncoder.GetGlTypeSize(), - uncompressedEncoder.GetInternalFormat(), - uncompressedEncoder.GetBaseInternalFormat())); - } - var context = new OperationContext - { - CancellationToken = token, - IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount - }; - // Encode mipmap levels - for (var mip = 0; mip < numMipMaps; mip++) + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + try { - byte[] encoded; + // Setup encoders + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + output = new KtxFile( + KtxHeader.InitializeCompressed(inputImage.Width, inputImage.Height, + compressedEncoder.GetInternalFormat(), + compressedEncoder.GetBaseInternalFormat())); } else { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - throw new Exception("Cannot get pixel span."); - - encoded = uncompressedEncoder.Encode(mipPixels); + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + output = new KtxFile( + KtxHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, + uncompressedEncoder.GetGlType(), + uncompressedEncoder.GetGlFormat(), + uncompressedEncoder.GetGlTypeSize(), + uncompressedEncoder.GetInternalFormat(), + uncompressedEncoder.GetBaseInternalFormat())); } - output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height, 1)); - output.MipMaps[mip].Faces[0] = new KtxMipFace(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); - } + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; - // Dispose all mipmap levels - foreach (var image in mipChain) - image.Dispose(); + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, + out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, + context); + } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + throw new Exception("Cannot get pixel span."); - output.header.NumberOfFaces = 1; - output.header.NumberOfMipmapLevels = (uint)numMipMaps; + encoded = uncompressedEncoder.Encode(mipPixels); + } - return output; + output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height, 1)); + output.MipMaps[mip].Faces[0] = new KtxMipFace(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); + } + + output.header.NumberOfFaces = 1; + output.header.NumberOfMipmapLevels = (uint)numMipMaps; + + return output; + } + finally + { + // Dispose all mipmap levels, even if operation was cancelled + foreach (var image in mipChain) + image.Dispose(); + } } private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken token) @@ -478,85 +486,88 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) + try { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } - var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(inputImage.Width, inputImage.Height, - compressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader, dxt10Header); + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(inputImage.Width, inputImage.Height, + compressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader, dxt10Header); - if (OutputOptions.DdsBc1WriteAlphaFlag && - OutputOptions.Format == CompressionFormat.Bc1WithAlpha) + if (OutputOptions.DdsBc1WriteAlphaFlag && + OutputOptions.Format == CompressionFormat.Bc1WithAlpha) + { + output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; + } + } + else { - output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + var ddsHeader = DdsHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, + uncompressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader); } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - var ddsHeader = DdsHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, - uncompressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader); - } - var context = new OperationContext - { - CancellationToken = token, - IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount - }; - - // Encode mipmap levels - for (var mip = 0; mip < numMipMaps; mip++) - { - byte[] encoded; - if (isCompressedFormat) + var context = new OperationContext { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); - } - else + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + byte[] encoded; + if (isCompressedFormat) { - throw new Exception("Cannot get pixel span."); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } - encoded = uncompressedEncoder.Encode(mipPixels); + encoded = uncompressedEncoder.Encode(mipPixels); + } + + if (mip == 0) + { + output.Faces.Add(new DdsFace((uint)inputImage.Width, (uint)inputImage.Height, + (uint)encoded.Length, (int)numMipMaps)); + } + + output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); } - if (mip == 0) + + output.header.dwMipMapCount = (uint)numMipMaps; + if (numMipMaps > 1) { - output.Faces.Add(new DdsFace((uint)inputImage.Width, (uint)inputImage.Height, - (uint)encoded.Length, (int)numMipMaps)); + output.header.dwCaps |= HeaderCaps.DdscapsComplex | HeaderCaps.DdscapsMipmap; } - output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); + return output; } - - // Dispose all mipmap levels - foreach (var image in mipChain) + finally { - image.Dispose(); - } - - output.header.dwMipMapCount = (uint)numMipMaps; - if (numMipMaps > 1) - { - output.header.dwCaps |= HeaderCaps.DdscapsComplex | HeaderCaps.DdscapsMipmap; + // Dispose all mipmap levels, even if operation was cancelled + foreach (var image in mipChain) + image.Dispose(); } - - return output; } private IList EncodeToRawBytesInternal(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, CancellationToken token) @@ -578,58 +589,61 @@ private IList EncodeToRawBytesInternal(Image inputImage, Cancell var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - } - - var context = new OperationContext + try { - CancellationToken = token, - IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount - }; - - // Encode all mipmap levels - for (var mip = 0; mip < numMipMaps; mip++) - { - byte[] encoded; + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } } else { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Encode all mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) { - throw new Exception("Cannot get pixel span."); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } - encoded = uncompressedEncoder.Encode(mipPixels); + encoded = uncompressedEncoder.Encode(mipPixels); + } + + output.Add(encoded); } - output.Add(encoded); - } - // Dispose all mipmap levels - foreach (var image in mipChain) + return output; + } + finally { - image.Dispose(); + // Dispose all mipmap levels, even if operation was cancelled + foreach (var image in mipChain) + image.Dispose(); } - - return output; } private byte[] EncodeToRawBytesInternal(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) @@ -652,67 +666,65 @@ private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); - - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) + try { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } } - } - else - { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - } - - // Dispose all mipmap levels - if (mipLevel > numMipMaps - 1) - { - foreach (var image in mipChain) + else { - image.Dispose(); + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); } - throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps."); - } + // Dispose all mipmap levels + if (mipLevel > numMipMaps - 1) + { + throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps."); + } - var context = new OperationContext - { - CancellationToken = token, - IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount - }; + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; - // Encode mipmap level - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); - } - else - { - if (!mipChain[mipLevel].TryGetSinglePixelSpan(out var mipPixels)) + // Encode mipmap level + byte[] encoded; + if (isCompressedFormat) { - throw new Exception("Cannot get pixel span."); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); } + else + { + if (!mipChain[mipLevel].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } - encoded = uncompressedEncoder.Encode(mipPixels); - } + encoded = uncompressedEncoder.Encode(mipPixels); + } + + mipWidth = mipChain[mipLevel].Width; + mipHeight = mipChain[mipLevel].Height; - mipWidth = mipChain[mipLevel].Width; - mipHeight = mipChain[mipLevel].Height; - // Dispose all mipmap levels - foreach (var image in mipChain) + return encoded; + } + finally { - image.Dispose(); + // Dispose all mipmap levels, even if operation was cancelled + foreach (var image in mipChain) + image.Dispose(); } - - return encoded; } private void EncodeCubeMapInternal(Image right, Image left, Image top, Image down, @@ -795,42 +807,44 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le for (var face = 0; face < faces.Length; face++) { var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); - - // Encode all mipmap levels per face - for (var mip = 0; mip < numMipMaps; mip++) + try { - byte[] encoded; - if (isCompressedFormat) + // Encode all mipmap levels per face + for (var mip = 0; mip < numMipMaps; mip++) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); - } - else - { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + byte[] encoded; + if (isCompressedFormat) { - throw new Exception("Cannot get pixel span."); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } - encoded = uncompressedEncoder.Encode(mipPixels); - } + encoded = uncompressedEncoder.Encode(mipPixels); + } - if (face == 0) - { - output.MipMaps[mip] = new KtxMipmap((uint)encoded.Length, + if (face == 0) + { + output.MipMaps[mip] = new KtxMipmap((uint)encoded.Length, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height, (uint)faces.Length); + } + + output.MipMaps[mip].Faces[face] = new KtxMipFace(encoded, (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height, (uint)faces.Length); + (uint)mipChain[mip].Height); } - - output.MipMaps[mip].Faces[face] = new KtxMipFace(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); } - - // Dispose all mipmap levels - foreach (var image in mipChain) + finally { - image.Dispose(); + // Dispose all mipmap levels, even if operation was cancelled + foreach (var image in mipChain) + image.Dispose(); } } @@ -899,41 +913,43 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le for (var face = 0; face < faces.Length; face++) { var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); - - // Encode all mipmap levels per face - for (var mip = 0; mip < numMipMaps; mip++) + try { - byte[] encoded; - if (isCompressedFormat) + // Encode all mipmap levels per face + for (var mip = 0; mip < numMipMaps; mip++) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); - } - else - { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + byte[] encoded; + if (isCompressedFormat) { - throw new Exception("Cannot get pixel span."); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); } + else + { + if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) + { + throw new Exception("Cannot get pixel span."); + } - encoded = uncompressedEncoder.Encode(mipPixels); - } + encoded = uncompressedEncoder.Encode(mipPixels); + } - if (mip == 0) - { - output.Faces.Add(new DdsFace((uint)mipChain[mip].Width, (uint)mipChain[mip].Height, - (uint)encoded.Length, mipChain.Count)); - } + if (mip == 0) + { + output.Faces.Add(new DdsFace((uint)mipChain[mip].Width, (uint)mipChain[mip].Height, + (uint)encoded.Length, mipChain.Count)); + } - output.Faces[face].MipMaps[mip] = new DdsMipMap(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); + output.Faces[face].MipMaps[mip] = new DdsMipMap(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); + } } - - // Dispose all mipmap levels - foreach (var image in mipChain) + finally { - image.Dispose(); + // Dispose all mipmap levels, even if operation was cancelled + foreach (var image in mipChain) + image.Dispose(); } } diff --git a/BCnEncTests/Bc5Tests.cs b/BCnEncTests/Bc5Tests.cs new file mode 100644 index 0000000..174ea85 --- /dev/null +++ b/BCnEncTests/Bc5Tests.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using BCnEncoder.Decoder; +using BCnEncoder.Shared; +using BCnEncTests.Support; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; + +namespace BCnEncTests +{ + public class Bc5Tests + { + [Fact] + public void Bc5Indices() + { + var block = new Bc5Block(); + + for (var i = 0; i < 16; i++) + { + block.SetRedIndex(i, (byte)(i % 8)); + block.SetGreenIndex(i, (byte)((i + 3) % 8)); + } + + for (var i = 0; i < 16; i++) + { + int rI = block.GetRedIndex(i); + int gI = block.GetGreenIndex(i); + + Assert.Equal((byte)(i % 8), rI); + Assert.Equal((byte)((i + 3) % 8), gI); + } + } + + [Fact] + public void Bc5DdsDecode() + { + var reference = ImageLoader.TestDecodingBc5Reference; + var decoded = new BcDecoder().Decode(DdsLoader.TestDecompressBc5); + + reference.TryGetSinglePixelSpan(out var refSpan); + decoded.TryGetSinglePixelSpan(out var decSpan); + + Assert.Equal(reference.Width, decoded.Width); + Assert.Equal(reference.Height, decoded.Height); + + // Exactly equal + for (var i = 0; i < reference.Width * reference.Height; i++) + Assert.Equal(refSpan[i], decSpan[i]); + } + + [Fact] + public void Bc5BlockDecode() + { + var block = new Bc5Block() + { + greenBlock = 0x91824260008935ee, + redBlock = 0x6d900f66d3c0a70d + }; + + var referenceBlock = new RawBlock4X4Rgba32 + { + p00 = new Rgba32(13, 53, 0, 255), + p01 = new Rgba32(136, 238, 0, 255), + p02 = new Rgba32(255, 212, 0, 255), + p03 = new Rgba32(167, 238, 0, 255), + p10 = new Rgba32(13, 53, 0, 255), + p11 = new Rgba32(136, 238, 0, 255), + p12 = new Rgba32(167, 238, 0, 255), + p13 = new Rgba32(75, 185, 0, 255), + p20 = new Rgba32(255, 212, 0, 255), + p21 = new Rgba32(167, 238, 0, 255), + p22 = new Rgba32(13, 53, 0, 255), + p23 = new Rgba32(75, 159, 0, 255), + p30 = new Rgba32(167, 238, 0, 255), + p31 = new Rgba32(75, 185, 0, 255), + p32 = new Rgba32(13, 53, 0, 255), + p33 = new Rgba32(75, 159, 0, 255) + }; + + var decodedBlock = block.Decode(); + + for (var i = 0; i < 16; i++) + Assert.Equal(referenceBlock[i], decodedBlock[i]); + } + } +} diff --git a/BCnEncTests/CancellationTest.cs b/BCnEncTests/CancellationTests.cs similarity index 96% rename from BCnEncTests/CancellationTest.cs rename to BCnEncTests/CancellationTests.cs index 1d7f296..07689a7 100644 --- a/BCnEncTests/CancellationTest.cs +++ b/BCnEncTests/CancellationTests.cs @@ -6,7 +6,7 @@ namespace BCnEncTests { - public class CancellationTest + public class CancellationTests { [Fact] public async void EncodeParallelCancellation() diff --git a/BCnEncTests/Support/ImageLoader.cs b/BCnEncTests/Support/ImageLoader.cs index 95b5d3f..4870d4d 100644 --- a/BCnEncTests/Support/ImageLoader.cs +++ b/BCnEncTests/Support/ImageLoader.cs @@ -19,6 +19,7 @@ public static class ImageLoader public static Image TestRedGreen1 { get; } = LoadTestImage("../../../testImages/test_red_green_1_64.png"); public static Image TestRgbHard1 { get; } = LoadTestImage("../../../testImages/test_rgb_hard_1.png"); public static Image TestLenna { get; } = LoadTestImage("../../../testImages/test_lenna_512.png"); + public static Image TestDecodingBc5Reference { get; } = LoadTestImage("../../../testImages/decoding_dds_bc5_reference.png"); public static Image[] TestCubemap { get; } = { LoadTestImage("../../../testImages/cubemap/right.png"), @@ -40,16 +41,19 @@ public static class DdsLoader public const string TestDecompressBc1Name = "../../../testImages/test_decompress_bc1.dds"; public const string TestDecompressBc1AName = "../../../testImages/test_decompress_bc1a.dds"; public const string TestDecompressBc7Name = "../../../testImages/test_decompress_bc7.dds"; + public const string TestDecompressBc5Name = "../../../testImages/decoding_dds_bc5.dds"; public const string TestDecompressRgbaName = "../../../testImages/test_decompress_rgba.dds"; public static DdsFile TestDecompressBc1 { get; } = LoadDdsFile(TestDecompressBc1Name); public static DdsFile TestDecompressBc1A { get; } = LoadDdsFile(TestDecompressBc1AName); + public static DdsFile TestDecompressBc5 { get; } = LoadDdsFile(TestDecompressBc5Name); public static DdsFile TestDecompressBc7 { get; } = LoadDdsFile(TestDecompressBc7Name); public static DdsFile TestDecompressRgba { get; } = LoadDdsFile(TestDecompressRgbaName); private static DdsFile LoadDdsFile(string filename) { - return DdsFile.Load(File.OpenRead(filename)); + using var fs = File.OpenRead(filename); + return DdsFile.Load(fs); } } @@ -67,7 +71,8 @@ public static class KtxLoader private static KtxFile LoadKtxFile(string filename) { - return KtxFile.Load(File.OpenRead(filename)); + using var fs = File.OpenRead(filename); + return KtxFile.Load(fs); } } } diff --git a/BCnEncTests/testImages/decoding_dds_bc5.dds b/BCnEncTests/testImages/decoding_dds_bc5.dds new file mode 100644 index 0000000000000000000000000000000000000000..813742dc17d975ebe7e587d3f80c8c19f11e30d2 GIT binary patch literal 5636 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 F@!zV~>mL9B literal 0 HcmV?d00001 diff --git a/BCnEncTests/testImages/decoding_dds_bc5_reference.png b/BCnEncTests/testImages/decoding_dds_bc5_reference.png new file mode 100644 index 0000000000000000000000000000000000000000..cb981d971111bcde7f7c0e408ff065791e13e831 GIT binary patch literal 1977 zcmV;q2S)gbP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2Tn;uK~!i%?U-w9 zQ|B4Se>NrLLKvVFVml-h`ei@|B&>`wHf>qdFfK{D7NPA^H)2TH$}a6noCaKTD*}zF z5?w(ww3L#pv?CeW(m~LqO$J7sP_;-2G-OVi3%TPx@0-`Lo7xIzs$^yIU#}iN ze&7Fd{D02-oaY=L8y1oJWo3KLQsv}CBduk67DjC>_u}=kJcs*tQSGE;qnaPOtCuzE zX0jrilw!^}IN!p4OfKalaHNUvtx@xL!^9Pr83mOsJg?O+aC6eh&@4j`+!st>TRG`F zjQS%&UK5J__Bz86SWY1DFLmzSk19VUz|FH%yExLw(dT(W69nTTZb||rTv>##fqfp9 z6_Hb`mo@GNh04C|J;1UxWR~!*lS2)7%az<^P23kS9D&Vl9Km~=SyIUF^zT|upwh3- zJ?+ZB9iX&O9i_C4^=o)yi)O%pKI(O+Dx~AhMtw#hxvhFxW6XT2LRz}ks6WtzuS}^= zFJVJF38RKH3D+`>`cjYe1io@bg|%K)e!rg!w|IFEnfWX#;)GK(q?{6!T?EG(DKF(4 zn_v@vbnt$PUe-t&GS2p2k^WuIxj1>96MMTfFg(JF3J!js6$Lo9ammHgd1`(ztPC#C;(;6%x^)Bih(nsZ zw1&i)h9H>W{{~iVW#MB~xu|HscOVqIM;Guotna`HCDHu#t35fcuPWJzkXFXIMR`Y=`=w*$!l8pkNm&LhCeZ7;)b_Tl) zK`<-GuYjthLG?u}{7xwL7sm}pU^#&kA1fyY6H zEGMwJj$$9%wLfMjZy#T%o;Hq!HlpZU#aDEv$|>KHglhM|GkR6S9=vdWkj=|~H|iZlR6CUV zonB6Pnb~hRg0V2A&mJ@CFFUO#5O|+=T>Q07`Ga;&!rOZH%St)-nr6UEUB^eOp^*9v z&gh4Z+(Ld*q?a`&e)!+*JXK0=fg)dX@=_z7a=uu=;R1%k?!IB&m|tGfWEZFZhdc4x zw>j3p_J@@}YG*M@{gWQn6>v^AM1B=aG81gbBYUe+FRA`m ztCwyj&q%#t>cSJ)({9weJ!ZxNoGaA`c-2;1{0~X1gJTtM-X{O|{ACsW`{-{W;UP7W zSA|C2yS(=ZH-AXrADr*x(K`OLnq(Pa9Or5?a%;K1o{k?Wa#hEtV&%6chUFb_7AxDf zTNP486CX*PXaw%6A};rkRmi-p>fAr4PtT07GC1=Ai?c~DrqaRd(rq<4zYTlX>Fo+C zdZUqtzRLYO__gk~K3^#IQ1BUEV3Sx0`K+xsgvt1p?*&^8bD95))6eBh& zEC*OaMD=2$LG4~dNl{@rz#1Z|7aI-n9hf@68X~F}8x8Rtm^#23BB~b~4by%HqTUCB zPnMJ6wH#nR?-3EziMD=2$A-)4s2UtTy^O14q%k;;!TI#1FgTmuRQeL>pN&6}u0%SMX-%LmNe2zUFx-(p#d`E<+p8V< z8}65XCD5tge$^@ZM#zLTm$9bjO9;bHFFVQ^55zCLAp zdzI7QkKa#M7oDB7wo+F&{{CP(Bc4F45l4%hEWZThZt0n}9Tav2$R7wsNEiU+xd%1ah#j}rPE8l@9CkVLs^-e@MUS7(A^y`p_n6{K&%l@Al8`n3E1lE85^5CMn^y8OxTeT z<;cUj_%eou)Qo%;D-ZE9BMW5{fnA3B(%l1Y(V8o&fw8XC=uB?CW(U00000 LNkvXXu0mjfXivOv literal 0 HcmV?d00001 diff --git a/BCnEncTests/testImages/test_decompress_bc4_unorm_reference.bmp b/BCnEncTests/testImages/test_decompress_bc4_unorm_reference.bmp new file mode 100644 index 0000000000000000000000000000000000000000..75d1242b60013053181406af89326e6e0a7619be GIT binary patch literal 12342 zcmeI2OGsWv6vr(}!M1^FTPZGFD59+k3kIP+P@>{{AtHziL1`345V4@B3pcf<+B6ki zh$4z_MH8P<^AN;0uH7m4z^Dt6(xglK`@YjVOyd32s{})H|M1N>-<@;L{Lh&)bLYEv z?xlzS;O0a)WiX%E|306%eM=3{{{dBzn`COW zWN2upudlDWySuZqv%S5&wY9aSrKPE<>EXkN4<0WhEsg+%NL- z^0KqDGcz-}O~k~+aCZm@2$1z3`|leze>?s+$uT>B?ELv?^XKgB?BwKRYiny`W8>Mg zXDt3K`1SSm{3BptXaCQ(pY@zgK6`uPPlL5@6j8?rrZ9+EjMD`j(H))AH3Xmm8LND( z%3GuEl(zX_kPmkJFU=@Bf9(AEkk`*QZ{D1qo*o<=Y;SLGZf>rxuP-btOifJ<4i0v7 zbTl?LR##US78bI%zckfN1yDpCBbdScs=O(~i!a*z zFUSWw{ud_?t#h$5fcEUCCdY)fE-5!N*kP zw)o?wB|fIYcKolHEv90oA$64xrowjoO#^$yi>4v{AIJZSVG%LT`2a#RK0cn3lJcE_ z;Nak-q@<;#rTzW=*RNlXjg4^ya7IXBWo6~nt5@jqemOBQk$;6dJ3AOq0#w94<%<_D zj*pKK9vB!%NJ!9ib$LtV5f=NH1;fL`992^2?d=s8;151^;xi38jh>z!aY1W$R2BcY zxVW{oHB%Q@w@{P;1g%gf6Wc7BqCQZjZ5N|DO^{QO@|kg-wVH%IYDdRsI|e1(A`FSY|Q*$p9B6f#>GtXdN9L z`NX06DxB{@DlN%X%<3+DeGd9uKv-Nr(OZMc`I(s+-Ctdo zgT4w@`4du@|K`M_M~`qpMUqSw@VXGlC~z|EA1A2jGeS)q8HKK{E%4wKn38#6l|PF)YmOi~I+{~+QgWkbO%QNK8bE_v4E}PyNNxo8G#IimFJHc77liQB zr%xjyBG_k&M_ACr->M=!IXQ`CN~`?Q#RW+l29clQ0t@mx`9c$bymCPeIu#|1BQRGk zKwDhkt@k$?bX^X6U|C$S%3pFrMgit(DPy~W3$ooJ?9gC$1XP|-VYunHt*wn{6858` zBYvW2ESZk)KMlwzZ~zivHgdYI>XeFA{t|im#RW1)g@t$$N!uS^8`(G^_?jHaE literal 0 HcmV?d00001 diff --git a/BCnEncTests/testImages/test_decompress_bc5_unorm_reference.bmp b/BCnEncTests/testImages/test_decompress_bc5_unorm_reference.bmp new file mode 100644 index 0000000000000000000000000000000000000000..80a0328b90561da687818c5dd3829fa0f04d46f8 GIT binary patch literal 12342 zcmeI2QA`}i8OMKBqe!H+RNTa>c*p}$6(^`NnB}a*j<6D}2FE-^5mMxbNT&6nRF)8& zC8B`aOH@#LysWXj+jckdj!qHogNPOdhY_%woR$_|c!7flX>R7(XK8Apv5|%b_U>iR9%3R+LhQs^e8f}yr5EW- zdX#<(6bj_?EG#fHLpG}pBRPP2d({_;95nJhBA+30zQ{+1d~2vH;vdC7%AaWcM*Gj* z?w^etw64;%MBgF<^9)UsnP4Kr^bqp{EcUU~#cC@Xjn4kR0jsbCi!cwVG)%*X(2CJ(qEwQ-B{5;dsOiYl;Ff_!# z0DXOQb#o8SCA3xldPpOAsZ^JdlQbC-+FXqg z>M}|Q&?3Ni+Yi8`?F&=F%SSGD-;KZzL}RCd~+G z9*((K8_6p=Ni);{MovjH|M2E&gix1JLLh%5c^NNhMo9Be#Fep;ywnHsS3b(Iw7djH ze9h2yHQGw$U0g;9LBF6YrERm3GJud#Yp{7}`bP4q|A4=Pr~!TPbM`NejH!&M$)QzWi4TOfCav7b{j!7HB=f5bBo z<9LOGnh!a8Qyag_$UgkO{ysP3YHHh2fgo8>5_0cRQ|6$$jO9T`!mn>D2|v46q53`# zej2y_=18dV8HjOBg@f}?vFj7F1R2YPiQ{H<686kqmirWPe^3%+7HZy8VPEcXaN{Hb zdloWHRHsRSU-7A)1(6_`GuP_i>JbF?EZj`vNjS`G5&w!~LlQ{@dJ>*0N;tx7+=rs0 z^pL!bE5S%|lgbVqtC0f;($A3CV0MFinpC5QbRz=mV-jDgNao)my^mc}yu05+>Hs!! zDaQ6uJ;^IeDjN9|BTrMO%i$(m_=I9!8Ype`z!qnVkr4b1oRSJpi#L`6xgS1yU zNIZ(bmT>gHo`kk4T(m!mjjL;VITs~Jn%NQ(KlO}VFZT)(;S@4k`%}c2`2(7F^VpVWWLbC!y>}T0%n4uSlr-KGuC6Tt~T)u)7k1 znVMVjClT1QpfX24s{J@2E-HF-6jsgfgKYHG2qVYHs=MZUif7O)^W@V-C7w)Le8V ztO$8+CYHx64{jpKa;_F%EukyMaUYJwaBxlMRZ)W9SH^N-W*J;-{TRW23QEGnV^~`p z$T2ikl%QHaz`DN_{T7uu#+J=i@rsftqb5?$jVCj!q zf{vuh9LZ#jm0lF|ELfu)`-;i0xH;-A1X&TcPCAfT_^iO%U&+e9C12s#HI-M(7g&DX zJM84(a~F}^T+i@P3@bzTx|!rAwX&IyKf_-%2A&{)j`1h3&e3s`RDBV9NbTXOD3W)i z-PDZp>X#~#sV6<8>#^#2-Q*)E# zhDfk?GnvGH%cCvfa%r}76tskKPl7w?>ZX`oqM~lhlOVKh3067Q13vh2=G6tAS6YIZ zWpHi27X>{F683zbgWM^s%W4+vuuJ^a+mYa;hxT>;DSOVJRbVCT9XC{*S56f-Oucii z{0SQ}3#zNr+V~UvzBzgIDk7Mvxy6pWJqs#x+_2oQlE*K>j&MymF06leG$ib{1Tm}o Ukp~ra8 Date: Mon, 18 Jan 2021 10:17:08 +0100 Subject: [PATCH 039/116] Add Dds tests for ATC; --- BCnEncTests/AtcTests.cs | 54 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/BCnEncTests/AtcTests.cs b/BCnEncTests/AtcTests.cs index 8d747bd..e30e3f9 100644 --- a/BCnEncTests/AtcTests.cs +++ b/BCnEncTests/AtcTests.cs @@ -9,7 +9,7 @@ namespace BCnEncTests public class AtcTests { [Fact] - public void AtcDecode() + public void AtcKtxDecode() { // Arrange var decoder = new BcDecoder(); @@ -25,7 +25,23 @@ public void AtcDecode() } [Fact] - public void AtcExplicitDecode() + public void AtcDdsDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.Atc); + var original = ImageLoader.TestLenna; + + // Act + var dds = encoder.EncodeToDds(original); + var image = decoder.Decode(dds); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } + + [Fact] + public void AtcExplicitKtxDecode() { // Arrange var decoder = new BcDecoder(); @@ -41,7 +57,23 @@ public void AtcExplicitDecode() } [Fact] - public void AtcInterpolatedDecode() + public void AtcExplicitDdsDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.AtcExplicitAlpha); + var original = ImageLoader.TestAlphaGradient1; + + // Act + var dds = encoder.EncodeToDds(original); + var image = decoder.Decode(dds); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } + + [Fact] + public void AtcInterpolatedKtxDecode() { // Arrange var decoder = new BcDecoder(); @@ -55,5 +87,21 @@ public void AtcInterpolatedDecode() // Assert TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); } + + [Fact] + public void AtcInterpolatedDdsDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.AtcInterpolatedAlpha); + var original = ImageLoader.TestAlphaGradient1; + + // Act + var dds = encoder.EncodeToDds(original); + var image = decoder.Decode(dds); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } } } From e31a99d47c88fee1b2e56018c679d09504eded0d Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Mon, 18 Jan 2021 11:22:05 +0100 Subject: [PATCH 040/116] Split Bc4Block and Bc4ComponentBlock; Add Bc4ComponentBlockEncoder; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 3 +- BCnEnc.Net/Encoder/AtcBlockEncoder.cs | 8 +- BCnEnc.Net/Encoder/Bc2BlockEncoder.cs | 3 - BCnEnc.Net/Encoder/Bc3BlockEncoder.cs | 190 +------------------ BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 111 ++++++----- BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 10 +- BCnEnc.Net/Encoder/BcEncoder.cs | 16 +- BCnEnc.Net/Shared/EncodedBlocks.cs | 257 +++++++++++--------------- 8 files changed, 192 insertions(+), 406 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index bc63394..cdb5a28 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -3,7 +3,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading.Tasks; -using BCnEncoder.Encoder; using BCnEncoder.Shared; namespace BCnEncoder.Decoder @@ -107,7 +106,7 @@ public Bc4Decoder(bool redAsLuminance) protected override RawBlock4X4Rgba32 DecodeBlock(Bc4Block block) { - return block.Decode(redAsLuminance, Bc4Component.R); + return block.Decode(redAsLuminance); } } diff --git a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs index 4ca3038..5618ab7 100644 --- a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs @@ -15,7 +15,7 @@ public override AtcBlock EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality { var atcBlock = new AtcBlock(); - // Encode with BC1 first + // EncodeBlock with BC1 first var bc1Block = bc1BlockEncoder.EncodeBlock(block, quality); // Atc specific modifications to BC1 @@ -64,7 +64,7 @@ public override AtcExplicitAlphaBlock EncodeBlock(RawBlock4X4Rgba32 block, Compr { var atcBlock = atcBlockEncoder.EncodeBlock(block, quality); - // Encode alpha + // EncodeBlock alpha var bc2AlphaBlock = new Bc2AlphaBlock(); for (var i = 0; i < 16; i++) { @@ -96,12 +96,12 @@ public override DxgiFormat GetDxgiFormat() internal class AtcInterpolatedAlphaBlockEncoder : BaseBcBlockEncoder { - private readonly Bc4BlockEncoder bc4BlockEncoder; + private readonly Bc4ComponentBlockEncoder bc4BlockEncoder; private readonly AtcBlockEncoder atcBlockEncoder; public AtcInterpolatedAlphaBlockEncoder() { - bc4BlockEncoder = new Bc4BlockEncoder(false, Bc4Component.A); + bc4BlockEncoder = new Bc4ComponentBlockEncoder(Bc4Component.A); atcBlockEncoder = new AtcBlockEncoder(); } diff --git a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs index af76a12..e559818 100644 --- a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs @@ -1,13 +1,10 @@ using System; -using System.Runtime.InteropServices; -using System.Threading.Tasks; using BCnEncoder.Shared; namespace BCnEncoder.Encoder { internal class Bc2BlockEncoder : BaseBcBlockEncoder { - public override Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) diff --git a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs index 02bd858..7de7b42 100644 --- a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs @@ -1,13 +1,12 @@ using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Threading.Tasks; using BCnEncoder.Shared; namespace BCnEncoder.Encoder { internal class Bc3BlockEncoder : BaseBcBlockEncoder { + private static readonly Bc4ComponentBlockEncoder bc4BlockEncoder = new Bc4ComponentBlockEncoder(Bc4Component.A); + public override Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { switch (quality) @@ -71,189 +70,12 @@ private static Bc3Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 return output; } - private static Bc3Block FindAlphaValues(Bc3Block colorBlock, RawBlock4X4Rgba32 rawBlock, int variations) - { - var pixels = rawBlock.AsSpan; - - //Find min and max alpha - byte minAlpha = 255; - byte maxAlpha = 0; - var hasExtremeValues = false; - for (var i = 0; i < pixels.Length; i++) - { - if (pixels[i].A < 255 && pixels[i].A > 0) - { - if (pixels[i].A < minAlpha) minAlpha = pixels[i].A; - if (pixels[i].A > maxAlpha) maxAlpha = pixels[i].A; - } - else - { - hasExtremeValues = true; - } - } - - - int SelectAlphaIndices(ref Bc3Block block) - { - var cumulativeError = 0; - var a0 = block.Alpha0; - var a1 = block.Alpha1; - var alphas = a0 > a1 ? stackalloc byte[] { - a0, - a1, - a0.InterpolateSeventh(a1, 1), - a0.InterpolateSeventh(a1, 2), - a0.InterpolateSeventh(a1, 3), - a0.InterpolateSeventh(a1, 4), - a0.InterpolateSeventh(a1, 5), - a0.InterpolateSeventh(a1, 6) - } : stackalloc byte[] { - a0, - a1, - a0.InterpolateFifth(a1, 1), - a0.InterpolateFifth(a1, 2), - a0.InterpolateFifth(a1, 3), - a0.InterpolateFifth(a1, 4), - 0, - 255 - }; - var pixels = rawBlock.AsSpan; - for (var i = 0; i < pixels.Length; i++) - { - byte bestIndex = 0; - var bestError = Math.Abs(pixels[i].A - alphas[0]); - for (byte j = 1; j < alphas.Length; j++) - { - var error = Math.Abs(pixels[i].A - alphas[j]); - if (error < bestError) - { - bestIndex = j; - bestError = error; - } - if (bestError == 0) break; - } - block.SetAlphaIndex(i, bestIndex); - cumulativeError += bestError * bestError; - } - - return cumulativeError; - } - - //everything is either fully opaque or fully transparent - if (hasExtremeValues && minAlpha == 255 && maxAlpha == 0) - { - colorBlock.Alpha0 = 0; - colorBlock.Alpha1 = 255; - var error = SelectAlphaIndices(ref colorBlock); - Debug.Assert(0 == error); - return colorBlock; - } - - var best = colorBlock; - best.Alpha0 = maxAlpha; - best.Alpha1 = minAlpha; - var bestError = SelectAlphaIndices(ref best); - if (bestError == 0) - { - return best; - } - for (byte i = 1; i < variations; i++) - { - { - var a0 = ByteHelper.ClampToByte(maxAlpha - i * 2); - var a1 = ByteHelper.ClampToByte(minAlpha + i * 2); - var block = colorBlock; - block.Alpha0 = hasExtremeValues ? a1 : a0; - block.Alpha1 = hasExtremeValues ? a0 : a1; - var error = SelectAlphaIndices(ref block); - if (error < bestError) - { - best = block; - bestError = error; - } - } - { - var a0 = ByteHelper.ClampToByte(maxAlpha + i * 2); - var a1 = ByteHelper.ClampToByte(minAlpha - i * 2); - var block = colorBlock; - block.Alpha0 = hasExtremeValues ? a1 : a0; - block.Alpha1 = hasExtremeValues ? a0 : a1; - var error = SelectAlphaIndices(ref block); - if (error < bestError) - { - best = block; - bestError = error; - } - } - { - var a0 = ByteHelper.ClampToByte(maxAlpha); - var a1 = ByteHelper.ClampToByte(minAlpha - i * 2); - var block = colorBlock; - block.Alpha0 = hasExtremeValues ? a1 : a0; - block.Alpha1 = hasExtremeValues ? a0 : a1; - var error = SelectAlphaIndices(ref block); - if (error < bestError) - { - best = block; - bestError = error; - } - } - { - var a0 = ByteHelper.ClampToByte(maxAlpha + i * 2); - var a1 = ByteHelper.ClampToByte(minAlpha); - var block = colorBlock; - block.Alpha0 = hasExtremeValues ? a1 : a0; - block.Alpha1 = hasExtremeValues ? a0 : a1; - var error = SelectAlphaIndices(ref block); - if (error < bestError) - { - best = block; - bestError = error; - } - } - { - var a0 = ByteHelper.ClampToByte(maxAlpha); - var a1 = ByteHelper.ClampToByte(minAlpha + i * 2); - var block = colorBlock; - block.Alpha0 = hasExtremeValues ? a1 : a0; - block.Alpha1 = hasExtremeValues ? a0 : a1; - var error = SelectAlphaIndices(ref block); - if (error < bestError) - { - best = block; - bestError = error; - } - } - { - var a0 = ByteHelper.ClampToByte(maxAlpha - i * 2); - var a1 = ByteHelper.ClampToByte(minAlpha); - var block = colorBlock; - block.Alpha0 = hasExtremeValues ? a1 : a0; - block.Alpha1 = hasExtremeValues ? a0 : a1; - var error = SelectAlphaIndices(ref block); - if (error < bestError) - { - best = block; - bestError = error; - } - } - - if (bestError < 10) - { - break; - } - } - - return best; - } - #endregion #region Encoders private static class Bc3BlockEncoderFast { - internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) { var pixels = rawBlock.AsSpan; @@ -271,8 +93,8 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) c1 = c; } - var output = TryColors(rawBlock, c0, c1, out var _); - output = FindAlphaValues(output, rawBlock, 3); + var output = TryColors(rawBlock, c0, c1, out _); + output.alphaBlock = bc4BlockEncoder.EncodeBlock(rawBlock, CompressionQuality.Fast); return output; } @@ -314,7 +136,7 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) break; } } - best = FindAlphaValues(best, rawBlock, 5); + best.alphaBlock = bc4BlockEncoder.EncodeBlock(rawBlock, CompressionQuality.Balanced); return best; } } @@ -376,7 +198,7 @@ internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) } } - best = FindAlphaValues(best, rawBlock, 8); + best.alphaBlock = bc4BlockEncoder.EncodeBlock(rawBlock, CompressionQuality.BestQuality); return best; } } diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index a0b60d7..b80036f 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -9,53 +9,85 @@ internal enum Bc4Component R, G, B, - A + A, + Luminance } internal class Bc4BlockEncoder : BaseBcBlockEncoder { - private readonly bool luminanceAsComponent; + private readonly Bc4ComponentBlockEncoder bc4Encoder; + + public Bc4BlockEncoder(bool luminanceAsRed) + { + bc4Encoder = new Bc4ComponentBlockEncoder(luminanceAsRed ? Bc4Component.Luminance : Bc4Component.R); + } + + public override Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + { + var output = new Bc4Block + { + redBlock = bc4Encoder.EncodeBlock(block, quality) + }; + + return output; + } + + public override GlInternalFormat GetInternalFormat() + { + return GlInternalFormat.GlCompressedRedRgtc1Ext; + } + + public override GlFormat GetBaseInternalFormat() + { + return GlFormat.GlRed; + } + + public override DxgiFormat GetDxgiFormat() + { + return DxgiFormat.DxgiFormatBc4Unorm; + } + } + + internal class Bc4ComponentBlockEncoder + { private readonly Bc4Component component; - public Bc4BlockEncoder(bool luminanceAsComponent, Bc4Component component = Bc4Component.R) + public Bc4ComponentBlockEncoder(Bc4Component component) { - this.luminanceAsComponent = luminanceAsComponent; this.component = component; } - public override Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) + public Bc4ComponentBlock EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { - var output = new Bc4Block(); - var colors = new byte[16]; + var output = new Bc4ComponentBlock(); + var pixels = block.AsSpan; - for (var i = 0; i < 16; i++) - { - if (luminanceAsComponent) - { - colors[i] = (byte)(new ColorYCbCr(pixels[i]).y * 255); - } - else + var colors = new byte[pixels.Length]; + + for (var i = 0; i < pixels.Length; i++) + switch (component) { - switch (component) - { - case Bc4Component.R: - colors[i] = pixels[i].R; - break; + case Bc4Component.R: + colors[i] = pixels[i].R; + break; - case Bc4Component.G: - colors[i] = pixels[i].G; - break; + case Bc4Component.G: + colors[i] = pixels[i].G; + break; - case Bc4Component.B: - colors[i] = pixels[i].B; - break; + case Bc4Component.B: + colors[i] = pixels[i].B; + break; - case Bc4Component.A: - colors[i] = pixels[i].A; - break; - } + case Bc4Component.A: + colors[i] = pixels[i].A; + break; + + case Bc4Component.Luminance: + colors[i] = (byte)(new ColorYCbCr(pixels[i]).y * 255); + break; } - } + switch (quality) { case CompressionQuality.Fast: @@ -70,24 +102,9 @@ public override Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality } } - public override GlInternalFormat GetInternalFormat() - { - return GlInternalFormat.GlCompressedRedRgtc1Ext; - } - - public override GlFormat GetBaseInternalFormat() - { - return GlFormat.GlRed; - } - - public override DxgiFormat GetDxgiFormat() - { - return DxgiFormat.DxgiFormatBc4Unorm; - } - #region Encoding private stuff - private static Bc4Block FindComponentValues(Bc4Block colorBlock, byte[] pixels, int variations) + private static Bc4ComponentBlock FindComponentValues(Bc4ComponentBlock colorBlock, byte[] pixels, int variations) { //Find min and max alpha @@ -108,7 +125,7 @@ private static Bc4Block FindComponentValues(Bc4Block colorBlock, byte[] pixels, } - int SelectIndices(ref Bc4Block block) + int SelectIndices(ref Bc4ComponentBlock block) { var cumulativeError = 0; var c0 = block.Endpoint0; diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index c440339..7cde981 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -4,13 +4,13 @@ namespace BCnEncoder.Encoder { internal class Bc5BlockEncoder : BaseBcBlockEncoder { - private readonly Bc4BlockEncoder redBlockEncoder; - private readonly Bc4BlockEncoder greenBlockEncoder; + private readonly Bc4ComponentBlockEncoder redBlockEncoder; + private readonly Bc4ComponentBlockEncoder greenBlockEncoder; public Bc5BlockEncoder() { - redBlockEncoder = new Bc4BlockEncoder(false, Bc4Component.R); - greenBlockEncoder = new Bc4BlockEncoder(false, Bc4Component.G); + redBlockEncoder = new Bc4ComponentBlockEncoder(Bc4Component.R); + greenBlockEncoder = new Bc4ComponentBlockEncoder(Bc4Component.G); } public override Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) @@ -19,7 +19,7 @@ public override Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality { redBlock = redBlockEncoder.EncodeBlock(block, quality), greenBlock = greenBlockEncoder.EncodeBlock(block, quality) - }; ; + }; } public override GlInternalFormat GetInternalFormat() diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 526f150..5d4c42c 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -435,7 +435,7 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken TaskCount = Options.TaskCount }; - // Encode mipmap levels + // EncodeBlock mipmap levels for (var mip = 0; mip < numMipMaps; mip++) { byte[] encoded; @@ -514,7 +514,7 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken TaskCount = Options.TaskCount }; - // Encode mipmap levels + // EncodeBlock mipmap levels for (var mip = 0; mip < numMipMaps; mip++) { byte[] encoded; @@ -601,7 +601,7 @@ private IList EncodeToRawBytesInternal(Image inputImage, Cancell TaskCount = Options.TaskCount }; - // Encode all mipmap levels + // EncodeBlock all mipmap levels for (var mip = 0; mip < numMipMaps; mip++) { byte[] encoded; @@ -686,7 +686,7 @@ private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, TaskCount = Options.TaskCount }; - // Encode mipmap level + // EncodeBlock mipmap level byte[] encoded; if (isCompressedFormat) { @@ -791,12 +791,12 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le TaskCount = Options.TaskCount }; - // Encode all faces + // EncodeBlock all faces for (var face = 0; face < faces.Length; face++) { var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); - // Encode all mipmap levels per face + // EncodeBlock all mipmap levels per face for (var mip = 0; mip < numMipMaps; mip++) { byte[] encoded; @@ -895,12 +895,12 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le TaskCount = Options.TaskCount }; - // Encode all faces + // EncodeBlock all faces for (var face = 0; face < faces.Length; face++) { var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); - // Encode all mipmap levels per face + // EncodeBlock all mipmap levels per face for (var mip = 0; mip < numMipMaps; mip++) { byte[] encoded; diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index 8b4a7cb..22d39e2 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -1,7 +1,5 @@ using System; -using System.Diagnostics; using System.Runtime.InteropServices; -using BCnEncoder.Encoder; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared @@ -118,7 +116,7 @@ public readonly RawBlock4X4Rgba32 Decode() [StructLayout(LayoutKind.Sequential)] internal unsafe struct Bc3Block { - public Bc4Block alphaBlock; + public Bc4ComponentBlock alphaBlock; public ColorRgb565 color0; public ColorRgb565 color1; public uint colorIndices; @@ -165,120 +163,53 @@ public readonly RawBlock4X4Rgba32 Decode() color0.InterpolateThird(color1, 2) }; + var alphas = alphaBlock.Decode(); + for (var i = 0; i < pixels.Length; i++) { var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); var color = colors[colorIndex]; - pixels[i] = new Rgba32(color.r, color.g, color.b, alphaBlock.DecodeSingle(i)); + pixels[i] = new Rgba32(color.r, color.g, color.b, alphas[i]); } return output; } } [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc4Block + internal struct Bc4Block { - public ulong componentBlock; + public Bc4ComponentBlock redBlock; public byte Endpoint0 { - readonly get => (byte)(componentBlock & 0xFFUL); - set - { - componentBlock &= ~0xFFUL; - componentBlock |= value; - } + readonly get => redBlock.Endpoint0; + set => redBlock.Endpoint0 = value; } public byte Endpoint1 { - readonly get => (byte)((componentBlock >> 8) & 0xFFUL); - set - { - componentBlock &= ~0xFF00UL; - componentBlock |= (ulong)value << 8; - } - } - - public readonly byte GetComponentIndex(int pixelIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - var redIndex = (componentBlock & mask) >> shift; - return (byte)redIndex; - } - - public void SetComponentIndex(int pixelIndex, byte redIndex) - { - var mask = 0b0111UL << (pixelIndex * 3 + 16); - var shift = pixelIndex * 3 + 16; - componentBlock &= ~mask; - componentBlock |= (ulong)(redIndex & 0b111) << shift; + readonly get => redBlock.Endpoint1; + set => redBlock.Endpoint1 = value; } - public readonly byte DecodeSingle(int pixelIndex) - { - var r0 = Endpoint0; - var r1 = Endpoint1; - - var reds = r0 > r1 ? stackalloc byte[] { - r0, - r1, - r0.InterpolateSeventh(r1, 1), - r0.InterpolateSeventh(r1, 2), - r0.InterpolateSeventh(r1, 3), - r0.InterpolateSeventh(r1, 4), - r0.InterpolateSeventh(r1, 5), - r0.InterpolateSeventh(r1, 6), - } : stackalloc byte[] { - r0, - r1, - r0.InterpolateFifth(r1, 1), - r0.InterpolateFifth(r1, 2), - r0.InterpolateFifth(r1, 3), - r0.InterpolateFifth(r1, 4), - 0, - 255 - }; + public readonly byte GetComponentIndex(int pixelIndex) => redBlock.GetComponentIndex(pixelIndex); - return reds[GetComponentIndex(pixelIndex)]; - } + public void SetComponentIndex(int pixelIndex, byte redIndex) => redBlock.SetComponentIndex(pixelIndex, redIndex); - public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance, Bc4Component component) + public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) { var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; - var c0 = Endpoint0; - var c1 = Endpoint1; - - var components = c0 > c1 ? stackalloc byte[] { - c0, - c1, - c0.InterpolateSeventh(c1, 1), - c0.InterpolateSeventh(c1, 2), - c0.InterpolateSeventh(c1, 3), - c0.InterpolateSeventh(c1, 4), - c0.InterpolateSeventh(c1, 5), - c0.InterpolateSeventh(c1, 6), - } : stackalloc byte[] { - c0, - c1, - c0.InterpolateFifth(c1, 1), - c0.InterpolateFifth(c1, 2), - c0.InterpolateFifth(c1, 3), - c0.InterpolateFifth(c1, 4), - 0, - 255 - }; + var reds = redBlock.Decode(); if (redAsLuminance) { for (var i = 0; i < pixels.Length; i++) { var index = GetComponentIndex(i); - pixels[i] = new Rgba32(components[index], components[index], components[index], 255); + pixels[i] = new Rgba32(reds[index], reds[index], reds[index], 255); } } else @@ -286,24 +217,7 @@ public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance, Bc4Component compo for (var i = 0; i < pixels.Length; i++) { var index = GetComponentIndex(i); - switch (component) - { - case Bc4Component.R: - pixels[i] = new Rgba32(components[index], 0, 0, 255); - break; - - case Bc4Component.G: - pixels[i] = new Rgba32(0, components[index], 0, 255); - break; - - case Bc4Component.B: - pixels[i] = new Rgba32(0, 0, components[index], 255); - break; - - case Bc4Component.A: - pixels[i] = new Rgba32(0, 0, 0, components[index]); - break; - } + pixels[i] = new Rgba32(reds[index], 0, 0, 255); } } @@ -312,10 +226,10 @@ public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance, Bc4Component compo } [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc5Block + internal struct Bc5Block { - public Bc4Block redBlock; - public Bc4Block greenBlock; + public Bc4ComponentBlock redBlock; + public Bc4ComponentBlock greenBlock; public byte Red0 { @@ -354,55 +268,12 @@ public readonly RawBlock4X4Rgba32 Decode() var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; - var r0 = Red0; - var r1 = Red1; - - var reds = r0 > r1 ? stackalloc byte[] { - r0, - r1, - r0.InterpolateSeventh(r1, 1), - r0.InterpolateSeventh(r1, 2), - r0.InterpolateSeventh(r1, 3), - r0.InterpolateSeventh(r1, 4), - r0.InterpolateSeventh(r1, 5), - r0.InterpolateSeventh(r1, 6), - } : stackalloc byte[] { - r0, - r1, - r0.InterpolateFifth(r1, 1), - r0.InterpolateFifth(r1, 2), - r0.InterpolateFifth(r1, 3), - r0.InterpolateFifth(r1, 4), - 0, - 255 - }; - - var g0 = Green0; - var g1 = Green1; - - var greens = g0 > g1 ? stackalloc byte[] { - g0, - g1, - g0.InterpolateSeventh(g1, 1), - g0.InterpolateSeventh(g1, 2), - g0.InterpolateSeventh(g1, 3), - g0.InterpolateSeventh(g1, 4), - g0.InterpolateSeventh(g1, 5), - g0.InterpolateSeventh(g1, 6), - } : stackalloc byte[] { - g0, - g1, - g0.InterpolateFifth(g1, 1), - g0.InterpolateFifth(g1, 2), - g0.InterpolateFifth(g1, 3), - g0.InterpolateFifth(g1, 4), - 0, - 255 - }; + var reds = redBlock.Decode(); + var greens = greenBlock.Decode(); for (var i = 0; i < pixels.Length; i++) { - pixels[i] = new Rgba32(redBlock.DecodeSingle(i), greenBlock.DecodeSingle(i), 0, 255); + pixels[i] = new Rgba32(reds[i], greens[i], 0, 255); } return output; @@ -477,6 +348,84 @@ public void SetAlpha(int index, byte alpha) } } + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Bc4ComponentBlock + { + public ulong componentBlock; + + public byte Endpoint0 + { + readonly get => (byte)(componentBlock & 0xFFUL); + set + { + componentBlock &= ~0xFFUL; + componentBlock |= value; + } + } + + public byte Endpoint1 + { + readonly get => (byte)((componentBlock >> 8) & 0xFFUL); + set + { + componentBlock &= ~0xFF00UL; + componentBlock |= (ulong)value << 8; + } + } + + public readonly byte GetComponentIndex(int pixelIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + var redIndex = (componentBlock & mask) >> shift; + return (byte)redIndex; + } + + public void SetComponentIndex(int pixelIndex, byte redIndex) + { + var mask = 0b0111UL << (pixelIndex * 3 + 16); + var shift = pixelIndex * 3 + 16; + componentBlock &= ~mask; + componentBlock |= (ulong)(redIndex & 0b111) << shift; + } + + public readonly byte[] Decode() + { + var output = new byte[16]; + + var c0 = Endpoint0; + var c1 = Endpoint1; + + var components = c0 > c1 ? stackalloc byte[] { + c0, + c1, + c0.InterpolateSeventh(c1, 1), + c0.InterpolateSeventh(c1, 2), + c0.InterpolateSeventh(c1, 3), + c0.InterpolateSeventh(c1, 4), + c0.InterpolateSeventh(c1, 5), + c0.InterpolateSeventh(c1, 6), + } : stackalloc byte[] { + c0, + c1, + c0.InterpolateFifth(c1, 1), + c0.InterpolateFifth(c1, 2), + c0.InterpolateFifth(c1, 3), + c0.InterpolateFifth(c1, 4), + 0, + 255 + }; + + for (var i = 0; i < output.Length; i++) + { + var index = GetComponentIndex(i); + output[i] = components[index]; + } + + return output; + } + } + [StructLayout(LayoutKind.Sequential)] internal struct AtcExplicitAlphaBlock { @@ -499,7 +448,7 @@ public readonly RawBlock4X4Rgba32 Decode() [StructLayout(LayoutKind.Sequential)] internal struct AtcInterpolatedAlphaBlock { - public Bc4Block alphas; + public Bc4ComponentBlock alphas; public AtcBlock colors; public readonly RawBlock4X4Rgba32 Decode() @@ -507,9 +456,11 @@ public readonly RawBlock4X4Rgba32 Decode() var output = colors.Decode(); var pixels = output.AsSpan; + var componentValues = alphas.Decode(); + for (var i = 0; i < pixels.Length; i++) { - pixels[i].A = (byte)alphas.DecodeSingle(i); + pixels[i].A = componentValues[i]; } return output; } From 7c8919be68b3cd5a7ca14b805c0343cf7d892360 Mon Sep 17 00:00:00 2001 From: Nominom Date: Mon, 18 Jan 2021 17:31:43 +0200 Subject: [PATCH 041/116] Finish merge --- BCnEnc.Net/Encoder/BcEncoder.cs | 2 +- BCnEncTests/Bc5Tests.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 702b4c0..a92b390 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -694,7 +694,7 @@ private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, IsParallel = !Debugger.IsAttached && Options.IsParallel, TaskCount = Options.TaskCount }; - + // Encode mipmap level byte[] encoded; if (isCompressedFormat) diff --git a/BCnEncTests/Bc5Tests.cs b/BCnEncTests/Bc5Tests.cs index 174ea85..798ecae 100644 --- a/BCnEncTests/Bc5Tests.cs +++ b/BCnEncTests/Bc5Tests.cs @@ -56,8 +56,8 @@ public void Bc5BlockDecode() { var block = new Bc5Block() { - greenBlock = 0x91824260008935ee, - redBlock = 0x6d900f66d3c0a70d + greenBlock = new Bc4ComponentBlock(){componentBlock = 0x91824260008935ee}, + redBlock = new Bc4ComponentBlock() { componentBlock = 0x6d900f66d3c0a70d } }; var referenceBlock = new RawBlock4X4Rgba32 From 2e74cb848a85ea477178b60ad59380130189fc63 Mon Sep 17 00:00:00 2001 From: Petar Tasev Date: Mon, 18 Jan 2021 09:54:59 -0800 Subject: [PATCH 042/116] Addressed review comments. --- BCnEnc.Net/Decoder/RawDecoder.cs | 25 +---- BCnEnc.Net/Encoder/RawEncoders.cs | 168 ++++++++++++++++++++++-------- 2 files changed, 130 insertions(+), 63 deletions(-) diff --git a/BCnEnc.Net/Decoder/RawDecoder.cs b/BCnEnc.Net/Decoder/RawDecoder.cs index 0497c86..7dfbeef 100644 --- a/BCnEnc.Net/Decoder/RawDecoder.cs +++ b/BCnEnc.Net/Decoder/RawDecoder.cs @@ -42,10 +42,7 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh var span = data.Span; for (var i = 0; i < output.Length; i++) { - if (context.CancellationToken.IsCancellationRequested) - { - break; - } + context.CancellationToken.ThrowIfCancellationRequested(); if (redAsLuminance) { @@ -89,10 +86,7 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh var span = data.Span; for (var i = 0; i < output.Length; i++) { - if (context.CancellationToken.IsCancellationRequested) - { - break; - } + context.CancellationToken.ThrowIfCancellationRequested(); output[i].R = span[i * 2]; output[i].G = span[i * 2 + 1]; @@ -126,10 +120,7 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh var span = data.Span; for (var i = 0; i < output.Length; i++) { - if (context.CancellationToken.IsCancellationRequested) - { - break; - } + context.CancellationToken.ThrowIfCancellationRequested(); output[i].R = span[i * 3]; output[i].G = span[i * 3 + 1]; @@ -163,10 +154,7 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh var span = data.Span; for (var i = 0; i < output.Length; i++) { - if (context.CancellationToken.IsCancellationRequested) - { - break; - } + context.CancellationToken.ThrowIfCancellationRequested(); output[i].R = span[i * 4]; output[i].G = span[i * 4 + 1]; @@ -200,10 +188,7 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh var span = data.Span; for (var i = 0; i < output.Length; i++) { - if (context.CancellationToken.IsCancellationRequested) - { - break; - } + context.CancellationToken.ThrowIfCancellationRequested(); output[i].B = span[i * 4]; output[i].G = span[i * 4 + 1]; diff --git a/BCnEnc.Net/Encoder/RawEncoders.cs b/BCnEnc.Net/Encoder/RawEncoders.cs index 1bb11a8..2532f71 100644 --- a/BCnEnc.Net/Encoder/RawEncoders.cs +++ b/BCnEnc.Net/Encoder/RawEncoders.cs @@ -15,49 +15,71 @@ internal interface IRawEncoder DxgiFormat GetDxgiFormat(); } - internal class RawLuminanceEncoder : IRawEncoder { + internal class RawLuminanceEncoder : IRawEncoder + { private readonly bool useLuminance; - public RawLuminanceEncoder(bool useLuminance) { + public RawLuminanceEncoder(bool useLuminance) + { this.useLuminance = useLuminance; } - public byte[] Encode(ReadOnlySpan pixels) { + public byte[] Encode(ReadOnlySpan pixels) + { var output = new byte[pixels.Length]; - for (var i = 0; i < pixels.Length; i++) { - if (useLuminance) { + for (var i = 0; i < pixels.Length; i++) + { + if (useLuminance) + { output[i] = (byte)(new ColorYCbCr(pixels[i]).y * 255); } - else { + else + { output[i] = pixels[i].R; } - + } return output; } public GlInternalFormat GetInternalFormat() - => GlInternalFormat.GlR8; + { + return GlInternalFormat.GlR8; + } public GlFormat GetBaseInternalFormat() - => GlFormat.GlRed; + { + return GlFormat.GlRed; + } - public GlFormat GetGlFormat() => GlFormat.GlRed; + public GlFormat GetGlFormat() + { + return GlFormat.GlRed; + } public GlType GetGlType() - => GlType.GlByte; + { + return GlType.GlByte; + } public uint GetGlTypeSize() - => 1; + { + return 1; + } - public DxgiFormat GetDxgiFormat() => DxgiFormat.DxgiFormatR8Unorm; + public DxgiFormat GetDxgiFormat() + { + return DxgiFormat.DxgiFormatR8Unorm; + } } internal class RawRgEncoder : IRawEncoder { - public byte[] Encode(ReadOnlySpan pixels) { + public byte[] Encode(ReadOnlySpan pixels) + { var output = new byte[pixels.Length * 2]; - for (var i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) + { output[i * 2] = pixels[i].R; output[i * 2 + 1] = pixels[i].G; } @@ -65,27 +87,43 @@ public byte[] Encode(ReadOnlySpan pixels) { } public GlInternalFormat GetInternalFormat() - => GlInternalFormat.GlRg8; + { + return GlInternalFormat.GlRg8; + } public GlFormat GetBaseInternalFormat() - => GlFormat.GlRg; + { + return GlFormat.GlRg; + } - public GlFormat GetGlFormat() => GlFormat.GlRg; + public GlFormat GetGlFormat() + { + return GlFormat.GlRg; + } public GlType GetGlType() - => GlType.GlByte; + { + return GlType.GlByte; + } public uint GetGlTypeSize() - => 1; + { + return 1; + } - public DxgiFormat GetDxgiFormat() => DxgiFormat.DxgiFormatR8G8Unorm; + public DxgiFormat GetDxgiFormat() + { + return DxgiFormat.DxgiFormatR8G8Unorm; + } } internal class RawRgbEncoder : IRawEncoder { - public byte[] Encode(ReadOnlySpan pixels) { + public byte[] Encode(ReadOnlySpan pixels) + { var output = new byte[pixels.Length * 3]; - for (var i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) + { output[i * 3] = pixels[i].R; output[i * 3 + 1] = pixels[i].G; output[i * 3 + 2] = pixels[i].B; @@ -94,27 +132,43 @@ public byte[] Encode(ReadOnlySpan pixels) { } public GlInternalFormat GetInternalFormat() - => GlInternalFormat.GlRgb8; + { + return GlInternalFormat.GlRgb8; + } public GlFormat GetBaseInternalFormat() - => GlFormat.GlRgb; + { + return GlFormat.GlRgb; + } - public GlFormat GetGlFormat() => GlFormat.GlRgb; + public GlFormat GetGlFormat() + { + return GlFormat.GlRgb; + } public GlType GetGlType() - => GlType.GlByte; + { + return GlType.GlByte; + } public uint GetGlTypeSize() - => 1; + { + return 1; + } - public DxgiFormat GetDxgiFormat() => throw new NotSupportedException("RGB Format is not supported for dds files."); + public DxgiFormat GetDxgiFormat() + { + throw new NotSupportedException("RGB Format is not supported for dds files."); + } } internal class RawRgbaEncoder : IRawEncoder { - public byte[] Encode(ReadOnlySpan pixels) { + public byte[] Encode(ReadOnlySpan pixels) + { var output = new byte[pixels.Length * 4]; - for (var i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) + { output[i * 4] = pixels[i].R; output[i * 4 + 1] = pixels[i].G; output[i * 4 + 2] = pixels[i].B; @@ -124,20 +178,34 @@ public byte[] Encode(ReadOnlySpan pixels) { } public GlInternalFormat GetInternalFormat() - => GlInternalFormat.GlRgba8; + { + return GlInternalFormat.GlRgba8; + } public GlFormat GetBaseInternalFormat() - => GlFormat.GlRgba; + { + return GlFormat.GlRgba; + } - public GlFormat GetGlFormat() => GlFormat.GlRgba; + public GlFormat GetGlFormat() + { + return GlFormat.GlRgba; + } public GlType GetGlType() - => GlType.GlByte; + { + return GlType.GlByte; + } public uint GetGlTypeSize() - => 1; + { + return 1; + } - public DxgiFormat GetDxgiFormat() => DxgiFormat.DxgiFormatR8G8B8A8Unorm; + public DxgiFormat GetDxgiFormat() + { + return DxgiFormat.DxgiFormatR8G8B8A8Unorm; + } } internal class RawBgraEncoder : IRawEncoder @@ -156,19 +224,33 @@ public byte[] Encode(ReadOnlySpan pixels) } public GlInternalFormat GetInternalFormat() - => throw new NotImplementedException(); + { + throw new NotImplementedException(); + } public GlFormat GetBaseInternalFormat() - => GlFormat.GlBgra; + { + return GlFormat.GlBgra; + } - public GlFormat GetGlFormat() => GlFormat.GlBgra; + public GlFormat GetGlFormat() + { + return GlFormat.GlBgra; + } public GlType GetGlType() - => GlType.GlByte; + { + return GlType.GlByte; + } public uint GetGlTypeSize() - => 1; + { + return 1; + } - public DxgiFormat GetDxgiFormat() => DxgiFormat.DxgiFormatB8G8R8A8Unorm; + public DxgiFormat GetDxgiFormat() + { + return DxgiFormat.DxgiFormatB8G8R8A8Unorm; + } } } From 5c6c0769b7bbda9107e7b20c9e24300073ce58fa Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Mon, 18 Jan 2021 19:53:34 +0100 Subject: [PATCH 043/116] Add progress context; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 7 +++++++ BCnEnc.Net/Decoder/BcDecoder.cs | 9 ++++++--- BCnEnc.Net/Decoder/Options/DecoderOptions.cs | 6 ++++++ BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 8 +++++++- BCnEnc.Net/Encoder/BcEncoder.cs | 19 +++++++++++++------ BCnEnc.Net/Encoder/Options/EncoderOptions.cs | 6 ++++++ BCnEnc.Net/Shared/OperationContext.cs | 5 +++++ BCnEnc.Net/Shared/ProgressElement.cs | 15 +++++++++++++++ 8 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 BCnEnc.Net/Shared/ProgressElement.cs diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index cdb5a28..ccb98fb 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -2,6 +2,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Threading; using System.Threading.Tasks; using BCnEncoder.Shared; @@ -28,6 +29,7 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana var output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; + var currentBlocks = 0; if (context.IsParallel) { var localBlockWidth = blockWidth; @@ -41,6 +43,9 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana { var encodedBlocks = MemoryMarshal.Cast(data.Span); output[i % localBlockWidth, i / localBlockWidth] = DecodeBlock(encodedBlocks[i]); + + var progressValue = Interlocked.Add(ref currentBlocks, 1); + context.Progress.Report(new ProgressElement(progressValue, output.Length)); }); } else @@ -53,6 +58,8 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana context.CancellationToken.ThrowIfCancellationRequested(); output[x, y] = DecodeBlock(encodedBlocks[x + y * blockWidth]); + + context.Progress.Report(new ProgressElement(currentBlocks++, output.Length)); } } } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 955b91b..48b170e 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -294,7 +294,8 @@ private Image[] Decode(KtxFile file, bool allMipMaps, CancellationToken { CancellationToken = token, IsParallel = Options.IsParallel, - TaskCount = Options.TaskCount + TaskCount = Options.TaskCount, + Progress = Options.Progress }; if (IsSupportedRawFormat(file.header.GlInternalFormat)) @@ -359,7 +360,8 @@ private Image[] Decode(DdsFile file, bool allMipMaps, CancellationToken { CancellationToken = token, IsParallel = Options.IsParallel, - TaskCount = Options.TaskCount + TaskCount = Options.TaskCount, + Progress = Options.Progress }; if (IsSupportedRawFormat(file.header.ddsPixelFormat.DxgiFormat)) @@ -435,7 +437,8 @@ private Image DecodeRawInternal(ReadOnlyMemory input, CompressionF { CancellationToken = token, IsParallel = Options.IsParallel, - TaskCount = Options.TaskCount + TaskCount = Options.TaskCount, + Progress = Options.Progress }; var isCompressedFormat = format.IsCompressedFormat(); diff --git a/BCnEnc.Net/Decoder/Options/DecoderOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderOptions.cs index 3357250..f265000 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderOptions.cs @@ -1,4 +1,5 @@ using System; +using BCnEncoder.Shared; namespace BCnEncoder.Decoder.Options { @@ -20,5 +21,10 @@ public class DecoderOptions /// Determines how many tasks should be used for parallel processing. /// public int TaskCount { get; set; } = Environment.ProcessorCount; + + /// + /// The progress context for the operation. + /// + public IProgress Progress { get; set; } } } diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index 0e3c747..1dcd1f1 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -1,6 +1,6 @@ -using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Threading; using System.Threading.Tasks; using BCnEncoder.Shared; @@ -12,6 +12,7 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight { var outputData = new byte[blockWidth * blockHeight * Unsafe.SizeOf()]; + var currentBlocks = 0; if (context.IsParallel) { var options = new ParallelOptions @@ -23,6 +24,9 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight { var outputBlocks = MemoryMarshal.Cast(outputData); outputBlocks[i] = EncodeBlock(blocks[i], quality); + + var progressValue = Interlocked.Add(ref currentBlocks, 1); + context.Progress.Report(new ProgressElement(progressValue, blocks.Length)); }); } else @@ -33,6 +37,8 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight context.CancellationToken.ThrowIfCancellationRequested(); outputBlocks[i] = EncodeBlock(blocks[i], quality); + + context.Progress.Report(new ProgressElement(currentBlocks++, blocks.Length)); } } diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index a92b390..0bf20a6 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -433,7 +433,8 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount + TaskCount = Options.TaskCount, + Progress = Options.Progress }; // Encode mipmap levels @@ -518,7 +519,8 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount + TaskCount = Options.TaskCount, + Progress = Options.Progress }; // Encode mipmap levels @@ -609,7 +611,8 @@ private IList EncodeToRawBytesInternal(Image inputImage, Cancell { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount + TaskCount = Options.TaskCount, + Progress = Options.Progress }; // Encode all mipmap levels @@ -651,6 +654,7 @@ private byte[] EncodeToRawBytesInternal(byte[] inputPixelsRgba, int inputImageWi { throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); } + using var image = Image.LoadPixelData(inputPixelsRgba, inputImageWidth, inputImageHeight); return EncodeToRawBytesInternal(image, mipLevel, out mipWidth, out mipHeight, token); } @@ -692,7 +696,8 @@ private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount + TaskCount = Options.TaskCount, + Progress = Options.Progress }; // Encode mipmap level @@ -799,7 +804,8 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount + TaskCount = Options.TaskCount, + Progress = Options.Progress }; // EncodeBlock all faces @@ -905,7 +911,8 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount + TaskCount = Options.TaskCount, + Progress = Options.Progress }; // EncodeBlock all faces diff --git a/BCnEnc.Net/Encoder/Options/EncoderOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOptions.cs index a82d18a..5d74d2e 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderOptions.cs @@ -1,4 +1,5 @@ using System; +using BCnEncoder.Shared; namespace BCnEncoder.Encoder.Options { @@ -19,5 +20,10 @@ public class EncoderOptions /// Determines how many tasks should be used for parallel processing. /// public int TaskCount { get; set; } = Environment.ProcessorCount; + + /// + /// The progress context for the operation. + /// + public IProgress Progress { get; set; } } } diff --git a/BCnEnc.Net/Shared/OperationContext.cs b/BCnEnc.Net/Shared/OperationContext.cs index f9381a4..91a181f 100644 --- a/BCnEnc.Net/Shared/OperationContext.cs +++ b/BCnEnc.Net/Shared/OperationContext.cs @@ -22,5 +22,10 @@ public class OperationContext /// The cancellation token to check if the asynchronous operation was cancelled. /// public CancellationToken CancellationToken { get; set; } + + /// + /// The progress context for the operation. + /// + public IProgress Progress { get; set; } } } diff --git a/BCnEnc.Net/Shared/ProgressElement.cs b/BCnEnc.Net/Shared/ProgressElement.cs new file mode 100644 index 0000000..17019ce --- /dev/null +++ b/BCnEnc.Net/Shared/ProgressElement.cs @@ -0,0 +1,15 @@ +namespace BCnEncoder.Shared +{ + public class ProgressElement + { + public int CurrentBlock { get; } + + public int TotalBlockses { get; } + + public ProgressElement(int currentBlock, int totalBlocks) + { + CurrentBlock = currentBlock; + TotalBlockses = totalBlocks; + } + } +} From dda006628b1eddc7e15153c695ea52e517028455 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Mon, 18 Jan 2021 20:03:05 +0100 Subject: [PATCH 044/116] Fix null reference exception; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 9 ++++++--- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index ccb98fb..53e6b2e 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -44,8 +44,11 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana var encodedBlocks = MemoryMarshal.Cast(data.Span); output[i % localBlockWidth, i / localBlockWidth] = DecodeBlock(encodedBlocks[i]); - var progressValue = Interlocked.Add(ref currentBlocks, 1); - context.Progress.Report(new ProgressElement(progressValue, output.Length)); + if (context.Progress != null) + { + var progressValue = Interlocked.Add(ref currentBlocks, 1); + context.Progress.Report(new ProgressElement(progressValue, output.Length)); + } }); } else @@ -59,7 +62,7 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana output[x, y] = DecodeBlock(encodedBlocks[x + y * blockWidth]); - context.Progress.Report(new ProgressElement(currentBlocks++, output.Length)); + context.Progress?.Report(new ProgressElement(currentBlocks++, output.Length)); } } } diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index 1dcd1f1..ff893af 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -25,8 +25,11 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight var outputBlocks = MemoryMarshal.Cast(outputData); outputBlocks[i] = EncodeBlock(blocks[i], quality); - var progressValue = Interlocked.Add(ref currentBlocks, 1); - context.Progress.Report(new ProgressElement(progressValue, blocks.Length)); + if (context.Progress != null) + { + var progressValue = Interlocked.Add(ref currentBlocks, 1); + context.Progress.Report(new ProgressElement(progressValue, blocks.Length)); + } }); } else @@ -38,7 +41,7 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight outputBlocks[i] = EncodeBlock(blocks[i], quality); - context.Progress.Report(new ProgressElement(currentBlocks++, blocks.Length)); + context.Progress?.Report(new ProgressElement(currentBlocks++, blocks.Length)); } } From b5d167cbf7ff940b6bd64bc9e9886b10e2c5adc0 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Tue, 19 Jan 2021 00:57:19 +0100 Subject: [PATCH 045/116] Convert GlinternalFormat and DxgiFormat into CompressionFormat in BcDecoder; Add progress wrapping for multiple mipmap decoding; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 4 +- BCnEnc.Net/Decoder/BcDecoder.cs | 366 ++++++++++++++--------- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 4 +- BCnEnc.Net/Encoder/BcEncoder.cs | 88 +++++- BCnEnc.Net/Shared/DdsFile.cs | 53 ++-- BCnEnc.Net/Shared/ImageToBlocks.cs | 4 +- BCnEnc.Net/Shared/OperationContext.cs | 2 +- BCnEnc.Net/Shared/OperationProgress.cs | 27 ++ BCnEnc.Net/Shared/ProgressElement.cs | 2 +- 9 files changed, 363 insertions(+), 187 deletions(-) create mode 100644 BCnEnc.Net/Shared/OperationProgress.cs diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index 53e6b2e..9ed652f 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -47,7 +47,7 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana if (context.Progress != null) { var progressValue = Interlocked.Add(ref currentBlocks, 1); - context.Progress.Report(new ProgressElement(progressValue, output.Length)); + context.Progress.Report(progressValue); } }); } @@ -62,7 +62,7 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana output[x, y] = DecodeBlock(encodedBlocks[x + y * blockWidth]); - context.Progress?.Report(new ProgressElement(currentBlocks++, output.Length)); + context.Progress?.Report(currentBlocks++); } } } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 54e44a3..1bff0da 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -4,6 +4,7 @@ using SixLabors.ImageSharp.PixelFormats; using System; using System.IO; +using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading; @@ -294,10 +295,15 @@ private Image[] Decode(KtxFile file, bool allMipMaps, CancellationToken { CancellationToken = token, IsParallel = Options.IsParallel, - TaskCount = Options.TaskCount, - Progress = Options.Progress + TaskCount = Options.TaskCount }; + // Calculate total blocks + var blockSize = GetBlockSize(file.header.GlInternalFormat); + var totalBlocks = file.MipMaps.Sum(m => m.Faces[0].Data.Length / blockSize); + + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + if (IsSupportedRawFormat(file.header.GlInternalFormat)) { var decoder = GetRawDecoder(file.header.GlInternalFormat); @@ -318,6 +324,8 @@ private Image[] Decode(KtxFile file, bool allMipMaps, CancellationToken output.CopyTo(pixels); images[mip] = image; + + context.Progress.SetProcessedBlocks(file.MipMaps.Take(mip + 1).Sum(x => x.Faces[0].Data.Length / blockSize)); } } else @@ -339,6 +347,8 @@ private Image[] Decode(KtxFile file, bool allMipMaps, CancellationToken out var blockWidth, out var blockHeight); images[mip] = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, (int)pixelWidth, (int)pixelHeight); + + context.Progress.SetProcessedBlocks(file.MipMaps.Take(mip + 1).Sum(x => x.Faces[0].Data.Length / blockSize)); } } @@ -360,13 +370,18 @@ private Image[] Decode(DdsFile file, bool allMipMaps, CancellationToken { CancellationToken = token, IsParallel = Options.IsParallel, - TaskCount = Options.TaskCount, - Progress = Options.Progress + TaskCount = Options.TaskCount }; - if (IsSupportedRawFormat(file.header.ddsPixelFormat.DxgiFormat)) + // Calculate total blocks + var blockSize = GetBlockSize(file); + var totalBlocks = file.Faces[0].MipMaps.Sum(m => m.Data.Length / blockSize); + + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + if (IsSupportedRawFormat(file)) { - var decoder = GetRawDecoder(file.header.ddsPixelFormat.DxgiFormat); + var decoder = GetRawDecoder(file); var mipMaps = allMipMaps ? file.header.dwMipMapCount : 1; for (var mip = 0; mip < mipMaps; mip++) @@ -384,14 +399,16 @@ private Image[] Decode(DdsFile file, bool allMipMaps, CancellationToken output.CopyTo(pixels); images[mip] = image; + + context.Progress.SetProcessedBlocks(file.Faces[0].MipMaps.Take(mip + 1).Sum(x => x.Data.Length / blockSize)); } } else { var format = file.header.ddsPixelFormat.IsDxt10Format ? - file.dxt10Header.dxgiFormat : + file.dx10Header.dxgiFormat : file.header.ddsPixelFormat.DxgiFormat; - var decoder = GetDecoder(format, file.header); + var decoder = GetDecoder(file); if (decoder == null) { @@ -411,6 +428,8 @@ private Image[] Decode(DdsFile file, bool allMipMaps, CancellationToken (int)pixelWidth, (int)pixelHeight); images[mip] = image; + + context.Progress.SetProcessedBlocks(file.Faces[0].MipMaps.Take(mip + 1).Sum(x => x.Data.Length / blockSize)); } } @@ -437,10 +456,15 @@ private Image DecodeRawInternal(ReadOnlyMemory input, CompressionF { CancellationToken = token, IsParallel = Options.IsParallel, - TaskCount = Options.TaskCount, - Progress = Options.Progress + TaskCount = Options.TaskCount }; + // Calculate total blocks + var blockSize = GetBlockSize(format); + var totalBlocks = input.Length / blockSize; + + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + var isCompressedFormat = format.IsCompressedFormat(); if (isCompressedFormat) { @@ -482,9 +506,9 @@ private bool IsSupportedRawFormat(GlInternalFormat format) } } - private bool IsSupportedRawFormat(DxgiFormat format) + private bool IsSupportedRawFormat(DdsFile file) { - switch (format) + switch (file.header.ddsPixelFormat.DxgiFormat) { case DxgiFormat.DxgiFormatR8Unorm: case DxgiFormat.DxgiFormatR8G8Unorm: @@ -497,42 +521,50 @@ private bool IsSupportedRawFormat(DxgiFormat format) } } + #region Get decoder + private IBcBlockDecoder GetDecoder(GlInternalFormat format) + { + return GetDecoder(GetCompressionFormat(format)); + } + + private IBcBlockDecoder GetDecoder(DdsFile file) + { + return GetDecoder(GetCompressionFormat(file)); + } + + private IBcBlockDecoder GetDecoder(CompressionFormat format) { switch (format) { - case GlInternalFormat.GlCompressedRgbS3TcDxt1Ext: + case CompressionFormat.Bc1: return new Bc1NoAlphaDecoder(); - case GlInternalFormat.GlCompressedRgbaS3TcDxt1Ext: + case CompressionFormat.Bc1WithAlpha: return new Bc1ADecoder(); - case GlInternalFormat.GlCompressedRgbaS3TcDxt3Ext: + case CompressionFormat.Bc2: return new Bc2Decoder(); - case GlInternalFormat.GlCompressedRgbaS3TcDxt5Ext: + case CompressionFormat.Bc3: return new Bc3Decoder(); - case GlInternalFormat.GlCompressedRedRgtc1Ext: + case CompressionFormat.Bc4: return new Bc4Decoder(OutputOptions.RedAsLuminance); - case GlInternalFormat.GlCompressedRedGreenRgtc2Ext: + case CompressionFormat.Bc5: return new Bc5Decoder(); - case GlInternalFormat.GlCompressedRgbaBptcUnormArb: - return new Bc7Decoder(); - - // TODO: Not sure what to do with SRGB input. - case GlInternalFormat.GlCompressedSrgbAlphaBptcUnormArb: + case CompressionFormat.Bc7: return new Bc7Decoder(); - case GlInternalFormat.GlCompressedRgbAtc: + case CompressionFormat.Atc: return new AtcDecoder(); - case GlInternalFormat.GlCompressedRgbaAtcExplicitAlpha: + case CompressionFormat.AtcExplicitAlpha: return new AtcExplicitAlphaDecoder(); - case GlInternalFormat.GlCompressedRgbaAtcInterpolatedAlpha: + case CompressionFormat.AtcInterpolatedAlpha: return new AtcInterpolatedAlphaDecoder(); default: @@ -540,159 +572,233 @@ private IBcBlockDecoder GetDecoder(GlInternalFormat format) } } - private IBcBlockDecoder GetDecoder(DxgiFormat format, DdsHeader header) - { - switch (format) - { - case DxgiFormat.DxgiFormatBc1Unorm: - case DxgiFormat.DxgiFormatBc1UnormSrgb: - case DxgiFormat.DxgiFormatBc1Typeless: - if ((header.ddsPixelFormat.dwFlags & PixelFormatFlags.DdpfAlphapixels) != 0) - return new Bc1ADecoder(); - - if (InputOptions.DdsBc1ExpectAlpha) - return new Bc1ADecoder(); - - return new Bc1NoAlphaDecoder(); - - case DxgiFormat.DxgiFormatBc2Unorm: - case DxgiFormat.DxgiFormatBc2UnormSrgb: - case DxgiFormat.DxgiFormatBc2Typeless: - return new Bc2Decoder(); - - case DxgiFormat.DxgiFormatBc3Unorm: - case DxgiFormat.DxgiFormatBc3UnormSrgb: - case DxgiFormat.DxgiFormatBc3Typeless: - return new Bc3Decoder(); - - case DxgiFormat.DxgiFormatBc4Unorm: - case DxgiFormat.DxgiFormatBc4Snorm: - case DxgiFormat.DxgiFormatBc4Typeless: - return new Bc4Decoder(OutputOptions.RedAsLuminance); - - case DxgiFormat.DxgiFormatBc5Unorm: - case DxgiFormat.DxgiFormatBc5Snorm: - case DxgiFormat.DxgiFormatBc5Typeless: - return new Bc5Decoder(); - - case DxgiFormat.DxgiFormatBc7Unorm: - case DxgiFormat.DxgiFormatBc7UnormSrgb: - case DxgiFormat.DxgiFormatBc7Typeless: - return new Bc7Decoder(); - - case DxgiFormat.DxgiFormatAtc: - return new AtcDecoder(); + #endregion - case DxgiFormat.DxgiFormatAtcExplicitAlpha: - return new AtcExplicitAlphaDecoder(); + #region Get raw decoder - case DxgiFormat.DxgiFormatAtcInterpolatedAlpha: - return new AtcInterpolatedAlphaDecoder(); + private IRawDecoder GetRawDecoder(GlInternalFormat format) + { + return GetRawDecoder(GetCompressionFormat(format)); + } - default: - return null; - } + private IRawDecoder GetRawDecoder(DdsFile file) + { + return GetRawDecoder(GetCompressionFormat(file)); } - private IRawDecoder GetRawDecoder(GlInternalFormat format) + private IRawDecoder GetRawDecoder(CompressionFormat format) { switch (format) { - case GlInternalFormat.GlR8: + case CompressionFormat.R: return new RawRDecoder(OutputOptions.RedAsLuminance); - case GlInternalFormat.GlRg8: + case CompressionFormat.Rg: return new RawRgDecoder(); - case GlInternalFormat.GlRgb8: + case CompressionFormat.Rgb: return new RawRgbDecoder(); - case GlInternalFormat.GlRgba8: + case CompressionFormat.Rgba: return new RawRgbaDecoder(); + case CompressionFormat.Bgra: + return new RawBgraDecoder(); + default: - return null; + throw new ArgumentOutOfRangeException(nameof(format), format, null); } } - private IRawDecoder GetRawDecoder(DxgiFormat format) - { - switch (format) - { - case DxgiFormat.DxgiFormatR8Unorm: - return new RawRDecoder(OutputOptions.RedAsLuminance); + #endregion - case DxgiFormat.DxgiFormatR8G8Unorm: - return new RawRgDecoder(); + #region Get block size - case DxgiFormat.DxgiFormatR8G8B8A8Unorm: - return new RawRgbaDecoder(); - - case DxgiFormat.DxgiFormatB8G8R8A8Unorm: - return new RawBgraDecoder(); + private int GetBlockSize(GlInternalFormat format) + { + return GetBlockSize(GetCompressionFormat(format)); + } - default: - return null; - } + private int GetBlockSize(DdsFile file) + { + return GetBlockSize(GetCompressionFormat(file)); } - private IBcBlockDecoder GetDecoder(CompressionFormat format) + private int GetBlockSize(CompressionFormat format) { switch (format) { - case CompressionFormat.Bc1: - return new Bc1NoAlphaDecoder(); + case CompressionFormat.R: + return 1; + + case CompressionFormat.Rg: + return 2; + case CompressionFormat.Rgb: + return 3; + + case CompressionFormat.Rgba: + return 4; + + case CompressionFormat.Bgra: + return 4; + + case CompressionFormat.Bc1: case CompressionFormat.Bc1WithAlpha: - return new Bc1ADecoder(); + return Unsafe.SizeOf(); case CompressionFormat.Bc2: - return new Bc2Decoder(); + return Unsafe.SizeOf(); case CompressionFormat.Bc3: - return new Bc3Decoder(); + return Unsafe.SizeOf(); case CompressionFormat.Bc4: - return new Bc4Decoder(OutputOptions.RedAsLuminance); + return Unsafe.SizeOf(); case CompressionFormat.Bc5: - return new Bc5Decoder(); + return Unsafe.SizeOf(); case CompressionFormat.Bc7: - return new Bc7Decoder(); + return Unsafe.SizeOf(); case CompressionFormat.Atc: - return new AtcDecoder(); + return Unsafe.SizeOf(); case CompressionFormat.AtcExplicitAlpha: - return new AtcExplicitAlphaDecoder(); + return Unsafe.SizeOf(); case CompressionFormat.AtcInterpolatedAlpha: - return new AtcInterpolatedAlphaDecoder(); + return Unsafe.SizeOf(); default: - return null; + throw new ArgumentOutOfRangeException(nameof(format), format, null); } } - private IRawDecoder GetRawDecoder(CompressionFormat format) + #endregion + + private CompressionFormat GetCompressionFormat(GlInternalFormat format) { switch (format) { - case CompressionFormat.R: - return new RawRDecoder(OutputOptions.RedAsLuminance); + case GlInternalFormat.GlR8: + return CompressionFormat.R; - case CompressionFormat.Rg: - return new RawRgDecoder(); + case GlInternalFormat.GlRg8: + return CompressionFormat.Rg; - case CompressionFormat.Rgb: - return new RawRgbDecoder(); + case GlInternalFormat.GlRgb8: + return CompressionFormat.Rgb; - case CompressionFormat.Rgba: - return new RawRgbaDecoder(); + case GlInternalFormat.GlRgba8: + return CompressionFormat.Rgba; - case CompressionFormat.Bgra: - return new RawBgraDecoder(); + // HINT: Bgra has no internal format to convert from + + case GlInternalFormat.GlCompressedRgbS3TcDxt1Ext: + return CompressionFormat.Bc1; + + case GlInternalFormat.GlCompressedRgbaS3TcDxt1Ext: + return CompressionFormat.Bc1WithAlpha; + + case GlInternalFormat.GlCompressedRgbaS3TcDxt3Ext: + return CompressionFormat.Bc2; + + case GlInternalFormat.GlCompressedRgbaS3TcDxt5Ext: + return CompressionFormat.Bc3; + + case GlInternalFormat.GlCompressedRedRgtc1Ext: + return CompressionFormat.Bc4; + + case GlInternalFormat.GlCompressedRedGreenRgtc2Ext: + return CompressionFormat.Bc5; + + // TODO: Not sure what to do with SRGB input. + case GlInternalFormat.GlCompressedRgbaBptcUnormArb: + case GlInternalFormat.GlCompressedSrgbAlphaBptcUnormArb: + return CompressionFormat.Bc7; + + case GlInternalFormat.GlCompressedRgbAtc: + return CompressionFormat.Atc; + + case GlInternalFormat.GlCompressedRgbaAtcExplicitAlpha: + return CompressionFormat.AtcExplicitAlpha; + + case GlInternalFormat.GlCompressedRgbaAtcInterpolatedAlpha: + return CompressionFormat.AtcInterpolatedAlpha; + + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } + } + + private CompressionFormat GetCompressionFormat(DdsFile file) + { + var format = file.header.ddsPixelFormat.IsDxt10Format ? + file.dx10Header.dxgiFormat : + file.header.ddsPixelFormat.DxgiFormat; + + switch (format) + { + case DxgiFormat.DxgiFormatR8Unorm: + return CompressionFormat.R; + + case DxgiFormat.DxgiFormatR8G8Unorm: + return CompressionFormat.Rg; + + // HINT: R8G8B8 has no DxgiFormat to convert from + + case DxgiFormat.DxgiFormatR8G8B8A8Unorm: + return CompressionFormat.Rgba; + + case DxgiFormat.DxgiFormatB8G8R8A8Unorm: + return CompressionFormat.Bgra; + + case DxgiFormat.DxgiFormatBc1Unorm: + case DxgiFormat.DxgiFormatBc1UnormSrgb: + case DxgiFormat.DxgiFormatBc1Typeless: + if (file.header.ddsPixelFormat.dwFlags.HasFlag(PixelFormatFlags.DdpfAlphapixels)) + return CompressionFormat.Bc1WithAlpha; + + if (InputOptions.DdsBc1ExpectAlpha) + return CompressionFormat.Bc1WithAlpha; + + return CompressionFormat.Bc1; + + case DxgiFormat.DxgiFormatBc2Unorm: + case DxgiFormat.DxgiFormatBc2UnormSrgb: + case DxgiFormat.DxgiFormatBc2Typeless: + return CompressionFormat.Bc2; + + case DxgiFormat.DxgiFormatBc3Unorm: + case DxgiFormat.DxgiFormatBc3UnormSrgb: + case DxgiFormat.DxgiFormatBc3Typeless: + return CompressionFormat.Bc3; + + case DxgiFormat.DxgiFormatBc4Unorm: + case DxgiFormat.DxgiFormatBc4Snorm: + case DxgiFormat.DxgiFormatBc4Typeless: + return CompressionFormat.Bc4; + + case DxgiFormat.DxgiFormatBc5Unorm: + case DxgiFormat.DxgiFormatBc5Snorm: + case DxgiFormat.DxgiFormatBc5Typeless: + return CompressionFormat.Bc5; + + case DxgiFormat.DxgiFormatBc7Unorm: + case DxgiFormat.DxgiFormatBc7UnormSrgb: + case DxgiFormat.DxgiFormatBc7Typeless: + return CompressionFormat.Bc7; + + case DxgiFormat.DxgiFormatAtc: + return CompressionFormat.Atc; + + case DxgiFormat.DxgiFormatAtcExplicitAlpha: + return CompressionFormat.AtcExplicitAlpha; + + case DxgiFormat.DxgiFormatAtcInterpolatedAlpha: + return CompressionFormat.AtcInterpolatedAlpha; default: throw new ArgumentOutOfRangeException(nameof(format), format, null); @@ -718,31 +824,15 @@ private int GetBufferSize(CompressionFormat format, int pixelWidth, int pixelHei case CompressionFormat.Bc1: case CompressionFormat.Bc1WithAlpha: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Bc2: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Bc3: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Bc4: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Bc5: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Bc7: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.Atc: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.AtcExplicitAlpha: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); - case CompressionFormat.AtcInterpolatedAlpha: - return Unsafe.SizeOf() * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + return GetBlockSize(format) * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); default: throw new ArgumentOutOfRangeException(nameof(format), format, null); diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index ff893af..3f66de4 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -28,7 +28,7 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight if (context.Progress != null) { var progressValue = Interlocked.Add(ref currentBlocks, 1); - context.Progress.Report(new ProgressElement(progressValue, blocks.Length)); + context.Progress.Report(progressValue); } }); } @@ -41,7 +41,7 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight outputBlocks[i] = EncodeBlock(blocks[i], quality); - context.Progress?.Report(new ProgressElement(currentBlocks++, blocks.Length)); + context.Progress?.Report(currentBlocks++); } } diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 29d0465..326a9b8 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; using BCnEncoder.Encoder.Bc7; @@ -433,10 +434,13 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount, - Progress = Options.Progress + TaskCount = Options.TaskCount }; + // Calculate total blocks + var totalBlocks = isCompressedFormat ? mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)) : mipChain.Sum(m => m.Width * m.Height); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + // Encode mipmap levels for (var mip = 0; mip < numMipMaps; mip++) { @@ -447,6 +451,8 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); } else { @@ -454,6 +460,8 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken throw new Exception("Cannot get pixel span."); encoded = uncompressedEncoder.Encode(mipPixels); + + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); } output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, @@ -519,10 +527,13 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount, - Progress = Options.Progress + TaskCount = Options.TaskCount }; + // Calculate total blocks + var totalBlocks = isCompressedFormat ? mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)) : mipChain.Sum(m => m.Width * m.Height); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + // Encode mipmap levels for (var mip = 0; mip < numMipMaps; mip++) { @@ -531,6 +542,8 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); } else { @@ -540,6 +553,8 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken } encoded = uncompressedEncoder.Encode(mipPixels); + + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); } if (mip == 0) @@ -611,10 +626,13 @@ private IList EncodeToRawBytesInternal(Image inputImage, Cancell { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount, - Progress = Options.Progress + TaskCount = Options.TaskCount }; + // Calculate total blocks + var totalBlocks = isCompressedFormat ? mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)) : mipChain.Sum(m => m.Width * m.Height); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + // Encode all mipmap levels for (var mip = 0; mip < numMipMaps; mip++) { @@ -623,6 +641,8 @@ private IList EncodeToRawBytesInternal(Image inputImage, Cancell { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); } else { @@ -632,6 +652,8 @@ private IList EncodeToRawBytesInternal(Image inputImage, Cancell } encoded = uncompressedEncoder.Encode(mipPixels); + + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); } output.Add(encoded); @@ -696,10 +718,13 @@ private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount, - Progress = Options.Progress + TaskCount = Options.TaskCount }; + // Calculate total blocks + var totalBlocks = isCompressedFormat ? ImageToBlocks.CalculateNumOfBlocks(mipChain[mipLevel].Width, mipChain[mipLevel].Height) : mipChain[mipLevel].Width * mipChain[mipLevel].Height; + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + // Encode mipmap level byte[] encoded; if (isCompressedFormat) @@ -720,7 +745,6 @@ private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, mipWidth = mipChain[mipLevel].Width; mipHeight = mipChain[mipLevel].Height; - return encoded; } finally @@ -804,11 +828,23 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount, - Progress = Options.Progress + TaskCount = Options.TaskCount }; - // EncodeBlock all faces + // Calculate total blocks + var totalBlocks = 0; + foreach (var face in faces) + { + for (var mip = 0; mip < numMipMaps; mip++) + { + MipMapper.CalculateMipLevelSize(face.Width, face.Height, mip, out var mipWidth, out var mipHeight); + totalBlocks += isCompressedFormat ? ImageToBlocks.CalculateNumOfBlocks(mipWidth, mipHeight) : mipWidth * mipHeight; + } + } + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + // Encode all faces + var processedBlocks = 0; for (var face = 0; face < faces.Length; face++) { var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); @@ -822,6 +858,9 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + processedBlocks += blocks.Length; + context.Progress.SetProcessedBlocks(processedBlocks); } else { @@ -831,6 +870,9 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le } encoded = uncompressedEncoder.Encode(mipPixels); + + processedBlocks += mipPixels.Length; + context.Progress.SetProcessedBlocks(processedBlocks); } if (face == 0) @@ -911,11 +953,23 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le { CancellationToken = token, IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount, - Progress = Options.Progress + TaskCount = Options.TaskCount }; + // Calculate total blocks + var totalBlocks = 0; + foreach (var face in faces) + { + for (var mip = 0; mip < numMipMaps; mip++) + { + MipMapper.CalculateMipLevelSize(face.Width, face.Height, mip, out var mipWidth, out var mipHeight); + totalBlocks += isCompressedFormat ? ImageToBlocks.CalculateNumOfBlocks(mipWidth, mipHeight) : mipWidth * mipHeight; + } + } + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + // EncodeBlock all faces + var processedBlocks = 0; for (var face = 0; face < faces.Length; face++) { var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); @@ -929,6 +983,9 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le { var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + processedBlocks += blocks.Length; + context.Progress.SetProcessedBlocks(processedBlocks); } else { @@ -938,6 +995,9 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le } encoded = uncompressedEncoder.Encode(mipPixels); + + processedBlocks += mipPixels.Length; + context.Progress.SetProcessedBlocks(processedBlocks); } if (mip == 0) diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index 4903527..57e424a 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -9,7 +9,7 @@ namespace BCnEncoder.Shared public class DdsFile { public DdsHeader header; - public DdsHeaderDxt10 dxt10Header; + public DdsHeaderDx10 dx10Header; public List Faces { get; } = new List(); public DdsFile() { } @@ -18,10 +18,10 @@ public DdsFile(DdsHeader header) this.header = header; } - public DdsFile(DdsHeader header, DdsHeaderDxt10 dxt10Header) + public DdsFile(DdsHeader header, DdsHeaderDx10 dx10Header) { this.header = header; - this.dxt10Header = dxt10Header; + this.dx10Header = dx10Header; } public static DdsFile Load(Stream s) @@ -34,20 +34,20 @@ public static DdsFile Load(Stream s) throw new FormatException("The file does not contain a dds file."); } var header = br.ReadStruct(); - DdsHeaderDxt10 dxt10Header = default; + DdsHeaderDx10 dx10Header = default; if (header.dwSize != 124) { throw new FormatException("The file header contains invalid dwSize."); } - var dxt10Format = header.ddsPixelFormat.IsDxt10Format; + var dx10Format = header.ddsPixelFormat.IsDxt10Format; DdsFile output; - if (dxt10Format) + if (dx10Format) { - dxt10Header = br.ReadStruct(); - output = new DdsFile(header, dxt10Header); + dx10Header = br.ReadStruct(); + output = new DdsFile(header, dx10Header); } else { @@ -62,7 +62,7 @@ public static DdsFile Load(Stream s) for (var face = 0; face < faceCount; face++) { var sizeInBytes = Math.Max(1, (width + 3) / 4) * Math.Max(1, (height + 3) / 4); - if (!dxt10Format) + if (!dx10Format) { if (header.ddsPixelFormat.IsDxt1To5CompressedFormat) { @@ -80,9 +80,9 @@ public static DdsFile Load(Stream s) sizeInBytes = header.dwPitchOrLinearSize * height; } } - else if (dxt10Header.dxgiFormat.IsCompressedFormat()) + else if (dx10Header.dxgiFormat.IsCompressedFormat()) { - sizeInBytes = (uint)(sizeInBytes * dxt10Header.dxgiFormat.GetByteSize()); + sizeInBytes = (uint)(sizeInBytes * dx10Header.dxgiFormat.GetByteSize()); } else { @@ -101,7 +101,7 @@ public static DdsFile Load(Stream s) if (mip > 0) //Calculate new byteSize { sizeInBytes = Math.Max(1, (mipWidth + 3) / 4) * Math.Max(1, (mipHeight + 3) / 4); - if (!dxt10Format) + if (!dx10Format) { if (header.ddsPixelFormat.IsDxt1To5CompressedFormat) { @@ -119,9 +119,9 @@ public static DdsFile Load(Stream s) sizeInBytes = header.dwPitchOrLinearSize / (uint)Math.Pow(2, mip) * mipHeight; } } - else if (dxt10Header.dxgiFormat.IsCompressedFormat()) + else if (dx10Header.dxgiFormat.IsCompressedFormat()) { - sizeInBytes = (uint)(sizeInBytes * dxt10Header.dxgiFormat.GetByteSize()); + sizeInBytes = (uint)(sizeInBytes * dx10Header.dxgiFormat.GetByteSize()); } else { @@ -186,7 +186,7 @@ public void Write(Stream outputStream) if (header.ddsPixelFormat.IsDxt10Format) { - bw.WriteStruct(dxt10Header); + bw.WriteStruct(dx10Header); } for (var face = 0; face < faceCount; face++) @@ -221,10 +221,10 @@ public unsafe struct DdsHeader public uint dwCaps4; public uint dwReserved2; - public static (DdsHeader, DdsHeaderDxt10) InitializeCompressed(int width, int height, DxgiFormat format) + public static (DdsHeader, DdsHeaderDx10) InitializeCompressed(int width, int height, DxgiFormat format) { var header = new DdsHeader(); - var dxt10Header = new DdsHeaderDxt10(); + var dxt10Header = new DdsHeaderDx10(); header.dwSize = 124; header.dwFlags = HeaderFlags.Required; @@ -237,7 +237,7 @@ public static (DdsHeader, DdsHeaderDxt10) InitializeCompressed(int width, int he switch (format) { case DxgiFormat.DxgiFormatBc1Unorm: - header.ddsPixelFormat=new DdsPixelFormat + header.ddsPixelFormat = new DdsPixelFormat { dwSize = 32, dwFlags = PixelFormatFlags.DdpfFourcc, @@ -423,7 +423,7 @@ public DxgiFormat DxgiFormat { get { - if ((dwFlags & PixelFormatFlags.DdpfFourcc) != 0) + if (dwFlags.HasFlag(PixelFormatFlags.DdpfFourcc)) { switch (dwFourCc) { @@ -449,9 +449,9 @@ public DxgiFormat DxgiFormat } else { - if ((dwFlags & PixelFormatFlags.DdpfRgb) != 0) // RGB/A + if (dwFlags.HasFlag(PixelFormatFlags.DdpfRgb)) // RGB/A { - if ((dwFlags & PixelFormatFlags.DdpfAlphapixels) != 0) //RGBA + if (dwFlags.HasFlag(PixelFormatFlags.DdpfAlphapixels)) //RGBA { if (dwRgbBitCount == 32) { @@ -460,8 +460,9 @@ public DxgiFormat DxgiFormat { return DxgiFormat.DxgiFormatR8G8B8A8Unorm; } - else if (dwRBitMask == 0xff0000 && dwGBitMask == 0xff00 && dwBBitMask == 0xff && - dwABitMask == 0xff000000) + + if (dwRBitMask == 0xff0000 && dwGBitMask == 0xff00 && dwBBitMask == 0xff && + dwABitMask == 0xff000000) { return DxgiFormat.DxgiFormatB8G8R8A8Unorm; } @@ -478,9 +479,9 @@ public DxgiFormat DxgiFormat } } } - else if ((dwFlags & PixelFormatFlags.DdpfLuminance) != 0) // R/RG + else if (dwFlags.HasFlag(PixelFormatFlags.DdpfLuminance)) // R/RG { - if ((dwFlags & PixelFormatFlags.DdpfAlphapixels) != 0) // RG + if (dwFlags.HasFlag(PixelFormatFlags.DdpfAlphapixels)) // RG { if (dwRgbBitCount == 16) { @@ -517,7 +518,7 @@ public DxgiFormat DxgiFormat || dwFourCc == Dxt5); } - public struct DdsHeaderDxt10 + public struct DdsHeaderDx10 { public DxgiFormat dxgiFormat; public D3D10ResourceDimension resourceDimension; diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 6738d4e..d46a75d 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -1,4 +1,4 @@ -using System; +using System; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; @@ -73,7 +73,6 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, int blocksWidth, int blocksHeight) => ImageFromRawBlocks(blocks, blocksWidth, blocksHeight, blocksWidth * 4, blocksHeight * 4); - internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) { var output = new Image(pixelWidth, pixelHeight); @@ -103,7 +102,6 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, in internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int blocksWidth, int blocksHeight) => ImageFromRawBlocks(blocks, blocksWidth, blocksHeight, blocksWidth * 4, blocksHeight * 4); - internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) { var output = new Image(pixelWidth, pixelHeight); diff --git a/BCnEnc.Net/Shared/OperationContext.cs b/BCnEnc.Net/Shared/OperationContext.cs index 91a181f..bef999e 100644 --- a/BCnEnc.Net/Shared/OperationContext.cs +++ b/BCnEnc.Net/Shared/OperationContext.cs @@ -26,6 +26,6 @@ public class OperationContext /// /// The progress context for the operation. /// - public IProgress Progress { get; set; } + public OperationProgress Progress { get; set; } } } diff --git a/BCnEnc.Net/Shared/OperationProgress.cs b/BCnEnc.Net/Shared/OperationProgress.cs new file mode 100644 index 0000000..7d9e87e --- /dev/null +++ b/BCnEnc.Net/Shared/OperationProgress.cs @@ -0,0 +1,27 @@ +using System; + +namespace BCnEncoder.Shared +{ + public class OperationProgress + { + private readonly IProgress progress; + private readonly int totalBlocks; + private int processedBlocks; + + public OperationProgress(IProgress progress, int totalBlocks) + { + this.progress = progress; + this.totalBlocks = totalBlocks; + } + + public void SetProcessedBlocks(int processedBlocks) + { + this.processedBlocks = processedBlocks; + } + + public void Report(int currentBlock) + { + progress?.Report(new ProgressElement(processedBlocks + currentBlock, totalBlocks)); + } + } +} diff --git a/BCnEnc.Net/Shared/ProgressElement.cs b/BCnEnc.Net/Shared/ProgressElement.cs index 17019ce..53885df 100644 --- a/BCnEnc.Net/Shared/ProgressElement.cs +++ b/BCnEnc.Net/Shared/ProgressElement.cs @@ -1,6 +1,6 @@ namespace BCnEncoder.Shared { - public class ProgressElement + public struct ProgressElement { public int CurrentBlock { get; } From 0a02dfcf4c736d660101382626dc9581d6f468ff Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Tue, 19 Jan 2021 19:28:08 +0100 Subject: [PATCH 046/116] Introduce bit operations to calculate block boundaries where possible; Introduce replacement code from #25; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 5 +-- BCnEnc.Net/Shared/DdsFile.cs | 35 ++++++++---------- BCnEnc.Net/Shared/ImageToBlocks.cs | 53 +++++++++++++++------------- 3 files changed, 46 insertions(+), 47 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index 9ed652f..2129942 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -19,8 +19,9 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana public RawBlock4X4Rgba32[,] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context, out int blockWidth, out int blockHeight) { - blockWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - blockHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); + // calculate number of 4x4 blocks by padding width/height to a multiple of 4 and shift it right by 2 + blockWidth = ((pixelWidth + 3) & ~3) >> 2; + blockHeight = ((pixelHeight + 3) & ~3) >> 2; if (data.Length != blockWidth * blockHeight * Unsafe.SizeOf()) { diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index 57e424a..389749d 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -55,39 +55,35 @@ public static DdsFile Load(Stream s) } var mipMapCount = (header.dwCaps & HeaderCaps.DdscapsMipmap) != 0 ? header.dwMipMapCount : 1; - var faceCount = (header.dwCaps2 & HeaderCaps2.Ddscaps2Cubemap) != 0 ? (uint)6 : (uint)1; + var faceCount = (header.dwCaps2 & HeaderCaps2.Ddscaps2Cubemap) != 0 ? 6u : 1u; var width = header.dwWidth; var height = header.dwHeight; for (var face = 0; face < faceCount; face++) { - var sizeInBytes = Math.Max(1, (width + 3) / 4) * Math.Max(1, (height + 3) / 4); - if (!dx10Format) + var format = dx10Format ? dx10Header.dxgiFormat : header.ddsPixelFormat.DxgiFormat; + + uint sizeInBytes; + if (format.IsCompressedFormat()) { - if (header.ddsPixelFormat.IsDxt1To5CompressedFormat) + sizeInBytes = (uint)Math.Max(1, ((width + 3) & ~3) >> 2) * (uint)Math.Max(1, ((height + 3) & ~3) >> 2); + if (format == DxgiFormat.DxgiFormatBc1Unorm || + format == DxgiFormat.DxgiFormatBc1UnormSrgb || + format == DxgiFormat.DxgiFormatBc1Typeless) { - if (header.ddsPixelFormat.DxgiFormat == DxgiFormat.DxgiFormatBc1Unorm) - { - sizeInBytes *= 8; - } - else - { - sizeInBytes *= 16; - } + sizeInBytes *= 8; } else { - sizeInBytes = header.dwPitchOrLinearSize * height; + sizeInBytes *= 16; } } - else if (dx10Header.dxgiFormat.IsCompressedFormat()) - { - sizeInBytes = (uint)(sizeInBytes * dx10Header.dxgiFormat.GetByteSize()); - } else { - sizeInBytes = header.dwPitchOrLinearSize * height; + sizeInBytes = width * height; + sizeInBytes = (uint)(sizeInBytes * format.GetByteSize()); } + output.Faces.Add(new DdsFace(width, height, sizeInBytes, (int)mipMapCount)); for (var mip = 0; mip < mipMapCount; mip++) @@ -462,7 +458,7 @@ public DxgiFormat DxgiFormat } if (dwRBitMask == 0xff0000 && dwGBitMask == 0xff00 && dwBBitMask == 0xff && - dwABitMask == 0xff000000) + dwABitMask == 0xff000000) { return DxgiFormat.DxgiFormatB8G8R8A8Unorm; } @@ -527,7 +523,6 @@ public struct DdsHeaderDx10 public uint miscFlags2; } - public class DdsFace { public uint Width { get; set; } diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index d46a75d..5a205e5 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -9,11 +9,12 @@ internal static class ImageToBlocks internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int blocksWidth, out int blocksHeight) { - blocksWidth = (int)MathF.Ceiling(image.Width / 4.0f); - blocksHeight = (int)MathF.Ceiling(image.Height / 4.0f); + blocksWidth = ((image.Width + 3) & ~3) >> 2; + blocksHeight = ((image.Height + 3) & ~3) >> 2; var output = new RawBlock4X4Rgba32[blocksWidth * blocksHeight]; - if (!image.TryGetSinglePixelSpan(out var pixels)) { + if (!image.TryGetSinglePixelSpan(out var pixels)) + { throw new Exception("Cannot get pixel span."); } @@ -22,19 +23,19 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int for (var x = 0; x < image.Width; x++) { var color = pixels[x + y * image.Width]; - var blockIndexX = (int)MathF.Floor(x / 4.0f); - var blockIndexY = (int)MathF.Floor(y / 4.0f); - var blockInternalIndexX = x % 4; - var blockInternalIndexY = y % 4; + var blockIndexX = x >> 2; + var blockIndexY = y >> 2; + var blockInternalIndexX = x & 3; + var blockInternalIndexY = y & 3; output[blockIndexX + blockIndexY * blocksWidth][blockInternalIndexX, blockInternalIndexY] = color; } } //Fill in block y with edge color - if (image.Height % 4 != 0) + if ((image.Height & 3) != 0) { - var yPaddingStart = image.Height % 4; + var yPaddingStart = image.Height & 3; for (var i = 0; i < blocksWidth; i++) { var lastBlock = output[i + blocksWidth * (blocksHeight - 1)]; @@ -50,9 +51,9 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int } //Fill in block x with edge color - if (image.Width % 4 != 0) + if ((image.Width & 3) != 0) { - var xPaddingStart = image.Width % 4; + var xPaddingStart = image.Width & 3; for (var i = 0; i < blocksHeight; i++) { var lastBlock = output[blocksWidth - 1 + i * blocksWidth]; @@ -76,8 +77,9 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, in internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) { var output = new Image(pixelWidth, pixelHeight); - - if (!output.TryGetSinglePixelSpan(out var pixels)) { + + if (!output.TryGetSinglePixelSpan(out var pixels)) + { throw new Exception("Cannot get pixel span."); } @@ -85,10 +87,10 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, in { for (var x = 0; x < output.Width; x++) { - var blockIndexX = (int)MathF.Floor(x / 4.0f); - var blockIndexY = (int)MathF.Floor(y / 4.0f); - var blockInternalIndexX = x % 4; - var blockInternalIndexY = y % 4; + var blockIndexX = x >> 2; + var blockIndexY = y >> 2; + var blockInternalIndexX = x & 3; + var blockInternalIndexY = y & 3; pixels[x + y * output.Width] = blocks[blockIndexX, blockIndexY] @@ -105,8 +107,9 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) { var output = new Image(pixelWidth, pixelHeight); - - if (!output.TryGetSinglePixelSpan(out var pixels)) { + + if (!output.TryGetSinglePixelSpan(out var pixels)) + { throw new Exception("Cannot get pixel span."); } @@ -114,10 +117,10 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int { for (var x = 0; x < output.Width; x++) { - var blockIndexX = (int)MathF.Floor(x / 4.0f); - var blockIndexY = (int)MathF.Floor(y / 4.0f); - var blockInternalIndexX = x % 4; - var blockInternalIndexY = y % 4; + var blockIndexX = x >> 2; + var blockIndexY = y >> 2; + var blockInternalIndexX = x & 3; + var blockInternalIndexY = y & 3; pixels[x + y * output.Width] = blocks[blockIndexX + blockIndexY * blocksWidth] @@ -130,8 +133,8 @@ internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int public static int CalculateNumOfBlocks(int pixelWidth, int pixelHeight) { - int blocksWidth = (int)MathF.Ceiling(pixelWidth / 4.0f); - int blocksHeight = (int)MathF.Ceiling(pixelHeight / 4.0f); + var blocksWidth = ((pixelWidth + 3) & ~3) >> 2; + var blocksHeight = ((pixelHeight + 3) & ~3) >> 2; return blocksWidth * blocksHeight; } } From 3e196267ebec8e46c29be1361b0f1e840ef19807 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Tue, 19 Jan 2021 19:34:47 +0100 Subject: [PATCH 047/116] Add BGRA DDS tests for #26; --- BCnEncTests/BgraTests.cs | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 BCnEncTests/BgraTests.cs diff --git a/BCnEncTests/BgraTests.cs b/BCnEncTests/BgraTests.cs new file mode 100644 index 0000000..72147d3 --- /dev/null +++ b/BCnEncTests/BgraTests.cs @@ -0,0 +1,43 @@ +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using BCnEncTests.Support; +using Xunit; + +namespace BCnEncTests +{ + public class BgraTests + { + [Fact] + public void BgraDdsDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.Bgra); + var original = ImageLoader.TestLenna; + + // Act + var dds = encoder.EncodeToDds(original); + var image = decoder.Decode(dds); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } + + [Fact] + public void BgraAlphaDdsDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.Bgra); + var original = ImageLoader.TestAlphaGradient1; + + // Act + var dds = encoder.EncodeToDds(original); + var image = decoder.Decode(dds); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } + } +} From 7ee1f114cf6b04f7eb8b92046ace4d139098574e Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Tue, 19 Jan 2021 20:11:54 +0100 Subject: [PATCH 048/116] Extract size calculation in DdsFile to separate method; --- BCnEnc.Net/Shared/DdsFile.cs | 77 ++++++++++++++---------------------- 1 file changed, 29 insertions(+), 48 deletions(-) diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index 389749d..adee7f2 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -62,27 +62,7 @@ public static DdsFile Load(Stream s) for (var face = 0; face < faceCount; face++) { var format = dx10Format ? dx10Header.dxgiFormat : header.ddsPixelFormat.DxgiFormat; - - uint sizeInBytes; - if (format.IsCompressedFormat()) - { - sizeInBytes = (uint)Math.Max(1, ((width + 3) & ~3) >> 2) * (uint)Math.Max(1, ((height + 3) & ~3) >> 2); - if (format == DxgiFormat.DxgiFormatBc1Unorm || - format == DxgiFormat.DxgiFormatBc1UnormSrgb || - format == DxgiFormat.DxgiFormatBc1Typeless) - { - sizeInBytes *= 8; - } - else - { - sizeInBytes *= 16; - } - } - else - { - sizeInBytes = width * height; - sizeInBytes = (uint)(sizeInBytes * format.GetByteSize()); - } + var sizeInBytes = GetSizeInBytes(format, width, height); output.Faces.Add(new DdsFace(width, height, sizeInBytes, (int)mipMapCount)); @@ -96,34 +76,9 @@ public static DdsFile Load(Stream s) if (mip > 0) //Calculate new byteSize { - sizeInBytes = Math.Max(1, (mipWidth + 3) / 4) * Math.Max(1, (mipHeight + 3) / 4); - if (!dx10Format) - { - if (header.ddsPixelFormat.IsDxt1To5CompressedFormat) - { - if (header.ddsPixelFormat.DxgiFormat == DxgiFormat.DxgiFormatBc1Unorm) - { - sizeInBytes *= 8; - } - else - { - sizeInBytes *= 16; - } - } - else - { - sizeInBytes = header.dwPitchOrLinearSize / (uint)Math.Pow(2, mip) * mipHeight; - } - } - else if (dx10Header.dxgiFormat.IsCompressedFormat()) - { - sizeInBytes = (uint)(sizeInBytes * dx10Header.dxgiFormat.GetByteSize()); - } - else - { - sizeInBytes = header.dwPitchOrLinearSize / (uint)Math.Pow(2, mip) * mipHeight; - } + sizeInBytes = GetSizeInBytes(format, mipWidth, mipHeight); } + var data = new byte[sizeInBytes]; br.Read(data); output.Faces[face].MipMaps[mip] = new DdsMipMap(data, mipWidth, mipHeight); @@ -194,6 +149,32 @@ public void Write(Stream outputStream) } } } + + private static uint GetSizeInBytes(DxgiFormat format, uint width, uint height) + { + uint sizeInBytes; + if (format.IsCompressedFormat()) + { + sizeInBytes = (uint)Math.Max(1, ((width + 3) & ~3) >> 2) * (uint)Math.Max(1, ((height + 3) & ~3) >> 2); + if (format == DxgiFormat.DxgiFormatBc1Unorm || + format == DxgiFormat.DxgiFormatBc1UnormSrgb || + format == DxgiFormat.DxgiFormatBc1Typeless) + { + sizeInBytes *= 8; + } + else + { + sizeInBytes *= 16; + } + } + else + { + sizeInBytes = width * height; + sizeInBytes = (uint)(sizeInBytes * format.GetByteSize()); + } + + return sizeInBytes; + } } [StructLayout(LayoutKind.Sequential)] From 77239b93d94fe889221df919cb430f6b59210dcf Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Tue, 19 Jan 2021 22:14:19 +0100 Subject: [PATCH 049/116] Use bit shifting for mipmap size calculation; --- BCnEnc.Net/Shared/DdsFile.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/DdsFile.cs index adee7f2..1c98ef5 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/DdsFile.cs @@ -68,8 +68,8 @@ public static DdsFile Load(Stream s) for (var mip = 0; mip < mipMapCount; mip++) { - var mipWidth = header.dwWidth / (uint)Math.Pow(2, mip); - var mipHeight = header.dwHeight / (uint)Math.Pow(2, mip); + var mipWidth = header.dwWidth >> mip; + var mipHeight = header.dwHeight >> mip; // Saw this in a 1024x512 dds with 11 mipMapCount. Height became 0 (should be 1) mipWidth = Math.Max(mipWidth, 1); mipHeight = Math.Max(mipHeight, 1); From 591162031d89bb8e3bfd0acdbfab2b5bdebf8271 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Wed, 20 Jan 2021 20:38:52 +0100 Subject: [PATCH 050/116] Add BGRA extension to GlInternalFormat; --- BCnEnc.Net/Decoder/BcDecoder.cs | 4 +++- BCnEnc.Net/Encoder/RawEncoders.cs | 2 +- BCnEnc.Net/Shared/GLFormat.cs | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 1bff0da..9ba61e3 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -694,7 +694,9 @@ private CompressionFormat GetCompressionFormat(GlInternalFormat format) case GlInternalFormat.GlRgba8: return CompressionFormat.Rgba; - // HINT: Bgra has no internal format to convert from + // HINT: Bgra is only an extension by apple to the ktx format + case GlInternalFormat.GlBgra8Extension: + return CompressionFormat.Bgra; case GlInternalFormat.GlCompressedRgbS3TcDxt1Ext: return CompressionFormat.Bc1; diff --git a/BCnEnc.Net/Encoder/RawEncoders.cs b/BCnEnc.Net/Encoder/RawEncoders.cs index 2532f71..667a0b1 100644 --- a/BCnEnc.Net/Encoder/RawEncoders.cs +++ b/BCnEnc.Net/Encoder/RawEncoders.cs @@ -225,7 +225,7 @@ public byte[] Encode(ReadOnlySpan pixels) public GlInternalFormat GetInternalFormat() { - throw new NotImplementedException(); + return GlInternalFormat.GlBgra8Extension; } public GlFormat GetBaseInternalFormat() diff --git a/BCnEnc.Net/Shared/GLFormat.cs b/BCnEnc.Net/Shared/GLFormat.cs index 9a4cc41..1a30b9c 100644 --- a/BCnEnc.Net/Shared/GLFormat.cs +++ b/BCnEnc.Net/Shared/GLFormat.cs @@ -162,6 +162,9 @@ public enum GlInternalFormat : uint GlCompressedRgba8Etc2Eac = 0x9278, GlCompressedSrgb8Alpha8Etc2Eac = 0x9279, + // Apple extension BGRA8 + GlBgra8Extension = 0x93A1, + // ASTC GlCompressedRgbaAstc4X4Khr = 0x93B0, GlCompressedRgbaAstc5X4Khr = 0x93B1, From 4dcabda1d19f10454bc79faad27a52408de7a696 Mon Sep 17 00:00:00 2001 From: Nominom Date: Sun, 24 Jan 2021 13:27:53 +0200 Subject: [PATCH 051/116] Started 2.0 --- BCnEnc.Net/BCnEncoder.csproj | 3 +- BCnEnc.Net/Encoder/BcEncoder.cs | 591 +++++++++++------- BCnEncNet.sln | 6 + .../BCnEncoder.NET.ImageSharp.csproj | 15 + .../BCnEncoderExtensions.cs | 253 ++++++++ 5 files changed, 646 insertions(+), 222 deletions(-) create mode 100644 BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj create mode 100644 BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index 0aedac5..33a224a 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -1,4 +1,4 @@ - + netstandard2.1 @@ -44,6 +44,7 @@ Supported formats are: + diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 326a9b8..f358325 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -3,11 +3,14 @@ using System.Diagnostics; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using BCnEncoder.Encoder.Bc7; using BCnEncoder.Encoder.Options; using BCnEncoder.Shared; +using Microsoft.Toolkit.HighPerformance.Memory; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; @@ -47,140 +50,247 @@ public BcEncoder(CompressionFormat format = CompressionFormat.Bc1) /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. /// - /// The image to encode. + /// The input image rgba data. + /// The width of the input image. + /// The height of the input image. /// The stream to write the encoded image to. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - public Task EncodeAsync(Image inputImage, Stream outputStream, CancellationToken token = default) + public Task EncodeToStreamAsync(Memory inputPixelsRgba, int width, int height, Stream outputStream, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeInternal(inputImage, outputStream, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + EncodeToStreamInternal(bytes, width, height, outputStream, token); + }, token); } /// /// Encodes all mipmap levels into a Ktx file asynchronously. /// - /// The image to encode. + /// The input image rgba data. + /// The width of the input image. + /// The height of the input image. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// The Ktx file containing the encoded image. - public Task EncodeToKtxAsync(Image inputImage, CancellationToken token = default) + public Task EncodeToKtxAsync(Memory inputPixelsRgba, int width, int height, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeToKtxInternal(inputImage, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + return EncodeToKtxInternal(bytes, width, height, token); + }, token); } /// /// Encodes all mipmap levels into a Dds file asynchronously. /// - /// The image to encode. + /// The input image rgba data. + /// The width of the input image. + /// The height of the input image. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// The Dds file containing the encoded image. - public Task EncodeToDdsAsync(Image inputImage, CancellationToken token = default) + public Task EncodeToDdsAsync(Memory inputPixelsRgba, int width, int height, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeToDdsInternal(inputImage, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + return EncodeToDdsInternal(bytes, width, height, token); + }, token); } /// /// Encodes all mipmap levels into a list of byte buffers asynchronously. /// - /// The image to encode. + /// The input image rgba data. + /// The width of the input image. + /// The height of the input image. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// A list of raw encoded data. - public Task> EncodeToRawBytesAsync(Image inputImage, CancellationToken token = default) + /// A list of raw encoded mipmap data. + public Task> EncodeToRawBytesAsync(Memory inputPixelsRgba, int width, int height, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeToRawBytesInternal(inputImage, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + return EncodeToRawBytesInternal(bytes, width, height, token); + }, token); } /// /// Encodes a single mip level of the input image to a byte buffer asynchronously. /// - /// The image to encode. + /// The input image rgba data. + /// The width of the input image. + /// The height of the input image. /// The mipmap to encode. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// The raw encoded data. /// To get the width and height of the encoded mipLevel, see . - public Task EncodeToRawBytesAsync(Image inputImage, int mipLevel, CancellationToken token = default) + public Task EncodeToRawBytesAsync(Memory inputPixelsRgba, int width, int height, int mipLevel, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeToRawBytesInternal(inputImage, mipLevel, out _, out _, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + return EncodeToRawBytesInternal(bytes, width, height, mipLevel, out _, + out _, token); + }, token); } /// - /// Encodes all mipmap levels into a list of byte buffers asynchronously. + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. /// - /// The raw pixels of the input image in rgba format. - /// The width of the input image. - /// The height of the input image. + /// The input image rgba data. + /// The stream to write the encoded image to. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// A list of raw encoded mipmap data. - public Task> EncodeToRawBytesAsync(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, CancellationToken token = default) + public Task EncodeToStreamAsync(Memory2D inputPixelsRgba, Stream outputStream, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeToRawBytesInternal(inputPixelsRgba, inputImageWidth, inputImageHeight, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + var width = inputPixelsRgba.Width; + var height = inputPixelsRgba.Height; + EncodeToStreamInternal(bytes, width, height, outputStream, token); + }, token); } /// - /// Encodes a single mip level of the input image to a byte buffer asynchronously. + /// Encodes all mipmap levels into a Ktx file asynchronously. /// - /// The raw pixels of the input image in rgba format. - /// The width of the input image. - /// The height of the input image. - /// The mipmap to encode. + /// The input image rgba data. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// The raw encoded data. - /// To get the width and height of the encoded mipLevel, see . - public Task EncodeToRawBytesAsync(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, int mipLevel, CancellationToken token = default) + /// The Ktx file containing the encoded image. + public Task EncodeToKtxAsync(Memory2D inputPixelsRgba, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeToRawBytesInternal(inputPixelsRgba, inputImageWidth, inputImageHeight, mipLevel, out _, out _, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + var width = inputPixelsRgba.Width; + var height = inputPixelsRgba.Height; + return EncodeToKtxInternal(bytes, width, height, token); + }, token); } /// - /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream asynchronously. - /// Order is +X, -X, +Y, -Y, +Z, -Z + /// Encodes all mipmap levels into a Dds file asynchronously. /// - /// The right face of the cubemap. - /// The left face of the cubemap. - /// The top face of the cubemap. - /// The bottom face of the cubemap. - /// The back face of the cubemap. - /// The front face of the cubemap. - /// The stream to write the encoded image to. + /// The input image rgba data. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - public Task EncodeCubeMapAsync(Image right, Image left, Image top, Image down, - Image back, Image front, Stream outputStream, CancellationToken token = default) + /// The Dds file containing the encoded image. + public Task EncodeToDdsAsync(Memory2D inputPixelsRgba, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeCubeMapInternal(right, left, top, down, back, front, outputStream, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + var width = inputPixelsRgba.Width; + var height = inputPixelsRgba.Height; + return EncodeToDdsInternal(bytes, width, height, token); + }, token); } /// - /// Encodes all cubemap faces and mipmap levels into a Ktx file asynchronously. - /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// Encodes all mipmap levels into a list of byte buffers asynchronously. /// - /// The right face of the cubemap. - /// The left face of the cubemap. - /// The top face of the cubemap. - /// The bottom face of the cubemap. - /// The back face of the cubemap. - /// The front face of the cubemap. + /// The input image rgba data. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// The Ktx file containing the encoded image. - public Task EncodeCubeMapToKtxAsync(Image right, Image left, Image top, - Image down, Image back, Image front, CancellationToken token = default) + /// A list of raw encoded mipmap data. + public Task> EncodeToRawBytesAsync(Memory2D inputPixelsRgba, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeCubeMapToKtxInternal(right, left, top, down, back, front, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + var width = inputPixelsRgba.Width; + var height = inputPixelsRgba.Height; + return EncodeToRawBytesInternal(bytes, width, height, token); + }, token); } /// - /// Encodes all cubemap faces and mipmap levels into a Dds file asynchronously. - /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// Encodes a single mip level of the input image to a byte buffer asynchronously. /// - /// The right face of the cubemap. - /// The left face of the cubemap. - /// The top face of the cubemap. - /// The bottom face of the cubemap. - /// The back face of the cubemap. - /// The front face of the cubemap. + /// The input image rgba data. + /// The mipmap to encode. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// The Dds file containing the encoded image. - public Task EncodeCubeMapToDdsAsync(Image right, Image left, Image top, - Image down, Image back, Image front, CancellationToken token = default) + /// The raw encoded data. + /// To get the width and height of the encoded mipLevel, see . + public Task EncodeToRawBytesAsync(Memory2D inputPixelsRgba, int mipLevel, CancellationToken token = default) where T : unmanaged { - return Task.Run(() => EncodeCubeMapToDdsInternal(right, left, top, down, back, front, token), token); + return Task.Run(() => + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + var width = inputPixelsRgba.Width; + var height = inputPixelsRgba.Height; + return EncodeToRawBytesInternal(bytes, width, height, mipLevel, out _, + out _, token); + }, token); } #endregion @@ -190,150 +300,208 @@ public Task EncodeCubeMapToDdsAsync(Image right, Image /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. /// - /// The image to encode. + /// The input image rgba data. + /// The width of the input image. + /// The height of the input image. /// The stream to write the encoded image to. - public void Encode(Image inputImage, Stream outputStream) + public void EncodeToStream(Memory inputPixelsRgba, int width, int height, Stream outputStream) where T : unmanaged { - EncodeInternal(inputImage, outputStream, default); + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + EncodeToStreamInternal(bytes, width, height, outputStream, default); } /// /// Encodes all mipmap levels into a Ktx file. /// - /// The image to encode. + /// The input image rgba data. + /// The width of the input image. + /// The height of the input image. /// The Ktx file containing the encoded image. - public KtxFile EncodeToKtx(Image inputImage) + public KtxFile EncodeToKtx(Memory inputPixelsRgba, int width, int height) where T : unmanaged { - return EncodeToKtxInternal(inputImage, default); + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + return EncodeToKtxInternal(bytes, width, height, default); } /// /// Encodes all mipmap levels into a Dds file. /// - /// The image to encode. + /// The input image rgba data. + /// The width of the input image. + /// The height of the input image. /// The Dds file containing the encoded image. - public DdsFile EncodeToDds(Image inputImage) + public DdsFile EncodeToDds(Memory inputPixelsRgba, int width, int height) where T : unmanaged { - return EncodeToDdsInternal(inputImage, default); + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + return EncodeToDdsInternal(bytes, width, height, default); } /// /// Encodes all mipmap levels into a list of byte buffers. /// /// The raw pixels of the input image in rgba format. - /// The width of the input image. - /// The height of the input image. + /// The width of the input image. + /// The height of the input image. /// A list of raw encoded mipmap data. - public IList EncodeToRawBytes(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight) - { - return EncodeToRawBytesInternal(inputPixelsRgba, inputImageWidth, inputImageHeight, default); - } - - /// - /// Encodes all mipmap levels into a list of byte buffers. - /// - /// The image to encode. - /// A list of raw encoded data. - public IList EncodeToRawBytes(Image inputImage) - { - return EncodeToRawBytesInternal(inputImage, default); - } - - /// - /// Encodes a single mip level of the input image to a byte buffer. - /// - /// The image to encode. - /// The mipmap to encode. - /// The width of the mipmap. - /// The height of the mipmap. - /// The raw encoded data. - public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) + public IList EncodeToRawBytes(Memory inputPixelsRgba, int width, int height) where T : unmanaged { - return EncodeToRawBytesInternal(inputImage, mipLevel, out mipWidth, out mipHeight, default); + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + return EncodeToRawBytesInternal(bytes, width, height, default); } /// /// Encodes a single mip level of the input image to a byte buffer. /// /// The raw pixels of the input image in rgba format. - /// The width of the input image. - /// The height of the input image. + /// The width of the input image. + /// The height of the input image. /// The mipmap to encode. /// The width of the mipmap. /// The height of the mipmap. /// The raw encoded data. - public byte[] EncodeToRawBytes(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, int mipLevel, out int mipWidth, out int mipHeight) + public byte[] EncodeToRawBytes(Memory inputPixelsRgba, int width, int height, int mipLevel, out int mipWidth, out int mipHeight) where T : unmanaged { - return EncodeToRawBytesInternal(inputPixelsRgba, inputImageWidth, inputImageHeight, mipLevel, out mipWidth, + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); + return EncodeToRawBytesInternal(bytes, width, height, mipLevel, out mipWidth, out mipHeight, default); } + + /// - /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream. - /// Order is +X, -X, +Y, -Y, +Z, -Z + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. /// - /// The right face of the cubemap. - /// The left face of the cubemap. - /// The top face of the cubemap. - /// The bottom face of the cubemap. - /// The back face of the cubemap. - /// The front face of the cubemap. + /// The input image rgba data. /// The stream to write the encoded image to. - public void EncodeCubeMap(Image right, Image left, Image top, Image down, - Image back, Image front, Stream outputStream) + public void EncodeToStream(Memory2D inputPixelsRgba, Stream outputStream) where T : unmanaged { - EncodeCubeMapInternal(right, left, top, down, back, front, outputStream, default); + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + EncodeToStreamInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, outputStream, default); } /// - /// Encodes all cubemap faces and mipmap levels into a Ktx file. - /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// Encodes all mipmap levels into a Ktx file. /// - /// The right face of the cubemap. - /// The left face of the cubemap. - /// The top face of the cubemap. - /// The bottom face of the cubemap. - /// The back face of the cubemap. - /// The front face of the cubemap. + /// The input image rgba data. /// The Ktx file containing the encoded image. - public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image top, Image down, - Image back, Image front) + public KtxFile EncodeToKtx(Memory2D inputPixelsRgba) where T : unmanaged { - return EncodeCubeMapToKtxInternal(right, left, top, down, back, front, default); + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + return EncodeToKtxInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, default); } /// - /// Encodes all cubemap faces and mipmap levels into a Dds file. - /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// Encodes all mipmap levels into a Dds file. /// - /// The right face of the cubemap. - /// The left face of the cubemap. - /// The top face of the cubemap. - /// The bottom face of the cubemap. - /// The back face of the cubemap. - /// The front face of the cubemap. + /// The input image rgba data. /// The Dds file containing the encoded image. - public DdsFile EncodeCubeMapToDds(Image right, Image left, Image top, Image down, - Image back, Image front) + public DdsFile EncodeToDds(Memory2D inputPixelsRgba) where T : unmanaged { - return EncodeCubeMapToDdsInternal(right, left, top, down, back, front, default); + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + return EncodeToDdsInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, default); } - #endregion - - #region MipMap operations + /// + /// Encodes all mipmap levels into a list of byte buffers. + /// + /// The raw pixels of the input image in rgba format. + /// A list of raw encoded mipmap data. + public IList EncodeToRawBytes(Memory2D inputPixelsRgba) where T : unmanaged + { + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + return EncodeToRawBytesInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, default); + } /// - /// Calculates the number of mipmap levels that will be generated for the given input image. + /// Encodes a single mip level of the input image to a byte buffer. /// - /// The image to use for the calculation. - /// The number of mipmap levels that will be generated for the input image. - public int CalculateNumberOfMipLevels(Image inputImage) + /// The raw pixels of the input image in rgba format. + /// The mipmap to encode. + /// The width of the mipmap. + /// The height of the mipmap. + /// The raw encoded data. + public byte[] EncodeToRawBytes(Memory2D inputPixelsRgba, int mipLevel, out int mipWidth, out int mipHeight) where T : unmanaged { - return MipMapper.CalculateMipChainLength(inputImage.Width, inputImage.Height, - OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1); + if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) + { + throw new ArgumentException( + "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); + } + if (!inputPixelsRgba.Span.TryGetSpan(out var span)) + { + throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); + } + var bytes = MemoryMarshal.AsBytes(span); + + return EncodeToRawBytesInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, mipLevel, out mipWidth, + out mipHeight, default); } + #endregion + + #region MipMap operations + /// /// Calculates the number of mipmap levels that will be generated for the given input image. /// @@ -346,19 +514,6 @@ public int CalculateNumberOfMipLevels(int imagePixelWidth, int imagePixelHeight) OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1); } - /// - /// Calculates the size of a given mipmap level. - /// - /// The image to use for the calculation. - /// The mipLevel to calculate (0 is original image) - /// The mipmap width calculated - /// The mipmap height calculated - public void CalculateMipMapSize(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) - { - MipMapper.CalculateMipLevelSize(inputImage.Width, inputImage.Height, mipLevel, out mipWidth, - out mipHeight); - } - /// /// Calculates the size of a given mipmap level. /// @@ -377,30 +532,30 @@ public void CalculateMipMapSize(int imagePixelWidth, int imagePixelHeight, int m #region Private - private void EncodeInternal(Image inputImage, Stream outputStream, CancellationToken token) + private void EncodeToStreamInternal(ReadOnlySpan inputPixelsRgba, int width, int height, Stream outputStream, CancellationToken token) { switch (OutputOptions.FileFormat) { case OutputFileFormat.Dds: - var dds = EncodeToDds(inputImage); + var dds = EncodeToDdsInternal(inputPixelsRgba, width, height, token); dds.Write(outputStream); break; case OutputFileFormat.Ktx: - var ktx = EncodeToKtx(inputImage); + var ktx = EncodeToKtxInternal(inputPixelsRgba, width, height, token); ktx.Write(outputStream); break; } } - private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken token) + private KtxFile EncodeToKtxInternal(ReadOnlySpan inputPixelsRgba, int width, int height, CancellationToken token) { KtxFile output; IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + var mipChain = MipMapper.GenerateMipChain(inputPixelsRgba, width, height, ref numMipMaps); try { // Setup encoders @@ -414,7 +569,7 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken } output = new KtxFile( - KtxHeader.InitializeCompressed(inputImage.Width, inputImage.Height, + KtxHeader.InitializeCompressed(width, height, compressedEncoder.GetInternalFormat(), compressedEncoder.GetBaseInternalFormat())); } @@ -422,7 +577,7 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken { uncompressedEncoder = GetRawEncoder(OutputOptions.Format); output = new KtxFile( - KtxHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, + KtxHeader.InitializeUncompressed(width, height, uncompressedEncoder.GetGlType(), uncompressedEncoder.GetGlFormat(), uncompressedEncoder.GetGlTypeSize(), @@ -485,14 +640,14 @@ private KtxFile EncodeToKtxInternal(Image inputImage, CancellationToken } } - private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken token) + private DdsFile EncodeToDdsInternal(ReadOnlySpan inputPixelsRgba, int width, int height, CancellationToken token) { DdsFile output; IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + var mipChain = MipMapper.GenerateMipChain(inputPixelsRgba, width, height, ref numMipMaps); try { // Setup encoder @@ -505,7 +660,7 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); } - var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(inputImage.Width, inputImage.Height, + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(width, height, compressedEncoder.GetDxgiFormat()); output = new DdsFile(ddsHeader, dxt10Header); @@ -518,7 +673,7 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken else { uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - var ddsHeader = DdsHeader.InitializeUncompressed(inputImage.Width, inputImage.Height, + var ddsHeader = DdsHeader.InitializeUncompressed(width, height, uncompressedEncoder.GetDxgiFormat()); output = new DdsFile(ddsHeader); } @@ -559,7 +714,7 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken if (mip == 0) { - output.Faces.Add(new DdsFace((uint)inputImage.Width, (uint)inputImage.Height, + output.Faces.Add(new DdsFace((uint)width, (uint)height, (uint)encoded.Length, (int)numMipMaps)); } @@ -585,25 +740,19 @@ private DdsFile EncodeToDdsInternal(Image inputImage, CancellationToken } } - private IList EncodeToRawBytesInternal(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, CancellationToken token) + private IList EncodeToRawBytesInternal(ReadOnlySpan inputPixelsRgba, int width, int height, CancellationToken token) { - if (inputPixelsRgba.Length != inputImageWidth * inputImageHeight * 4) + if (inputPixelsRgba.Length != width * height * 4) { throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); } - - using var image = Image.LoadPixelData(inputPixelsRgba, inputImageWidth, inputImageHeight); - return EncodeToRawBytesInternal(image, token); - } - - private IList EncodeToRawBytesInternal(Image inputImage, CancellationToken token) - { + var output = new List(); IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + var mipChain = MipMapper.GenerateMipChain(inputPixelsRgba, width, height, ref numMipMaps); try { // Setup encoder @@ -670,19 +819,13 @@ private IList EncodeToRawBytesInternal(Image inputImage, Cancell } } - private byte[] EncodeToRawBytesInternal(byte[] inputPixelsRgba, int inputImageWidth, int inputImageHeight, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) + private byte[] EncodeToRawBytesInternal(ReadOnlySpan inputPixelsRgba, int width, int height, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) { - if (inputPixelsRgba.Length != inputImageWidth * inputImageHeight * 4) + if (inputPixelsRgba.Length != width * height * 4) { throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); } - using var image = Image.LoadPixelData(inputPixelsRgba, inputImageWidth, inputImageHeight); - return EncodeToRawBytesInternal(image, mipLevel, out mipWidth, out mipHeight, token); - } - - private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) - { if (mipLevel < 0) throw new ArgumentException($"{nameof(mipLevel)} cannot be less than zero."); @@ -690,7 +833,7 @@ private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputImage, ref numMipMaps); + var mipChain = MipMapper.GenerateMipChain(inputPixelsRgba, width, height, ref numMipMaps); try { // Setup encoder @@ -755,39 +898,42 @@ private byte[] EncodeToRawBytesInternal(Image inputImage, int mipLevel, } } - private void EncodeCubeMapInternal(Image right, Image left, Image top, Image down, - Image back, Image front, Stream outputStream, CancellationToken token) + private void EncodeCubeMapToStreamInternal(ReadOnlySpan right, ReadOnlySpan left, ReadOnlySpan top, ReadOnlySpan down, + ReadOnlySpan back, ReadOnlySpan front, int width, int height, Stream outputStream, CancellationToken token) { switch (OutputOptions.FileFormat) { case OutputFileFormat.Ktx: - var ktx = EncodeCubeMapToKtxInternal(right, left, top, down, back, front, token); + var ktx = EncodeCubeMapToKtxInternal(right, left, top, down, back, front, width, height, token); ktx.Write(outputStream); break; case OutputFileFormat.Dds: - var dds = EncodeCubeMapToDdsInternal(right, left, top, down, back, front, token); + var dds = EncodeCubeMapToDdsInternal(right, left, top, down, back, front, width, height, token); dds.Write(outputStream); break; } } - private KtxFile EncodeCubeMapToKtxInternal(Image right, Image left, Image top, Image down, - Image back, Image front, CancellationToken token) + private KtxFile EncodeCubeMapToKtxInternal(ReadOnlySpan right, ReadOnlySpan left, ReadOnlySpan top, ReadOnlySpan down, + ReadOnlySpan back, ReadOnlySpan front, int width, int height, CancellationToken token) { KtxFile output; IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width - || right.Width != back.Width || right.Width != front.Width || - right.Height != left.Height || right.Height != top.Height || right.Height != down.Height - || right.Height != back.Height || right.Height != front.Height) + if (right.Length != width * height * 4) + { + throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); + } + + if (right.Length != left.Length || right.Length != top.Length || right.Length != down.Length + || right.Length != back.Length || right.Length != front.Length) { throw new ArgumentException("All input images of a cubemap should be the same size."); } - var faces = new[] { right, left, top, down, back, front }; + var faces = new[] { right.ToArray(), left.ToArray(), top.ToArray(), down.ToArray(), back.ToArray(), front.ToArray() }; // Setup encoder var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); @@ -800,7 +946,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le } output = new KtxFile( - KtxHeader.InitializeCompressed(right.Width, right.Height, + KtxHeader.InitializeCompressed(width, height, compressedEncoder.GetInternalFormat(), compressedEncoder.GetBaseInternalFormat())); } @@ -808,7 +954,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le { uncompressedEncoder = GetRawEncoder(OutputOptions.Format); output = new KtxFile( - KtxHeader.InitializeUncompressed(right.Width, right.Height, + KtxHeader.InitializeUncompressed(width, height, uncompressedEncoder.GetGlType(), uncompressedEncoder.GetGlFormat(), uncompressedEncoder.GetGlTypeSize(), @@ -818,7 +964,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le } var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipLength = MipMapper.CalculateMipChainLength(right.Width, right.Height, numMipMaps); + var mipLength = MipMapper.CalculateMipChainLength(width, height, numMipMaps); for (uint i = 0; i < mipLength; i++) { output.MipMaps.Add(new KtxMipmap(0, 0, 0, (uint)faces.Length)); @@ -837,7 +983,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le { for (var mip = 0; mip < numMipMaps; mip++) { - MipMapper.CalculateMipLevelSize(face.Width, face.Height, mip, out var mipWidth, out var mipHeight); + MipMapper.CalculateMipLevelSize(width, height, mip, out var mipWidth, out var mipHeight); totalBlocks += isCompressedFormat ? ImageToBlocks.CalculateNumOfBlocks(mipWidth, mipHeight) : mipWidth * mipHeight; } } @@ -847,7 +993,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le var processedBlocks = 0; for (var face = 0; face < faces.Length; face++) { - var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); + var mipChain = MipMapper.GenerateMipChain(faces[face], width, height, ref numMipMaps); try { // Encode all mipmap levels per face @@ -901,22 +1047,25 @@ private KtxFile EncodeCubeMapToKtxInternal(Image right, Image le return output; } - private DdsFile EncodeCubeMapToDdsInternal(Image right, Image left, Image top, Image down, - Image back, Image front, CancellationToken token) + private DdsFile EncodeCubeMapToDdsInternal(ReadOnlySpan right, ReadOnlySpan left, ReadOnlySpan top, ReadOnlySpan down, + ReadOnlySpan back, ReadOnlySpan front, int width, int height, CancellationToken token) { DdsFile output; IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - if (right.Width != left.Width || right.Width != top.Width || right.Width != down.Width - || right.Width != back.Width || right.Width != front.Width || - right.Height != left.Height || right.Height != top.Height || right.Height != down.Height - || right.Height != back.Height || right.Height != front.Height) + if (right.Length != width * height * 4) + { + throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); + } + + if (right.Length != left.Length || right.Length != top.Length || right.Length != down.Length + || right.Length != back.Length || right.Length != front.Length) { throw new ArgumentException("All input images of a cubemap should be the same size."); } - var faces = new[] { right, left, top, down, back, front }; + var faces = new[] { right.ToArray(), left.ToArray(), top.ToArray(), down.ToArray(), back.ToArray(), front.ToArray() }; // Setup encoder var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); @@ -928,7 +1077,7 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); } - var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(right.Width, right.Height, + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(width, height, compressedEncoder.GetDxgiFormat()); output = new DdsFile(ddsHeader, dxt10Header); @@ -941,7 +1090,7 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le else { uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - var ddsHeader = DdsHeader.InitializeUncompressed(right.Width, right.Height, + var ddsHeader = DdsHeader.InitializeUncompressed(width, height, uncompressedEncoder.GetDxgiFormat()); output = new DdsFile(ddsHeader); @@ -962,7 +1111,7 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le { for (var mip = 0; mip < numMipMaps; mip++) { - MipMapper.CalculateMipLevelSize(face.Width, face.Height, mip, out var mipWidth, out var mipHeight); + MipMapper.CalculateMipLevelSize(width, height, mip, out var mipWidth, out var mipHeight); totalBlocks += isCompressedFormat ? ImageToBlocks.CalculateNumOfBlocks(mipWidth, mipHeight) : mipWidth * mipHeight; } } @@ -972,7 +1121,7 @@ private DdsFile EncodeCubeMapToDdsInternal(Image right, Image le var processedBlocks = 0; for (var face = 0; face < faces.Length; face++) { - var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); + var mipChain = MipMapper.GenerateMipChain(faces[face], width, height, ref numMipMaps); try { // Encode all mipmap levels per face diff --git a/BCnEncNet.sln b/BCnEncNet.sln index e93a46c..6e3c4d8 100644 --- a/BCnEncNet.sln +++ b/BCnEncNet.sln @@ -12,6 +12,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .editorconfig = .editorconfig EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BCnEncoder.NET.ImageSharp", "BCnEncoder.NET.ImageSharp\BCnEncoder.NET.ImageSharp.csproj", "{7D884C56-B982-4B8C-907E-68F231CF3D89}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -26,6 +28,10 @@ Global {8E5E366B-9782-4194-AC85-602E8387496A}.Debug|Any CPU.Build.0 = Debug|Any CPU {8E5E366B-9782-4194-AC85-602E8387496A}.Release|Any CPU.ActiveCfg = Release|Any CPU {8E5E366B-9782-4194-AC85-602E8387496A}.Release|Any CPU.Build.0 = Release|Any CPU + {7D884C56-B982-4B8C-907E-68F231CF3D89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D884C56-B982-4B8C-907E-68F231CF3D89}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D884C56-B982-4B8C-907E-68F231CF3D89}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D884C56-B982-4B8C-907E-68F231CF3D89}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj new file mode 100644 index 0000000..6c3e5cc --- /dev/null +++ b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj @@ -0,0 +1,15 @@ + + + + netstandard2.1 + + + + + + + + + + + diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs new file mode 100644 index 0000000..4a1e21d --- /dev/null +++ b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Advanced; +using SixLabors.ImageSharp.PixelFormats; + +namespace BCnEncoder.NET.ImageSharp +{ + public static class BCnEncoderExtensions + { + /// + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. + /// + /// The BcEncoder instance. + /// The image to encode. + /// The stream to write the encoded image to. + public static void EncodeToStream(this BcEncoder encoder, Image inputImage, Stream outputStream) + { + var pixels = inputImage.GetPixelMemoryGroup()[0]; + encoder.EncodeToStream(pixels, inputImage.Width, inputImage.Height, outputStream); + } + + /// + /// Encodes all mipmap levels into a Ktx file. + /// + /// The BcEncoder instance. + /// The image to encode. + /// The Ktx file containing the encoded image. + public static KtxFile EncodeToKtx(this BcEncoder encoder, Image inputImage) + { + return EncodeToKtxInternal(inputImage, default); + } + + /// + /// Encodes all mipmap levels into a Dds file. + /// + /// The BcEncoder instance. + /// The image to encode. + /// The Dds file containing the encoded image. + public static DdsFile EncodeToDds(this BcEncoder encoder, Image inputImage) + { + return EncodeToDdsInternal(inputImage, default); + } + + /// + /// Encodes all mipmap levels into a list of byte buffers. + /// + /// The image to encode. + /// A list of raw encoded data. + public IList EncodeToRawBytes(Image inputImage) + { + return EncodeToRawBytesInternal(this BcEncoder encoder, inputImage, default); + } + + /// + /// Encodes a single mip level of the input image to a byte buffer. + /// + /// The image to encode. + /// The mipmap to encode. + /// The width of the mipmap. + /// The height of the mipmap. + /// The raw encoded data. + public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) + { + return EncodeToRawBytesInternal(this BcEncoder encoder, inputImage, mipLevel, out mipWidth, out mipHeight, default); + } + + /// + /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream. + /// Order is +X, -X, +Y, -Y, +Z, -Z + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The stream to write the encoded image to. + public void EncodeCubeMapToStream(Image right, Image left, Image top, Image down, + Image back, Image front, Stream outputStream) + { + EncodeCubeMapInternal(this BcEncoder encoder, right, left, top, down, back, front, outputStream, default); + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Ktx file. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The Ktx file containing the encoded image. + public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image top, Image down, + Image back, Image front) + { + return EncodeCubeMapToKtxInternal(this BcEncoder encoder, right, left, top, down, back, front, default); + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Dds file. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The Dds file containing the encoded image. + public DdsFile EncodeCubeMapToDds(Image right, Image left, Image top, Image down, + Image back, Image front) + { + return EncodeCubeMapToDdsInternal(this BcEncoder encoder, right, left, top, down, back, front, default); + } + + /// + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. + /// + /// The image to encode. + /// The stream to write the encoded image to. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + public Task EncodeToStreamAsync(Image inputImage, Stream outputStream, CancellationToken token = default) + { + + } + + /// + /// Encodes all mipmap levels into a Ktx file asynchronously. + /// + /// The image to encode. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The Ktx file containing the encoded image. + public Task EncodeToKtxAsync(Image inputImage, CancellationToken token = default) + { + + } + + /// + /// Encodes all mipmap levels into a Dds file asynchronously. + /// + /// The image to encode. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The Dds file containing the encoded image. + public Task EncodeToDdsAsync(Image inputImage, CancellationToken token = default) + { + + } + + /// + /// Encodes all mipmap levels into a list of byte buffers asynchronously. + /// + /// The image to encode. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// A list of raw encoded data. + public Task> EncodeToRawBytesAsync(Image inputImage, CancellationToken token = default) + { + + } + + /// + /// Encodes a single mip level of the input image to a byte buffer asynchronously. + /// + /// The image to encode. + /// The mipmap to encode. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The raw encoded data. + /// To get the width and height of the encoded mipLevel, see . + public Task EncodeToRawBytesAsync(Image inputImage, int mipLevel, CancellationToken token = default) + { + } + + /// + /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream asynchronously. + /// Order is +X, -X, +Y, -Y, +Z, -Z + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The stream to write the encoded image to. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + public Task EncodeCubeMapToStreamAsync(Image right, Image left, Image top, Image down, + Image back, Image front, Stream outputStream, CancellationToken token = default) + { + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Ktx file asynchronously. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The Ktx file containing the encoded image. + public Task EncodeCubeMapToKtxAsync(Image right, Image left, Image top, + Image down, Image back, Image front, CancellationToken token = default) + { + } + + /// + /// Encodes all cubemap faces and mipmap levels into a Dds file asynchronously. + /// Order is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The right face of the cubemap. + /// The left face of the cubemap. + /// The top face of the cubemap. + /// The bottom face of the cubemap. + /// The back face of the cubemap. + /// The front face of the cubemap. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The Dds file containing the encoded image. + public Task EncodeCubeMapToDdsAsync(Image right, Image left, Image top, + Image down, Image back, Image front, CancellationToken token = default) + { + } + + /// + /// Calculates the number of mipmap levels that will be generated for the given input image. + /// + /// The image to use for the calculation. + /// The number of mipmap levels that will be generated for the input image. + public int CalculateNumberOfMipLevels(Image inputImage) + { + + } + + /// + /// Calculates the size of a given mipmap level. + /// + /// The image to use for the calculation. + /// The mipLevel to calculate (0 is original image) + /// The mipmap width calculated + /// The mipmap height calculated + public void CalculateMipMapSize(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) + { + + } + } +} From 5cfa22c90318aa65fdf8a5f7aa862af52e8219af Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Sun, 24 Jan 2021 13:55:43 +0100 Subject: [PATCH 052/116] Add static Imagefile class to determine format; --- BCnEnc.Net/Shared/ImageFiles/ImageFile.cs | 76 +++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 BCnEnc.Net/Shared/ImageFiles/ImageFile.cs diff --git a/BCnEnc.Net/Shared/ImageFiles/ImageFile.cs b/BCnEnc.Net/Shared/ImageFiles/ImageFile.cs new file mode 100644 index 0000000..87150cb --- /dev/null +++ b/BCnEnc.Net/Shared/ImageFiles/ImageFile.cs @@ -0,0 +1,76 @@ +using System.IO; +using System.Linq; +using System.Text; + +namespace BCnEncoder.Shared.ImageFiles +{ + /// + /// The format identifier of an image file. + /// + public enum ImagefileFormat + { + /// + /// Represents the KTX image file format. + /// + Ktx, + + /// + /// Represents the DDS image file format. + /// + Dds, + + /// + /// Represents an unknown image file format. + /// + Unknown + } + + /// + /// Static helper class to determine the format of an image file. + /// + public static class ImageFile + { + private static readonly byte[] ktx1Identifier = { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A }; + + /// + /// Determines the image file format of the given stream. + /// + /// The stream of data to identify. + /// The format this image file may contain. + public static ImagefileFormat DetermineImageFormat(Stream stream) + { + if (IsDds(stream)) + { + return ImagefileFormat.Dds; + } + + if (IsKtx(stream)) + { + return ImagefileFormat.Ktx; + } + + return ImagefileFormat.Unknown; + } + + private static bool IsDds(Stream stream) + { + using var br = new BinaryReader(stream, Encoding.UTF8, true); + + var magic = br.ReadUInt32(); + stream.Position -= 4; + + return magic == 0x20534444U; + } + + private static bool IsKtx(Stream stream) + { + // Only checks for version 1 + using var br = new BinaryReader(stream, Encoding.ASCII, true); + + var identifier = br.ReadBytes(12); + stream.Position -= 12; + + return identifier.SequenceEqual(ktx1Identifier); + } + } +} From 7e335d5152142fafbb2e1cc8ba260c3ba548e7e5 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Sun, 24 Jan 2021 18:33:38 +0100 Subject: [PATCH 053/116] Remove dependency on ImageSharp from decoding; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 34 +- BCnEnc.Net/Decoder/BcDecoder.cs | 245 +++--- BCnEnc.Net/Decoder/RawDecoder.cs | 79 +- BCnEnc.Net/Encoder/AtcBlockEncoder.cs | 1 + BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 1 + BCnEnc.Net/Encoder/Bc1BlockEncoder.cs | 1 + BCnEnc.Net/Encoder/Bc2BlockEncoder.cs | 1 + BCnEnc.Net/Encoder/Bc3BlockEncoder.cs | 1 + BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 1 + BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 1 + BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs | 1 + BCnEnc.Net/Encoder/IBcBlockEncoder.cs | 1 + BCnEnc.Net/Encoder/RawEncoders.cs | 1 + BCnEnc.Net/Shared/Colors.cs | 721 +++++++++--------- BCnEnc.Net/Shared/{ => ImageFiles}/DdsFile.cs | 2 +- BCnEnc.Net/Shared/ImageFiles/ImageFile.cs | 10 +- BCnEnc.Net/Shared/{ => ImageFiles}/KtxFile.cs | 4 +- BCnEnc.Net/Shared/ImageToBlocks.cs | 105 ++- BCnEnc.Net/Shared/RawBlocks.cs | 76 +- BCnEncTests/Support/TestHelper.cs | 1 + 20 files changed, 614 insertions(+), 673 deletions(-) rename BCnEnc.Net/Shared/{ => ImageFiles}/DdsFile.cs (99%) rename BCnEnc.Net/Shared/{ => ImageFiles}/KtxFile.cs (99%) diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index 2129942..4a1a3ca 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -10,40 +10,37 @@ namespace BCnEncoder.Decoder { internal interface IBcBlockDecoder { - RawBlock4X4Rgba32[,] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context, - out int blockWidth, out int blockHeight); + RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext context); } internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmanaged { - public RawBlock4X4Rgba32[,] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context, - out int blockWidth, out int blockHeight) + public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext context) { // calculate number of 4x4 blocks by padding width/height to a multiple of 4 and shift it right by 2 - blockWidth = ((pixelWidth + 3) & ~3) >> 2; - blockHeight = ((pixelHeight + 3) & ~3) >> 2; + //blockWidth = ((pixelWidth + 3) & ~3) >> 2; + //blockHeight = ((pixelHeight + 3) & ~3) >> 2; - if (data.Length != blockWidth * blockHeight * Unsafe.SizeOf()) + if (data.Length % Unsafe.SizeOf() != 0) { - throw new InvalidDataException("Given data does not match expected length."); + throw new InvalidDataException("Given data does not align with the block length."); } - var output = new RawBlock4X4Rgba32[blockWidth, blockHeight]; + var blockCount = data.Length / Unsafe.SizeOf(); + var output = new RawBlock4X4Rgba32[blockCount]; var currentBlocks = 0; if (context.IsParallel) { - var localBlockWidth = blockWidth; - var options = new ParallelOptions { CancellationToken = context.CancellationToken, MaxDegreeOfParallelism = context.TaskCount }; - Parallel.For(0, blockWidth * blockHeight, options, i => + Parallel.For(0, blockCount, options, i => { var encodedBlocks = MemoryMarshal.Cast(data.Span); - output[i % localBlockWidth, i / localBlockWidth] = DecodeBlock(encodedBlocks[i]); + output[i] = DecodeBlock(encodedBlocks[i]); if (context.Progress != null) { @@ -55,16 +52,13 @@ internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmana else { var encodedBlocks = MemoryMarshal.Cast(data.Span); - for (var x = 0; x < blockWidth; x++) + for (var i = 0; i < blockCount; i++) { - for (var y = 0; y < blockHeight; y++) - { - context.CancellationToken.ThrowIfCancellationRequested(); + context.CancellationToken.ThrowIfCancellationRequested(); - output[x, y] = DecodeBlock(encodedBlocks[x + y * blockWidth]); + output[i] = DecodeBlock(encodedBlocks[i]); - context.Progress?.Report(currentBlocks++); - } + context.Progress?.Report(currentBlocks++); } } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 9ba61e3..1c0907c 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -1,14 +1,12 @@ using BCnEncoder.Decoder.Options; using BCnEncoder.Shared; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; using System; using System.IO; using System.Linq; using System.Runtime.CompilerServices; -using System.Text; using System.Threading; using System.Threading.Tasks; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Decoder { @@ -35,7 +33,7 @@ public class BcDecoder #region Async Api /// - /// Decode raw encoded image asynchronously. + /// DecodeInternal raw encoded image asynchronously. /// /// The stream containing the encoded data. /// The Format the encoded data is in. @@ -43,16 +41,16 @@ public class BcDecoder /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + public Task DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); - return Task.Run(() => DecodeRawInternal(dataArray, format, pixelWidth, pixelHeight, token), token); + return Task.Run(() => DecodeRawInternal(dataArray, pixelWidth, pixelHeight, format, token), token); } /// - /// Decode raw encoded image data asynchronously. + /// DecodeInternal raw encoded image data asynchronously. /// /// The containing the encoded data. /// The Format the encoded data is in. @@ -60,9 +58,9 @@ public Task> DecodeRawAsync(Stream inputStream, CompressionFormat /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + public Task DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { - return Task.Run(() => DecodeRawInternal(input, format, pixelWidth, pixelHeight, token), token); + return Task.Run(() => DecodeRawInternal(input, pixelWidth, pixelHeight, format, token), token); } /// @@ -71,9 +69,9 @@ public Task> DecodeRawAsync(ReadOnlyMemory input, Compressio /// The stream containing a Ktx or Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeAsync(Stream inputStream, CancellationToken token = default) + public Task DecodeAsync(Stream inputStream, CancellationToken token = default) { - return Task.Run(() => Decode(inputStream, false, token)[0], token); + return Task.Run(() => DecodeInternal(inputStream, false, token)[0], token); } /// @@ -82,9 +80,9 @@ public Task> DecodeAsync(Stream inputStream, CancellationToken tok /// The stream containing a Ktx or Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task[]> DecodeAllMipMapsAsync(Stream inputStream, CancellationToken token = default) + public Task DecodeAllMipMapsAsync(Stream inputStream, CancellationToken token = default) { - return Task.Run(() => Decode(inputStream, true, token), token); + return Task.Run(() => DecodeInternal(inputStream, true, token), token); } /// @@ -93,9 +91,9 @@ public Task[]> DecodeAllMipMapsAsync(Stream inputStream, Cancellat /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeAsync(KtxFile file, CancellationToken token = default) + public Task DecodeAsync(KtxFile file, CancellationToken token = default) { - return Task.Run(() => Decode(file, false, token)[0], token); + return Task.Run(() => DecodeInternal(file, false, token)[0], token); } /// @@ -104,9 +102,9 @@ public Task> DecodeAsync(KtxFile file, CancellationToken token = d /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task[]> DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) + public Task DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) { - return Task.Run(() => Decode(file, true, token), token); + return Task.Run(() => DecodeInternal(file, true, token), token); } /// @@ -115,9 +113,9 @@ public Task[]> DecodeAllMipMapsAsync(KtxFile file, CancellationTok /// The loaded Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeAsync(DdsFile file, CancellationToken token = default) + public Task DecodeAsync(DdsFile file, CancellationToken token = default) { - return Task.Run(() => Decode(file, false, token)[0], token); + return Task.Run(() => DecodeInternal(file, false, token)[0], token); } /// @@ -126,9 +124,9 @@ public Task> DecodeAsync(DdsFile file, CancellationToken token = d /// The loaded Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task[]> DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) + public Task DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) { - return Task.Run(() => Decode(file, true, token), token); + return Task.Run(() => DecodeInternal(file, true, token), token); } #endregion @@ -136,32 +134,32 @@ public Task[]> DecodeAllMipMapsAsync(DdsFile file, CancellationTok #region Sync API /// - /// Decode raw encoded image data. + /// DecodeInternal raw encoded image data. /// /// The stream containing the encoded data. - /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. + /// The Format the encoded data is in. /// The decoded Rgba32 image. - public Image DecodeRaw(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight) + public ColorRgba32[] DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); - return DecodeRaw(dataArray, format, pixelWidth, pixelHeight); + return DecodeRaw(dataArray, pixelWidth, pixelHeight, format); } /// - /// Decode raw encoded image data. + /// DecodeInternal raw encoded image data. /// /// The array containing the encoded data. - /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. + /// The Format the encoded data is in. /// The decoded Rgba32 image. - public Image DecodeRaw(byte[] input, CompressionFormat format, int pixelWidth, int pixelHeight) + public ColorRgba32[] DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) { - return DecodeRawInternal(input, format, pixelWidth, pixelHeight, default); + return DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); } /// @@ -169,9 +167,9 @@ public Image DecodeRaw(byte[] input, CompressionFormat format, int pixel /// /// The stream containing a Ktx or Dds file. /// The decoded Rgba32 image. - public Image Decode(Stream inputStream) + public ColorRgba32[] Decode(Stream inputStream) { - return Decode(inputStream, false, default)[0]; + return DecodeInternal(inputStream, false, default)[0]; } /// @@ -179,9 +177,9 @@ public Image Decode(Stream inputStream) /// /// The stream containing a Ktx or Dds file. /// An array of decoded Rgba32 images. - public Image[] DecodeAllMipMaps(Stream inputStream) + public ColorRgba32[][] DecodeAllMipMaps(Stream inputStream) { - return Decode(inputStream, true, default); + return DecodeInternal(inputStream, true, default); } /// @@ -189,9 +187,9 @@ public Image[] DecodeAllMipMaps(Stream inputStream) /// /// The loaded Ktx file. /// The decoded Rgba32 image. - public Image Decode(KtxFile file) + public ColorRgba32[] Decode(KtxFile file) { - return Decode(file, false, default)[0]; + return DecodeInternal(file, false, default)[0]; } /// @@ -199,9 +197,9 @@ public Image Decode(KtxFile file) /// /// The loaded Ktx file. /// An array of decoded Rgba32 images. - public Image[] DecodeAllMipMaps(KtxFile file) + public ColorRgba32[][] DecodeAllMipMaps(KtxFile file) { - return Decode(file, true, default); + return DecodeInternal(file, true, default); } /// @@ -209,9 +207,9 @@ public Image[] DecodeAllMipMaps(KtxFile file) /// /// The loaded Dds file. /// The decoded Rgba32 image. - public Image Decode(DdsFile file) + public ColorRgba32[] Decode(DdsFile file) { - return Decode(file, false, default)[0]; + return DecodeInternal(file, false, default)[0]; } /// @@ -219,64 +217,34 @@ public Image Decode(DdsFile file) /// /// The loaded Dds file. /// An array of decoded Rgba32 images. - public Image[] DecodeAllMipMaps(DdsFile file) + public ColorRgba32[][] DecodeAllMipMaps(DdsFile file) { - return Decode(file, true, default); + return DecodeInternal(file, true, default); } #endregion /// - /// Load a KTX or DDS file from a stream and extract either the main image or all mip maps. + /// Load a stream and extract either the main image or all mip maps. /// - /// The input stream to decode. + /// The stream containing the image file. /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private Image[] Decode(Stream inputStream, bool allMipMaps, CancellationToken token) + private ColorRgba32[][] DecodeInternal(Stream stream, bool allMipMaps, CancellationToken token) { - var position = inputStream.Position; - try - { - // Detect if file is a KTX or DDS by file extension - if (inputStream is FileStream fs) - { - var extension = Path.GetExtension(fs.Name).ToLower(); - switch (extension) - { - case ".dds": - var ddsFile = DdsFile.Load(inputStream); - return Decode(ddsFile, allMipMaps, token); - - case ".ktx": - var ktxFile = KtxFile.Load(inputStream); - return Decode(ktxFile, allMipMaps, token); - } - } + var format = ImageFile.DetermineImageFormat(stream); - // Otherwise detect KTX or DDS by content of the stream - bool isDds; - using (var br = new BinaryReader(inputStream, Encoding.UTF8, true)) - { - var magic = br.ReadUInt32(); - isDds = magic == 0x20534444U; - } - - inputStream.Seek(position, SeekOrigin.Begin); + switch (format) + { + case ImageFileFormat.Dds: + return DecodeInternal(DdsFile.Load(stream), allMipMaps, token); - if (isDds) - { - var dds = DdsFile.Load(inputStream); - return Decode(dds, allMipMaps, token); - } + case ImageFileFormat.Ktx: + return DecodeInternal(KtxFile.Load(stream), allMipMaps, token); - var ktx = KtxFile.Load(inputStream); - return Decode(ktx, allMipMaps, token); - } - catch (Exception) - { - inputStream.Seek(position, SeekOrigin.Begin); - throw; + default: + throw new InvalidOperationException("Unknown image format."); } } @@ -287,9 +255,9 @@ private Image[] Decode(Stream inputStream, bool allMipMaps, Cancellation /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private Image[] Decode(KtxFile file, bool allMipMaps, CancellationToken token) + private ColorRgba32[][] DecodeInternal(KtxFile file, bool allMipMaps, CancellationToken token) { - var images = new Image[file.MipMaps.Count]; + var colors = new ColorRgba32[file.MipMaps.Count][]; var context = new OperationContext { @@ -312,18 +280,8 @@ private Image[] Decode(KtxFile file, bool allMipMaps, CancellationToken for (var mip = 0; mip < mipMaps; mip++) { var data = file.MipMaps[mip].Faces[0].Data; - var pixelWidth = file.MipMaps[mip].Width; - var pixelHeight = file.MipMaps[mip].Height; - - var image = new Image((int)pixelWidth, (int)pixelHeight); - var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, context); - if (!image.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - output.CopyTo(pixels); - images[mip] = image; + colors[mip] = decoder.Decode(data, context); context.Progress.SetProcessedBlocks(file.MipMaps.Take(mip + 1).Sum(x => x.Faces[0].Data.Length / blockSize)); } @@ -343,16 +301,15 @@ private Image[] Decode(KtxFile file, bool allMipMaps, CancellationToken var pixelWidth = file.MipMaps[mip].Width; var pixelHeight = file.MipMaps[mip].Height; - var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, context, - out var blockWidth, out var blockHeight); + var blocks = decoder.Decode(data, context); - images[mip] = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, (int)pixelWidth, (int)pixelHeight); + colors[mip] = ImageToBlocks.ColorsFromRawBlocks(blocks, (int)pixelWidth, (int)pixelHeight); context.Progress.SetProcessedBlocks(file.MipMaps.Take(mip + 1).Sum(x => x.Faces[0].Data.Length / blockSize)); } } - return images; + return colors; } /// @@ -362,9 +319,9 @@ private Image[] Decode(KtxFile file, bool allMipMaps, CancellationToken /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private Image[] Decode(DdsFile file, bool allMipMaps, CancellationToken token) + private ColorRgba32[][] DecodeInternal(DdsFile file, bool allMipMaps, CancellationToken token) { - var images = new Image[file.header.dwMipMapCount]; + var colors = new ColorRgba32[file.header.dwMipMapCount][]; var context = new OperationContext { @@ -387,18 +344,8 @@ private Image[] Decode(DdsFile file, bool allMipMaps, CancellationToken for (var mip = 0; mip < mipMaps; mip++) { var data = file.Faces[0].MipMaps[mip].Data; - var pixelWidth = file.Faces[0].MipMaps[mip].Width; - var pixelHeight = file.Faces[0].MipMaps[mip].Height; - - var image = new Image((int)pixelWidth, (int)pixelHeight); - var output = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, context); - if (!image.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - output.CopyTo(pixels); - images[mip] = image; + colors[mip] = decoder.Decode(data, context); context.Progress.SetProcessedBlocks(file.Faces[0].MipMaps.Take(mip + 1).Sum(x => x.Data.Length / blockSize)); } @@ -421,35 +368,33 @@ private Image[] Decode(DdsFile file, bool allMipMaps, CancellationToken var pixelWidth = file.Faces[0].MipMaps[mip].Width; var pixelHeight = file.Faces[0].MipMaps[mip].Height; - var blocks = decoder.Decode(data, (int)pixelWidth, (int)pixelHeight, context, - out var blockWidth, out var blockHeight); + var blocks = decoder.Decode(data, context); - var image = ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, - (int)pixelWidth, (int)pixelHeight); + var image = ImageToBlocks.ColorsFromRawBlocks(blocks, (int)pixelWidth, (int)pixelHeight); - images[mip] = image; + colors[mip] = image; context.Progress.SetProcessedBlocks(file.Faces[0].MipMaps.Take(mip + 1).Sum(x => x.Data.Length / blockSize)); } } - return images; + return colors; } /// - /// Decode raw encoded image asynchronously. + /// DecodeInternal raw encoded image asynchronously. /// /// The containing the encoded data. + /// The width of the image. + /// The height of the image. /// The Format the encoded data is in. - /// The pixelWidth of the image. - /// The pixelHeight of the image. /// The cancellation token for this operation. May be default, if the operation is not asynchronous. /// The decoded Rgba32 image. - private Image DecodeRawInternal(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token) + private ColorRgba32[] DecodeRawInternal(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token) { - if (input.Length != GetBufferSize(format, pixelWidth, pixelHeight)) + if (input.Length % GetBlockSize(format) != 0) { - throw new ArgumentException("The size of the input buffer does not match the expected size"); + throw new ArgumentException("The size of the input buffer does not align with the compression format."); } var context = new OperationContext @@ -468,52 +413,42 @@ private Image DecodeRawInternal(ReadOnlyMemory input, CompressionF var isCompressedFormat = format.IsCompressedFormat(); if (isCompressedFormat) { - // Decode as compressed data + // DecodeInternal as compressed data var decoder = GetDecoder(format); - var blocks = decoder.Decode(input, pixelWidth, pixelHeight, context, out var blockWidth, out var blockHeight); + var blocks = decoder.Decode(input, context); - return ImageToBlocks.ImageFromRawBlocks(blocks, blockWidth, blockHeight, pixelWidth, pixelHeight); + return ImageToBlocks.ColorsFromRawBlocks(blocks, pixelWidth, pixelHeight); ; } - // Decode as raw data + // DecodeInternal as raw data var rawDecoder = GetRawDecoder(format); - var image = new Image(pixelWidth, pixelHeight); - var output = rawDecoder.Decode(input, pixelWidth, pixelHeight, context); - if (!image.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - - output.CopyTo(pixels); - return image; + return rawDecoder.Decode(input, context); } #region Support + #region Is supported format + private bool IsSupportedRawFormat(GlInternalFormat format) { - switch (format) - { - case GlInternalFormat.GlR8: - case GlInternalFormat.GlRg8: - case GlInternalFormat.GlRgb8: - case GlInternalFormat.GlRgba8: - return true; - - default: - return false; - } + return IsSupportedRawFormat(GetCompressionFormat(format)); } private bool IsSupportedRawFormat(DdsFile file) { - switch (file.header.ddsPixelFormat.DxgiFormat) + return IsSupportedRawFormat(GetCompressionFormat(file)); + } + + private bool IsSupportedRawFormat(CompressionFormat format) + { + switch (format) { - case DxgiFormat.DxgiFormatR8Unorm: - case DxgiFormat.DxgiFormatR8G8Unorm: - case DxgiFormat.DxgiFormatR8G8B8A8Unorm: - case DxgiFormat.DxgiFormatB8G8R8A8Unorm: + case CompressionFormat.R: + case CompressionFormat.Rg: + case CompressionFormat.Rgb: + case CompressionFormat.Rgba: + case CompressionFormat.Bgra: return true; default: @@ -521,6 +456,8 @@ private bool IsSupportedRawFormat(DdsFile file) } } + #endregion + #region Get decoder private IBcBlockDecoder GetDecoder(GlInternalFormat format) diff --git a/BCnEnc.Net/Decoder/RawDecoder.cs b/BCnEnc.Net/Decoder/RawDecoder.cs index 7dfbeef..880485d 100644 --- a/BCnEnc.Net/Decoder/RawDecoder.cs +++ b/BCnEnc.Net/Decoder/RawDecoder.cs @@ -1,4 +1,3 @@ -using SixLabors.ImageSharp.PixelFormats; using System; using BCnEncoder.Shared; @@ -6,7 +5,7 @@ namespace BCnEncoder.Decoder { internal interface IRawDecoder { - Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context); + ColorRgba32[] Decode(ReadOnlyMemory data, OperationContext context); } /// @@ -29,13 +28,11 @@ public RawRDecoder(bool redAsLuminance) /// Decode the data to color components. /// /// The data to decode. - /// The width of the image in pixels. - /// The height of the image in pixels. /// The context of the current operation. /// The decoded color components. - public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + public ColorRgba32[] Decode(ReadOnlyMemory data, OperationContext context) { - var output = new Rgba32[pixelWidth * pixelHeight]; + var output = new ColorRgba32[data.Length]; // HINT: Ignoring parallel execution since we wouldn't gain performance from it. @@ -46,18 +43,18 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh if (redAsLuminance) { - output[i].R = span[i]; - output[i].G = span[i]; - output[i].B = span[i]; + output[i].r = span[i]; + output[i].g = span[i]; + output[i].b = span[i]; } else { - output[i].R = span[i]; - output[i].G = 0; - output[i].B = 0; + output[i].r = span[i]; + output[i].g = 0; + output[i].b = 0; } - output[i].A = 255; + output[i].a = 255; } return output; @@ -73,13 +70,11 @@ public class RawRgDecoder : IRawDecoder /// Decode the data to color components. /// /// The data to decode. - /// The width of the image in pixels. - /// The height of the image in pixels. /// The context of the current operation. /// The decoded color components. - public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + public ColorRgba32[] Decode(ReadOnlyMemory data, OperationContext context) { - var output = new Rgba32[pixelWidth * pixelHeight]; + var output = new ColorRgba32[data.Length / 2]; // HINT: Ignoring parallel execution since we wouldn't gain performance from it. @@ -88,10 +83,10 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh { context.CancellationToken.ThrowIfCancellationRequested(); - output[i].R = span[i * 2]; - output[i].G = span[i * 2 + 1]; - output[i].B = 0; - output[i].A = 255; + output[i].r = span[i * 2]; + output[i].g = span[i * 2 + 1]; + output[i].b = 0; + output[i].a = 255; } return output; @@ -107,13 +102,11 @@ public class RawRgbDecoder : IRawDecoder /// Decode the data to color components. /// /// The data to decode. - /// The width of the image in pixels. - /// The height of the image in pixels. /// The context of the current operation. /// The decoded color components. - public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + public ColorRgba32[] Decode(ReadOnlyMemory data, OperationContext context) { - var output = new Rgba32[pixelWidth * pixelHeight]; + var output = new ColorRgba32[data.Length / 3]; // HINT: Ignoring parallel execution since we wouldn't gain performance from it. @@ -122,10 +115,10 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh { context.CancellationToken.ThrowIfCancellationRequested(); - output[i].R = span[i * 3]; - output[i].G = span[i * 3 + 1]; - output[i].B = span[i * 3 + 2]; - output[i].A = 255; + output[i].r = span[i * 3]; + output[i].g = span[i * 3 + 1]; + output[i].b = span[i * 3 + 2]; + output[i].a = 255; } return output; @@ -141,13 +134,11 @@ public class RawRgbaDecoder : IRawDecoder /// Decode the data to color components. /// /// The data to decode. - /// The width of the image in pixels. - /// The height of the image in pixels. /// The context of the current operation. /// The decoded color components. - public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + public ColorRgba32[] Decode(ReadOnlyMemory data, OperationContext context) { - var output = new Rgba32[pixelWidth * pixelHeight]; + var output = new ColorRgba32[data.Length / 4]; // HINT: Ignoring parallel execution since we wouldn't gain performance from it. @@ -156,10 +147,10 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh { context.CancellationToken.ThrowIfCancellationRequested(); - output[i].R = span[i * 4]; - output[i].G = span[i * 4 + 1]; - output[i].B = span[i * 4 + 2]; - output[i].A = span[i * 4 + 3]; + output[i].r = span[i * 4]; + output[i].g = span[i * 4 + 1]; + output[i].b = span[i * 4 + 2]; + output[i].a = span[i * 4 + 3]; } return output; @@ -175,13 +166,11 @@ public class RawBgraDecoder : IRawDecoder /// Decode the data to color components. /// /// The data to decode. - /// The width of the image in pixels. - /// The height of the image in pixels. /// The context of the current operation. /// The decoded color components. - public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeight, OperationContext context) + public ColorRgba32[] Decode(ReadOnlyMemory data, OperationContext context) { - var output = new Rgba32[pixelWidth * pixelHeight]; + var output = new ColorRgba32[data.Length / 4]; // HINT: Ignoring parallel execution since we wouldn't gain performance from it. @@ -190,10 +179,10 @@ public Rgba32[] Decode(ReadOnlyMemory data, int pixelWidth, int pixelHeigh { context.CancellationToken.ThrowIfCancellationRequested(); - output[i].B = span[i * 4]; - output[i].G = span[i * 4 + 1]; - output[i].R = span[i * 4 + 2]; - output[i].A = span[i * 4 + 3]; + output[i].b = span[i * 4]; + output[i].g = span[i * 4 + 1]; + output[i].r = span[i * 4 + 2]; + output[i].a = span[i * 4 + 3]; } return output; diff --git a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs index 5618ab7..d3c4e17 100644 --- a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs @@ -1,4 +1,5 @@ using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index 3f66de4..e3fb1dd 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -3,6 +3,7 @@ using System.Threading; using System.Threading.Tasks; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs index b736da7..f32a853 100644 --- a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs @@ -1,5 +1,6 @@ using System; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs index e559818..71abc22 100644 --- a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs @@ -1,5 +1,6 @@ using System; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs index 7de7b42..4b5323a 100644 --- a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs @@ -1,5 +1,6 @@ using System; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index b80036f..e62f3fa 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index 7cde981..7688df1 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -1,4 +1,5 @@ using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs index 4c8d7a6..5d3e8c7 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs @@ -3,6 +3,7 @@ using System.Runtime.InteropServices; using System.Threading.Tasks; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Encoder.Bc7 { diff --git a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs index b387b83..0821767 100644 --- a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs @@ -1,4 +1,5 @@ using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Encoder/RawEncoders.cs b/BCnEnc.Net/Encoder/RawEncoders.cs index 667a0b1..0c9c4fc 100644 --- a/BCnEnc.Net/Encoder/RawEncoders.cs +++ b/BCnEnc.Net/Encoder/RawEncoders.cs @@ -1,5 +1,6 @@ using System; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Encoder diff --git a/BCnEnc.Net/Shared/Colors.cs b/BCnEnc.Net/Shared/Colors.cs index 4d0dc36..c105df4 100644 --- a/BCnEnc.Net/Shared/Colors.cs +++ b/BCnEnc.Net/Shared/Colors.cs @@ -4,6 +4,305 @@ namespace BCnEncoder.Shared { + public struct ColorRgba32 : IEquatable + { + public byte r, g, b, a; + public ColorRgba32(byte r, byte g, byte b, byte a) + { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + public ColorRgba32(Rgba32 color) + { + this.r = color.R; + this.g = color.G; + this.b = color.B; + this.a = color.A; + } + + public bool Equals(ColorRgba32 other) + { + return r == other.r && g == other.g && b == other.b && a == other.a; + } + + public override bool Equals(object obj) + { + return obj is ColorRgba32 other && Equals(other); + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = r.GetHashCode(); + hashCode = (hashCode * 397) ^ g.GetHashCode(); + hashCode = (hashCode * 397) ^ b.GetHashCode(); + hashCode = (hashCode * 397) ^ a.GetHashCode(); + return hashCode; + } + } + + public static bool operator ==(ColorRgba32 left, ColorRgba32 right) + { + return left.Equals(right); + } + + public static bool operator !=(ColorRgba32 left, ColorRgba32 right) + { + return !left.Equals(right); + } + + public static ColorRgba32 operator +(ColorRgba32 left, ColorRgba32 right) + { + return new ColorRgba32( + ByteHelper.ClampToByte(left.r + right.r), + ByteHelper.ClampToByte(left.g + right.g), + ByteHelper.ClampToByte(left.b + right.b), + ByteHelper.ClampToByte(left.a + right.a)); + } + + public static ColorRgba32 operator -(ColorRgba32 left, ColorRgba32 right) + { + return new ColorRgba32( + ByteHelper.ClampToByte(left.r - right.r), + ByteHelper.ClampToByte(left.g - right.g), + ByteHelper.ClampToByte(left.b - right.b), + ByteHelper.ClampToByte(left.a - right.a)); + } + + public static ColorRgba32 operator /(ColorRgba32 left, double right) + { + return new ColorRgba32( + ByteHelper.ClampToByte((int)(left.r / right)), + ByteHelper.ClampToByte((int)(left.g / right)), + ByteHelper.ClampToByte((int)(left.b / right)), + ByteHelper.ClampToByte((int)(left.a / right)) + ); + } + + public static ColorRgba32 operator *(ColorRgba32 left, double right) + { + return new ColorRgba32( + ByteHelper.ClampToByte((int)(left.r * right)), + ByteHelper.ClampToByte((int)(left.g * right)), + ByteHelper.ClampToByte((int)(left.b * right)), + ByteHelper.ClampToByte((int)(left.a * right)) + ); + } + + /// + /// Component-wise left shift + /// + public static ColorRgba32 operator <<(ColorRgba32 left, int right) + { + return new ColorRgba32( + ByteHelper.ClampToByte(left.r << right), + ByteHelper.ClampToByte(left.g << right), + ByteHelper.ClampToByte(left.b << right), + ByteHelper.ClampToByte(left.a << right) + ); + } + + /// + /// Component-wise right shift + /// + public static ColorRgba32 operator >>(ColorRgba32 left, int right) + { + return new ColorRgba32( + ByteHelper.ClampToByte(left.r >> right), + ByteHelper.ClampToByte(left.g >> right), + ByteHelper.ClampToByte(left.b >> right), + ByteHelper.ClampToByte(left.a >> right) + ); + } + + /// + /// Component-wise bitwise OR operation + /// + public static ColorRgba32 operator |(ColorRgba32 left, ColorRgba32 right) + { + return new ColorRgba32( + ByteHelper.ClampToByte(left.r | right.r), + ByteHelper.ClampToByte(left.g | right.g), + ByteHelper.ClampToByte(left.b | right.b), + ByteHelper.ClampToByte(left.a | right.a) + ); + } + + /// + /// Component-wise bitwise OR operation + /// + public static ColorRgba32 operator |(ColorRgba32 left, int right) + { + return new ColorRgba32( + ByteHelper.ClampToByte(left.r | right), + ByteHelper.ClampToByte(left.g | right), + ByteHelper.ClampToByte(left.b | right), + ByteHelper.ClampToByte(left.a | right) + ); + } + + /// + /// Component-wise bitwise AND operation + /// + public static ColorRgba32 operator &(ColorRgba32 left, ColorRgba32 right) + { + return new ColorRgba32( + ByteHelper.ClampToByte(left.r & right.r), + ByteHelper.ClampToByte(left.g & right.g), + ByteHelper.ClampToByte(left.b & right.b), + ByteHelper.ClampToByte(left.a & right.a) + ); + } + + /// + /// Component-wise bitwise AND operation + /// + public static ColorRgba32 operator &(ColorRgba32 left, int right) + { + return new ColorRgba32( + ByteHelper.ClampToByte(left.r & right), + ByteHelper.ClampToByte(left.g & right), + ByteHelper.ClampToByte(left.b & right), + ByteHelper.ClampToByte(left.a & right) + ); + } + + public override string ToString() + { + return $"r : {r} g : {g} b : {b} a : {a}"; + } + + public Rgba32 ToRgba32() + { + return new Rgba32(r, g, b, a); + } + } + + public struct ColorYCbCr + { + public float y; + public float cb; + public float cr; + + public ColorYCbCr(float y, float cb, float cr) + { + this.y = y; + this.cb = cb; + this.cr = cr; + } + + public ColorYCbCr(ColorRgb24 rgb) + { + var fr = (float)rgb.r / 255; + var fg = (float)rgb.g / 255; + var fb = (float)rgb.b / 255; + + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; + } + + public ColorYCbCr(ColorRgb565 rgb) + { + var fr = (float)rgb.R / 255; + var fg = (float)rgb.G / 255; + var fb = (float)rgb.B / 255; + + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; + } + + public ColorYCbCr(ColorRgba32 rgba) + { + var fr = (float)rgba.r / 255; + var fg = (float)rgba.g / 255; + var fb = (float)rgba.b / 255; + + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; + } + + public ColorYCbCr(Rgba32 rgb) + { + var fr = (float)rgb.R / 255; + var fg = (float)rgb.G / 255; + var fb = (float)rgb.B / 255; + + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; + } + + public ColorYCbCr(Vector3 vec) + { + var fr = (float)vec.X; + var fg = (float)vec.Y; + var fb = (float)vec.Z; + + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; + } + + public ColorRgb565 ToColorRgb565() + { + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + + return new ColorRgb565((byte)(r * 255), (byte)(g * 255), (byte)(b * 255)); + } + + public override string ToString() + { + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + + return $"r : {r * 255} g : {g * 255} b : {b * 255}"; + } + + public float CalcDistWeighted(ColorYCbCr other, float yWeight = 4) + { + var dy = (y - other.y) * (y - other.y) * yWeight; + var dcb = (cb - other.cb) * (cb - other.cb); + var dcr = (cr - other.cr) * (cr - other.cr); + + return MathF.Sqrt(dy + dcb + dcr); + } + + public static ColorYCbCr operator +(ColorYCbCr left, ColorYCbCr right) + { + return new ColorYCbCr( + left.y + right.y, + left.cb + right.cb, + left.cr + right.cr); + } + + public static ColorYCbCr operator /(ColorYCbCr left, float right) + { + return new ColorYCbCr( + left.y / right, + left.cb / right, + left.cr / right); + } + + public Rgba32 ToRgba32() + { + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + + return new Rgba32((byte)(r * 255), (byte)(g * 255), (byte)(b * 255), 255); + } + } + internal struct ColorRgb555 : IEquatable { public bool Equals(ColorRgb555 other) @@ -223,270 +522,94 @@ readonly get { data = (ushort)(data | (r5 << RedShift)); } } - - public byte G { - readonly get { - var g6 = (data & GreenMask) >> GreenShift; - return (byte)((g6 << 2) | (g6 >> 4)); - } - set { - var g6 = value >> 2; - data = (ushort)(data & ~GreenMask); - data = (ushort)(data | (g6 << GreenShift)); - } - } - - public byte B { - readonly get { - var b5 = data & BlueMask; - return (byte)((b5 << 3) | (b5 >> 2)); - } - set { - var b5 = value >> 3; - data = (ushort)(data & ~BlueMask); - data = (ushort)(data | b5); - } - } - - public int RawR { - readonly get { return (data & RedMask) >> RedShift; } - set { - if (value > 31) value = 31; - if (value < 0) value = 0; - data = (ushort)(data & ~RedMask); - data = (ushort)(data | (value << RedShift)); - } - } - - public int RawG { - readonly get { return (data & GreenMask) >> GreenShift; } - set { - if (value > 63) value = 63; - if (value < 0) value = 0; - data = (ushort)(data & ~GreenMask); - data = (ushort)(data | (value << GreenShift)); - } - } - - public int RawB { - readonly get { return data & BlueMask; } - set { - if (value > 31) value = 31; - if (value < 0) value = 0; - data = (ushort)(data & ~BlueMask); - data = (ushort)(data | value); - } - } - - public ColorRgb565(byte r, byte g, byte b) - { - data = 0; - R = r; - G = g; - B = b; - } - - public ColorRgb565(Vector3 colorVector) { - data = 0; - R = ByteHelper.ClampToByte(colorVector.X * 255); - G = ByteHelper.ClampToByte(colorVector.Y * 255); - B = ByteHelper.ClampToByte(colorVector.Z * 255); - } - - public ColorRgb565(ColorRgb24 color) { - data = 0; - R = color.r; - G = color.g; - B = color.b; - } - - public readonly ColorRgb24 ToColorRgb24() - { - return new ColorRgb24(R, G, B); - } - - public override string ToString() { - return $"r : {R} g : {G} b : {B}"; - } - - public ColorRgba32 ToColorRgba32() { - return new ColorRgba32(R, G, B, 255); - } - } - - internal struct ColorRgba32 : IEquatable - { - public byte r, g, b, a; - public ColorRgba32(byte r, byte g, byte b, byte a) - { - this.r = r; - this.g = g; - this.b = b; - this.a = a; - } - - public ColorRgba32(Rgba32 color) - { - this.r = color.R; - this.g = color.G; - this.b = color.B; - this.a = color.A; - } - - public bool Equals(ColorRgba32 other) - { - return r == other.r && g == other.g && b == other.b && a == other.a; - } - - public override bool Equals(object obj) - { - return obj is ColorRgba32 other && Equals(other); - } - - public override int GetHashCode() - { - unchecked - { - var hashCode = r.GetHashCode(); - hashCode = (hashCode * 397) ^ g.GetHashCode(); - hashCode = (hashCode * 397) ^ b.GetHashCode(); - hashCode = (hashCode * 397) ^ a.GetHashCode(); - return hashCode; - } - } - - public static bool operator ==(ColorRgba32 left, ColorRgba32 right) - { - return left.Equals(right); - } - - public static bool operator !=(ColorRgba32 left, ColorRgba32 right) - { - return !left.Equals(right); - } - - public static ColorRgba32 operator +(ColorRgba32 left, ColorRgba32 right) - { - return new ColorRgba32( - ByteHelper.ClampToByte(left.r + right.r), - ByteHelper.ClampToByte(left.g + right.g), - ByteHelper.ClampToByte(left.b + right.b), - ByteHelper.ClampToByte(left.a + right.a)); - } - - public static ColorRgba32 operator -(ColorRgba32 left, ColorRgba32 right) - { - return new ColorRgba32( - ByteHelper.ClampToByte(left.r - right.r), - ByteHelper.ClampToByte(left.g - right.g), - ByteHelper.ClampToByte(left.b - right.b), - ByteHelper.ClampToByte(left.a - right.a)); + + public byte G { + readonly get { + var g6 = (data & GreenMask) >> GreenShift; + return (byte)((g6 << 2) | (g6 >> 4)); + } + set { + var g6 = value >> 2; + data = (ushort)(data & ~GreenMask); + data = (ushort)(data | (g6 << GreenShift)); + } } - public static ColorRgba32 operator /(ColorRgba32 left, double right) - { - return new ColorRgba32( - ByteHelper.ClampToByte((int)(left.r / right)), - ByteHelper.ClampToByte((int)(left.g / right)), - ByteHelper.ClampToByte((int)(left.b / right)), - ByteHelper.ClampToByte((int)(left.a / right)) - ); + public byte B { + readonly get { + var b5 = data & BlueMask; + return (byte)((b5 << 3) | (b5 >> 2)); + } + set { + var b5 = value >> 3; + data = (ushort)(data & ~BlueMask); + data = (ushort)(data | b5); + } } - public static ColorRgba32 operator *(ColorRgba32 left, double right) - { - return new ColorRgba32( - ByteHelper.ClampToByte((int)(left.r * right)), - ByteHelper.ClampToByte((int)(left.g * right)), - ByteHelper.ClampToByte((int)(left.b * right)), - ByteHelper.ClampToByte((int)(left.a * right)) - ); + public int RawR { + readonly get { return (data & RedMask) >> RedShift; } + set { + if (value > 31) value = 31; + if (value < 0) value = 0; + data = (ushort)(data & ~RedMask); + data = (ushort)(data | (value << RedShift)); + } } - /// - /// Component-wise left shift - /// - public static ColorRgba32 operator <<(ColorRgba32 left, int right) - { - return new ColorRgba32( - ByteHelper.ClampToByte(left.r << right), - ByteHelper.ClampToByte(left.g << right), - ByteHelper.ClampToByte(left.b << right), - ByteHelper.ClampToByte(left.a << right) - ); + public int RawG { + readonly get { return (data & GreenMask) >> GreenShift; } + set { + if (value > 63) value = 63; + if (value < 0) value = 0; + data = (ushort)(data & ~GreenMask); + data = (ushort)(data | (value << GreenShift)); + } } - /// - /// Component-wise right shift - /// - public static ColorRgba32 operator >>(ColorRgba32 left, int right) - { - return new ColorRgba32( - ByteHelper.ClampToByte(left.r >> right), - ByteHelper.ClampToByte(left.g >> right), - ByteHelper.ClampToByte(left.b >> right), - ByteHelper.ClampToByte(left.a >> right) - ); + public int RawB { + readonly get { return data & BlueMask; } + set { + if (value > 31) value = 31; + if (value < 0) value = 0; + data = (ushort)(data & ~BlueMask); + data = (ushort)(data | value); + } } - /// - /// Component-wise bitwise OR operation - /// - public static ColorRgba32 operator |(ColorRgba32 left, ColorRgba32 right) + public ColorRgb565(byte r, byte g, byte b) { - return new ColorRgba32( - ByteHelper.ClampToByte(left.r | right.r), - ByteHelper.ClampToByte(left.g | right.g), - ByteHelper.ClampToByte(left.b | right.b), - ByteHelper.ClampToByte(left.a | right.a) - ); + data = 0; + R = r; + G = g; + B = b; } - /// - /// Component-wise bitwise OR operation - /// - public static ColorRgba32 operator |(ColorRgba32 left, int right) - { - return new ColorRgba32( - ByteHelper.ClampToByte(left.r | right), - ByteHelper.ClampToByte(left.g | right), - ByteHelper.ClampToByte(left.b | right), - ByteHelper.ClampToByte(left.a | right) - ); + public ColorRgb565(Vector3 colorVector) { + data = 0; + R = ByteHelper.ClampToByte(colorVector.X * 255); + G = ByteHelper.ClampToByte(colorVector.Y * 255); + B = ByteHelper.ClampToByte(colorVector.Z * 255); } - /// - /// Component-wise bitwise AND operation - /// - public static ColorRgba32 operator &(ColorRgba32 left, ColorRgba32 right) - { - return new ColorRgba32( - ByteHelper.ClampToByte(left.r & right.r), - ByteHelper.ClampToByte(left.g & right.g), - ByteHelper.ClampToByte(left.b & right.b), - ByteHelper.ClampToByte(left.a & right.a) - ); + public ColorRgb565(ColorRgb24 color) { + data = 0; + R = color.r; + G = color.g; + B = color.b; } - /// - /// Component-wise bitwise AND operation - /// - public static ColorRgba32 operator &(ColorRgba32 left, int right) + public readonly ColorRgb24 ToColorRgb24() { - return new ColorRgba32( - ByteHelper.ClampToByte(left.r & right), - ByteHelper.ClampToByte(left.g & right), - ByteHelper.ClampToByte(left.b & right), - ByteHelper.ClampToByte(left.a & right) - ); + return new ColorRgb24(R, G, B); } public override string ToString() { - return $"r : {r} g : {g} b : {b} a : {a}"; + return $"r : {R} g : {G} b : {B}"; } - public Rgba32 ToRgba32() { - return new Rgba32(r, g, b, a); + public ColorRgba32 ToColorRgba32() { + return new ColorRgba32(R, G, B, 255); } } @@ -588,122 +711,6 @@ public override string ToString() { } } - internal struct ColorYCbCr - { - public float y; - public float cb; - public float cr; - - public ColorYCbCr(float y, float cb, float cr) - { - this.y = y; - this.cb = cb; - this.cr = cr; - } - - public ColorYCbCr(ColorRgb24 rgb) - { - var fr = (float)rgb.r / 255; - var fg = (float)rgb.g / 255; - var fb = (float)rgb.b / 255; - - y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; - cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; - cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; - } - - public ColorYCbCr(ColorRgb565 rgb) - { - var fr = (float)rgb.R / 255; - var fg = (float)rgb.G / 255; - var fb = (float)rgb.B / 255; - - y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; - cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; - cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; - } - - public ColorYCbCr(ColorRgba32 rgba) - { - var fr = (float)rgba.r / 255; - var fg = (float)rgba.g / 255; - var fb = (float)rgba.b / 255; - - y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; - cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; - cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; - } - - public ColorYCbCr(Rgba32 rgb) - { - var fr = (float)rgb.R / 255; - var fg = (float)rgb.G / 255; - var fb = (float)rgb.B / 255; - - y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; - cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; - cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; - } - - public ColorYCbCr(Vector3 vec) { - var fr = (float) vec.X; - var fg = (float) vec.Y; - var fb = (float) vec.Z; - - y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; - cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; - cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; - } - - public ColorRgb565 ToColorRgb565() { - var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); - - return new ColorRgb565((byte)(r * 255), (byte)(g * 255), (byte)(b * 255)); - } - - public override string ToString() { - var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); - - return $"r : {r * 255} g : {g * 255} b : {b * 255}"; - } - - public float CalcDistWeighted(ColorYCbCr other, float yWeight = 4) { - var dy = (y - other.y) * (y - other.y) * yWeight; - var dcb = (cb - other.cb) * (cb - other.cb); - var dcr = (cr - other.cr) * (cr - other.cr); - - return MathF.Sqrt(dy + dcb + dcr); - } - - public static ColorYCbCr operator+(ColorYCbCr left, ColorYCbCr right) - { - return new ColorYCbCr( - left.y + right.y, - left.cb + right.cb, - left.cr + right.cr); - } - - public static ColorYCbCr operator/(ColorYCbCr left, float right) - { - return new ColorYCbCr( - left.y / right, - left.cb / right, - left.cr / right); - } - - public Rgba32 ToRgba32() { - var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); - - return new Rgba32((byte)(r * 255), (byte)(g * 255), (byte)(b * 255), 255); - } - } - internal struct ColorYCbCrAlpha { public float y; diff --git a/BCnEnc.Net/Shared/DdsFile.cs b/BCnEnc.Net/Shared/ImageFiles/DdsFile.cs similarity index 99% rename from BCnEnc.Net/Shared/DdsFile.cs rename to BCnEnc.Net/Shared/ImageFiles/DdsFile.cs index 1c98ef5..a581541 100644 --- a/BCnEnc.Net/Shared/DdsFile.cs +++ b/BCnEnc.Net/Shared/ImageFiles/DdsFile.cs @@ -4,7 +4,7 @@ using System.Runtime.InteropServices; using System.Text; -namespace BCnEncoder.Shared +namespace BCnEncoder.Shared.ImageFiles { public class DdsFile { diff --git a/BCnEnc.Net/Shared/ImageFiles/ImageFile.cs b/BCnEnc.Net/Shared/ImageFiles/ImageFile.cs index 87150cb..b3882d3 100644 --- a/BCnEnc.Net/Shared/ImageFiles/ImageFile.cs +++ b/BCnEnc.Net/Shared/ImageFiles/ImageFile.cs @@ -7,7 +7,7 @@ namespace BCnEncoder.Shared.ImageFiles /// /// The format identifier of an image file. /// - public enum ImagefileFormat + public enum ImageFileFormat { /// /// Represents the KTX image file format. @@ -37,19 +37,19 @@ public static class ImageFile /// /// The stream of data to identify. /// The format this image file may contain. - public static ImagefileFormat DetermineImageFormat(Stream stream) + public static ImageFileFormat DetermineImageFormat(Stream stream) { if (IsDds(stream)) { - return ImagefileFormat.Dds; + return ImageFileFormat.Dds; } if (IsKtx(stream)) { - return ImagefileFormat.Ktx; + return ImageFileFormat.Ktx; } - return ImagefileFormat.Unknown; + return ImageFileFormat.Unknown; } private static bool IsDds(Stream stream) diff --git a/BCnEnc.Net/Shared/KtxFile.cs b/BCnEnc.Net/Shared/ImageFiles/KtxFile.cs similarity index 99% rename from BCnEnc.Net/Shared/KtxFile.cs rename to BCnEnc.Net/Shared/ImageFiles/KtxFile.cs index 47bc782..b090986 100644 --- a/BCnEnc.Net/Shared/KtxFile.cs +++ b/BCnEnc.Net/Shared/ImageFiles/KtxFile.cs @@ -1,11 +1,11 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using static System.Text.Encoding; -namespace BCnEncoder.Shared +namespace BCnEncoder.Shared.ImageFiles { /// /// A representation of a ktx file. diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 5a205e5..3b23918 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -6,6 +6,51 @@ namespace BCnEncoder.Shared { internal static class ImageToBlocks { + #region Blocks to colors + + internal static ColorRgba32[] ColorsFromRawBlocks(RawBlock4X4Rgba32[,] blocks, int pixelWidth, int pixelHeight) + { + var output = new ColorRgba32[pixelWidth * pixelHeight]; + + for (var y = 0; y < pixelHeight; y++) + { + for (var x = 0; x < pixelWidth; x++) + { + var blockIndexX = x >> 2; + var blockIndexY = y >> 2; + var blockInternalIndexX = x & 3; + var blockInternalIndexY = y & 3; + + output[x + y * pixelWidth] = blocks[blockIndexX, blockIndexY][blockInternalIndexX, blockInternalIndexY]; + } + } + + return output; + } + + internal static ColorRgba32[] ColorsFromRawBlocks(RawBlock4X4Rgba32[] blocks, int pixelWidth, int pixelHeight) + { + var output = new ColorRgba32[pixelWidth * pixelHeight]; + + for (var y = 0; y < pixelHeight; y++) + { + for (var x = 0; x < pixelWidth; x++) + { + var blockIndexX = x >> 2; + var blockIndexY = y >> 2; + var blockInternalIndexX = x & 3; + var blockInternalIndexY = y & 3; + + var blockIndex = blockIndexX + blockIndexY * 4; + + output[x + y * pixelWidth] = blocks[blockIndex][blockInternalIndexX, blockInternalIndexY]; + } + } + + return output; + } + + #endregion internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int blocksWidth, out int blocksHeight) { @@ -71,66 +116,6 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int return output; } - internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, int blocksWidth, int blocksHeight) - => ImageFromRawBlocks(blocks, blocksWidth, blocksHeight, blocksWidth * 4, blocksHeight * 4); - - internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[,] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) - { - var output = new Image(pixelWidth, pixelHeight); - - if (!output.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - - for (var y = 0; y < output.Height; y++) - { - for (var x = 0; x < output.Width; x++) - { - var blockIndexX = x >> 2; - var blockIndexY = y >> 2; - var blockInternalIndexX = x & 3; - var blockInternalIndexY = y & 3; - - pixels[x + y * output.Width] = - blocks[blockIndexX, blockIndexY] - [blockInternalIndexX, blockInternalIndexY]; - } - } - - return output; - } - - internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int blocksWidth, int blocksHeight) - => ImageFromRawBlocks(blocks, blocksWidth, blocksHeight, blocksWidth * 4, blocksHeight * 4); - - internal static Image ImageFromRawBlocks(RawBlock4X4Rgba32[] blocks, int blocksWidth, int blocksHeight, int pixelWidth, int pixelHeight) - { - var output = new Image(pixelWidth, pixelHeight); - - if (!output.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } - - for (var y = 0; y < output.Height; y++) - { - for (var x = 0; x < output.Width; x++) - { - var blockIndexX = x >> 2; - var blockIndexY = y >> 2; - var blockInternalIndexX = x & 3; - var blockInternalIndexY = y & 3; - - pixels[x + y * output.Width] = - blocks[blockIndexX + blockIndexY * blocksWidth] - [blockInternalIndexX, blockInternalIndexY]; - } - } - - return output; - } - public static int CalculateNumOfBlocks(int pixelWidth, int pixelHeight) { var blocksWidth = ((pixelWidth + 3) & ~3) >> 2; diff --git a/BCnEnc.Net/Shared/RawBlocks.cs b/BCnEnc.Net/Shared/RawBlocks.cs index decaecc..d25204b 100644 --- a/BCnEnc.Net/Shared/RawBlocks.cs +++ b/BCnEnc.Net/Shared/RawBlocks.cs @@ -1,45 +1,51 @@ -using System; +using System; using System.Runtime.InteropServices; using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared { - internal struct RawBlock4X4Rgba32 { - public Rgba32 p00, p10, p20, p30; - public Rgba32 p01, p11, p21, p31; - public Rgba32 p02, p12, p22, p32; - public Rgba32 p03, p13, p23, p33; - public Span AsSpan => MemoryMarshal.CreateSpan(ref p00, 16); + public struct RawBlock4X4Rgba32 + { + public ColorRgba32 p00, p10, p20, p30; + public ColorRgba32 p01, p11, p21, p31; + public ColorRgba32 p02, p12, p22, p32; + public ColorRgba32 p03, p13, p23, p33; + public Span AsSpan => MemoryMarshal.CreateSpan(ref p00, 16); - public Rgba32 this[int x, int y] { + public ColorRgba32 this[int x, int y] + { get => AsSpan[x + y * 4]; set => AsSpan[x + y * 4] = value; } - public Rgba32 this[int index] { + public ColorRgba32 this[int index] + { get => AsSpan[index]; set => AsSpan[index] = value; } - public int CalculateError(RawBlock4X4Rgba32 other, bool useAlpha = false) { + public int CalculateError(RawBlock4X4Rgba32 other, bool useAlpha = false) + { float error = 0; var pix1 = AsSpan; var pix2 = other.AsSpan; - for (var i = 0; i < pix1.Length; i++) { + for (var i = 0; i < pix1.Length; i++) + { var col1 = pix1[i]; var col2 = pix2[i]; - var re = col1.R - col2.R; - var ge = col1.G - col2.G; - var be = col1.B - col2.B; + var re = col1.r - col2.r; + var ge = col1.g - col2.g; + var be = col1.b - col2.b; error += re * re; error += ge * ge; error += be * be; - if (useAlpha) { - var ae = col1.A - col2.A; + if (useAlpha) + { + var ae = col1.a - col2.a; error += ae * ae * 4; } } @@ -50,13 +56,15 @@ public int CalculateError(RawBlock4X4Rgba32 other, bool useAlpha = false) { return (int)error; } - public float CalculateYCbCrError(RawBlock4X4Rgba32 other) { + public float CalculateYCbCrError(RawBlock4X4Rgba32 other) + { float yError = 0; float cbError = 0; float crError = 0; var pix1 = AsSpan; var pix2 = other.AsSpan; - for (var i = 0; i < pix1.Length; i++) { + for (var i = 0; i < pix1.Length; i++) + { var col1 = new ColorYCbCr(pix1[i]); var col2 = new ColorYCbCr(pix2[i]); @@ -74,14 +82,16 @@ public float CalculateYCbCrError(RawBlock4X4Rgba32 other) { return error; } - public float CalculateYCbCrAlphaError(RawBlock4X4Rgba32 other, float yMultiplier = 2, float alphaMultiplier = 1) { + public float CalculateYCbCrAlphaError(RawBlock4X4Rgba32 other, float yMultiplier = 2, float alphaMultiplier = 1) + { float yError = 0; float cbError = 0; float crError = 0; float alphaError = 0; var pix1 = AsSpan; var pix2 = other.AsSpan; - for (var i = 0; i < pix1.Length; i++) { + for (var i = 0; i < pix1.Length; i++) + { var col1 = new ColorYCbCrAlpha(pix1[i]); var col2 = new ColorYCbCrAlpha(pix2[i]); @@ -100,45 +110,53 @@ public float CalculateYCbCrAlphaError(RawBlock4X4Rgba32 other, float yMultiplier return error; } - public RawBlock4X4Ycbcr ToRawBlockYcbcr() { + public RawBlock4X4Ycbcr ToRawBlockYcbcr() + { var rawYcbcr = new RawBlock4X4Ycbcr(); var pixels = AsSpan; var ycbcrPs = rawYcbcr.AsSpan; - for (var i = 0; i < pixels.Length; i++) { + for (var i = 0; i < pixels.Length; i++) + { ycbcrPs[i] = new ColorYCbCr(pixels[i]); } return rawYcbcr; } - public bool HasTransparentPixels() { + public bool HasTransparentPixels() + { var pixels = AsSpan; - for (var i = 0; i < pixels.Length; i++) { - if (pixels[i].A < 255) return true; + for (var i = 0; i < pixels.Length; i++) + { + if (pixels[i].a < 255) return true; } return false; } } - internal struct RawBlock4X4Ycbcr { + public struct RawBlock4X4Ycbcr + { public ColorYCbCr p00, p10, p20, p30; public ColorYCbCr p01, p11, p21, p31; public ColorYCbCr p02, p12, p22, p32; public ColorYCbCr p03, p13, p23, p33; public Span AsSpan => MemoryMarshal.CreateSpan(ref p00, 16); - public ColorYCbCr this[int x, int y] { + public ColorYCbCr this[int x, int y] + { get => AsSpan[x + y * 4]; set => AsSpan[x + y * 4] = value; } - public float CalculateError(RawBlock4X4Rgba32 other) { + public float CalculateError(RawBlock4X4Rgba32 other) + { float yError = 0; float cbError = 0; float crError = 0; var pix1 = AsSpan; var pix2 = other.AsSpan; - for (var i = 0; i < pix1.Length; i++) { + for (var i = 0; i < pix1.Length; i++) + { var col1 = pix1[i]; var col2 = new ColorYCbCr(pix2[i]); diff --git a/BCnEncTests/Support/TestHelper.cs b/BCnEncTests/Support/TestHelper.cs index 1836b8d..2f77215 100644 --- a/BCnEncTests/Support/TestHelper.cs +++ b/BCnEncTests/Support/TestHelper.cs @@ -5,6 +5,7 @@ using BCnEncoder.Decoder; using BCnEncoder.Encoder; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using Xunit; From a508618998358742ee3264a426845e234f997c64 Mon Sep 17 00:00:00 2001 From: Nominom Date: Mon, 25 Jan 2021 00:04:01 +0200 Subject: [PATCH 054/116] New basic mipmapper --- BCnEnc.Net/Shared/MipMapper.cs | 44 +++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index 78806e6..94630ec 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Runtime.InteropServices; +using Microsoft.Toolkit.HighPerformance.Memory; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; @@ -67,13 +69,18 @@ public static void CalculateMipLevelSize(int width, int height, int mipIdx, out /// /// Generate a chain of elements. /// - /// The image to scale down. + /// The original image to scale down. + /// The original image width. + /// The original image height. /// The number of mipmaps to generate. /// /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. - public static List> GenerateMipChain(Image sourceImage, ref int numMipMaps) + public static List> GenerateMipChain(ReadOnlySpan pixelsRgba, int width, int height, ref int numMipMaps) { - var result = new List> { sourceImage.Clone() }; + var span2d = ReadOnlySpan2D.DangerousCreate( + MemoryMarshal.Cast(pixelsRgba)[0], height, width, 0); + + var result = new List> { span2d.ToArray() }; // If only one mipmap was requested, return original image only if (numMipMaps == 1) @@ -90,13 +97,13 @@ public static List> GenerateMipChain(Image sourceImage, re // Generate mipmaps for (var mipLevel = 1; mipLevel < numMipMaps; mipLevel++) { - var mipWidth = Math.Max(1, sourceImage.Width / (int)Math.Pow(2, mipLevel)); - var mipHeight = Math.Max(1, sourceImage.Height / (int)Math.Pow(2, mipLevel)); + var mipWidth = Math.Max(1, width / (int)Math.Pow(2, mipLevel)); + var mipHeight = Math.Max(1, height / (int)Math.Pow(2, mipLevel)); - var newImage = sourceImage.Clone(x => x.Resize(mipWidth, mipHeight)); - result.Add(newImage); + ColorRgba32[,] newMip = Resize(result[mipLevel - 1].Span, mipWidth, mipHeight); + result.Add(newMip); - // Stop generating of last generated mipmap was of size 1x1 + // Stop generating if last generated mipmap was of size 1x1 if (mipWidth == 1 && mipHeight == 1) { numMipMaps = mipLevel + 1; @@ -106,5 +113,26 @@ public static List> GenerateMipChain(Image sourceImage, re return result; } + + private static ColorRgba32[,] Resize(ReadOnlySpan2D pixelsRgba, int newWidth, int newHeight) + { + //TODO: Make better + + ColorRgba32[,] result = new ColorRgba32[newHeight, newWidth]; + var oldWidth = pixelsRgba.Width; + var oldHeight = pixelsRgba.Height; + + for (int x = 0; x < newWidth; x++) + { + for (int y = 0; y < newHeight; y++) + { + var xOrig = (int) (x / (double) newWidth * oldWidth); + var yOrig = (int) (y / (double) newHeight * oldHeight); + result[y, x] = pixelsRgba[yOrig, xOrig]; + } + } + + return result; + } } } From 4aaeca5e4d9cd941228a70346bc4d67229e1e8f1 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Sun, 24 Jan 2021 23:10:14 +0100 Subject: [PATCH 055/116] Add namespace for Imagefiles; --- BCnEnc.Net/Encoder/BcEncoder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index f358325..3c5271a 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -10,6 +10,7 @@ using BCnEncoder.Encoder.Bc7; using BCnEncoder.Encoder.Options; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; using Microsoft.Toolkit.HighPerformance.Memory; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; From cdbfbd7373606b14ee8b55216d7913ee1b48215d Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Wed, 27 Jan 2021 21:35:45 +0100 Subject: [PATCH 056/116] Switch to Memory in BcEncoder; --- BCnEnc.Net/Encoder/BcEncoder.cs | 800 +++++++++++++------------------- BCnEnc.Net/Shared/MipMapper.cs | 132 +++--- 2 files changed, 391 insertions(+), 541 deletions(-) diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 3c5271a..0a072ca 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -11,6 +11,7 @@ using BCnEncoder.Encoder.Options; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; +using Microsoft.Toolkit.HighPerformance.Extensions; using Microsoft.Toolkit.HighPerformance.Memory; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; @@ -301,202 +302,54 @@ public Task EncodeToRawBytesAsync(Memory2D inputPixelsRgba, int mi /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. /// - /// The input image rgba data. - /// The width of the input image. - /// The height of the input image. - /// The stream to write the encoded image to. - public void EncodeToStream(Memory inputPixelsRgba, int width, int height, Stream outputStream) where T : unmanaged - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - EncodeToStreamInternal(bytes, width, height, outputStream, default); - } - - /// - /// Encodes all mipmap levels into a Ktx file. - /// - /// The input image rgba data. - /// The width of the input image. - /// The height of the input image. - /// The Ktx file containing the encoded image. - public KtxFile EncodeToKtx(Memory inputPixelsRgba, int width, int height) where T : unmanaged - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - return EncodeToKtxInternal(bytes, width, height, default); - } - - /// - /// Encodes all mipmap levels into a Dds file. - /// - /// The input image rgba data. - /// The width of the input image. - /// The height of the input image. - /// The Dds file containing the encoded image. - public DdsFile EncodeToDds(Memory inputPixelsRgba, int width, int height) where T : unmanaged - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - return EncodeToDdsInternal(bytes, width, height, default); - } - - /// - /// Encodes all mipmap levels into a list of byte buffers. - /// - /// The raw pixels of the input image in rgba format. - /// The width of the input image. - /// The height of the input image. - /// A list of raw encoded mipmap data. - public IList EncodeToRawBytes(Memory inputPixelsRgba, int width, int height) where T : unmanaged - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - return EncodeToRawBytesInternal(bytes, width, height, default); - } - - /// - /// Encodes a single mip level of the input image to a byte buffer. - /// - /// The raw pixels of the input image in rgba format. - /// The width of the input image. - /// The height of the input image. - /// The mipmap to encode. - /// The width of the mipmap. - /// The height of the mipmap. - /// The raw encoded data. - public byte[] EncodeToRawBytes(Memory inputPixelsRgba, int width, int height, int mipLevel, out int mipWidth, out int mipHeight) where T : unmanaged - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - return EncodeToRawBytesInternal(bytes, width, height, mipLevel, out mipWidth, - out mipHeight, default); - } - - - - /// - /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. - /// - /// The input image rgba data. + /// The data to encode represented by a . /// The stream to write the encoded image to. - public void EncodeToStream(Memory2D inputPixelsRgba, Stream outputStream) where T : unmanaged + public void EncodeToStream(Memory2D input, Stream outputStream) { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - EncodeToStreamInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, outputStream, default); + EncodeToStreamInternal(input, outputStream, default); } /// /// Encodes all mipmap levels into a Ktx file. /// - /// The input image rgba data. + /// The data to encode represented by a . /// The Ktx file containing the encoded image. - public KtxFile EncodeToKtx(Memory2D inputPixelsRgba) where T : unmanaged + public KtxFile EncodeToKtx(Memory2D input) { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - return EncodeToKtxInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, default); + return EncodeToKtxInternal(input, default); } /// /// Encodes all mipmap levels into a Dds file. /// - /// The input image rgba data. + /// The data to encode represented by a . /// The Dds file containing the encoded image. - public DdsFile EncodeToDds(Memory2D inputPixelsRgba) where T : unmanaged + public DdsFile EncodeToDds(Memory2D input) { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - return EncodeToDdsInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, default); + return EncodeToDdsInternal(input, default); } /// /// Encodes all mipmap levels into a list of byte buffers. /// - /// The raw pixels of the input image in rgba format. + /// The data to encode represented by a . /// A list of raw encoded mipmap data. - public IList EncodeToRawBytes(Memory2D inputPixelsRgba) where T : unmanaged + public byte[][] EncodeToRawBytes(Memory2D input) { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - return EncodeToRawBytesInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, default); + return EncodeToRawBytesInternal(input, default); } /// /// Encodes a single mip level of the input image to a byte buffer. /// - /// The raw pixels of the input image in rgba format. + /// The data to encode represented by a . /// The mipmap to encode. /// The width of the mipmap. /// The height of the mipmap. /// The raw encoded data. - public byte[] EncodeToRawBytes(Memory2D inputPixelsRgba, int mipLevel, out int mipWidth, out int mipHeight) where T : unmanaged + public byte[] EncodeToRawBytes(Memory2D input, int mipLevel, out int mipWidth, out int mipHeight) { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - - return EncodeToRawBytesInternal(bytes, inputPixelsRgba.Width, inputPixelsRgba.Height, mipLevel, out mipWidth, - out mipHeight, default); + return EncodeToRawBytesInternal(input, mipLevel, out mipWidth, out mipHeight, default); } #endregion @@ -533,408 +386,403 @@ public void CalculateMipMapSize(int imagePixelWidth, int imagePixelHeight, int m #region Private - private void EncodeToStreamInternal(ReadOnlySpan inputPixelsRgba, int width, int height, Stream outputStream, CancellationToken token) + private void EncodeToStreamInternal(Memory input, int width, int height, Stream outputStream, CancellationToken token) + { + EncodeToStreamInternal(input.AsMemory2D(width, height), outputStream, token); + } + + private void EncodeToStreamInternal(Memory2D input, Stream outputStream, CancellationToken token) { switch (OutputOptions.FileFormat) { case OutputFileFormat.Dds: - var dds = EncodeToDdsInternal(inputPixelsRgba, width, height, token); + var dds = EncodeToDdsInternal(input, token); dds.Write(outputStream); break; case OutputFileFormat.Ktx: - var ktx = EncodeToKtxInternal(inputPixelsRgba, width, height, token); + var ktx = EncodeToKtxInternal(input, token); ktx.Write(outputStream); break; } } - private KtxFile EncodeToKtxInternal(ReadOnlySpan inputPixelsRgba, int width, int height, CancellationToken token) + private KtxFile EncodeToKtxInternal(Memory input, int width, int height, CancellationToken token) + { + return EncodeToKtxInternal(input.AsMemory2D(width, height), token); + } + + private KtxFile EncodeToKtxInternal(Memory2D input, CancellationToken token) { KtxFile output; IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputPixelsRgba, width, height, ref numMipMaps); - try - { - // Setup encoders - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } + var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); - output = new KtxFile( - KtxHeader.InitializeCompressed(width, height, - compressedEncoder.GetInternalFormat(), - compressedEncoder.GetBaseInternalFormat())); - } - else + // Setup encoders + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - output = new KtxFile( - KtxHeader.InitializeUncompressed(width, height, - uncompressedEncoder.GetGlType(), - uncompressedEncoder.GetGlFormat(), - uncompressedEncoder.GetGlTypeSize(), - uncompressedEncoder.GetInternalFormat(), - uncompressedEncoder.GetBaseInternalFormat())); + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); } - var context = new OperationContext - { - CancellationToken = token, - IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount - }; + output = new KtxFile( + KtxHeader.InitializeCompressed(input.Width, input.Height, + compressedEncoder.GetInternalFormat(), + compressedEncoder.GetBaseInternalFormat())); + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + output = new KtxFile( + KtxHeader.InitializeUncompressed(input.Width, input.Height, + uncompressedEncoder.GetGlType(), + uncompressedEncoder.GetGlFormat(), + uncompressedEncoder.GetGlTypeSize(), + uncompressedEncoder.GetInternalFormat(), + uncompressedEncoder.GetBaseInternalFormat())); + } - // Calculate total blocks - var totalBlocks = isCompressedFormat ? mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)) : mipChain.Sum(m => m.Width * m.Height); - context.Progress = new OperationProgress(Options.Progress, totalBlocks); + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; - // Encode mipmap levels - for (var mip = 0; mip < numMipMaps; mip++) + // Calculate total blocks + var totalBlocks = isCompressedFormat ? mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)) : mipChain.Sum(m => m.Width * m.Height); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, - out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, - context); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip], out var blocksWidth, + out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, + context); - context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); - } - else + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); + } + else + { + if (!mipChain[mip].TryGetMemory(out var mipMemory)) { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - throw new Exception("Cannot get pixel span."); - - encoded = uncompressedEncoder.Encode(mipPixels); - - context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); + throw new InvalidOperationException("Could not get Memory from Memory2D."); } - output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height, 1)); - output.MipMaps[mip].Faces[0] = new KtxMipFace(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); - } + encoded = uncompressedEncoder.Encode(mipMemory); - output.header.NumberOfFaces = 1; - output.header.NumberOfMipmapLevels = (uint)numMipMaps; + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); + } - return output; - } - finally - { - // Dispose all mipmap levels, even if operation was cancelled - foreach (var image in mipChain) - image.Dispose(); + output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height, 1)); + output.MipMaps[mip].Faces[0] = new KtxMipFace(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); } + + output.header.NumberOfFaces = 1; + output.header.NumberOfMipmapLevels = (uint)numMipMaps; + + return output; } - private DdsFile EncodeToDdsInternal(ReadOnlySpan inputPixelsRgba, int width, int height, CancellationToken token) + private DdsFile EncodeToDdsInternal(Memory input, int width, int height, CancellationToken token) + { + return EncodeToDdsInternal(input.AsMemory2D(width, height), token); + } + + private DdsFile EncodeToDdsInternal(Memory2D input, CancellationToken token) { DdsFile output; IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputPixelsRgba, width, height, ref numMipMaps); - try + var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); + + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) { - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } - var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(width, height, - compressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader, dxt10Header); + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(input.Width, input.Height, + compressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader, dxt10Header); - if (OutputOptions.DdsBc1WriteAlphaFlag && - OutputOptions.Format == CompressionFormat.Bc1WithAlpha) - { - output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; - } - } - else + if (OutputOptions.DdsBc1WriteAlphaFlag && + OutputOptions.Format == CompressionFormat.Bc1WithAlpha) { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); - var ddsHeader = DdsHeader.InitializeUncompressed(width, height, - uncompressedEncoder.GetDxgiFormat()); - output = new DdsFile(ddsHeader); + output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; } + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + var ddsHeader = DdsHeader.InitializeUncompressed(input.Width, input.Height, + uncompressedEncoder.GetDxgiFormat()); + output = new DdsFile(ddsHeader); + } - var context = new OperationContext - { - CancellationToken = token, - IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount - }; + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; - // Calculate total blocks - var totalBlocks = isCompressedFormat ? mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)) : mipChain.Sum(m => m.Width * m.Height); - context.Progress = new OperationProgress(Options.Progress, totalBlocks); + // Calculate total blocks + var totalBlocks = isCompressedFormat ? mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)) : mipChain.Sum(m => m.Width * m.Height); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); - // Encode mipmap levels - for (var mip = 0; mip < numMipMaps; mip++) + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); - context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); - } - else + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); + } + else + { + if (!mipChain[mip].TryGetMemory(out var mipMemory)) { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - - encoded = uncompressedEncoder.Encode(mipPixels); - - context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); + throw new InvalidOperationException("Could not get Memory from Memory2D."); } - if (mip == 0) - { - output.Faces.Add(new DdsFace((uint)width, (uint)height, - (uint)encoded.Length, (int)numMipMaps)); - } + encoded = uncompressedEncoder.Encode(mipMemory); - output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); } - - output.header.dwMipMapCount = (uint)numMipMaps; - if (numMipMaps > 1) + if (mip == 0) { - output.header.dwCaps |= HeaderCaps.DdscapsComplex | HeaderCaps.DdscapsMipmap; + output.Faces.Add(new DdsFace((uint)input.Width, (uint)input.Height, + (uint)encoded.Length, numMipMaps)); } - return output; + output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); } - finally + + + output.header.dwMipMapCount = (uint)numMipMaps; + if (numMipMaps > 1) { - // Dispose all mipmap levels, even if operation was cancelled - foreach (var image in mipChain) - image.Dispose(); + output.header.dwCaps |= HeaderCaps.DdscapsComplex | HeaderCaps.DdscapsMipmap; } + + return output; } - private IList EncodeToRawBytesInternal(ReadOnlySpan inputPixelsRgba, int width, int height, CancellationToken token) + private IList EncodeToRawInternal(Memory input, int width, int height, CancellationToken token) { - if (inputPixelsRgba.Length != width * height * 4) - { - throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); - } - - var output = new List(); + return EncodeToRawInternal(input.AsMemory2D(width, height), token); + } + + private IList EncodeToRawInternal(Memory2D input, CancellationToken token) + { + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); + + var output = new List(numMipMaps); IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputPixelsRgba, width, height, ref numMipMaps); - try - { - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - } - else + if (isCompressedFormat) + { + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); } + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + } - var context = new OperationContext - { - CancellationToken = token, - IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount - }; + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; - // Calculate total blocks - var totalBlocks = isCompressedFormat ? mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)) : mipChain.Sum(m => m.Width * m.Height); - context.Progress = new OperationProgress(Options.Progress, totalBlocks); + // Calculate total blocks + var totalBlocks = isCompressedFormat ? mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)) : mipChain.Sum(m => m.Width * m.Height); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); - // Encode all mipmap levels - for (var mip = 0; mip < numMipMaps; mip++) + // Encode all mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + if (isCompressedFormat) { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); - context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); - } - else + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); + } + else + { + if (!mipChain[mip].TryGetMemory(out var mipMemory)) { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - - encoded = uncompressedEncoder.Encode(mipPixels); - - context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); + throw new InvalidOperationException("Could not get Memory from Memory2D."); } - output.Add(encoded); - } + encoded = uncompressedEncoder.Encode(mipMemory); + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); + } - return output; - } - finally - { - // Dispose all mipmap levels, even if operation was cancelled - foreach (var image in mipChain) - image.Dispose(); + output.Add(encoded); } + + return output; } - private byte[] EncodeToRawBytesInternal(ReadOnlySpan inputPixelsRgba, int width, int height, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) + private byte[] EncodeToRawInternal(Memory input, int width, int height, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) { - if (inputPixelsRgba.Length != width * height * 4) - { - throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); - } + return EncodeToRawInternal(input.AsMemory2D(width, height), mipLevel, out mipWidth, out mipHeight, token); + } - if (mipLevel < 0) - throw new ArgumentException($"{nameof(mipLevel)} cannot be less than zero."); + private byte[] EncodeToRawInternal(Memory2D input, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) + { + mipLevel = Math.Max(0, mipLevel); IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipChain = MipMapper.GenerateMipChain(inputPixelsRgba, width, height, ref numMipMaps); - try + var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); + + // Setup encoder + var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); + if (isCompressedFormat) { - // Setup encoder - var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); - if (isCompressedFormat) - { - compressedEncoder = GetEncoder(OutputOptions.Format); - if (compressedEncoder == null) - { - throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); - } - } - else + compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) { - uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); } + } + else + { + uncompressedEncoder = GetRawEncoder(OutputOptions.Format); + } - // Dispose all mipmap levels - if (mipLevel > numMipMaps - 1) - { - throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps."); - } + // Dispose all mipmap levels + if (mipLevel > numMipMaps - 1) + { + throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps."); + } - var context = new OperationContext - { - CancellationToken = token, - IsParallel = !Debugger.IsAttached && Options.IsParallel, - TaskCount = Options.TaskCount - }; + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; - // Calculate total blocks - var totalBlocks = isCompressedFormat ? ImageToBlocks.CalculateNumOfBlocks(mipChain[mipLevel].Width, mipChain[mipLevel].Height) : mipChain[mipLevel].Width * mipChain[mipLevel].Height; - context.Progress = new OperationProgress(Options.Progress, totalBlocks); + // Calculate total blocks + var totalBlocks = isCompressedFormat ? ImageToBlocks.CalculateNumOfBlocks(mipChain[mipLevel].Width, mipChain[mipLevel].Height) : mipChain[mipLevel].Width * mipChain[mipLevel].Height; + context.Progress = new OperationProgress(Options.Progress, totalBlocks); - // Encode mipmap level - byte[] encoded; - if (isCompressedFormat) + // Encode mipmap level + byte[] encoded; + if (isCompressedFormat) + { + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + } + else + { + if (!mipChain[mipLevel].TryGetMemory(out var mipMemory)) { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + throw new InvalidOperationException("Could not get Memory from Memory2D."); } - else - { - if (!mipChain[mipLevel].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - encoded = uncompressedEncoder.Encode(mipPixels); - } + encoded = uncompressedEncoder.Encode(mipMemory); + } - mipWidth = mipChain[mipLevel].Width; - mipHeight = mipChain[mipLevel].Height; + mipWidth = mipChain[mipLevel].Width; + mipHeight = mipChain[mipLevel].Height; - return encoded; - } - finally - { - // Dispose all mipmap levels, even if operation was cancelled - foreach (var image in mipChain) - image.Dispose(); - } + return encoded; + } + + private void EncodeCubeMapToStreamInternal(Memory right, Memory left, Memory top, Memory down, + Memory back, Memory front, int width, int height, Stream outputStream, CancellationToken token) + { + EncodeCubeMapToStreamInternal( + right.AsMemory2D(width, height), left.AsMemory2D(width, height), + top.AsMemory2D(width, height), down.AsMemory2D(width, height), + back.AsMemory2D(width, height), front.AsMemory2D(width, height), + outputStream, token); } - private void EncodeCubeMapToStreamInternal(ReadOnlySpan right, ReadOnlySpan left, ReadOnlySpan top, ReadOnlySpan down, - ReadOnlySpan back, ReadOnlySpan front, int width, int height, Stream outputStream, CancellationToken token) + private void EncodeCubeMapToStreamInternal(Memory2D right, Memory2D left, Memory2D top, Memory2D down, + Memory2D back, Memory2D front, Stream outputStream, CancellationToken token) { switch (OutputOptions.FileFormat) { case OutputFileFormat.Ktx: - var ktx = EncodeCubeMapToKtxInternal(right, left, top, down, back, front, width, height, token); + var ktx = EncodeCubeMapToKtxInternal(right, left, top, down, back, front, token); ktx.Write(outputStream); break; case OutputFileFormat.Dds: - var dds = EncodeCubeMapToDdsInternal(right, left, top, down, back, front, width, height, token); + var dds = EncodeCubeMapToDdsInternal(right, left, top, down, back, front, token); dds.Write(outputStream); break; } } - private KtxFile EncodeCubeMapToKtxInternal(ReadOnlySpan right, ReadOnlySpan left, ReadOnlySpan top, ReadOnlySpan down, - ReadOnlySpan back, ReadOnlySpan front, int width, int height, CancellationToken token) + private KtxFile EncodeCubeMapToKtxInternal(Memory right, Memory left, Memory top, Memory down, + Memory back, Memory front, int width, int height, Stream outputStream, CancellationToken token) + { + return EncodeCubeMapToKtxInternal( + right.AsMemory2D(width, height), left.AsMemory2D(width, height), + top.AsMemory2D(width, height), down.AsMemory2D(width, height), + back.AsMemory2D(width, height), front.AsMemory2D(width, height), + outputStream, token); + } + + private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D left, Memory2D top, Memory2D down, + Memory2D back, Memory2D front, CancellationToken token) { KtxFile output; IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - if (right.Length != width * height * 4) - { - throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); - } - - if (right.Length != left.Length || right.Length != top.Length || right.Length != down.Length - || right.Length != back.Length || right.Length != front.Length) - { - throw new ArgumentException("All input images of a cubemap should be the same size."); - } + var faces = new[] { right, left, top, down, back, front }; - var faces = new[] { right.ToArray(), left.ToArray(), top.ToArray(), down.ToArray(), back.ToArray(), front.ToArray() }; + var width = right.Width; + var height = right.Height; // Setup encoder var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); @@ -947,7 +795,7 @@ private KtxFile EncodeCubeMapToKtxInternal(ReadOnlySpan right, ReadOnlySpa } output = new KtxFile( - KtxHeader.InitializeCompressed(width, height, + KtxHeader.InitializeCompressed(width,height, compressedEncoder.GetInternalFormat(), compressedEncoder.GetBaseInternalFormat())); } @@ -955,7 +803,7 @@ private KtxFile EncodeCubeMapToKtxInternal(ReadOnlySpan right, ReadOnlySpa { uncompressedEncoder = GetRawEncoder(OutputOptions.Format); output = new KtxFile( - KtxHeader.InitializeUncompressed(width, height, + KtxHeader.InitializeUncompressed(width,height, uncompressedEncoder.GetGlType(), uncompressedEncoder.GetGlFormat(), uncompressedEncoder.GetGlTypeSize(), @@ -965,7 +813,7 @@ private KtxFile EncodeCubeMapToKtxInternal(ReadOnlySpan right, ReadOnlySpa } var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipLength = MipMapper.CalculateMipChainLength(width, height, numMipMaps); + var mipLength = MipMapper.CalculateMipChainLength(width,height, numMipMaps); for (uint i = 0; i < mipLength; i++) { output.MipMaps.Add(new KtxMipmap(0, 0, 0, (uint)faces.Length)); @@ -984,7 +832,7 @@ private KtxFile EncodeCubeMapToKtxInternal(ReadOnlySpan right, ReadOnlySpa { for (var mip = 0; mip < numMipMaps; mip++) { - MipMapper.CalculateMipLevelSize(width, height, mip, out var mipWidth, out var mipHeight); + MipMapper.CalculateMipLevelSize(width,height, mip, out var mipWidth, out var mipHeight); totalBlocks += isCompressedFormat ? ImageToBlocks.CalculateNumOfBlocks(mipWidth, mipHeight) : mipWidth * mipHeight; } } @@ -995,50 +843,42 @@ private KtxFile EncodeCubeMapToKtxInternal(ReadOnlySpan right, ReadOnlySpa for (var face = 0; face < faces.Length; face++) { var mipChain = MipMapper.GenerateMipChain(faces[face], width, height, ref numMipMaps); - try + + // Encode all mipmap levels per face + for (var mipLevel = 0; mipLevel < numMipMaps; mipLevel++) { - // Encode all mipmap levels per face - for (var mip = 0; mip < numMipMaps; mip++) + byte[] encoded; + if (isCompressedFormat) { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); - processedBlocks += blocks.Length; - context.Progress.SetProcessedBlocks(processedBlocks); - } - else + processedBlocks += blocks.Length; + context.Progress.SetProcessedBlocks(processedBlocks); + } + else + { + if (!mipChain[mipLevel].TryGetMemory(out var mipMemory)) { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - - encoded = uncompressedEncoder.Encode(mipPixels); - - processedBlocks += mipPixels.Length; - context.Progress.SetProcessedBlocks(processedBlocks); + throw new InvalidOperationException("Could not get Memory from Memory2D."); } - if (face == 0) - { - output.MipMaps[mip] = new KtxMipmap((uint)encoded.Length, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height, (uint)faces.Length); - } + encoded = uncompressedEncoder.Encode(mipMemory); - output.MipMaps[mip].Faces[face] = new KtxMipFace(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); + processedBlocks += mipMemory.Length; + context.Progress.SetProcessedBlocks(processedBlocks); } - } - finally - { - // Dispose all mipmap levels, even if operation was cancelled - foreach (var image in mipChain) - image.Dispose(); + + if (face == 0) + { + output.MipMaps[mipLevel] = new KtxMipmap((uint)encoded.Length, + (uint)mipChain[mipLevel].Width, + (uint)mipChain[mipLevel].Height, (uint)faces.Length); + } + + output.MipMaps[mipLevel].Faces[face] = new KtxMipFace(encoded, + (uint)mipChain[mipLevel].Width, + (uint)mipChain[mipLevel].Height); } } @@ -1061,7 +901,7 @@ private DdsFile EncodeCubeMapToDdsInternal(ReadOnlySpan right, ReadOnlySpa } if (right.Length != left.Length || right.Length != top.Length || right.Length != down.Length - || right.Length != back.Length || right.Length != front.Length) + || right.Length != back.Length || right.Length != front.Length) { throw new ArgumentException("All input images of a cubemap should be the same size."); } diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index 94630ec..02e6ac8 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -1,15 +1,73 @@ using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; +using Microsoft.Toolkit.HighPerformance.Extensions; using Microsoft.Toolkit.HighPerformance.Memory; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Processing; namespace BCnEncoder.Shared { internal static class MipMapper { + /// + /// Generate a chain of elements. + /// + /// The original image to scale down. + /// The number of mipmaps to generate. + /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. + public static Memory2D[] GenerateMipChain(Memory2D input, ref int numMipMaps) + { + if (!input.TryGetMemory(out var memory)) + { + throw new InvalidOperationException("Could not get Memory from Memory2D."); + } + + return GenerateMipChain(memory, input.Width, input.Height, ref numMipMaps); + } + + /// + /// Generate a chain of elements. + /// + /// The original image to scale down. + /// The original image width. + /// The original image height. + /// The number of mipmaps to generate. + /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. + public static Memory2D[] GenerateMipChain(Memory pixels, int width, int height, ref int numMipMaps) + { + var mipChainLength = CalculateMipChainLength(width, height, numMipMaps); + + var result = new Memory2D[mipChainLength]; + result[0] = pixels.AsMemory2D(width, height); + + // If only one mipmap was requested, return original image only + if (numMipMaps == 1) + { + return result; + } + + // If number of mipmaps is "marked as boundless", do as many mipmaps as it takes to reach a size of 1x1 + if (numMipMaps <= 0) + { + numMipMaps = int.MaxValue; + } + + // Generate mipmaps + for (var mipLevel = 1; mipLevel < numMipMaps; mipLevel++) + { + var mipWidth = Math.Max(1, width / (int)Math.Pow(2, mipLevel)); + var mipHeight = Math.Max(1, height / (int)Math.Pow(2, mipLevel)); + + var newMip = Resize(result[mipLevel - 1].Span, mipWidth, mipHeight); + result[mipLevel] = newMip; + + // Stop generating if last generated mipmap was of size 1x1 + if (mipWidth == 1 && mipHeight == 1) + { + numMipMaps = mipLevel + 1; + break; + } + } + + return result; + } public static int CalculateMipChainLength(int width, int height, int maxNumMipMaps) { @@ -66,72 +124,24 @@ public static void CalculateMipLevelSize(int width, int height, int mipIdx, out } } - /// - /// Generate a chain of elements. - /// - /// The original image to scale down. - /// The original image width. - /// The original image height. - /// The number of mipmaps to generate. - /// - /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. - public static List> GenerateMipChain(ReadOnlySpan pixelsRgba, int width, int height, ref int numMipMaps) - { - var span2d = ReadOnlySpan2D.DangerousCreate( - MemoryMarshal.Cast(pixelsRgba)[0], height, width, 0); - - var result = new List> { span2d.ToArray() }; - - // If only one mipmap was requested, return original image only - if (numMipMaps == 1) - { - return result; - } - - // If number of mipmaps is "marked as boundless", do as many mipmaps as it takes to reach a size of 1x1 - if (numMipMaps <= 0) - { - numMipMaps = int.MaxValue; - } - - // Generate mipmaps - for (var mipLevel = 1; mipLevel < numMipMaps; mipLevel++) - { - var mipWidth = Math.Max(1, width / (int)Math.Pow(2, mipLevel)); - var mipHeight = Math.Max(1, height / (int)Math.Pow(2, mipLevel)); - - ColorRgba32[,] newMip = Resize(result[mipLevel - 1].Span, mipWidth, mipHeight); - result.Add(newMip); - - // Stop generating if last generated mipmap was of size 1x1 - if (mipWidth == 1 && mipHeight == 1) - { - numMipMaps = mipLevel + 1; - break; - } - } - - return result; - } - private static ColorRgba32[,] Resize(ReadOnlySpan2D pixelsRgba, int newWidth, int newHeight) { //TODO: Make better - - ColorRgba32[,] result = new ColorRgba32[newHeight, newWidth]; + + var result = new ColorRgba32[newHeight, newWidth]; var oldWidth = pixelsRgba.Width; var oldHeight = pixelsRgba.Height; - - for (int x = 0; x < newWidth; x++) + + for (var x = 0; x < newWidth; x++) { - for (int y = 0; y < newHeight; y++) + for (var y = 0; y < newHeight; y++) { - var xOrig = (int) (x / (double) newWidth * oldWidth); - var yOrig = (int) (y / (double) newHeight * oldHeight); + var xOrig = (int)(x / (double)newWidth * oldWidth); + var yOrig = (int)(y / (double)newHeight * oldHeight); result[y, x] = pixelsRgba[yOrig, xOrig]; } } - + return result; } } From 1bb8acbf8df761a21e17f8a6cf31f64a8383dde9 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 28 Jan 2021 01:27:25 +0100 Subject: [PATCH 057/116] Finish BcEncoder changes; Remove ImageSharp from Color structs and BcBlocks; --- BCnEnc.Net/Encoder/BcEncoder.cs | 534 +++++++++++++---------------- BCnEnc.Net/Encoder/RawEncoders.cs | 53 +-- BCnEnc.Net/Shared/Colors.cs | 187 +++++----- BCnEnc.Net/Shared/EncodedBlocks.cs | 21 +- BCnEnc.Net/Shared/ImageToBlocks.cs | 23 +- 5 files changed, 376 insertions(+), 442 deletions(-) diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 0a072ca..0900275 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -1,23 +1,43 @@ using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using BCnEncoder.Encoder.Bc7; using BCnEncoder.Encoder.Options; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; -using Microsoft.Toolkit.HighPerformance.Extensions; using Microsoft.Toolkit.HighPerformance.Memory; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Encoder { + /// + /// The pixel format determining the rgba layout of input data in . + /// + public enum PixelFormat + { + /// + /// Specifies the RGBA32 layout. + /// + Rgba32, + + /// + /// Specifies the BGRA32 layout. + /// + Bgra32, + + /// + /// Specifies the RGB24 layout. + /// + Rgb24, + + /// + /// Specifies the BGR24 layout. + /// + Bgr24 + } + /// /// Handles all encoding of images into compressed or uncompressed formats. For decoding, /// @@ -52,247 +72,136 @@ public BcEncoder(CompressionFormat format = CompressionFormat.Bc1) /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. /// - /// The input image rgba data. - /// The width of the input image. - /// The height of the input image. + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. /// The stream to write the encoded image to. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - public Task EncodeToStreamAsync(Memory inputPixelsRgba, int width, int height, Stream outputStream, CancellationToken token = default) where T : unmanaged + public Task EncodeToStreamAsync(Memory input, int width, int height, PixelFormat format, Stream outputStream, CancellationToken token = default) { return Task.Run(() => { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - EncodeToStreamInternal(bytes, width, height, outputStream, token); + EncodeToStreamInternal(ByteToColorMemory(input.Span, width, height, format), outputStream, token); }, token); } /// - /// Encodes all mipmap levels into a Ktx file asynchronously. + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. /// - /// The input image rgba data. - /// The width of the input image. - /// The height of the input image. + /// The input to encode represented by a . + /// The stream to write the encoded image to. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// The Ktx file containing the encoded image. - public Task EncodeToKtxAsync(Memory inputPixelsRgba, int width, int height, CancellationToken token = default) where T : unmanaged + public Task EncodeToStreamAsync(Memory2D input, Stream outputStream, CancellationToken token = default) { return Task.Run(() => { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - return EncodeToKtxInternal(bytes, width, height, token); + EncodeToStreamInternal(input, outputStream, default); }, token); } /// - /// Encodes all mipmap levels into a Dds file asynchronously. + /// Encodes all mipmap levels into a Ktx file asynchronously. /// - /// The input image rgba data. - /// The width of the input image. - /// The height of the input image. + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// The Dds file containing the encoded image. - public Task EncodeToDdsAsync(Memory inputPixelsRgba, int width, int height, CancellationToken token = default) where T : unmanaged + /// The Ktx file containing the encoded image. + public Task EncodeToKtxAsync(Memory input, int width, int height, PixelFormat format, CancellationToken token = default) { - return Task.Run(() => - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - return EncodeToDdsInternal(bytes, width, height, token); - }, token); + return Task.Run(() => EncodeToKtxInternal(ByteToColorMemory(input.Span, width, height, format), token), token); } /// - /// Encodes all mipmap levels into a list of byte buffers asynchronously. + /// Encodes all mipmap levels into a Ktx file asynchronously. /// - /// The input image rgba data. - /// The width of the input image. - /// The height of the input image. + /// The input to encode represented by a . /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// A list of raw encoded mipmap data. - public Task> EncodeToRawBytesAsync(Memory inputPixelsRgba, int width, int height, CancellationToken token = default) where T : unmanaged + /// The Ktx file containing the encoded image. + public Task EncodeToKtxAsync(Memory2D input, CancellationToken token = default) { - return Task.Run(() => - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - return EncodeToRawBytesInternal(bytes, width, height, token); - }, token); + return Task.Run(() => EncodeToKtxInternal(input, token), token); } /// - /// Encodes a single mip level of the input image to a byte buffer asynchronously. + /// Encodes all mipmap levels into a Dds file asynchronously. /// - /// The input image rgba data. - /// The width of the input image. - /// The height of the input image. - /// The mipmap to encode. + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// The raw encoded data. - /// To get the width and height of the encoded mipLevel, see . - public Task EncodeToRawBytesAsync(Memory inputPixelsRgba, int width, int height, int mipLevel, CancellationToken token = default) where T : unmanaged + /// The Dds file containing the encoded image. + public Task EncodeToDdsAsync(Memory input, int width, int height, PixelFormat format, CancellationToken token = default) { - return Task.Run(() => - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - var bytes = MemoryMarshal.AsBytes(inputPixelsRgba.Span); - return EncodeToRawBytesInternal(bytes, width, height, mipLevel, out _, - out _, token); - }, token); + return Task.Run(() => EncodeToDdsInternal(ByteToColorMemory(input.Span, width, height, format), token), token); } /// - /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. + /// Encodes all mipmap levels into a Dds file asynchronously. /// - /// The input image rgba data. - /// The stream to write the encoded image to. + /// The input to encode represented by a . /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - public Task EncodeToStreamAsync(Memory2D inputPixelsRgba, Stream outputStream, CancellationToken token = default) where T : unmanaged + /// The Dds file containing the encoded image. + public Task EncodeToDdsAsync(Memory2D input, CancellationToken token = default) { - return Task.Run(() => - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - var width = inputPixelsRgba.Width; - var height = inputPixelsRgba.Height; - EncodeToStreamInternal(bytes, width, height, outputStream, token); - }, token); + return Task.Run(() => EncodeToDdsInternal(input, token), token); } /// - /// Encodes all mipmap levels into a Ktx file asynchronously. + /// Encodes all mipmap levels into a list of byte buffers asynchronously. /// - /// The input image rgba data. + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// The Ktx file containing the encoded image. - public Task EncodeToKtxAsync(Memory2D inputPixelsRgba, CancellationToken token = default) where T : unmanaged + /// A list of raw encoded mipmap input. + public Task EncodeToRawBytesAsync(Memory input, int width, int height, PixelFormat format, CancellationToken token = default) { - return Task.Run(() => - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - var width = inputPixelsRgba.Width; - var height = inputPixelsRgba.Height; - return EncodeToKtxInternal(bytes, width, height, token); - }, token); + return Task.Run(() => EncodeToRawInternal(ByteToColorMemory(input.Span, width, height, format), token), token); } /// - /// Encodes all mipmap levels into a Dds file asynchronously. + /// Encodes all mipmap levels into a list of byte buffers asynchronously. /// - /// The input image rgba data. + /// The input to encode represented by a . /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// The Dds file containing the encoded image. - public Task EncodeToDdsAsync(Memory2D inputPixelsRgba, CancellationToken token = default) where T : unmanaged + /// A list of raw encoded mipmap input. + public Task EncodeToRawBytesAsync(Memory2D input, CancellationToken token = default) { - return Task.Run(() => - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - var width = inputPixelsRgba.Width; - var height = inputPixelsRgba.Height; - return EncodeToDdsInternal(bytes, width, height, token); - }, token); + return Task.Run(() => EncodeToRawInternal(input, token), token); } /// - /// Encodes all mipmap levels into a list of byte buffers asynchronously. + /// Encodes a single mip level of the input image to a byte buffer asynchronously. /// - /// The input image rgba data. + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. + /// The mipmap to encode. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// A list of raw encoded mipmap data. - public Task> EncodeToRawBytesAsync(Memory2D inputPixelsRgba, CancellationToken token = default) where T : unmanaged + /// The raw encoded input. + /// To get the width and height of the encoded mip level, see . + public Task EncodeToRawBytesAsync(Memory input, int width, int height, PixelFormat format, int mipLevel, CancellationToken token = default) { - return Task.Run(() => - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - var width = inputPixelsRgba.Width; - var height = inputPixelsRgba.Height; - return EncodeToRawBytesInternal(bytes, width, height, token); - }, token); + return Task.Run(() => EncodeToRawInternal(ByteToColorMemory(input.Span, width, height, format), mipLevel, out _, out _, token), token); } /// /// Encodes a single mip level of the input image to a byte buffer asynchronously. /// - /// The input image rgba data. + /// The input to encode represented by a . /// The mipmap to encode. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - /// The raw encoded data. - /// To get the width and height of the encoded mipLevel, see . - public Task EncodeToRawBytesAsync(Memory2D inputPixelsRgba, int mipLevel, CancellationToken token = default) where T : unmanaged + /// The raw encoded input. + /// To get the width and height of the encoded mip level, see . + public Task EncodeToRawBytesAsync(Memory2D input, int mipLevel, CancellationToken token = default) { - return Task.Run(() => - { - if (Unsafe.SizeOf() != 4 || Unsafe.SizeOf() != 1) - { - throw new ArgumentException( - "The input pixels should be given in either byte format or a 4-byte rgba wrapper"); - } - if (!inputPixelsRgba.Span.TryGetSpan(out var span)) - { - throw new ArgumentException("Unable to get a Span out of Memory2D. Is the underlying buffer contiguous?"); - } - var bytes = MemoryMarshal.AsBytes(span); - var width = inputPixelsRgba.Width; - var height = inputPixelsRgba.Height; - return EncodeToRawBytesInternal(bytes, width, height, mipLevel, out _, - out _, token); - }, token); + return Task.Run(() => EncodeToRawInternal(input, mipLevel, out _, out _, token), token); } #endregion @@ -302,7 +211,20 @@ public Task EncodeToRawBytesAsync(Memory2D inputPixelsRgba, int mi /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. /// - /// The data to encode represented by a . + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. + /// The stream to write the encoded image to. + public void EncodeToStream(Memory input, int width, int height, PixelFormat format, Stream outputStream) + { + EncodeToStream(ByteToColorMemory(input.Span, width, height, format), outputStream); + } + + /// + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. + /// + /// The input to encode represented by a . /// The stream to write the encoded image to. public void EncodeToStream(Memory2D input, Stream outputStream) { @@ -312,7 +234,20 @@ public void EncodeToStream(Memory2D input, Stream outputStream) /// /// Encodes all mipmap levels into a Ktx file. /// - /// The data to encode represented by a . + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. + /// The Ktx file containing the encoded image. + public KtxFile EncodeToKtx(Memory input, int width, int height, PixelFormat format) + { + return EncodeToKtx(ByteToColorMemory(input.Span, width, height, format)); + } + + /// + /// Encodes all mipmap levels into a Ktx file. + /// + /// The input to encode represented by a . /// The Ktx file containing the encoded image. public KtxFile EncodeToKtx(Memory2D input) { @@ -322,9 +257,22 @@ public KtxFile EncodeToKtx(Memory2D input) /// /// Encodes all mipmap levels into a Dds file. /// - /// The data to encode represented by a . + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. + /// The Dds file containing the encoded image. + public DdsFile EncodeToDds(Memory input, int width, int height, PixelFormat format) + { + return EncodeToDds(ByteToColorMemory(input.Span, width, height, format)); + } + + /// + /// Encodes all mipmap levels into a Dds file. + /// + /// The input to encode represented by a . /// The Dds file containing the encoded image. - public DdsFile EncodeToDds(Memory2D input) + public DdsFile EncodeToDds(Memory2D input) { return EncodeToDdsInternal(input, default); } @@ -332,24 +280,53 @@ public DdsFile EncodeToDds(Memory2D input) /// /// Encodes all mipmap levels into a list of byte buffers. /// - /// The data to encode represented by a . - /// A list of raw encoded mipmap data. + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. + /// A list of raw encoded mipmap input. + public byte[][] EncodeToRawBytes(Memory input, int width, int height, PixelFormat format) + { + return EncodeToRawBytes(ByteToColorMemory(input.Span, width, height, format)); + } + + /// + /// Encodes all mipmap levels into a list of byte buffers. + /// + /// The input to encode represented by a . + /// A list of raw encoded mipmap input. public byte[][] EncodeToRawBytes(Memory2D input) { - return EncodeToRawBytesInternal(input, default); + return EncodeToRawInternal(input, default); + } + + /// + /// Encodes a single mip level of the input image to a byte buffer. + /// + /// The input to encode represented by a . + /// The width of the image. + /// The height of the image. + /// The pixel format the given data is in. + /// The mipmap to encode. + /// The width of the mipmap. + /// The height of the mipmap. + /// The raw encoded input. + public byte[] EncodeToRawBytes(Memory input, int width, int height, PixelFormat format, int mipLevel, out int mipWidth, out int mipHeight) + { + return EncodeToRawInternal(ByteToColorMemory(input.Span, width, height, format), mipLevel, out mipWidth, out mipHeight, default); } /// /// Encodes a single mip level of the input image to a byte buffer. /// - /// The data to encode represented by a . + /// The input to encode represented by a . /// The mipmap to encode. /// The width of the mipmap. /// The height of the mipmap. - /// The raw encoded data. + /// The raw encoded input. public byte[] EncodeToRawBytes(Memory2D input, int mipLevel, out int mipWidth, out int mipHeight) { - return EncodeToRawBytesInternal(input, mipLevel, out mipWidth, out mipHeight, default); + return EncodeToRawInternal(input, mipLevel, out mipWidth, out mipHeight, default); } #endregion @@ -386,11 +363,6 @@ public void CalculateMipMapSize(int imagePixelWidth, int imagePixelHeight, int m #region Private - private void EncodeToStreamInternal(Memory input, int width, int height, Stream outputStream, CancellationToken token) - { - EncodeToStreamInternal(input.AsMemory2D(width, height), outputStream, token); - } - private void EncodeToStreamInternal(Memory2D input, Stream outputStream, CancellationToken token) { switch (OutputOptions.FileFormat) @@ -407,11 +379,6 @@ private void EncodeToStreamInternal(Memory2D input, Stream outputSt } } - private KtxFile EncodeToKtxInternal(Memory input, int width, int height, CancellationToken token) - { - return EncodeToKtxInternal(input.AsMemory2D(width, height), token); - } - private KtxFile EncodeToKtxInternal(Memory2D input, CancellationToken token) { KtxFile output; @@ -498,11 +465,6 @@ private KtxFile EncodeToKtxInternal(Memory2D input, CancellationTok return output; } - private DdsFile EncodeToDdsInternal(Memory input, int width, int height, CancellationToken token) - { - return EncodeToDdsInternal(input.AsMemory2D(width, height), token); - } - private DdsFile EncodeToDdsInternal(Memory2D input, CancellationToken token) { DdsFile output; @@ -595,17 +557,12 @@ private DdsFile EncodeToDdsInternal(Memory2D input, CancellationTok return output; } - private IList EncodeToRawInternal(Memory input, int width, int height, CancellationToken token) - { - return EncodeToRawInternal(input.AsMemory2D(width, height), token); - } - - private IList EncodeToRawInternal(Memory2D input, CancellationToken token) + private byte[][] EncodeToRawInternal(Memory2D input, CancellationToken token) { var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); - var output = new List(numMipMaps); + var output = new byte[numMipMaps][]; IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; @@ -659,17 +616,12 @@ private IList EncodeToRawInternal(Memory2D input, Cancellat context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => x.Width * x.Height)); } - output.Add(encoded); + output[mip] = encoded; } return output; } - private byte[] EncodeToRawInternal(Memory input, int width, int height, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) - { - return EncodeToRawInternal(input.AsMemory2D(width, height), mipLevel, out mipWidth, out mipHeight, token); - } - private byte[] EncodeToRawInternal(Memory2D input, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) { mipLevel = Math.Max(0, mipLevel); @@ -735,15 +687,7 @@ private byte[] EncodeToRawInternal(Memory2D input, int mipLevel, ou return encoded; } - private void EncodeCubeMapToStreamInternal(Memory right, Memory left, Memory top, Memory down, - Memory back, Memory front, int width, int height, Stream outputStream, CancellationToken token) - { - EncodeCubeMapToStreamInternal( - right.AsMemory2D(width, height), left.AsMemory2D(width, height), - top.AsMemory2D(width, height), down.AsMemory2D(width, height), - back.AsMemory2D(width, height), front.AsMemory2D(width, height), - outputStream, token); - } + // TODO: Do we still need cubemap methods? If yes, expose them in both Sync and Async API private void EncodeCubeMapToStreamInternal(Memory2D right, Memory2D left, Memory2D top, Memory2D down, Memory2D back, Memory2D front, Stream outputStream, CancellationToken token) @@ -762,16 +706,6 @@ private void EncodeCubeMapToStreamInternal(Memory2D right, Memory2D } } - private KtxFile EncodeCubeMapToKtxInternal(Memory right, Memory left, Memory top, Memory down, - Memory back, Memory front, int width, int height, Stream outputStream, CancellationToken token) - { - return EncodeCubeMapToKtxInternal( - right.AsMemory2D(width, height), left.AsMemory2D(width, height), - top.AsMemory2D(width, height), down.AsMemory2D(width, height), - back.AsMemory2D(width, height), front.AsMemory2D(width, height), - outputStream, token); - } - private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D left, Memory2D top, Memory2D down, Memory2D back, Memory2D front, CancellationToken token) { @@ -795,7 +729,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D } output = new KtxFile( - KtxHeader.InitializeCompressed(width,height, + KtxHeader.InitializeCompressed(width, height, compressedEncoder.GetInternalFormat(), compressedEncoder.GetBaseInternalFormat())); } @@ -803,7 +737,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D { uncompressedEncoder = GetRawEncoder(OutputOptions.Format); output = new KtxFile( - KtxHeader.InitializeUncompressed(width,height, + KtxHeader.InitializeUncompressed(width, height, uncompressedEncoder.GetGlType(), uncompressedEncoder.GetGlFormat(), uncompressedEncoder.GetGlTypeSize(), @@ -813,7 +747,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D } var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; - var mipLength = MipMapper.CalculateMipChainLength(width,height, numMipMaps); + var mipLength = MipMapper.CalculateMipChainLength(width, height, numMipMaps); for (uint i = 0; i < mipLength; i++) { output.MipMaps.Add(new KtxMipmap(0, 0, 0, (uint)faces.Length)); @@ -832,7 +766,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D { for (var mip = 0; mip < numMipMaps; mip++) { - MipMapper.CalculateMipLevelSize(width,height, mip, out var mipWidth, out var mipHeight); + MipMapper.CalculateMipLevelSize(width, height, mip, out var mipWidth, out var mipHeight); totalBlocks += isCompressedFormat ? ImageToBlocks.CalculateNumOfBlocks(mipWidth, mipHeight) : mipWidth * mipHeight; } } @@ -842,7 +776,7 @@ private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D var processedBlocks = 0; for (var face = 0; face < faces.Length; face++) { - var mipChain = MipMapper.GenerateMipChain(faces[face], width, height, ref numMipMaps); + var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); // Encode all mipmap levels per face for (var mipLevel = 0; mipLevel < numMipMaps; mipLevel++) @@ -888,25 +822,17 @@ private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D return output; } - private DdsFile EncodeCubeMapToDdsInternal(ReadOnlySpan right, ReadOnlySpan left, ReadOnlySpan top, ReadOnlySpan down, - ReadOnlySpan back, ReadOnlySpan front, int width, int height, CancellationToken token) + private DdsFile EncodeCubeMapToDdsInternal(Memory2D right, Memory2D left, Memory2D top, Memory2D down, + Memory2D back, Memory2D front, CancellationToken token) { DdsFile output; IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; - if (right.Length != width * height * 4) - { - throw new ArgumentException("The input pixels must be provided in 4 bytes per pixel rgba format."); - } - - if (right.Length != left.Length || right.Length != top.Length || right.Length != down.Length - || right.Length != back.Length || right.Length != front.Length) - { - throw new ArgumentException("All input images of a cubemap should be the same size."); - } + var faces = new[] { right, left, top, down, back, front }; - var faces = new[] { right.ToArray(), left.ToArray(), top.ToArray(), down.ToArray(), back.ToArray(), front.ToArray() }; + var width = right.Width; + var height = right.Height; // Setup encoder var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); @@ -962,50 +888,42 @@ private DdsFile EncodeCubeMapToDdsInternal(ReadOnlySpan right, ReadOnlySpa var processedBlocks = 0; for (var face = 0; face < faces.Length; face++) { - var mipChain = MipMapper.GenerateMipChain(faces[face], width, height, ref numMipMaps); - try + var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); + + // Encode all mipmap levels per face + for (var mip = 0; mip < numMipMaps; mip++) { - // Encode all mipmap levels per face - for (var mip = 0; mip < numMipMaps; mip++) + byte[] encoded; + if (isCompressedFormat) { - byte[] encoded; - if (isCompressedFormat) - { - var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip].Frames[0], out var blocksWidth, out var blocksHeight); - encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); - processedBlocks += blocks.Length; - context.Progress.SetProcessedBlocks(processedBlocks); - } - else + processedBlocks += blocks.Length; + context.Progress.SetProcessedBlocks(processedBlocks); + } + else + { + if (!mipChain[mip].TryGetMemory(out var mipMemory)) { - if (!mipChain[mip].TryGetSinglePixelSpan(out var mipPixels)) - { - throw new Exception("Cannot get pixel span."); - } - - encoded = uncompressedEncoder.Encode(mipPixels); - - processedBlocks += mipPixels.Length; - context.Progress.SetProcessedBlocks(processedBlocks); + throw new InvalidOperationException("Could not get Memory from Memory2D."); } - if (mip == 0) - { - output.Faces.Add(new DdsFace((uint)mipChain[mip].Width, (uint)mipChain[mip].Height, - (uint)encoded.Length, mipChain.Count)); - } + encoded = uncompressedEncoder.Encode(mipMemory); - output.Faces[face].MipMaps[mip] = new DdsMipMap(encoded, - (uint)mipChain[mip].Width, - (uint)mipChain[mip].Height); + processedBlocks += mipMemory.Length; + context.Progress.SetProcessedBlocks(processedBlocks); } - } - finally - { - // Dispose all mipmap levels, even if operation was cancelled - foreach (var image in mipChain) - image.Dispose(); + + if (mip == 0) + { + output.Faces.Add(new DdsFace((uint)mipChain[mip].Width, (uint)mipChain[mip].Height, + (uint)encoded.Length, mipChain.Length)); + } + + output.Faces[face].MipMaps[mip] = new DdsMipMap(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); } } @@ -1094,6 +1012,36 @@ private IRawEncoder GetRawEncoder(CompressionFormat format) } } + private Memory2D ByteToColorMemory(Span span, int width, int height, PixelFormat format) + { + var pixels = new ColorRgba32[width * height]; + + switch (format) + { + case PixelFormat.Rgba32: + for (var i = 0; i < width * height * 4; i += 4) + pixels[i / 4] = new ColorRgba32(span[i], span[i + 1], span[i + 2], span[i + 3]); + break; + + case PixelFormat.Rgb24: + for (var i = 0; i < width * height * 3; i += 3) + pixels[i / 3] = new ColorRgba32(span[i], span[i + 1], span[i + 2], 255); + break; + + case PixelFormat.Bgra32: + for (var i = 0; i < width * height * 4; i += 4) + pixels[i / 4] = new ColorRgba32(span[i + 2], span[i + 1], span[i], span[i + 3]); + break; + + case PixelFormat.Bgr24: + for (var i = 0; i < width * height * 3; i += 3) + pixels[i / 3] = new ColorRgba32(span[i + 2], span[i + 1], span[i], 255); + break; + } + + return new Memory2D(pixels, width, height); + } + #endregion } } diff --git a/BCnEnc.Net/Encoder/RawEncoders.cs b/BCnEnc.Net/Encoder/RawEncoders.cs index 0c9c4fc..ddab7f9 100644 --- a/BCnEnc.Net/Encoder/RawEncoders.cs +++ b/BCnEnc.Net/Encoder/RawEncoders.cs @@ -1,13 +1,12 @@ using System; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; -using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Encoder { internal interface IRawEncoder { - byte[] Encode(ReadOnlySpan pixels); + byte[] Encode(Memory pixels); GlInternalFormat GetInternalFormat(); GlFormat GetBaseInternalFormat(); GlFormat GetGlFormat(); @@ -25,18 +24,20 @@ public RawLuminanceEncoder(bool useLuminance) this.useLuminance = useLuminance; } - public byte[] Encode(ReadOnlySpan pixels) + public byte[] Encode(Memory pixels) { + var span = pixels.Span; + var output = new byte[pixels.Length]; for (var i = 0; i < pixels.Length; i++) { if (useLuminance) { - output[i] = (byte)(new ColorYCbCr(pixels[i]).y * 255); + output[i] = (byte)(new ColorYCbCr(span[i]).y * 255); } else { - output[i] = pixels[i].R; + output[i] = span[i].R; } } @@ -76,13 +77,15 @@ public DxgiFormat GetDxgiFormat() internal class RawRgEncoder : IRawEncoder { - public byte[] Encode(ReadOnlySpan pixels) + public byte[] Encode(Memory pixels) { + var span = pixels.Span; + var output = new byte[pixels.Length * 2]; for (var i = 0; i < pixels.Length; i++) { - output[i * 2] = pixels[i].R; - output[i * 2 + 1] = pixels[i].G; + output[i * 2] = span[i].R; + output[i * 2 + 1] = span[i].G; } return output; } @@ -120,14 +123,16 @@ public DxgiFormat GetDxgiFormat() internal class RawRgbEncoder : IRawEncoder { - public byte[] Encode(ReadOnlySpan pixels) + public byte[] Encode(Memory pixels) { + var span = pixels.Span; + var output = new byte[pixels.Length * 3]; for (var i = 0; i < pixels.Length; i++) { - output[i * 3] = pixels[i].R; - output[i * 3 + 1] = pixels[i].G; - output[i * 3 + 2] = pixels[i].B; + output[i * 3] = span[i].R; + output[i * 3 + 1] = span[i].G; + output[i * 3 + 2] = span[i].B; } return output; } @@ -165,15 +170,17 @@ public DxgiFormat GetDxgiFormat() internal class RawRgbaEncoder : IRawEncoder { - public byte[] Encode(ReadOnlySpan pixels) + public byte[] Encode(Memory pixels) { + var span = pixels.Span; + var output = new byte[pixels.Length * 4]; for (var i = 0; i < pixels.Length; i++) { - output[i * 4] = pixels[i].R; - output[i * 4 + 1] = pixels[i].G; - output[i * 4 + 2] = pixels[i].B; - output[i * 4 + 3] = pixels[i].A; + output[i * 4] = span[i].R; + output[i * 4 + 1] = span[i].G; + output[i * 4 + 2] = span[i].B; + output[i * 4 + 3] = span[i].A; } return output; } @@ -211,15 +218,17 @@ public DxgiFormat GetDxgiFormat() internal class RawBgraEncoder : IRawEncoder { - public byte[] Encode(ReadOnlySpan pixels) + public byte[] Encode(Memory pixels) { + var span = pixels.Span; + var output = new byte[pixels.Length * 4]; for (var i = 0; i < pixels.Length; i++) { - output[i * 4] = pixels[i].B; - output[i * 4 + 1] = pixels[i].G; - output[i * 4 + 2] = pixels[i].R; - output[i * 4 + 3] = pixels[i].A; + output[i * 4] = span[i].B; + output[i * 4 + 1] = span[i].G; + output[i * 4 + 2] = span[i].R; + output[i * 4 + 3] = span[i].A; } return output; } diff --git a/BCnEnc.Net/Shared/Colors.cs b/BCnEnc.Net/Shared/Colors.cs index c105df4..84c25a2 100644 --- a/BCnEnc.Net/Shared/Colors.cs +++ b/BCnEnc.Net/Shared/Colors.cs @@ -1,12 +1,12 @@ using System; using System.Numerics; -using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared { public struct ColorRgba32 : IEquatable { public byte r, g, b, a; + public ColorRgba32(byte r, byte g, byte b, byte a) { this.r = r; @@ -15,14 +15,6 @@ public ColorRgba32(byte r, byte g, byte b, byte a) this.a = a; } - public ColorRgba32(Rgba32 color) - { - this.r = color.R; - this.g = color.G; - this.b = color.B; - this.a = color.A; - } - public bool Equals(ColorRgba32 other) { return r == other.r && g == other.g && b == other.b && a == other.a; @@ -171,15 +163,12 @@ public override int GetHashCode() ); } + public static implicit operator ColorRgba32(ColorRgb24 d) => new ColorRgba32(d.r, d.g, d.b, 255); + public override string ToString() { return $"r : {r} g : {g} b : {b} a : {a}"; } - - public Rgba32 ToRgba32() - { - return new Rgba32(r, g, b, a); - } } public struct ColorYCbCr @@ -228,17 +217,6 @@ public ColorYCbCr(ColorRgba32 rgba) cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } - public ColorYCbCr(Rgba32 rgb) - { - var fr = (float)rgb.R / 255; - var fg = (float)rgb.G / 255; - var fb = (float)rgb.B / 255; - - y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; - cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; - cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; - } - public ColorYCbCr(Vector3 vec) { var fr = (float)vec.X; @@ -292,15 +270,6 @@ public float CalcDistWeighted(ColorYCbCr other, float yWeight = 4) left.cb / right, left.cr / right); } - - public Rgba32 ToRgba32() - { - var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); - - return new Rgba32((byte)(r * 255), (byte)(g * 255), (byte)(b * 255), 255); - } } internal struct ColorRgb555 : IEquatable @@ -476,7 +445,7 @@ public ColorRgba32 ToColorRgba32() } } - internal struct ColorRgb565 : IEquatable + public struct ColorRgb565 : IEquatable { public bool Equals(ColorRgb565 other) { @@ -511,45 +480,56 @@ public override int GetHashCode() public ushort data; - public byte R { - readonly get { + public byte R + { + readonly get + { var r5 = (data & RedMask) >> RedShift; return (byte)((r5 << 3) | (r5 >> 2)); } - set { + set + { var r5 = value >> 3; data = (ushort)(data & ~RedMask); data = (ushort)(data | (r5 << RedShift)); } } - public byte G { - readonly get { + public byte G + { + readonly get + { var g6 = (data & GreenMask) >> GreenShift; return (byte)((g6 << 2) | (g6 >> 4)); } - set { + set + { var g6 = value >> 2; data = (ushort)(data & ~GreenMask); data = (ushort)(data | (g6 << GreenShift)); } } - public byte B { - readonly get { + public byte B + { + readonly get + { var b5 = data & BlueMask; return (byte)((b5 << 3) | (b5 >> 2)); } - set { + set + { var b5 = value >> 3; data = (ushort)(data & ~BlueMask); data = (ushort)(data | b5); } } - public int RawR { + public int RawR + { readonly get { return (data & RedMask) >> RedShift; } - set { + set + { if (value > 31) value = 31; if (value < 0) value = 0; data = (ushort)(data & ~RedMask); @@ -557,9 +537,11 @@ public int RawR { } } - public int RawG { + public int RawG + { readonly get { return (data & GreenMask) >> GreenShift; } - set { + set + { if (value > 63) value = 63; if (value < 0) value = 0; data = (ushort)(data & ~GreenMask); @@ -567,9 +549,11 @@ public int RawG { } } - public int RawB { + public int RawB + { readonly get { return data & BlueMask; } - set { + set + { if (value > 31) value = 31; if (value < 0) value = 0; data = (ushort)(data & ~BlueMask); @@ -585,14 +569,16 @@ public ColorRgb565(byte r, byte g, byte b) B = b; } - public ColorRgb565(Vector3 colorVector) { + public ColorRgb565(Vector3 colorVector) + { data = 0; R = ByteHelper.ClampToByte(colorVector.X * 255); G = ByteHelper.ClampToByte(colorVector.Y * 255); B = ByteHelper.ClampToByte(colorVector.Z * 255); } - public ColorRgb565(ColorRgb24 color) { + public ColorRgb565(ColorRgb24 color) + { data = 0; R = color.r; G = color.g; @@ -604,18 +590,21 @@ public readonly ColorRgb24 ToColorRgb24() return new ColorRgb24(R, G, B); } - public override string ToString() { + public override string ToString() + { return $"r : {R} g : {G} b : {B}"; } - public ColorRgba32 ToColorRgba32() { + public ColorRgba32 ToColorRgba32() + { return new ColorRgba32(R, G, B, 255); } } - internal struct ColorRgb24 : IEquatable + public struct ColorRgb24 : IEquatable { public byte r, g, b; + public ColorRgb24(byte r, byte g, byte b) { this.r = r; @@ -623,24 +612,20 @@ public ColorRgb24(byte r, byte g, byte b) this.b = b; } - public ColorRgb24(ColorRgb565 color) { + public ColorRgb24(ColorRgb565 color) + { this.r = color.R; this.g = color.G; this.b = color.B; } - public ColorRgb24(ColorRgba32 color) { + public ColorRgb24(ColorRgba32 color) + { this.r = color.r; this.g = color.g; this.b = color.b; } - public ColorRgb24(Rgba32 color) { - this.r = color.R; - this.g = color.G; - this.b = color.B; - } - public bool Equals(ColorRgb24 other) { return r == other.r && g == other.g && b == other.b; @@ -706,7 +691,8 @@ public override int GetHashCode() ); } - public override string ToString() { + public override string ToString() + { return $"r : {r} g : {g} b : {b}"; } } @@ -762,20 +748,9 @@ public ColorYCbCrAlpha(ColorRgba32 rgba) alpha = rgba.a / 255f; } - public ColorYCbCrAlpha(Rgba32 rgb) - { - var fr = (float)rgb.R / 255; - var fg = (float)rgb.G / 255; - var fb = (float)rgb.B / 255; - - y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; - cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; - cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; - alpha = rgb.A / 255f; - } - - public ColorRgb565 ToColorRgb565() { + public ColorRgb565 ToColorRgb565() + { var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); @@ -783,7 +758,8 @@ public ColorRgb565 ToColorRgb565() { return new ColorRgb565((byte)(r * 255), (byte)(g * 255), (byte)(b * 255)); } - public override string ToString() { + public override string ToString() + { var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); @@ -791,7 +767,8 @@ public override string ToString() { return $"r : {r * 255} g : {g * 255} b : {b * 255}"; } - public float CalcDistWeighted(ColorYCbCrAlpha other, float yWeight = 4, float aWeight = 1) { + public float CalcDistWeighted(ColorYCbCrAlpha other, float yWeight = 4, float aWeight = 1) + { var dy = (y - other.y) * (y - other.y) * yWeight; var dcb = (cb - other.cb) * (cb - other.cb); var dcr = (cr - other.cr) * (cr - other.cr); @@ -800,7 +777,7 @@ public float CalcDistWeighted(ColorYCbCrAlpha other, float yWeight = 4, float aW return MathF.Sqrt(dy + dcb + dcr + da); } - public static ColorYCbCrAlpha operator+(ColorYCbCrAlpha left, ColorYCbCrAlpha right) + public static ColorYCbCrAlpha operator +(ColorYCbCrAlpha left, ColorYCbCrAlpha right) { return new ColorYCbCrAlpha( left.y + right.y, @@ -809,7 +786,7 @@ public float CalcDistWeighted(ColorYCbCrAlpha other, float yWeight = 4, float aW left.alpha + right.alpha); } - public static ColorYCbCrAlpha operator/(ColorYCbCrAlpha left, float right) + public static ColorYCbCrAlpha operator /(ColorYCbCrAlpha left, float right) { return new ColorYCbCrAlpha( left.y / right, @@ -817,32 +794,28 @@ public float CalcDistWeighted(ColorYCbCrAlpha other, float yWeight = 4, float aW left.cr / right, left.alpha / right); } - - public Rgba32 ToRgba32() { - var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); - var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); - var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); - - return new Rgba32((byte)(r * 255), (byte)(g * 255), (byte)(b * 255), (byte)(alpha * 255)); - } } - internal struct ColorXyz { + internal struct ColorXyz + { public float x; public float y; public float z; - public ColorXyz(float x, float y, float z) { + public ColorXyz(float x, float y, float z) + { this.x = x; this.y = y; this.z = z; } - public ColorXyz(ColorRgb24 color) { + public ColorXyz(ColorRgb24 color) + { this = ColorToXyz(color); } - public static ColorXyz ColorToXyz(ColorRgb24 color) { + public static ColorXyz ColorToXyz(ColorRgb24 color) + { var r = PivotRgb(color.r / 255.0f); var g = PivotRgb(color.g / 255.0f); var b = PivotRgb(color.b / 255.0f); @@ -851,41 +824,44 @@ public static ColorXyz ColorToXyz(ColorRgb24 color) { return new ColorXyz(r * 0.4124f + g * 0.3576f + b * 0.1805f, r * 0.2126f + g * 0.7152f + b * 0.0722f, r * 0.0193f + g * 0.1192f + b * 0.9505f); } - private static float PivotRgb(float n) { + private static float PivotRgb(float n) + { return (n > 0.04045f ? MathF.Pow((n + 0.055f) / 1.055f, 2.4f) : n / 12.92f) * 100; } } - internal struct ColorLab { + internal struct ColorLab + { public float l; public float a; public float b; - public ColorLab(float l, float a, float b) { + public ColorLab(float l, float a, float b) + { this.l = l; this.a = a; this.b = b; } - public ColorLab(ColorRgb24 color) { + public ColorLab(ColorRgb24 color) + { this = ColorToLab(color); } - public ColorLab(ColorRgba32 color) { + public ColorLab(ColorRgba32 color) + { this = ColorToLab(new ColorRgb24(color.r, color.g, color.b)); } - public ColorLab(Rgba32 color) { - this = ColorToLab(new ColorRgb24(color.R, color.G, color.B)); - } - - public static ColorLab ColorToLab(ColorRgb24 color) { + public static ColorLab ColorToLab(ColorRgb24 color) + { var xyz = new ColorXyz(color); return XyzToLab(xyz); } - public static ColorLab XyzToLab(ColorXyz xyz) { + public static ColorLab XyzToLab(ColorXyz xyz) + { var refX = 95.047f; // Observer= 2°, Illuminant= D65 var refY = 100.000f; var refZ = 108.883f; @@ -897,7 +873,8 @@ public static ColorLab XyzToLab(ColorXyz xyz) { return new ColorLab(116 * y - 16, 500 * (x - y), 200 * (y - z)); } - private static float PivotXyz(float n) { + private static float PivotXyz(float n) + { var i = MathF.Cbrt(n); return n > 0.008856f ? i : 7.787f * n + 16 / 116f; } diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index 22d39e2..f27146d 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -1,6 +1,5 @@ using System; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared { @@ -53,11 +52,11 @@ stackalloc ColorRgb24[] { var color = colors[colorIndex]; if (useAlpha && colorIndex == 3) { - pixels[i] = new Rgba32(0, 0, 0, 0); + pixels[i] = new ColorRgba32(0, 0, 0, 0); } else { - pixels[i] = new Rgba32(color.r, color.g, color.b, 255); + pixels[i] = new ColorRgba32(color.r, color.g, color.b, 255); } } return output; @@ -107,7 +106,7 @@ public readonly RawBlock4X4Rgba32 Decode() var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); var color = colors[colorIndex]; - pixels[i] = new Rgba32(color.r, color.g, color.b, GetAlpha(i)); + pixels[i] = new ColorRgba32(color.r, color.g, color.b, GetAlpha(i)); } return output; } @@ -170,7 +169,7 @@ public readonly RawBlock4X4Rgba32 Decode() var colorIndex = (int)((colorIndices >> (i * 2)) & 0b11); var color = colors[colorIndex]; - pixels[i] = new Rgba32(color.r, color.g, color.b, alphas[i]); + pixels[i] = new ColorRgba32(color.r, color.g, color.b, alphas[i]); } return output; } @@ -209,7 +208,7 @@ public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) for (var i = 0; i < pixels.Length; i++) { var index = GetComponentIndex(i); - pixels[i] = new Rgba32(reds[index], reds[index], reds[index], 255); + pixels[i] = new ColorRgba32(reds[index], reds[index], reds[index], 255); } } else @@ -217,7 +216,7 @@ public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) for (var i = 0; i < pixels.Length; i++) { var index = GetComponentIndex(i); - pixels[i] = new Rgba32(reds[index], 0, 0, 255); + pixels[i] = new ColorRgba32(reds[index], 0, 0, 255); } } @@ -273,7 +272,7 @@ public readonly RawBlock4X4Rgba32 Decode() for (var i = 0; i < pixels.Length; i++) { - pixels[i] = new Rgba32(reds[i], greens[i], 0, 255); + pixels[i] = new ColorRgba32(reds[i], greens[i], 0, 255); } return output; @@ -319,7 +318,7 @@ public readonly RawBlock4X4Rgba32 Decode() var color = this.color0.Mode == 0 ? color0.InterpolateThird(color1, colorIndex) : colors[colorIndex]; - pixels[i] = new Rgba32(color.r, color.g, color.b, 255); + pixels[i] = new ColorRgba32(color.r, color.g, color.b, 255); } return output; } @@ -439,7 +438,7 @@ public readonly RawBlock4X4Rgba32 Decode() for (var i = 0; i < pixels.Length; i++) { - pixels[i].A = alphas.GetAlpha(i); + pixels[i].a = alphas.GetAlpha(i); } return output; } @@ -460,7 +459,7 @@ public readonly RawBlock4X4Rgba32 Decode() for (var i = 0; i < pixels.Length; i++) { - pixels[i].A = componentValues[i]; + pixels[i].a = componentValues[i]; } return output; } diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 3b23918..730faf0 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -1,6 +1,4 @@ -using System; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; +using Microsoft.Toolkit.HighPerformance.Memory; namespace BCnEncoder.Shared { @@ -52,22 +50,22 @@ internal static ColorRgba32[] ColorsFromRawBlocks(RawBlock4X4Rgba32[] blocks, in #endregion - internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int blocksWidth, out int blocksHeight) + #region Image to blocks + + internal static RawBlock4X4Rgba32[] ImageTo4X4(Memory2D image, out int blocksWidth, out int blocksHeight) { blocksWidth = ((image.Width + 3) & ~3) >> 2; blocksHeight = ((image.Height + 3) & ~3) >> 2; var output = new RawBlock4X4Rgba32[blocksWidth * blocksHeight]; - if (!image.TryGetSinglePixelSpan(out var pixels)) - { - throw new Exception("Cannot get pixel span."); - } + var span = image.Span; for (var y = 0; y < image.Height; y++) { for (var x = 0; x < image.Width; x++) { - var color = pixels[x + y * image.Width]; + var color = span[x, y]; + var blockIndexX = x >> 2; var blockIndexY = y >> 2; var blockInternalIndexX = x & 3; @@ -77,7 +75,7 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int } } - //Fill in block y with edge color + // Fill in block y with edge color if ((image.Height & 3) != 0) { var yPaddingStart = image.Height & 3; @@ -95,7 +93,7 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int } } - //Fill in block x with edge color + // Fill in block x with edge color if ((image.Width & 3) != 0) { var xPaddingStart = image.Width & 3; @@ -116,10 +114,13 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ImageFrame image, out int return output; } + #endregion + public static int CalculateNumOfBlocks(int pixelWidth, int pixelHeight) { var blocksWidth = ((pixelWidth + 3) & ~3) >> 2; var blocksHeight = ((pixelHeight + 3) & ~3) >> 2; + return blocksWidth * blocksHeight; } } From 5a910fb6f597e5ceddbb65b88c78ae971fde7d6e Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 28 Jan 2021 10:33:21 +0100 Subject: [PATCH 058/116] Finish removing of ImageSharp.Rgba32; --- BCnEnc.Net/BCnEncoder.csproj | 1 - BCnEnc.Net/Encoder/AtcBlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/Bc2BlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 8 +- BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs | 2 - BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs | 17 ++- BCnEnc.Net/Encoder/ColorChooser.cs | 107 +++++++++---------- BCnEnc.Net/Encoder/RawEncoders.cs | 28 ++--- BCnEnc.Net/Shared/Bc7Block.cs | 4 +- BCnEnc.Net/Shared/Colors.cs | 12 +-- BCnEnc.Net/Shared/ImageQuality.cs | 11 +- BCnEnc.Net/Shared/LinearClustering.cs | 9 +- BCnEnc.Net/Shared/PcaVectors.cs | 33 +++--- BCnEnc.Net/Shared/RawBlocks.cs | 1 - BCnEnc.Net/Shared/RgbBoundingBox.cs | 55 +++++----- 15 files changed, 141 insertions(+), 151 deletions(-) diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index 33a224a..21d9038 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -45,7 +45,6 @@ Supported formats are: - diff --git a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs index d3c4e17..6e70dc7 100644 --- a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs @@ -69,7 +69,7 @@ public override AtcExplicitAlphaBlock EncodeBlock(RawBlock4X4Rgba32 block, Compr var bc2AlphaBlock = new Bc2AlphaBlock(); for (var i = 0; i < 16; i++) { - bc2AlphaBlock.SetAlpha(i, block[i].A); + bc2AlphaBlock.SetAlpha(i, block[i].a); } return new AtcExplicitAlphaBlock diff --git a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs index 71abc22..c2ca29e 100644 --- a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs @@ -62,7 +62,7 @@ private static Bc2Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0 for (var i = 0; i < 16; i++) { var color = pixels[i]; - output.SetAlpha(i, color.A); + output.SetAlpha(i, color.a); output[i] = ColorChooser.ChooseClosestColor4(colors, color, rWeight, gWeight, bWeight, out var e); error += e; } diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index e62f3fa..5de48a6 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -69,19 +69,19 @@ public Bc4ComponentBlock EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality switch (component) { case Bc4Component.R: - colors[i] = pixels[i].R; + colors[i] = pixels[i].r; break; case Bc4Component.G: - colors[i] = pixels[i].G; + colors[i] = pixels[i].g; break; case Bc4Component.B: - colors[i] = pixels[i].B; + colors[i] = pixels[i].b; break; case Bc4Component.A: - colors[i] = pixels[i].A; + colors[i] = pixels[i].a; break; case Bc4Component.Luminance: diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs index 5d3e8c7..7621f2f 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Threading.Tasks; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs b/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs index 0187ed7..0ff3e02 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs +++ b/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Linq; using System.Runtime.InteropServices; using BCnEncoder.Shared; -using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Encoder.Bc7 { @@ -636,7 +635,7 @@ public static void GetInitialUnscaledEndpointsForSubset(RawBlock4X4Rgba32 block, } } - Span subsetColors = stackalloc Rgba32[count]; + Span subsetColors = stackalloc ColorRgba32[count]; var next = 0; for (var i = 0; i < 16; i++) { @@ -827,7 +826,7 @@ private static float TrySubsetEndpoints(Bc7BlockType type, RawBlock4X4Rgba32 raw var pixelColor = new ColorYCbCr(pixels[i]); FindClosestColorIndex(pixelColor, colors, out var ce); - FindClosestAlphaIndex(pixels[i].A, alphas, out var ae); + FindClosestAlphaIndex(pixels[i].a, alphas, out var ae); error += ce + ae; } @@ -931,10 +930,10 @@ public static void FillAlphaColorIndices(Bc7BlockType type, RawBlock4X4Rgba32 ra { var pixelColor = new ColorYCbCr(pixels[i]); - var index = FindClosestColorIndex(pixelColor, colors, out var e); + var index = FindClosestColorIndex(pixelColor, colors, out _); colorIndicesToFill[i] = (byte)index; - index = FindClosestAlphaIndex(pixels[i].A, alphas, out var _); + index = FindClosestAlphaIndex(pixels[i].a, alphas, out _); alphaIndicesToFill[i] = (byte)index; } } @@ -1101,13 +1100,13 @@ public static RawBlock4X4Rgba32 RotateBlockColors(RawBlock4X4Rgba32 block, int r switch (rotation) { case 1: - output[i] = new Rgba32(c.A, c.G, c.B, c.R); + output[i] = new ColorRgba32(c.a, c.g, c.b, c.r); break; case 2: - output[i] = new Rgba32(c.R, c.A, c.B, c.G); + output[i] = new ColorRgba32(c.r, c.a, c.b, c.g); break; case 3: - output[i] = new Rgba32(c.R, c.G, c.A, c.B); + output[i] = new ColorRgba32(c.r, c.g, c.a, c.b); break; } } diff --git a/BCnEnc.Net/Encoder/ColorChooser.cs b/BCnEnc.Net/Encoder/ColorChooser.cs index 505cee0..0fbf6ef 100644 --- a/BCnEnc.Net/Encoder/ColorChooser.cs +++ b/BCnEnc.Net/Encoder/ColorChooser.cs @@ -1,27 +1,26 @@ -using System; +using System; using BCnEncoder.Shared; -using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Encoder { internal static class ColorChooser { - public static int ChooseClosestColor4(ReadOnlySpan colors, Rgba32 color, float rWeight, float gWeight, float bWeight, out float error) + public static int ChooseClosestColor4(ReadOnlySpan colors, ColorRgba32 color, float rWeight, float gWeight, float bWeight, out float error) { ReadOnlySpan d = stackalloc float[4] { - MathF.Abs(colors[0].r - color.R) * rWeight - + MathF.Abs(colors[0].g - color.G) * gWeight - + MathF.Abs(colors[0].b - color.B) * bWeight, - MathF.Abs(colors[1].r - color.R) * rWeight - + MathF.Abs(colors[1].g - color.G) * gWeight - + MathF.Abs(colors[1].b - color.B) * bWeight, - MathF.Abs(colors[2].r - color.R) * rWeight - + MathF.Abs(colors[2].g - color.G) * gWeight - + MathF.Abs(colors[2].b - color.B) * bWeight, - MathF.Abs(colors[3].r - color.R) * rWeight - + MathF.Abs(colors[3].g - color.G) * gWeight - + MathF.Abs(colors[3].b - color.B) * bWeight, + MathF.Abs(colors[0].r - color.r) * rWeight + + MathF.Abs(colors[0].g - color.g) * gWeight + + MathF.Abs(colors[0].b - color.b) * bWeight, + MathF.Abs(colors[1].r - color.r) * rWeight + + MathF.Abs(colors[1].g - color.g) * gWeight + + MathF.Abs(colors[1].b - color.b) * bWeight, + MathF.Abs(colors[2].r - color.r) * rWeight + + MathF.Abs(colors[2].g - color.g) * gWeight + + MathF.Abs(colors[2].b - color.b) * bWeight, + MathF.Abs(colors[3].r - color.r) * rWeight + + MathF.Abs(colors[3].g - color.g) * gWeight + + MathF.Abs(colors[3].b - color.b) * bWeight, }; var b0 = d[0] > d[3] ? 1 : 0; @@ -40,30 +39,30 @@ public static int ChooseClosestColor4(ReadOnlySpan colors, Rgba32 co } - public static int ChooseClosestColor4AlphaCutoff(ReadOnlySpan colors, Rgba32 color, float rWeight, float gWeight, float bWeight, int alphaCutoff, bool hasAlpha, out float error) + public static int ChooseClosestColor4AlphaCutoff(ReadOnlySpan colors, ColorRgba32 color, float rWeight, float gWeight, float bWeight, int alphaCutoff, bool hasAlpha, out float error) { - if (hasAlpha && color.A < alphaCutoff) + if (hasAlpha && color.a < alphaCutoff) { error = 0; return 3; } ReadOnlySpan d = stackalloc float[4] { - MathF.Abs(colors[0].r - color.R) * rWeight - + MathF.Abs(colors[0].g - color.G) * gWeight - + MathF.Abs(colors[0].b - color.B) * bWeight, - MathF.Abs(colors[1].r - color.R) * rWeight - + MathF.Abs(colors[1].g - color.G) * gWeight - + MathF.Abs(colors[1].b - color.B) * bWeight, - MathF.Abs(colors[2].r - color.R) * rWeight - + MathF.Abs(colors[2].g - color.G) * gWeight - + MathF.Abs(colors[2].b - color.B) * bWeight, + MathF.Abs(colors[0].r - color.r) * rWeight + + MathF.Abs(colors[0].g - color.g) * gWeight + + MathF.Abs(colors[0].b - color.b) * bWeight, + MathF.Abs(colors[1].r - color.r) * rWeight + + MathF.Abs(colors[1].g - color.g) * gWeight + + MathF.Abs(colors[1].b - color.b) * bWeight, + MathF.Abs(colors[2].r - color.r) * rWeight + + MathF.Abs(colors[2].g - color.g) * gWeight + + MathF.Abs(colors[2].b - color.b) * bWeight, hasAlpha ? 999 : - MathF.Abs(colors[3].r - color.R) * rWeight - + MathF.Abs(colors[3].g - color.G) * gWeight - + MathF.Abs(colors[3].b - color.B) * bWeight, + MathF.Abs(colors[3].r - color.r) * rWeight + + MathF.Abs(colors[3].g - color.g) * gWeight + + MathF.Abs(colors[3].b - color.b) * bWeight, }; var b0 = d[0] > d[2] ? 1 : 0; @@ -80,20 +79,20 @@ public static int ChooseClosestColor4AlphaCutoff(ReadOnlySpan colors return idx; } - public static int ChooseClosestColor(Span colors, Rgba32 color) + public static int ChooseClosestColor(Span colors, ColorRgba32 color) { var closest = 0; var closestError = - Math.Abs(colors[0].r - color.R) - + Math.Abs(colors[0].g - color.G) - + Math.Abs(colors[0].b - color.B); + Math.Abs(colors[0].r - color.r) + + Math.Abs(colors[0].g - color.g) + + Math.Abs(colors[0].b - color.b); for (var i = 1; i < colors.Length; i++) { var error = - Math.Abs(colors[i].r - color.R) - + Math.Abs(colors[i].g - color.G) - + Math.Abs(colors[i].b - color.B); + Math.Abs(colors[i].r - color.r) + + Math.Abs(colors[i].g - color.g) + + Math.Abs(colors[i].b - color.b); if (error < closestError) { closest = i; @@ -103,22 +102,22 @@ public static int ChooseClosestColor(Span colors, Rgba32 color) return closest; } - public static int ChooseClosestColor(Span colors, Rgba32 color) + public static int ChooseClosestColor(Span colors, ColorRgba32 color) { var closest = 0; var closestError = - Math.Abs(colors[0].r - color.R) - + Math.Abs(colors[0].g - color.G) - + Math.Abs(colors[0].b - color.B) - + Math.Abs(colors[0].a - color.A); + Math.Abs(colors[0].r - color.r) + + Math.Abs(colors[0].g - color.g) + + Math.Abs(colors[0].b - color.b) + + Math.Abs(colors[0].a - color.a); for (var i = 1; i < colors.Length; i++) { var error = - Math.Abs(colors[i].r - color.R) - + Math.Abs(colors[i].g - color.G) - + Math.Abs(colors[i].b - color.B) - + Math.Abs(colors[i].a - color.A); + Math.Abs(colors[i].r - color.r) + + Math.Abs(colors[i].g - color.g) + + Math.Abs(colors[i].b - color.b) + + Math.Abs(colors[i].a - color.a); if (error < closestError) { closest = i; @@ -128,26 +127,26 @@ public static int ChooseClosestColor(Span colors, Rgba32 color) return closest; } - public static int ChooseClosestColorAlphaCutOff(Span colors, Rgba32 color, byte alphaCutOff = 255 / 2) + public static int ChooseClosestColorAlphaCutOff(Span colors, ColorRgba32 color, byte alphaCutOff = 255 / 2) { - if (color.A <= alphaCutOff) + if (color.a <= alphaCutOff) { return 3; } var closest = 0; var closestError = - Math.Abs(colors[0].r - color.R) - + Math.Abs(colors[0].g - color.G) - + Math.Abs(colors[0].b - color.B); + Math.Abs(colors[0].r - color.r) + + Math.Abs(colors[0].g - color.g) + + Math.Abs(colors[0].b - color.b); for (var i = 1; i < colors.Length; i++) { if (i == 3) continue; // Skip transparent var error = - Math.Abs(colors[i].r - color.R) - + Math.Abs(colors[i].g - color.G) - + Math.Abs(colors[i].b - color.B); + Math.Abs(colors[i].r - color.r) + + Math.Abs(colors[i].g - color.g) + + Math.Abs(colors[i].b - color.b); if (error < closestError) { closest = i; @@ -182,7 +181,7 @@ public static int ChooseClosestColor(Span colors, ColorYCbCr color, return closest; } - public static int ChooseClosestColor(Span colors, Rgba32 color, float luminanceMultiplier = 4) + public static int ChooseClosestColor(Span colors, ColorRgba32 color, float luminanceMultiplier = 4) => ChooseClosestColor(colors, new ColorYCbCr(color), luminanceMultiplier); } } diff --git a/BCnEnc.Net/Encoder/RawEncoders.cs b/BCnEnc.Net/Encoder/RawEncoders.cs index ddab7f9..aa73c65 100644 --- a/BCnEnc.Net/Encoder/RawEncoders.cs +++ b/BCnEnc.Net/Encoder/RawEncoders.cs @@ -37,7 +37,7 @@ public byte[] Encode(Memory pixels) } else { - output[i] = span[i].R; + output[i] = span[i].r; } } @@ -84,8 +84,8 @@ public byte[] Encode(Memory pixels) var output = new byte[pixels.Length * 2]; for (var i = 0; i < pixels.Length; i++) { - output[i * 2] = span[i].R; - output[i * 2 + 1] = span[i].G; + output[i * 2] = span[i].r; + output[i * 2 + 1] = span[i].g; } return output; } @@ -130,9 +130,9 @@ public byte[] Encode(Memory pixels) var output = new byte[pixels.Length * 3]; for (var i = 0; i < pixels.Length; i++) { - output[i * 3] = span[i].R; - output[i * 3 + 1] = span[i].G; - output[i * 3 + 2] = span[i].B; + output[i * 3] = span[i].r; + output[i * 3 + 1] = span[i].g; + output[i * 3 + 2] = span[i].b; } return output; } @@ -177,10 +177,10 @@ public byte[] Encode(Memory pixels) var output = new byte[pixels.Length * 4]; for (var i = 0; i < pixels.Length; i++) { - output[i * 4] = span[i].R; - output[i * 4 + 1] = span[i].G; - output[i * 4 + 2] = span[i].B; - output[i * 4 + 3] = span[i].A; + output[i * 4] = span[i].r; + output[i * 4 + 1] = span[i].g; + output[i * 4 + 2] = span[i].b; + output[i * 4 + 3] = span[i].a; } return output; } @@ -225,10 +225,10 @@ public byte[] Encode(Memory pixels) var output = new byte[pixels.Length * 4]; for (var i = 0; i < pixels.Length; i++) { - output[i * 4] = span[i].B; - output[i * 4 + 1] = span[i].G; - output[i * 4 + 2] = span[i].R; - output[i * 4 + 3] = span[i].A; + output[i * 4] = span[i].b; + output[i * 4 + 1] = span[i].g; + output[i * 4 + 2] = span[i].r; + output[i * 4 + 3] = span[i].a; } return output; } diff --git a/BCnEnc.Net/Shared/Bc7Block.cs b/BCnEnc.Net/Shared/Bc7Block.cs index 9539177..0d2e7ba 100644 --- a/BCnEnc.Net/Shared/Bc7Block.cs +++ b/BCnEnc.Net/Shared/Bc7Block.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.Linq; @@ -826,7 +826,7 @@ public RawBlock4X4Rgba32 Decode() outputColor = SwapChannels(outputColor, rotation); } - pixels[i] = outputColor.ToRgba32(); + pixels[i] = outputColor; } return output; diff --git a/BCnEnc.Net/Shared/Colors.cs b/BCnEnc.Net/Shared/Colors.cs index 84c25a2..e6a11e7 100644 --- a/BCnEnc.Net/Shared/Colors.cs +++ b/BCnEnc.Net/Shared/Colors.cs @@ -163,7 +163,7 @@ public override int GetHashCode() ); } - public static implicit operator ColorRgba32(ColorRgb24 d) => new ColorRgba32(d.r, d.g, d.b, 255); + //public static implicit operator ColorRgba32(ColorRgb24 d) => new ColorRgba32(d.r, d.g, d.b, 255); public override string ToString() { @@ -184,7 +184,7 @@ public ColorYCbCr(float y, float cb, float cr) this.cr = cr; } - public ColorYCbCr(ColorRgb24 rgb) + internal ColorYCbCr(ColorRgb24 rgb) { var fr = (float)rgb.r / 255; var fg = (float)rgb.g / 255; @@ -195,7 +195,7 @@ public ColorYCbCr(ColorRgb24 rgb) cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } - public ColorYCbCr(ColorRgb565 rgb) + internal ColorYCbCr(ColorRgb565 rgb) { var fr = (float)rgb.R / 255; var fg = (float)rgb.G / 255; @@ -228,7 +228,7 @@ public ColorYCbCr(Vector3 vec) cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } - public ColorRgb565 ToColorRgb565() + internal ColorRgb565 ToColorRgb565() { var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); @@ -445,7 +445,7 @@ public ColorRgba32 ToColorRgba32() } } - public struct ColorRgb565 : IEquatable + internal struct ColorRgb565 : IEquatable { public bool Equals(ColorRgb565 other) { @@ -601,7 +601,7 @@ public ColorRgba32 ToColorRgba32() } } - public struct ColorRgb24 : IEquatable + internal struct ColorRgb24 : IEquatable { public byte r, g, b; diff --git a/BCnEnc.Net/Shared/ImageQuality.cs b/BCnEnc.Net/Shared/ImageQuality.cs index dc7e477..0507cb0 100644 --- a/BCnEnc.Net/Shared/ImageQuality.cs +++ b/BCnEnc.Net/Shared/ImageQuality.cs @@ -1,11 +1,10 @@ -using System; -using SixLabors.ImageSharp.PixelFormats; +using System; namespace BCnEncoder.Shared { public class ImageQuality { - public static float PeakSignalToNoiseRatio(ReadOnlySpan original, ReadOnlySpan other, bool countAlpha = true) { + public static float PeakSignalToNoiseRatio(ReadOnlySpan original, ReadOnlySpan other, bool countAlpha = true) { if (original.Length != other.Length) { throw new ArgumentException("Both spans should be the same length"); } @@ -17,7 +16,7 @@ public static float PeakSignalToNoiseRatio(ReadOnlySpan original, ReadOn error += (o.cb - c.cb) * (o.cb - c.cb); error += (o.cr - c.cr) * (o.cr - c.cr); if (countAlpha) { - error += (original[i].A - other[i].A) / 255.0f * ((original[i].A - other[i].A) / 255.0f); + error += (original[i].a - other[i].a) / 255.0f * ((original[i].a - other[i].a) / 255.0f); } } @@ -35,7 +34,7 @@ public static float PeakSignalToNoiseRatio(ReadOnlySpan original, ReadOn return 20 * MathF.Log10(1 / MathF.Sqrt(error)); } - public static float PeakSignalToNoiseRatioLuminance(ReadOnlySpan original, ReadOnlySpan other, bool countAlpha = true) { + public static float PeakSignalToNoiseRatioLuminance(ReadOnlySpan original, ReadOnlySpan other, bool countAlpha = true) { if (original.Length != other.Length) { throw new ArgumentException("Both spans should be the same length"); } @@ -45,7 +44,7 @@ public static float PeakSignalToNoiseRatioLuminance(ReadOnlySpan origina var c = new ColorYCbCr(other[i]); error += (o.y - c.y) * (o.y - c.y); if (countAlpha) { - error += (original[i].A - other[i].A) / 255.0f * ((original[i].A - other[i].A) / 255.0f); + error += (original[i].a - other[i].a) / 255.0f * ((original[i].a - other[i].a) / 255.0f); } } diff --git a/BCnEnc.Net/Shared/LinearClustering.cs b/BCnEnc.Net/Shared/LinearClustering.cs index 53c9b6e..b2b8d88 100644 --- a/BCnEnc.Net/Shared/LinearClustering.cs +++ b/BCnEnc.Net/Shared/LinearClustering.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Collections.Generic; -using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared { @@ -121,7 +120,7 @@ public readonly float Distance(ClusterCenter other, float m, float s) /// the more spatial proximity is emphasized and the more compact the cluster, /// M should be in range of 1 to 20. /// - public static int[] ClusterPixels(ReadOnlySpan pixels, int width, int height, + public static int[] ClusterPixels(ReadOnlySpan pixels, int width, int height, int clusters, float m = 10, int maxIterations = 10, bool enforceConnectivity = true) { @@ -292,7 +291,7 @@ private static ClusterCenter[] InitialClusterCenters(int width, int height, int return clusterCenters; } - private static LabXy[] ConvertToLabXy(ReadOnlySpan pixels, int width, int height) + private static LabXy[] ConvertToLabXy(ReadOnlySpan pixels, int width, int height) { var labXys = new LabXy[pixels.Length]; //Convert pixels to LabXy @@ -302,7 +301,7 @@ private static LabXy[] ConvertToLabXy(ReadOnlySpan pixels, int width, in { var i = x + y * width; var lab = new ColorLab(pixels[i]); - labXys[i] = new LabXy() + labXys[i] = new LabXy { l = lab.l, a = lab.a, diff --git a/BCnEnc.Net/Shared/PcaVectors.cs b/BCnEnc.Net/Shared/PcaVectors.cs index b6d9390..5aaf0c8 100644 --- a/BCnEnc.Net/Shared/PcaVectors.cs +++ b/BCnEnc.Net/Shared/PcaVectors.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Numerics; -using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared { @@ -9,14 +8,14 @@ internal static class PcaVectors private const int C565_5Mask = 0xF8; private const int C565_6Mask = 0xFC; - private static void ConvertToVector4(ReadOnlySpan colors, Span vectors) + private static void ConvertToVector4(ReadOnlySpan colors, Span vectors) { for (var i = 0; i < colors.Length; i++) { - vectors[i].X += colors[i].R / 255f; - vectors[i].Y += colors[i].G / 255f; - vectors[i].Z += colors[i].B / 255f; - vectors[i].W += colors[i].A / 255f; + vectors[i].X += colors[i].r / 255f; + vectors[i].Y += colors[i].g / 255f; + vectors[i].Z += colors[i].b / 255f; + vectors[i].W += colors[i].a / 255f; } } @@ -110,7 +109,7 @@ internal static Vector4 CalculatePrincipalAxis(Matrix4x4 covarianceMatrix) { return lastDa; } - public static void Create(Span colors, out Vector3 mean, out Vector3 principalAxis) + public static void Create(Span colors, out Vector3 mean, out Vector3 principalAxis) { Span vectors = stackalloc Vector4[colors.Length]; ConvertToVector4(colors, vectors); @@ -130,7 +129,7 @@ public static void Create(Span colors, out Vector3 mean, out Vector3 pri } - public static void CreateWithAlpha(Span colors, out Vector4 mean, out Vector4 principalAxis) + public static void CreateWithAlpha(Span colors, out Vector4 mean, out Vector4 principalAxis) { Span vectors = stackalloc Vector4[colors.Length]; ConvertToVector4(colors, vectors); @@ -140,7 +139,7 @@ public static void CreateWithAlpha(Span colors, out Vector4 mean, out Ve } - public static void GetExtremePoints(Span colors, Vector3 mean, Vector3 principalAxis, out ColorRgb24 min, + public static void GetExtremePoints(Span colors, Vector3 mean, Vector3 principalAxis, out ColorRgb24 min, out ColorRgb24 max) { @@ -149,7 +148,7 @@ public static void GetExtremePoints(Span colors, Vector3 mean, Vector3 p for (var i = 0; i < colors.Length; i++) { - var colorVec = new Vector3(colors[i].R / 255f, colors[i].G / 255f, colors[i].B / 255f); + var colorVec = new Vector3(colors[i].r / 255f, colors[i].g / 255f, colors[i].b / 255f); var v = colorVec - mean; var d = Vector3.Dot(v, principalAxis); @@ -180,7 +179,7 @@ public static void GetExtremePoints(Span colors, Vector3 mean, Vector3 p max = new ColorRgb24((byte)maxR, (byte)maxG, (byte)maxB); } - public static void GetMinMaxColor565(Span colors, Vector3 mean, Vector3 principalAxis, + public static void GetMinMaxColor565(Span colors, Vector3 mean, Vector3 principalAxis, out ColorRgb565 min, out ColorRgb565 max) { @@ -189,7 +188,7 @@ public static void GetMinMaxColor565(Span colors, Vector3 mean, Vector3 for (var i = 0; i < colors.Length; i++) { - var colorVec = new Vector3(colors[i].R / 255f, colors[i].G / 255f, colors[i].B / 255f); + var colorVec = new Vector3(colors[i].r / 255f, colors[i].g / 255f, colors[i].b / 255f); var v = colorVec - mean; var d = Vector3.Dot(v, principalAxis); @@ -234,7 +233,7 @@ public static void GetMinMaxColor565(Span colors, Vector3 mean, Vector3 } - public static void GetExtremePointsWithAlpha(Span colors, Vector4 mean, Vector4 principalAxis, out Vector4 min, + public static void GetExtremePointsWithAlpha(Span colors, Vector4 mean, Vector4 principalAxis, out Vector4 min, out Vector4 max) { @@ -243,7 +242,7 @@ public static void GetExtremePointsWithAlpha(Span colors, Vector4 mean, for (var i = 0; i < colors.Length; i++) { - var colorVec = new Vector4(colors[i].R / 255f, colors[i].G / 255f, colors[i].B / 255f, colors[i].A / 255f); + var colorVec = new Vector4(colors[i].r / 255f, colors[i].g / 255f, colors[i].b / 255f, colors[i].a / 255f); var v = colorVec - mean; var d = Vector4.Dot(v, principalAxis); @@ -255,14 +254,14 @@ public static void GetExtremePointsWithAlpha(Span colors, Vector4 mean, max = mean + principalAxis * maxD; } - public static void GetOptimizedEndpoints565(Span colors, Vector3 mean, Vector3 principalAxis, out ColorRgb565 min, out ColorRgb565 max, + public static void GetOptimizedEndpoints565(Span colors, Vector3 mean, Vector3 principalAxis, out ColorRgb565 min, out ColorRgb565 max, float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f) { var length = colors.Length; var vectorColors = new Vector3[length]; for (var i = 0; i < colors.Length; i++) { - vectorColors[i] = new Vector3(colors[i].R / 255f, colors[i].G / 255f, colors[i].B / 255f); + vectorColors[i] = new Vector3(colors[i].r / 255f, colors[i].g / 255f, colors[i].b / 255f); } float minD = 0; diff --git a/BCnEnc.Net/Shared/RawBlocks.cs b/BCnEnc.Net/Shared/RawBlocks.cs index d25204b..af06d6c 100644 --- a/BCnEnc.Net/Shared/RawBlocks.cs +++ b/BCnEnc.Net/Shared/RawBlocks.cs @@ -1,6 +1,5 @@ using System; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.PixelFormats; namespace BCnEncoder.Shared { diff --git a/BCnEnc.Net/Shared/RgbBoundingBox.cs b/BCnEnc.Net/Shared/RgbBoundingBox.cs index a1743b5..878b503 100644 --- a/BCnEnc.Net/Shared/RgbBoundingBox.cs +++ b/BCnEnc.Net/Shared/RgbBoundingBox.cs @@ -1,5 +1,4 @@ -using System; -using SixLabors.ImageSharp.PixelFormats; +using System; namespace BCnEncoder.Shared { @@ -11,7 +10,7 @@ namespace BCnEncoder.Shared internal static class RgbBoundingBox { - public static void Create565(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max) + public static void Create565(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max) { const int colorInsetShift = 4; const int c5655Mask = 0xF8; @@ -28,13 +27,13 @@ public static void Create565(ReadOnlySpan colors, out ColorRgb565 min, o { var c = colors[i]; - if (c.R < minR) minR = c.R; - if (c.G < minG) minG = c.G; - if (c.B < minB) minB = c.B; + if (c.r < minR) minR = c.r; + if (c.g < minG) minG = c.g; + if (c.b < minB) minB = c.b; - if (c.R > maxR) maxR = c.R; - if (c.G > maxG) maxG = c.G; - if (c.B > maxB) maxB = c.B; + if (c.r > maxR) maxR = c.r; + if (c.g > maxG) maxG = c.g; + if (c.b > maxB) maxB = c.b; } var insetR = (maxR - minR) >> colorInsetShift; @@ -71,7 +70,7 @@ public static void Create565(ReadOnlySpan colors, out ColorRgb565 min, o max = new ColorRgb565((byte)maxR, (byte)maxG, (byte)maxB); } - public static void Create565AlphaCutoff(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max, int alphaCutoff = 128) + public static void Create565AlphaCutoff(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max, int alphaCutoff = 128) { const int colorInsetShift = 4; const int c5655Mask = 0xF8; @@ -87,14 +86,14 @@ public static void Create565AlphaCutoff(ReadOnlySpan colors, out ColorRg for (var i = 0; i < colors.Length; i++) { var c = colors[i]; - if (c.A < alphaCutoff) continue; - if (c.R < minR) minR = c.R; - if (c.G < minG) minG = c.G; - if (c.B < minB) minB = c.B; - - if (c.R > maxR) maxR = c.R; - if (c.G > maxG) maxG = c.G; - if (c.B > maxB) maxB = c.B; + if (c.a < alphaCutoff) continue; + if (c.r < minR) minR = c.r; + if (c.g < minG) minG = c.g; + if (c.b < minB) minB = c.b; + + if (c.r > maxR) maxR = c.r; + if (c.g > maxG) maxG = c.g; + if (c.b > maxB) maxB = c.b; } var insetR = (maxR - minR) >> colorInsetShift; @@ -129,7 +128,7 @@ public static void Create565AlphaCutoff(ReadOnlySpan colors, out ColorRg max = new ColorRgb565((byte)maxR, (byte)maxG, (byte)maxB); } - public static void Create565A(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max, out byte minAlpha, out byte maxAlpha) + public static void Create565A(ReadOnlySpan colors, out ColorRgb565 min, out ColorRgb565 max, out byte minAlpha, out byte maxAlpha) { const int colorInsetShift = 4; const int alphaInsetShift = 5; @@ -148,15 +147,15 @@ public static void Create565A(ReadOnlySpan colors, out ColorRgb565 min, for (var i = 0; i < colors.Length; i++) { var c = colors[i]; - if (c.R < minR) minR = c.R; - if (c.G < minG) minG = c.G; - if (c.B < minB) minB = c.B; - if (c.A < minA) minA = c.A; - - if (c.R > maxR) maxR = c.R; - if (c.G > maxG) maxG = c.G; - if (c.B > maxB) maxB = c.B; - if (c.A > maxA) maxA = c.A; + if (c.r < minR) minR = c.r; + if (c.g < minG) minG = c.g; + if (c.b < minB) minB = c.b; + if (c.a < minA) minA = c.a; + + if (c.r > maxR) maxR = c.r; + if (c.g > maxG) maxG = c.g; + if (c.b > maxB) maxB = c.b; + if (c.a > maxA) maxA = c.a; } From 55905610f66925bcbcfe602d711ec8d82a41cad9 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Thu, 28 Jan 2021 10:35:14 +0100 Subject: [PATCH 059/116] Fix coordinates in ImageTo4X4; --- BCnEnc.Net/Shared/ImageToBlocks.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 730faf0..7a596e0 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -64,7 +64,7 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(Memory2D image, out { for (var x = 0; x < image.Width; x++) { - var color = span[x, y]; + var color = span[y, x]; var blockIndexX = x >> 2; var blockIndexY = y >> 2; From cb2bdf4f3857f4efb167b16d94e7ba63b33fb8d3 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Wed, 3 Feb 2021 14:09:12 +0100 Subject: [PATCH 060/116] Resolve conversation points; --- BCnEnc.Net/Decoder/BcDecoder.cs | 54 +++++++++++++-------------- BCnEnc.Net/Encoder/BcEncoder.cs | 60 +++++++++++++++++------------- BCnEnc.Net/Encoder/RawEncoders.cs | 12 +++--- BCnEnc.Net/Shared/ImageToBlocks.cs | 2 +- BCnEnc.Net/Shared/MipMapper.cs | 6 +-- 5 files changed, 71 insertions(+), 63 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 1c0907c..305e1bd 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -33,7 +33,7 @@ public class BcDecoder #region Async Api /// - /// DecodeInternal raw encoded image asynchronously. + /// Decode raw encoded image asynchronously. /// /// The stream containing the encoded data. /// The Format the encoded data is in. @@ -41,7 +41,7 @@ public class BcDecoder /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + public Task> DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); @@ -50,7 +50,7 @@ public Task DecodeRawAsync(Stream inputStream, CompressionFormat } /// - /// DecodeInternal raw encoded image data asynchronously. + /// Decode raw encoded image data asynchronously. /// /// The containing the encoded data. /// The Format the encoded data is in. @@ -58,7 +58,7 @@ public Task DecodeRawAsync(Stream inputStream, CompressionFormat /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + public Task> DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { return Task.Run(() => DecodeRawInternal(input, pixelWidth, pixelHeight, format, token), token); } @@ -69,7 +69,7 @@ public Task DecodeRawAsync(ReadOnlyMemory input, Compressio /// The stream containing a Ktx or Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task DecodeAsync(Stream inputStream, CancellationToken token = default) + public Task> DecodeAsync(Stream inputStream, CancellationToken token = default) { return Task.Run(() => DecodeInternal(inputStream, false, token)[0], token); } @@ -80,7 +80,7 @@ public Task DecodeAsync(Stream inputStream, CancellationToken tok /// The stream containing a Ktx or Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task DecodeAllMipMapsAsync(Stream inputStream, CancellationToken token = default) + public Task[]> DecodeAllMipMapsAsync(Stream inputStream, CancellationToken token = default) { return Task.Run(() => DecodeInternal(inputStream, true, token), token); } @@ -91,7 +91,7 @@ public Task DecodeAllMipMapsAsync(Stream inputStream, Cancellat /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task DecodeAsync(KtxFile file, CancellationToken token = default) + public Task> DecodeAsync(KtxFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0], token); } @@ -102,7 +102,7 @@ public Task DecodeAsync(KtxFile file, CancellationToken token = d /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) + public Task[]> DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, true, token), token); } @@ -113,7 +113,7 @@ public Task DecodeAllMipMapsAsync(KtxFile file, CancellationTok /// The loaded Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task DecodeAsync(DdsFile file, CancellationToken token = default) + public Task> DecodeAsync(DdsFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0], token); } @@ -124,7 +124,7 @@ public Task DecodeAsync(DdsFile file, CancellationToken token = d /// The loaded Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) + public Task[]> DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, true, token), token); } @@ -134,14 +134,14 @@ public Task DecodeAllMipMapsAsync(DdsFile file, CancellationTok #region Sync API /// - /// DecodeInternal raw encoded image data. + /// Decode raw encoded image data. /// /// The stream containing the encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. /// The decoded Rgba32 image. - public ColorRgba32[] DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) + public ReadOnlyMemory DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); @@ -150,14 +150,14 @@ public ColorRgba32[] DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeig } /// - /// DecodeInternal raw encoded image data. + /// Decode raw encoded image data. /// /// The array containing the encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. /// The decoded Rgba32 image. - public ColorRgba32[] DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) + public ReadOnlyMemory DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) { return DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); } @@ -167,7 +167,7 @@ public ColorRgba32[] DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, Co /// /// The stream containing a Ktx or Dds file. /// The decoded Rgba32 image. - public ColorRgba32[] Decode(Stream inputStream) + public ReadOnlyMemory Decode(Stream inputStream) { return DecodeInternal(inputStream, false, default)[0]; } @@ -177,7 +177,7 @@ public ColorRgba32[] Decode(Stream inputStream) /// /// The stream containing a Ktx or Dds file. /// An array of decoded Rgba32 images. - public ColorRgba32[][] DecodeAllMipMaps(Stream inputStream) + public ReadOnlyMemory[] DecodeAllMipMaps(Stream inputStream) { return DecodeInternal(inputStream, true, default); } @@ -187,7 +187,7 @@ public ColorRgba32[][] DecodeAllMipMaps(Stream inputStream) /// /// The loaded Ktx file. /// The decoded Rgba32 image. - public ColorRgba32[] Decode(KtxFile file) + public ReadOnlyMemory Decode(KtxFile file) { return DecodeInternal(file, false, default)[0]; } @@ -197,7 +197,7 @@ public ColorRgba32[] Decode(KtxFile file) /// /// The loaded Ktx file. /// An array of decoded Rgba32 images. - public ColorRgba32[][] DecodeAllMipMaps(KtxFile file) + public ReadOnlyMemory[] DecodeAllMipMaps(KtxFile file) { return DecodeInternal(file, true, default); } @@ -207,7 +207,7 @@ public ColorRgba32[][] DecodeAllMipMaps(KtxFile file) /// /// The loaded Dds file. /// The decoded Rgba32 image. - public ColorRgba32[] Decode(DdsFile file) + public ReadOnlyMemory Decode(DdsFile file) { return DecodeInternal(file, false, default)[0]; } @@ -217,7 +217,7 @@ public ColorRgba32[] Decode(DdsFile file) /// /// The loaded Dds file. /// An array of decoded Rgba32 images. - public ColorRgba32[][] DecodeAllMipMaps(DdsFile file) + public ReadOnlyMemory[] DecodeAllMipMaps(DdsFile file) { return DecodeInternal(file, true, default); } @@ -231,7 +231,7 @@ public ColorRgba32[][] DecodeAllMipMaps(DdsFile file) /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private ColorRgba32[][] DecodeInternal(Stream stream, bool allMipMaps, CancellationToken token) + private ReadOnlyMemory[] DecodeInternal(Stream stream, bool allMipMaps, CancellationToken token) { var format = ImageFile.DetermineImageFormat(stream); @@ -255,9 +255,9 @@ private ColorRgba32[][] DecodeInternal(Stream stream, bool allMipMaps, Cancellat /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private ColorRgba32[][] DecodeInternal(KtxFile file, bool allMipMaps, CancellationToken token) + private ReadOnlyMemory[] DecodeInternal(KtxFile file, bool allMipMaps, CancellationToken token) { - var colors = new ColorRgba32[file.MipMaps.Count][]; + var colors = new ReadOnlyMemory[file.MipMaps.Count]; var context = new OperationContext { @@ -319,9 +319,9 @@ private ColorRgba32[][] DecodeInternal(KtxFile file, bool allMipMaps, Cancellati /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private ColorRgba32[][] DecodeInternal(DdsFile file, bool allMipMaps, CancellationToken token) + private ReadOnlyMemory[] DecodeInternal(DdsFile file, bool allMipMaps, CancellationToken token) { - var colors = new ColorRgba32[file.header.dwMipMapCount][]; + var colors = new ReadOnlyMemory[file.header.dwMipMapCount]; var context = new OperationContext { @@ -382,7 +382,7 @@ private ColorRgba32[][] DecodeInternal(DdsFile file, bool allMipMaps, Cancellati } /// - /// DecodeInternal raw encoded image asynchronously. + /// Decode raw encoded image asynchronously. /// /// The containing the encoded data. /// The width of the image. @@ -390,7 +390,7 @@ private ColorRgba32[][] DecodeInternal(DdsFile file, bool allMipMaps, Cancellati /// The Format the encoded data is in. /// The cancellation token for this operation. May be default, if the operation is not asynchronous. /// The decoded Rgba32 image. - private ColorRgba32[] DecodeRawInternal(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token) + private ReadOnlyMemory DecodeRawInternal(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token) { if (input.Length % GetBlockSize(format) != 0) { diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 0900275..bd4de76 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -27,6 +27,11 @@ public enum PixelFormat /// Bgra32, + /// + /// Specifies the ARGB32 layout. + /// + Argb32, + /// /// Specifies the RGB24 layout. /// @@ -211,12 +216,12 @@ public Task EncodeToRawBytesAsync(Memory2D input, int mipLe /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. /// The pixel format the given data is in. /// The stream to write the encoded image to. - public void EncodeToStream(Memory input, int width, int height, PixelFormat format, Stream outputStream) + public void EncodeToStream(ReadOnlyMemory input, int width, int height, PixelFormat format, Stream outputStream) { EncodeToStream(ByteToColorMemory(input.Span, width, height, format), outputStream); } @@ -226,7 +231,7 @@ public void EncodeToStream(Memory input, int width, int height, PixelForma /// /// The input to encode represented by a . /// The stream to write the encoded image to. - public void EncodeToStream(Memory2D input, Stream outputStream) + public void EncodeToStream(ReadOnlyMemory2D input, Stream outputStream) { EncodeToStreamInternal(input, outputStream, default); } @@ -239,7 +244,7 @@ public void EncodeToStream(Memory2D input, Stream outputStream) /// The height of the image. /// The pixel format the given data is in. /// The Ktx file containing the encoded image. - public KtxFile EncodeToKtx(Memory input, int width, int height, PixelFormat format) + public KtxFile EncodeToKtx(ReadOnlyMemory input, int width, int height, PixelFormat format) { return EncodeToKtx(ByteToColorMemory(input.Span, width, height, format)); } @@ -249,7 +254,7 @@ public KtxFile EncodeToKtx(Memory input, int width, int height, PixelForma /// /// The input to encode represented by a . /// The Ktx file containing the encoded image. - public KtxFile EncodeToKtx(Memory2D input) + public KtxFile EncodeToKtx(ReadOnlyMemory2D input) { return EncodeToKtxInternal(input, default); } @@ -262,7 +267,7 @@ public KtxFile EncodeToKtx(Memory2D input) /// The height of the image. /// The pixel format the given data is in. /// The Dds file containing the encoded image. - public DdsFile EncodeToDds(Memory input, int width, int height, PixelFormat format) + public DdsFile EncodeToDds(ReadOnlyMemory input, int width, int height, PixelFormat format) { return EncodeToDds(ByteToColorMemory(input.Span, width, height, format)); } @@ -272,7 +277,7 @@ public DdsFile EncodeToDds(Memory input, int width, int height, PixelForma /// /// The input to encode represented by a . /// The Dds file containing the encoded image. - public DdsFile EncodeToDds(Memory2D input) + public DdsFile EncodeToDds(ReadOnlyMemory2D input) { return EncodeToDdsInternal(input, default); } @@ -285,7 +290,7 @@ public DdsFile EncodeToDds(Memory2D input) /// The height of the image. /// The pixel format the given data is in. /// A list of raw encoded mipmap input. - public byte[][] EncodeToRawBytes(Memory input, int width, int height, PixelFormat format) + public byte[][] EncodeToRawBytes(ReadOnlyMemory input, int width, int height, PixelFormat format) { return EncodeToRawBytes(ByteToColorMemory(input.Span, width, height, format)); } @@ -295,7 +300,7 @@ public byte[][] EncodeToRawBytes(Memory input, int width, int height, Pixe /// /// The input to encode represented by a . /// A list of raw encoded mipmap input. - public byte[][] EncodeToRawBytes(Memory2D input) + public byte[][] EncodeToRawBytes(ReadOnlyMemory2D input) { return EncodeToRawInternal(input, default); } @@ -311,7 +316,7 @@ public byte[][] EncodeToRawBytes(Memory2D input) /// The width of the mipmap. /// The height of the mipmap. /// The raw encoded input. - public byte[] EncodeToRawBytes(Memory input, int width, int height, PixelFormat format, int mipLevel, out int mipWidth, out int mipHeight) + public byte[] EncodeToRawBytes(ReadOnlyMemory input, int width, int height, PixelFormat format, int mipLevel, out int mipWidth, out int mipHeight) { return EncodeToRawInternal(ByteToColorMemory(input.Span, width, height, format), mipLevel, out mipWidth, out mipHeight, default); } @@ -324,7 +329,7 @@ public byte[] EncodeToRawBytes(Memory input, int width, int height, PixelF /// The width of the mipmap. /// The height of the mipmap. /// The raw encoded input. - public byte[] EncodeToRawBytes(Memory2D input, int mipLevel, out int mipWidth, out int mipHeight) + public byte[] EncodeToRawBytes(ReadOnlyMemory2D input, int mipLevel, out int mipWidth, out int mipHeight) { return EncodeToRawInternal(input, mipLevel, out mipWidth, out mipHeight, default); } @@ -363,7 +368,7 @@ public void CalculateMipMapSize(int imagePixelWidth, int imagePixelHeight, int m #region Private - private void EncodeToStreamInternal(Memory2D input, Stream outputStream, CancellationToken token) + private void EncodeToStreamInternal(ReadOnlyMemory2D input, Stream outputStream, CancellationToken token) { switch (OutputOptions.FileFormat) { @@ -379,7 +384,7 @@ private void EncodeToStreamInternal(Memory2D input, Stream outputSt } } - private KtxFile EncodeToKtxInternal(Memory2D input, CancellationToken token) + private KtxFile EncodeToKtxInternal(ReadOnlyMemory2D input, CancellationToken token) { KtxFile output; IBcBlockEncoder compressedEncoder = null; @@ -465,7 +470,7 @@ private KtxFile EncodeToKtxInternal(Memory2D input, CancellationTok return output; } - private DdsFile EncodeToDdsInternal(Memory2D input, CancellationToken token) + private DdsFile EncodeToDdsInternal(ReadOnlyMemory2D input, CancellationToken token) { DdsFile output; IBcBlockEncoder compressedEncoder = null; @@ -557,7 +562,7 @@ private DdsFile EncodeToDdsInternal(Memory2D input, CancellationTok return output; } - private byte[][] EncodeToRawInternal(Memory2D input, CancellationToken token) + private byte[][] EncodeToRawInternal(ReadOnlyMemory2D input, CancellationToken token) { var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); @@ -622,7 +627,7 @@ private byte[][] EncodeToRawInternal(Memory2D input, CancellationTo return output; } - private byte[] EncodeToRawInternal(Memory2D input, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) + private byte[] EncodeToRawInternal(ReadOnlyMemory2D input, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) { mipLevel = Math.Max(0, mipLevel); @@ -687,10 +692,8 @@ private byte[] EncodeToRawInternal(Memory2D input, int mipLevel, ou return encoded; } - // TODO: Do we still need cubemap methods? If yes, expose them in both Sync and Async API - - private void EncodeCubeMapToStreamInternal(Memory2D right, Memory2D left, Memory2D top, Memory2D down, - Memory2D back, Memory2D front, Stream outputStream, CancellationToken token) + private void EncodeCubeMapToStreamInternal(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, Stream outputStream, CancellationToken token) { switch (OutputOptions.FileFormat) { @@ -706,8 +709,8 @@ private void EncodeCubeMapToStreamInternal(Memory2D right, Memory2D } } - private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D left, Memory2D top, Memory2D down, - Memory2D back, Memory2D front, CancellationToken token) + private KtxFile EncodeCubeMapToKtxInternal(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token) { KtxFile output; IBcBlockEncoder compressedEncoder = null; @@ -822,8 +825,8 @@ private KtxFile EncodeCubeMapToKtxInternal(Memory2D right, Memory2D return output; } - private DdsFile EncodeCubeMapToDdsInternal(Memory2D right, Memory2D left, Memory2D top, Memory2D down, - Memory2D back, Memory2D front, CancellationToken token) + private DdsFile EncodeCubeMapToDdsInternal(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token) { DdsFile output; IBcBlockEncoder compressedEncoder = null; @@ -1012,7 +1015,7 @@ private IRawEncoder GetRawEncoder(CompressionFormat format) } } - private Memory2D ByteToColorMemory(Span span, int width, int height, PixelFormat format) + private ReadOnlyMemory2D ByteToColorMemory(ReadOnlySpan span, int width, int height, PixelFormat format) { var pixels = new ColorRgba32[width * height]; @@ -1037,9 +1040,14 @@ private Memory2D ByteToColorMemory(Span span, int width, int for (var i = 0; i < width * height * 3; i += 3) pixels[i / 3] = new ColorRgba32(span[i + 2], span[i + 1], span[i], 255); break; + + case PixelFormat.Argb32: + for (var i = 0; i < width * height * 4; i += 4) + pixels[i / 4] = new ColorRgba32(span[i + 1], span[i + 2], span[i + 3], span[i]); + break; } - return new Memory2D(pixels, width, height); + return new ReadOnlyMemory2D(pixels, width, height); } #endregion diff --git a/BCnEnc.Net/Encoder/RawEncoders.cs b/BCnEnc.Net/Encoder/RawEncoders.cs index aa73c65..139014b 100644 --- a/BCnEnc.Net/Encoder/RawEncoders.cs +++ b/BCnEnc.Net/Encoder/RawEncoders.cs @@ -6,7 +6,7 @@ namespace BCnEncoder.Encoder { internal interface IRawEncoder { - byte[] Encode(Memory pixels); + byte[] Encode(ReadOnlyMemory pixels); GlInternalFormat GetInternalFormat(); GlFormat GetBaseInternalFormat(); GlFormat GetGlFormat(); @@ -24,7 +24,7 @@ public RawLuminanceEncoder(bool useLuminance) this.useLuminance = useLuminance; } - public byte[] Encode(Memory pixels) + public byte[] Encode(ReadOnlyMemory pixels) { var span = pixels.Span; @@ -77,7 +77,7 @@ public DxgiFormat GetDxgiFormat() internal class RawRgEncoder : IRawEncoder { - public byte[] Encode(Memory pixels) + public byte[] Encode(ReadOnlyMemory pixels) { var span = pixels.Span; @@ -123,7 +123,7 @@ public DxgiFormat GetDxgiFormat() internal class RawRgbEncoder : IRawEncoder { - public byte[] Encode(Memory pixels) + public byte[] Encode(ReadOnlyMemory pixels) { var span = pixels.Span; @@ -170,7 +170,7 @@ public DxgiFormat GetDxgiFormat() internal class RawRgbaEncoder : IRawEncoder { - public byte[] Encode(Memory pixels) + public byte[] Encode(ReadOnlyMemory pixels) { var span = pixels.Span; @@ -218,7 +218,7 @@ public DxgiFormat GetDxgiFormat() internal class RawBgraEncoder : IRawEncoder { - public byte[] Encode(Memory pixels) + public byte[] Encode(ReadOnlyMemory pixels) { var span = pixels.Span; diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 7a596e0..0ec7d4a 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -52,7 +52,7 @@ internal static ColorRgba32[] ColorsFromRawBlocks(RawBlock4X4Rgba32[] blocks, in #region Image to blocks - internal static RawBlock4X4Rgba32[] ImageTo4X4(Memory2D image, out int blocksWidth, out int blocksHeight) + internal static RawBlock4X4Rgba32[] ImageTo4X4(ReadOnlyMemory2D image, out int blocksWidth, out int blocksHeight) { blocksWidth = ((image.Width + 3) & ~3) >> 2; blocksHeight = ((image.Height + 3) & ~3) >> 2; diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index 02e6ac8..d40aae3 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -12,7 +12,7 @@ internal static class MipMapper /// The original image to scale down. /// The number of mipmaps to generate. /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. - public static Memory2D[] GenerateMipChain(Memory2D input, ref int numMipMaps) + public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory2D input, ref int numMipMaps) { if (!input.TryGetMemory(out var memory)) { @@ -30,11 +30,11 @@ public static Memory2D[] GenerateMipChain(Memory2D inp /// The original image height. /// The number of mipmaps to generate. /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. - public static Memory2D[] GenerateMipChain(Memory pixels, int width, int height, ref int numMipMaps) + public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory pixels, int width, int height, ref int numMipMaps) { var mipChainLength = CalculateMipChainLength(width, height, numMipMaps); - var result = new Memory2D[mipChainLength]; + var result = new ReadOnlyMemory2D[mipChainLength]; result[0] = pixels.AsMemory2D(width, height); // If only one mipmap was requested, return original image only From e19595b7fac4f44956f9876b3a07840788530197 Mon Sep 17 00:00:00 2001 From: Nominom Date: Thu, 4 Feb 2021 17:31:16 +0200 Subject: [PATCH 061/116] Added ImageSharp decoding api, fixed tests and some bugs, new resizing algorithm. --- BCnEnc.Net/Decoder/BcDecoder.cs | 284 +++++++++++++++--- BCnEnc.Net/Encoder/BcEncoder.cs | 42 +++ BCnEnc.Net/Shared/Colors.cs | 153 +++++++++- BCnEnc.Net/Shared/ImageToBlocks.cs | 4 +- BCnEnc.Net/Shared/MipMapper.cs | 65 ++-- BCnEnc.Net/Shared/RawBlocks.cs | 10 +- BCnEncTests/AtcTests.cs | 13 +- BCnEncTests/BC1Tests.cs | 115 +++---- BCnEncTests/BCnEncTests.csproj | 3 +- BCnEncTests/Bc5Tests.cs | 35 +-- BCnEncTests/Bc7BlockTests.cs | 1 + BCnEncTests/BgraTests.cs | 39 ++- BCnEncTests/BlockTests.cs | 53 ++-- BCnEncTests/ClusterTests.cs | 8 +- BCnEncTests/DdsReadTests.cs | 4 +- BCnEncTests/DecodingAsyncTests.cs | 13 +- BCnEncTests/EncodingAsyncTest.cs | 11 +- BCnEncTests/EncodingTest.cs | 3 +- BCnEncTests/RawTests.cs | 7 +- BCnEncTests/Support/ImageLoader.cs | 1 + BCnEncTests/Support/TestHelper.cs | 24 +- .../BCnDecoderExtensions.cs | 258 ++++++++++++++++ .../BCnEncoderExtensions.cs | 126 ++++++-- 23 files changed, 1019 insertions(+), 253 deletions(-) create mode 100644 BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 305e1bd..e07b518 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -7,6 +7,8 @@ using System.Threading; using System.Threading.Tasks; using BCnEncoder.Shared.ImageFiles; +using Microsoft.Toolkit.HighPerformance.Extensions; +using Microsoft.Toolkit.HighPerformance.Memory; namespace BCnEncoder.Decoder { @@ -41,7 +43,7 @@ public class BcDecoder /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + public Task> DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); @@ -52,26 +54,103 @@ public Task> DecodeRawAsync(Stream inputStream, Comp /// /// Decode raw encoded image data asynchronously. /// - /// The containing the encoded data. + /// The containing the encoded data. /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + public Task> DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { return Task.Run(() => DecodeRawInternal(input, pixelWidth, pixelHeight, format, token), token); } + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public Task> DecodeAsync(KtxFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternal(file, false, token)[0], token); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public Task[]> DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternal(file, true, token), token); + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public Task> DecodeAsync(DdsFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternal(file, false, token)[0], token); + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public Task[]> DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternal(file, true, token), token); + } + + /// + /// Decode raw encoded image asynchronously. + /// + /// The stream containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public Task> DecodeRaw2DAsync(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token = default) + { + var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; + inputStream.Read(dataArray, 0, dataArray.Length); + + return Task.Run(() => DecodeRawInternal(dataArray, pixelWidth, pixelHeight, format, token) + .AsMemory2D(pixelHeight, pixelWidth), token); + } + + /// + /// Decode raw encoded image data asynchronously. + /// + /// The containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded Rgba32 image. + public Task> DecodeRaw2DAsync(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token = default) + { + return Task.Run(() => DecodeRawInternal(input, pixelWidth, pixelHeight, format, token) + .AsMemory2D(pixelHeight, pixelWidth), token); + } + /// /// Read a Ktx or a Dds file from a stream and decode it asynchronously. /// /// The stream containing a Ktx or Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeAsync(Stream inputStream, CancellationToken token = default) + public Task> Decode2DAsync(Stream inputStream, CancellationToken token = default) { - return Task.Run(() => DecodeInternal(inputStream, false, token)[0], token); + return Task.Run(() => DecodeFromStreamInternal2D(inputStream, false, token)[0], token); } /// @@ -80,9 +159,9 @@ public Task> DecodeAsync(Stream inputStream, Cancell /// The stream containing a Ktx or Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task[]> DecodeAllMipMapsAsync(Stream inputStream, CancellationToken token = default) + public Task[]> DecodeAllMipMaps2DAsync(Stream inputStream, CancellationToken token = default) { - return Task.Run(() => DecodeInternal(inputStream, true, token), token); + return Task.Run(() => DecodeFromStreamInternal2D(inputStream, false, token), token); } /// @@ -91,9 +170,10 @@ public Task[]> DecodeAllMipMapsAsync(Stream inputStr /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeAsync(KtxFile file, CancellationToken token = default) + public Task> Decode2DAsync(KtxFile file, CancellationToken token = default) { - return Task.Run(() => DecodeInternal(file, false, token)[0], token); + return Task.Run(() => DecodeInternal(file, false, token)[0] + .AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth), token); } /// @@ -102,9 +182,19 @@ public Task> DecodeAsync(KtxFile file, CancellationT /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task[]> DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) + public Task[]> DecodeAllMipMaps2DAsync(KtxFile file, CancellationToken token = default) { - return Task.Run(() => DecodeInternal(file, true, token), token); + return Task.Run(() => + { + var decoded = DecodeInternal(file, true, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory2D((int)mip.Height, (int)mip.Width); + } + return mem2Ds; + }, token); } /// @@ -113,9 +203,10 @@ public Task[]> DecodeAllMipMapsAsync(KtxFile file, C /// The loaded Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeAsync(DdsFile file, CancellationToken token = default) + public Task> Decode2DAsync(DdsFile file, CancellationToken token = default) { - return Task.Run(() => DecodeInternal(file, false, token)[0], token); + return Task.Run(() => DecodeInternal(file, false, token)[0] + .AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth), token); } /// @@ -124,9 +215,19 @@ public Task> DecodeAsync(DdsFile file, CancellationT /// The loaded Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task[]> DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) + public Task[]> DecodeAllMipMaps2DAsync(DdsFile file, CancellationToken token = default) { - return Task.Run(() => DecodeInternal(file, true, token), token); + return Task.Run(() => + { + var decoded = DecodeInternal(file, true, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.Faces[0].MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory2D((int)mip.Height, (int)mip.Width); + } + return mem2Ds; + }, token); } #endregion @@ -141,7 +242,7 @@ public Task[]> DecodeAllMipMapsAsync(DdsFile file, C /// The pixelHeight of the image. /// The Format the encoded data is in. /// The decoded Rgba32 image. - public ReadOnlyMemory DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) + public Memory DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); @@ -157,19 +258,90 @@ public ReadOnlyMemory DecodeRaw(Stream inputStream, int pixelWidth, /// The pixelHeight of the image. /// The Format the encoded data is in. /// The decoded Rgba32 image. - public ReadOnlyMemory DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) + public Memory DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) { return DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); } + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The decoded Rgba32 image. + public Memory Decode(KtxFile file) + { + return DecodeInternal(file, false, default)[0]; + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// An array of decoded Rgba32 images. + public Memory[] DecodeAllMipMaps(KtxFile file) + { + return DecodeInternal(file, true, default); + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The decoded Rgba32 image. + public Memory Decode(DdsFile file) + { + return DecodeInternal(file, false, default)[0]; + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// An array of decoded Rgba32 images. + public Memory[] DecodeAllMipMaps(DdsFile file) + { + return DecodeInternal(file, true, default); + } + + /// + /// Decode raw encoded image data. + /// + /// The stream containing the encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The decoded Rgba32 image. + public Memory2D DecodeRaw2D(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) + { + var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; + inputStream.Read(dataArray, 0, dataArray.Length); + + var decoded = DecodeRaw(dataArray, pixelWidth, pixelHeight, format); + return decoded.AsMemory2D(pixelHeight, pixelWidth); + } + + /// + /// Decode raw encoded image data. + /// + /// The array containing the encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The decoded Rgba32 image. + public Memory2D DecodeRaw2D(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) + { + var decoded = DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); + return decoded.AsMemory2D(pixelHeight, pixelWidth); + } + /// /// Read a Ktx or a Dds file from a stream and decode it. /// /// The stream containing a Ktx or Dds file. /// The decoded Rgba32 image. - public ReadOnlyMemory Decode(Stream inputStream) + public Memory2D Decode2D(Stream inputStream) { - return DecodeInternal(inputStream, false, default)[0]; + return DecodeFromStreamInternal2D(inputStream, false, default)[0]; } /// @@ -177,9 +349,9 @@ public ReadOnlyMemory Decode(Stream inputStream) /// /// The stream containing a Ktx or Dds file. /// An array of decoded Rgba32 images. - public ReadOnlyMemory[] DecodeAllMipMaps(Stream inputStream) + public Memory2D[] DecodeAllMipMaps2D(Stream inputStream) { - return DecodeInternal(inputStream, true, default); + return DecodeFromStreamInternal2D(inputStream, true, default); } /// @@ -187,9 +359,9 @@ public ReadOnlyMemory[] DecodeAllMipMaps(Stream inputStream) /// /// The loaded Ktx file. /// The decoded Rgba32 image. - public ReadOnlyMemory Decode(KtxFile file) + public Memory2D Decode2D(KtxFile file) { - return DecodeInternal(file, false, default)[0]; + return DecodeInternal(file, false, default)[0].AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth); } /// @@ -197,9 +369,16 @@ public ReadOnlyMemory Decode(KtxFile file) /// /// The loaded Ktx file. /// An array of decoded Rgba32 images. - public ReadOnlyMemory[] DecodeAllMipMaps(KtxFile file) + public Memory2D[] DecodeAllMipMaps2D(KtxFile file) { - return DecodeInternal(file, true, default); + var decoded = DecodeInternal(file, true, default); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory2D((int)mip.Height, (int)mip.Width); + } + return mem2Ds; } /// @@ -207,9 +386,9 @@ public ReadOnlyMemory[] DecodeAllMipMaps(KtxFile file) /// /// The loaded Dds file. /// The decoded Rgba32 image. - public ReadOnlyMemory Decode(DdsFile file) + public Memory2D Decode2D(DdsFile file) { - return DecodeInternal(file, false, default)[0]; + return DecodeInternal(file, false, default)[0].AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth); } /// @@ -217,9 +396,16 @@ public ReadOnlyMemory Decode(DdsFile file) /// /// The loaded Dds file. /// An array of decoded Rgba32 images. - public ReadOnlyMemory[] DecodeAllMipMaps(DdsFile file) + public Memory2D[] DecodeAllMipMaps2D(DdsFile file) { - return DecodeInternal(file, true, default); + var decoded = DecodeInternal(file, true, default); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.Faces[0].MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory2D((int)mip.Height, (int)mip.Width); + } + return mem2Ds; } #endregion @@ -231,17 +417,39 @@ public ReadOnlyMemory[] DecodeAllMipMaps(DdsFile file) /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private ReadOnlyMemory[] DecodeInternal(Stream stream, bool allMipMaps, CancellationToken token) + private Memory2D[] DecodeFromStreamInternal2D(Stream stream, bool allMipMaps, CancellationToken token) { var format = ImageFile.DetermineImageFormat(stream); switch (format) { case ImageFileFormat.Dds: - return DecodeInternal(DdsFile.Load(stream), allMipMaps, token); + { + var file = DdsFile.Load(stream); + var decoded = DecodeInternal(file, allMipMaps, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.Faces[0].MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory2D((int) mip.Height, (int) mip.Width); + } + + return mem2Ds; + } case ImageFileFormat.Ktx: - return DecodeInternal(KtxFile.Load(stream), allMipMaps, token); + { + var file = KtxFile.Load(stream); + var decoded = DecodeInternal(file, allMipMaps, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory2D((int) mip.Height, (int) mip.Width); + } + + return mem2Ds; + } default: throw new InvalidOperationException("Unknown image format."); @@ -255,9 +463,9 @@ private ReadOnlyMemory[] DecodeInternal(Stream stream, bool allMipM /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private ReadOnlyMemory[] DecodeInternal(KtxFile file, bool allMipMaps, CancellationToken token) + private Memory[] DecodeInternal(KtxFile file, bool allMipMaps, CancellationToken token) { - var colors = new ReadOnlyMemory[file.MipMaps.Count]; + var colors = new Memory[allMipMaps ? file.MipMaps.Count : 1]; var context = new OperationContext { @@ -319,9 +527,9 @@ private ReadOnlyMemory[] DecodeInternal(KtxFile file, bool allMipMa /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private ReadOnlyMemory[] DecodeInternal(DdsFile file, bool allMipMaps, CancellationToken token) + private Memory[] DecodeInternal(DdsFile file, bool allMipMaps, CancellationToken token) { - var colors = new ReadOnlyMemory[file.header.dwMipMapCount]; + var colors = new Memory[file.header.dwMipMapCount]; var context = new OperationContext { @@ -384,13 +592,13 @@ private ReadOnlyMemory[] DecodeInternal(DdsFile file, bool allMipMa /// /// Decode raw encoded image asynchronously. /// - /// The containing the encoded data. + /// The containing the encoded data. /// The width of the image. /// The height of the image. /// The Format the encoded data is in. /// The cancellation token for this operation. May be default, if the operation is not asynchronous. /// The decoded Rgba32 image. - private ReadOnlyMemory DecodeRawInternal(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token) + private Memory DecodeRawInternal(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token) { if (input.Length % GetBlockSize(format) != 0) { diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index bd4de76..74381bf 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -209,6 +209,27 @@ public Task EncodeToRawBytesAsync(Memory2D input, int mipLe return Task.Run(() => EncodeToRawInternal(input, mipLevel, out _, out _, token), token); } + public Task EncodeCubeMapToStreamAsync(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, Stream outputStream, CancellationToken token = default) + { + return Task.Run(() => EncodeCubeMapToStreamInternal(right, left, top, down, back, front, outputStream, token), token); + } + + public Task EncodeCubeMapToKtxAsync(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token = default) + { + return Task.Run(() => EncodeCubeMapToKtxInternal(right, left, top, down, back, front, token), token); + } + + public Task EncodeCubeMapToDdsAsync(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token = default) + { + return Task.Run(() => EncodeCubeMapToDdsInternal(right, left, top, down, back, front, token), token); + } + #endregion #region Sync Api @@ -334,6 +355,27 @@ public byte[] EncodeToRawBytes(ReadOnlyMemory2D input, int mipLevel return EncodeToRawInternal(input, mipLevel, out mipWidth, out mipHeight, default); } + public void EncodeCubeMapToStream(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, Stream outputStream) + { + EncodeCubeMapToStreamInternal(right, left, top, down, back, front, outputStream, default); + } + + public KtxFile EncodeCubeMapToKtx(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front) + { + return EncodeCubeMapToKtxInternal(right, left, top, down, back, front, default); + } + + public DdsFile EncodeCubeMapToDds(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front) + { + return EncodeCubeMapToDdsInternal(right, left, top, down, back, front, default); + } + #endregion #region MipMap operations diff --git a/BCnEnc.Net/Shared/Colors.cs b/BCnEnc.Net/Shared/Colors.cs index e6a11e7..1ccafdc 100644 --- a/BCnEnc.Net/Shared/Colors.cs +++ b/BCnEnc.Net/Shared/Colors.cs @@ -15,6 +15,14 @@ public ColorRgba32(byte r, byte g, byte b, byte a) this.a = a; } + public ColorRgba32(byte r, byte g, byte b) + { + this.r = r; + this.g = g; + this.b = b; + this.a = 255; + } + public bool Equals(ColorRgba32 other) { return r == other.r && g == other.g && b == other.b && a == other.a; @@ -163,15 +171,143 @@ public override int GetHashCode() ); } - //public static implicit operator ColorRgba32(ColorRgb24 d) => new ColorRgba32(d.r, d.g, d.b, 255); - public override string ToString() { return $"r : {r} g : {g} b : {b} a : {a}"; } + + internal readonly ColorRgbaFloat ToFloat() + { + return new ColorRgbaFloat(this); + } + } + + internal struct ColorRgbaFloat : IEquatable + { + public float r, g, b, a; + + public ColorRgbaFloat(float r, float g, float b, float a) + { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + public ColorRgbaFloat(ColorRgba32 other) + { + this.r = other.r / 255f; + this.g = other.g / 255f; + this.b = other.b / 255f; + this.a = other.a / 255f; + } + + public ColorRgbaFloat(float r, float g, float b) + { + this.r = r; + this.g = g; + this.b = b; + this.a = 1; + } + + public bool Equals(ColorRgbaFloat other) + { + return r == other.r && g == other.g && b == other.b && a == other.a; + } + + public override bool Equals(object obj) + { + return obj is ColorRgbaFloat other && Equals(other); + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = r.GetHashCode(); + hashCode = (hashCode * 397) ^ g.GetHashCode(); + hashCode = (hashCode * 397) ^ b.GetHashCode(); + hashCode = (hashCode * 397) ^ a.GetHashCode(); + return hashCode; + } + } + + public static bool operator ==(ColorRgbaFloat left, ColorRgbaFloat right) + { + return left.Equals(right); + } + + public static bool operator !=(ColorRgbaFloat left, ColorRgbaFloat right) + { + return !left.Equals(right); + } + + public static ColorRgbaFloat operator +(ColorRgbaFloat left, ColorRgbaFloat right) + { + return new ColorRgbaFloat( + left.r + right.r, + left.g + right.g, + left.b + right.b, + left.a + right.a); + } + + public static ColorRgbaFloat operator -(ColorRgbaFloat left, ColorRgbaFloat right) + { + return new ColorRgbaFloat( + left.r - right.r, + left.g - right.g, + left.b - right.b, + left.a - right.a); + } + + public static ColorRgbaFloat operator /(ColorRgbaFloat left, float right) + { + return new ColorRgbaFloat( + left.r / right, + left.g / right, + left.b / right, + left.a / right + ); + } + + public static ColorRgbaFloat operator *(ColorRgbaFloat left, float right) + { + return new ColorRgbaFloat( + left.r * right, + left.g * right, + left.b * right, + left.a * right + ); + } + + public static ColorRgbaFloat operator *(float left, ColorRgbaFloat right) + { + return new ColorRgbaFloat( + right.r * left, + right.g * left, + right.b * left, + right.a * left + ); + } + + public override string ToString() + { + return $"r : {r:0.00} g : {g:0.00} b : {b:0.00} a : {a:0.00}"; + } + + public ColorRgba32 ToRgba32() + { + return new ColorRgba32( + (byte)(ByteHelper.ClampToByte(r * 255)), + (byte)(ByteHelper.ClampToByte(g * 255)), + (byte)(ByteHelper.ClampToByte(b * 255)), + (byte)(ByteHelper.ClampToByte(a * 255)) + ); + } + } - public struct ColorYCbCr + internal struct ColorYCbCr { public float y; public float cb; @@ -228,7 +364,7 @@ public ColorYCbCr(Vector3 vec) cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } - internal ColorRgb565 ToColorRgb565() + public ColorRgb565 ToColorRgb565() { var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); @@ -237,6 +373,15 @@ internal ColorRgb565 ToColorRgb565() return new ColorRgb565((byte)(r * 255), (byte)(g * 255), (byte)(b * 255)); } + public ColorRgba32 ToColorRgba32() + { + var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); + var g = Math.Max(0.0f, Math.Min(1.0f, (float)(y - 0.3456 * cb - 0.7145 * cr))); + var b = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 1.7710 * cb + 0.0000 * cr))); + + return new ColorRgba32((byte)(r * 255), (byte)(g * 255), (byte)(b * 255), 255); + } + public override string ToString() { var r = Math.Max(0.0f, Math.Min(1.0f, (float)(y + 0.0000 * cb + 1.4022 * cr))); diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 0ec7d4a..e901f08 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -28,6 +28,7 @@ internal static ColorRgba32[] ColorsFromRawBlocks(RawBlock4X4Rgba32[,] blocks, i internal static ColorRgba32[] ColorsFromRawBlocks(RawBlock4X4Rgba32[] blocks, int pixelWidth, int pixelHeight) { + var blocksWidth = ((pixelWidth + 3) & ~3) >> 2; var output = new ColorRgba32[pixelWidth * pixelHeight]; for (var y = 0; y < pixelHeight; y++) @@ -39,7 +40,7 @@ internal static ColorRgba32[] ColorsFromRawBlocks(RawBlock4X4Rgba32[] blocks, in var blockInternalIndexX = x & 3; var blockInternalIndexY = y & 3; - var blockIndex = blockIndexX + blockIndexY * 4; + var blockIndex = blockIndexX + blockIndexY * blocksWidth; output[x + y * pixelWidth] = blocks[blockIndex][blockInternalIndexX, blockInternalIndexY]; } @@ -56,6 +57,7 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ReadOnlyMemory2D ima { blocksWidth = ((image.Width + 3) & ~3) >> 2; blocksHeight = ((image.Height + 3) & ~3) >> 2; + var output = new RawBlock4X4Rgba32[blocksWidth * blocksHeight]; var span = image.Span; diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index d40aae3..d7a4c03 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -35,7 +35,7 @@ public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory[mipChainLength]; - result[0] = pixels.AsMemory2D(width, height); + result[0] = pixels.AsMemory2D(height, width); // If only one mipmap was requested, return original image only if (numMipMaps == 1) @@ -52,10 +52,10 @@ public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory> mipLevel); + var mipHeight = Math.Max(1, height >> mipLevel); + + var newMip = ResizeToHalf(result[mipLevel - 1].Span); result[mipLevel] = newMip; // Stop generating if last generated mipmap was of size 1x1 @@ -84,8 +84,8 @@ public static int CalculateMipChainLength(int width, int height, int maxNumMipMa var output = 0; for (var mipLevel = 1; mipLevel < maxNumMipMaps; mipLevel++) { - var mipWidth = Math.Max(1, width / (int)Math.Pow(2, mipLevel)); - var mipHeight = Math.Max(1, height / (int)Math.Pow(2, mipLevel)); + var mipWidth = Math.Max(1, width >> mipLevel); + var mipHeight = Math.Max(1, height >> mipLevel); if (mipWidth == 1 && mipHeight == 1) { @@ -99,46 +99,33 @@ public static int CalculateMipChainLength(int width, int height, int maxNumMipMa public static void CalculateMipLevelSize(int width, int height, int mipIdx, out int mipWidth, out int mipHeight) { - mipWidth = width; - mipHeight = height; - - if (mipIdx == 0) - { - return; - } - - for (var mipLevel = 1; mipLevel < int.MaxValue; mipLevel++) - { - mipWidth = Math.Max(1, width / (int)Math.Pow(2, mipLevel)); - mipHeight = Math.Max(1, height / (int)Math.Pow(2, mipLevel)); - - if (mipLevel == mipIdx) - { - return; - } - - if (mipWidth == 1 && mipHeight == 1) - { - return; - } - } + mipWidth = Math.Max(1, width >> mipIdx); + mipHeight = Math.Max(1, height >> mipIdx); } - private static ColorRgba32[,] Resize(ReadOnlySpan2D pixelsRgba, int newWidth, int newHeight) + private static ColorRgba32[,] ResizeToHalf(ReadOnlySpan2D pixelsRgba) { - //TODO: Make better - var result = new ColorRgba32[newHeight, newWidth]; var oldWidth = pixelsRgba.Width; var oldHeight = pixelsRgba.Height; - - for (var x = 0; x < newWidth; x++) + var newWidth = Math.Max(1, oldWidth >> 1); + var newHeight = Math.Max(1, oldHeight >> 1); + + var result = new ColorRgba32[newHeight, newWidth]; + + int clampW(int x) => Math.Max(0, Math.Min(oldWidth - 1, x)); + int clampH(int y) => Math.Max(0, Math.Min(oldHeight - 1, y)); + + for (int y2 = 0; y2 < newHeight; y2++) { - for (var y = 0; y < newHeight; y++) + for (int x2 = 0; x2 < newWidth; x2++) { - var xOrig = (int)(x / (double)newWidth * oldWidth); - var yOrig = (int)(y / (double)newHeight * oldHeight); - result[y, x] = pixelsRgba[yOrig, xOrig]; + var xUL = pixelsRgba[clampH(y2 * 2), clampW(x2 * 2)].ToFloat(); + var xUR = pixelsRgba[clampH(y2 * 2), clampW(x2 * 2 + 1)].ToFloat(); + var xLL = pixelsRgba[clampH(y2 * 2 + 1), clampW(x2 * 2)].ToFloat(); + var xLR = pixelsRgba[clampH(y2 * 2 + 1), clampW(x2 * 2 + 1)].ToFloat(); + + result[y2, x2] = ((xUL + xUR + xLL + xLR) / 4).ToRgba32(); } } diff --git a/BCnEnc.Net/Shared/RawBlocks.cs b/BCnEnc.Net/Shared/RawBlocks.cs index af06d6c..98fbefb 100644 --- a/BCnEnc.Net/Shared/RawBlocks.cs +++ b/BCnEnc.Net/Shared/RawBlocks.cs @@ -24,7 +24,7 @@ public ColorRgba32 this[int index] set => AsSpan[index] = value; } - public int CalculateError(RawBlock4X4Rgba32 other, bool useAlpha = false) + internal int CalculateError(RawBlock4X4Rgba32 other, bool useAlpha = false) { float error = 0; var pix1 = AsSpan; @@ -55,7 +55,7 @@ public int CalculateError(RawBlock4X4Rgba32 other, bool useAlpha = false) return (int)error; } - public float CalculateYCbCrError(RawBlock4X4Rgba32 other) + internal float CalculateYCbCrError(RawBlock4X4Rgba32 other) { float yError = 0; float cbError = 0; @@ -81,7 +81,7 @@ public float CalculateYCbCrError(RawBlock4X4Rgba32 other) return error; } - public float CalculateYCbCrAlphaError(RawBlock4X4Rgba32 other, float yMultiplier = 2, float alphaMultiplier = 1) + internal float CalculateYCbCrAlphaError(RawBlock4X4Rgba32 other, float yMultiplier = 2, float alphaMultiplier = 1) { float yError = 0; float cbError = 0; @@ -109,7 +109,7 @@ public float CalculateYCbCrAlphaError(RawBlock4X4Rgba32 other, float yMultiplier return error; } - public RawBlock4X4Ycbcr ToRawBlockYcbcr() + internal RawBlock4X4Ycbcr ToRawBlockYcbcr() { var rawYcbcr = new RawBlock4X4Ycbcr(); var pixels = AsSpan; @@ -133,7 +133,7 @@ public bool HasTransparentPixels() } - public struct RawBlock4X4Ycbcr + internal struct RawBlock4X4Ycbcr { public ColorYCbCr p00, p10, p20, p30; public ColorYCbCr p01, p11, p21, p31; diff --git a/BCnEncTests/AtcTests.cs b/BCnEncTests/AtcTests.cs index e30e3f9..6f7a4d5 100644 --- a/BCnEncTests/AtcTests.cs +++ b/BCnEncTests/AtcTests.cs @@ -3,6 +3,7 @@ using BCnEncoder.Shared; using BCnEncTests.Support; using Xunit; +using BCnEncoder.NET.ImageSharp; namespace BCnEncTests { @@ -18,7 +19,7 @@ public void AtcKtxDecode() // Act var ktx = encoder.EncodeToKtx(original); - var image = decoder.Decode(ktx); + var image = decoder.DecodeToImageRgba32(ktx); // Assert TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); @@ -34,7 +35,7 @@ public void AtcDdsDecode() // Act var dds = encoder.EncodeToDds(original); - var image = decoder.Decode(dds); + var image = decoder.DecodeToImageRgba32(dds); // Assert TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); @@ -50,7 +51,7 @@ public void AtcExplicitKtxDecode() // Act var ktx = encoder.EncodeToKtx(original); - var image = decoder.Decode(ktx); + var image = decoder.DecodeToImageRgba32(ktx); // Assert TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); @@ -66,7 +67,7 @@ public void AtcExplicitDdsDecode() // Act var dds = encoder.EncodeToDds(original); - var image = decoder.Decode(dds); + var image = decoder.DecodeToImageRgba32(dds); // Assert TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); @@ -82,7 +83,7 @@ public void AtcInterpolatedKtxDecode() // Act var ktx = encoder.EncodeToKtx(original); - var image = decoder.Decode(ktx); + var image = decoder.DecodeToImageRgba32(ktx); // Assert TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); @@ -98,7 +99,7 @@ public void AtcInterpolatedDdsDecode() // Act var dds = encoder.EncodeToDds(original); - var image = decoder.Decode(dds); + var image = decoder.DecodeToImageRgba32(dds); // Assert TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); diff --git a/BCnEncTests/BC1Tests.cs b/BCnEncTests/BC1Tests.cs index ed4b176..92bf7b1 100644 --- a/BCnEncTests/BC1Tests.cs +++ b/BCnEncTests/BC1Tests.cs @@ -1,6 +1,7 @@ using BCnEncoder.Shared; using SixLabors.ImageSharp.PixelFormats; using Xunit; +using BCnEncoder.NET.ImageSharp; namespace BCnEncTests { @@ -37,25 +38,25 @@ public void Decode() { block[15] = 0; var raw = block.Decode(false); - Assert.Equal(new Rgba32(0, 0, 0), raw.p00); - Assert.Equal(new Rgba32(0, 0, 0), raw.p10); - Assert.Equal(new Rgba32(0, 0, 0), raw.p20); - Assert.Equal(new Rgba32(0, 0, 0), raw.p30); - - Assert.Equal(new Rgba32(85, 85, 85), raw.p01); - Assert.Equal(new Rgba32(85, 85, 85), raw.p11); - Assert.Equal(new Rgba32(85, 85, 85), raw.p21); - Assert.Equal(new Rgba32(85, 85, 85), raw.p31); - - Assert.Equal(new Rgba32(170, 170, 170), raw.p02); - Assert.Equal(new Rgba32(170, 170, 170), raw.p12); - Assert.Equal(new Rgba32(170, 170, 170), raw.p22); - Assert.Equal(new Rgba32(170, 170, 170), raw.p32); - - Assert.Equal(new Rgba32(255, 255, 255), raw.p03); - Assert.Equal(new Rgba32(255, 255, 255), raw.p13); - Assert.Equal(new Rgba32(255, 255, 255), raw.p23); - Assert.Equal(new Rgba32(255, 255, 255), raw.p33); + Assert.Equal(new ColorRgba32(0, 0, 0), raw.p00); + Assert.Equal(new ColorRgba32(0, 0, 0), raw.p10); + Assert.Equal(new ColorRgba32(0, 0, 0), raw.p20); + Assert.Equal(new ColorRgba32(0, 0, 0), raw.p30); + + Assert.Equal(new ColorRgba32(85, 85, 85), raw.p01); + Assert.Equal(new ColorRgba32(85, 85, 85), raw.p11); + Assert.Equal(new ColorRgba32(85, 85, 85), raw.p21); + Assert.Equal(new ColorRgba32(85, 85, 85), raw.p31); + + Assert.Equal(new ColorRgba32(170, 170, 170), raw.p02); + Assert.Equal(new ColorRgba32(170, 170, 170), raw.p12); + Assert.Equal(new ColorRgba32(170, 170, 170), raw.p22); + Assert.Equal(new ColorRgba32(170, 170, 170), raw.p32); + + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p03); + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p13); + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p23); + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p33); } [Fact] @@ -88,25 +89,25 @@ public void DecodeBlack() { block[15] = 1; var raw = block.Decode(false); - Assert.Equal(new Rgba32(206, 203, 206), raw.p00); - Assert.Equal(new Rgba32(206, 203, 206), raw.p10); - Assert.Equal(new Rgba32(206, 203, 206), raw.p20); - Assert.Equal(new Rgba32(206, 203, 206), raw.p30); - - Assert.Equal(new Rgba32(0, 0, 0), raw.p01); - Assert.Equal(new Rgba32(0, 0, 0), raw.p11); - Assert.Equal(new Rgba32(0, 0, 0), raw.p21); - Assert.Equal(new Rgba32(0, 0, 0), raw.p31); - - Assert.Equal(new Rgba32(230, 229, 230), raw.p02); - Assert.Equal(new Rgba32(230, 229, 230), raw.p12); - Assert.Equal(new Rgba32(230, 229, 230), raw.p22); - Assert.Equal(new Rgba32(230, 229, 230), raw.p32); - - Assert.Equal(new Rgba32(255, 255, 255), raw.p03); - Assert.Equal(new Rgba32(255, 255, 255), raw.p13); - Assert.Equal(new Rgba32(255, 255, 255), raw.p23); - Assert.Equal(new Rgba32(255, 255, 255), raw.p33); + Assert.Equal(new ColorRgba32(206, 203, 206), raw.p00); + Assert.Equal(new ColorRgba32(206, 203, 206), raw.p10); + Assert.Equal(new ColorRgba32(206, 203, 206), raw.p20); + Assert.Equal(new ColorRgba32(206, 203, 206), raw.p30); + + Assert.Equal(new ColorRgba32(0, 0, 0), raw.p01); + Assert.Equal(new ColorRgba32(0, 0, 0), raw.p11); + Assert.Equal(new ColorRgba32(0, 0, 0), raw.p21); + Assert.Equal(new ColorRgba32(0, 0, 0), raw.p31); + + Assert.Equal(new ColorRgba32(230, 229, 230), raw.p02); + Assert.Equal(new ColorRgba32(230, 229, 230), raw.p12); + Assert.Equal(new ColorRgba32(230, 229, 230), raw.p22); + Assert.Equal(new ColorRgba32(230, 229, 230), raw.p32); + + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p03); + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p13); + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p23); + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p33); } [Fact] @@ -139,25 +140,25 @@ public void DecodeAlpha() { block[15] = 1; var raw = block.Decode(true); - Assert.Equal(new Rgba32(206, 203, 206), raw.p00); - Assert.Equal(new Rgba32(206, 203, 206), raw.p10); - Assert.Equal(new Rgba32(206, 203, 206), raw.p20); - Assert.Equal(new Rgba32(206, 203, 206), raw.p30); - - Assert.Equal(new Rgba32(0,0,0,0), raw.p01); - Assert.Equal(new Rgba32(0,0,0,0), raw.p11); - Assert.Equal(new Rgba32(0,0,0,0), raw.p21); - Assert.Equal(new Rgba32(0,0,0,0), raw.p31); - - Assert.Equal(new Rgba32(230, 229, 230), raw.p02); - Assert.Equal(new Rgba32(230, 229, 230), raw.p12); - Assert.Equal(new Rgba32(230, 229, 230), raw.p22); - Assert.Equal(new Rgba32(230, 229, 230), raw.p32); - - Assert.Equal(new Rgba32(255, 255, 255), raw.p03); - Assert.Equal(new Rgba32(255, 255, 255), raw.p13); - Assert.Equal(new Rgba32(255, 255, 255), raw.p23); - Assert.Equal(new Rgba32(255, 255, 255), raw.p33); + Assert.Equal(new ColorRgba32(206, 203, 206), raw.p00); + Assert.Equal(new ColorRgba32(206, 203, 206), raw.p10); + Assert.Equal(new ColorRgba32(206, 203, 206), raw.p20); + Assert.Equal(new ColorRgba32(206, 203, 206), raw.p30); + + Assert.Equal(new ColorRgba32(0,0,0,0), raw.p01); + Assert.Equal(new ColorRgba32(0,0,0,0), raw.p11); + Assert.Equal(new ColorRgba32(0,0,0,0), raw.p21); + Assert.Equal(new ColorRgba32(0,0,0,0), raw.p31); + + Assert.Equal(new ColorRgba32(230, 229, 230), raw.p02); + Assert.Equal(new ColorRgba32(230, 229, 230), raw.p12); + Assert.Equal(new ColorRgba32(230, 229, 230), raw.p22); + Assert.Equal(new ColorRgba32(230, 229, 230), raw.p32); + + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p03); + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p13); + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p23); + Assert.Equal(new ColorRgba32(255, 255, 255), raw.p33); } } } diff --git a/BCnEncTests/BCnEncTests.csproj b/BCnEncTests/BCnEncTests.csproj index 9770be3..22b08b5 100644 --- a/BCnEncTests/BCnEncTests.csproj +++ b/BCnEncTests/BCnEncTests.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1 @@ -15,6 +15,7 @@ + diff --git a/BCnEncTests/Bc5Tests.cs b/BCnEncTests/Bc5Tests.cs index 798ecae..fc40dff 100644 --- a/BCnEncTests/Bc5Tests.cs +++ b/BCnEncTests/Bc5Tests.cs @@ -3,6 +3,7 @@ using System.IO; using System.Text; using BCnEncoder.Decoder; +using BCnEncoder.NET.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using SixLabors.ImageSharp; @@ -38,7 +39,7 @@ public void Bc5Indices() public void Bc5DdsDecode() { var reference = ImageLoader.TestDecodingBc5Reference; - var decoded = new BcDecoder().Decode(DdsLoader.TestDecompressBc5); + var decoded = new BcDecoder().DecodeToImageRgba32(DdsLoader.TestDecompressBc5); reference.TryGetSinglePixelSpan(out var refSpan); decoded.TryGetSinglePixelSpan(out var decSpan); @@ -62,22 +63,22 @@ public void Bc5BlockDecode() var referenceBlock = new RawBlock4X4Rgba32 { - p00 = new Rgba32(13, 53, 0, 255), - p01 = new Rgba32(136, 238, 0, 255), - p02 = new Rgba32(255, 212, 0, 255), - p03 = new Rgba32(167, 238, 0, 255), - p10 = new Rgba32(13, 53, 0, 255), - p11 = new Rgba32(136, 238, 0, 255), - p12 = new Rgba32(167, 238, 0, 255), - p13 = new Rgba32(75, 185, 0, 255), - p20 = new Rgba32(255, 212, 0, 255), - p21 = new Rgba32(167, 238, 0, 255), - p22 = new Rgba32(13, 53, 0, 255), - p23 = new Rgba32(75, 159, 0, 255), - p30 = new Rgba32(167, 238, 0, 255), - p31 = new Rgba32(75, 185, 0, 255), - p32 = new Rgba32(13, 53, 0, 255), - p33 = new Rgba32(75, 159, 0, 255) + p00 = new ColorRgba32(13, 53, 0, 255), + p01 = new ColorRgba32(136, 238, 0, 255), + p02 = new ColorRgba32(255, 212, 0, 255), + p03 = new ColorRgba32(167, 238, 0, 255), + p10 = new ColorRgba32(13, 53, 0, 255), + p11 = new ColorRgba32(136, 238, 0, 255), + p12 = new ColorRgba32(167, 238, 0, 255), + p13 = new ColorRgba32(75, 185, 0, 255), + p20 = new ColorRgba32(255, 212, 0, 255), + p21 = new ColorRgba32(167, 238, 0, 255), + p22 = new ColorRgba32(13, 53, 0, 255), + p23 = new ColorRgba32(75, 159, 0, 255), + p30 = new ColorRgba32(167, 238, 0, 255), + p31 = new ColorRgba32(75, 185, 0, 255), + p32 = new ColorRgba32(13, 53, 0, 255), + p33 = new ColorRgba32(75, 159, 0, 255) }; var decodedBlock = block.Decode(); diff --git a/BCnEncTests/Bc7BlockTests.cs b/BCnEncTests/Bc7BlockTests.cs index 89832c9..40900b9 100644 --- a/BCnEncTests/Bc7BlockTests.cs +++ b/BCnEncTests/Bc7BlockTests.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; using Xunit; namespace BCnEncTests diff --git a/BCnEncTests/BgraTests.cs b/BCnEncTests/BgraTests.cs index 72147d3..17458ca 100644 --- a/BCnEncTests/BgraTests.cs +++ b/BCnEncTests/BgraTests.cs @@ -1,5 +1,6 @@ using BCnEncoder.Decoder; using BCnEncoder.Encoder; +using BCnEncoder.NET.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using Xunit; @@ -18,7 +19,9 @@ public void BgraDdsDecode() // Act var dds = encoder.EncodeToDds(original); - var image = decoder.Decode(dds); + var image = decoder.DecodeToImageRgba32(dds); + + // Assert TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); @@ -34,7 +37,39 @@ public void BgraAlphaDdsDecode() // Act var dds = encoder.EncodeToDds(original); - var image = decoder.Decode(dds); + var image = decoder.DecodeToImageRgba32(dds); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } + + [Fact] + public void BgraKtxDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.Bgra); + var original = ImageLoader.TestLenna; + + // Act + var ktx = encoder.EncodeToKtx(original); + var image = decoder.DecodeToImageRgba32(ktx); + + // Assert + TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); + } + + [Fact] + public void BgraAlphaKtxDecode() + { + // Arrange + var decoder = new BcDecoder(); + var encoder = new BcEncoder(CompressionFormat.Bgra); + var original = ImageLoader.TestAlphaGradient1; + + // Act + var ktx = encoder.EncodeToKtx(original); + var image = decoder.DecodeToImageRgba32(ktx); // Assert TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); diff --git a/BCnEncTests/BlockTests.cs b/BCnEncTests/BlockTests.cs index 0aaa8de..25bb89f 100644 --- a/BCnEncTests/BlockTests.cs +++ b/BCnEncTests/BlockTests.cs @@ -1,5 +1,6 @@ using System; using BCnEncoder.Shared; +using Microsoft.Toolkit.HighPerformance.Extensions; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using Xunit; @@ -11,9 +12,9 @@ public class BlockTests [Fact] public void CreateBlocksExact() { - using var testImage = new Image(16, 16); + var testImage = new ColorRgba32[16, 16]; - var blocks = ImageToBlocks.ImageTo4X4(testImage.Frames[0], out var blocksWidth, out var blocksHeight); + var blocks = ImageToBlocks.ImageTo4X4(testImage, out var blocksWidth, out var blocksHeight); Assert.Equal(16, blocks.Length); Assert.Equal(4, blocksWidth); @@ -23,9 +24,9 @@ public void CreateBlocksExact() [Fact] public void CreateBlocksPadding() { - using var testImage = new Image(11, 15); + var testImage = new ColorRgba32[15, 11]; - var blocks = ImageToBlocks.ImageTo4X4(testImage.Frames[0], out var blocksWidth, out var blocksHeight); + var blocks = ImageToBlocks.ImageTo4X4(testImage, out var blocksWidth, out var blocksHeight); Assert.Equal(12, blocks.Length); Assert.Equal(3, blocksWidth); @@ -35,25 +36,24 @@ public void CreateBlocksPadding() [Fact] public void PaddingColor() { - using var testImage = new Image(13, 13); + var testImage = new ColorRgba32[15, 11]; - if (!testImage.TryGetSinglePixelSpan(out var pixels)) { - throw new Exception("Cannot get pixel span."); - } + var pixels = testImage.AsSpan(); + for (var i = 0; i < pixels.Length; i++) { - pixels[i] = new Rgba32(0, 125, 125); + pixels[i] = new ColorRgba32(0, 125, 125); } - var blocks = ImageToBlocks.ImageTo4X4(testImage.Frames[0], out var blocksWidth, out var blocksHeight); + var blocks = ImageToBlocks.ImageTo4X4(testImage, out var blocksWidth, out var blocksHeight); - Assert.Equal(16, blocks.Length); - Assert.Equal(4, blocksWidth); + Assert.Equal(12, blocks.Length); + Assert.Equal(3, blocksWidth); Assert.Equal(4, blocksHeight); for (var x = 0; x < blocksWidth; x++) { for (var y = 0; y < blocksHeight; y++) { foreach (var color in blocks[x + y * blocksWidth].AsSpan) { - Assert.Equal(new Rgba32(0, 125, 125), color); + Assert.Equal(new ColorRgba32(0, 125, 125), color); } } } @@ -63,30 +63,27 @@ public void PaddingColor() public void BlocksToImage() { var r = new Random(0); - using var testImage = new Image(16, 16); + var testImage = new ColorRgba32[16, 16]; - if (!testImage.TryGetSinglePixelSpan(out var pixels)) { - throw new Exception("Cannot get pixel span."); - } + var pixels = testImage.AsSpan(); + for (var i = 0; i < pixels.Length; i++) { - pixels[i] = new Rgba32( + pixels[i] = new ColorRgba32( (byte)r.Next(255), (byte)r.Next(255), (byte)r.Next(255), (byte)r.Next(255)); } - var blocks = ImageToBlocks.ImageTo4X4(testImage.Frames[0], out var blocksWidth, out var blocksHeight); + var blocks = ImageToBlocks.ImageTo4X4(testImage, out var blocksWidth, out var blocksHeight); Assert.Equal(16, blocks.Length); Assert.Equal(4, blocksWidth); Assert.Equal(4, blocksHeight); - using var output = ImageToBlocks.ImageFromRawBlocks(blocks, blocksWidth, blocksHeight); - - if (!output.TryGetSinglePixelSpan(out var pixels2)) { - throw new Exception("Cannot get pixel span."); - } + var output = ImageToBlocks.ColorsFromRawBlocks(blocks, 16, 16); + + var pixels2 = output.AsSpan(); Assert.Equal(pixels.Length, pixels2.Length); for (var i = 0; i < pixels.Length; i++) { @@ -97,9 +94,9 @@ public void BlocksToImage() [Fact] public void BlockError() { - using var testImage = new Image(16, 16); + var testImage = new ColorRgba32[16, 16]; - var blocks = ImageToBlocks.ImageTo4X4(testImage.Frames[0], out var blocksWidth, out var blocksHeight); + var blocks = ImageToBlocks.ImageTo4X4(testImage, out var blocksWidth, out var blocksHeight); var block1 = blocks[2 + 2 * blocksWidth]; var block2 = blocks[2 + 2 * blocksWidth]; @@ -107,12 +104,12 @@ public void BlockError() Assert.Equal(0, block1.CalculateError(block2)); for (var i = 0; i < block2.AsSpan.Length; i++) { - block2.AsSpan[i].R = (byte) (block2.AsSpan[i].R + 2); + block2.AsSpan[i].r = (byte) (block2.AsSpan[i].r + 2); } Assert.Equal(2, block1.CalculateError(block2)); for (var i = 0; i < block2.AsSpan.Length; i++) { - block2.AsSpan[i].G = (byte) (block2.AsSpan[i].R + 20); + block2.AsSpan[i].g = (byte) (block2.AsSpan[i].r + 20); } Assert.Equal(22, block1.CalculateError(block2)); } diff --git a/BCnEncTests/ClusterTests.cs b/BCnEncTests/ClusterTests.cs index 1aaac14..80c8420 100644 --- a/BCnEncTests/ClusterTests.cs +++ b/BCnEncTests/ClusterTests.cs @@ -1,8 +1,10 @@ using System; using System.IO; +using System.Runtime.InteropServices; using BCnEncoder.Shared; using BCnEncTests.Support; using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; using Xunit; namespace BCnEncTests @@ -14,11 +16,13 @@ public void Clusterize() { var testImage = ImageLoader.TestBlur1; - if (!testImage.TryGetSinglePixelSpan(out var pixels)) + if (!testImage.TryGetSinglePixelSpan(out var pix)) { throw new Exception("Cannot get pixel span."); } + var pixels = MemoryMarshal.Cast(pix).ToArray(); + var numClusters = (testImage.Width / 32) * (testImage.Height / 32); var clusters = LinearClustering.ClusterPixels(pixels, testImage.Width, testImage.Height, numClusters, 10, 10); @@ -38,7 +42,7 @@ public void Clusterize() for (var i = 0; i < pixels.Length; i++) { - pixels[i] = pixC[clusters[i]].ToRgba32(); + pixels[i] = pixC[clusters[i]].ToColorRgba32(); } using var fs = File.OpenWrite("test_cluster.png"); diff --git a/BCnEncTests/DdsReadTests.cs b/BCnEncTests/DdsReadTests.cs index 61897a2..b86b6f3 100644 --- a/BCnEncTests/DdsReadTests.cs +++ b/BCnEncTests/DdsReadTests.cs @@ -1,6 +1,8 @@ using System.IO; using BCnEncoder.Decoder; +using BCnEncoder.NET.ImageSharp; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; using BCnEncTests.Support; using SixLabors.ImageSharp; using Xunit; @@ -39,7 +41,7 @@ public void ReadFromStream() using var fs = File.OpenRead(DdsLoader.TestDecompressBc1Name); var decoder = new BcDecoder(); - var images = decoder.DecodeAllMipMaps(fs); + var images = decoder.DecodeAllMipMapsToImageRgba32(fs); for (var i = 0; i < images.Length; i++) { diff --git a/BCnEncTests/DecodingAsyncTests.cs b/BCnEncTests/DecodingAsyncTests.cs index 0dca966..1509719 100644 --- a/BCnEncTests/DecodingAsyncTests.cs +++ b/BCnEncTests/DecodingAsyncTests.cs @@ -1,6 +1,8 @@ using System.ComponentModel.DataAnnotations; +using System.IO; using BCnEncoder.Decoder; using BCnEncoder.Encoder; +using BCnEncoder.NET.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using Xunit; @@ -17,7 +19,7 @@ public async void DecodeAsync() var original = ImageLoader.TestGradient1; var file = encoder.EncodeToKtx(original); - var image = await decoder.DecodeAsync(file); + var image = await decoder.DecodeToImageRgba32Async(file); TestHelper.AssertImagesEqual(original, image,encoder.OutputOptions.Quality); image.Dispose(); @@ -31,7 +33,7 @@ public async void DecodeAllMipMapsAsync() var original = ImageLoader.TestGradient1; var file = encoder.EncodeToKtx(original); - var images = await decoder.DecodeAllMipMapsAsync(file); + var images = await decoder.DecodeAllMipMapsToImageRgba32Async(file); TestHelper.AssertImagesEqual(original, images[0], encoder.OutputOptions.Quality); foreach(var img in images) @@ -46,8 +48,11 @@ public async void DecodeRawAsync() var original = ImageLoader.TestGradient1; var file = encoder.EncodeToKtx(original); - var image = await decoder.DecodeRawAsync(file.MipMaps[0].Faces[0].Data, CompressionFormat.Bc1, - (int) file.MipMaps[0].Width, (int) file.MipMaps[0].Height); + + MemoryStream ms = new MemoryStream(file.MipMaps[0].Faces[0].Data); + + var image = await decoder.DecodeRawToImageRgba32Async(ms, + (int) file.MipMaps[0].Width, (int) file.MipMaps[0].Height, CompressionFormat.Bc1); TestHelper.AssertImagesEqual(original, image, encoder.OutputOptions.Quality); image.Dispose(); diff --git a/BCnEncTests/EncodingAsyncTest.cs b/BCnEncTests/EncodingAsyncTest.cs index d1e5b12..1582de6 100644 --- a/BCnEncTests/EncodingAsyncTest.cs +++ b/BCnEncTests/EncodingAsyncTest.cs @@ -1,5 +1,6 @@ using BCnEncoder.Decoder; using BCnEncoder.Encoder; +using BCnEncoder.NET.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using SixLabors.ImageSharp; @@ -27,7 +28,7 @@ public EncodingAsyncTest() public async void EncodeToDdsAsync() { var file = await encoder.EncodeToDdsAsync(originalImage); - var image = decoder.Decode(file); + var image = decoder.DecodeToImageRgba32(file); TestHelper.AssertImagesEqual(originalImage, image, encoder.OutputOptions.Quality); image.Dispose(); @@ -37,7 +38,7 @@ public async void EncodeToDdsAsync() public async void EncodeToKtxAsync() { var file = await encoder.EncodeToKtxAsync(originalImage); - var image = decoder.Decode(file); + var image = decoder.DecodeToImageRgba32(file); TestHelper.AssertImagesEqual(originalImage, image, encoder.OutputOptions.Quality); image.Dispose(); @@ -51,7 +52,7 @@ public async void EncodeCubemapToDdsAsync() for (var i = 0; i < 6; i++) { - var image = decoder.DecodeRaw(file.Faces[i].MipMaps[0].Data, CompressionFormat.Bc1, (int)file.Faces[i].Width, (int)file.Faces[i].Height); + var image = decoder.DecodeRawToImageRgba32(file.Faces[i].MipMaps[0].Data, (int)file.Faces[i].Width, (int)file.Faces[i].Height, CompressionFormat.Bc1); TestHelper.AssertImagesEqual(originalCubeMap[i], image, encoder.OutputOptions.Quality); image.Dispose(); @@ -66,7 +67,7 @@ public async void EncodeCubemapToKtxAsync() for (var i = 0; i < 6; i++) { - var image = decoder.DecodeRaw(file.MipMaps[0].Faces[i].Data, CompressionFormat.Bc1, (int)file.MipMaps[0].Faces[i].Width, (int)file.MipMaps[0].Faces[i].Height); + var image = decoder.DecodeRawToImageRgba32(file.MipMaps[0].Faces[i].Data, (int)file.MipMaps[0].Faces[i].Width, (int)file.MipMaps[0].Faces[i].Height, CompressionFormat.Bc1); TestHelper.AssertImagesEqual(originalCubeMap[i], image, encoder.OutputOptions.Quality); image.Dispose(); @@ -77,7 +78,7 @@ public async void EncodeCubemapToKtxAsync() public async void EncodeToRawBytesAsync() { var data = await encoder.EncodeToRawBytesAsync(originalImage); - var image = decoder.DecodeRaw(data[0], CompressionFormat.Bc1, originalImage.Width, originalImage.Height); + var image = decoder.DecodeRawToImageRgba32(data[0], originalImage.Width, originalImage.Height, CompressionFormat.Bc1); TestHelper.AssertImagesEqual(originalImage, image, encoder.OutputOptions.Quality); image.Dispose(); diff --git a/BCnEncTests/EncodingTest.cs b/BCnEncTests/EncodingTest.cs index 920b16d..1071d14 100644 --- a/BCnEncTests/EncodingTest.cs +++ b/BCnEncTests/EncodingTest.cs @@ -1,5 +1,6 @@ using System.IO; using BCnEncoder.Encoder; +using BCnEncoder.NET.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using Xunit; @@ -494,7 +495,7 @@ public void WriteCubeMapFile() encoder.OutputOptions.Format = CompressionFormat.Bc1; using var fs = File.OpenWrite(filename); - encoder.EncodeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], fs); + encoder.EncodeCubeMapToStream(images[0], images[1], images[2], images[3], images[4], images[5], fs); } } } diff --git a/BCnEncTests/RawTests.cs b/BCnEncTests/RawTests.cs index 776bb36..70c89b5 100644 --- a/BCnEncTests/RawTests.cs +++ b/BCnEncTests/RawTests.cs @@ -1,6 +1,7 @@ using System.IO; using BCnEncoder.Decoder; using BCnEncoder.Encoder; +using BCnEncoder.NET.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using SixLabors.ImageSharp.Processing; @@ -21,7 +22,7 @@ public void EncodeDecode() }; var encodedRawBytes = encoder.EncodeToRawBytes(inputImage); - var decodedImage = decoder.DecodeRaw(encodedRawBytes[0], CompressionFormat.Bc1, inputImage.Width, inputImage.Height); + var decodedImage = decoder.DecodeRawToImageRgba32(encodedRawBytes[0], inputImage.Width, inputImage.Height, CompressionFormat.Bc1); ImageLoader.TestGradient1.TryGetSinglePixelSpan(out var originalPixels); decodedImage.TryGetSinglePixelSpan(out var decodedPixels); @@ -45,7 +46,7 @@ public void EncodeDecodeStream() Assert.Equal(0, ms.Position); - var decodedImage = decoder.DecodeRaw(ms, CompressionFormat.Bc1, inputImage.Width, inputImage.Height); + var decodedImage = decoder.DecodeRawToImageRgba32(ms, inputImage.Width, inputImage.Height, CompressionFormat.Bc1); inputImage.TryGetSinglePixelSpan(out var originalPixels); decodedImage.TryGetSinglePixelSpan(out var decodedPixels); @@ -89,7 +90,7 @@ public void EncodeDecodeAllMipMapsStream() encoder.CalculateMipMapSize(inputImage, i, out var mipWidth, out var mipHeight); using var resized = inputImage.Clone(x => x.Resize(mipWidth, mipHeight)); - var decodedImage = decoder.DecodeRaw(ms, CompressionFormat.Bc1, mipWidth, mipHeight); + var decodedImage = decoder.DecodeRawToImageRgba32(ms, mipWidth, mipHeight, CompressionFormat.Bc1); resized.TryGetSinglePixelSpan(out var originalPixels); decodedImage.TryGetSinglePixelSpan(out var decodedPixels); diff --git a/BCnEncTests/Support/ImageLoader.cs b/BCnEncTests/Support/ImageLoader.cs index 4870d4d..412a519 100644 --- a/BCnEncTests/Support/ImageLoader.cs +++ b/BCnEncTests/Support/ImageLoader.cs @@ -1,5 +1,6 @@ using System.IO; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; diff --git a/BCnEncTests/Support/TestHelper.cs b/BCnEncTests/Support/TestHelper.cs index 2f77215..15df85a 100644 --- a/BCnEncTests/Support/TestHelper.cs +++ b/BCnEncTests/Support/TestHelper.cs @@ -1,9 +1,11 @@ using System; using System.IO; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using BCnEncoder.Decoder; using BCnEncoder.Encoder; +using BCnEncoder.NET.ImageSharp; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; using SixLabors.ImageSharp; @@ -19,7 +21,9 @@ public static class TestHelper public static void AssertPixelsEqual(Span originalPixels, Span pixels, CompressionQuality quality) { - var psnr = ImageQuality.PeakSignalToNoiseRatio(originalPixels, pixels); + var psnr = ImageQuality.PeakSignalToNoiseRatio( + MemoryMarshal.Cast(originalPixels), + MemoryMarshal.Cast(pixels)); AssertPSNR(psnr, quality); } @@ -39,7 +43,7 @@ public static void ExecuteDecodingTest(KtxFile file, string outputFile) Assert.Equal((uint)1, file.header.NumberOfFaces); var decoder = new BcDecoder(); - using var image = decoder.Decode(file); + using var image = decoder.DecodeToImageRgba32(file); Assert.Equal((uint)image.Width, file.header.PixelWidth); Assert.Equal((uint)image.Height, file.header.PixelHeight); @@ -67,11 +71,11 @@ public static void ExecuteDdsWritingTest(Image[] images, CompressionForm if (images.Length == 1) { - encoder.Encode(images[0], fs); + encoder.EncodeToStream(images[0], fs); } else { - encoder.EncodeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], fs); + encoder.EncodeCubeMapToStream(images[0], images[1], images[2], images[3], images[4], images[5], fs); } } @@ -82,7 +86,7 @@ public static void ExecuteDdsReadingTest(DdsFile file, DxgiFormat format, string var decoder = new BcDecoder(); decoder.InputOptions.DdsBc1ExpectAlpha = assertAlpha; - var images = decoder.DecodeAllMipMaps(file); + var images = decoder.DecodeAllMipMapsToImageRgba32(file); Assert.Equal((uint)images[0].Width, file.header.dwWidth); Assert.Equal((uint)images[0].Height, file.header.dwHeight); @@ -128,7 +132,7 @@ public static float DecodeCheckPSNR(string filename, Image original) using var fs = File.OpenRead(filename); var ktx = KtxFile.Load(fs); var decoder = new BcDecoder(); - using var img = decoder.Decode(ktx); + using var img = decoder.DecodeToImageRgba32(ktx); return CalculatePSNR(original, img); } @@ -141,7 +145,7 @@ public static void ExecuteEncodingTest(Image image, CompressionFormat fo encoder.OutputOptions.Format = format; var fs = File.OpenWrite(filename); - encoder.Encode(image, fs); + encoder.EncodeToStream(image, fs); fs.Close(); var psnr = DecodeCheckPSNR(filename, image); @@ -159,8 +163,10 @@ private static float CalculatePSNR(Image original, Image decoded { throw new Exception("Cannot get pixel span."); } - - return ImageQuality.PeakSignalToNoiseRatio(pixels, pixels2); + + return ImageQuality.PeakSignalToNoiseRatio( + MemoryMarshal.Cast(pixels), + MemoryMarshal.Cast(pixels2)); } private static void AssertPSNR(float psnr, CompressionQuality quality) diff --git a/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs b/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs new file mode 100644 index 0000000..9c92f81 --- /dev/null +++ b/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs @@ -0,0 +1,258 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using BCnEncoder.Decoder; +using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; +using Microsoft.Toolkit.HighPerformance.Extensions; +using Microsoft.Toolkit.HighPerformance.Memory; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Advanced; +using SixLabors.ImageSharp.PixelFormats; + +namespace BCnEncoder.NET.ImageSharp +{ + public static class BCnDecoderExtensions + { + + /// + /// Decode raw encoded image data. + /// + /// The stream containing the encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The decoded Rgba32 image. + public static Image DecodeRawToImageRgba32(this BcDecoder decoder, Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) + { + return ColorMemoryToImage(decoder.DecodeRaw2D(inputStream, pixelWidth, pixelHeight, format)); + } + + /// + /// Decode raw encoded image data. + /// + /// The array containing the encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The decoded Rgba32 image. + public static Image DecodeRawToImageRgba32(this BcDecoder decoder, byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) + { + return ColorMemoryToImage(decoder.DecodeRaw2D(input, pixelWidth, pixelHeight, format)); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The stream that contains either ktx or dds file. + /// The decoded Rgba32 image. + public static Image DecodeToImageRgba32(this BcDecoder decoder, Stream inputStream) + { + return ColorMemoryToImage(decoder.Decode2D(inputStream)); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The stream that contains either ktx or dds file. + /// An array of decoded Rgba32 images. + public static Image[] DecodeAllMipMapsToImageRgba32(this BcDecoder decoder, Stream inputStream) + { + var decoded = decoder.DecodeAllMipMaps2D(inputStream); + var output = new Image[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + output[i] = ColorMemoryToImage(decoded[i]); + } + return output; + } + + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The decoded Rgba32 image. + public static Image DecodeToImageRgba32(this BcDecoder decoder, KtxFile file) + { + return ColorMemoryToImage(decoder.Decode2D(file)); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// An array of decoded Rgba32 images. + public static Image[] DecodeAllMipMapsToImageRgba32(this BcDecoder decoder, KtxFile file) + { + var decoded = decoder.DecodeAllMipMaps2D(file); + var output = new Image[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + output[i] = ColorMemoryToImage(decoded[i]); + } + return output; + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The decoded Rgba32 image. + public static Image DecodeToImageRgba32(this BcDecoder decoder, DdsFile file) + { + return ColorMemoryToImage(decoder.Decode2D(file)); + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// An array of decoded Rgba32 images. + public static Image[] DecodeAllMipMapsToImageRgba32(this BcDecoder decoder, DdsFile file) + { + var decoded = decoder.DecodeAllMipMaps2D(file); + var output = new Image[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + output[i] = ColorMemoryToImage(decoded[i]); + } + return output; + } + + + + /// + /// Decode raw encoded image data. + /// + /// The stream containing the encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The cancellation token for this asynchronous operation. + /// The decoded Rgba32 image. + public static async Task> DecodeRawToImageRgba32Async(this BcDecoder decoder, Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token = default) + { + return ColorMemoryToImage(await decoder.DecodeRaw2DAsync(inputStream, pixelWidth, pixelHeight, format, token)); + } + + /// + /// Decode raw encoded image data. + /// + /// The array containing the encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The cancellation token for this asynchronous operation. + /// The decoded Rgba32 image. + public static async Task> DecodeRawToImageRgba32Async(this BcDecoder decoder, byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token = default) + { + return ColorMemoryToImage(await decoder.DecodeRaw2DAsync(input, pixelWidth, pixelHeight, format, token)); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The stream that contains either ktx or dds file. + /// The cancellation token for this asynchronous operation. + /// The decoded Rgba32 image. + public static async Task> DecodeToImageRgba32Async(this BcDecoder decoder, Stream inputStream, CancellationToken token = default) + { + return ColorMemoryToImage(await decoder.Decode2DAsync(inputStream, token)); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The stream that contains either ktx or dds file. + /// The cancellation token for this asynchronous operation. + /// An array of decoded Rgba32 images. + public static async Task[]> DecodeAllMipMapsToImageRgba32Async(this BcDecoder decoder, Stream inputStream, CancellationToken token = default) + { + var decoded = await decoder.DecodeAllMipMaps2DAsync(inputStream, token); + var output = new Image[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + output[i] = ColorMemoryToImage(decoded[i]); + } + return output; + } + + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. + /// The decoded Rgba32 image. + public static async Task> DecodeToImageRgba32Async(this BcDecoder decoder, KtxFile file, CancellationToken token = default) + { + return ColorMemoryToImage(await decoder.Decode2DAsync(file, token)); + } + + /// + /// Read a Ktx file and decode it. + /// + /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. + /// An array of decoded Rgba32 images. + public static async Task[]> DecodeAllMipMapsToImageRgba32Async(this BcDecoder decoder, KtxFile file, CancellationToken token = default) + { + var decoded = await decoder.DecodeAllMipMaps2DAsync(file, token); + var output = new Image[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + output[i] = ColorMemoryToImage(decoded[i]); + } + return output; + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. + /// The decoded Rgba32 image. + public static async Task> DecodeToImageRgba32Async(this BcDecoder decoder, DdsFile file, CancellationToken token = default) + { + return ColorMemoryToImage(await decoder.Decode2DAsync(file, token)); + } + + /// + /// Read a Dds file and decode it. + /// + /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. + /// An array of decoded Rgba32 images. + public static async Task[]> DecodeAllMipMapsToImageRgba32Async(this BcDecoder decoder, DdsFile file, CancellationToken token = default) + { + var decoded = await decoder.DecodeAllMipMaps2DAsync(file, token); + var output = new Image[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + output[i] = ColorMemoryToImage(decoded[i]); + } + return output; + } + + + + private static Image ColorMemoryToImage(Memory2D colors) + { + var output = new Image(colors.Width, colors.Height); + output.TryGetSinglePixelSpan(out var pixels); + colors.Span.TryGetSpan(out var decodedPixels); + + for (int i = 0; i < pixels.Length; i++) + { + var c = decodedPixels[i]; + pixels[i] = new Rgba32(c.r, c.g, c.b, c.a); + } + return output; + } + } +} diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs index 4a1e21d..2d0c4c8 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs +++ b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs @@ -1,10 +1,15 @@ using System; using System.Collections.Generic; using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using BCnEncoder.Encoder; using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; +using Microsoft.Toolkit.HighPerformance.Extensions; +using Microsoft.Toolkit.HighPerformance.Memory; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; @@ -21,8 +26,7 @@ public static class BCnEncoderExtensions /// The stream to write the encoded image to. public static void EncodeToStream(this BcEncoder encoder, Image inputImage, Stream outputStream) { - var pixels = inputImage.GetPixelMemoryGroup()[0]; - encoder.EncodeToStream(pixels, inputImage.Width, inputImage.Height, outputStream); + encoder.EncodeToStream(ImageToMemory2D(inputImage), outputStream); } /// @@ -33,7 +37,7 @@ public static void EncodeToStream(this BcEncoder encoder, Image inputIma /// The Ktx file containing the encoded image. public static KtxFile EncodeToKtx(this BcEncoder encoder, Image inputImage) { - return EncodeToKtxInternal(inputImage, default); + return encoder.EncodeToKtx(ImageToMemory2D(inputImage)); } /// @@ -44,7 +48,7 @@ public static KtxFile EncodeToKtx(this BcEncoder encoder, Image inputIma /// The Dds file containing the encoded image. public static DdsFile EncodeToDds(this BcEncoder encoder, Image inputImage) { - return EncodeToDdsInternal(inputImage, default); + return encoder.EncodeToDds(ImageToMemory2D(inputImage)); } /// @@ -52,9 +56,9 @@ public static DdsFile EncodeToDds(this BcEncoder encoder, Image inputIma /// /// The image to encode. /// A list of raw encoded data. - public IList EncodeToRawBytes(Image inputImage) + public static IList EncodeToRawBytes(this BcEncoder encoder, Image inputImage) { - return EncodeToRawBytesInternal(this BcEncoder encoder, inputImage, default); + return encoder.EncodeToRawBytes(ImageToMemory2D(inputImage)); } /// @@ -65,9 +69,9 @@ public IList EncodeToRawBytes(Image inputImage) /// The width of the mipmap. /// The height of the mipmap. /// The raw encoded data. - public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) + public static byte[] EncodeToRawBytes(this BcEncoder encoder, Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) { - return EncodeToRawBytesInternal(this BcEncoder encoder, inputImage, mipLevel, out mipWidth, out mipHeight, default); + return encoder.EncodeToRawBytes(ImageToMemory2D(inputImage), mipLevel, out mipWidth, out mipHeight); } /// @@ -81,10 +85,18 @@ public byte[] EncodeToRawBytes(Image inputImage, int mipLevel, out int m /// The back face of the cubemap. /// The front face of the cubemap. /// The stream to write the encoded image to. - public void EncodeCubeMapToStream(Image right, Image left, Image top, Image down, + public static void EncodeCubeMapToStream(this BcEncoder encoder, Image right, Image left, Image top, Image down, Image back, Image front, Stream outputStream) { - EncodeCubeMapInternal(this BcEncoder encoder, right, left, top, down, back, front, outputStream, default); + encoder.EncodeCubeMapToStream( + ImageToMemory2D(right), + ImageToMemory2D(left), + ImageToMemory2D(top), + ImageToMemory2D(down), + ImageToMemory2D(back), + ImageToMemory2D(front), + outputStream + ); } /// @@ -98,10 +110,17 @@ public void EncodeCubeMapToStream(Image right, Image left, Image /// The back face of the cubemap. /// The front face of the cubemap. /// The Ktx file containing the encoded image. - public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image top, Image down, + public static KtxFile EncodeCubeMapToKtx(this BcEncoder encoder, Image right, Image left, Image top, Image down, Image back, Image front) { - return EncodeCubeMapToKtxInternal(this BcEncoder encoder, right, left, top, down, back, front, default); + return encoder.EncodeCubeMapToKtx( + ImageToMemory2D(right), + ImageToMemory2D(left), + ImageToMemory2D(top), + ImageToMemory2D(down), + ImageToMemory2D(back), + ImageToMemory2D(front) + ); } /// @@ -115,10 +134,17 @@ public KtxFile EncodeCubeMapToKtx(Image right, Image left, Image /// The back face of the cubemap. /// The front face of the cubemap. /// The Dds file containing the encoded image. - public DdsFile EncodeCubeMapToDds(Image right, Image left, Image top, Image down, + public static DdsFile EncodeCubeMapToDds(this BcEncoder encoder, Image right, Image left, Image top, Image down, Image back, Image front) { - return EncodeCubeMapToDdsInternal(this BcEncoder encoder, right, left, top, down, back, front, default); + return encoder.EncodeCubeMapToDds( + ImageToMemory2D(right), + ImageToMemory2D(left), + ImageToMemory2D(top), + ImageToMemory2D(down), + ImageToMemory2D(back), + ImageToMemory2D(front) + ); } /// @@ -127,9 +153,9 @@ public DdsFile EncodeCubeMapToDds(Image right, Image left, Image /// The image to encode. /// The stream to write the encoded image to. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - public Task EncodeToStreamAsync(Image inputImage, Stream outputStream, CancellationToken token = default) + public static Task EncodeToStreamAsync(this BcEncoder encoder, Image inputImage, Stream outputStream, CancellationToken token = default) { - + return encoder.EncodeToStreamAsync(ImageToMemory2D(inputImage), outputStream, token); } /// @@ -138,9 +164,9 @@ public Task EncodeToStreamAsync(Image inputImage, Stream outputStream, C /// The image to encode. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// The Ktx file containing the encoded image. - public Task EncodeToKtxAsync(Image inputImage, CancellationToken token = default) + public static Task EncodeToKtxAsync(this BcEncoder encoder, Image inputImage, CancellationToken token = default) { - + return encoder.EncodeToKtxAsync(ImageToMemory2D(inputImage), token); } /// @@ -149,9 +175,9 @@ public Task EncodeToKtxAsync(Image inputImage, CancellationToke /// The image to encode. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// The Dds file containing the encoded image. - public Task EncodeToDdsAsync(Image inputImage, CancellationToken token = default) + public static Task EncodeToDdsAsync(this BcEncoder encoder, Image inputImage, CancellationToken token = default) { - + return encoder.EncodeToDdsAsync(ImageToMemory2D(inputImage), token); } /// @@ -160,9 +186,9 @@ public Task EncodeToDdsAsync(Image inputImage, CancellationToke /// The image to encode. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// A list of raw encoded data. - public Task> EncodeToRawBytesAsync(Image inputImage, CancellationToken token = default) + public static Task EncodeToRawBytesAsync(this BcEncoder encoder, Image inputImage, CancellationToken token = default) { - + return encoder.EncodeToRawBytesAsync(ImageToMemory2D(inputImage), token); } /// @@ -173,8 +199,9 @@ public Task> EncodeToRawBytesAsync(Image inputImage, Cance /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// The raw encoded data. /// To get the width and height of the encoded mipLevel, see . - public Task EncodeToRawBytesAsync(Image inputImage, int mipLevel, CancellationToken token = default) + public static Task EncodeToRawBytesAsync(this BcEncoder encoder, Image inputImage, int mipLevel, CancellationToken token = default) { + return encoder.EncodeToRawBytesAsync(ImageToMemory2D(inputImage), mipLevel, token); } /// @@ -189,9 +216,19 @@ public Task EncodeToRawBytesAsync(Image inputImage, int mipLevel /// The front face of the cubemap. /// The stream to write the encoded image to. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - public Task EncodeCubeMapToStreamAsync(Image right, Image left, Image top, Image down, + public static Task EncodeCubeMapToStreamAsync(this BcEncoder encoder, Image right, Image left, Image top, Image down, Image back, Image front, Stream outputStream, CancellationToken token = default) { + return encoder.EncodeCubeMapToStreamAsync( + ImageToMemory2D(right), + ImageToMemory2D(left), + ImageToMemory2D(top), + ImageToMemory2D(down), + ImageToMemory2D(back), + ImageToMemory2D(front), + outputStream, + token + ); } /// @@ -206,9 +243,18 @@ public Task EncodeCubeMapToStreamAsync(Image right, Image left, /// The front face of the cubemap. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// The Ktx file containing the encoded image. - public Task EncodeCubeMapToKtxAsync(Image right, Image left, Image top, + public static Task EncodeCubeMapToKtxAsync(this BcEncoder encoder, Image right, Image left, Image top, Image down, Image back, Image front, CancellationToken token = default) { + return encoder.EncodeCubeMapToKtxAsync( + ImageToMemory2D(right), + ImageToMemory2D(left), + ImageToMemory2D(top), + ImageToMemory2D(down), + ImageToMemory2D(back), + ImageToMemory2D(front), + token + ); } /// @@ -223,9 +269,18 @@ public Task EncodeCubeMapToKtxAsync(Image right, Image /// The front face of the cubemap. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// The Dds file containing the encoded image. - public Task EncodeCubeMapToDdsAsync(Image right, Image left, Image top, + public static Task EncodeCubeMapToDdsAsync(this BcEncoder encoder, Image right, Image left, Image top, Image down, Image back, Image front, CancellationToken token = default) { + return encoder.EncodeCubeMapToDdsAsync( + ImageToMemory2D(right), + ImageToMemory2D(left), + ImageToMemory2D(top), + ImageToMemory2D(down), + ImageToMemory2D(back), + ImageToMemory2D(front), + token + ); } /// @@ -233,9 +288,9 @@ public Task EncodeCubeMapToDdsAsync(Image right, Image /// /// The image to use for the calculation. /// The number of mipmap levels that will be generated for the input image. - public int CalculateNumberOfMipLevels(Image inputImage) + public static int CalculateNumberOfMipLevels(this BcEncoder encoder, Image inputImage) { - + return encoder.CalculateNumberOfMipLevels(inputImage.Width, inputImage.Height); } /// @@ -245,9 +300,20 @@ public int CalculateNumberOfMipLevels(Image inputImage) /// The mipLevel to calculate (0 is original image) /// The mipmap width calculated /// The mipmap height calculated - public void CalculateMipMapSize(Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) + public static void CalculateMipMapSize(this BcEncoder encoder, Image inputImage, int mipLevel, out int mipWidth, out int mipHeight) { - + encoder.CalculateMipMapSize(inputImage.Width, inputImage.Height, + mipLevel, out mipWidth, out mipHeight); + } + + + private static Memory2D ImageToMemory2D(Image inputImage) + { + var pixels = inputImage.GetPixelMemoryGroup()[0]; + var colors = new ColorRgba32[pixels.Length]; + MemoryMarshal.Cast(pixels.Span).CopyTo(colors); + var memory = colors.AsMemory().AsMemory2D(inputImage.Height, inputImage.Width); + return memory; } } } From 2c0ed4c68f082c224409399bce5cc4179771ef7c Mon Sep 17 00:00:00 2001 From: Nominom Date: Thu, 4 Feb 2021 17:36:33 +0200 Subject: [PATCH 062/116] Formatting fixes --- BCnEnc.Net/Shared/MipMapper.cs | 18 +++++++++--------- BCnEncTests/DecodingAsyncTests.cs | 2 +- .../BCnDecoderExtensions.cs | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index d7a4c03..9324405 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -113,19 +113,19 @@ public static void CalculateMipLevelSize(int width, int height, int mipIdx, out var result = new ColorRgba32[newHeight, newWidth]; - int clampW(int x) => Math.Max(0, Math.Min(oldWidth - 1, x)); - int clampH(int y) => Math.Max(0, Math.Min(oldHeight - 1, y)); + int ClampW(int x) => Math.Max(0, Math.Min(oldWidth - 1, x)); + int ClampH(int y) => Math.Max(0, Math.Min(oldHeight - 1, y)); - for (int y2 = 0; y2 < newHeight; y2++) + for (var y2 = 0; y2 < newHeight; y2++) { - for (int x2 = 0; x2 < newWidth; x2++) + for (var x2 = 0; x2 < newWidth; x2++) { - var xUL = pixelsRgba[clampH(y2 * 2), clampW(x2 * 2)].ToFloat(); - var xUR = pixelsRgba[clampH(y2 * 2), clampW(x2 * 2 + 1)].ToFloat(); - var xLL = pixelsRgba[clampH(y2 * 2 + 1), clampW(x2 * 2)].ToFloat(); - var xLR = pixelsRgba[clampH(y2 * 2 + 1), clampW(x2 * 2 + 1)].ToFloat(); + var ul = pixelsRgba[ClampH(y2 * 2), ClampW(x2 * 2)].ToFloat(); + var ur = pixelsRgba[ClampH(y2 * 2), ClampW(x2 * 2 + 1)].ToFloat(); + var ll = pixelsRgba[ClampH(y2 * 2 + 1), ClampW(x2 * 2)].ToFloat(); + var lr = pixelsRgba[ClampH(y2 * 2 + 1), ClampW(x2 * 2 + 1)].ToFloat(); - result[y2, x2] = ((xUL + xUR + xLL + xLR) / 4).ToRgba32(); + result[y2, x2] = ((ul + ur + ll + lr) / 4).ToRgba32(); } } diff --git a/BCnEncTests/DecodingAsyncTests.cs b/BCnEncTests/DecodingAsyncTests.cs index 1509719..df6423e 100644 --- a/BCnEncTests/DecodingAsyncTests.cs +++ b/BCnEncTests/DecodingAsyncTests.cs @@ -49,7 +49,7 @@ public async void DecodeRawAsync() var file = encoder.EncodeToKtx(original); - MemoryStream ms = new MemoryStream(file.MipMaps[0].Faces[0].Data); + var ms = new MemoryStream(file.MipMaps[0].Faces[0].Data); var image = await decoder.DecodeRawToImageRgba32Async(ms, (int) file.MipMaps[0].Width, (int) file.MipMaps[0].Height, CompressionFormat.Bc1); diff --git a/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs b/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs index 9c92f81..fb99d28 100644 --- a/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs +++ b/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs @@ -247,7 +247,7 @@ private static Image ColorMemoryToImage(Memory2D colors) output.TryGetSinglePixelSpan(out var pixels); colors.Span.TryGetSpan(out var decodedPixels); - for (int i = 0; i < pixels.Length; i++) + for (var i = 0; i < pixels.Length; i++) { var c = decodedPixels[i]; pixels[i] = new Rgba32(c.r, c.g, c.b, c.a); From 18138ce5bd24d0128f92dc6c7272f853b6b356fa Mon Sep 17 00:00:00 2001 From: Nominom Date: Sun, 7 Feb 2021 00:18:04 +0200 Subject: [PATCH 063/116] Added and updated comments, added new single block encode and decode methods, made dwFourCc handling better --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 7 + BCnEnc.Net/Decoder/BcDecoder.cs | 224 +++++++-- BCnEnc.Net/Encoder/AtcBlockEncoder.cs | 6 +- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 15 + BCnEnc.Net/Encoder/BcEncoder.cs | 458 +++++++++++++++--- BCnEnc.Net/Encoder/IBcBlockEncoder.cs | 3 + .../Encoder/Options/EncoderOutputOptions.cs | 10 +- BCnEnc.Net/Shared/CompressionFormat.cs | 4 +- BCnEnc.Net/Shared/ImageFiles/DdsFile.cs | 348 +++++++------ BCnEnc.Net/Shared/ImageToBlocks.cs | 5 + BCnEncTests/SingleBlockTests.cs | 143 ++++++ BCnEncTests/Support/TestHelper.cs | 2 +- 12 files changed, 941 insertions(+), 284 deletions(-) create mode 100644 BCnEncTests/SingleBlockTests.cs diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index 4a1a3ca..4398abe 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -11,6 +11,7 @@ namespace BCnEncoder.Decoder internal interface IBcBlockDecoder { RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext context); + RawBlock4X4Rgba32 DecodeBlock(ReadOnlySpan data); } internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmanaged @@ -65,6 +66,12 @@ public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext co return output; } + public RawBlock4X4Rgba32 DecodeBlock(ReadOnlySpan data) + { + var encodedBlock = MemoryMarshal.Cast(data)[0]; + return DecodeBlock(encodedBlock); + } + protected abstract RawBlock4X4Rgba32 DecodeBlock(T block); } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index e07b518..2d3cfa5 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -43,7 +43,7 @@ public class BcDecoder /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + public Task DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); @@ -60,7 +60,7 @@ public Task> DecodeRawAsync(Stream inputStream, CompressionF /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + public Task DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { return Task.Run(() => DecodeRawInternal(input, pixelWidth, pixelHeight, format, token), token); } @@ -71,7 +71,7 @@ public Task> DecodeRawAsync(ReadOnlyMemory input, Comp /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeAsync(KtxFile file, CancellationToken token = default) + public Task DecodeAsync(KtxFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0], token); } @@ -82,7 +82,7 @@ public Task> DecodeAsync(KtxFile file, CancellationToken tok /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task[]> DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) + public Task DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, true, token), token); } @@ -93,7 +93,7 @@ public Task[]> DecodeAllMipMapsAsync(KtxFile file, Cancellat /// The loaded Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task> DecodeAsync(DdsFile file, CancellationToken token = default) + public Task DecodeAsync(DdsFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0], token); } @@ -104,7 +104,7 @@ public Task> DecodeAsync(DdsFile file, CancellationToken tok /// The loaded Dds file. /// The cancellation token for this asynchronous operation. /// The awaitable operation to retrieve the decoded Rgba32 image. - public Task[]> DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) + public Task DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, true, token), token); } @@ -112,7 +112,7 @@ public Task[]> DecodeAllMipMapsAsync(DdsFile file, Cancellat /// /// Decode raw encoded image asynchronously. /// - /// The stream containing the encoded data. + /// The stream containing the raw encoded data. /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. @@ -124,7 +124,7 @@ public Task> DecodeRaw2DAsync(Stream inputStream, int pixe inputStream.Read(dataArray, 0, dataArray.Length); return Task.Run(() => DecodeRawInternal(dataArray, pixelWidth, pixelHeight, format, token) - .AsMemory2D(pixelHeight, pixelWidth), token); + .AsMemory().AsMemory2D(pixelHeight, pixelWidth), token); } /// @@ -139,7 +139,7 @@ public Task> DecodeRaw2DAsync(Stream inputStream, int pixe public Task> DecodeRaw2DAsync(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token = default) { return Task.Run(() => DecodeRawInternal(input, pixelWidth, pixelHeight, format, token) - .AsMemory2D(pixelHeight, pixelWidth), token); + .AsMemory().AsMemory2D(pixelHeight, pixelWidth), token); } /// @@ -173,7 +173,7 @@ public Task[]> DecodeAllMipMaps2DAsync(Stream inputStream, public Task> Decode2DAsync(KtxFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0] - .AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth), token); + .AsMemory().AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth), token); } /// @@ -191,7 +191,7 @@ public Task[]> DecodeAllMipMaps2DAsync(KtxFile file, Cance for (var i = 0; i < decoded.Length; i++) { var mip = file.MipMaps[i]; - mem2Ds[i] = decoded[i].AsMemory2D((int)mip.Height, (int)mip.Width); + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); } return mem2Ds; }, token); @@ -206,7 +206,7 @@ public Task[]> DecodeAllMipMaps2DAsync(KtxFile file, Cance public Task> Decode2DAsync(DdsFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0] - .AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth), token); + .AsMemory().AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth), token); } /// @@ -224,7 +224,7 @@ public Task[]> DecodeAllMipMaps2DAsync(DdsFile file, Cance for (var i = 0; i < decoded.Length; i++) { var mip = file.Faces[0].MipMaps[i]; - mem2Ds[i] = decoded[i].AsMemory2D((int)mip.Height, (int)mip.Width); + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); } return mem2Ds; }, token); @@ -237,12 +237,12 @@ public Task[]> DecodeAllMipMaps2DAsync(DdsFile file, Cance /// /// Decode raw encoded image data. /// - /// The stream containing the encoded data. + /// The stream containing the raw encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. /// The decoded Rgba32 image. - public Memory DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) + public ColorRgba32[] DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); @@ -253,12 +253,12 @@ public Memory DecodeRaw(Stream inputStream, int pixelWidth, int pix /// /// Decode raw encoded image data. /// - /// The array containing the encoded data. + /// The byte array containing the raw encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. /// The decoded Rgba32 image. - public Memory DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) + public ColorRgba32[] DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) { return DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); } @@ -268,7 +268,7 @@ public Memory DecodeRaw(byte[] input, int pixelWidth, int pixelHeig /// /// The loaded Ktx file. /// The decoded Rgba32 image. - public Memory Decode(KtxFile file) + public ColorRgba32[] Decode(KtxFile file) { return DecodeInternal(file, false, default)[0]; } @@ -278,7 +278,7 @@ public Memory Decode(KtxFile file) /// /// The loaded Ktx file. /// An array of decoded Rgba32 images. - public Memory[] DecodeAllMipMaps(KtxFile file) + public ColorRgba32[][] DecodeAllMipMaps(KtxFile file) { return DecodeInternal(file, true, default); } @@ -288,7 +288,7 @@ public Memory[] DecodeAllMipMaps(KtxFile file) /// /// The loaded Dds file. /// The decoded Rgba32 image. - public Memory Decode(DdsFile file) + public ColorRgba32[] Decode(DdsFile file) { return DecodeInternal(file, false, default)[0]; } @@ -298,7 +298,7 @@ public Memory Decode(DdsFile file) /// /// The loaded Dds file. /// An array of decoded Rgba32 images. - public Memory[] DecodeAllMipMaps(DdsFile file) + public ColorRgba32[][] DecodeAllMipMaps(DdsFile file) { return DecodeInternal(file, true, default); } @@ -317,13 +317,13 @@ public Memory2D DecodeRaw2D(Stream inputStream, int pixelWidth, int inputStream.Read(dataArray, 0, dataArray.Length); var decoded = DecodeRaw(dataArray, pixelWidth, pixelHeight, format); - return decoded.AsMemory2D(pixelHeight, pixelWidth); + return decoded.AsMemory().AsMemory2D(pixelHeight, pixelWidth); } /// /// Decode raw encoded image data. /// - /// The array containing the encoded data. + /// The byte array containing the raw encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. @@ -331,11 +331,11 @@ public Memory2D DecodeRaw2D(Stream inputStream, int pixelWidth, int public Memory2D DecodeRaw2D(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) { var decoded = DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); - return decoded.AsMemory2D(pixelHeight, pixelWidth); + return decoded.AsMemory().AsMemory2D(pixelHeight, pixelWidth); } /// - /// Read a Ktx or a Dds file from a stream and decode it. + /// Read a Ktx or a Dds file from a stream and decode the largest mipmap from it. /// /// The stream containing a Ktx or Dds file. /// The decoded Rgba32 image. @@ -355,13 +355,13 @@ public Memory2D[] DecodeAllMipMaps2D(Stream inputStream) } /// - /// Read a Ktx file and decode it. + /// Read a Ktx file and decode the largest mipmap from it. /// /// The loaded Ktx file. /// The decoded Rgba32 image. public Memory2D Decode2D(KtxFile file) { - return DecodeInternal(file, false, default)[0].AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth); + return DecodeInternal(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth); } /// @@ -376,19 +376,19 @@ public Memory2D[] DecodeAllMipMaps2D(KtxFile file) for (var i = 0; i < decoded.Length; i++) { var mip = file.MipMaps[i]; - mem2Ds[i] = decoded[i].AsMemory2D((int)mip.Height, (int)mip.Width); + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); } return mem2Ds; } /// - /// Read a Dds file and decode it. + /// Read a Dds file and decode the largest mipmap from it. /// /// The loaded Dds file. /// The decoded Rgba32 image. public Memory2D Decode2D(DdsFile file) { - return DecodeInternal(file, false, default)[0].AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth); + return DecodeInternal(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth); } /// @@ -403,11 +403,77 @@ public Memory2D[] DecodeAllMipMaps2D(DdsFile file) for (var i = 0; i < decoded.Length; i++) { var mip = file.Faces[0].MipMaps[i]; - mem2Ds[i] = decoded[i].AsMemory2D((int)mip.Height, (int)mip.Width); + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); } return mem2Ds; } + /// + /// Decode a single block from raw bytes and return it as a . + /// Input Span size needs to equal the block size. + /// To get the block size of the compression format used, see . + /// + /// The encoded block in bytes. + /// The compression format used. + /// The decoded 4x4 block. + public Memory2D DecodeBlock(ReadOnlySpan blockData, CompressionFormat format) + { + var output = new ColorRgba32[4, 4]; + DecodeBlockInternal(blockData, format, output); + return output; + } + + /// + /// Decode a single block from raw bytes and write it to the given output span. + /// Output span size must be exactly 4x4 and input Span size needs to equal the block size. + /// To get the block size of the compression format used, see . + /// + /// The encoded block in bytes. + /// The compression format used. + /// The destination span of the decoded data. + public void DecodeBlock(ReadOnlySpan blockData, CompressionFormat format, Span2D outputSpan) + { + if (outputSpan.Width != 4 || outputSpan.Height != 4) + { + throw new ArgumentException($"Single block decoding needs an output span of exactly 4x4"); + } + DecodeBlockInternal(blockData, format, outputSpan); + } + + /// + /// Decode a single block from a stream and write it to the given output span. + /// Output span size must be exactly 4x4. + /// + /// The stream to read encoded blocks from. + /// The compression format used. + /// The destination span of the decoded data. + /// The number of bytes read from the stream. Zero (0) if reached the end of stream. + public int DecodeBlock(Stream inputStream, CompressionFormat format, Span2D outputSpan) + { + if (outputSpan.Width != 4 || outputSpan.Height != 4) + { + throw new ArgumentException($"Single block decoding needs an output span of exactly 4x4"); + } + + Span input = stackalloc byte[16]; + input = input.Slice(0, GetBlockSize(format)); + + var bytesRead = inputStream.Read(input); + + if (bytesRead == 0) + { + return 0; //End of stream + } + + if (bytesRead != input.Length) + { + throw new Exception("Input stream does not have enough data available for a full block."); + } + + DecodeBlockInternal(input, format, outputSpan); + return bytesRead; + } + #endregion /// @@ -431,7 +497,7 @@ private Memory2D[] DecodeFromStreamInternal2D(Stream stream, bool a for (var i = 0; i < decoded.Length; i++) { var mip = file.Faces[0].MipMaps[i]; - mem2Ds[i] = decoded[i].AsMemory2D((int) mip.Height, (int) mip.Width); + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int) mip.Height, (int) mip.Width); } return mem2Ds; @@ -445,7 +511,7 @@ private Memory2D[] DecodeFromStreamInternal2D(Stream stream, bool a for (var i = 0; i < decoded.Length; i++) { var mip = file.MipMaps[i]; - mem2Ds[i] = decoded[i].AsMemory2D((int) mip.Height, (int) mip.Width); + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int) mip.Height, (int) mip.Width); } return mem2Ds; @@ -463,9 +529,10 @@ private Memory2D[] DecodeFromStreamInternal2D(Stream stream, bool a /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private Memory[] DecodeInternal(KtxFile file, bool allMipMaps, CancellationToken token) + private ColorRgba32[][] DecodeInternal(KtxFile file, bool allMipMaps, CancellationToken token) { - var colors = new Memory[allMipMaps ? file.MipMaps.Count : 1]; + var mipMaps = allMipMaps ? file.MipMaps.Count : 1; + var colors = new ColorRgba32[mipMaps][]; var context = new OperationContext { @@ -483,8 +550,7 @@ private Memory[] DecodeInternal(KtxFile file, bool allMipMaps, Canc if (IsSupportedRawFormat(file.header.GlInternalFormat)) { var decoder = GetRawDecoder(file.header.GlInternalFormat); - - var mipMaps = allMipMaps ? file.MipMaps.Count : 1; + for (var mip = 0; mip < mipMaps; mip++) { var data = file.MipMaps[mip].Faces[0].Data; @@ -501,8 +567,7 @@ private Memory[] DecodeInternal(KtxFile file, bool allMipMaps, Canc { throw new NotSupportedException($"This Format is not supported: {file.header.GlInternalFormat}"); } - - var mipMaps = allMipMaps ? file.MipMaps.Count : 1; + for (var mip = 0; mip < mipMaps; mip++) { var data = file.MipMaps[mip].Faces[0].Data; @@ -527,9 +592,10 @@ private Memory[] DecodeInternal(KtxFile file, bool allMipMaps, Canc /// If all mip maps or only the main image should be decoded. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// An array of decoded Rgba32 images. - private Memory[] DecodeInternal(DdsFile file, bool allMipMaps, CancellationToken token) + private ColorRgba32[][] DecodeInternal(DdsFile file, bool allMipMaps, CancellationToken token) { - var colors = new Memory[file.header.dwMipMapCount]; + var mipMaps = allMipMaps ? file.header.dwMipMapCount : 1; + var colors = new ColorRgba32[mipMaps][]; var context = new OperationContext { @@ -547,8 +613,7 @@ private Memory[] DecodeInternal(DdsFile file, bool allMipMaps, Canc if (IsSupportedRawFormat(file)) { var decoder = GetRawDecoder(file); - - var mipMaps = allMipMaps ? file.header.dwMipMapCount : 1; + for (var mip = 0; mip < mipMaps; mip++) { var data = file.Faces[0].MipMaps[mip].Data; @@ -569,8 +634,8 @@ private Memory[] DecodeInternal(DdsFile file, bool allMipMaps, Canc { throw new NotSupportedException($"This Format is not supported: {format}"); } - - for (var mip = 0; mip < file.header.dwMipMapCount; mip++) + + for (var mip = 0; mip < mipMaps; mip++) { var data = file.Faces[0].MipMaps[mip].Data; var pixelWidth = file.Faces[0].MipMaps[mip].Width; @@ -598,7 +663,7 @@ private Memory[] DecodeInternal(DdsFile file, bool allMipMaps, Canc /// The Format the encoded data is in. /// The cancellation token for this operation. May be default, if the operation is not asynchronous. /// The decoded Rgba32 image. - private Memory DecodeRawInternal(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token) + private ColorRgba32[] DecodeRawInternal(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token) { if (input.Length % GetBlockSize(format) != 0) { @@ -623,6 +688,12 @@ private Memory DecodeRawInternal(ReadOnlyMemory input, int pi { // DecodeInternal as compressed data var decoder = GetDecoder(format); + + if (decoder == null) + { + throw new NotSupportedException($"This Format is not supported: {format}"); + } + var blocks = decoder.Decode(input, context); return ImageToBlocks.ColorsFromRawBlocks(blocks, pixelWidth, pixelHeight); ; @@ -634,6 +705,27 @@ private Memory DecodeRawInternal(ReadOnlyMemory input, int pi return rawDecoder.Decode(input, context); } + private void DecodeBlockInternal(ReadOnlySpan blockData, CompressionFormat format, Span2D outputSpan) + { + var decoder = GetDecoder(format); + if (decoder == null) + { + throw new NotSupportedException($"This Format is not supported: {format}"); + } + if (blockData.Length != GetBlockSize(format)) + { + throw new ArgumentException("The size of the input buffer does not align with the compression format."); + } + + var rawBlock = decoder.DecodeBlock(blockData); + var pixels = rawBlock.AsSpan; + + pixels.Slice(0, 4).CopyTo(outputSpan.GetRowSpan(0)); + pixels.Slice(4, 4).CopyTo(outputSpan.GetRowSpan(1)); + pixels.Slice(8, 4).CopyTo(outputSpan.GetRowSpan(2)); + pixels.Slice(12, 4).CopyTo(outputSpan.GetRowSpan(3)); + } + #region Support #region Is supported format @@ -759,6 +851,29 @@ private IRawDecoder GetRawDecoder(CompressionFormat format) #region Get block size + /// + /// Gets the number of total blocks in an image with the given pixel width and height. + /// + /// The pixel width of the image + /// The pixel height of the image + /// The total number of blocks. + public int GetBlockCount(int pixelWidth, int pixelHeight) + { + return ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + } + + /// + /// Gets the number of blocks in an image with the given pixel width and height. + /// + /// The pixel width of the image + /// The pixel height of the image + /// The amount of blocks in the x-axis + /// The amount of blocks in the y-axis + public void GetBlockCount(int pixelWidth, int pixelHeight, out int blocksWidth, out int blocksHeight) + { + ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight, out blocksWidth, out blocksHeight); + } + private int GetBlockSize(GlInternalFormat format) { return GetBlockSize(GetCompressionFormat(format)); @@ -769,7 +884,12 @@ private int GetBlockSize(DdsFile file) return GetBlockSize(GetCompressionFormat(file)); } - private int GetBlockSize(CompressionFormat format) + /// + /// Get the size of blocks for the given compression format in bytes. + /// + /// The compression format used. + /// The size of a single block in bytes. + public int GetBlockSize(CompressionFormat format) { switch (format) { @@ -839,7 +959,7 @@ private CompressionFormat GetCompressionFormat(GlInternalFormat format) case GlInternalFormat.GlRgba8: return CompressionFormat.Rgba; - // HINT: Bgra is only an extension by apple to the ktx format + // HINT: Bgra is not supported by default. The format enum is added by an extension by Apple. case GlInternalFormat.GlBgra8Extension: return CompressionFormat.Bgra; @@ -905,7 +1025,7 @@ private CompressionFormat GetCompressionFormat(DdsFile file) case DxgiFormat.DxgiFormatBc1Unorm: case DxgiFormat.DxgiFormatBc1UnormSrgb: case DxgiFormat.DxgiFormatBc1Typeless: - if (file.header.ddsPixelFormat.dwFlags.HasFlag(PixelFormatFlags.DdpfAlphapixels)) + if (file.header.ddsPixelFormat.dwFlags.HasFlag(PixelFormatFlags.DdpfAlphaPixels)) return CompressionFormat.Bc1WithAlpha; if (InputOptions.DdsBc1ExpectAlpha) @@ -938,13 +1058,13 @@ private CompressionFormat GetCompressionFormat(DdsFile file) case DxgiFormat.DxgiFormatBc7Typeless: return CompressionFormat.Bc7; - case DxgiFormat.DxgiFormatAtc: + case DxgiFormat.DxgiFormatAtcExt: return CompressionFormat.Atc; - case DxgiFormat.DxgiFormatAtcExplicitAlpha: + case DxgiFormat.DxgiFormatAtcExplicitAlphaExt: return CompressionFormat.AtcExplicitAlpha; - case DxgiFormat.DxgiFormatAtcInterpolatedAlpha: + case DxgiFormat.DxgiFormatAtcInterpolatedAlphaExt: return CompressionFormat.AtcInterpolatedAlpha; default: diff --git a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs index 6e70dc7..c952213 100644 --- a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs @@ -48,7 +48,7 @@ public override GlFormat GetBaseInternalFormat() public override DxgiFormat GetDxgiFormat() { - return DxgiFormat.DxgiFormatAtc; + return DxgiFormat.DxgiFormatAtcExt; } } @@ -91,7 +91,7 @@ public override GlFormat GetBaseInternalFormat() public override DxgiFormat GetDxgiFormat() { - return DxgiFormat.DxgiFormatAtcExplicitAlpha; + return DxgiFormat.DxgiFormatAtcExplicitAlphaExt; } } @@ -130,7 +130,7 @@ public override GlFormat GetBaseInternalFormat() public override DxgiFormat GetDxgiFormat() { - return DxgiFormat.DxgiFormatAtcInterpolatedAlpha; + return DxgiFormat.DxgiFormatAtcInterpolatedAlphaExt; } } } diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index e3fb1dd..30abf6b 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -1,3 +1,4 @@ +using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading; @@ -49,9 +50,23 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight return outputData; } + public void EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality, Span output) + { + if (output.Length != Unsafe.SizeOf()) + { + throw new Exception("Cannot encode block! Output buffer is not the correct size."); + } + T encoded = EncodeBlock(block, quality); + MemoryMarshal.Cast(output)[0] = encoded; + } + public abstract GlInternalFormat GetInternalFormat(); public abstract GlFormat GetBaseInternalFormat(); public abstract DxgiFormat GetDxgiFormat(); + public int GetBlockSize() + { + return Unsafe.SizeOf(); + } public abstract T EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality); } diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 74381bf..b501768 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -8,6 +8,7 @@ using BCnEncoder.Encoder.Options; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; +using Microsoft.Toolkit.HighPerformance.Extensions; using Microsoft.Toolkit.HighPerformance.Memory; namespace BCnEncoder.Encoder @@ -18,27 +19,27 @@ namespace BCnEncoder.Encoder public enum PixelFormat { /// - /// Specifies the RGBA32 layout. + /// 8 bits per channel RGBA. /// Rgba32, /// - /// Specifies the BGRA32 layout. + /// 8 bits per channel BGRA. /// Bgra32, /// - /// Specifies the ARGB32 layout. + /// 8 bits per channel ARGB. /// Argb32, /// - /// Specifies the RGB24 layout. + /// 8 bits per channel RGB. /// Rgb24, /// - /// Specifies the BGR24 layout. + /// 8 bits per channel BGR. /// Bgr24 } @@ -77,13 +78,13 @@ public BcEncoder(CompressionFormat format = CompressionFormat.Bc1) /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. /// The pixel format the given data is in. /// The stream to write the encoded image to. - /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - public Task EncodeToStreamAsync(Memory input, int width, int height, PixelFormat format, Stream outputStream, CancellationToken token = default) + /// The cancellation token for this operation. Can be default if cancellation is not needed. + public Task EncodeToStreamAsync(ReadOnlyMemory input, int width, int height, PixelFormat format, Stream outputStream, CancellationToken token = default) { return Task.Run(() => { @@ -94,10 +95,10 @@ public Task EncodeToStreamAsync(Memory input, int width, int height, Pixel /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The stream to write the encoded image to. - /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. - public Task EncodeToStreamAsync(Memory2D input, Stream outputStream, CancellationToken token = default) + /// The cancellation token for this operation. Can be default if cancellation is not needed. + public Task EncodeToStreamAsync(ReadOnlyMemory2D input, Stream outputStream, CancellationToken token = default) { return Task.Run(() => { @@ -108,13 +109,13 @@ public Task EncodeToStreamAsync(Memory2D input, Stream outputStream /// /// Encodes all mipmap levels into a Ktx file asynchronously. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. /// The pixel format the given data is in. - /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The cancellation token for this operation. Can be default if cancellation is not needed. /// The Ktx file containing the encoded image. - public Task EncodeToKtxAsync(Memory input, int width, int height, PixelFormat format, CancellationToken token = default) + public Task EncodeToKtxAsync(ReadOnlyMemory input, int width, int height, PixelFormat format, CancellationToken token = default) { return Task.Run(() => EncodeToKtxInternal(ByteToColorMemory(input.Span, width, height, format), token), token); } @@ -122,10 +123,10 @@ public Task EncodeToKtxAsync(Memory input, int width, int height, /// /// Encodes all mipmap levels into a Ktx file asynchronously. /// - /// The input to encode represented by a . - /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The input to encode represented by a . + /// The cancellation token for this operation. Can be default if cancellation is not needed. /// The Ktx file containing the encoded image. - public Task EncodeToKtxAsync(Memory2D input, CancellationToken token = default) + public Task EncodeToKtxAsync(ReadOnlyMemory2D input, CancellationToken token = default) { return Task.Run(() => EncodeToKtxInternal(input, token), token); } @@ -133,13 +134,13 @@ public Task EncodeToKtxAsync(Memory2D input, CancellationT /// /// Encodes all mipmap levels into a Dds file asynchronously. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. /// The pixel format the given data is in. - /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The cancellation token for this operation. Can be default if cancellation is not needed. /// The Dds file containing the encoded image. - public Task EncodeToDdsAsync(Memory input, int width, int height, PixelFormat format, CancellationToken token = default) + public Task EncodeToDdsAsync(ReadOnlyMemory input, int width, int height, PixelFormat format, CancellationToken token = default) { return Task.Run(() => EncodeToDdsInternal(ByteToColorMemory(input.Span, width, height, format), token), token); } @@ -147,10 +148,10 @@ public Task EncodeToDdsAsync(Memory input, int width, int height, /// /// Encodes all mipmap levels into a Dds file asynchronously. /// - /// The input to encode represented by a . - /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The input to encode represented by a . + /// The cancellation token for this operation. Can be default if cancellation is not needed. /// The Dds file containing the encoded image. - public Task EncodeToDdsAsync(Memory2D input, CancellationToken token = default) + public Task EncodeToDdsAsync(ReadOnlyMemory2D input, CancellationToken token = default) { return Task.Run(() => EncodeToDdsInternal(input, token), token); } @@ -158,13 +159,13 @@ public Task EncodeToDdsAsync(Memory2D input, CancellationT /// /// Encodes all mipmap levels into a list of byte buffers asynchronously. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. /// The pixel format the given data is in. - /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The cancellation token for this operation. Can be default if cancellation is not needed. /// A list of raw encoded mipmap input. - public Task EncodeToRawBytesAsync(Memory input, int width, int height, PixelFormat format, CancellationToken token = default) + public Task EncodeToRawBytesAsync(ReadOnlyMemory input, int width, int height, PixelFormat format, CancellationToken token = default) { return Task.Run(() => EncodeToRawInternal(ByteToColorMemory(input.Span, width, height, format), token), token); } @@ -172,10 +173,11 @@ public Task EncodeToRawBytesAsync(Memory input, int width, int h /// /// Encodes all mipmap levels into a list of byte buffers asynchronously. /// - /// The input to encode represented by a . - /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The input to encode represented by a . + /// The cancellation token for this operation. Can be default if cancellation is not needed. /// A list of raw encoded mipmap input. - public Task EncodeToRawBytesAsync(Memory2D input, CancellationToken token = default) + /// To get the width and height of the encoded mip levels, see . + public Task EncodeToRawBytesAsync(ReadOnlyMemory2D input, CancellationToken token = default) { return Task.Run(() => EncodeToRawInternal(input, token), token); } @@ -183,7 +185,7 @@ public Task EncodeToRawBytesAsync(Memory2D input, Cancell /// /// Encodes a single mip level of the input image to a byte buffer asynchronously. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. /// The pixel format the given data is in. @@ -191,7 +193,7 @@ public Task EncodeToRawBytesAsync(Memory2D input, Cancell /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. /// The raw encoded input. /// To get the width and height of the encoded mip level, see . - public Task EncodeToRawBytesAsync(Memory input, int width, int height, PixelFormat format, int mipLevel, CancellationToken token = default) + public Task EncodeToRawBytesAsync(ReadOnlyMemory input, int width, int height, PixelFormat format, int mipLevel, CancellationToken token = default) { return Task.Run(() => EncodeToRawInternal(ByteToColorMemory(input.Span, width, height, format), mipLevel, out _, out _, token), token); } @@ -199,16 +201,30 @@ public Task EncodeToRawBytesAsync(Memory input, int width, int hei /// /// Encodes a single mip level of the input image to a byte buffer asynchronously. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The mipmap to encode. - /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// The cancellation token for this operation. Can be default if cancellation is not needed. /// The raw encoded input. /// To get the width and height of the encoded mip level, see . - public Task EncodeToRawBytesAsync(Memory2D input, int mipLevel, CancellationToken token = default) + public Task EncodeToRawBytesAsync(ReadOnlyMemory2D input, int mipLevel, CancellationToken token = default) { return Task.Run(() => EncodeToRawInternal(input, mipLevel, out _, out _, token), token); } + /// + /// Encodes all mipMaps of a cubeMap image to a stream asynchronously either in ktx or dds format. + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The stream to write the encoded image to. + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// A . public Task EncodeCubeMapToStreamAsync(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, ReadOnlyMemory2D back, ReadOnlyMemory2D front, Stream outputStream, CancellationToken token = default) @@ -216,6 +232,19 @@ public Task EncodeCubeMapToStreamAsync(ReadOnlyMemory2D right, Read return Task.Run(() => EncodeCubeMapToStreamInternal(right, left, top, down, back, front, outputStream, token), token); } + /// + /// Encodes all mipMaps of a cubeMap image to a asynchronously. + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// A of type . public Task EncodeCubeMapToKtxAsync(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token = default) @@ -223,6 +252,19 @@ public Task EncodeCubeMapToKtxAsync(ReadOnlyMemory2D right return Task.Run(() => EncodeCubeMapToKtxInternal(right, left, top, down, back, front, token), token); } + /// + /// Encodes all mipMaps of a cubeMap image to a asynchronously. + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// A of type . public Task EncodeCubeMapToDdsAsync(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token = default) @@ -237,20 +279,20 @@ public Task EncodeCubeMapToDdsAsync(ReadOnlyMemory2D right /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. - /// The pixel format the given data is in. + /// The pixel format the input data is in. /// The stream to write the encoded image to. - public void EncodeToStream(ReadOnlyMemory input, int width, int height, PixelFormat format, Stream outputStream) + public void EncodeToStream(ReadOnlySpan input, int width, int height, PixelFormat format, Stream outputStream) { - EncodeToStream(ByteToColorMemory(input.Span, width, height, format), outputStream); + EncodeToStream(ByteToColorMemory(input, width, height, format), outputStream); } /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The stream to write the encoded image to. public void EncodeToStream(ReadOnlyMemory2D input, Stream outputStream) { @@ -260,21 +302,21 @@ public void EncodeToStream(ReadOnlyMemory2D input, Stream outputStr /// /// Encodes all mipmap levels into a Ktx file. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. - /// The pixel format the given data is in. - /// The Ktx file containing the encoded image. - public KtxFile EncodeToKtx(ReadOnlyMemory input, int width, int height, PixelFormat format) + /// The pixel format the input data is in. + /// The containing the encoded image. + public KtxFile EncodeToKtx(ReadOnlySpan input, int width, int height, PixelFormat format) { - return EncodeToKtx(ByteToColorMemory(input.Span, width, height, format)); + return EncodeToKtx(ByteToColorMemory(input, width, height, format)); } /// /// Encodes all mipmap levels into a Ktx file. /// - /// The input to encode represented by a . - /// The Ktx file containing the encoded image. + /// The input to encode represented by a . + /// The containing the encoded image. public KtxFile EncodeToKtx(ReadOnlyMemory2D input) { return EncodeToKtxInternal(input, default); @@ -283,21 +325,21 @@ public KtxFile EncodeToKtx(ReadOnlyMemory2D input) /// /// Encodes all mipmap levels into a Dds file. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. - /// The pixel format the given data is in. - /// The Dds file containing the encoded image. - public DdsFile EncodeToDds(ReadOnlyMemory input, int width, int height, PixelFormat format) + /// The pixel format the input data is in. + /// The containing the encoded image. + public DdsFile EncodeToDds(ReadOnlySpan input, int width, int height, PixelFormat format) { - return EncodeToDds(ByteToColorMemory(input.Span, width, height, format)); + return EncodeToDds(ByteToColorMemory(input, width, height, format)); } /// /// Encodes all mipmap levels into a Dds file. /// - /// The input to encode represented by a . - /// The Dds file containing the encoded image. + /// The input to encode represented by a . + /// The containing the encoded image. public DdsFile EncodeToDds(ReadOnlyMemory2D input) { return EncodeToDdsInternal(input, default); @@ -306,21 +348,23 @@ public DdsFile EncodeToDds(ReadOnlyMemory2D input) /// /// Encodes all mipmap levels into a list of byte buffers. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. - /// The pixel format the given data is in. - /// A list of raw encoded mipmap input. - public byte[][] EncodeToRawBytes(ReadOnlyMemory input, int width, int height, PixelFormat format) + /// The pixel format the input data is in. + /// An array of byte buffers containing all mipmap levels. + /// To get the width and height of the encoded mip levels, see . + public byte[][] EncodeToRawBytes(ReadOnlySpan input, int width, int height, PixelFormat format) { - return EncodeToRawBytes(ByteToColorMemory(input.Span, width, height, format)); + return EncodeToRawBytes(ByteToColorMemory(input, width, height, format)); } /// /// Encodes all mipmap levels into a list of byte buffers. /// - /// The input to encode represented by a . - /// A list of raw encoded mipmap input. + /// The input to encode represented by a . + /// An array of byte buffers containing all mipmap levels. + /// To get the width and height of the encoded mip levels, see . public byte[][] EncodeToRawBytes(ReadOnlyMemory2D input) { return EncodeToRawInternal(input, default); @@ -329,32 +373,74 @@ public byte[][] EncodeToRawBytes(ReadOnlyMemory2D input) /// /// Encodes a single mip level of the input image to a byte buffer. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The width of the image. /// The height of the image. - /// The pixel format the given data is in. + /// The pixel format the input data is in. /// The mipmap to encode. /// The width of the mipmap. /// The height of the mipmap. - /// The raw encoded input. - public byte[] EncodeToRawBytes(ReadOnlyMemory input, int width, int height, PixelFormat format, int mipLevel, out int mipWidth, out int mipHeight) + /// A byte buffer containing the encoded data of the requested mip-level. + public byte[] EncodeToRawBytes(ReadOnlySpan input, int width, int height, PixelFormat format, int mipLevel, out int mipWidth, out int mipHeight) { - return EncodeToRawInternal(ByteToColorMemory(input.Span, width, height, format), mipLevel, out mipWidth, out mipHeight, default); + return EncodeToRawInternal(ByteToColorMemory(input, width, height, format), mipLevel, out mipWidth, out mipHeight, default); } /// /// Encodes a single mip level of the input image to a byte buffer. /// - /// The input to encode represented by a . + /// The input to encode represented by a . /// The mipmap to encode. /// The width of the mipmap. /// The height of the mipmap. - /// The raw encoded input. + /// A byte buffer containing the encoded data of the requested mip-level. public byte[] EncodeToRawBytes(ReadOnlyMemory2D input, int mipLevel, out int mipWidth, out int mipHeight) { return EncodeToRawInternal(input, mipLevel, out mipWidth, out mipHeight, default); } + /// + /// Encodes all mipMaps of a cubeMap image to a stream either in ktx or dds format. + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The width of the faces. + /// The height of the faces. + /// The pixel format the input data is in. + /// The stream to write the encoded image to. + public void EncodeCubeMapToStream(ReadOnlySpan right, ReadOnlySpan left, + ReadOnlySpan top, ReadOnlySpan down, + ReadOnlySpan back, ReadOnlySpan front, + int width, int height, PixelFormat format, Stream outputStream) + { + EncodeCubeMapToStreamInternal( + ByteToColorMemory(right, width, height, format), + ByteToColorMemory(left, width, height, format), + ByteToColorMemory(top, width, height, format), + ByteToColorMemory(down, width, height, format), + ByteToColorMemory(back, width, height, format), + ByteToColorMemory(front, width, height, format), + outputStream, default); + } + + /// + /// Encodes all mipMaps of a cubeMap image to a stream either in ktx or dds format. + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The stream to write the encoded image to. public void EncodeCubeMapToStream(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, ReadOnlyMemory2D back, ReadOnlyMemory2D front, Stream outputStream) @@ -362,6 +448,47 @@ public void EncodeCubeMapToStream(ReadOnlyMemory2D right, ReadOnlyM EncodeCubeMapToStreamInternal(right, left, top, down, back, front, outputStream, default); } + /// + /// Encodes all mipMaps of a cubeMap image to a . + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The width of the faces. + /// The height of the faces. + /// The pixel format the input data is in. + /// The encoded image as a . + public KtxFile EncodeCubeMapToKtx(ReadOnlySpan right, ReadOnlySpan left, + ReadOnlySpan top, ReadOnlySpan down, + ReadOnlySpan back, ReadOnlySpan front, + int width, int height, PixelFormat format) + { + return EncodeCubeMapToKtxInternal( + ByteToColorMemory(right, width, height, format), + ByteToColorMemory(left, width, height, format), + ByteToColorMemory(top, width, height, format), + ByteToColorMemory(down, width, height, format), + ByteToColorMemory(back, width, height, format), + ByteToColorMemory(front, width, height, format), default); + } + + /// + /// Encodes all mipMaps of a cubeMap image to a . + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The encoded image as a . public KtxFile EncodeCubeMapToKtx(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, ReadOnlyMemory2D back, ReadOnlyMemory2D front) @@ -369,6 +496,47 @@ public KtxFile EncodeCubeMapToKtx(ReadOnlyMemory2D right, ReadOnlyM return EncodeCubeMapToKtxInternal(right, left, top, down, back, front, default); } + /// + /// Encodes all mipMaps of a cubeMap image to a . + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The width of the faces. + /// The height of the faces. + /// The pixel format the input data is in. + /// The encoded image as a . + public DdsFile EncodeCubeMapToDds(ReadOnlySpan right, ReadOnlySpan left, + ReadOnlySpan top, ReadOnlySpan down, + ReadOnlySpan back, ReadOnlySpan front, + int width, int height, PixelFormat format) + { + return EncodeCubeMapToDdsInternal( + ByteToColorMemory(right, width, height, format), + ByteToColorMemory(left, width, height, format), + ByteToColorMemory(top, width, height, format), + ByteToColorMemory(down, width, height, format), + ByteToColorMemory(back, width, height, format), + ByteToColorMemory(front, width, height, format), default); + } + + /// + /// Encodes all mipMaps of a cubeMap image to a . + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The encoded image as a . public DdsFile EncodeCubeMapToDds(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, ReadOnlyMemory2D back, ReadOnlyMemory2D front) @@ -376,6 +544,99 @@ public DdsFile EncodeCubeMapToDds(ReadOnlyMemory2D right, ReadOnlyM return EncodeCubeMapToDdsInternal(right, left, top, down, back, front, default); } + /// + /// Encodes a single 4x4 block to raw encoded bytes. Input Span length must be exactly 16. + /// + /// Input 4x4 color block + /// Raw encoded data + public byte[] EncodeBlock(ReadOnlySpan inputBlock) + { + if (inputBlock.Length != 16) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + return EncodeBlockInternal(inputBlock.AsSpan2D(4, 4)); + } + + /// + /// Encodes a single 4x4 block to raw encoded bytes. Input Span width and height must be exactly 4. + /// + /// Input 4x4 color block + /// Raw encoded data + public byte[] EncodeBlock(ReadOnlySpan2D inputBlock) + { + if (inputBlock.Width != 4 || inputBlock.Height != 4) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + return EncodeBlockInternal(inputBlock); + } + + /// + /// Encodes a single 4x4 block and writes the encoded block to a stream. Input Span length must be exactly 16. + /// + /// Input 4x4 color block + /// Output stream where the encoded block will be written to. + public void EncodeBlock(ReadOnlySpan inputBlock, Stream outputStream) + { + if (inputBlock.Length != 16) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + EncodeBlockInternal(inputBlock.AsSpan2D(4, 4), outputStream); + } + + /// + /// Encodes a single 4x4 block and writes the encoded block to a stream. Input Span width and height must be exactly 4. + /// + /// Input 4x4 color block + /// Output stream where the encoded block will be written to. + public void EncodeBlock(ReadOnlySpan2D inputBlock, Stream outputStream) + { + if (inputBlock.Width != 4 || inputBlock.Height != 4) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + EncodeBlockInternal(inputBlock, outputStream); + } + + /// + /// Gets the block size of the currently selected compression format in bytes. + /// + /// The size of a single 4x4 block in bytes + public int GetBlockSize() + { + var compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This format is either not supported or does not use block compression: {OutputOptions.Format}"); + } + return compressedEncoder.GetBlockSize(); + } + + /// + /// Gets the number of total blocks in an image with the given pixel width and height. + /// + /// The pixel width of the image + /// The pixel height of the image + /// The total number of blocks. + public int GetBlockCount(int pixelWidth, int pixelHeight) + { + return ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + } + + /// + /// Gets the number of blocks in an image with the given pixel width and height. + /// + /// The pixel width of the image + /// The pixel height of the image + /// The amount of blocks in the x-axis + /// The amount of blocks in the y-axis + public void GetBlockCount(int pixelWidth, int pixelHeight, out int blocksWidth, out int blocksHeight) + { + ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight, out blocksWidth, out blocksHeight); + } + #endregion #region MipMap operations @@ -532,13 +793,13 @@ private DdsFile EncodeToDdsInternal(ReadOnlyMemory2D input, Cancell } var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(input.Width, input.Height, - compressedEncoder.GetDxgiFormat()); + compressedEncoder.GetDxgiFormat(), OutputOptions.DdsPreferDxt10Header); output = new DdsFile(ddsHeader, dxt10Header); if (OutputOptions.DdsBc1WriteAlphaFlag && OutputOptions.Format == CompressionFormat.Bc1WithAlpha) { - output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; + output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphaPixels; } } else @@ -890,13 +1151,13 @@ private DdsFile EncodeCubeMapToDdsInternal(ReadOnlyMemory2D right, } var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(width, height, - compressedEncoder.GetDxgiFormat()); + compressedEncoder.GetDxgiFormat(), OutputOptions.DdsPreferDxt10Header); output = new DdsFile(ddsHeader, dxt10Header); if (OutputOptions.DdsBc1WriteAlphaFlag && OutputOptions.Format == CompressionFormat.Bc1WithAlpha) { - output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphapixels; + output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphaPixels; } } else @@ -990,6 +1251,59 @@ private DdsFile EncodeCubeMapToDdsInternal(ReadOnlyMemory2D right, return output; } + private byte[] EncodeBlockInternal(ReadOnlySpan2D input) + { + var compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported for single block encoding: {OutputOptions.Format}"); + } + + var output = new byte[compressedEncoder.GetBlockSize()]; + + var rawBlock = new RawBlock4X4Rgba32(); + + var pixels = rawBlock.AsSpan; + + input.GetRowSpan(0).CopyTo(pixels); + input.GetRowSpan(1).CopyTo(pixels.Slice(4)); + input.GetRowSpan(2).CopyTo(pixels.Slice(8)); + input.GetRowSpan(3).CopyTo(pixels.Slice(12)); + + compressedEncoder.EncodeBlock(rawBlock, OutputOptions.Quality, output); + + return output; + } + + private void EncodeBlockInternal(ReadOnlySpan2D input, Stream outputStream) + { + var compressedEncoder = GetEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported for single block encoding: {OutputOptions.Format}"); + } + if (input.Width != 4 || input.Height != 4) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + + Span output = stackalloc byte[16]; + output = output.Slice(0, compressedEncoder.GetBlockSize()); + + var rawBlock = new RawBlock4X4Rgba32(); + + var pixels = rawBlock.AsSpan; + + input.GetRowSpan(0).CopyTo(pixels); + input.GetRowSpan(1).CopyTo(pixels.Slice(4)); + input.GetRowSpan(2).CopyTo(pixels.Slice(8)); + input.GetRowSpan(3).CopyTo(pixels.Slice(12)); + + compressedEncoder.EncodeBlock(rawBlock, OutputOptions.Quality, output); + + outputStream.Write(output); + } + #endregion #region Support @@ -1089,7 +1403,7 @@ private ReadOnlyMemory2D ByteToColorMemory(ReadOnlySpan span, break; } - return new ReadOnlyMemory2D(pixels, width, height); + return new ReadOnlyMemory2D(pixels, height, width); } #endregion diff --git a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs index 0821767..f62fa6c 100644 --- a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs @@ -1,3 +1,4 @@ +using System; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; @@ -6,9 +7,11 @@ namespace BCnEncoder.Encoder internal interface IBcBlockEncoder { byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, OperationContext context); + void EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality, Span output); GlInternalFormat GetInternalFormat(); GlFormat GetBaseInternalFormat(); DxgiFormat GetDxgiFormat(); + int GetBlockSize(); } diff --git a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs index 8f4cb18..8f9b7e6 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs @@ -1,4 +1,4 @@ -using BCnEncoder.Shared; +using BCnEncoder.Shared; namespace BCnEncoder.Encoder.Options { @@ -44,5 +44,11 @@ public class EncoderOutputOptions /// Default is false. /// public bool DdsBc1WriteAlphaFlag { get; set; } = false; - } + + /// + /// When writing a dds file, always prefer using the Dxt10 header + /// to write the compression format instead of DwFourCC. + /// + public bool DdsPreferDxt10Header { get; set; } = false; + } } diff --git a/BCnEnc.Net/Shared/CompressionFormat.cs b/BCnEnc.Net/Shared/CompressionFormat.cs index 2f5befd..97c50c5 100644 --- a/BCnEnc.Net/Shared/CompressionFormat.cs +++ b/BCnEnc.Net/Shared/CompressionFormat.cs @@ -59,11 +59,11 @@ public enum CompressionFormat /// Atc, /// - /// ATC / Adreno Texture Compression encoding. Derivative of BC1. Good for sharp alpha transitions. + /// ATC / Adreno Texture Compression encoding. Derivative of BC2. Good for sharp alpha transitions. /// AtcExplicitAlpha, /// - /// ATC / Adreno Texture Compression encoding. Derivative of BC1. Good for smooth alpha transitions. + /// ATC / Adreno Texture Compression encoding. Derivative of BC3. Good for smooth alpha transitions. /// AtcInterpolatedAlpha } diff --git a/BCnEnc.Net/Shared/ImageFiles/DdsFile.cs b/BCnEnc.Net/Shared/ImageFiles/DdsFile.cs index a581541..a1b3172 100644 --- a/BCnEnc.Net/Shared/ImageFiles/DdsFile.cs +++ b/BCnEnc.Net/Shared/ImageFiles/DdsFile.cs @@ -68,20 +68,21 @@ public static DdsFile Load(Stream s) for (var mip = 0; mip < mipMapCount; mip++) { - var mipWidth = header.dwWidth >> mip; - var mipHeight = header.dwHeight >> mip; - // Saw this in a 1024x512 dds with 11 mipMapCount. Height became 0 (should be 1) - mipWidth = Math.Max(mipWidth, 1); - mipHeight = Math.Max(mipHeight, 1); + MipMapper.CalculateMipLevelSize( + (int)header.dwWidth, + (int)header.dwHeight, + mip, + out var mipWidth, + out var mipHeight); if (mip > 0) //Calculate new byteSize { - sizeInBytes = GetSizeInBytes(format, mipWidth, mipHeight); + sizeInBytes = GetSizeInBytes(format, (uint)mipWidth, (uint)mipHeight); } var data = new byte[sizeInBytes]; br.Read(data); - output.Faces[face].MipMaps[mip] = new DdsMipMap(data, mipWidth, mipHeight); + output.Faces[face].MipMaps[mip] = new DdsMipMap(data, (uint)mipWidth, (uint)mipHeight); } } @@ -155,17 +156,8 @@ private static uint GetSizeInBytes(DxgiFormat format, uint width, uint height) uint sizeInBytes; if (format.IsCompressedFormat()) { - sizeInBytes = (uint)Math.Max(1, ((width + 3) & ~3) >> 2) * (uint)Math.Max(1, ((height + 3) & ~3) >> 2); - if (format == DxgiFormat.DxgiFormatBc1Unorm || - format == DxgiFormat.DxgiFormatBc1UnormSrgb || - format == DxgiFormat.DxgiFormatBc1Typeless) - { - sizeInBytes *= 8; - } - else - { - sizeInBytes *= 16; - } + sizeInBytes = (uint)ImageToBlocks.CalculateNumOfBlocks((int)width, (int)height); + sizeInBytes *= (uint)format.GetByteSize(); } else { @@ -198,7 +190,7 @@ public unsafe struct DdsHeader public uint dwCaps4; public uint dwReserved2; - public static (DdsHeader, DdsHeaderDx10) InitializeCompressed(int width, int height, DxgiFormat format) + public static (DdsHeader, DdsHeaderDx10) InitializeCompressed(int width, int height, DxgiFormat format, bool preferDxt10Header) { var header = new DdsHeader(); var dxt10Header = new DdsHeaderDx10(); @@ -211,91 +203,139 @@ public static (DdsHeader, DdsHeaderDx10) InitializeCompressed(int width, int hei header.dwMipMapCount = 1; header.dwCaps = HeaderCaps.DdscapsTexture; - switch (format) + if (preferDxt10Header) { - case DxgiFormat.DxgiFormatBc1Unorm: - header.ddsPixelFormat = new DdsPixelFormat - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Dxt1 - }; - break; - - case DxgiFormat.DxgiFormatBc2Unorm: - header.ddsPixelFormat = new DdsPixelFormat - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Dxt3 - }; - break; - - case DxgiFormat.DxgiFormatBc3Unorm: - header.ddsPixelFormat = new DdsPixelFormat - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Dxt5 - }; - break; - - case DxgiFormat.DxgiFormatBc4Unorm: - header.ddsPixelFormat = new DdsPixelFormat - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Ati1 - }; - break; - - case DxgiFormat.DxgiFormatBc5Unorm: - header.ddsPixelFormat = new DdsPixelFormat - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Ati2 - }; - break; - - case DxgiFormat.DxgiFormatAtc: - header.ddsPixelFormat = new DdsPixelFormat - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Atc - }; - break; - - case DxgiFormat.DxgiFormatAtcExplicitAlpha: - header.ddsPixelFormat = new DdsPixelFormat - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Atci - }; - break; - - case DxgiFormat.DxgiFormatAtcInterpolatedAlpha: - header.ddsPixelFormat = new DdsPixelFormat - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Atca - }; - break; - - default: - header.ddsPixelFormat = new DdsPixelFormat - { - dwSize = 32, - dwFlags = PixelFormatFlags.DdpfFourcc, - dwFourCc = DdsPixelFormat.Dx10 - }; - dxt10Header.arraySize = 1; - dxt10Header.dxgiFormat = format; - dxt10Header.resourceDimension = D3D10ResourceDimension.D3D10ResourceDimensionTexture2D; - break; + // ATC formats cannot be written to DXT10 header due to lack of a DxgiFormat enum + switch (format) + { + case DxgiFormat.DxgiFormatAtcExt: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Atc + }; + break; + + case DxgiFormat.DxgiFormatAtcExplicitAlphaExt: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Atci + }; + break; + + case DxgiFormat.DxgiFormatAtcInterpolatedAlphaExt: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Atca + }; + break; + + default: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dx10 + }; + dxt10Header.arraySize = 1; + dxt10Header.dxgiFormat = format; + dxt10Header.resourceDimension = D3D10ResourceDimension.D3D10ResourceDimensionTexture2D; + break; + } + } + else + { + switch (format) + { + case DxgiFormat.DxgiFormatBc1Unorm: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dxt1 + }; + break; + + case DxgiFormat.DxgiFormatBc2Unorm: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dxt3 + }; + break; + + case DxgiFormat.DxgiFormatBc3Unorm: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dxt5 + }; + break; + + case DxgiFormat.DxgiFormatBc4Unorm: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Bc4U + }; + break; + + case DxgiFormat.DxgiFormatBc5Unorm: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Ati2 + }; + break; + + case DxgiFormat.DxgiFormatAtcExt: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Atc + }; + break; + + case DxgiFormat.DxgiFormatAtcExplicitAlphaExt: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Atci + }; + break; + + case DxgiFormat.DxgiFormatAtcInterpolatedAlphaExt: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Atca + }; + break; + + default: + header.ddsPixelFormat = new DdsPixelFormat + { + dwSize = 32, + dwFlags = PixelFormatFlags.DdpfFourcc, + dwFourCc = DdsPixelFormat.Dx10 + }; + dxt10Header.arraySize = 1; + dxt10Header.dxgiFormat = format; + dxt10Header.resourceDimension = D3D10ResourceDimension.D3D10ResourceDimensionTexture2D; + break; + } } return (header, dxt10Header); @@ -329,7 +369,7 @@ public static DdsHeader InitializeUncompressed(int width, int height, DxgiFormat header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DdpfLuminance | PixelFormatFlags.DdpfAlphapixels, + dwFlags = PixelFormatFlags.DdpfLuminance | PixelFormatFlags.DdpfAlphaPixels, dwRgbBitCount = 16, dwRBitMask = 0xFF, dwGBitMask = 0xFF00 @@ -341,7 +381,7 @@ public static DdsHeader InitializeUncompressed(int width, int height, DxgiFormat header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DdpfRgb | PixelFormatFlags.DdpfAlphapixels, + dwFlags = PixelFormatFlags.DdpfRgb | PixelFormatFlags.DdpfAlphaPixels, dwRgbBitCount = 32, dwRBitMask = 0xFF, dwGBitMask = 0xFF00, @@ -355,7 +395,7 @@ public static DdsHeader InitializeUncompressed(int width, int height, DxgiFormat header.ddsPixelFormat = new DdsPixelFormat() { dwSize = 32, - dwFlags = PixelFormatFlags.DdpfRgb | PixelFormatFlags.DdpfAlphapixels, + dwFlags = PixelFormatFlags.DdpfRgb | PixelFormatFlags.DdpfAlphaPixels, dwRgbBitCount = 32, dwRBitMask = 0xFF0000, dwGBitMask = 0xFF00, @@ -375,17 +415,32 @@ public static DdsHeader InitializeUncompressed(int width, int height, DxgiFormat public struct DdsPixelFormat { - public const uint Dxt1 = 0x31545844U; - public const uint Dxt2 = 0x32545844U; - public const uint Dxt3 = 0x33545844U; - public const uint Dxt4 = 0x34545844U; - public const uint Dxt5 = 0x35545844U; - public const uint Ati1 = 0x41544931U; - public const uint Ati2 = 0x41544932U; - public const uint Atc = 0x42544320U; - public const uint Atci = 0x42544349U; - public const uint Atca = 0x42544341U; - public const uint Dx10 = 0x30315844U; + public static readonly uint Dx10 = MakeFourCc('D', 'X', '1', '0'); + + public static readonly uint Dxt1 = MakeFourCc('D', 'X', 'T', '1'); + public static readonly uint Dxt2 = MakeFourCc('D', 'X', 'T', '2'); + public static readonly uint Dxt3 = MakeFourCc('D', 'X', 'T', '3'); + public static readonly uint Dxt4 = MakeFourCc('D', 'X', 'T', '4'); + public static readonly uint Dxt5 = MakeFourCc('D', 'X', 'T', '5'); + public static readonly uint Ati1 = MakeFourCc('A', 'T', 'I', '1'); + public static readonly uint Ati2 = MakeFourCc('A', 'T', 'I', '2'); + public static readonly uint Atc = MakeFourCc('A', 'T', 'C', ' '); + public static readonly uint Atci = MakeFourCc('A', 'T', 'C', 'I'); + public static readonly uint Atca = MakeFourCc('A', 'T', 'C', 'A'); + + public static readonly uint Bc4S = MakeFourCc('B', 'C', '4', 'S'); + public static readonly uint Bc4U = MakeFourCc('B', 'C', '4', 'U'); + public static readonly uint Bc5S = MakeFourCc('B', 'C', '5', 'S'); + public static readonly uint Bc5U = MakeFourCc('B', 'C', '5', 'U'); + + private static uint MakeFourCc(char c0, char c1, char c2, char c3) + { + uint result = c0; + result |= (uint)c1 << 8; + result |= (uint)c2 << 16; + result |= (uint)c3 << 24; + return result; + } public uint dwSize; public PixelFormatFlags dwFlags; @@ -402,33 +457,20 @@ public DxgiFormat DxgiFormat { if (dwFlags.HasFlag(PixelFormatFlags.DdpfFourcc)) { - switch (dwFourCc) - { - case Dxt1: - return DxgiFormat.DxgiFormatBc1Unorm; - case Dxt2: - case Dxt3: - return DxgiFormat.DxgiFormatBc2Unorm; - case Dxt4: - case Dxt5: - return DxgiFormat.DxgiFormatBc3Unorm; - case Ati1: - return DxgiFormat.DxgiFormatBc4Unorm; - case Ati2: - return DxgiFormat.DxgiFormatBc5Unorm; - case Atc: - return DxgiFormat.DxgiFormatAtc; - case Atci: - return DxgiFormat.DxgiFormatAtcExplicitAlpha; - case Atca: - return DxgiFormat.DxgiFormatAtcInterpolatedAlpha; - } + if (dwFourCc == Dxt1) return DxgiFormat.DxgiFormatBc1Unorm; + if (dwFourCc == Dxt2 || dwFourCc == Dxt3) return DxgiFormat.DxgiFormatBc2Unorm; + if (dwFourCc == Dxt4 || dwFourCc == Dxt5) return DxgiFormat.DxgiFormatBc3Unorm; + if (dwFourCc == Ati1 || dwFourCc == Bc4S || dwFourCc == Bc4U) return DxgiFormat.DxgiFormatBc4Unorm; + if (dwFourCc == Ati2 || dwFourCc == Bc5S || dwFourCc == Bc5U) return DxgiFormat.DxgiFormatBc5Unorm; + if (dwFourCc == Atc) return DxgiFormat.DxgiFormatAtcExt; + if (dwFourCc == Atci) return DxgiFormat.DxgiFormatAtcExplicitAlphaExt; + if (dwFourCc == Atca) return DxgiFormat.DxgiFormatAtcInterpolatedAlphaExt; } else { if (dwFlags.HasFlag(PixelFormatFlags.DdpfRgb)) // RGB/A { - if (dwFlags.HasFlag(PixelFormatFlags.DdpfAlphapixels)) //RGBA + if (dwFlags.HasFlag(PixelFormatFlags.DdpfAlphaPixels)) //RGBA { if (dwRgbBitCount == 32) { @@ -458,7 +500,7 @@ public DxgiFormat DxgiFormat } else if (dwFlags.HasFlag(PixelFormatFlags.DdpfLuminance)) // R/RG { - if (dwFlags.HasFlag(PixelFormatFlags.DdpfAlphapixels)) // RG + if (dwFlags.HasFlag(PixelFormatFlags.DdpfAlphaPixels)) // RG { if (dwRgbBitCount == 16) { @@ -486,13 +528,6 @@ public DxgiFormat DxgiFormat public bool IsDxt10Format => (dwFlags & PixelFormatFlags.DdpfFourcc) == PixelFormatFlags.DdpfFourcc && dwFourCc == Dx10; - - public bool IsDxt1To5CompressedFormat => (dwFlags & PixelFormatFlags.DdpfFourcc) == PixelFormatFlags.DdpfFourcc - && (dwFourCc == Dxt1 - || dwFourCc == Dxt2 - || dwFourCc == Dxt3 - || dwFourCc == Dxt4 - || dwFourCc == Dxt5); } public struct DdsHeaderDx10 @@ -643,7 +678,7 @@ public enum PixelFormatFlags : uint /// /// Texture contains alpha data; dwRGBAlphaBitMask contains valid data. /// - DdpfAlphapixels = 0x1, + DdpfAlphaPixels = 0x1, /// /// Used in some older DDS files for alpha channel only uncompressed data (dwRGBBitCount contains the alpha channel bitcount; dwABitMask contains valid data) /// @@ -798,10 +833,10 @@ public enum DxgiFormat : uint DxgiFormatV408, DxgiFormatForceUint, - // Added here due to missing documentation of an official value - DxgiFormatAtc = 300, - DxgiFormatAtcExplicitAlpha, - DxgiFormatAtcInterpolatedAlpha + // Added here due to lack of an official value + DxgiFormatAtcExt = 300, + DxgiFormatAtcExplicitAlphaExt, + DxgiFormatAtcInterpolatedAlphaExt }; public static class DxgiFormatExtensions @@ -1016,6 +1051,12 @@ public static int GetByteSize(this DxgiFormat format) return 2; case DxgiFormat.DxgiFormatB4G4R4A4Unorm: return 2; + case DxgiFormat.DxgiFormatAtcExt: + return 8; + case DxgiFormat.DxgiFormatAtcExplicitAlphaExt: + return 16; + case DxgiFormat.DxgiFormatAtcInterpolatedAlphaExt: + return 16; } return 4; } @@ -1045,6 +1086,9 @@ public static bool IsCompressedFormat(this DxgiFormat format) case DxgiFormat.DxgiFormatBc7Typeless: case DxgiFormat.DxgiFormatBc7Unorm: case DxgiFormat.DxgiFormatBc7UnormSrgb: + case DxgiFormat.DxgiFormatAtcExt: + case DxgiFormat.DxgiFormatAtcExplicitAlphaExt: + case DxgiFormat.DxgiFormatAtcInterpolatedAlphaExt: return true; default: diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index e901f08..324e7c1 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -125,5 +125,10 @@ public static int CalculateNumOfBlocks(int pixelWidth, int pixelHeight) return blocksWidth * blocksHeight; } + public static void CalculateNumOfBlocks(int pixelWidth, int pixelHeight, out int blocksWidth, out int blocksHeight) + { + blocksWidth = ((pixelWidth + 3) & ~3) >> 2; + blocksHeight = ((pixelHeight + 3) & ~3) >> 2; + } } } diff --git a/BCnEncTests/SingleBlockTests.cs b/BCnEncTests/SingleBlockTests.cs new file mode 100644 index 0000000..e1c0bd8 --- /dev/null +++ b/BCnEncTests/SingleBlockTests.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using BCnEncTests.Support; +using Microsoft.Toolkit.HighPerformance.Extensions; +using SixLabors.ImageSharp.Advanced; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; + +namespace BCnEncTests +{ + public class SingleBlockTests + { + + [Theory] + [InlineData(CompressionFormat.Bc1, CompressionQuality.Fast)] + [InlineData(CompressionFormat.Bc1, CompressionQuality.Balanced)] + [InlineData(CompressionFormat.Bc3, CompressionQuality.Fast)] + [InlineData(CompressionFormat.Bc3, CompressionQuality.Balanced)] + [InlineData(CompressionFormat.Bc7, CompressionQuality.Fast)] + public void SingleBlockEncodeDecodeStream(CompressionFormat format, CompressionQuality quality) + { + var testImage = ImageLoader.TestAlpha1; + + var encoder = new BcEncoder() + { + OutputOptions = + { + Format = format, + Quality = quality + } + }; + + var pixels = testImage.GetPixelMemoryGroup()[0]; + var colors = MemoryMarshal.Cast(pixels.Span) + .AsSpan2D(testImage.Height, testImage.Width); + + var ms = new MemoryStream(); + + for (var y = 0; y < testImage.Height; y+=4) + { + for (var x = 0; x < testImage.Width; x+=4) + { + encoder.EncodeBlock(colors.Slice(y, x, 4, 4), ms); + } + } + + Assert.Equal(ms.Position, encoder.GetBlockSize() * encoder.GetBlockCount(testImage.Width, testImage.Height)); + + ms.Position = 0; + + var decoder = new BcDecoder(); + + var decoded = new ColorRgba32[testImage.Height, testImage.Width]; + + for (var y = 0; y < testImage.Height; y += 4) + { + for (var x = 0; x < testImage.Width; x += 4) + { + decoder.DecodeBlock(ms, format, + decoded.AsSpan2D().Slice(y, x, 4, 4)); + } + } + + colors.TryGetSpan(out var oPixels); + decoded.AsSpan2D().TryGetSpan(out var dPixels); + var psnr = ImageQuality.PeakSignalToNoiseRatio(oPixels, dPixels, + format != CompressionFormat.Bc1); + + TestHelper.AssertPSNR(psnr, quality); + } + + [Theory] + [InlineData(CompressionFormat.Bc1, CompressionQuality.Fast)] + [InlineData(CompressionFormat.Bc1, CompressionQuality.Balanced)] + [InlineData(CompressionFormat.Bc3, CompressionQuality.Fast)] + [InlineData(CompressionFormat.Bc3, CompressionQuality.Balanced)] + [InlineData(CompressionFormat.Bc7, CompressionQuality.Fast)] + public void SingleBlockEncodeDecode(CompressionFormat format, CompressionQuality quality) + { + var testImage = ImageLoader.TestAlpha1; + + var encoder = new BcEncoder() + { + OutputOptions = + { + Format = format, + Quality = quality + } + }; + + var pixels = testImage.GetPixelMemoryGroup()[0]; + var colors = MemoryMarshal.Cast(pixels.Span) + .AsSpan2D(testImage.Height, testImage.Width); + + Span buffer = new byte[encoder.GetBlockSize() * encoder.GetBlockCount(testImage.Width, testImage.Height)]; + + var blockIndex = 0; + for (var y = 0; y < testImage.Height; y += 4) + { + for (var x = 0; x < testImage.Width; x += 4) + { + var bytes = encoder.EncodeBlock(colors.Slice(y, x, 4, 4)); + bytes.CopyTo(buffer.Slice(blockIndex * encoder.GetBlockSize())); + blockIndex++; + } + } + + var decoder = new BcDecoder(); + + var decoded = new ColorRgba32[testImage.Height, testImage.Width]; + + blockIndex = 0; + for (var y = 0; y < testImage.Height; y += 4) + { + for (var x = 0; x < testImage.Width; x += 4) + { + + decoder.DecodeBlock( + buffer.Slice( + blockIndex * decoder.GetBlockSize(format), + decoder.GetBlockSize(format) + ), + format, + decoded.AsSpan2D().Slice(y, x, 4, 4)); + blockIndex++; + } + } + + colors.TryGetSpan(out var oPixels); + decoded.AsSpan2D().TryGetSpan(out var dPixels); + var psnr = ImageQuality.PeakSignalToNoiseRatio(oPixels, dPixels, + format != CompressionFormat.Bc1); + + TestHelper.AssertPSNR(psnr, quality); + } + } +} diff --git a/BCnEncTests/Support/TestHelper.cs b/BCnEncTests/Support/TestHelper.cs index 15df85a..0a30843 100644 --- a/BCnEncTests/Support/TestHelper.cs +++ b/BCnEncTests/Support/TestHelper.cs @@ -169,7 +169,7 @@ private static float CalculatePSNR(Image original, Image decoded MemoryMarshal.Cast(pixels2)); } - private static void AssertPSNR(float psnr, CompressionQuality quality) + public static void AssertPSNR(float psnr, CompressionQuality quality) { if (quality == CompressionQuality.Fast) { From 03eb624ae0d01dba19e34287b3f67ea645c8255e Mon Sep 17 00:00:00 2001 From: Nominom Date: Mon, 8 Feb 2021 22:08:17 +0200 Subject: [PATCH 064/116] Byte order encoding tests --- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 2 +- BCnEncTests/EncodeByteOrderTests.cs | 75 ++++++++++++++++++++++++ BCnEncTests/Support/TestHelper.cs | 8 +-- 3 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 BCnEncTests/EncodeByteOrderTests.cs diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index 30abf6b..e3516a3 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -56,7 +56,7 @@ public void EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality, Spa { throw new Exception("Cannot encode block! Output buffer is not the correct size."); } - T encoded = EncodeBlock(block, quality); + var encoded = EncodeBlock(block, quality); MemoryMarshal.Cast(output)[0] = encoded; } diff --git a/BCnEncTests/EncodeByteOrderTests.cs b/BCnEncTests/EncodeByteOrderTests.cs new file mode 100644 index 0000000..75cb331 --- /dev/null +++ b/BCnEncTests/EncodeByteOrderTests.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.NET.ImageSharp; +using BCnEncoder.Shared; +using BCnEncTests.Support; +using SixLabors.ImageSharp.Advanced; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; + +namespace BCnEncTests +{ + public class EncodeByteOrderTests + { + + private void EncodeByteOrderTest(PixelFormat pixelFormat) where T : unmanaged, IPixel + { + var imageOrig = ImageLoader.TestAlpha1; + var testImage = imageOrig.CloneAs(); + + var pixels = testImage.GetPixelMemoryGroup()[0]; + var bytes = MemoryMarshal.AsBytes(pixels.Span); + + var encoder = new BcEncoder(CompressionFormat.Bc3); + var decoder = new BcDecoder(); + + using var ms = new MemoryStream(); + + encoder.EncodeToStream(bytes, testImage.Width, testImage.Height, pixelFormat, ms); + + ms.Position = 0; + + var decoded = decoder.DecodeToImageRgba32(ms); + + bool hasNoAlpha = pixelFormat == PixelFormat.Rgb24 || pixelFormat == PixelFormat.Bgr24; + + TestHelper.AssertImagesEqual(imageOrig, decoded, encoder.OutputOptions.Quality, + !hasNoAlpha); + } + + [Fact] + public void EncodeByteOrderBgra() + { + EncodeByteOrderTest(PixelFormat.Bgra32); + } + + [Fact] + public void EncodeByteOrderBgr() + { + EncodeByteOrderTest(PixelFormat.Bgr24); + } + + [Fact] + public void EncodeByteOrderArgb() + { + EncodeByteOrderTest(PixelFormat.Argb32); + } + + [Fact] + public void EncodeByteOrderRgba() + { + EncodeByteOrderTest(PixelFormat.Rgba32); + } + + [Fact] + public void EncodeByteOrderRgb24() + { + EncodeByteOrderTest(PixelFormat.Rgb24); + } + } +} diff --git a/BCnEncTests/Support/TestHelper.cs b/BCnEncTests/Support/TestHelper.cs index 0a30843..ef5b62d 100644 --- a/BCnEncTests/Support/TestHelper.cs +++ b/BCnEncTests/Support/TestHelper.cs @@ -27,9 +27,9 @@ public static void AssertPixelsEqual(Span originalPixels, Span p AssertPSNR(psnr, quality); } - public static void AssertImagesEqual(Image original, Image image, CompressionQuality quality) + public static void AssertImagesEqual(Image original, Image image, CompressionQuality quality, bool countAlpha = true) { - var psnr = CalculatePSNR(original, image); + var psnr = CalculatePSNR(original, image, countAlpha); AssertPSNR(psnr, quality); } @@ -153,7 +153,7 @@ public static void ExecuteEncodingTest(Image image, CompressionFormat fo AssertPSNR(psnr, encoder.OutputOptions.Quality); } - private static float CalculatePSNR(Image original, Image decoded) + private static float CalculatePSNR(Image original, Image decoded, bool countAlpha = true) { if (!original.TryGetSinglePixelSpan(out var pixels)) { @@ -166,7 +166,7 @@ private static float CalculatePSNR(Image original, Image decoded return ImageQuality.PeakSignalToNoiseRatio( MemoryMarshal.Cast(pixels), - MemoryMarshal.Cast(pixels2)); + MemoryMarshal.Cast(pixels2), countAlpha); } public static void AssertPSNR(float psnr, CompressionQuality quality) From 0450b55630d7c767ed0216695dab50f88c7edd06 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Tue, 9 Feb 2021 12:47:53 +0100 Subject: [PATCH 065/116] Add Bc4Component configuration for BC4 and BC5 in BcEncoder and BcDecoder; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 19 ++-- BCnEnc.Net/Decoder/BcDecoder.cs | 56 ++++++------ .../Decoder/Options/DecoderOutputOptions.cs | 40 ++++++--- BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 38 +------- BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 6 +- BCnEnc.Net/Encoder/BcEncoder.cs | 4 +- .../Encoder/Options/EncoderInputOptions.cs | 27 ++++-- .../Encoder/Options/EncoderOutputOptions.cs | 15 ++++ BCnEnc.Net/Shared/Bc4Component.cs | 33 +++++++ BCnEnc.Net/Shared/ComponentHelper.cs | 87 +++++++++++++++++++ BCnEnc.Net/Shared/EncodedBlocks.cs | 40 ++++----- BCnEncTests/Bc5Tests.cs | 10 +-- 12 files changed, 254 insertions(+), 121 deletions(-) create mode 100644 BCnEnc.Net/Shared/Bc4Component.cs create mode 100644 BCnEnc.Net/Shared/ComponentHelper.cs diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index 4398abe..be0ae6b 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -109,24 +109,33 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc3Block block) internal class Bc4Decoder : BaseBcBlockDecoder { - private readonly bool redAsLuminance; + private readonly Bc4Component component; - public Bc4Decoder(bool redAsLuminance) + public Bc4Decoder(Bc4Component component) { - this.redAsLuminance = redAsLuminance; + this.component = component; } protected override RawBlock4X4Rgba32 DecodeBlock(Bc4Block block) { - return block.Decode(redAsLuminance); + return block.Decode(component); } } internal class Bc5Decoder : BaseBcBlockDecoder { + private readonly Bc4Component component1; + private readonly Bc4Component component2; + + public Bc5Decoder(Bc4Component component1, Bc4Component component2) + { + this.component1 = component1; + this.component2 = component2; + } + protected override RawBlock4X4Rgba32 DecodeBlock(Bc5Block block) { - return block.Decode(); + return block.Decode(component1, component2); } } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 2d3cfa5..40b69a9 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -457,14 +457,14 @@ public int DecodeBlock(Stream inputStream, CompressionFormat format, Span2D input = stackalloc byte[16]; input = input.Slice(0, GetBlockSize(format)); - + var bytesRead = inputStream.Read(input); if (bytesRead == 0) { return 0; //End of stream } - + if (bytesRead != input.Length) { throw new Exception("Input stream does not have enough data available for a full block."); @@ -490,33 +490,33 @@ private Memory2D[] DecodeFromStreamInternal2D(Stream stream, bool a switch (format) { case ImageFileFormat.Dds: - { - var file = DdsFile.Load(stream); - var decoded = DecodeInternal(file, allMipMaps, token); - var mem2Ds = new Memory2D[decoded.Length]; - for (var i = 0; i < decoded.Length; i++) { - var mip = file.Faces[0].MipMaps[i]; - mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int) mip.Height, (int) mip.Width); + var file = DdsFile.Load(stream); + var decoded = DecodeInternal(file, allMipMaps, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.Faces[0].MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); + } + + return mem2Ds; } - return mem2Ds; - } - case ImageFileFormat.Ktx: - { - var file = KtxFile.Load(stream); - var decoded = DecodeInternal(file, allMipMaps, token); - var mem2Ds = new Memory2D[decoded.Length]; - for (var i = 0; i < decoded.Length; i++) { - var mip = file.MipMaps[i]; - mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int) mip.Height, (int) mip.Width); + var file = KtxFile.Load(stream); + var decoded = DecodeInternal(file, allMipMaps, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); + } + + return mem2Ds; } - return mem2Ds; - } - default: throw new InvalidOperationException("Unknown image format."); } @@ -550,7 +550,7 @@ private ColorRgba32[][] DecodeInternal(KtxFile file, bool allMipMaps, Cancellati if (IsSupportedRawFormat(file.header.GlInternalFormat)) { var decoder = GetRawDecoder(file.header.GlInternalFormat); - + for (var mip = 0; mip < mipMaps; mip++) { var data = file.MipMaps[mip].Faces[0].Data; @@ -567,7 +567,7 @@ private ColorRgba32[][] DecodeInternal(KtxFile file, bool allMipMaps, Cancellati { throw new NotSupportedException($"This Format is not supported: {file.header.GlInternalFormat}"); } - + for (var mip = 0; mip < mipMaps; mip++) { var data = file.MipMaps[mip].Faces[0].Data; @@ -613,7 +613,7 @@ private ColorRgba32[][] DecodeInternal(DdsFile file, bool allMipMaps, Cancellati if (IsSupportedRawFormat(file)) { var decoder = GetRawDecoder(file); - + for (var mip = 0; mip < mipMaps; mip++) { var data = file.Faces[0].MipMaps[mip].Data; @@ -634,7 +634,7 @@ private ColorRgba32[][] DecodeInternal(DdsFile file, bool allMipMaps, Cancellati { throw new NotSupportedException($"This Format is not supported: {format}"); } - + for (var mip = 0; mip < mipMaps; mip++) { var data = file.Faces[0].MipMaps[mip].Data; @@ -787,10 +787,10 @@ private IBcBlockDecoder GetDecoder(CompressionFormat format) return new Bc3Decoder(); case CompressionFormat.Bc4: - return new Bc4Decoder(OutputOptions.RedAsLuminance); + return new Bc4Decoder(OutputOptions.Bc4Component); case CompressionFormat.Bc5: - return new Bc5Decoder(); + return new Bc5Decoder(OutputOptions.Bc5Component1, OutputOptions.Bc5Component2); case CompressionFormat.Bc7: return new Bc7Decoder(); diff --git a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs index 6cb2526..bf3a1bd 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs @@ -1,14 +1,32 @@ -namespace BCnEncoder.Decoder.Options +using BCnEncoder.Encoder; +using BCnEncoder.Shared; + +namespace BCnEncoder.Decoder.Options { - /// - /// A class for the decoder output options. - /// + /// + /// A class for the decoder output options. + /// public class DecoderOutputOptions - { - /// - /// If true, when decoding from a Format that only includes a red channel, - /// output pixels will have all colors set to the same value (greyscale). Default is true. - /// - public bool RedAsLuminance { get; set; } = true; - } + { + /// + /// If true, when decoding from a Format that only includes a red channel, + /// output pixels will have all colors set to the same value (greyscale). Default is true. + /// + public bool RedAsLuminance { get; set; } = true; + + /// + /// The color channel to populate with the values of a BC4 block. + /// + public Bc4Component Bc4Component { get; } = Bc4Component.R; + + /// + /// The color channel to populate with the values of the first BC5 block. + /// + public Bc4Component Bc5Component1 { get; } = Bc4Component.R; + + /// + /// The color channel to populate with the values of the second BC5 block. + /// + public Bc4Component Bc5Component2 { get; } = Bc4Component.G; + } } diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index 5de48a6..8865efc 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -5,29 +5,20 @@ namespace BCnEncoder.Encoder { - internal enum Bc4Component - { - R, - G, - B, - A, - Luminance - } - internal class Bc4BlockEncoder : BaseBcBlockEncoder { private readonly Bc4ComponentBlockEncoder bc4Encoder; - public Bc4BlockEncoder(bool luminanceAsRed) + public Bc4BlockEncoder(Bc4Component component) { - bc4Encoder = new Bc4ComponentBlockEncoder(luminanceAsRed ? Bc4Component.Luminance : Bc4Component.R); + bc4Encoder = new Bc4ComponentBlockEncoder(component); } public override Bc4Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { var output = new Bc4Block { - redBlock = bc4Encoder.EncodeBlock(block, quality) + componentBlock = bc4Encoder.EncodeBlock(block, quality) }; return output; @@ -66,28 +57,7 @@ public Bc4ComponentBlock EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality var colors = new byte[pixels.Length]; for (var i = 0; i < pixels.Length; i++) - switch (component) - { - case Bc4Component.R: - colors[i] = pixels[i].r; - break; - - case Bc4Component.G: - colors[i] = pixels[i].g; - break; - - case Bc4Component.B: - colors[i] = pixels[i].b; - break; - - case Bc4Component.A: - colors[i] = pixels[i].a; - break; - - case Bc4Component.Luminance: - colors[i] = (byte)(new ColorYCbCr(pixels[i]).y * 255); - break; - } + colors[i] = ComponentHelper.ColorToComponent(pixels[i], component); switch (quality) { diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index 7688df1..c3bfb31 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -8,10 +8,10 @@ internal class Bc5BlockEncoder : BaseBcBlockEncoder private readonly Bc4ComponentBlockEncoder redBlockEncoder; private readonly Bc4ComponentBlockEncoder greenBlockEncoder; - public Bc5BlockEncoder() + public Bc5BlockEncoder(Bc4Component component1, Bc4Component component2) { - redBlockEncoder = new Bc4ComponentBlockEncoder(Bc4Component.R); - greenBlockEncoder = new Bc4ComponentBlockEncoder(Bc4Component.G); + redBlockEncoder = new Bc4ComponentBlockEncoder(component1); + greenBlockEncoder = new Bc4ComponentBlockEncoder(component2); } public override Bc5Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index b501768..7f87ceb 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -1325,10 +1325,10 @@ private IBcBlockEncoder GetEncoder(CompressionFormat format) return new Bc3BlockEncoder(); case CompressionFormat.Bc4: - return new Bc4BlockEncoder(InputOptions.LuminanceAsRed); + return new Bc4BlockEncoder(InputOptions.Bc4Component); case CompressionFormat.Bc5: - return new Bc5BlockEncoder(); + return new Bc5BlockEncoder(InputOptions.Bc5Component1, InputOptions.Bc5Component2); case CompressionFormat.Bc7: return new Bc7Encoder(); diff --git a/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs index 2cd9948..2086b5b 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs @@ -1,14 +1,31 @@ -namespace BCnEncoder.Encoder.Options +using BCnEncoder.Shared; + +namespace BCnEncoder.Encoder.Options { /// /// The input options for the decoder. /// public class EncoderInputOptions { + /// + /// If true, when encoding to a Format that only includes a red channel, + /// use the pixel luminance instead of just the red channel. Default is false. + /// + public bool LuminanceAsRed { get; set; } = false; + + /// + /// The color channel to populate with the values of a BC4 block. + /// + public Bc4Component Bc4Component { get; } = Bc4Component.R; + /// - /// If true, when encoding to a Format that only includes a red channel, - /// use the pixel luminance instead of just the red channel. Default is false. + /// The color channel to populate with the values of the first BC5 block. /// - public bool LuminanceAsRed { get; set; } = false; - } + public Bc4Component Bc5Component1 { get; } = Bc4Component.R; + + /// + /// The color channel to populate with the values of the second BC5 block. + /// + public Bc4Component Bc5Component2 { get; } = Bc4Component.G; + } } diff --git a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs index 8f9b7e6..4935364 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs @@ -50,5 +50,20 @@ public class EncoderOutputOptions /// to write the compression format instead of DwFourCC. /// public bool DdsPreferDxt10Header { get; set; } = false; + + /// + /// The color channel to take for the values of a BC4 block. + /// + public Bc4Component Bc4Component { get; } = Bc4Component.R; + + /// + /// The color channel to take for the values of the first BC5 block. + /// + public Bc4Component Bc5Component1 { get; } = Bc4Component.R; + + /// + /// The color channel to take for the values of the second BC5 block. + /// + public Bc4Component Bc5Component2 { get; } = Bc4Component.G; } } diff --git a/BCnEnc.Net/Shared/Bc4Component.cs b/BCnEnc.Net/Shared/Bc4Component.cs new file mode 100644 index 0000000..8e6a6fb --- /dev/null +++ b/BCnEnc.Net/Shared/Bc4Component.cs @@ -0,0 +1,33 @@ +namespace BCnEncoder.Shared +{ + /// + /// The component to take from colors for BC4 and BC5. + /// + public enum Bc4Component + { + /// + /// Specifies the red component. + /// + R, + + /// + /// Specifies the green component. + /// + G, + + /// + /// Specifies the blue component. + /// + B, + + /// + /// Specifies the alpha component. + /// + A, + + /// + /// Specifies the luminance. + /// + Luminance + } +} diff --git a/BCnEnc.Net/Shared/ComponentHelper.cs b/BCnEnc.Net/Shared/ComponentHelper.cs new file mode 100644 index 0000000..2088ba8 --- /dev/null +++ b/BCnEnc.Net/Shared/ComponentHelper.cs @@ -0,0 +1,87 @@ +using System; +using BCnEncoder.Encoder; + +namespace BCnEncoder.Shared +{ + internal static class ComponentHelper + { + public static ColorRgba32 ComponentToColor(Bc4Component component, byte componentValue) + { + switch (component) + { + case Bc4Component.R: + return new ColorRgba32(componentValue, 0, 0, 255); + + case Bc4Component.G: + return new ColorRgba32(0, componentValue, 0, 255); + + case Bc4Component.B: + return new ColorRgba32(0, 0, componentValue, 255); + + case Bc4Component.A: + return new ColorRgba32(0, 0, 0, componentValue); + + case Bc4Component.Luminance: + return new ColorRgba32(componentValue, componentValue, componentValue, 255); + + default: + throw new InvalidOperationException("Unsupported component."); + } + } + + public static ColorRgba32 ComponentToColor(ColorRgba32 existingColor, Bc4Component component, byte componentValue) + { + switch (component) + { + case Bc4Component.R: + existingColor.r = componentValue; + break; + + case Bc4Component.G: + existingColor.g = componentValue; + break; + + case Bc4Component.B: + existingColor.b = componentValue; + break; + + case Bc4Component.A: + existingColor.a = componentValue; + break; + + case Bc4Component.Luminance: + existingColor.r = existingColor.g = existingColor.b = componentValue; + break; + + default: + throw new InvalidOperationException("Unsupported component."); + } + + return existingColor; + } + + public static byte ColorToComponent(ColorRgba32 color, Bc4Component component) + { + switch (component) + { + case Bc4Component.R: + return color.r; + + case Bc4Component.G: + return color.g; + + case Bc4Component.B: + return color.b; + + case Bc4Component.A: + return color.a; + + case Bc4Component.Luminance: + return (byte)(new ColorYCbCr(color).y * 255); + + default: + throw new InvalidOperationException("Unsupported component."); + } + } + } +} diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index f27146d..72da74e 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -1,5 +1,6 @@ using System; using System.Runtime.InteropServices; +using BCnEncoder.Encoder; namespace BCnEncoder.Shared { @@ -178,46 +179,34 @@ public readonly RawBlock4X4Rgba32 Decode() [StructLayout(LayoutKind.Sequential)] internal struct Bc4Block { - public Bc4ComponentBlock redBlock; + public Bc4ComponentBlock componentBlock; public byte Endpoint0 { - readonly get => redBlock.Endpoint0; - set => redBlock.Endpoint0 = value; + readonly get => componentBlock.Endpoint0; + set => componentBlock.Endpoint0 = value; } public byte Endpoint1 { - readonly get => redBlock.Endpoint1; - set => redBlock.Endpoint1 = value; + readonly get => componentBlock.Endpoint1; + set => componentBlock.Endpoint1 = value; } - public readonly byte GetComponentIndex(int pixelIndex) => redBlock.GetComponentIndex(pixelIndex); + public readonly byte GetComponentIndex(int pixelIndex) => componentBlock.GetComponentIndex(pixelIndex); - public void SetComponentIndex(int pixelIndex, byte redIndex) => redBlock.SetComponentIndex(pixelIndex, redIndex); + public void SetComponentIndex(int pixelIndex, byte redIndex) => componentBlock.SetComponentIndex(pixelIndex, redIndex); - public readonly RawBlock4X4Rgba32 Decode(bool redAsLuminance) + public readonly RawBlock4X4Rgba32 Decode(Bc4Component component = Bc4Component.R) { var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; - var reds = redBlock.Decode(); + var components = componentBlock.Decode(); - if (redAsLuminance) - { - for (var i = 0; i < pixels.Length; i++) - { - var index = GetComponentIndex(i); - pixels[i] = new ColorRgba32(reds[index], reds[index], reds[index], 255); - } - } - else + for (var i = 0; i < pixels.Length; i++) { - for (var i = 0; i < pixels.Length; i++) - { - var index = GetComponentIndex(i); - pixels[i] = new ColorRgba32(reds[index], 0, 0, 255); - } + pixels[i] = ComponentHelper.ComponentToColor(component, components[i]); } return output; @@ -262,7 +251,7 @@ public byte Green1 public void SetGreenIndex(int pixelIndex, byte greenIndex) => greenBlock.SetComponentIndex(pixelIndex, greenIndex); - public readonly RawBlock4X4Rgba32 Decode() + public readonly RawBlock4X4Rgba32 Decode(Bc4Component component1 = Bc4Component.R, Bc4Component component2 = Bc4Component.G) { var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; @@ -272,7 +261,8 @@ public readonly RawBlock4X4Rgba32 Decode() for (var i = 0; i < pixels.Length; i++) { - pixels[i] = new ColorRgba32(reds[i], greens[i], 0, 255); + pixels[i] = ComponentHelper.ComponentToColor(component1, reds[i]); + pixels[i] = ComponentHelper.ComponentToColor(pixels[i], component2, greens[i]); } return output; diff --git a/BCnEncTests/Bc5Tests.cs b/BCnEncTests/Bc5Tests.cs index fc40dff..da23122 100644 --- a/BCnEncTests/Bc5Tests.cs +++ b/BCnEncTests/Bc5Tests.cs @@ -1,13 +1,7 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; using BCnEncoder.Decoder; using BCnEncoder.NET.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; using Xunit; namespace BCnEncTests @@ -57,10 +51,10 @@ public void Bc5BlockDecode() { var block = new Bc5Block() { - greenBlock = new Bc4ComponentBlock(){componentBlock = 0x91824260008935ee}, + greenBlock = new Bc4ComponentBlock() { componentBlock = 0x91824260008935ee }, redBlock = new Bc4ComponentBlock() { componentBlock = 0x6d900f66d3c0a70d } }; - + var referenceBlock = new RawBlock4X4Rgba32 { p00 = new ColorRgba32(13, 53, 0, 255), From bfe82d53d23b654c67ff47f33c69e3363778bacf Mon Sep 17 00:00:00 2001 From: Nominom Date: Tue, 9 Feb 2021 19:18:21 +0200 Subject: [PATCH 066/116] Fixed bc4 tests, removed duplicate options and added setters for new options. --- .../Decoder/Options/DecoderOutputOptions.cs | 11 ++++---- .../Encoder/Options/EncoderInputOptions.cs | 26 +++++++++---------- .../Encoder/Options/EncoderOutputOptions.cs | 17 +----------- BCnEncTests/Support/TestHelper.cs | 5 +++- 4 files changed, 24 insertions(+), 35 deletions(-) diff --git a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs index bf3a1bd..219c95c 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs @@ -9,24 +9,25 @@ namespace BCnEncoder.Decoder.Options public class DecoderOutputOptions { /// - /// If true, when decoding from a Format that only includes a red channel, - /// output pixels will have all colors set to the same value (greyscale). Default is true. + /// If true, when decoding from R8 raw format, + /// output pixels will have all colors set to the same value (greyscale). + /// Default is true. (Does not apply to BC4 format.) /// public bool RedAsLuminance { get; set; } = true; /// /// The color channel to populate with the values of a BC4 block. /// - public Bc4Component Bc4Component { get; } = Bc4Component.R; + public Bc4Component Bc4Component { get; set; } = Bc4Component.R; /// /// The color channel to populate with the values of the first BC5 block. /// - public Bc4Component Bc5Component1 { get; } = Bc4Component.R; + public Bc4Component Bc5Component1 { get; set; } = Bc4Component.R; /// /// The color channel to populate with the values of the second BC5 block. /// - public Bc4Component Bc5Component2 { get; } = Bc4Component.G; + public Bc4Component Bc5Component2 { get; set; } = Bc4Component.G; } } diff --git a/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs index 2086b5b..3b9500b 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs @@ -8,24 +8,24 @@ namespace BCnEncoder.Encoder.Options public class EncoderInputOptions { /// - /// If true, when encoding to a Format that only includes a red channel, - /// use the pixel luminance instead of just the red channel. Default is false. + /// If true, when encoding to R8 raw format, + /// use the pixel luminance instead of just the red channel. Default is false. (Does not apply to BC4 format) /// public bool LuminanceAsRed { get; set; } = false; + /// + /// The color channel to take for the values of a BC4 block. + /// + public Bc4Component Bc4Component { get; set; } = Bc4Component.R; + /// - /// The color channel to populate with the values of a BC4 block. + /// The color channel to take for the values of the first BC5 block. /// - public Bc4Component Bc4Component { get; } = Bc4Component.R; + public Bc4Component Bc5Component1 { get; set; } = Bc4Component.R; - /// - /// The color channel to populate with the values of the first BC5 block. - /// - public Bc4Component Bc5Component1 { get; } = Bc4Component.R; - - /// - /// The color channel to populate with the values of the second BC5 block. - /// - public Bc4Component Bc5Component2 { get; } = Bc4Component.G; + /// + /// The color channel to take for the values of the second BC5 block. + /// + public Bc4Component Bc5Component2 { get; set; } = Bc4Component.G; } } diff --git a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs index 4935364..90161c6 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderOutputOptions.cs @@ -50,20 +50,5 @@ public class EncoderOutputOptions /// to write the compression format instead of DwFourCC. /// public bool DdsPreferDxt10Header { get; set; } = false; - - /// - /// The color channel to take for the values of a BC4 block. - /// - public Bc4Component Bc4Component { get; } = Bc4Component.R; - - /// - /// The color channel to take for the values of the first BC5 block. - /// - public Bc4Component Bc5Component1 { get; } = Bc4Component.R; - - /// - /// The color channel to take for the values of the second BC5 block. - /// - public Bc4Component Bc5Component2 { get; } = Bc4Component.G; - } + } } diff --git a/BCnEncTests/Support/TestHelper.cs b/BCnEncTests/Support/TestHelper.cs index ef5b62d..ca3d03d 100644 --- a/BCnEncTests/Support/TestHelper.cs +++ b/BCnEncTests/Support/TestHelper.cs @@ -131,7 +131,10 @@ public static float DecodeCheckPSNR(string filename, Image original) { using var fs = File.OpenRead(filename); var ktx = KtxFile.Load(fs); - var decoder = new BcDecoder(); + var decoder = new BcDecoder() + { + OutputOptions = { Bc4Component = Bc4Component.Luminance } + }; using var img = decoder.DecodeToImageRgba32(ktx); return CalculatePSNR(original, img); From 3941d5e6165ce40dc43eeb786fffcb1ff3c7c00b Mon Sep 17 00:00:00 2001 From: Nominom <7089998+Nominom@users.noreply.github.com> Date: Fri, 12 Feb 2021 13:33:07 +0200 Subject: [PATCH 067/116] Update README.md --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6d87019..3b86784 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,19 @@ Supported formats are: The current state of this library is in development but quite usable. I'm planning on implementing support for more codecs and different algorithms. The current version is capable of encoding and decoding BC1-BC5 and BC7 images in both KTX or DDS formats. -Please note, that the API might change between versions. I'm still trying to figure it out as I go. +Please note, that the API might change between versions. # Dependencies Current dependencies are: -* [SixLabors.ImageSharp](https://github.com/SixLabors/ImageSharp) licenced under the [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) licence for image loading and saving +* [Microsoft.Toolkit.HighPerformance](https://github.com/windows-toolkit/WindowsCommunityToolkit) licenced under the [MIT](https://opensource.org/licenses/MIT) licence for Span2D and Memory2D types. + +# Image library integrations +This library has integration packages available for the following image libraries: + +[ImageSharp](https://www.nuget.org/packages/BCnEncoder.Net.ImageSharp/) + +# Upgrading to 2.0 + +If you're upgrading from 1.X.X to version 2, expect some of your exsting code to be broken. ImageSharp was removed as a core dependency in version 2.0, so the code will no longer work with ImageSharp's Image types by default. You can install the integration package for ImageSharp to continue using this library easily with ImageSharp-based apis. # API For more detailed usage examples, you can go look at the unit tests. @@ -67,7 +76,6 @@ image.SaveAsPng(outFs); - [x] Implement PCA to remove Accord.Statistics dependency - [ ] BC6H HDR Encoding - [ ] ETC / ETC2 Encoding? -- [ ] Implement saving and loading basic image formats to remove ImageSharp dependency # Contributing All contributions are welcome. I'll try to respond to bug reports and feature requests as fast as possible, but you can also fix things yourself and submit a pull request. Please note, that by submitting a pull request you accept that your code will be dual licensed under MIT and public domain Unlicense. From 964be3c9007fe1743af9cfd04e5140925b7ec75a Mon Sep 17 00:00:00 2001 From: Nominom <7089998+Nominom@users.noreply.github.com> Date: Fri, 12 Feb 2021 16:12:32 +0200 Subject: [PATCH 068/116] Update README.md --- README.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 3b86784..932f39d 100644 --- a/README.md +++ b/README.md @@ -25,17 +25,19 @@ Please note, that the API might change between versions. Current dependencies are: * [Microsoft.Toolkit.HighPerformance](https://github.com/windows-toolkit/WindowsCommunityToolkit) licenced under the [MIT](https://opensource.org/licenses/MIT) licence for Span2D and Memory2D types. -# Image library integrations -This library has integration packages available for the following image libraries: +# Image library extensions +This library has extension packages available for the following image libraries: [ImageSharp](https://www.nuget.org/packages/BCnEncoder.Net.ImageSharp/) +The extension packages provide extension methods for ease of use with the image library. + # Upgrading to 2.0 -If you're upgrading from 1.X.X to version 2, expect some of your exsting code to be broken. ImageSharp was removed as a core dependency in version 2.0, so the code will no longer work with ImageSharp's Image types by default. You can install the integration package for ImageSharp to continue using this library easily with ImageSharp-based apis. +If you're upgrading from 1.X.X to version 2, expect some of your exsting code to be broken. ImageSharp was removed as a core dependency in version 2.0, so the code will no longer work with ImageSharp's Image types by default. You can install the extension package for ImageSharp to continue using this library easily with ImageSharp apis. # API -For more detailed usage examples, you can go look at the unit tests. +This below examples are using the ImageSharp extension package. For more detailed usage examples, you can go look at the unit tests. Here's an example on how to encode a png image to BC1 without alpha, and save it to a file. ```CSharp @@ -43,13 +45,13 @@ using Image image = Image.Load("example.png"); BcEncoder encoder = new BcEncoder(); -encoder.OutputOptions.generateMipMaps = true; -encoder.OutputOptions.quality = CompressionQuality.Balanced; -encoder.OutputOptions.format = CompressionFormat.BC1; -encoder.OutputOptions.fileFormat = OutputFileFormat.Ktx; //Change to Dds for a dds file. +encoder.OutputOptions.GenerateMipMaps = true; +encoder.OutputOptions.Quality = CompressionQuality.Balanced; +encoder.OutputOptions.Format = CompressionFormat.Bc1; +encoder.OutputOptions.FileFormat = OutputFileFormat.Ktx; //Change to Dds for a dds file. using FileStream fs = File.OpenWrite("example.ktx"); -encoder.Encode(image, fs); +encoder.EncodeToStream(image, fs); ``` And how to decode a compressed image from a KTX file and save it to png format. @@ -57,7 +59,7 @@ And how to decode a compressed image from a KTX file and save it to png format. using FileStream fs = File.OpenRead("compressed_bc1.ktx"); BcDecoder decoder = new BcDecoder(); -using Image image = decoder.Decode(fs); +using Image image = decoder.DecodeToImageRgba32(fs); using FileStream outFs = File.OpenWrite("decoding_test_bc1.png"); image.SaveAsPng(outFs); From f16afbcad4aab57285c117e91d01b30505758522 Mon Sep 17 00:00:00 2001 From: Nominom Date: Fri, 12 Feb 2021 23:08:28 +0200 Subject: [PATCH 069/116] 2.0 project files, updated comments --- BCnEnc.Net/BCnEncoder.csproj | 4 +- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 10 +- BCnEnc.Net/Decoder/BcDecoder.cs | 128 ++++++++++-------- .../Decoder/Options/DecoderOutputOptions.cs | 6 +- BCnEnc.Net/Encoder/AtcBlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/Bc3BlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 6 +- BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/BcEncoder.cs | 18 +-- .../Encoder/Options/EncoderInputOptions.cs | 12 +- .../{Bc4Component.cs => ColorComponent.cs} | 12 +- BCnEnc.Net/Shared/ComponentHelper.cs | 36 ++--- BCnEnc.Net/Shared/EncodedBlocks.cs | 4 +- BCnEnc.Net/Shared/LinearClustering.cs | 2 +- BCnEncTests/AtcTests.cs | 2 +- BCnEncTests/BC1Tests.cs | 2 +- BCnEncTests/Bc5Tests.cs | 2 +- BCnEncTests/BgraTests.cs | 2 +- BCnEncTests/DdsReadTests.cs | 2 +- BCnEncTests/DecodingAsyncTests.cs | 2 +- BCnEncTests/EncodeByteOrderTests.cs | 2 +- BCnEncTests/EncodingAsyncTest.cs | 2 +- BCnEncTests/EncodingTest.cs | 2 +- BCnEncTests/Examples.cs | 44 ++++++ BCnEncTests/RawTests.cs | 2 +- BCnEncTests/Support/TestHelper.cs | 4 +- .../BCnDecoderExtensions.cs | 48 ++++--- .../BCnEncoder.NET.ImageSharp.csproj | 29 +++- .../BCnEncoderExtensions.cs | 5 +- 29 files changed, 236 insertions(+), 158 deletions(-) rename BCnEnc.Net/Shared/{Bc4Component.cs => ColorComponent.cs} (55%) create mode 100644 BCnEncTests/Examples.cs diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index 21d9038..bded66b 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -12,7 +12,7 @@ MIT OR Unlicense false - 1.2.3 + 2.0.0 Nominom BCnEncoder.Net @@ -31,7 +31,7 @@ Supported formats are: git BCn BC BC1 BC2 BC3 BC4 BC5 BC7 BPTC RGTC S3TC DXT1 DXT3 DXT5 ktx dds texture compression encoding decoding decompression image gpu https://github.com/Nominom/BCnEncoder.NET - Upgraded ImageSharp dependency from 1.0.0 beta 7 to version 1.0.1 + Removed ImageSharp dependency, added async api methods, added ATC and BGRA support, added new raw api methods, improved dds file handling and fixed some bugs. See the github page for more information about 2.0. diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index be0ae6b..afc2d0e 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -109,9 +109,9 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc3Block block) internal class Bc4Decoder : BaseBcBlockDecoder { - private readonly Bc4Component component; + private readonly ColorComponent component; - public Bc4Decoder(Bc4Component component) + public Bc4Decoder(ColorComponent component) { this.component = component; } @@ -124,10 +124,10 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc4Block block) internal class Bc5Decoder : BaseBcBlockDecoder { - private readonly Bc4Component component1; - private readonly Bc4Component component2; + private readonly ColorComponent component1; + private readonly ColorComponent component2; - public Bc5Decoder(Bc4Component component1, Bc4Component component2) + public Bc5Decoder(ColorComponent component1, ColorComponent component2) { this.component1 = component1; this.component2 = component2; diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 40b69a9..9799a3b 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -35,14 +35,16 @@ public class BcDecoder #region Async Api /// - /// Decode raw encoded image asynchronously. + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. /// /// The stream containing the encoded data. /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task DecodeRawAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; @@ -52,72 +54,74 @@ public Task DecodeRawAsync(Stream inputStream, CompressionFormat } /// - /// Decode raw encoded image data asynchronously. + /// Decode a single encoded image from raw bytes. /// /// The containing the encoded data. /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task DecodeRawAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) { return Task.Run(() => DecodeRawInternal(input, pixelWidth, pixelHeight, format, token), token); } /// - /// Read a Ktx file and decode it. + /// Decode the main image from a Ktx file. /// /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task DecodeAsync(KtxFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0], token); } /// - /// Read a Ktx file and decode it. + /// Decode all available mipmaps from a Ktx file. /// /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task DecodeAllMipMapsAsync(KtxFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, true, token), token); } /// - /// Read a Dds file and decode it. + /// Decode the main image from a Dds file. /// /// The loaded Dds file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task DecodeAsync(DdsFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0], token); } /// - /// Read a Dds file and decode it. + /// Decode all available mipmaps from a Dds file. /// /// The loaded Dds file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task DecodeAllMipMapsAsync(DdsFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, true, token), token); } /// - /// Decode raw encoded image asynchronously. + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. /// /// The stream containing the raw encoded data. /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task> DecodeRaw2DAsync(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token = default) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; @@ -128,14 +132,14 @@ public Task> DecodeRaw2DAsync(Stream inputStream, int pixe } /// - /// Decode raw encoded image data asynchronously. + /// Decode a single encoded image from raw bytes. /// /// The containing the encoded data. /// The Format the encoded data is in. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task> DecodeRaw2DAsync(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token = default) { return Task.Run(() => DecodeRawInternal(input, pixelWidth, pixelHeight, format, token) @@ -143,33 +147,35 @@ public Task> DecodeRaw2DAsync(ReadOnlyMemory input, } /// - /// Read a Ktx or a Dds file from a stream and decode it asynchronously. + /// Read a Ktx or Dds file from a stream and decode the main image from it. + /// The type of file will be detected automatically. /// /// The stream containing a Ktx or Dds file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task> Decode2DAsync(Stream inputStream, CancellationToken token = default) { return Task.Run(() => DecodeFromStreamInternal2D(inputStream, false, token)[0], token); } /// - /// Read a Ktx or a Dds file from a stream and decode it. + /// Read a Ktx or Dds file from a stream and decode all available mipmaps from it. + /// The type of file will be detected automatically. /// /// The stream containing a Ktx or Dds file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task[]> DecodeAllMipMaps2DAsync(Stream inputStream, CancellationToken token = default) { return Task.Run(() => DecodeFromStreamInternal2D(inputStream, false, token), token); } /// - /// Read a Ktx file and decode it. + /// Decode the main image from a Ktx file. /// /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task> Decode2DAsync(KtxFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0] @@ -177,11 +183,11 @@ public Task> Decode2DAsync(KtxFile file, CancellationToken } /// - /// Read a Ktx file and decode it. + /// Decode all available mipmaps from a Ktx file. /// /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task[]> DecodeAllMipMaps2DAsync(KtxFile file, CancellationToken token = default) { return Task.Run(() => @@ -198,11 +204,11 @@ public Task[]> DecodeAllMipMaps2DAsync(KtxFile file, Cance } /// - /// Read a Dds file and decode it. + /// Decode the main image from a Dds file. /// /// The loaded Dds file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task> Decode2DAsync(DdsFile file, CancellationToken token = default) { return Task.Run(() => DecodeInternal(file, false, token)[0] @@ -210,11 +216,11 @@ public Task> Decode2DAsync(DdsFile file, CancellationToken } /// - /// Read a Dds file and decode it. + /// Decode all available mipmaps from a Dds file. /// /// The loaded Dds file. /// The cancellation token for this asynchronous operation. - /// The awaitable operation to retrieve the decoded Rgba32 image. + /// The awaitable operation to retrieve the decoded image. public Task[]> DecodeAllMipMaps2DAsync(DdsFile file, CancellationToken token = default) { return Task.Run(() => @@ -235,13 +241,15 @@ public Task[]> DecodeAllMipMaps2DAsync(DdsFile file, Cance #region Sync API /// - /// Decode raw encoded image data. + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. /// /// The stream containing the raw encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. - /// The decoded Rgba32 image. + /// The decoded image. public ColorRgba32[] DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; @@ -251,66 +259,68 @@ public ColorRgba32[] DecodeRaw(Stream inputStream, int pixelWidth, int pixelHeig } /// - /// Decode raw encoded image data. + /// Decode a single encoded image from raw bytes. /// /// The byte array containing the raw encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. - /// The decoded Rgba32 image. + /// The decoded image. public ColorRgba32[] DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) { return DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); } /// - /// Read a Ktx file and decode it. + /// Decode the main image from a Ktx file. /// /// The loaded Ktx file. - /// The decoded Rgba32 image. + /// The decoded image. public ColorRgba32[] Decode(KtxFile file) { return DecodeInternal(file, false, default)[0]; } /// - /// Read a Ktx file and decode it. + /// Decode all available mipmaps from a Ktx file. /// /// The loaded Ktx file. - /// An array of decoded Rgba32 images. + /// An array of decoded images. public ColorRgba32[][] DecodeAllMipMaps(KtxFile file) { return DecodeInternal(file, true, default); } /// - /// Read a Dds file and decode it. + /// Decode the main image from a Dds file. /// /// The loaded Dds file. - /// The decoded Rgba32 image. + /// The decoded image. public ColorRgba32[] Decode(DdsFile file) { return DecodeInternal(file, false, default)[0]; } /// - /// Read a Dds file and decode it. + /// Decode all available mipmaps from a Dds file. /// /// The loaded Dds file. - /// An array of decoded Rgba32 images. + /// An array of decoded images. public ColorRgba32[][] DecodeAllMipMaps(DdsFile file) { return DecodeInternal(file, true, default); } /// - /// Decode raw encoded image data. + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. /// /// The stream containing the encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. - /// The decoded Rgba32 image. + /// The decoded image. public Memory2D DecodeRaw2D(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; @@ -321,13 +331,13 @@ public Memory2D DecodeRaw2D(Stream inputStream, int pixelWidth, int } /// - /// Decode raw encoded image data. + /// Decode a single encoded image from raw bytes. /// /// The byte array containing the raw encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. - /// The decoded Rgba32 image. + /// The decoded image. public Memory2D DecodeRaw2D(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) { var decoded = DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); @@ -335,40 +345,42 @@ public Memory2D DecodeRaw2D(byte[] input, int pixelWidth, int pixel } /// - /// Read a Ktx or a Dds file from a stream and decode the largest mipmap from it. + /// Read a Ktx or Dds file from a stream and decode the main image from it. + /// The type of file will be detected automatically. /// /// The stream containing a Ktx or Dds file. - /// The decoded Rgba32 image. + /// The decoded image. public Memory2D Decode2D(Stream inputStream) { return DecodeFromStreamInternal2D(inputStream, false, default)[0]; } /// - /// Read a Ktx or a Dds file from a stream and decode it. + /// Read a Ktx or Dds file from a stream and decode all available mipmaps from it. + /// The type of file will be detected automatically. /// /// The stream containing a Ktx or Dds file. - /// An array of decoded Rgba32 images. + /// An array of decoded images. public Memory2D[] DecodeAllMipMaps2D(Stream inputStream) { return DecodeFromStreamInternal2D(inputStream, true, default); } /// - /// Read a Ktx file and decode the largest mipmap from it. + /// Decode the main image from a Ktx file. /// /// The loaded Ktx file. - /// The decoded Rgba32 image. + /// The decoded image. public Memory2D Decode2D(KtxFile file) { return DecodeInternal(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth); } /// - /// Read a Ktx file and decode it. + /// Decode all available mipmaps from a Ktx file. /// /// The loaded Ktx file. - /// An array of decoded Rgba32 images. + /// An array of decoded images. public Memory2D[] DecodeAllMipMaps2D(KtxFile file) { var decoded = DecodeInternal(file, true, default); @@ -382,20 +394,20 @@ public Memory2D[] DecodeAllMipMaps2D(KtxFile file) } /// - /// Read a Dds file and decode the largest mipmap from it. + /// Decode the main image from a Dds file. /// /// The loaded Dds file. - /// The decoded Rgba32 image. + /// The decoded image. public Memory2D Decode2D(DdsFile file) { return DecodeInternal(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth); } /// - /// Read a Dds file and decode it. + /// Decode all available mipmaps from a Dds file. /// /// The loaded Dds file. - /// An array of decoded Rgba32 images. + /// An array of decoded images. public Memory2D[] DecodeAllMipMaps2D(DdsFile file) { var decoded = DecodeInternal(file, true, default); @@ -411,7 +423,7 @@ public Memory2D[] DecodeAllMipMaps2D(DdsFile file) /// /// Decode a single block from raw bytes and return it as a . /// Input Span size needs to equal the block size. - /// To get the block size of the compression format used, see . + /// To get the block size (in bytes) of the compression format used, see . /// /// The encoded block in bytes. /// The compression format used. @@ -426,7 +438,7 @@ public Memory2D DecodeBlock(ReadOnlySpan blockData, Compressi /// /// Decode a single block from raw bytes and write it to the given output span. /// Output span size must be exactly 4x4 and input Span size needs to equal the block size. - /// To get the block size of the compression format used, see . + /// To get the block size (in bytes) of the compression format used, see . /// /// The encoded block in bytes. /// The compression format used. diff --git a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs index 219c95c..f221800 100644 --- a/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs +++ b/BCnEnc.Net/Decoder/Options/DecoderOutputOptions.cs @@ -18,16 +18,16 @@ public class DecoderOutputOptions /// /// The color channel to populate with the values of a BC4 block. /// - public Bc4Component Bc4Component { get; set; } = Bc4Component.R; + public ColorComponent Bc4Component { get; set; } = ColorComponent.R; /// /// The color channel to populate with the values of the first BC5 block. /// - public Bc4Component Bc5Component1 { get; set; } = Bc4Component.R; + public ColorComponent Bc5Component1 { get; set; } = ColorComponent.R; /// /// The color channel to populate with the values of the second BC5 block. /// - public Bc4Component Bc5Component2 { get; set; } = Bc4Component.G; + public ColorComponent Bc5Component2 { get; set; } = ColorComponent.G; } } diff --git a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs index c952213..5b74acc 100644 --- a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs @@ -102,7 +102,7 @@ internal class AtcInterpolatedAlphaBlockEncoder : BaseBcBlockEncoder { - private static readonly Bc4ComponentBlockEncoder bc4BlockEncoder = new Bc4ComponentBlockEncoder(Bc4Component.A); + private static readonly Bc4ComponentBlockEncoder bc4BlockEncoder = new Bc4ComponentBlockEncoder(ColorComponent.A); public override Bc3Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index 8865efc..ea10d93 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -9,7 +9,7 @@ internal class Bc4BlockEncoder : BaseBcBlockEncoder { private readonly Bc4ComponentBlockEncoder bc4Encoder; - public Bc4BlockEncoder(Bc4Component component) + public Bc4BlockEncoder(ColorComponent component) { bc4Encoder = new Bc4ComponentBlockEncoder(component); } @@ -42,9 +42,9 @@ public override DxgiFormat GetDxgiFormat() internal class Bc4ComponentBlockEncoder { - private readonly Bc4Component component; + private readonly ColorComponent component; - public Bc4ComponentBlockEncoder(Bc4Component component) + public Bc4ComponentBlockEncoder(ColorComponent component) { this.component = component; } diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index c3bfb31..d4df046 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -8,7 +8,7 @@ internal class Bc5BlockEncoder : BaseBcBlockEncoder private readonly Bc4ComponentBlockEncoder redBlockEncoder; private readonly Bc4ComponentBlockEncoder greenBlockEncoder; - public Bc5BlockEncoder(Bc4Component component1, Bc4Component component2) + public Bc5BlockEncoder(ColorComponent component1, ColorComponent component2) { redBlockEncoder = new Bc4ComponentBlockEncoder(component1); greenBlockEncoder = new Bc4ComponentBlockEncoder(component2); diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 7f87ceb..54b5a56 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -214,7 +214,7 @@ public Task EncodeToRawBytesAsync(ReadOnlyMemory2D input, i /// /// Encodes all mipMaps of a cubeMap image to a stream asynchronously either in ktx or dds format. /// The format can be set in . - /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The positive X-axis face of the cubeMap /// The negative X-axis face of the cubeMap @@ -235,7 +235,7 @@ public Task EncodeCubeMapToStreamAsync(ReadOnlyMemory2D right, Read /// /// Encodes all mipMaps of a cubeMap image to a asynchronously. /// The format can be set in . - /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The positive X-axis face of the cubeMap /// The negative X-axis face of the cubeMap @@ -255,7 +255,7 @@ public Task EncodeCubeMapToKtxAsync(ReadOnlyMemory2D right /// /// Encodes all mipMaps of a cubeMap image to a asynchronously. /// The format can be set in . - /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The positive X-axis face of the cubeMap /// The negative X-axis face of the cubeMap @@ -402,7 +402,7 @@ public byte[] EncodeToRawBytes(ReadOnlyMemory2D input, int mipLevel /// /// Encodes all mipMaps of a cubeMap image to a stream either in ktx or dds format. /// The format can be set in . - /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The positive X-axis face of the cubeMap /// The negative X-axis face of the cubeMap @@ -432,7 +432,7 @@ public void EncodeCubeMapToStream(ReadOnlySpan right, ReadOnlySpan l /// /// Encodes all mipMaps of a cubeMap image to a stream either in ktx or dds format. /// The format can be set in . - /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The positive X-axis face of the cubeMap /// The negative X-axis face of the cubeMap @@ -451,7 +451,7 @@ public void EncodeCubeMapToStream(ReadOnlyMemory2D right, ReadOnlyM /// /// Encodes all mipMaps of a cubeMap image to a . /// The format can be set in . - /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The positive X-axis face of the cubeMap /// The negative X-axis face of the cubeMap @@ -480,7 +480,7 @@ public KtxFile EncodeCubeMapToKtx(ReadOnlySpan right, ReadOnlySpan l /// /// Encodes all mipMaps of a cubeMap image to a . /// The format can be set in . - /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The positive X-axis face of the cubeMap /// The negative X-axis face of the cubeMap @@ -499,7 +499,7 @@ public KtxFile EncodeCubeMapToKtx(ReadOnlyMemory2D right, ReadOnlyM /// /// Encodes all mipMaps of a cubeMap image to a . /// The format can be set in . - /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The positive X-axis face of the cubeMap /// The negative X-axis face of the cubeMap @@ -528,7 +528,7 @@ public DdsFile EncodeCubeMapToDds(ReadOnlySpan right, ReadOnlySpan l /// /// Encodes all mipMaps of a cubeMap image to a . /// The format can be set in . - /// Order of faces is +X, -X, +Y, -Y, +Z, -Z + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. /// /// The positive X-axis face of the cubeMap /// The negative X-axis face of the cubeMap diff --git a/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs index 3b9500b..57a2d72 100644 --- a/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs +++ b/BCnEnc.Net/Encoder/Options/EncoderInputOptions.cs @@ -14,18 +14,18 @@ public class EncoderInputOptions public bool LuminanceAsRed { get; set; } = false; /// - /// The color channel to take for the values of a BC4 block. + /// The color channel to take for the values of a BC4 block. Default is red. /// - public Bc4Component Bc4Component { get; set; } = Bc4Component.R; + public ColorComponent Bc4Component { get; set; } = ColorComponent.R; /// - /// The color channel to take for the values of the first BC5 block. + /// The color channel to take for the values of the first BC5 block. Default is red. /// - public Bc4Component Bc5Component1 { get; set; } = Bc4Component.R; + public ColorComponent Bc5Component1 { get; set; } = ColorComponent.R; /// - /// The color channel to take for the values of the second BC5 block. + /// The color channel to take for the values of the second BC5 block. Default is green. /// - public Bc4Component Bc5Component2 { get; set; } = Bc4Component.G; + public ColorComponent Bc5Component2 { get; set; } = ColorComponent.G; } } diff --git a/BCnEnc.Net/Shared/Bc4Component.cs b/BCnEnc.Net/Shared/ColorComponent.cs similarity index 55% rename from BCnEnc.Net/Shared/Bc4Component.cs rename to BCnEnc.Net/Shared/ColorComponent.cs index 8e6a6fb..81452b6 100644 --- a/BCnEnc.Net/Shared/Bc4Component.cs +++ b/BCnEnc.Net/Shared/ColorComponent.cs @@ -3,30 +3,30 @@ namespace BCnEncoder.Shared /// /// The component to take from colors for BC4 and BC5. /// - public enum Bc4Component + public enum ColorComponent { /// - /// Specifies the red component. + /// The red component of an Rgba32 color. /// R, /// - /// Specifies the green component. + /// The green component of an Rgba32 color. /// G, /// - /// Specifies the blue component. + /// The blue component of an Rgba32 color. /// B, /// - /// Specifies the alpha component. + /// The alpha component of an Rgba32 color. /// A, /// - /// Specifies the luminance. + /// Use the color's luminance value as the component. /// Luminance } diff --git a/BCnEnc.Net/Shared/ComponentHelper.cs b/BCnEnc.Net/Shared/ComponentHelper.cs index 2088ba8..268778c 100644 --- a/BCnEnc.Net/Shared/ComponentHelper.cs +++ b/BCnEnc.Net/Shared/ComponentHelper.cs @@ -5,23 +5,23 @@ namespace BCnEncoder.Shared { internal static class ComponentHelper { - public static ColorRgba32 ComponentToColor(Bc4Component component, byte componentValue) + public static ColorRgba32 ComponentToColor(ColorComponent component, byte componentValue) { switch (component) { - case Bc4Component.R: + case ColorComponent.R: return new ColorRgba32(componentValue, 0, 0, 255); - case Bc4Component.G: + case ColorComponent.G: return new ColorRgba32(0, componentValue, 0, 255); - case Bc4Component.B: + case ColorComponent.B: return new ColorRgba32(0, 0, componentValue, 255); - case Bc4Component.A: + case ColorComponent.A: return new ColorRgba32(0, 0, 0, componentValue); - case Bc4Component.Luminance: + case ColorComponent.Luminance: return new ColorRgba32(componentValue, componentValue, componentValue, 255); default: @@ -29,27 +29,27 @@ public static ColorRgba32 ComponentToColor(Bc4Component component, byte componen } } - public static ColorRgba32 ComponentToColor(ColorRgba32 existingColor, Bc4Component component, byte componentValue) + public static ColorRgba32 ComponentToColor(ColorRgba32 existingColor, ColorComponent component, byte componentValue) { switch (component) { - case Bc4Component.R: + case ColorComponent.R: existingColor.r = componentValue; break; - case Bc4Component.G: + case ColorComponent.G: existingColor.g = componentValue; break; - case Bc4Component.B: + case ColorComponent.B: existingColor.b = componentValue; break; - case Bc4Component.A: + case ColorComponent.A: existingColor.a = componentValue; break; - case Bc4Component.Luminance: + case ColorComponent.Luminance: existingColor.r = existingColor.g = existingColor.b = componentValue; break; @@ -60,23 +60,23 @@ public static ColorRgba32 ComponentToColor(ColorRgba32 existingColor, Bc4Compone return existingColor; } - public static byte ColorToComponent(ColorRgba32 color, Bc4Component component) + public static byte ColorToComponent(ColorRgba32 color, ColorComponent component) { switch (component) { - case Bc4Component.R: + case ColorComponent.R: return color.r; - case Bc4Component.G: + case ColorComponent.G: return color.g; - case Bc4Component.B: + case ColorComponent.B: return color.b; - case Bc4Component.A: + case ColorComponent.A: return color.a; - case Bc4Component.Luminance: + case ColorComponent.Luminance: return (byte)(new ColorYCbCr(color).y * 255); default: diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index 72da74e..f645267 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -197,7 +197,7 @@ public byte Endpoint1 public void SetComponentIndex(int pixelIndex, byte redIndex) => componentBlock.SetComponentIndex(pixelIndex, redIndex); - public readonly RawBlock4X4Rgba32 Decode(Bc4Component component = Bc4Component.R) + public readonly RawBlock4X4Rgba32 Decode(ColorComponent component = ColorComponent.R) { var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; @@ -251,7 +251,7 @@ public byte Green1 public void SetGreenIndex(int pixelIndex, byte greenIndex) => greenBlock.SetComponentIndex(pixelIndex, greenIndex); - public readonly RawBlock4X4Rgba32 Decode(Bc4Component component1 = Bc4Component.R, Bc4Component component2 = Bc4Component.G) + public readonly RawBlock4X4Rgba32 Decode(ColorComponent component1 = ColorComponent.R, ColorComponent component2 = ColorComponent.G) { var output = new RawBlock4X4Rgba32(); var pixels = output.AsSpan; diff --git a/BCnEnc.Net/Shared/LinearClustering.cs b/BCnEnc.Net/Shared/LinearClustering.cs index b2b8d88..7f8f6dc 100644 --- a/BCnEnc.Net/Shared/LinearClustering.cs +++ b/BCnEnc.Net/Shared/LinearClustering.cs @@ -6,7 +6,7 @@ namespace BCnEncoder.Shared /// /// Simple Linear Iterative Clustering. /// - public static class LinearClustering + internal static class LinearClustering { private struct LabXy diff --git a/BCnEncTests/AtcTests.cs b/BCnEncTests/AtcTests.cs index 6f7a4d5..d02da3e 100644 --- a/BCnEncTests/AtcTests.cs +++ b/BCnEncTests/AtcTests.cs @@ -3,7 +3,7 @@ using BCnEncoder.Shared; using BCnEncTests.Support; using Xunit; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; namespace BCnEncTests { diff --git a/BCnEncTests/BC1Tests.cs b/BCnEncTests/BC1Tests.cs index 92bf7b1..bfc7320 100644 --- a/BCnEncTests/BC1Tests.cs +++ b/BCnEncTests/BC1Tests.cs @@ -1,7 +1,7 @@ using BCnEncoder.Shared; using SixLabors.ImageSharp.PixelFormats; using Xunit; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; namespace BCnEncTests { diff --git a/BCnEncTests/Bc5Tests.cs b/BCnEncTests/Bc5Tests.cs index da23122..e4ebdde 100644 --- a/BCnEncTests/Bc5Tests.cs +++ b/BCnEncTests/Bc5Tests.cs @@ -1,5 +1,5 @@ using BCnEncoder.Decoder; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using Xunit; diff --git a/BCnEncTests/BgraTests.cs b/BCnEncTests/BgraTests.cs index 17458ca..7ae666e 100644 --- a/BCnEncTests/BgraTests.cs +++ b/BCnEncTests/BgraTests.cs @@ -1,6 +1,6 @@ using BCnEncoder.Decoder; using BCnEncoder.Encoder; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using Xunit; diff --git a/BCnEncTests/DdsReadTests.cs b/BCnEncTests/DdsReadTests.cs index b86b6f3..9a5ba2e 100644 --- a/BCnEncTests/DdsReadTests.cs +++ b/BCnEncTests/DdsReadTests.cs @@ -1,6 +1,6 @@ using System.IO; using BCnEncoder.Decoder; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; using BCnEncTests.Support; diff --git a/BCnEncTests/DecodingAsyncTests.cs b/BCnEncTests/DecodingAsyncTests.cs index df6423e..d4993bc 100644 --- a/BCnEncTests/DecodingAsyncTests.cs +++ b/BCnEncTests/DecodingAsyncTests.cs @@ -2,7 +2,7 @@ using System.IO; using BCnEncoder.Decoder; using BCnEncoder.Encoder; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using Xunit; diff --git a/BCnEncTests/EncodeByteOrderTests.cs b/BCnEncTests/EncodeByteOrderTests.cs index 75cb331..c05a547 100644 --- a/BCnEncTests/EncodeByteOrderTests.cs +++ b/BCnEncTests/EncodeByteOrderTests.cs @@ -5,7 +5,7 @@ using System.Text; using BCnEncoder.Decoder; using BCnEncoder.Encoder; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using SixLabors.ImageSharp.Advanced; diff --git a/BCnEncTests/EncodingAsyncTest.cs b/BCnEncTests/EncodingAsyncTest.cs index 1582de6..9542e46 100644 --- a/BCnEncTests/EncodingAsyncTest.cs +++ b/BCnEncTests/EncodingAsyncTest.cs @@ -1,6 +1,6 @@ using BCnEncoder.Decoder; using BCnEncoder.Encoder; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using SixLabors.ImageSharp; diff --git a/BCnEncTests/EncodingTest.cs b/BCnEncTests/EncodingTest.cs index 1071d14..00e46f2 100644 --- a/BCnEncTests/EncodingTest.cs +++ b/BCnEncTests/EncodingTest.cs @@ -1,6 +1,6 @@ using System.IO; using BCnEncoder.Encoder; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using Xunit; diff --git a/BCnEncTests/Examples.cs b/BCnEncTests/Examples.cs new file mode 100644 index 0000000..18e5d50 --- /dev/null +++ b/BCnEncTests/Examples.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.ImageSharp; +using BCnEncoder.Shared; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; + +namespace BCnEncTests +{ + public class Examples + { + + public void EncodeImageSharp() + { + using Image image = Image.Load("example.png"); + + BcEncoder encoder = new BcEncoder(); + + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Quality = CompressionQuality.Balanced; + encoder.OutputOptions.Format = CompressionFormat.Bc1; + encoder.OutputOptions.FileFormat = OutputFileFormat.Ktx; //Change to Dds for a dds file. + + using FileStream fs = File.OpenWrite("example.ktx"); + encoder.EncodeToStream(image, fs); + } + + public void DecodeImageSharp() + { + using FileStream fs = File.OpenRead("compressed_bc1.ktx"); + + BcDecoder decoder = new BcDecoder(); + using Image image = decoder.DecodeToImageRgba32(fs); + + using FileStream outFs = File.OpenWrite("decoding_test_bc1.png"); + image.SaveAsPng(outFs); + } + } +} diff --git a/BCnEncTests/RawTests.cs b/BCnEncTests/RawTests.cs index 70c89b5..4354c19 100644 --- a/BCnEncTests/RawTests.cs +++ b/BCnEncTests/RawTests.cs @@ -1,7 +1,7 @@ using System.IO; using BCnEncoder.Decoder; using BCnEncoder.Encoder; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncTests.Support; using SixLabors.ImageSharp.Processing; diff --git a/BCnEncTests/Support/TestHelper.cs b/BCnEncTests/Support/TestHelper.cs index ca3d03d..7fd3194 100644 --- a/BCnEncTests/Support/TestHelper.cs +++ b/BCnEncTests/Support/TestHelper.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using BCnEncoder.Decoder; using BCnEncoder.Encoder; -using BCnEncoder.NET.ImageSharp; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; using SixLabors.ImageSharp; @@ -133,7 +133,7 @@ public static float DecodeCheckPSNR(string filename, Image original) var ktx = KtxFile.Load(fs); var decoder = new BcDecoder() { - OutputOptions = { Bc4Component = Bc4Component.Luminance } + OutputOptions = { Bc4Component = ColorComponent.Luminance } }; using var img = decoder.DecodeToImageRgba32(ktx); diff --git a/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs b/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs index fb99d28..46eb852 100644 --- a/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs +++ b/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs @@ -14,18 +14,20 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -namespace BCnEncoder.NET.ImageSharp +namespace BCnEncoder.ImageSharp { public static class BCnDecoderExtensions { /// - /// Decode raw encoded image data. + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. /// - /// The stream containing the encoded data. + /// The stream containing the encoded image. /// The pixelWidth of the image. /// The pixelHeight of the image. - /// The Format the encoded data is in. + /// The format the encoded data is in. /// The decoded Rgba32 image. public static Image DecodeRawToImageRgba32(this BcDecoder decoder, Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) { @@ -33,12 +35,12 @@ public static Image DecodeRawToImageRgba32(this BcDecoder decoder, Strea } /// - /// Decode raw encoded image data. + /// Decode a single encoded image from raw bytes. /// /// The array containing the encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. - /// The Format the encoded data is in. + /// The format the encoded data is in. /// The decoded Rgba32 image. public static Image DecodeRawToImageRgba32(this BcDecoder decoder, byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) { @@ -46,7 +48,8 @@ public static Image DecodeRawToImageRgba32(this BcDecoder decoder, byte[ } /// - /// Read a Ktx file and decode it. + /// Read a Ktx or Dds file from a stream and decode the main image from it. + /// The type of file will be detected automatically. /// /// The stream that contains either ktx or dds file. /// The decoded Rgba32 image. @@ -56,7 +59,8 @@ public static Image DecodeToImageRgba32(this BcDecoder decoder, Stream i } /// - /// Read a Ktx file and decode it. + /// Read a Ktx or Dds file from a stream and decode all available mipmaps from it. + /// The type of file will be detected automatically. /// /// The stream that contains either ktx or dds file. /// An array of decoded Rgba32 images. @@ -73,7 +77,7 @@ public static Image[] DecodeAllMipMapsToImageRgba32(this BcDecoder decod /// - /// Read a Ktx file and decode it. + /// Decode the main image from a Ktx file. /// /// The loaded Ktx file. /// The decoded Rgba32 image. @@ -83,7 +87,7 @@ public static Image DecodeToImageRgba32(this BcDecoder decoder, KtxFile } /// - /// Read a Ktx file and decode it. + /// Decode all available mipmaps from a Ktx file. /// /// The loaded Ktx file. /// An array of decoded Rgba32 images. @@ -99,7 +103,7 @@ public static Image[] DecodeAllMipMapsToImageRgba32(this BcDecoder decod } /// - /// Read a Dds file and decode it. + /// Decode the main image from a Dds file. /// /// The loaded Dds file. /// The decoded Rgba32 image. @@ -109,7 +113,7 @@ public static Image DecodeToImageRgba32(this BcDecoder decoder, DdsFile } /// - /// Read a Dds file and decode it. + /// Decode all available mipmaps from a Dds file. /// /// The loaded Dds file. /// An array of decoded Rgba32 images. @@ -127,7 +131,9 @@ public static Image[] DecodeAllMipMapsToImageRgba32(this BcDecoder decod /// - /// Decode raw encoded image data. + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. /// /// The stream containing the encoded data. /// The pixelWidth of the image. @@ -141,7 +147,7 @@ public static async Task> DecodeRawToImageRgba32Async(this BcDecod } /// - /// Decode raw encoded image data. + /// Decode a single encoded image from raw bytes. /// /// The array containing the encoded data. /// The pixelWidth of the image. @@ -155,7 +161,8 @@ public static async Task> DecodeRawToImageRgba32Async(this BcDecod } /// - /// Read a Ktx file and decode it. + /// Read a Ktx or Dds file from a stream and decode the main image from it. + /// The type of file will be detected automatically. /// /// The stream that contains either ktx or dds file. /// The cancellation token for this asynchronous operation. @@ -166,7 +173,8 @@ public static async Task> DecodeToImageRgba32Async(this BcDecoder } /// - /// Read a Ktx file and decode it. + /// Read a Ktx or Dds file from a stream and decode all available mipmaps from it. + /// The type of file will be detected automatically. /// /// The stream that contains either ktx or dds file. /// The cancellation token for this asynchronous operation. @@ -184,7 +192,7 @@ public static async Task[]> DecodeAllMipMapsToImageRgba32Async(thi /// - /// Read a Ktx file and decode it. + /// Decode the main image from a Ktx file. /// /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. @@ -195,7 +203,7 @@ public static async Task> DecodeToImageRgba32Async(this BcDecoder } /// - /// Read a Ktx file and decode it. + /// Decode all available mipmaps from a Ktx file. /// /// The loaded Ktx file. /// The cancellation token for this asynchronous operation. @@ -212,7 +220,7 @@ public static async Task[]> DecodeAllMipMapsToImageRgba32Async(thi } /// - /// Read a Dds file and decode it. + /// Decode the main image from a Dds file. /// /// The loaded Dds file. /// The cancellation token for this asynchronous operation. @@ -223,7 +231,7 @@ public static async Task> DecodeToImageRgba32Async(this BcDecoder } /// - /// Read a Dds file and decode it. + /// Decode all available mipmaps from a Dds file. /// /// The loaded Dds file. /// The cancellation token for this asynchronous operation. diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj index 6c3e5cc..b80a80a 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj +++ b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj @@ -1,15 +1,32 @@ - + netstandard2.1 + + true + true + snupkg + true + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml + + BCnEncoder.Net.ImageSharp + BCnEncoder.Net.ImageSharp + Nominom + Adds ImageSharp apis to BCnEncoder.Net + MIT OR Unlicense + https://github.com/Nominom/BCnEncoder.NET + https://github.com/Nominom/BCnEncoder.NET + git + Initial version of the ImageSharp extension package. + 1.0.0 + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - - - - - diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs index 2d0c4c8..8c53227 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs +++ b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs @@ -14,14 +14,13 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -namespace BCnEncoder.NET.ImageSharp +namespace BCnEncoder.ImageSharp { public static class BCnEncoderExtensions { /// /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. /// - /// The BcEncoder instance. /// The image to encode. /// The stream to write the encoded image to. public static void EncodeToStream(this BcEncoder encoder, Image inputImage, Stream outputStream) @@ -32,7 +31,6 @@ public static void EncodeToStream(this BcEncoder encoder, Image inputIma /// /// Encodes all mipmap levels into a Ktx file. /// - /// The BcEncoder instance. /// The image to encode. /// The Ktx file containing the encoded image. public static KtxFile EncodeToKtx(this BcEncoder encoder, Image inputImage) @@ -43,7 +41,6 @@ public static KtxFile EncodeToKtx(this BcEncoder encoder, Image inputIma /// /// Encodes all mipmap levels into a Dds file. /// - /// The BcEncoder instance. /// The image to encode. /// The Dds file containing the encoded image. public static DdsFile EncodeToDds(this BcEncoder encoder, Image inputImage) From 1939638396174a8fcde7b301bace0e4019639f1a Mon Sep 17 00:00:00 2001 From: Nominom Date: Fri, 12 Feb 2021 23:17:32 +0200 Subject: [PATCH 070/116] Tests fixed? --- BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj index b80a80a..701b7be 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj +++ b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj @@ -22,11 +22,14 @@ - all runtime; build; native; contentfiles; analyzers; buildtransitive + + + + From ecca946be9bb851e0470c133d42492f1c2295b0e Mon Sep 17 00:00:00 2001 From: Nominom Date: Tue, 16 Feb 2021 12:44:07 +0200 Subject: [PATCH 071/116] Added progress tests and fixed some problems --- BCnEnc.Net/BCnEncoder.csproj | 8 +- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 13 +- BCnEnc.Net/Decoder/BcDecoder.cs | 4 +- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 12 +- BCnEnc.Net/Shared/ProgressElement.cs | 20 +- BCnEncTests/ProgressTests.cs | 380 ++++++++++++++++++ .../BCnEncoder.NET.ImageSharp.csproj | 4 +- 7 files changed, 427 insertions(+), 14 deletions(-) create mode 100644 BCnEncTests/ProgressTests.cs diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index bded66b..daa7854 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -1,4 +1,4 @@ - + netstandard2.1 @@ -12,7 +12,7 @@ MIT OR Unlicense false - 2.0.0 + 2.0.1 Nominom BCnEncoder.Net @@ -31,7 +31,9 @@ Supported formats are: git BCn BC BC1 BC2 BC3 BC4 BC5 BC7 BPTC RGTC S3TC DXT1 DXT3 DXT5 ktx dds texture compression encoding decoding decompression image gpu https://github.com/Nominom/BCnEncoder.NET - Removed ImageSharp dependency, added async api methods, added ATC and BGRA support, added new raw api methods, improved dds file handling and fixed some bugs. See the github page for more information about 2.0. + Removed ImageSharp dependency, added async api methods, added ATC and BGRA support, added new raw api methods, improved dds file handling and fixed some bugs. See the github page for more information about 2.0. + +2.0.1 - fixed progress api diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index afc2d0e..feac7ed 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -46,7 +46,10 @@ public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext co if (context.Progress != null) { var progressValue = Interlocked.Add(ref currentBlocks, 1); - context.Progress.Report(progressValue); + if ((progressValue % 100) == 0) + { + context.Progress.Report(progressValue); + } } }); } @@ -58,11 +61,15 @@ public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext co context.CancellationToken.ThrowIfCancellationRequested(); output[i] = DecodeBlock(encodedBlocks[i]); - - context.Progress?.Report(currentBlocks++); + if ((++currentBlocks % 100) == 0) + { + context.Progress?.Report(currentBlocks); + } } } + context.Progress?.Report(currentBlocks); + return output; } diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index 9799a3b..fe018cf 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -555,7 +555,7 @@ private ColorRgba32[][] DecodeInternal(KtxFile file, bool allMipMaps, Cancellati // Calculate total blocks var blockSize = GetBlockSize(file.header.GlInternalFormat); - var totalBlocks = file.MipMaps.Sum(m => m.Faces[0].Data.Length / blockSize); + var totalBlocks = file.MipMaps.Take(mipMaps).Sum(m => m.Faces[0].Data.Length / blockSize); context.Progress = new OperationProgress(Options.Progress, totalBlocks); @@ -618,7 +618,7 @@ private ColorRgba32[][] DecodeInternal(DdsFile file, bool allMipMaps, Cancellati // Calculate total blocks var blockSize = GetBlockSize(file); - var totalBlocks = file.Faces[0].MipMaps.Sum(m => m.Data.Length / blockSize); + var totalBlocks = file.Faces[0].MipMaps.Take((int)mipMaps).Sum(m => m.Data.Length / blockSize); context.Progress = new OperationProgress(Options.Progress, totalBlocks); diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index e3516a3..3a9b153 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -30,7 +30,10 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight if (context.Progress != null) { var progressValue = Interlocked.Add(ref currentBlocks, 1); - context.Progress.Report(progressValue); + if ((progressValue % 100) == 0) + { + context.Progress.Report(progressValue); + } } }); } @@ -43,10 +46,15 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight outputBlocks[i] = EncodeBlock(blocks[i], quality); - context.Progress?.Report(currentBlocks++); + if ((++currentBlocks % 100) == 0) + { + context.Progress?.Report(currentBlocks); + } } } + context.Progress?.Report(currentBlocks); + return outputData; } diff --git a/BCnEnc.Net/Shared/ProgressElement.cs b/BCnEnc.Net/Shared/ProgressElement.cs index 53885df..77bf43e 100644 --- a/BCnEnc.Net/Shared/ProgressElement.cs +++ b/BCnEnc.Net/Shared/ProgressElement.cs @@ -2,14 +2,30 @@ namespace BCnEncoder.Shared { public struct ProgressElement { + /// + /// Current block being processed + /// public int CurrentBlock { get; } - public int TotalBlockses { get; } + /// + /// The total amount of blocks to be processed + /// + public int TotalBlocks { get; } + + /// + /// Returns the progress percentage as a float from 0 to 1 + /// + public float Percentage => CurrentBlock / (float) TotalBlocks; public ProgressElement(int currentBlock, int totalBlocks) { CurrentBlock = currentBlock; - TotalBlockses = totalBlocks; + TotalBlocks = totalBlocks; + } + + public override string ToString() + { + return $"{nameof(CurrentBlock)}: {CurrentBlock}, {nameof(TotalBlocks)}: {TotalBlocks}, {nameof(Percentage)}: {Percentage}"; } } } diff --git a/BCnEncTests/ProgressTests.cs b/BCnEncTests/ProgressTests.cs new file mode 100644 index 0000000..ac0432d --- /dev/null +++ b/BCnEncTests/ProgressTests.cs @@ -0,0 +1,380 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.ImageSharp; +using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; +using BCnEncTests.Support; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; +using Xunit.Abstractions; + +namespace BCnEncTests +{ + public class ProgressTests + { + private ITestOutputHelper output; + + public ProgressTests(ITestOutputHelper output) => this.output = output; + + private async Task ExecuteEncodeProgressReport(BcEncoder encoder, Image testImage, int expectedTotalBlocks) + { + var lastProgress = new ProgressElement(0, 1); + + encoder.Options.Progress = new Progress((element => + { + output.WriteLine($"Progress = {element.CurrentBlock} / {element.TotalBlocks}"); + if (!encoder.Options.IsParallel) + { + Assert.InRange(element.Percentage, lastProgress.Percentage - 0.1f, lastProgress.Percentage + 0.1f); + } + Assert.Equal(expectedTotalBlocks, element.TotalBlocks); + lastProgress = element; + })); + + using var ms = new MemoryStream(); + + await encoder.EncodeToStreamAsync(testImage, ms); + + output.WriteLine("LastProgress = " + lastProgress); + + Assert.InRange(lastProgress.Percentage, 0.99, 1); + } + + private async Task ExecuteDecodeProgressReport(BcDecoder decoder, KtxFile image, int expectedTotalBlocks, bool singleMip) + { + var lastProgress = new ProgressElement(0, 1); + + decoder.Options.Progress = new Progress((element => + { + output.WriteLine($"Progress = {element.CurrentBlock} / {element.TotalBlocks}"); + Assert.Equal(expectedTotalBlocks, element.TotalBlocks); + lastProgress = element; + })); + + if (singleMip) + { + await decoder.DecodeAsync(image); + } + else + { + await decoder.DecodeAllMipMapsAsync(image); + } + + output.WriteLine("LastProgress = " + lastProgress); + + Assert.InRange(lastProgress.Percentage, 0.99, 1); + } + + private async Task ExecuteDecodeProgressReport(BcDecoder decoder, DdsFile image, int expectedTotalBlocks, bool singleMip) + { + var lastProgress = new ProgressElement(0, 1); + + decoder.Options.Progress = new Progress((element => + { + output.WriteLine($"Progress = {element.CurrentBlock} / {element.TotalBlocks}"); + Assert.Equal(expectedTotalBlocks, element.TotalBlocks); + lastProgress = element; + })); + + if (singleMip) + { + await decoder.DecodeAsync(image); + } + else + { + await decoder.DecodeAllMipMapsAsync(image); + } + + output.WriteLine("LastProgress = " + lastProgress); + + Assert.InRange(lastProgress.Percentage, 0.99, 1); + } + + [Fact] + public async void DecodeProgressReportParallel() + { + var testImage = KtxLoader.TestDecompressBc1; + var decoder = new BcDecoder() + { + Options = {IsParallel = true} + }; + + var expectedTotal = 0; + + for (var i = 0; i < testImage.header.NumberOfMipmapLevels; i++) + { + expectedTotal += decoder.GetBlockCount((int)testImage.MipMaps[i].Width, (int)testImage.MipMaps[i].Height); + } + + await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, false); + } + + [Fact] + public async void DecodeProgressReportNonParallel() + { + var testImage = KtxLoader.TestDecompressBc1; + var decoder = new BcDecoder() + { + Options = { IsParallel = false } + }; + + var expectedTotal = 0; + + for (var i = 0; i < testImage.header.NumberOfMipmapLevels; i++) + { + expectedTotal += decoder.GetBlockCount((int)testImage.MipMaps[i].Width, (int)testImage.MipMaps[i].Height); + } + + await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, false); + } + + [Fact] + public async void DecodeProgressReportParallelOneMip() + { + var testImage = KtxLoader.TestDecompressBc1; + var decoder = new BcDecoder() + { + Options = { IsParallel = true } + }; + + var expectedTotal = decoder.GetBlockCount((int)testImage.MipMaps[0].Width, (int)testImage.MipMaps[0].Height); + + + await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, true); + } + + [Fact] + public async void DecodeProgressReportNonParallelOneMip() + { + var testImage = KtxLoader.TestDecompressBc1; + var decoder = new BcDecoder() + { + Options = { IsParallel = false } + }; + + var expectedTotal = decoder.GetBlockCount((int)testImage.MipMaps[0].Width, (int)testImage.MipMaps[0].Height); + + + await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, true); + } + + [Fact] + public async void DecodeProgressReportParallelDds() + { + var testImage = DdsLoader.TestDecompressBc1; + var decoder = new BcDecoder() + { + Options = { IsParallel = true } + }; + + var expectedTotal = 0; + + for (var i = 0; i < testImage.header.dwMipMapCount; i++) + { + expectedTotal += decoder.GetBlockCount((int)testImage.Faces[0].MipMaps[i].Width, (int)testImage.Faces[0].MipMaps[i].Height); + } + + await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, false); + } + + [Fact] + public async void DecodeProgressReportNonParallelDds() + { + var testImage = DdsLoader.TestDecompressBc1; + var decoder = new BcDecoder() + { + Options = { IsParallel = false } + }; + + var expectedTotal = 0; + + for (var i = 0; i < testImage.header.dwMipMapCount; i++) + { + expectedTotal += decoder.GetBlockCount((int)testImage.Faces[0].MipMaps[i].Width, (int)testImage.Faces[0].MipMaps[i].Height); + } + + await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, false); + } + + [Fact] + public async void DecodeProgressReportParallelOneMipDds() + { + var testImage = DdsLoader.TestDecompressBc1; + var decoder = new BcDecoder() + { + Options = { IsParallel = true } + }; + + var expectedTotal = decoder.GetBlockCount((int)testImage.Faces[0].MipMaps[0].Width, (int)testImage.Faces[0].MipMaps[0].Height); + + + await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, true); + } + + [Fact] + public async void DecodeProgressReportNonParallelOneMipDds() + { + var testImage = DdsLoader.TestDecompressBc1; + var decoder = new BcDecoder() + { + Options = { IsParallel = false } + }; + + var expectedTotal = decoder.GetBlockCount((int)testImage.Faces[0].MipMaps[0].Width, (int)testImage.Faces[0].MipMaps[0].Height); + + + await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, true); + } + + [Fact] + public async void EncodeProgressReportParallelKtx() + { + var testImage = ImageLoader.TestBlur1; + var encoder = new BcEncoder() + { + Options = { IsParallel = true }, + OutputOptions = { FileFormat = OutputFileFormat.Ktx } + }; + + var expectedTotal = 0; + + for (var i = 0; i < encoder.CalculateNumberOfMipLevels(testImage); i++) + { + encoder.CalculateMipMapSize(testImage, i, out var mW, out var mH); + expectedTotal += encoder.GetBlockCount(mW, mH); + } + + await ExecuteEncodeProgressReport(encoder, testImage, expectedTotal); + } + + [Fact] + public async void EncodeProgressReportNonParallelKtx() + { + var testImage = ImageLoader.TestBlur1; + var encoder = new BcEncoder() + { + Options = { IsParallel = false }, + OutputOptions = { FileFormat = OutputFileFormat.Ktx } + }; + + var expectedTotal = 0; + + for (var i = 0; i < encoder.CalculateNumberOfMipLevels(testImage); i++) + { + encoder.CalculateMipMapSize(testImage, i, out var mW, out var mH); + expectedTotal += encoder.GetBlockCount(mW, mH); + } + + await ExecuteEncodeProgressReport(encoder, testImage, expectedTotal); + } + + [Fact] + public async void EncodeProgressReportParallelOneMipKtx() + { + var testImage = ImageLoader.TestBlur1; + var encoder = new BcEncoder() + { + Options = { IsParallel = true }, + OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Ktx} + }; + + var expectedTotal = encoder.GetBlockCount(testImage.Width, testImage.Height); + + await ExecuteEncodeProgressReport(encoder, testImage, expectedTotal); + } + + [Fact] + public async void EncodeProgressReportNonParallelOneMipKtx() + { + var testImage = ImageLoader.TestBlur1; + var encoder = new BcEncoder() + { + Options = { IsParallel = false }, + OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Ktx} + }; + + var expectedTotal = encoder.GetBlockCount(testImage.Width, testImage.Height); + + await ExecuteEncodeProgressReport(encoder, testImage, expectedTotal); + } + + [Fact] + public async void EncodeProgressReportParallelDds() + { + var testImage = ImageLoader.TestBlur1; + var encoder = new BcEncoder() + { + Options = { IsParallel = true }, + OutputOptions = { FileFormat = OutputFileFormat.Dds } + }; + + var expectedTotal = 0; + + for (var i = 0; i < encoder.CalculateNumberOfMipLevels(testImage); i++) + { + encoder.CalculateMipMapSize(testImage, i, out var mW, out var mH); + expectedTotal += encoder.GetBlockCount(mW, mH); + } + + await ExecuteEncodeProgressReport(encoder, testImage, expectedTotal); + } + + [Fact] + public async void EncodeProgressReportNonParallelDds() + { + var testImage = ImageLoader.TestBlur1; + var encoder = new BcEncoder() + { + Options = { IsParallel = false }, + OutputOptions = { FileFormat = OutputFileFormat.Dds } + }; + + var expectedTotal = 0; + + for (var i = 0; i < encoder.CalculateNumberOfMipLevels(testImage); i++) + { + encoder.CalculateMipMapSize(testImage, i, out var mW, out var mH); + expectedTotal += encoder.GetBlockCount(mW, mH); + } + + await ExecuteEncodeProgressReport(encoder, testImage, expectedTotal); + } + + [Fact] + public async void EncodeProgressReportParallelOneMipDds() + { + var testImage = ImageLoader.TestBlur1; + var encoder = new BcEncoder() + { + Options = { IsParallel = true }, + OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Dds } + }; + + var expectedTotal = encoder.GetBlockCount(testImage.Width, testImage.Height); + + await ExecuteEncodeProgressReport(encoder, testImage, expectedTotal); + } + + [Fact] + public async void EncodeProgressReportNonParallelOneMipDds() + { + var testImage = ImageLoader.TestBlur1; + var encoder = new BcEncoder() + { + Options = { IsParallel = false }, + OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Dds } + }; + + var expectedTotal = encoder.GetBlockCount(testImage.Width, testImage.Height); + + await ExecuteEncodeProgressReport(encoder, testImage, expectedTotal); + } + } +} diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj index 701b7be..37c8e87 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj +++ b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj @@ -17,8 +17,8 @@ https://github.com/Nominom/BCnEncoder.NET https://github.com/Nominom/BCnEncoder.NET git - Initial version of the ImageSharp extension package. - 1.0.0 + Updated version + 1.0.1 From 8fb1191a38434f4c5ea0616f6a6adefefe2482c8 Mon Sep 17 00:00:00 2001 From: Nominom <7089998+Nominom@users.noreply.github.com> Date: Tue, 16 Feb 2021 18:23:28 +0200 Subject: [PATCH 072/116] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 932f39d..12aa3b8 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ image.SaveAsPng(outFs); All contributions are welcome. I'll try to respond to bug reports and feature requests as fast as possible, but you can also fix things yourself and submit a pull request. Please note, that by submitting a pull request you accept that your code will be dual licensed under MIT and public domain Unlicense. # License -This library is dual-licensed under the [Unlicense](https://unlicense.org/), and [MIT](https://opensource.org/licenses/MIT) licenses. +This library is dual-licensed under the [Unlicense](https://unlicense.org/) and [MIT](https://opensource.org/licenses/MIT) licenses. You may use this code under the terms of either license. From 841ea31dd041dc4e76273b0cbc9b6f8704e5b2f8 Mon Sep 17 00:00:00 2001 From: onepiecefreak3 Date: Tue, 16 Feb 2021 21:38:04 +0100 Subject: [PATCH 073/116] Fix asynchronous progress hindering tests to execute successfully; --- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 15 ++-- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 14 ++- BCnEncTests/ProgressTests.cs | 106 +++++++++++++---------- 3 files changed, 70 insertions(+), 65 deletions(-) diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index feac7ed..7527cc3 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -16,6 +16,8 @@ internal interface IBcBlockDecoder internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmanaged { + private static readonly object lockObj = new object(); + public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext context) { // calculate number of 4x4 blocks by padding width/height to a multiple of 4 and shift it right by 2 @@ -45,10 +47,9 @@ public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext co if (context.Progress != null) { - var progressValue = Interlocked.Add(ref currentBlocks, 1); - if ((progressValue % 100) == 0) + lock (lockObj) { - context.Progress.Report(progressValue); + context.Progress.Report(++currentBlocks); } } }); @@ -61,15 +62,11 @@ public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext co context.CancellationToken.ThrowIfCancellationRequested(); output[i] = DecodeBlock(encodedBlocks[i]); - if ((++currentBlocks % 100) == 0) - { - context.Progress?.Report(currentBlocks); - } + + context.Progress?.Report(++currentBlocks); } } - context.Progress?.Report(currentBlocks); - return output; } diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index 3a9b153..4c9b8e0 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -10,6 +10,8 @@ namespace BCnEncoder.Encoder { internal abstract class BaseBcBlockEncoder : IBcBlockEncoder where T : unmanaged { + private static readonly object lockObj = new object(); + public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, OperationContext context) { var outputData = new byte[blockWidth * blockHeight * Unsafe.SizeOf()]; @@ -29,10 +31,9 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight if (context.Progress != null) { - var progressValue = Interlocked.Add(ref currentBlocks, 1); - if ((progressValue % 100) == 0) + lock (lockObj) { - context.Progress.Report(progressValue); + context.Progress.Report(++currentBlocks); } } }); @@ -46,15 +47,10 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight outputBlocks[i] = EncodeBlock(blocks[i], quality); - if ((++currentBlocks % 100) == 0) - { - context.Progress?.Report(currentBlocks); - } + context.Progress?.Report(++currentBlocks); } } - context.Progress?.Report(currentBlocks); - return outputData; } diff --git a/BCnEncTests/ProgressTests.cs b/BCnEncTests/ProgressTests.cs index ac0432d..5eae2e9 100644 --- a/BCnEncTests/ProgressTests.cs +++ b/BCnEncTests/ProgressTests.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Text; -using System.Threading; using System.Threading.Tasks; using BCnEncoder.Decoder; using BCnEncoder.Encoder; @@ -27,36 +24,36 @@ private async Task ExecuteEncodeProgressReport(BcEncoder encoder, Image { var lastProgress = new ProgressElement(0, 1); - encoder.Options.Progress = new Progress((element => + var processedBlocks = 0; + encoder.Options.Progress = new SynchronousProgress(element => { output.WriteLine($"Progress = {element.CurrentBlock} / {element.TotalBlocks}"); - if (!encoder.Options.IsParallel) - { - Assert.InRange(element.Percentage, lastProgress.Percentage - 0.1f, lastProgress.Percentage + 0.1f); - } - Assert.Equal(expectedTotalBlocks, element.TotalBlocks); - lastProgress = element; - })); - using var ms = new MemoryStream(); + Assert.Equal(++processedBlocks, element.CurrentBlock); + lastProgress = element; + }); + await using var ms = new MemoryStream(); await encoder.EncodeToStreamAsync(testImage, ms); - + output.WriteLine("LastProgress = " + lastProgress); - Assert.InRange(lastProgress.Percentage, 0.99, 1); + Assert.Equal(expectedTotalBlocks, lastProgress.TotalBlocks); + Assert.Equal(1, lastProgress.Percentage); } private async Task ExecuteDecodeProgressReport(BcDecoder decoder, KtxFile image, int expectedTotalBlocks, bool singleMip) { var lastProgress = new ProgressElement(0, 1); - decoder.Options.Progress = new Progress((element => + var processedBlocks = 0; + decoder.Options.Progress = new SynchronousProgress(element => { output.WriteLine($"Progress = {element.CurrentBlock} / {element.TotalBlocks}"); - Assert.Equal(expectedTotalBlocks, element.TotalBlocks); + + Assert.Equal(++processedBlocks, element.CurrentBlock); lastProgress = element; - })); + }); if (singleMip) { @@ -69,19 +66,22 @@ private async Task ExecuteDecodeProgressReport(BcDecoder decoder, KtxFile image, output.WriteLine("LastProgress = " + lastProgress); - Assert.InRange(lastProgress.Percentage, 0.99, 1); + Assert.Equal(expectedTotalBlocks, lastProgress.TotalBlocks); + Assert.Equal(1, lastProgress.Percentage); } private async Task ExecuteDecodeProgressReport(BcDecoder decoder, DdsFile image, int expectedTotalBlocks, bool singleMip) { var lastProgress = new ProgressElement(0, 1); - decoder.Options.Progress = new Progress((element => + var processedBlocks = 0; + decoder.Options.Progress = new SynchronousProgress(element => { output.WriteLine($"Progress = {element.CurrentBlock} / {element.TotalBlocks}"); - Assert.Equal(expectedTotalBlocks, element.TotalBlocks); + + Assert.Equal(++processedBlocks, element.CurrentBlock); lastProgress = element; - })); + }); if (singleMip) { @@ -94,16 +94,17 @@ private async Task ExecuteDecodeProgressReport(BcDecoder decoder, DdsFile image, output.WriteLine("LastProgress = " + lastProgress); - Assert.InRange(lastProgress.Percentage, 0.99, 1); + Assert.Equal(expectedTotalBlocks, lastProgress.TotalBlocks); + Assert.Equal(1, lastProgress.Percentage); } [Fact] public async void DecodeProgressReportParallel() { var testImage = KtxLoader.TestDecompressBc1; - var decoder = new BcDecoder() + var decoder = new BcDecoder { - Options = {IsParallel = true} + Options = { IsParallel = true } }; var expectedTotal = 0; @@ -120,7 +121,7 @@ public async void DecodeProgressReportParallel() public async void DecodeProgressReportNonParallel() { var testImage = KtxLoader.TestDecompressBc1; - var decoder = new BcDecoder() + var decoder = new BcDecoder { Options = { IsParallel = false } }; @@ -139,13 +140,12 @@ public async void DecodeProgressReportNonParallel() public async void DecodeProgressReportParallelOneMip() { var testImage = KtxLoader.TestDecompressBc1; - var decoder = new BcDecoder() + var decoder = new BcDecoder { Options = { IsParallel = true } }; - - var expectedTotal = decoder.GetBlockCount((int)testImage.MipMaps[0].Width, (int)testImage.MipMaps[0].Height); + var expectedTotal = decoder.GetBlockCount((int)testImage.MipMaps[0].Width, (int)testImage.MipMaps[0].Height); await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, true); } @@ -154,14 +154,13 @@ public async void DecodeProgressReportParallelOneMip() public async void DecodeProgressReportNonParallelOneMip() { var testImage = KtxLoader.TestDecompressBc1; - var decoder = new BcDecoder() + var decoder = new BcDecoder { Options = { IsParallel = false } }; var expectedTotal = decoder.GetBlockCount((int)testImage.MipMaps[0].Width, (int)testImage.MipMaps[0].Height); - await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, true); } @@ -169,7 +168,7 @@ public async void DecodeProgressReportNonParallelOneMip() public async void DecodeProgressReportParallelDds() { var testImage = DdsLoader.TestDecompressBc1; - var decoder = new BcDecoder() + var decoder = new BcDecoder { Options = { IsParallel = true } }; @@ -188,7 +187,7 @@ public async void DecodeProgressReportParallelDds() public async void DecodeProgressReportNonParallelDds() { var testImage = DdsLoader.TestDecompressBc1; - var decoder = new BcDecoder() + var decoder = new BcDecoder { Options = { IsParallel = false } }; @@ -207,14 +206,13 @@ public async void DecodeProgressReportNonParallelDds() public async void DecodeProgressReportParallelOneMipDds() { var testImage = DdsLoader.TestDecompressBc1; - var decoder = new BcDecoder() + var decoder = new BcDecoder { Options = { IsParallel = true } }; var expectedTotal = decoder.GetBlockCount((int)testImage.Faces[0].MipMaps[0].Width, (int)testImage.Faces[0].MipMaps[0].Height); - await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, true); } @@ -222,14 +220,13 @@ public async void DecodeProgressReportParallelOneMipDds() public async void DecodeProgressReportNonParallelOneMipDds() { var testImage = DdsLoader.TestDecompressBc1; - var decoder = new BcDecoder() + var decoder = new BcDecoder { Options = { IsParallel = false } }; var expectedTotal = decoder.GetBlockCount((int)testImage.Faces[0].MipMaps[0].Width, (int)testImage.Faces[0].MipMaps[0].Height); - await ExecuteDecodeProgressReport(decoder, testImage, expectedTotal, true); } @@ -237,7 +234,7 @@ public async void DecodeProgressReportNonParallelOneMipDds() public async void EncodeProgressReportParallelKtx() { var testImage = ImageLoader.TestBlur1; - var encoder = new BcEncoder() + var encoder = new BcEncoder { Options = { IsParallel = true }, OutputOptions = { FileFormat = OutputFileFormat.Ktx } @@ -258,12 +255,12 @@ public async void EncodeProgressReportParallelKtx() public async void EncodeProgressReportNonParallelKtx() { var testImage = ImageLoader.TestBlur1; - var encoder = new BcEncoder() + var encoder = new BcEncoder { Options = { IsParallel = false }, OutputOptions = { FileFormat = OutputFileFormat.Ktx } }; - + var expectedTotal = 0; for (var i = 0; i < encoder.CalculateNumberOfMipLevels(testImage); i++) @@ -279,10 +276,10 @@ public async void EncodeProgressReportNonParallelKtx() public async void EncodeProgressReportParallelOneMipKtx() { var testImage = ImageLoader.TestBlur1; - var encoder = new BcEncoder() + var encoder = new BcEncoder { Options = { IsParallel = true }, - OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Ktx} + OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Ktx } }; var expectedTotal = encoder.GetBlockCount(testImage.Width, testImage.Height); @@ -294,10 +291,10 @@ public async void EncodeProgressReportParallelOneMipKtx() public async void EncodeProgressReportNonParallelOneMipKtx() { var testImage = ImageLoader.TestBlur1; - var encoder = new BcEncoder() + var encoder = new BcEncoder { Options = { IsParallel = false }, - OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Ktx} + OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Ktx } }; var expectedTotal = encoder.GetBlockCount(testImage.Width, testImage.Height); @@ -309,7 +306,7 @@ public async void EncodeProgressReportNonParallelOneMipKtx() public async void EncodeProgressReportParallelDds() { var testImage = ImageLoader.TestBlur1; - var encoder = new BcEncoder() + var encoder = new BcEncoder { Options = { IsParallel = true }, OutputOptions = { FileFormat = OutputFileFormat.Dds } @@ -330,7 +327,7 @@ public async void EncodeProgressReportParallelDds() public async void EncodeProgressReportNonParallelDds() { var testImage = ImageLoader.TestBlur1; - var encoder = new BcEncoder() + var encoder = new BcEncoder { Options = { IsParallel = false }, OutputOptions = { FileFormat = OutputFileFormat.Dds } @@ -351,7 +348,7 @@ public async void EncodeProgressReportNonParallelDds() public async void EncodeProgressReportParallelOneMipDds() { var testImage = ImageLoader.TestBlur1; - var encoder = new BcEncoder() + var encoder = new BcEncoder { Options = { IsParallel = true }, OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Dds } @@ -366,7 +363,7 @@ public async void EncodeProgressReportParallelOneMipDds() public async void EncodeProgressReportNonParallelOneMipDds() { var testImage = ImageLoader.TestBlur1; - var encoder = new BcEncoder() + var encoder = new BcEncoder { Options = { IsParallel = false }, OutputOptions = { MaxMipMapLevel = 1, FileFormat = OutputFileFormat.Dds } @@ -377,4 +374,19 @@ public async void EncodeProgressReportNonParallelOneMipDds() await ExecuteEncodeProgressReport(encoder, testImage, expectedTotal); } } + + class SynchronousProgress : IProgress + { + private readonly Action handler; + + public SynchronousProgress(Action handler) + { + this.handler = handler; + } + + public void Report(T value) + { + handler(value); + } + } } From 34b64ba266cf3fce7845ae8c37a71ae50fee22e6 Mon Sep 17 00:00:00 2001 From: Nominom Date: Thu, 18 Feb 2021 14:53:02 +0200 Subject: [PATCH 074/116] Fixed an issue with mipmap length calculation with maxmipmaps option set --- BCnEnc.Net/BCnEncoder.csproj | 8 +-- BCnEnc.Net/Shared/MipMapper.cs | 7 +- BCnEncTests/EncoderOptionsTests.cs | 71 +++++++++++++++++++ .../BCnEncoder.NET.ImageSharp.csproj | 6 +- 4 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 BCnEncTests/EncoderOptionsTests.cs diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index daa7854..bf41bd8 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -1,4 +1,4 @@ - + netstandard2.1 @@ -12,7 +12,7 @@ MIT OR Unlicense false - 2.0.1 + 2.0.2 Nominom BCnEncoder.Net @@ -31,9 +31,9 @@ Supported formats are: git BCn BC BC1 BC2 BC3 BC4 BC5 BC7 BPTC RGTC S3TC DXT1 DXT3 DXT5 ktx dds texture compression encoding decoding decompression image gpu https://github.com/Nominom/BCnEncoder.NET - Removed ImageSharp dependency, added async api methods, added ATC and BGRA support, added new raw api methods, improved dds file handling and fixed some bugs. See the github page for more information about 2.0. + 2.0.0 - Removed ImageSharp dependency, added async api methods, added ATC and BGRA support, added new raw api methods, improved dds file handling and fixed some bugs. See the github page for more information about 2.0. -2.0.1 - fixed progress api +2.0.2 - fixed a bug in mipmap calculations diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index 9324405..c8cd7cb 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -82,11 +82,16 @@ public static int CalculateMipChainLength(int width, int height, int maxNumMipMa } var output = 0; - for (var mipLevel = 1; mipLevel < maxNumMipMaps; mipLevel++) + for (var mipLevel = 1; mipLevel <= maxNumMipMaps; mipLevel++) { var mipWidth = Math.Max(1, width >> mipLevel); var mipHeight = Math.Max(1, height >> mipLevel); + if (mipLevel == maxNumMipMaps) + { + return maxNumMipMaps; + } + if (mipWidth == 1 && mipHeight == 1) { output = mipLevel + 1; diff --git a/BCnEncTests/EncoderOptionsTests.cs b/BCnEncTests/EncoderOptionsTests.cs new file mode 100644 index 0000000..677fce4 --- /dev/null +++ b/BCnEncTests/EncoderOptionsTests.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Text; +using BCnEncoder.Encoder; +using BCnEncTests.Support; +using Xunit; +using BCnEncoder.ImageSharp; + +namespace BCnEncTests +{ + public class EncoderOptionsTests + { + + [Theory] + [InlineData(1)] + [InlineData(2)] + [InlineData(5)] + [InlineData(10)] + public void MaxMipMaps(int requestedMipMaps) + { + var testImage = ImageLoader.TestBlur1; + var encoder = new BcEncoder() + { + OutputOptions = + { + GenerateMipMaps = true, + MaxMipMapLevel = requestedMipMaps + } + }; + + Assert.Equal(requestedMipMaps, encoder.CalculateNumberOfMipLevels(testImage)); + + var ktx = encoder.EncodeToKtx(testImage); + + Assert.Equal(requestedMipMaps, (int)ktx.header.NumberOfMipmapLevels); + Assert.Equal(requestedMipMaps, ktx.MipMaps.Count); + + var dds = encoder.EncodeToDds(testImage); + + Assert.Equal(requestedMipMaps, (int)dds.header.dwMipMapCount); + Assert.Equal(requestedMipMaps, dds.Faces[0].MipMaps.Length); + } + + [Fact] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Assertions", "xUnit2013:Do not use equality check to check for collection size.", Justification = "")] + public void GenerateMipMaps() + { + var testImage = ImageLoader.TestBlur1; + const int requestedMipMaps = 1; + var encoder = new BcEncoder() + { + OutputOptions = + { + GenerateMipMaps = false + } + }; + + Assert.Equal(requestedMipMaps, encoder.CalculateNumberOfMipLevels(testImage)); + + var ktx = encoder.EncodeToKtx(testImage); + + Assert.Equal(requestedMipMaps, (int)ktx.header.NumberOfMipmapLevels); + Assert.Equal(requestedMipMaps, (int)ktx.MipMaps.Count); + + var dds = encoder.EncodeToDds(testImage); + + Assert.Equal(requestedMipMaps, (int)dds.header.dwMipMapCount); + Assert.Equal(requestedMipMaps, dds.Faces[0].MipMaps.Length); + } + } +} diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj index 37c8e87..1d6c48d 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj +++ b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj @@ -17,8 +17,8 @@ https://github.com/Nominom/BCnEncoder.NET https://github.com/Nominom/BCnEncoder.NET git - Updated version - 1.0.1 + + 1.0.2 @@ -26,7 +26,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + From 3070561db33131dbefd89b040cf62c8a8c158d21 Mon Sep 17 00:00:00 2001 From: Nominom Date: Thu, 18 Feb 2021 14:54:50 +0200 Subject: [PATCH 075/116] Improved comments, fixed api discrepancy in ImageSharp package --- BCnEnc.Net/Encoder/BcEncoder.cs | 16 ++++++++-------- .../BCnEncoder.NET.ImageSharp.csproj | 2 +- .../BCnEncoderExtensions.cs | 14 +++++++------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 54b5a56..c3f8900 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -157,7 +157,7 @@ public Task EncodeToDdsAsync(ReadOnlyMemory2D input, Cance } /// - /// Encodes all mipmap levels into a list of byte buffers asynchronously. + /// Encodes all mipmap levels into a list of byte buffers asynchronously. This data does not contain any file headers, just the raw encoded data. /// /// The input to encode represented by a . /// The width of the image. @@ -171,7 +171,7 @@ public Task EncodeToRawBytesAsync(ReadOnlyMemory input, int widt } /// - /// Encodes all mipmap levels into a list of byte buffers asynchronously. + /// Encodes all mipmap levels into an array of byte buffers asynchronously. This data does not contain any file headers, just the raw encoded data. /// /// The input to encode represented by a . /// The cancellation token for this operation. Can be default if cancellation is not needed. @@ -183,7 +183,7 @@ public Task EncodeToRawBytesAsync(ReadOnlyMemory2D input, } /// - /// Encodes a single mip level of the input image to a byte buffer asynchronously. + /// Encodes a single mip level of the input image to a byte buffer asynchronously. This data does not contain any file headers, just the raw encoded data. /// /// The input to encode represented by a . /// The width of the image. @@ -199,7 +199,7 @@ public Task EncodeToRawBytesAsync(ReadOnlyMemory input, int width, } /// - /// Encodes a single mip level of the input image to a byte buffer asynchronously. + /// Encodes a single mip level of the input image to a byte buffer asynchronously. This data does not contain any file headers, just the raw encoded data. /// /// The input to encode represented by a . /// The mipmap to encode. @@ -346,7 +346,7 @@ public DdsFile EncodeToDds(ReadOnlyMemory2D input) } /// - /// Encodes all mipmap levels into a list of byte buffers. + /// Encodes all mipmap levels into an array of byte buffers. This data does not contain any file headers, just the raw encoded data. /// /// The input to encode represented by a . /// The width of the image. @@ -360,7 +360,7 @@ public byte[][] EncodeToRawBytes(ReadOnlySpan input, int width, int height } /// - /// Encodes all mipmap levels into a list of byte buffers. + /// Encodes all mipmap levels into a list of byte buffers. This data does not contain any file headers, just the raw encoded data. /// /// The input to encode represented by a . /// An array of byte buffers containing all mipmap levels. @@ -371,7 +371,7 @@ public byte[][] EncodeToRawBytes(ReadOnlyMemory2D input) } /// - /// Encodes a single mip level of the input image to a byte buffer. + /// Encodes a single mip level of the input image to a byte buffer. This data does not contain any file headers, just the raw encoded data. /// /// The input to encode represented by a . /// The width of the image. @@ -387,7 +387,7 @@ public byte[] EncodeToRawBytes(ReadOnlySpan input, int width, int height, } /// - /// Encodes a single mip level of the input image to a byte buffer. + /// Encodes a single mip level of the input image to a byte buffer. This data does not contain any file headers, just the raw encoded data. /// /// The input to encode represented by a . /// The mipmap to encode. diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj index 1d6c48d..f145b19 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj +++ b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj @@ -18,7 +18,7 @@ https://github.com/Nominom/BCnEncoder.NET git - 1.0.2 + 1.0.3 diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs index 8c53227..20f3990 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs +++ b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs @@ -49,17 +49,17 @@ public static DdsFile EncodeToDds(this BcEncoder encoder, Image inputIma } /// - /// Encodes all mipmap levels into a list of byte buffers. + /// Encodes all mipmap levels into an array of byte buffers. This data does not contain any file headers, just the raw encoded data. /// /// The image to encode. /// A list of raw encoded data. - public static IList EncodeToRawBytes(this BcEncoder encoder, Image inputImage) + public static byte[][] EncodeToRawBytes(this BcEncoder encoder, Image inputImage) { return encoder.EncodeToRawBytes(ImageToMemory2D(inputImage)); } /// - /// Encodes a single mip level of the input image to a byte buffer. + /// Encodes a single mip level of the input image to a byte buffer. This data does not contain any file headers, just the raw encoded data. /// /// The image to encode. /// The mipmap to encode. @@ -72,7 +72,7 @@ public static byte[] EncodeToRawBytes(this BcEncoder encoder, Image inpu } /// - /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream. + /// Encodes all cubemap faces and mipmap levels into either a ktx or a dds file and writes it to the output stream. /// Order is +X, -X, +Y, -Y, +Z, -Z /// /// The right face of the cubemap. @@ -178,7 +178,7 @@ public static Task EncodeToDdsAsync(this BcEncoder encoder, Image - /// Encodes all mipmap levels into a list of byte buffers asynchronously. + /// Encodes all mipmap levels into an array of byte buffers asynchronously. This data does not contain any file headers, just the raw encoded data. /// /// The image to encode. /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. @@ -189,7 +189,7 @@ public static Task EncodeToRawBytesAsync(this BcEncoder encoder, Image } /// - /// Encodes a single mip level of the input image to a byte buffer asynchronously. + /// Encodes a single mip level of the input image to a byte buffer asynchronously. This data does not contain any file headers, just the raw encoded data. /// /// The image to encode. /// The mipmap to encode. @@ -202,7 +202,7 @@ public static Task EncodeToRawBytesAsync(this BcEncoder encoder, Image - /// Encodes all cubemap faces and mipmap levels into Ktx file and writes it to the output stream asynchronously. + /// Encodes all cubemap faces and mipmap levels into either a ktx or a dds file and writes it to the output stream asynchronously. /// Order is +X, -X, +Y, -Y, +Z, -Z /// /// The right face of the cubemap. From cf2e18f1c67f64d7be1eec1cb6b58975a9b3e8db Mon Sep 17 00:00:00 2001 From: Nominom Date: Mon, 22 Mar 2021 17:48:12 +0200 Subject: [PATCH 076/116] Update Microsoft high performance toolkit --- BCnEnc.Net/BCnEncoder.csproj | 8 ++++---- BCnEnc.Net/Decoder/BcDecoder.cs | 3 +-- BCnEnc.Net/Encoder/BcEncoder.cs | 3 +-- BCnEnc.Net/Shared/ImageToBlocks.cs | 2 +- BCnEnc.Net/Shared/MipMapper.cs | 3 +-- BCnEncTests/BlockTests.cs | 2 +- BCnEncTests/SingleBlockTests.cs | 2 +- BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs | 3 +-- .../BCnEncoder.NET.ImageSharp.csproj | 2 +- BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs | 3 +-- 10 files changed, 13 insertions(+), 18 deletions(-) diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index bf41bd8..1e867dc 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -1,4 +1,4 @@ - + netstandard2.1 @@ -12,7 +12,7 @@ MIT OR Unlicense false - 2.0.2 + 2.0.3 Nominom BCnEncoder.Net @@ -33,7 +33,7 @@ Supported formats are: https://github.com/Nominom/BCnEncoder.NET 2.0.0 - Removed ImageSharp dependency, added async api methods, added ATC and BGRA support, added new raw api methods, improved dds file handling and fixed some bugs. See the github page for more information about 2.0. -2.0.2 - fixed a bug in mipmap calculations +2.0.3 - Updated Microsoft high performance toolkit version @@ -46,7 +46,7 @@ Supported formats are: - + diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index fe018cf..bbb54c7 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -7,8 +7,7 @@ using System.Threading; using System.Threading.Tasks; using BCnEncoder.Shared.ImageFiles; -using Microsoft.Toolkit.HighPerformance.Extensions; -using Microsoft.Toolkit.HighPerformance.Memory; +using Microsoft.Toolkit.HighPerformance; namespace BCnEncoder.Decoder { diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index c3f8900..643cbd6 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -8,8 +8,7 @@ using BCnEncoder.Encoder.Options; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; -using Microsoft.Toolkit.HighPerformance.Extensions; -using Microsoft.Toolkit.HighPerformance.Memory; +using Microsoft.Toolkit.HighPerformance; namespace BCnEncoder.Encoder { diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 324e7c1..9cecf14 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -1,4 +1,4 @@ -using Microsoft.Toolkit.HighPerformance.Memory; +using Microsoft.Toolkit.HighPerformance; namespace BCnEncoder.Shared { diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index c8cd7cb..c7b338f 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -1,6 +1,5 @@ using System; -using Microsoft.Toolkit.HighPerformance.Extensions; -using Microsoft.Toolkit.HighPerformance.Memory; +using Microsoft.Toolkit.HighPerformance; namespace BCnEncoder.Shared { diff --git a/BCnEncTests/BlockTests.cs b/BCnEncTests/BlockTests.cs index 25bb89f..b413563 100644 --- a/BCnEncTests/BlockTests.cs +++ b/BCnEncTests/BlockTests.cs @@ -1,6 +1,6 @@ using System; using BCnEncoder.Shared; -using Microsoft.Toolkit.HighPerformance.Extensions; +using Microsoft.Toolkit.HighPerformance; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using Xunit; diff --git a/BCnEncTests/SingleBlockTests.cs b/BCnEncTests/SingleBlockTests.cs index e1c0bd8..f1ab128 100644 --- a/BCnEncTests/SingleBlockTests.cs +++ b/BCnEncTests/SingleBlockTests.cs @@ -7,7 +7,7 @@ using BCnEncoder.Encoder; using BCnEncoder.Shared; using BCnEncTests.Support; -using Microsoft.Toolkit.HighPerformance.Extensions; +using Microsoft.Toolkit.HighPerformance; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using Xunit; diff --git a/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs b/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs index 46eb852..a1fbed2 100644 --- a/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs +++ b/BCnEncoder.NET.ImageSharp/BCnDecoderExtensions.cs @@ -8,8 +8,7 @@ using BCnEncoder.Decoder; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; -using Microsoft.Toolkit.HighPerformance.Extensions; -using Microsoft.Toolkit.HighPerformance.Memory; +using Microsoft.Toolkit.HighPerformance; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj index f145b19..71dfaeb 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj +++ b/BCnEncoder.NET.ImageSharp/BCnEncoder.NET.ImageSharp.csproj @@ -18,7 +18,7 @@ https://github.com/Nominom/BCnEncoder.NET git - 1.0.3 + 1.0.4 diff --git a/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs index 20f3990..351d6d2 100644 --- a/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs +++ b/BCnEncoder.NET.ImageSharp/BCnEncoderExtensions.cs @@ -8,8 +8,7 @@ using BCnEncoder.Encoder; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; -using Microsoft.Toolkit.HighPerformance.Extensions; -using Microsoft.Toolkit.HighPerformance.Memory; +using Microsoft.Toolkit.HighPerformance; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; From 21c016f77ffeff6b2de8230c552632561baa6428 Mon Sep 17 00:00:00 2001 From: Nominom <7089998+Nominom@users.noreply.github.com> Date: Sun, 5 Sep 2021 07:41:59 +0300 Subject: [PATCH 077/116] Fixed typo in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 12aa3b8..285540a 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ The extension packages provide extension methods for ease of use with the image If you're upgrading from 1.X.X to version 2, expect some of your exsting code to be broken. ImageSharp was removed as a core dependency in version 2.0, so the code will no longer work with ImageSharp's Image types by default. You can install the extension package for ImageSharp to continue using this library easily with ImageSharp apis. # API -This below examples are using the ImageSharp extension package. For more detailed usage examples, you can go look at the unit tests. +The below examples are using the ImageSharp extension package. For more detailed usage examples, you can go look at the unit tests. Here's an example on how to encode a png image to BC1 without alpha, and save it to a file. ```CSharp From e72f758addc475b4899c0eaed22db3e003d71ccb Mon Sep 17 00:00:00 2001 From: Nominom <7089998+Nominom@users.noreply.github.com> Date: Mon, 6 Sep 2021 20:20:13 +0300 Subject: [PATCH 078/116] Bc6h support (#38) * Initial bc6h decoding * Test filenames changed to lowercase * Initial Bc6h encoding support * Finished Bc6 encoding * Update toolkit * Toolkit fixes again * Changed Bc7 and Bc6h decoding to write a magenta block on error --- BCnEnc.Net/BCnEncoder.csproj | 2 +- BCnEnc.Net/Decoder/BcBlockDecoder.cs | 55 +- BCnEnc.Net/Decoder/BcDecoder.cs | 944 ++++++++++- BCnEnc.Net/Decoder/BcFloatBlockDecoder.cs | 12 + BCnEnc.Net/Encoder/AtcBlockEncoder.cs | 6 +- BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs | 8 +- BCnEnc.Net/Encoder/Bc1BlockEncoder.cs | 4 +- BCnEnc.Net/Encoder/Bc2BlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/Bc3BlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/Bc4BlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/Bc5BlockEncoder.cs | 2 +- BCnEnc.Net/Encoder/BcEncoder.cs | 945 ++++++++++- BCnEnc.Net/Encoder/Bptc/Bc6Encoder.cs | 342 ++++ BCnEnc.Net/Encoder/Bptc/Bc6EncodingHelpers.cs | 372 +++++ BCnEnc.Net/Encoder/Bptc/Bc6ModeEncoder.cs | 190 +++ .../Encoder/{Bc7 => Bptc}/Bc7Encoder.cs | 16 +- .../{Bc7 => Bptc}/Bc7EncodingHelpers.cs | 443 +----- .../Encoder/{Bc7 => Bptc}/Bc7Mode0Encoder.cs | 4 +- .../Encoder/{Bc7 => Bptc}/Bc7Mode1Encoder.cs | 4 +- .../Encoder/{Bc7 => Bptc}/Bc7Mode2Encoder.cs | 4 +- .../Encoder/{Bc7 => Bptc}/Bc7Mode3Encoder.cs | 4 +- .../Encoder/{Bc7 => Bptc}/Bc7Mode4Encoder.cs | 4 +- .../Encoder/{Bc7 => Bptc}/Bc7Mode5Encoder.cs | 4 +- .../Encoder/{Bc7 => Bptc}/Bc7Mode6Encoder.cs | 4 +- .../Encoder/{Bc7 => Bptc}/Bc7Mode7Encoder.cs | 4 +- .../Encoder/Bptc/BptcEncodingHelpers.cs | 295 ++++ BCnEnc.Net/Encoder/ColorVariationGenerator.cs | 145 +- BCnEnc.Net/Encoder/IBcBlockEncoder.cs | 6 +- BCnEnc.Net/Encoder/LeastSquares.cs | 162 ++ BCnEnc.Net/Shared/Bc6Block.cs | 1405 +++++++++++++++++ BCnEnc.Net/Shared/Bc7Block.cs | 37 +- BCnEnc.Net/Shared/Colors.cs | 311 ++++ BCnEnc.Net/Shared/CompressionFormat.cs | 37 +- BCnEnc.Net/Shared/EncodedBlocks.cs | 10 +- BCnEnc.Net/Shared/Half.cs | 1090 +++++++++++++ BCnEnc.Net/Shared/HdrImage.cs | 344 ++++ BCnEnc.Net/Shared/ImageQuality.cs | 24 + BCnEnc.Net/Shared/ImageToBlocks.cs | 86 + BCnEnc.Net/Shared/IntHelper.cs | 23 + BCnEnc.Net/Shared/InternalUtils.cs | 16 + BCnEnc.Net/Shared/LinearClustering.cs | 112 +- BCnEnc.Net/Shared/MathHelper.cs | 65 + BCnEnc.Net/Shared/MipMapper.cs | 104 +- BCnEnc.Net/Shared/PcaVectors.cs | 464 +----- BCnEnc.Net/Shared/RawBlocks.cs | 140 ++ BCnEnc.Net/Shared/RgbBoundingBox.cs | 76 + BCnEncTests/Bc6EncoderTests.cs | 405 +++++ BCnEncTests/Bc6HDecoderTests.cs | 176 +++ BCnEncTests/Bc7BlockTests.cs | 24 + BCnEncTests/ClusterTests.cs | 3 +- BCnEncTests/EncodeByteOrderTests.cs | 2 +- BCnEncTests/Examples.cs | 30 + BCnEncTests/HdrImageTests.cs | 41 + BCnEncTests/IntHelperTests.cs | 26 + BCnEncTests/MathHelperTests.cs | 38 + BCnEncTests/Support/HdrLoader.cs | 22 + BCnEncTests/Support/ImageLoader.cs | 6 +- BCnEncTests/Support/TestHelper.cs | 54 +- BCnEncTests/testImages/NOTICE | 3 + BCnEncTests/testImages/test_bc6h_ufloat.ktx | Bin 0 -> 5580 bytes BCnEncTests/testImages/test_hdr_kiara.hdr | Bin 0 -> 1510522 bytes BCnEncTests/testImages/test_hdr_kiara.png | Bin 0 -> 661964 bytes .../testImages/test_hdr_kiara_bc6h.dds | Bin 0 -> 524436 bytes .../testImages/test_hdr_kiara_bc6h_ktx.ktx | Bin 0 -> 524356 bytes .../test_hdr_kiara_dds_float16_data.bin | Bin 0 -> 4194304 bytes BCnEncTests/testImages/test_hdr_probe.hdr | Bin 0 -> 1514408 bytes 66 files changed, 7946 insertions(+), 1215 deletions(-) create mode 100644 BCnEnc.Net/Decoder/BcFloatBlockDecoder.cs create mode 100644 BCnEnc.Net/Encoder/Bptc/Bc6Encoder.cs create mode 100644 BCnEnc.Net/Encoder/Bptc/Bc6EncodingHelpers.cs create mode 100644 BCnEnc.Net/Encoder/Bptc/Bc6ModeEncoder.cs rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7Encoder.cs (91%) rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7EncodingHelpers.cs (64%) rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7Mode0Encoder.cs (98%) rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7Mode1Encoder.cs (97%) rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7Mode2Encoder.cs (97%) rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7Mode3Encoder.cs (97%) rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7Mode4Encoder.cs (98%) rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7Mode5Encoder.cs (98%) rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7Mode6Encoder.cs (97%) rename BCnEnc.Net/Encoder/{Bc7 => Bptc}/Bc7Mode7Encoder.cs (98%) create mode 100644 BCnEnc.Net/Encoder/Bptc/BptcEncodingHelpers.cs create mode 100644 BCnEnc.Net/Encoder/LeastSquares.cs create mode 100644 BCnEnc.Net/Shared/Bc6Block.cs create mode 100644 BCnEnc.Net/Shared/Half.cs create mode 100644 BCnEnc.Net/Shared/HdrImage.cs create mode 100644 BCnEnc.Net/Shared/IntHelper.cs create mode 100644 BCnEnc.Net/Shared/InternalUtils.cs create mode 100644 BCnEnc.Net/Shared/MathHelper.cs create mode 100644 BCnEncTests/Bc6EncoderTests.cs create mode 100644 BCnEncTests/Bc6HDecoderTests.cs create mode 100644 BCnEncTests/HdrImageTests.cs create mode 100644 BCnEncTests/IntHelperTests.cs create mode 100644 BCnEncTests/MathHelperTests.cs create mode 100644 BCnEncTests/Support/HdrLoader.cs create mode 100644 BCnEncTests/testImages/test_bc6h_ufloat.ktx create mode 100644 BCnEncTests/testImages/test_hdr_kiara.hdr create mode 100644 BCnEncTests/testImages/test_hdr_kiara.png create mode 100644 BCnEncTests/testImages/test_hdr_kiara_bc6h.dds create mode 100644 BCnEncTests/testImages/test_hdr_kiara_bc6h_ktx.ktx create mode 100644 BCnEncTests/testImages/test_hdr_kiara_dds_float16_data.bin create mode 100644 BCnEncTests/testImages/test_hdr_probe.hdr diff --git a/BCnEnc.Net/BCnEncoder.csproj b/BCnEnc.Net/BCnEncoder.csproj index 1e867dc..5f2da02 100644 --- a/BCnEnc.Net/BCnEncoder.csproj +++ b/BCnEnc.Net/BCnEncoder.csproj @@ -46,7 +46,7 @@ Supported formats are: - + diff --git a/BCnEnc.Net/Decoder/BcBlockDecoder.cs b/BCnEnc.Net/Decoder/BcBlockDecoder.cs index 7527cc3..7706639 100644 --- a/BCnEnc.Net/Decoder/BcBlockDecoder.cs +++ b/BCnEnc.Net/Decoder/BcBlockDecoder.cs @@ -8,21 +8,18 @@ namespace BCnEncoder.Decoder { - internal interface IBcBlockDecoder + internal interface IBcBlockDecoder where T : unmanaged { - RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext context); - RawBlock4X4Rgba32 DecodeBlock(ReadOnlySpan data); + T[] Decode(ReadOnlyMemory data, OperationContext context); + T DecodeBlock(ReadOnlySpan data); } - internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmanaged + internal abstract class BaseBcBlockDecoder : IBcBlockDecoder where T : unmanaged where TBlock : unmanaged { private static readonly object lockObj = new object(); - public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext context) + public TBlock[] Decode(ReadOnlyMemory data, OperationContext context) { - // calculate number of 4x4 blocks by padding width/height to a multiple of 4 and shift it right by 2 - //blockWidth = ((pixelWidth + 3) & ~3) >> 2; - //blockHeight = ((pixelHeight + 3) & ~3) >> 2; if (data.Length % Unsafe.SizeOf() != 0) { @@ -30,7 +27,7 @@ public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext co } var blockCount = data.Length / Unsafe.SizeOf(); - var output = new RawBlock4X4Rgba32[blockCount]; + var output = new TBlock[blockCount]; var currentBlocks = 0; if (context.IsParallel) @@ -70,16 +67,16 @@ public RawBlock4X4Rgba32[] Decode(ReadOnlyMemory data, OperationContext co return output; } - public RawBlock4X4Rgba32 DecodeBlock(ReadOnlySpan data) + public TBlock DecodeBlock(ReadOnlySpan data) { var encodedBlock = MemoryMarshal.Cast(data)[0]; return DecodeBlock(encodedBlock); } - protected abstract RawBlock4X4Rgba32 DecodeBlock(T block); + protected abstract TBlock DecodeBlock(T block); } - internal class Bc1NoAlphaDecoder : BaseBcBlockDecoder + internal class Bc1NoAlphaDecoder : BaseBcBlockDecoder { protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) { @@ -87,7 +84,7 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) } } - internal class Bc1ADecoder : BaseBcBlockDecoder + internal class Bc1ADecoder : BaseBcBlockDecoder { protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) { @@ -95,7 +92,7 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc1Block block) } } - internal class Bc2Decoder : BaseBcBlockDecoder + internal class Bc2Decoder : BaseBcBlockDecoder { protected override RawBlock4X4Rgba32 DecodeBlock(Bc2Block block) { @@ -103,7 +100,7 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc2Block block) } } - internal class Bc3Decoder : BaseBcBlockDecoder + internal class Bc3Decoder : BaseBcBlockDecoder { protected override RawBlock4X4Rgba32 DecodeBlock(Bc3Block block) { @@ -111,7 +108,7 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc3Block block) } } - internal class Bc4Decoder : BaseBcBlockDecoder + internal class Bc4Decoder : BaseBcBlockDecoder { private readonly ColorComponent component; @@ -126,7 +123,7 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc4Block block) } } - internal class Bc5Decoder : BaseBcBlockDecoder + internal class Bc5Decoder : BaseBcBlockDecoder { private readonly ColorComponent component1; private readonly ColorComponent component2; @@ -143,7 +140,23 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc5Block block) } } - internal class Bc7Decoder : BaseBcBlockDecoder + internal class Bc6UDecoder : BaseBcBlockDecoder + { + protected override RawBlock4X4RgbFloat DecodeBlock(Bc6Block block) + { + return block.Decode(false); + } + } + + internal class Bc6SDecoder : BaseBcBlockDecoder + { + protected override RawBlock4X4RgbFloat DecodeBlock(Bc6Block block) + { + return block.Decode(true); + } + } + + internal class Bc7Decoder : BaseBcBlockDecoder { protected override RawBlock4X4Rgba32 DecodeBlock(Bc7Block block) { @@ -151,7 +164,7 @@ protected override RawBlock4X4Rgba32 DecodeBlock(Bc7Block block) } } - internal class AtcDecoder : BaseBcBlockDecoder + internal class AtcDecoder : BaseBcBlockDecoder { protected override RawBlock4X4Rgba32 DecodeBlock(AtcBlock block) { @@ -159,7 +172,7 @@ protected override RawBlock4X4Rgba32 DecodeBlock(AtcBlock block) } } - internal class AtcExplicitAlphaDecoder : BaseBcBlockDecoder + internal class AtcExplicitAlphaDecoder : BaseBcBlockDecoder { protected override RawBlock4X4Rgba32 DecodeBlock(AtcExplicitAlphaBlock block) { @@ -167,7 +180,7 @@ protected override RawBlock4X4Rgba32 DecodeBlock(AtcExplicitAlphaBlock block) } } - internal class AtcInterpolatedAlphaDecoder : BaseBcBlockDecoder + internal class AtcInterpolatedAlphaDecoder : BaseBcBlockDecoder { protected override RawBlock4X4Rgba32 DecodeBlock(AtcInterpolatedAlphaBlock block) { diff --git a/BCnEnc.Net/Decoder/BcDecoder.cs b/BCnEnc.Net/Decoder/BcDecoder.cs index bbb54c7..6c37ad9 100644 --- a/BCnEnc.Net/Decoder/BcDecoder.cs +++ b/BCnEnc.Net/Decoder/BcDecoder.cs @@ -30,7 +30,7 @@ public class BcDecoder /// The output options of the decoder. /// public DecoderOutputOptions OutputOptions { get; } = new DecoderOutputOptions(); - + #region LDR #region Async Api /// @@ -275,115 +275,640 @@ public ColorRgba32[] DecodeRaw(byte[] input, int pixelWidth, int pixelHeight, Co /// /// The loaded Ktx file. /// The decoded image. - public ColorRgba32[] Decode(KtxFile file) + public ColorRgba32[] Decode(KtxFile file) + { + return DecodeInternal(file, false, default)[0]; + } + + /// + /// Decode all available mipmaps from a Ktx file. + /// + /// The loaded Ktx file. + /// An array of decoded images. + public ColorRgba32[][] DecodeAllMipMaps(KtxFile file) + { + return DecodeInternal(file, true, default); + } + + /// + /// Decode the main image from a Dds file. + /// + /// The loaded Dds file. + /// The decoded image. + public ColorRgba32[] Decode(DdsFile file) + { + return DecodeInternal(file, false, default)[0]; + } + + /// + /// Decode all available mipmaps from a Dds file. + /// + /// The loaded Dds file. + /// An array of decoded images. + public ColorRgba32[][] DecodeAllMipMaps(DdsFile file) + { + return DecodeInternal(file, true, default); + } + + /// + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. + /// + /// The stream containing the encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The decoded image. + public Memory2D DecodeRaw2D(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) + { + var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; + inputStream.Read(dataArray, 0, dataArray.Length); + + var decoded = DecodeRaw(dataArray, pixelWidth, pixelHeight, format); + return decoded.AsMemory().AsMemory2D(pixelHeight, pixelWidth); + } + + /// + /// Decode a single encoded image from raw bytes. + /// + /// The byte array containing the raw encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The decoded image. + public Memory2D DecodeRaw2D(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) + { + var decoded = DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); + return decoded.AsMemory().AsMemory2D(pixelHeight, pixelWidth); + } + + /// + /// Read a Ktx or Dds file from a stream and decode the main image from it. + /// The type of file will be detected automatically. + /// + /// The stream containing a Ktx or Dds file. + /// The decoded image. + public Memory2D Decode2D(Stream inputStream) + { + return DecodeFromStreamInternal2D(inputStream, false, default)[0]; + } + + /// + /// Read a Ktx or Dds file from a stream and decode all available mipmaps from it. + /// The type of file will be detected automatically. + /// + /// The stream containing a Ktx or Dds file. + /// An array of decoded images. + public Memory2D[] DecodeAllMipMaps2D(Stream inputStream) + { + return DecodeFromStreamInternal2D(inputStream, true, default); + } + + /// + /// Decode the main image from a Ktx file. + /// + /// The loaded Ktx file. + /// The decoded image. + public Memory2D Decode2D(KtxFile file) + { + return DecodeInternal(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth); + } + + /// + /// Decode all available mipmaps from a Ktx file. + /// + /// The loaded Ktx file. + /// An array of decoded images. + public Memory2D[] DecodeAllMipMaps2D(KtxFile file) + { + var decoded = DecodeInternal(file, true, default); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); + } + return mem2Ds; + } + + /// + /// Decode the main image from a Dds file. + /// + /// The loaded Dds file. + /// The decoded image. + public Memory2D Decode2D(DdsFile file) + { + return DecodeInternal(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth); + } + + /// + /// Decode all available mipmaps from a Dds file. + /// + /// The loaded Dds file. + /// An array of decoded images. + public Memory2D[] DecodeAllMipMaps2D(DdsFile file) + { + var decoded = DecodeInternal(file, true, default); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.Faces[0].MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); + } + return mem2Ds; + } + + /// + /// Decode a single block from raw bytes and return it as a . + /// Input Span size needs to equal the block size. + /// To get the block size (in bytes) of the compression format used, see . + /// + /// The encoded block in bytes. + /// The compression format used. + /// The decoded 4x4 block. + public Memory2D DecodeBlock(ReadOnlySpan blockData, CompressionFormat format) + { + var output = new ColorRgba32[4, 4]; + DecodeBlockInternal(blockData, format, output); + return output; + } + + /// + /// Decode a single block from raw bytes and write it to the given output span. + /// Output span size must be exactly 4x4 and input Span size needs to equal the block size. + /// To get the block size (in bytes) of the compression format used, see . + /// + /// The encoded block in bytes. + /// The compression format used. + /// The destination span of the decoded data. + public void DecodeBlock(ReadOnlySpan blockData, CompressionFormat format, Span2D outputSpan) + { + if (outputSpan.Width != 4 || outputSpan.Height != 4) + { + throw new ArgumentException($"Single block decoding needs an output span of exactly 4x4"); + } + DecodeBlockInternal(blockData, format, outputSpan); + } + + /// + /// Decode a single block from a stream and write it to the given output span. + /// Output span size must be exactly 4x4. + /// + /// The stream to read encoded blocks from. + /// The compression format used. + /// The destination span of the decoded data. + /// The number of bytes read from the stream. Zero (0) if reached the end of stream. + public int DecodeBlock(Stream inputStream, CompressionFormat format, Span2D outputSpan) + { + if (outputSpan.Width != 4 || outputSpan.Height != 4) + { + throw new ArgumentException($"Single block decoding needs an output span of exactly 4x4"); + } + + Span input = stackalloc byte[16]; + input = input.Slice(0, GetBlockSize(format)); + + var bytesRead = inputStream.Read(input); + + if (bytesRead == 0) + { + return 0; //End of stream + } + + if (bytesRead != input.Length) + { + throw new Exception("Input stream does not have enough data available for a full block."); + } + + DecodeBlockInternal(input, format, outputSpan); + return bytesRead; + } + + /// + /// Check whether a file is encoded in a supported format. + /// + /// The loaded ktx file to check + /// If the format of the file is one of the supported formats. + public bool IsSupportedFormat(KtxFile file) + { + return GetCompressionFormat(file.header.GlInternalFormat) != CompressionFormat.Unknown; + } + + /// + /// Check whether a file is encoded in a supported format. + /// + /// The loaded dds file to check + /// If the format of the file is one of the supported formats. + public bool IsSupportedFormat(DdsFile file) + { + return GetCompressionFormat(file) != CompressionFormat.Unknown; + } + + /// + /// Gets the format of the file. + /// + /// The loaded ktx file to check + /// The of the file. + public CompressionFormat GetFormat(KtxFile file) + { + return GetCompressionFormat(file.header.GlInternalFormat); + } + + /// + /// Gets the format of the file. + /// + /// The loaded dds file to check + /// The of the file. + public CompressionFormat GetFormat(DdsFile file) + { + return GetCompressionFormat(file); + } + + + #endregion + #endregion + + #region HDR + #region Async Api + + /// + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The stream containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task DecodeRawHdrAsync(Stream inputStream, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + { + var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; + inputStream.Read(dataArray, 0, dataArray.Length); + + return Task.Run(() => DecodeRawInternalHdr(dataArray, pixelWidth, pixelHeight, format, token), token); + } + + /// + /// Decode a single encoded image from raw bytes. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task DecodeRawHdrAsync(ReadOnlyMemory input, CompressionFormat format, int pixelWidth, int pixelHeight, CancellationToken token = default) + { + return Task.Run(() => DecodeRawInternalHdr(input, pixelWidth, pixelHeight, format, token), token); + } + + /// + /// Decode the main image from a Ktx file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task DecodeHdrAsync(KtxFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternalHdr(file, false, token)[0], token); + } + + /// + /// Decode all available mipmaps from a Ktx file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task DecodeAllMipMapsHdrAsync(KtxFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternalHdr(file, true, token), token); + } + + /// + /// Decode the main image from a Dds file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task DecodeHdrAsync(DdsFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternalHdr(file, false, token)[0], token); + } + + /// + /// Decode all available mipmaps from a Dds file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task DecodeAllMipMapsHdrAsync(DdsFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternalHdr(file, true, token), token); + } + + /// + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The stream containing the raw encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task> DecodeRawHdr2DAsync(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token = default) + { + var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; + inputStream.Read(dataArray, 0, dataArray.Length); + + return Task.Run(() => DecodeRawInternalHdr(dataArray, pixelWidth, pixelHeight, format, token) + .AsMemory().AsMemory2D(pixelHeight, pixelWidth), token); + } + + /// + /// Decode a single encoded image from raw bytes. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The containing the encoded data. + /// The Format the encoded data is in. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task> DecodeRawHdr2DAsync(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token = default) + { + return Task.Run(() => DecodeRawInternalHdr(input, pixelWidth, pixelHeight, format, token) + .AsMemory().AsMemory2D(pixelHeight, pixelWidth), token); + } + + /// + /// Read a Ktx or Dds file from a stream and decode the main image from it. + /// The type of file will be detected automatically. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The stream containing a Ktx or Dds file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task> DecodeHdr2DAsync(Stream inputStream, CancellationToken token = default) + { + return Task.Run(() => DecodeFromStreamInternalHdr2D(inputStream, false, token)[0], token); + } + + /// + /// Read a Ktx or Dds file from a stream and decode all available mipmaps from it. + /// The type of file will be detected automatically. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The stream containing a Ktx or Dds file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task[]> DecodeAllMipMapsHdr2DAsync(Stream inputStream, CancellationToken token = default) + { + return Task.Run(() => DecodeFromStreamInternalHdr2D(inputStream, false, token), token); + } + + /// + /// Decode the main image from a Ktx file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task> DecodeHdr2DAsync(KtxFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternalHdr(file, false, token)[0] + .AsMemory().AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth), token); + } + + /// + /// Decode all available mipmaps from a Ktx file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The loaded Ktx file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task[]> DecodeAllMipMapsHdr2DAsync(KtxFile file, CancellationToken token = default) + { + return Task.Run(() => + { + var decoded = DecodeInternalHdr(file, true, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); + } + return mem2Ds; + }, token); + } + + /// + /// Decode the main image from a Dds file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task> DecodeHdr2DAsync(DdsFile file, CancellationToken token = default) + { + return Task.Run(() => DecodeInternalHdr(file, false, token)[0] + .AsMemory().AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth), token); + } + + /// + /// Decode all available mipmaps from a Dds file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The loaded Dds file. + /// The cancellation token for this asynchronous operation. + /// The awaitable operation to retrieve the decoded image. + public Task[]> DecodeAllMipMapsHdr2DAsync(DdsFile file, CancellationToken token = default) + { + return Task.Run(() => + { + var decoded = DecodeInternalHdr(file, true, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.Faces[0].MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); + } + return mem2Ds; + }, token); + } + + #endregion + + #region Sync API + + /// + /// Decode a single encoded image from raw bytes. + /// This method will read the expected amount of bytes from the given input stream and decode it. + /// Make sure there is no file header information left in the stream before the encoded data. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The stream containing the raw encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The decoded image. + public ColorRgbFloat[] DecodeRawHdr(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) + { + var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; + inputStream.Read(dataArray, 0, dataArray.Length); + + return DecodeRawHdr(dataArray, pixelWidth, pixelHeight, format); + } + + /// + /// Decode a single encoded image from raw bytes. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The byte array containing the raw encoded data. + /// The pixelWidth of the image. + /// The pixelHeight of the image. + /// The Format the encoded data is in. + /// The decoded image. + public ColorRgbFloat[] DecodeRawHdr(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) + { + return DecodeRawInternalHdr(input, pixelWidth, pixelHeight, format, default); + } + + /// + /// Decode the main image from a Ktx file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. + /// + /// The loaded Ktx file. + /// The decoded image. + public ColorRgbFloat[] DecodeHdr(KtxFile file) { - return DecodeInternal(file, false, default)[0]; + return DecodeInternalHdr(file, false, default)[0]; } /// /// Decode all available mipmaps from a Ktx file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The loaded Ktx file. /// An array of decoded images. - public ColorRgba32[][] DecodeAllMipMaps(KtxFile file) + public ColorRgbFloat[][] DecodeAllMipMapsHdr(KtxFile file) { - return DecodeInternal(file, true, default); + return DecodeInternalHdr(file, true, default); } /// /// Decode the main image from a Dds file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The loaded Dds file. /// The decoded image. - public ColorRgba32[] Decode(DdsFile file) + public ColorRgbFloat[] DecodeHdr(DdsFile file) { - return DecodeInternal(file, false, default)[0]; + return DecodeInternalHdr(file, false, default)[0]; } /// /// Decode all available mipmaps from a Dds file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The loaded Dds file. /// An array of decoded images. - public ColorRgba32[][] DecodeAllMipMaps(DdsFile file) + public ColorRgbFloat[][] DecodeAllMipMapsHdr(DdsFile file) { - return DecodeInternal(file, true, default); + return DecodeInternalHdr(file, true, default); } /// /// Decode a single encoded image from raw bytes. /// This method will read the expected amount of bytes from the given input stream and decode it. /// Make sure there is no file header information left in the stream before the encoded data. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The stream containing the encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. /// The decoded image. - public Memory2D DecodeRaw2D(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) + public Memory2D DecodeRawHdr2D(Stream inputStream, int pixelWidth, int pixelHeight, CompressionFormat format) { var dataArray = new byte[GetBufferSize(format, pixelWidth, pixelHeight)]; inputStream.Read(dataArray, 0, dataArray.Length); - var decoded = DecodeRaw(dataArray, pixelWidth, pixelHeight, format); + var decoded = DecodeRawHdr(dataArray, pixelWidth, pixelHeight, format); return decoded.AsMemory().AsMemory2D(pixelHeight, pixelWidth); } /// /// Decode a single encoded image from raw bytes. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The byte array containing the raw encoded data. /// The pixelWidth of the image. /// The pixelHeight of the image. /// The Format the encoded data is in. /// The decoded image. - public Memory2D DecodeRaw2D(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) + public Memory2D DecodeRawHdr2D(byte[] input, int pixelWidth, int pixelHeight, CompressionFormat format) { - var decoded = DecodeRawInternal(input, pixelWidth, pixelHeight, format, default); + var decoded = DecodeRawInternalHdr(input, pixelWidth, pixelHeight, format, default); return decoded.AsMemory().AsMemory2D(pixelHeight, pixelWidth); } /// /// Read a Ktx or Dds file from a stream and decode the main image from it. /// The type of file will be detected automatically. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The stream containing a Ktx or Dds file. /// The decoded image. - public Memory2D Decode2D(Stream inputStream) + public Memory2D DecodeHdr2D(Stream inputStream) { - return DecodeFromStreamInternal2D(inputStream, false, default)[0]; + return DecodeFromStreamInternalHdr2D(inputStream, false, default)[0]; } /// /// Read a Ktx or Dds file from a stream and decode all available mipmaps from it. /// The type of file will be detected automatically. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The stream containing a Ktx or Dds file. /// An array of decoded images. - public Memory2D[] DecodeAllMipMaps2D(Stream inputStream) + public Memory2D[] DecodeAllMipMapsHdr2D(Stream inputStream) { - return DecodeFromStreamInternal2D(inputStream, true, default); + return DecodeFromStreamInternalHdr2D(inputStream, true, default); } /// /// Decode the main image from a Ktx file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The loaded Ktx file. /// The decoded image. - public Memory2D Decode2D(KtxFile file) + public Memory2D DecodeHdr2D(KtxFile file) { - return DecodeInternal(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth); + return DecodeInternalHdr(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.PixelHeight, (int)file.header.PixelWidth); } /// /// Decode all available mipmaps from a Ktx file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The loaded Ktx file. /// An array of decoded images. - public Memory2D[] DecodeAllMipMaps2D(KtxFile file) + public Memory2D[] DecodeAllMipMapsHdr2D(KtxFile file) { - var decoded = DecodeInternal(file, true, default); - var mem2Ds = new Memory2D[decoded.Length]; + var decoded = DecodeInternalHdr(file, true, default); + var mem2Ds = new Memory2D[decoded.Length]; for (var i = 0; i < decoded.Length; i++) { var mip = file.MipMaps[i]; @@ -394,23 +919,25 @@ public Memory2D[] DecodeAllMipMaps2D(KtxFile file) /// /// Decode the main image from a Dds file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The loaded Dds file. /// The decoded image. - public Memory2D Decode2D(DdsFile file) + public Memory2D DecodeHdr2D(DdsFile file) { - return DecodeInternal(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth); + return DecodeInternalHdr(file, false, default)[0].AsMemory().AsMemory2D((int)file.header.dwHeight, (int)file.header.dwWidth); } /// /// Decode all available mipmaps from a Dds file. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The loaded Dds file. /// An array of decoded images. - public Memory2D[] DecodeAllMipMaps2D(DdsFile file) + public Memory2D[] DecodeAllMipMapsHdr2D(DdsFile file) { - var decoded = DecodeInternal(file, true, default); - var mem2Ds = new Memory2D[decoded.Length]; + var decoded = DecodeInternalHdr(file, true, default); + var mem2Ds = new Memory2D[decoded.Length]; for (var i = 0; i < decoded.Length; i++) { var mip = file.Faces[0].MipMaps[i]; @@ -423,14 +950,15 @@ public Memory2D[] DecodeAllMipMaps2D(DdsFile file) /// Decode a single block from raw bytes and return it as a . /// Input Span size needs to equal the block size. /// To get the block size (in bytes) of the compression format used, see . + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The encoded block in bytes. /// The compression format used. /// The decoded 4x4 block. - public Memory2D DecodeBlock(ReadOnlySpan blockData, CompressionFormat format) + public Memory2D DecodeBlockHdr(ReadOnlySpan blockData, CompressionFormat format) { - var output = new ColorRgba32[4, 4]; - DecodeBlockInternal(blockData, format, output); + var output = new ColorRgbFloat[4, 4]; + DecodeBlockInternalHdr(blockData, format, output); return output; } @@ -438,28 +966,30 @@ public Memory2D DecodeBlock(ReadOnlySpan blockData, Compressi /// Decode a single block from raw bytes and write it to the given output span. /// Output span size must be exactly 4x4 and input Span size needs to equal the block size. /// To get the block size (in bytes) of the compression format used, see . + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The encoded block in bytes. /// The compression format used. /// The destination span of the decoded data. - public void DecodeBlock(ReadOnlySpan blockData, CompressionFormat format, Span2D outputSpan) + public void DecodeBlockHdr(ReadOnlySpan blockData, CompressionFormat format, Span2D outputSpan) { if (outputSpan.Width != 4 || outputSpan.Height != 4) { throw new ArgumentException($"Single block decoding needs an output span of exactly 4x4"); } - DecodeBlockInternal(blockData, format, outputSpan); + DecodeBlockInternalHdr(blockData, format, outputSpan); } /// /// Decode a single block from a stream and write it to the given output span. /// Output span size must be exactly 4x4. + /// This method is only for compressed Hdr formats. Please use the non-Hdr methods for other formats. /// /// The stream to read encoded blocks from. /// The compression format used. /// The destination span of the decoded data. /// The number of bytes read from the stream. Zero (0) if reached the end of stream. - public int DecodeBlock(Stream inputStream, CompressionFormat format, Span2D outputSpan) + public int DecodeBlockHdr(Stream inputStream, CompressionFormat format, Span2D outputSpan) { if (outputSpan.Width != 4 || outputSpan.Height != 4) { @@ -481,12 +1011,32 @@ public int DecodeBlock(Stream inputStream, CompressionFormat format, Span2D + /// Check whether a file is encoded in a supported HDR format. + /// + /// The loaded ktx file to check + /// If the format of the file is one of the supported HDR formats. + public bool IsHdrFormat(KtxFile file) + { + return GetCompressionFormat(file.header.GlInternalFormat).IsHdrFormat(); + } + + /// + /// Check whether a file is encoded in a supported HDR format. + /// + /// The loaded dds file to check + /// If the format of the file is one of the supported HDR formats. + public bool IsHdrFormat(DdsFile file) + { + return GetCompressionFormat(file).IsHdrFormat(); + } + #endregion + #endregion /// /// Load a stream and extract either the main image or all mip maps. /// @@ -573,7 +1123,12 @@ private ColorRgba32[][] DecodeInternal(KtxFile file, bool allMipMaps, Cancellati } else { - var decoder = GetDecoder(file.header.GlInternalFormat); + var decoder = GetRgba32Decoder(file.header.GlInternalFormat); + var format = GetCompressionFormat(file.header.GlInternalFormat); + if (format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not an RGBA32 compatible format: {format}, please use the HDR versions of the decode methods."); + } if (decoder == null) { throw new NotSupportedException($"This Format is not supported: {file.header.GlInternalFormat}"); @@ -636,14 +1191,19 @@ private ColorRgba32[][] DecodeInternal(DdsFile file, bool allMipMaps, Cancellati } else { - var format = file.header.ddsPixelFormat.IsDxt10Format ? - file.dx10Header.dxgiFormat : - file.header.ddsPixelFormat.DxgiFormat; - var decoder = GetDecoder(file); + var dxtFormat = file.header.ddsPixelFormat.IsDxt10Format + ? file.dx10Header.dxgiFormat + : file.header.ddsPixelFormat.DxgiFormat; + var format = GetCompressionFormat(file); + var decoder = GetRgba32Decoder(format); + if (format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not an RGBA32 compatible format: {format}, please use the HDR versions of the decode methods."); + } if (decoder == null) { - throw new NotSupportedException($"This Format is not supported: {format}"); + throw new NotSupportedException($"This Format is not supported: {dxtFormat}"); } for (var mip = 0; mip < mipMaps; mip++) @@ -698,8 +1258,12 @@ private ColorRgba32[] DecodeRawInternal(ReadOnlyMemory input, int pixelWid if (isCompressedFormat) { // DecodeInternal as compressed data - var decoder = GetDecoder(format); + var decoder = GetRgba32Decoder(format); + if (format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not an RGBA32 compatible format: {format}, please use the HDR versions of the decode methods."); + } if (decoder == null) { throw new NotSupportedException($"This Format is not supported: {format}"); @@ -718,7 +1282,239 @@ private ColorRgba32[] DecodeRawInternal(ReadOnlyMemory input, int pixelWid private void DecodeBlockInternal(ReadOnlySpan blockData, CompressionFormat format, Span2D outputSpan) { - var decoder = GetDecoder(format); + var decoder = GetRgba32Decoder(format); + if (format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not an RGBA32 compatible format: {format}, please use the HDR versions of the decode methods."); + } + if (decoder == null) + { + throw new NotSupportedException($"This Format is not supported: {format}"); + } + if (blockData.Length != GetBlockSize(format)) + { + throw new ArgumentException("The size of the input buffer does not align with the compression format."); + } + + var rawBlock = decoder.DecodeBlock(blockData); + var pixels = rawBlock.AsSpan; + + pixels.Slice(0, 4).CopyTo(outputSpan.GetRowSpan(0)); + pixels.Slice(4, 4).CopyTo(outputSpan.GetRowSpan(1)); + pixels.Slice(8, 4).CopyTo(outputSpan.GetRowSpan(2)); + pixels.Slice(12, 4).CopyTo(outputSpan.GetRowSpan(3)); + } + + #region Hdr internals + + /// + /// Load a stream and extract either the main image or all mip maps. + /// + /// The stream containing the image file. + /// If all mip maps or only the main image should be decoded. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// An array of decoded Rgba32 images. + private Memory2D[] DecodeFromStreamInternalHdr2D(Stream stream, bool allMipMaps, CancellationToken token) + { + var format = ImageFile.DetermineImageFormat(stream); + + switch (format) + { + case ImageFileFormat.Dds: + { + var file = DdsFile.Load(stream); + var decoded = DecodeInternalHdr(file, allMipMaps, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.Faces[0].MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); + } + + return mem2Ds; + } + + case ImageFileFormat.Ktx: + { + var file = KtxFile.Load(stream); + var decoded = DecodeInternalHdr(file, allMipMaps, token); + var mem2Ds = new Memory2D[decoded.Length]; + for (var i = 0; i < decoded.Length; i++) + { + var mip = file.MipMaps[i]; + mem2Ds[i] = decoded[i].AsMemory().AsMemory2D((int)mip.Height, (int)mip.Width); + } + + return mem2Ds; + } + + default: + throw new InvalidOperationException("Unknown image format."); + } + } + + /// + /// Load a KTX file and extract either the main image or all mip maps. + /// + /// The Ktx file to decode. + /// If all mip maps or only the main image should be decoded. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// An array of decoded Rgba32 images. + private ColorRgbFloat[][] DecodeInternalHdr(KtxFile file, bool allMipMaps, CancellationToken token) + { + var mipMaps = allMipMaps ? file.MipMaps.Count : 1; + var colors = new ColorRgbFloat[mipMaps][]; + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Calculate total blocks + var blockSize = GetBlockSize(file.header.GlInternalFormat); + var totalBlocks = file.MipMaps.Take(mipMaps).Sum(m => m.Faces[0].Data.Length / blockSize); + + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + var decoder = GetRgbFloatDecoder(file.header.GlInternalFormat); + var format = GetCompressionFormat(file.header.GlInternalFormat); + if (!format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not an HDR format: {format}, please use the non-HDR versions of the decode methods."); + } + if (decoder == null) + { + throw new NotSupportedException($"This Format is not supported: {file.header.GlInternalFormat}"); + } + + for (var mip = 0; mip < mipMaps; mip++) + { + var data = file.MipMaps[mip].Faces[0].Data; + var pixelWidth = file.MipMaps[mip].Width; + var pixelHeight = file.MipMaps[mip].Height; + + var blocks = decoder.Decode(data, context); + + colors[mip] = ImageToBlocks.ColorsFromRawBlocks(blocks, (int)pixelWidth, (int)pixelHeight); + + context.Progress.SetProcessedBlocks(file.MipMaps.Take(mip + 1).Sum(x => x.Faces[0].Data.Length / blockSize)); + } + + return colors; + } + + /// + /// Load a DDS file and extract either the main image or all mip maps. + /// + /// The Dds file to decode. + /// If all mip maps or only the main image should be decoded. + /// The cancellation token for this operation. Can be default, if the operation is not asynchronous. + /// An array of decoded Rgba32 images. + private ColorRgbFloat[][] DecodeInternalHdr(DdsFile file, bool allMipMaps, CancellationToken token) + { + var mipMaps = allMipMaps ? file.header.dwMipMapCount : 1; + var colors = new ColorRgbFloat[mipMaps][]; + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Calculate total blocks + var blockSize = GetBlockSize(file); + var totalBlocks = file.Faces[0].MipMaps.Take((int)mipMaps).Sum(m => m.Data.Length / blockSize); + + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + var dxtFormat = file.header.ddsPixelFormat.IsDxt10Format + ? file.dx10Header.dxgiFormat + : file.header.ddsPixelFormat.DxgiFormat; + var format = GetCompressionFormat(file); + var decoder = GetRgbFloatDecoder(format); + + if (!format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not an HDR format: {format}, please use the non-HDR versions of the decode methods."); + } + if (decoder == null) + { + throw new NotSupportedException($"This Format is not supported: {dxtFormat}"); + } + + for (var mip = 0; mip < mipMaps; mip++) + { + var data = file.Faces[0].MipMaps[mip].Data; + var pixelWidth = file.Faces[0].MipMaps[mip].Width; + var pixelHeight = file.Faces[0].MipMaps[mip].Height; + + var blocks = decoder.Decode(data, context); + + var image = ImageToBlocks.ColorsFromRawBlocks(blocks, (int)pixelWidth, (int)pixelHeight); + + colors[mip] = image; + + context.Progress.SetProcessedBlocks(file.Faces[0].MipMaps.Take(mip + 1).Sum(x => x.Data.Length / blockSize)); + } + + return colors; + } + + /// + /// Decode raw encoded image asynchronously. + /// + /// The containing the encoded data. + /// The width of the image. + /// The height of the image. + /// The Format the encoded data is in. + /// The cancellation token for this operation. May be default, if the operation is not asynchronous. + /// The decoded Rgba32 image. + private ColorRgbFloat[] DecodeRawInternalHdr(ReadOnlyMemory input, int pixelWidth, int pixelHeight, CompressionFormat format, CancellationToken token) + { + if (input.Length % GetBlockSize(format) != 0) + { + throw new ArgumentException("The size of the input buffer does not align with the compression format."); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Calculate total blocks + var blockSize = GetBlockSize(format); + var totalBlocks = input.Length / blockSize; + + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + var decoder = GetRgbFloatDecoder(format); + + if (!format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not an HDR format: {format}, please use the non-HDR versions of the decode methods."); + } + if (decoder == null) + { + throw new NotSupportedException($"This Format is not supported: {format}"); + } + + var blocks = decoder.Decode(input, context); + + return ImageToBlocks.ColorsFromRawBlocks(blocks, pixelWidth, pixelHeight); + } + + private void DecodeBlockInternalHdr(ReadOnlySpan blockData, CompressionFormat format, Span2D outputSpan) + { + var decoder = GetRgbFloatDecoder(format); + if (!format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not an HDR format: {format}, please use the non-HDR versions of the decode methods."); + } if (decoder == null) { throw new NotSupportedException($"This Format is not supported: {format}"); @@ -736,6 +1532,7 @@ private void DecodeBlockInternal(ReadOnlySpan blockData, CompressionFormat pixels.Slice(8, 4).CopyTo(outputSpan.GetRowSpan(2)); pixels.Slice(12, 4).CopyTo(outputSpan.GetRowSpan(3)); } + #endregion #region Support @@ -771,17 +1568,17 @@ private bool IsSupportedRawFormat(CompressionFormat format) #region Get decoder - private IBcBlockDecoder GetDecoder(GlInternalFormat format) + private IBcBlockDecoder GetRgba32Decoder(GlInternalFormat format) { - return GetDecoder(GetCompressionFormat(format)); + return GetRgba32Decoder(GetCompressionFormat(format)); } - private IBcBlockDecoder GetDecoder(DdsFile file) + private IBcBlockDecoder GetRgba32Decoder(DdsFile file) { - return GetDecoder(GetCompressionFormat(file)); + return GetRgba32Decoder(GetCompressionFormat(file)); } - private IBcBlockDecoder GetDecoder(CompressionFormat format) + private IBcBlockDecoder GetRgba32Decoder(CompressionFormat format) { switch (format) { @@ -820,6 +1617,29 @@ private IBcBlockDecoder GetDecoder(CompressionFormat format) } } + private IBcBlockDecoder GetRgbFloatDecoder(GlInternalFormat format) + { + return GetRgbFloatDecoder(GetCompressionFormat(format)); + } + + private IBcBlockDecoder GetRgbFloatDecoder(DdsFile file) + { + return GetRgbFloatDecoder(GetCompressionFormat(file)); + } + + private IBcBlockDecoder GetRgbFloatDecoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.Bc6S: + return new Bc6SDecoder(); + case CompressionFormat.Bc6U: + return new Bc6UDecoder(); + default: + return null; + } + } + #endregion #region Get raw decoder @@ -935,6 +1755,10 @@ public int GetBlockSize(CompressionFormat format) case CompressionFormat.Bc5: return Unsafe.SizeOf(); + case CompressionFormat.Bc6S: + case CompressionFormat.Bc6U: + return Unsafe.SizeOf(); + case CompressionFormat.Bc7: return Unsafe.SizeOf(); @@ -947,6 +1771,9 @@ public int GetBlockSize(CompressionFormat format) case CompressionFormat.AtcInterpolatedAlpha: return Unsafe.SizeOf(); + case CompressionFormat.Unknown: + return 0; + default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } @@ -992,6 +1819,12 @@ private CompressionFormat GetCompressionFormat(GlInternalFormat format) case GlInternalFormat.GlCompressedRedGreenRgtc2Ext: return CompressionFormat.Bc5; + case GlInternalFormat.GlCompressedRgbBptcUnsignedFloatArb: + return CompressionFormat.Bc6U; + + case GlInternalFormat.GlCompressedRgbBptcSignedFloatArb: + return CompressionFormat.Bc6S; + // TODO: Not sure what to do with SRGB input. case GlInternalFormat.GlCompressedRgbaBptcUnormArb: case GlInternalFormat.GlCompressedSrgbAlphaBptcUnormArb: @@ -1007,7 +1840,7 @@ private CompressionFormat GetCompressionFormat(GlInternalFormat format) return CompressionFormat.AtcInterpolatedAlpha; default: - throw new ArgumentOutOfRangeException(nameof(format), format, null); + return CompressionFormat.Unknown; } } @@ -1064,6 +1897,13 @@ private CompressionFormat GetCompressionFormat(DdsFile file) case DxgiFormat.DxgiFormatBc5Typeless: return CompressionFormat.Bc5; + case DxgiFormat.DxgiFormatBc6HTypeless: + case DxgiFormat.DxgiFormatBc6HUf16: + return CompressionFormat.Bc6U; + + case DxgiFormat.DxgiFormatBc6HSf16: + return CompressionFormat.Bc6S; + case DxgiFormat.DxgiFormatBc7Unorm: case DxgiFormat.DxgiFormatBc7UnormSrgb: case DxgiFormat.DxgiFormatBc7Typeless: @@ -1079,7 +1919,7 @@ private CompressionFormat GetCompressionFormat(DdsFile file) return CompressionFormat.AtcInterpolatedAlpha; default: - throw new ArgumentOutOfRangeException(nameof(format), format, null); + return CompressionFormat.Unknown; } } @@ -1106,12 +1946,16 @@ private int GetBufferSize(CompressionFormat format, int pixelWidth, int pixelHei case CompressionFormat.Bc3: case CompressionFormat.Bc4: case CompressionFormat.Bc5: + case CompressionFormat.Bc6S: + case CompressionFormat.Bc6U: case CompressionFormat.Bc7: case CompressionFormat.Atc: case CompressionFormat.AtcExplicitAlpha: case CompressionFormat.AtcInterpolatedAlpha: return GetBlockSize(format) * ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + case CompressionFormat.Unknown: + return 0; default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } diff --git a/BCnEnc.Net/Decoder/BcFloatBlockDecoder.cs b/BCnEnc.Net/Decoder/BcFloatBlockDecoder.cs new file mode 100644 index 0000000..b585bc3 --- /dev/null +++ b/BCnEnc.Net/Decoder/BcFloatBlockDecoder.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BCnEncoder.Decoder +{ + internal class Bc6FloatBlockDecoder + { + private static readonly object lockObj = new object(); + + } +} diff --git a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs index 5b74acc..2c3dde2 100644 --- a/BCnEnc.Net/Encoder/AtcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/AtcBlockEncoder.cs @@ -3,7 +3,7 @@ namespace BCnEncoder.Encoder { - internal unsafe class AtcBlockEncoder : BaseBcBlockEncoder + internal unsafe class AtcBlockEncoder : BaseBcBlockEncoder { private readonly Bc1BlockEncoder bc1BlockEncoder; @@ -52,7 +52,7 @@ public override DxgiFormat GetDxgiFormat() } } - internal class AtcExplicitAlphaBlockEncoder : BaseBcBlockEncoder + internal class AtcExplicitAlphaBlockEncoder : BaseBcBlockEncoder { private readonly AtcBlockEncoder atcBlockEncoder; @@ -95,7 +95,7 @@ public override DxgiFormat GetDxgiFormat() } } - internal class AtcInterpolatedAlphaBlockEncoder : BaseBcBlockEncoder + internal class AtcInterpolatedAlphaBlockEncoder : BaseBcBlockEncoder { private readonly Bc4ComponentBlockEncoder bc4BlockEncoder; private readonly AtcBlockEncoder atcBlockEncoder; diff --git a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs index 4c9b8e0..df5b62b 100644 --- a/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/BaseBcBlockEncoder.cs @@ -8,11 +8,11 @@ namespace BCnEncoder.Encoder { - internal abstract class BaseBcBlockEncoder : IBcBlockEncoder where T : unmanaged + internal abstract class BaseBcBlockEncoder : IBcBlockEncoder where T : unmanaged where TBlock : unmanaged { private static readonly object lockObj = new object(); - public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, OperationContext context) + public byte[] Encode(TBlock[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, OperationContext context) { var outputData = new byte[blockWidth * blockHeight * Unsafe.SizeOf()]; @@ -54,7 +54,7 @@ public byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight return outputData; } - public void EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality, Span output) + public void EncodeBlock(TBlock block, CompressionQuality quality, Span output) { if (output.Length != Unsafe.SizeOf()) { @@ -72,6 +72,6 @@ public int GetBlockSize() return Unsafe.SizeOf(); } - public abstract T EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality); + public abstract T EncodeBlock(TBlock block, CompressionQuality quality); } } diff --git a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs index f32a853..2904ede 100644 --- a/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc1BlockEncoder.cs @@ -4,7 +4,7 @@ namespace BCnEncoder.Encoder { - internal class Bc1BlockEncoder : BaseBcBlockEncoder + internal class Bc1BlockEncoder : BaseBcBlockEncoder { public override Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { @@ -218,7 +218,7 @@ internal static Bc1Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) #endregion } - internal class Bc1AlphaBlockEncoder : BaseBcBlockEncoder + internal class Bc1AlphaBlockEncoder : BaseBcBlockEncoder { public override Bc1Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { diff --git a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs index c2ca29e..33b56af 100644 --- a/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc2BlockEncoder.cs @@ -4,7 +4,7 @@ namespace BCnEncoder.Encoder { - internal class Bc2BlockEncoder : BaseBcBlockEncoder + internal class Bc2BlockEncoder : BaseBcBlockEncoder { public override Bc2Block EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality) { diff --git a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs index 87af246..d12e55c 100644 --- a/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc3BlockEncoder.cs @@ -4,7 +4,7 @@ namespace BCnEncoder.Encoder { - internal class Bc3BlockEncoder : BaseBcBlockEncoder + internal class Bc3BlockEncoder : BaseBcBlockEncoder { private static readonly Bc4ComponentBlockEncoder bc4BlockEncoder = new Bc4ComponentBlockEncoder(ColorComponent.A); diff --git a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs index ea10d93..fc52784 100644 --- a/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc4BlockEncoder.cs @@ -5,7 +5,7 @@ namespace BCnEncoder.Encoder { - internal class Bc4BlockEncoder : BaseBcBlockEncoder + internal class Bc4BlockEncoder : BaseBcBlockEncoder { private readonly Bc4ComponentBlockEncoder bc4Encoder; diff --git a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs index d4df046..6f335b4 100644 --- a/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs +++ b/BCnEnc.Net/Encoder/Bc5BlockEncoder.cs @@ -3,7 +3,7 @@ namespace BCnEncoder.Encoder { - internal class Bc5BlockEncoder : BaseBcBlockEncoder + internal class Bc5BlockEncoder : BaseBcBlockEncoder { private readonly Bc4ComponentBlockEncoder redBlockEncoder; private readonly Bc4ComponentBlockEncoder greenBlockEncoder; diff --git a/BCnEnc.Net/Encoder/BcEncoder.cs b/BCnEnc.Net/Encoder/BcEncoder.cs index 643cbd6..5e17c35 100644 --- a/BCnEnc.Net/Encoder/BcEncoder.cs +++ b/BCnEnc.Net/Encoder/BcEncoder.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -using BCnEncoder.Encoder.Bc7; +using BCnEncoder.Encoder.Bptc; using BCnEncoder.Encoder.Options; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; @@ -72,6 +72,7 @@ public BcEncoder(CompressionFormat format = CompressionFormat.Bc1) OutputOptions.Format = format; } + #region LDR #region Async Api /// @@ -156,7 +157,7 @@ public Task EncodeToDdsAsync(ReadOnlyMemory2D input, Cance } /// - /// Encodes all mipmap levels into a list of byte buffers asynchronously. This data does not contain any file headers, just the raw encoded data. + /// Encodes all mipmap levels into a list of byte buffers asynchronously. This data does not contain any file headers, just the raw encoded pixel data. /// /// The input to encode represented by a . /// The width of the image. @@ -170,7 +171,7 @@ public Task EncodeToRawBytesAsync(ReadOnlyMemory input, int widt } /// - /// Encodes all mipmap levels into an array of byte buffers asynchronously. This data does not contain any file headers, just the raw encoded data. + /// Encodes all mipmap levels into an array of byte buffers asynchronously. This data does not contain any file headers, just the raw encoded pixel data. /// /// The input to encode represented by a . /// The cancellation token for this operation. Can be default if cancellation is not needed. @@ -182,7 +183,7 @@ public Task EncodeToRawBytesAsync(ReadOnlyMemory2D input, } /// - /// Encodes a single mip level of the input image to a byte buffer asynchronously. This data does not contain any file headers, just the raw encoded data. + /// Encodes a single mip level of the input image to a byte buffer asynchronously. This data does not contain any file headers, just the raw encoded pixel data. /// /// The input to encode represented by a . /// The width of the image. @@ -198,7 +199,7 @@ public Task EncodeToRawBytesAsync(ReadOnlyMemory input, int width, } /// - /// Encodes a single mip level of the input image to a byte buffer asynchronously. This data does not contain any file headers, just the raw encoded data. + /// Encodes a single mip level of the input image to a byte buffer asynchronously. This data does not contain any file headers, just the raw encoded pixel data. /// /// The input to encode represented by a . /// The mipmap to encode. @@ -345,7 +346,7 @@ public DdsFile EncodeToDds(ReadOnlyMemory2D input) } /// - /// Encodes all mipmap levels into an array of byte buffers. This data does not contain any file headers, just the raw encoded data. + /// Encodes all mipmap levels into an array of byte buffers. This data does not contain any file headers, just the raw encoded pixel data. /// /// The input to encode represented by a . /// The width of the image. @@ -359,7 +360,7 @@ public byte[][] EncodeToRawBytes(ReadOnlySpan input, int width, int height } /// - /// Encodes all mipmap levels into a list of byte buffers. This data does not contain any file headers, just the raw encoded data. + /// Encodes all mipmap levels into a list of byte buffers. This data does not contain any file headers, just the raw encoded pixel data. /// /// The input to encode represented by a . /// An array of byte buffers containing all mipmap levels. @@ -370,7 +371,7 @@ public byte[][] EncodeToRawBytes(ReadOnlyMemory2D input) } /// - /// Encodes a single mip level of the input image to a byte buffer. This data does not contain any file headers, just the raw encoded data. + /// Encodes a single mip level of the input image to a byte buffer. This data does not contain any file headers, just the raw encoded pixel data. /// /// The input to encode represented by a . /// The width of the image. @@ -386,7 +387,7 @@ public byte[] EncodeToRawBytes(ReadOnlySpan input, int width, int height, } /// - /// Encodes a single mip level of the input image to a byte buffer. This data does not contain any file headers, just the raw encoded data. + /// Encodes a single mip level of the input image to a byte buffer. This data does not contain any file headers, just the raw encoded pixel data. /// /// The input to encode represented by a . /// The mipmap to encode. @@ -605,71 +606,866 @@ public void EncodeBlock(ReadOnlySpan2D inputBlock, Stream outputStr /// The size of a single 4x4 block in bytes public int GetBlockSize() { - var compressedEncoder = GetEncoder(OutputOptions.Format); + var compressedEncoder = GetRgba32BlockEncoder(OutputOptions.Format); if (compressedEncoder == null) { - throw new NotSupportedException($"This format is either not supported or does not use block compression: {OutputOptions.Format}"); + var hdrEncoder = GetFloatBlockEncoder(OutputOptions.Format); + + if (hdrEncoder == null) + { + throw new NotSupportedException($"This format is either not supported or does not use block compression: {OutputOptions.Format}"); + } + + return hdrEncoder.GetBlockSize(); } return compressedEncoder.GetBlockSize(); } - /// - /// Gets the number of total blocks in an image with the given pixel width and height. - /// - /// The pixel width of the image - /// The pixel height of the image - /// The total number of blocks. - public int GetBlockCount(int pixelWidth, int pixelHeight) + /// + /// Gets the number of total blocks in an image with the given pixel width and height. + /// + /// The pixel width of the image + /// The pixel height of the image + /// The total number of blocks. + public int GetBlockCount(int pixelWidth, int pixelHeight) + { + return ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + } + + /// + /// Gets the number of blocks in an image with the given pixel width and height. + /// + /// The pixel width of the image + /// The pixel height of the image + /// The amount of blocks in the x-axis + /// The amount of blocks in the y-axis + public void GetBlockCount(int pixelWidth, int pixelHeight, out int blocksWidth, out int blocksHeight) + { + ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight, out blocksWidth, out blocksHeight); + } + + #endregion + #endregion + + #region HDR + + #region Async Api + + /// + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream asynchronously. + /// + /// The input to encode represented by a . + /// The stream to write the encoded image to. + /// The cancellation token for this operation. Can be default if cancellation is not needed. + public Task EncodeToStreamHdrAsync(ReadOnlyMemory2D input, Stream outputStream, CancellationToken token = default) + { + return Task.Run(() => + { + EncodeToStreamInternalHdr(input, outputStream, default); + }, token); + } + + /// + /// Encodes all mipmap levels into a Ktx file asynchronously. + /// + /// The input to encode represented by a . + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// The Ktx file containing the encoded image. + public Task EncodeToKtxHdrAsync(ReadOnlyMemory2D input, CancellationToken token = default) + { + return Task.Run(() => EncodeToKtxInternalHdr(input, token), token); + } + + /// + /// Encodes all mipmap levels into a Dds file asynchronously. + /// + /// The input to encode represented by a . + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// The Dds file containing the encoded image. + public Task EncodeToDdsHdrAsync(ReadOnlyMemory2D input, CancellationToken token = default) + { + return Task.Run(() => EncodeToDdsInternalHdr(input, token), token); + } + + /// + /// Encodes all mipmap levels of an HDR image into an array of byte buffers asynchronously. This data does not contain any file headers, just the raw encoded pixel data. + /// + /// The input to encode represented by a . + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// A list of raw encoded mipmap input. + /// To get the width and height of the encoded mip levels, see . + public Task EncodeToRawBytesHdrAsync(ReadOnlyMemory2D input, CancellationToken token = default) + { + return Task.Run(() => EncodeToRawInternalHdr(input, token), token); + } + + /// + /// Encodes a single mip level of the input HDR image to a byte buffer asynchronously. This data does not contain any file headers, just the raw encoded pixel data. + /// + /// The input to encode represented by a . + /// The mipmap to encode. + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// The raw encoded input. + /// To get the width and height of the encoded mip level, see . + public Task EncodeToRawBytesHdrAsync(ReadOnlyMemory2D input, int mipLevel, CancellationToken token = default) + { + return Task.Run(() => EncodeToRawInternalHdr(input, mipLevel, out _, out _, token), token); + } + + /// + /// Encodes all mipMaps of a cubeMap HDR image to a stream asynchronously either in ktx or dds format. + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The stream to write the encoded image to. + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// A . + public Task EncodeCubeMapToStreamHdrAsync(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, Stream outputStream, CancellationToken token = default) + { + return Task.Run(() => EncodeCubeMapToStreamInternalHdr(right, left, top, down, back, front, outputStream, token), token); + } + + /// + /// Encodes all mipMaps of a cubeMap HDR image to a asynchronously. + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// A of type . + public Task EncodeCubeMapToKtxHdrAsync(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token = default) + { + return Task.Run(() => EncodeCubeMapToKtxInternalHdr(right, left, top, down, back, front, token), token); + } + + /// + /// Encodes all mipMaps of a cubeMap HDR image to a asynchronously. + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The cancellation token for this operation. Can be default if cancellation is not needed. + /// A of type . + public Task EncodeCubeMapToDdsHdrAsync(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token = default) + { + return Task.Run(() => EncodeCubeMapToDdsInternalHdr(right, left, top, down, back, front, token), token); + } + + #endregion + + #region Sync Api + + /// + /// Encodes all mipmap levels into a ktx or a dds file and writes it to the output stream. + /// + /// The input to encode represented by a . + /// The stream to write the encoded image to. + public void EncodeToStreamHdr(ReadOnlyMemory2D input, Stream outputStream) + { + EncodeToStreamInternalHdr(input, outputStream, default); + } + + /// + /// Encodes all mipmap levels into a Ktx file. + /// + /// The input to encode represented by a . + /// The containing the encoded image. + public KtxFile EncodeToKtxHdr(ReadOnlyMemory2D input) + { + return EncodeToKtxInternalHdr(input, default); + } + + /// + /// Encodes all mipmap levels into a Dds file. + /// + /// The input to encode represented by a . + /// The containing the encoded image. + public DdsFile EncodeToDdsHdr(ReadOnlyMemory2D input) + { + return EncodeToDdsInternalHdr(input, default); + } + + /// + /// Encodes all mipmap levels of a HDR image into a list of byte buffers. This data does not contain any file headers, just the raw encoded pixel data. + /// + /// The input to encode represented by a . + /// An array of byte buffers containing all mipmap levels. + /// To get the width and height of the encoded mip levels, see . + public byte[][] EncodeToRawBytesHdr(ReadOnlyMemory2D input) + { + return EncodeToRawInternalHdr(input, default); + } + + /// + /// Encodes a single mip level of the HDR input image to a byte buffer. This data does not contain any file headers, just the raw encoded pixel data. + /// + /// The input to encode represented by a . + /// The mipmap to encode. + /// The width of the mipmap. + /// The height of the mipmap. + /// A byte buffer containing the encoded data of the requested mip-level. + public byte[] EncodeToRawBytesHdr(ReadOnlyMemory2D input, int mipLevel, out int mipWidth, out int mipHeight) + { + return EncodeToRawInternalHdr(input, mipLevel, out mipWidth, out mipHeight, default); + } + + /// + /// Encodes all mipMaps of a HDR cubeMap image to a stream either in ktx or dds format. + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The stream to write the encoded image to. + public void EncodeCubeMapToStreamHdr(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, Stream outputStream) + { + EncodeCubeMapToStreamInternalHdr(right, left, top, down, back, front, outputStream, default); + } + + /// + /// Encodes all mipMaps of a HDR cubeMap image to a . + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The encoded image as a . + public KtxFile EncodeCubeMapToKtxHdr(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front) + { + return EncodeCubeMapToKtxInternalHdr(right, left, top, down, back, front, default); + } + + /// + /// Encodes all mipMaps of a HDR cubeMap image to a . + /// The format can be set in . + /// Order of faces is +X, -X, +Y, -Y, +Z, -Z. Back maps to positive Z and front to negative Z. + /// + /// The positive X-axis face of the cubeMap + /// The negative X-axis face of the cubeMap + /// The positive Y-axis face of the cubeMap + /// The negative Y-axis face of the cubeMap + /// The positive Z-axis face of the cubeMap + /// The negative Z-axis face of the cubeMap + /// The encoded image as a . + public DdsFile EncodeCubeMapToDdsHdr(ReadOnlyMemory2D right, ReadOnlyMemory2D left, + ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front) + { + return EncodeCubeMapToDdsInternalHdr(right, left, top, down, back, front, default); + } + + /// + /// Encodes a single 4x4 HDR block to raw encoded bytes. Input Span length must be exactly 16. + /// + /// Input 4x4 color block + /// Raw encoded data + public byte[] EncodeBlockHdr(ReadOnlySpan inputBlock) + { + if (inputBlock.Length != 16) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + return EncodeBlockInternalHdr(inputBlock.AsSpan2D(4, 4)); + } + + /// + /// Encodes a single 4x4 HDR block to raw encoded bytes. Input Span width and height must be exactly 4. + /// + /// Input 4x4 color block + /// Raw encoded data + public byte[] EncodeBlockHdr(ReadOnlySpan2D inputBlock) + { + if (inputBlock.Width != 4 || inputBlock.Height != 4) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + return EncodeBlockInternalHdr(inputBlock); + } + + /// + /// Encodes a single 4x4 HDR block and writes the encoded block to a stream. Input Span length must be exactly 16. + /// + /// Input 4x4 color block + /// Output stream where the encoded block will be written to. + public void EncodeBlockHdr(ReadOnlySpan inputBlock, Stream outputStream) + { + if (inputBlock.Length != 16) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + EncodeBlockInternalHdr(inputBlock.AsSpan2D(4, 4), outputStream); + } + + /// + /// Encodes a single 4x4 HDR block and writes the encoded block to a stream. Input Span width and height must be exactly 4. + /// + /// Input 4x4 color block + /// Output stream where the encoded block will be written to. + public void EncodeBlockHdr(ReadOnlySpan2D inputBlock, Stream outputStream) + { + if (inputBlock.Width != 4 || inputBlock.Height != 4) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + EncodeBlockInternalHdr(inputBlock, outputStream); + } + + #endregion + + #endregion + #region MipMap operations + + /// + /// Calculates the number of mipmap levels that will be generated for the given input image. + /// + /// The width of the input image in pixels + /// The height of the input image in pixels + /// The number of mipmap levels that will be generated for the input image. + public int CalculateNumberOfMipLevels(int imagePixelWidth, int imagePixelHeight) + { + return MipMapper.CalculateMipChainLength(imagePixelWidth, imagePixelHeight, + OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1); + } + + /// + /// Calculates the size of a given mipmap level. + /// + /// The width of the input image in pixels + /// The height of the input image in pixels + /// The mipLevel to calculate (0 is original image) + /// The mipmap width calculated + /// The mipmap height calculated + public void CalculateMipMapSize(int imagePixelWidth, int imagePixelHeight, int mipLevel, out int mipWidth, out int mipHeight) + { + MipMapper.CalculateMipLevelSize(imagePixelWidth, imagePixelHeight, mipLevel, out mipWidth, + out mipHeight); + } + + #endregion + + #region Private + + #region HDR + + private void EncodeToStreamInternalHdr(ReadOnlyMemory2D input, Stream outputStream, CancellationToken token) + { + switch (OutputOptions.FileFormat) + { + case OutputFileFormat.Dds: + var dds = EncodeToDdsInternalHdr(input, token); + dds.Write(outputStream); + break; + + case OutputFileFormat.Ktx: + var ktx = EncodeToKtxInternalHdr(input, token); + ktx.Write(outputStream); + break; + } + } + + private KtxFile EncodeToKtxInternalHdr(ReadOnlyMemory2D input, CancellationToken token) + { + KtxFile output; + IBcBlockEncoder compressedEncoder = null; + + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); + + // Setup encoders + if (!OutputOptions.Format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not supported for hdr images: {OutputOptions.Format}"); + } + compressedEncoder = GetFloatBlockEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + output = new KtxFile( + KtxHeader.InitializeCompressed(input.Width, input.Height, + compressedEncoder.GetInternalFormat(), + compressedEncoder.GetBaseInternalFormat())); + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Calculate total blocks + var totalBlocks = mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip], out var blocksWidth, + out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, + context); + + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); + + + output.MipMaps.Add(new KtxMipmap((uint)encoded.Length, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height, 1)); + output.MipMaps[mip].Faces[0] = new KtxMipFace(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); + } + + output.header.NumberOfFaces = 1; + output.header.NumberOfMipmapLevels = (uint)numMipMaps; + + return output; + } + + private DdsFile EncodeToDdsInternalHdr(ReadOnlyMemory2D input, CancellationToken token) + { + DdsFile output; + IBcBlockEncoder compressedEncoder = null; + + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); + + // Setup encoder + if (!OutputOptions.Format.IsHdrFormat()) + { + throw new NotSupportedException($"This Format is not supported for hdr images: {OutputOptions.Format}"); + } + compressedEncoder = GetFloatBlockEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(input.Width, input.Height, + compressedEncoder.GetDxgiFormat(), OutputOptions.DdsPreferDxt10Header); + output = new DdsFile(ddsHeader, dxt10Header); + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Calculate total blocks + var totalBlocks = mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + // Encode mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); + + + if (mip == 0) + { + output.Faces.Add(new DdsFace((uint)input.Width, (uint)input.Height, + (uint)encoded.Length, numMipMaps)); + } + + output.Faces[0].MipMaps[mip] = new DdsMipMap(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); + } + + + output.header.dwMipMapCount = (uint)numMipMaps; + if (numMipMaps > 1) + { + output.header.dwCaps |= HeaderCaps.DdscapsComplex | HeaderCaps.DdscapsMipmap; + } + + return output; + } + + private byte[][] EncodeToRawInternalHdr(ReadOnlyMemory2D input, CancellationToken token) + { + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); + + var output = new byte[numMipMaps][]; + IBcBlockEncoder compressedEncoder = null; + + // Setup encoder + + compressedEncoder = GetFloatBlockEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Calculate total blocks + var totalBlocks = mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + // Encode all mipmap levels + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + context.Progress.SetProcessedBlocks(mipChain.Take(mip + 1).Sum(x => ImageToBlocks.CalculateNumOfBlocks(x.Width, x.Height))); + + output[mip] = encoded; + } + + return output; + } + + private byte[] EncodeToRawInternalHdr(ReadOnlyMemory2D input, int mipLevel, out int mipWidth, out int mipHeight, CancellationToken token) + { + mipLevel = Math.Max(0, mipLevel); + + IBcBlockEncoder compressedEncoder = null; + + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; + var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); + + // Setup encoder + + compressedEncoder = GetFloatBlockEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + // Dispose all mipmap levels + if (mipLevel > numMipMaps - 1) + { + throw new ArgumentException($"{nameof(mipLevel)} cannot be more than number of mipmaps."); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Calculate total blocks + var totalBlocks = mipChain.Sum(m => ImageToBlocks.CalculateNumOfBlocks(m.Width, m.Height)); + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + // Encode mipmap level + byte[] encoded; + + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + mipWidth = mipChain[mipLevel].Width; + mipHeight = mipChain[mipLevel].Height; + + return encoded; + } + + private void EncodeCubeMapToStreamInternalHdr(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, Stream outputStream, CancellationToken token) { - return ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight); + switch (OutputOptions.FileFormat) + { + case OutputFileFormat.Ktx: + var ktx = EncodeCubeMapToKtxInternalHdr(right, left, top, down, back, front, token); + ktx.Write(outputStream); + break; + + case OutputFileFormat.Dds: + var dds = EncodeCubeMapToDdsInternalHdr(right, left, top, down, back, front, token); + dds.Write(outputStream); + break; + } } - /// - /// Gets the number of blocks in an image with the given pixel width and height. - /// - /// The pixel width of the image - /// The pixel height of the image - /// The amount of blocks in the x-axis - /// The amount of blocks in the y-axis - public void GetBlockCount(int pixelWidth, int pixelHeight, out int blocksWidth, out int blocksHeight) + private KtxFile EncodeCubeMapToKtxInternalHdr(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token) { - ImageToBlocks.CalculateNumOfBlocks(pixelWidth, pixelHeight, out blocksWidth, out blocksHeight); + KtxFile output; + IBcBlockEncoder compressedEncoder = null; + + var faces = new[] { right, left, top, down, back, front }; + + var width = right.Width; + var height = right.Height; + + // Setup encoder + compressedEncoder = GetFloatBlockEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + output = new KtxFile( + KtxHeader.InitializeCompressed(width, height, + compressedEncoder.GetInternalFormat(), + compressedEncoder.GetBaseInternalFormat())); + + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; + var mipLength = MipMapper.CalculateMipChainLength(width, height, numMipMaps); + for (uint i = 0; i < mipLength; i++) + { + output.MipMaps.Add(new KtxMipmap(0, 0, 0, (uint)faces.Length)); + } + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Calculate total blocks + var totalBlocks = 0; + foreach (var face in faces) + { + for (var mip = 0; mip < numMipMaps; mip++) + { + MipMapper.CalculateMipLevelSize(width, height, mip, out var mipWidth, out var mipHeight); + totalBlocks += ImageToBlocks.CalculateNumOfBlocks(mipWidth, mipHeight); + } + } + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + // Encode all faces + var processedBlocks = 0; + for (var face = 0; face < faces.Length; face++) + { + var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); + + // Encode all mipmap levels per face + for (var mipLevel = 0; mipLevel < numMipMaps; mipLevel++) + { + byte[] encoded; + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mipLevel], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + processedBlocks += blocks.Length; + context.Progress.SetProcessedBlocks(processedBlocks); + + if (face == 0) + { + output.MipMaps[mipLevel] = new KtxMipmap((uint)encoded.Length, + (uint)mipChain[mipLevel].Width, + (uint)mipChain[mipLevel].Height, (uint)faces.Length); + } + + output.MipMaps[mipLevel].Faces[face] = new KtxMipFace(encoded, + (uint)mipChain[mipLevel].Width, + (uint)mipChain[mipLevel].Height); + } + } + + output.header.NumberOfFaces = (uint)faces.Length; + output.header.NumberOfMipmapLevels = (uint)mipLength; + + return output; } - #endregion + private DdsFile EncodeCubeMapToDdsInternalHdr(ReadOnlyMemory2D right, ReadOnlyMemory2D left, ReadOnlyMemory2D top, ReadOnlyMemory2D down, + ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token) + { + DdsFile output; + IBcBlockEncoder compressedEncoder = null; + + var faces = new[] { right, left, top, down, back, front }; - #region MipMap operations + var width = right.Width; + var height = right.Height; - /// - /// Calculates the number of mipmap levels that will be generated for the given input image. - /// - /// The width of the input image in pixels - /// The height of the input image in pixels - /// The number of mipmap levels that will be generated for the input image. - public int CalculateNumberOfMipLevels(int imagePixelWidth, int imagePixelHeight) + // Setup encoder + compressedEncoder = GetFloatBlockEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); + } + + var (ddsHeader, dxt10Header) = DdsHeader.InitializeCompressed(width, height, + compressedEncoder.GetDxgiFormat(), OutputOptions.DdsPreferDxt10Header); + output = new DdsFile(ddsHeader, dxt10Header); + + if (OutputOptions.DdsBc1WriteAlphaFlag && + OutputOptions.Format == CompressionFormat.Bc1WithAlpha) + { + output.header.ddsPixelFormat.dwFlags |= PixelFormatFlags.DdpfAlphaPixels; + } + + var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; + + var context = new OperationContext + { + CancellationToken = token, + IsParallel = !Debugger.IsAttached && Options.IsParallel, + TaskCount = Options.TaskCount + }; + + // Calculate total blocks + var totalBlocks = 0; + foreach (var face in faces) + { + for (var mip = 0; mip < numMipMaps; mip++) + { + MipMapper.CalculateMipLevelSize(width, height, mip, out var mipWidth, out var mipHeight); + totalBlocks += ImageToBlocks.CalculateNumOfBlocks(mipWidth, mipHeight); + } + } + context.Progress = new OperationProgress(Options.Progress, totalBlocks); + + // EncodeBlock all faces + var processedBlocks = 0; + for (var face = 0; face < faces.Length; face++) + { + var mipChain = MipMapper.GenerateMipChain(faces[face], ref numMipMaps); + + // Encode all mipmap levels per face + for (var mip = 0; mip < numMipMaps; mip++) + { + byte[] encoded; + + var blocks = ImageToBlocks.ImageTo4X4(mipChain[mip], out var blocksWidth, out var blocksHeight); + encoded = compressedEncoder.Encode(blocks, blocksWidth, blocksHeight, OutputOptions.Quality, context); + + processedBlocks += blocks.Length; + context.Progress.SetProcessedBlocks(processedBlocks); + + if (mip == 0) + { + output.Faces.Add(new DdsFace((uint)mipChain[mip].Width, (uint)mipChain[mip].Height, + (uint)encoded.Length, mipChain.Length)); + } + + output.Faces[face].MipMaps[mip] = new DdsMipMap(encoded, + (uint)mipChain[mip].Width, + (uint)mipChain[mip].Height); + } + } + + output.header.dwCaps |= HeaderCaps.DdscapsComplex; + output.header.dwMipMapCount = (uint)numMipMaps; + if (numMipMaps > 1) + { + output.header.dwCaps |= HeaderCaps.DdscapsMipmap; + } + + output.header.dwCaps2 |= HeaderCaps2.Ddscaps2Cubemap | + HeaderCaps2.Ddscaps2CubemapPositivex | + HeaderCaps2.Ddscaps2CubemapNegativex | + HeaderCaps2.Ddscaps2CubemapPositivey | + HeaderCaps2.Ddscaps2CubemapNegativey | + HeaderCaps2.Ddscaps2CubemapPositivez | + HeaderCaps2.Ddscaps2CubemapNegativez; + + return output; + } + + private byte[] EncodeBlockInternalHdr(ReadOnlySpan2D input) { - return MipMapper.CalculateMipChainLength(imagePixelWidth, imagePixelHeight, - OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1); + var compressedEncoder = GetFloatBlockEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported for single block encoding: {OutputOptions.Format}"); + } + + var output = new byte[compressedEncoder.GetBlockSize()]; + + var rawBlock = new RawBlock4X4RgbFloat(); + + var pixels = rawBlock.AsSpan; + + input.GetRowSpan(0).CopyTo(pixels); + input.GetRowSpan(1).CopyTo(pixels.Slice(4)); + input.GetRowSpan(2).CopyTo(pixels.Slice(8)); + input.GetRowSpan(3).CopyTo(pixels.Slice(12)); + + compressedEncoder.EncodeBlock(rawBlock, OutputOptions.Quality, output); + + return output; } - /// - /// Calculates the size of a given mipmap level. - /// - /// The width of the input image in pixels - /// The height of the input image in pixels - /// The mipLevel to calculate (0 is original image) - /// The mipmap width calculated - /// The mipmap height calculated - public void CalculateMipMapSize(int imagePixelWidth, int imagePixelHeight, int mipLevel, out int mipWidth, out int mipHeight) + private void EncodeBlockInternalHdr(ReadOnlySpan2D input, Stream outputStream) { - MipMapper.CalculateMipLevelSize(imagePixelWidth, imagePixelHeight, mipLevel, out mipWidth, - out mipHeight); + var compressedEncoder = GetFloatBlockEncoder(OutputOptions.Format); + if (compressedEncoder == null) + { + throw new NotSupportedException($"This Format is not supported for single block encoding: {OutputOptions.Format}"); + } + if (input.Width != 4 || input.Height != 4) + { + throw new ArgumentException($"Single block encoding can only encode blocks of 4x4"); + } + + Span output = stackalloc byte[16]; + output = output.Slice(0, compressedEncoder.GetBlockSize()); + + var rawBlock = new RawBlock4X4RgbFloat(); + + var pixels = rawBlock.AsSpan; + + input.GetRowSpan(0).CopyTo(pixels); + input.GetRowSpan(1).CopyTo(pixels.Slice(4)); + input.GetRowSpan(2).CopyTo(pixels.Slice(8)); + input.GetRowSpan(3).CopyTo(pixels.Slice(12)); + + compressedEncoder.EncodeBlock(rawBlock, OutputOptions.Quality, output); + + outputStream.Write(output); } #endregion - #region Private - + #region LDR private void EncodeToStreamInternal(ReadOnlyMemory2D input, Stream outputStream, CancellationToken token) { switch (OutputOptions.FileFormat) @@ -689,7 +1485,7 @@ private void EncodeToStreamInternal(ReadOnlyMemory2D input, Stream private KtxFile EncodeToKtxInternal(ReadOnlyMemory2D input, CancellationToken token) { KtxFile output; - IBcBlockEncoder compressedEncoder = null; + IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; @@ -699,7 +1495,7 @@ private KtxFile EncodeToKtxInternal(ReadOnlyMemory2D input, Cancell var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.Format); + compressedEncoder = GetRgba32BlockEncoder(OutputOptions.Format); if (compressedEncoder == null) { throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); @@ -775,7 +1571,7 @@ private KtxFile EncodeToKtxInternal(ReadOnlyMemory2D input, Cancell private DdsFile EncodeToDdsInternal(ReadOnlyMemory2D input, CancellationToken token) { DdsFile output; - IBcBlockEncoder compressedEncoder = null; + IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; @@ -785,7 +1581,7 @@ private DdsFile EncodeToDdsInternal(ReadOnlyMemory2D input, Cancell var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.Format); + compressedEncoder = GetRgba32BlockEncoder(OutputOptions.Format); if (compressedEncoder == null) { throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); @@ -870,7 +1666,7 @@ private byte[][] EncodeToRawInternal(ReadOnlyMemory2D input, Cancel var mipChain = MipMapper.GenerateMipChain(input, ref numMipMaps); var output = new byte[numMipMaps][]; - IBcBlockEncoder compressedEncoder = null; + IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; // Setup encoder @@ -878,7 +1674,7 @@ private byte[][] EncodeToRawInternal(ReadOnlyMemory2D input, Cancel if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.Format); + compressedEncoder = GetRgba32BlockEncoder(OutputOptions.Format); if (compressedEncoder == null) { throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); @@ -933,7 +1729,7 @@ private byte[] EncodeToRawInternal(ReadOnlyMemory2D input, int mipL { mipLevel = Math.Max(0, mipLevel); - IBcBlockEncoder compressedEncoder = null; + IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var numMipMaps = OutputOptions.GenerateMipMaps ? OutputOptions.MaxMipMapLevel : 1; @@ -943,7 +1739,7 @@ private byte[] EncodeToRawInternal(ReadOnlyMemory2D input, int mipL var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.Format); + compressedEncoder = GetRgba32BlockEncoder(OutputOptions.Format); if (compressedEncoder == null) { throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); @@ -1015,7 +1811,7 @@ private KtxFile EncodeCubeMapToKtxInternal(ReadOnlyMemory2D right, ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token) { KtxFile output; - IBcBlockEncoder compressedEncoder = null; + IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var faces = new[] { right, left, top, down, back, front }; @@ -1027,7 +1823,7 @@ private KtxFile EncodeCubeMapToKtxInternal(ReadOnlyMemory2D right, var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.Format); + compressedEncoder = GetRgba32BlockEncoder(OutputOptions.Format); if (compressedEncoder == null) { throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); @@ -1131,7 +1927,7 @@ private DdsFile EncodeCubeMapToDdsInternal(ReadOnlyMemory2D right, ReadOnlyMemory2D back, ReadOnlyMemory2D front, CancellationToken token) { DdsFile output; - IBcBlockEncoder compressedEncoder = null; + IBcBlockEncoder compressedEncoder = null; IRawEncoder uncompressedEncoder = null; var faces = new[] { right, left, top, down, back, front }; @@ -1143,7 +1939,7 @@ private DdsFile EncodeCubeMapToDdsInternal(ReadOnlyMemory2D right, var isCompressedFormat = OutputOptions.Format.IsCompressedFormat(); if (isCompressedFormat) { - compressedEncoder = GetEncoder(OutputOptions.Format); + compressedEncoder = GetRgba32BlockEncoder(OutputOptions.Format); if (compressedEncoder == null) { throw new NotSupportedException($"This Format is not supported: {OutputOptions.Format}"); @@ -1252,7 +2048,7 @@ private DdsFile EncodeCubeMapToDdsInternal(ReadOnlyMemory2D right, private byte[] EncodeBlockInternal(ReadOnlySpan2D input) { - var compressedEncoder = GetEncoder(OutputOptions.Format); + var compressedEncoder = GetRgba32BlockEncoder(OutputOptions.Format); if (compressedEncoder == null) { throw new NotSupportedException($"This Format is not supported for single block encoding: {OutputOptions.Format}"); @@ -1276,7 +2072,7 @@ private byte[] EncodeBlockInternal(ReadOnlySpan2D input) private void EncodeBlockInternal(ReadOnlySpan2D input, Stream outputStream) { - var compressedEncoder = GetEncoder(OutputOptions.Format); + var compressedEncoder = GetRgba32BlockEncoder(OutputOptions.Format); if (compressedEncoder == null) { throw new NotSupportedException($"This Format is not supported for single block encoding: {OutputOptions.Format}"); @@ -1305,9 +2101,11 @@ private void EncodeBlockInternal(ReadOnlySpan2D input, Stream outpu #endregion + #endregion + #region Support - private IBcBlockEncoder GetEncoder(CompressionFormat format) + private IBcBlockEncoder GetRgba32BlockEncoder(CompressionFormat format) { switch (format) { @@ -1346,6 +2144,19 @@ private IBcBlockEncoder GetEncoder(CompressionFormat format) } } + private IBcBlockEncoder GetFloatBlockEncoder(CompressionFormat format) + { + switch (format) + { + case CompressionFormat.Bc6S: + return new Bc6Encoder(true); + case CompressionFormat.Bc6U: + return new Bc6Encoder(false); + default: + return null; + } + } + private IRawEncoder GetRawEncoder(CompressionFormat format) { switch (format) diff --git a/BCnEnc.Net/Encoder/Bptc/Bc6Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc6Encoder.cs new file mode 100644 index 0000000..6212760 --- /dev/null +++ b/BCnEnc.Net/Encoder/Bptc/Bc6Encoder.cs @@ -0,0 +1,342 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; + +namespace BCnEncoder.Encoder.Bptc +{ + internal class Bc6Encoder : BaseBcBlockEncoder + { + private readonly bool signed; + + public Bc6Encoder(bool signed) + { + this.signed = signed; + } + + + public override GlInternalFormat GetInternalFormat() + { + return signed ? GlInternalFormat.GlCompressedRgbBptcSignedFloatArb : GlInternalFormat.GlCompressedRgbBptcUnsignedFloatArb; + } + + public override GlFormat GetBaseInternalFormat() + { + return GlFormat.GlRgb; + } + + public override DxgiFormat GetDxgiFormat() + { + return signed ? DxgiFormat.DxgiFormatBc6HSf16 : DxgiFormat.DxgiFormatBc6HUf16; + } + + public override Bc6Block EncodeBlock(RawBlock4X4RgbFloat block, CompressionQuality quality) + { + switch (quality) + { + case CompressionQuality.Fast: + return Bc6EncoderFast.EncodeBlock(block, signed); + case CompressionQuality.Balanced: + return Bc6EncoderBalanced.EncodeBlock(block, signed); + case CompressionQuality.BestQuality: + return Bc6EncoderBestQuality.EncodeBlock(block, signed); + default: + throw new ArgumentOutOfRangeException(nameof(quality), quality, null); + } + } + + internal static ClusterIndices4X4 CreateClusterIndexBlock(RawBlock4X4RgbFloat raw, out int outputNumClusters, + int numClusters = 2) + { + + var indexBlock = new ClusterIndices4X4(); + + var indices = LinearClustering.ClusterPixels(raw.AsSpan, 4, 4, + numClusters, 1, 10, false); + + var output = indexBlock.AsSpan; + for (var i = 0; i < output.Length; i++) + { + output[i] = indices[i]; + } + + var nClusters = indexBlock.NumClusters; + if (nClusters < numClusters) + { + indexBlock = indexBlock.Reduce(out nClusters); + } + + outputNumClusters = nClusters; + return indexBlock; + } + + internal static class Bc6EncoderFast + { + internal static Bc6Block EncodeBlock(RawBlock4X4RgbFloat block, bool signed) + { + RgbBoundingBox.CreateFloat(block.AsSpan, out var min, out var max); + + LeastSquares.OptimizeEndpoints1Sub(block, ref min, ref max); + + return Bc6ModeEncoder.EncodeBlock1Sub(Bc6BlockType.Type3, block, min, max, signed, out _); + } + } + + internal static class Bc6EncoderBalanced + { + + private const float TargetError = 0.001f; + private const int MaxTries = 10; + + private static IEnumerable GenerateCandidates(RawBlock4X4RgbFloat block, bool signed) + { + var candidates = 0; + Bc6EncodingHelpers.GetInitialUnscaledEndpoints(block, out var ep0Sub1, out var ep1Sub1); + + if (!signed) + { + LeastSquares.OptimizeEndpoints1Sub(block, ref ep0Sub1, ref ep1Sub1); + } + + ep0Sub1.ClampToHalf(); + ep1Sub1.ClampToHalf(); + + if (!signed) + { + ep0Sub1.ClampToPositive(); + ep1Sub1.ClampToPositive(); + } + + //Type3 Always ok! + yield return Bc6ModeEncoder.EncodeBlock1Sub(Bc6BlockType.Type3, block, ep0Sub1, ep1Sub1, + signed, out _); + candidates++; + + var type15Block = Bc6ModeEncoder.EncodeBlock1Sub(Bc6BlockType.Type15, block, ep0Sub1, ep1Sub1, + signed, out var badType15); + candidates++; + if (!badType15) + { + yield return type15Block; + } + else + { + var indexBlock = CreateClusterIndexBlock(block, out var numClusters, 2); + var best2SubsetPartitions = BptcEncodingHelpers.Rank2SubsetPartitions(indexBlock, numClusters, true); + + foreach (var subsetPartition in best2SubsetPartitions) + { + Bc6EncodingHelpers.GetInitialUnscaledEndpointsForSubset(block, out var ep0, out var ep1, subsetPartition, 0); + Bc6EncodingHelpers.GetInitialUnscaledEndpointsForSubset(block, out var ep2, out var ep3, subsetPartition, 1); + + if (!signed) + { + LeastSquares.OptimizeEndpoints2Sub(block, ref ep0, ref ep1, subsetPartition, 0); + LeastSquares.OptimizeEndpoints2Sub(block, ref ep2, ref ep3, subsetPartition, 1); + } + + ep0.ClampToHalf(); + ep1.ClampToHalf(); + ep2.ClampToHalf(); + ep3.ClampToHalf(); + + if (!signed) + { + ep0.ClampToPositive(); + ep1.ClampToPositive(); + ep2.ClampToPositive(); + ep3.ClampToPositive(); + } + + { + var type1Block = Bc6ModeEncoder.EncodeBlock2Sub(Bc6BlockType.Type1, block, ep0, ep1, ep2, ep3, + subsetPartition, signed, out var badType1); + candidates++; + + if (!badType1) + { + yield return type1Block; + } + + if (candidates >= MaxTries) + { + yield break; + } + } + + { + var type14Block = Bc6ModeEncoder.EncodeBlock2Sub(Bc6BlockType.Type14, block, ep0, ep1, ep2, ep3, + subsetPartition, signed, out var badType14); + candidates++; + + if (!badType14) + { + yield return type14Block; + } + + if (candidates >= MaxTries) + { + yield break; + } + } + } + } + } + + internal static Bc6Block EncodeBlock(RawBlock4X4RgbFloat block, bool signed) + { + var result = new Bc6Block(); + var bestError = 9999999f; + + foreach (var candidate in GenerateCandidates(block, signed)) + { + var error = block.CalculateError(candidate.Decode(signed)); + + if (error < bestError) + { + result = candidate; + bestError = error; + } + + if (error <= TargetError) + { + break; + } + } + + return result; + } + } + + internal static class Bc6EncoderBestQuality + { + private const float TargetError = 0.0005f; + private const int MaxTries = 500; + + private static IEnumerable GenerateCandidates(RawBlock4X4RgbFloat block, bool signed) + { + var candidates = 0; + Bc6EncodingHelpers.GetInitialUnscaledEndpoints(block, out var ep0Sub1, out var ep1Sub1); + + if (!signed) + { + LeastSquares.OptimizeEndpoints1Sub(block, ref ep0Sub1, ref ep1Sub1); + } + + ep0Sub1.ClampToHalf(); + ep1Sub1.ClampToHalf(); + + if (!signed) + { + ep0Sub1.ClampToPositive(); + ep1Sub1.ClampToPositive(); + } + //Type3 Always ok! + yield return Bc6ModeEncoder.EncodeBlock1Sub(Bc6BlockType.Type3, block, ep0Sub1, ep1Sub1, + signed, out _); + candidates++; + + //Type7 + { + var type7Block = Bc6ModeEncoder.EncodeBlock1Sub(Bc6BlockType.Type7, block, ep0Sub1, ep1Sub1, + signed, out var badType7); + candidates++; + if (!badType7) + { + yield return type7Block; + } + } + //Type11 + { + var type11Block = Bc6ModeEncoder.EncodeBlock1Sub(Bc6BlockType.Type11, block, ep0Sub1, ep1Sub1, + signed, out var badType11); + candidates++; + if (!badType11) + { + yield return type11Block; + } + } + //Type15 + { + var type15Block = Bc6ModeEncoder.EncodeBlock1Sub(Bc6BlockType.Type15, block, ep0Sub1, ep1Sub1, + signed, out var badType15); + candidates++; + if (!badType15) + { + yield return type15Block; + } + } + + var indexBlock = CreateClusterIndexBlock(block, out var numClusters, 2); + var best2SubsetPartitions = BptcEncodingHelpers.Rank2SubsetPartitions(indexBlock, numClusters, true); + + foreach (var subsetPartition in best2SubsetPartitions) + { + Bc6EncodingHelpers.GetInitialUnscaledEndpointsForSubset(block, out var ep0, out var ep1, subsetPartition, 0); + Bc6EncodingHelpers.GetInitialUnscaledEndpointsForSubset(block, out var ep2, out var ep3, subsetPartition, 1); + + if (!signed) + { + LeastSquares.OptimizeEndpoints2Sub(block, ref ep0, ref ep1, subsetPartition, 0); + LeastSquares.OptimizeEndpoints2Sub(block, ref ep2, ref ep3, subsetPartition, 1); + } + + ep0.ClampToHalf(); + ep1.ClampToHalf(); + ep2.ClampToHalf(); + ep3.ClampToHalf(); + + if (!signed) + { + ep0.ClampToPositive(); + ep1.ClampToPositive(); + ep2.ClampToPositive(); + ep3.ClampToPositive(); + } + + foreach (var type in Bc6Block.Subsets2Types) + { + var sub2Block = Bc6ModeEncoder.EncodeBlock2Sub(type, block, ep0, ep1, ep2, ep3, + subsetPartition, signed, out var badTransform); + candidates++; + + if (!badTransform) + { + yield return sub2Block; + } + + if (candidates >= MaxTries) + { + yield break; + } + } + } + } + + internal static Bc6Block EncodeBlock(RawBlock4X4RgbFloat block, bool signed) + { + var result = new Bc6Block(); + float bestError = 9999999; + + foreach (var candidate in GenerateCandidates(block, signed)) + { + var error = block.CalculateError(candidate.Decode(signed)); + + if (error < bestError) + { + result = candidate; + bestError = error; + } + + if (error <= TargetError) + { + break; + } + } + + return result; + } + } + } +} diff --git a/BCnEnc.Net/Encoder/Bptc/Bc6EncodingHelpers.cs b/BCnEnc.Net/Encoder/Bptc/Bc6EncodingHelpers.cs new file mode 100644 index 0000000..a972ca2 --- /dev/null +++ b/BCnEnc.Net/Encoder/Bptc/Bc6EncodingHelpers.cs @@ -0,0 +1,372 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Numerics; +using System.Text; +using BCnEncoder.Shared; + +namespace BCnEncoder.Encoder.Bptc +{ + internal static class Bc6EncodingHelpers + { + + /// + /// Opposite of + /// + internal static int PreQuantize(float value, bool signed) + { + var half = new Half(value); + var bits = (int)Half.GetBits(half); + if (!signed) + { + + return (bits << 6) / 31; + } + else + { + const int signMask = ~0x8000; + + if (half < new Half(0)) + { + var component = -(bits & signMask); + + return -(((-component) << 5) / 31); //-(((-component) * 31) >> 5) + } + + return (bits << 5) / 31; + } + } + + /// + /// Opposite of + /// + internal static int Quantize(int component, int endpointBits, bool signed) + { + if (!signed) + { + if (endpointBits >= 15) + return component; + if (component == 0) + return 0; + if (component == 0xFFFF) + return ((1 << endpointBits) - 1); + else + return ((component << endpointBits) - 0x8000) >> 16; + + } + else + { + if (endpointBits >= 16) + return component; + else + { + if (component == 0) return 0; + if (component > 0) + { + if (component == 0x7FFF) + { + return (1 << (endpointBits - 1)) - 1; + } + + return ((component << (endpointBits - 1)) - 0x4000) >> 15; + } + else + { + if (-component == 0x7FFF) + { + return -((1 << (endpointBits - 1)) - 1); + } + + return -(((-component << (endpointBits - 1)) + 0x4000) >> 15); + } + } + } + + } + + public static (int, int, int) PreQuantizeRawEndpoint(ColorRgbFloat endpoint, bool signed) + { + var r = PreQuantize(endpoint.r, signed); + var g = PreQuantize(endpoint.g, signed); + var b = PreQuantize(endpoint.b, signed); + + return ( + r, + g, + b + ); + } + + public static (int, int, int) FinishQuantizeEndpoint((int, int, int) endpoint, int endpointBits, bool signed) + { + return ( + Quantize(endpoint.Item1, endpointBits, signed), + Quantize(endpoint.Item2, endpointBits, signed), + Quantize(endpoint.Item3, endpointBits, signed) + ); + } + + public static int CreateTranformedEndpoint(int quantizedEp0, + int quantizedEpT, int deltaBits, ref bool badTransform) + { + var delta = quantizedEpT - quantizedEp0; + var max = (1 << (deltaBits - 1)); + + if (delta >= 0 ? delta >= max : -delta > max) // delta overflow + { + badTransform = true; + } + + if (delta >= 0) + { + if (delta >= max) + { + delta = max - 1; + } + } + else if (-delta > max) + { + delta = max; + } + else + { + delta = delta & ((1 << deltaBits) - 1); + } + return delta; + } + + public static (int, int, int) CreateTransformedEndpoint((int, int, int) quantizedEp0, + (int, int, int) quantizedEpT, (int, int, int) deltaBits, ref bool badTransform) + { + return ( + CreateTranformedEndpoint(quantizedEp0.Item1, quantizedEpT.Item1, deltaBits.Item1, ref badTransform), + CreateTranformedEndpoint(quantizedEp0.Item2, quantizedEpT.Item2, deltaBits.Item2, ref badTransform), + CreateTranformedEndpoint(quantizedEp0.Item3, quantizedEpT.Item3, deltaBits.Item3, ref badTransform) + ); + } + + public static void GeneratePalette(Span palette, (int, int, int) unQuantizedEp0, (int, int, int) unQuantizedEp1, int indexPrecision, bool signed) + { + var paletteSize = 1 << indexPrecision; + + for (var i = 0; i < paletteSize; i++) + { + var interpolated = Bc6Block.InterpolateColor(unQuantizedEp0, unQuantizedEp1, i, indexPrecision); + var (r, g, b) = Bc6Block.FinishUnQuantize(interpolated, signed); + palette[i] = new ColorRgbFloat(r, g, b); + } + } + + public static void GeneratePaletteInt(Span<(int, int, int)> palette, (int, int, int) unQuantizedEp0, (int, int, int) unQuantizedEp1, int indexPrecision, bool signed) + { + var paletteSize = 1 << indexPrecision; + + for (var i = 0; i < paletteSize; i++) + { + var interpolated = Bc6Block.InterpolateColor(unQuantizedEp0, unQuantizedEp1, i, indexPrecision); + palette[i] = interpolated; + } + } + + private static int FindClosestColorIndexInt((int, int, int) color, ReadOnlySpan<(int, int, int)> colors, out float bestError) + { + static float CalculateError((int, int, int) c0, (int, int, int) c1) => + Math.Abs(c0.Item1 - c1.Item1) + + Math.Abs(c0.Item2 - c1.Item2) + + Math.Abs(c0.Item3 - c1.Item3); + + bestError = CalculateError(color, colors[0]); + var bestIndex = 0; + for (var i = 1; i < colors.Length; i++) + { + var error = CalculateError(color, colors[i]); + if (error < bestError) + { + bestIndex = i; + bestError = error; + } + if (bestError == 0) + { + break; + } + } + return bestIndex; + } + + private static int FindClosestColorIndex(ColorRgbFloat color, ReadOnlySpan colors, out float bestError) + { + bestError = color.CalcLogDist(colors[0]); + var bestIndex = 0; + for (var i = 1; i < colors.Length; i++) + { + var error = color.CalcLogDist(colors[i]); + if (error < bestError) + { + bestIndex = i; + bestError = error; + } + if (bestError == 0) + { + break; + } + } + return bestIndex; + } + + public static float FindOptimalIndicesInt1Sub(RawBlock4X4RgbFloat block, (int, int, int) unQuantizedEp0, (int, int, int) unQuantizedEp1, + Span indices, bool signed) + { + const int paletteSize = 1 << 4; + Span<(int, int, int)> palette = stackalloc (int, int, int)[paletteSize]; + GeneratePaletteInt(palette, unQuantizedEp0, unQuantizedEp1, 4, signed); + + var pixels = block.AsSpan; + var error = 0f; + for (var i = 0; i < pixels.Length; i++) + { + var intPixel = PreQuantizeRawEndpoint(pixels[i], signed); + indices[i] = (byte)FindClosestColorIndexInt(intPixel, palette, out var e); + error += e; + } + return MathF.Sqrt(error / (3 * 16)); + } + + + public static float FindOptimalIndices1Sub(RawBlock4X4RgbFloat block, (int, int, int) unQuantizedEp0, (int, int, int) unQuantizedEp1, + Span indices, bool signed) + { + const int paletteSize = 1 << 4; + Span palette = stackalloc ColorRgbFloat[paletteSize]; + GeneratePalette(palette, unQuantizedEp0, unQuantizedEp1, 4, signed); + + var pixels = block.AsSpan; + var error = 0f; + for (var i = 0; i < pixels.Length; i++) + { + + indices[i] = (byte)FindClosestColorIndex(pixels[i], palette, out var e); + error += e; + } + return error; + } + + public static float FindOptimalIndicesInt2Sub(RawBlock4X4RgbFloat block, (int, int, int) unQuantizedEp0, (int, int, int) unQuantizedEp1, + Span indices, int partitionSetId, int subsetIndex, bool signed) + { + const int paletteSize = 1 << 3; + Span<(int, int, int)> palette = stackalloc (int, int, int)[paletteSize]; + GeneratePaletteInt(palette, unQuantizedEp0, unQuantizedEp1, 3, signed); + + var pixels = block.AsSpan; + var error = 0f; + for (var i = 0; i < pixels.Length; i++) + { + if (Bc6Block.Subsets2PartitionTable[partitionSetId][i] == subsetIndex) + { + var intPixel = PreQuantizeRawEndpoint(pixels[i], signed); + indices[i] = (byte)FindClosestColorIndexInt(intPixel, palette, out var e); + error += e; + } + } + return error; + } + + public static float FindOptimalIndices2Sub(RawBlock4X4RgbFloat block, (int, int, int) unQuantizedEp0, (int, int, int) unQuantizedEp1, + Span indices, int partitionSetId, int subsetIndex, bool signed) + { + const int paletteSize = 1 << 3; + Span palette = stackalloc ColorRgbFloat[paletteSize]; + GeneratePalette(palette, unQuantizedEp0, unQuantizedEp1, 3, signed); + + var pixels = block.AsSpan; + var error = 0f; + for (var i = 0; i < pixels.Length; i++) + { + if (Bc6Block.Subsets2PartitionTable[partitionSetId][i] == subsetIndex) + { + indices[i] = (byte)FindClosestColorIndex(pixels[i], palette, out var e); + error += e; + } + } + return error; + } + + public static void SwapIndicesIfNecessary1Sub(RawBlock4X4RgbFloat block, ref (int, int, int) unQuantizedEp0, ref (int, int, int) unQuantizedEp1, + Span indices, bool signed) + { + const int msb = 1 << (3); + + if ((indices[0] & msb) == 0) + { + return; + } + + InternalUtils.Swap(ref unQuantizedEp0, ref unQuantizedEp1); + FindOptimalIndicesInt1Sub(block, unQuantizedEp0, unQuantizedEp1, indices, signed); + } + + public static void SwapIndicesIfNecessary2Sub(RawBlock4X4RgbFloat block, ref (int, int, int) unQuantizedEp0, ref (int, int, int) unQuantizedEp1, + Span indices, int partitionSetId, int subsetIndex, bool signed) + { + const int msb = 1 << (2); + + var anchorIndex = subsetIndex == 0 ? 0 : Bc6Block.Subsets2AnchorIndices[partitionSetId]; + + if ((indices[anchorIndex] & msb) == 0) + { + return; + } + + InternalUtils.Swap(ref unQuantizedEp0, ref unQuantizedEp1); + FindOptimalIndicesInt2Sub(block, unQuantizedEp0, unQuantizedEp1, indices, partitionSetId, subsetIndex, signed); + } + + public static void GetInitialUnscaledEndpointsForSubset(RawBlock4X4RgbFloat block, out ColorRgbFloat ep0, + out ColorRgbFloat ep1, int partitionSetId, int subsetIndex) + { + + var originalPixels = block.AsSpan; + + var count = 0; + for (var i = 0; i < 16; i++) + { + if (Bc6Block.Subsets2PartitionTable[partitionSetId][i] == subsetIndex) + { + count++; + } + } + + Span subsetColors = stackalloc ColorRgbFloat[count]; + var next = 0; + for (var i = 0; i < 16; i++) + { + if (Bc6Block.Subsets2PartitionTable[partitionSetId][i] == subsetIndex) + { + subsetColors[next++] = originalPixels[i]; + } + } + + PcaVectors.Create(subsetColors, out var mean, out var pa); + PcaVectors.GetExtremePoints(subsetColors, mean, pa, out var min, out var max); + + ep0 = new ColorRgbFloat(min); + ep1 = new ColorRgbFloat(max); + } + + public static void GetInitialUnscaledEndpoints(RawBlock4X4RgbFloat block, out ColorRgbFloat ep0, + out ColorRgbFloat ep1) + { + + var originalPixels = block.AsSpan; + + PcaVectors.Create(originalPixels, out var mean, out var pa); + PcaVectors.GetExtremePoints(originalPixels, mean, pa, out var min, out var max); + + ep0 = new ColorRgbFloat(min); + ep1 = new ColorRgbFloat(max); + } + + + } +} diff --git a/BCnEnc.Net/Encoder/Bptc/Bc6ModeEncoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc6ModeEncoder.cs new file mode 100644 index 0000000..987ab1d --- /dev/null +++ b/BCnEnc.Net/Encoder/Bptc/Bc6ModeEncoder.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using BCnEncoder.Shared; + +namespace BCnEncoder.Encoder.Bptc +{ + internal static class Bc6ModeEncoder + { + + public static Bc6Block EncodeBlock1Sub(Bc6BlockType type, RawBlock4X4RgbFloat block, ColorRgbFloat initialEndpoint0, + ColorRgbFloat initialEndpoint1, bool signed, out bool badTransform) + { + var endpointBits = type.EndpointBits(); + var deltaBits = type.DeltaBits(); + var hasTransformedEndpoints = type.HasTransformedEndpoints(); + + var initialPreQuantizedEp0 = Bc6EncodingHelpers.PreQuantizeRawEndpoint(initialEndpoint0, signed); + var initialPreQuantizedEp1 = Bc6EncodingHelpers.PreQuantizeRawEndpoint(initialEndpoint1, signed); + + var initialQuantizedEp0 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(initialPreQuantizedEp0, endpointBits, signed); + var initialQuantizedEp1 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(initialPreQuantizedEp1, endpointBits, signed); + + if (hasTransformedEndpoints) + { + // check for delta overflow before index search + var bTransform = false; + Bc6EncodingHelpers.CreateTransformedEndpoint(initialQuantizedEp0, initialQuantizedEp1, deltaBits, ref bTransform); + if (bTransform) + { + badTransform = true; + return default; + } + } + + var unquantizedEndpoint0 = Bc6Block.UnQuantize(initialQuantizedEp0, endpointBits, signed); + var unquantizedEndpoint1 = Bc6Block.UnQuantize(initialQuantizedEp1, endpointBits, signed); + + Span indices = stackalloc byte[16]; + + Bc6EncodingHelpers.FindOptimalIndicesInt1Sub(block, unquantizedEndpoint0, unquantizedEndpoint1, indices, signed); + + + Bc6EncodingHelpers.SwapIndicesIfNecessary1Sub(block, ref unquantizedEndpoint0, ref unquantizedEndpoint1, indices, signed); + + var quantEp0 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(unquantizedEndpoint0, endpointBits, signed); + var quantEp1 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(unquantizedEndpoint1, endpointBits, signed); + + badTransform = false; + + if (hasTransformedEndpoints) + { + quantEp1 = Bc6EncodingHelpers.CreateTransformedEndpoint(quantEp0, quantEp1, deltaBits, + ref badTransform); + } + + switch (type) + { + case Bc6BlockType.Type3: + return Bc6Block.PackType3(quantEp0, quantEp1, indices); + case Bc6BlockType.Type7: + return Bc6Block.PackType7(quantEp0, quantEp1, indices); + case Bc6BlockType.Type11: + return Bc6Block.PackType11(quantEp0, quantEp1, indices); + case Bc6BlockType.Type15: + return Bc6Block.PackType15(quantEp0, quantEp1, indices); + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + + public static Bc6Block EncodeBlock2Sub(Bc6BlockType type, RawBlock4X4RgbFloat block, ColorRgbFloat initialEndpoint0, + ColorRgbFloat initialEndpoint1, ColorRgbFloat initialEndpoint2, + ColorRgbFloat initialEndpoint3, int partitionSetId, bool signed, out bool badTransform) + { + Debug.Assert(type.HasSubsets(), "Trying to use 2-subset method for 1-subset block type!"); + + var endpointBits = type.EndpointBits(); + var deltaBits = type.DeltaBits(); + var hasTransformedEndpoints = type.HasTransformedEndpoints(); + + var initialPreQuantizedEp0 = Bc6EncodingHelpers.PreQuantizeRawEndpoint(initialEndpoint0, signed); + var initialPreQuantizedEp1 = Bc6EncodingHelpers.PreQuantizeRawEndpoint(initialEndpoint1, signed); + var initialPreQuantizedEp2 = Bc6EncodingHelpers.PreQuantizeRawEndpoint(initialEndpoint2, signed); + var initialPreQuantizedEp3 = Bc6EncodingHelpers.PreQuantizeRawEndpoint(initialEndpoint3, signed); + + var initialQuantizedEp0 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(initialPreQuantizedEp0, endpointBits, signed); + var initialQuantizedEp1 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(initialPreQuantizedEp1, endpointBits, signed); + var initialQuantizedEp2 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(initialPreQuantizedEp2, endpointBits, signed); + var initialQuantizedEp3 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(initialPreQuantizedEp3, endpointBits, signed); + + if (hasTransformedEndpoints) + { + // check for delta overflow before index search + var bTransform = false; + Bc6EncodingHelpers.CreateTransformedEndpoint(initialQuantizedEp0, initialQuantizedEp1, deltaBits, ref bTransform); + Bc6EncodingHelpers.CreateTransformedEndpoint(initialQuantizedEp0, initialQuantizedEp2, deltaBits, ref bTransform); + Bc6EncodingHelpers.CreateTransformedEndpoint(initialQuantizedEp0, initialQuantizedEp3, deltaBits, ref bTransform); + if (bTransform) + { + badTransform = true; + return default; + } + } + + + var unquantizedEndpoint0 = Bc6Block.UnQuantize(initialQuantizedEp0, endpointBits, signed); + var unquantizedEndpoint1 = Bc6Block.UnQuantize(initialQuantizedEp1, endpointBits, signed); + var unquantizedEndpoint2 = Bc6Block.UnQuantize(initialQuantizedEp2, endpointBits, signed); + var unquantizedEndpoint3 = Bc6Block.UnQuantize(initialQuantizedEp3, endpointBits, signed); + + + Span indices = stackalloc byte[16]; + + Bc6EncodingHelpers.FindOptimalIndicesInt2Sub(block, unquantizedEndpoint0, unquantizedEndpoint1, indices, + partitionSetId, 0, signed); + Bc6EncodingHelpers.FindOptimalIndicesInt2Sub(block, unquantizedEndpoint2, unquantizedEndpoint3, indices, + partitionSetId, 1, signed); + + + Bc6EncodingHelpers.SwapIndicesIfNecessary2Sub(block, ref unquantizedEndpoint0, ref unquantizedEndpoint1, indices, + partitionSetId, 0, signed); + Bc6EncodingHelpers.SwapIndicesIfNecessary2Sub(block, ref unquantizedEndpoint2, ref unquantizedEndpoint3, indices, + partitionSetId, 1, signed); + + var quantEp0 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(unquantizedEndpoint0, endpointBits, signed); + var quantEp1 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(unquantizedEndpoint1, endpointBits, signed); + var quantEp2 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(unquantizedEndpoint2, endpointBits, signed); + var quantEp3 = + Bc6EncodingHelpers.FinishQuantizeEndpoint(unquantizedEndpoint3, endpointBits, signed); + + badTransform = false; + + if (hasTransformedEndpoints) + { + quantEp1 = Bc6EncodingHelpers.CreateTransformedEndpoint(quantEp0, quantEp1, deltaBits, ref badTransform); + quantEp2 = Bc6EncodingHelpers.CreateTransformedEndpoint(quantEp0, quantEp2, deltaBits, ref badTransform); + quantEp3 = Bc6EncodingHelpers.CreateTransformedEndpoint(quantEp0, quantEp3, deltaBits, ref badTransform); + } + + switch (type) + { + case Bc6BlockType.Type0: + return Bc6Block.PackType0(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + case Bc6BlockType.Type1: + return Bc6Block.PackType1(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + case Bc6BlockType.Type2: + return Bc6Block.PackType2(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + case Bc6BlockType.Type6: + return Bc6Block.PackType6(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + case Bc6BlockType.Type10: + return Bc6Block.PackType10(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + case Bc6BlockType.Type14: + return Bc6Block.PackType14(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + case Bc6BlockType.Type18: + return Bc6Block.PackType18(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + case Bc6BlockType.Type22: + return Bc6Block.PackType22(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + case Bc6BlockType.Type26: + return Bc6Block.PackType26(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + case Bc6BlockType.Type30: + return Bc6Block.PackType30(quantEp0, quantEp1, quantEp2, quantEp3, partitionSetId, + indices); + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + } +} diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc7Encoder.cs similarity index 91% rename from BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7Encoder.cs index 7621f2f..2a7f280 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Encoder.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7Encoder.cs @@ -3,9 +3,9 @@ using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { - internal class Bc7Encoder : BaseBcBlockEncoder + internal class Bc7Encoder : BaseBcBlockEncoder { public override Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock, CompressionQuality quality) @@ -100,8 +100,8 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) indexBlock2 = indexBlock3; } - var best2SubsetPartitions = Bc7EncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); - var best3SubsetPartitions = Bc7EncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); + var best2SubsetPartitions = BptcEncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); + var best3SubsetPartitions = BptcEncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); float bestError = 99999; var best = new Bc7Block(); @@ -173,8 +173,8 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) indexBlock2 = indexBlock3; } - var best2SubsetPartitions = Bc7EncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); - var best3SubsetPartitions = Bc7EncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); + var best2SubsetPartitions = BptcEncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); + var best3SubsetPartitions = BptcEncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); float bestError = 99999; var best = new Bc7Block(); @@ -248,8 +248,8 @@ public static Bc7Block EncodeBlock(RawBlock4X4Rgba32 rawBlock) indexBlock2 = indexBlock3; } - var best2SubsetPartitions = Bc7EncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); - var best3SubsetPartitions = Bc7EncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); + var best2SubsetPartitions = BptcEncodingHelpers.Rank2SubsetPartitions(indexBlock2, clusters2); + var best3SubsetPartitions = BptcEncodingHelpers.Rank3SubsetPartitions(indexBlock3, clusters3); float bestError = 99999; diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs b/BCnEnc.Net/Encoder/Bptc/Bc7EncodingHelpers.cs similarity index 64% rename from BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7EncodingHelpers.cs index 0ff3e02..5b39c06 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7EncodingHelpers.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7EncodingHelpers.cs @@ -3,108 +3,22 @@ using System.Runtime.InteropServices; using BCnEncoder.Shared; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { - internal struct ClusterIndices4X4 - { - public int i00, i10, i20, i30; - public int i01, i11, i21, i31; - public int i02, i12, i22, i32; - public int i03, i13, i23, i33; - - public Span AsSpan => MemoryMarshal.CreateSpan(ref i00, 16); - - public int this[int x, int y] - { - get => AsSpan[x + y * 4]; - set => AsSpan[x + y * 4] = value; - } - - public int this[int index] - { - get => AsSpan[index]; - set => AsSpan[index] = value; - } - - public int NumClusters - { - get - { - var t = AsSpan; - Span clusters = stackalloc int[16]; - var distinct = 0; - for (var i = 0; i < 16; i++) - { - var cluster = t[i]; - var found = false; - for (var j = 0; j < distinct; j++) - { - if (clusters[j] == cluster) - { - found = true; - break; - } - } - if (!found) - { - clusters[distinct] = cluster; - ++distinct; - } - } - return distinct; - } - } - - /// - /// Reduces block down to adjacent cluster indices. For example, - /// block that contains clusters 5, 16 and 77 will become a block that contains clusters 0, 1 and 2 - /// - public ClusterIndices4X4 Reduce(out int numClusters) - { - var result = new ClusterIndices4X4(); - numClusters = NumClusters; - Span mapKey = stackalloc int[numClusters]; - var indices = AsSpan; - var outIndices = result.AsSpan; - var next = 0; - for (var i = 0; i < 16; i++) - { - var cluster = indices[i]; - var found = false; - for (var j = 0; j < next; j++) - { - if (mapKey[j] == cluster) - { - found = true; - outIndices[i] = j; - break; - } - } - if (!found) - { - outIndices[i] = next; - mapKey[next] = cluster; - ++next; - } - } - - return result; - } - } internal static class Bc7EncodingHelpers { - private static int[] varPatternRAlpha = new int[] { 1, -1, 1, 0, 0, -1, 0, 0, 0, 0 }; - private static int[] varPatternRNoAlpha = new int[] { 1, -1, 1, 0, 0, -1, 0, 0 }; + private static readonly int[] varPatternRAlpha = new int[] { 1, -1, 1, 0, 0, -1, 0, 0, 0, 0 }; + private static readonly int[] varPatternRNoAlpha = new int[] { 1, -1, 1, 0, 0, -1, 0, 0 }; - private static int[] varPatternGAlpha = new int[] { 1, -1, 0, 1, 0, 0, -1, 0, 0, 0 }; - private static int[] varPatternGNoAlpha = new int[] { 1, -1, 0, 1, 0, 0, -1, 0 }; + private static readonly int[] varPatternGAlpha = new int[] { 1, -1, 0, 1, 0, 0, -1, 0, 0, 0 }; + private static readonly int[] varPatternGNoAlpha = new int[] { 1, -1, 0, 1, 0, 0, -1, 0 }; - private static int[] varPatternBAlpha = new int[] { 1, -1, 0, 0, 1, 0, 0, -1, 0, 0 }; - private static int[] varPatternBNoAlpha = new int[] { 1, -1, 0, 0, 1, 0, 0, -1 }; + private static readonly int[] varPatternBAlpha = new int[] { 1, -1, 0, 0, 1, 0, 0, -1, 0, 0 }; + private static readonly int[] varPatternBNoAlpha = new int[] { 1, -1, 0, 0, 1, 0, 0, -1 }; - private static int[] varPatternAAlpha = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 }; - private static int[] varPatternANoAlpha = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 }; + private static readonly int[] varPatternAAlpha = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 }; + private static readonly int[] varPatternANoAlpha = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 }; public static bool TypeHasPBits(Bc7BlockType type) => type switch { @@ -291,322 +205,6 @@ public static ColorRgba32 ExpandEndpoint(Bc7BlockType type, ColorRgba32 endpoint return endpoint; } - public static int SelectBest2SubsetPartition(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters, out int bestError) - { - var first = true; - bestError = 999; - var bestPartition = 0; - - - int CalculatePartitionError(int partitionIndex) - { - var error = 0; - ReadOnlySpan partitionTable = Bc7Block.Subsets2PartitionTable[partitionIndex]; - Span subset0 = stackalloc int[numDistinctClusters]; - Span subset1 = stackalloc int[numDistinctClusters]; - var max0Idx = 0; - var max1Idx = 0; - - //Calculate largest cluster index for each subset - for (var i = 0; i < 16; i++) - { - if (partitionTable[i] == 0) - { - var r = reducedIndicesBlock[i]; - subset0[r]++; - var count = subset0[r]; - if (count > subset0[max0Idx]) - { - max0Idx = r; - } - } - else - { - var r = reducedIndicesBlock[i]; - subset1[r]++; - var count = subset1[r]; - if (count > subset1[max1Idx]) - { - max1Idx = r; - } - } - } - - // Calculate error by counting as error everything that does not match the largest cluster - for (var i = 0; i < 16; i++) - { - if (partitionTable[i] == 0) - { - if (reducedIndicesBlock[i] != max0Idx) error++; - } - else - { - if (reducedIndicesBlock[i] != max1Idx) error++; - } - } - - return error; - } - - for (var i = 0; i < 64; i++) // Loop through all possible indices - { - var error = CalculatePartitionError(i); - if (first) - { - bestError = error; - bestPartition = i; - first = false; - } - else if (error < bestError) - { - bestError = error; - bestPartition = i; - } - // Break early if exact match - if (bestError == 0) - { - break; - } - } - - return bestPartition; - } - - public static int[] Rank2SubsetPartitions(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters) - { - var output = Enumerable.Range(0, 64).ToArray(); - - - int CalculatePartitionError(int partitionIndex) - { - var error = 0; - ReadOnlySpan partitionTable = Bc7Block.Subsets2PartitionTable[partitionIndex]; - Span subset0 = stackalloc int[numDistinctClusters]; - Span subset1 = stackalloc int[numDistinctClusters]; - var max0Idx = 0; - var max1Idx = 0; - - //Calculate largest cluster index for each subset - for (var i = 0; i < 16; i++) - { - if (partitionTable[i] == 0) - { - var r = reducedIndicesBlock[i]; - subset0[r]++; - var count = subset0[r]; - if (count > subset0[max0Idx]) - { - max0Idx = r; - } - } - else - { - var r = reducedIndicesBlock[i]; - subset1[r]++; - var count = subset1[r]; - if (count > subset1[max1Idx]) - { - max1Idx = r; - } - } - } - - // Calculate error by counting as error everything that does not match the largest cluster - for (var i = 0; i < 16; i++) - { - if (partitionTable[i] == 0) - { - if (reducedIndicesBlock[i] != max0Idx) error++; - } - else - { - if (reducedIndicesBlock[i] != max1Idx) error++; - } - } - - return error; - } - - output = output.OrderBy(CalculatePartitionError).ToArray(); - - return output; - } - - public static int SelectBest3SubsetPartition(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters, out int bestError) - { - var first = true; - bestError = 999; - var bestPartition = 0; - - - - int CalculatePartitionError(int partitionIndex) - { - var error = 0; - ReadOnlySpan partitionTable = Bc7Block.Subsets3PartitionTable[partitionIndex]; - - Span subset0 = stackalloc int[numDistinctClusters]; - Span subset1 = stackalloc int[numDistinctClusters]; - Span subset2 = stackalloc int[numDistinctClusters]; - var max0Idx = 0; - var max1Idx = 0; - var max2Idx = 0; - - //Calculate largest cluster index for each subset - for (var i = 0; i < 16; i++) - { - if (partitionTable[i] == 0) - { - var r = reducedIndicesBlock[i]; - subset0[r]++; - var count = subset0[r]; - if (count > subset0[max0Idx]) - { - max0Idx = r; - } - } - else if (partitionTable[i] == 1) - { - var r = reducedIndicesBlock[i]; - subset1[r]++; - var count = subset1[r]; - if (count > subset1[max1Idx]) - { - max1Idx = r; - } - } - else - { - var r = reducedIndicesBlock[i]; - subset2[r]++; - var count = subset2[r]; - if (count > subset2[max2Idx]) - { - max2Idx = r; - } - } - } - - // Calculate error by counting as error everything that does not match the largest cluster - for (var i = 0; i < 16; i++) - { - if (partitionTable[i] == 0) - { - if (reducedIndicesBlock[i] != max0Idx) error++; - } - else if (partitionTable[i] == 1) - { - if (reducedIndicesBlock[i] != max1Idx) error++; - } - else - { - if (reducedIndicesBlock[i] != max2Idx) error++; - } - } - - return error; - } - - for (var i = 0; i < 64; i++) // Loop through all possible indices - { - var error = CalculatePartitionError(i); - if (first) - { - bestError = error; - bestPartition = i; - first = false; - } - else if (error < bestError) - { - bestError = error; - bestPartition = i; - } - // Break early if exact match - if (bestError == 0) - { - break; - } - } - - return bestPartition; - } - - public static int[] Rank3SubsetPartitions(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters) - { - var output = Enumerable.Range(0, 64).ToArray(); - - int CalculatePartitionError(int partitionIndex) - { - var error = 0; - ReadOnlySpan partitionTable = Bc7Block.Subsets3PartitionTable[partitionIndex]; - - Span subset0 = stackalloc int[numDistinctClusters]; - Span subset1 = stackalloc int[numDistinctClusters]; - Span subset2 = stackalloc int[numDistinctClusters]; - var max0Idx = 0; - var max1Idx = 0; - var max2Idx = 0; - - //Calculate largest cluster index for each subset - for (var i = 0; i < 16; i++) - { - if (partitionTable[i] == 0) - { - var r = reducedIndicesBlock[i]; - subset0[r]++; - var count = subset0[r]; - if (count > subset0[max0Idx]) - { - max0Idx = r; - } - } - else if (partitionTable[i] == 1) - { - var r = reducedIndicesBlock[i]; - subset1[r]++; - var count = subset1[r]; - if (count > subset1[max1Idx]) - { - max1Idx = r; - } - } - else - { - var r = reducedIndicesBlock[i]; - subset2[r]++; - var count = subset2[r]; - if (count > subset2[max2Idx]) - { - max2Idx = r; - } - } - } - - // Calculate error by counting as error everything that does not match the largest cluster - for (var i = 0; i < 16; i++) - { - if (partitionTable[i] == 0) - { - if (reducedIndicesBlock[i] != max0Idx) error++; - } - else if (partitionTable[i] == 1) - { - if (reducedIndicesBlock[i] != max1Idx) error++; - } - else - { - if (reducedIndicesBlock[i] != max2Idx) error++; - } - } - - return error; - } - - output = output.OrderBy(CalculatePartitionError).ToArray(); - - return output; - } - public static void GetInitialUnscaledEndpoints(RawBlock4X4Rgba32 block, out ColorRgba32 ep0, out ColorRgba32 ep1) @@ -704,26 +302,11 @@ public static ColorRgba32 InterpolateColor(ColorRgba32 endPointStart, ColorRgba3 int colorIndex, int alphaIndex, int colorBitCount, int alphaBitCount) { - byte InterpolateByte(byte e0, byte e1, int index, int indexPrecision) - { - if (indexPrecision == 0) return e0; - var aWeights2 = Bc7Block.ColorInterpolationWeights2; - var aWeights3 = Bc7Block.ColorInterpolationWeights3; - var aWeights4 = Bc7Block.ColorInterpolationWeights4; - - if(indexPrecision == 2) - return (byte) (((64 - aWeights2[index])* e0 + aWeights2[index]*e1 + 32) >> 6); - else if(indexPrecision == 3) - return (byte) (((64 - aWeights3[index])*e0 + aWeights3[index]*e1 + 32) >> 6); - else // indexprecision == 4 - return (byte) (((64 - aWeights4[index])*e0 + aWeights4[index]*e1 + 32) >> 6); - } - var result = new ColorRgba32( - InterpolateByte(endPointStart.r, endPointEnd.r, colorIndex, colorBitCount), - InterpolateByte(endPointStart.g, endPointEnd.g, colorIndex, colorBitCount), - InterpolateByte(endPointStart.b, endPointEnd.b, colorIndex, colorBitCount), - InterpolateByte(endPointStart.a, endPointEnd.a, alphaIndex, alphaBitCount) + BptcEncodingHelpers.InterpolateByte(endPointStart.r, endPointEnd.r, colorIndex, colorBitCount), + BptcEncodingHelpers.InterpolateByte(endPointStart.g, endPointEnd.g, colorIndex, colorBitCount), + BptcEncodingHelpers.InterpolateByte(endPointStart.b, endPointEnd.b, colorIndex, colorBitCount), + BptcEncodingHelpers.InterpolateByte(endPointStart.a, endPointEnd.a, alphaIndex, alphaBitCount) ); return result; diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode0Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc7Mode0Encoder.cs similarity index 98% rename from BCnEnc.Net/Encoder/Bc7/Bc7Mode0Encoder.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7Mode0Encoder.cs index 12977d5..4b51330 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode0Encoder.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7Mode0Encoder.cs @@ -1,7 +1,7 @@ -using System; +using System; using BCnEncoder.Shared; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { internal static class Bc7Mode0Encoder { diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode1Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc7Mode1Encoder.cs similarity index 97% rename from BCnEnc.Net/Encoder/Bc7/Bc7Mode1Encoder.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7Mode1Encoder.cs index 735a82e..c51c0a0 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode1Encoder.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7Mode1Encoder.cs @@ -1,7 +1,7 @@ -using System; +using System; using BCnEncoder.Shared; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { internal static class Bc7Mode1Encoder { diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode2Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc7Mode2Encoder.cs similarity index 97% rename from BCnEnc.Net/Encoder/Bc7/Bc7Mode2Encoder.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7Mode2Encoder.cs index d6fd5eb..24cfbcf 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode2Encoder.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7Mode2Encoder.cs @@ -1,7 +1,7 @@ -using System; +using System; using BCnEncoder.Shared; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { internal static class Bc7Mode2Encoder { diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode3Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc7Mode3Encoder.cs similarity index 97% rename from BCnEnc.Net/Encoder/Bc7/Bc7Mode3Encoder.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7Mode3Encoder.cs index 49ae4ed..5bbed25 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode3Encoder.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7Mode3Encoder.cs @@ -1,7 +1,7 @@ -using System; +using System; using BCnEncoder.Shared; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { internal static class Bc7Mode3Encoder { diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc7Mode4Encoder.cs similarity index 98% rename from BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7Mode4Encoder.cs index 7505b53..19b8718 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode4Encoder.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7Mode4Encoder.cs @@ -1,7 +1,7 @@ -using System; +using System; using BCnEncoder.Shared; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { internal static class Bc7Mode4Encoder { diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc7Mode5Encoder.cs similarity index 98% rename from BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7Mode5Encoder.cs index 0e93a82..8ee9456 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode5Encoder.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7Mode5Encoder.cs @@ -1,7 +1,7 @@ -using System; +using System; using BCnEncoder.Shared; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { internal static class Bc7Mode5Encoder { diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode6Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc7Mode6Encoder.cs similarity index 97% rename from BCnEnc.Net/Encoder/Bc7/Bc7Mode6Encoder.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7Mode6Encoder.cs index e0d141a..4765482 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode6Encoder.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7Mode6Encoder.cs @@ -1,7 +1,7 @@ -using System; +using System; using BCnEncoder.Shared; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { internal static class Bc7Mode6Encoder { diff --git a/BCnEnc.Net/Encoder/Bc7/Bc7Mode7Encoder.cs b/BCnEnc.Net/Encoder/Bptc/Bc7Mode7Encoder.cs similarity index 98% rename from BCnEnc.Net/Encoder/Bc7/Bc7Mode7Encoder.cs rename to BCnEnc.Net/Encoder/Bptc/Bc7Mode7Encoder.cs index 7dc363c..d3d1e90 100644 --- a/BCnEnc.Net/Encoder/Bc7/Bc7Mode7Encoder.cs +++ b/BCnEnc.Net/Encoder/Bptc/Bc7Mode7Encoder.cs @@ -1,7 +1,7 @@ -using System; +using System; using BCnEncoder.Shared; -namespace BCnEncoder.Encoder.Bc7 +namespace BCnEncoder.Encoder.Bptc { internal static class Bc7Mode7Encoder { diff --git a/BCnEnc.Net/Encoder/Bptc/BptcEncodingHelpers.cs b/BCnEnc.Net/Encoder/Bptc/BptcEncodingHelpers.cs new file mode 100644 index 0000000..3f19504 --- /dev/null +++ b/BCnEnc.Net/Encoder/Bptc/BptcEncodingHelpers.cs @@ -0,0 +1,295 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using BCnEncoder.Shared; + +namespace BCnEncoder.Encoder.Bptc +{ + internal static class BptcEncodingHelpers + { + private static readonly byte[] ColorInterpolationWeights2 = new byte[] { 0, 21, 43, 64 }; + private static readonly byte[] ColorInterpolationWeights3 = new byte[] { 0, 9, 18, 27, 37, 46, 55, 64 }; + private static readonly byte[] ColorInterpolationWeights4 = new byte[] { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 }; + + + public static int InterpolateInt(int e0, int e1, int index, int indexPrecision) + { + if (indexPrecision == 0) return e0; + var aWeights2 = ColorInterpolationWeights2; + var aWeights3 = ColorInterpolationWeights3; + var aWeights4 = ColorInterpolationWeights4; + + if (indexPrecision == 2) + return (((64 - aWeights2[index]) * e0 + aWeights2[index] * e1 + 32) >> 6); + if (indexPrecision == 3) + return ((64 - aWeights3[index]) * e0 + aWeights3[index] * e1 + 32) >> 6; + else // indexprecision == 4 + return ((64 - aWeights4[index]) * e0 + aWeights4[index] * e1 + 32) >> 6; + } + + public static byte InterpolateByte(byte e0, byte e1, int index, int indexPrecision) + { + if (indexPrecision == 0) return e0; + var aWeights2 = ColorInterpolationWeights2; + var aWeights3 = ColorInterpolationWeights3; + var aWeights4 = ColorInterpolationWeights4; + + if (indexPrecision == 2) + return (byte)(((64 - aWeights2[index]) * e0 + aWeights2[index] * e1 + 32) >> 6); + if (indexPrecision == 3) + return (byte)(((64 - aWeights3[index]) * e0 + aWeights3[index] * e1 + 32) >> 6); + else // indexprecision == 4 + return (byte)(((64 - aWeights4[index]) * e0 + aWeights4[index] * e1 + 32) >> 6); + } + + + + public static int[] Rank2SubsetPartitions(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters, bool smallIndex = false) + { + var output = Enumerable.Range(0, smallIndex ? 32 : 64).ToArray(); + + + int CalculatePartitionError(int partitionIndex) + { + var error = 0; + ReadOnlySpan partitionTable = Bc7Block.Subsets2PartitionTable[partitionIndex]; + Span subset0 = stackalloc int[numDistinctClusters]; + Span subset1 = stackalloc int[numDistinctClusters]; + var max0Idx = 0; + var max1Idx = 0; + + //Calculate largest cluster index for each subset + for (var i = 0; i < 16; i++) + { + if (partitionTable[i] == 0) + { + var r = reducedIndicesBlock[i]; + subset0[r]++; + var count = subset0[r]; + if (count > subset0[max0Idx]) + { + max0Idx = r; + } + } + else + { + var r = reducedIndicesBlock[i]; + subset1[r]++; + var count = subset1[r]; + if (count > subset1[max1Idx]) + { + max1Idx = r; + } + } + } + + // Calculate error by counting as error everything that does not match the largest cluster + for (var i = 0; i < 16; i++) + { + if (partitionTable[i] == 0) + { + if (reducedIndicesBlock[i] != max0Idx) error++; + } + else + { + if (reducedIndicesBlock[i] != max1Idx) error++; + } + } + + return error; + } + + output = output.OrderBy(CalculatePartitionError).ToArray(); + + return output; + } + + public static int[] Rank3SubsetPartitions(ClusterIndices4X4 reducedIndicesBlock, int numDistinctClusters) + { + var output = Enumerable.Range(0, 64).ToArray(); + + int CalculatePartitionError(int partitionIndex) + { + var error = 0; + ReadOnlySpan partitionTable = Bc7Block.Subsets3PartitionTable[partitionIndex]; + + Span subset0 = stackalloc int[numDistinctClusters]; + Span subset1 = stackalloc int[numDistinctClusters]; + Span subset2 = stackalloc int[numDistinctClusters]; + var max0Idx = 0; + var max1Idx = 0; + var max2Idx = 0; + + //Calculate largest cluster index for each subset + for (var i = 0; i < 16; i++) + { + if (partitionTable[i] == 0) + { + var r = reducedIndicesBlock[i]; + subset0[r]++; + var count = subset0[r]; + if (count > subset0[max0Idx]) + { + max0Idx = r; + } + } + else if (partitionTable[i] == 1) + { + var r = reducedIndicesBlock[i]; + subset1[r]++; + var count = subset1[r]; + if (count > subset1[max1Idx]) + { + max1Idx = r; + } + } + else + { + var r = reducedIndicesBlock[i]; + subset2[r]++; + var count = subset2[r]; + if (count > subset2[max2Idx]) + { + max2Idx = r; + } + } + } + + // Calculate error by counting as error everything that does not match the largest cluster + for (var i = 0; i < 16; i++) + { + if (partitionTable[i] == 0) + { + if (reducedIndicesBlock[i] != max0Idx) error++; + } + else if (partitionTable[i] == 1) + { + if (reducedIndicesBlock[i] != max1Idx) error++; + } + else + { + if (reducedIndicesBlock[i] != max2Idx) error++; + } + } + + return error; + } + + output = output.OrderBy(CalculatePartitionError).ToArray(); + + return output; + } + } + + internal struct ClusterIndices4X4 + { + public int i00, i10, i20, i30; + public int i01, i11, i21, i31; + public int i02, i12, i22, i32; + public int i03, i13, i23, i33; + + public Span AsSpan => MemoryMarshal.CreateSpan(ref i00, 16); + + public int this[int x, int y] + { + get => AsSpan[x + y * 4]; + set => AsSpan[x + y * 4] = value; + } + + public int this[int index] + { + get => AsSpan[index]; + set => AsSpan[index] = value; + } + + public int NumClusters + { + get + { + var t = AsSpan; + Span clusters = stackalloc int[16]; + var distinct = 0; + for (var i = 0; i < 16; i++) + { + var cluster = t[i]; + var found = false; + for (var j = 0; j < distinct; j++) + { + if (clusters[j] == cluster) + { + found = true; + break; + } + } + if (!found) + { + clusters[distinct] = cluster; + ++distinct; + } + } + return distinct; + } + } + + /// + /// Reduces block down to adjacent cluster indices. For example, + /// block that contains clusters 5, 16 and 77 will become a block that contains clusters 0, 1 and 2 + /// + public ClusterIndices4X4 Reduce(out int numClusters) + { + var result = new ClusterIndices4X4(); + numClusters = NumClusters; + Span mapKey = stackalloc int[numClusters]; + var indices = AsSpan; + var outIndices = result.AsSpan; + var next = 0; + for (var i = 0; i < 16; i++) + { + var cluster = indices[i]; + var found = false; + for (var j = 0; j < next; j++) + { + if (mapKey[j] == cluster) + { + found = true; + outIndices[i] = j; + break; + } + } + if (!found) + { + outIndices[i] = next; + mapKey[next] = cluster; + ++next; + } + } + + return result; + } + } + + + internal struct IndexBlock4x4 + { + public byte i00, i10, i20, i30; + public byte i01, i11, i21, i31; + public byte i02, i12, i22, i32; + public byte i03, i13, i23, i33; + + public Span AsSpan => MemoryMarshal.CreateSpan(ref i00, 16); + + public byte this[int x, int y] + { + get => AsSpan[x + y * 4]; + set => AsSpan[x + y * 4] = value; + } + + public byte this[int index] + { + get => AsSpan[index]; + set => AsSpan[index] = value; + } + } +} diff --git a/BCnEnc.Net/Encoder/ColorVariationGenerator.cs b/BCnEnc.Net/Encoder/ColorVariationGenerator.cs index 5115361..2f179e3 100644 --- a/BCnEnc.Net/Encoder/ColorVariationGenerator.cs +++ b/BCnEnc.Net/Encoder/ColorVariationGenerator.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using BCnEncoder.Shared; namespace BCnEncoder.Encoder @@ -14,7 +14,8 @@ internal static class ColorVariationGenerator private static readonly int[] variatePatternEp1B = new int[] { -1, 0, 0, -1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 1, 0, 0, -1 }; public static int VarPatternCount => variatePatternEp0R.Length; - public static (ColorRgb565, ColorRgb565) Variate565(ColorRgb565 c0, ColorRgb565 c1, int i) { + public static (ColorRgb565, ColorRgb565) Variate565(ColorRgb565 c0, ColorRgb565 c1, int i) + { var idx = i % variatePatternEp0R.Length; var newEp0 = new ColorRgb565(); var newEp1 = new ColorRgb565(); @@ -31,135 +32,21 @@ public static (ColorRgb565, ColorRgb565) Variate565(ColorRgb565 c0, ColorRgb565 } - public static List GenerateVariationsSidewaysMax(int variations, ColorYCbCr min, ColorYCbCr max) - { - var colors = new List(); - colors.Add(min.ToColorRgb565()); - colors.Add(max.ToColorRgb565()); - - for (var i = 0; i < variations; i++) - { - max.y -= 0.05f; - min.y += 0.05f; - - var ma = max.ToColorRgb565(); - var mi = min.ToColorRgb565(); - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - - if (!colors.Contains(mi)) - { - colors.Add(mi); - } - - //variate reds in max - ma.RawR += 1; - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - ma.RawR -= 2; - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - - //variate blues in max - ma.RawR += 1; - ma.RawB += 1; - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - ma.RawB -= 2; - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - - } - - return colors; - } - - public static List GenerateVariationsSidewaysMinMax(int variations, ColorYCbCr min, ColorYCbCr max) + public static ((int, int, int), (int, int, int)) VariateInt((int, int, int) ep0, + (int, int, int) ep1, int i) { - var colors = new List(); - colors.Add(min.ToColorRgb565()); - colors.Add(max.ToColorRgb565()); - - for (var i = 0; i < variations; i++) - { - max.y -= 0.05f; - min.y += 0.05f; - - var ma = max.ToColorRgb565(); - var mi = min.ToColorRgb565(); - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - - if (!colors.Contains(mi)) - { - colors.Add(mi); - } - - //variate reds in max - ma.RawR += 1; - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - ma.RawR -= 2; - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - - //variate blues in max - ma.RawR += 1; - ma.RawB += 1; - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - ma.RawB -= 2; - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - - //variate reds in min - mi.RawR += 1; - if (!colors.Contains(mi)) - { - colors.Add(mi); - } - ma.RawR -= 2; - if (!colors.Contains(ma)) - { - colors.Add(ma); - } - - //variate blues in min - mi.RawR += 1; - mi.RawB += 1; - if (!colors.Contains(mi)) - { - colors.Add(mi); - } - mi.RawB -= 2; - if (!colors.Contains(mi)) - { - colors.Add(mi); - } - - } + var idx = i % variatePatternEp0R.Length; - return colors; + return (( + ep0.Item1 + variatePatternEp0R[idx], + ep0.Item2 + variatePatternEp0G[idx], + ep0.Item3 + variatePatternEp0B[idx] + ), + ( + ep1.Item1 + variatePatternEp1R[idx], + ep1.Item2 + variatePatternEp1G[idx], + ep1.Item3 + variatePatternEp1B[idx] + )); } } } diff --git a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs index f62fa6c..3fd4182 100644 --- a/BCnEnc.Net/Encoder/IBcBlockEncoder.cs +++ b/BCnEnc.Net/Encoder/IBcBlockEncoder.cs @@ -4,10 +4,10 @@ namespace BCnEncoder.Encoder { - internal interface IBcBlockEncoder + internal interface IBcBlockEncoder where T : unmanaged { - byte[] Encode(RawBlock4X4Rgba32[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, OperationContext context); - void EncodeBlock(RawBlock4X4Rgba32 block, CompressionQuality quality, Span output); + byte[] Encode(T[] blocks, int blockWidth, int blockHeight, CompressionQuality quality, OperationContext context); + void EncodeBlock(T block, CompressionQuality quality, Span output); GlInternalFormat GetInternalFormat(); GlFormat GetBaseInternalFormat(); DxgiFormat GetDxgiFormat(); diff --git a/BCnEnc.Net/Encoder/LeastSquares.cs b/BCnEnc.Net/Encoder/LeastSquares.cs new file mode 100644 index 0000000..1c9bf68 --- /dev/null +++ b/BCnEnc.Net/Encoder/LeastSquares.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using System.Text; +using BCnEncoder.Encoder.Bptc; +using BCnEncoder.Shared; + +namespace BCnEncoder.Encoder +{ + /// + /// Least squares optimization from https://github.com/knarkowicz/GPURealTimeBC6H + /// Code is public domain + /// + internal static class LeastSquares + { + + private static int ComputeIndex4(float texelPos, float endPoint0Pos, float endPoint1Pos) + { + var r = (texelPos - endPoint0Pos) / (endPoint1Pos - endPoint0Pos); + return (int)Math.Clamp(r * 15f /*14.93333f + 0.03333f + 0.5f*/, 0.0f, 15.0f); + } + + private static int ComputeIndex3(float texelPos, float endPoint0Pos, float endPoint1Pos) + { + var r = (texelPos - endPoint0Pos) / (endPoint1Pos - endPoint0Pos); + return (int)Math.Clamp(r * 6.98182f + 0.00909f + 0.5f, 0.0f, 7.0f); + } + + private static uint F32ToF16(float f32) + { + return Half.GetBits(new Half(f32)); + } + + private static Vector3 F32ToF16(Vector3 f32) + { + return new Vector3( + F32ToF16(f32.X), + F32ToF16(f32.Y), + F32ToF16(f32.Z) + ); + } + + private static float F16ToF32(uint f16) + { + return Half.ToHalf((ushort)f16); + } + + private static Vector3 F16ToF32(Vector3 f16) + { + return new Vector3( + F16ToF32((uint)f16.X), + F16ToF32((uint)f16.Y), + F16ToF32((uint)f16.Z) + ); + } + + public static void OptimizeEndpoints1Sub(RawBlock4X4RgbFloat block, ref ColorRgbFloat ep0, ref ColorRgbFloat ep1) + { + var ep0v = ep0.ToVector3(); + var ep1v = ep1.ToVector3(); + + var pixels = block.AsSpan; + + var blockDir = ep1v - ep0v; + blockDir = blockDir / (blockDir.X + blockDir.Y + blockDir.Z); + + var endPoint0Pos = (float)F32ToF16(Vector3.Dot(ep0v, blockDir)); + var endPoint1Pos = (float)F32ToF16(Vector3.Dot(ep1v, blockDir)); + + var alphaTexelSum = new Vector3(); + var betaTexelSum = new Vector3(); + var alphaBetaSum = 0.0f; + var alphaSqSum = 0.0f; + var betaSqSum = 0.0f; + + for (var i = 0; i < 16; i++) + { + var texelPos = (float)F32ToF16(Vector3.Dot(pixels[i].ToVector3(), blockDir)); + var texelIndex = ComputeIndex4(texelPos, endPoint0Pos, endPoint1Pos); + + var beta = Math.Clamp(texelIndex / 15.0f, 0f, 1f); + var alpha = 1.0f - beta; + + var texelF16 = F32ToF16(pixels[i].ToVector3()); + alphaTexelSum += alpha * texelF16; + betaTexelSum += beta * texelF16; + + alphaBetaSum += alpha * beta; + + alphaSqSum += alpha * alpha; + betaSqSum += beta * beta; + } + + var det = alphaSqSum * betaSqSum - alphaBetaSum * alphaBetaSum; + + if (MathF.Abs(det) > 0.00001f) + { + var detRcp = 1f / (det); + var ep0f16 = detRcp * (alphaTexelSum * betaSqSum - betaTexelSum * alphaBetaSum); + var ep1f16 = detRcp * (betaTexelSum * alphaSqSum - alphaTexelSum * alphaBetaSum); + ep0f16 = Vector3.Clamp(ep0f16, Vector3.Zero, new Vector3(Half.MaxValue.Value)); + ep1f16 = Vector3.Clamp(ep1f16, Vector3.Zero, new Vector3(Half.MaxValue.Value)); + ep0 = new ColorRgbFloat(F16ToF32(ep0f16)); + ep1 = new ColorRgbFloat(F16ToF32(ep1f16)); + } + } + + public static void OptimizeEndpoints2Sub(RawBlock4X4RgbFloat block, ref ColorRgbFloat ep0, ref ColorRgbFloat ep1, int partitionSetId, int subsetIndex) + { + var ep0v = ep0.ToVector3(); + var ep1v = ep1.ToVector3(); + + var pixels = block.AsSpan; + + var blockDir = ep1v - ep0v; + blockDir = blockDir / (blockDir.X + blockDir.Y + blockDir.Z); + + var endPoint0Pos = (float)F32ToF16(Vector3.Dot(ep0v, blockDir)); + var endPoint1Pos = (float)F32ToF16(Vector3.Dot(ep1v, blockDir)); + + var alphaTexelSum = new Vector3(); + var betaTexelSum = new Vector3(); + var alphaBetaSum = 0.0f; + var alphaSqSum = 0.0f; + var betaSqSum = 0.0f; + + for (var i = 0; i < 16; i++) + { + if (Bc6Block.Subsets2PartitionTable[partitionSetId][i] == subsetIndex) + { + var texelPos = (float)F32ToF16(Vector3.Dot(pixels[i].ToVector3(), blockDir)); + var texelIndex = ComputeIndex3(texelPos, endPoint0Pos, endPoint1Pos); + + var beta = Math.Clamp(texelIndex / 7.0f, 0f, 1f); + var alpha = 1.0f - beta; + + var texelF16 = F32ToF16(pixels[i].ToVector3()); + alphaTexelSum += alpha * texelF16; + betaTexelSum += beta * texelF16; + + alphaBetaSum += alpha * beta; + + alphaSqSum += alpha * alpha; + betaSqSum += beta * beta; + } + } + + var det = alphaSqSum * betaSqSum - alphaBetaSum * alphaBetaSum; + + if (MathF.Abs(det) > 0.00001f) + { + var detRcp = 1f / (det); + var ep0f16 = detRcp * (alphaTexelSum * betaSqSum - betaTexelSum * alphaBetaSum); + var ep1f16 = detRcp * (betaTexelSum * alphaSqSum - alphaTexelSum * alphaBetaSum); + ep0f16 = Vector3.Clamp(ep0f16, Vector3.Zero, new Vector3(Half.MaxValue.Value)); + ep1f16 = Vector3.Clamp(ep1f16, Vector3.Zero, new Vector3(Half.MaxValue.Value)); + ep0 = new ColorRgbFloat(F16ToF32(ep0f16)); + ep1 = new ColorRgbFloat(F16ToF32(ep1f16)); + } + } + } +} diff --git a/BCnEnc.Net/Shared/Bc6Block.cs b/BCnEnc.Net/Shared/Bc6Block.cs new file mode 100644 index 0000000..ab99421 --- /dev/null +++ b/BCnEnc.Net/Shared/Bc6Block.cs @@ -0,0 +1,1405 @@ +using System; +using System.Diagnostics; +using BCnEncoder.Encoder.Bptc; + +namespace BCnEncoder.Shared +{ + + internal enum Bc6BlockType : uint + { + Type0 = 0, // Mode 1 + Type1 = 1, // Mode 2 + Type2 = 2, // Mode 3 + Type6 = 6, // Mode 4 + Type10 = 10, // Mode 5 + Type14 = 14, // Mode 6 + Type18 = 18, // Mode 7 + Type22 = 22, // Mode 8 + Type26 = 26, // Mode 9 + Type30 = 30, // Mode 10 + Type3 = 3, // Mode 11 + Type7 = 7, // Mode 12 + Type11 = 11, // Mode 13 + Type15 = 15, // Mode 14 + Unknown + } + + internal static class Bc6BlockTypeExtensions + { + public static bool HasSubsets(this Bc6BlockType Type) => Type switch + { + Bc6BlockType.Type3 => false, + Bc6BlockType.Type7 => false, + Bc6BlockType.Type11 => false, + Bc6BlockType.Type15 => false, + _ => true + }; + + public static bool HasTransformedEndpoints(this Bc6BlockType Type) => Type switch + { + Bc6BlockType.Type3 => false, + Bc6BlockType.Type30 => false, + _ => true + }; + + public static int EndpointBits(this Bc6BlockType Type) => Type switch + { + Bc6BlockType.Type0 => 10, + Bc6BlockType.Type1 => 7, + Bc6BlockType.Type2 => 11, + Bc6BlockType.Type6 => 11, + Bc6BlockType.Type10 => 11, + Bc6BlockType.Type14 => 9, + Bc6BlockType.Type18 => 8, + Bc6BlockType.Type22 => 8, + Bc6BlockType.Type26 => 8, + Bc6BlockType.Type30 => 6, + Bc6BlockType.Type3 => 10, + Bc6BlockType.Type7 => 11, + Bc6BlockType.Type11 => 12, + Bc6BlockType.Type15 => 16, + _ => 0 + }; + + public static (int, int, int) DeltaBits(this Bc6BlockType Type) => Type switch + { + Bc6BlockType.Type0 => (5, 5, 5), + Bc6BlockType.Type1 => (6, 6, 6), + Bc6BlockType.Type2 => (5, 4, 4), + Bc6BlockType.Type6 => (4, 5, 4), + Bc6BlockType.Type10 => (4, 4, 5), + Bc6BlockType.Type14 => (5, 5, 5), + Bc6BlockType.Type18 => (6, 5, 5), + Bc6BlockType.Type22 => (5, 6, 5), + Bc6BlockType.Type26 => (5, 5, 6), + Bc6BlockType.Type30 => (0, 0, 0), + Bc6BlockType.Type3 => (0, 0, 0), + Bc6BlockType.Type7 => (9, 9, 9), + Bc6BlockType.Type11 => (8, 8, 8), + Bc6BlockType.Type15 => (4, 4, 4), + _ => (0, 0, 0) + }; + } + + internal struct Bc6Block + { + public ulong lowBits; + public ulong highBits; + + public static readonly int[][] Subsets2PartitionTable = new int[32][]{ + new[] {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1}, + new[] {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1}, + new[] {0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1}, + new[] {0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1}, + new[] {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1}, + new[] {0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1}, + new[] {0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1}, + new[] {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1}, + new[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1}, + new[] {0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + new[] {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1}, + new[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1}, + new[] {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + new[] {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, + new[] {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + new[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, + new[] {0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1}, + new[] {0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + new[] {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0}, + new[] {0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0}, + new[] {0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + new[] {0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0}, + new[] {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}, + new[] {0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1}, + new[] {0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0}, + new[] {0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}, + new[] {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0}, + new[] {0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0}, + new[] {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0}, + new[] {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, + new[] {0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0}, + new[] {0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0} + }; + + public static readonly int[] Subsets2AnchorIndices = { + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 2, 8, 2, 2, 8, 8, 15, + 2, 8, 2, 2, 8, 8, 2, 2, + 15, 15, 6, 8, 2, 8, 15, 15, + 2, 8, 2, 2, 2, 15, 15, 6, + 6, 2, 6, 8, 15, 15, 2, 2, + 15, 15, 15, 15, 15, 2, 2, 15 + }; + + public static readonly RawBlock4X4RgbFloat ErrorBlock = new RawBlock4X4RgbFloat(new ColorRgbFloat(1, 0, 1)); + + public static readonly Bc6BlockType[] Subsets1Types = + { + Bc6BlockType.Type3, + Bc6BlockType.Type7, + Bc6BlockType.Type11, + Bc6BlockType.Type15 + }; + + public static readonly Bc6BlockType[] Subsets2Types = + { + Bc6BlockType.Type0 , + Bc6BlockType.Type1 , + Bc6BlockType.Type2 , + Bc6BlockType.Type6 , + Bc6BlockType.Type10, + Bc6BlockType.Type14, + Bc6BlockType.Type18, + Bc6BlockType.Type22, + Bc6BlockType.Type26, + Bc6BlockType.Type30 + }; + + public readonly Bc6BlockType Type + { + get + { + const ulong smallMask = 0b11; + const ulong bigMask = 0b11111; + // Type 0 or 1 + if ((lowBits & smallMask) < 2) + { + return (Bc6BlockType)(lowBits & smallMask); + } + else + { + var typeNum = (lowBits & bigMask); + switch (typeNum) + { + case 2: return Bc6BlockType.Type2; + case 3: return Bc6BlockType.Type3; + case 6: return Bc6BlockType.Type6; + case 7: return Bc6BlockType.Type7; + case 10: return Bc6BlockType.Type10; + case 11: return Bc6BlockType.Type11; + case 14: return Bc6BlockType.Type14; + case 15: return Bc6BlockType.Type15; + case 18: return Bc6BlockType.Type18; + case 22: return Bc6BlockType.Type22; + case 26: return Bc6BlockType.Type26; + case 30: return Bc6BlockType.Type30; + default: return Bc6BlockType.Unknown; + } + } + } + } + + public readonly bool HasSubsets => Type.HasSubsets(); + + public readonly int NumEndpoints => HasSubsets ? 4 : 2; + + public readonly bool HasTransformedEndpoints => Type.HasTransformedEndpoints(); + + public readonly int PartitionSetId => HasSubsets ? ByteHelper.Extract5(highBits, 13) : -1; + + public readonly int EndpointBits => Type.EndpointBits(); + + public readonly (int, int, int) DeltaBits => Type.DeltaBits(); + + public readonly int ColorIndexBitCount => HasSubsets ? 3 : 4; + + internal void StoreEp0((int, int, int) endpoint) + { + var r0 = (ulong)endpoint.Item1; + var g0 = (ulong)endpoint.Item2; + var b0 = (ulong)endpoint.Item3; + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 5, Math.Min(10, EndpointBits), r0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 15, Math.Min(10, EndpointBits), g0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 25, Math.Min(10, EndpointBits), b0); + + switch (Type) + { + case Bc6BlockType.Type2: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, r0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 49, 1, g0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 59, 1, b0 >> 10); + + break; + case Bc6BlockType.Type6: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 39, 1, r0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, g0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 59, 1, b0 >> 10); + + break; + case Bc6BlockType.Type10: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 39, 1, r0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 49, 1, g0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b0 >> 10); + + break; + case Bc6BlockType.Type7: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 44, 1, r0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 54, 1, g0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 64, 1, b0 >> 10); + + break; + case Bc6BlockType.Type11: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 44, 1, r0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 54, 1, g0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 64, 1, b0 >> 10); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 43, 1, r0 >> 11); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 53, 1, g0 >> 11); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 63, 1, b0 >> 11); + + break; + case Bc6BlockType.Type15: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 44, 1, r0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 54, 1, g0 >> 10); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 64, 1, b0 >> 10); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 43, 1, r0 >> 11); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 53, 1, g0 >> 11); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 63, 1, b0 >> 11); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 42, 1, r0 >> 12); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 52, 1, g0 >> 12); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 62, 1, b0 >> 12); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 41, 1, r0 >> 13); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 51, 1, g0 >> 13); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 61, 1, b0 >> 13); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, r0 >> 14); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, g0 >> 14); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b0 >> 14); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 39, 1, r0 >> 15); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 49, 1, g0 >> 15); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 59, 1, b0 >> 15); + + break; + } + } + + internal readonly (int, int, int) ExtractEp0() + { + ulong r0 = 0; + ulong g0 = 0; + ulong b0 = 0; + + r0 = ByteHelper.ExtractFrom128(lowBits, highBits, 5, Math.Min(10, EndpointBits)); + g0 = ByteHelper.ExtractFrom128(lowBits, highBits, 15, Math.Min(10, EndpointBits)); + b0 = ByteHelper.ExtractFrom128(lowBits, highBits, 25, Math.Min(10, EndpointBits)); + + switch (Type) + { + case Bc6BlockType.Type2: + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 10; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 49, 1) << 10; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 59, 1) << 10; + break; + case Bc6BlockType.Type6: + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 39, 1) << 10; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1) << 10; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 59, 1) << 10; + break; + case Bc6BlockType.Type10: + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 39, 1) << 10; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 49, 1) << 10; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 10; + break; + case Bc6BlockType.Type7: + r0 = ByteHelper.ExtractFrom128(lowBits, highBits, 5, 10); + g0 = ByteHelper.ExtractFrom128(lowBits, highBits, 15, 10); + b0 = ByteHelper.ExtractFrom128(lowBits, highBits, 25, 10); + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 44, 1) << 10; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 54, 1) << 10; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 64, 1) << 10; + break; + case Bc6BlockType.Type11: + r0 = ByteHelper.ExtractFrom128(lowBits, highBits, 5, 10); + g0 = ByteHelper.ExtractFrom128(lowBits, highBits, 15, 10); + b0 = ByteHelper.ExtractFrom128(lowBits, highBits, 25, 10); + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 44, 1) << 10; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 54, 1) << 10; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 64, 1) << 10; + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 43, 1) << 11; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 53, 1) << 11; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 63, 1) << 11; + break; + case Bc6BlockType.Type15: + r0 = ByteHelper.ExtractFrom128(lowBits, highBits, 5, 10); + g0 = ByteHelper.ExtractFrom128(lowBits, highBits, 15, 10); + b0 = ByteHelper.ExtractFrom128(lowBits, highBits, 25, 10); + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 44, 1) << 10; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 54, 1) << 10; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 64, 1) << 10; + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 43, 1) << 11; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 53, 1) << 11; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 63, 1) << 11; + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 42, 1) << 12; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 52, 1) << 12; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 62, 1) << 12; + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 41, 1) << 13; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 51, 1) << 13; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 61, 1) << 13; + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 14; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1) << 14; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 14; + + r0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 39, 1) << 15; + g0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 49, 1) << 15; + b0 |= ByteHelper.ExtractFrom128(lowBits, highBits, 59, 1) << 15; + break; + } + + return ((int)r0, (int)g0, (int)b0); + } + + internal void StoreEp1((int, int, int) endpoint) + { + var r1 = (ulong)endpoint.Item1; + var g1 = (ulong)endpoint.Item2; + var b1 = (ulong)endpoint.Item3; + + if (HasTransformedEndpoints) + { + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 35, Math.Min(5, DeltaBits.Item1), r1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 45, Math.Min(5, DeltaBits.Item2), g1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 55, Math.Min(5, DeltaBits.Item3), b1); + + } + + switch (Type) + { + case Bc6BlockType.Type1: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, r1 >> 5); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, g1 >> 5); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b1 >> 5); + + + break; + case Bc6BlockType.Type18: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, r1 >> 5); + + + break; + case Bc6BlockType.Type22: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, g1 >> 5); + + break; + case Bc6BlockType.Type26: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b1 >> 5); + + break; + case Bc6BlockType.Type30: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 35, 6, r1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 45, 6, g1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 55, 6, b1); + + break; + case Bc6BlockType.Type3: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 35, 10, r1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 45, 10, g1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 55, 10, b1); + + break; + case Bc6BlockType.Type7: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 4, r1 >> 5); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 4, g1 >> 5); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 4, b1 >> 5); + + break; + case Bc6BlockType.Type11: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 3, r1 >> 5); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 3, g1 >> 5); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 3, b1 >> 5); + + break; + } + } + + internal readonly (int, int, int) ExtractEp1() + { + ulong r1 = 0; + ulong g1 = 0; + ulong b1 = 0; + + if (HasTransformedEndpoints) + { + r1 = ByteHelper.ExtractFrom128(lowBits, highBits, 35, Math.Min(5, DeltaBits.Item1)); + g1 = ByteHelper.ExtractFrom128(lowBits, highBits, 45, Math.Min(5, DeltaBits.Item2)); + b1 = ByteHelper.ExtractFrom128(lowBits, highBits, 55, Math.Min(5, DeltaBits.Item3)); + } + + switch (Type) + { + case Bc6BlockType.Type1: + r1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 5; + g1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1) << 5; + b1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 5; + + break; + case Bc6BlockType.Type18: + r1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 5; + + break; + case Bc6BlockType.Type22: + g1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1) << 5; + + break; + case Bc6BlockType.Type26: + b1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 5; + + break; + case Bc6BlockType.Type30: + r1 = ByteHelper.ExtractFrom128(lowBits, highBits, 35, 6); + g1 = ByteHelper.ExtractFrom128(lowBits, highBits, 45, 6); + b1 = ByteHelper.ExtractFrom128(lowBits, highBits, 55, 6); + + break; + case Bc6BlockType.Type3: + r1 = ByteHelper.ExtractFrom128(lowBits, highBits, 35, 10); + g1 = ByteHelper.ExtractFrom128(lowBits, highBits, 45, 10); + b1 = ByteHelper.ExtractFrom128(lowBits, highBits, 55, 10); + + break; + case Bc6BlockType.Type7: + r1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 4) << 5; + g1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 50, 4) << 5; + b1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 4) << 5; + + break; + case Bc6BlockType.Type11: + r1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 3) << 5; + g1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 50, 3) << 5; + b1 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 3) << 5; + + break; + } + + return ((int)r1, (int)g1, (int)b1); + } + + internal void StoreEp2((int, int, int) endpoint) + { + var r2 = (ulong) endpoint.Item1; + var g2 = (ulong) endpoint.Item2; + var b2 = (ulong) endpoint.Item3; + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 65, Math.Min(5, DeltaBits.Item1), r2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 41, 4, g2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 61, 4, b2); + + switch (Type) + { + case Bc6BlockType.Type0: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 2, 1, g2 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 3, 1, b2 >> 4); + + break; + case Bc6BlockType.Type1: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 70, 1, r2 >> 5); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 24, 1, g2 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 2, 1, g2 >> 5); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 14, 1, b2 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 22, 1, b2 >> 5); + + break; + case Bc6BlockType.Type6: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 75, 1, g2 >> 4); + + break; + case Bc6BlockType.Type10: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, b2 >> 4); + + break; + case Bc6BlockType.Type14: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 24, 1, g2 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 14, 1, b2 >> 4); + + break; + case Bc6BlockType.Type18: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 70, 1, r2 >> 4); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 24, 1, g2 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 14, 1, b2 >> 4); + + break; + case Bc6BlockType.Type22: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 24, 1, g2 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 23, 1, g2 >> 5); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 14, 1, b2 >> 4); + + break; + case Bc6BlockType.Type26: + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 24, 1, g2 >> 4); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 14, 1, b2 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 23, 1, b2 >> 5); + + break; + case Bc6BlockType.Type30: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 65, 6, r2); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 24, 1, g2 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 21, 1, g2 >> 5); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 14, 1, b2 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 22, 1, b2 >> 5); + + break; + } + } + + internal readonly (int, int, int) ExtractEp2() + { + ulong r2 = 0; + ulong g2 = 0; + ulong b2 = 0; + + r2 = ByteHelper.ExtractFrom128(lowBits, highBits, 65, Math.Min(5, DeltaBits.Item1)); + g2 = ByteHelper.ExtractFrom128(lowBits, highBits, 41, 4); + b2 = ByteHelper.ExtractFrom128(lowBits, highBits, 61, 4); + + switch (Type) + { + case Bc6BlockType.Type0: + + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 2, 1) << 4; + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 3, 1) << 4; + break; + case Bc6BlockType.Type1: + r2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 70, 1) << 5; + + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 24, 1) << 4; + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 2, 1) << 5; + + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 14, 1) << 4; + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 22, 1) << 5; + + break; + case Bc6BlockType.Type6: + + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 75, 1) << 4; + + break; + case Bc6BlockType.Type10: + + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 4; + + break; + case Bc6BlockType.Type14: + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 24, 1) << 4; + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 14, 1) << 4; + + break; + case Bc6BlockType.Type18: + r2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 70, 1) << 5; + + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 24, 1) << 4; + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 14, 1) << 4; + + break; + case Bc6BlockType.Type22: + + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 24, 1) << 4; + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 23, 1) << 5; + + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 14, 1) << 4; + break; + case Bc6BlockType.Type26: + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 24, 1) << 4; + + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 14, 1) << 4; + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 23, 1) << 5; + break; + case Bc6BlockType.Type30: + + r2 = ByteHelper.ExtractFrom128(lowBits, highBits, 65, 6); + + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 24, 1) << 4; + g2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 21, 1) << 5; + + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 14, 1) << 4; + b2 |= ByteHelper.ExtractFrom128(lowBits, highBits, 22, 1) << 5; + + break; + } + + return ((int)r2, (int)g2, (int)b2); + } + + internal void StoreEp3((int, int, int) endpoint) + { + var r3 = (ulong)endpoint.Item1; + var g3 = (ulong)endpoint.Item2; + var b3 = (ulong)endpoint.Item3; + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 71, Math.Min(5, DeltaBits.Item1), r3); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 51, 4, g3); + + switch (Type) + { + case Bc6BlockType.Type0: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, g3 >> 4); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b3 >> 1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 70, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 76, 1, b3 >> 3); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 4, 1, b3 >> 4); + + break; + case Bc6BlockType.Type1: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 76, 1, r3 >> 5); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 3, 2, g3 >> 4); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 12, 2, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 23, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 32, 1, b3 >> 3); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 34, 1, b3 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 33, 1, b3 >> 5); + + break; + case Bc6BlockType.Type2: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b3 >> 1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 70, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 76, 1, b3 >> 3); + + break; + case Bc6BlockType.Type6: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, g3 >> 4); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 69, 1, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b3 >> 1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 70, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 76, 1, b3 >> 3); + + break; + case Bc6BlockType.Type10: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 69, 1, b3 >> 1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 70, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 76, 1, b3 >> 3); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 75, 1, b3 >> 4); + + break; + case Bc6BlockType.Type14: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, g3 >> 4); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b3 >> 1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 70, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 76, 1, b3 >> 3); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 34, 1, b3 >> 4); + + break; + case Bc6BlockType.Type18: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 76, 1, r3 >> 4); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 13, 1, g3 >> 4); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b3 >> 1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 23, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 33, 1, b3 >> 3); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 34, 1, b3 >> 4); + + break; + case Bc6BlockType.Type22: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, g3 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 33, 1, g3 >> 5); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 13, 1, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 60, 1, b3 >> 1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 70, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 76, 1, b3 >> 3); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 34, 1, b3 >> 4); + + break; + case Bc6BlockType.Type26: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 40, 1, g3 >> 4); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 50, 1, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 13, 1, b3 >> 1); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 70, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 76, 1, b3 >> 3); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 34, 1, b3 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 33, 1, b3 >> 5); + + break; + case Bc6BlockType.Type30: + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 71, 6, r3); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 11, 1, g3 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 31, 1, g3 >> 5); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 12, 2, b3 >> 0); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 23, 1, b3 >> 2); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 32, 1, b3 >> 3); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 34, 1, b3 >> 4); + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, 33, 1, b3 >> 5); + + break; + } + } + + internal readonly (int, int, int) ExtractEp3() + { + ulong r3 = 0; + ulong g3 = 0; + ulong b3 = 0; + + r3 = ByteHelper.ExtractFrom128(lowBits, highBits, 71, Math.Min(5, DeltaBits.Item1)); + g3 = ByteHelper.ExtractFrom128(lowBits, highBits, 51, 4); + + switch (Type) + { + case Bc6BlockType.Type0: + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 4; + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 1; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 70, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 76, 1) << 3; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 4, 1) << 4; + break; + case Bc6BlockType.Type1: + r3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 76, 1) << 5; + + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 3, 2) << 4; + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 12, 2); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 23, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 32, 1) << 3; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 34, 1) << 4; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 33, 1) << 5; + + break; + case Bc6BlockType.Type2: + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 1; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 70, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 76, 1) << 3; + + break; + case Bc6BlockType.Type6: + + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 4; + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 69, 1); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 1; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 70, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 76, 1) << 3; + + break; + case Bc6BlockType.Type10: + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 69, 1) << 1; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 70, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 76, 1) << 3; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 75, 1) << 4; + + break; + case Bc6BlockType.Type14: + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 4; + + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 1; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 70, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 76, 1) << 3; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 34, 1) << 4; + + break; + case Bc6BlockType.Type18: + r3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 76, 1) << 5; + + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 13, 1) << 4; + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 1; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 23, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 33, 1) << 3; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 34, 1) << 4; + + break; + case Bc6BlockType.Type22: + + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 4; + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 33, 1) << 5; + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 13, 1); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 60, 1) << 1; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 70, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 76, 1) << 3; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 34, 1) << 4; + + break; + case Bc6BlockType.Type26: + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 40, 1) << 4; + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 50, 1); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 13, 1) << 1; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 70, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 76, 1) << 3; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 34, 1) << 4; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 33, 1) << 5; + + break; + case Bc6BlockType.Type30: + + r3 = ByteHelper.ExtractFrom128(lowBits, highBits, 71, 6); + + + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 11, 1) << 4; + g3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 31, 1) << 5; + + b3 = ByteHelper.ExtractFrom128(lowBits, highBits, 12, 2); + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 23, 1) << 2; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 32, 1) << 3; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 34, 1) << 4; + b3 |= ByteHelper.ExtractFrom128(lowBits, highBits, 33, 1) << 5; + + break; + } + + return ((int)r3, (int)g3, (int)b3); + } + + private readonly (int, int, int)[] ExtractRawEndpoints(bool signedBc6) + { + var outEndpoints = new (int, int, int)[HasSubsets ? 4 : 2]; + var endpointBits = EndpointBits; + + var (r0, g0, b0) = ExtractEp0(); + + // If bc6h is in signed mode, sign extend the base endpoints + if (signedBc6) + { + r0 = IntHelper.SignExtend(r0, endpointBits); + g0 = IntHelper.SignExtend(g0, endpointBits); + b0 = IntHelper.SignExtend(b0, endpointBits); + } + + outEndpoints[0] = (r0, g0, b0); + + var (r1, g1, b1) = ExtractEp1(); + + if (HasTransformedEndpoints) + { + r1 = IntHelper.SignExtend(r1, DeltaBits.Item1); + g1 = IntHelper.SignExtend(g1, DeltaBits.Item2); + b1 = IntHelper.SignExtend(b1, DeltaBits.Item3); + + r1 = (r1 + r0) & ((1 << endpointBits) - 1); + g1 = (g1 + g0) & ((1 << endpointBits) - 1); + b1 = (b1 + b0) & ((1 << endpointBits) - 1); + } + if (signedBc6) + { + r1 = IntHelper.SignExtend(r1, endpointBits); + g1 = IntHelper.SignExtend(g1, endpointBits); + b1 = IntHelper.SignExtend(b1, endpointBits); + } + + outEndpoints[1] = (r1, g1, b1); + + if (HasSubsets) + { + var (r2, g2, b2) = ExtractEp2(); + var (r3, g3, b3) = ExtractEp3(); + + if (HasTransformedEndpoints) + { + r2 = IntHelper.SignExtend(r2, DeltaBits.Item1); + g2 = IntHelper.SignExtend(g2, DeltaBits.Item2); + b2 = IntHelper.SignExtend(b2, DeltaBits.Item3); + + r2 = (r2 + r0) & ((1 << endpointBits) - 1); + g2 = (g2 + g0) & ((1 << endpointBits) - 1); + b2 = (b2 + b0) & ((1 << endpointBits) - 1); + + r3 = IntHelper.SignExtend(r3, DeltaBits.Item1); + g3 = IntHelper.SignExtend(g3, DeltaBits.Item2); + b3 = IntHelper.SignExtend(b3, DeltaBits.Item3); + + r3 = (r3 + r0) & ((1 << endpointBits) - 1); + g3 = (g3 + g0) & ((1 << endpointBits) - 1); + b3 = (b3 + b0) & ((1 << endpointBits) - 1); + } + + if (signedBc6) + { + r2 = IntHelper.SignExtend(r2, endpointBits); + g2 = IntHelper.SignExtend(g2, endpointBits); + b2 = IntHelper.SignExtend(b2, endpointBits); + + r3 = IntHelper.SignExtend(r3, endpointBits); + g3 = IntHelper.SignExtend(g3, endpointBits); + b3 = IntHelper.SignExtend(b3, endpointBits); + } + + outEndpoints[2] = (r2, g2, b2); + outEndpoints[3] = (r3, g3, b3); + } + + return outEndpoints; + } + + internal static int UnQuantize(int component, int endpointBits, bool signedBc6) + { + int unq; + var sign = false; + + if (!signedBc6) + { + if (endpointBits >= 15) + unq = component; + else if (component == 0) + unq = 0; + else if (component == ((1 << endpointBits) - 1)) + unq = 0xFFFF; + else + //unq = ((component << 16) + 0x8000) >> endpointBits; + unq = ((component << 15) + 0x4000) >> (endpointBits - 1); + + } + else + { + if (endpointBits >= 16) + unq = component; + else + { + if (component < 0) + { + sign = true; + component = -component; + } + + if (component == 0) + unq = 0; + else if (component >= ((1 << (endpointBits - 1)) - 1)) + unq = 0x7FFF; + else + unq = ((component << 15) + 0x4000) >> (endpointBits - 1); + + if (sign) + unq = -unq; + } + } + return unq; + } + + internal static (int, int, int) UnQuantize((int, int, int) components, int endpointBits, bool signedBc6) + { + return ( + UnQuantize(components.Item1, endpointBits, signedBc6), + UnQuantize(components.Item2, endpointBits, signedBc6), + UnQuantize(components.Item3, endpointBits, signedBc6) + ); + } + + internal static Half FinishUnQuantize(int component, bool signedBc6) + { + if (!signedBc6) + { + component = (component * 31) >> 6; // scale the magnitude by 31/64 + return Half.ToHalf((ushort)component); + } + else // signed format + { + component = (component < 0) ? -(((-component) * 31) >> 5) : (component * 31) >> 5; // scale the magnitude by 31/32 + var s = 0; + if (component < 0) + { + s = 0x8000; + component = -component; + } + return Half.ToHalf((ushort)(s | component)); + } + } + + internal static (Half, Half, Half) FinishUnQuantize((int, int, int) components, bool signedBc6) + { + return ( + FinishUnQuantize(components.Item1, signedBc6), + FinishUnQuantize(components.Item2, signedBc6), + FinishUnQuantize(components.Item3, signedBc6) + ); + } + + private static int GetPartitionIndex(int numSubsets, int partitionSetId, int i) + { + switch (numSubsets) + { + case 1: + return 0; + case 2: + return Subsets2PartitionTable[partitionSetId][i]; + default: + throw new ArgumentOutOfRangeException(nameof(numSubsets), numSubsets, "Number of subsets can only be 1, 2 or 3"); + } + } + + private static int GetIndexOffset(int numSubsets, int partitionIndex, int bitCount, int index) + { + if (index == 0) return 0; + if (numSubsets == 1) + { + return bitCount * index - 1; + } + if (numSubsets == 2) + { + var anchorIndex = Subsets2AnchorIndices[partitionIndex]; + if (index <= anchorIndex) + { + return bitCount * index - 1; + } + else + { + return bitCount * index - 2; + } + } + throw new ArgumentOutOfRangeException(nameof(numSubsets), numSubsets, "Number of subsets can only be 1, 2 or 3"); + } + + /// + /// Decrements bitCount by one if index is one of the anchor indices. + /// + private static int GetIndexBitCount(int numSubsets, int partitionIndex, int bitCount, int index) + { + if (index == 0) return bitCount - 1; + if (numSubsets == 2) + { + var anchorIndex = Subsets2AnchorIndices[partitionIndex]; + if (index == anchorIndex) + { + return bitCount - 1; + } + } + return bitCount; + } + + private readonly int GetIndexBegin() + { + return HasSubsets ? 82 : 65; + } + + internal readonly int GetColorIndex(int numSubsets, int partitionIndex, int bitCount, int index) + { + var indexOffset = GetIndexOffset(numSubsets, partitionIndex, bitCount, index); + var indexBitCount = GetIndexBitCount(numSubsets, partitionIndex, bitCount, index); + var indexBegin = GetIndexBegin(); + return (int)ByteHelper.ExtractFrom128(lowBits, highBits, indexBegin + indexOffset, indexBitCount); + } + + internal static (int, int, int) InterpolateColor((int, int, int) endPointStart, (int, int, int) endPointEnd, + int colorIndex, int colorBitCount) + { + var result = ( + BptcEncodingHelpers.InterpolateInt(endPointStart.Item1, endPointEnd.Item1, colorIndex, colorBitCount), + BptcEncodingHelpers.InterpolateInt(endPointStart.Item2, endPointEnd.Item2, colorIndex, colorBitCount), + BptcEncodingHelpers.InterpolateInt(endPointStart.Item3, endPointEnd.Item3, colorIndex, colorBitCount) + ); + + return result; + } + + public readonly RawBlock4X4RgbFloat Decode(bool signed) + { + var output = new RawBlock4X4RgbFloat(); + var pixels = output.AsSpan; + + if (Type == Bc6BlockType.Unknown) + { + return ErrorBlock; + } + + var endpoints = ExtractRawEndpoints(signed); + var numSubsets = 1; + var partitionIndex = 0; + + if (HasSubsets) + { + numSubsets = 2; + partitionIndex = PartitionSetId; + } + + for (var i = 0; i < NumEndpoints; i++) + { + endpoints[i] = UnQuantize(endpoints[i], EndpointBits, signed); + } + + for (var i = 0; i < pixels.Length; i++) + { + var subsetIndex = GetPartitionIndex(numSubsets, partitionIndex, i); + + var endPointStart = endpoints[2 * subsetIndex]; + var endPointEnd = endpoints[2 * subsetIndex + 1]; + + var colorIndex = GetColorIndex(numSubsets, partitionIndex, ColorIndexBitCount, i); + + var (r, g, b) = FinishUnQuantize(InterpolateColor(endPointStart, endPointEnd, colorIndex, ColorIndexBitCount), signed); + + pixels[i] = new ColorRgbFloat(r, g, b); + } + + return output; + } + + #region pack methods + + private void StoreIndices(Span indices) + { + Debug.Assert(indices.Length == 16); + var numSubsets = HasSubsets ? 2 : 1; + var partSetId = PartitionSetId; + var colorBitCount = ColorIndexBitCount; + var colorIndexBegin = GetIndexBegin(); + for (var i = 0; i < indices.Length; i++) + { + var partitionIndex = GetPartitionIndex(numSubsets, partSetId, i); + var indexOffset = GetIndexOffset(numSubsets, partitionIndex, colorBitCount, i); + var indexBitCount = GetIndexBitCount(numSubsets, partitionIndex, colorBitCount, i); + + (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, + colorIndexBegin + indexOffset, indexBitCount, indices[i]); + } + } + + private void StorePartitionSetId(int partitionSetId) + { + highBits = ByteHelper.Store5(highBits, 13, (byte) partitionSetId); + } + + public static Bc6Block PackType0((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 0; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType1((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 1; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType2((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 2; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType6((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 6; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType10((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 10; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType14((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 14; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType18((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 18; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType22((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 22; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType26((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 26; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType30((int, int, int) endpoint0, (int, int, int) endpoint1, + (int, int, int) endpoint2, (int, int, int) endpoint3, int partitionSetId, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 30; + block.StorePartitionSetId(partitionSetId); + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreEp2(endpoint2); + block.StoreEp3(endpoint3); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType3((int, int, int) endpoint0, (int, int, int) endpoint1, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 3; + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType7((int, int, int) endpoint0, (int, int, int) endpoint1, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 7; + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType11((int, int, int) endpoint0, (int, int, int) endpoint1, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 11; + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreIndices(indices); + + return block; + } + + public static Bc6Block PackType15((int, int, int) endpoint0, (int, int, int) endpoint1, Span indices) + { + var block = new Bc6Block(); + block.lowBits = 15; + block.StoreEp0(endpoint0); + block.StoreEp1(endpoint1); + block.StoreIndices(indices); + + return block; + } + + #endregion + + + } +} diff --git a/BCnEnc.Net/Shared/Bc7Block.cs b/BCnEnc.Net/Shared/Bc7Block.cs index 0d2e7ba..def6762 100644 --- a/BCnEnc.Net/Shared/Bc7Block.cs +++ b/BCnEnc.Net/Shared/Bc7Block.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.IO; using System.Linq; +using BCnEncoder.Encoder.Bptc; namespace BCnEncoder.Shared { @@ -23,10 +24,6 @@ internal struct Bc7Block public ulong lowBits; public ulong highBits; - public static ReadOnlySpan ColorInterpolationWeights2 => new byte[] { 0, 21, 43, 64 }; - public static ReadOnlySpan ColorInterpolationWeights3 => new byte[] { 0, 9, 18, 27, 37, 46, 55, 64 }; - public static ReadOnlySpan ColorInterpolationWeights4 => new byte[] { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 }; - public static readonly int[][] Subsets2PartitionTable = { new[] {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1}, @@ -195,6 +192,8 @@ internal struct Bc7Block 15, 15, 15, 15, 3, 15, 15, 8 }; + public static readonly RawBlock4X4Rgba32 ErrorBlock = new RawBlock4X4Rgba32(new ColorRgba32(255, 0, 255)); + public Bc7BlockType Type { get @@ -733,26 +732,11 @@ private int GetColorIndex(Bc7BlockType type, int numSubsets, int partitionIndex, private ColorRgba32 InterpolateColor(ColorRgba32 endPointStart, ColorRgba32 endPointEnd, int colorIndex, int alphaIndex, int colorBitCount, int alphaBitCount) { - - byte InterpolateByte(byte e0, byte e1, int index, int indexPrecision) { - if (indexPrecision == 0) return e0; - var aWeights2 = ColorInterpolationWeights2; - var aWeights3 = ColorInterpolationWeights3; - var aWeights4 = ColorInterpolationWeights4; - - if(indexPrecision == 2) - return (byte) (((64 - aWeights2[index])* e0 + aWeights2[index]*e1 + 32) >> 6); - else if(indexPrecision == 3) - return (byte) (((64 - aWeights3[index])*e0 + aWeights3[index]*e1 + 32) >> 6); - else // indexprecision == 4 - return (byte) (((64 - aWeights4[index])*e0 + aWeights4[index]*e1 + 32) >> 6); - } - var result = new ColorRgba32( - InterpolateByte(endPointStart.r, endPointEnd.r, colorIndex, colorBitCount), - InterpolateByte(endPointStart.g, endPointEnd.g, colorIndex, colorBitCount), - InterpolateByte(endPointStart.b, endPointEnd.b, colorIndex, colorBitCount), - InterpolateByte(endPointStart.a, endPointEnd.a, alphaIndex, alphaBitCount) + BptcEncodingHelpers.InterpolateByte(endPointStart.r, endPointEnd.r, colorIndex, colorBitCount), + BptcEncodingHelpers.InterpolateByte(endPointStart.g, endPointEnd.g, colorIndex, colorBitCount), + BptcEncodingHelpers.InterpolateByte(endPointStart.b, endPointEnd.b, colorIndex, colorBitCount), + BptcEncodingHelpers.InterpolateByte(endPointStart.a, endPointEnd.a, alphaIndex, alphaBitCount) ); return result; @@ -784,6 +768,11 @@ public RawBlock4X4Rgba32 Decode() var output = new RawBlock4X4Rgba32(); var type = Type; + if (type == Bc7BlockType.Type8Reserved) + { + return ErrorBlock; + } + ////decode partition data from explicit partition bits //subset_index = 0; var numSubsets = 1; @@ -793,7 +782,6 @@ public RawBlock4X4Rgba32 Decode() { numSubsets = NumSubsets; partitionIndex = PartitionSetId; - //subset_index = get_partition_index(num_subsets, partition_set_id, x, y); } var pixels = output.AsSpan; @@ -1175,7 +1163,6 @@ public void PackType6(byte[][] colorAlphaEndPoints, byte[] pBits, byte[] indices (lowBits, highBits) = ByteHelper.StoreTo128(lowBits, highBits, colorIndexBegin + indexOffset, indexBitCount, indices[i]); - } } diff --git a/BCnEnc.Net/Shared/Colors.cs b/BCnEnc.Net/Shared/Colors.cs index 1ccafdc..565301d 100644 --- a/BCnEnc.Net/Shared/Colors.cs +++ b/BCnEnc.Net/Shared/Colors.cs @@ -180,6 +180,11 @@ internal readonly ColorRgbaFloat ToFloat() { return new ColorRgbaFloat(this); } + + public readonly ColorRgbFloat ToRgbFloat() + { + return new ColorRgbFloat(this); + } } internal struct ColorRgbaFloat : IEquatable @@ -306,6 +311,159 @@ public ColorRgba32 ToRgba32() } } + + public struct ColorRgbFloat : IEquatable + { + public float r, g, b; + + public ColorRgbFloat(float r, float g, float b) + { + this.r = r; + this.g = g; + this.b = b; + } + + public ColorRgbFloat(ColorRgba32 other) + { + this.r = other.r / 255f; + this.g = other.g / 255f; + this.b = other.b / 255f; + } + + public ColorRgbFloat(Vector3 vector) + { + r = vector.X; + g = vector.Y; + b = vector.Z; + } + + public bool Equals(ColorRgbFloat other) + { + return r == other.r && g == other.g && b == other.b; + } + + public override bool Equals(object obj) + { + return obj is ColorRgbFloat other && Equals(other); + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = r.GetHashCode(); + hashCode = (hashCode * 397) ^ g.GetHashCode(); + hashCode = (hashCode * 397) ^ b.GetHashCode(); + return hashCode; + } + } + + public static bool operator ==(ColorRgbFloat left, ColorRgbFloat right) + { + return left.Equals(right); + } + + public static bool operator !=(ColorRgbFloat left, ColorRgbFloat right) + { + return !left.Equals(right); + } + + public static ColorRgbFloat operator +(ColorRgbFloat left, ColorRgbFloat right) + { + return new ColorRgbFloat( + left.r + right.r, + left.g + right.g, + left.b + right.b); + } + + public static ColorRgbFloat operator -(ColorRgbFloat left, ColorRgbFloat right) + { + return new ColorRgbFloat( + left.r - right.r, + left.g - right.g, + left.b - right.b); + } + + public static ColorRgbFloat operator /(ColorRgbFloat left, float right) + { + return new ColorRgbFloat( + left.r / right, + left.g / right, + left.b / right + ); + } + + public static ColorRgbFloat operator *(ColorRgbFloat left, float right) + { + return new ColorRgbFloat( + left.r * right, + left.g * right, + left.b * right + ); + } + + public static ColorRgbFloat operator *(float left, ColorRgbFloat right) + { + return new ColorRgbFloat( + right.r * left, + right.g * left, + right.b * left + ); + } + + public override string ToString() + { + return $"r : {r:0.00} g : {g:0.00} b : {b:0.00}"; + } + + public ColorRgba32 ToRgba32() + { + return new ColorRgba32( + (byte)(ByteHelper.ClampToByte(r * 255)), + (byte)(ByteHelper.ClampToByte(g * 255)), + (byte)(ByteHelper.ClampToByte(b * 255)), + 255 + ); + } + + public Vector3 ToVector3() + { + return new Vector3(r, g, b); + } + + internal float CalcLogDist(ColorRgbFloat other) + { + var dr = Math.Sign(other.r) * MathF.Log(1 + MathF.Abs(other.r)) - Math.Sign(r) * MathF.Log(1 + MathF.Abs(r)); + var dg = Math.Sign(other.g) * MathF.Log(1 + MathF.Abs(other.g)) - Math.Sign(g) * MathF.Log(1 + MathF.Abs(g)); + var db = Math.Sign(other.b) * MathF.Log(1 + MathF.Abs(other.b)) - Math.Sign(b) * MathF.Log(1 + MathF.Abs(b)); + return MathF.Sqrt((dr * dr) + (dg * dg) + (db * db)); + } + + internal float CalcDist(ColorRgbFloat other) + { + var dr = other.r - r; + var dg = other.g - g; + var db = other.b - b; + return MathF.Sqrt((dr * dr) + (dg * dg) + (db * db)); + } + + internal void ClampToPositive() + { + if (r < 0) r = 0; + if (g < 0) g = 0; + if (b < 0) b = 0; + } + + internal void ClampToHalf() + { + if (r < Half.MinValue) r = Half.MinValue; + else if (g > Half.MaxValue) g = Half.MaxValue; + if (b < Half.MinValue) b = Half.MinValue; + else if (r > Half.MaxValue) r = Half.MaxValue; + if (g < Half.MinValue) g = Half.MinValue; + else if (b > Half.MaxValue) b = Half.MaxValue; + } + } internal struct ColorYCbCr { @@ -331,6 +489,28 @@ internal ColorYCbCr(ColorRgb24 rgb) cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; } + internal ColorYCbCr(ColorRgbaFloat rgb) + { + var fr = rgb.r; + var fg = rgb.g; + var fb = rgb.b; + + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; + } + + internal ColorYCbCr(ColorRgbFloat rgb) + { + var fr = rgb.r; + var fg = rgb.g; + var fb = rgb.b; + + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; + } + internal ColorYCbCr(ColorRgb565 rgb) { var fr = (float)rgb.R / 255; @@ -893,6 +1073,18 @@ public ColorYCbCrAlpha(ColorRgba32 rgba) alpha = rgba.a / 255f; } + public ColorYCbCrAlpha(ColorRgbaFloat rgba) + { + var fr = rgba.r; + var fg = rgba.g; + var fb = rgba.b; + + y = 0.2989f * fr + 0.5866f * fg + 0.1145f * fb; + cb = -0.1687f * fr - 0.3313f * fg + 0.5000f * fb; + cr = 0.5000f * fr - 0.4184f * fg - 0.0816f * fb; + alpha = rgba.a; + } + public ColorRgb565 ToColorRgb565() { @@ -959,6 +1151,20 @@ public ColorXyz(ColorRgb24 color) this = ColorToXyz(color); } + public ColorXyz(ColorRgbFloat color) + { + this = ColorToXyz(color); + } + + public ColorRgbFloat ToColorRgbFloat() + { + return new ColorRgbFloat( + 3.2404542f * x - 1.5371385f * y - 0.4985314f * z, + -0.9692660f * x + 1.8760108f * y + 0.0415560f * z, + 0.0556434f * x - 0.2040259f * y + 1.0572252f * z + ); + } + public static ColorXyz ColorToXyz(ColorRgb24 color) { var r = PivotRgb(color.r / 255.0f); @@ -969,6 +1175,16 @@ public static ColorXyz ColorToXyz(ColorRgb24 color) return new ColorXyz(r * 0.4124f + g * 0.3576f + b * 0.1805f, r * 0.2126f + g * 0.7152f + b * 0.0722f, r * 0.0193f + g * 0.1192f + b * 0.9505f); } + public static ColorXyz ColorToXyz(ColorRgbFloat color) + { + var r = PivotRgb(color.r); + var g = PivotRgb(color.g); + var b = PivotRgb(color.b); + + // Observer. = 2°, Illuminant = D65 + return new ColorXyz(r * 0.4124f + g * 0.3576f + b * 0.1805f, r * 0.2126f + g * 0.7152f + b * 0.0722f, r * 0.0193f + g * 0.1192f + b * 0.9505f); + } + private static float PivotRgb(float n) { return (n > 0.04045f ? MathF.Pow((n + 0.055f) / 1.055f, 2.4f) : n / 12.92f) * 100; @@ -998,6 +1214,11 @@ public ColorLab(ColorRgba32 color) this = ColorToLab(new ColorRgb24(color.r, color.g, color.b)); } + public ColorLab(ColorRgbFloat color) + { + this = XyzToLab(new ColorXyz(color)); + } + public static ColorLab ColorToLab(ColorRgb24 color) { var xyz = new ColorXyz(color); @@ -1024,4 +1245,94 @@ private static float PivotXyz(float n) return n > 0.008856f ? i : 7.787f * n + 16 / 116f; } } + + internal struct ColorRgbe : IEquatable + { + public byte r; + public byte g; + public byte b; + public byte e; + + public ColorRgbe(byte r, byte g, byte b, byte e) + { + this.r = r; + this.g = g; + this.b = b; + this.e = e; + } + + public ColorRgbe(ColorRgbFloat color) + { + var max = MathF.Max(color.b, MathF.Max(color.g, color.r)); + if (max <= 1e-32f) + { + r = g = b = e = 0; + } + else + { + MathHelper.FrExp(max, out var exponent); + var scale = MathHelper.LdExp(1f, -exponent + 8); + r = (byte)(scale * color.r); + g = (byte)(scale * color.g); + b = (byte)(scale * color.b); + e = (byte)(exponent + 128); + } + } + + public ColorRgbFloat ToColorRgbFloat(float exposure = 1.0f) + { + if (e == 0) + { + return new ColorRgbFloat(0, 0, 0); + } + else + { + var fexp = MathHelper.LdExp(1f, e - (128 + 8)) / exposure; + + return new ColorRgbFloat( + (r + 0.5f) * fexp, + (g + 0.5f) * fexp, + (b + 0.5f) * fexp + ); + } + } + + + public bool Equals(ColorRgbe other) + { + return r == other.r && g == other.g && b == other.b && e == other.e; + } + + public override bool Equals(object obj) + { + return obj is ColorRgbe other && Equals(other); + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = r.GetHashCode(); + hashCode = (hashCode * 397) ^ g.GetHashCode(); + hashCode = (hashCode * 397) ^ b.GetHashCode(); + hashCode = (hashCode * 397) ^ e.GetHashCode(); + return hashCode; + } + } + + public static bool operator ==(ColorRgbe left, ColorRgbe right) + { + return left.Equals(right); + } + + public static bool operator !=(ColorRgbe left, ColorRgbe right) + { + return !left.Equals(right); + } + + public override string ToString() + { + return $"{nameof(r)}: {r}, {nameof(g)}: {g}, {nameof(b)}: {b}, {nameof(e)}: {e}"; + } + } } diff --git a/BCnEnc.Net/Shared/CompressionFormat.cs b/BCnEnc.Net/Shared/CompressionFormat.cs index 97c50c5..9d7545d 100644 --- a/BCnEnc.Net/Shared/CompressionFormat.cs +++ b/BCnEnc.Net/Shared/CompressionFormat.cs @@ -47,13 +47,17 @@ public enum CompressionFormat /// Bc5, /// - /// BC6H / BPTC float encoding. Can compress HDR textures without alpha. Currently not supported. + /// BC6H / BPTC unsigned float encoding. Can compress HDR textures without alpha. Does not support negative values. /// - Bc6, - /// - /// BC7 / BPTC unorm encoding. Very high Quality rgba or rgb encoding. Also very slow. - /// - Bc7, + Bc6U, + /// + /// BC6H / BPTC signed float encoding. Can compress HDR textures without alpha. Supports negative values. + /// + Bc6S, + /// + /// BC7 / BPTC unorm encoding. Very high Quality rgba or rgb encoding. Also very slow. + /// + Bc7, /// /// ATC / Adreno Texture Compression encoding. Derivative of BC1. /// @@ -65,7 +69,11 @@ public enum CompressionFormat /// /// ATC / Adreno Texture Compression encoding. Derivative of BC3. Good for smooth alpha transitions. /// - AtcInterpolatedAlpha + AtcInterpolatedAlpha, + /// + /// Unknown format + /// + Unknown } public static class CompressionFormatExtensions @@ -85,5 +93,18 @@ public static bool IsCompressedFormat(this CompressionFormat format) return true; } } - } + + public static bool IsHdrFormat(this CompressionFormat format) + { + switch (format) + { + case CompressionFormat.Bc6S: + case CompressionFormat.Bc6U: + return true; + + default: + return false; + } + } + } } diff --git a/BCnEnc.Net/Shared/EncodedBlocks.cs b/BCnEnc.Net/Shared/EncodedBlocks.cs index f645267..e67b205 100644 --- a/BCnEnc.Net/Shared/EncodedBlocks.cs +++ b/BCnEnc.Net/Shared/EncodedBlocks.cs @@ -5,7 +5,7 @@ namespace BCnEncoder.Shared { [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc1Block + internal struct Bc1Block { public ColorRgb565 color0; public ColorRgb565 color1; @@ -65,7 +65,7 @@ stackalloc ColorRgb24[] { } [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc2Block + internal struct Bc2Block { public Bc2AlphaBlock alphaBlock; public ColorRgb565 color0; @@ -114,7 +114,7 @@ public readonly RawBlock4X4Rgba32 Decode() } [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc3Block + internal struct Bc3Block { public Bc4ComponentBlock alphaBlock; public ColorRgb565 color0; @@ -270,7 +270,7 @@ public readonly RawBlock4X4Rgba32 Decode(ColorComponent component1 = ColorCompon } [StructLayout(LayoutKind.Sequential)] - internal unsafe struct AtcBlock + internal struct AtcBlock { public ColorRgb555 color0; public ColorRgb565 color1; @@ -338,7 +338,7 @@ public void SetAlpha(int index, byte alpha) } [StructLayout(LayoutKind.Sequential)] - internal unsafe struct Bc4ComponentBlock + internal struct Bc4ComponentBlock { public ulong componentBlock; diff --git a/BCnEnc.Net/Shared/Half.cs b/BCnEnc.Net/Shared/Half.cs new file mode 100644 index 0000000..d1c0cdd --- /dev/null +++ b/BCnEnc.Net/Shared/Half.cs @@ -0,0 +1,1090 @@ +/// ================ Half.cs ==================== +/// The code is free to use for any reason without any restrictions. +/// Ladislav Lang (2009), Joannes Vermorel (2017) + +using System; +using System.Diagnostics; +using System.Globalization; + +namespace BCnEncoder.Shared +{ + /// + /// Represents a half-precision floating point number. + /// + /// + /// Note: + /// Half is not fast enought and precision is also very bad, + /// so is should not be used for mathematical computation (use Single instead). + /// The main advantage of Half type is lower memory cost: two bytes per number. + /// Half is typically used in graphical applications. + /// + /// Note: + /// All functions, where is used conversion half->float/float->half, + /// are approx. ten times slower than float->double/double->float, i.e. ~3ns on 2GHz CPU. + /// + /// References: + /// - Code retrieved from http://sourceforge.net/p/csharp-half/code/HEAD/tree/ on 2015-12-04 + /// - Fast Half Float Conversions, Jeroen van der Zijp, link: http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + /// - IEEE 754 revision, link: http://grouper.ieee.org/groups/754/ + /// + [Serializable] + public struct Half : IComparable, IFormattable, IConvertible, IComparable, IEquatable + { + /// + /// Internal representation of the half-precision floating-point number. + /// + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + internal ushort Value; + + #region Constants + /// + /// Represents the smallest positive System.Half value greater than zero. This field is constant. + /// + public static readonly Half Epsilon = ToHalf(0x0001); + /// + /// Represents the largest possible value of System.Half. This field is constant. + /// + public static readonly Half MaxValue = ToHalf(0x7bff); + /// + /// Represents the smallest possible value of System.Half. This field is constant. + /// + public static readonly Half MinValue = ToHalf(0xfbff); + /// + /// Represents not a number (NaN). This field is constant. + /// + public static readonly Half NaN = ToHalf(0xfe00); + /// + /// Represents negative infinity. This field is constant. + /// + public static readonly Half NegativeInfinity = ToHalf(0xfc00); + /// + /// Represents positive infinity. This field is constant. + /// + public static readonly Half PositiveInfinity = ToHalf(0x7c00); + #endregion + + #region Constructors + /// + /// Initializes a new instance of System.Half to the value of the specified single-precision floating-point number. + /// + /// The value to represent as a System.Half. + public Half(float value) { this = HalfHelper.SingleToHalf(value); } + /// + /// Initializes a new instance of System.Half to the value of the specified 32-bit signed integer. + /// + /// The value to represent as a System.Half. + public Half(int value) : this((float)value) { } + /// + /// Initializes a new instance of System.Half to the value of the specified 64-bit signed integer. + /// + /// The value to represent as a System.Half. + public Half(long value) : this((float)value) { } + /// + /// Initializes a new instance of System.Half to the value of the specified double-precision floating-point number. + /// + /// The value to represent as a System.Half. + public Half(double value) : this((float)value) { } + /// + /// Initializes a new instance of System.Half to the value of the specified decimal number. + /// + /// The value to represent as a System.Half. + public Half(decimal value) : this((float)value) { } + /// + /// Initializes a new instance of System.Half to the value of the specified 32-bit unsigned integer. + /// + /// The value to represent as a System.Half. + public Half(uint value) : this((float)value) { } + /// + /// Initializes a new instance of System.Half to the value of the specified 64-bit unsigned integer. + /// + /// The value to represent as a System.Half. + public Half(ulong value) : this((float)value) { } + #endregion + + #region Numeric operators + + /// + /// Returns the result of multiplying the specified System.Half value by negative one. + /// + /// A System.Half. + /// A System.Half with the value of half, but the opposite sign. -or- Zero, if half is zero. + public static Half Negate(Half half) { return -half; } + /// + /// Adds two specified System.Half values. + /// + /// A System.Half. + /// A System.Half. + /// A System.Half value that is the sum of half1 and half2. + public static Half Add(Half half1, Half half2) { return half1 + half2; } + /// + /// Subtracts one specified System.Half value from another. + /// + /// A System.Half (the minuend). + /// A System.Half (the subtrahend). + /// The System.Half result of subtracting half2 from half1. + public static Half Subtract(Half half1, Half half2) { return half1 - half2; } + /// + /// Multiplies two specified System.Half values. + /// + /// A System.Half (the multiplicand). + /// A System.Half (the multiplier). + /// A System.Half that is the result of multiplying half1 and half2. + public static Half Multiply(Half half1, Half half2) { return half1 * half2; } + /// + /// Divides two specified System.Half values. + /// + /// A System.Half (the dividend). + /// A System.Half (the divisor). + /// The System.Half that is the result of dividing half1 by half2. + /// half2 is zero. + public static Half Divide(Half half1, Half half2) { return half1 / half2; } + + /// + /// Returns the value of the System.Half operand (the sign of the operand is unchanged). + /// + /// The System.Half operand. + /// The value of the operand, half. + public static Half operator +(Half half) { return half; } + /// + /// Negates the value of the specified System.Half operand. + /// + /// The System.Half operand. + /// The result of half multiplied by negative one (-1). + public static Half operator -(Half half) { return HalfHelper.Negate(half); } + /// + /// Increments the System.Half operand by 1. + /// + /// The System.Half operand. + /// The value of half incremented by 1. + public static Half operator ++(Half half) { return (Half)(half + 1f); } + /// + /// Decrements the System.Half operand by one. + /// + /// The System.Half operand. + /// The value of half decremented by 1. + public static Half operator --(Half half) { return (Half)(half - 1f); } + /// + /// Adds two specified System.Half values. + /// + /// A System.Half. + /// A System.Half. + /// The System.Half result of adding half1 and half2. + public static Half operator +(Half half1, Half half2) { return (Half)(half1 + (float)half2); } + /// + /// Subtracts two specified System.Half values. + /// + /// A System.Half. + /// A System.Half. + /// The System.Half result of subtracting half1 and half2. + public static Half operator -(Half half1, Half half2) { return (Half)(half1 - (float)half2); } + /// + /// Multiplies two specified System.Half values. + /// + /// A System.Half. + /// A System.Half. + /// The System.Half result of multiplying half1 by half2. + public static Half operator *(Half half1, Half half2) { return (Half)(half1 * (float)half2); } + /// + /// Divides two specified System.Half values. + /// + /// A System.Half (the dividend). + /// A System.Half (the divisor). + /// The System.Half result of half1 by half2. + public static Half operator /(Half half1, Half half2) { return (Half)(half1 / (float)half2); } + /// + /// Returns a value indicating whether two instances of System.Half are equal. + /// + /// A System.Half. + /// A System.Half. + /// true if half1 and half2 are equal; otherwise, false. + public static bool operator ==(Half half1, Half half2) { return (!IsNaN(half1) && (half1.Value == half2.Value)); } + /// + /// Returns a value indicating whether two instances of System.Half are not equal. + /// + /// A System.Half. + /// A System.Half. + /// true if half1 and half2 are not equal; otherwise, false. + public static bool operator !=(Half half1, Half half2) { return half1.Value != half2.Value; } + /// + /// Returns a value indicating whether a specified System.Half is less than another specified System.Half. + /// + /// A System.Half. + /// A System.Half. + /// true if half1 is less than half1; otherwise, false. + public static bool operator <(Half half1, Half half2) { return half1 < (float)half2; } + /// + /// Returns a value indicating whether a specified System.Half is greater than another specified System.Half. + /// + /// A System.Half. + /// A System.Half. + /// true if half1 is greater than half2; otherwise, false. + public static bool operator >(Half half1, Half half2) { return half1 > (float)half2; } + /// + /// Returns a value indicating whether a specified System.Half is less than or equal to another specified System.Half. + /// + /// A System.Half. + /// A System.Half. + /// true if half1 is less than or equal to half2; otherwise, false. + public static bool operator <=(Half half1, Half half2) { return (half1 == half2) || (half1 < half2); } + /// + /// Returns a value indicating whether a specified System.Half is greater than or equal to another specified System.Half. + /// + /// A System.Half. + /// A System.Half. + /// true if half1 is greater than or equal to half2; otherwise, false. + public static bool operator >=(Half half1, Half half2) { return (half1 == half2) || (half1 > half2); } + #endregion + + #region Type casting operators + /// + /// Converts an 8-bit unsigned integer to a System.Half. + /// + /// An 8-bit unsigned integer. + /// A System.Half that represents the converted 8-bit unsigned integer. + public static implicit operator Half(byte value) { return new Half((float)value); } + /// + /// Converts a 16-bit signed integer to a System.Half. + /// + /// A 16-bit signed integer. + /// A System.Half that represents the converted 16-bit signed integer. + public static implicit operator Half(short value) { return new Half((float)value); } + /// + /// Converts a Unicode character to a System.Half. + /// + /// A Unicode character. + /// A System.Half that represents the converted Unicode character. + public static implicit operator Half(char value) { return new Half((float)value); } + /// + /// Converts a 32-bit signed integer to a System.Half. + /// + /// A 32-bit signed integer. + /// A System.Half that represents the converted 32-bit signed integer. + public static implicit operator Half(int value) { return new Half((float)value); } + /// + /// Converts a 64-bit signed integer to a System.Half. + /// + /// A 64-bit signed integer. + /// A System.Half that represents the converted 64-bit signed integer. + public static implicit operator Half(long value) { return new Half((float)value); } + /// + /// Converts a single-precision floating-point number to a System.Half. + /// + /// A single-precision floating-point number. + /// A System.Half that represents the converted single-precision floating point number. + public static explicit operator Half(float value) { return new Half(value); } + /// + /// Converts a double-precision floating-point number to a System.Half. + /// + /// A double-precision floating-point number. + /// A System.Half that represents the converted double-precision floating point number. + public static explicit operator Half(double value) { return new Half((float)value); } + /// + /// Converts a decimal number to a System.Half. + /// + /// decimal number + /// A System.Half that represents the converted decimal number. + public static explicit operator Half(decimal value) { return new Half((float)value); } + /// + /// Converts a System.Half to an 8-bit unsigned integer. + /// + /// A System.Half to convert. + /// An 8-bit unsigned integer that represents the converted System.Half. + public static explicit operator byte(Half value) { return (byte)(float)value; } + /// + /// Converts a System.Half to a Unicode character. + /// + /// A System.Half to convert. + /// A Unicode character that represents the converted System.Half. + public static explicit operator char(Half value) { return (char)(float)value; } + /// + /// Converts a System.Half to a 16-bit signed integer. + /// + /// A System.Half to convert. + /// A 16-bit signed integer that represents the converted System.Half. + public static explicit operator short(Half value) { return (short)(float)value; } + /// + /// Converts a System.Half to a 32-bit signed integer. + /// + /// A System.Half to convert. + /// A 32-bit signed integer that represents the converted System.Half. + public static explicit operator int(Half value) { return (int)(float)value; } + /// + /// Converts a System.Half to a 64-bit signed integer. + /// + /// A System.Half to convert. + /// A 64-bit signed integer that represents the converted System.Half. + public static explicit operator long(Half value) { return (long)(float)value; } + /// + /// Converts a System.Half to a single-precision floating-point number. + /// + /// A System.Half to convert. + /// A single-precision floating-point number that represents the converted System.Half. + public static implicit operator float(Half value) { return HalfHelper.HalfToSingle(value); } + /// + /// Converts a System.Half to a double-precision floating-point number. + /// + /// A System.Half to convert. + /// A double-precision floating-point number that represents the converted System.Half. + public static implicit operator double(Half value) { return (float)value; } + /// + /// Converts a System.Half to a decimal number. + /// + /// A System.Half to convert. + /// A decimal number that represents the converted System.Half. + public static explicit operator decimal(Half value) { return (decimal)(float)value; } + /// + /// Converts an 8-bit signed integer to a System.Half. + /// + /// An 8-bit signed integer. + /// A System.Half that represents the converted 8-bit signed integer. + public static implicit operator Half(sbyte value) { return new Half((float)value); } + /// + /// Converts a 16-bit unsigned integer to a System.Half. + /// + /// A 16-bit unsigned integer. + /// A System.Half that represents the converted 16-bit unsigned integer. + public static implicit operator Half(ushort value) { return new Half((float)value); } + /// + /// Converts a 32-bit unsigned integer to a System.Half. + /// + /// A 32-bit unsigned integer. + /// A System.Half that represents the converted 32-bit unsigned integer. + public static implicit operator Half(uint value) { return new Half((float)value); } + /// + /// Converts a 64-bit unsigned integer to a System.Half. + /// + /// A 64-bit unsigned integer. + /// A System.Half that represents the converted 64-bit unsigned integer. + public static implicit operator Half(ulong value) { return new Half((float)value); } + /// + /// Converts a System.Half to an 8-bit signed integer. + /// + /// A System.Half to convert. + /// An 8-bit signed integer that represents the converted System.Half. + public static explicit operator sbyte(Half value) { return (sbyte)(float)value; } + /// + /// Converts a System.Half to a 16-bit unsigned integer. + /// + /// A System.Half to convert. + /// A 16-bit unsigned integer that represents the converted System.Half. + public static explicit operator ushort(Half value) { return (ushort)(float)value; } + /// + /// Converts a System.Half to a 32-bit unsigned integer. + /// + /// A System.Half to convert. + /// A 32-bit unsigned integer that represents the converted System.Half. + public static explicit operator uint(Half value) { return (uint)(float)value; } + /// + /// Converts a System.Half to a 64-bit unsigned integer. + /// + /// A System.Half to convert. + /// A 64-bit unsigned integer that represents the converted System.Half. + public static explicit operator ulong(Half value) { return (ulong)(float)value; } + #endregion + + /// + /// Compares this instance to a specified System.Half object. + /// + /// A System.Half object. + /// + /// A signed number indicating the relative values of this instance and value. + /// Return Value Meaning Less than zero This instance is less than value. Zero + /// This instance is equal to value. Greater than zero This instance is greater than value. + /// + public int CompareTo(Half other) + { + var result = 0; + if (this < other) + { + result = -1; + } + else if (this > other) + { + result = 1; + } + else if (this != other) + { + if (!IsNaN(this)) + { + result = 1; + } + else if (!IsNaN(other)) + { + result = -1; + } + } + + return result; + } + /// + /// Compares this instance to a specified System.Object. + /// + /// An System.Object or null. + /// + /// A signed number indicating the relative values of this instance and value. + /// Return Value Meaning Less than zero This instance is less than value. Zero + /// This instance is equal to value. Greater than zero This instance is greater + /// than value. -or- value is null. + /// + /// value is not a System.Half + public int CompareTo(object obj) + { + var result = 0; + if (obj == null) + { + result = 1; + } + else + { + if (obj is Half) + { + result = CompareTo((Half)obj); + } + else + { + throw new ArgumentException("Object must be of type Half."); + } + } + + return result; + } + /// + /// Returns a value indicating whether this instance and a specified System.Half object represent the same value. + /// + /// A System.Half object to compare to this instance. + /// true if value is equal to this instance; otherwise, false. + public bool Equals(Half other) + { + return ((other == this) || (IsNaN(other) && IsNaN(this))); + } + /// + /// Returns a value indicating whether this instance and a specified System.Object + /// represent the same type and value. + /// + /// An System.Object. + /// true if value is a System.Half and equal to this instance; otherwise, false. + public override bool Equals(object obj) + { + var result = false; + if (obj is Half) + { + var half = (Half)obj; + if ((half == this) || (IsNaN(half) && IsNaN(this))) + { + result = true; + } + } + + return result; + } + /// + /// Returns the hash code for this instance. + /// + /// A 32-bit signed integer hash code. + public override int GetHashCode() + { + return Value.GetHashCode(); + } + /// + /// Returns the System.TypeCode for value type System.Half. + /// + /// The enumerated constant (TypeCode)255. + public TypeCode GetTypeCode() + { + return (TypeCode)255; + } + + #region BitConverter & Math methods for Half + /// + /// Returns the specified half-precision floating point value as an array of bytes. + /// + /// The number to convert. + /// An array of bytes with length 2. + public static byte[] GetBytes(Half value) + { + return BitConverter.GetBytes(value.Value); + } + /// + /// Converts the value of a specified instance of System.Half to its equivalent binary representation. + /// + /// A System.Half value. + /// A 16-bit unsigned integer that contain the binary representation of value. + public static ushort GetBits(Half value) + { + return value.Value; + } + /// + /// Returns a half-precision floating point number converted from two bytes + /// at a specified position in a byte array. + /// + /// An array of bytes. + /// The starting position within value. + /// A half-precision floating point number formed by two bytes beginning at startIndex. + /// + /// startIndex is greater than or equal to the length of value minus 1, and is + /// less than or equal to the length of value minus 1. + /// + /// value is null. + /// startIndex is less than zero or greater than the length of value minus 1. + public static Half ToHalf(byte[] value, int startIndex) + { + return ToHalf((ushort)BitConverter.ToInt16(value, startIndex)); + } + /// + /// Returns a half-precision floating point number converted from its binary representation. + /// + /// Binary representation of System.Half value + /// A half-precision floating point number formed by its binary representation. + public static Half ToHalf(ushort bits) + { + return new Half { Value = bits }; + } + + /// + /// Returns a value indicating the sign of a half-precision floating-point number. + /// + /// A signed number. + /// + /// A number indicating the sign of value. Number Description -1 value is less + /// than zero. 0 value is equal to zero. 1 value is greater than zero. + /// + /// value is equal to System.Half.NaN. + public static int Sign(Half value) + { + if (value < 0) + { + return -1; + } + else if (value > 0) + { + return 1; + } + else + { + if (value != 0) + { + throw new ArithmeticException("Function does not accept floating point Not-a-Number values."); + } + } + + return 0; + } + /// + /// Returns the absolute value of a half-precision floating-point number. + /// + /// A number in the range System.Half.MinValue ≤ value ≤ System.Half.MaxValue. + /// A half-precision floating-point number, x, such that 0 ≤ x ≤System.Half.MaxValue. + public static Half Abs(Half value) + { + return HalfHelper.Abs(value); + } + /// + /// Returns the larger of two half-precision floating-point numbers. + /// + /// The first of two half-precision floating-point numbers to compare. + /// The second of two half-precision floating-point numbers to compare. + /// + /// Parameter value1 or value2, whichever is larger. If value1, or value2, or both val1 + /// and value2 are equal to System.Half.NaN, System.Half.NaN is returned. + /// + public static Half Max(Half value1, Half value2) + { + return (value1 < value2) ? value2 : value1; + } + /// + /// Returns the smaller of two half-precision floating-point numbers. + /// + /// The first of two half-precision floating-point numbers to compare. + /// The second of two half-precision floating-point numbers to compare. + /// + /// Parameter value1 or value2, whichever is smaller. If value1, or value2, or both val1 + /// and value2 are equal to System.Half.NaN, System.Half.NaN is returned. + /// + public static Half Min(Half value1, Half value2) + { + return (value1 < value2) ? value1 : value2; + } + #endregion + + /// + /// Returns a value indicating whether the specified number evaluates to not a number (System.Half.NaN). + /// + /// A half-precision floating-point number. + /// true if value evaluates to not a number (System.Half.NaN); otherwise, false. + public static bool IsNaN(Half half) + { + return HalfHelper.IsNaN(half); + } + /// + /// Returns a value indicating whether the specified number evaluates to negative or positive infinity. + /// + /// A half-precision floating-point number. + /// true if half evaluates to System.Half.PositiveInfinity or System.Half.NegativeInfinity; otherwise, false. + public static bool IsInfinity(Half half) + { + return HalfHelper.IsInfinity(half); + } + /// + /// Returns a value indicating whether the specified number evaluates to negative infinity. + /// + /// A half-precision floating-point number. + /// true if half evaluates to System.Half.NegativeInfinity; otherwise, false. + public static bool IsNegativeInfinity(Half half) + { + return HalfHelper.IsNegativeInfinity(half); + } + /// + /// Returns a value indicating whether the specified number evaluates to positive infinity. + /// + /// A half-precision floating-point number. + /// true if half evaluates to System.Half.PositiveInfinity; otherwise, false. + public static bool IsPositiveInfinity(Half half) + { + return HalfHelper.IsPositiveInfinity(half); + } + + #region String operations (Parse and ToString) + /// + /// Converts the string representation of a number to its System.Half equivalent. + /// + /// The string representation of the number to convert. + /// The System.Half number equivalent to the number contained in value. + /// value is null. + /// value is not in the correct format. + /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. + public static Half Parse(string value) + { + return (Half)float.Parse(value, CultureInfo.InvariantCulture); + } + /// + /// Converts the string representation of a number to its System.Half equivalent + /// using the specified culture-specific format information. + /// + /// The string representation of the number to convert. + /// An System.IFormatProvider that supplies culture-specific parsing information about value. + /// The System.Half number equivalent to the number contained in s as specified by provider. + /// value is null. + /// value is not in the correct format. + /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. + public static Half Parse(string value, IFormatProvider provider) + { + return (Half)float.Parse(value, provider); + } + /// + /// Converts the string representation of a number in a specified style to its System.Half equivalent. + /// + /// The string representation of the number to convert. + /// + /// A bitwise combination of System.Globalization.NumberStyles values that indicates + /// the style elements that can be present in value. A typical value to specify is + /// System.Globalization.NumberStyles.Number. + /// + /// The System.Half number equivalent to the number contained in s as specified by style. + /// value is null. + /// + /// style is not a System.Globalization.NumberStyles value. -or- style is the + /// System.Globalization.NumberStyles.AllowHexSpecifier value. + /// + /// value is not in the correct format. + /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. + public static Half Parse(string value, NumberStyles style) + { + return (Half)float.Parse(value, style, CultureInfo.InvariantCulture); + } + /// + /// Converts the string representation of a number to its System.Half equivalent + /// using the specified style and culture-specific format. + /// + /// The string representation of the number to convert. + /// + /// A bitwise combination of System.Globalization.NumberStyles values that indicates + /// the style elements that can be present in value. A typical value to specify is + /// System.Globalization.NumberStyles.Number. + /// + /// An System.IFormatProvider object that supplies culture-specific information about the format of value. + /// The System.Half number equivalent to the number contained in s as specified by style and provider. + /// value is null. + /// + /// style is not a System.Globalization.NumberStyles value. -or- style is the + /// System.Globalization.NumberStyles.AllowHexSpecifier value. + /// + /// value is not in the correct format. + /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. + public static Half Parse(string value, NumberStyles style, IFormatProvider provider) + { + return (Half)float.Parse(value, style, provider); + } + /// + /// Converts the string representation of a number to its System.Half equivalent. + /// A return value indicates whether the conversion succeeded or failed. + /// + /// The string representation of the number to convert. + /// + /// When this method returns, contains the System.Half number that is equivalent + /// to the numeric value contained in value, if the conversion succeeded, or is zero + /// if the conversion failed. The conversion fails if the s parameter is null, + /// is not a number in a valid format, or represents a number less than System.Half.MinValue + /// or greater than System.Half.MaxValue. This parameter is passed uninitialized. + /// + /// true if s was converted successfully; otherwise, false. + public static bool TryParse(string value, out Half result) + { + float f; + if (float.TryParse(value, out f)) + { + result = (Half)f; + return true; + } + + result = new Half(); + return false; + } + /// + /// Converts the string representation of a number to its System.Half equivalent + /// using the specified style and culture-specific format. A return value indicates + /// whether the conversion succeeded or failed. + /// + /// The string representation of the number to convert. + /// + /// A bitwise combination of System.Globalization.NumberStyles values that indicates + /// the permitted format of value. A typical value to specify is System.Globalization.NumberStyles.Number. + /// + /// An System.IFormatProvider object that supplies culture-specific parsing information about value. + /// + /// When this method returns, contains the System.Half number that is equivalent + /// to the numeric value contained in value, if the conversion succeeded, or is zero + /// if the conversion failed. The conversion fails if the s parameter is null, + /// is not in a format compliant with style, or represents a number less than + /// System.Half.MinValue or greater than System.Half.MaxValue. This parameter is passed uninitialized. + /// + /// true if s was converted successfully; otherwise, false. + /// + /// style is not a System.Globalization.NumberStyles value. -or- style + /// is the System.Globalization.NumberStyles.AllowHexSpecifier value. + /// + public static bool TryParse(string value, NumberStyles style, IFormatProvider provider, out Half result) + { + var parseResult = false; + float f; + if (float.TryParse(value, style, provider, out f)) + { + result = (Half)f; + parseResult = true; + } + else + { + result = new Half(); + } + + return parseResult; + } + /// + /// Converts the numeric value of this instance to its equivalent string representation. + /// + /// A string that represents the value of this instance. + public override string ToString() + { + return ((float)this).ToString(CultureInfo.InvariantCulture); + } + /// + /// Converts the numeric value of this instance to its equivalent string representation + /// using the specified culture-specific format information. + /// + /// An System.IFormatProvider that supplies culture-specific formatting information. + /// The string representation of the value of this instance as specified by provider. + public string ToString(IFormatProvider formatProvider) + { + return ((float)this).ToString(formatProvider); + } + /// + /// Converts the numeric value of this instance to its equivalent string representation, using the specified format. + /// + /// A numeric format string. + /// The string representation of the value of this instance as specified by format. + public string ToString(string format) + { + return ((float)this).ToString(format, CultureInfo.InvariantCulture); + } + /// + /// Converts the numeric value of this instance to its equivalent string representation + /// using the specified format and culture-specific format information. + /// + /// A numeric format string. + /// An System.IFormatProvider that supplies culture-specific formatting information. + /// The string representation of the value of this instance as specified by format and provider. + /// format is invalid. + public string ToString(string format, IFormatProvider formatProvider) + { + return ((float)this).ToString(format, formatProvider); + } + #endregion + + #region IConvertible Members + float IConvertible.ToSingle(IFormatProvider provider) + { + return this; + } + TypeCode IConvertible.GetTypeCode() + { + return GetTypeCode(); + } + bool IConvertible.ToBoolean(IFormatProvider provider) + { + return Convert.ToBoolean(this); + } + byte IConvertible.ToByte(IFormatProvider provider) + { + return Convert.ToByte(this); + } + char IConvertible.ToChar(IFormatProvider provider) + { + throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "Char")); + } + DateTime IConvertible.ToDateTime(IFormatProvider provider) + { + throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "DateTime")); + } + decimal IConvertible.ToDecimal(IFormatProvider provider) + { + return Convert.ToDecimal(this); + } + double IConvertible.ToDouble(IFormatProvider provider) + { + return Convert.ToDouble(this); + } + short IConvertible.ToInt16(IFormatProvider provider) + { + return Convert.ToInt16(this); + } + int IConvertible.ToInt32(IFormatProvider provider) + { + return Convert.ToInt32(this); + } + long IConvertible.ToInt64(IFormatProvider provider) + { + return Convert.ToInt64(this); + } + sbyte IConvertible.ToSByte(IFormatProvider provider) + { + return Convert.ToSByte(this); + } + string IConvertible.ToString(IFormatProvider provider) + { + return Convert.ToString(this, CultureInfo.InvariantCulture); + } + object IConvertible.ToType(Type conversionType, IFormatProvider provider) + { + return (((float)this) as IConvertible).ToType(conversionType, provider); + } + ushort IConvertible.ToUInt16(IFormatProvider provider) + { + return Convert.ToUInt16(this); + } + uint IConvertible.ToUInt32(IFormatProvider provider) + { + return Convert.ToUInt32(this); + } + ulong IConvertible.ToUInt64(IFormatProvider provider) + { + return Convert.ToUInt64(this); + } + #endregion + } +} + +namespace BCnEncoder.Shared +{ + /// + /// Helper class for Half conversions and some low level operations. + /// This class is internally used in the Half class. + /// + /// + /// References: + /// - Code retrieved from http://sourceforge.net/p/csharp-half/code/HEAD/tree/ on 2015-12-04 + /// - Fast Half Float Conversions, Jeroen van der Zijp, link: http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + /// + internal static class HalfHelper + { + private static readonly uint[] MantissaTable = GenerateMantissaTable(); + private static readonly uint[] ExponentTable = GenerateExponentTable(); + private static readonly ushort[] OffsetTable = GenerateOffsetTable(); + private static readonly ushort[] BaseTable = GenerateBaseTable(); + private static readonly sbyte[] ShiftTable = GenerateShiftTable(); + + // Transforms the subnormal representation to a normalized one. + private static uint ConvertMantissa(int i) + { + var m = (uint)(i << 13); // Zero pad mantissa bits + uint e = 0; // Zero exponent + + // While not normalized + while ((m & 0x00800000) == 0) + { + e -= 0x00800000; // Decrement exponent (1<<23) + m <<= 1; // Shift mantissa + } + m &= unchecked((uint)~0x00800000); // Clear leading 1 bit + e += 0x38800000; // Adjust bias ((127-14)<<23) + return m | e; // Return combined number + } + + private static uint[] GenerateMantissaTable() + { + var mantissaTable = new uint[2048]; + mantissaTable[0] = 0; + for (var i = 1; i < 1024; i++) + { + mantissaTable[i] = ConvertMantissa(i); + } + for (var i = 1024; i < 2048; i++) + { + mantissaTable[i] = (uint)(0x38000000 + ((i - 1024) << 13)); + } + + return mantissaTable; + } + private static uint[] GenerateExponentTable() + { + var exponentTable = new uint[64]; + exponentTable[0] = 0; + for (var i = 1; i < 31; i++) + { + exponentTable[i] = (uint)(i << 23); + } + exponentTable[31] = 0x47800000; + exponentTable[32] = 0x80000000; + for (var i = 33; i < 63; i++) + { + exponentTable[i] = (uint)(0x80000000 + ((i - 32) << 23)); + } + exponentTable[63] = 0xc7800000; + + return exponentTable; + } + private static ushort[] GenerateOffsetTable() + { + var offsetTable = new ushort[64]; + offsetTable[0] = 0; + for (var i = 1; i < 32; i++) + { + offsetTable[i] = 1024; + } + offsetTable[32] = 0; + for (var i = 33; i < 64; i++) + { + offsetTable[i] = 1024; + } + + return offsetTable; + } + private static ushort[] GenerateBaseTable() + { + var baseTable = new ushort[512]; + for (var i = 0; i < 256; ++i) + { + var e = (sbyte)(127 - i); + if (e > 24) + { // Very small numbers map to zero + baseTable[i | 0x000] = 0x0000; + baseTable[i | 0x100] = 0x8000; + } + else if (e > 14) + { // Small numbers map to denorms + baseTable[i | 0x000] = (ushort)(0x0400 >> (18 + e)); + baseTable[i | 0x100] = (ushort)((0x0400 >> (18 + e)) | 0x8000); + } + else if (e >= -15) + { // Normal numbers just lose precision + baseTable[i | 0x000] = (ushort)((15 - e) << 10); + baseTable[i | 0x100] = (ushort)(((15 - e) << 10) | 0x8000); + } + else if (e > -128) + { // Large numbers map to Infinity + baseTable[i | 0x000] = 0x7c00; + baseTable[i | 0x100] = 0xfc00; + } + else + { // Infinity and NaN's stay Infinity and NaN's + baseTable[i | 0x000] = 0x7c00; + baseTable[i | 0x100] = 0xfc00; + } + } + + return baseTable; + } + private static sbyte[] GenerateShiftTable() + { + var shiftTable = new sbyte[512]; + for (var i = 0; i < 256; ++i) + { + var e = (sbyte)(127 - i); + if (e > 24) + { // Very small numbers map to zero + shiftTable[i | 0x000] = 24; + shiftTable[i | 0x100] = 24; + } + else if (e > 14) + { // Small numbers map to denorms + shiftTable[i | 0x000] = (sbyte)(e - 1); + shiftTable[i | 0x100] = (sbyte)(e - 1); + } + else if (e >= -15) + { // Normal numbers just lose precision + shiftTable[i | 0x000] = 13; + shiftTable[i | 0x100] = 13; + } + else if (e > -128) + { // Large numbers map to Infinity + shiftTable[i | 0x000] = 24; + shiftTable[i | 0x100] = 24; + } + else + { // Infinity and NaN's stay Infinity and NaN's + shiftTable[i | 0x000] = 13; + shiftTable[i | 0x100] = 13; + } + } + + return shiftTable; + } + + public static unsafe float HalfToSingle(Half half) + { + var result = MantissaTable[OffsetTable[half.Value >> 10] + (half.Value & 0x3ff)] + ExponentTable[half.Value >> 10]; + return *(float*)&result; + } + public static unsafe Half SingleToHalf(float single) + { + var value = *(uint*)&single; + + var result = (ushort)(BaseTable[(value >> 23) & 0x1ff] + ((value & 0x007fffff) >> ShiftTable[value >> 23])); + return Half.ToHalf(result); + } + + public static Half Negate(Half half) + { + return Half.ToHalf((ushort)(half.Value ^ 0x8000)); + } + public static Half Abs(Half half) + { + return Half.ToHalf((ushort)(half.Value & 0x7fff)); + } + + public static bool IsNaN(Half half) + { + return (half.Value & 0x7fff) > 0x7c00; + } + public static bool IsInfinity(Half half) + { + return (half.Value & 0x7fff) == 0x7c00; + } + public static bool IsPositiveInfinity(Half half) + { + return half.Value == 0x7c00; + } + public static bool IsNegativeInfinity(Half half) + { + return half.Value == 0xfc00; + } + } +} diff --git a/BCnEnc.Net/Shared/HdrImage.cs b/BCnEnc.Net/Shared/HdrImage.cs new file mode 100644 index 0000000..cb899e2 --- /dev/null +++ b/BCnEnc.Net/Shared/HdrImage.cs @@ -0,0 +1,344 @@ +using System; +using System.Globalization; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using Microsoft.Toolkit.HighPerformance; + +namespace BCnEncoder.Shared +{ + /// + /// Reads and writes .hdr RGBE/Radiance HDR files. File format by Gregory Ward. + /// This class is experimental, incomplete and probably going to be removed in a future version. + /// Use only if you don't have anything better. + /// + public class HdrImage + { + public enum ColorSpace + { + Rgbe, + Xyze + } + + public float exposure = -1; + public float gamma = -1; + public int width; + public int height; + + public ColorRgbFloat[] pixels; + + /// + /// Gets a span2D over the array. + /// + public Span2D PixelSpan => new Span2D(pixels, height, width); + /// + /// Gets a span2D over the array. + /// + public Memory2D PixelMemory => new Memory2D(pixels, height, width); + + public HdrImage() {} + + public HdrImage(int width, int height, float exposure = 0, float gamma = 0) + { + this.width = width; + this.height = height; + this.exposure = exposure; + this.gamma = gamma; + this.pixels = new ColorRgbFloat[width * height]; + } + + public HdrImage(Span2D pixels, float exposure = 0, float gamma = 0) + { + this.width = pixels.Width; + this.height = pixels.Height; + this.exposure = exposure; + this.gamma = gamma; + this.pixels = new ColorRgbFloat[width * height]; + pixels.CopyTo(this.pixels); + } + + // StreamReader class does not work. Have to use custom string reading. + private static string ReadFromStream(Stream stream) + { + var i = 0; + var buffer = new char[512]; + char c; + do + { + var b = stream.ReadByte(); + if (b == -1) + { + return null; + } + c = (char)b; + buffer[i++] = c; + } while (c != (char)10); + return new string(buffer.AsSpan().Slice(0, i)).Trim(); + } + + private static void WriteLineToStream(BinaryWriter br, string s) + { + foreach (var c in s) + { + var b = (byte) c; + br.Write(b); + } + br.Write((byte)10); + } + + /// + /// Read a Radiance HDR image by filename. + /// Just calls internally. + /// + /// The filename or path of the image + /// A new HdrImage with the data + public static HdrImage Read(string filename) + { + using var fs = File.OpenRead(filename); + return Read(fs); + } + + /// + /// Read a Radiance HDR image from a stream + /// + /// The stream to read from + /// A new HdrImage with the data + public static HdrImage Read(Stream stream) + { + var image = new HdrImage(); + + var line = ReadFromStream(stream); + + if (!(line == "#?RGBE" || line == "#?RADIANCE" || line == "#?AUTOPANO")) + { + throw new FileLoadException("Correct file type specifier was not found."); + } + + var colorSpace = ColorSpace.Rgbe; + + do + { + line = ReadFromStream(stream); + + if (line == null) + { + throw new FileLoadException("Reached end of stream."); + } + + line = line.Trim(); + + if (line == "") + { + break; + } + + if (line.StartsWith("#")) // Found comment + { + continue; + } + + if (line == "FORMAT=32-bit_rle_rgbe") + { + colorSpace = ColorSpace.Rgbe; + } + + else if (line == "FORMAT=32-bit_rle_xyze") + { + colorSpace = ColorSpace.Xyze; + } + + else if (line.StartsWith("EXPOSURE=")) + { + image.exposure = float.Parse(line.Replace("EXPOSURE=", "").Trim(), CultureInfo.InvariantCulture); + } + + else if (line.StartsWith("GAMMA=")) + { + image.gamma = float.Parse(line.Replace("GAMMA=", "").Trim(), CultureInfo.InvariantCulture); + } + + } while (true); + + if (image.exposure < 0.000001) + { + image.exposure = 1.0f; + } + + if (image.gamma < 0.000001) + { + image.gamma = 1.0f; + } + + var imgSize = ReadFromStream(stream).Split(' '); + + var yStr = imgSize[0]; + image.height = int.Parse(imgSize[1]); + var xStr = imgSize[2]; + image.width = int.Parse(imgSize[3]); + + ReadPixels(image, stream); + + if (colorSpace == ColorSpace.Xyze) + { + // Transform colorspace + var xyzColors = MemoryMarshal.Cast(image.pixels.AsSpan()); + for (var i = 0; i < xyzColors.Length; i++) + { + image.pixels[i] = xyzColors[i].ToColorRgbFloat(); + } + } + + return image; + } + + + private static void RleReadChannel(BinaryReader br, Span dest, int width) + { + var i = 0; + var data = new byte[2]; + while (i < width) + { + if (br.Read(data) == 0) + { + throw new FileLoadException("Not enough data in RLE"); + } + if (data[0] > 128) + { + // same byte is repeated many times + var len = data[0] - 128; + for (; len > 0; len--) + { + dest[i++] = data[1]; + } + } + else + { + // different byte sequence + dest[i++] = data[1]; + + var len = data[0] - 1; + if (len > 0) + { + if (br.Read(dest.Slice(i, len)) == 0) + { + throw new FileLoadException("Not enough data in RLE"); + } + i += len; + } + } + } + + if (i != width) + { + throw new FileLoadException("Scanline size was different from width"); + } + } + + + private static void ReadPixels(HdrImage destImage, Stream stream) + { + var height = destImage.height; + var width = destImage.width; + destImage.pixels = new ColorRgbFloat[destImage.height * destImage.width]; + Span bytes = new byte[destImage.width * 4]; + + using var br = new BinaryReader(stream, Encoding.ASCII, true); + + var header = new byte[4]; + + for (var y = 0; y < height; y++) + { + br.Read(header); + + var isRle = header[0] == 2 && header[1] == 2 && + (header[2] << 8) + header[3] == width; // whether the scanline is rle or not + + if (isRle) + { + // for each channel + for (var i = 0; i < 4; i++) + { + RleReadChannel(br, bytes.Slice(width * i, width), width); + } + + for (var x = 0; x < width; x++) + { + var color = new ColorRgbe( + bytes[x + width * 0], + bytes[x + width * 1], + bytes[x + width * 2], + bytes[x + width * 3] + ); + + destImage.pixels[y * width + x] = color.ToColorRgbFloat(destImage.exposure); + } + } + else + { + br.Read(bytes.Slice(4)); + header.CopyTo(bytes); + + for (var x = 0; x < width; x++) + { + var color = new ColorRgbe( + bytes[4 * x + 0], + bytes[4 * x + 1], + bytes[4 * x + 2], + bytes[4 * x + 3] + ); + + destImage.pixels[y * width + x] = color.ToColorRgbFloat(destImage.exposure); + } + } + } + } + + /// + /// Write this file to a stream. + /// + /// The stream to write it to. + public void Write(Stream stream) + { + using var br = new BinaryWriter(stream, Encoding.ASCII, true); + + WriteLineToStream(br, "#?RADIANCE"); + WriteLineToStream(br, "# BCnEncoder.Net HdrImage"); + WriteLineToStream(br, "FORMAT=32-bit_rle_rgbe"); + if (exposure > 0) + { + WriteLineToStream(br, "EXPOSURE=" + exposure.ToString(CultureInfo.InvariantCulture)); + } + if (gamma > 0) + { + WriteLineToStream(br, "GAMMA=" + gamma.ToString(CultureInfo.InvariantCulture)); + } + + WriteLineToStream(br, ""); // Start data with empty row + WriteLineToStream(br, $"-Y {height} +X {width}"); + + WritePixels(br); + } + + private void WritePixels(BinaryWriter br) + { + var buffer = new byte[4]; + var span = PixelSpan; + + for (var y = 0; y < height; y++) + { + for (var x = 0; x < width; x++) + { + var pixel = span[y, x]; + var rgbe = new ColorRgbe(pixel); + + buffer[0] = rgbe.r; + buffer[1] = rgbe.g; + buffer[2] = rgbe.b; + buffer[3] = rgbe.e; + + br.Write(buffer); + } + } + } + } +} diff --git a/BCnEnc.Net/Shared/ImageQuality.cs b/BCnEnc.Net/Shared/ImageQuality.cs index 0507cb0..b97fb55 100644 --- a/BCnEnc.Net/Shared/ImageQuality.cs +++ b/BCnEnc.Net/Shared/ImageQuality.cs @@ -34,6 +34,30 @@ public static float PeakSignalToNoiseRatio(ReadOnlySpan original, R return 20 * MathF.Log10(1 / MathF.Sqrt(error)); } + public static float CalculateLogRMSE(ReadOnlySpan original, ReadOnlySpan other) + { + if (original.Length != other.Length) + { + throw new ArgumentException("Both spans should be the same length"); + } + float error = 0; + for (var i = 0; i < original.Length; i++) + { + //var dr = MathF.Log(other[i].r + 1.0f) - MathF.Log(original[i].r + 1.0f); + //var dg = MathF.Log(other[i].g + 1.0f) - MathF.Log(original[i].g + 1.0f); + //var db = MathF.Log(other[i].b + 1.0f) - MathF.Log(original[i].b + 1.0f); + var dr = Math.Sign(other[i].r) * MathF.Log(1 + MathF.Abs(other[i].r)) - Math.Sign(original[i].r) * MathF.Log(1 + MathF.Abs(original[i].r)); + var dg = Math.Sign(other[i].g) * MathF.Log(1 + MathF.Abs(other[i].g)) - Math.Sign(original[i].g) * MathF.Log(1 + MathF.Abs(original[i].g)); + var db = Math.Sign(other[i].b) * MathF.Log(1 + MathF.Abs(other[i].b)) - Math.Sign(original[i].b) * MathF.Log(1 + MathF.Abs(original[i].b)); + + error += dr * dr; + error += dg * dg; + error += db * db; + + } + return MathF.Sqrt(error / (3.0f * original.Length)); + } + public static float PeakSignalToNoiseRatioLuminance(ReadOnlySpan original, ReadOnlySpan other, bool countAlpha = true) { if (original.Length != other.Length) { throw new ArgumentException("Both spans should be the same length"); diff --git a/BCnEnc.Net/Shared/ImageToBlocks.cs b/BCnEnc.Net/Shared/ImageToBlocks.cs index 9cecf14..f3ba021 100644 --- a/BCnEnc.Net/Shared/ImageToBlocks.cs +++ b/BCnEnc.Net/Shared/ImageToBlocks.cs @@ -49,6 +49,29 @@ internal static ColorRgba32[] ColorsFromRawBlocks(RawBlock4X4Rgba32[] blocks, in return output; } + internal static ColorRgbFloat[] ColorsFromRawBlocks(RawBlock4X4RgbFloat[] blocks, int pixelWidth, int pixelHeight) + { + var blocksWidth = ((pixelWidth + 3) & ~3) >> 2; + var output = new ColorRgbFloat[pixelWidth * pixelHeight]; + + for (var y = 0; y < pixelHeight; y++) + { + for (var x = 0; x < pixelWidth; x++) + { + var blockIndexX = x >> 2; + var blockIndexY = y >> 2; + var blockInternalIndexX = x & 3; + var blockInternalIndexY = y & 3; + + var blockIndex = blockIndexX + blockIndexY * blocksWidth; + + output[x + y * pixelWidth] = blocks[blockIndex][blockInternalIndexX, blockInternalIndexY]; + } + } + + return output; + } + #endregion #region Image to blocks @@ -116,6 +139,69 @@ internal static RawBlock4X4Rgba32[] ImageTo4X4(ReadOnlyMemory2D ima return output; } + internal static RawBlock4X4RgbFloat[] ImageTo4X4(ReadOnlyMemory2D image, out int blocksWidth, out int blocksHeight) + { + blocksWidth = ((image.Width + 3) & ~3) >> 2; + blocksHeight = ((image.Height + 3) & ~3) >> 2; + + var output = new RawBlock4X4RgbFloat[blocksWidth * blocksHeight]; + + var span = image.Span; + + for (var y = 0; y < image.Height; y++) + { + for (var x = 0; x < image.Width; x++) + { + var color = span[y, x]; + + var blockIndexX = x >> 2; + var blockIndexY = y >> 2; + var blockInternalIndexX = x & 3; + var blockInternalIndexY = y & 3; + + output[blockIndexX + blockIndexY * blocksWidth][blockInternalIndexX, blockInternalIndexY] = color; + } + } + + // Fill in block y with edge color + if ((image.Height & 3) != 0) + { + var yPaddingStart = image.Height & 3; + for (var i = 0; i < blocksWidth; i++) + { + var lastBlock = output[i + blocksWidth * (blocksHeight - 1)]; + for (var y = yPaddingStart; y < 4; y++) + { + for (var x = 0; x < 4; x++) + { + lastBlock[x, y] = lastBlock[x, y - 1]; + } + } + output[i + blocksWidth * (blocksHeight - 1)] = lastBlock; + } + } + + // Fill in block x with edge color + if ((image.Width & 3) != 0) + { + var xPaddingStart = image.Width & 3; + for (var i = 0; i < blocksHeight; i++) + { + var lastBlock = output[blocksWidth - 1 + i * blocksWidth]; + for (var x = xPaddingStart; x < 4; x++) + { + for (var y = 0; y < 4; y++) + { + lastBlock[x, y] = lastBlock[x - 1, y]; + } + } + output[blocksWidth - 1 + i * blocksWidth] = lastBlock; + } + } + + return output; + } + #endregion public static int CalculateNumOfBlocks(int pixelWidth, int pixelHeight) diff --git a/BCnEnc.Net/Shared/IntHelper.cs b/BCnEnc.Net/Shared/IntHelper.cs new file mode 100644 index 0000000..6c2f562 --- /dev/null +++ b/BCnEnc.Net/Shared/IntHelper.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BCnEncoder.Shared +{ + internal static class IntHelper + { + + public static int SignExtend(int orig, int precision) + { + var signMask = (1 << (precision - 1)); + var numberMask = signMask - 1; + + if ((orig & signMask) != 0) + { + return (~numberMask) | (orig & numberMask); + } + + return (orig & numberMask); + } + } +} diff --git a/BCnEnc.Net/Shared/InternalUtils.cs b/BCnEnc.Net/Shared/InternalUtils.cs new file mode 100644 index 0000000..01d6ba3 --- /dev/null +++ b/BCnEnc.Net/Shared/InternalUtils.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BCnEncoder.Shared +{ + internal static class InternalUtils + { + public static void Swap(ref T lhs, ref T rhs) + { + var temp = lhs; + lhs = rhs; + rhs = temp; + } + } +} diff --git a/BCnEnc.Net/Shared/LinearClustering.cs b/BCnEnc.Net/Shared/LinearClustering.cs index 7f8f6dc..baf10aa 100644 --- a/BCnEnc.Net/Shared/LinearClustering.cs +++ b/BCnEnc.Net/Shared/LinearClustering.cs @@ -124,11 +124,14 @@ public static int[] ClusterPixels(ReadOnlySpan pixels, int width, i int clusters, float m = 10, int maxIterations = 10, bool enforceConnectivity = true) { - if (clusters < 2) + var floats = new ColorRgbFloat[pixels.Length]; + for (var i = 0; i < pixels.Length; i++) { - throw new ArgumentException("Number of clusters should be more than 1"); + floats[i] = pixels[i].ToRgbFloat(); } + return ClusterPixels(floats, width, height, clusters, m, maxIterations, enforceConnectivity); + //Grid interval S var s = MathF.Sqrt(pixels.Length / (float)clusters); var clusterIndices = new int[pixels.Length]; @@ -195,6 +198,87 @@ public static int[] ClusterPixels(ReadOnlySpan pixels, int width, i return clusterIndices; } + /// + /// The greater the value of M, + /// the more spatial proximity is emphasized and the more compact the cluster, + /// M should be in range of 1 to 20. + /// + public static int[] ClusterPixels(ReadOnlySpan pixels, int width, int height, + int clusters, float m = 10, int maxIterations = 10, bool enforceConnectivity = true) + { + + if (clusters < 2) + { + throw new ArgumentException("Number of clusters should be more than 1"); + } + + //Grid interval S + var s = MathF.Sqrt(pixels.Length / (float)clusters); + var clusterIndices = new int[pixels.Length]; + + var labXys = ConvertToLabXy(pixels, width, height); + + + Span clusterCenters = InitialClusterCenters(width, height, clusters, s, labXys); + Span previousCenters = new ClusterCenter[clusters]; + + float error = 999; + const float threshold = 0.1f; + var iter = 0; + while (error > threshold) + { + if (maxIterations > 0 && iter >= maxIterations) + { + break; + } + iter++; + + clusterCenters.CopyTo(previousCenters); + + Array.Fill(clusterIndices, -1); + + // Find closest cluster for pixels + for (var j = 0; j < clusters; j++) + { + var xL = Math.Max(0, (int)(clusterCenters[j].x - s)); + var xH = Math.Min(width, (int)(clusterCenters[j].x + s)); + var yL = Math.Max(0, (int)(clusterCenters[j].y - s)); + var yH = Math.Min(height, (int)(clusterCenters[j].y + s)); + + for (var x = xL; x < xH; x++) + { + for (var y = yL; y < yH; y++) + { + var i = x + y * width; + + if (clusterIndices[i] == -1) + { + clusterIndices[i] = j; + } + else + { + var prevDistance = clusterCenters[clusterIndices[i]].Distance(labXys[i], m, s); + var distance = clusterCenters[j].Distance(labXys[i], m, s); + if (distance < prevDistance) + { + clusterIndices[i] = j; + } + } + } + } + } + + error = RecalculateCenters(clusters, m, labXys, clusterIndices, previousCenters, s, ref clusterCenters); + } + + if (enforceConnectivity) + { + clusterIndices = EnforceConnectivity(clusterIndices, width, height, clusters); + } + + return clusterIndices; + } + private static float RecalculateCenters(int clusters, float m, LabXy[] labXys, int[] clusterIndices, Span previousCenters, float s, ref Span clusterCenters) { @@ -315,6 +399,30 @@ private static LabXy[] ConvertToLabXy(ReadOnlySpan pixels, int widt return labXys; } + private static LabXy[] ConvertToLabXy(ReadOnlySpan pixels, int width, int height) + { + var labXys = new LabXy[pixels.Length]; + //Convert pixels to LabXy + for (var x = 0; x < width; x++) + { + for (var y = 0; y < height; y++) + { + var i = x + y * width; + var lab = new ColorLab(pixels[i]); + labXys[i] = new LabXy + { + l = lab.l, + a = lab.a, + b = lab.b, + x = x, + y = y + }; + } + } + + return labXys; + } + private static int[] EnforceConnectivity(int[] oldLabels, int width, int height, int clusters) { ReadOnlySpan neighborX = new[] { -1, 0, 1, 0 }; diff --git a/BCnEnc.Net/Shared/MathHelper.cs b/BCnEnc.Net/Shared/MathHelper.cs new file mode 100644 index 0000000..d5a47d9 --- /dev/null +++ b/BCnEnc.Net/Shared/MathHelper.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BCnEncoder.Shared +{ + public static unsafe class MathHelper + { + private static double two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ + + // FrExp modified to C# from http://www.netlib.org + /* @(#)fdlibm.h 1.5 04/04/22 */ + /* + * ==================================================== + * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + /// + /// Breaks down the floating-point value x into a component m for the normalized fraction component and another term n for the exponent, such that the absolute value of m is greater than or equal to 0.5 and less than 1.0 or equal to 0, and x = m * 2n. The function stores the integer exponent n at the location to which expptr points. + /// + /// + /// + /// Returns the normalized fraction m. If x is 0, the function returns 0 for both the fraction and exponent. The fraction has the same sign as the argument x. The result of the function cannot have a range error. + public static double FrExp(double x, out int eptr) + { + unchecked + { + int hx, ix, lx; + hx = *(1 + (int*) &x); + ix = 0x7fffffff & hx; + lx = *(int*) &x; + eptr = 0; + if (ix >= 0x7ff00000 || ((ix | lx) == 0)) return x; /* 0,inf,nan */ + if (ix < 0x00100000) + { + /* subnormal */ + x *= two54; + hx = *(1 + (int*) &x); + ix = hx & 0x7fffffff; + eptr = -54; + } + + eptr += (ix >> 20) - 1022; + hx = (hx & (int) 0x800fffff) | (int) 0x3fe00000; + *(1 + (int*) &x) = hx; + return x; + } + } + + /// + /// Multiplies a floating point value arg by the number 2 raised to the exp power. + /// + /// + /// + /// + public static float LdExp(float arg, int exp) + { + return arg * MathF.Pow(2, exp); + } + } +} diff --git a/BCnEnc.Net/Shared/MipMapper.cs b/BCnEnc.Net/Shared/MipMapper.cs index c7b338f..765bc48 100644 --- a/BCnEnc.Net/Shared/MipMapper.cs +++ b/BCnEnc.Net/Shared/MipMapper.cs @@ -9,32 +9,89 @@ internal static class MipMapper /// Generate a chain of elements. /// /// The original image to scale down. + /// The original image width. + /// The original image height. + /// The number of mipmaps to generate. + /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. + public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory input, int width, int height, ref int numMipMaps) + { + return GenerateMipChain(input.AsMemory2D(height, width), ref numMipMaps); + } + + /// + /// Generate a chain of elements. + /// + /// The original image to scale down. /// The number of mipmaps to generate. /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. - public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory2D input, ref int numMipMaps) + public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory2D pixels, ref int numMipMaps) { - if (!input.TryGetMemory(out var memory)) + var width = pixels.Width; + var height = pixels.Height; + var mipChainLength = CalculateMipChainLength(width, height, numMipMaps); + + var result = new ReadOnlyMemory2D[mipChainLength]; + result[0] = pixels; + + // If only one mipmap was requested, return original image only + if (numMipMaps == 1) { - throw new InvalidOperationException("Could not get Memory from Memory2D."); + return result; + } + + // If number of mipmaps is "marked as boundless", do as many mipmaps as it takes to reach a size of 1x1 + if (numMipMaps <= 0) + { + numMipMaps = int.MaxValue; + } + + // Generate mipmaps + for (var mipLevel = 1; mipLevel < numMipMaps; mipLevel++) + { + var mipWidth = Math.Max(1, width >> mipLevel); + var mipHeight = Math.Max(1, height >> mipLevel); + + var newMip = ResizeToHalf(result[mipLevel - 1].Span); + result[mipLevel] = newMip; + + // Stop generating if last generated mipmap was of size 1x1 + if (mipWidth == 1 && mipHeight == 1) + { + numMipMaps = mipLevel + 1; + break; + } } - return GenerateMipChain(memory, input.Width, input.Height, ref numMipMaps); + return result; } /// /// Generate a chain of elements. /// - /// The original image to scale down. + /// The original image to scale down. /// The original image width. /// The original image height. /// The number of mipmaps to generate. /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. - public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory pixels, int width, int height, ref int numMipMaps) + public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory input, int width, int height, ref int numMipMaps) + { + return GenerateMipChain(input.AsMemory2D(height, width), ref numMipMaps); + } + + /// + /// Generate a chain of elements. + /// + /// The original image to scale down. + /// The number of mipmaps to generate. + /// Will generate as many mipmaps as possible until a mipmap of 1x1 is reached for 0 or smaller. + public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory2D pixels, ref int numMipMaps) { + var width = pixels.Width; + var height = pixels.Height; var mipChainLength = CalculateMipChainLength(width, height, numMipMaps); - var result = new ReadOnlyMemory2D[mipChainLength]; - result[0] = pixels.AsMemory2D(height, width); + var result = new ReadOnlyMemory2D[mipChainLength]; + result[0] = pixels; // If only one mipmap was requested, return original image only if (numMipMaps == 1) @@ -53,7 +110,7 @@ public static ReadOnlyMemory2D[] GenerateMipChain(ReadOnlyMemory> mipLevel); var mipHeight = Math.Max(1, height >> mipLevel); - + var newMip = ResizeToHalf(result[mipLevel - 1].Span); result[mipLevel] = newMip; @@ -135,5 +192,34 @@ public static void CalculateMipLevelSize(int width, int height, int mipIdx, out return result; } + + private static ColorRgbFloat[,] ResizeToHalf(ReadOnlySpan2D pixelsRgba) + { + + var oldWidth = pixelsRgba.Width; + var oldHeight = pixelsRgba.Height; + var newWidth = Math.Max(1, oldWidth >> 1); + var newHeight = Math.Max(1, oldHeight >> 1); + + var result = new ColorRgbFloat[newHeight, newWidth]; + + int ClampW(int x) => Math.Max(0, Math.Min(oldWidth - 1, x)); + int ClampH(int y) => Math.Max(0, Math.Min(oldHeight - 1, y)); + + for (var y2 = 0; y2 < newHeight; y2++) + { + for (var x2 = 0; x2 < newWidth; x2++) + { + var ul = pixelsRgba[ClampH(y2 * 2), ClampW(x2 * 2)]; + var ur = pixelsRgba[ClampH(y2 * 2), ClampW(x2 * 2 + 1)]; + var ll = pixelsRgba[ClampH(y2 * 2 + 1), ClampW(x2 * 2)]; + var lr = pixelsRgba[ClampH(y2 * 2 + 1), ClampW(x2 * 2 + 1)]; + + result[y2, x2] = ((ul + ur + ll + lr) / 4); + } + } + + return result; + } } } diff --git a/BCnEnc.Net/Shared/PcaVectors.cs b/BCnEnc.Net/Shared/PcaVectors.cs index 5aaf0c8..63c2685 100644 --- a/BCnEnc.Net/Shared/PcaVectors.cs +++ b/BCnEnc.Net/Shared/PcaVectors.cs @@ -19,6 +19,17 @@ private static void ConvertToVector4(ReadOnlySpan colors, Span colors, Span vectors) + { + for (var i = 0; i < colors.Length; i++) + { + vectors[i].X += colors[i].r; + vectors[i].Y += colors[i].g; + vectors[i].Z += colors[i].b; + vectors[i].W = 0; + } + } + private static Vector4 CalculateMean(Span colors) { @@ -129,6 +140,28 @@ public static void Create(Span colors, out Vector3 mean, out Vector } + public static void Create(Span colors, out Vector3 mean, out Vector3 principalAxis) + { + Span vectors = stackalloc Vector4[colors.Length]; + ConvertToVector4(colors, vectors); + + + var cov = CalculateCovariance(vectors, out var v4Mean); + mean = new Vector3(v4Mean.X, v4Mean.Y, v4Mean.Z); + + var pa = CalculatePrincipalAxis(cov); + principalAxis = new Vector3(pa.X, pa.Y, pa.Z); + if (principalAxis.LengthSquared() == 0) + { + principalAxis = Vector3.UnitY; + } + else + { + principalAxis = Vector3.Normalize(principalAxis); + } + + } + public static void CreateWithAlpha(Span colors, out Vector4 mean, out Vector4 principalAxis) { Span vectors = stackalloc Vector4[colors.Length]; @@ -254,440 +287,29 @@ public static void GetExtremePointsWithAlpha(Span colors, Vector4 m max = mean + principalAxis * maxD; } - public static void GetOptimizedEndpoints565(Span colors, Vector3 mean, Vector3 principalAxis, out ColorRgb565 min, out ColorRgb565 max, - float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f) + public static void GetExtremePoints(Span colors, Vector3 mean, Vector3 principalAxis, out Vector3 min, + out Vector3 max) { - var length = colors.Length; - var vectorColors = new Vector3[length]; - for (var i = 0; i < colors.Length; i++) - { - vectorColors[i] = new Vector3(colors[i].r / 255f, colors[i].g / 255f, colors[i].b / 255f); - } float minD = 0; float maxD = 0; - Vector3 Clamp565(Vector3 vec) - { - if (vec.X < 0) vec.X = 0; - if (vec.X > 31) vec.X = 31; - if (vec.Y < 0) vec.Y = 0; - if (vec.Y > 63) vec.Y = 63; - if (vec.Z < 0) vec.Z = 0; - if (vec.Z > 31) vec.Z = 31; - return new Vector3(MathF.Round(vec.X), MathF.Round(vec.Y), MathF.Round(vec.Z)); - } - - float Distance(Vector3 v, Vector3 p) - { - return (v.X - p.X) * (v.X - p.X) * rWeight - + (v.Y - p.Y) * (v.Y - p.Y) * gWeight - + (v.Z - p.Z) * (v.Z - p.Z) * bWeight; - ; - } - - float SelectClosestDistance(Vector3 selector, Vector3 f0, Vector3 f1, Vector3 f2, Vector3 f3) - { - var d0 = Distance(selector, f0); - var d1 = Distance(selector, f1); - var d2 = Distance(selector, f2); - var d3 = Distance(selector, f3); - - if (d0 < d1 && d0 < d2 && d0 < d3) return d0; - if (d1 < d0 && d1 < d2 && d1 < d3) return d1; - if (d2 < d0 && d2 < d1 && d2 < d3) return d2; - else return d3; - } - - Vector3 endPoint0; - Vector3 endPoint1; - - double CalculateError() + for (var i = 0; i < colors.Length; i++) { - double cumulativeError = 0; - var ep0 = new Vector3(endPoint0.X / 31, endPoint0.Y / 63, endPoint0.Z / 31); - var ep1 = new Vector3(endPoint1.X / 31, endPoint1.Y / 63, endPoint1.Z / 31); - var ep2 = ep0 + (ep1 - ep0) * 1 / 3f; - var ep3 = ep0 + (ep1 - ep0) * 2 / 3f; - - for (var i = 0; i < length; i++) - { - double distance = SelectClosestDistance(vectorColors[i], ep0, ep1, ep2, ep3); - cumulativeError += distance; - } - return cumulativeError; - } + var colorVec = new Vector3(colors[i].r, colors[i].g, colors[i].b); - - for (var i = 0; i < vectorColors.Length; i++) - { - var d = ProjectPointOnLine(vectorColors[i], mean, principalAxis); + var v = colorVec - mean; + var d = Vector3.Dot(v, principalAxis); if (d < minD) minD = d; if (d > maxD) maxD = d; } - endPoint0 = mean + principalAxis * minD; - endPoint1 = mean + principalAxis * maxD; - - endPoint0 = new Vector3(MathF.Round(endPoint0.X * 31), MathF.Round(endPoint0.Y * 63), MathF.Round(endPoint0.Z * 31)); - endPoint1 = new Vector3(MathF.Round(endPoint1.X * 31), MathF.Round(endPoint1.Y * 63), MathF.Round(endPoint1.Z * 31)); - endPoint0 = Clamp565(endPoint0); - endPoint1 = Clamp565(endPoint1); - - var best = CalculateError(); - var increment = 5; - var foundBetter = true; - var rounds = 0; - // Variate color and look for better endpoints - while (increment > 1 || foundBetter) - { - rounds++; - foundBetter = false; - { // decrement ep0 - var prev = endPoint0; - endPoint0 -= principalAxis * increment * 2; - endPoint0 = Clamp565(endPoint0); - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0 = prev; - } - } - - { // decrement ep1 - var prev = endPoint1; - endPoint1 -= principalAxis * increment * 2; - endPoint1 = Clamp565(endPoint1); - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint1 = prev; - } - } - - { // increment ep0 - var prev = endPoint0; - endPoint0 += principalAxis * increment * 2; - endPoint0 = Clamp565(endPoint0); - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0 = prev; - } - } - - { // increment ep1 - var prev = endPoint1; - endPoint1 += principalAxis * increment * 2; - endPoint1 = Clamp565(endPoint1); - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint1 = prev; - } - } - - { // scaleUp - var prev0 = endPoint0; - var prev1 = endPoint1; - endPoint0 -= principalAxis * increment * 2; - endPoint1 += principalAxis * increment * 2; - endPoint0 = Clamp565(endPoint0); - endPoint1 = Clamp565(endPoint1); - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0 = prev0; - endPoint1 = prev1; - } - } - - { // scaleDown - var prev0 = endPoint0; - var prev1 = endPoint1; - endPoint0 += principalAxis * increment * 2; - endPoint1 -= principalAxis * increment * 2; - endPoint0 = Clamp565(endPoint0); - endPoint1 = Clamp565(endPoint1); - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0 = prev0; - endPoint1 = prev1; - } - } - - #region G - if (endPoint0.Y - increment >= 0) - { // decrement ep0 G - var prevY = endPoint0.Y; - endPoint0.Y -= increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0.Y = prevY; - } - } - - if (endPoint1.Y - increment >= 0) - { // decrement ep1 G - var prevY = endPoint1.Y; - endPoint1.Y -= increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint1.Y = prevY; - } - } - - if (foundBetter && increment > 1) - { - increment--; - } - - if (endPoint1.Y + increment <= 63) - { // increment ep1 G - var prevY = endPoint1.Y; - endPoint1.Y += increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint1.Y = prevY; - } - } - - if (endPoint0.Y + increment <= 63) - { // increment ep0 G - var prevY = endPoint0.Y; - endPoint0.Y += increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0.Y = prevY; - } - } - - #endregion - - #region R - if (endPoint0.X - increment >= 0) - { // decrement ep0 R - var prevX = endPoint0.X; - endPoint0.X -= increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0.X = prevX; - } - } - - if (endPoint1.X - increment >= 0) - { // decrement ep1 R - var prevX = endPoint1.X; - endPoint1.X -= increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint1.X = prevX; - } - } - - if (foundBetter && increment > 1) - { - increment--; - } - - if (endPoint1.X + increment <= 31) - { // increment ep1 R - var prevX = endPoint1.X; - endPoint1.X += increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint1.X = prevX; - } - } - - if (endPoint0.X + increment <= 31) - { // increment ep0 R - var prevX = endPoint0.X; - endPoint0.X += increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0.X = prevX; - } - } - #endregion - - #region B - - if (endPoint0.Z - increment >= 0) - { // decrement ep0 B - var prevZ = endPoint0.Z; - endPoint0.Z -= increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0.Z = prevZ; - } - } - - if (endPoint1.Z - increment >= 0) - { // decrement ep1 B - var prevZ = endPoint1.Z; - endPoint1.Z -= increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint1.Z = prevZ; - } - } - - if (foundBetter && increment > 1) - { - increment--; - } - - if (endPoint1.Z + increment <= 31) - { // increment ep1 B - var prevZ = endPoint1.Z; - endPoint1.Z += increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint1.Z = prevZ; - } - } - - if (endPoint0.Z + increment <= 31) - { // increment ep0 B - var prevZ = endPoint0.Z; - endPoint0.Z += increment; - var error = CalculateError(); - if (error < best) - { - foundBetter = true; - best = error; - } - else - { - endPoint0.Z = prevZ; - } - } - - #endregion - - endPoint0 = Clamp565(endPoint0); - endPoint1 = Clamp565(endPoint1); - - if (!foundBetter && increment > 1) - { - increment--; - } - } - - min = new ColorRgb565(); - min.RawR = (int)endPoint0.X; - min.RawG = (int)endPoint0.Y; - min.RawB = (int)endPoint0.Z; + minD *= 15 / 16f; + maxD *= 15 / 16f; - max = new ColorRgb565(); - max.RawR = (int)endPoint1.X; - max.RawG = (int)endPoint1.Y; - max.RawB = (int)endPoint1.Z; + min = mean + principalAxis * minD; + max = mean + principalAxis * maxD; } - private static float ProjectPointOnLine(Vector3 point, Vector3 linePoint, Vector3 lineDir) - { - var v = point - linePoint; - var d = Vector3.Dot(v, lineDir); - return d; - } } } diff --git a/BCnEnc.Net/Shared/RawBlocks.cs b/BCnEnc.Net/Shared/RawBlocks.cs index 98fbefb..c78e5d8 100644 --- a/BCnEnc.Net/Shared/RawBlocks.cs +++ b/BCnEnc.Net/Shared/RawBlocks.cs @@ -1,5 +1,6 @@ using System; using System.Runtime.InteropServices; +using BCnEncoder.Encoder.Bptc; namespace BCnEncoder.Shared { @@ -10,6 +11,15 @@ public struct RawBlock4X4Rgba32 public ColorRgba32 p01, p11, p21, p31; public ColorRgba32 p02, p12, p22, p32; public ColorRgba32 p03, p13, p23, p33; + + public RawBlock4X4Rgba32(ColorRgba32 fillColor) + { + p00 = p01 = p02 = p03 = + p10 = p11 = p12 = p13 = + p20 = p21 = p22 = p23 = + p30 = p31 = p32 = p33 = fillColor; + } + public Span AsSpan => MemoryMarshal.CreateSpan(ref p00, 16); public ColorRgba32 this[int x, int y] @@ -132,6 +142,136 @@ public bool HasTransparentPixels() } } + public struct RawBlock4X4RgbFloat + { + public ColorRgbFloat p00, p10, p20, p30; + public ColorRgbFloat p01, p11, p21, p31; + public ColorRgbFloat p02, p12, p22, p32; + public ColorRgbFloat p03, p13, p23, p33; + + public RawBlock4X4RgbFloat(ColorRgbFloat fillColor) + { + p00 = p01 = p02 = p03 = + p10 = p11 = p12 = p13 = + p20 = p21 = p22 = p23 = + p30 = p31 = p32 = p33 = fillColor; + } + + public Span AsSpan => MemoryMarshal.CreateSpan(ref p00, 16); + + public ColorRgbFloat this[int x, int y] + { + get => AsSpan[x + y * 4]; + set => AsSpan[x + y * 4] = value; + } + + public ColorRgbFloat this[int index] + { + get => AsSpan[index]; + set => AsSpan[index] = value; + } + + internal float CalculateError(RawBlock4X4RgbFloat other) + { + float error = 0; + var pix1 = AsSpan; + var pix2 = other.AsSpan; + for (var i = 0; i < pix1.Length; i++) + { + var col1 = pix1[i]; + var col2 = pix2[i]; + + var re = Math.Sign(col1.r) * MathF.Log( 1 + MathF.Abs(col1.r)) - Math.Sign(col2.r) * MathF.Log( 1 + MathF.Abs(col2.r)); + var ge = Math.Sign(col1.g) * MathF.Log( 1 + MathF.Abs(col1.g)) - Math.Sign(col2.g) * MathF.Log( 1 + MathF.Abs(col2.g)); + var be = Math.Sign(col1.b) * MathF.Log( 1 + MathF.Abs(col1.b)) - Math.Sign(col2.b) * MathF.Log( 1 + MathF.Abs(col2.b)); + + error += re * re; + error += ge * ge; + error += be * be; + + } + + error /= pix1.Length * 3; + error = MathF.Sqrt(error); + + return error; + } + + internal float CalculateYCbCrError(RawBlock4X4RgbFloat other) + { + float yError = 0; + float cbError = 0; + float crError = 0; + var pix1 = AsSpan; + var pix2 = other.AsSpan; + for (var i = 0; i < pix1.Length; i++) + { + var col1 = new ColorYCbCr(pix1[i]); + var col2 = new ColorYCbCr(pix2[i]); + + var ye = col1.y - col2.y; + var cbe = col1.cb - col2.cb; + var cre = col1.cr - col2.cr; + + yError += ye * ye; + cbError += cbe * cbe; + crError += cre * cre; + } + + var error = yError * 2 + cbError / 2 + crError / 2; + + return error; + } + + + internal RawBlock4X4Ycbcr ToRawBlockYcbcr() + { + var rawYcbcr = new RawBlock4X4Ycbcr(); + var pixels = AsSpan; + var ycbcrPs = rawYcbcr.AsSpan; + for (var i = 0; i < pixels.Length; i++) + { + ycbcrPs[i] = new ColorYCbCr(pixels[i]); + } + return rawYcbcr; + } + } + + //Used for Bc6H + internal struct RawBlock4X4RgbHalfInt + { + public (int, int, int) p00, p10, p20, p30; + public (int, int, int) p01, p11, p21, p31; + public (int, int, int) p02, p12, p22, p32; + public (int, int, int) p03, p13, p23, p33; + public Span<(int, int, int)> AsSpan => MemoryMarshal.CreateSpan(ref p00, 16); + + public (int, int, int) this[int x, int y] + { + get => AsSpan[x + y * 4]; + set => AsSpan[x + y * 4] = value; + } + + public (int, int, int) this[int index] + { + get => AsSpan[index]; + set => AsSpan[index] = value; + } + + public static RawBlock4X4RgbHalfInt FromRawFloats(RawBlock4X4RgbFloat other, bool signed) + { + var output = new RawBlock4X4RgbHalfInt(); + var span = output.AsSpan; + var floats = other.AsSpan; + for (var i = 0; i < 16; i++) + { + span[i] = Bc6EncodingHelpers.PreQuantizeRawEndpoint(floats[i], signed); + } + return output; + } + + } + internal struct RawBlock4X4Ycbcr { diff --git a/BCnEnc.Net/Shared/RgbBoundingBox.cs b/BCnEnc.Net/Shared/RgbBoundingBox.cs index 878b503..b6b2f44 100644 --- a/BCnEnc.Net/Shared/RgbBoundingBox.cs +++ b/BCnEnc.Net/Shared/RgbBoundingBox.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; namespace BCnEncoder.Shared { @@ -197,5 +198,80 @@ public static void Create565A(ReadOnlySpan colors, out ColorRgb565 minAlpha = (byte)minA; maxAlpha = (byte)maxA; } + + /// + /// Hdr rgb bounding box inset by Krzysztof Narkowicz. https://github.com/knarkowicz/GPURealTimeBC6H + /// Code is public domain. + /// + private static void InsetHdrChannel(ReadOnlySpan colors, int channel, ref float blockMax, ref float blockMin) + { + var offset = 0f; + if (blockMin < 0) + { + offset = -blockMin; + blockMin += offset; + blockMax += offset; + } + + float Select(ReadOnlySpan span, int i) + { + return span[i * 3 + channel] + offset; + } + + var floats = MemoryMarshal.Cast(colors); + + var refinedBlockMin = blockMax; + var refinedBlockMax = blockMin; + + for (var i = 0; i < 16; ++i) + { + refinedBlockMin = MathF.Min(refinedBlockMin, Select(floats, i) == blockMin ? refinedBlockMin : Select(floats, i)); + refinedBlockMax = MathF.Max(refinedBlockMax, Select(floats, i) == blockMax ? refinedBlockMax : Select(floats, i)); + } + + var logRefinedBlockMax = MathF.Log(refinedBlockMax + 1.0f, 2); + var logRefinedBlockMin = MathF.Log(refinedBlockMin + 1.0f, 2); + + var logBlockMax = MathF.Log(blockMax + 1.0f, 2); + var logBlockMin = MathF.Log(blockMin + 1.0f, 2); + var logBlockMaxExt = (logBlockMax - logBlockMin) * (1.0f / 32.0f); + + logBlockMin += MathF.Min(logRefinedBlockMin - logBlockMin, logBlockMaxExt); + logBlockMax -= MathF.Min(logBlockMax - logRefinedBlockMax, logBlockMaxExt); + + blockMin = MathF.Pow(2, logBlockMin) - 1.0f - offset; + blockMax = MathF.Pow(2, logBlockMax) - 1.0f - offset; + } + + public static void CreateFloat(ReadOnlySpan colors, out ColorRgbFloat min, out ColorRgbFloat max) + { + + float minR = float.MaxValue, + minG = float.MaxValue, + minB = float.MaxValue; + float maxR = float.MinValue, + maxG = float.MinValue, + maxB = float.MinValue; + + for (var i = 0; i < colors.Length; i++) + { + var c = colors[i]; + + if (c.r < minR) minR = c.r; + if (c.g < minG) minG = c.g; + if (c.b < minB) minB = c.b; + + if (c.r > maxR) maxR = c.r; + if (c.g > maxG) maxG = c.g; + if (c.b > maxB) maxB = c.b; + } + + InsetHdrChannel(colors, 0, ref maxR, ref minR); + InsetHdrChannel(colors, 1, ref maxG, ref minG); + InsetHdrChannel(colors, 2, ref maxB, ref minB); + + min = new ColorRgbFloat(minR, minG, minB); + max = new ColorRgbFloat(maxR, maxG, maxB); + } } } diff --git a/BCnEncTests/Bc6EncoderTests.cs b/BCnEncTests/Bc6EncoderTests.cs new file mode 100644 index 0000000..ae389b2 --- /dev/null +++ b/BCnEncTests/Bc6EncoderTests.cs @@ -0,0 +1,405 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using BCnEncoder.Encoder; +using BCnEncoder.Encoder.Bptc; +using BCnEncoder.Shared; +using BCnEncTests.Support; +using Microsoft.Toolkit.HighPerformance; +using Xunit; +using Xunit.Abstractions; + +namespace BCnEncTests +{ + public class Bc6EncoderTests + { + private ITestOutputHelper output; + + public Bc6EncoderTests(ITestOutputHelper output) => this.output = output; + + [Theory] + [InlineData(0x7F, 8, false)] + [InlineData(0xFF, 8, false)] + [InlineData(0x7F, 8, true)] + [InlineData(0xFF, 8, true)] + [InlineData(0b111_1100_1101, 11, true)] + [InlineData(0b111_1100_1101, 11, false)] + [InlineData(0b011_1100_1101, 11, true)] + [InlineData(0b011_1100_1101, 11, false)] + [InlineData(0b0_1001, 5, true)] + [InlineData(0b0_1001, 5, false)] + [InlineData(0b1_1100, 5, true)] + [InlineData(0b1_1100, 5, false)] + public void Quantize(int initialQuantizedValue, int endpointBits, bool signed) + { + if (signed) + { + initialQuantizedValue = IntHelper.SignExtend(initialQuantizedValue, endpointBits); + } + var unquantized = Bc6Block.UnQuantize(initialQuantizedValue, endpointBits, signed); + var finishedUnquantized = Bc6Block.FinishUnQuantize(unquantized, signed); + + var prequantized = Bc6EncodingHelpers.PreQuantize(finishedUnquantized, signed); + var quantized = Bc6EncodingHelpers.Quantize(prequantized, endpointBits, signed); + + Assert.InRange(prequantized, unquantized - 2, unquantized + 2); + Assert.InRange(quantized, initialQuantizedValue - 1, initialQuantizedValue + 1); + } + + [Fact] + public void PreQuantizeRawEndpoint() + { + var ep0 = new ColorRgbFloat(1, 0.001f, 0.2f); + + var preQuantized = Bc6EncodingHelpers.PreQuantizeRawEndpoint(ep0, false); + var unQu = Bc6Block.FinishUnQuantize(preQuantized, false); + + Assert.InRange(unQu.Item1, ep0.r - 0.001f, ep0.r + 0.001f); + Assert.InRange(unQu.Item2, ep0.g - 0.001f, ep0.g + 0.001f); + Assert.InRange(unQu.Item3, ep0.b - 0.001f, ep0.b + 0.001f); + } + + [Fact] + public void RgbBoundingBox() + { + var testBlock = new RawBlock4X4RgbFloat() + { + p00 = new ColorRgbFloat(0.01f, -0.05f, 0.02f), + p01 = new ColorRgbFloat(0.02f, 0.02f, 0.03f), + p02 = new ColorRgbFloat(0.02f, 0.02f, 0.02f), + p03 = new ColorRgbFloat(0.01f, 0.02f, 0.02f), + p10 = new ColorRgbFloat(0.02f, 0.02f, 0.02f), + p11 = new ColorRgbFloat(0.045f, 0.02f, 0.02f), + p12 = new ColorRgbFloat(0.04f, 0.02f, 0.02f), + p13 = new ColorRgbFloat(0.04f, 0.02f, 0.02f), + p20 = new ColorRgbFloat(0.21f, 0.02f, 0.02f), + p21 = new ColorRgbFloat(0.01f, 0.02f, 0.02f), + p22 = new ColorRgbFloat(0.01f, 0.32f, 0.02f), + p23 = new ColorRgbFloat(1.01f, 0.22f, 0.02f), + p30 = new ColorRgbFloat(0.01f, 0.12f, 0.02f), + p31 = new ColorRgbFloat(0.01f, 0.02f, 0.02f), + p32 = new ColorRgbFloat(0.01f, 0.62f, 0.7f), + p33 = new ColorRgbFloat(0.01f, 0.02f, 0.02f) + }; + + BCnEncoder.Shared.RgbBoundingBox.CreateFloat(testBlock.AsSpan, out var min, out var max); + + Assert.InRange(min.r, 0.01, 0.02); + Assert.InRange(min.g, -0.05, -0.03); + Assert.InRange(min.b, 0.02, 0.03); + + Assert.InRange(max.r, 0.9, 1.01); + Assert.InRange(max.g, 0.59, 0.62); + Assert.InRange(max.b, 0.60, 0.7); + } + + + [Fact] + public void PackMode3() + { + const int endpointPrecision = 10; + var random = new Random(); + var rand = random.Next(); + + var ep0 = (random.Next() & (1 << endpointPrecision) - 1, + random.Next() & (1 << endpointPrecision) - 1, + random.Next() & (1 << endpointPrecision) - 1); + var ep1 = (random.Next() & (1 << endpointPrecision) - 1, + random.Next() & (1 << endpointPrecision) - 1, + random.Next() & (1 << endpointPrecision) - 1); + + var indices = new byte[16]; + for (var i = 1; i < indices.Length; i++) + { + indices[i] = (byte) random.Next(1 << 4); + } + + var block = Bc6Block.PackType3(ep0, ep1, indices); + + Assert.Equal(Bc6BlockType.Type3, block.Type); + + var extracted0 = block.ExtractEp0(); + var extracted1 = block.ExtractEp1(); + + Assert.Equal(ep0, extracted0); + Assert.Equal(ep1, extracted1); + + for (var i = 0; i < indices.Length; i++) + { + var idx = block.GetColorIndex(1, 0, 4, i); + Assert.Equal(indices[i], idx); + } + } + + + [Theory] + [InlineData(Bc6BlockType.Type0)] + [InlineData(Bc6BlockType.Type1)] + [InlineData(Bc6BlockType.Type2)] + [InlineData(Bc6BlockType.Type6)] + [InlineData(Bc6BlockType.Type10)] + [InlineData(Bc6BlockType.Type14)] + [InlineData(Bc6BlockType.Type18)] + [InlineData(Bc6BlockType.Type22)] + [InlineData(Bc6BlockType.Type26)] + [InlineData(Bc6BlockType.Type30)] + [InlineData(Bc6BlockType.Type3)] + [InlineData(Bc6BlockType.Type7)] + [InlineData(Bc6BlockType.Type11)] + //[InlineData(Bc6BlockType.Type15)] //deltabits too small to encode the testblock + internal void EncodeAllModesUnsigned(Bc6BlockType type) + { + var testBlock = new RawBlock4X4RgbFloat() + { + p00 = new ColorRgbFloat(1.011f, 10.01f, 2.01f), + p01 = new ColorRgbFloat(1.01f, 10.014f, 2.012f), + p02 = new ColorRgbFloat(1.005f, 10.012f, 2.02f), + p03 = new ColorRgbFloat(1.01f, 10.013f, 2.023f), + p10 = new ColorRgbFloat(1.011f, 10.01f, 2.01f), + p11 = new ColorRgbFloat(1.01f, 10.014f, 2.012f), + p12 = new ColorRgbFloat(1.005f, 10.012f, 2.02f), + p13 = new ColorRgbFloat(1.01f, 10.013f, 2.023f), + p20 = new ColorRgbFloat(1.011f, 10.01f, 2.01f), + p21 = new ColorRgbFloat(1.01f, 10.014f, 2.012f), + p22 = new ColorRgbFloat(1.005f, 10.012f, 2.02f), + p23 = new ColorRgbFloat(1.01f, 10.013f, 2.023f), + p30 = new ColorRgbFloat(1.011f, 10.01f, 2.01f), + p31 = new ColorRgbFloat(1.01f, 10.014f, 2.012f), + p32 = new ColorRgbFloat(1.005f, 10.012f, 2.02f), + p33 = new ColorRgbFloat(1.01f, 10.013f, 2.023f) + }; + Bc6Block encoded; + var badTransform = false; + + if(type.HasSubsets()) + { + var indexBlock = Bc6Encoder.CreateClusterIndexBlock(testBlock, out var numClusters, 2); + var best2SubsetPartitions = BptcEncodingHelpers.Rank2SubsetPartitions(indexBlock, numClusters, true); + + var bestPartition = best2SubsetPartitions[0]; + + Bc6EncodingHelpers.GetInitialUnscaledEndpointsForSubset(testBlock, out var ep0, out var ep1, bestPartition, 0); + Bc6EncodingHelpers.GetInitialUnscaledEndpointsForSubset(testBlock, out var ep2, out var ep3, bestPartition, 1); + + encoded = Bc6ModeEncoder.EncodeBlock2Sub(type, testBlock, ep0, ep1, ep2, ep3, bestPartition, + false, out badTransform); + } + else + { + BCnEncoder.Shared.RgbBoundingBox.CreateFloat(testBlock.AsSpan, out var min, out var max); + encoded = Bc6ModeEncoder.EncodeBlock1Sub(type, testBlock, min, max, false, + out badTransform); + } + + Assert.False(badTransform); + Assert.Equal(type, encoded.Type); + var decoded = encoded.Decode(false); + var error = testBlock.CalculateError(decoded); + Assert.InRange(error, 0, 0.3); + } + + [Theory] + [InlineData(Bc6BlockType.Type0)] + [InlineData(Bc6BlockType.Type1)] + [InlineData(Bc6BlockType.Type2)] + [InlineData(Bc6BlockType.Type6)] + [InlineData(Bc6BlockType.Type10)] + [InlineData(Bc6BlockType.Type14)] + [InlineData(Bc6BlockType.Type18)] + [InlineData(Bc6BlockType.Type22)] + [InlineData(Bc6BlockType.Type26)] + [InlineData(Bc6BlockType.Type30)] + [InlineData(Bc6BlockType.Type3)] + [InlineData(Bc6BlockType.Type7)] + [InlineData(Bc6BlockType.Type11)] + [InlineData(Bc6BlockType.Type15)] + internal void EncodeAllModesSigned(Bc6BlockType type) + { + var testBlock = new RawBlock4X4RgbFloat() + { + p00 = new ColorRgbFloat(-1.011f, 10.01f, 2.01f), + p01 = new ColorRgbFloat(-1.01f, 10.014f, 2.012f), + p02 = new ColorRgbFloat(-1.005f, 10.012f, 2.02f), + p03 = new ColorRgbFloat(-1.01f, 10.013f, 2.023f), + p10 = new ColorRgbFloat(-1.011f, 10.01f, 2.01f), + p11 = new ColorRgbFloat(-1.01f, 10.014f, 2.012f), + p12 = new ColorRgbFloat(-1.005f, 10.012f, 2.02f), + p13 = new ColorRgbFloat(-1.01f, 10.013f, 2.023f), + p20 = new ColorRgbFloat(-1.011f, 10.01f, 2.01f), + p21 = new ColorRgbFloat(-1.01f, 10.014f, 2.012f), + p22 = new ColorRgbFloat(-1.005f, 10.012f, 2.02f), + p23 = new ColorRgbFloat(-1.01f, 10.013f, 2.023f), + p30 = new ColorRgbFloat(-1.011f, 10.01f, 2.01f), + p31 = new ColorRgbFloat(-1.01f, 10.014f, 2.012f), + p32 = new ColorRgbFloat(-1.005f, 10.012f, 2.02f), + p33 = new ColorRgbFloat(-1.01f, 10.013f, 2.023f) + }; + Bc6Block encoded; + var badTransform = false; + + if (type.HasSubsets()) + { + var indexBlock = Bc6Encoder.CreateClusterIndexBlock(testBlock, out var numClusters, 2); + var best2SubsetPartitions = BptcEncodingHelpers.Rank2SubsetPartitions(indexBlock, numClusters, true); + + var bestPartition = best2SubsetPartitions[0]; + + Bc6EncodingHelpers.GetInitialUnscaledEndpointsForSubset(testBlock, out var ep0, out var ep1, bestPartition, 0); + Bc6EncodingHelpers.GetInitialUnscaledEndpointsForSubset(testBlock, out var ep2, out var ep3, bestPartition, 1); + + encoded = Bc6ModeEncoder.EncodeBlock2Sub(type, testBlock, ep0, ep1, ep2, ep3, bestPartition, + true, out badTransform); + } + else + { + BCnEncoder.Shared.RgbBoundingBox.CreateFloat(testBlock.AsSpan, out var min, out var max); + encoded = Bc6ModeEncoder.EncodeBlock1Sub(type, testBlock, min, max, true, + out badTransform); + } + + Assert.False(badTransform); + Assert.Equal(type, encoded.Type); + var decoded = encoded.Decode(true); + var error = testBlock.CalculateError(decoded); + Assert.InRange(error, 0, 0.5); + } + + [Fact] + public void Encode() + { + var signed = true; + var image = HdrLoader.TestHdrKiara; + var blocks = ImageToBlocks.ImageTo4X4(image.pixels.AsMemory().AsMemory2D(image.height, image.width), out var bW, out var bH); + + for (var i = 0; i < blocks.Length; i++) + { + var encoded = Bc6Encoder.Bc6EncoderBalanced.EncodeBlock(blocks[i], signed); + var decoded = encoded.Decode(signed); + + var error = decoded.CalculateError(blocks[i]); + if (error > 0.06 || i == 14749) + { + Debugger.Break(); + encoded = Bc6Encoder.Bc6EncoderBalanced.EncodeBlock(blocks[i], signed); + } + } + } + + [Fact] + public void EncodeFast() + { + TestHelper.ExecuteHdrEncodingTest(HdrLoader.TestHdrKiara, CompressionFormat.Bc6U, CompressionQuality.Fast, + "encoding_bc6_kiara_fast.ktx", output); + } + + [Fact] + public void EncodeBalanced() + { + TestHelper.ExecuteHdrEncodingTest(HdrLoader.TestHdrKiara, CompressionFormat.Bc6U, CompressionQuality.Balanced, + "encoding_bc6_kiara_balanced.ktx", output); + } + + [Fact] + public void EncodeBestQuality() + { + TestHelper.ExecuteHdrEncodingTest(HdrLoader.TestHdrKiara, CompressionFormat.Bc6U, CompressionQuality.BestQuality, + "encoding_bc6_kiara_bestquality.ktx", output); + } + + [Fact] + public void EncodeProbeFast() + { + TestHelper.ExecuteHdrEncodingTest(HdrLoader.TestHdrProbe, CompressionFormat.Bc6U, CompressionQuality.Fast, + "encoding_bc6_probe_fast.ktx", output); + } + + [Fact] + public void EncodeProbeBalanced() + { + TestHelper.ExecuteHdrEncodingTest(HdrLoader.TestHdrProbe, CompressionFormat.Bc6U, CompressionQuality.Balanced, + "encoding_bc6_probe_balanced.ktx", output); + } + + [Fact] + public void EncodeProbeBestQuality() + { + TestHelper.ExecuteHdrEncodingTest(HdrLoader.TestHdrProbe, CompressionFormat.Bc6U, CompressionQuality.BestQuality, + "encoding_bc6_probe_bestquality.ktx", output); + } + + [Fact] + public void EncodeProbeSignedFast() + { + TestHelper.ExecuteHdrEncodingTest(HdrLoader.TestHdrProbe, CompressionFormat.Bc6S, CompressionQuality.Fast, + "encoding_bc6_probe_signed_fast.ktx", output); + } + + [Fact] + public void EncodeProbSignedBalanced() + { + TestHelper.ExecuteHdrEncodingTest(HdrLoader.TestHdrProbe, CompressionFormat.Bc6S, CompressionQuality.Balanced, + "encoding_bc6_probe_signed_balanced.ktx", output); + } + + [Fact] + public void EncodeProbeSignedBestQuality() + { + TestHelper.ExecuteHdrEncodingTest(HdrLoader.TestHdrProbe, CompressionFormat.Bc6S, CompressionQuality.BestQuality, + "encoding_bc6_probe_signed_bestquality.ktx", output); + } + + [Fact] + public void EncodeToKtx() + { + var encoder = new BcEncoder(); + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc6U; + + var ktx = encoder.EncodeToKtxHdr(HdrLoader.TestHdrKiara.PixelMemory); + + using var fs = File.OpenWrite("encoding_bc6_ktx.ktx"); + ktx.Write(fs); + } + + [Fact] + public void EncodeToDds() + { + var encoder = new BcEncoder(); + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc6U; + + var dds = encoder.EncodeToDdsHdr(HdrLoader.TestHdrKiara.PixelMemory); + + using var fs = File.OpenWrite("encoding_bc6_dds.dds"); + dds.Write(fs); + } + + [Fact] + public void EncodeToRaw() + { + var encoder = new BcEncoder(); + encoder.OutputOptions.Quality = CompressionQuality.Fast; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = CompressionFormat.Bc6U; + + var ktx = encoder.EncodeToKtxHdr(HdrLoader.TestHdrKiara.PixelMemory); + + var allMips = encoder.EncodeToRawBytesHdr(HdrLoader.TestHdrKiara.PixelMemory); + + Assert.True(allMips.Length > 1); + Assert.True(allMips.Length == ktx.MipMaps.Count); + + for (var i = 0; i < allMips.Length; i++) + { + var single = encoder.EncodeToRawBytesHdr(HdrLoader.TestHdrKiara.PixelMemory, i, out var mW, out var mH); + + Assert.Equal(ktx.MipMaps[i].Faces[0].Data, single); + Assert.Equal(allMips[i], single); + } + } + } +} diff --git a/BCnEncTests/Bc6HDecoderTests.cs b/BCnEncTests/Bc6HDecoderTests.cs new file mode 100644 index 0000000..0dd604d --- /dev/null +++ b/BCnEncTests/Bc6HDecoderTests.cs @@ -0,0 +1,176 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using BCnEncoder.Decoder; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using BCnEncTests.Support; +using Microsoft.Toolkit.HighPerformance; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; +using Xunit.Abstractions; + +namespace BCnEncTests +{ + public class Bc6HDecoderTests + { + private ITestOutputHelper output; + + public Bc6HDecoderTests(ITestOutputHelper output) => this.output = output; + + [Fact] + public void DecodeDds() + { + var decoder = new BcDecoder(); + var decoded = decoder.DecodeHdr(HdrLoader.TestHdrKiaraDds); + + var img = new Image((int)HdrLoader.TestHdrKiaraDds.header.dwWidth, + (int)HdrLoader.TestHdrKiaraDds.header.dwHeight); + + img.TryGetSinglePixelSpan(out var pixels); + + for (var i = 0; i < decoded.Length; i++) + { + pixels[i] = new RgbaVector(decoded[i].r, decoded[i].g, decoded[i].b); + } + + var hdr = new HdrImage((int) HdrLoader.TestHdrKiaraDds.header.dwWidth, + (int) HdrLoader.TestHdrKiaraDds.header.dwHeight); + + Assert.Equal(hdr.pixels.Length, decoded.Length); + + hdr.pixels = decoded; + using var sfs = File.OpenWrite("decoding_test_dds_bc6h.hdr"); + hdr.Write(sfs); + + img.SaveAsPng("decoding_test_dds_bc6h.png"); + + TestHelper.AssertPixelsEqual(HdrLoader.TestHdrKiara.pixels, decoded, CompressionQuality.Fast, output); + } + + [Fact] + public void DecodeKtx() + { + var decoder = new BcDecoder(); + var decoded = decoder.DecodeHdr(HdrLoader.TestHdrKiaraKtx); + + var img = new Image((int)HdrLoader.TestHdrKiaraKtx.header.PixelWidth, + (int)HdrLoader.TestHdrKiaraKtx.header.PixelHeight); + + img.TryGetSinglePixelSpan(out var pixels); + + for (var i = 0; i < decoded.Length; i++) + { + pixels[i] = new RgbaVector(decoded[i].r, decoded[i].g, decoded[i].b); + } + + var hdr = new HdrImage((int)HdrLoader.TestHdrKiaraKtx.header.PixelWidth, + (int)HdrLoader.TestHdrKiaraKtx.header.PixelHeight); + + Assert.Equal(hdr.pixels.Length, decoded.Length); + + hdr.pixels = decoded; + using var sfs = File.OpenWrite("decoding_test_ktx_bc6h.hdr"); + hdr.Write(sfs); + + img.SaveAsPng("decoding_test_ktx_bc6h.png"); + + TestHelper.AssertPixelsEqual(HdrLoader.TestHdrKiara.pixels, decoded, CompressionQuality.BestQuality, output); + } + + // TestHdrKiaraDds includes some blocks with all modes. + // The test_hdr_kiara_dds_float16_data.bin file contains Half-float values decoded with a reference decoder. + // This test ensures that decoding is bit-exact. + [Fact] + public void AllBlocksDecodesExact() + { + var decoder = new BcDecoder(); + var decoded = decoder.DecodeHdr(HdrLoader.TestHdrKiaraDds); + + using var fs = File.OpenRead("../../../testImages/test_hdr_kiara_dds_float16_data.bin"); + using var ms = new MemoryStream(); + fs.CopyTo(ms); + var length = (int)ms.Position; + + var bytes = ms.GetBuffer().AsSpan(0, length); + var halfs = MemoryMarshal.Cast(bytes); + Assert.Equal(halfs.Length / 4, decoded.Length); + + for (var i = 0; i < decoded.Length; i++) + { + float r = halfs[i * 4 + 0]; + float g = halfs[i * 4 + 1]; + float b = halfs[i * 4 + 2]; + + Assert.Equal(r, decoded[i].r); + Assert.Equal(g, decoded[i].g); + Assert.Equal(b, decoded[i].b); + } + } + + // Test that above statement holds true. And that modes are recognized correctly + [Fact] + public void DecodeModes() + { + var modes = new int[31]; + + var hdr = HdrLoader.TestHdrKiaraDds; + + var bytes = hdr.Faces[0].MipMaps[0].Data; + var blocks = MemoryMarshal.Cast(bytes); + + for (var i = 0; i < blocks.Length; i++) + { + var block = blocks[i]; + var mode = block.Type; + modes[(int) mode]++; + } + + for (var i = 0; i < modes.Length; i++) + { + output.WriteLine($"Mode {i}: {modes[i]}"); + } + + Assert.True(modes[0] > 0); + Assert.True(modes[1] > 0); + Assert.True(modes[2] > 0); + Assert.True(modes[6] > 0); + Assert.True(modes[10] > 0); + Assert.True(modes[14] > 0); + Assert.True(modes[18] > 0); + Assert.True(modes[22] > 0); + Assert.True(modes[26] > 0); + Assert.True(modes[30] > 0); + Assert.True(modes[3] > 0); + Assert.True(modes[7] > 0); + Assert.True(modes[11] > 0); + Assert.True(modes[15] > 0); + } + + [Fact] + public void DecodeErrorBlock() + { + var decoder = new BcDecoder(); + + var width = 16; + var height = 16; + var bufferSize = decoder.GetBlockSize(CompressionFormat.Bc6U) * width * height; + + var buffer = new byte[bufferSize]; + Random r = new Random(44); + r.NextBytes(buffer); + + var decoded = decoder.DecodeRawHdr(buffer, width * 4, height * 4, CompressionFormat.Bc6U); + Assert.Contains(new ColorRgbFloat(1, 0, 1), decoded); + + HdrImage image = new HdrImage(new Span2D(decoded, height * 4, width * 4)); + using var fs = File.OpenWrite("test_decode_bc6h_error.hdr"); + image.Write(fs); + } + + } +} diff --git a/BCnEncTests/Bc7BlockTests.cs b/BCnEncTests/Bc7BlockTests.cs index 40900b9..c05fdc6 100644 --- a/BCnEncTests/Bc7BlockTests.cs +++ b/BCnEncTests/Bc7BlockTests.cs @@ -2,8 +2,11 @@ using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using BCnEncoder.Decoder; +using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; +using SixLabors.ImageSharp; using Xunit; namespace BCnEncTests @@ -66,6 +69,27 @@ public void PackTypes() output.Write(fs); } + [Fact] + public void DecodeErrorBlock() + { + var decoder = new BcDecoder(); + + var width = 32; + var height = 32; + var bufferSize = decoder.GetBlockSize(CompressionFormat.Bc7) * width * height; + + var buffer = new byte[bufferSize]; + Random r = new Random(50); + r.NextBytes(buffer); + + var pixels = decoder.DecodeRaw(buffer, width * 4, height * 4, CompressionFormat.Bc7); + var decoded = decoder.DecodeRawToImageRgba32(buffer, width * 4, height * 4, CompressionFormat.Bc7); + Assert.Contains(new ColorRgba32(255, 0, 255), pixels); + + using var fs = File.OpenWrite("test_decode_bc7_error.png"); + decoded.SaveAsPng(fs); + } + #region Type Packs private void Type0Pack(Span output) diff --git a/BCnEncTests/ClusterTests.cs b/BCnEncTests/ClusterTests.cs index 80c8420..ee175ea 100644 --- a/BCnEncTests/ClusterTests.cs +++ b/BCnEncTests/ClusterTests.cs @@ -14,7 +14,7 @@ public class ClusterTests [Fact] public void Clusterize() { - var testImage = ImageLoader.TestBlur1; + var testImage = ImageLoader.TestBlur1.Clone(); if (!testImage.TryGetSinglePixelSpan(out var pix)) { @@ -43,6 +43,7 @@ public void Clusterize() for (var i = 0; i < pixels.Length; i++) { pixels[i] = pixC[clusters[i]].ToColorRgba32(); + pix[i] = new Rgba32(pixels[i].r, pixels[i].g, pixels[i].b, pixels[i].a); } using var fs = File.OpenWrite("test_cluster.png"); diff --git a/BCnEncTests/EncodeByteOrderTests.cs b/BCnEncTests/EncodeByteOrderTests.cs index c05a547..928fbc9 100644 --- a/BCnEncTests/EncodeByteOrderTests.cs +++ b/BCnEncTests/EncodeByteOrderTests.cs @@ -36,7 +36,7 @@ private void EncodeByteOrderTest(PixelFormat pixelFormat) where T : unmanaged var decoded = decoder.DecodeToImageRgba32(ms); - bool hasNoAlpha = pixelFormat == PixelFormat.Rgb24 || pixelFormat == PixelFormat.Bgr24; + var hasNoAlpha = pixelFormat == PixelFormat.Rgb24 || pixelFormat == PixelFormat.Bgr24; TestHelper.AssertImagesEqual(imageOrig, decoded, encoder.OutputOptions.Quality, !hasNoAlpha); diff --git a/BCnEncTests/Examples.cs b/BCnEncTests/Examples.cs index 18e5d50..b3103bd 100644 --- a/BCnEncTests/Examples.cs +++ b/BCnEncTests/Examples.cs @@ -6,6 +6,7 @@ using BCnEncoder.Encoder; using BCnEncoder.ImageSharp; using BCnEncoder.Shared; +using Microsoft.Toolkit.HighPerformance; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using Xunit; @@ -40,5 +41,34 @@ public void DecodeImageSharp() using FileStream outFs = File.OpenWrite("decoding_test_bc1.png"); image.SaveAsPng(outFs); } + + public void EncodeHdr() + { + HdrImage image = HdrImage.Read("example.hdr"); + + + BcEncoder encoder = new BcEncoder(); + + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Quality = CompressionQuality.Balanced; + encoder.OutputOptions.Format = CompressionFormat.Bc6U; + encoder.OutputOptions.FileFormat = OutputFileFormat.Ktx; //Change to Dds for a dds file. + + using FileStream fs = File.OpenWrite("example.ktx"); + encoder.EncodeToStreamHdr(image.PixelMemory, fs); + } + + public void DecodeHdr() + { + using FileStream fs = File.OpenRead("compressed_bc6.ktx"); + + BcDecoder decoder = new BcDecoder(); + Memory2D pixels = decoder.DecodeHdr2D(fs); + + HdrImage image = new HdrImage(pixels.Span); + + using FileStream outFs = File.OpenWrite("decoded.hdr"); + image.Write(outFs); + } } } diff --git a/BCnEncTests/HdrImageTests.cs b/BCnEncTests/HdrImageTests.cs new file mode 100644 index 0000000..79875f8 --- /dev/null +++ b/BCnEncTests/HdrImageTests.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using BCnEncoder.Encoder; +using BCnEncoder.Shared; +using BCnEncTests.Support; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; + +namespace BCnEncTests +{ + public class HdrImageTests + { + [Fact] + public void LoadHdr() + { + using var stream = File.OpenRead("../../../testImages/test_hdr_kiara.hdr"); + var hdrImg = HdrImage.Read(stream); + Assert.True(hdrImg.width > 0); + Assert.True(hdrImg.height > 0); + Assert.True(hdrImg.pixels.Length == hdrImg.width * hdrImg.height); + + var img = new Image(hdrImg.width, hdrImg.height); + + img.TryGetSinglePixelSpan(out var pixels); + + for (var i = 0; i < hdrImg.pixels.Length; i++) + { + pixels[i] = new RgbaVector(hdrImg.pixels[i].r, hdrImg.pixels[i].g, hdrImg.pixels[i].b); + } + + img.SaveAsPng("test_hdr_load.png"); + + var img2 = img.CloneAs(); + + TestHelper.AssertImagesEqual(HdrLoader.ReferenceKiara, img2, CompressionQuality.BestQuality); + } + } +} diff --git a/BCnEncTests/IntHelperTests.cs b/BCnEncTests/IntHelperTests.cs new file mode 100644 index 0000000..a8e2e49 --- /dev/null +++ b/BCnEncTests/IntHelperTests.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; +using BCnEncoder.Shared; +using Xunit; + +namespace BCnEncTests +{ + public class IntHelperTests + { + + [Theory] + [InlineData(0, 2, 0)] + [InlineData(0b0111, 4, 0b0111)] + [InlineData(0b1111, 4, -1)] + [InlineData(0b1111_1110, 8, -2)] + [InlineData(0b11110011, 8, unchecked((int)0b1111_1111_1111_1111_1111_1111_1111_0011))] + [InlineData(0b10100011, 8, unchecked((int)0b1111_1111_1111_1111_1111_1111_1010_0011))] + [InlineData(0b10100011, 7, 0b010_0011)] + public void SignExtend(int orig, int precision, int expected) + { + var result = IntHelper.SignExtend(orig, precision); + Assert.Equal(expected, result); + } + } +} diff --git a/BCnEncTests/MathHelperTests.cs b/BCnEncTests/MathHelperTests.cs new file mode 100644 index 0000000..0aeac1c --- /dev/null +++ b/BCnEncTests/MathHelperTests.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Text; +using BCnEncoder.Shared; +using Xunit; + +namespace BCnEncTests +{ + public class MathHelperTests + { + [Theory] + [InlineData(16.4, 0.512500, 5)] + public void FrExp(double val, double expectedMantissa, int expectedExponent) + { + int exp; + var mantissa = MathHelper.FrExp(val, out exp); + Assert.Equal(expectedExponent, exp); + Assert.Equal(expectedMantissa, mantissa, 5); + } + + [Theory] + [InlineData(16.4f, 0.512500f, 5)] + public void FrExpFloat(float val, float expectedMantissa, int expectedExponent) + { + var mantissa = (float)MathHelper.FrExp(val, out var exp); + Assert.Equal(expectedExponent, exp); + Assert.Equal(expectedMantissa, mantissa, 5); + } + + [Theory] + [InlineData(7f, -4, 0.437500)] + public void LdExpFloat(float val, int exponent, float expectedValue) + { + var value = (float)MathHelper.LdExp(val, exponent); + Assert.Equal(expectedValue, value); + } + } +} diff --git a/BCnEncTests/Support/HdrLoader.cs b/BCnEncTests/Support/HdrLoader.cs new file mode 100644 index 0000000..519f02e --- /dev/null +++ b/BCnEncTests/Support/HdrLoader.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; +using BCnEncoder.Shared; +using BCnEncoder.Shared.ImageFiles; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; + +namespace BCnEncTests.Support +{ + public static class HdrLoader + { + public static HdrImage TestHdrKiara { get; } = HdrImage.Read("../../../testImages/test_hdr_kiara.hdr"); + public static HdrImage TestHdrProbe { get; } = HdrImage.Read("../../../testImages/test_hdr_probe.hdr"); + public static Image ReferenceKiara { get; } = ImageLoader.LoadTestImage("../../../testImages/test_hdr_kiara.png"); + public static DdsFile TestHdrKiaraDds { get; } = + DdsLoader.LoadDdsFile("../../../testImages/test_hdr_kiara_bc6h.dds"); + public static KtxFile TestHdrKiaraKtx { get; } = + KtxLoader.LoadKtxFile("../../../testImages/test_hdr_kiara_bc6h_ktx.ktx"); + + } +} diff --git a/BCnEncTests/Support/ImageLoader.cs b/BCnEncTests/Support/ImageLoader.cs index 412a519..3a825d2 100644 --- a/BCnEncTests/Support/ImageLoader.cs +++ b/BCnEncTests/Support/ImageLoader.cs @@ -31,7 +31,7 @@ public static class ImageLoader LoadTestImage("../../../testImages/cubemap/forward.png") }; - private static Image LoadTestImage(string filename) + internal static Image LoadTestImage(string filename) { return Image.Load(filename); } @@ -51,7 +51,7 @@ public static class DdsLoader public static DdsFile TestDecompressBc7 { get; } = LoadDdsFile(TestDecompressBc7Name); public static DdsFile TestDecompressRgba { get; } = LoadDdsFile(TestDecompressRgbaName); - private static DdsFile LoadDdsFile(string filename) + internal static DdsFile LoadDdsFile(string filename) { using var fs = File.OpenRead(filename); return DdsFile.Load(fs); @@ -70,7 +70,7 @@ public static class KtxLoader public static KtxFile TestDecompressBc7Types { get; } = LoadKtxFile("../../../testImages/test_decompress_bc7_types.ktx"); public static KtxFile TestDecompressBc7Unorm { get; } = LoadKtxFile("../../../testImages/test_decompress_bc7_unorm.ktx"); - private static KtxFile LoadKtxFile(string filename) + internal static KtxFile LoadKtxFile(string filename) { using var fs = File.OpenRead(filename); return KtxFile.Load(fs); diff --git a/BCnEncTests/Support/TestHelper.cs b/BCnEncTests/Support/TestHelper.cs index 7fd3194..71eb148 100644 --- a/BCnEncTests/Support/TestHelper.cs +++ b/BCnEncTests/Support/TestHelper.cs @@ -8,6 +8,7 @@ using BCnEncoder.ImageSharp; using BCnEncoder.Shared; using BCnEncoder.Shared.ImageFiles; +using Microsoft.Toolkit.HighPerformance; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using Xunit; @@ -27,6 +28,12 @@ public static void AssertPixelsEqual(Span originalPixels, Span p AssertPSNR(psnr, quality); } + public static void AssertPixelsEqual(Span originalPixels, Span pixels, CompressionQuality quality, ITestOutputHelper output = null) + { + var rmse = ImageQuality.CalculateLogRMSE(originalPixels,pixels); + AssertRMSE(rmse, quality, output); + } + public static void AssertImagesEqual(Image original, Image image, CompressionQuality quality, bool countAlpha = true) { var psnr = CalculatePSNR(original, image, countAlpha); @@ -127,7 +134,7 @@ await Assert.ThrowsAnyAsync(() => #endregion - public static float DecodeCheckPSNR(string filename, Image original) + public static float DecodeKtxCheckPSNR(string filename, Image original) { using var fs = File.OpenRead(filename); var ktx = KtxFile.Load(fs); @@ -140,6 +147,20 @@ public static float DecodeCheckPSNR(string filename, Image original) return CalculatePSNR(original, img); } + public static float DecodeKtxCheckRMSEHdr(string filename, HdrImage original) + { + using var fs = File.OpenRead(filename); + var ktx = KtxFile.Load(fs); + var decoder = new BcDecoder() + { + }; + + var decoded = decoder.DecodeHdr(ktx); + + return ImageQuality.CalculateLogRMSE(original.pixels, decoded); + } + + public static void ExecuteEncodingTest(Image image, CompressionFormat format, CompressionQuality quality, string filename, ITestOutputHelper output) { var encoder = new BcEncoder(); @@ -151,11 +172,27 @@ public static void ExecuteEncodingTest(Image image, CompressionFormat fo encoder.EncodeToStream(image, fs); fs.Close(); - var psnr = DecodeCheckPSNR(filename, image); + var psnr = DecodeKtxCheckPSNR(filename, image); output.WriteLine("RGBA PSNR: " + psnr + "db"); AssertPSNR(psnr, encoder.OutputOptions.Quality); } + public static void ExecuteHdrEncodingTest(HdrImage image, CompressionFormat format, CompressionQuality quality, string filename, ITestOutputHelper output) + { + var encoder = new BcEncoder(); + encoder.OutputOptions.Quality = quality; + encoder.OutputOptions.GenerateMipMaps = true; + encoder.OutputOptions.Format = format; + + var fs = File.OpenWrite(filename); + encoder.EncodeToStreamHdr(image.pixels.AsMemory().AsMemory2D(image.height, image.width), fs); + fs.Close(); + + var rmse = DecodeKtxCheckRMSEHdr(filename, image); + output.WriteLine("RGBFloat RMSE: " + rmse); + AssertRMSE(rmse, encoder.OutputOptions.Quality); + } + private static float CalculatePSNR(Image original, Image decoded, bool countAlpha = true) { if (!original.TryGetSinglePixelSpan(out var pixels)) @@ -183,5 +220,18 @@ public static void AssertPSNR(float psnr, CompressionQuality quality) Assert.True(psnr > 30); } } + + public static void AssertRMSE(float rmse, CompressionQuality quality, ITestOutputHelper output = null) + { + output?.WriteLine($"RMSE: {rmse} , quality: {quality}"); + if (quality == CompressionQuality.Fast) + { + Assert.True(rmse < 0.1); + } + else + { + Assert.True(rmse < 0.04); + } + } } } diff --git a/BCnEncTests/testImages/NOTICE b/BCnEncTests/testImages/NOTICE index 312ce71..5539ab7 100644 --- a/BCnEncTests/testImages/NOTICE +++ b/BCnEncTests/testImages/NOTICE @@ -11,3 +11,6 @@ Cat photo blurry by Karina Vorozheeva on Unsplash Cat photo gradient by Borna Bevanda on Unsplash Pixel art birds by Refuzzle from opengameart.org + +HDR Kiara from https://hdrihaven.com +test_hdr_probe CC0 from http://graphicslearning.com/downloads/hdr-light-probe-02-cc0/ \ No newline at end of file diff --git a/BCnEncTests/testImages/test_bc6h_ufloat.ktx b/BCnEncTests/testImages/test_bc6h_ufloat.ktx new file mode 100644 index 0000000000000000000000000000000000000000..54144989afec35f7b418685255ae006b3c6bfe4c GIT binary patch literal 5580 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%0AqHZ;Pwk+vE9aZuRlTfd)qn;E^qH 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
J|Ni&Br!I|KzZ2i`k((rNgmA@m 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ඵkq4@sEI8@!iLML6_ddIK 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

Xb}lDH4@B1Su-QkS_ydZbm|dq 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�+3|PCut_OVCTgV3!#t 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:IC{P)O&Xq%6ygFKSb&dTKv-00P)KA{SX3lHXGB5@TKZBFq7sslhyYAS z=qNfljb~zThN5!6G{07>(Un%$7Y~Zn`I0i_c~h=6-`cy9@xO9&;}fz~;DAY^gD{SO zKM?9WClHTh5XY*k`wwKEPo17Mv^hKO-VLo||1NAY+O5Evct)cUHoMPvCbw?k)R>~bxmKIzyno-W9Xqx%TQ_ga%-pscE9dR)ci=2^ zbaF~sFF!?qh7b)EcfRw6@l8-ma7!JTADU+8n3);m#z*S9g(x3ZYPpbf?>}wz^Z3u; zEjtsx{BHC1$Upr4kH2$rE_87I_Uqq&^UdG=@>hTJRnKtc!QcJz@4ou`Uwr+Kn|AEo zwe3%T_p4v++Orj*@16cz{`22|z2$em{lnIO`OP1b$IhL5_cL2IZP^^_SJx62mK2{v_3qzo+q3bzty?zRZA~~jKQn&> zlI7yk$_Z{~Dr5zqwAE|y-rc-;=i%e^^+%78taL1~IfifWtuE=;m#{LejQf6}S3a+$BqyvPwijyN3KAC5A=CCJQ9WB8P*{4th14 zlLl98aG;-0Z%1o`rLs&P-#azbojfP+J(Y6)^h(8CJDQ+D2If3Nh+`Ey8&4u7gq?1v zdBn{EZ@9gT@XRIc@@Q&;NKbK4vkBSpie~X+eSL-2+{)yyRSn(4K+vpxc>c_>`Tjan ziLS7?2$?h}@t84D&Wo2Rpco(x!@T|;byN?42qE^|MJLtT{fBoioLM<@{`4uRWk-%( zXGMzylu=04jf%L@?)HwZ-huwk#wM7;I@+nKqNQmh?%Qv^3iR;_DOa;BBY`ziERx_z zlAt$LC1xRqVz{NB5NdK%a!Ib%P_7l{=I0fF`O%ja>kQ?lQWSWbtITx`wKa8(jrC0} z&0XD4x(9ljd&f`&JTtqneCo`Z%hzsjid9r_ym)>1k)?0QGST@~o!QmBy!y7#+Q2FG zV4vFl4m1opLFm*T#ST7#Hh9^gLu~o@aR@O|C@l(T7bKTJi;)Ydz0D@V2;nm|L7{;u zOYkB6aZZi~pF+DKBsrhiFbcsOfFIIm(C$RJ@SM-H-=QA*BbdKFv;hk?=g&|qjvNYo zApsr}HBr!T3_0(UM#I5Swjn#0`l7P0XPE$Y7-m3d5ar_4nk$xzKD8Ob2!4{kR3_*` z&8!q64gcLjb}2zBU6EZ0NK|FhS=j8W_zwx;Cy4;?Oi*XjTH=#aV`u8?N+bhUdODih z&z-sRs_RN+*DdksnyOO;C5HNY#qyVv2Qx@J!5bfd0c??c2&oQN3T67A&(0Xj>yKW0EE&2!JfdE|vUKV2*_Sh2 zlYf-|oING)}Fx}a-{OJDkw{NbWYcN%-*3`)j%7(uBmetp$x|g!j zxw*m;b6f3GiLSbFV5+~P!8&xir1jDY@|Bp(VfzE5k;>s!;1p^|wQ9WhwYZ-u6?ssG zkyn+2(~*H|A@eq3SHRx+dSkJ!Fi)#3tgLIbG*z3+O~#5UO9k!GGgXu$w`QrUsI0BQ z8BkYMX)@!Z8cRc+t80A&($B6~jzIC3V35G^X|kEAilM-;iJpO~oD7w^kYrDD8K6v+ z8JsN{Okj)c29g;hIsoeB;ROaEcCfV|Yf;jQg&bgRz%mhUV{T|0m_2sx=9BMnmsFC$ zy>D`P_2C=l+1i=eUaQ5ZQ^~~4lUtY0EL#??m2me?&JFjpQdtj*gNpJMY<7C;+LbfM zrm^5=pr^f|x}qGj42jVy=*IbANjVI}X&t8VCu2@R$Vb(kuAypYvF_#4VrO%=iu4K)q*=5ksUY}U~{Ot?E&qr&zbL1ua; zCt?NJ8F{_4oj4kKG@g}?E!dd}@xeiUArWzruJD~5@cyZ0T~4~`F>)`K4IxGC=4wR@j~le2@vJ||~K zX9wp)&MscwZin#ZK?0gL=;WXP!ZdJ+dHDnc1cgS&q^2bVx_L(>MrLl>Y7bo}wRLH+ zV=^G5%Pbn`Yzy;FEq4C!U?{o8*w{}jfO2We04^zqD8UHVaigK>AUieOue+hW zv%Pb$W7t11GA7c$y`juh*WB1!)nusX4~QofDLye1FD2{P4n19Ut?oy%T$u27V+#_T&I!kqBgSDlRAWky`tJcPrrnV+)Z4E$A zE!g#HY=*Ja(7t4(icDsJq1MjUCK%(aEkjca%;b^b!R~?H{(jWJLZbmB8XTDz86O&+ z9ETTU5;Z~NQ&UI=%+G`b&mV^U6mQ4@#-MaAGYdZT(+}p>vqVp?-#%KZt*>v!wLUOF zX2E_N0XS`wXW)LP_VmkFuUaOPU#h2`mfYei{M9yCAFDZaOOv&VD;?4jz*JjZIeOty`Yn9@ z?7`Z_QzsVZXQoE_yE|JN>nv53Q00uJ$g+TfvpMJff8n4O)Dsy-$G;#XX{5Q_6cF%uZ=Q>)BojP4py zRIs~ijkUqm+sDhB3i{g`eIQ%<`?wu~*y`yU;Op<>?iCmk799m!u)nu&0P-*(;KCw; zBZ9+0%OqiOPf}b=d}>N^S}M&9S?QVZm_abdIm<~QN$HE^3|C~-TU^|H;YkxpO7#Cn z(v+UlRFc!#+$0f|PsGLMA{0&e7TAbv;HC=HJl3hz)z=n&-8VC)Gdu0szBO?wHZd`o z5ni~SEzMxm$+uadhG8X&V&?^XI>U?S?8^@T zab7{aVPF5856c6{yoQ22q?gMiQUP7I;hXWqUvX>MIskesPEmo z$8L)NWEk9e0(RRr?1bH%o&;4fF)1Y`IXW(5^G+;|fF`ngufu`eyJF6b(iXXM7cQI! zrH}0h@R%(hnVTCMYBUK)l0Cy)WR0UBQL4Ft(r2PPCV!_QX1n7KyF;{$)Xhp{o8N;`WOF?sP}+t^Ul);FI)b* zv%6RJW_G7!CzE6{DKqKa4ci!3+~b1jy>}2D=~YJ(YN#Ly2_b}#1QLkedo{iH>Vj?D zdynsV$=uy1!NwpXfu-O3eZEh7_wBFV{nHQce*MK)fB2ub-}(0I-JgH?4NmR9e0$)~ z_P-rGv}^nKI}YyO>*9J~A7!+uIf$}z4@@rmop-zJ-M4qo!L6wIBd*T7_w0)EE~*0B z4GRuVNOE>gcG`W&bNL!xq0(C0t2pIT3@}ivbsWQgUEI{c$1dr=jIn?=CNW}TU%OKn38~ zCabCuD7LXl=8D~W@c6;Qd>IEI&fP!J`L{pFM*t@D1AU0DG{Ch8hx#5LS>9vaMq6 z?#L5@`})qKDV-E^0xtM9wIoXmHogIxQYe_(JK(^9a0x{1_!vADcoNFT1kWeg!O&*(eQd33{cv`;1a}`g|ANeC zxC(RC<;$1XuUuK3ofsXP86QQ|S}!GKXn?%d_4W6(Gy(h(D7z`Iup!N-2CCK)b1A8$ z?}>JD+8&OEtbp$WRC45HJbV3;U}1*%`Dd~+oWtV*QnH|G1MtBJ%!hMcf~In8S_~E116VR$1(Lu<*8kuySUtGPsHZwMN?dFZA z1T$Ny)fI+BM~61p$~(l=p6))Awt1DsFq1x5$Fgg~T&de1w6xT2|)2!Vj~Bb6~OussUVKQAx?z zmVG9R`tRgd0hS@(gj*Ul+(P{epy851$!p-Xa`8HzMX+ zEFqHvh6V?MoYn(Oqsc7!|1k_3bPo6#CYk1yKEH*oSed^fAJdlDE&msChNvoBe#YUv zc|tHmoJ)7BjlEBJ<_GqNH!oF|KYcwcvV;CZv9`;c;S{)MzOK_|$Py(Q-J|PmZqwA{bhX-04 zs%!{vx^r#p#p1-{%^NqF>}(PD`Mveai?_3sSRb0C>*H^fMr;zzwz~EvEl()b*dn5F z$djHNcxd9I-Guzj%YEbeK*e)hn&+p7#)JiNC4&AN)teg&`3|$9qPz1UL#Y=_h1?gc zYXzFD`^5bEtv54fhIp>~mhlo_kR`K>@e8>`t%0w%-@BW8eQ0X5sX{bis$6++lU^v6 z-PK48>s+(WI;Ot3Jazx+{6PPZ8I8l^EPKbsgVn{&EB7~MhZY7q+o#ys+@EJh48?}a zk`Y};&xr79c5V&-^1TPyOgM*m-SW)zq(~w>G9fM{WmDO3&DfF8;AD|e8bk(-lg;PD z2?~@C!V8FogY5#3JcY<7OhzgV(qs;gg#_SC23MXdgsMDSrhsNN7f)_&9%AMTiYz!T z)KV3W2e1tqeZEGUuhnUkAYBTJjAm;&$eYsAQUd!)kE&V^ve^UTBp3;z$VEPU`01HU zb%`M+wSvNP48~E?*~Su*qW=Hty2zIYR4AiZ;b6#Fy?iA;F*yzV9SVK2#WICjoo@nQ z?d+di+PL?e&L)$33+)wkokLUW8!OX;ZH{7No`$i)^oEiarG=H2+!00!4}HDy&BBWh+sWB8*3$FDIScmwxXzbiPR9Pf zP^&?L2=1MO<*XP-PbM{u#%8A^Wto+9z7m_{j0{Ll(qbaR+`}pHQ6c_k{NkcLkDYKm z7t>^3E6GzDCKq0cbdOd1aW6Obv-?>Y;N1=#IpTsyY>7phK=O?IYRidJp=uzPyur|fhKE9P=;7gY z!6zUrJSr-{^Q=#3M09)#86JNq+tfbTYUgz)F&8gJg!=oZl$4c3hj@j9@<1)Hzo*SJ zEHoe_B`r06xUSM9{>od*GS~Y0)>V0W2KkxGBwXE!R?r}AZkTS!x!P-{($e||dPDnG zV$}*A>DTULb^jxX09G#(VCFwa90Q{xnIAsD8vI8jA+m=5VPup&{2xO@kg<=BV9Pf& z%o-wat7g@DasFiCFL(z_sGcgSn#B=`xR4T3!u`ta+WLaLS}elXTx`_E$|!xEr8V-1tiF)$hRTYP+QN}c z1#xjvTIsM5a&9!iQRmgWrBT9TlViu?S~AkY8uVssy;&F>Yb~fqw_uQrqZK9UVgj-= zBGVbo4U{T_wOGc9EXrh=sw=%HVWF1rfS4jbBsk@U(z2LJZB{11O3a8#Q+mW_^Z zAdqrs>5TNG6xOLTKbfW3@swDzw26_cDhMtOA|mJkmU4%`4_C;Kvh&k3GZNwwGty}3 zgGqv-XoW?c4`5wTtk-HyrKQ$>7PZ zX%SxM21^Mt4;&6i*J@kvQo-t>v9`iqRc0?Kt8&zk8MyVeL<5f6h6d1UxG;8h_8@^C z+K$lCi7-eOkvJC{4|On^^g=KZ$}cHsE+=wkg{I+~=$}(H{^HXo%fq%tnI$v_V1U}Z zbr-_3=P!Q-dqK`JkX7VrfwzinmDTmF-Th;8mo^_!!Ta(>3jO&atD~`VXzXHVLxo9; zn6E5YOCDZdwdUJR66)3Ep^nBfGTdLSQIP5`4x91v?&XzvJg1P;-PzWF;y!C(fm#V= zJ}HV9VM&H~e(0_<2_*CZ&0xQQJTGH0{yjhwR5(vc?;L1%8_6tY<;bUm*SW zDFSE7d@xeC_UQ401@lZcb+LVm>OtJs!w1ux_|sVGK)`kQu*=@Gw0IgNJ~KTfb@v`* zULu@5IxKvflk;BZ-8-TpQk?;5unszW^ytC;2M?Z6<=KZ>vv19?riqDuUO}+kUT9SE zg$1WT;;C}2O>e|v_C1uua5DXq{GCpCc_w{v;nW_NlgDM}IY*D|it+S0?{W0(d+&Vu z@u%;6`P={g&42&?^Ut{-|MufQ{Pw@z{`$*5e*NhepZw+B-@X4o?|gLR+{d4N`Psq0 ze)PHfC)>XL@xbTbZQr&Bab7O__xk(zhi>0XxEwwPGvmP{2VI3RsQ zT+t;p;NN0)Mx$!UDJCvz`!-*HzjGQ;VSE-_fEJDHk_$e;JL9J(P{p@6w}?bmaG;k+ zV^#~x^qQAI*{nEU2n+8Iv0`^rTim=XkgJx zuFGMM%mN<;#6r9RroJ^Y&}i3NFfx$dIhK%sI|nK>n70V@20nd;IEj}qZ9TgG=rPJd zuaQkGuwyNefe~m9ADna>}gRQQn7$%xpc^r^4Wz`3LnW>JBz_?O8jJdW zkU)m~BXA1_(=CM>i7oJHWO%`@@C&U2of;`h!!4jiqx}jHhL%aLp|Wvw!&QSXODfmM zurJ(x%a)H%2+;#VeyOKhHG^uhSrBzZMRYAg%VaU$g3n1#>!9k$$g<2#%NA#osR#5S z5f=F&+#Lc6;Pv68FX3x*s6u@Gt&jlhf@uHn5C8PP?UGnGO|Lg!-MN0Bt~aQKY;g=T zJ(jytf9dBb!^M&Z%sTqW-RCzSWv^dW<*FT>;VDd%*#atW!5o(4KS_84$u?=yl_?l^6Ed45k|DTlhlT;5P?#H=CAF*aSC2v3Yj zi19m<&t+sie{#o`L<9|jc3T>0Xs>SRP;|&|7^WsG=u>S^`#Q7wt>Rt{v$JMN#;biP z>7VDVH)eiQCt&VkgsEKXbXiZ{pf~XA@D)ee_~+;jXlA=*|=RaJ9Y2 z@s!Qc*X7YSti0sRcnWIj5LTZCA23%^?U=Yp=NIuy9n9RH^~0=GN?dGWEY#MtI9xwt zk~2s{UMd0?=qy?)xzJ0Zz)6yViYhvXjpq}SCC-rvb8kT|UWZpUwyw%lf(bcpYz`>cLZjK{sBh~T zo?X3h{~3^-P^Ka6kaaB`17kyd?M={wXceGup3PYsOSMXU&ZEmSW4(2yg=z_srkGgp zVJg0Ud49B~vAP06oU(G8DIZ!|p@`3-0)b?vry`XY+o8}PmOtU=;|0(IqUxNRPotfb z<7R^>BUst=3~FLpYIr0O85$G_&(&7xB5ry9JWkUJJNPQnXM$z~iwP-cN{trkKSegw zZyDg(*y+hh*ugM1*mV|8?{uz2Ku=DHi$)GWgtr?6Z;?T6=iLK>0~&b5jlw0ab-->e z%4zUAd9LbGkI%Vd2qHOi^f-qm5FI)!;bdkXk+~i{{?i$B*&M{>{LrDpu7?gEba6TC zdgA1{3ulkI96k)`+R-D&P9g*C^vP3a&z?DV9ziB2P64VRHqOf{AUF*FD$!Bi$V!9j z7<61zwBMN%pp`2bk9*v-drI`7alx%nz0qBbQoYOtqWO$jvxhWIxeB&ipuvlz=@?wl~psf z;?(-+&dj>_vOq&?0kg5yLQ5Cma1G$aGS6RN3%uE^$fAUVQ~^({&>YPMRA+NCDeUaD z6o#0amKf_{Ei2Gj0tgyik#~llk(R(3i%+0Ss8L-ScrcUGGE-8q>|^p-*)o;Arh70V ziW<$~`G(cgn@DMeAV(w@t8`)rx%m=o{$xthPLZ33Z3aS!v4EAro(tU@(2zo*(!ls; zD8f)+u~$|%);UVc%PY%mkgnC%5p~rLM1q+tR+x~h92FIyXiyo@*wE6{42vn)I>-xq z`ar;8su_W%0l}kl$OcJ>PsBz&A&K18(%4)kTd2+}D6Z)(%_FPK$PiSL*yrmLHG z?vWtq6{P>9?jQPc87W&c;XV<|)ZE!WGBtns=0h5!`a+2cpE2938rzy-+AdTnWkMc< zc4x#;W0Gf!8Ox)+J#7t+LM5&SY&y9SrP1EJytOiU5n(+@v~9zp%vyxN2(^?qA-LdnhE>(PlnSN6V z;qz&A{<-sUjdPrm!8M>?be)rB=eNKf022L@c1DWZ9+1cg3ODk9m~8IfXFoWIcMuD3 z`|?P=t)hU_8h`A-p@RqZx#U!l_J=zyFS36+<%-<)LoR#w07y9R&fJ~2YxnM5$?3b| z6L#%#+Occ53t)x|Yd^7XdrXYe!Grtv?}u0C$bo&%F8lW%@~nR)sj2N~$RmbgNxI%3 z=P_k4H!4JYVHS_ixU;yK&Lk+OLme7lZATo%g>ZK7V)H zmtVjC!S_2q{_%&;4}9_McRPOE>2%-&m;L(=?mw{CY2W@m;Mw;(@7?`FL=4u6J6&8{ zkA8g6*?Dh3t*>_w?6L+iJOI#l^7vTftMn=eaLZvw`{~U2lOA5*{}3NCKr-g2(-;{V zn;Ptc+imb7ia&jKsHFSTjlK5(gwMqc9T-n&Xd3|GZ^Y(2N9^M0#ee~$jlP52pJ$d%*#j{^zi0}l# zZ9tj|@Cy%X4TW;6*+^GlZ_$epC;+bq-07sc19y!Rfy_mo0+5?Wungn%@NjKJE!4)=Iv zu&<}135m(|9Ub+Rj$)HhtNpc31@c6S>;QOWAS#1^?KSI73K9d54EGoS{V{r1Zrr?k z_XZO5Ru>SLH#a*!JBm1#5fqj0J9gM5b8@J^s|EX5I8ZBWMFptqvRR=xE-5W6@vI1l z+P=$q=dJ^L4Sa^sT3M707YR?EBal41_v#Iu{_63aSM=9Fo}6qB9kwVI6YME?Z#pKV zY=Kms!)GJk2<`-t1SSJSpX6%D=oUSxI5imyVLY|jaIV7(+1id`_r{j)-hmP1Pz<&= zcMk(RU%7Vs)-$HS=HnGgdi}J8m8D1_sH|$a*w;3AO9JoI>h<(YIt$ayPp9z$+`BX8 ztzG{N+J=NQ06dv|03+ZO$kFf{o7RORlS@e9+@S%wz^j9gN@)zL93N%TxBxF%R5bM8zy=aDViUSpjgSXYZ5^dN@u-ldo9Y>7^# z%#{(sT!A>>T5fd2i^<@}Ep$UVBmlYbuY!CcwFc2E*hgxR9Fvui5E~Vng2_I-t&nwn zEgLE^nMPM!TwhXFSZTM5DwDBQY_k?wiVRJCrUJR}c7ILBlrNXJkItc7URTP`wLF{XLZOdQDl-D;ylAPJD_DI+2-#C3+S{62rB?>(ZM-); zNfTuE<11Mvv4N!?%j(Fjvo+1Pv-|JdGRRA`rXt(*rv($8x@Y`{)m_u`BRx$$*KS_C z$&$QT9v#2=gu%MGdhOC|M_ZR&qacQ_t@gC^cCWr*J}U3lX$*QOP?QB?p(Kl$g3u!> zA*{Meyi(iw{NA<8FWJTHrWdb8PYNv$t0fs^hcHw-i7`>|0jFm&=;&U^%%G+wQm7e8 z2?$w8O#xmak`rPmX$&FUeo$QTxmiNJrQ*ds034BAMw;TuX7qeCqbj6AKu4r2VwFHv zacH$gMFrR+>k9}>NZ6m4A&IfTby#eMt=3jnQ3d4F*4GOMZa7ws35e(+xB@Y{8XC(h z;ket%XT^X^S}14c=9jUhy0X!e-*XFLf3W0`x6}f9$qUM=n%Xap&t1Cp_$4MCu|j7y zA;+$|rXHKs`r5K0ojOQzi7g&$E;ng}1jzQaiS|0wVnfTzc=Hg~&}&yOEl&(y>;eT) zY9|-_2z}fle`)CutwY_Bkbs#b*dHCouo+dtq+V`mTNo-f3OJa7aHHhJ!~{s(z^a9& zL**C(e=kaH@QWAO&jLosvmAlHxOx2}VXzGLt8`maCpL z*cwZ-Ej(rxj}aRYfplt*pFH5Kj7z5k1rnW2HQF9U<-qM*kGPw0J|=mQRih}P$(1LN zQ*abl4T3E|bu>6mSJ$JcTXf&=>Ut24)kB943Jx6L9Rgu5J$laV)IOJk&Ik5E)pqO@ zbZL0o3Qjxedi3OJGBEAz$@6Ei3ky4k@H7xx5cY@r9zFS!kDmwHBa$+qgtT2$ z2pT#otyZI$CpJ`c%-y-!BmOOmCD~w)OwVlIe~s8$ezv@jd!68Lf2tWAW$=nD_7cyi zsGty4L|97ftc6jo;G6sdD+HGcdV>QR>-r$IPC|HWd~j@1Ofp-XE3cDwfayU}72Zf* zhr~ErI0sONHBR8#JJeNGAj{6m#%UpDu9c?LS%RYyDR@F9r!dnp6CpMWv1cjdrPOrD zi&#AL+=NtWg~~#d9~g~xub4D0#%9uQ&L(IKW)_=Hry?jSBO%f|Hz*d#jFFMCNh#3~ zt47DihD0R9hEz+cW0T@TqoZY1HPH|f3K<0(am@xktr4b}sD zP^cVoL{ieCCnlkg06K4Mosj+{huj;lEIst5`useS9I9;YdazPeUP4&yNJK9s%`Enc z@=~&Fytu?(idQ!lxQK>@{vNhj3@(kW5T!z)2=vnqkxFZOZ*M==OG6~|Sz3Vl5q+cS zR77;}pug7_+j?4h#>UCE=;c)e4M1&!!RhY(2algTe>rDgc*BBG2eNayipWC_qczu9 zRoC1#Fh0F_=@tMFytq;vOYpr|ZI$?86zUWb5qB;#tJ7YTpPNnGT$=1_tE+Ta4Y}DY z;>F$D51u}}gS_VTrRiQomNhqE%E4iv&)2JELQE?d7XUnH8CVm=L_x_MHUhz9Z^yvQ zNVS~+xviARAWY?vDY2x|o0h@DNt%jt1NAuw(f~99^8@43Ko62nyV~)+_rRx9RbGY` zcxVL+&={{#XmMv!jW(e;C^V186>}*T1-?Ns1HsR6n}NB4lJ+tnCw=Pa?7e%*@QR=*ZX%wn$?&3GqWp?2QA3WwBM0+;KoyypP%4 z+n0zdv3lvu3Gp%8_U_&36rsv13LNTe9L`LkA2`U%xW<$oIV_Q=j-5Dl=G5sk=T4ow zaLy+rI+Nwl&cPdUbpuJy*Eh(l=gpfpNdyGh8-9W1;nt0f**=FsCBfxiuM^!ajm(PL z1x{zrp1m&n5AHiaO1gIEiwg-AA1MPz4j(tdIKxZGi(01?I9Id5+2g#!$#=)0B*N=V$g#LA!ugS z|MXwK`OTj`c<% z4gUM?yYF^5{jlfHA0Bkxz1wB~2Oof|+Piz_&ON(!?D)|yz|SA?E)nrN;zO#f=CZQ- z>WY$TdudUD9_qqeol2`KCQ3Zqe>zuQKiqsF@B*5lehk^RBPJR_Sz9kkGDaER#vXFo z$CDJ@9-VDHpdqk(>h9=9g(}AS=8m4htzaxtYc)8tw0dJ>VS0LkY-d@7WqoyJb#-ZW z2J{eFKfbuUetG>8;Lz0@w{DRM-PZ{if$rWRT`Jd+VsIVI(d~P;Z{L6L1W|TBzh;sg zFuVsG79aZzrLNH2ic~O?3L?26>_ABm4|-flhx=r`s%1VJ;!eyjWE4DbPkaXA+C(x{ zUV+h4>ISpvmbe5tJTb9gGNCIC3h*Pml%7F3tfa)m$bcsDY(P|ikVD}0y0N~zdj0n1 zjjJobaC0Mrz4-1)b$bIs2W%Fj9ue&z!pWBA90`&IvT*r-{ru@e6v$j&9%-$ss;t26 zZ1BDm8w(5a^Pz{=A?cY6DTCz#uqO+)9SEjiQ+b0x@h1@cfv9|RZ}SG8*Be*YA(fmO z8=6FJ(%4}C@WmLai%T-TyQuJAwG2j8fK16@>^3iLiR4gF% zZY&0uD-_Gob^#7Slcy`t~O^hI7Kr{T#&hXOR-`>lYXrp(G|I?cA|r*RI{p+oQJa-1#dK zsNjDR>HPB+Izb{D{U0Yx2Q_+LZmH*i8nR?2Z9A4 zFZ=f`mWLc)GeNohicA3b<*R4@%irJQ0a<|>+G2u8z9$=!HOT5f1@XY}K>dcl2g(Mf zAM!T9Ks<=v-U0;5W2l(_2n0m>jjE`%nPeIoZt@FW;()-yo$;Y_6QoNs{&_3mjFmo! zbOHr%5*MLvTOkKqNNBR|VWYlC(SA*#m20mx7oI-r?jz&)#%t?_8QD2=%={aimwk_3 zF>~Q`M_iXoBhM1*j4zTb!2_XuZgOY7l5~J6)cMBToSa-4hYwjbi@|>W@Y=-e>f_aG zFWC~6!l1~0`4H5G(ppkfTUpWA*V8!NZ)|FS+w~q}^ zT)T1e3W9(Kx_g?+9L?>eh4!lEk?zT{_J&eNi9$P3OSeIsSPsLzwbY?ld&m(hwA?b5 z5~PCS0siqBgu#ruIh};bmkVU*7iBb--(8$HbEnm}tU7h`1FhsWPg-bTXA#y)m2TF$ z+A-NG$Wn>>^39B1Y&)h`RGhWE<%?_9*NbzT^Dk5{seD>6rkv~2#KRVp>L z^e;Vmc7hGgQKdVp<+mDE-@60JSl=pW>Y3cj47^@kvO+gkYYf}yGYd} z_~qn;_$2%RX(g!Dj895u3&=t_AzsOBI;^vF)re9n;bYDv={Q9A=jG`%YT(u!3@13g z3b3C*;glYVQ9V)*2u&{16_I+ZFVw4H_r~M|VOw3BFNtrJTu+*rp zqTOuh8^oGt{QuqkuD~S;kEEG>^@fEf&F;J<$|;(xV>4e!=Eiz#Q1s8Bu;R&3VebZ0 znQ!3d8@0@qC-!=*VXTTp8KK#{-dn2IsB>8N7iSh%XS!>QYPpzCe}3=U>gxL3=+H&AdOi7_&Go1(;Js3+;Pp=yI9_pJ+dD0x23TE4_iVA9G8YP(m zZGTiG<{fBzA|N34^M$<6-{04hY%F#6Bs@GE*5Z;?8n>fG|@&tTWxOR^o zKZgbI(L-cW+CC`Y4(vX1c<+&uCr=)Og?ImIyAY-a&}I4G*X) zEAjA;NJ&XT^dlWn9U#AHjQDs85u40Sk4)#YQ2L#ol1WX5IvCbK@<|KjAtF04h12QD z5QArO=^R#OasnkGJVwht9|@Hcrr!vB`(c*a0D!eX8N5JIv0+sOR;#}^A{-(j!+bAz z2YUH?xuaOKXr#7?5o<|mWTqtx?C}xZLE!{7FqohVl9)C{nck+3kKwS4%h}HTqtEt{MBqf&{pW4$@UDMp%R#{wRP~yOpYICG=LAKr!m4H%Ob}o-4 z!F-XerHY_-FKkH2;<1YpWH1)f!SEu-1#<*|5PBPtrbKq|kaza((b7LSY#*${&{I=OUZvm>u{i3*Vo4UH114L1vIrN(?U zub=m^WMj6bC^tvQCLYW}i`H6WHE850gn4*#6Q-fdXf2sSQfq4?tA?m7FR>OEXjLkN zv~w}@z>)x7Fd48WJba=Lqd-?xDJqUkS{;Hb5WWUk42guGQ$wTxd5uT2B}pA(Ndls1 zt4a+F5Zdf8TsF7%!aLO4UTw#Z&5)1%UY=5c20OX3SXAs=ZzLvb*9n`M-vEs?7f?2h z5fe*LLjn`xlR1(ku@)<5wLOy>uZ|6hD0#$;ZzvGeTO7gMK%K=?>mJ~5vE&)-6@DRD z8CO=ImIz4%xeD!t@^Uw8xy^3#3iJo-69z=*?e6Ju{_I%~A3wL#-d<;Yf`UQaqATR#aEiC#4eb z(a^zh9+q&$vLjn7nxB3;efFnQz-mTOp5`&TxiN1&4?1Dg*df{`Jtj0f5JGBLI6^#% zjl3u*pMpXnzuUHR+pZlyg2wv($DIgRb#VdreE?7hEifQ^2h_(d4sF{- z96NKsKaLi(=es}s{Kxi=F%b`pIXX{q2*_{`S$~ zeS7x(=yf*x1z*bj>g%0Q_#q*&s=mFat-7qV#8hH18_Wf$U54-pkC$-s3IXJeh>Z#e z@(7NI35|%`<+9%;#<#w)0m|=|7Bsz+h@-Qelwo0Q(b9+>$d-;a>@nKf8tWU74&T>> z7XV_yI=Y(c5l{#|Xlkf$XlNYSTT|2X%S#K(3-dGca6e5=P0ixvduhwO0@XT3{>#ML z^2*Zu;`G$&rRBNBg(Wmw!oT(O4FR1T65ttd{;;9nVr6HG<+^&j%xcnCY-AAPR&oun z8bqXIfc(&)hX44fjlp5HE_1Ww)f!6tT8h2AkcKU(T!mSl8^uze_4f8S?d|J%B1Hw$ zDN@dL}2$mX%h>9IbjRC_weZ@vMEoz)I2 zfDkmnkikKCltV^|K&bKat*h%Rb3;8qkuW5}7+F?E(!iJ^;Az%jTMyI(@hp}kkjvpv z1^Dt!m1Wz&Ibqk2SvKN?sxtA^X-CHV(znrfmhe>iAH(Xo-uC1_4x3? z+Vv+-dD6#EUOj!vQ>t^&cpn}L;~POdfAi|+S3K}u47OY?&&9!o*n9>S$yp5SjF6e9 z%GKqn5#q$<2(8$CAARe-m zhD8-aBF7?B(8G~hxB+lKLcFnYLlXbw;CC(=s`hug&abzy4+(aVD@~F!_)@IQ{{=vT zciEZ${tF`7!ZvIWM^Y*eUml$}WD0c#=`B)aC;*WdKt9Ms!2AC|BXSWNO{yzN9~PJX z&-k|@=t6`?GZ@@0NW=pqa!?x)Uhp5d6Y{RN?nRN2g|7s`9+mv!ob-RgZRQ$?(aW>Ex=^47mqjH>fm)NbHQrNcgdzCS6bFRa&dWCcZ4GM&9ZR>-Xt=RnskE`Hd+ ze5NTb)R{Ub?(~--8;z|jMzN8_TGebd2nq_TTY5VO+9Am5Tw0%-CZ>BP7cOt!pBbAO z9U2&&U%9=oxIVwOGCeWa*U?g6SzA|%^r9*V;gNTgZ!7C)@9eaiN)*j?Y>mFq;;3rr zYO7V>KmnRu3=522#d@_+UbDW|#}Y~a73A_fNLEETLi7C4I=i&<_Cm3PGk&SvpulK6 zTE^ve5*3z8eO~D%bX5yRL*;b0biT~IESsHqA}hOFrBPg8zruN1q5Anj&Jfwu@|v^K z49{JYu|!p@l#7iG{j(3SbhzIxeRg%eYrxcXaq0H6k;SGd-Tl#*_umNSnM;$bw)Vw| z(I{NL^b!`q6ENg+PiJmCCWzUd>iT6uSJu$bGrP9*fboWPd;GyOndAvWU1n*>HAhE= zMTJISEKW+M#8R+KNyPL|LDfQhEXkN4wVo0iN6DZ=N5_IrBsL)`g_ep~UAJPRQ6u5- zK`46;w`kEwkVQ*#Ro3*@}Cj@>bqP7Mq2U@k2$FRxuo z&0z6iP0GzP6cv|ku&p`tm79+o44zzFFnYDiVbkhM9o@Gt-kq*^AbE3xxP5iD)gTuM zvff;u>g(?6X{i9;fd*k|QSi#1Pnz9~ImIQBasfML<#qz~mno=ojE0;0?rNyWm53 zR@&Vx#Sjo$Od#mBN{tYEe_AFrH6saMQ%Tr5QViYts(NPpX z_ozspvlr4jYZn)Krv}@*ba@h?+9-Q8VHGJfbbm27M@WlFj-nh$K6Q?D zk#X7nnQn)rr%s1vu#O%gI3N(_6S^|u1lDPnd#U^ch$0VR9;eWTuLe{HieNEofIex z4^N<^hNjxM-VF)(*(Zxs)pCLn8SEdKf_Rn09Z*n@0*IIWsMu5|5NCSlV$4rY9t%gbR6Ip|G{Z$ED&Z z47Wmj6doEA0V$zxd#Oz6FmQfy^Tbce-#-MP(#yv?vENh~$=A13@byt;Rr1t0Dvwvd z_wf@D)HG^RBDIK5PwZ2Ob@hg{1|FvryY!)C!>EdyggBV+Hevd7J4KVk50B~yHj1*S ziJ2j>0pUInBqXLYB;fVr89tRc{7gnn7GI$+l`5G<^q!Ghb2n)Yce(HaM|@>k&k2@Nk{a;)%$zaIi{Js6>PUItRN+UXIKV+S%OhK+a=<0k%Nc-R-tA zn5xW0MMZ_A1;%P~psTLZ0TVGvD-k8O3Q)Q=4Q&&xt&PnCEzO8Z1bMEm z&{}qdQ6x&AT;DV$WpbtZ!BLAYmn+iQ+pe}=>NPCT*5}WS_q3O&#hgqS1BV)Gs%y)O zv?4Aq>(!kbXnR~h_W_>!mg(zi%Z3qq==<348qGBS32SP9Qw6ryLwj(^M zw!ErDkAXy^hJatCmSNMB9vh|4smM!eZI|hJb0%07Suk(XILUD=MnZTruS#GnP+`DR zM@6EgGbOgExv#XcN}FjV3alobKrU2W(1wH*yCIym$m-{7hIY{$FNyH14h&2auzlRk zCR+(q%NJl(_6$x*rG*Cg`nbCz70y4<^Sp0hAXIW;LE%2$Xl05FrKBWgBC;B)dj#T2 zwsaBBa- zT|0i*>Fl&)+jgg2`<(Xtu-yrbGcKgT#%2EzREH6VTn-(Aka#N~2CUKnR|LZ#^WXrs zM`VG;o;|yEIqd=b*-8HDeAZvpEozwE@y9zA*fjPw;TQO&?)fj|-}4aE+a6Dyi;#G`B%3=-fP zDV~FhzPrmfx(Pmc^ZNDM_tKeJ**rF+b`nvJqS+@g(4)|5P51H*jHJk9iBU1ZK@mw* zQHqEjDm!n~5Mqc=V?qM`JsoDfR;|ntlBKzsnGdfnPme<|8dAn5$H#|<2S$;@GB_N6=m3?%OphLH zPfLgxsIRE9BQqN`V3Dq>Qm;@J*J5OX(Jushhh5uu?%owqaC7GJ=6Lzlsnx6N{nIn6 z^gAN%Bj)Dv!nJ!mE>6!I8zPg0^_vhpFDi^>c#Wd3}l4RbBsna8C%I>Lv*5$ zqn}41&nq$@AOSTQMfrug@+w<>d99S{`cR4Vg9YLdT?uiIgXoX$Uf<{NBi0>Alg+jl|!9wFO)3`LBgR3yiH` zY0}z5Qb#0LB-%nwz(ycmpqX38O|k)%1dz;$@ge+EasJ*SN;-+SBqs#elF3T{KY^O? zSrW(K@(pZ~`M;Bp24D&w!ad6VZb71E3bzvDSn0r2BwoW1mk#a+ZYHq)|3*HvU%n6t zs_Frz+VIBDPy(yT5dg=diQqh!li(h)`65~=wdog*3U{s}Q{({FP)~|`mIFp{Nok%q z{eO|*iG)iedSW5ynw!Bzkr3{89FLO+pa&F*Z=8iUGHrVcJvEBVrSi7of%<&(Bp{+K zvi#Mp$%ZSpUf-Wv9KSEl)8rAxXRos_wKf*nFFP2;9Q~ZKb^eWVdahqKBp7JA*Iic0 zm9;5aRV95ZM8kN_=F1YTrrg+2YN=}OD(B`KYU(%IQK^0I|8wN9hc=}I;DILwD&5Y?FH3QMby zFMyG%q_L(J{)Cps_TC=YBSVJ5B4eUsh{UwybiNFo0SYxrk*61#b4yFhFm^7D7@E_r zRh0@ypn--27^afR*(>*6kr4<2F#_buTAJE=CT3UGHh*UEu)dUWUem=YRbg#qft2~^ z$>P}XSdUee&0##hy*Si_MR#?XL7s)J@V#rxQ==EV8Y^tYAjk=&OjQ7)44s7{Q8t^3 zRJRmLOfOtf2&F8A%e+X7?*|S=B@~7@3AfyoI1NF`r661mBCW*8bWBOX!N_4ixs#87 zK#*5;wIg30=I@C(D!rjVi*u^DNKbB{pyXjPl9N)Aq`+fl*NE@bb`rC9Bvj5gqled9 zOplFaq(vY-+TT4eg27mZ)N#NJ$O}p(MnlQ{p5-t|%fWEtd~ybZg6DezB_?Oan2HqA(}FC6>vMNHn>K@gV3*ht133VfXa0dV3mjh!6yd1;i3c z23^ReW~LzPJv|kCb4of5K%31X(o-{F=Yyvh>C$jt!Dz$g;Nxs6iuNFM6e$d*w%#bH zQY@v2JSZ}lOCi3qTY#L5g*t>mn#=1Os%mQL1}gxn%4}ssd39N(qrA4c55m`aR0p+B z3=Q{m^iPb!P6YK#{3;Su$omA`)#v6Kj26^|uioGTJYCj(RMC%zX#g-Byq$jyD3F)c^T3Cktd=T+( zKt1)9R!b??%EbmmQ(#6?AnHvnSHQguB`ukP%cF^*#!Z3nE8Y-59H@6#Ib~Jqg2Ma)i08%Dcv+TFB!(JVi%8BqO>JN- zqM>5qQd<*ZiC`O4&*svzmG&~TIe^DZ^!4-(LLQ-~w|j7ar%zCDFm@VYq5eUE!MGm8 zr^ItInT&LlizrkI21hAX6e|i7C-~IlbJs*Ac*`NOB zH@|uB_kVfk!>_;k?FS#f{qcwY{kz}(`NI$2|LWTxwtfHkSKoa1{SVu}-}Wx?{-53h zsQZdCH9569v$i-=JM@~p(qUwgToKXK-p&%fQd@5sKrp4N&ATX{Jc<1)l0msM^>4k2=cBpI5> z03ygF9F8&@ndweA%1qdY)YkMgv3I-M8~0w{ScVnp#@fA2BynGV@Ceo$=)xGUU>QRFAog0C0u5;- zK#||fXk0nM$#9lbTY2@d6V_rvgph*e<%LB=m#=NyfA$=6C*mDZ`yo~$oem2B!s7A^ zJ|W>D-skO5fdz(y1o(QKQcIz)Ba))R{JcENEReeb+6a)s0%c9w=G^EY(jyxXABn{X zuJ?$fL*`Ps-D)X9u!d5Z!@sk(e(lQorMdaZ0iv&~6(MOIWXwHoRp!_NP9?S?BN@#A zo=Ig;Sy0l209sOT$7S>QV%D2CKi|70;bA7ZPbOp|1^({SN4M6lUYUh=YH|oho}rEyu?JGaAapFXwbxloOhu(SbEWY@L_}n8NI3CbSmY1k;Xzg{|JKyv z=8M@Y3oX~LcFnEK&X3l0kKfi#_THTwott07|5xTFU+|P0cWx;e}R&L=db9m z9z4GNKx8Y{u-V|}igejRwp^MmLI+!c$pBEPQo(gpY^y2h$F8gL;>BJxzt`4X?CR|u z8cIytPEbN3VnatqFT&m1H9R{qzOc5oI6Hmq&i$uvj-2xKI)A~-{mcPD=24{7q66d{ z++W`ACnRn$KkxvHfQ7cg+^CS#0Y2f+S+suziUIFL5aq~sEB`xWB2yT0X#a){Cy9uF zbh6q*1Z2d;-M$65R0kNP%-{p;i6GX)({&3Rt>vov%}i;b zyik!-%~Cd5E3;np@;$sTKY9j)gvUy?(wh0XtBe()j3r_i?ul)a4nc)wTABZ7XnGM9 z-`S=Io4hQ#Xk6PQ&Y9EzN@?mWy|)VuxoqQ;jsAgJBmeG2fl|O&o`QU~sk38nqOYiV zaOU=%jmr;oH;AR0_NA4<%iLT-k}F=Hu4x+_Xzl2js_txRA8#9Ot%RDi#8KZh)DHU| zQ~^jQEy=go$_fjbRIlcEW%bRSZEY=eR(aMdj;63s@VdKa>KdNx5b&F|MH(4bt;-Wj z`ZChhxy|Df{DS${jLN|hb;BEdZU>Y1qSHncspmvhWy-bdlTWJ^#zIcXP$#Q%ZI&*4 zRHKqT6&PO(J!mahnZ0{)kTtG+a+_b3mu>BBD^_p~6%`F#qb(iP7Khqo6tk-rSUem_ z6>6CzCYDoFQ`6R0+|)fR*F3t>KUl9|b=Hi{Oh?Bj-QilUO3UY`HZER&dHv=F@$B*? zxn89-l&Usvvs5$7i=7pg;mYinkH=P~N)Ut)6#`8VT#7N2q*$aP1PA#AA(IHTKG87P zV9Snj9u%s;^Oy{bltS<|X#hcxiHJ>hNoA1$#_cQ#2x@^8x%F^1p!hdiAcJsMgos$V zSfnD9C?LvJ0Uki3hbFG#)@l%24OLA|L1FQ6@u*pij)_ljP+0QO2f7e`iZ-o5?k34_m<=2=QhD;l8{7)HIp8!qq8 z+SQF`Sb-}`tSZLp@XSCHQEIWNrSw~umu7~$Yq1qJ8?|!bGn~qo7RGuzs!NO-1q$J^ zvSg6qsqw(cJZ^CFlmyC3R~vYzItY!SGA7-Mi1m<&M0^y8aL8_e%uFH$ELK+V}J)^?&m{UB{<}I;oR9{ zxys|G+}&J{oH%>z@L_ZUp7ZoLdFq2u->}&z3!gw>8ef@?Q%}o7=sheIosG^a?UvkILcWd2@w>Kgak+e zNr;?t&dGoQM~pMhWt{!?p=RCHc9)Hjkg;_1-`}_QZ_^SZVkvYE4eK;KC?F?eBje)X zMI}Ni^W37M;&9weN{ICJsP@3-)wfZBPG0yDFZp;xhs1^XxCMlQu?|azRHQ97g!8ML z{J3g@BCQGymHYWu%F>AVaC0Qc6Aj&^Z<=zLyf|iFZji!e^owfBrp9zcv#0cp8j8hG zp^*8h+~u;`Y7@Zx&k$ViTMVY^NYdnAUXvc9RgruoKD zXXCa0&hd%J7<}c#czlObQWL0bERErCQ|i=utF@}@scCNh-omW%^~Bs1$=VoRMsSdc z?6JvP^ADcBe*5t=j60$%jUEfBG92bwy2hWTQRk<|2c{wD1UXs!s zb0c6GE6$d2S>;VJL7FK=dNEDT*B7_RSPGVmi`QCvw@>Gd18xVzDZ7DhzMW9clCy5Fx%qF+`c+MpkwZBJB zeu8p1A8u5x)?&Nr<67>f;AKQa5o#pXdu%t-naY=uk${rrCliJfneH=|Lk_! z>FgNdYY)W)J03pjxFd20>C5A!C3&A+zjoE?_3O56aj@UGZlm4CRjUuAQ$=)YwBJEr zYS^w*E(Z>~T;1##>g3>hdN1L){p`wLe)?|L#x!7_pc_z1eKBm@Sny^#0(VtI}N7)OVx0i!A-A@4WeRbat9gQx4;3NUW zY%VI&vVqM;Hb$dB6F^x_AJ1qun~fIPCzi!WYc|C8464#B}F?ft#Eg@uI&fF_{X0a32n+FE=%xHE9! zksf3~d6DB$l7*?+S*mO;&NJxI;GrHFiAA{GK7D%k315?BU{a{=Az% z3JI^IQ!}Mh`U?qlap+aUg6Q^K|BX9{H;v5Pc{tpEf9%@qt=AE=8sUkcMnDsNzy((HSgg zC1|ZKtg0?+AB;J%X|wC;gXa((yzF|x#r@2g#GwasGZXbAPu{(FLVTrN+O*-Ko!w>E zQ_RPVQ%BC6a`W)muw{ei#&f4G96QZ{Ai}~3N`$dYUSKWDqkkc=S0R^8Qh?yFQYXMR zASrOaTkaUL{9nDq1fc==1Jd0_3KAw7g&;V7`vKL&K*=hFf^aboLHJ|xQ~>@Y z(Qn)a3) z;-KF_Dg8g>S6%)xxG6e{DCzivf5rVUA&S(=|AQQ>l0V7cGLuornrtRXc4=v3n-QP# ze@MmmUmG=2@3B*tlUT3}E~}@3oAR%p)Z!PaDuKLTH=FTV_>op$cfahdn;UE_9vEg3 z89mg89QHkd4o^m?@hl00{+{`GxVNpTvu}E-y`?XIYVVu62kQX8Zm_4UxuT(YWT?tKd~HD@d)m~~Ojx_7KVmY*&HmK$^-0ak z%<-A=`Z7~}Lq%i%Kvz{~Np=53vCUFZ+TKxET3uONM{;SAR%@xLVU~VGDLWP<+$HSc zczKut=5d(mOybsn2!K_UO2*(|a3f)h2|;XbhO+6Y&RQ@gm5vV7NmK=801Y%|=GllM z#^*cF-`=i$QpCD9QezXahaby06}Oi@aUPB+DqeAw!h)ro(W#l9CzIEj*{vVBzfLZ8 zS&Ia1ce6QJm3bv-53HG-%PxMD-kfe|{UpefXnAH)0z7fK(WDhWoE*EyN5{Yqg>6f8QbbxD5W+lVPDWam zn3kB#;BZ7}`GDsi_Fk@#NA7ns;Fv*$s+23qAjD!>ZceU}EV9?C&01ZxQCCn}W5c+p zWw4_MRAwZ*fjL5|8#r+;766z{7MC|Fi{59C-z_aIF<~@qu_7`FIF_vfj_WEw>qf9m zdh~%{K&VL(&@VPx8@juu?!A7Au=vOml7}Uc@LzRU%WOqNwkU%~dv|lJx2?Uothfkb z39wD-v+IL{!(9#4mFOrEBCC)}r*Yvm^tj43HOjvOI}M?`}p1QTC?zqhxqkGGGvH>|wn7Au)vB5WnadKC_2CiK4) z6y;@NThHUO;v)V1_t2 zr_O;Hymfd^vsdI2Mg@4OYB!KinZD49nH6-FA~%I0+I;1B8e_w>JqfQ zv^iSlNY8AxQ6;-pJ~q#%eSYw0DP1eirV`nv$hMgrer;9ni!ZwpEk@C3-shX%U3+B^zmh|i{r6(xdHB9$!-Ag4OfKB1v05kVpJ zocx^J0;`uiIV#_*mU0DIYESPVUxrvp7crQ00X9tt+IjmIvxQV5ipnp=yxcw5Cag5@ z%Ys$PELLhFmrrMci^-N!*%?_RQy`ws#M3+;YZeO0;9)XT(!A0PF23G@kZDC1E?sg3 ziaInHUZzVR<$7GabSXI4&jn>vKE4;--Exz&lm=s`B$sDNiqpu5z^K?{Dp$-52#O}c zJg0h_n#_u8;-tl)ED1FruQE0w!`3Sc6F zkfI>SBOom_j-DKuoS7R$X^4@8Br@y#i4dKtMV888N#!Li&DM$mn~{yyqzGZ26_L!= zsTjK2Vy^8CO6KRNt(JVa$7JO>(cvY@l~H=1kf_)Q3Y!&|2qWBiW->3d7SPN1MC_K3 zC&ZGMTr`bL8UoJUGO=42w7Y3Ren_BCNutrA9yi}O_ z{NByUk!eb#Bm?F>_6H#4IL1(iUlB_C;pKN|N(ZQ)9#b#iP43*?0osencS$q&n}0vVH@Lod+isv4^6)5@?L z&s7v4o?BdyZ*&dy3vw%Wdqq_ECkYu7?w4S?b@dL7@N`8-0r>X5;5tUd#b7=f5er{- zQYl?$LeoWF4C>KRnFp1HUc0i&Hx+ji{OZNGKA1n>Mamzr(^)R<`qbap3{UM~_}OXuoBL zgZ=g$d-vjI#HO{E4%n~y$?o9Kn{&O^uKMMh@4x@cpZ@vX3cEl3yzZL~XIK98m%nfS z%isU@(}s0Fddrxk#b2z!$&Z)NT zbzQbR%UIGfbFHguhUbO`qa9n$HIB}|e0BRhl_ip)HvQCj=m%f#s~3n1r@YQP?Yywt z-Ql9W{mxxGU^v{q-F~~{Pdgp=*_$S^z`>!8yXn_m8W-T z1Qf^NAp#4iS<-7iJAC8eZR8}L-kQd88NGwIp1eT?8OnR!e?&bzYPr&dQiZax7!;`X zuG$>5CA2$BTzo2vhw@61AYClYQ&CZ_ zB|UZa;-!mcPAJ(a(V>Bax2LbGOPL;v;ViP7486-KanaH9GguzCqg1-wX2I}8kt0X{ zJNC;YIjRuvVKU*zN4I9@=H~BSAM8OgzP-7&rnaWKq8t$>ARjPb)oZa>QYpap1%ynQ zi@Y=ZHn=umy|m1Qp?&@M@y&~8Z-`It-@SOc`1k=h^^YGtoSz|^pr%H<+u?Q$NZFqd z)a+$NqR^%i{dZOsTm)?FeM`T z#Iu_>d2fhUu}9%d^px#JKA!8{`T81PaYH1zutOy|K2?` z?=HQ0479Y2FCg9#pB&<;`(vZOvgybGvn6VcRG5zTdR3k*S5t(4hT;m7G9OO`Q@+XF z@x;Ls7k9?SIz_@nc)RTn}2U=0ts!bw3BE4h7I7Eo~80d2P|p~&2l5Y4XS zQiv2>DJkhd(vfhx6gDn&Ld21Nmy*7ms`^Ud{MKfKG?O|l2WuuiD0}&-ttt6fFOfH0 zPEV2Bq?8mfL>Y@hE|~sHFEPNn`&WGVG5{a`7akTVvGBlj&|IXgki0o3RYdtC`CY(Y z8own!gM3hAs_QrUH}U8Ni}rF%JXC1o4k-0JwWZvg$+*pv$lglb$gY*kuE8N8$?dPc zyb_GhG^ol9CD+C~<$VRRO#R59ke^$cBh1#cTd17J9m;O0Ak)}T#Tp#%YqDzcs>eH3 zx*Az$nUv{-wewMt zl*^RE9XO z)RHF!LYK=&F$tGQOiDs2Ch7%n0)Z(CRg)Yh`#4+za;a3U0(4)a!TCmqKEpCNfo(Ny zt(}AYApxTyD1JomV_ZT~3YG#gDS(tpowfc^8xF{7kV^|N*e*m5Vqsws!%P6aRo&Ft zJ9cya#YZr7*ktTesVy>8bPi3_TPrIY#~&^|dHjiZJX)Kdt;iMAKGR-28EL7s*^pIG z%TT$7=+~=hq?u}KZ03AL2AdAH_}_3K!$zBhV29s77Fbj~@vih5O9I?Miu(2J+2n(rMv0)D&B) z2JZ~j>m*FH6fn}lJB-%^%x0eQ#k-+mp(Hu7r^S-k|B_K4wrF{=f%w+vw-<66*!tn6 zq~0VMZJ3a%)Y8(ZXiMN5w~BCq+nk><}M4FZhe0d`w+dP@Z>(cL))G;`C8e9Ua9nWB>kx z$Io3jamMewyXWPru4f>l5+1Zap_jcSa*KOqvMl0O`}!whzT6t`;~VT1oJ53sdm+Ie zmynh!t1uGti&GWpYVH{7^5|lPCOb1zNDxMgyQ^6lZAhgCmBdrr17itVm{);sU{Jjb zVR@+YI69NYuc>LP4a`=uBZ>F~nUo20USw2qjx5MOoE91w6T?e#xoY5svIG5t5w7#f z$l;~NheuFE?8q2KTmp?qq)C)&G@7e*ybJ+eveJBQ?p0x&I669>;N#jSaq+6Os@OR) zD*dV-GbM+HW0})ehU}w8|MybJ7&!;eREEXa z#Pov{BIU&^1SaX-9BooWRCfMVB0M~()h9!Sjz3#iLveM7w=X4&DOG3bdGVB}SPcy+ zHEdCNIoQI*r!nYpfS@HthbP9RBy!m)Kwn3oLXAbE0v$nteIq3W#}Y1^C&helVLF$`Zo7#Iv zM5BAr2Ru5EeT#nzZDrKRPi=2Ao~P;y@jQ({9SG7jy- zb1?Wkc=rA?gU-qzTOj~U)mOH)mKe$^ER|zR&z~$tc2yN?C0sg@6!MZXH`a_?SY2gQEEr+e^en!O9E`9`A1-8tx~0Q6CL>dQ(UD z$lRT4y>(`dS|eAS|K+v+OEgw_^J#*GwEqb$_9Q|P7u{P znKnt2N0kZVjG0<2~Y$y3qPkDOiP)tU{gHs0Rr&zqGz$UalROp?6RV zjQOUj_RayqSRyaXOwUTsRjTqzj73CLr#W_pFE%oCJPEVU>IOug!S8B#RHUbyi_4YE zZa$$AL8Nj|Lc@7bWN0*hQc`d^&g9J!DubhJGgJv_RUAOJ2=3F zx6^swFY7LxIqH1$@SZ)ZH|%me3LD?{y}KM89YJz%*uQ_FPhphoy8Fs|hO`A5XUA_9uiIpqYulZ%gW;^>WYgVsax8<0*Jj%n>?c6CJ z`*mA4J09HQh&`3lk;7XzZ`iPY&Gw!4E57~Xe|)!R_c4cq>;CrhUw-+IKd<;^#otz~ z{QI{n_OD*OWAk6v|K~T~{o~sozyIr>|M=s7e*fc--~Y$AtL@`bjvTz;<8{m@$Zpf- zD}4*HL?ZFxUZM(cAmmfc7Z?}ENwsn1z_n#~=nY7Peo_vT- z$~fnB?yQTu&nA2OZDCuFoj7##xX+$YpV$P4?FUZnKXmNqkzLyzw%Yq?^+iSSrZ$e& zH`f|q$ul80Y}MtN3X6-HYD)C^>TFCXDoabMYRifIvf56qQfn+V>WfNhI;&cS@4S6= z4^xrG7Wj40<^zOU8*0A>hXzr@4SHUCXGcqG&&1PP{k_+RF!#7IePars2tYBf&(7Rh zc(VBX(>osVk;PzR2m#wYPVUP55~ImzGgj0!JnF+$z-mP~VtFM9n>BT*_4Noj)z_mf zq#5y|KHSgvKww~KWDMB&bb1;Mm1;?mamfS|SaDg-kt|7CxSyYo=amLmLqQ%E#t0`P zz6_RQba?pnQM@>ta8<%w0i|ys)@EcXa;2FV<;oRV0v`48;^SL$)3X!P<3kWm81w@c zgW3bIeJhOM!RWN)&WS91m7!+{mj(O}*9BZfco0t<05yrvZ=Zeo@b>-E%Qp-6A3b^Y z3N*YYPZs9T^91B;U4LZE?ww(Q^_^{X{+@>7g3{0meO;4>L1k1(WvXI>Qd1FdF=Wrt zm}22)N#0q1HXTF#TQ3%9AAV(UMS}606(4VBe7Z9*HagZlaJ>i6!aFx6x^Fz3c^reY z$j0-oxXM0!4RU^8&+wD$lXDZZw{G8l_3VXS^yLvVW!tVz>qG1uHoCuMeqH+VQNmN^ zsW3OH>96g{H7rQ&0r(v7)5m*zsRBpLW31-F^$Qbuj^9JDmtUURG9)M>@~40lRrn&LN+OjIWYw~Q!dE0$ zPcr#8zK9t8G1><9#FblcVF)W22)@l~zlGS#Pmb6_*ui;p;{1sjkRW zWU8*z=uqulf+VxeRM=GCwW$7BUe#!jd;$A@g3p(VHQ5{<3$lSl$At4UL&fCMmij+1 zY3dOr>(djqxRgeH@$Sa#y`uE-F>Cg_mxA~2dWeU%yHx(o-o^B1OGa@Ci&;9#wbhyP zCdwZ6EIfZ!OK4hU5A&8fDr8HHkrpBQ^*zh2wk$onY%z<`(so^4wb;a-d=SxR9v`9K zt2JeFbH!W<`*y?K!bi1TmE}#vg&i!_quw&%9e(Abr#J3KMaE?+=C~6u!rZ6vD=G|x z2*Vq>qQ{~x%~zB>eLDS6l$*g4YfDCZMsF<)->MnT^z{plqj-k|hbF~DUv)vPw8v%F zfFOTt3Zb+D1Fl~24#gEGFfb-6G%Os3pA?i3#3xhnlua_~JPj&^fQF|@T3S*R2HGHm za&SIRmt=s}1;{iKT0-)C1>VB7-jMvluZ z2<-)?`oZgyQ}^#RR~WNJVm?7#eE96vP*+89kshKhOT^^@+wB6dnXOJ0^ZogEQR=)|)x zCmt-8@Ox5a{nu0(5pmH<`kMip=$%|=Qe@L3O+ssRv%qGN&gT}>JDTh0is9H)*(fb@ z{^O%}jCkdXD&l5jVpTeN!4Zl~;To7>|Qm z76mB`>BXfV^GX>Bw>S!)~WtFL_MV~to{5-CnJMZr8?&glJP+z}*2o^QX!mfV% z?wVyB(D&|kTjl7|{Qdicw}(e?REnl-C?=jM6Aq$xQp8To5oWS|i$WrxMiUZ~DYT4c z&nSk_B9*dffh2!$#G$k zIJ%-W19(VEDkVNCRp(uCMUqF#SPrjmbzW*|uzzJK*PI=m7Qm@Z36kX1vSodi zG~-;-Wc}@a&t`61pj+UT^R6zk1R24aZ|Ev7ZL%1f<3nVrVJ_C}`g;#&ZsQ~`+dIkN;>7J4TsmTsk{`uG zloL#b5G}R}%z;rzV6`=OzHa^`Q2=kQL(g4Naaozg0`vr~A=QmNBgFW`%#E9mfQ+D_ z7Cs%`9I*n?q3ry;JVVp;%+&0l5t&RbH92;8;_*~-72ugBb&eG093i@tp5DGbIz9|= zZka_d2jPZ|kEO8zIA((lLHv4e{?>z~8`F?OBxl$HR}V%zDzZNTv>14MNG(MySIz=T z$Vdff124oh0#`$L`Jl;TK&TH53mNSj9mZ&Qq`$kTYw~$=()GdiN{i8u4_K=;#oSU< zS|Lho5mM?}X*qy*=Xgyt=n|&@E(D(^RqZd7N&}hnU~`I+Hd34&7Gg}GN$xQ+?%o=o zCz8Z-HAL3EXrjMBlt~`ua@37}_2~(MbfHmQt;)NecJIdIg9kTfqhqP`BwF27mN=d~_Z{Ueh6U0p9+^o;WMPxcD;iwLJ6lrE5` z7gVNahX-dz$rDH8J#>B{8l88PSIA&j#!6apQdCq56~<;hPk{BG5Z3YP6y zTbP^0WaZilv<71B>a`o~94-vp*uN?2!l|r1dk>sE=6ve#u>%f4z_AwM*-=trDQUo_ z>fmY8k+u!SI)`oNPMvYt>#)hk_54|P$5X4$9z3*W#qk}0;yLZzy>HX5)u+y!zj)l< zX**U$4o;3v+jk;Dg*A)gp2Mq8uGn|*81N9z&Ib-3IDCp&bs8`n1fLG?IR={Eu_Fgy z+{0#T`>uVvc94V#e6{TmRoKorIN}GwR8C|P-(f$<;*OyQkDWQO56eM+Z~F}!*Kb^h zSksCXKjX*GKOI`RY4wKnE@%1sPha#sxIN5k%cgDX)*e4|`p|hN`_l)uZa8&f&DnDY zhy$zF|M0h;|M}0qUpjBUY1Oy?`SZ#@{25TaU;gpKFRM3i`r+HP>wjMV*OlLX`=8(c z;qTx4{*Nnu`p@sa`O}~Ou+s11-ZTEx3m%e;_}DhuLgzF6Hp%gIYkpky{XhQs-Og=i zlRjL#+0#2Y*wW!*w|nb`)eLRVt2fWzGZ+}9zu>ApJ>7h^+BxoWBDS8qa%sa=7uwIs&!o{A>w8NY8*BTznzcGxk-AWkW6n<;AgAl{*3z=lvN~`JS{iXE0LeczG%_I`*@O7l(4e4@ zs6;wgFqnC;TjKfR!~0L3Eqx@2H;a$wrYFXR&&}}f1>dd zP55D^t!JPIj-1Kov=5#7#`d;>VCOZf_pa~@4r+b$_9doZ>4Z?aKn#sdj1P@X-x;2q zzsJlH?R4I?@yKQu$6c3?ykf~H^AG5JnaU{P04OIe%u>}rSLSJ~xvH$1T0=*VJZI;o zJ?oBn)Vi)dU}x`gd4t`CZM?xYoR@5st)1=dJp+Sd-Pjk-jt-1R#^ZE#7)0L_2M-_G zfBfS4v*%b~LV(WzPF89P8FCV&q(flQ;b4QdB0FFSETMi!$kYB6iz*?0)j+PD@W;y* zKA8VVDjzh*^6Cbt2;3MZJ%pA}ca-vbOv7QGBc&CoY)FOmo9F?pfq`@tc{3(73pjX` ze@P}44?cxNf#b8eq~i|GJ{DF;q#=)NqGgcFsgx$@rDoCwNXbs2rE1f(uo&j0cEh|! zgO1{)Kq8S}j7j-#_?uBuxD>MP318)ZlCp|?G^r3%_sGQQ-vZ2{h zVMhJk%qLT#nozeZZeBjadDgKTuWsCYMxUS0p(@JqMk|Nzv7TIixHLamYi3qGW6^Gu z&0SwydRg&MB$=2m*DfgabxaY9(WW!$#KOWtbCH51v~)CEbF3)H_{3y9G;w&Zxbk8_ zK2f9)nOoa#_Rfwij6%~i3La4#=Q0OW9A!I;=zpxK z{VJCh@XSkvOw`tYnQU*iOnz2;;0n5x3qt|{5o@cendzJ=zyA8oiyneL-!pu(h-eT~ zXFCSR%8Q%(jpd{FN853}>1ye#Y^coF&zh=Am3l3`v3hA(PbI|sF3w zc(Fg~Y(S?=0M|S@K9QOl1u|buYAm%vtOClD5f11?a(qfE21RTZuw8swDwTu90Th-v zCl9gBOvH_H!R*5R9A_=Fxva6Ky|b+cgj`st(32P)2YW00enMUbfI5o&LbI)|x^s@I z?OUWncA?ZuhDDZIqszl#3r)3^O+EeNGk4J+@a8?Pp$MT$719hvewMPVrK`5Fqgk)W z261_bc=ljwa-^;tlegULOewD5c-?-Pzlp7QQ$>+pr^?LWP|3v;@YF~)08||u9DBXJ zuC^Nf!b+1lFHfF@G^rH)WTW8jRRG2r0F*rN~&K%fa_vs}QGBs1d4_%;4sZXxl+MXX|yvUv%?Q4u@}UgN|?&m|-E)0p_< zn-AI1h=I9ot?n+ddi%*F+ z*|wRX5zZq~X?3z+aHyxN+j+MD|0oe97=1N7c|=UcVA=c&etr96TI1K!iP7iWE-4Z0 zksQRN6#GcpnO=!0#+(9cMo1W28&o0+)Wn5j$QWM{l7xR>gzL^_vZ_NY z5@i8eu9JN^W)D|onwrGor)0WDYYJ&G`QZsHPq4)JVbPI6{?Sp1abaxOtp)6)2nKp? zEG{nEcu)UQ@33gk5F#SPJCP&ON>wsT7F*5CPGeEyljJGDDoH33C4eVsLNTA6t-w@( z$tPk{s8LAYC&xwwg@h-EV-e}+;uRDT;2-1{8g$Xi9X7vHC(fQflP3>Kk8UX~PAqJ& zgoNb}nG56@yx=@>OjHsPk!TCeW4Pw{CufFu#S#TU^g4}}nK&3_xzEm}%laeI>I1Tj z$t9@?%)+n$U0q7Hq35>vC1E|N4*ra4Gjl&XTXM@}t?Ca{Ah@!{1VBafYeqQc=kx{S! zhk}t85gLF(pEv|2lgJdFBm-eVCPN|=qCs4QsftXHJ8Z7E6zTG~d;wnk5?L zRY-ShbqWQcEi{zYT8xDjQqUk~P;RYlYwm67>=_%lJ~MF>{k2#dryx2X@P zT0!P$Y8yM7`fn17u9pHibXz{a6$OPjW1$EdHG4HpZJnKc*KXc_@C^Ap90~C9=Ftd& zgeOv4n<{PP#$1_%MI+pVI`smnLPj7oqeKYAiF1J_=`D$|cj<7Yx+6)l^C^4iamjz-uzA_#?-uI!f zAWm^X2o8@6AHO!xj`p!pdP)!Og@j7iRKs$PJeY{nl3&J8>2K2^t4fxuD|4pwYFR zTTqdV7&<08ToJ-*nKk~+QcX;!m3UE2iwbF0Mu+xQi0M|Hn86f966$76L~v74Re=?Y?W_lJJY}0m@qpz zFP&^=Hebv7EP9D9^U#<8_wz+A{_&yVRNtULb}YlkJF%?7tSuf)7vV|K(R3~^Oi*Jn z2A2eJntl-zd;zSoQK=Y1+VTXbv@NO=W$1^qD%!)-#RfM)6IGF8^%DmYTQ=BladNn{ zyP^Bo?x2H2cw}sl^PYpJH(l80n3DrTgTA25-U%H^yLUPNuSGH#?nNweskmqo`Oqp-YyDzR?@z1~8fAiOW{>Qpae_#36?|xeUm*0Q0ZSAh}-~0yxQY*gs=Ewi{ z_pAQ-kH7u(Z~yp{qt}%U4wl85$~@uZQ2)}rte z(ADwyeQQh7Ri?GKx9$Fo2cuK{4fWTmTgr+mjqdUFT@2b*!pZ5h)6UJCH*DIv5gc^8 zZFY8Bw%XZk1euFK_sDaDJ?-t)a+bHrJF^*I}L1+}P0E-hvcGYez#Z zLDrwn4)=5p!{#?OGd(@pf9=-vy~(@xUOry>@bU{P!!X=HLy|y%(rkqiJ&<}sp1R0T zR9e|wUeOxKYgiN_d!f_mvEnQ)hJ(HcUKW!TgK-Spn!q&gANCKzl`YUe%+J%y7Y&GU zvGFLYpisg+ueg;FIy72k3E}KVHCq~>FL7vanV;?JAnUDxgwW%qjmo!l5h6}lL!;;w zXP7s)=Vqr-t~A;^gj`r{OH(^Oxzc7qQ3F~j^Yf9dLdBCJSB_R&i5L^%bTMjNu(N{4 ziHC$KI?w1IJ}BC_qWo}uSGK`m%iUTKn!@{@5_y$};uaRx+R5>e z`o?;PZL3xss1Vw?BiEwh()Jub z>$2gP?@>UjHl5l`DlAfBk$yW8J@;>yySnwWDJJFe<#;NDPZLNEAC2)wA1o#DJ4Yt}k$ zB0=20fA5*C&}JnbSy=iR`co18T4%@os-YGjmyoP%u_-HF3iz54X7wx1^M&aKZFLQrgDR{wowa49K-ZYnT$-57=^hVV+pNiJx3iVDEOUB^P&A+S@yqAO!j551dj3-1Bg>L}jBVzXv{yAW-J&NoKDayZ zX6(tY4`*%^H|5^`byWJn@Omh5xS*X`_@X!sgd3eST9M7C&_$%iR9y@u#Gr-5= zsvi*bu+^PaYfex^Z3Xmz9TAI6>1G)l2uT4deA?~Qe zR1q-MYz|s)VOF*p3-us~bUsMUX_=#AXe!Hcx&2Qv+i zpNm?IuO<5Pasl425P(6Jhdz#+Dx<2}NsGT-#<~?B!jC=&#x%P{t z@qW)2xn58^T1~Lwz~r+sl2Q^=P$?0S6zU!}fB%beT>G4RJ(EF|6`j89;_6DAjDuNB z%9ikwQ`uzpSHWH2e!XYX(~FurOrz6XigKy(?vq>Esh*3fM=sPoF7a2~PhUED(Zesy z9VL>Ng9GFG`E4)hEwcN9;oF53N;OkGp?ky&y5#BObMEY+i)UP}c)NM~1PA+gBt+8Y zvYyUnO*6mTdGwjf5jHg4Bi!T}k(r*7bM=jrce*)@a;W+!BAgZzYRWXGFe1^C>x;H> zf)Q{vFhMC#@xnW8QcQp?MM6tT5afn?GB|qwu&W{gTj$}bVT5(R4#||7DoV2xQalZe z6fAHR;ZeXRVkw49P--+o6mN3n=`Xt?Dr}*E&rBGSJSllT6#-Xs`8;*1jE9H~E_v*< z7^c<7H&Np!s0*wv(V0yecOP{wUn>%3(bHlu2~MF<(?u-M3mKGnH2KEI2VOdZerkW0^Fe%3s3kYmBo+}};)02K$l?@l zNzYqWZPjp27`rYl)?(4=vMpu)MJ6+aA&jL)2!kT3;^3^Q49(F5h9ox0tEhFE?a4iP zJ=a@HDi=ib%4>6ma#TTRGT32>9=TeUmo}`TD{(~E9+TKrpP?_%=rdEbc_OL0bJ&*N zQa;wzOe^gLchQ)WONC-%`86f^ws^}u!@M+sp?)zqX9NU=#R-h^oCFH$V}e3ZW)$dq z$<5O*A|CZd;UOVmNLr#U7~e580i>lSp@oi`mX)PoW@O58GBen*tjsJbOI6+5+gOsP z$d_`3{0x~QD+7g8N_AFxh60D^LPAqmZow3~w9aI#w*f3}ZtAG2=&SAM?FJ`#YISqe>&wWJhTj zZRk&)yT7>fVd?#=g-4Y6`;@dqs#K{}WXf|;zDZA*9wCMYfN?hHkgfa^jQu`Fpo#Zr-0AMPW>9OMQJ!nF$VMYaxmOK{S?w zMv9Uwq%8RyZ1e=kKvBu}L0tY|Eymj|i03h3a0P;vA2QI^**iKsFC|10YDem=-j*^G zG=)4HfKn8+lon=}SL;{`dUCgpL!A^6v5`c5QEh*cRR@|!-gH}hdu)cMUR|lx2bSkX zmPHjChVZs58_0H}>Ea&y|ZW&N2$K9^v3 zP-sx{wAazmZo_7WgZrH}BiRImf}4Z$PRAY22iC0G<9uk%#?^-o>^-{j=R-Rk<{#Vb z#q#LF;T=wE&pJD9+q&)WmThqOZQBM9oCEaMe*2><_a6IYHEO`mqG@&uacuLNZO$97 zY+7^JdEfC}NA}~6cY%C#!Wj~`#V?)b6&Cl2mEvS-(}odBUb z?LM?`&yMZeo$R-6-L!d|{e~4ku3WWp*KF9mcm450_NVslAhxfzJF)(UfBg9Ef2`ho;D^mCwyyg2Z$EBW zWxs9phLszB`v1P$a_-=sAOG^VKmYS@->mt|k3Vnx;SWEq_`@ImvUTICKd()cT)1Vu z{%eO^cQ1>cTh6Opi?uU;$J2X@5Z$XS5!W@C%3AI( zb!J!h_K!}A>dIY-7`ChX5l@$kM|LJ0cIF?q{1MUQy!(;^o_{MMgs&y3+F$wY9BieXDP2sJ3R?8rlu!?i+7k z-0rTb>8dU%Ev>3=ZNN^es=KG5tPI4;#`Y5pol_%S{e2U6`up#Vjdgc-&fV$jc{F|p zN48h*UjO=Tk@k+t`uG(SQ6wyJ8OsG30kW?EVEh_XK{t(c^erT+h8G2L1)Ru?JOagJ z>Hv;b8`m#3$Q3UF(#^PYpAcn z9;?)1!l2fmCy=sK$$_|2DYL<)hI0pdEC4Bx^+dRl4}KLm?riFthl{V@F1=4nOo_XZ z^5*`%nbDrHp^mniMr6YxV!{LC<0FG3e7r05KAu&@C{~KE#{m*}2f7)*MaYrIJjw-%&Z@RJX=CivK1J_&oTaezYX}R5? zDe~X3ceULw&RZ^H4snt#P-RJSh27m9ZSU?r#kc+8^vKZU62tk2gZtL5`sdnR-nFlv zo^{%{(f+{6Bo2|t%4uS~p^KH80)SIhyXjCsO*A)*PaX$ESR8__1%`PV*0`{)k zwByRDh2iqz+UCxR3N5%p^&PNpH+3~ukM#5ohor=BIls~SqMO&I4V(9zaAuNAsx+*N zptsO&3kd-c1+~OXL6!=+ssBO#mQ+@ZWr>9=DuoLbmXr41@Nx2^4B~ePTKy}2Eg?U7 zIhqBTL__WhRk#e2{6H?QNTN99zg&o^X~I+zJD!{bZS*~q7_OnD7Q?j~p9IN6-h`Av z|U1tvXKDv1YN{!~g9i89BHvCaBlIM5g2ANk|mSyGF`$vX{ zo4J`HbK}rMadw7;e3KsJx4!%I`B_b#&D*1LO#h^sJJQa1&*7CcNidqA_p7e8RoXtb zbw0eSqiKFs8v3%;jm4-9)0e*1RGCy+ikbVvsBHSuVK6q%rh1=n9ZuHjEY9vRL#KH(`R&rM*3;t z^?Y;RaDT^WOMB~hM|p{@>)EaO#kuQ!LpDQxcOCA&w!|zD%DCwzV^+@lib3k_=FY17 z4FyGSvQvD!b$Sl{zF~A)^mq~tF`|~PN$#(+th%>42J!V{Y1UUR(JRqNnlh?izEqCg zq`fsh%fHu4%s!gtz8}8Uwy?zSm-KTNpALM3z$Jjg(Lyz%~ z;u5K&oScV3wQ_!_#$2ENYx^DX;$voJMt*14cz?CUT0MBHe)>sQU3{>YyStmq@nbG- z=UmTUxa{HK>Fwoq{<8N~cNbSrH&1u3tC8`6VaY5cV}@K z_TZ@Lnduu5fGmL{P1xgM$+|FRQLUUYykTimwkBGEB@8W`M6H@6ltQ7_@4nGGFUHy?g*eZhS8{Dm`D&z-t*>CllA7q155Z(GndbUmfGf3Uixt3S_ddoesG^gMg= ztI)iEM@pfMMNS5F#S z?qyMX3mYh*#LX#n;&7{N-@KhoBe1#j8l^`gR2{XmfagBxC zf~h!T7KJYoGqQ8i*|BMSajq`Cek7ik7!fZe`2RmsZvoZjqOR+XJ?^%1?m1_jJ=b1q zP3>%F-CNwD26b1c;O_4HAs*s^7!i_?gd_wB5!~I~3Z+1WQg`pX-%s~Bayyy8i0kF5LWMW8HspFNMHh;&KSsEbOxfvz?ttQ(YyDs>QrQ1~8S=pFX_*_|fXZ zL{D4SWPgpJR1Wj&d?utTpn)za>HZunA<$KAt}I0nfnaim^_QfO$A>97 z44W8`;iTpP#~FAaS()jX*%7SP}5TsnH^p6X#@g{&8MitJEUs z-_?9c0oTsa=JE;ab0_y-*t7Sb$1X7P?eKIs;pKVgva5rOi`7o+i+gPkSlPg0%E{f~ z!UJa)M;mLqOP7va-hKL#m#r=As~qg?VPWN9@8ImR-^$9-2C93{?%lWl(#6YrZXkPh z?Aw3khR@ZryRIHObP&knZq8l@4m-Nq9X#Z5+Uw#~pBq*-cKfehzH#-y0nY>O$Dn=c z!~xKG9;c3;ID5>~-QC8@`tV^FH%EJGn=MwSCoIXZjpJ?pje&{-#2#KYZg{r-Ra_{UHG_}j(}e^~8UZ)^Sc z{o4<3IOY7~w%xz~=eGUFE*@~$xbx@Vf8GH#RlofGFIzVKb>n~j^yA&{A3ZBHs8PbNEh#dD{N%chMRt#<+moosaXy{HgAf%MjFl?Au~gsG+1}VXH2!26DH-@kW&*&M z4}N4Y))WfGN?nz)(qybK*VmgXzFsf`|ZM7M6<2!Mh}gA%sa2qzB@$!rLnW&jm7 z@y_)4%*<3jAT+w$EqW+TDUymH>I||B`nr*KFMvz@Z~=%Ex2L9n+tJZd2WtQ*Fs*_B zIE-y!0SEQlGT43zL6kvW3nstdlL1%`Y`>t-n}W~%jQ#c*+II-pk1#ZPos9vJmi}O6 zW$MoONJ~poS8HdTvAUsmA}StQKZ7F!>e@?h2KuOq`8=g>X$4cPDV9U0n7ij8Cx=UW zPoKFOaQ*mYud`NG9?tu>{JLe2tFz6n1GZLvF=+%MQdibFv0|zln_YkfU0Z#f>1k`| z!A;vd4mcb+dBN&{&4DwW6Htwe(2{TWbBVR*y(+4*4wQQUdgsT ze>%d}ZR0^3XBX?_#2`!#>7cAv35d1BX|!+T(L14%7(DFs_F zVCcc}3YYc2;1~wtNoYa|m1TG|AcfB%uBk6Fti51Z_g$*}6C(O9#^7^MXprUt#fAg? zI;5LG;depyUuC~*QY;%T z1`FOlJQ}5f3;KS|02a(b(^n`e9X$^*^WV@5fKw2_WC)@v3p|PFrVPz-fu&Ib!m1dy zb{w!Hwt)tN>%@Z%5f6K_HCG~>1wKVvu26;{84Qr$#TXHGX&k8k{VvYnitxZ0#KW47 z02W46yy1Zyj}kp#!3Q4$>2U1^=V$&0>T-um1(rZ2dz=3*tDih3O=0bec)I+RAF61Dqqn75{8BOV^=mGW9NRy@S`J-t= zK2dDG!xTTKmen;jRun6$%0#M4Lkac1Mm_fM-YStMDp-9wQfdH`M;+R20>}4_P2=q* zUTIM?^r%i_Sx?*BCmtZ51lqar?uVv+-`2tRW-J>SyT$0&Qz_JD%-1TYK=Ne@8HYjVv(e@L85%zSzy$65-OB! zq7V7CHTkj?;m6XEJX+l{fiv|=P(qm_@oHFQ6}KZvJ3ND+R7UyeeN=+uj#TSu<1Ds*0aoCvR z^6E+n3pgGK>}@d6o12rJ1P>rAg?R-{ZUJ}?#d?7+8s=Uy830V=N=2!m7Jh0Sz3pA& zKq0#wn;01h;V-~xfVKzvGDj`fLf2$|F>qxy218SQ?cnhA{Vb||16L~;S7!ReW6eSFETVd_VdS=s}CQo%ubAS z)m1k)!oF1{iP{+eNzL>*DdCj4s8SGew(TQ04yXDJjtY| z#>R&D$EOq6+`e{&xE0qTEh6a{QzBYaxk;lOin)0yS(J`%m>(Iexc⋘_{;wxuGBT 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�(IS76|JVc=xDLIxg!!@6 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

H*42w+qxF;U-0uhu9C6UeXnl!9`3Nbk>({mI z_<^zMHua6CPuZGxZx_wCzJ95$h9<9T)E15OO?RuHk4XN=oLk1-eL|}EShvg=1LVh&)~}OzoV(IS)hF_Uw}id*>1VQ+ zvQcT*!jgQ1LFZoE1*-mcH~M!tYsSvqJFJNg+!{pENDIoOxa_7u39UN}zFy z=n6qpYRrSGnWg#b{RWM!dWc0~aoN428}BSPv+=yjOc3c2$>%6rvUrAE6@v%0j;I@p zGs{P}+Y>61h`m$YOfFv1-pNlvQYUiDkZ1~WMn<03(C0D80y_5kfGF#}B!^K^Km4d) zlV941LIcae6;Yweh)gZu#AjtP)3S}_b=k73c?j|)QdCvBf{>fCB~3@CW%4tLQLJEU zdL#C73W0w$syZoz69^S&#%D`}DHk&YxG)kVCsiSFi8b0J)Ky6#s-AQeS<2OSkoX#{ zwn4}4ix#Dp=EN4or5G3(s!4C@iIr11#J%Ix^dB((BkTy=g_wzk^t@uxT@Ltdn6YHH))AXyEe zkoKB0$z}0K9rdVY434QoY-QKbsw#6@>TgwVPUUxX6k4XMX-sQAy@Q0Mb(_ql-tHmu zm~~(Wi`QkCWz{()`quH*5)utXttbV!H7v?b0MK8RQ8){1HFCk-k6NZc3$g_w6%(uP z>L{R1-e?q>W|lEzNUcSd(jo4H+G=z|A!4SWsV%jCJdZ0@U{Do|o*S0VfqrF;4ABQ3 zDe62&l}i)X;tCr23v1}YG2%65xuigZ=#Up=DtmO#t~F9CYvNTS?R}lo>zng9V3Bd?HI7o^n+zOUjI7-XvqHMKv5YvlvT4gTJf|^{U#YYNC$PHcq_pC= zdqv$-*#4ywLwtT}2Mf;-sN2)>)0*;25Y6!lOSE1gFyuDo(9$ssUM4cY2dMT+{PKwv zMWSd*LAh2Ok41*FA$Olh$1~?$Pv&=~7v$yUJm$bv>MT{y?Cw-HF4;PrLqf#>EZ9l5*X5FvQ=<$=>y}lS5E=n4R5`&(xK< z7GBcDpx{Wnr&pjya6DQp&1SiId!P0VI2V)3Ry4H4WET1qfbh@Rz4XL$PO-#+0(&P1 zU(woPcZ0TRVZ9T|Cx7Aad3+URC$Gss5ma+I*jmZUmQZ&qAqrDQ!^s#|9i0=7g=MCv zLub##hd3QL=CuF75!Zc(&mQ*P@3+s@4FsdwciP#{*Td-^(bfCVVYg$Bf3y2PULj!) zKiN4t{q$4di68C%13I|xry~JgzyEmH@$io>_9yJ^99;H$`yM>8-|w_zpu^AZ4nfh8 z=PzHr6c&L9N#A$rq~o!J9>LY1enXEV{T_d{d~>@x}W!j(k#QB#N;#f zUIFw7%;xohcE9|hbPpOS$K5~Rv;#nwV?Vn%Wc+@})6Vm3=n?;LEaL1X`x9YKRdE3h z*@*OfZfI%(;cCc94`+vC_KvZKgERbc3%$HO(ownb-SLSoeqMxt^8v_=ge>m>(qwN( zUsLDcWMX1m#?_px{L+vRC^|0UV#OVVTEfL%PEEZ;iSP~24sGy_E=vt^O(o8PoLZq7 zdESM^X))3Gknpt2p=Di`-j2c1S?j{|F4Sgnmw6OmhI=|?vv|T=$-2opW%Mk zsi1fRiN0ueAvH7?Jso>0yevE3d@l9^GBc_tJSipC{j|%mV?pO5j@lo&5Sn%Q;J#lx zLQkAJTCz@}^tARj)T&8h1*^$4I64gS8n%ksC4+;hP*EHPeKz-uOL>S(q%k`1T+nfX zw|~C((PY=N9_1xhuSEMe7VJNE6vVMRcEw+CyxH^4(kSi-zFTQ366|J1oQ**1*~?1xe_oT;41)26rgYeP=N#JWK+TcFJBZF z7)ArzY2YUd96eDWQWL-uFr1ARVe)|?hK>TBsbI9fhY6VSJ<$!af{gli&=O=if(gk6 zQ=qL4VqqFl%c7Ug1yRmuw3K1xpLJ0F_jmH8IS* za8uws`(0uibO9`dF%ZlKzr%jLu=*PS*gwLhpnWABq};Iq8~g>V2&~NZ{X1%X?+WGt zIBKI`8T_p|Br0pPKmW1uRK|L&!tq(9l zCIRl5DpG@Ee@l8I15(Pure@QD7D(0!_9}Y`7z^ zLx;EH``rbs!2WxnAqI#2pFrC0g4$LD#supJW3veY9H&}9Q`DK)ATE9A zj^ObV?t@0P^g(L}@Jy|r+urS**8Q>6LkHHnJs(!-O|nlIYlkH@kU9*V z@y)c!dxTbB73T zA^PV@igJE(4>x$D<0bn#?m70+WD}`ps$24IjzAdh5i0L=t(Y|f^p)D(yK}cU`}yO& zcivDoHW#knB;0Qit*<@k>#na+e`|SpOKc>twr;H97w=A4`gX0>c5U6Qoee?xqYWvi zS>1zQ<5brU7-{rfg5?fDFhU=g|Kkhv#nMW-MH9Z|J~3Dy6K6?J1z+C3p1%G?_<*aT z66H;QK%}<|#L>~wB`m(NWnDKYemrU30O@(LJxX9Ct=p*o+(MD?KW^1x4R`1)VXKiy zoKW`3#Mh~B8((Y!y>(5$(V|y_Tux6JYR;3j9s~K^X3H}5+im<ffR-r9ZRmLGde@p6Hr+?bnoDtD2B7#Ut)lt6c6b3?sh)pU|yH@A#EA=i)X zc6`;;@}F%3<>45};Pv)FD-#P*>N9fN1jVS_waw`pugDM`yU-;vrIiuOGh1eYI^oh70yo47k0 z!$T%!Q#Y<2S*DfDU0<#pXj!wUi(>>8IdtHWQKJ{-AT<<;0U}W5ge#hoI&BF<+gS*L z^v(>==1(b0E9;i?5EY8%DY~FwYH6xnmtR#jzj$9pBbL=vwV-O1A0eEHM?){`*P3!O zs!$>>qN6mMmSX_mB#l!QCzFDOhy+@8j=GYmVlqL*Pc2WH)lmjgLdNot7o*d!aFWt0 zA{(H%W?p&`u9Oo9B0O_LP?sc^C6$QiGExPy1s@Shp&|+!X(|d%l-J20pEGKCRjG8E zp(jyOTcc}8Zj~Wh!8I4HJUiD^(XPov$7CvG%0x*EzmzmYEW_Y)8P;(X>Cr@1TyYvI zksn`Ph02bKRD>1_Vp8Y`nrL(gYNiUYE$KOp8G2IP46UPTwd&Q@rk=%*txG4x0-Ms- z@XH!vG=YnwMMRZX)Y9rm-2#@nS&l`}3Q%Hpl@Z-b%`eNBF%Xw?gdnU-VL@z)xI$4} z)SB8$X{qgsHzS$gzaYqbV|{xj8uJi5A*hk-rlqQPtEj1o!EUImZd}S)M9?hdy@j)B zOpd&GvLY!1&A{KE%VZi6)4ju5RB!=fMsxPOd5B@mBbMZn%26%t8D?}-qf&#pR#H*NH{_I0 zwvAH?A?;Q*n!dhJ-CodheW)rKVrcuyWGJ!T)L=IAxOm)6YPKjrm6uXUU?Jl&^i7RW zTA77NFHg+OV(}VFb4JRF(It6J{6y634*0*Uk%D6M^8F|Dt%m}tgu~&}KA|yh=oN1W z_js6loz?2@+a=`+;B=oy?pBSJkXA%c6B^lDRb5bnZmzyow4_l@79bHR{XIG)HQihc z9z}7M!Z4I4;kIWdrt2x0q~7_0#3U?sScDbvBx2NHeNGXgipCs~&t_o~f+>=e6rQr8 zg2^l4CZGvHAVR81l6`Cbopxlnze`^ul!$l=K1ZtSposY`(6C7XRV(Ofo;8EpDx`3$ zI+VpUO&i0ITbfsvgA`X}Kzv<}urybPLx4-R$~*+S5E?5-AmriNvZ|cgQoMDE2&HrD zO!(%i*WBLvLQGwK)_^#tPzgXl9-Ur?RIy4)v4*m8g7`vsA~u;F9T!Ta#3bXeJY9W* zq9i^7vJY`^NxK^0O&v$TC_quf%xU~PQI^Sl7uR}iVe~Ex)p>*`&1?qLfj5}`Ng=N z3_Wt>*a1g}llz^1cC$Zx=GUvPM_e83fnj$%or=2R5$$!xKK1y4V^RB0pZMX&Uw(8v zeEh`0K!?ZwKAaowN@R3_Twd=2KaW zY^Fy8Ct;8?IN`{Z@X)AuyXca$#g~m~zHSaq2`;G-CtUVB1^ERYznpr`$%h~87?S6H zmSNP=ANP43@!fya&i~NmQ0GIx{pRzNov*!paL~D+vJ&V*Kt3YY&hETJLKMB3DMU{c zJXyY86?FP=o_m(_0gq#0M}G2jJn9mB+U3w;Z||a9N+vQaJSs7v>WaV9g`~u@2=Ah1ot9biLs1jl7rORB>#jvYk zW##L|Bz$)N^`*|f*3^NeG_+Utcowm|BO|ULElt^Kj0c1i;(zL7dBBC}3j_?>gNmsP zL;9Wb^9cz|E-&;#1|=lKCWX+>XH*uI_@BpDkTQcH%rKOOy7i!h7)0hHBV8_{$*nm> z$;BlVfVa{!6B9ZTyb@1E2A(?O>Fws=a`9q_w}W@dg^Rwfz(Y4OF6dmI*BP%s_q1Tg zinX^mS|l$yA9M55^WvFDbUcT};}AbX&{q-ZGvi@t>Mfy63NmWPWTmAP`o-jc1lOrG zDG)Q*Bja+!DZk4Ys6M7g+t?oNb-}+_o)eJaiS+aJ%1!gmLYDfaCgpoL91Xk_h?F#h zpK`qHmyZk0^vO-X$~^1r<#363rMFrWeERplxm-MU>YuCe^;04E2kT5&e7V2@ub zj5;5F^|Cg^-96F!tY5$(yHxkH{_eg9LR_3&yng!<}rgoZ$ID#s38JfKmU1I@qrlcvFKCPzruvx&n=Wy4qIqy$JqD1nae} z1XRGp2)cmQFnrm3l40b7XNGwY*2uz2PylYQZ7+nMrfnIvT3ZX-grE_;C-71M&4as>?_c1_ z;KPP1!PvmL8a`*R74VZNL)#*N+h7`0e^*Vz&8dKn;YWasISh*c*MO%7-a0S?xW2KO z{evE0ba-0u34Q@v37UaR3Gk%+-+xl|_a_O|!bzlTR4scwI{W_X@;DF4E62)HOp|LH z+QvCFBBKO@$CBHwKkw5|ayetPW#gpvkz|chb8oKg<{O!~mo>kPuO&Zu-)Cl8HkO7N zLlasMGk8fbVxbxPR|TZUyOMU5T1uwSyC06u?(95iv3wp-EjG5%IxKfrsgK5%`UYEH zLXZwJQPgAdJ$a3e!+F^~rkKI?w@sGT3q^hGd2U3!hPh~6=gk{7>$l(c8Ti6U&eV1T zi*KA;CEk{8so5Hf;#;$ZIWf^bZ=ABUblvBSPO(`tBlV;jEcWBm#*UV@e*T@Q#_BtY zrH|y#t7;`f(9*NCa(8WRwCCZ*eMs_w#pclFd9SYZGWxc3AFKzKHUm zu8a0`=GyI%!Tv2V2=dH(iCt}+XN`5NjJ~8v{&=kw(6xPy*zQ^RZY#9$NUyKE^|JQs zvbNDIe>FjQL)+t8>gnTcMAFR53AyEM_rkX2?pK9qWP0_}@bu2d%|}A!NE26Z{m!&h zzsO!a7Td>14cglvPfMrp^Q%tm)UK#iroTpI?7g<&9#Pk77hA>_TE^+j-F5S% zOov~)Wx;LpS4bL2-eQ>JF+@P)q{fgf5-m>jXuWn#_PFVh==RMQ*9a26>M^v|sOf55 zX>XsJV^GD9TIQw1uX=nlS*7h7nyxsDZpbti8DaIk{O#?bUC|ih zv7&<|o96U!o^NrVGUT5>)^`rlK5(S9N>ba5@w&Wz()bSlW$wivpC3P1V$Q#KF1j%? zwDIuadmar(<>B9vJ~Bzn28)^hSVTn&l+9(>2i09wWwiC1FL1hPu6l5EQ30*h4$x}> zL#l?2uuEILQ#AB|Hsr@0LPWA ziJCF-Vs>^nc4ObndoeM)bMI}qZoAErES4+=ib6K?$DP%b-(U?e`AEO#OFR<|DfAvepFMhejwb{f8b5L7xXSZ zlgpVjI!Hg#iBu3waRMUb|H{-NrV-t%jGVMArt>Merz!+`!iIKr6 zM9>S^mAEP?QW%wiBiEP)($mVLs_Oz$5~t)PwTZh(^OKvr0wF} zYZ#l`B#f#X_2LC(PEkK=N3d7h!yZ%*yxbVXm#_+Vra-hA^`I`jgEUBKY-AJm$++4! z6;?|Wqi~F#LJB866u}9&gutC?=KSl2I*e z@=!cNt18M$uWPEx;qt1dFpziz!Zm37QG<#)h)Q2mV?GgY*YhjlD8#f}8lRip++IhO zG;sS1@~{|!kt$S8h(;Up*=P>W(5|bjshg}WZj^!a#x)omvSb)vET}=~6oh<5Z#AwO zB`GUzU+1N^XUUp{EixTiRorsBo3Cjh)*E`Ib$h675+7pnIkQr(tcy=4QLpZXwUC z?UWN$jTp8>(}d{4vrBN9P;P!p175Iz#(ZLwZ+6u)`zuCdm@HN=iB&n&-hdQ0*UYq( z=9hA37MgVvoQ5k%RcAp#V}4a1xvLRZR@7WxTBymZ%r8{tRI5mvXP9g;i3s5B~PK32&5{AEp9Ku)TlXfT3>IiPNeCd z&JYxq_xN z(1{#xzs$_oN~B!a@0&ZlgSdt3YbeCo8b zcYex|qt<^tdh9>`YE|ua#_{NpQ)iF;>|kSM7ZBk5caO9)RR{Yb+2UO3+}foX0x~n( z?qo=0)@a9YPg$kXH_$FIue&?3$Cw+ZG>31yNwIbfZ#oadnWGRk~JR4}` zZhP9!>A17+$>R<-zy12#-_B-)+S}O&dpoJ58i~=~#`CnwIRsZ%U+v%$oa|s1W_2Mb z0CF$1b#`!YIvx~y!N<-nO}cD|CirRM+ADE_OkM^v5Jhd3Z9)FVu$6#x%~30 zZRjtaZayddf&v;M0z!TL-LfJwl1?SN#GQ4t1}4eY4sJFMnI7(EW6rq-28RVkkca2H z%;JbjP(c?5?xA35sd`PE!PUn<=ZsUVjZ>Jtd#u$tXD6qGu!Q)QNL;jAY!scEol@W)5{8U%_fAX*DYSQX zwsNm7@`|>XU6z)YQ(RS%HJLe& zYJlpBOFI-2nO1;jktk}WI3cmBBD*U!r*t8_At^W3&bgtf&@m@5K0T#415pP;lohSi zKn3Xwd58i;eolEsd4TtLPe+1%p-)(ZcUV|ZSY&i$B2b3fhQ|anfw)cCh}!asqLP$y zzqIJoL{wNnOl?V0$w+2)Rzn`CrNj(ft-rQ&=Vfg}X<;#%8C{W^RT`5TMhFS@45|!{ z@~SP2E^%_sNq2Skv`w^ea&>j|3UUc{^-4`Gb;qTkXXbE)sprDe6Wp>mGmlEs(2 z+8j{!DB6)POv^5eK_UX35ygQy{w1Zk9tBY;=pYYQpHKu85n7xTvL1!VaCUU}cdJN9 z3XG16O+S0eI{iX~--TG8b6yVNwvj&3$0Mw~<04P_Sf4rdi+gC!@sqXzojYGU*Dr0} zzWGkRVURJp}TsV4Y;l2phK7?CpHy>xmzyJNzzraia zaDrd~UW&z46)*$@$NN2G3BVqJCU7l)q5)6f0V*D5<^jAz1RMoe4YbEL{0uV*+?9o| z;17V+aFL}1Ji)@Qt=IfYYBmYGET7zyRrjG8n30!(8|RL(V?| z-72;Pwq*wKrW^kSmJU3zgkpj@2u_Ryd)LBf_3~3ISYR1#=?2uX^ltgEP$yguq*=1e14cGH zAn3zd;0n?NH66O#!ZSJS2~K_m?qHa=%(j^hVq<~vVZ?^TXlf+Gs$BrXH1PiKmX)wb z2QUxFP6PxF&-9;w!W!VYg$0`!haSo_(8-_4l>Q0iUxI^BV}ai=9D?i5G{(Rs8Xg`7 zeps>o=YU`g_z(bqJDif~zkwZr9frX+fQ--JO#*a`YXT=LF!Nfr4Bn$d!)uGgmKDMS z8*^|6_7UzDUV_7n&Y%^c>2H>TKgY9-YU#~Fu;8}>=Yir{;$i<2Sh1gA5f8P-a5wOF z!9yQznPn^x2pld1FL?0}1p^|%8)n%bV3z+sEi%9Y!7_p2;r%0kS^gIjQzaj$8y^LC z1a-zfF`YIsHkW4{yjKBoaiVIP)-Xuv6w*GM#UG#^B1Uotqha@N-dd;8 zUXWz-CK8j_$6CGa#Q}lgzn=)zWxrLj%vUgR)-4Sy?t?ZWV`1j=)ov{p=H zb+vt1?ND9(s(Pt@(}BB3C%k_M@gH$MGWMjOdI*Y7Q_zdW&CZQ$i}aBPx_#8}B>85m znY8_2uz%*x$956)a(DB=`yW)6u+^v#NDXZh3c2B(lt>>Jum$X9V9B|#e+4ZRU2c86 z@s0FIFi-4(AUPi`--jmdzT6OBdG#6peTeY*4Zd4;S1E&VToy+-jwV3-Ho~B>_w%DI zl4$7pfcz>IGR@N+wFUXfz9Rd9^Npf8(7~@Z7sZ- zdeeGOg{O<>CnvU7X9a(By%3P^-dBIX4Ry00qL~Xs(%p-lgb9j4Oy+|;pLbU#%;QTO znLlk(JiLNo^>c7?q@8N~={R`njd9hDvE|zL}HA);2%|kV#c4Ov}lx%UjD& z&C;DuPBEE>T`G1TRh;)=L=>SlTrgOJWm z%gLQwVl-*ZG;&$x6^gPdzn`8=O-GfdBsVpd39D(chOElEI$CyyYK^K)WiRp5Dd?Gj zLL?Q{+B2CyOc@^>Z)8^W=MBiaMoo7=Lqp3?mWO&f^*WwH)D1ETO2z*Z-e@OJ#%-XZFB=;(I_jEAvb9U~ z^$M|4QqePonH5j;ql_ixwf)OIc|PoNz z?vqYnR&tFvLD-d)%n+I{P88OS)Q#qdk=nBOTmvDsmqMuENI3DII=9IV<8t^;jtl+me)lPXLa081Za6Cl4K#!^=gGlk_p@yr_Iibu5}{Y>+8{ zQV&HK7-&*5)oLuZ6Dp?>NCfb2P%P~;^+IB*6R2VpM=R!c zv`nFfiZj)!nynhK6nC+%k(-8)H>LQN#N;GLCnd*6@o7*co|a!(T!4U_&WBq^*SW91 zP~7_ZaJ=K%)+Tm#WL>IT*Y{l6fBm#7I`;R|CvE@k6=!7|rdLC?7ox)b6Rb|h9CJQ#{A`GK zLk^-^Qs8i*FBOp)8yOxgmQkaj)={6>vyq*={^+9InySKzzTL_NO#OA#j-YJ3>DJ4c z4Z(B&Zcn#3HqE1YZ`(fO6p2{e=pE_m>R@emI>XyFCOFCdn6*bpf@AOrdnfx-)^2`& z$A5AB)${lf@AKB-wx?43esi)eQ)T?_dG@q#6vfn@7a15A7K-sanq2PY7Y;GAT>@=v zj@et|y=_jXrT^}D>bUL6b5Rcdk>`U?1O&O+#)QY$V)I7(!)&8%PX$`roVB)h^Yi!2 zueAz}b&IYFPq}c~-ZRe5KlG$q;5ln27cYOSv!3S?es{HX2@eYn_FrF_H+PJ7`W>(H zKYljJ*UjPh32zUp@U-}p@Z-T@u~0~qPXxlsE-pN%fQ&j7A1xjye0tb@#w9NN?CHS3 zXvgSKt8Rv~5smaa3eX zfR&xAPlls2iy4(>m&8f2iAvERU7UTqBg;xXTFUAx8#9Zti`?sxb&ZwRA3~$OE2~o@ zeVrXjv#txrWVd!^PfRc6xfO?}`DEl|yTpVwRiuQcr$r`f!Ws0Cu*87+qACb1o==O1 zyH7)HQAt^DW&U`Xk5jg1fVUg6-rp}VIx@h!s<9YTP}_v44Db(Z!k4>-#780QTv8E; z@aQ;SbXdvU&~Qa>St$Vu!11EO!%He^HgRQ0tSY5ENmU=hs4He-FN8D)r8yvvJS zM6H**iyeUP%u-K~rz$%r!vj%?%ysodfB;rW3e3cF*HfT$`g^vq0l`~AqdU;L_D zq7s=lo>orB+ykv_+|EWHzuZ*U|o*sYiZ6uHGzQ!OV-Ub509Y-D;hrpJu7qYRY_$zXfC5!u<^d{B*s+w*_w;3!@&VFCgKK-c{9A<$Tm20R3)1c8es zaT9<V;B1v3(u!JpLtKEi&= zB!J!j3d90a1|7l8;r4J`Er6tfmK)Fw=okzSCJ0X*ejg46zQW((7I3Mh3wTKI%~H$q z*m4163wvI}vchfutb~K*0%6Et4&^rfL%VM2{IF|F*lU<;ad1>=co1M^{m<|?pbWN> zC;cN+5$uf%=Y9fxgCP!=_plEbxewDB9rj`=#Q{w>sB4k!&o=+KhrO18e=-I9K$vhc zV9=SRL(8l!8fq{)XbJBxP~d`V6WF`MgA~B;VC~=--Jk;K7q-EMXG@I*6CGJ?eZ8hGb1BG5 zM-lcf50Z(!;`^+Z^x+xK_ty3Cks;ozkF!)#*QC*`679XX1(DH2()*EFNc>$TTAiEP z6YUFou&ugrUORM6wQR5dV z@f<>JeZ=o~ck@TpkZSA4H*?p)x^eoe%se8zwzse*x$;bZlf2mdvWqFh-;mK~m7SU; zj@Y_j#`4{_RbIa?Na@$S>~E z$FGJ(RU8|c4w>fQ#VGgDCtfqC46g-!FjTN8J__OWOWzrUydxJ$&o zq3I8Q8YBO$lwpWQ>>M}6aZ}vWV{{#2^;&;l*-W4;G!q@8M z%5II$IKB65bB{^X%I3OQeM<{Z#pK>@)-n#K_+nyk?p)gAYraq3y*v9&#DH#^uea02 z-peG@gx=54LzWoozqWG)_Y8NPwn!T693nh>3hbrsP2wiy18l79-a!|2j7?ot_P?0A z{j6`{_T7Q@rOV%xGsHibl-}h5%5?7(No`W8sDqe~0~^oCz3p$+-*Bpmc0)!1grYZR z6q`uZHKqC0Id~2UFC#+|!}PWHb7c9PX>7cQHE?xl+I)%ndWfntGk99{m({^Ls@0); zkDh6^aL=dLm7nfkq&zc`P=1SMFCQedA3H#yHumaq2ep+CRh2an`gp98BJN1dNPpeV zc%~7SD~Y64kDjKxIXB+2Uz*Y_Ar%XNL6x zEU6zFkfr2i$7glmF{PYR;ZEIsefLPccDc2xY5-lj(#_RBDoS0*%NxI=uc#j>XDrgh zLMG*wqPePp*@VyN5q4u~1)_3l(?Z#ppecu?%)>MotKu1jUB)aEUNGA{T$5d!BqLKK z?RmB2@=ne0igvCuA(f(tWmeLwgw0TccyO#4)yhE2$4ko~B$t5!hQNAsPZ_hNtqD<7 zJYHEjuGC^A1%*|VM5rZ)nqZVZ(SEklA;%bLy+vHVR5~@tq!5CRs%$g8PqgRHzBoquq%Ht>pl@i(b z(&pTJaRCS-VUqOCO$*v!_3gBrd-jx zhFi221V!1ZMgs5Y%FarnlAkv`P~V8?V5D(th``9+tRq#3nhKSblwpCX3;2#pTgtHd z1wng?JTVqYEQzSDsEf-f%}xrMtL6O>g*6+ALI*>%)mBkoA!Pmx-rb)_D>No=vnhL zEzHyL=&9r0M_vAQCLy@$l+|y)o;mJO;P&g^&f5QW>M#FsY}@TW|MK(Ezkpyur;Z|Q z&e~dAojK+HyJOnb?v=`N=g6~RkyiE&aaN)JM^B$TZJ(2zmTi@v5P}2|eYspRA4{5t z*18o?pM#RT!n9qaQ4YCSPPaQe7NKFJ`<-j8W;ewq{k4 zf3>fx^=VIAd%N23Bp**(x6>|G`M*c{ojdOAamvLf%KDcR$D{p!5AyX0IveVA-1>Jf z2Uma3qo-_67t)pe%;LD;tz0~QaXww(8+QTn4vI=}_DBj2E-tY<>F4eR(Cn;VY#1>8 zbqR4jZXe7&A7S9|5>uUQ?VWyc^E@5^B7Qm8xYcI)xH!3Z`uNeKt?d(2V$RyQpNnyH z40Jr_9_{y=l~atngL`?k$N6yo(xrut(Sb_{YHf?#`7_AuvmPf-`kwba9(W-#Bp@yj z3W%!=Nwjx77vrB4lHu);ljfYAB*gK85@MpQV$S~J77!Ma?h2f*&!tA$I=H#mTf2G3 zx~Ao#lbiwyQhgHfgmZ|1XuBk5>kGlwcEQo{XM*hG-BLZ>9OGhQLlYw$QZpPpJ<#x1-q5{)kFt}6oyB-Bt}-Jy9Whas4MfOdiq1Pu@T{otU7c-SxJ3zR0x!i7#EeK zpw_ftd~sEckqlOReOxIwA*}KOrpZ0XBg4hp+r`<=+r!h_{@l3;JMRnOS-n$cWp;g3 zXaFKNp|GOJIwQ2E;S!h3q_q&0RHkBBA(D*^n+AJ4yo$6S_d>^L{}3WQD?248HX_3m z8<$p5!i&SV%5`a(rgLW@e`ik@2Up;gL-4M-S8|yUZyytn$c#|L7DllW1DP2v6-ciD zmy!VcEH8g&TaVm`u;||JbZ{M?WK z?d)G&tnK4}KYKPfd8AxNTiL~_wilNBsm%L>S|J(VO6^@9?Of=Drf!d1+r|`D8Nx!V z^#RN1q`1(;3&il#_FgBBJGo>zdnTvIHGBq>p$N}SY1NMpmYhxu@^UGz@!`wW6Z7s~ zE?M5*xhGsA5@TreMqQ*`QBt~ZGOgOfuP9D{r!y%aT4h0hN{XZFug9H!J^G&xu1Ef6 zck0+Le{)R^wEp$PN!afeMn0g?g$Wma;Q{bkB0#}#b4ZH#7MQI7Qs96Vw*g#Xog^GV z>VH@o{}=lJG=Y&7JO!?l%t8R4U@C$Yi!d8mq_G%aw_qW7I16flM*z}5JZpGTK%EO~gkkqs z7?EJO0$6?sYOpUWj7=cP3BXI(?ig+Y3l4ky!b89fKn?iYp*J_sw*rv=b3K5$FMv?6 zAnOi z{6_#@<-p4s=$Jv9W)NNtR`7z-!^}^I4M46apjQUqY`Ogh!v5JeXl4-=94A;tJRFD! zjt6i}{|;_|1eTs*k^cM&TVWq=B^qor?CA@3gVXpAe``4O7n~IuoR9#!e4w2Nk=v|zQ%->o%jmGhHXNGVVgUfw5Ueu}&gcwev@9AtN6SwFc60xy z1~!~88a5OFZ=fay;mP2iqGj#j9^vd#z(N5&`hX7_aE-u*0CWlKoIx}A2@vUjJKSRu z_!Yw6z%Z80v$!*ZwFE_nw$?k0Aw|iSn;H? zlO&gq-Fw<+m^d)?zWO$GX=rq_oZj|&c}TI0L6gUNraQY{>gN=w8`o#op>54RX1ssB zgRg;>IgECU`o_lRFJD+MmT%slxh9vdJrUsEeH~e5e%}7kKJY|*i*#_Q2eU`q7#rGt zewF>1&^g%o@a_UMPFP+ZRB9kt-SEs+7Wd0(h0)e?}T? zT)S>oYEY(8j_}#lIh2eR&PK)bN$OZ)uFeRD>CaG&w~J!kFa_-BDwL1PHi3s=`LYO;Ldnw&f-pPY#v~{DEa&dM3-N6GqewX>(*cwWSCGJACcuB@YhBrxoxfLH*H)Hz`Ac(il5eQ z>R77HuAWun?zQJV;}6kd5gXt0ZSV011M@2F#n|=RoImzAKI=AF*T2!J6AhQ3}LO+K92Mrp!| z@=$nENduw0g~UTc>V7K5+@Pb#w?=m&%XMi+{SgVqz_a^<#apI$m3Hu zlF2r%x^)FVK-=3ImAw$$U_ZF}a0iW@p(?Iw2KLpIv8VelMrJ$jX(vT}Pk@bvRwvMo zUTUWix$3VyALs6A7jQHI_Z{l}>d?De&z8Ra*nd4CfTT!L!x(vKqM?SXkn4I!Cw4Cz zmEx;A2WyWS8fO-%TBI}&-%Kws3^8hJg%NR)SfP?6O#{g_RC1&$hnpB18LFzTB#{Xs zWMMuvp_-sZ=VQw@W#zL|>M=b-DP?J+D&Qg-F;OjUciw2-RltkUR<+Jumb zI6>nURMzC+I_i13%tq?!C|@mIGzeE7Pwn^i&Q_tg{d`QVp$^KEOPIuFwQ^EcGG$;= zk|h{fCX1uOS5niZ^+mX}Dz&(`Z>?;;dt->8MKy5yDzf{h*tEQ1=~z9{P$fzeanV56 zyfWH8w4uptL)6rvdJG(hlf|8yZZk0MZ)M_C6eXV+Yb?!4tsxO5BnGw+lUhmV<{=4n zt?cCV@>mfzwx&4&)0{L!Z5hs{A@MS`43UOlG|5=?`RLA$dX>6atY#IbkCbIe^2%jE z138Ruo*OFSNR}H$5vba%rEUd{MC(zr`U)yEqO6uWsIR4#mNJ;t&Z^c^;#CzLrX(Ed z%1voSd2F4awy{G{psvIgjJFKrrglQrs9H>;h*O%8hAb?nV)-Q?2v}oj5u-s@oT)Hp z^mPn3Yn!+ten#&l5p{98w9Q!BWu&&}7FXoul-6~ag4Da6k*T1-8(27^jD-_@I!rzn|SL<`%hyV&jMvIY{4U!?BUn&OnJ5=6@4TxB-WuK}G&Psc*!W zfs{zKSY-;btRRcB&_21zZtSgG;F>$i7CLnovC?A2e$zyLiHKq}^JRRsSSjdeQz4$DZGC!vnIo4Q4=QHZE8>;G++3R>r20yzXQC@)HNEGWp zIUSpv7+#u~o{3czccB5X*KxAT7JHEW~_<1X5&)(jqmxx1Y??(gH|4(Kt&);-YQ`4^XS=Z^a?&RRIPVuo-!Wmmf~vLD`#bUct>3Dj1?qbxZ!(cL!{mzG{$h)7O{lCp~@GIQsz-~`y@yv*EiS)ZeoU1}u@FD*z;&+3a!&xn*|xHnb? zpwPe;p|T9;=jBtKk?&hkSJ_b6(1I)}uBb((;qsD7YYQ^V3ro?ZWo~Yf?oGI$_&Wde zh~z*&|DfO~&$5b=YC=J2IjX=pJuRgyxC!NZAtaDg=??)j@SKK_IC4-!bxkEyTd&Vd zND?K6`MWrR%up`&&Ve4DUM_y#u@^#8>|EVkTqB@bG_yLhE`$=FlkHxTpVbl&?UAxs zMh%UY(7;hTA0?M4g?&avOrmEod4{c1^5}-#>?}k|G*y}wpKdHmEvnKcdb>tABE0RK zk3hfu{+rFYb5;&^l~qkGk=e)$4~dUsOn$geO;UVdxQkVgt#>}cJvRLOdAD%3k4Iv3 zu*dl@zX+O#$t(C=!if_{ypA1pt)MAAem{To%qidmn?d56nH(UFkPA5D0`?96Zm#QRCtay(R%!tYIYz`lhqWyh}=peaf>`?#1IXNN1-k2glS%FIU%y`1D*k zA|Xl5lcsw{+d7{0u0&QxB#11tfcFSsuYu)$Kn(}AJQg2+H;304SR2$&{e#Uwl`1pp-h*2r4! z;1-r|VCgK2ahUK4)Bv8mmX?PX*rFQff}b&8KU+{0-~1OCSK+Z>(gZKCD2M9>%LRknPGw81tT{86-*se`g07+2?lryzu-zBd6q>w%Yws$St{c# z=ONgZ!=T()cna_ySiFg^ug&xmpUkN$Gl(sDt#sf#GJX4&MmeO#-;sQr-53F3qH)i* ziIX>%7Ifw<;hoVtd=`K3^)vZqmr+4hO)frvhJMYS`_jf$4e$w+hl{jJoaJrv(u@1%)<+Xx7Fzqs>RY!4m*;M)X_q-#;T^&9*PW>!+-r{? zKOfni;Ptl~pwabNNh9w5E?FYEBbvicT{OKFepnnHFkXN5@wpHhoqvmIC$_KMyx1?- z>&AEoeKNxBjrOHZ$?aFSN9XjrLfkY>t58g1zTN8QkYByjao!qlo4DHtqUlT5bmY12 zA@nD*`t{y7ycqMx>%Ez6-o^oo+5h_1^fd9x%02{9mKU_N?SA?qzEyFbJSALspt#dS z?wn(<^0lo8x{d8UK4uGbse`ci6@<%LG%@!L*hdcpe00ZszUtQNSDh-=?VZjq-1`GV ztoH!n7NsDpqT2U=NFg0t zy+`=){@#zL{p|5|@`P!4KqS82{f6>|!8J_Xdvc$8h1R8Bo=cZD z2Un*@4=yQRZI8@-Bx2X!V;IzXtHw`y?fL`Z@bbQDclo+NaFzUYXzRhXsb1k{^VH-k zf@XqeTD*TvJGcAojp?Qa`vuMBbVC~k^vbMy|H)0%m5)T!oj%6%J8i3vx;i?b_6Mz^ zHKV?xt$m)3rD$7sMf-HacQND3XT#3Yy+?vgLAbqV-5^Zxqg_$mve9-Nxhs%{T1 zK7I6qv8o(GQ-7?Yo{a3g)GvMe*xUK8ZJqgCh9;9AzNBz41TMO-z5C+>=+@1V{rmjy zSW+LEGXE6C{?w=1Umw9~FwchiOj|UKHb#ZpTphbjP<_K{4lIM zf*wk--S{@~ZIeMNK#i)$S9lwfXkrIb!&|-%eIi|My|J+{yNSA}B^ixt4XfPN?ChGR ztXd=pe1WQKt}3M0*F#*cM5mOgIs{yG+uBp!$d;;=@qswWSB&*t<$aJ*bYK6NP>(QZ zjP^cxo9XF2B6aE2RWtDtgYy=|yu-bkc|(>EFmneh9Kp+n`qt<3Q}aZ_?v1D4Fl!xx z>k1)`!BU&hpO(;~gC{i7*Bjrje7H7g_%i+eq7r(~kON}?X;(Mm`e+-z63!H>l68uv zZ(MKHb`Xm<$j{pQL{vm|ib|7;R!ojdWdqqD2Wnh&RCY4~(U4aVA6r;bBP68}Gx0qo zdG+Z0q@?Di*tiH`ssLHGrX{T7k;t?fR!wNt>q>uFBd@s3q^m_E zA%duP0M8^(6zV3?)!2G;9lE=IzS78)&oI#J`JMI6`YWWOwhTVLG}Bm-pWB#+doE#W z^{J{c9JR1vxQPR`wpL1-hq$?Ul0jXerb;=)HE+)0s)k5oylP@@g+NIVuub(j+`{_i z*_x3*R>$v`D@<}B#KUDawA4a)CZQanJ)5sZXG@U66o^)3DAutdN{gniw=X|lB2uQ* zB2a8DraY^tyeR=!nVrTVQk6B?e1j6htmovVw1BW!6}Y61E^>B?#8i^gRn}U8V6n5H z_I@afNn&JAAnUt3o@Qsp8MbF8=4n$~l?mls8HS#r7UqGzVKD79H%Sk=?3X+&2TrNs3@ z6O~e=R57Zn7QnytDVBvUGL=XOQ*`&2oDR)oOYRRM4cN>RL@$t=`Zn;&6uLowGAn>Xa44 z)Ur1V6>B}C%lN)42Tby^roVQMU0hPOx?EkGjL1!Ds;+9~LJWGHP?@huK;TK_u3kjZ zfJoXYm(`H+hVk4MWmdZ0REAfTx3aaH>f!-)t&x{EjWkFn8TT0`V}iOAK|oaG3ySj) z=}|4^jm>fBmQW-qt0k!#AHj_T4!>eN6&uADQilewVsDs6s>`X&5=r4)$h9gG z9Wu7{P7Ji0W(?}ysr837QbkomQAaAKq!882%`qXfYx_mzRULAnVrsslyK8T&rdBoF zh0B!WaW6L$Fy-UYvHbGVbc&W!+^{r5t?8uTT9T>=bh$E$n3p7gGpN@z*Cuz9laNwv zZc-at&(`swvJR@5U6MAKRf&P3y~DGPmiG=BNYibMh4H~@!^+e9EMseKfB|_CYW6vE z#QkVs%$Wd49SHZ~`ZyCqn;hlM)Zp8}DY zj~^>MUv}E7*Cd?@_bv4HaXV)fl)w@8WQPw*6FNg zoFG*7Wol>w6nJ|&dYwOI@9G4(db|3dc^{?=%55$+VVwF!2(5a}N0mmKbqV|Th1 z;d|2gTwti@xzk5aSULRN$?lAmlW$SO1=nz2KbH`{Q0p_cC(hYBIGs*v4zoVxmVC}S z(JtQpY*^?Sm$HUntKi^Jk4i6}n7SSR(oL!WgS?HeY zTby26SLcB)Dl9LpDy={^R8}MNkj1q%<;_*a70rHr<#ld8-qpp~LvXA>?~t%)pWx7{ z3m58q8^aP(Vq?O+YA%F^HG23*`h_MSl0susaF~E(UsuT2+Y98+@^t}0z-cX2@q^p> zc~_wpHa0q^(kCwdoO7U)Yg|Yi;exBTosC@-ig-RZI=;x)rzJlkEh#%68Jq2znH3ch z=Ik0B-b5jz1w5$|Vo-S;nbzEsQtEZ#?1kNtOcSutN>#RxATl{JegX>@<{7RMCq$pN zx3_k&Kj-NJIXR#64syJ3+$J1Hlr;fA^I}|fesyxDN3~B*WTu^MdXBSaw2ROAw6-em z;xx~gD0iYOxdvT2Qc@9oG|&O$>^gPI{mj`@Cw_HxbhJO_<9{Tj$TRcAS)1RzezmcV zs7OioIG#llFKt|II2hg`p%q#b4@Kdq&5AZPi07h$h9{PHH-@@)MtUaqF75?ZBs&Cp zCW7Cwjm!CH`*bHq*FZPB5Up9&w{vl5ps#x<3sG8A5oi_SEFQ}8_fKpnsy=@{!tT6> z&-ui(h!~%|^A66|!0{O`LnbOLd;( zSpYd87!-VKfgS)%M2j6TNSF)cu=EQ9GOSU=fjmy|kN~wnUGNk{KK{ofU=BT05yHO6 zu*&f;e$}DaK*#y-u4iB(RuKABqW#&VdfN z`7fXpo(fEchdo)^S~>)Ro&a*eeSs^ydf+?wwA6ryu`D1w8e9cdcK%rxZUFNh1}I(u zvBFJou=Da^*I*SuZYEF#7DQ-Cs{~hvtHD5N@vLqB2U!9>hKU#sbqyQL!;%6~i*@KnJ81DtXS9EQMq0oqv(D=h871-yXRptBYR2x|o&d;AO} zID7z}z_P#s9nQltOCZC)!CGQ49w>)*7}o3_hQosWso}Pk4FnG?69rRl_;0{eK?xEW zA2tBBVFPz?3<9!m;|`%87UWOKVIOV~@(f-8ScGN*(42$8z=?px7aKlMXg&;G{aQm& zOkEO6@(IKtxw1{E8yj8R=+-^BGQ2qQnL(haHWoID^!iEupoE1Q*?4(#c;V~w+wVH*JoW4(2HiuOF)qj?QbQN-=WpRAh1YaOWZ9Tlr)m$3KY^6t$WTVK^L z4LiN^o#*YJ=*ra_G7f_b5k{F$v`ngY7d>!Ovn|kzS*D!@BZd2NUMi&SPEd%PORx1P zlu2}e9-1~|Bn-@zj)!{HHM5f3)HW@9yFP>eV|EQooV(Kvab|ing0{(l_R9twCVlFT`pN8Leb2Mk;_JkVw{(2Q;J}-WVU>A{wsmuh zS8ub#mj^zZWtjcTOHT)1zkadu^xY5EXAJq8P@@q`IiK&md)7U8du(E~=hh2x*OFQy zdT7=@ee&!c=gaUuf&zE&*Z z2X96<@NRSXIrQfJ%wnf{odv1J3B<19j(PO_^K#X7&6ii`D;R2zkRqNDw=Mj5BJ8IR zPW3%rUt4Fe-`%0!#kbuNGv>6T_a88>utwQb z{SbuA2)yr2_fo1D! zyaBaiR9#-_fG$&8FiZo8TBML~cbfW){p(9>8y%vHDr~>(Vr5A+R$q)SPG$A=nYH}( z4#W7cA&P_w{{M-353shDZ$I?q<>r;VBri8#@{;@S=eT#%d+)vXUW6o?B$@zGwtDX! zBq4+Z6214{vB4OF!MIm!T(Es?W1r)e*|P7;XSB8Vlr?K+_GkFbTI;uh$^g|$RyGEa zRh&h`Wyb>p7P*Mp*g-ZC^2>`LPE1U0Dz&b+Jcocm2hs|XX`M21T&$v|gdi#_GGWok z9(^$iQz;5Bhtim_Srz3&_)x4C4@8D*b=7_X%Eq3MM+|u=}*&EOlp@C7^akq9F zRjyUz#PkYO9wYNMF&9yyMl+1;j!G5*Pi^AhGs`Bm_(FWQyrj6O<1!;Fla1?6qml5* zr3IPlS|gEpT`y&kbbS@wb@KFfA~!CXC@Y6htQsc2v6ok_LC2?#lnQbyF*Egb#RhdY zy;VFTGGZ_t?Zq9r3~o+(Qh9~4rWB1WKxb+h)rpm~oaW406^_?hhgD?96&3djqXlvC zaTjyF{FL9N^>u{^f{ zK}Q2TjL)q-j9eHvsG8K_uMPru|*x5w|jhf8)A`PU&O)})A!gdTq##D>2$^BZg zu67w+T|7bBP)S=*UHPQ1oQh#&ZWp@hQfcWZA-hmiJG7uG&V?4s40+y97CYyF^U^Rg(C5`7OpkF6dP>cn|S&DfJ`_)2_Q`${gR zq%d`$z*ND|jjoLvhYa1Ms%=1MSB(K-&e)9#WmUs+hp8ieu#3*9z%X;5A|kMRQL5#+ zov+LFYtZmerm;%Ut&(YnY6O~vQ35Hws=B1Bu|ZW_Hq%--TP$3!Eia4sH!kUnpj<1?tR2YD1T_f*zkxQd=kwW2O=5%_)egOr7j@N8`Xue#PQKX+Z&j zTcz)5RPbsw3_S#>BaEh@p82uWrG+O|vL2yKMJeyg98N)|>L8Rf7g;9L3V8ylW?=p? zeXszB7{K>WYNeB6a#Mf7L?x>TL($;*9R!W8wLym(Zs4Tz*pMuxCM>C@sHBjPE1+;t zvRv_8V#y$1r;4GAWh_Do#*|f?qNpsBH;bWQCpQ;+{|qth()hvr)TQaQNB3?$=p(mg zg{yO`y}Z3o_=bhqob^a;?&xkD95N1d=N-4b_?JIh{QAq0qeo92KYH>P7dOkZP7&_* z7G8-}R#EOwp?1FM7XTMhrnWW5Imhk7U#-rcjE@QRw6R5@Qqyx%Qj}S7(XI6!G2!XS z7kwb70%wOr@1mTptD?|V|C$JSj78r=X>a?q zpp*7zPWxKg$DFeuxLJh|LE`R&`*x(>E5wa!@8XmnQ^#PZ2M|N5KVUrzo!oF9epOisI4_5YDs4eL(#ylz z!zVJU7!z3QRhnDw=@AVWn$T#BTM{A$N^*B|hsyHZ0tlXED?>PHW#^^B`na$t->?*9 zQASc`V2qEa6D|)4p~|YNktNl5FQSJ##s%by_I5>JD@gf;6}dU-X(d=M|3FW#q_XtH zva+&*q>8Bc!1y2^AHR^I;P@JksJt>?-}tE5nAk+8Oy7{8$Pib6q(j03yde*tAm7mN zq~HQdX-U3^M@0~T@cx00-i}^AjtS(?sWe4EM!J)SeS9?9G0O>M@8Xl>XX#+;8{(Rj z9^n#|g$;^J4-RKdKYxsmj zJT5XJAqF4orAS4!$H!D=VzbDTU2PUY#m;vAwmxnSp>2VP!ZGD`MI0f0c{MF{~r+qHkc%d>&Dk*;0WGwZZXPTFf^FQottS=rp z`K!ZU&z%Wyu{dYp3XHY@w*t~D-VeJkfDZrah06p`5I`1y_1FLm!p^e)9)@!;h=K9c ze}rKu40B*y1E2{=+6$v#V2Y(w{pAPbfiV*dlR@Y(z}_`5y%uP~AY6c9Bs?q}QVgIG zY`z6Z1tk9ggZ+>XgDEhS`4ONW7@Y$psNe&zIRHFW0M5Y;7=R4SY+i($gUD3a&lXk? zRuhcz!$%ej;DZnyeo~f$Ymam4c&X zVUP-H|J%O~_x~#dFF9bn1l-9S*cBS|rq#gIS}XwYVRkV12b>@Ln_3wd8@A4K%ueiJ zjQ^!P5Jvq;mj-JORHA@fUa;C=Ut#14&(9nj4#)Ju>8jy{fbIOC3J3=W6K1{4CmHb0 z!6<8No$d7iEnm>W=@Y@25GV1}V;af0_nai9&Pyvs6I_%&K5HX-0 zH&-zMk2iOD#hs~;5FPkPc3B*cuN6~}b*Bu8dYn)5VvpUi%#@^Z+;Rvl&Z`Ahc`{`un5;T72 zW83SI7GkG%sJV4O_{YtGuJ#cUd#hP6bH9DMk)o7+>g`$Qi=R(khsc{N{j`Rq4f5V^ zqgs`EU!q*2y}7h5AwKHwBfX+PhYfG)?vPqYv+w8hSDusglcG&=$9Fwh1IeyGe);t7 z+gmLDqifukv-g^|J13ymtX=*%@!i+uae9NCOI-&n(yv>e_OrK`FXfE;JHxM}ABWx# zG5CONc&b}XB^~y%H)apM^lD#<4yG1N^^yj`0PE`m-Nt)}EFiwoFrbE|86`!~ytTR9 zGNsd~ULS1Adb{~+#7!z`K|3SAJ;S&n64B|9K*XS}E$Q1RjGGHG)z)`|=9y{afH6fi zOlcondHAxaaf7|LBGz5|K!2+}RR zzq1trwV)RwjX~=-Rkx(=yt}V%H@@Z{On1=a&pF%gTAHr&)R%W5I_1%)7S$;I&gXY4 z)8kt_%INex7D=i9LOXcz<=Oio$>dm5eQV35#oMy>Z`)+r7L7JPL4H=Z`gG&7_!D2F z7hZZdKg}M!!hOC(e7CaEF(D?ZR`*P|Zy4#+2cz5Hh9TCc9U-fJp8~R0s%EzquZm{+ zzjj``_WC9L%KE0b?(ycqH!1n8`1!L>dyoFm?6e8w!$k7iwuk(e-+72fiV z&#G(F!ynf;V$OpdsSz+AtxawYeI`MVNS*S&?aobJ%gvA6?>Fx3-+eS8Q;}$parVtJ zYh+Ss~$WxynDgCvH$$li_0yh1(Igu zrAfH|P{1d*Hj_wyNcQ_%NE%TmZDK>ofn*;qcP~E_G_BLGNmrI1jNEB{&E;Ne{%y38 z`L^xqI!mMH9X_T!WJsya%T$I^Xp}Vb9()AZitg@p56Q03#P_?$+9~sZIBXqcCT+Yt z^yVt5Q%h<3PJ5|e{-(P%!xMqy+uima(ZRZW{K@^kgPWp}fq5cuNK_rny?3ve z+IJRte|eJ5*?O=j$!oGk z^4rL&bbLZFw^`AuG8Tm;i_lfn&QfhLA}BW(WLsybth z#+GNNwA9MOLm(HCFxH2P#G>KjBHKCKJ$#H>5Ux<;WFEFH*rgYsk7Mi-V z2RFaR&$-~q$OVg8$mFYrCOMfM{7dJCJ+NzYPgdMbZGbN&y_=L2W zCR8dUXcgfJBr?BQh9ec`XY#o8)FMp*J82A?*C`MpMNpa)SC*X}o17G%$e`oOvr>6A z83o#IOm1U2sWZJQ7Qw5O$)$DJB2H?PDkZ;FpJvP#CFP+-lBNnyhO~j0mnnqOOEtyx zZh2b8B)zHfo{+ndkd}r{t4&GgLL5VttbmYF-``fziEPn!)iNgv@BStO7$%n`OF^ZZ z)*(DEtM&SLy^5|VO=mFlfU=b~iS271?HXg?xXdyfR4o&9QMkKHrR9t4Vy!%LfH~b~ z9LXESRgp@&N2J1Bx)3$2P9M{Eh!q$_jcx&IYp3QS2J4M0)lg1rePLns5R#&(XBc~% z`CI(v)A{ zI#<~!gqj5?Y+kbl%fzUgJJkl|Tz1YFidrh^5;UU;s?LngMnkKqM^;vqlbb^l8o3Ax za7}_r)xsQoU2cDUH8BrgO6tKOvuox`Q5np5HL9Y0guQj8WNPKwt(&tNp#fbh?;{o% z8*}pzP-S{@cYZTe9FNK_O<{nEC84LJ)zZc^JUfAn5{bHb+On~#iYCgspaQ?nZPAuM zRNR$W%nTNbsxlQIi!s%?xD;_al#$v#&S7KqIfb*6iz;SUF)62=fh*&fgu}*6GCq?y zmaIWjmS|%=5@~&lZh}52+BTFm&TS0e?Lo6DrHHbEA}m0~P*Y+_hiP?CSY6OSY>G+3 zm4#QwN5wa%WMosTR)}Lgm)EbXGHO-;m%`FkFNP)+Fx$JDrbv*iU(M)fYSxde_SNXf z=?s-Ng{_<53d!Z+jkOrl<71!6cN+g+8BF(&BsU>DN z^yrO=*~WT8X*D*9L9eQk=GG?0CZJ1F6#02-C=)?wGUnGcCy6DU$#H5LIW?!dZ>SJk z*DY_wK>jwK$$>&QZ`vXEqv`dHYr_r0v=3V|C1vSlIW#s*npZS}M2Z%O2@#kNy+%0S{vFyZ@97QK*X@S?TJ%IF4(#`+y8nrz~ZQ*eQ2b!4Z@|U*`O1OB=W|RrwyJy0mqM> zIqq}H0;-j!L=_W)yz>Brxp?M`y^ZxTOSYf8wJbVJRFPx>yqcqfV;t>{9y$8!aTgaG z7Z-~FhqJEecxx*^N7qz9+j}C^F*wTA-Nwf0Tx8+N^Cezq6D*6*Sz5ZMBnJcozUn}W zv%&u7tmACM(mbsbOS5u)u9o8s=Z+n{aKRNMB8J=%@&2yvrvuRlj}+_Z${_-tAMyAl zGurpKrJIkX^TiZJL`a-H%79JF^a_l!^!Ew3whoCyN9P1*Wfc0l`Fp!Nd3gr=VNluH z*5niuC$SLaScL4%E68`q35kr2;9}wv96Y`4Fer!Oyi#zp&ETt=cQpw}6m?cK3-$ zwn$1!N=QnJ_VIJ`a1D-14D|?(2=;;eqC&keXb)ORL+-nh(lan zc}}M(uD-$8KV$^HD_+6q+!)vBFk44kPk`T|9TUAA&e}V8*v2LVIodcfQzH{HY{UId z`8gz|_DGA=PCTq%rDM!UI((}S!*%(bocNw-kw%-NLk_(&(D zldFFFE>|E6h;Za1{Sz_82rSkiG}tLB-zw;$D>)aWQV|KY4fTn$bt477#hi)ZOXcT% z9a3Ff&)V4dy1Lm!ow|U=wiNq#x#h$M9Y1m2@>k1Wj$DYl;O?82I9YpTet-Ynego&u z8zTA9YehJxP1AUFxqnv$wO{U4Um6BHx=3~>u$s03^Kvu+o_p@m0IcE}m`Bw<&upTDDHa6(k@vD2t@=VM3z_GfErE8Bqc zR!9GK!tuiCAZN>%5D$->ssgKssIwq1^e=z6JbU`c(Tffs+nIy^sf$NpDN*D?e0B^Dxrhy_>EeU|9znK9C3}S$rGmL8hGJ*YHK^IU~&8+&r zU~4eIhd>Y@wF0f+V%YDw5(t6;AY5O~B>V*~gqy-m%;G>Z01@GlVYmxh@L-lKSPxJQ zM1i!*W|v#Q#01-W0sR&5fQA7krS?An4a`E|ULdzI?0*X*TUfH$c^EuVK`T%TgDF_z zkHA&X5ERkO5FhsH1+##ew*E7?ft$e}^A*O2usEO{wdT)1%6`lm+?(;B*^3&^HVpi{ z!HmsH|LhLFsK7lLl(K%rE&ou=JSlTqPz!(m40HwGaKJKr9`U0TICV2Y3wSQTfct|k z8iWRyT=2O7sD>7r+03gHVKpec=KN`W|>R=>TAo!U1#mu_=SaVn` zY@i2cG4Ocs2NZz~Hjf6^fifoW`~E?>1-~zFm03F6_lM^+xPuMGKTbt}3|I{_T;3KM z-%h`McZXj+K7Yf|JtFIF`0aP%3lT$bmBnoO#;cnnzkNgh!WwzhE|OEbN2kWWjkkAh zFDaSgH+qo1=y9D)$Y8QnJfdQGzW1Z-8Fi9AHBV`M`pU>}`SzaszOMa%EotVMS{^J5 zgyOalgHQZXd3{;_Uu0O#j?|0M!jL1+Spb6dIKy z)*2dynXEy{XMyfh=ha2P7j>ZgdgVP?PBy+9UY;P{xvNn(yc&GedXql3-7zbC&J|6l z$0<@Rdt^n=6>lGQT^4kyw4az=SC*UlI<+*GuCDEgT737W>{{PV;Jwzm^NLLZWJ(>~ z*M_OLpVJwXmsg}W?`#iW@4vcoD0>V&xqsy=YrE~$>{s2$E9pTu`{TitC&IbgMyP9a z;vR)aGrds1-B=qRX*X??*RK%!#O=N74eK4I!}+W0tIdz^J>F{)FUfA)=Se#yDue8W zas1WCkMlzML+x!A1Sw2JvZzaz^sfusAm|C1gDAo0LxUiaSSN`_fN5jrT$|Ut2o2nqP>K5PgOxi_Rn}D|`TGoAjzxtTNy*0}1 zX?{l?9KZhd#$I!0+idp@@{`^P!}4%1`}L!VZt>tVgKo0ry>Ry_d9YLSoVDNba_Pa- zDZWW0FhMklMAk9YJ#}UL%K`hTW}2#>dhx8?_4P%k6n6oSNTvm z-TqyogLI^uQ$wq|OWK#RXT41;l0#sHefq9O+hFVgpdZDRSsIBCXS6`Ifsm&_XmJ~6TD@l~t zCRv;@xky=%%&yk9bXUttN{eKS3RDi@3C>N@rNku1CnTjrN9Kw-q&ZvPql9NXP4UeHyQYrYP@37tqS2*=6KhksOzXkaiSvGV$oLQ50X>r0-}m3D|W4NQcgp%hLJP z-Ng_|HE^4X7G&WGwK85@6)!YCgu_lJQ^m9fY-NccOBL6(Iyzp$LrKbYIm9khM_Fo% z3=(B9B)FJr5=kDPoy!$wia8RfJP*f-6_67O6N@E+ih8cJfh-WPka8YRj?bqcY4SW2 zvog1`{Dp90dApH}#?|4}xDrUEPfN_IrPay0`FIgqTZzBV%3i+t>1940kEtq5%g#`Y zl$vT}Onzy#0L#p41+Ib=3KHALW*2ZMHFP;WPgcfmXeuhGY@BarEg8g(fUNBjia*J& zYHXlsAZBwGD38_TI;L6tZi3Pl2x)I+-D6e6+ zcbA}K2z6=`x`=_sNV?ndNd@#OKmjE0&+DgG$qh}JR35YW^(mqa=AzfIChnkBjnP_!wU5kV|ubQ}CO_7KvRV97Jb)=Qzs?_3CJ(n)1 z5LC?zU-q{yA*a;&qN1`kErqq*i$=&W_4NhA)fIIK#c@Vn31A*-givBAfsvJ+kHF_L zVhUJAyukte`YZCCxzg1|!_d_1{*2V1sFE%|VQ@wDHT45fQ;%_9)MF~IlUFFR^;!LW z#6k9GVM&Qtha~rQmXs8lXrla5#*qJL`jQJmL`dmB~W!%KC!SkU0W(4DQnp(VU@l+PgAwARf@|U zh5Ro%6Y|(XR1$IQB{QiMO3BC^ds=X_$ji4VAuhMZ6%lkI-07EqV`uCx*vnY$gQGr9 z)}A)8aaj?Lp)O4^cIe}O`Rm_*Ir7&({po-F`IjScK52p3mH8QIws?$)l({*a#&%Gn9wmNxdJ-!DBfH8Q5kJ=w)a zpJH>6P=vyu)9pRnMD^u_4wn)KFP28->gjI-{@G(so<4Qj-!Z`QsEg;tvlqN9oljaF zwRUmzuy#LhZFL5O4qrU&;B0Z?l%2PQ(=mth9{G0ZX=shMu}vmaumU13oO1I%>FW-~ zK(Ru}4mCI!KrMH_u;b^f|9a$KZ2V4J*#rl~+1Ob*Sa_W->Za#Jx*fB>=zh{I!#czE zOr(pQ%Q+wSb4Q(B9o$d2`xW}0v3HKJwY=aRcs9)L%!OZV31R+m$+S=}U*Dh$;ZBbJ zzScgD_QBp(iE(ybA-6F@T%)g*eWZt#Pf#kPRC`@K!vm3;5+5D!;BFls;O^z=W*b%jg0}rVQ-VUg9Rr;F!oodVeTvGl zncaFZAK~wdcSB&(+_MmgnF)zmwow-6o%~C&1^(W-*;TF~Sa&iA;4R33-c#83v!Q(7 zivf9=c?i+{1#gs(n|}@XZ@a1*mxn-PBU7TC5))!v64UL%oXXr?y*)iW(v?nLE+CTH z-X5Dk4y(lGBAs0FQk*>8k*+m47~m_Co|=;C8Rn1^9OWAs9vR3aMTh!=6ifcWfyvgf z3FrKR{7MtLGb(X_3Bb$S&D9@r^K|p_4)ya7E~Zlbp_1L;=GFZ=u}KNIw~xK znQ8CqpM^+>j7)qF}4X|h@oUl7@1;vNBrd!9R)=(M5 znW?*vsoYdQLV{PJdzLRgG{(loGSlDNFEl2qhWfU*W5(5pcFs@sDkuuY&EY*kRCH`i zWSOn2&x!NDdOEmc>>^4$&e&Qy1fD%}{_OeFp8q)O7hRxJY1iLX+`UQKyFR&iXZzif zX+m8tzxGX~)pgK2FGJ&3hF=i|dXV@M-#E)MtMnr0tjf+nZzoieZBT1TB1i{S#`Sj3 zpRUU7!zH64oh>d{g?m}Ycp*xo!mM0N2|i~|*g6LIgan^;v~fRa@ynkt*xFvOym;=c zwNJn)3(r#lVZMP5Zk}G&R;Qxu?JXS7owYxA&f4yjtxb&o#Z#x;;iN$TE5mphTxh`V z3-Bud4b-at2qPjh;WG?vsDyt8VB-gl0gwW=|J86{V<-$%%!mcXsxYzwZ9sn(Fhl-Z z0GR33{{cLi2Z5u9LHKUDSptOdlt_Ff3TD=7w+^vm}rx**q(=G;>c-4DdKm7|a2% zIRVvwNQXg}xi3%@rj0rYKbn!)&nr9(JbANhpyZEP!>9|uX)p*37zs4ksTdT%$$mlR zDtM;Ai}_#Ucqzau86FLuGhoYtHTesCZ!Un#%{|~ng^?gE2M7i$1d4e;h&ebIHWdTP zGMF+Ow(G(?;O1^MAc>MWXc&&~g)uikfwc=$L3ezkyR|IutbhBq2+ zL8%4d)Ich{`tX53Er8!3i8WjXXE`?eQNynlFoVPL;8PScr5Ml;6jYgU@%ngu-!xZD zzS_S3MlF0kK2QD9G`%x^XN|gfOF&-Ss;`&a+Dw zkG`%y7{8-3GTu%u98eWA{mM0lqLaZtVD8_0u6w`K_VC5wZySpHeRa(*->xoC$bl2f zPTLF9{F65iAwG3=bCC@}v%_0W8ZrA@-Jw)`bN0&atBHm^qY>o2VUB~;ZF8-UyZUvI z;SEEA!cx1p#H0`Qq_F&(jxgTMhIf?nB}tsjj_l2De?Hf6` zvAVC4h~Kl;H=!5I+YiQ<4rZ1H#;L5S-Z_vO+ zmG?u#V`TZ>^|5_`Jtw~tN5*#_Qy+C*8ri8^>HS`}#$1$h-|DFSkNcVy{uop>H@@zB z_wjNYZ>rHW*R?S9>CFLId1U&x6RzuT7&Y+1<-a)UNly6ZY=G z#Ne>8XOGY& z&4-YjBblMxy9(7S2KRaZ1SKj@IzoC~-z|ZyqEjx-Px^ zUa}{-^Fea3@o2R}I6n1_!uw|6yu2z^{!b^2G->!XA^=N7JbBpu5L(@7G@+=xxG@(~QONAfo8Mfe zbl2fThE`E|ik6J6=;~6*Bo&oJmX0(^G#IC+5$JR#u_!nMDy@~F@`{m*RgZ`{y$YGO zpI;|@>hOMZOEYzoy6zMck+rS7ZZ^k5$2(l1ju|TfKGSD^hoPK_b zAgQRN0XNkLQb`gGhuo5_GEuS;sHqL@bpFWRHa0J&s$9Xu0zkuhnpy-Q3iuZPAhMq*P>|{Md#^Ak{?h_vo9B(hvlUf7(`ovGv1%-{*=)y_Q5QVmbgc@-@cm1dzDo|SLj z>g{aTqwz(H`DjT2N}Y?#%kHVj#u-T^eHDl*jhI_eo|A1T=T6o)^{h@_@9u!ICHeWq zgHTa!K9sCs#^;qO$3XspqM#ym79X$K{fnByDtXM6go2zFFL! z**lRp$T8rC_!G4DYBEKTfKkdJB8xLy#e*&{8dhl4vgrq=8m-u*s!+AD2gK!r$o|Pe zY&%K9Da@Z!^pe^KuBr#LSd!>Eo0(J05tH%7wEUcQswzb$>TG29le4Az;_~`DDJ`s= z$}dTwCDk%VYKtk`Pw$owjaMwG$#Z0K<>le=wJXBL8leKy+X^+STBhpcqkG~e%eohhnx@??QuY#6F*~ytg zKA9#rhUbz{*|=hqoK%K0q*R7tFj1*^E-|4aov+Q4BTNIr3OM0fMNYe>q-@zpAMEcd z;z3Z5qibw@NT6e3U@4tj{`>kZ+;Sm{D=sO?9qh`^$@f3w;FKc7S>{`(oUK|~ZfWX9 z_&7O7mscYuaV2(cXQQ(`&Yt~?hn0oZU;gyBWB=XK-6JGGQI$Gyc>-Hg?&)7t>VN*E zo3pPCzPzlcG$$_?Q5Z@Or3W{)opg!}@U}g2404Stw6jmLy|oX-E_ ztOYRdx}QDf?0fFK?}@}G9USmx$_?Bt0H_P_ob z;~M1c7JTZL6DO_zaV#R-t~4Un)fbPqx3K}?puScSv3BRrgPaw$iam{VYN{o)xr1B)`;i29Z7J-(YZa6}ng;PePRg`mXSZs1;d&zKL zJDUXIh|<{DkQ#7cXdhqTR~ZI$R3Se9EtU{s4MAfz)k*4?WT^7r=gvqkz_yM|}=K#JxsRAj7ko23--x&PR2XLSjU!z(mVp(>>Lu@AZy1C4F*dx9p z;IJR4K+_LHt6S9aI1(i@5J-b7QykcMTLnL{WFaW`9Q%c#>f z#~f^bJ?0qiaT4q5A88S68Rz0}ao*?XsWZne*qsAz5!Qje{%3rw08cC>F+-z|qzW zg8W`K}l&>Ehd8KeO-BNzqrrq#kG zRe+daEg3a`2M=bU-~!CU<_QBCaC37p?6PZq0N4(+g_p~`KA_fY&W5|e2L@oKpaq;o z>4!cr9)(TTuoSb(aGGNCEm#4VV+!_X{vSUzHxC6jgtdp2H1j(%VB@cOL{P{C*q3fL z4TG(4C(f?#|Ovy1(Z4z!`vl7TNa9KigumQ}+Bp}W8f958pA zm4jChAZBpj052Te4BUYIhWXRXGpB>}N#F+lz+bSaA7Rn|7IZb6$ltaKrxs?;YIPyolxps(ED48D38y;h6cxEEvAP?ZKqrBNg-1;4A1(1scKWmYG$* zz%Agu=63^z)$j`e-duP@vjl3@Kbb`X*8)&#o)l;g{JG)rz>EDa<^_W13Z@LJXKn;P z|I926-V4B|{=fgz{|1fdW*dJqLae=^=33?C;$lZbJ$c~ELtVc$VyKe0PXO8h?tz&O-@VA{w(d%c8T~C;- zwfoKQ6g(ygqU-N#Max&I3i%A@QTwMm^hM40&CAj`>h>7OWTSh<{QQMQ)nEPN;Bm*A z?qHN8TqCtJ#W&Z7Z;Si)KIvpVt##A0OInR`=a4ZbrYgmJ;kTeb%q`UH(Hf zaC7G-U#aikm})M*DQ;)ZEscL${IGoE$=%UL;vsZvvitsLj*2o?Cl_uF13uTy{;TBP z_E&cxp`n5KsaYgtf1$kX_|jb`+3bL5@0um*5rJfuGks4z3lbQsu6^sR>ui}>7Xx=o z@+IN4u3>|%eSL55?dr?+d4r)>BVL%8nY>m1`{R20_um<}6^-u=EXg#D{$b>bs9P(9 zdL<3bUx(}1U0nlv%vYPHY05LwPAiSxD*Re+dfL{r_((2k>%2Qle%}ACjlvVHAJk1= z{j_hGq+aRnkvx~(et7TU-b=~%VV!vV=65V; zJbt$SasqJT-Y0{wfH(J7UNk||&l)?~x~GrF2Ic|NS2MA@={;?GX+{lV$$KFRne;nz zNzSYyU24iHEmRis=hXM83jPpey!=YEYuwh;zs#);w_bj?Gv3T3FL9N#ZQrC%J59^4 zW)C$);`ls&O5gY8p1%D)c^16Fy7ssFrXjXMB3rHFQzQ!`Uj-l6?@&#`%KFLC{)wgM z1S&qSq!foE7J)!TO$SsUY}ao*X(y@leM@78&wE$v2cPVG{(P1Bbepp+e)6nw`r5TS zlG(X-4HM5$linI3;+I<@Rb<^4?CyZ+t!xsCfDXCy1H+ulRm%3j%&A`A1xBxiQ+ z-nu^8*~}PwHG*K*(O2i#ENy#wf=Nhffa0nt2n=poJWDZDC6n=wP4Q)^BsE#WNGq4o z2s9!mHB3|{M3xscW|Avqn5#Y1+H_(;B2Ac~O-x7CYjQ?}?GWIsYwT^8;L@Zll`aoOTg}M#LS?nsr6EhXq5*Begn;;@@;zx?em$x&zfzIQQKryS!4`A~ zSqsA*qR(#|cr9reRG#pKh{Ys873_hE0`PZIMZPdyQ$E#_NX+Z5T&Nl8#M1W4 z_P*4(Jfc`BKo)0+iX)OL!}B7eNyJiVPGxgPWjP6#PvS~&NMHa=rW7ZmvNJQF;(8&5 zf*0%2QU<3rAx|vPWM!jBEi3(%ooGTjU(UZKAC)$?w{W3?U1(e{YMCyD5~_=^1w(aW zYJ5{|FMg))@M<;=k3+STqVq8$sKMGPRxQEA%fhY^F?d=zuRn*QEfiL!4HS#}C1v6H&#AuqK+=MRFFsIcqyV~VXbDdULjkU z7;MuOm*Ptr82yNe0Th0Ionx#_X)I9YiW%rc%^ZusCRc&5-h5#-rekt-AX2}eto9x83nDGfVgF()_SJ6!O+O6&S#Ok;(1g?8F`_y9x5i(yr&Imq+HH} z&SGkHTWyV^e4$KCl%zq8b2tsLlU;aCDd8(S#uR!^5wZ@A6VfkJX4!(K5zataRu)@S z$gZUIY6z9OWHJMR%0jX8u+?d4F>#exWI`exFNiSFc4vI8 zksgJq`2}k&IcSeyFBf0`bD1ZPTlvI!&~P>A5)`5^tRgb^R8F!dCC0+j?c^yaGBO&O zla`*AIL)}29C{X@MrZGCi-?%;*QL>ZX(J#G7pYb#isF6TYydsAooBRV$a&}UCoWpL z9Pv1J+``KJ$XRdeBTlXXUdJ4qef(XIpL99>cWd9kV|I=%NBz!$tW5SUzuKG(^>a=L z2rTC-S)UK}i0~699i6M5aLLqC2wTMPaE~f-h;@uR?rwuhIeX!3RH*y$vwyKjcQ_U1 zmXMnqcjD;j3m2>{e?9(-$Hk+kF8ukz-~VyZ>Ws66Q+%|4te=Gq2pa|v-rDh^ci07M zkj%=#DK{svA~($SJO&x$^9#ruonUj(!Yy}t461hWIu{ZfL<>s`jEIW~3G|adjB-Rw zQB?2|J8us!T5-7Z`Aipf(p>lF6;FRBdk24eTZf?B0HhZ-At^CG)ghD*EWVyGG=r^I zphKLi9md5svmnsU)y>D*$IHtlFJZKWO0;$=E5X-db7PXCqhkY8+TvXR&2xgQi?=b& zBG$qtC(JWC$K8#DS)Z93Z3C!;hoCNm<*)zi6C_T>A!!*>T23Sie=U4A(SM4J}kle_W@3Y|S58j|8tg^A8)BjRbK zvdB1WQc%2IT(LMoPK0P9%e}R^o*pq_kv{286(qk9z6>o6Jf9Mf<{Ry9aVAw<2~3v+ za+xx^3Y()H+MFI7EZn+x?|x>CJ!u;UoK$oQ`pdM4GGcsYN(wq5CJmLJ8XF&-mYjUd z&B?_vjFDFkC1XmSK_Z1xDgQVF)d@yL8JTXnWO)(VHZn^X6c<1)@L;6|MwQ`<C3m+Nr{90M``i6*EWmxMG$`v$5>8jg>`h2)dNRMVS?TTHT0Gq0pPU_Q7fnn; zA`@-WnB^;NcV_cr@zDtmZQc0pMy|3Yt<=xb5*cR`44Bb#Vgf_5;#1B!*n0Z7d;D_D z&i>r-lNMICM~_(A+ge*&Cnb7YdM0M3pCPk39McRJ;G&c-#=$L6S2 zup@#5AP)%OB~)@i;$awk{J=giq5wz-CR#GX7Z_f^I1z>>u-7lhfCS(NK)0~ZFicYo z5FGGehQSJmWUcytK{>EE0|X6&nVK4A)t|tf8GHhWLV%HYr5PE4N}#}h0ySpP10(y&(y+6iOdhM84|vM@e&}cuKl+FR>KzNpK1fJ3&V4|nLx@6h0N-}ZNUdr z{!jp1X)whxfX3hq0Q|nJ{m-D@jMvQH;2yTt(rf-1E`wErFXn;aau`*cB?4RvU@+Vf z*6Bw}ctPMbguTgs*qniF9k_ghe9++f!`2LgH70Blt|Eb8<3GV6-0<+=0_z8Ee>?$~ zY7lly1(w$T1otq{$6U_If z@#4_5k~zDqe<@Ailbh>w5T z_xuaz@ipQH%Ds_G&{|LZB$@V!L=sX)#-9mzi?^8iuiwPlP4ULy^3dSpC&Q#G+_xH5 z$3m;LbA7KB!~*kJriOWvar}L!q5-0}f@Hp%t5=^(UU#j}53Up2RMX9mzBb?K{4~F6 zyIbbwUW|_4CTaeVeM^>Kq80rDmmXSIm&Tydj_~W}99N z_R{vD>+Ne>@2A$DuNYcrG@86`V)6AJL&)GV7J14#8Jol3Jy0%Q|Mu!h`>R)~MoABG zTlA)0V0@uozVdlW)6=oe+~Y{cpUEHYP&p=+mOM7G-!M5Uklg*c&?g%-@R`~__9c6! zk-I%@9PZl6<&jsSLoRccv~hWHgrjXCLLa}@bBU`hyz4_8QZuu8grqa@8aVfF3^ZuQ z^fTA=oJU)l4@3LE%`M-%4IKTsT^;i7QAL;XGe@%YS+UP!iw^6gOwO0LSMT1s@!?=$ zcE9%0{HHr=%Km~zB%yacA+2@YZhgGNnZ4c1eMFxa>|fMR%0LRD?sMLIdFLGG`lXTK4_(vSlh`&HG>FHcWt+ye(Z!yYN$-ugj-o5BS|{r z4D{y4lIWhih(spRRoF5?dpZeE$w{on=4o@V`yCAfMUqi8A_BrAcy(E6a!ONpN?}b{ zAV~Wg6Iz{;Dg;R*N;cHwg%#{%ZCbBL2GX>o5R>?PL}q$_!EniBb{$03rL;q-cxg6Z z69|uo(s8LwYC$fmPu9iJ5&kDp?*Y|T(k%H{P(%VGA(3;=m}rbK;D~d;xt-hj)e(JX7M4^xRkdqZonxD? z_O88gJ-V{2Is{}wkj~H4WGT-pGEtdO!){Yu2OF80fkGO|Da*ZO2F_GR{!D*eVS$2x zlXP8Ztg7JYStcZj$OVQzl#;4PWz}f95IuR>3_O#}%O9*cm!wtE+UabD0C$&b?8{V; zGw#-10Dq5J)y1T=OjCLiBD$`L9-Y!COs|+8&MjnRQn5<0TA_xLNJ+x1s8VcxYAIik zj|-E>#pP$!$5v39D+)^zlRjPe0&aWrdB!(u&llaC~ z+)&&wkHqP`Y#i@MFP@^DPfulcb+d4|a){JWH(0QMPUBTFZcT_P=mjPDMM_LwDP8@D zT_6#Z=}HuAt)UELN@*{l52AEMICU1Pv|Cq|8J~pgsz-Dn`s#}6(3SLztfY)?&Yo6E z*ASY97mD;_bCaYMDLJE;Q51_Lf!J8>E&0SUZh2wlVrMy`M#a88)?f1g+TtzD-I9#0 zcQvZ0L?TzKSC0>raCscOx|G9Z5D3`5u2KfiXw(y1jWskh1u=l`LFV9%Xuil)kHpr> zD%Z=ZxVmC}dwwA%2Vcx$jX_dLZH0b@Pe#+B;ymp6(b7(OV>h2$UC^TL=C0%RDnV8+ zrKFjU0P)bEfzgJ{d`VeOo3JF8fUM``)z=qRBG>1-R6-+vd|Ql~?r4}|_FW#D+unt? z7=<(z3P&%l&r&4kNbXdQ;_Dh;OZf!i!v~8y+iUv|rpBI8E-t;j%7&hGiP(Hf%VNc0v)MX{Q zVpATyq`y>=SHLK#j7x~Y)^oX?S`}8CkXM;nR@5SHPbH>F&}k+FPmDt$43)rJs-;&@ z+@`;TQT8m*A=k`vQPEj$bYT?4?ws4?{&{0vbb}TOK{Pfw%K4Q2?~V>$4i^44Ae!>o z$3v>tP3Zmh~BF_eeh1UmRNHcFg*?%~3ap-x7d~5TwsZ{{Wj~);{*Oj{c5z zM=k8UoxP6RS)cMhb=2D1!N=l=jhDyo!N-nRgJa3gmTAtvANKS2NKB-WxTO2%LW7P6 zy9RAl%rq23z`pEx^7L8z6PAa9^BjJ)Nc1}9k{fvRxTj^1cPgSjEYkgm{bBpx{{5Kc z?}tu>23el|$>Wz_j~#XT%`pt*YO*_dEZN651n+AVbRx!$80p|_?H>>oG5kKa)XTyC zbnMZ;{qmbjWOi&6`EY*LxmeMhY#8ZagF@6=TLi_#hlPZlfuh1fknRoccCk)j=V#IW z5vToa+|y#cd=p65ssif$TvA=mC1&NN`1*Mkcm$$+@;!WF9pYk;2rx&h(1IlAjMLTO z4j_?}o2{L#Q*r*7v_3r5FQus3Ex){^Fiwyj;8YOhdD1q*`E*Qbvc0oIOtkNrhO$79 z;L?)0q0XGk&^oezU;!Z)vvG_D3=X0*u`Eg)N5;isBIsNS2}1L7T>}Hdv$NtsX!yLC zv`9fjksC;H7Q=`E%FLPmBU}$(avdS@_{tWt5pk172l7(HYi_76de?NM{ z%HoiV=c$Naj@utQWqUR^^O)mF&(l_M;B>v^$s=AzPFn=~dw{=AcK%kru{Hj{^%%HM zgS`eb^?)$K05=X2?ZE!O03rZdz+s-?Fk2*Z@*{8sHo=$0V2yzuuwn-QFe(2dECX%}I-3tjgJp#M;bA9ofVm*%HE`<&@cd8U8hkV0*@7zA%Ny=uZpj28 z#KFmQcwYiu6tX$-FuaU#3m_ESF_76B*nOD?&k(qGR5;7^fnWRIfk^XI%({XSxFzt8 z3Rnzq9oUIUb%)F>41~dRfZxHmpkP)29t2zfho!+)^O*3RgkSLegT;Wo%ZWZh?0Pj5`!^6Q>{!$q} z{7o@)^?&FE6bD`sX0Cp>H8kI`FJ)em>91)<7RM$HMS5MIx?}A&>G|#*==GnRxyef( zS)VpJ_mxXsy`;rC?j_OI+b1kBMbLX=b$&zomfoUSm3DvZMol)qu&_p z7k@M8pr)4f`w~w3NHdT1{oPU@eyN$acC%Z(trOm*Dt4!bm9+QIlq%_)_9^vyde7Rz z$7}uP*(0pgsV|&K;s`he&f3yUYbPIe3PyIH-~aF@pD_Pg_f0j^GW&jEkEIrqU%!^T zVy(3SX1xDsOUY_lG_46KL+6S59{TO4jdDnMkuyP3wyA$~+`iY$oSXZj?d}80^ukTN zc2=`^9{*_?+SgsZ&_U{J$KMbeF0Xx=>M;lgiR-#<>1EYw|H`$ys>@f`C-Gao58CkJ zsgLhFxpJ=V$+J0)LL_?o=fG&M`00nII>Xny8{N;IDmI>eZoDpi-gLR~%fp>ps!r)e%V=90d#?GeZNG8%>eox{CeDwK;@hgZe(}gCX_vIMqSB6T zEiO+tuMl3pzd9y)(8=n1#K!k`@C4GX_QrRQI3n&RVJE~iEUd5G(;GU5FWehiZNGF^ zZhZ25dx<;uopyKh2BG!iZJDY2{PIQU*{*2B_~FUtPXf){W~WF;F%7Do4K~iIZY)g? z-MrPvAKrWTsQb=4-4~fm-8a+I^?jm|Ol_K4?AJ2azqZJ}O4%rMHrM~C zZn)X-<@)f|5!v+8P5P{w+GpAlGzpjs^Q?6VzFGL0%@yfJZt(D{YT|X?*q1J70$brq&1P0!z_3Z~8FDTgJ={Bfh z2|b17Vaw>xo|Fs`Xv$G>8~FG8t$?eA-jX&|%a2wbah^63CfJuQv36P+lh@{(MPofT zNX?Wv>fptp*4}OvQ7{cQm$v3VEty#IKPA&ky+(bjdcQ|`3D2Ruc-5{Yo#%Dx`RyO@ zJCcXD9z9XbYowR8dhM3+%Y5hEU9p6V$G1=Ky}!!)qeUlu|JVrKThtG?U8+a*V<=s% zbL(Tv!rmJ%b3)BiuUY{tvGz*cHC#w24B-^6 zFAq~xL961WRUi^uBB)g!g4 z)`rqnW=lE0F_9(HWz-8HPIty2C&ft8%Nnv+m^4i(u2nnVNUAC3XA3Y8f>lDHOSIYs zb+e3{#=$g}r4&f-%?WF@47zquh3DZg)00d(xq8^7uR-fu<)pUeTmnan(UIn`o#pdA z`fhp?1YsxGO}Z{xM_Elr^=#SsZd^6xy!?9iv(BE~jg3o_&7|u4vzR3u1y@AJr7H^M zjnz1Yn7|;R>4^#zk5tmGEMRYOYMS{tu23Y#UfZh0RoxP`mEamgO^SA?4$qM2sCstW zQUi5(Oee=MhBBliZCd^A5VfADZ*GA`75N|!grKbxQO*?BAW$iF^y&d_m56iu{QSt( zOSLF&XP2?TI6}MtQ5pmaB58`2nVwZrPXpoRrl0Ydw>#!G?(Ej??SFlJ_tM1=b+ku> z9}nhkOh{%{_UcuQ5S=_+QHw&4_mrrr^9hVSIt$NhpRLH()AFfO@$Fp$b<@A^|aGIe4!w@i7Rn)reQ2}umvqe$Uu%fwJ z)r%}NPGbP~05elrA*)!=Y_5}=1Rbcw3M8+zS(UHhqIA;}Ox3JdS5%cQ%x|2P=@*ps zh$`*Hnr^x1W|I(Avxd^Pkx6W*vZt<+9hsb{Ru|>P(erSaoYLlG9zrQ>*CVM#MN)KC zrIau(sxx+CQ0T$}3Z-SFt$vXqr0w_9pjraDG_@+&E6yu}(Y1DM=JE=()hQ%OE`Cwm zC*~eK<9f`|F(k%6BG0X+s9hvP;DUl?@?5;!4<9{j=X=J%+RhSXdCDrnJHNp8(CKKO z%+iv@;)1C)3|$=;9YhTAv9vgJ_|RczD<_I?adFM@kkS)&hixrS`Z`i*OND@qU4EC#}6AY>`RMnZKt}D;r${#X$}+?#VgTndhRtehc!pjX!qkaE#9p z|A1h((*Y+=o;>0Nhj%*l%gLihj##-^IsIy3=^uX7%l~)JLl!5zoKGM5-Nwf1#L3eq zPoJ`MMiqGZl(EZr3uG5t2RnBkuaecu9LVORhqsM)h_|Qn331t}Bgfr-J&X!*a18Ub zba4XdoPDj1cz7K@^qbS~Cy)C0fg`2vu68a*oou{45vLq~_3#5RmJ_h#P~Zw~R}h|+ zoSf)kpNR5GwYBv;ZEfp(((Uw-5O=HaQUv$RR7iK0UEG%EvLq%Qnf~D+gJb66xuc z>Kf$fW9i}IlbDo}mXMa55O3%0>f>bVm^%;UoogkbQ;RaA>*8a}ixVRv&*D>)Lj0n$ za^g}Fterg*;_@@0;Bwz;R9Qt%NfngbNG&cZOD*;FD-Edh#vl_CGe#?B#*M|y>p z4qhQcE2`n8-6izyz3;D|?Cg9e3HEVc9xdJ3O%Kb*2E{`qrn2I) zNGrS4uvR0|&L+qyH#00V2T`6^;CChhl~h~hAMO;Bo#&Zd5o}?1_^7SZnHZ}W=IL;O zi|cVq2YVlDn~?B=fC4u2!{v7IOWF%ohlr@aFXQivz(MT+B2-aCIvY&Lpxb4IC!|Hi z2U5-i#|NgQI-V;%Q_bov?w+hl3h+K1=7;L8?ApaeI>lCupG}L69f&~%h4P)y<$+;{ zaOV`KGwwefITCu-;_%;GEKge=JK<|(|GS$@YK(P&rCo%bgH?c~A6Q(w!@vCfr(dkx z9Nm3R#W*=TB$S4M)Q!MY2vao`gkl0PYo;fFR{sNroC5*^bZQ0}02+W%Y~U|2D*+IJ zKVYJSK?%^08HvDUGnB&pf!PrU*ci6B9=Jo3ac(ecf^p241VbcjZ3b6h2k!%Ua24Dd z9tVV4hQ-1t1+K!DNtmZ#I07GldjRVnSQyz2{|L8$!3RjA*8c-MhPf@d{+}DnMer4d zVG1~+4LSm&^#Mx5_yqTay>;QhSwLTy(ZEdMf!7XJ9;Q(mcric_Y`7Ji zBbfjcF-PwDUw++x`B1|vZe9n_hzY9=8(3kRHaJE8mpnLF7#wdKSeyaNgW*62Pz8HR zQ~!#64!{)H;{P2MWL6Ut;EBQ0hW!p;i#E^+oJR(0N{9WXfi$qo0bX=-nSKy1%>1-~ zYS=h$&bJJ700Q8);Gi@-Ie6K?Y>D7T{@ec^&HTK8de9d9IRIFAV(^`WpDi4)V*?}x z1<)M`1BQQ~TmwK|7fV{@l2 zvY)R(+wb+OtvA<)yPj>f@WyxlR4?)fBuK++eB9Ba|Ju4BU+f{@?HgWRVO*EIp;4L8 zmrk%(&j0$NQ)Xgb(a>(lq}N8qlz4L0xizp7e2Zpk}oQZ zS8i*p-D3nkNEi2}U(^_#WU6&A5uygd!MfT{*4;r~iz0m^k z$=!G6r69$?=I4cbQ>$B$g8i-Y&sP_T9Q8BZ;LU*tZ0&V2amVz>z=d9taqig$>8AR9 zzgP<*J~c}rXOphKqVPUHDiN#mv4*A^#Kl=&Zh z9sJGrTlmYJV#19JqR$I#=E%HJ{Rf`c(#+oy6KOvf26B5lQ%|_CKg9V{H6do`FATlB zrR-T7;#2m>BnEVOTQ4^*KjZd1-leLfOfo^)OE$hRiglblPTNS&;^wXU^2fqf(ZI*G z2NY;&W#RRm_wxNaxay7FOPonvhhk-KX<_Qt>&N?xS4FKGUuLe51kC*(Lg9>LiM;sv z&gRxNi1_1W-|oVA-}HS_&wKKxOIl{vjr*J%LUzlA-jU~wt-hYtS^NbSp>LEfQj%H* z?t}B!TYt#!j)N=;ri&x0iK(l@clr9~yXT=*!?tYi&b7U*x$7I3K0V$WVrkot@ZY8~9ty%iJmbw};#p2KwF_`{E74_tDk0n~#^+ zQnl(l4+LalbN3g1P{}gF*ZZTB3p?NVdJ&1p?weH1tO=%-B*B}fJs%C@-@oDIvzzG{ zRk^BXjz?2V&}}AcQJ#EjxOW!1&+Y4L+V7^`c`>@vw|f0KQ)Ilf()9!yWA!d{ev_~p zZ-1DUZanSj;pueycfYHQt(4|YZsX?($$t0K#vk$EJh85wd1(xNbCbxSF3>7-&Xq7y=#?ROaSpL;aH*4ZTY|%m?%t(|F{Np-McL)1 zB4oZXuPP0PDPotQ7>XP@X0Ns$SG6x>BqV1Iin5c^1FAF6au9jSQha?C7fav?RU90H zoLN>$!05Y`D$P&gi>eldrDeP(Ty0NUQFR5f5m`d|TrVzw%CoDJ=?ZMB zx>8+JK$+r?o5~>;E-$yc0D&xDTW)Tk^5@D~t40K_EH{FtKlSurYCe3|(FPEnsC}^w9#R>}0 zSVTRg2O?K>PFHt=Xyv3K{D_X#T7#?CwveS66)ZtTE3|fF<6as1!pfy9HTbUt5~03wpG+Zu z+zB-3-V^dQ&SmJGj-#qz(N%<9(^`37>r}02lxt{gt*$AnM4lfjtF0cVQlPrkn|!Hc z>H@o|H)CbwhFZUvO%b3?9m|52dIM&R&csjl7Y^4Wy3`G0hV(Itlr0>dsb^^$Ri#au z^0Mlwrp3ZcY{?(1Dve5NOhaZwMaQ#<2%4&}Ix{?mr)iKCmdTgHGiLXTStEq5`HONv zo36GQq)n^T4-cs>fjk5>M)gf$Ve2@ng)KLoM=>Owt(49TK_O#d@G>~2HZrOy11IiD zXo2AF)GC%rDyoAD%Ad7h`bZb5F5&v=jl!CmiNcvtO+zY0!Nam@Ml+-(`jQ3#E^oB9 zL(gjGh_VsI^)j?jGa+3nU!)>)u#K4}MuD0mFB*eVW73^{Q;!E@x4KJxKd4*##u@!H zlppsS6_DVpuidYQj{WQD6aVhyV(H{4+BKG6ib=`syLSawjw-M@>E@VNWNmE|Z)1DJ zB{<2=*7j_TUwPr}S_-QAE`eZsDv%m!ZDsvGEsy-`j>h{_!a}_+Ta)mO9vY} zf`yfxi{~#cKH=8KP8{+AX>^XedfOa6;^A*&VQ&S}UD*M~IBe@=ed3UVy}Nf<=qZcP z;HckDoH%qWFbF~R4`jFogsflS#JRiKoeE0vZI6d+JZ-H(hO3U^=!%%+vo;pL+WChZ z^K`QP`@dO4_&J>M2|RS@=uvCSUk?3hELz&-eESzcj6X-z;rvQbfSLE%xp0Um)d zF#*x3BeR`Xa`P9LmzK+_zfdVuGV~5)v23D#VNmy<&@Nz>>)tf*mC0lZBY&i|KP4|$ z7z=TUEj&hiL{y?zd3j=J2%{DUmFxGgsEp}LYzoSGaC(F$YH>}fiV{fs#BC*2`Ay8| z_{vJJvOpJfexxI4qDsq1@)zpjyb@}nDnsp~qMmBXNkzeahmQUJ^P%I# z5%v+aXB@45{yC&D`Ha))aMN!N^FJWXwsh_Oofe6)mmm^|xy+urUcwXTHYzUh%xalm zTvbGJbX*!Qv=W2MjZU@Aa)_E9qvaQtk`Y+fr1&tuz>137ETUI*WMG(^ec%QzEH#96 zh8=;8icC1;n(kSQ5A(2f4{$!=>=1p@??|M*laGr%;Y?bbS4>!#rRDD@ZGN$`vp??s zi<{*yM^9NEk8nEaW8>md_b(ts7@!mYNw6O^h^`HI!Hh@XpzJ}C;(vq@#%w?|XHo`) z0XPK)4KreyOE9f~UMB$Rfa`xjj2Te?rkSsqo5PH9KrtlTe}zM6{{=iStdQ%hU}x?F zf`UcB3;OboncH zm6_JfqG9#S1HjS3fDbwZ{FVV$(dvmXK>@}BI>4m;Pk(6z4+{=e!=_HS$G`lCrhw^y z+6OM#usqoL_;2tM0QF!Pg!PA4%e(;rWWXNKpcU-640nb7yJ56ESUA}FdeYn+77CAe zuoUL$!)n8`hb5cEgHaC{7K9rEpa*X*5CL@mSGX25GAjYfl)rEj26Heru;PMd6thhl zq>eI61H)44xL_IJAZK-;1Ok(r7sxymd}JEVAZ2#B28LhQ)gJ`r22A^(!0T@?;KKVM z@DI@XKVGl`aFlkC6dP#wf5USH&45xAa26TVfoO7d|1Z2YpdqX(T!fz@IC2~KelSmP zP#%VDAL90AIl2dH9(mf&gRx0%{J#z^#F@@C`C+4@Vq>Q&j`!_k&vw zD^>@dnSTZ|gd4+)1$*j)2LQ+iHwLC_@B`o+>^Q*Z+2IV}@ZJm<0Q_KU&DQ9yr5Cif zTEooDHMvG2TxOSUatwb5#Jvp8}D@7>=wRUBn``Mc66w( z-+s{d$gr`fqO~cR{qqVA1JZt6>7QxpCk=J9N=DxN_#hmTcK1D{-+J`^2Fax1-2Fb^ zubojmR&e#~fj|1%#-(?M+3z8fNl&}@erWc~AA|`=GQZq6wf<#2lECPtB7^q|ScB z%pJzpkE`v5?>D6Fm#BMxQg-#qg)ZSm{337r^SqcLxYm?kf6DpF zpVyn#mpgAg937B!6P{15Yb2d`_9Oht_Law-)0$WOk?zHrRmSdDLSM_RvCWBVw84)% zcR$^ozKH*5y!WZS|H0_18(*Hh#NXS$JG0!x*qGcH9$0t-4U7-m{K4E_psRJzBDQz> z8n2nXz12?YzVWUZB5(96-h5h>a@!z+Xl9Wry3z7|?T?X;3m2IkT|bD7{hj^SJi>@- zhV+c^aZCMi_-XfpuKi(hv)FX$?%j9Ot0ryRG@hutcahuz83s8j{J@=w^Gh;A^Baw5 zYPSs>Dp!-ouJ*F@Y+|=|<}*<#Tc?ka@h|zh1?cwT5JX=b`oL?W-(`$xRRrFxHfXiu zeAmnIo6}>P&tya{X;@;oy1k|6@4x3=yh+-ZX`ghg;n_pR_sy%ij<&TwpWuzujZMN^ z;?z^&L!s25-rS)+>3=ua@#gyu;THYl;(XVWd*g5V_&v{<1DyjO_@A4IF9cd%|K^8{ z>31{zkV)P>vGv|0SF-vqX+e~wwfc^;c8vKJRy`=qzkBIChHAg`B zu)ff&>)CkRHO%F{<=?+1o&9oKHfMYbL7(I#@}%Nj$Lp>SS3w>s4bNoUS!f&izWQp4 zd1ZYP>L>8X)CYVGap$?BSG#}j+n(md%Z@ko*w$vzUFvi4?j)d(F%Ea=#lUOm6U8Y0 zhTp!u_wD)gr!}ajsgcnn9_oB~sh_&jTOlqeMRnFzb9h)v6_G?};gBesM&&*fHFwfr@pj`Npiw?kPeowYH{?*Jtb%?QPs6(WsYd(>TcJq*RKq z373W|&eSxhH7ykxaiz?Jcw(^tBczK8$dw3O1Ui|mWDC{h6)aR%4hKn_QFh#JZkZ^H z)i*?E)#eptL{ci_>$3^@{WQ9jVS#n~9yaVk5NI#;IcZ_dRav)g)wlsYMHu%-Z$P3xl&SovxwdoYous?BX4!_hi=Q=1Y>ICLCK zI#x|8XL4}L)`IMuI!2wa2RYv(z*LPiSJWxeRUJu!suD4=M4eKRp;{M}W@R%I3+mHT z+Mv7=MGCfUbi5W|bP5rK64NrZGCT%>OEwXCB{>ywNve1?melKy;&URFfo zl}$GA=)x3KwxpS!&s1oOp)}o~_GKR{I~$Xll+WN55qfI3`DzA5)|3mdI}d4W>*~+T zpp-LnhSGZlsA0x}>OP~jHnqO8oGp>H(s;F1BqIpZ)hMH89& z2ej*CdLy^J13A{TtQ22a(13zac@IWQCbbTh?0?|VTg-S1?2yKZ3c!DQTNK_I8;?nUoIwgwOzvfi7nrno{^rHIMf#D(K2;vFJ)bv$ z#P;f{#8`2I2}v!aWDHR0RcSi9h=NDs5NLfxYi%P-&d*wN6i(#6KRrw+-+U#tvt?TVV9}ByF861!LlLrgq4HsiNF8d z*47Hxek}?;om^dPJnZZ(kJ|(|A3I@r_|PH9HZ?Mm;p7ey?}XdiID5EQ*jm~;p7n?f z&jRpv`cza*W?*1U5IXp@!||ZZu(NI!{#J**4kh|oov`;kb=oE3n8nW^@v^0jL*Q?} z{e0~7;p46+e>q}hZF$P}qUbjL?j3x>tH4y}7kI+w$mtUf!Tyf6&d&DMjzCKA>66yK9rpaYwT+{PgPV)@ac5^Y z_ek3W>Pb7dWP8VeSYM~JesTWc5ur|1XV2w@MMb6u1)eMLvIzEdwhy!Z)xpZ{h(l0S zd}u^qY;80u#y6)nsT)E?h97Y}8Jv~olX=e95;}?O)jUH)TUiI%THA+2hm}ynT4MrY z6Vp;09i6g*LVyECuCsHnSCC7oWt5+DenJ!Dc2TK|O;os}w}0T7fM5^rRL-&o{RKP2ui3ZKo{L8#-Q`i*kJ!N!6okQAt6x#Uc_4O)J%t5H;{*^ z$lf_I0^yOK0>#84(e{4n=*qwvxB8pq=ZnylRcMqiR8GT`4NCLu6MV|^3bVz!(uPR? zEVNHvW^SD)*4wSjFUT_}A~q@{>5LELsUVv-=OWW_0{{&zdghf87w}VBNXx#9mW<> zV}p`TP*pH?X7RgMc#$!&sfpSCgz}8k^yIAa%>1IW$dWRoCu&w(0wuQAK;P(zt}#Ay z5&22IV+K`p^qH(P6%uSpucR2|gUm8fqw>NX>}r!!?D6rg0sbXt5h)Jo4Ur-WBowvw z$CP>%r~9}##kz#$)dnh@LJrv+cKUbwu(Q#%m?XQOjvTYL@N~C79qLe$N4qKLB?@TE zGNG}XD-i2@`!5bIUBMJV?TFF{hlYwXaXH>;L2#`wo!V|~-oLW+##lL2wqxRexopL0&(nJ(^8X)%c|J`SO$oUOc0#QOTU zS_CGP=Z1xy4G4(!jI{${>@0qF{hOWjZyuJmrw+N>h6G!Nc!maK{c~+C2Id^V)8K=O z{cj)yH$Wn@Wf%qv03~puW|)3q!~$PHP;R&$MiD?A2VS(W0rVeWG2klfh7BK*HlLFP znVGQ+ zB7)7uutZ?xhU;O-0&4x+0fGH>!K~YX`oL2g6u@=Z`V4H)OxRx+23R2fFXjRogS=OO znt%xzUJUT1}v@si-;npy;!88Ug9}H(^J77tNo5L*+m;n(39&FA~z!nHdx(%m@294lu zuuMk%5%}=|f`PLGcn76}sU18N=5as~-a!CeXy9Ifvkjo5nVjLtz{4Go^TM;m>8|m< zZ@bHHK4_Od{Mc7quU%Xwzj&#bBG2h49O+f=;NzJq%+}3jXypT|r*D=a+!_4P&RuOk zKgO5!3~wrWTgQ~+H!i$sU+JYN_WJfHoY$0@zE^9vwx6s&I! za{Y%Vl4m2Ga=q9v-umq}v`3}1%AYOB?+ltAx6p3QbDM?h1m)%C=BM9Qx%->4_l5)=4(T5lZjY0%ioO!0e6f-G}{PlzQhlS z*@7>x6k@0cdNB7&_v+intK$pphV73RD4TNTghFlP6Xv*LF85TnSaG!TLWH-UsY2-UbM4# zyR^?=SccxdH!HWBR)=U;I0PDDr%CX6vlUqC=b+~#fp~kFbm8_Ii+h=H^UfOn3MA{6 zTqHj|&(*X)o`1gmO1Rs5g`=42nEKS#rqk#jw_P8*Fe#qyoTfeBQayb2Zf@i4(?_o+ zS7zVOFU?(6%?lQn*Yu0VdGWQe`zq1~yY z)Ve}?s%he`vy_9256Mrjtqd%G-5t4$9qibso+xN6sKMh192$!v4%zOT-kpGr5JilPNtZ94rRf@=tZ&a|UJ;m0kVL|47YHju+#ZKNV2wy-!;BH%Nad{X8?-WS~+FBe~F6 z9kLSSpzJ4?)s*EEm2@UiAj)8ufn>{6jJi^XPm&aMrzdr3fVd+6cE)Q%0`A)M}9GFfxJ`=*rtJ|q9z)GPz{muQX5ePh)lz{5II(p z!xW~gisvUO^c)zbC(|owinS(vwSbVN&dB$i>6#&ZF-nzg=$}I9 z5yVE4zI0Mu$*LdJ4C}{=WE5R7npQ_0K%pv773ayrTsfnFh$UzCtICvZMw)DKc5J>` zr(bL{s5%&JRR&X^piRDjU+C;5p~vee3o=nTvXa`5+V10aS5#mS=mlvJmQF(G`w#y(V5T)T#$6a)icdQ(j7Cj$BAh zE$_vaY+T#lfBc@*K<5aAbUc>IZ=|srICa z6yUMUd5+Yy%6z)d-NX~1@nUrr5jifZng)r|H2m`y3mX}0YJ#q~#H2Gw>igGc^VhMYhalV+~a~FV}_``X-bHnNg-p)1$jY+U8Os zEyGxWZWE{oY^1WJO9sxWT)?$UixF{UF_8tFY|P-u@UY}!byfLt7rJJsouUd4i-)|E zs&$My1w|@;w&&eSYcVAB(Xc|w%`Z}xQ;@^46Th7J#WE|a@tB33wPhgM+4}IIpMQ0- za6I&@y}gU0m5p7Hlf9F*y`6)Tz4PyOr%(BuaSOMqeT$`$8Vho&VnXbHJACS24_P}# zMjp3v{N>cIZoeJ#a{blG(%04B?!?JMZf=l|jSUD<72qA`<>hbtyQ9so$Bv)=-PXtP z6gl^7cCgFIO#2gFiSFot*yCO?Ij&(gmdAc`1SVQX8$erLR=^1U^H2ZN&FwdfV7p%r z|91TFsY8E1Z1tlWJGa9g$B&-!3v_k040bu}=XBQA<)pKRMN)cTIv~<$PrSD$ zG8wY72#s)a4?kvYW9x9()tQ|A%fJ16*v`)4chBR$pFDBw1V{vI^{b1khqFz(gPn8O zX>Yqz5g|4ijy`A3I;2IoI=jS2dWL$0qH=6JvW?Xt9=S2NvQWP$s{|{{pANZt`kxD` zLHR|7o$*50BmE;%GPCJ~fUr~EK5pKR9t0jebP5VDkVT}VWyVB=hlD0%riP_forw&M zO>nYJ4hIXHU635kiLmz#IG*Q$D)RQWb3YrGN-B=<3MbUqIwhWUckoDdboYp)#S&~> zeZ$<#f_=Qg8q($bY&*vc)VcgZA3Oh4hkVpY_lR0?Qd)Roq)$emlcQZ)L=YE`s)8`cRv~3=pvnBm71Yw9L2- zW%#=V2gh^VD~S2U5h;FFHuf&|f44allvxwt`1hYrSa_a_!ZxAr+G4n~;bK zOU(~T!Uko=M4e;C1)M1j^xPVntg5I9Npd>v7jr7!G0`gl;T@3b7-jEpHZaUT*fqs7 zI+m25%=AwPcXK{&_v#X2D^%0J#2@|A`C&b_2o%Bf=B-i@f0Z zfE@tP3giYhSD0%6t%LAju+Taj$IOmquVOGsv*$8AS$I}(Z0Em39S}39fL8*H0sf1F zX%v7y7|DDEUL#l`vkm~_fX6oYVs?i92e<&w5cB}rf*FEwV8bYk!shH$urx3eAQv<` zP?!s9K|D9}I)XkF*cTnhftMSc6b7H>oW=)(z=mo#sS`Y1h-%K14W4Dau2izJS4Ibk! z@CA<;aD4!sU_u9!3-%E}Sa7gg1MakWiQwA}g2Vy2U=Xl_0}s^*qKcUXfnGnu&mFwV zpf5Z$cr!0GxC;J|>why3cTfx096VI;BMR5U-{Gv;B(M$eU*IqBlY6kn;A}aNc!29> z-Y`vQA;~s{cbNk>jSITDwzo~|pU>mlZc>{F@1C;z zq@NydFTCJNTApjyF6nfmnoB~)wseZ9c(*})wAHi2{GwRm53G(~G_GA4#m_Pa6~j#0 zy$7P#Z#5%>>$ANwrjR$;_o!J;?^IlcHagzR#5ZqCUJ}&Lo~`$te@m1BFX+#&?zcDh zP4{-TylB7mR!+Xx!fECz6x}0?Zm9DHyL11K^P8q7(#Rx%{;f&$Cq>!9?%nt_J0e(r z)5w;em&jMAdItL$+SZmA?}y*K;I5HOinkB6y8f0g&#p_G8DqEbgR2j@Zw6MO1=1Xg zLwu$GtR<7%HpUmpP52Gwi;wLF#Y%H4P0rh#FuoVG+~q0u9-SExubZKPSa+&CG3IVemeV4s`VKZg*}NA>uCK)i{K2 zQmua0zMme`5j$F?s&`N1?47Yczly#xRc-gF<2Tu#^~8_cV^5pEZ}R69jApU25C4|B zLY->?PVgP8e_rn07Khr?PFZNZFms#u7+UJQs92u5rcu#8 z(8rf-Ptici69$pEazd#lZU4sODKU>UzPj}AT5pr^&v#!xKbB2Q3^SiT zpl~K-O&g!7_^m&8e!P>upO>llROa@zYmaW-`9YvjL@i=5ulfdwUo&v0hD26n*K)fz-rc^}#=H7bKExLqm=7K_<7?>h3-l|?w|S6=zrCQEzR6}#RI)cu z>$>jW2br&E{RYE?Y*z)zm@5klUoS8=f82a5oxMIN;ZE*;csWOTt<_v?k*|EX(et&p z89eIi9irzX&4pK+vU_Zktn0_l^rda_-uN8I(90kFINPnEeE3dPjG~J{Rx$8z0+xyu zbEHfmgUNz~V-T@tpt)sIu{~-0^EG|rZf{2uMI&LFBprt7!CQkMRNUh&j$!#a^~V_d z*^1(J_aBOn_vbbZ>Xud0TL1m#nP+cIgrRQP?36~cJ$_L#aw%jwNJc;xZ)M zlw~=sxBN4`pDtF>r4_aHg=h19vXU~Rqv#EBwcM^mDa*?ZMtU2o zDjP3ONEs+BF{Bk&m*B)BB6(@sVts9e2w5Z~lbQI;va)Ke0Wzu5xhbXP|36c20UX!1 zChAos^(v{!o6IDWynE-)Ic5eiGn2)V#f&ZL7E=p$Gc%Lat!{OTnHeqF0)uQBWM<3E zY-g?3xk<{Bdhdn*T6>qJZ~fGz#gvgsr@D1T)tLl+CRH(;H%Mk8q2uZ1=>s*1{axJ7nqeV`fSy}YR?SJ7&Fx6%VF@J~ig-|r1-kEi z7MIgLd2VVLGlP91`bI%ID_VIy?W&j|M96BYQ_&UW)u_1&Nki*2hKKouIi%ddG8R%fBACw~pDHYp=hFHMl=ZD+xS{2eZVJ-Hm^;TmLzJk> zT3S{cD=KpZGI5t0SCTt2xj55V$!U=1k9DT!QqaZH;j{$#sI57@pVxG1b8+(aj5T4=KtugFVYGf?WNN*?t#eK)V|Lc^d&esinS?444_mLM zNH8Qd1;>}v5-Nsk2Fr7ol!Ym%)EH)(Dpz}vk5gW#P*jfTd6$H`dND%Cu0ibWbkEe< zhE#%cQj}|GkT@x{KF%|=$i^}X%)YjhD(#G6l?{3TE7KirQ1)dD_Ica+6m!Cfosm&@pWp(1vpC|veZ|}j~hkPw} znb;jXbll|l(L=lT?6t9tH#@QGl&bAmk6X#=g8Qyk>O#e7ybp)i0vh_K7@DC6cY>(CM!%q7S{ISQx*5ml0 zeaCF~{CUjo$RV?nCoLTg9Y1F6?P=rde!$nl%sM8@*2&X0H~h4d>q*yW&+v4)XGK^f z;(iQu!se79z}MussfnYH|K9)n*Zl`vT}~d^Z*v?7zSr91q_2fTii2NFpu4-3!(kVo zGIa%--IyTr#EKA8dprAtEJsTZcV`DHJCCd&KfAg7O^Ta?g{{?rLkFEgf@+B&j7_CB-CWp?y44GpoyN z(j6S)GLtj>T!K#P3o|oou@ycQ0aac>*viU!s&Hl#Grcg?lau7&?_TT`=<8LMh4_@0 zczH#-1gF@B`(&0RDV0&;ETlNLj#ki~Qh-iP!?ctHh1drL2Sf!pJ6I;<6rf_fBZ`YX zE8@&89f4Is^s!_9*#N!G0-aqvvr`k=2N$m2y8oI);5T)(bhI(Q$=kS>-w}jddV`RS z=P`+>8lPwpDJnERts=(|ADdI*n(pM_W{0Vv5s-u!wPcm3iblNM!KMaOoN|xPh$*;< zliqFDFo^*%!DY$eEee*9qfGUVOE>e!MkNRNRTh_~g`5ud3S~DZH#a8*Bv!{p<+}x< zBO>`;?xoRbSwSvGoc0{ucf`LY(AxB{#c}h4hxU8f*L7BSpNRNM=zD>eP7Lbh5;oEqmE7>%}~ z#QJ2!M3CGwf>Nu;7AFQ~W{N{X^L<0(Dy&ZcJNd8#58qG^9~(D6FZcNJ_>@F;a;d*t zT~?T<*}((0`;PCkwLN;!+F}36!#=LoUY5YK!q)ky*?)ipQ&lkOGh`ru3;=`x(){Ij zO9aYAz!XN<0Bi!82rvezjsU0zMn(oILvRHwe~ma(2a{I8=*vbBfiMCqAO%A%Ap$;w z00j%cC$PZu=b$VQ(Eh^+k2{NitAo}5^o9nr zL%5{=6%HE&sfUigAbdG|6h%kiU77ivdrr!c6 zNdeKoU^Xkjlq?X78}!{V2sb9K{x^7Uq-)T^C<+L*4Fm$-)5h0nXO}=;aX3Ag8k(UK zfyNsO@YjC8=KnL;A)^rje088+ABg&I-~oUg0uKXP#A88B?!W(a&H~-`VI{bQs|BON zFx%iBDwONNp24KjpqLC2f`JcsX*B!?M?lb9`@ca^!6!^q246~e2m{+e%kP~!BRBI1 zj7u*?3en^mojgH(qW#QLE=n|$dcq9tv2+}#8DG4;1;QNSq)*t|C)+ot=APad5=mAU z4MN=|K|9C;^G!c}r{m(Pfun!%O)6@;GIsyrg=azz2?RA=XjmHgLKSxR;WRDd?>5w< zwTby|=n%<=T82S9}-q!ggDgDVK^(y!E+jlg43*+~k zqFL78_=GN!FiI6`* zd-)VuU0cU>354CqwJV%v;j8N$+M@h|)WF0|jL(eT23vea!DyeEem~GTI@3jBURiuP zsp_C;f3}kvl@tN}t6@QRl|Xqk*4Kl-boPee{m3HjYvbklsn)k+!j1-AbEE82)8^Ij zjqPEkXzuCyZE{(QLU0^B+_aC(Ni5c6%De(}m=l;|A z&BypP*+Y;+>C?^2OUTEo)6M;T^haC6U#VNa&Mq~5Q7^HHWST*q6A z3wtHM9t?e$Red7;d~p5Zw_j8;S;Pi;$QYHCbx1`ep2gJ8w%ipfWd#~NWy}B;gni6g3SueUL zv_p&LqczRb(d${!G+LJ|@ z>dF0EtZ~+jp7Had$3)7|S=JhDW>8CcfJ|)-URU0}(vw&YmUv5F z-zrtAD_)AQMcqKs@-dUZ{5tgfJ%nop?9OD|Gts?m%d_P|)j zFo{xKSX_(vnNEnUli&^2*-I zRuKBCq-zX`Lj;DVDxw57U!&!u?qD*xeGpD~jODQYxiMYeTUxJ_rYBToSL5~kVQyhdN;#!env^W6DxkIS@|iWX zN;Ez-FD5%vXdu;g%Je14aXe;TQn5gom`yC?G7?qtf|Ah>RgGEYf)I6DQf9rdsj{&L zQ#d2w5OWeJOewM8thSje#E!N_kXeoCb*ULxM9D{2m(2(>)0oAo;#yR?M9P(~l#3sXCBWjP{oacyB% zcZHrTts%8fX}c%0+K`ES{ld~nk2-UyyP=j!%b&U{nME0<*@D{hbutVJm0w%az?U^t z>9pv~N=eJmY|RkJi$$Uo;%D23$;CyQ!pTY!tFEGwGuKpHtff%V@~Qmd!EqLYStF{d zC>+s9bhNChf*uh@LBd?d+*?@Oc>Rh%rO1VJ2A5ukQ0O2DiBLck<239=-bP(bv7ul_ za|>Tepmi`VX(lGSlaI&p+(q=(Q|p#_)%`}aM5I6?S&5Jh@3J; z;vx++61f*sk2Z*s`P?ebD4IH6HAkQ8=tVapg034A#n`ngvVoX+q(4ge4|LMrWl2`5tpK@o=pxv^6=h zchA1Phg{69$l-yCktM&AW*)(I)@G)sEQ0(@PKKMCTb{5oKWXRW=Xdm|rB{@td4M$< zSCSqV?|%H~f#d)9uiXd!e&F!o!-xJjaQu(syUdR|A2vO>*X7v36My=d*&~*x{32a^ zU615@p7wTew>I0q&&uw&-@yR?WHWOIlk5`*j~ukLaXw^W?s>>G$JNVWkDasA@js54 zn7CQ&Idsew2<>?EsFUM95QEs!;?RMUM-TnE%fWM>%ig^p5SK;h2}cL(!;UB1En^Z* zLmf}1rlTC9Tr*t!j-}h1JLEe1q#|}8hLT7b;dTKl@6d!8mV&-gb;{@V|SzCFgyE|t10PV1eccht#f0(P8rHiAx`^lgHm-vA- zuRKRj|6NXd4;^+33H3r3ySP?lggV(;1&396drvfXFwn*Lgk!c&ryV>FA9F^cJp4`t z@qDeoq$#c*PHy?RA*I8iu_>|ERvyVQG=DbTv#>+oi zC}t0&B_(07lRRQ*Zhi_g3CT#$bOfo!96Vhef>3y=njrJ2s;n-`D0K00!^S(i*oVZ+ zN|mv>jv&{wy@S^&AK$=iNAEzt04FbZXLJ;^qB1i)2dSdU35=VQE01H`zbj)5XQj$2U5%AlC<79O2@h!;ufC7bPI+AW51xskHi(jWg;L z!NV`m+r>E=A7^iu7#ZOgQD^5Jw&fZyg)x?dNgA#{86*RYYR+QvTh!`Rxzi zcx&K=u-^14pu;@_$Nq#OPHO>7+}i?C1e=T8vqCy zc+CD&g$Wvg&cGb|UyM)%`4G^|zwCf0RM7$|gDh#}v;P8ZA-BMp;g21_f|Rvm8BR9F z1&5`e$T$^j1c3R(Uq!~IZ~#~j*8<0YRAw9uegbR;LIdY+sBI*GZ-|dO!vRtL8)R&- zs{doBy^+Os$PB7J;h;N1LWYNtugSn>9Q1(2f2os=%n6{{7gT+kb;eW5iv z%sd5LYC%5$ji7{Lj1C4afQ}e$fKh0pei{HANYV(n7HVU`d_WNngMIC|IU8Go^?@N^ z@G#H~HXs6;-AT6$SQv^%1PPYmEZ_??p~INpu-G^Y7#DhPgFE9oU`8*vOVHQ=6u>Ql zM-q_P0sR8iGauLwKuc{X6ajp~mBGPDKqU>IEtCZ;8(O8qvjv!UYtPR1g6WL^z$aWa zSf;TZxHP8!G8TiGA-{ql;I@KGaE<}0fo%j9n2UpS&tP%?3CrPH;O@f7pvoCODX=o* z(*Vy7CQpN&?0<)~unnk%KmXENLsSM9`e1YzEDSyZ@Jyf``%XI}D-YeIF9~Of^67^c z*w@!vl_dW1lfk=lug*0!;TZ3>Zwa>g)|B`0Z)9EHXUL*#roJ8=IQVOzJx>io#~O7HJDv&xoo9(TU(ys-53TJO09 z8DZhq&vgR@zl0tvG**ejj}YaSO1oL9Dl_BCF3u=@4wKb!7+atDBTmf zwowY3xw#;`cX^Y`{IN;>aITZe6u*%udGF+M>PsEv*}KL2>H*56aD}Mn;)UHUgqC-L zo9gf68-$l{q>6Wnh3N^!3Xa^-L|^LIdPo=3TU;ng=*^I5tY*ZXBbwIm&! zTDv`SpL(0t-rLB2m2A@`0|DFp>_8z7$7Ssc#4MdginjB+%E3ew+$R_;SrI(sJFt$llcTl!(`;`@zx{#)4(vTR28nYQ@t>xT5c?#GX%7f9>txpjkpNc&0t+NJGk z{n|pftbUCnbhPQWR4grWmbXZr;%xAKeRwC_Lf&_(-p)@wJhQ$2QKC@D`VG`=lHfwu zDDxJDdv_XmUB6m8cV&vxGey2a<2;bR-&osP1No|dK6rCZ|KZL&MRTcPfwXzAWAy6y z`t@0L-y7=qg!t?44x&m(@Hg5P-f?t-sf7<$7?-b7UTVn(68Tey z7&+Ta?Ca}LwKaUYOL(wNZT|iBgH+P7s-MS^g#6YwD?d9Q;?+bxr$c@F<;vFd`7Y+# z?28Wm-7CLdN!Ty0-D8O5@`hIC@CJj^bNfaOTPA$gfah;_b6fATZe4iTdy~1c!tLUH z?Ud4SiyMlkdcwn@i?}CGzBa1gJ^mqmfqd5x&rmwa_%*Yw$M!{cl{J}kBt3b|GND` zc^hjN}5Ov}|ztfu;bNSMt|xSFP1i zqf;rN9RIYq+}cx-K6$a^=+Z1EQe0IQ>r+OF#ssrtOUc-DBomcg$kwKlO6dtD5d=au zN}0(kmLwapP)KhTCj%9k*q0xLuEP}8CZ=RbSa~vmFgv?Nm9?N{OM!zZUBPdPQ=n>CwEE&9rmzGPTP2UHYsU|ilt|f4bP9n^WR3Qw z&eGJRSDhU-xuh~Wy6LGrol}4ib4qG)Ds5S=7?pr6$SxPRhznDj61#*7R8<}bK9GWz z8WQ4CMFWMMJ^Yp`Dg%>~tCuzwPl|c1qTuTHh)uZsGwRS@na$fz|wOrna$TvaE|BohZSVi5llR%G&#~hxlkh zR@wqK6X9TDD=RC}RaMg?xg*1Q$lUm7aWP(6CCLIVnsvjfIYMhjMM{1ysn*cSRuQ?i z>0Eq6dC~m*wW0j-wKG?74537(VfEY~Ry5prK;$s7bId%<47;elue41wM$~1JHP2^oaw^XQP z7Zp%S$OGi~E>t=OJ*d&}i^@uCGbwFvw{E?@AuA}vE#eI|{Af)-jUg>BR8Nm~7;<{l zR5?i?9nWdUb0QF+__Z}lO~z0WpOe5pmvlN!$_)&OY~e?{o4dz^Vg1AHZA_f@xEwy_ z0rtRW^Z2vpQzE z%l^-O`;MFZea}CR{&D=jj_kDr-pfaK|J~etx5FPkhbED(jlWfG8W+0x|kM{Be;mk}O?M!S! ze3J9itb!32kcZmC+B~%~BKo9NyuFK62+Gwu*1^@$Eig6oNRX3#dPZi7DlWz4_%2hI zeP#jfnI0Y}|I`HEQ=!4W`6;%QVa4dBN)E~+$j{dzYr+4BlNl0V;~!)nb=uY@KG?#= z+0`Sj5s9#jw@8jjv~zUuLS@)TBqf?3HSx=E%Fa0z=IQ~GXPL%?hI|C!w^!6QBUr-8GOHhgE=WdgkQiVz@YI%-J zAl>~WRR;OsZ8HIy}jhnw8?}Q(Byq8y>FYmX}DEE~IDWpej%r zM46C)a&e1m<)D0Z`UJkT)~!IzaLfye@$^maFr*f{C0RLn_}T{t)NpapAu%-`0p1{7 zxMRJ7mFpTsk1A{wDMQ_WOY`YOd!Z=e*uldG|2zy{^*^o6Osrj9EkXj^3bWjgo$v^J zT3mO1dieY!9QUiXWqY8tr)PA!v1J+=TWmhRF?r_F(|aABX{X}y{sX^Ejjz-0~B_;>uM|twR{361|h&amJ z&cWU$lDoaOacctO9#qnv0Zuyh1GoMorib?)cd;?|++}TX+|0zy*5#m$t@A!;d<}k2 zV*d^i#;Ddb>Jb4r{6!c>lW3@$1Aqa%q6m-?jpPi0i&*ow9fXFVn_zEH251Jr4sekL zno6K=-MIy$L579qush0WsK13_sbGbXdjNPrNCh;D2jBzaJweI->Tg6xKxVLry3@}H zP2hH?3Zg4e|B`B;`?Zm_fD};MxTAgs(XPP2z_*wJEqG&8P-1Q`_+fe3Ek3fhIkeTHcL*HVB8(8(8~GURav z^ce@AU=ZUp5G=vXjx#e6s-D5zI|vUC2Vm$mqqs0G7kp|)gM9Ews{0S)E*M3H=E_Fg zq}Ke$&J{#aD1q@C`aBb%avLrU#3(b?VXC{%bT|O?tOuilV(?y&K&*Kn4Hyo-3E=z!4?MUDbvs(-A1p3?vh&8< zK3M~o_i96xd>6g(v zPrkk2Z9n9k>tz_e^B2!*i9mroPFPcazIj$K_oH)`z*cul7qxBjUdhr5;LWu&l>3+Q zzb2^T4-n$K@S*_xtx1%T$&;T4F6!uKCl_w24EISg(a7xba<_b7{LQF9qvEY{-}Q_u znO~K^uPofaz3A*?jK28X*NC5ajce6^WiQKx_uqG%7pg>$rVP59Z+VZ^iyK#DjXY$U zs379T&+v(>KbnanO>N(nE?$@yzwB6Jv6ovEFCIQu-a^2iEwl!;l(VhXG5YY@?wKpA zYtNogpTF;=YkIrp?mxy&iJ8A~9jbNw&6R;ihG%W_{q4(?SFJeZy|!-c8^Oc7mnR9x zZsa0R#g@Y3u+7e&1Ip2sGfm3O?|d?X?ExAOIUk7xoAEc|M7qYxpqf1kg^p6KCR ze<h@zpLaG_z6LwLx${)DwPB-hE#lFtp}uaG{f$IoBwfAIa{8ePU= zFJI@L*Ee#sdhYn6+e2p;-mI>Y4R;u?y3Y?kBi`aP>lA_kfw*ZLKcRjx^{W5D*6+Sw zDv-8OCGqjQ$6qA_8^WP6nfN^uzeZlAJ$!IgE>_&8F}2?=Jy_aa8S31)+w()v z-3(N-iry`qU_)hKtdXw1x%KiPg6P)Xk<<$t-MtG4gV?l1eAY5LF-mJ0qjo(Sq;6Q&V#xrF#_HJ6^M9;Q(K%Y>opz?=+I8a3 z)lW@L8@(@|kM?p^-+t;ClSB7fBs}hm{E_I zcMb8cNd9`8=_vu0t?#*n+2gO4Iwevh5ztlz> zZ)M$_)_%Qzu61kS3}w@BfpvxcdytF&%>4d<#}?iGvGkj*fBgN!2m^W6@cOOr41OEO zdGve$$D{Xaamw*62@*jCfA=KkNhY&W^RjaX@l}`_e!Z%IEFP|^Bt2$USL9TuHkPXL zS$XB@N%5$(>2sr3HkX!_Q*+4~27GVBfI545ut3Hv)jtHbwEU7YY_h0qo^^RfPy&3H zQNiJHX;F3Y8DWV5S-I6%av|2I2CH5XGj^)zW?95XMqKTU+?#VQ4LYHSy^xxS2+ zt|<&dw}Vua+GK%3Nli?^vnxup{G^G__E9A{DZWY)n-WFJ!*w(amzUFtg?QFjei1gQ zvZI!PPRwRJZEZ^@;7g^_VgxD6pR2_;KLV*N_i%;E?Jv4 zfFbaN^^KDn4W=|Ji^)%-7Urerqf^M5#)^Kx(n`K6*X zdSxGPnKhvvBu}$(%oZV&Q;?Hh(N4k7ug~8Tl$Q}M%Zo4@$W~W!|QT~uNvyYPv$h?rI2l7y~#DXl8P~7zJ4qr@F&39+! zpoZlnl3+j~T|giZdOii zCX-3!#^r6)r|H`b?YU$vp}CJIx>%djifTd6%+8jA1YLLrZKP2v=x-Denpy>q%j$^@ znIn}Z#!C?lZ8E!3*+6dWDd2J2CUbhIo%*_RWgD8XsH~vyS*5fD zdJ?Us{mMHIZAO(^AR}rGn2U>=VHvlgsECZpO0R9G!HmfT`PJ$|c|lYHiFR6n<)`IV z7s-Uh#aXreLxpiztbsqHn=uB7jtzi`@(*ppZ51i2nb>&#+**%AWAF;OU_Rzx=R9?gH2C_S%#Q89X)>d;QkZG z$XiPfZ*FX1No$TLLjy?Bai`rnDt+@)liJTa^^Mu>ayoQ0D0|+!BqRHnncbelf9?bM zohr7T+KnQ zaKyvzn74~}6xP|!!zILik8PTR;6PR69=>n*^(L8y9aM*Fbbys=vFnt%uhU7aLOxYiqNxgg9&4@XE-D z6R9Om=!6D=#3IVv(azS_qCteguPK@-)_HvJ@iVF<3wKTW$_f72|9iK%< zC8YKV{O!7t*$yr-IXm4a*vTt3AuClI?~sbgtVm3bFgS)JhjAlM`^LuA6(;3ny2_JW zT=P+(F^RTrUf$SnJ9~$)tjfD-#a}cEz2<~zksPH z%UcUV$fqiUxMG!GWe}r^nu&=DKV6tr9+gv&w-gzeT;Njbml73mx?9&wWjbc0XQ@Q# zh=U*2#V1tt4?_*q1s^gmVq;4`sKlxpJ>=8+W; z+*Fqn?+X%~xp~=Jn>+bBy5%Iqx+H6yeUI+mZDYIN+1lZ_g}Ej0Be3(!si^ckX6I8| zT3ki@!uc*^E)rGkLgezJCSG^Phly5X^4#^OPdt#^4ujAvma zEnPLWsePGPpTvAWuW+l3I<#4=uV0m|-|-Xfi2=T+tq(d{nkK|r6@&!)h6bH-4)O@t zZ@Js<_>sf4=vym!NlChaobh9x!G3`@2lv<=wy@e~zRUK{eGZN$zz)LS&D7k)?(o0u z;0kba-oX#x=m|`M|2tGU|AjFCp&+u6u^=!rz+@wH`~$KRxWxishNuHD2be=c>;SC+ zbkqa91LO$ZnSmoN1Qd{I*vQjR#|kQqKurV01TVo<;Cp9A0Hww{peuwrOfWJaUI^kK za2Nzy_-z~lf;cD#LA!VC%Hb`Xk-DSC-WiWnzt7mi*cJjW5ET9ZY;BYpl-Gf9UH=1Q zvI628x57yC;0pZPf$~2f+=0ITL@{Ic9k_##_3vOXSOhy5C;jV;0SF0ov>;{l|Gxp; zJ~$EWpE`3$c%VD@0wO@t2lQ*SYKF%E5QmKct^vyZchGBRQQ#-UVAv08dO=ETqsull zmnMKTQ2z@Q27D7iZe!!fM#!w1d)VZK>4fPz6s&-wl(IbYE#F^G2Yf8@G>V-ue@9MNlE5mgz zZIGHtgEJfwYf?s&JewyiD_2Q|vlFTp^Q^u_l|1K)<|YgQ0dJd4R=;( z{0Hapy&dGs3O)C#{>kt+gR+To^~TJ#JKPP;^dMzr?CQs>T?q5Cn!2nQczIdbg=2mG z{G{dS&2t(V@s4=mc|+rL?;T`?`j#>wA*6Wa`D9)8{wu1x>dz5dzE?(EVKhPPfn z)IDGBxF|Bd)({ zqbLV?xYbrJp+)j&acV)mLVNgXb!AihX6f)leY3+)FY`q=zdl_iE{#3m;qS~WU%R#;k~BOU6@UNLFflYu z?!VkHGjgU!K<$|8=WD;Pr$%{l;v{hi|A2hvHm6bj<~mQ&h3kEI13xBeo1R^fo}YZq zm~MOaQTj$SOI@u)5ppxaxYs?MFfS5n7 zp4q(cNPFWE{{4e%!?^byFH|?*Z#`Wde!j({=x{s=X=WX-$Mak8O|37Vthe58|26*m z;k>SmB)h$dKihdr{<44Y%;HPV(i22bo#`8t5{hpkBWb#Z@`2i`gwl-ExQWiX=2_)q zeWk1_lZ;Pc#{h_lipj_6)CHwma~Ek%sH$tp=*FldPEuM{1tv0YXlklJF6gBtYB!{N@TS>Zxq>=LCNx6hUMHw+J-O%5O*D(d9m~=vx_*y+yMVBXXbGwr0*}?dFUJj*})j1){ zY~)NX((%$jw&6{mfHl3IyZJKT+^!6ywxG{PGGp8PnDXhd~l$T}KtyCpcB*tO#X9wHo zDRsB&dP>Eb$%(=RUg=no0_iVnXl~R{gd8n8gG|GyyUUj+v`eKq7l$#Ux9Osmi!((X z)!2mc${vAKmC%JKCZ?2~Vp2_pxVWUANj6Bba&#lhjae=2%N3RDdTD#7z6iwZM$l7d zDrx0)aaHuJ>IyOikBD1t90b7xrlTekmNW4oQzFml`pBpd1N-`-UhSK3u3R|K< z^lcXkGz}ZKYiCN8x%$S%UeZ=o8K1&0FQ{A}T5d*`Rx~YWQ6X1PDlO@+z4M^9sIH%w zN|N8Wn9rX^&6i)*qIKd=Tf@)9#FjxmX_1mB%xTWzB#+kB8){iSa=}y*cM(%wG9ywJ z6LJ&S)u9bI9fJ|cEU1)(Qz9^gy7mrHO<{e>A_u>D@yfmWC%3lNc#Feb=L8k2xbEG@3C zN~&w_CP?W1jLN)p-?ob0d|;~}q7|uS@uBg4q2Wn_o&r3IPOX&C7et&&HFlc0Fes=h zO{vsNP%2_u%_xpsUP|{%$0JVW$3PsdlS%B@f(QbwxDfw~>h0+fG%rCj6_k~_`~o+J zlq{!H$84O<_Z~2_i3m6KxPJZ&rpha4!^FpJ&jF`{$4#xw4!Mku=VYH*&f0sz`Jh{F z`f>9kZZUSp-1Z(ge&FO`^FROGw|nm~(|!B)9ys#np~Jh({&9Slg%!{TJGvnLfzjrk zCoH`DolV>=jvwD;xo@AP%l-on=7)|rdfHhWwL7}U#L~*#BFrLezm22CQ70F(Kyy1c zPdocPR=akc++*{PKlbc0-Tx2MUAqq*IdWw0Zj-|Y_V3$u?1;^NhvSYGKmuRKJx4rk z_uJUSxY&jz`X>S>S#bQKV$*B#ZI4wUC611fkwMWm4$e7|@i`85>2Akt%*}ILU7b^X zA{^X+@%k}050{7-?~s(ne9r`L3$M6Rl%>7dNe9c&G{1llQ%k?pw5WK87#B+i2iug1 zM8AU62s2N&gyTV0yPP62JcGTxV~Z1QvVx0)W3x_~Sv&Z-N8;=70aZBx)koYS5NliO z(kr-Vd(*hgu0-`|vlD*acBYw01TSEQ8=T|}7M+;s=yS}+#`~00P+XvId4}`R12$If zjtLk7QX#e;>yFFzul6s_s_`z% zDJcz!2#$1h^7Z$PPV^y^6}7uN(o5Vcx)alR?b^t~*ccGt3!j&sYMq1RRaE3LV*Nbr z0xWGD0N#9no{S0h&Ne+&=N}$Sl}e%($FA%r_suywKm9pMTm+c&hH7M`TOOx9(oNzjnL)(W{Wy zz-T8AEAOeEp{aI5S|B+qJ}50e`(i#R#Wy;@($d$r#yiT<=J)|KQ@`?x)3(koyBuxJ z&Gvh{6}ksT1P2FtL^$o=b9Db<3s1B%Dk+GLc5uoJ2z0e{I^t#OZhrE}iG#Zx%>OVs zZnY0sE|^=o?>%V;b&3Fajr;%r0(khq+ntO;0B0c55bOR1=>?JuR5}7w0-OO^1t=u{ z2KCGkJ$6882T37r0e0pAcHUu7;Cc%Of{1D~iZy}^7y)`A1B>DvMymycxf9kJYN;XO zfN$f(Jm{!wy!opHe1Op?zz7$3C-2ZAbiW3p!%jQ%fUY3(3K$yNCd1~C&&bdq*LVZ) z?mwY4P$pwNYyhfYe}KD2Gi$(5@7=9aquQ7@_n6UoejXMfzjeWo;blQfS0A~l2)H8wN z8iwfxuL5|i@Lhl-!LJ&iJBH^U;Gp9F)4=N21=ZSjzBf{`}g+5*l>H7_UU86+~@um%}Aq! zJN4zw@B3@*?kgD}X32UIow?cmq+HGVi%mWE+M36f z?w%dtjcjjpHH_k$ZYrPZuTC~rN9ew_8?J{e;nRENs zlb#nFkH>y|LB0%qV!Y{Ey{jU8BZ#!@<~K4%(~Np>S&6*e6fL#>xc*)tF|4iiv@^Tk z-hX-H!k3q?KV21Uzj(_{eeen+HY+#{^C>0R4K-zCOviSX0ldC9oq z$F0?FR_moVGkpsy!ltJkl9|pcv+YwHTGI#K$ekzTkGyx!uHYF+L+7{Ej$tO@olyUf z+C(EyHQeamc(=tFBuw$9msK5lIpHo*I(hm2d62~k(N46tvWMEf@%lEW&s}Wi{rIB4 zG(0?Ikgq)_kzYJrd~^4m{D%VHFKPP98tiOX*8JFzweu!^ed;}n@IH;rv=vcNCAGye zT6;>Gpt?+6%|r}rA;KFMP2lbkU%YFQKYX+Pa7)KlJ-c?xAU(7F=u0L=>m9mQ z`-DI9_AK?mlVP$%c2V+ZMKG%ZDPmuZXapB73)G`cd?YO2oz2dZ};xaEOkIAC7 ziE1iHs)nH@5^wU|`|YmI{((MrYhwmZj#XrbWW+>OHgOaj4tkQ5!YgY=)wYN=?G@bR zR)n`ipG7a+KUaZK@M{LfbI+8Dn&N8nInmk4G(kyDeQBgJJt90P4O7d(GQ-0X>qGFY zYy?frPQu3oO0xJ-=@G&T5}*ujS!84iwyB`5M%8n=HafMiffb)v%cCWexrxn%f_!Q$ zITEcZ&rB?gqqAs5am;9DL_Dk+1- zFD@Fr#21inKe~%tnjKdVk?SLfs`vgDP2M`zlAlK#8qjr7(<5?)X_I(qdVLkT8WX1C zrgKY@E5{7l#t~`eNLWqor z;wtAXfdZ01fP{!5=bQ}~+Zac{HqJSgh zu2axUVz7ODK8}hY4v}Z7=O^p(K>9HyZg;aN1=U%N-4O^@>yhHr$?Cq`HcD;zFt-$) z)~e}Aj#RcVi%KfGYlkJ}2pT?t-YRR(Yp+Nr;MDAb&Kz|nH3_)!O;T~FQVPAMq=P zX0wzCRT0R3+ca0tW8<($Wg#$TV~U2*HFZ7n)!8~;+DH*?Xh@<&V9WAUvqQN4j#0_d zeCBGy0&w&?_(5tKO=mc15O;NuI)zch)$>&hf6f#o2=KUS(lNeQ|s| zSxhLx(Xwgu<&C0}6ORt~EqM~vy^XrAk;8Au*l zHiqFaYAa^bE7YS8c9~_hNQjN8tXE*V@uVLTT6f)M5)~RXDJtnJCI=gvLkCqhvv7oxwTz6a z`s9oX1hS<7jm|6+re`II5Qspi8c~Ll-q^sh2@_?FOT^6SK1K?rOpfjl6?4(}qU327 zGmlUfnUE1437tKC&hpsbY=YeCs$LR9BdAy$TUeKpEovFj;aO8J9zAZ7X(qc0<06c0 z9qn9B|7!5taq|!xd;4GuM%0B6Gf&IF==3x|f{Puwu0BrozgSrq8J=)B@vDi|2}e6u zkCUcnoQzJLw6H&W()ipl2g75({$hCA%*x2@mtPI74V*kpATw_(Gfy)EhYRi}&zx{F z2g$^Kb1*q}{G4g9g^ihO@(HWojL*B-8l1Nda6M^hf6m9m$;8gU`t&(RkofED-_D;t zck)-$UyW@~8l5pXYjNh-DWePLe>--})cCxmpV4_!-?R1?jO-l@&-*(CdPYXrn9r|P zmlF;iTqj(aoKoVWX2IWqo|S22EKiDda|G#@ld@e-9y9Z?F7ywzi3PQrFZ=?6rtQry zxD?=JJW+zVfOy&{$lPSs)!WF%#>~gYofK;i>QR}Qn>+h@N4Qrbx(5po0TxcCmKo_6 z+#KD6F89qx+)^Q1T88|$?66!Vk*fgTR_j#)7|+0nM{&S%{M1A~nNTx>$ZlOz4o zZIUb_%&cNj!m=P+2RCn5X9r}GU4fUQb*`JSy|xldq_x2JPnWP+=+n^S?SPiAqM zw*v}cQ{d^3Do#nWb#bFC2Iit|qHMJ|d8RhOU zSrLfNg-Sb;8ZwJe;X&@+rIn4D#kn{-RFIeL!KD=Xr+7M=TX+V0*n36$mSScmk^UBOp00LC3wsN50fhsC zTKJsiFm_l(ZcL&treO01BRf2eNRJ_OObOcO745}Y=y~0zxVl+&1B8*AoJ6S|PgDGYj3)4vV{eKEB<)DM)q z#g@lVN+5o9RhVg&Rd7g5iifMAvAw0agR#G@aiWE>t*z+=<1==79?s_GUJ)SnKETx2 z(81LqEU<252yN#Y>I^(6jGWz#4NikJ+Kv{-TuvMQcFYoF)3&ubdCKVYY1q#iMqRkz z6d6?M<$x-^Fe;Mj|LurGVCXwS5*T-2C??jydAwjsff)<1D2N}055ODt?1hb!M=fwC zm?7b4*x&x@0h$1d!mtB3{3Qc6Hp1buL@@M!180Ek7>><_oBkUt8*YLpAi`J=l8gae zfg*tB-~-?;{)-;afH0u?5p?~fJIMD1k?Y|ERiH#L;5EHuU=at>;2yOAFF__|AOnUi zIDgn#J?q0~;Z}H=FnPn1f)5}8uE-3sQh}IW?0MFXXgv!a^#bwHN2Xe!us+o| z`6z4|oQ3tJV1EUo^dgVcfFvx&C#e6RZNzQxE^Jy1*6= z48Hm+|CiQqg0lajUkWg3|I^VKxCeN0L4ko2j0KgTfEaia08>mL*K5oUG0|e zT8Qn8#T%=w!u8GXPkR4+q8(>W@6EpAFOZ30V=|3Z;fi#)YF_PNcrkU%Q&xRAKx*@=G?r~)cWleaes$%{p0$~ z=#8Bg`OwfC=7Zl^JD=K>c!*D8tno-9CTaM_#bF7V`tt{!Oy`TX83SLxE<9Pkp;V6i zpzD@?vbbHdOZ$&L5x@Yda{kG{TmSciii9MGZn z&F??s7jc?Sx^n$So3?-S=J4<|{=W3iHBgXu^#gTpp;7Teq6qv;7*}oi$dAU|Xm7V~X^6^f`~$JKjlrC!EI*i3T1&rq3*r znr<{4EbPqxnB#Y>{}@m-H9_jvphD5p?vCcm2bYGgs?}fDu7CXb2~uBf5FD)jq4?u^ z%gTL7vD&-VC1DFFw+HwCxThswyt4qU_l;8@ya84r()ZU5T7m@Mxw~?|Nw@I2MXkVJ zAq~8dkmmS%9na^ecQ!^2{o*Tmmv-ZeDeoEXxrvvq8S zg7JdfNLT#61xg2)&aJ zJ3bI4pT~7mQ#}&Z2BV{KP1O6S{oUoJf&G0kG&R@u;;Vd;0$u&dYi2eRdzzp1+=d$V z`Y3bj9YiH-R6}_EZFo@JA?97iF`slOl)RS%n(v&>JAbO^%BL5fNIrk%Hc+nhX|{>N zQQhZ{oeww@3jDZ)z-v%_9k{);bn`QNr|IzGe#gNd`-6Mb=61m)-TL^&Dry~SmB|~Y z;uyerR?-ZOv6n*3Av-TS} zdKX^F{KWr^8$Z-iZvEbPUG#nJ30}53{D7~$`J)+14NFgsaF4;|wr$i@PtSvbL)C=n z@Ju&Zep)UvL-hW4u2yziJ(!HIs;q3KAt7XH6e_j^!ItnEnQHA~Lt%SE0likZpuI)t zDlXr^HvOIr6n3h{mUlWJTNkymC$3l$ApxjaxTY?}_f--Q~IZ%FnLM4Rk zWMriKq|?Gu%cA2LjFhxSQ8X7H$83Qr$~mljWMPpoSs;ret4b^4BQp~a^vsy7lo&jh zSc*ta>KcjovuYB*Jo>b zvE#FIb@jJ9uiRX^^~c?VdLs1VRzdbq#pdlS36jmM#WH!Q!ur;69EFy7Nx7lSCTDZB zX)T=c+OClzYE>MyO4LcpNbPFnA_VnNZb{Pk43008As7%klLcY&wl^ViVH2~olbJI_ zmL{jx&>E2aNFI_!Axi}bIAU^5C#F*@6JAo36BOIR>dJhmNUY4&4bnNdwniDFrAl>= zC+r*@E+HzaD%JeK${~4OV_RY&xtv^y&OxS+k{Vki=B!LSeIjpxf{1kFMwKJ&>do!obLs_SoH8A|Qj7#))g<=CmJMZtOeq*gix+Aq z#tJ7@Q{=IliRp$7XhN%`(C49Us*u)kv29u+xOk@zWI1ncl=Y}G`xn+IlbgjuSx26Q^P0YxJuDJbm_OHf_b*OuEW9In7hbk!@XgRPr&jNWnzlZ~Q_ zNBPV7)%zSmJD)*q>#mg7HWhOQpj#^x{&aU)=~6T4;x17~g!*&@dUaVgi?FKcN7N3p z3Mon`omMTRXOHdmH&oEEbX9V0rvM9;O>oJNvupb=)}*7_8+!}7R5^v^^Ykh{0#dYp zd(9s%R*>VWGa}P7vgK$}RkdIg$<0&NiHpTk{k&_L*&P0@*}diaG#Rt@K-zvq#!;0t z)BC2Nt;w$5PDphFKfM6)R|h9LIDN`4dQJYQ@M0lq3Crv+9?Yy$k%lIEG#$Apxo#${ zu1+S!2M+P!j7(nsYPgE#_!4^2ew>iG`w~n()Np>KN#p!I@JAf3t`RX1(Te+dERT;(Yu-#o%+a=&49NqZ8*1>>N*>K5uGr()tVtGqyNkX7S6fr;S0f>612=e>-k!aMtX+sgX5g z66Pgll3uoZyO6U8&}ISMyIR|T|5jd!YrLn95Xs&YIo{a z!xP7BoosT<649)G&TAV$1?6;G4znrpk`OV<0sasf7h;fMVIWu!3 zTl3TB!Y$4GJd$fs<7=BF;_deN)sgj&8`lYR=*vYPFO<8q(=I(AGp{Jz%lX0?Zw|-9 z-_yQVsY^a*d)Ce0B*Gt<@7WGcRwr%DePaEM&qbo_PKC!+IT#yfr+P+|I-ie=aW)BZ zcl8*a$cS@JOm&Hl^s5Q+G(7DPPjZX52ndTUiwt!(w0E$KLr291g-77?J^Ztzn5alA z$ixx&Pv;~dV#?i;VpHrzZN6@P8QJNv8L`pnk;(pPiDB`H#=t7?=4c1PuEnv@-rf$@ zK7k%a0mqf=e8-Q8Rq3*5b2y=ze3=xWHbt}GHH7s&D~ ziucX;tPSu_%jwftnN8 zJ4G=(1_MuKF`O{{8&~pct4k1pmhpC$A)X!u@qWRcrg={Oj&C5tFP>>RYY5Cr{6|s{uIoVBx z{@K^cvO0#+TfqoKWp%!XQ(n5Jt;{v9E;}kZFVY5)oR4tBOzTi?naMnit$j*OSWI|v zO8iYrUo6q@f^kqV!Yw?&#v@4)<>>5|jTL;qUkrH{qRv|wo-ny^%FE2&$~pw&6>1q} z6>b#;kt(*`jWCQCcita-7WK<{U)qO04$DU<^Xj<`=-%eSRDbpGV&zzoe=taAm=KZ> zt18O!$cdJE_}~%6ME?|f1STAl9+z0->6cqnZRcv|>+9%bXJlm&;A~`S=?QYfg-1sl zTR2%{qRjn6+|JlrhPikZ^RkBgiF=}QmH1^5CA{?Ct!%9)xgDlV6cE)tx3R)_}gE+2}lRF9Uk!rKv5WL!4EQk zW+I3>1;@mCxY!YB(;vfzWE$4sh<%TmVafX6pcC8;#uu22Ng#O`Y@H_QtzP znA~7@a47ez9cHw4y$|`_-|EOO( zya^=0b-+ps_k#0e!{0zJ7&?D}5A|>G1y2V~>ObJUfkTgBrUYfP06+upYmA3E!Q z0j~hq(fhx{lfj+A2hfd-{U<#?!&eR7lz-K?gD(2(3;M##1#c4YG}li8F9&D~9)Q3B z&BWS&0Ji~f(+0i-V8Xv&Az++`rGwwZI$&7`v%!0Cv=8t@8U1GJyMSRwdC=j@@YlTr zKfC}B8sPK#Sa5xxzYuzNKz->$>z?d8r<_8&ys7$qvqAiZJ=(f8`kwZZjaN-}ea zJ8Mvjn;B|vQESxP*KZ^g-Ru_wcS2^z<)-Zr#u>;_`J$}r0Wwt7;2)4X_6kz+n+ZH zSLZMPsU|-W9YQxB(G+(E7uoOoX}DI#-8SaaMG0Pa`OYk}Q!qWtnpG*LN3TxE79X>T zF9`C1xsUD2fj#B=i&pke)iu@t<66&+jw=$f=C<<9^`VZ>`1L(@7xVenrH7P<&k37% zX4(iV_;%fwCvWa;K)dpL2Xk8aP9s+_zklP$@>(C4193loxVbVwd?;Jvse0e_%~3nw ztl;E#-W=W>pCD^~tnlf5Bo3W;W&8W9OTX)cns!wubo2h>l?Sb|VWMt~J~i7VSbx)d z@9ISsZHIUFMMLM;?zW!W-CWI$`}C$8H}5ab%c0TMtG6#{Mu%AQ+k)oj-9JfFBV&|@ zAX(4#5omO8_nSztpjmHey4KOPC7t`;-l*c?h&La-eRqkVdA)v@^X1R6=C0W_-7vJo zooQeGa%X4%<(;k;_0(-G`z7&Coh0h5 zZ!@z46Lb6TIyu~x{`GzQ8jY}ZU%T}6@CIl3^)>STvJZnGHggT5xiS9O5)Wom!gWVr$3R&ov4pUi!Q-)46qr)sLT^k$?Qr zxY0noC8cjadHmz;P!mfdxqnSCJ4Kqp$y%xyFvK+>56Df!fjT{I|o1AogMxD z@qGhhc#r&JQ_%GB8NK_{)6Xi-A#ap)_xhWD8ufMG?$jmz#xjGhnAv#M2O-j8QDy!` zX=~U*h&(MtamxJsihYr(rTI*+D&NQqoC4jyyg%8(kd2!;u)- zG-<35U0T*o;A5fGqMQs;NjkeQ1W$=dO#~%^VsjG|A}A^>EL)M4t6(eCND_{i(3nYz zYbM}F22|Q9_|e@hE{ZHK`>TMNuC#N|n-lj=VT`7B5c1qBM-QN^wzIX=`!UAg}gr z*`O-F9@)>6QQ{@NanuG}6@rn9FC1*?ma#HhDu!D5ox>W`$p;i5uUuY9f=1cLYRb>9 z&1SY|2tXz?YHS5Q0Z3kMPHWd+zQd{K?8Xd0c9c8IJd0N%U1(^r(YTFX$Q zFoadre)p)luTL{XP;`w?Dq1Qe3&Pe4+^p;XlF=abK>qaDax1d8Q&Pmbx>`~u>!1{s zZ9dvumrK-RE5tgefhbU>OR^Fg#fVy!M3BSVnJ87%XOt9Gb?0zJgtcT!eBSL^wX~*R zt|eo)<|pIi36xf) zt?Zp-&5kjvMffXy)!7osL{48dwQ;ayHgk5iy{Z~joti#9O)LTR!6_9vMDj$jhC@Zy zDDzo#dKH46H!Nw}<&eATN4ps9sVR)STww$qN5{(K{8*+`#7@nvuSxBEP}0UB-gpDm z(ggxYEumKQO4JjL!y{u*TaRFIOwhK7#YwlNsBDaMy%E@`FXLqSB39|}8ctPJpoK~$ z3$rViq%{TAbVjCAD%Ircx{AXCkN*wGYOs zaVtYP`0*}PNuD;3kgaG`)TL)gY9$16HW3@2oKad{lMI=kJ8f(Nh*VdP6G|7#y+b`u z8@isdFm^KaGju!U9#$kKzdRi28AO=ao;Z2J?AZC^=gwG|pYt*~X`W!~7ieYfW_HrZ z+w?zv{Ws&|$Nt6G@Lx|GTK!^d@r#$kc`HLBv(qML&zw7R`lNxq=kZ@o8yOw5Hn+Ap zWomca;q;j^UUm+a&}m>Zwl_C%GBR{@IBsZYYvOs_@VK*`jp51TrtTJ|F3!%bXKXF( zP6Syv7}&d5hgum}1DRfCXADmKW?*P&W^aA`!g&k(GbhfRF*#>;^4J+GBg3<{zg;kN zc5}br8E9^85fNbNVdv@<7~ta{93656_h|j@;dA-H)n#b=dF>9gJzpm3N+=ADaP=}J zMxZ@Gv}ka!mASczMNkIP`K-02xr=9zi%o*Z>C>L3<^k9Zh|35y_6u}(Ez62FbaC*q z@v^r#Z)OqW9aS0PF&NKA*tt67`X*ahhZdf9aJ37zce9DN%uY-W_p}f9EDiM!^e*;t zb!R0e5vxP(9i1VQprnY{#PFQ31nbxs9-fS}_H;3|X3O$&<73Qi6H*vov~zrXbB2>=e6n4f zyab)+?P`_g9$vdT+@*JmNi=@}@mpxn8Fv05Cu8m`@x4|ut~Cbw>|5FHRuTC$#5 zjDTuue4$D#8Z1A`CALKw5yfjuicK0_yS7qRP+5x$Ov#G$_V+grwJ`GcGI0zIO$eyE zHj%y*tl43Y$}2Sd^BN(kG8|&de`zEX+#JDT*3! zC@;&)$dB=Kw9MtiIy(oVQ8DPbN#=+1W5ZAZD*kO>GbE?(ajBi`qMD zik=bR{LcvYbqh|RgopcL*U?y?Okbzy>Wrd5Z%}|Lgj|bmEDG}Q3X?|JIlCAIoi(=t zVFV!-){dwB94yW4&5bN99HZj11Kr&tgX7&iW4jACHR-7V{zhj5VuIp57&O)Za{k`|VjWQyARsu(6=o)o+v^DAfhm#*{R*QOELs0` zWXpuR0U!e458G@(;4wH4+Ky-r9D|ekT2$~j*q0iH(*FVP1{eo}AFS<>Q4)lKALV$4 z)ue&W|2Nnwcrv|6cuoLxAU`%x6CCR6HN(>Ns{*I=dlNd|HM3xqDR3AwJnqO@{z&$bA2b-w1aZ;unqeLUUq_~CI9r-N znc0zeuok_c72a(c5DU!fu#>_61+NJ70B-sE3|wGd;E)X(VUKMfk68CFut?AWUb%iT z;C=ypfvp+V9JGP8Q$ZzZa0r^g!a$v7!2JIVZ=?RgfL8dff<3o?g>?a|fCa*x;h*{k zCi)xXXgy#{!PSNznZU3sh28XF>^^=p4ju$IfN%H{KKM%_T!dSH7wAucHR_iE4D4`@ zGx$*q+zw9&?k!kN81?m8!+>6T+cRCm;BAgc@BCRWS-m~ix;`L!dU>dw@}9XZn;U{w zT6@4hyo4G$j>vdSrbzk-!@3^f>dS_Q_vSw8#z(G=e!)S6QHajFs=0XmD)rXZa^HP! zubSU{_~YsITip%pUd4bw*C$`&wa~{eYvoPKIU23^C0jf-_7Tr~N^OUj#QDKDzrWgh z)%QR^?jNLxaNF-`Ta);WuZQ#OJt33YPNWmbybr)IfO~b&qFSR~ZxlRxx%-GS*}{I& zfA9$3Ftqq*E1_-q@xn`S>qY*TSMZ%v+W3 z-X2{i()6E9&nB{HYmn31 z#o%gZM19l!msd5s#Xc=%{(bMwrmfYhPZ=6X)8+@l{^kftvw!XP4qzD-jl36$2~Xx0 zZ%vY(cM9C1|{{+MysdZrxq(P|92A4Q;JG zJ)^yYUHfm}>cp2WGKFhg-j5eI?tJ{Lem?N}4W3S3dHiSx1iJT7mE+^e(Py+jTc?;^ zZ(r_^l`kJdombeOc~2>w$)2p-EX8z`@%(b3#s=dr-8em>thdoeDFy( z1#KVPCQ%L7Y3Z}_-3L3YA5$9}UxqiIY94AhLP67P%g(~jS+cTo zdHU+!-Ih|6amdQ>+?-|#5lKYEHLnR;xC{pQ8|%Wu033Qx=1qVb=9qA$E#SABgY(Bb#A zts7j`A2+Dackip{i%(ZyQ5&YzGgGY)5ifuD?03TB?zZOPebLH-wqfM@4ip$47*>`Q zUcX~~eJlA4~*VIALO4{xrHiE~+3uEXM?&5O;V46abHgc0ckzL%TB>?~(Wp|Lz_ z@t&%ts6^2*R*x-ZXNmKx(@O?c(CIa3gbGD2$t*>ok*J>3qD*Yj)z8%}X~hNdn%db0 zMJqous~nqrcXWJ2BIJoHYpYk8RLV+C zURfgvg~w(W;W$NjMm>*LnaiM%(EM?FH$^Mgj1<(BRkzP&sGDfH)WM5ygnb%80rO!c zscf9XX=KzakjhZwbK7~ynnq=pWaMH!qM-s`G_=C(g|IjxvOp%REKVzL+n(!Iw{&pC zt(yM9`QF~nD+`Mvl2(nWXe+5)>yz_a+Dm$b7q24AFpW#A)3=IBC`cl)KCg(Gc(V?d zhUxBa$;Qt1A@E|<5V{YU##aF!ogU%UW?WNS%Uf>uMPhRmHk)~+yqdVm=ah*jM_0fO z$knZxxm~pt)yr3Vdqib9y<8CU&8_R2(UgxfIHEzSWCYiPLl&S*c-R)+3O}W!kwux& zw$+RlZeZ)ik$E|lxN2=4ANYDJg-uAhKTnmAs-%_|RAE|3OitAmH99RHwY5hRER0l? z(KsA>Wkp?CkEEeNA!(TEn}-IpJ$w7WkF}lOT#T-kl_+__E%CtWr4CLOg2t>bTEx^` z?0whYvE6r2SI{X})>h;c7vWMwVq9mJC?O%aJh?V1x}htBJJ66N7p9a&3956LIoQkU zqNzy@rm(S(DNV>F*HMXO>2X0Z0yN~!&IYhSj38E&f%@NQ=;XPRCryn`hJGR7vL?IG z>DFgFoJ>tl2b{CDwK;p-!qm)>$>AwGls%H0=I5-e%t1;oLnF)I%p8oIK*(%y}F+OYhuV>DmF*Y_hW%#!JZ^m9nBgxLt_BtszgqZsTsUuY_SiX7 z<5LF53<6G`urhRYxZr4W!rthttEY>{sSAdN_Qs|*r;JUFEe%ebJP&ev83GS+OKSsb zzf-2?&)HkqS(w@f1p2vKx;uMEhPxDnCHvxu_?1T&b&_orwet5|Cx-$E6IO%q@bL3; zaPhZ~bFfdXc6CcUVRGVB;5jFwGj^Uv#*T3|PL6S&wqX`#0Z(y14(FS26qkT=9tcjD z>4juOjH!v)8FMpd?~Iy4`wD(wK)%0$ZF8XgF-Mc!3$`bYnVTD(vWRny3CIpHH8n{> ziQGM+C5^nY`cTL8czeGb{i=;P%Ff&5k(xT5TW?6fRS zZ5A;-r$C9caZk=KEXvMA=6n14)&=_bRr-1QMfy7UdfB-82ReHPcmxMKS^6a=c}10F z6=!3R#Z?}Dz5(cZ=d^@i_dM*>{c@;2%r^3B03yC3Fd!(TfE?!SRacAm^bLtCNRF$= z2fF3>1;z}|Axoej|3GuAkT7=_Q_mdrP@lH7TPRVscIj4H6)l5Rm57vr!np7%_b@0W z*gYWB4OzXulUrI@FugQ)84;H3gAVgGa|pFt%8j*iNzco1iQ^OoM8$g|g6sTUlF>;y zIBNDtdSpdS>n9d}x`LRV=#khTm5$mhDoR9`SJwqbo<<=uY~7IANh!_pI#jxseMz)O zs8?KEaRWLb&dVbtCon26pfHqZ4}}G%gkyrw+t+%yD{{j;(LrhmlDOGBxTK~eSU5V_ zq;k`}Pg(xERme#b7aLnI|KMZ~kD%O{BC`uF0lT+@!UTN~N#3SVa_BU|g0559-PwC> z=l<5(`uh^j|Qx5cPdvGa~HF3}nG> z+W)DZ0}~+JAOy9j0KouoqSP1wG6FCISmrOPfkEg*z)bpw06-!ANEoq>?9g!9DYzUlSo}Z1y}-;cO~Hr_VtS9Z z1_%S&1xA2jFmb^`z%dohJq?W6@WfzdSR{}Go6ccxYZ4YzvW8&~eCnr#XNG5`0<45n zj2{smKulN`{N}@Hp!Iz~2fYM+U1WGEU=iR1XoX|7L09_KgR^ihZ+IF2 zuX?%#KaVOwgHA^e89-8V_@e$FM{2^`4Mu<&_3q{{O#}6TQt-8h3tt0$^xF!func~H z0Qbkjt_FI11$PQ4?G5(lXj7=zlltj_1pQUlFBMi0$OX&LKN^Aam%+EF{^G&UAYjjH zIMW))p9Xth%l^dir7EsaAtDVm%I_|GYTesv0bU@VzH#x(i%(?G*4T&=OTW@d{=M<- z5?l6($ay&?lWCU+x8CF5jocDZWJ~mC2T$0z&##uoIy+X$qo2MtQiy*pJz1aIehA6A z9bK!$YZC+N$(s$!(*tA8PiOXjlEvNHd6{~mM+vpk$AAAey72r)`xEv$Q!Uo@s6|b} zw8T+8JG{@JGFcnywXLgn7A0>8^LK9(NqAf%Ppr80j@U}4bU#^m zzH`_>X=<`3NcFLi?}J=&hngl|&f_4enY zHbAo){@v}l`Gfbv4>qpKzw{h@=pBC1@_wynf%miR&ez)ls{9JR<0_G;Rq);lKK%Zc zNSDx`D<513UfTbEdSAXztgqfx@*KOXq=B5k8#Y5!U)Ui^sgpkrx_F*k^7yer$_ zNWU!);UBlJsW;y1K)%-r?q|jQ-4*WFPs9()I63RtR6DC*H+4%juspclB$&K%Q>D^e zZylu$k>&&pQR~7}g5>h-5=3Muzi(-0Zxe_5#@-QFzd!EMDkP0u((WJtP*&T>oDhF?W|015wSn39=l->iFIYO( z@bIIzls|4xaJfS6TwgD=_HBB0ezOTLlRthYkxs3?Y~Fv#ZtH1*HrgLd@I>U1#*R-? z@)NR{FKf|gmE4uXgWVtZKM>kAw{G2aU8{6_M)3z!#}tNm}!%jW*OX zga5&8oLSrMzKFjv+_L(G);z5iKx32q`FFy`Cu2LGWDOt4FFAKWnP$<&Vr>2m%p9XT zZ-_xA7sRnvQ7#!|-jGx`7?#_(-XzihIequ^*{8&)Rrf>quZVO(yAs3JuUp6m3 zIT#c6{~W(`kKXq6_K^0+#C!a6#l}50p0xLQqMh>tYI-oVsbx1$;~vhBNVkWU-cbl$ zYkR;z|5(|_*!ncqzRDobt_|ZpKYpV9Ln2^rCpgqM3YihXpqHsx%494m zom+%{R*^#Vj}PD}ojw!boa zWSmc|s1c@;G}4Te_-+E9OcpoAWJVR0<6}W0t&Bn_sivX?4dRID%IM_coSM|+lrUc? z#66>;7LkjuNTNs8n~iF&ph4Ko@+_r<4v9LkVjLOSi)|UNsbL@#xME&jA6n5NLnkBY z38n1pWNbmnyN36#-jb<=WPYWNk0d3>ZS|&Qw=rYJdv$5TT2X&vxvI1%JDU{Un3aJU zY~IML>dbG+&CMzmlNgzG4O!fd9NB`XO3_=LhZ40_Wb(>Wpw0|9EHso5R?uV^c5Fo<)P9_3EG-m0ltr&P0UFylH(;S z^s?5mN?FrH2ULlKW^3{W5E-)#&A99gR6EEtw%xN>({Kx%$Z2bq7S<69k+eb0Y7K)jpw4R_Pb$oim6qifs_+x+6mhw(M@2wldQw|SB0fSu z&%$a81i8h)og$;3+Qn}f5aw4-H=-A7TXi~UW-51Cg=AqSK#?sPL)lqPX<hI@=BAk zUDQt&^~<0G-0V1ZteQQTr(p9YtMKUd?fQzA+hRc-CkUcIVK$LndlUkaDL~>gp2rNFEe#D$UN{Fba5>w#n4CFt4umRO|Lr{R{{-ca zPyTkn&(rYV|HB@*huXTh8=gC9YGQfZ+{pCQ8Pk)NCMM?$9L?+;4Nn-IHUS3ZU;iEY z<=;+Qnwc0|o1U^gX=`eK*7(BNQ>P3q?T>qSpF3;lWN&3@e(bohl@qAdbIR7l#oo#Z z6tnu(!PDKq(BRZLV-sUXpHruQ`J185sSD>!PaHpK>2k`#444I|1bE@TG8 zrA1SUEnJMwx?J!%aSCL{&apHLx{zRI>I^KpK6bGwW-h7L2q@D>EGzZ0i6rNk`*@#+ z0*qYkqrx+DBjU>D7w(O@n3>wSIfTZ4%zWc49Fpa55*oo%>Hc1lRDeTsjGoxQ!4 zy-S9heQJEBhn1)41*;%Wc3om@3MIhX51HfPWS>&uZW3v1T@V=T;ppHJ=8)>u)zRx8 z7Udfd85U$58Wa@b7ZqLMoSzXA9bw@I`I&}=hPeBCySt-$yIK>oGHOa3<5ErSETg?V z+}&e*(LvT3k{rawz5wRigL)$tS>JrFY?T&DE6X)qDv66 zhUftmdY7cu1_b$qgcTw^LQ2A;0{s|1m6f(=fKda1z+FFs0hf>-Mb*e zBP7Jg4TYXX6s&Kp&dv^MM*Ec=@0K4IlNM*`Ztm=qF7ZG{*TrSV$EGWKDAyL7#Y$$P zSB3QI3y|(~vN8)eIYq?9Lw??gfzeS>RWXrio~}r{=u|g%U;m&`5ZRC$7npO()G8u0 zx+F6?BR(WO!9v6-^tB1`a<1{Vi%_vYj0Z;e`n?3)ipJmv{ozrv6C}jC#}r=3pAI0UuEuOg;Zq ze+*}{0`Auk6OauHBx<771C-Na3SbzJcp3DEs~*Fyw)#L`YCUlLg(-#s$QlkShK;zO z;V-m-16YABAdve1)bklYCh${Fd!Qr~kOundAsiNRR8Co+1sZ_T-_6N-DgtiOM+gS9 zByeiS0vBRF3A3MTzKnf3@iq0!V#boYyTUpGSE~1tbn&gVDZzuC{NJ#og}{ ze0_XNyf9x4)`@nS``|7szHM>c)a*-;A8cEXLN7smh^eY2`M{^6; z?|i<*#|u^OX(UBgcf*65UtX>gZ;t;CZ9LOGn&`dJ_Q#`kLi@tOr4N_icQF2-O7Z(^ z%|EG^hDd|&I@Shvy2kq6w@3w>?9P!D_S(0*%vtSAY4_Ip?+=CdaALxa@b1X;?uhn! zo9gLz+IqK!1F=>=iiE@BW!dv*#Af`J5!(I70>Y&aTVt(#o$^r%X>;M5y8lpjT{Jh) zCu_g8crfD9zIsW4lt-Xy$Q_ei>|9y9) zr{nuxuUsfweRb;+S27uPOnc`6wZ3q&6`8u_zI?x<>Ggv5Grcjno%$>%?M8LjsRxAz9G z@3#;cH&zDThy+~%?ql)rxO`&g;!fk;!5PMkR=K)H#j6<7=T~0Nu`loT4nJAYX$WuL zyx-n}G%v31lSeN%6WGk=?+;!`7TAL$^DiEBJ{e9) zx9N|e9ir;;`aG2{!0oK}y8lI0Sd#+smzSnu3y|p#Cw#gsr=qE5P zUuFONDG|-DEVP2M&az>y7RMT#V|`g|m?c1j@9$c6Uz53O8|@3T@0h!fbay7(+UF+8 z(|7rIl$zBY%A2cu&&9hPWW^|rw08gL<7bPr`*^}V-R!lU*Vk##$d8v#mO2^V_j-71 zZ5OXnUVSIs`l+VTcrPyV8$VC(p7vnO~z`*lusC@zVO+&l3i|-s&F~|}&grnia5s^rr zcqtFrQkRWsMWfioCG`4ygdnL2{7K2Gtz@L-w&Vog8f8`0MiYTqeWz`YLEl`v^rlvTzh#D79 z;bb+%XNP4X{Ue~Lz>Js*lxwPgMOjJ{2rcESE8{|9(#X+Kh~naOHbcTL4Jj#5#^R+F zd<=$DFf2_=LgU2L9#%_!bVEXJw3t#noYjoW63kceaUwjSMqOHnWM`Gv6Vj`7&8hV` zU1_aQ*wdTeoLE;rQZ}j^)KW?6QoKr?NUJDGfpSF?h)i5I86lDdrw7rilLehrmos@~?-c?nyQ*-xpJ@+wO}=#;vx zj5xv0M`J){?i~WZNSehJ^ZN2AbbRv^z9PN^Sp?k7^AKe#lF}@89g7%mF`@2fq19~&8$^Jw%AV?*>={KUqpjKu zimE2N5RF;r8Yt_*u=xUgJ8n?247M=v?b#(2ZHlTKLPJAmiLiMBJ5xKF-kM3!Nm=Oy z1ddeIvYq*j;$QsY7ufE2wCxH-kW1`{mRvkmBs-V>|3rdE%O4ruvtN9W>zG}Lx zfmPjH*ud3RZ?)I)K@RSXN%Fv8PA;9>q}6T_hL@B#PLB<2EmtkwrtGWqi|h4U{bSP= znr2kBy1aPe*6sZ}%d7VraT8>wu6In4mVlk=9cDFVPDpCg$>kJQlBzF7)Kij@R?x31 zEE^|KI>ySo)Z2t1WNEM*q~F$z4yo5iMmdY(wi-H%`Iw?Y zN=IpdqV2R`D66Ge2cpciu!<@sXMlf9O=g)yjvi!U3!C&fEW3YevP@A?nvEV@nqu{y zZEK~-FjR#;zmLXKWn%=AiAE4wF0&Y&J=BM6U*CHA<=XYFQJLU5gICQK32NBfo)K)f z3K<&467x`8CUKBDve+P{Gn(+l0?G^lB+jM}=o&$=F*dWWdl})dS*wJiI{pS#Qk#)S zDG=2N#r&R}CP8#keL_oF2?JqJGZ7B1b8JqEQj&^U^K6h5H>)z0MB#P!)N~RHGV}9@ zRX)j;p}MLlvLqUn5*Zv6nSgi(2PU30Hv9clR<1`)uv=_SWO$mhg@c`~W2~jWr@Pmw zU>8qw_ed|tOAJTLQ@{N7tCQ);051zOV~fBSyx*96^r$>xth^ zS^UpG{$Xut65tJT^7vaH{q=~k!|%VFn46n8Ik-7m{lnDU<=82=Qy$hQPnpL0pER?u z^S1E;xs;52O)QSO+nc!j16Xk%wf*D7ag*bKX#iV$SlBx|SUP6JnL2pK+Ss@UL?zgV znr9VrJqTlCSaexK7&^)C7kfJkW5g{k)!Nkl=&3(!9DXtW)z-?$G1}cHCp^&EJKoXM z-Q;&yw-7T+Z>I!1$M{f8_1@aqa|=D?k(L&**1kti6b8ARG|4&TQsY+|lo06==v!12 zg$X|fY_5Mbvq;E`w6k?~OiGWov9d~!b_;U!@Ia-d4eI-q*w_g3*dX7~P&-@1#v?r3 zH#RBS*UQZ&F7lwDHZTU@k59f|aA;V*#?{{3(atH&KHAPUoRb!86BFs0>f#e^=Uj?P zYhiL`Qgsg4WDB-%wDhQo zP7HQUPVk9J4)u3($%`wX2#}FSP;P>=hVtt~fNZI*!~> z+T>eY92FDe8R!x2<=as0-CP$M5FQ;K7Dx#RiwN@ZNsO%w#McH!x*=|~>a3bXds`oW zKTI{fq=8VkwX!^Wc{P20r({Q}9~#b-AULXTuIDL_vdF~Vdw(6=+1Y>J(8NznY62Tm zrz|{BiA{0Qr*h+htvsB(e2oL6OanqJOinnWb6orjd}1o91B%ehxYkT9DbhQkrcOLF zus4E5HRNRZhxvzswAwM0Wl>@Fu)AGa)e^?b*V8$++$$)*3?Eu-8Sfb6<#5zLz%fGE zUNb-KXd0PS;F#%cYa5+yYa7va^=xczn2mKXN~1_^>8j|g@(OlwkFpJR_fEF(Ev!QP zB0y4cD-YM|M$FLs(7~%`@9wSicYJ2>$Q|vi?6&UiDaJ$xGD0lKJLQ#JQJfZ@RP0|A zT;LYqfhr-?H2I$j3Uo0w^K&mI4iLI?LL)(*Z1cHn$1VOyb2N*H zGPN)Tf6>g$K|11}APRl}QW)~_04*oLT8JE^=6{9?Jp+0`4x|Adf$C4_>k0M5G=r)a z+<{q$XwXI)hh@S9zJO;K0Ayj%FQ`?9iI8DSI`+SU%0FQT%7qw21bj$u(*bTf=T2FM8Nj6oSZAoGA}P#RAd)ZI`j#3!f~{s~Ut1kMiB zg>t}5p%*R?0?J|FEV3bOG0c$+Z^Ijgn?H?0Paax0Re{n4MSKp z*xt}95D6YEkYyNxfsMht1t$Vk->?CY2-94_Gb(rk{;7crh79Y2ehqoD;VB624J{4~ zk;mXe1vkNm-26Y_xIslA1kMTc2CrcbYA6>92O{CS3%3mZ3HU4jCupt>=0Z3OgFUdb zKKGT=^JI`B5wpH64?N&W?)Qobi>j8V->&xGk$x3YN#dE)OZ-2-x)G8N^fIryI zdoSq|_l-<{zHyZ#{jkzLj$9R=)x2QIxKiRUfjfM4uZ_0ye1tGAn-H#j=)5_|dirti z(#wMum1yL%TuYJk&<0!C-BX0UP13hV>WAZm*(v-@t?2Q6Je=dDRt4Ar}@+f(h| zMiy?*-hR3>Dl*0k5}1|CON~_$DNGa<|*AUzB%m z4Bo*{KlnhoyuH9)?Ykg(vrakpfcE3tB{h%QDt#t;F*dMpp4m@%^yC8Uu zdK*`JkMo1qs|5iGk=`!d(9C%iv-L~Q58k)s^LK>$$s6A{KflEHToB3buk>#HwLi`5 z9QpB=M(~61k@|kOf9KMzr(2Yf(-hX@z0EB$+kH-7~o9Z(u*XZzb$C{G{B zUS7ZPb%?|tSQ~kC=R8xP8oH#`ouOR*x^;T!jJ)rRXlUr;-LLw|_tGgs*WVmg&)>rH zGnae&1_qleD>oMyXM1R$Z*Q!w5^1{4>G`GQ^9xtBU$!N~+uzwwo_>;7uAbxb`WnaQ z&eSSID59u>h3l**V#^_SU06zc4w^r-gVSds@8ujz9l>Ku!N5m}3p@DcP%? zlS^AG`z!dlT_*7yX?E(BZsr{4#hsZ?RB5+-R84pxMT(f@T47`=85NnG96_n6la^Fz zF!}LVbVc8^9^YF!3@{_78e1Bn|By9UpPPx4V@mT1Mkx41Hb<(;D+6G0rJT5vBXe5w? zbbL^de`s7uaxrDSZL zI1Yzhs%8@hTFP@VJEQ5DX_a`%i>|gh3XL_SR-_l5W>jDiMKQN-5?xzN$iZfmEAQ+z z=WB)unJm$CiDkEsRRd^ix%2f%ys;`NzW%Mm{D9ZE4^Tp&%LI*EDhc{fNZ0swNRV&n`Ld>#4 zP)$O*Y8d0n>Ao%uma4_n94S^fIlxR$?dDC=}jdJ2`GY|vGV4|+L=l+ zVYxJih7ngwG*xv%Yrr7%Wh5Cka=Dpg}1^6cLn1Gdk6Q8T8$tPT(u2n6!_s=zRHNcl+ZMlG?Z^mwq zD0P!MK_ykReul!lTzs|e{&wH?_Rag7&17OqdY6<_$rqH;^|H~WcO4fHWu$rz5mw5_4OtX(K%pjY*XM28e9b3sBXL94Rh^lH_) zoz>H#%0e=|NvRj*H3LWMtXzDi`n2lwL>mz&EN*PR)Hhbno-QS&R1K8M$Nr)(F%?~7 z!|nJ6{VCD zx|-$exkjX~y?sci7?%}c@=CE)Ws|s4X>q}9E3v(|u9>G9p0Dkgna^kE57gmk)7z_* z&hEStR(}&Jxjea^h7n@KN+B;HmRpq^l^&1D;LH~BN6C%oZ7dJfEG*1sRS`%Wo{nFv z>p&&rLW&E>$!J`nM${w;jEf5o4+tP7AwH$K!AZwJ+TK$RKy7=XWH=AKhw_Wn7NsS*$ERrTbrYfAd|1Tm4hwF=k&YN2~($kH34aq zPn|Tf@Njpwv$r?$H!<-yb2Tw@uma(^JpZuuFfu(6V(bHATATaZxmkM{{rcN)|M&&@ z{TOgy{?}iQ7$389wzRf!a`*EHJmz%d*CWm*znwUK)XekPuSb75Vd`jm)Z5g-&dS{5 zxaUceFz?@f_ck>-=HO*))lS2aK^zojen~ z5-hwuG9nYx(e*crVx!!0^73oAdGYa4an8Qsh=+;yFSbTUY<@Gg@V0fbu{1gg0%S$j zWTce(2fNu>Ik}tLo1Sov4K+)ziaKT2HnFo?91!B-YcF*$KJMUTX&X}(cEaI=uboRu z0`SFkPjhoBvam2Qv9hyrNH@0e#@Yr3XLvi?M7QO8TbkLY$}S8_k`kh05~3ncT9&w2 zIUoVn{%$BIPp5P{7t0{*gPWm_l?~z6;pKzQp(S?p_Ey=7km;y}l=ItO3hlfKT5=wwoKbhMkRZ+Lk%VQsZC*D2C1ATppBTUq4ik!=$k zFUcv5u(k|Mw2Me6cMo@ui1mo_Yls2atdNrAxb*n^^i(e&pR5pR?2pCd)Ofb7n@5~m zL|8?Jt4+R_Qko` z1raG;&S~0|Cck=24K|~s7QvM_AAp=XoMe{ixLQpEHK)Y>ujX6wZ1tzrZ(2i z&)nI=#~%~u65|}y7oXc$7akN45SA6)T-WRx;{f8N1*hR@bx4i7TUer#gSm@^lYeBe zw|{`I)A6J37Dh%!CYGi_bsjlIAa4`}mE;)~YkR`oE8Nv9t}r*VH3!sS(XaZP0L&OE} zLBsvC!JZkS2rMFFd4P(6*D%DZ!{A;}ZAby}nG75RTN&8+C%nJ}L4ai-1cTH62sFDe zu9ktk0K@zTgD)%?1E3<|AKf7%YjTdmnLYY4(0!wO@P6)0fgxSEDZaG z>jv6`=>fwBI5I%fqGf|5xE}&HW`OOyA&Ym@ zAt7^4_dVBjD{eiOzEyqbyCmBpOI9X%ck#n#2r}|u@7>Rmrvv@xu5iwiDcuiLryp!- z21c)wRHNs}BHmR0gF9`#`puQa4;R-qUTNEgUU9#2J8ll(r&MQ1-J6$rU)94B;R|xd z0F`!|^Nld`kTLw_^u~b{`7+rf)vf#x-a|&8clGHRj5e8!b^qEzr~VxI%^QT=-qT7V zzhbuZuw}i^B?yVSKeYQ`>ci-JVc-0hy|ZoazPx=vQt9qbY@QRpzjz;EecPSy9G&jf zJRbb`f+CgNY8iRD$^L%uzE|xMO@&a;; z^XN70!N<9+M`uAAVIBVTg)v^seBT9W>%#7vOWQ9Wf2MM8lF6*?3!G_%Y=*!6<^1Tt z%f9}%_s`2F39IrmH|M6#eR_QM235bVZzE6-9&~Ys|J+wG5M+4t+TztG(|yw*d+vJ> z0O~gF96^Ai3%)H45{AbfZ9idaS3V%??>1O3`zaGoXYLDRn%21otA7%R-5W31m#>Zy z*#y$l4GoP*{hIAkD1Ye3-hSQqF#2xw&p#EL9a9}7vG(eD?!c=0$;#bj*4FUS z!g={3Pd?wP!OxKo-Z6kugCYIOBoTFcPg{nSuXy;s)l}h`C9e9~%|-m9VPwBW^lU{l z*eiIiQr#F3E9B#Zzb`8KpUYS2tE$)MsnUZDJ+)2JMSR~ippp%7$H#BH7f|n9C&@3I z>-kRYKmVFHx!W=K;NIKG#g=apS&Ojs(&ZQ0m4_F{DffEMk=qWwKYJ|sLHRI#hqBw+ z)kFBQ*SFdI7oGP*jOVBr^GNsZ$iT{_OH;gCV^0-tdOl9CkUsUD=A8$LtlnxC+4uDA z68+fx>g83o;O*z9Us{xes~?|y2ez)<>6tfIKd5`gX?WQ^-8I#!hD08HIkL6=aqKkv zIc<jaE6N?c5dyqv1#mNg>kG;||7F&8)<3p>gwwXGVOl0(Kz zGBOLZ*z(Gx6iG@?BC#c{x`#xTq2m<|<;jVKlxQrH z-<+M25EPl3kd#QLHddFilO^hyh^)Mvh!}Z%N@-?(aZ6HIY#gqFD=!vT>Jrn7MJ#;2 zLdM~RXXNu5$fTSOi6%9Bgv+JSu(%RcO}{iNFH2TkFC(BPv_s_DVVqnum)&1bSR}1V z>!*-PTboLiCAu9E}D#MCy)e+5h<@#rb)_> zW~SxJThi-`3dv~c2pdlyWzoCkoPy>wd?jtNu>dP>Au4K{K!&Ke{Qi;BEM#1c&P-0{ z;v^*9Ftd)ER9`hk$fr+NjZ}7U@Kq~PPD%}~Q_!1N#hO95-E7P_sgTi5(ib)0gso$| zrJ_RK{##0C7cMF*HEpnui)*N#YEEKfs>*VyzPP`V4AKn`4uh~U!D`yHj z7(5PYP1`I-W~&>nV{=OCOL$0A3xUAvZxf=2TIOmNs4L2L^g6MX+EGR-oUUW%cQ(|P z)=9)|)15fn{*|*AspN|FJG)QrK54F+SU)p1T#um@W;H4+TMCep#N;MmKabPX*!k_* z`keMkWO$%!y#pA=-{Q{{(o3Wn9IaL;#FbB~=o$)z*`(00I*?*^`oaK#HrKekI5MRn zUQ`bfYtmCQD^Y#qA$?6%4V|JAZV0L8?-AB^TR9C?tlWa$t^#dQPRaILIrDVCCzssve==}OS{N_y> zM#s3OMp!$|%*KuxNf9c)WEP`QO?I@gwNs;=@`-1Z+OlzwZvoetr_>a2)$QY~9j1z^ ztXPNwGNvU8IAQGOYV3Q$+05@`jHOFZcoxAvDAvx? z*)K7(G&U#DISyE@ni|>pTROVio7%WUn1Uq7MrI~J+Zt+i><>Fr8!t}>2lo@kC*6*D z7`udeT1R@h9Xn;`d?L=w=7fp&Q8TNfC%pfNFn04XwT$#|^|3PYbhJKp#Mt_XHDUq` zw}1b~Z%2PWV(j7J>1e1R+^q{Y2%y}7-3`X5P?L5 zx?RHMJY zN2#-El8vQpV1#E-dS--OnKu&4%}tJQaPo4ibMu@k zkBzyfr>|pGR#r-8rmKH&S-GcYT%1>QW^@qB+9x8@J_#wGtxHG@$_&H!1_%3k#zrLh zMMOpgTgC;Ic!%azp%MZq{o6vH!Y+#EOjQ!#lzbt0`ZRW^N*^}&vvgs zH~L}1n=u&g`p}A+V$TroYQGSdTyGC|ze+Stg%sya4fjvhRTrPXyYueN+qx+2q*_`S z>z?H2o*v>H1fsE7SvrTh_&LYL2U$fq60L)sBk0s(DK4p?Y#BrFjg3J$revdXP*pL) zg2d9CgxKu-a&#%;9%3&kO=#@NQ4i>9b=-;K%4E-zCr;S9))%sKoy{$r-6G2fk(C?k zc@q=Go;ERYCoFOcozl%r>|2>TQ)3QZNi&Wq@cX08l8X1kunic(5wa$ol_)w%>;>fWt00gYu!KmIQ_muYo{NlLY1m zRP&`vR8%jusqnFhGY3B76gohT*jTyJ5WWzG1Zt^}yB! zFtUfsL&E(68ywy?n7$jH12_Ym4X~XF(j`N&aDxF{lAHd=;UwWp3D@*cY$H&PgGT^< z{>#q+fuVsn0E9)S00M@w*#2L`tPiIK8^MPNMI1UulfixuwfVmrRvFH~@Rq{K99Dpa z543+%FSpMyS*_~lbk^XOYD%S?YGd4Hw%pPYo_69lb)3CN-Q=&6%d@Yjo#S^}cklek z-CDT7VzhVDgcOEkdzjV2UEf!KX}KdhKk@L6?(T()(y4L%Uk~;bo!_@fU2HXB@Xv>L zTe;tFynL(QnjYMpnibz#>z%#6b>#YTPf3^1#>Gjk3mtRF< zxm+sf1|Yb5Fz{JJd2?a-;PqSlEb>Vu(@-zYyrf@69Wx?M&pEmA%`uNvl`s4oP z_2AL*eX zA4V_9?lSs5OVyvwYqj&Y2>gXddoOuvjcR4&CSKgXJ|sGGllT7PwYx)746KM(g9nXG`BF zZ++Z35VD2unU|5*iZ>G@%%@*w->XE3psSDgdU1Ss*Ys3}SpQ3Kso&K(!PAYeI?14ZhAg}I|=h&MYUtf*y_Aaw8Ka#dGJK0Mh z`w;#zae%)?f4Z*TChf}>2R^p-uU-AJCpx=-X`I8_qs&t!c%G6t*1j@)ejIu6O#Y*v zshDV=+t`!5x^||ocU5myGEqSa+6~ zME2K>j`7Dce{;V{EDPN#t5F@|5uM>%ht~i#Pp6%U}V@ey1E==(u%t zXrI#a=U-IDyGu>nchc$M?g=uL1ymyr3-Eb@Z5L!+M>c|HG< z%4IILB2!(@CHq6`R~YoYvmzGf+%O*ha8rEc2m8Wl_LZ%BpSm6)SKCRChZO^3ZHR!y z(GE`T&@X=2?UxJmuhpL^|?}^SEW~K%&FGsAyA5 z=v28%t68ljUB$3JpBFrOf9DDRS}XU}oqo;Q@agB@FVbWO%TnFy)#;YGeKDP5r~pF4~Jnv+PCk<6cE4yZ^^j>nG8F*+ezlDbJ#P4cpunt^N_v9P0| zr%y!HmuqSCi9$UaqbqK#5X9D?kgiI6DnGHNJFkA2gT_!**}0SsMORT(bt$$<9g|W< zZpfi3b6PuOn(7RSx}b(qUB|dGPZ$)^YKDp@(f3ee*OQA%q^-jxxmZS4ZZRtlhZSbj z5A4-e)M7AMoRsXsc6?XcHdfWqztgVn{D9MDjhA*&33+W}>iMby1gvf9q>L=d)l};nM3O=scIq&GPC6U*%@?HNx5oV zG}m!Zo0lsf=Fl3KDu!emYnW2~fP~u6M=M7EIZ-8_E9y{`Dl~&Tj8R12l+{n6>iT(P zm8hk6YJRauHrQ52mguG$w{JBwTk)O6XRZ)thIZ+yYC)!Eu%Hk>kv~$5bkm8XPj%X! zZi%3`y`%FAfpxQix}qsPyScr{8NxKokI{>n4dl*YX@0egK<5!hdPgd|2RYR^VawUI z)vo#KF?}PdIuj`xA@*&wYD+6Ha@op6y&l_;GuYP0WY%8Al@p3uH^t2p4Sl1``Nme1 zTvkx}{B-MSfl$}qGh4r=WR_sdic;#zTBKd&Sta2A6nZ&+KsPbO#Oozp8QItzW?kh} z1xG86Ev+FEhNEH|$+d`zSc1f)RE6cGM>@uZBZ#qsjlH*}$M451P93)}b4o2ut1-7v z3AaymbtDjilCpeVDuUBv5I;M6=M%2sVdkN(uE&j?15O(M@|%gZ*-@k4EG&-M9kc!2 z(#*jXB#R2M^bht*jShCPk97L=_z{z1Hf}y{CdL6iz!BKq&Cb)#0mL(M^lyh7WjJ@4m92_0(K~QaLkiOZ;+`-Mv%iY4q$oBWlcPbrBHt4}o=BX9%~5Al#}r%780V9=F22^rHc|23 zCJr9XcCO*aj88e*op6h`^7adhwX+V%^9(|T2IDtc(&OBmJPI7+UFPi-t7c{vUSX*q zjaIys)u{-FQ`Ro#AmmhxjkQPCDOWQ$n`GzY8lF>PJg2X#YvN07qJ6HNx0k0)U{Y?3 znHgeXYi(YT<{99e;*^^jS&)-fT+~~j)U{yOD+4U;k`m;)Z_Q-CXv?M`+oNuw0Uq{N zc1f-|PA+y{$+=c>4yl=1bfCX`v<-@A?ckK<|38JEb>UoPjxB`iuKA; zc4r6JXLpb><>)x;aBB+(PcP@>#NzO{V5F`wsUy|F!^^`jIL;5dJC^9+cq%E&9Y`jv#z$OA#HZM z5Zy%io5m-UTe(D+H^+Kaq+6egwsrIt^yFbEOL;aRYPN%~yCjlD+8N3SOebmS#iW>s zpx3?88EDt?{GjwA3^%JBN%6NshoP1IjiQOp?&;-?X|KeXT#)%Gf1-ALBG5a~HNbOm zp`gBeG`u`L$I>^;?4)T$XdbDpFr$0Vb#;(av?Jo06wq|Kw7}cbIW8s- z>+a`cXCC9nriSLv_&WqUF&k2Y6O(Ei{FA-WF2Ghk;<2hgm6#JpYk|r zYV`~F+jqp+$PK!@LQ*j#w}qGju?FxF{A6}SHGO zGr8$M!FGV%L9A~$)_-Ga*brFzLV)~#U=45$=?-)RQ5KGZ1bFi2AmA??#J|r1GT8ru z1+W$Tfd{+`FJNRagX1iKVK7ERIc!Y>F`Etd4XxlQZ2j}TVHSW-A=g3J{z=W8Lx1pQ zo*@S{lx;YE4hLA!!~Q@a>>eUF%q9&T(hUK?04f7khC2a`^de%LiO08|7r4qpsd6~45fd-#(5`-DMF z@WDZscUT*I;C2aYXJ`Pvz`JaSc})iizrX+t%VcN;HeP^8aQmMQmCtNp_rUzC=|9iv zZ++`|B1GP;pPfBFdgdEj%H~SX&*|osK=pM+$T-)n?d=|W&VM85`?|$lJH0ry^nyqF zb6|qR?7yb(9uX2cCN=HTlM5Fvt<%4^w2WQay)BvKEZh=x$Yc))-!II~D0;>hRqf;V z2RrCrrx5%XX8SX_7MUOJ5vjW6x`8=O$Fz7}wKjf#{1Zt+;;)_I=t!ePGK<0g^5E9a zCiC&=+lx!ruU@;LpL?~vHMjYNEo|Y?+o*5&jQzoR{ngFsPxP(H)1-$~r5e~fGu0nn zUbwum%)d-O{YoR*6zUPq`JJ=tbm9E-`7KKO6P4tC&lnz|zFdFx_CUjz(B8e+$FryY zdNIDLp?t)P+VKQ!kMg7Z;yE>4E!#UQzx4I`0e)S6mn>DtB&xpn^bt-I%b2uTx*I`H3 z;0odF&9V-qJQ z9}xP8W8>-((S$}uAnhD14{lSpcOR|(rPMLxNM{F;|AM{oqe4`H&j^AlqJWD9kjLgo_})i(xyyd~Yfz?(mFj>r+;AocNDmIl@bpIsD6 zX1_i-w{^C86nQDVGV|>jjV0S1KEHxUS;JJ~`4VlZ(1n|#GwkOV`q|_q)%>MSAs&tJhw|(345VLsX$fgP z_vp=d=fv=K>mq^r_1o2hHmPt{-LE3+CqBsa;%s4~7+-+Fw+&CWEH$@D5&Y=rRzL6H zi<}`o_jG)4dX}=r_;i)TUsts#1e`nf{`@gD-u9i>^ZA2Z_u+u|XUBzsZLwC@zAd~v zqu#he@7w5o`r;FvD!M%R^6r)Co)5~ettdTyfXXVv@U^JItfW%d`M8W~J> zN_kv4BdekyOOZIitH%}AVj1YNdI6?9Q&$@sEsM@zCTAf<#f5RvK=oYESWt$^Bo>Pi zO@k`7ATfbROe;yLO^VM*jA8L;bYd(qU(#Gx$v`majq*l(O;c-pVqA1&0ctikkyB47 zZ((6|>D*={PMcm-S*$~46m@jVviGp94T2dfwLx~o4uVeHzHFI1L zMz2zsn?}c#NNcOfSs4sXY;h)9J6thIP_%RtOIQuU)UtVrTuDnq*N$n%1Y;!)Q zVOHyN993E??r7~UOrPlL8bPHYs4{f3sAQzKysZIS(o=`xvHLQoF}UK4-hrBldWw?J z@@OcRR6kXd)RQ19=@bMt723_ zDZjSKRnc&@8EG0x0h)>HIK8^GJ|vs%yaK{wK=LZ%uvo4hsd}*^X9r(%sar6x%5_UQv+Sd zC6q0X4?S$W-Ygdgg`_ex1y{`}OwEXC%uxv+zv5jvO_-fNTZd=N7HjCN5z3Nyc??HZ z+!^Z7%r$gmjFs!SJM)#r7!5@$L#hjixs?kC1Cy0V*J2%4yp9nw3Kt3Lc6qIGir6{H zViCJXW;Qz3@Hinbm6uf)l=6!w==)%Ypklgy{zjJ&1H$&rSJ8MPst%(TXE&+_7kPC` zthSkvlrb=<=xZt|Bv(?(vP8`Ds?pZ+9!@u}njq+AGpjU>xKbpON*nI19iOa1m1<5i zi2`meE9c^JK|@!4WfL0RtzQ_WH#SX_@)t&F&9~GAPt{r$zmnOAlb7`|8pYZ?tf0AP zU^q9UOx~cAGwO=EDra(Nbd)@W-jJG_m7Rkk)7kjW?8FgzOMa`kAgzp9nnDXND^IK{ z@ejmRq#?f3;2-Gc z=wXT+b+L1CK4tX#(ceI%;@?i#dU&}8m>Kz*I@$hi|z&B4$pA$4vcWH4s;4P_iBiUD~+_YvTBUO z$7J|oA{lzqx)GjpXxN~A?a)FbJlT(aCTt;eqPM&{oahO}QWuBLP zc%6@ZgfFfE6B8XBdX?VNqd9AZNtCD<`A#y&kLDx@gAI4uMT z@^JvB)xQ32p@Dw5axC-dMjbXDB()C-$wgNcj%F~~M7jss)7`_zJ1iuBA~-c9G}fa! zBQeb1%_%%MD#Y5^G1b~38@O)|DY8(R{*LD6;X%&M0jaWPY$GN=O{|(P!}xnt1!AhJ zD_A6ty1FufBq=W0$q(rG0~(zX@Aigpk6_>Gh$3ubm4B#LV2x)$iHBQYB|5Xd%)LA# zETOOc*)=Kyw}5HDHiDdJxus1_rRhU`U7P6ZP5ly5PJo+hd~s1suoVc3Wu1uGc&S{_ z6-^E=<(1U2gQ*P+UCdM&lbDMxo3AO(TS8QxW&UMRgr;O~UvyY@0pjHp;GEoZrlv7A zXLzl!un_Mbmg`v^fRZp0FsH-AQr%rs^%IjzwZlPPNwsMa-WHCozV@xSp~^bX==SLK z+j?a^h1s@6Zs}+hi(N8u-TX5P8d6+qy)xsyj$4L>hZOo)Tlu=iINCPE$Yk^Vv^nik z8wE+P!Zb<=w(V4dX;m!$h3D%~z0Zu_az}F(eqs}2Z*dpkpucxv3 zDJx5xpqQfQZ2P0BzR?cx5w12aL3UQ2M{R6PY;3{b9y<#VxeFp1IH1)l;13ut7<$Ma z7E)l`Cx8`)m;%ws;DG#Z3P{iZ3nF#_(tuh~=zIH5IKClJHsBc^xTFIWGa2A9^mXO} zg)>wM!;skq_JKSDJ$7k8=D&l>AFY4&jN zegMn>IYIR@q$7w)hE5>=gRHe`Tn~`>7ls4-&yf0{Y%q$$y%6Yb0|d|FXFO~o`$fR7cFHZ`-GeglPIA>ng2bPUg+B{vWU3Je2)bPLq@|2JGusC_oLLIcliupI&J zz?NWte8k2U5T_1H7t?!_Z#0{^tJpb7=6s=G*s~nOWH+3&b(eh?rA% z$yeVJ8LJmoUysauyDYr1tyv&X5hWilvR@uZ*0rmgvol=MqGGi5)^u-IFPZp3EZ4Vc zHs+O=Y0?)Igdv~5_IczLoynncS`-HwvS7FE@~tadvuEx-XL9dyXiNtF_FG!ZKJuJ= zoiP5ID%$OrjmzlYJ0)~|w`lS%O~4%6Uu6Gy-|-aBU=q31k&!_P@xhkh2KUvA8+$98 zd#}i1O}CtXi@tc{^rf>a)Pn)q^xW`t&kfCxc=#$oL%;oW07L=1yZK;u?|XNzdhWTh zld(K^_S`wr_y%cy?{?>zJEUuRWNYXeLH}ouM*42BgCn4AE%#8Dchvn4-*sL;GoiW4 ze>mSQ+*sF;pU=J_u=bZOK6`-~`J%nU?WB>%J4Y8r`WE)DsgxkA^V4?HKI_@@wzGZo z*EeSv!@}v8uU1YgduN8foVk7N*{#RZlFQ3%E%Ty!W|Y(YX6fxWshst38CmYoB9ya~ zyCcdg9~8I7Z;*&fcXns+$o(PiqX`O)&y`OougM<^*>cJg;YTWS`}qUbsBmHJ>(Fg7 zLq0;JEUo^q{|=k@_Uhv=FBjf^8N5zDGxJ$Ze?@=MzCag@b@cb2 z=h40nO7v$B#DeovZ9To`5DADp^KfkF{@Rdcb5bsou*h#_KqSTX;MW zzd?x0pC1xv%M0(v_8-5{Q?9&ItJ)b4 zKeg*`sVAn_S*$4`{qDrQkCG3c2Da4a{$6Xp4Dw&ehCkCbhGpbsLhqQ8I4#>Gy%XZs z89PJQc^r}S3IF-to%e%NJ1@7kKTXVZDcUFb-M8o2ca<+M-+y#os@&cnzn-Gs+919< zyNNWhBlWzz%9gyIj@pXqjJiyOE2t_cz-kg(T9fj$di_Nbbwpm&Mycgxle1BM0|h-} z^)2O;bT*Qe&8x)HXKB^NnW2%~gv>fjHJ@3f$SGEVl$U56OH->$j8BM7M&-8@Wfq9b zgsn0rfh}oGOyVWQ$0meQ#ZmDHB8VmU9OUq+|(2w^=7;-(%^E5a(L5>wHg5TmL=Hj-A(pKe2ey*fj%1p^_C*{oZGBWc@Dv9I^lpEOGhV-s9aY7oq zQ;~ryq){iEJ2J9p^ujWcc&xCk3uwhh$>qJInywBkZewC(q>nyzn$?w|VNI1~4kZH< z`OI8mokrAEggITGTgm3<6e^fR3cVAlDk)=5=vq3Yl$v&_NTF7;b~)VYs-}ioe3gKT zq6(M$rYJ>Abxq~CijnT^2dHXH6}~CGhEH!GG!kmm^0d z9_)L&LwEic0ykhMrkI(TnQhrJvkWq~m>Dh0mSmD_%goFaCuRsZiNnmyTP5Fldo1ee zs;|DP?vs;Wf0UFrsg9z8=hXb6_U5X*cDi=BFu%EAj#ZtB?(E7Z(Xj1Vnzq!uT9z_x zxwx!sf+|;5Pmg1e?ln#~(#)o2O>~tOmX+0FdNC~aXmxi@wq{s6(N$cMm)w`rASYkk z?%ExgEi9)Ia17wuu~t^K-rPCy{1rmSmXf(lVx_!-qDs@`QpN2Zo%P}`OjY&k9S}|N z{xy+AdO^Ng1Zu|Ru;t_=)^0kp2g_yPibn^q=-S+pPNW0DZydk<+Jxfnjj+T`drSvSbxP2hQhA1c_aYu$7T zn>C!uB<7)osA^V4JPE@~>Q9d+CvdCf$%*Ne1DI}wss>LIbnylK*s9#3DtaD4OHFDo zAFEN;3*w`z3fv0(-AHMkVk{Q9U~vK$Zf=uk7wTsO+>7n4(Pfz~4h}Y>#<|UkDWSu*1^QY)W_Pz$KBc4#l`2(6Sl{X9Xs{AnccBt28h+4R{wUw z@|VAvoIPQ1`gnlF1tSwv0|%#5psKT}+1WsEBbO7$fy?!8dS~?h?RN{CKdgVZGBY`E zVq#_f$7$fvea!rKWl940J3hKaSq}k;kA5?-`}2?A%z=sf*Wb)djZT{DpVxEoJ9F01 z&c@d`($DamowbQUn0c6!*UrMzAK!>-?FA=WVE1-&^6+x9wsY|`JD=mN?_(DoaLU)o z$nt`bi>-xy0x+is`hv5ZNH2sdz!4!FRJF)=pr^bX8f$LwZ1Bv@ngEzX>?_jf*HcfrXH zZ5wZ5QWD`27#)eW@C}Ic%#3ihi4F-$NysRZ3oDYMeX*74g*L^Z$reWF^O07TM#cgD zHB7!Ys=~^|#?=+L5JaI8;<6D(8@s3yPE|sXyL~|(wN~9Lk@@@EJGgkjQcoWCN%7c} zG6e`%$+tI}_$WPzY#1b8<=jrC^?iC*xje@ zOJOJqrHan;vq9tY%hDa)oNO@;@%;Gu7Ri!!I3cq%C%cj$U75`*S#0TF`ShMl$-)rI zgE2UEQbD2_+6zk)f%ps78>TAv&K1G>vkzY=_{vwJrHCGhJT|om?GUGRNu{|5p~I3p zivpZ7L!8olauF|2zl<0`u9;MjlGvB;k>>7XXJF)?R1xeNWb0xcV_+I$&TYMfC1wX$ zrZeNMgY7KbBSj1uKc!ibnodLG9I~Xtg`JuC=2+j{15gHO05SkqBn&e=8!Q0=<(J$A<4DC_k7aZhmsApsOyXmQ8&ZftF z%*~DghJbje;|Itekm`=-{Kdk6S}E0RK(K!m zTGsI#gc&OIfCczN0(F&PH7IEPgQj5^2Mv8>L3lLm3(mp9zL2kUT9C^B0TLs*95CQf z#%etYf-D65Z2v240Xl*&pfbQpFjyCL3)7NzrsTtCIzO0YfhI zTGuTX%=-`E2psCd%i(0O+%N13N&*8EgiNVhDX`i8C+OJ>b`St5&`>9a0@7a}Z3Ge2 zp@z=}blr)S=fFVS3n&R6F93<~??`DKp~77S$M8}Ct^fIm*5MjKR}jq&&cQRpihqHt zggWS!3ul1)4lV!@K6n7LfS=$&1o+csLFZKbGZ+S^247&1?hN=@3CI>!;rdt57tHmS zKJW|lgx45cU67y+sspad(Uk#f0eB2jb%SoYH|PlEfgonk?PyI$JUrO*p!-$b>ft2g z!PX;I!`R-7nw_cr&Fjjat3=gR(wBMF*J&pAa)*+Ff73tp?n@7OjNQnlZMBb0USZ)R z8^mVuB%fUWaDV9PkLAad?cJ4j()FkKSCd4># z2SKyq#r)%jE*9`lMW%Oax?hk4?d#H;RQeW6NZnL7OB6eO4Na3vqjHIQh{2&sXvCjC zCz?BNtROYZ?DwP>OZO-TpER>wKh(1v z{=@YHRmV^9%N6p|>knJ5vnVuttLX0K>&wzv8E|}k_kIWYBAX|+31>&iZ`ud7xsU&tzF%9v{D8o|tmq|Pr7XXG z*xNkU`txQD?-E3cIef9Wdcg;lqjkUXTbsw*c z0$=j$drb%YnRmPe#*@h&aottTJ;}qqJN@K49TK_dMVF#}{0a#;Fj4mJ91@q_{#Yb! zBXsuA^vH1Mt5?z``9|&3SK3%_D}SaF_o0S+tAir_GFHcF>w6%2Jc8fjzkkYaD4$bs zd-3AWcdMRL_#Yp!-*XYdTlz=br}7dG5C7(?kWIbIezCW=zJU|S1;|^R`r=*E;vrtd zy)rZY`f^|Ez^nI7^sc2JHy&J{-JI)1+CH}qZ8r2Ww#5Pt`I!)Rg*mx!^Dc3D`7(nz z%ph&H&RvqqpWoQ&SHGz{92#6|p{zY)cC=}JT-twrOM0vS^}*}f9;|e<{^8dA^5yCJ z2`y>;Q!|yOpzV@w-|57!);!+c*k2O#)HbP@AmV?6F;b#!yY*hseq*P$@x?PlBm7KT zs{hWOnP_6a>HMLbJ$zlW`u^gzj`7<41M%kM7XBrl_q6?9_t(a|uR2BSo+qv2yfN;r zsT=LHD_Y) zlOv-Uiu9U*=puA-RcdBzRerHbsw~O_58aiKs5p@1H$E*iFenM_@x({(?$M0F|GBNtK~tC6Q>F z2q~x0lw4quDC1<%V?>R)QhEj&RPq>W>nkU$V)`^${oNM@Gvt!8N{wiLZnYoJWwV`YPsCnE)v8N- zvC>3VJO<0cF>>2f+*C@12&6;i^sQ|slGsIrYH^yDTcBu^u?Z1^WG$E1j*?Wrl3b~5 zO2$UEb?h%KD`QplMM(wyE5NGCK*|GIxv6CW%5ZmSNm6`Ge4VtaN-|oLL(DJg8OBEC zsMCuomUq`W1}D1vQ3Y9@1DQmkCZ`Eko<@w18RW<1RdkEw{KN!xm#i_CQIIdrD4VZh zg8J5|$l4W#w!JAeqaY!*nJX$wioaWG;N-5_x?YYW7-B zhU(Il`qW;exQHx}wlZ$tt6L^3i&U%GY#OIjN<^&`rMDm{+4CxOg}R|5by}0ROntn^ z>lUuousVpcua9tVY22q*NcX6ik_W^$)lZNz4yWqTQ!)Ygj$hrpxwA!+X&ULDSe>%2 z>WS5)(z0F=^KloO%;}p3J|6XVrgyp|ZJ-<&VUVGmlCVoBgnS-#F)Oh-l`U>*h+~M` z(-LXP39@Q=v$W~v@)D_7TX*em38W$3XM8SLnY*7hH*hfg0t27;i?_4Us zCoPYiwK;R{tcNWyy?U6QKX<{@;MAW+j(Vp~pFQ@gjm^0;e_EOTcFf@4O@6gDw)oA) z?zsM0htr0?|7m&J*1}ZJ_?)S^sj-2P*=d_oo>}V74M-+IP?QoN5*SZD;*KY(r%7#Lz{bUum`fr^cDcW^N<@(y>lGBLbbQ`ZTY zWFVX2>+WJ7;$jCfLLp(ncG0P>CHA4l&N=z$q>(&Ke1SbRDb>Tt->oXx(I&;i&(p%m z)&bs){uRG=%p9o^h;NvNQb_2dGPvqi^ZzH2U%6=#Pa0e((F894vhOSN;U$xhf3 zJ1?)4h!kHNs*^R^&%&;~W#^KgOscLjk{JnNIvl{6gu#So-i}Jf(o)VpqSrz5)Uv|A= zxCC7k7linxrI34sDT$g|kyIqLwam5+2txaqxdoP(78e5^Hp~K z&epbGR=xKk1C;Wp;O&`{8Iuf%d%pfOv>HzO~Zq2 zPTLxr8lE$5KW0n7QBtq8;i3+}TlfZERu%X=(&PS>S z@w!k6U@okzqytkYh*$>Nf?43afF+?>8fM%ExsYN0EKr*njyzHx@)+pyj}Y-eGqg9B z!^B}a^Dhu#26_Uq5XT^I!R}xybQ43IgO*4@eGu5d*`sZN@J2i;dJNl-W`bW(4yD`} z8cx9>)a_`$;1SRUjz8i@s2ZH^s1X())Ix9Z43`SG z4t(lf@FvhvGYo3i-5|iIUjE-9>FOH57yKjXDow!y68Qc1x)zw699W!bmH#*F{nt9- zCc;Mou+lP|2tEeU-4k$9QpGQD%RmpH8oXM%Jpx1EeF?~(RQ^BV1%xj+xB@CyT}gru z62MsC*#LF8G4d77jV|rV zMn|K1M$|EXd;jT|ww{HtwJ+oMUr3osrJR53r|=Ew{^m4gZ1pwc!Sf&MsxKg`3hq4( zArFj58e99nHS@l&e))pj7d_`8-=0l9drz$A)76p|O8xsLaot5mLzklMM#sS;K|7Dm z|3c{gFx;wbWyzGHJNG0z6I2QA^_%Z|s-F{G!uEF>#uNOv@Ap>);)idaYqz^`swXoW zZ{`UL#21U2!DZy-dIO=iwtIJ<(eo79qD=mvUVHWxk6U^B@V2&Zjyk9wIc&vocHS(! z=z5FCbv8>miz}O*Elayiolhs4cK4iKvy`Eq&!_nNpX!<(O$gpdL_;rjR}Z9f zA0IXJy;=G8lL-30-Dupoa{CR^^YRYulkjDmy8ijf<`2R*vPksck?c?+yL1C-!gsvy zd3NIim%;!B?1B9^Up2_g*V*?^-Vv`oxW3Rg@&G~ZZp|+?T>2*dym#diGIYB}{!%jD zxgZzc6fEowwGduk{z3WCTzm2IYsRC|d&>9yk7uvnpKMv`8fCF(35O$(->kPt$A30V zwYAPrcCRd~jSg;3Gl_HGF3C0(2tz??{QjNH>HaCWC*i-ILPS$5gX<5!JR2hQOwV)2 zTR5aIKMB3EJI&;w?{B#R$(D48drdSXZ5f=o+Szsg!EKV{+ZT{vySZO>`K4lbyi39U z$Zcq-`TF(t>Jq#4GVap{ZV#)Yd8bFE-n{&1b#MI{es6l}RUeVnqFUTTdL9k2Bv;<5 zcSgDzXbfeOj4>-4N8aP6#FDOohwAmwM_0zaZ;JW%X7Sg?);g6r^3Rw>+Q5F>dtR+< ze+zj}*5G#z*4rnh@7%w=+uwJ6<9hMpSXQ^PWTm`zycA0u{`Tq3J;fsN>i5}+FRYbK z!ad&l;m@TS!sU^6@h%^EwY8_(B7T|f?d}}a4z15}dl{`Gf<1QoMMYBs1K-X5u*UiD z?rR5e=MtY!XhuevpKnd?&P~ozzqb(v8lOlSuHqLiWAm?351Zx>?tK$>bhJID*B-uI zRx4S9ZwSqlhNq*1u8Vbjz3Pg>j}4g5kJigu$elecnnwO+2Lai8(zDbn=Bzi>e|fSe zgI3HHazOt=z7l| z-Pvr`@;aKkn!!EN+p_;~d{KV$ZBj;=}7#uwaojYwGgjWWuh&8|y6lPUeeZx8Uh zdpD+fD03fLHxN;!uK<@sr)Mg&_|a(*JVt6!9)_D-osS{QkP=#pG%mYRM9CnGF#_Z(uiqM3d*ko1_j~Rgu_YW6&rE?475;Eh_Y4J6Zc%&pQB}68#$EP$` zW6_0;m>5lTcb8h6SK3u*0 zI=MbPIYHEf+h^u-1xQvWiMRcXqRoXXVdix*RJ@Dmwr1%(Io$%N72 zes#xC8!m~$I&0vCOQznml&(NJe#D8G$3OC~ab22L_rPUL4P3UPfub_lTAE34NAIuEi>Ll^6Ycp<)uXXoU%U@&H z7=!DL&)8DYrDg1c5@zxC%}wp%>YeMmtG(Sj+fORiCW}Uu#4FU!9b7qk?Dp>4O|m?9 zia{mv z%SRNfTT_Q@RP7L#m%_kIluu7}_cphxO8Uyu%BwErR!<{a2h~Ma&?@4}aN~SoC0;a` zR?sq1+d#>n&L)?pm-Z3jD|tmj!+rG16>-&vdp8NZR6eh?v?{j+mw>c&QpI#^J}C61 zX;O<6gwZN;Gl!LvT-#i6k+GsI&&Re2ay!L&Gpg!lZs#(tcQB>Cp%XiKuZ!4=7nJvx zQ0inD4pU8{;EN~3<)Ee+MVuq=sc%okvH2C6D_JXLnVH4oDV&rPZcSldYBD9co$FVP z%}Y&mLD4ceNVd=EKyPagM=P`w%EH(nD9FUz!OZd01tZ675MLS_5_rbK)xp-p%gEg- zCM?bk?djrT|tkEe?8&q&mK!B~ijhB_PyPsoFsFk^+wPm1{ zo734dMn>n(I{2LpwJ!2BIc;U-d&0=X!{&_rzyI=Y|D^w~$S)_4|9Hn6e$?ZmNP|FHVyw6*b{$IqTU zd*%;&=TjzzXAF*6JJ=f@w>CD=GxD<4_dMa{>*Hc!kE+V?KnI-nYd{3ulB|N5>ssx~ z9`RXwj*~-FS>*X&K&ooP-+aUu&Y9SpIBntS;bn0C{BbK2eZxP0(+9btJ1P%Y=>@V%hkMm#c!n0n)VMmin46keB!`*Xr#suE+Q|AI?apCOdxkj}xfHku zRT+kvx`q0ALcb5uT=?V>PBa!Y9=_+0@F;0ZSy# zXp{V^T#$S(Z|A_I$_!>&v4D`DpBHcF=Tp+%?(G#&RvCu)1=&0J4$P-k=U~F!9HV0c z5}NBu?JFJp99`Xf@)Po#N7X$8;qw-n(WBFH7l0wH1 zuJ`U9++3ZW(W+>*fBOUu|CVumuz8gWfyOC z&ce;EV_-%tuEa4u-hW5OI3}eyI`}!|dKw@((LsTM?k<=NQ!kJQM3a%`9-ijyXK(D4 z7}buGgqWLMi12X=O$@3K#z%#QRT8T!?b9ntTxXt16Eod?9U}c*LgGzwE1N(ub(cJM zD|1&rCtvsQP**=g-(YW#oTgB`xuK;)v`K)esV69>Wnu1N=;n07#?(mv)Ni18b391j z1l)K}9pMZ>2*}QWZy7{0WAZsWN0o1a=;;! z1DYZEQUL%#zg!T-4C$H#ARH#0hPG*4DPWTB5atI1hFLiF2xve@SSSf14M_V1c?Slj zLWYCofPc|J7lhlR>2!utC?AX`>a5#97#Iy}8bM89CTU{jFA$ZEfC(-V&IJ({{06>( z<^NSj(y$3I8ORY1^Jsz2;4JtC3AuIJfS=_RFk}{p)qxri3u0m6RN$2Et#ec^*FW+N zhti-Ta6`ZguH!$BVSm^Fx{xXfK+Zpbxpb0YM;$5ZGy|jz+rf0uO8+;Luf?`Ts*UFof$65wa`{o&M_p9Dz(}kn8_Zr<(5B0VH(jV|`Q*S*PAn z#VsmiX0Ssbd3srS8R^JeeMGYyux${vbw}{p=pKH+d35G+XoWti-370~--F9X(p7cx zsRVcoW&m^zuMgN|xJ2k~4KD&*wr=TATjph zpeN`9r0C4`)nHA({53+?84iY1!kNGz_?QGvs1pgV2AC3#2cuz9Ht@I!Y699RutYc< z3qPTTa6%Z40D}!+STvBLqwUGpADV=s*P_;ipZL{2Y0X=Z)^uoaEW-wrN3f-6V!FxeD#?k5(uVer47Bz_Tht@iyPY?Us0FDU6V7M z#e0wD=V|IKHnQ8_|A6wK>E)~Gmr4;?z1J_O2O+t4-*(j3b`Ofl$oFm`>&fFm?I4%^ zdA$DCa?9s8wIeLjTN;JMtmzbqqzybm9C9Gpk)zMgt8XU22McpJ2i8#o| zR>~)kb6Zo(<6LIeQW|KiexX3{m5l4?5;tC2d$c*SxbR4QL-B2GL#z36jYE8J=j!WP z;@D%wtvj9c`^e2{)h+t9UCw3R7FjABlxlk0RXcBccRCvw&9kb{O&a9cBu4_cOF^Aj zWZYhsH9y0PTb|tJma_i3C6OE#!rQ`YGWlgub`Kq{fn=+-vF&0+G+BlE4 zpW(j0zsy*9p}zc6G}2C9YuKyXe7vtcX#Ux8ldy{%w%r<-Q+?>7eN*h!wYLasr915F z4@u&k5yA`}-!gFTehpc8IMvkp;3`vqJh*mci_pD7t>>=^4eQTDtsz|SPLFywy z^AaMazk1jHu&wpu{Ihqs{SPnN-n^?4%*xlej9cRqOpZvp$Hn#E6}7f)sp}3NJYwD% z*VN2w+bB$-dj47e-lXXJ#Piv0{9}9zaY<44?y9z@u?Feg8?B!joPV|Q;_1WNqyy=_ zdqY&-)LPr}T<_w-VMi^Fd8qB%VYdo4TM_M0Eqg}2As5u`3|*|Dac^8asDH*H6Pif) zw@otIxZg8`XY@|VR$uaO2uVAfyLYa=ZhKMFMp}vjbxkqF2QlD#ZL5bj z)tky!s-HiH`+jhzhOUg>?$?NKd=swVxF2u*oFr+vHyNLLBz^mLmJ!xicUe{fB{IFV zIj9H~nbwq^jV&u>(aJ%JVtGnwybP_WjBAX|jb$nalo&*oA?iT&r_6&2Ar+pWEmWV3YDb$)AlmaPNM9VVj@a64EQPD;GVpOVs3P#eH zmlz%s50Vz~lKfoAxb%#ogcuD0#i15-bf62OqLlGbk&)?ubWq9Yh)k|Hv@9ksEj%GL zvNSa`$kX55E2}CoIT4i@7u-}3*;tZSnV%dRi4TpB$V*7fi;GX`N{Fu_W6I_7!6u zKc9f@%qT!Db5Y5K94t1O)?C@xKqd?{X{m|=1}{Fa9+b|k#SoQ>8;ugRMsssZRa%12 zsY}b^CQvJ*QJe-!Nk&g=b3~t7ktNk4z>*8RgWKg7NsS72k-TuCp)Zz)wB<62almaL zd7!eckd}_h&y-{c<){=9IZ7TMmq*?@ln|>|wFQOhj_BCn(V_|ZI~LQu*olO?7$PnQ)| zU=w@mlI1)!w-zbP9Gj`^!yyxVbz78tdB1w%A(0@+=b@tI(wdUwtehIKBTbp*<%+5j zm0FwHN-GC-)v8ldvr71F6|Az%G43c|5Vf3(iRKp+OtkVuMcHxm7G5EXELm+`y0Jf# zr7oJBYs$jZb%=Xgd0bXQd1Xevnn0_~;1@}Yk#byqhLXR-sUmjEl%+YP+lySGB$&7qcnU*-Gx+XS?_r&i>9KCy z~2&N6mu=;2-^8(Vpq+tj-xsHm5f=91Jy=!qO0-Nnw;I7Ug6ScI04uM3M~(lqX+e3~00s)0wGS61iO=d_KChG)7x0 znw_s{uBa)=;&s&SUnL(@rZ(rzPmT^CAdmVbGi7k3MN8JD9S@EBa{5Hp=@jqwkbERfWE1eA)`cGUe!o1tENLqAeGWIHQCkp z8LYgfOWfN_sbUYVbIWK`IfFFj(r`m+GFDOCmRvA~E)>=SPX$tzBoW0b60~%bNRZ3; z1(4M3OQDF}E@)K}N_!VD&57w_+A(5iQaH(r5*HF*TE#@No6BROEL`;+T=Ptv4fIWd z4D~@0X$NZ)hw}jeX12zer+i%v+)o)8Ir$V~0t=~Dv3~kV7nojd_8% zfo=hQVWEBjZiyjA(YAJAw4IZkg_~PefumiRt+m^qZl(bqmXYSCPn+53pE~|8r_bBC z80j59@#pd15z~{u{EMN%X%O~&%G>U&lbwlg&^d!sXWc>lt20KX=gyu51)L3S98Tz+ z)H{3Z&od|V&K&#wm%sh(S3QfvWO7(KzAo)BFBQ1Pa*3?3Z*KPF+xxf$hMJ%Gw?7dZ!;|)Zo;UoP@gF9~ zPaQWnrGNI%6Gj&L78jhtj4eFF{xmU@M*ex)%-hS|%9oH6fKQ4@O`y?!^ih*L0KMGkW$W_U`)UeTzJ;t&?#PdNI)nwsC$Tsj?8Pr(Jc; zWOhM_jd8GPk%D-}4nY}P8DFsSGdmX%5#gR|Xyoc1?iA>6Vi*!+P-<&`A#m|fM$Q;k zxH*IupFMtz&O}*&XX{Z;Rk``lQW9#o=+R*`WM${*A8qesc_G6u z&&R`16=G`?Zf#STpPXTDV-cGkZ}06I%&1_F53}6kJV}g7SNELa5_)xtmq(yWfV)?e zPf)0Ro}0flV((yYmzTd@kdR!3$&B=fo9^r9kGX}QLM$Bf845u|7pg}A3aN5v0|~|3 zhnvWPX#d^S5#Z+0eY5DwpiE5cE0|mxo4a*=d~Aw&^Yz-rmvtiqA@0)?@*~FEjTg7b zjWi}V7hhK8?-Gz=XB8HmZ_f&$I|TceSX)GRmX;wNPQIZt?5qH4Y*Yr?KFBF0GOse$ z!X>eIi5ENSA z8^kPi%ri2|9NEmgJAL(!9d^Zf7dYuG!+7tfItB;0@5cm z41xeyNROaKGe`gp8H5he^5hZk0GT>$D$}78R1r#ooTHnbUH#v|Pn{(aNPx@+fb}1Mnt&DmhmP3F z0lI-vx+RuT$}fNwf<=ISa5_j!M;|(ng8kqY=!i}?2N(wWK#YZ81}6e>z);>1dlSo# zgTA^G)iC55o`4J0eZv8|A24$l@RruC5v&Gm9(1aPTnSJOI)TF@&=X|x0%LW--_G&=Z(D49R zl67amFW_EZ@qa>yg{)joDkGNv9dHQ$y9ye3L$fq+5eFMV1om}sQvj`@cJKvv0p1Zu z2Vm0w1lI(%o&c@_tYQV%1@9N|6HEi11ptM>Vu2u?%l-cY4qzt$wK`t`paNXOf20)u zFYq$KT?2h!z%=xhhf{%V0m}eSVg6ZnZNVtGk-ELsF*r~JmYt$h1jF9&B)o~B-cTOs z3N->9bi#C$uUi4^2-D5MbAO$NUEwge3f&?qjzIcD`}EA?0qJK2TfF*;eWR7JtR5tf zE+6dgZVXJ1+?;9@06SORWyxdC*VlbD@l7;aj8c^1NnQ$>(`#Vq)9r-oCAXLM{U>U z!2Pv-#?<|J=1h;0N!Xs5U)yM%xsUX-I=1+i>RUcE%;WDex*s3h>Bo1r@W0)g=P7UV z7|etHxh_Qhb^ke+bZboTZnJUjps$YBynCy={=uz>f-BqmFUDW?2>6Y}Yx^9Wi2dQ# z=OxYVd;IjI`s(hD;m4F$(m9s$O?@x^?I(OoJ+p!MU}9_iDUN!ZK*V=XP!Yy_%fJSs zW|{F5xUMhvibqHH>F*oAbnGwJiN(12-i^&c@VGi%Puly;X~JKRBRYddC#Ber@~S z{u+8hLJ}`D=LKU-+I;>XIYo?mN4$?ug?3!uG9FwP&HY~mu zJ~$k^ef8sNS3`02*3#l=R&ib?p{gP!lTcb&UAU1sv;R~pzts4lp+`1;?J|=j>l*-N zoN>fwjX!A2T7)%7uje<&`|w-9e2O(@JL*lgd|zyUSr>tY&=&8c>J4v%N@h( z_s9CCU(=o-bzRI)Q?2WC<>jFz;$7-!VI@=e>>dou*gXZk*&YwX>bZ6;B|DXpXV+gY|0dnTTK0Qo`uDzxr|i zV{3QY#ZNt*RQ%!H*ZgMkmoiMLn7l40F`B7OH!kADw3ge%{>G)gAN9kcYd;_CwRV0Q znC}_tofVIhln)hzYtxtcyuKR`-+z48@PfJV;K{OTXMXPfp{9X|Tt@CRzgxbop*%U{ z@-`7|8WY=Cn%s~a5nI6tBvoXo@yy6d3aF7zDWpT zZ#;(1ia;0O3TsPo;J*x1UKWv#L5fI8Sx=Ke6WX_?(oswR{;2_02f5Q$5!jR-GgVzOdG zQ?Q)kmj2cF5B%@xAtoe06V=*C$;fWVjYrj~gv97nji4a|-K%A9PS*}_*cGL;g&tBds4Jb(Am=tz zit@4;a`KHmN<13fDjvaQa2liWxZLixR&rx1D7c%8ohv0LPK>6O7iN@I+#TP(G!qrm z6rGe##>OIPyu4z1Vj2V8D=Y4!WyY6b8&YTU8}kLgeKjv!p}M-J%^9M^68n_lq(I~yws1Ie!m4NMB7g+`@~#O5UwmR7_zVbZE( zIhpvlgq9rj)vV&ekzzK!F`-!57&nfsO+h-6s*m;d#4@&C=&bH63Zr~B8`O=ODkb8Qds6b~14B&`q`0x8H$Eq) zSt+3^S&bW6g-`D^ZLd}m+eTG9;*E>*Rr3Y&I3}f{j4|6RRA>jpdrfqKkf*xLnq>3( zq;-9(h1c&+KG=OR*V&F^-n@Esxr|bU6*B1sST>Q$tUSbQURz=oiONSR=mo;ou0k|L zCV!|%K^JT=FJ)&IBk7_%8dX)xPX@`os^;@a(+hQ($#Ln`c@$w`ce*A=+EG#=kUec{ zq&K!6bTl{Z2;PthwCoXaeP3#!kkOd`xLR9H5mxR@WaI1dsmk2e31p`an_Li8S(C!3 z#t|gS98hSTa6s*@-QVaEclDJIlb8wFq7q7VR!)HoNz1HG6wIZyayn2Yf~In|KrQMO zPl3!!>FQs7iKrs#l{hA~zqav9+F_KkORDY*RArV&(7SqzygyQJ-t8l|NPZZ z&*{(O2IlAVPyT+^+}R=*6=P%`Zs`!BZ+$5@Mjqp4W%g%i?+RfBRGD*fFwM6#Gtx6d zyiCtI9zXx({e-2Eo9e)*!&cz}Pn;-0t`(7ndMMdt4L0y^bsO ziVDao9*uK#^a@FEObYZ2vhcEZWk@NvH_GkK8wS~zn4hz8JZE8PLa54j3OA*h#W=WC zy1H5vM0@+&So>n`%wAjLo;n$H5m69$+WdrLfN6veDZ$Cm*wED2<$`}&R$NkeD7v#YIMV8zt=kE^ zC=*i;XE&6RN{ml8Fgow*>1LN5=ir*_Z0e|Y#@md(7vShv;uR8|aKSx3#2~>szye9K zb~X>r@bvQzLVJbz`33pep}uW;JLuU3dD>-lFzBQr)_bDT-qhF{u&13}LV9*|P+UTI z9V(L*n`z-6>fr9^?&@e0)|BCG;uqwY-s+N}!4%{bqjK^BJQ?NvnR!|Mc5YY~_X-!E zAfFQ3xcGz;4<8RZjFVG37FUQuLXuEuQ+tQtpy0r)l$?R^*h_Q$Q!VM}qI^Onva>9Y z!)@q+_FPto}4f@GJ82Ni~fy@eXo`V063{6vuL@I|>Q5Q}u<8ige0Mm)2OC2m9uQ zy(??v2_&IirLKty&S3$;XjI_<#@#wt-zCW^%fmSh6LY~)sqyRQ%``t7FI1L_T+6(Y zY^@^-qTO9x9HJ37D=R(!EbB0jB%@S*JwcKi7lHE1ceSVR8I0i$- z{m2P4wXu$^QU!&?%3fDu|6 zL=bSQGv4Yj6`loVT##Q3jsSnUa#a9L0R9jFtdWl(4UPrep$pyx-;BTf!68Qzs|i)i z|8)%P*x(2jy3)}L3=xKy^o!2+2&qfQ%-|DJo(^;X*!}N1CIWHOzyVmNkPf$CS*-sT zDzAG1asNTC0I2?eEOlhi24i({K#PtVbud*0(oX#|q*;J@aD`C$BQelS{g1%n4Ugan zpd8E{4rCCkj_E|{`a?X_xp0FfC{c&$pc8Z+2Kxnq%#UykwEqQ$x)!)a{{(;O#sIlG z9d+~Q%+hcss0x@2hLZn1Q28iNI9oPl1&u|ss34zYJ9Rx~~D~^GlV7qlo)NL3Ps6%Ppgit8BxfU3AYm`z-M6-br-xVf@WcbY@Y@r$c2xee z@!(Rcrk=wl5@s2<*=>u1HOS4E%6Eik90sltN95Iw%x}%$G_;YL#g+RloV79aw+88T z-oxeReVx2#;?|G#@~yj^5qi6VeP{3@U)?Y^-+>!h+vYD1&5{>sPwuVMvX*9Otbxfs zHubiIIlg&aeR%iIT{?H0*ZhGkzqmHh+cY@%bMps%bmHgshwI1zBBAg_4;yFeiO*=v zwP{jq|1`6$e(-DK%du5v8?J%3GO=A#Gj(mMvt#5DZT7>$@J2gj>BY#BTFIT6_}su~ z-?|~c$?0XhZJJ~+takmpL?qxQgzT*j^%Eh9No`!JUG8`~*eRSR3?B~d3SQ0#7T>8x zxw6&vPjiA6{5xc;zxM9D;@N}U`;YEi+?=nw!MWN}FKt+ESx`Ue#_?`0lBKlIyYmuh z??YU>a)0X^aY&9Mef`$-Y4-*5#j9EF#MsA8#utX1-u05U&S{w6(>}kn_2}hOhHQ6g zu=)Bn?e_4GcHHB8%Us+&=Ce;yh2UWGooH`s1b_W-R{RNhyMI@H^8@2&&+6w(YqRTj z_Q^Mwn|c(TgEBIAj``@Sa;j@Vd`o_-5s$-2x8CA2hZmeSb#d|mNseUKrWot0!~F<#vLNgbcM zO&Q;6?jDy;;$L#wR=LE-1bzkXiKx1W%3NvUjCK)O4KvgqUu43iXLXCs(!q{ieyynH z`o*rd_s3r`%2_oRTPN;LHU2mR2I@A1qh-I7BNOvChK7k>hc8aIQ8y+xic1-kE)EDf zXVv%JnG>zIC~=QCOe$MIQam8M8c?>&#_!qN#y|kZg?}-Nk?3*%53db7G`)l z6$hr^5(;VDa1^teNl#8Hj0eS-N9ncHf=blX5cm%fo6v>ig~Sn1Bx-U2k`NF>49Ma} zmqsROlgSKRb!nj>IwF}AhZJO|R-@yH*gR}OyaE@33Z^9_CB>(wC>dCKTx$V7F(x`W zH8nJmhbgIv$5v!VMZ_1!CdNmGN2f-iv&y6Di>awn95z**EQpNKsL0`o88M2iBy>VT z-vFVxr&HaMn%tC9zIKUPo|B}?9ciX;aQQhoMa#O(nTkwYdOoo@q(aP! z;kQY0Ix{qKdTA!HGCHxSBr7($E-#TNsVDY~^k_2jm8jAw;7zZVa)l&nw{#+nNFGoQ ztCRYXtf&l>IFneF(i|I7RUVm)A(c?@k~!L7QE5y;RDS97z#=ZMu%m&JSty9Y^>7dg z0Y&W~GK)$wn9T9&d{Nh!YzbFaI*?l)SIxi<@**Q+fwRt9L!~?^H8YK*%B{{=(Q?!9 z;RVtPe*UB^vv!>#&n(bzrx-a^iG4^Nu|Ojw3^&%bv^DYtlzdf2J)Z?wzmQ(mf{V-4 zbf9t)SB5(PskdQO)Q;xuEOB8XdSbL{`}#^sS34;MgcT^Wdy)(D${LfKGfOzl+})PW zk?FxK+^|F<-k(bA=dV!H#)gGCB^$VzYdCzRw(knAZ=gQCwY9F||KsT`pyN!IG|@A= z@4VTax97~+oq0R&&Yj!0yWQO;NtPv97Ff(Iiy2GIEEPz9F*8@GKq?SciJ2KKOP0*c z%)1(m9O=<<5grFqQ=U1ZQU z%I9%|?Zn=`1>OK*yOqMk$tNzW$s675=g%(hJbFxQs_2>58r1yuiLGmQx5xR{HybwU zD@V3=7CzvsD+H~>s^Qy`i_>$3t%D3cC_Fpe+>=AB$ia?WR$%JN%9SHiqYaygsFXQ^ zUMa)#`u23%1rk1QnLa|)q>?L4;P^<*$}1BrG@~1&PkXlu`4UrM-%4kPvX+kOt|KXO z6U@1I1i46LBf{DdC6!A_DQxN{uJ7n*;?X*g9MR0+;2SHdyXMs69h{3iY!kB9r#&mI znKM^vavIZ1>3LIVgfEmK^mH?xLvAQh>z9#63SCyGNC%+^)JblRuA!n}lh5La)O^Jw z)-5v?Uo)Uz=sznJz2j+~%IfCJ=*{BR;?*iH5Bxu6RK?4s3tCID1@xwz^dWY0eVPgP zuxXJz#;eS&qgKq}P2(9P@E2QNURZ2qdJH=uzYr<&_V)0PI_>R)O0xF0I_B<>7ZK_0 z8srpYee$GpP$)C&_^%#6+eaJZ2`7F#?GzAjG9$|8l;hw3!|{ldyGuY=$f09i9$wxK zC!DNK*(T-3_>_c(dSEdHRmDlZ1(Eg#Z9MIKLp%dRypA||AG43Jc0BA_VILVB4Dz-^ z5C3-P*bm6TpMSCj#juXspFCzA?EKr|18#?p9<{cy3G@VbJK(tU(cge`*$NbQwmR90MgCO?Z+Ws##|Ng_j|MXW_I?Kk< z8u+u1A9HjJ_w~j_IgpARgHI)#iuH^;dHO`MDuubW>Qh}%m7Tx}NOlgfvhr~H#V5+| zP@E_?PU4r~=^B3Wq}?x84#yAvawPJEjUT|OI8s5hpI6Qi*HW*vywaTX#;}N(*g|J_ zrJ2=xj-6C84Mhgbuhm+sF7EJmioeVy`NJGuzX{zo;=F zz_VXh<{4~b7wGEekI6Zep~xt8_iZSw3-d=E&jm6TN)%D+HOPd4`w*?~|u$%j0_=HG5R#`k(alElzTdI_?qe z8tj}=QOF;W{T&gTc!&tcsg{;P;PZaimJblRhc=WWecfNX*;fDkY9KC z{`T(EH*^NFa%pP1jmqm@K7W3DL-*|-{yCSh_x|(6=X4ek1X}9XzP8`n-1do0@D1`g z<%ZCHIZ)r4|GP9uR{b|}YqZ>z+Z z2nV~+0#zmWD-~icQSUbv#(^3fM8XN>oB!hCxD1OFr!8!y`0` zdg`Ma-NJk#a7i)6;jS))ee{&1@Np@%q-1fhW;D@0t0Fqn#mm+=#ic3$iHrzvjBq^d zhGxq}#^%Of042FH0;g8-VW@pmA~|VA0z5ivz%E z(X&4Z3<)OU=m6Q+SAxPYx9_X?_cJK}E1T^|jYoJMxCX0llTk@o_SO%t3kD6i|GDl04ZQRXaKm9001Q@HU$-ei9zl*yd%ND zYtXrWC1d_88dACuv1|;?HHRRV42a79Z_7CY#zN=?HwEmgg(?i(?f(H9{y)njfSYYG z2mW3x`vPSD5v&C6J_#ENFP3}ojKTbveRJUIAgG0gg7I)56ay+i|DT%xw*Ur%TQtBm zgZ0B2Ua+<|@M`~A9vj3Qz>zeV+YPoIMt{43J^%9=SWJU6zzN`#ma`1YJkVAcM-EJY zH&6x&fCmXP62QF$I_nVG%_mQ11iB9*M$ctQ7oK|K#{Fj1Ag!yv8NVZZHYd zCy{i1m!TbIEj)bwa_rWF7ZS;!S)$-+I`>A;jE~(Dy*u-k*{Q#v8I<>!lv9spCZ1k1 zP%jbaUmkzgTqE9kPyWc5oP7JXuZ2fnxrlU2cd4T1Pv1;FK)#O55@n=&JHt25QAh%U zxLsuKS-rLJ7U|sOQxp#$Trr-ZsAY0ZCz-0iw_fM8JluXvztbnjGZdnsuUlsYBM*@a zRI*yQaD|GWJtG+$YHK@dmVSD|W3%;hd%AA?%L%SXJEMNH)HPXIHk#eb0FGsV>v{yY3rH>!xR& z_at&o`x`Rh;Z+TTvLgKWfTz9RcJ*;LFmTJwDP9ea0dVRGP7@BEdAi+IBZAOd^A)qPU)sVx)*b@|J- z;pM~>fBl{Orv7ZRw)rjj!nxV_VNN}U9*egj;`|AY;^v@RAt54 z58{?5T%17rP z`I)p|{gJSAP5QN+e`n+xaGZ61>>Fb)jXx6MF|6CSzDwo9@|W$`r)Om#2BSqW|K6b6 zc#T&L&2P}ZAQ#`xwNCYZSBoV|UdxKSS=4&@#>#v7>#5eMhboz&SHU3kK0@?JJ)f?< zd;WJC;jZl4=G*>B`9p+ofz#dHL*)^>&CE;dMhso>aY!rMxzl!MoYAkHI)9697!=DH zVj&_1)O#zsxA*iddwcz{ncWZ0SJr|^!UFy5n7q*ei;1rHbgUhZP$ju|@ONogY z3Q1p4DUymsijy_D22n$~g2-;I>FFvjFBW&wTZ%{9lZBkPpr%?Wu6m%3R!=X^OX5?q z>y3jsC4kJk2xsOsNDA7iHJKU~-qdBPuT*KN%-lvSzkv}{o}8PalGKn`;(T(Jz64W( zq!nc(#uIa5%g~iMY2||S7_=g-7>i;XRBfadr8G0M1cU=-7L{{wgpwwCmWd&Z$xA1p zD$)x}^XS@Ie7n3XS)P_QX4K@-qGiT}wp4`FWx|#fWC~>I*wXI8((`jOs-dhNX5;DX zl#yO61u4iW&CV??E3ZIHRl^8ckeyMi)Ub=tky&Y3xkZTyAPtV;-8r>7e5>0(OiNST?~0`f4TPvLSIi4CUgLQQTip|eWP zVWV{oz18)(4gGmZbbNkVy0~_IybRL?GW4(+>fBUr6D_BrPKeiUXi1GFq9XoXg@KM~ z$S!Vakam?-GC4(c)tnWSl$FqS-Qs{U-H(SRuWGL2FSpLqP7LGdj3{t9lvvxGsKi_ukaD_PIXg% z#Z*NFYG@QM7++M}!)|Wzg~YedzJ5YCzP*2QV@AQ{i_8<`HdDiyQfB4)Dh_-72}|-q zO^~!bZN1k!v(Z{i()OgT-@!N2l~I~@`{$GG*-Q&vnRU}1SLq=_}b=enMl#N z(v2mKOQc*f@djXYm2PzN*Lzh|p}9L7pPfTnZ!1m4>awfTN_p8+xqL=yg}#bz5a6^K z_#tV}+A^1%m%pv&m6lSH<7z^w)QURf$gkGHk%1>|oD)uX_(vS~wK?YJL$-1_ap(KsU0h;Rm|xWC)ZpXJ&hGZUzE-vo2r+#xkWPJ!Z z@XJp>{b=*kf#ZNv?695d!JiyF4q5@evk?CXkAPsW!&cU|M~@%1w(@jxvUTx09N_A9 z;P4^4->i-ReC-$F;FJ|)cQn}Ay&%-j%I-g0yngmPVCUo?U}p^ywS8@!?aLfbOyO(m zi%-@kx%};j4bl>J$}>7LHYV6T7;u=`7X%?kY!Cl@(C(z8jqMM={`4!r?gtM3c+B;L zO;C2ZPqowWBd06LB6HZOaBE+i_7YEN{p@sEEJCZ&Wn^U)J00@zJL%=i1&b8j_uPcga7Xf(XZdJCWoV8yyvx9E=17xjQBMfb!68uBUPnI@GbL^)_y&T#hF?+NF4T zAB%`hOJKE?q=3yn<+dtfL_0fs`NukWg&lYF@(oSME^0rSpX;6xjweL~M|vDbe7wC& zV(kxEXQsM(dRC@;d7rAR_3?5Ew6aGc!aN-PtFnUqPx}Q$M2Fkv6nR%>@_m!Sa+&QI=Tw&X0aTi5gIDliMh z=!7W&?V1wn8{OnzS%q#u@=sGMSRtcjh+l*U=44~0XH2R$Ix9BlI%sN>>#CJF))Lw$ovi2<&s>pc=ml)_Wzl$+b>DXEFIZXwad^!~}f>f(s7 zV86uRk3QK=v`VU;=yv#!hb)s6sT#@JB*!F0dFFXmM3no-AIn2RBkcnHTu)frgSuq# z=@f3~@M~SXcX%jZpR+}Ir)Fi@op6k6SJ&kinC_<*6(;lY{L|zj5r@ur3;uOhg72-P z<)mhlQ5DXCwx^P~SzgDT;*Qz<;u>U~XyfB|(8~9uKZg_?XYZ9t?3$Y|_Oo$ZuMBXp zcLa2RKb&;5vfB@vrCYps{}se-lbZfJjJ<`B1)!9FgOJ4no*}NVfI^5sptBC*n0|lx3E((2W2_lN$dg#5oZELhTTAT3Y`V z04D%vKp%WVzbxp7dA0y3Vu7O-sHB0xmRiaC7z-dKAPf`$N$4a6cnjbr7%&U~{UO+b z*m zJy0to@7_Okusk43(Q06u#anGr1+`K3Yf3@Qa6Y(VnAZ-o$)QP{|n%fj=EEhP+RaZV>{8lCYLvoW*jW6^?|*4dBs|a6iHZ1Oc04 z841mWdMz*bfc9D6vHu0coPz@pXoSTSAZ4))BwNFhXuvUj6fOvAff|4ifbY;6_{}mI z{0_|p(}KrK!h*tXO-=jccc2UW1|bKT?Cuj1fzUJaOwfMz!uI2P#@605odfK*1O@pl za8SP=q2Q_aH@dD$-rQK3>-jP_vZGz&o;`1Pe0M_IGs$e(=utdhyMFV=7wx*S@AF%6 zr}^{1;8V`l|V+)$re8dQSvL)#BO(!Rc@wuweq=cMfG1m+BDVy*+Zjh8-Z z=8Ku<$!#6dk7vXSvZ+oGLQEPqY0u2vWDIF&+OGzq=Edvh_ikL=+~x0nS4d1+omu%> z!@JV<^c^1AZZVGExM;d`?u&}|{yIWy?tZcOO)coSeSU`i9WQ>rxoFmGb#zEx$d^QX z!i++CdrH%NXIInDn0>;!h>U0fQZ`d@ zz5hBgMZWRw^W%++t52xiQr1P$>%lv>pKNq@_CDO+A%2+ZH=7pbMPI1%qsm40xjR(A zC;4S=e*VkA^^cS5Dr9PXgeFyP8TtU7?ChSBFk?E?i@YSr2W}(3vv!|#3=ucTn>75M zu;to^uTOU6yw%S|*_<=frH+>yg4gsfH*YdNZHad9pmf%&1w_?P0H+?@OZ@J6{j&!w zJPFTxyV&-}5VJ$MyGCO^$BXZ--+sz{Khi7eyZp+qxvZfLLF`uJ($()a1dXC(b+>6gsQn%f0T-^uOV`hBBwa(SG1bCauiE9>66%4@$cIzlm?ef4FCjPF-)cBjdM z-^rYn)d$}cc*)Q!LI-`>pfD{;@qfC(}@Oii3^Xj60L3>}L zob6m%=@6>N_$}WJd$(?LE>66r_uqeiU3snY(a!os#iVJxh0yr=W_>+@M!_Rb_jV^( zr2f^p*}VLnS_JonrcyDl5GT$pNThSsl9zJwmH8G5U;O>?+&Y)}u351@ft;_v?Y-<7 z*9hAXar5MvZw&41)kkLTo>b3&cwh0MhyRMSI!k`?ZTOn}y=r}_Ps7{l*Y_%WX4qSo zUg8vDNk?y6#~zDtclrq*SrC3DcW)B=yYwcB;nN-3cVXLt;9Bzq!kwPSd|gZb2LLW^ zb+2E2H@mGM&`1ccRWXQPo@A(=zkj2Cg-9L0` z>~{@**YIHZoZ!hY`F`7*$Nf*=8$YnFeY}4Ali==K{mbhuRQcT=&Wl0ghi@0oj3bFO zUPMAtHMy;nt=Sms9>8E(bRx4*pHYVrb((eEgxvHj4HK;|?^{*TK>-~OuY{h@A%R%v zvV!Wy^a@%vN=6b0Bx7}~I%KN5f=o0v)r%8rj0Jd10XN&Yx9z?Uo4 z=%w;jTwX&GPnnumjO%E^qMJ(?t^C%Ccuq4tx3W&nmz%3)Oc6SbhY?ax<5~H297L7Q zH`Eam)pcz}@r2|;W{1frC@bsziY`N_Y53wkab|aXyOf>PBPo-l8%X(GqGAH8U}1i` z(u~JaDtinC*+^}H8e6DiKug|Ei=}$MCRDvAD%tk6(WgRMBIboohghQCw#s>XxUpGO}FVOMxFq~p7kx@n8 zxu~5m8*yy4o?MY#(pXT(>6T&zN+C+eE2^I;!wL1pL|LPtK+-w4#K_8})fBfe^Cipq zg>p%IZ)svab*ze4tgf%d%W6{v4O$V4ghpd3s%o2%!qpbdIF52zfW9|5W$Yuj(}-PN z3+tvPWK7m|ma??5OkUuR6|>G?p3=U=y}fbao_}+`r`H=p>c3= zZK1sE4no0yB68`C_xKz4wv_6HO5%E1hKhkruR<@~S?ek)c-q}@ZH;)n8oxQtli*2I zq_n(#^hUW%sP81!F4ps^jK=y6D*Af9RM2?q4O?5)Q@L?=xee*>H?%e~+L)6)d-&$2 z{3bdMM^DL`m3K5&i^{I&*BQ%&90I9?G(VVszoLp=ro)X@PBP4e4E?}6GD$Up=ctzl zO+uE0%Tt>>ma000sPdM+)*2I%Yb@uNbT{!3K^j#*JMp>x44;)rDMn?QQYcDBqe5+7 zZ9!|6ZeX`BG)#|;=XI9S@ruSl6oyG9;*Bz(68wEnIz$AX3b%`F&GKl7N{;ciad&ld`pxP1aa#wcV@@6p zHXbg%{(xFK-0w6eBR zwzc*R_IGx60$ks2{)eq>tbemR>~-W&z;Tz5BZmWy9e0m(v2t|x`tcWUw*v={IfR^w zu(Ngvb3g4(3Gid*g!v_hd3f8p|9JR_gOkf|CvqYK?EM0dIUaHdv~om_9X$*xSKB-P zc<{Khi}%432R%>PI$FmZ^7Zp@3%0X8?iQC@-$V9v6lcb!uU%QZG&;srrTW(#P75wB zs!fe*>XR^@QohU@O3>Nm3AHg4m!sAPJpFBKj-QBivbPUEeloJS&e!I2ipOzpzx>jQ z=16=k3etVfP|QU?9^Br zZ*Tik`K~_UN$$bno++M4HIbBb$~(&6qaehq6zA?1ACnU2a>OnYn_1{v65tmY=X)a8 zKOrX6-#@_1H!vgw@olQE8OpAjLPan15BF$tigI#gZ3~O$^qj%wQA*a}fSx>%Q{|O3 zFeuZ1r+<6*_>);*O%vjXpPmpJ8Eg)l^kQ#kfQTF4+}lEsKWG%>Wqo~d$p_WtKW_Jp z>=BzG9Hp&7w;H0TWpaV|!FHo0d5RkBp2FDA3R=omtl5kuQiErr#TMl;9@&F-y8?>DYnASlv z)BtOgu`QzedLXC<8PY%}v|G!=E zOb48gK%Ox`M@EM{V{k6GLV$4LxdS|10gn=f2*AnVhh+xv9Zm^RHmH0Bkuz+kVgFYX z;1;vkX=#Oq?32=iM+2j~|Jgzc&;%bRSTB6)km=2Wr6<41Wxa`pZC zt1apI7q4~P3$wRx{PFdSiaf8Pd|zI-4mg?VJ z_(1Br`tinN9%pu7dT#c~)sc(%H!>4r?&Glf+3oRj;(0CU&Z3ZXf5ga}UTEia2)gg+ zMjo^2oib#IcHzRr@*aOiwblFfcLrtais*yv{H<-`)t&S2KJ@l-mfpSC)iu9fd5h3F z5=DOtpMM6C3}|V$IYi{5{9(r>wrqw!!C>+C_T~+&Hy=oh8RPocE8XMacMI~#^J@9^ zGhZHExP~xK1>T)^uWnF9qMdKu-CM-x=f9dS;g=rYSflDL-Tpju;r{0}N>^t)amw6vVQ#p6 zN4U*hdVYO*QZ~A4)+j%oQ}g!3=bp9hyy&0`hjzEm5yWCcJ54$E@e!%*39%9+CSao=$|k@th~5$Wu%R&o9phq__7Z_xWjm}^N^uhy{?hV$-3>1f%_uT z(i1at=+W1!?=O?5Wr~*)=Jc5dihIUwgwbcf|H13seR{u**a~WtwQ*@@AJN*kO>%{P zvx|F8u{rnX`-dSR;q2Xs(VK&3FMKw(tv(d?Umz@gzIOXw^SxW|-fisk$$tMs%h>sS ziQf5MzAM6HQL7w!NR2t`IFfvE4$0%cV}-+-eBHr{yw!h!`(rCzjB9F zL&h`K#wf_rjZd#tY(Wop*!baEPY3V(AB<`8QyuFSe!W-rd)MZYa&l~GWs&=!uT8ze ze)Nbcm7l$PZpF+p>gT2jls9Wr=a6>eTs_jOmL~*5Ux|avFPm?r zvhB;4*XK94RP!^+uR6~3&b;*cyMecz>vSnnho5-=<*j_z1pbqGD&jE6w`1*1K@$HAOde^|6jPG(EMvFmzQnvar!g)V$;p zKJ~VIe%Q5l9w9ZO3KShgK@~e`aDF&byI@{7l$ko(>Tpt4yJ=-fQk7?H%si`6wbjj) zFm&rhUD)PSbZi*Ng^d#9i-;NI#wx9#Et%dj%9m$kwh)`}Xd%0X9jmWw%AlHw4JHX$ zkWOq!YonmzMb#N`b&Sfq+FYC}yH=i_TAqhgoNhv@DoI&IX_#`6GB&D#n4-z13z%sd z3D4M8M=T`iRJ8mYaZ_`2L~urSZCO&TFfO+=>$EI0Duxm#t>9#!nvyCaq7sEdMpas; zIW>n-yxqG(`(bSvZGR{+JxG?=Adc@9U^W1sCkYv32tv~!fGd>UnvsnHG! zQ3RT}eqwaw_FAu^D^Fb@9n~-}88srLtfT{z9z)2)%c>27(wsbevxb*aSc=D?#gFIgD0sdPs#7jGKm)QwASkB*rbrio#}YTXQDiL#(8mM0DtXM75)m#!_7IOx8<=fJEO)*od>ywt52n|h|qMm2Ud!6T%T2QS_{^aU%r5ep0lMd!*r4~NIVR&tfsY+5+7gt*&K^Gw+ zc3x&VlQ>Z+m$0m@h&_a5}8CKC3w1U;~kjjB$ONB7uPgNI5X7iu;;;_ z935SM_I7iKaBy~UO$a}2T|qzx`26$}C*IM|>9q44WWP5>02@Io98*xA_HJKG*T>|*cj`SXuQj{M|v*umM|D#*t( zB+}K_=~R%vhqaA|qwlXj{`IhxgZ;0^gAdtQA3ET3^ygnr{NU{zV13N<@bMpiKI9+d zdE!uL#1U(EhrrO3kS5oZhNu*f^qU=?Tpk%>b=3aAA#eX*98Ou=9EfxJ<^TPwt)1fu z`@bTGe)y}6-2tn={rn#;K8{YAX=%x}ZpX5tGedj=bCWA0;!iuB_>H1CaT-_i=;CD$ z-;BW6-oOJ#olanr3gdHQd=j!N^CuP;?_TPVa=fek3b1kR$9}ax9c1qif9%NL9j)#C zeQN6)T^u~4lf4g}bPM%!k&do3dU=GpaE937r=5->HVy|)*x5Qnc;= zSlOO%a(8nN&h+@r*01RG`gJ@OiFdNHa)=>^MyC1sMUvv|VoUQ=iccT)_jV7nI_#2= z<5}$)iJWk8w285CN7YmYyLftL6%=w^Q!`!NgM3_EBXi5H>Px&UroXQ+Xiw~`IPOtR!Z%RQ2CdZ_N z1L*A*ek!2cGa@L_uZ|oTQSEo?xO-AUl)+fsgA^84Pc96m<+f#)_*Er2RW*bM6cpzg z*0jRKiHj9_4Jxm=DZ<;$t-`I4X~yq^#ax@Ss|dwk7_w2$dk!A&a*y`p$0Z+52RsXUD$ z%QmNPQc+nM;GX5<8S9pK$}b7=4hr-M%&>K}Nr)0v;x9gZa%Yk3eKIA)HO%UWf4ciY zpVas^{pC(WCaEr1i7V2r`j!7&I z%tM961ZReOo-Ryr@sZZ21ll`?xre2;vdjH_J=~9-$T;qTaz5taV(l65&k%ROcN2)* z23Hc++Ja{G0UrcB5ZgfXW2sF9F{K3nLof&d%b)d^AT$D^Fzy(s>832?P{~*l4{s~O6 z4}ri;mR_iL{~nqOg)L>e;6xON<8iP`w#7gTaI*{ou58c(J=Soc(C_#U7zRL)2Ozow zT~LojJ)8lq6N+1|5ZziTTZ7bZ0NpI;7c3Bl8H2R~UpQd;g5v=<87%A!)X*)YViwc} z{mme;*Z=mH*nslJ+Z=l1nX3GlUA}sQM4xwTpGdT2! z!>oDBjscG~4SdxfkVLyE*qY$fQ_opgAC0DSJ*+u90Hge^jlgiTL{%d#UP3S$OEgOIRK)=V+9}pI%x1G1a-m<`x}@a z{(`^<{E_Z=fXn`G6cVgk0QQ569QJ~$-KhH@d-j#Y7WLe}Nb2eCnwH8RT$r0TPrQG@ zQ&G8`CvS&e^)c|oE;8BtV7ODYK4g}PA8xk|_Q|_H+&ItZ`EctyjeC3SLGSLZS=#%B z4^rJD!iPSZ=H4v|@02!pQ6m)9v>+zY5Mi>+4q&u7B?^66G&g!Vf#` zA8wA^J~Pm!mEU|x6&iQ@T32pw4K=^GdxkH#Lmy+&DIX=hpU=qOa{CMy-e`^QH`g{t zA1vNszogCSx?gw5uOqLu8g{Sjk&fRh7=317J^S5oMSQ>a&AXLHS39QP-fE_D&4Rr5l75y z@B8xmrQH$fj_M1G$~pguqW+3+9T?x5dVF@B_RzfiMy~3iJm@DpQ1!Im{fy8aZVf&b zKGj~5Ey%_%zN5^1-}}Po(R{uBmOy=KG%bC&-z#IU>X>&G-^_bkEJok9x@F_y_ZxS& z&Rl#WGE5`$$h#rR+sWtLmNQr6b41f952QQ4p?9s_eXwp~j<$9%KlEN1AgvAEenz7U zg~YC@+breTNr~_+@(FqJt$F&MXyql>Ko!1~OSK;id}MHz(|dmG5@oCZ#*^!dd%dL1 zI}7by$nT=p(yQ|;L{;<0Zo#Cf@9tOf_pZ*5PhQ+d)0Z7e~4t57Q7L>x&4@ zB)7hvoyPZR#&*xoOut@{-h13e?*r5Y-JBNmz&H)Z{3zR=B3~pwx!cb(spVt37D8|L z(AnwU-<6`>zFQLExoh8sc%0TXz8e1yJob&%iGzK?FsFxNzW%4y#Se3m1pSq?I=(3lb@5=xS=a8I`V3s~IeW*j&NVvlKDa ztm-OMqQ+R27niO`Nz?Ii^n8qrQInsU%`_xsqj}gmPKyLzyS+JvF!nHpiu~-!GW?7N zJDrCv(@)pcw2QTxdI?ck(HdKuSF9<_pdd;VDziSPwIl_VffX0!_qL{?V>u1o?Lxf< zO$SIUy{@QMM=_si8RpQ~$tCF-NtE`qdIk1P%~D2gL2gA3W1wSHFgrR@TP>}uTe^~6 zS>Ity6?Do<8|$ht<=HC=w&0?+tRT89nbWDNOTk~gIFWXqfaBDR<5NpTO-NI`uoB;e z2>ROUl9KXMt2u*R3LZL7g?W@1nnqJ)VD&LoY8Ic|qim~~l6Gv>);6KE^=VzzO~pcO zcoJ|sHj{2QvO(o{oZJW`RaX$H+_0EVkRK9$cO zl_}WZD50Q|o6JMT2-(B8dcKYh*dt+U{O?dMccYem#62L#|Bj+q;l=3 zvZ*0!wtBjzr=v5UL|$apkjb*yOV#(;>??Eg6Np+~*;6Dgt7(&%i@8GP)B;APrIn1$ zNbtOCu&p)r%%yGq_x?yv3l^D5PROn}L}$_D&7&EbMUz zL|UUnte`PS?MCeFGtHDs>Q0=Fo?pPhuGS#6>vD=3QAqTnSt?)G)?ZLqhmc!o4_K33 zv`QIaa$=zZRo*M7i%V&nmAg$9lO`gqPD&e;%h)~T+LnGot*-I8K((mHC|c>%4yBQa z7ESYuO6#d3ICRrgJ-VC4&#R)UEAb*0Z*x&(nw8blN(O}z9MZxw649dbn@m*ktgL-$ zuDhza#X#xMWFfjlA)1oT7G_}P$)t{o>6;ffl*B<z<#r3F1mDysn=*?FHi|dIcL>L2JV1QmE7x5pAiuTu<#r*R*%8 z$&hlKpt?S5qC3Bkg)@oHH)RT6{+(A;Y8>q;1 z$UbG;Od_VHXSh3+;==N8x#u^!RHLON0yaJ@)Xve_?&x7pCtF8XrwCeQsFj1WU+|%W z)(3oT>|7jd%Yx#5wFx_%;{5B0umC5gs8B%MZf$?i?bPw$d{jm~f^!40;Epb3*(W>@ zKP&44KUp7f{rAIv|K&%Izy0v{UtJD3|KeipZ08mdbmUM_Sb&GO`>9aJQ$ZfyKOF@~ z6!2#S*d6)hpvS?3fxd?V1AGz#9Br+R0>o(J9^~u{sKuQE`uhykwB0hikDU#`d@1Px zX~%4>tBI#h#AKD1oeT|(ijO|zY;)`sK;4M#4}bs54}Z7$@vlGp#r~9?e?#U$n;+f0 zlA@#H8Gr7J>6C0wpo&Zlu&cX=BR^}qu(Ll)SNHX=3|Gg!FtpCd)BpcdR9bW zd2&+kq*t(0xZgp~;DFF$R@Qd5r=}DvwniN7bja?PlYueLHqqxc8?C1cQdzOMVo(*> z9Je|t}i_$|;LGiK9PHtW?X_3*#PkUNSV#d9<0MPA|(|m zwSlo9;WxF=KQ1?AYO)wp8SaI}mlu?dQqXa_xcKOZkn$W8zp&k`YrR8$wyWc8-KlG+ zslp4i%_^0$S*FtPc1P#7&)mE4m{U_-S;S;W=|b*sC;jt-LH=_=MQBPuq*r#VKDR!n zyPnf0)EW9}34yT{xFP?*NF=m8e=d_>PodB{5?(JsXInEyzW zKPFo7;Q2*NdSzqSFTWfLjwK}>xAJzv)&qW?)V=b;&zH!RQ77zc;*I=-ld&XYSE@|O z^~}sWUge&a6X=)h?;IEkVha+&Qc&KNCq0whV^6#0Ct<6yeS-tNeU7Imopg%yjm_1g zywXx!;`|%}kNLY=sJtM20ggO?AT8(tfM$RxpbysqOW*~BPGdnTED_{O1Dpe~2EZQs zPQw2O0uc)^f|ZB%J)iLIA3&Hb1jYcELXRmV?E>l{@CMj~3Synvz&}j@4gc~dZh>&h zA_Km|;Bo+Ypbg*;XaF^hpm~ri8%zy=6Hp2b0h(bVH5r7g!)7=I4HlZV0A~_r-&YK+ z1;x5RKVSogOjQ6D{u3Ar)Ic&V3p@t#>%e3Z<}VQ3!I>;j4H&S`dLH9kF*7CNX zD}XBh4SvIbS)n-qkXbMr#Dl>9{TJ8=#Vy7_3<>U_0=OD@h5!?GL8E2e@DrK>yv`8u z0Xdq5qkDfmkOh-LmTY)vLEi`R7WOb`DlF*?W`T3TFaQex2YNxEINTxF4z1fKAh*cD zV*ps4>;Hn2!~Axb4-HL&^56#g?!gso34rjR4c5m7TLrg^2k6K+07LJa4z&U3363kk z3#Ll%YaulP!nb`@aJ*$XP|_m2zqvsAZ%{Sd8=wms2)iMy-M`yUV}~oUtN?5Pc!5vL zGT{x>3o&6Wfl7M3y7y{5ZoCtt!n7VBtzk{t%^3M$G-v?It%+8gWiEVxJ^{Z2ZpN$iD z{#bmxv9YzG8~Q`F#;3P2^pBP7GcVqsTYB8Kv<>Q1UAh1H@m!Bw_n0a9@}Z4BZ&1qz zFaIIs^LAe8nx&tfn;+hP@LBlf#g{AH;-#-Ml-73X#~Z}&1GhE({e$ywA1FxEuiy60 z$X1tWPmxtJmqaHTKFoZ5`s9&-Inj*&#QFME&;>}V&(FV93Z*R00&#Hh3!Xg8{JeVI zyfZLu{A8TJA$cNx|Arymez$z#?z2J0v-aJY9tH@t)7@848LFA-_Nixb+SligClR!PiOkLHU4G9F@6pRqw2pp#^r4FQ`r8Ig ze)Xo2ILsctyFq`||3~*#+SdHAZ0Gi>(_cO^0-vi5;$+Y(oA@;O=aGjV==zS-p!8RUY+?iv%E1s%l|m>t@qLMUEbIJ znfc%G%^$9j`xpX&{4VpsfOJeC?znrKcdtz&8Q+$CTzkB}{Kd%XV-MVW^=eoukV#pc zSEaHu8(W|_gJ?lQ-&p=EyU{$)M_%@A(5~w6G}AR%i)nUwd->h;)-^hEwr@wvS-tm- zq3Gw2F0`sP7~jUvOphSit3xd;)0m3b+4{2g*+=tZTDxxfWmm_yTYsp{FL}y4_vge< z=RmL~cUV32Vteh(t)YuIm%GQNxp&8|&6xGAe9Fq;=dZ$9^X$$=)8czFBGx>muU{YU zQi{&5-=p(8m+xKR6WjZEU4|horBm6ZWeC7;PkJl=vA-r?8zH5)9bJ0 zgF1zbO~saFP4v}~>aG&yG^UixZ$>CQw3tVf(O9?iIIezLPVO3MUYvWp)7C(!)b@=S zCf;1T&u=wrM;~_~caYh3ef!HnW9y!ga%S(wRr+8*V}5a)CVue!+4(!$LWyYg0mq2p z>IYPci=-+1g|@f%HTQ{~E6Zf|>Z1|k)~<1#wDax8;A7f{Aq9DBwEgbLd)fv5r*RJP z{iUuZlj4za@Y;yz`oz=09$wF-$^M&zV$<-(aPy+><%4ac_tuRU%i3iY{w{Ou4>e6xv)bLVc8_B5M+bn3@UMDCq;i;v&z@f2dp=pVZh5t(9S z@HHQojmR`x&f~U9TgA$Ts*WxOv9ne=xX?Ptq4D_WrdfGwF$$egYpy6z&Y$m74S}#< z5Y8=cb|^@a7PE3`Ba|wH!omsC z0KU(p%p0ZZXRbxXOU2oY+@h3RWuc@j2b+gh_cj-{RF&jWIH(R|l{1&L1`}s%(#+0Km=}Z)? z!C*#V+gsO7B{>)-n$Hqb>RZ%;^4WaxjH-pUqvk+!$9k~%-zuWIWkC6JfSOM4KpOogfKDs3rVR4;YorqUYZ{7j6_B&g>N zVpLVCbG@oZ#4GCRA{~P;$_7QmD;Gv9;W!6Z zW6rCpr|SA!7;`28r;$tCE^O1Ym6{$@EepdpP0QMFvuA30jm_=trXG~8p<@bH%j`g* z`e%8=qni4P(oFJ|AxcA54kj}XJ;T5w1XQL(-GF@$wX#MQ?O0Tfu#!zdY=;%~OkiN_J$kF7Kz~f;d{#Lfu$G-ph=i}A~ zj~)t-ilNfUm5xDyApwp@T>Tsmxw;((d6lUyF(H1T-X1AA&b9&J?jSPT$?7LB#K+d= z`|tmD@T863F&meke?0Q{Z(I&~c^|epa`=d|L(uVKAe7qah`o2@;e#M+_R$l^Pad^D z;&xY`^$>24QfW#e7MVDUiNME|1X9D7%%qs76A zr=1;x8jFwBMZ}aP_{7+su84|AboD=GWra8%wsZgShXdby`}b2ePHsQ`Y<=Q~6W&3A zq0uLu+-%b-2ikH&-P|xaIINGW!_OyvJ#g~4tyObsY!l~XfTwftkM4`T#7_D1hAi7- z-hK(rX~jr=NTRb_M7CpvxATeUyvcrDcKJ|*wVmCM4mL-uoULPv2UQdULL=sS#UJ_c zI|szkCNi?huQb-h`R5;hwDCUlYg(wIRb=$3I;`KJW9Y=X>f%~@1wJ`FH7VJp&@(xx zI0ZoCxWKfX6A@mSnZ7xW_NBE+sqv}d z8CjlQ_AUYTE@&Bw$w|oTTS`6mHC;(35DTykdCkL&{yw^l)%m%Piwdm^ix!cZZY=)( zY=NOB3Y#0~G^8jyFu%B@P+x@PVHUefBO6>j)w?|@NM2HIP<^dW2CqD@l9rtw6jSJt zQ#jJ29bxFXj9?#-+$+XF7ZxPoj=SWXvdPX(Km|myJmSK#kkZ=cst%GUGb4#NQiTck>lZc&s5Zrnq^8MyDkZ%kurynvjh8?8K6qRQn9i`ZQO&fOhBOr4_*?DG?cVc1L{7 zjm6=%)=o!{hm~a(0E^;2yZ}(^C;$`?E?N)^xC8b<2r-}m+F~lSU>AT#Akd&%upGQ2 zH4=g8ln9U*bj-Dsd$Irz2$os z1pgHXfqX$(Cx{a3fw34!$NpnI90EZYso`g+D7drCb04FD=xxg|IMl+6g#87o@t1o0 zv=-D1`XQfv*al7|Kp|&TqQh$Uew862Bf zY~i5cFH1b70fcbxi-6OBzVDFIvOd&(m~UB9*a}9GEmNcb7XX;b3@oVtc-lkJ@B<9s zz%&f-Ic$Ky{s3TO5pJ;^TN(i$s0(NZ7dTI7+WrQ#fSdhs``ZsZgP~wTz_T6-0FMxU zgDnPD>n~!cC{XS@C<3zEX98Un;06Xe28;*mhWiI_N5X$5m8jXT zs2s*is(kJPfpUdOUNk*0zj=ojP@mmptk0XDtd3nL-zGoV>ea2Vc6WJ%-kUF{Zf&hm zC4a8p8dWLwCTDKlCEnwI7~u&RZRE)zZQIw2#J-!|k2>erXZo2eeb4)wy#DTmXU%5P z=GlIxYW?Hp@7!h%LLt$3y7q3O6fb1c9^M*$Fv=CSz8JgsR5|_I;&X$3!mz5^c%gVi zCN%RtD~V?o5!S;mpILkFy2oEIUlFCOYb$twznA0}md+!8EIw{#v?w}OhsU02N8a(y z4$cu2S0p2{TjR9$vCm@JMPzg5C6~~AZo2J#^V-{m$u|gvPgCymx zNi({R$oa$z%w^+?fdz_geNj$eOg#Oa^8CE$QS*y7MNj7>MXw|8v2>R=`eqcw4;>xk z?wKoH6!N;}Vh8^Vk4AoXS=(inKUA0rFFqP|PrDzSf8IYL7IiA{G}V&$!I^dyjYWIH zG+tl5fOJs%2ir#PXiVF}Rs14yNw-O$AUlJTV!q(~xdl{MAD$ znevuLe)f{dZ2$63d+zGvhidtKJc&l>zPzzKiEr=cyl!Rbx#QjKT_)Dlg# zU+91R^3%m}HFdOqnepVdazII?0c*a9EoJQK=zJq^RTyxs?2RF7#L zgezaE65a02&Og=(Y|cGILFC`+Q15ILc)Z)vC&Ra<*qW>Fx>z5U_SiR+Yr5O=)|XEO zGPY!|Q~dZM_3r8rGDBj|e!&k7_un{29{AXC;p)e?9cs}imZW%bd8YlrkrKxBP(N9uDo09e)p9xHxm(xR5$(n!QkRpn+oA> z8vBgm->2WICN^k)&Pw0VBwCWW`TnGFs_P+F%bU=2lV7hr`7|LE@~^iDNauH6aCh5O z_ePbMx8D$Z_CCH+bA>#O^!*I|Y^QjDsp=*6eH@)4?oLniJ|ml-@rI^Y4BEq8;{^s! z^=JG0_u8#?q>;o_HjPm!*s7Vlf~-MQ5%*$Nj=3;{gPkS~Ow>0tURtU(^b%Wm1YK5Z zRtKNdsLWA|GGdEK9E^}okIU?!NNTe(x#bwXAWE2Es7y_aN9DBAiYo@>nN9izRRtlP zfKG@ks5W(#G3es%dVHpYj*Ty5w6INiWxzBL7oUJiPY;bd6%~^v!xs~Z6H`hxSawT( zla#G1ENiTmlyN%p)rs*%+495?bV+CmU#w0MD{85o8C_Ai8MNBa)0s44o`A)QH_Md8 zNd=Y64xwPUmN8u>p$Ic-x*EG0M}>Ka;#MP}IaxHmQkz)Br!*{9*GsCa)JS}447DKx zDU4^dixTtE5!L1rwJJ0}JTHk-ifd9_ZLN+!&BqUy;c9psvpGRTDL_;W>ug!IlEf*d zR+>LwztGJ>H=$%`=4nKil%iH*)!gPBBB7R)#crT+xEDIx)fiL(LMv(^C6!|eny(C~ z$%^apWqu;5sG!UW~1j zl9W{|6qLDKT2qk9;$#llT0YI|m;GbwFj zXKV66dbQe>zB+zWnXsUmmQA@NQDk+>1mvL{q^*d6FUZX4F;Y4UiYt4ndwZ${)kr}w zuB3i0w&rw9ww;$%iq&yH)iLW5SL;w$nqN$LV|qioA_k?12=aFcJrQv%%r`29;Fp+r z^k*w)cSlzTmtT*cb_=sTal+He#`felc0U5c^NAx?r})*Ud{V=$Tr!+I?3@nT+x-kY zzk`c?BTk3KdwCx9az1&$+9M<+(Zkynaj`$}_n*H1`N!}7<3GMR;Nfue#G#*lI_hEX z?rZJf;pu(I>9{#7|e2EDK&d0uU!X*TG9QDY` zvCCr9Zdc+11H(Mp()^mTll<*HyjnY662# zSRXDNjS5b73HA@Sce1y#J$%q1;?!ZEu)u)O@Dgf}?weit4B7esklBRIX}g- zJtZl@**hyUOWH(|GWB&{&PUz6JW_MwIN8OhoVecNp!n$0T3k^nnc3aem2v-Jcu9JE zii}SXFhF&Mma+<-fRb9>I6-Wzs`bflC$xh95@L%9zQuLu>e6r~jzBOPDiVvM(i4%u z2p+C+dUCn8#J9*L{d9V0NmWi}8Wl$&?yzRLpI$!GU%2p|E9hzI8Z`6Rf-^%sJu=p_ z7XnUw1yX-wuzj5Nh)rZ%Tk9S~#l)i+iOqGuQbT({XEkW>zD{1{*&*AclisH=NGb}+ z3kV4GbkYh5No8TFmAQpAw5p=5#%oTo0a5Pg)WGotYFlzbU2Z~dW)?0lDD`ZFqfee~ zczRHHWo&qsTSNw_E<6a;Co~N86jf!G$Jqz67Et~HZj~q9(|e~BJ%Q1ACFsKB3`$UK zMN}N2JRzyNB?WK<1Q-BzSilHC6_#FzIUuTO0*RzxC16V!HL$4eyBYrj=q3T^{GTEE0CzBW z6&RZVIDrTnx;7I*VP$}IVHK@?A9KLh5_$|VEkrStMhA%ZA!-5`73A)KSP7~Hi$DVk zOI$60LNJ#Z&=KGz*a$u_lpBD%roUPAwy0~73V|*FbO5XY%=WJqDS$JWg#{lr;mFv3 z{R_qc1)xnI@B+@x;1B^6XWpO2e*;M_?a^@DCQl{&$OLh_v7spaxhgz?6jh zuV5V1cE1o8=pi@!Z^+kTM}^}p1L5MrMWVpOZ*cKp`Y{NA$xZ*u!f~HHU=2mUy5TUl z+rL8f;Do?sUn&^)&ld5J9lQZ4+JLniP9EF?1P?6LfEcDT`+tC1U=_$P(YoceTGkZW z&7tmq6!-~%FHF(~quBSkStx-_pcpupfUw$f90AP6JP@wU+y~YWbz9=pDGmP#giL=6 zB?4{0xyZg2@EJ@4$^)+o2hK)-FF0rdk04nZ?(a}l@M@t%%iJItxPcd-F32|zps{5d zup6AP03E*rT~G#G9LpC60`9>x+$>;&QX131a6k=Ivq*-mVB=Vf=`hj(PGmnmA9Ta{ zTiyp?26#YOU@&~`a036oWGD!#1inB3%trU$ExQv){mZ_+!y(;&DCv`N+q=25AFl3w z;(c1WPhLC!b(TPX%NZHmy#Mrtz|_T>MUV$(=2wuU{am^m^e72KBl|rPjYTZm@)`4)uUR*CBazO=FO~mg+CI{&~A~onx9e zZ9Ld$Cm?3>XZhx+VeP*D{O!KSi17L)D(lZSHSIACzp)E~|32RRs@1>V9zRRv$QbHP ziI&K|wmQ@Q=dH7s@6C>Mu9=BvdR{-9=`jv2-@d%|jKw7hU!T3-wYEJq&k)I|f2?=V zg=QlEH-vCe`-arc9HiasWprx>`xitrOv;V`F$_%42t@-sSFbTN>NUf;uHWANc|j+p zy??qv+yhl~#DBCiFT8C%!`!{Nq!P>!S5|izlh=1SmmZLQ>opE4FTQ*-xIv!3!Pq8u zskH-J>Qw`N^Fp&|aITf{=93Q8(c1d7wke$x?A^U`3HeH*n3p=<_05=epFFtzgwOkg zNbWsSm{-3txMl^btHVIJ%QCzqzK}_8-FY*y`Qn30)!QSvHn6T974|F&Um^5S!n$a8 zYjSE}?TVmhhfjXU9R0v-zy5-_%@ymW9<7r*h1YMq?tL%` zY>cmNy)jAucuu7#`rF5+)T}u|vm9CO>3c5g-c?*BJk{xxqJe?m2erJmE%92<^3y+w zg7<%FNdq*kj7m3>=Z6@hf2<9>XUu*Qb@wZkLl4fp?p3xAv)`&_=ifh-4*a$@Cw+c- zR7hdWh*eVy%{#2e!oBBj-Vc3QyV1P7(8*GaD_bAY-%B@dv+htj)epFa4+x(__1roOd%ueED09zH@|UNL9{-51_y$=$uf;@jLVg^EHYgYW=OclT3*VCC)3^_myU zFCQXTM=q;JWJ8l0(z)}4_ccPL>eY+ee@wAo2w%MV_+jFya_T0RJ-6D^JF;P7E9l&f z-Lu+uEkbzuYUv@KM)+bju$E>nzm@*h_M-Eq;8w@OiS{n3R*by(oye6ozv%BJo?Y$O zeevj;cu@3uLrHrhG>c@$b*WfVQgQpyEJfWQyE(7hLa28cFW%`GJ*}-Y9`(JZ^U{p+ z-m_Mu@8zQj!o2n@{@j{q?rHP3m@oYU;SDO!DOFPKhxsq(KTW=TL{@*HFh5LOoMDkJ z+#Y>$oi;Jtf~ZPshBjH`>LPqIMmjTP8Y-CNb!IABmN+@ZllfTu*zFsauy}MDK3h6e zQBhk(Y0t}_Br8(z!ie;?7;IcUF}DswQfK7pJD6M=E;75IFk6YrYpbZtFE-%#S-Gj` zTy!ZaH?3KLt1cU^Mw;u!y6VNb2&0UlVO1s}CDHsW;E9K2X4DZ1x>CQ3xv%F#2Dl7=uMhm%V0mldt9XSHH# zurtuBfZ46baji%eABnMT-dT$%Fn%oUjX1k7>y1pvelG z^6F{Xx|D2Y^|JQW)$v)KiV&Mm&M%uOM%K&8G)WX82~{DU=O|c(<*g}cb(Df`7Kzn{ zB-RyZ$DZnz)YWxSLcF3n|MpI4b}3J&XO-kgG8?K8l|k5EiV@_Qv2)cm)eYoQQB7${ zDY1xMFPT_IRh*w!Qu_$<+T3z&KAV7IjcZybQRI<)vXsfz4UyGoYz-DQT+UZ+4;SEM z9BK8kSy*1$U?dU+lA7kSk>Y{Tp-stpixGEbaX_d6#VTfN?&G>wn&$I~#B*%jYXl=g znLAf2Xy(x-T5EHisEv=KR`S&7=Ea7Nye6TztbtIMJJy6EPa+yRsAa9{AJDvALDO3J zA}O|$Z!mAFJGrDPN{hNvTsw%pI56JBml3H=jtg^Y?JDvyHH0fVrTSWKr)W)vt!1~%%i$+`!! zX8OiRIvhhrqD?5d-T1P)T2S$4PMJH1xwdk7kUG;gwpLuIP&W}MtpfsVU4d*tK{s_* zqQ=f?F4a_LOi=N~veBN|(l*I?MoVEI`%-(0N=zt2j6LZ&MHQy{+6=C+sl}w@q3SE1 zs<9PIxi#RxL|RfPXu!z%j9fKI4f0H0CDONYhAxYxnofyS$-7OZn5SBXmXIvc!hkkg zijik6_SeYzc{A0OwHpNpx2db59z&cPx-)QwKQobs9?s31;s{yg#o7*Pt0Jwj9*q=w zr5277k^|jNa})B)no~}nC=86TNoZsS1_twjLt~{+uZ$;$yB)MY=ACpBl*#oh@e5<4 zlMYyW{qU>b4|d0#9FE%AI`|$s3XIv#c2?gXvU9eJ@^DLx@VB!HcJnx9eImrl(dy8_ z0|1;mIHQ82BAv6cg2HXRylvclU2T6wtiH27`_}W|fuB8o z{@xvBZ(|+k6J+fb;_2Xc@ZbU9Q~To&-+X`gfSqfEmsevp8!u^ z5ZHbEz=0#FMe^vZM1Q~IHrB^;V}p~O6Ju>o+2l}TiB`5hIOmEgB2ON+@hT5-_dIBS z1UYu>mxDk2^y^7G|06$rYyG2*ZAp~(v7dhYo2!fKFJ6u=5x!wgC$n+ZY0kldMRADF zx2^#$$D$fTLe37j6?(fkc+H-jZds)!C7uX4W`E?Utq-QB!6xwJaYt04m%HLdUwdX$ zPI*k2N2s@H02hBe`lv5sy=_W2B45NMq^4V0r63VEZ?Ne^O?mD&f3;3E;8CX=tNOa$cf`eJiLzv*x4tf54AkMJU+@V@;Z3P!7IazoYE-+82v#88y8T2*l(dcSa0v;QlTb>r%n4Xg5pIdt> z$vrAD(b>z-+qJ^q!8b2DHM%hZU8tUEdA~&$w28Gw#-ed*`f1;4cQZ-R-!W%qtkUl< zo$05j1QLeo@eW8fDs63U)%j#r;BuA0{s{#*R6vLzrw}AkPmGDHKLsrROk}T~74DaG zIwFKMUKZq*Q(sXMRZyHAQ5@zS8BufG233I`pq`B?E^=14sWZr_sTrB7k<;n1$!@`J z)%DS&eCyoAafU9&uYRK2*1^bcEf&exmpy0Pz)L;Eeiof z!#R?1{|K4^Dd0=B*wula5Qswu@k0E`|y=me!vwR8GtU>2Gs@r|ImnT z@n#3xf?+|~z=V&bgF70`@ZJC{_WNTk!=U>68UcYM+`j-lp@x5P2W;W70ffJx9qu;^ z4hMwaS=I?)WY7iPAjHR(9c5Vpcr@|9AOU#c`wT5aIB;A80~#zF1Pr7!9D&;cfg1z< zu?U7M4FmMCmK_LG`M(?+!1`LY+Dz zVCr|vtK5&;{`yRg?HZ=B)X&s|EI!@*qI>Yc?EEYGtxMvT0rt#OggtrVne6$tg#P*J z#^&hC_HSatD~XwZwdXw*dB4y*Vi@DjF%`)0r>+43<4*UQtZQBH>>71%g!cTUe&Tn{ z*DIWfPj6|Ak&Zse%);Q8hZ@GOpn~*(~4n4XsJZ}>6c6%kG&z=vQ*N(s1dWFcAuU?tmQq7p=1W!7CqY#!J{&B%5 z8@u*-QnB}-`N?&D&r7^i&_Np5nxB8EA2nQi+_}iw?0NjI@BNo?RU4_3NZn z?d1oT^qsr4NsvUfRR=fLQZ;{9yr`_-JEi^96nJ!&f5y(KQZ@ zHZaEeJUgOMy;3eRZ?k812-LN+h&HtQuc!M2j|oexwNA?3V>0)gWJR`0n%UW%djCiPGRo^#k@>DCqMkh^ zas2D+x58U1_tvJn5c&HjEaUST`kNPXB-WpNa))t8s^*(U*1N~aXBCf3pL@!hBs(`h zGD~GQCea+q#?(3C)N5&vs@p{BAl;p5GxV}X@9y4Y5yUM<3FXn(HC_8fo#fufFGxQ} za_`P()2r1r5gk7^`t`E$-L+;3@ZC^7SeaS4LwPm=!q1T9N74pae^V)bRU$5`sUS{b zDZ?^m7brrN2Lh^D{aKkLgR0!9E65m8O9U#hOqN^GQiV?C*J)2jtFh(z#g*yUq}*ss zXH9KFI=_-sT*)XOGUc{6Bp8gfnkzLLYHE{S9UF@-L)WoI^}_>YMM?n{M6eRlr0Ge( zpvNjtZ>S?ig=dkmtU6I?;iY_OeTm=HYrIndRxuhYxEQa)K74=Nu4PRWIMOIXi^Vql!bIXGb zW=c6qBJ4yNvNJPMiuxL=l}Mu$li7Rq0%>7o@G`x*xVlomJc^7hRn;!=yQz) zitM^k<~t!QN-vb zmiKDMG8xs$X%nVaNo|fcUq`F$%dTK?s`}REmvsX z!{=eg`W2Y67860)ZyIC>nZtt@wlQo%jjBy1R1+ECoTo|LW$IIKN3>1!@@Xt0I@iN# zEN^0vnOtE;+(TU3s(t}7N!Q&2?oEEc;3YIO6O28U)V`n0l2jjjb>I6XPT z?Jdk2%bdG);pY23PWc3ij+$d)%!VY)I$GG+k;gWTNOrH)rq$wcgN>a{<|6!3Q#NO7 z=>hgqXP>HDhF~VT^J>-fEVH>OHe-_nBLAB){4#=GT~E#s=PDKNhcS#2j$(j?W}PuN z%2^8%c}+)WDUaDRAs7>0ZI|`-7SP%{hsukpFwEMVwt?xwxUi7JsHz^G8K7V6 zS`bqcd8Bb8VROE*vb(ge#w_pTtCE!!)s-Y<;J$`TU#|8{>0su0ghT}s+}xWITtdP# z!(C3}A`)^OT%vNkd@?XL2O@)FyfLS}{Ei*WeRzrycWLe)3Cpp`Z10bF~VKi8^>B$j&<`z}qe*!}^53m#d?*pX*WY zUk@BWezZFHv#pKYcmL%oKH{qMhj^S8quZgx3w>G7cK)*%O12kSU{Yd2eKuVWz4JNT4`x0Sn$diao|r=7j?kwbO|kt5$9IQ+BQVf%2W!v}u( z`;T_c4qoo=F;O72z|`)^jcNuDI0q`+bF|t@7oJjYWzw=?cG+( zkJ=Pu0ypl^5Ko(*?A+}9JiKfZ(!}RwiN78>8iZkc`yX*WcGL@#8=V*tb=uzpd-fcD zY-@ZbJSyN+HbG5A5P5Ru9G906eKa(|Cc(`+F(SDjA_7J(a9z= zz|Hs2ufO={81F<>&dd4vYvr~Fz5P8>Qc>fE36!;qPr#2Zaj7=WzAld59zOm@kDv07 z_49I$JK>9vAHI5Yxr1>9O^vY$w2qDn$qNY|Lb6bvC*2)WkuZ5_`VlvNPNslNMTeF* zgv2{KkQ-w_{yXPrkjpy4&n-VD+9Tg5!b4GOYae(zz`M4v)ZvtyokLY=Mzo`Cj9r+U zLvDzRcW{zgtJEabcnHXqy+c_Er$Cyo*!q-mzx?VNZx2j`pGVfjK)N|MFd_hx9v!fl zURdOdqEsW5Bj#F+e}f{cbRmZretK z$$r_kzJ7jzVHusduKrQR)U@gTj>4EQ(-grsxuncF=5(ZwT}FOpaD}aN-Ldk8d+)xq z=6jP}1DpmEbJN3rOeZOo#I2q@&3R1pL7b!a|B=!0>Qta5I{B%aHfA_|LPci&D4Km|k? z1b{FA(gqNQ)N~MlC=2`nq?Q|tg%Xg#;gA930!`smXv2lD&62y!(hCqA^c4pe0C6BW zJR2`|xsK7{%hC4*hyTjV4P>GKB4b z9!_&VmK=g`5T0%^(E=_2R9UjRK^PAaC8Pz{e*+z$6Nm)^0R{XtfH-GRBOD9Tu*2%l z5OP`O2>K|n-nWGnxIpos|1W(38|cOSZ~K4^uDJ!KLx2eCRy6(-oEe}6Unl@1LWkmj z2LEN>bZ^1apa}v;3mUXYh1!BP+I}4`H~{JjJp2JbB;o$a!g2pyLNt8>FbDMeoS`_2 z-e43|5;j{z!UsSFSK+UqZ#V|JwgWT{ML=S>AYghh0=`iLEZIyjHA(}Ba0b(ZI)TYr z4lCdcK$bV)wEZt&@LzZo3r>-Xr0s>l70qkPX3OJi=EWh(Warw&rT3lB*T^4sn<)dY`Y*mUZcFa9{I+~; z@y#8nQA7Iu3`vP>5WX0uKc1N!x!cCS^5Fc~>hjZzgQ6!l7H4VqUUWXa$`x|nZ(ZBL z3p(ffh99>JA8PuQhVB;p`G@D!%Ckd#tQU)2%9RIa1iKTomfZ`tsjZ@OeM?LexvQn+ z{6xef6oKg3)u{*X#7`hN9B z*M*6j}a_qs=9=cTh>AIsW#vm8+6b@jsr<0FMnH&A=D+|^~pYX9Wq^1OU& zW%TxfYHtnTj@FYBh8pI;xGddi31F<7aQ*&#TYRHxDj$JmoCVlx7KOnA^T4w7D;wS`?+6HruRK~(-1f{jP+5Mwat>SWKd23Zg9i?n4hp6F7)_DWF1opsF`jlyM z`1+`VN#ReK{V_&L7JH`i_aZBVQIP->p10U+Waz>7*+Zc;q$X zDHt>TMsshmf0q9hVfK%u;%-b9Tp8=hM(`4RkDj8cHPg{TVSaW}B~^>fu2W{33B`C# zR+#{IvAX7LWnE<(t{an&k*Al{v2xfY%o-HAuBkqnUy+ZbNz*iSld1+bl7>U~D;s6i z6TC<{KR32SP)ap*oG)pukg>&0Et*maI>$&%LLt=nu3D_B9#h88jUzFMXfj35s>;+i zGpXqyi=2_4m6o9)@%hn-MTF8yURee!sU#&mJts+`=T#MP(3lh@wk!`(iHoJUw6bP~ zHlw;o+Qdl16mf{e+37i)v}K6TXLPEW_k_3-Vrx?d3Z-NtEsCNf4396x$0BJ7g&DER z{M6_)j7Cw&O+shUQk}hxim&G@VPb# zScM`|gP{wn5g_QaY?^LwQ%EY}$!ZNbg0c#75xp^cP)DHVu*u@_nhXspqwvg97D+=? zWH&QVjg2yr`hljY3Rka=h)ZMgWZL?AZ6=b@n3$T&Pbe} zn1&P-%AKK0XbLvBikUxA-@_x4)po`xPMASM>oRKJozq$;NCYa2Sd$wmdC*wmwE)_0Nwra_rpVKj77 zNd0BK-OYmWu6kl+>6x<^2lRLqdVqkZ@as1#*=;huE{~*2Dy7a=wJ@2Y^W8#H1CB@B z9_}hK6OEecJ`~b8ag&zLh)3{C#>o;~r>tf4ZjZTT?0OHXF|DJv;A|n8+b<~rWwYw* z%X^HiXlbdwRF~b`UQo+Ys1*VOQI$Wlz-ri#Wtj_zYYKt35dP~>QzLIRRF#a(R$M)U zo1MK`Bq$-XjBZnrsTL6Nu8&$?7sZh0e>X-{~ecRP5#C5{H)%5XYeBNOS{b8LGM#ZdFm5l3r;- z)fDSYuhn()&D8}OOiD|cw79&FInHC0ml^kK{2L`+@Mm2a2GE>KRc@vAn};fG3Q9HG!J{%ERU1Pp867RiHptQaF0|s z2lo&Me;2i=i-+z1TXRluztv#I`LnE9VPw6sjLIcSW-+6dh9kFq- z4XV|Q+4)%o`}x>=`q_tgyT!U3IfB^y9PMfAYU|+W{_BsnHukp8E+DP8RYhS+s!Mo~ zV}kehKO8uD^n~-b-yXKMI^po^FSdXG<-2eH_T%x>$zi_U5#GK>eI0Ba{30{Gyd6&1 zg?L0+J2^yqow9Nc&y9?v>+1r;>B@}oV5XFLr8vgbGbr5d&@|Uw-`Mn5+FEs{>A;V7RrFyS1<9p_2!K-2+1W-2wx>zdP#dblB!QE9WD= z0dnft_3Nu-&x0N@9*L@4yF>m?{tn4 zm@vc_LlNNofAu+j_)wX~DK^0+;OMDv--1dRt?PGQk&lyC)DJ(o6=o6A3d@U~9gf?7 zf50Zj*4Nd+_LQ@aT}r;ceSAomr=5$V!Zh11kiYGnD#HcXdPD|GiclUtaoLgHS-zlD z`AMP3(=V^2ERaLktE|d9mFyPa=oIQnD0U11mAbuMJ#51LoC4Ck6K%2#orOePTx^g} zkdM2spHG>K*RQTF_V)gE4&k9-72+c6$NEtj#i==%ikc1ru9{wcx+N8#mRF9()t6uj zi(M+xatf%tLL@Gv$UP(&Tc00S=!FF5f}|bkg_uxpG}AvK$}>GVtQb?%hzTf-cVr?- zG4TNrxh@W#4Gm%F+9=jIV?3cMd)p;NPSHV!0%K_D%Ep-d0jYvoUlJYC&Pa1*CZbcq8eNcV%v6|-$01J- zMM;ILPh_Tk@l0}BrE#I&C-h{jw=cy%qEd@@ifD?;Ob8jMkMgYwXmp7@5fN!+ms1cQ z8y)8s>xJnp$lM?V6nPakW+a|=QZANH$G8R8;=>&p8{In^d}~(Uo{IMI45Ju$r?Uf2 zW|Uxu#OxA9e^IDaO*rCp+A}WH-90|=$mtV)**11RpGfuT_7SNuheI9Won+XH=%&~o ze(*Sjqfl!d{MGd(zQNZWPIy-IHk72$`vuJdJ#NRd++sqbT#l!4Vv|5k`VjVWS{yyf z&pFcJM7nFHe_&w}28nb7Th_)t-TQc&f31t}vFIGvlmHK(z^wm(UI{$xpaMt+0=ItvSC}=N23T8idQ%#$Epjc|fV+Jt2GKR(39%HE z4HSSt2#kf2;dmGe4xZs*0Mr{?e}o_lPy<>(1!fAI)4>op0)iuO0cooN2MbmLUd{Wt z!S~T2qydu#nDD>s13p-!8zAj}2dpfJ(sD4d&mYKuj@G~dy$KYY0_>qk=tKU^K2iiz z1p>hz%S@m;V4bM@YC;oq!#~5f04D~8!g^poz==VG2Ni{r2F?5U4-mlFKtu{w8SsTK zZa=p>SWD<|08bO3b3YB74M6KQ%i}< zSZLwV0PsVAD+B1kJBFY?0p=-(Fc?w;0+Rt*wXaKd*p-PaUWfmZG0k8$G1E9DZd>xi*ZvXFJjDZwD z350P>_*of{@vGgk>W`Q;jHP#t!FpRFPiSoKKt~w`8;R)(8dlv&*f2ereuY8u+Sz z_2}KC_RjRPoh{P)m$avYdQsaS_u6)Pdx`4FvkbJ3Jl%11^HtaE-tH6n5cTbDck7E* zDTj?r4Ghx>W1=0BPWYA0-NA1Uy%k8tIlQ?p!sErA8+ti@>??!?|%-F?0H*fzo zAz=^Q?4P^d%ajgJ4$A~u^SSGSwF{32CP0jq7Q@6bl|nL8#m@(jc5co?9#%r>Cf@8dEWXTYm%)8j4LhuCJk~6|Jm5V zl(MJZP_-RXS7aA^Ki%5ikpC_h3~z&qQBNQK2JGlp-|Sp}4w7X*zdzXi1i37l*qmtL z?Cw3f7}BQN6imu?4ScfBUs%o7d8PPt}S4_+a|!gPl)%pLg%zukSoH z3wWb*b4F7itE1#LfVRa9A z;WKTOwXNpRcKY~S(TccLBxse0SlnhlRVvJ{P#YOFQw>_=OxFOmFlT^1*3nKGDWhT7 zYCMftyYX^N!w?Q!HMH}0uKuyO^yT{4=dC}d+4DD_7;Y0Mr<6#yd`SLi=q#7;>h{u| z30_w_RrO{9)1eXL-(S1-Lb9S`f7EEYH_5C0y*%=JBc69h_xAC{-sglNq~)$`e2#3= z-P*adLYSIsSF`SZ!4uZo^tab#427Jox~&+Q{vZ;}pJz_USKGc`8&~$-Ui$c+@@Z%j z>E>NizJCKO>RcMHdExGB5|_lgxY6FZx_M)s{7PY%7LY0T6{8y3$ne?b&bD`2(g>6P zo1S!zDUfMIAZapn6*-H3%$@7PH!q%hd9&59NM+reJ@@1uYjSAe5o=ohX5+&jtmy~4 zgu7j8v*D9)_!al(3B>GSUhUsyAEW|n1c(eMaMX@gVdqN@A+ zs$rZ|F~%p5F=9~ecY|XtQ7!ZzlXc|074+tO5{MG`2) zoU&R9iF7KB8jr$?6Br=jLgZ<6BZx@lRTqhhidb2FHTmT!sri*ze2%O!g&8j_sX-ai z#RFuJyEaqOnkj9<52FnlGr2_0F=;jF9bFl%q{fQI$&RXa28aq2$rz1d6s<`kHel&m z0Xqqw(kUv+7w0CYWg&QUO?)&uix!iWq)kncCvuwFQ3b@pOe#7>Mv^Hj^JB>E=*sS@ z*tERZ=lG+KftLwe)H9rkt_H;c*7ByRfqqB;c*i z)3xYjbA_x@a&ITDqO(NEZ(t0~6Hry;nKKO?xaO`)>Q3~HvDP!=quawP-F=n+A5(7u z+}P5k3C2du&hFnGJF~qVGu`w5k6(cc&CJZq%*@Qv6*DtSmSowMnVHKjyKGn4E^sk3 z^DBC_neyw7iL#}un^eSzXd2w_a#Az7a)eD7G2C5Pe0QOJvi zmM&p)iw5w+9YRb`Dy5>?hy}+`U7e%dqoegwPHR(5_hNC&K)-fsr82vq_*^SaDVDtgxt$O5-V8QVWukNl7#4r&R)GrA#RwQrEYLataKB zwuRApp-i_*>P0RNO?4z9%83j$7U5y13h@I)W8({Ah1|H4hih-hAZ8?rkimW=H`a}Q zbBjGC%kuP>9?wgpnY%wLjc2?0$CKlne0=@Af->YyjEK;xtkC1f6N-a&^e=ssj?l zJ&u^!9zN=DDA@Ld#jigeJbKX9+THRO^S|31JYo^!lv$tR<>h%KF!W@Ye|UCmoJW#} zT|{_FY@Ag{!pWErPgk#u6p(@%=$jH9MM5ZEUP0l334xwI&em43N4*^mnOPqG-RuZr zb?oTRznGiZ|9bd$kKYgYANB}Hu(9-VIT37iz{$hk+sg8QbFjIYmBkM~96apqP-*R1 z3X&FBtK5uq=fj5!{Cuq}kJ>f2oUn0-v^BSJa?22*<2@`3eG=krZ0vm)0f&zta0_(^ zYwoNl_H=i*x2lV2Szj+c>G`Y0LF>Z!6Lt=WtpiB;y)-~C3W<-kjR4`^Zh1*IE*|Ed zb!1-usEojiuyH?eBq0uMnPz9}=#p#i6G!>Xn`h>EpF9?EzzIYdRK)o-Y?cxq%<-t%C>qwIh@4`qemqqf#_u$ zDhM%%j0(ti3eKt+^^Zd+G0u(_Ng@88p?0pGn3@DDtB8ce*q9i1LuQR2Jw7+I*ws7O z%gr_=C9|N(w;(C6uGZHj-7_=UH+Fgk1fZu>H3nsY%6p@R&g@}KBhn(#)naR^GaD-^ z{XASNis~!#NEw-hIThuz-N{V|IW#aZ$E!6W6y?zp=acRfkXl;d>*8J;n~;R{v-fuO zvWv^I3eUqv`Bmg42D*8dh6N{94;u}J{?T^*;xgZG=g9*7j&4`~ZTq5{LAaybJhh=Z z&*&0OZwRC+tRdUeH6}PXDYOF7m!BG$`n1c+s%>8^j>zD8=XvIJAP6QfAvDz~@c2Pi zd>miz6{IsxEDexX7HR`>Q=_A!TFOF%fhk^*nSFC=ePCm-n?-eWQbeFfJBWNcJi0rw4eKh*?oKzOI_~^Iby|^}S^_ zC2=`^K0e|0!J$b(h^@Jue^Yo>L$a$&5iP*c+u?-sZ&3thg6;2SkwH?FJ&KfQX?@r$ zw7E7qoQn>^q3dz{m;(n7nc1Hlq+AV%Ey|EoMW-gac;#6*#)afH)ukkqH0e-+Gy}gd z>VSQkCZaSf51ha_2j#jZm8yk0QnB78CEn8`;N*$;@bokX07xKGG$B?9L4c?73dxXVGN-abliqom}bGMXW$BeFcV@2s22oz zL+2_P{r{PS0X7h0nluI?oc_XZKu?oc0IE!Q8NxDf3(!FVhyj5NNMeG-rsD?SXE&V! zK+FXVML_*Gh$fUQBAi`S9CR>isXPLTOMBcFVs& z*l#)+_>WgAXbuJ)*?%{!7YsIm`g8kR3Kk6Y2AK7q;Z}pSz$c9i4kbVjb!Y)73LszL z#RujEH?4p?C>!oIv_E(;=>m2G+}JOD25*?2Rj@#?cSM+u4xb!TECYPjjzK#^Ht<*l zQ0$*az?Fa*fDI4@#vp%F#W#Sy!NUla1!nBe0~c^#@vT3Y=9pxg=73>14~&B^cxD6_ z2xuU!33ZE?UX#^x_izhXJ^haX{_4kTFGh#Ij55c^KPjn`FJ5BrAlKGAxB4XgpAF9? zf+>W(CtSWyxbsx9NPG154+;H!KdWzmJfPN*wcA?brM=;>TxQ%f_Go1BiDZz+<8 zx*5`|Ys}XdUfow;Au%qH$h&j}?Ot8#%Sv`?>EsMl-La z305>+cRQXMo}3mfKh(oKaU#;4~gsi z`ObUdaqiOj#o4iVJpKurga%qe7Y2h|ke17>R@3nSyXIVmfGKk!~)OC6uJNjvi zutM#f5q=$iHrY*O;8as*@onTO&G{be6qk*W-|jengP;{W{djp=wS(*|QRzL`+9n~C;e1f-*iI=1w8h28B}9wDQY4g5#ZRjqhJtDO`sFI;&q ze!NL~`@r~?HhETLL>>>mre1xsuIIk#n&K<*mkDhjR_HrVrOyOd-dNw5Uacl>X)e4G z8zoJ)|6Jd$gkq?xadlWl-khLWmM5C=!Ay)l1#;UG>XQcu*7UEfuc4N z8KSKz16}>T{i43<%=Oy}&cNJ+c#?5%l)!uXe&CO{$W6twu9v*IKkwa_-`{&Fx=e3) z(83~&e#TE-+4_v94^Dh|q{E(-J~OIDI_cjwm)Dq=Fz+Ai;lK6GuXPS!r#0XYiosdj zv(=do@74TsqYp`VE}2djU%pG$oPKro^m>nO{`n2!A0r)#3ycxXy?aCw<;}$AX>!l? z_Ok=3M~HlZboQZcT}i-cySwHWcP}spr@nvb0Fm_1)|Sgxc|nbARXHpmTu^2- zHH??$(0V2^wb48kyF<*u4ApekR5H^`yNL3|9R5lpy{N2?uxDAR3(6xrEO^qw8|uYYjJTx1}KHTn^`9kp|WcVi*uyL8hjfw5YbuGE^(sS39;3K1Uc*dMFcqRgR%|jiAs$ID$W|n#=o6E8S-D(R8i(GT z6IM^cA(<(4*~$6Mq)+8@$}72t$;0(qP~h#K$Sxm7pTq^mexq(;|KTUux} z0`1U7(}UUSy&dkAh9P4e6PcjQly@(;Bh{yf^j2(cXKC}Yu43~td6tx2LckJR8|rg4 z$nbkQMKDm_$1qA8s+AQL()Qjx9ZuiY&cY23sY#5}r$>~nda=%fa8*mBMG>1vuRg8NX&QP{hkNHib$GcN$I6}WP=?*ED@=^wpA)mC?e0UsDZ^mugdaKOmnG#-qkuYot=jn;fT4}SY%8-FmcT7_Ix`yYd!p>Y?O=oIaR(&0Zz?4v$i3ZSg zjc8~q9U@j#VOofT7&Jb6qOzv2?GlE$J2$u@-P)~P1+@#MWo0<_Or}V~q;s^5i%9xt zMfG?OnorB9W#h$-xCX8Qu?tUd$en-CSnLtxR-5e^)f|wX<7+@$*!vQKtlYE9Y!iNU zu5M+Z7PKUw|utF_(9gg_4` zbGINrN6VwOmgY8I{wHh#J%hrW^X;OeU2OuhBaw6`mlIy8sbMZjv)sLw+Jsc^aPvqT z=aZhE(N-tC?Ck7*`4Om%{CecrPfl(>I+)uA`UW2IIN|1ypPCqP+|J9x?a*QG-+w#w ztK$hX3)>tY+ryzgfq7I%Mk}Ey6xE2e_wYULVV@l2>YAdg$~|Uz#Mb^`3R)WEf9yzg ztlKdg|06bseauhVSRe7Rbj(~Fvi0*hY2z9^+BTc*s{k{Br3!S`+6EZVVbR337l``?Y!wos)w#l;0S!}egUsQ5YMotDF zG;&y<+1e=T&uK_PoDu>-TQI*6@95fATJTy=iekQGF{`)Ew-jj#Z3t*Wl?M1BQBhgx zu4$qENR$7~PtRT9qI5;T9)4NbR_jUlJQA`^R53Y@= zb*~<-4{_BhjZRA0cqdgGhsK6ij7qs$sYF*fHQDiX5Z7?Ikak8P~a&JW6u zX{^dKi*5KtBy0c_Z<)*|&dneo2CRGXTbEGlgw&ke45MS6QhpW`UiTug$IU2 z9{?D^geCz}Fu?_g8cg^T0uGbs4!E6Let}>Gi~yVofCkKcHNhVUPysoBpD?VP1Uoka z=QYHf1k^wFNlefNayCtXZbongVI}OI^q0(iObp9SkpUdrM@En{84v*%H{jlC0mMLt zQ2hQhAof2&tO-p){ovO=ZYF?gY0w@0H>fz61BF7@IaKd|nRu9B7Qol=kO4w0$OI46 zHsLV1CKIfMcn@$j$poF2p#}g&?(1Nh3n@)nK?(mS%;5&;`TvCkCZq{Sp&2P6C3RD$VTWjW+{M^`PR?9z|R=mG7P;?Hm1guTGz&tR;)TG-a3SfAU zZVuSO@CcJ;usIp*M+ThQkak}WkUb67vwsbU!KB|!(&1K{bcH4c#HJGy_@J2d$D^&l zEpXoirlAtx!39iBPlAaG>bP$Y_%uRp;E)7H*+aJQ6>boChuZ(gC-{_@3}vE%Rp$N% z=~@v$LTClO?I7u2U|aTPU}c`uOOY&YUcWHU-WXh<%_y!=w-mab@lXA4^msu#_O?O( zjeGTvY58;Q%R$B7C*>zH`+?+c*J~AH{u2H9o>)XtJz%W&;}}y56W>?Iu3&D=V&^fF z%U?$H{rqp&c+2ZbkPG(JNLdyVMjuMF_piLX^#EgFVby)eF#p!*l{=!(Jsi47{DL@* z>wkFv!rSdjI)P$RNBuH0`iexE?IGU0IX&6g!|LhaP;PC#xy{Dx?DRi260lJG(W{6qvWuL?dx>h(_w1`1*u24$2Kv1mhg)Ei!3|W>5~uw#I2go2(J7 zK|*}Sdc^AMT2O5g9=+OqC?<}dTIS!AEG#pOy^4pQcE`Y9jct5AW*Z}V)pg^~SEoj~ z0~|bqJRxRs->V+J-ymZI%pJnn1yEoO(}N&auwP$nU`SGxpr81l=g+G{^Ner8cMqSR zCG%B^EgiBUxgbU}*iiE(Q5BVS}}I=5>3=EUvR1|5i%7uev>W zn!}sj{;(iZ5%E*Qug55_DQgpFr!@C=#vc+zT%7UEef|hT{p3{d(4s_sp8a@2gIpVU zLHNLsEq{JXVc>LMFK_=ry?Tu8<569dFnSnpU)Q zp2(yrW6lNTb>5ZFcX&4` z+gkM%EbYmu{+sMS$Eb@hg%4$)5G>ciUYhZN~M!3De$v&Z3m*OSOMG@S$&w+b%l?8uxZEbzgd}eq&^5{26T3HSO8vVC!~Zwsf#;|OQOvrneq4)qgP7A8+`Z@=#DeSLcPrG83eyw&|; z`t#)U*5x~lG5)ZGYwTc1<)@kW3Hg@p$%P9aSDxN5^7Ut4cYYSl>sYv<(~oc7?;83% zxpsDLKzBt_Z=heCTVN_>pBS&YnHL}IDu%khDtc#dpXpyPNS3~`xupb^Q_fWBRm_SG z2D4a>njxy|P!wW6X0R@=v?6(`Hhq)TJHaULsn=FAyJzbcl8e-7f@)QIOfxk>NXxG+ zYmy~nN+PoAn@gyuMn(i3pN7PtS_L45G)c$K!5}#m!dz{B0+LgL8AkA(I1Wb{RhAuJ zfkBXLX+52jF04+DFUS$bRzx(&WOQ0HwII2iRGp+iRR|&@(8aMNQcY!LSw>ZPS|X3A z7Uw5&*r5G!6DP8~rUuK*L&TYlxmsmv7Xzu;tS;s?D)kCVcJnNon=b6z;7E1&0zsN0 zKDW%EE@_tJGe8S3E~T6My5*BHC0*MD($M3WFhs5m6hom*T=d_5?Tli zNHi@flV2w6Qxj|RnsN)8ifMHj*}XNLMs{XgRw_P@jK}h-vatEcX7kwsYU;0=TUf4a5lbej*>Ob=^ySF!|rVx`mP@kr68f8ujIW@H;OdbYH6N|*u zsfzr(x>BOJpbCF?ZtEt}*z$aDgnCMVudLS(W)rKQ9lQ(pIl*L_Q)?meAHjB=`I&0Lowhq@YDGij`B8p<91;I9@i#msmYdsg6 z$JG4$4~(6d!p3%W9dYFvzFxuXtz80t>^K@)2 zKUXZq5Hd2F$4br)AZ;uHzALRPD<@M>N^Ps}V(Y850t$mg?Q0M`+?e{<%rBIUB06ke z1DYhz<|+vqO$%Gfpm61trL1BmYFys&cInz6wy;IBhMlNZ)2O(f;YZ^mWZnc@)6Z%^ zEhy_{jT#D>Dy<*SH=v4HGlN(GZltuPGOWL#Hx@CEvvmy!07aMrV`8F$J*wh;Y;%3N z*lgE`G|zDNNGm5htCKR%9+rT5Z{0gr+3(Lgcoldy?@DFqQpX_W-28Os= z|6umZKTe)FZf57?;QphHvxV)?Cr&t+n_K?o<7Dn=bKKJPsN136Y%L@G(S-$7mJS|% zzZ^Y!z|t9UF!Qx`a6Vvbaqxiaak~RHzuCBlJ6l-zIv+c9?C`-Lw_{ERezP+F#lrjq zXaIK1$@b7sc9za=*4E*nK4HH0L5FQ^9Ua4LgTszHTgI0;CPqetkb=CU+$G%9a7)LQ zw7}!uVVoGDEI%^ID&(NGRe10*yFlj@D}R?D`{UL@zQ>Wn<|i$pY<{sn@#Ep24<0>W zcB1$+-P6nJ@QDM5%#T>R9Qw`b(D9?@c5$9ZEW+Z-!lV33PDN#(EDZ6o^)PevENXTR zb1Y|tc^tAj^0SSl<-}?$-O1dyC@u0A`(F+_TX@6*N57-HZAhVCkpJQ1aklQ>A$CWO z9kD#<=#yL$=o9RT3|S@CM_VVc=-#$Ry-wCUTL-w8ddq8DYrWDCDx)MI!pi5+LC0g( zHulz*86|;%NzoCk3EfyHAt&J!S5~CZ+Frf<>tr=Z?EkQ9hF@C{_rymB*qk3${ z`A4SNXLwa2ZqY>peKXAiMZPt@WywA%6M+uwBs+(6=MuM6tCNwT87b*@j<)umDe-BU zkyNC~+sCdQ)Pa~jGc@vScmCR&&({oN>MNJmmL)8bVSTJavh-LsHw1n|@K}9A#QFvW zx{t%2y0|JtxY;x4x#yJs?gX=|$oylLLyEhRW+4OGXRJ#|Z0VLy}2j ziF3L~nRQB&bfc%SJS+_#)f$!@WA71K-X7?g<#{*^rHgIST_|sjj=MTtm7D4ml34Cj zqM6B!YfWlQ?J6jA$WO{Iu<*mtJd3DUe9J_>M?igpM_OKGqq~zsnT4l|gYB_nPTApn zHj?e;6xL*6>E&pfZs+A_77@oy$Huw)IJtyaRGmMw_|i4m5>??H;2Lc1Xd4)5)mTRA zOiXUZlr^OL#DtnTg_MQlKOUJ+_p|aSMf(NYC1nvY8tx-{O+qy#rjVcD9xIa~%*<$a zFOtwL!vggCi;=M^@kzP90d@zIU6M`!zyQ$%Kz2l!_zN)#gc%TJLD%yM08vb^0|FHg zp9_(gsp~Lw6@puEE(j`zXc>I(&%v4Asi3#E3B}-nLzDd1&_29|vrIDy021yutpbo5 zY5;n2!SM9InJ^Qe0-jn}+ska9X|M{pA`03)VcZ@>av?yni}1JUu&yA6RMAcP|RlQooT8Zc@8AH~=I0U`nb zTY!O0W`q-g94N!&sReI<2WTq}%?Z8M@HRM8Ahi4qa5FJP(@f4?XiF1XHwlG_&M@2> zCXa*r03m~}-B2eW2d-dWE2uW40_YjSJTi3j?>83*rvQKsbkc^$C9sA#EYnT^ZNW{e zhva`P3~CF)6;QuH@lbcb5Zr;6KpcD;fC)_hfC*u!Kdi(Cq(eSJ*!K%AL(=kJ;2XZ> z2QUOifJvaKz=wThp*>(qbR3-d*C^x?N_C_>lPLu$I9^ zO^mF(LAcvf6T`IotDnecC7X)f3(JD_k84cz#`|`fX8hd#Vs3l&`j<}_iVAmi7JFMpoF;5cw~1IZP48?k zc5?js3Nj--rNiHSdHK;>!PMxCQvTrOA6wtKwCz{)FQaEKJz`$vPu!)vlN#>a;F2D$ z+@n(I&q!S|%D|0@TikCChc1fuMnu~;7-E@ZMM*g=>Y8NmZ}sE*$FJO{g4}S*Tj2oa z9dZ7gPO5*m+;Qo`+BS0S>8*2@`exVzJ0cz)gNzHhZ)ql&s-0&G9~a36_UmnK|Ez@7 z@j|fPfmdRm+`l6mTDeHy9psU2&g(T#x(BaHu5q4py+ZC>-~LDv&#$yGzfAtwKJr0t z#L6%i$$!eeD0ELD;{`-(#w6{inHa*{I z)M&+I(4bAgoK;Epm^=>Q@+Zpa7gMymtM4@UJ0Bn7KS(L(o(Z0;eBnrLT<;&-9{Pf9 z2fihhg3VL*vKKEQJ*WC7CXjo*kC4sNFUD?Z7mfOBdgPvFQVNbo?%$$z_X;RW+|~EX z7sqzaZuIW1-_oG*oR3V}@Fyve%lL@xU{+N!2|dHhJ6AS`KR$Vf!ObceXTDCoy!POZ zP$2vG;gSB^_zlu6L~u`ZrQ_xe4bdQByr;|CZm~PsrF_Qd_WHxoC#PTPk?k(ZD(eN4 zew&J%X0(F{>a!oa2K%)S1n+OPf2MLJmv1~LeSCa|w?Zc>nYYLz)H}!qlS+H98IUst zgA$#rqE%ldL5LM~qvPF;f(y0H^kNY$yBSBV1-N{w^D|-W$yvqIff2&WX&r3oMw(n( zq~8)y-w7oI_1-qp{p}lFzH^_@gOjemrn6Qx)WuOUnR#1CV|{+RyT+Ws8}IIPU;9J7 z@phZ_aryb$-OaJF4_(8(e{jDcSLRoyw^;Aro$DRJu#wI6XYa4wZ^Mp_-?}dPa_8H1 zao^xg{%Q3m#Z=dARfoE5gQC_vVPfz-{gR0R!;tpF%~2IH#Jk-0dFiIu*fzX)TR1h; z*CD&!xr1kj2n~AWqp^zududJ$MROQg~P_)u2BQ>i* zJTg;1(b}0iT8K|u&1QDimZOb~1|f&eO*9xaEa1b-M9XUm(~=QlNkdyXz<6v48l=kB zfF5O)&8XbuVqPY>JhL%gD`e(WH_#GTjn!##UTf<^1+BeWoMWhxMT=$J-n<$PtrRXX?RZ9;rwU2P1H11hI!6&SR- zwVqsrG+$z#?(S}-7h?-5$`WdLMMKkdm4bW&ZU=W^ZhE*OIUXMrS4u+1b(a?AF>1r< zjVj|nyFrP~F02-plS@;ZBkQWtIv&?Bd)WmVdS_Xjs8f?TT%4usuInaF=H;tZm?mcP zWJ*n1VN!WXc2Oxp6za1v94v{P*-7k0xI`7PgQLJV%4<_3_4K-FJ?hp4Q1iMxl~u01 zty&pe*%(nyw-50U0%N)9AyxWP0^@ua9$E_hqN%G}q@e*Ot`PPpuk7NPC?gwb7wSN7YgI+5#+@%tOS& z_VoPH?4rg&hVpUyO)XE_%_e51amYqCiP0)9S1Umsyk5aVgQj<-6E#~~Q@>S3A!E=} zBLhW)Y!&q(8q|$ksK-%-#fkudT@f(JAq~ijE3h8gk6n zA~?vs%*w_*@?=nGRIoRtbE$ueo0J|BQ5asCi#Uf{B*q2V#JHrSMOnFkT-{Jtb9?7h ze!;Puc_qTDk{i1R)M5eXM^v0fMg`{{F*HmIr>Y@CXTu`{f_@ z4nNwTIB93~gY7YM^Pk<0964$J^DoZUmjCnbKUn{K+}+$cJt))M&&w&o+{ei&1|(j4 zIR-d+L>&!`_4CP3w)bj5HzlVy#acuiceJFPNNljQ4u}u2_i}M_{=EQzO_!6lhwOsw zPnaD-+|6x6PTC!HwmW{r%hSd=urfTz#o6+}F~?tRkAjeHKVN51%-qk+*FDlQG|D4% zi;|G;>S-BglIe~h=DX6Aklh`x8I;L^`;;MTGlA!~}t&-bm(DJvBBgI5alE(%J%46}N0^3Je2% z%%a%!TVr$MMNZ~HKm2GJ5_TfZ+~SC%PrrnOblddg`0x}*yXXjZNI__^TaKS!{QB0Tjp2=*#l1^X#hUuu*qBuQ?&@{X z;5&?Zg3vXL>1q?t%5UZ`EDrDdXPfKL=SBlS^X zyvrtVc9ua&WjO!XdL?fLR~q0QX=m$Eop*kwpeeLikeXgq?_NfX@ns}dMdWtZ7UF$U zt8PTl>s~FbUAXC+P?{GR=3Y_KosXKX)KoC!S>d4}#_F`_#F)@>JGN($OHlfBv3Iy{ zgj+#+@`>Y4ww4DhPaHh%TBaAX5Po>1os<-RD9j_yFY2geL{w{TG_K`@xw*MZ-avNZ zOYL}RMMj>7>yg9G)=4S80iJG7DV*k5Zwy5mADpVs%gXi*NJqzJM7sN=Bn4Q5rXls4 zi~1pI?B-~aL-GZ27FO=uU7{=ZF3zz0y23y_$~ zlLIL7-%WtU#2(54qx%J$VHa!@4Y&jG{Qm*o{{>L&^Mj%QKr(?-h!SCBF;EBJ`oI1I zbb(>W4g|iN>Xd^}bM!wWK-OQFe_tQ?8Ng8BH3i@iT!Vyi7;$b5nSnb1s+piTAOiCs zEwlmvickr7r~r{LY&ix(mWe>We+50Iz$7pZ6@>^6y4_(ZbO-@WJV~g3f^1C!0I2&{ zcnyf*4U-6PP1*-{;1)0zWCwJBkoa#V6`(5?52EHx{J;x1bpVoKY&5`zIA9QyEBb%H z0TT{{I2VFI$OeE&_yNR;|2H_guMq@`lx9$#3@jYFnZdYeu89H$T!SuXru9IP`xXEu z`!_frkiykM(?RQjOR%+|TRG%l+BOhX4=n-3!v(gs^8N#Pvs(WCmmH`OI2{0L0&7DN z@H7Tig@<;AZ~FlYP)#^vUlr4}2`roP2_Wx%Xb)t7XA`W@)TJCMWl|8lfGPVbf+hV8 z#HjCog8j%%+Xah~!@A_)k^CRv2B7}y;WpuLFdIHG;P?fkQS8HKxG+NNzk)Z&8EOZv zAXn4l2;@ST{{NVspTAZQet!NA_Ry3|Zu(&WBqsGt#3m@Nc|}x7L0^U!)VsZ>cz+IE zAAkP=|MBUgNAyoG`zE=3e4Ao!`tqhsHF*E5a_!@!;K@_|mH9P-N_3C7f|PT$R4$?4nJ#aTljL7!Q9(Ix)91^`Kzmg6TM2|%`AJ=Yg zt`XmV80>t7<1jDW)a^`?Iqd77mbV{#JA=I}C9GX$in{Q_FUe09muOgQ|7kf#bn(u# zvhD2B+{&fZ`!`OL1bi89dqQCxeKnvFelmP(|Aa+-KRB!DN#~$)}@BQxhbocOi;qzT-7lHNU_EXCE=go@)!p)}y2LJB% zE!@gm?A=RGR~Z)s24s1Szq9aZc%y%t^;jV7_;63zHLs+sjL;S^+{ZVE?+jrDa>lf{ z6X}}ao*l<9=5Q}xuX1;J)5byVyIU8TvMxGnaY#gL(!6-SaqH#u$i3aipT|Gw-fYkw zle&xo(ZtrsSKj>Vy~Q>GcWR9I@$2F|a0L?<+P{C9e7JKAe`xV%-X)O@dTkUw{N|FerxO2+{&|| zt^SS)%GXVtYV;oOEDQ97!w(6!5YClzl+XGX)K8Ny#1hgeI&NX+3+ej}-L1z1$VJTB zyE}Mx|2ZX-x^RWiZoog@JSD|zSNHTH@!dYn(AcZ4wy{nnn|))4CgE#j-*t>{WW}2a zBfS@^!?f}#RYV*+4?97{$Z5AQd?^LHeunagLcSx{GUUhFiTUr=e7frrrP-zr&_xbB=`N-sO$7tIq<3ZnQ*Tv!c;5okdk%I?C1TWCe z-0mV`B%-eFW!59=%row*M4BNTwNl*lsx-( zd2_kzgNE~m;yRKijxQ_4(mH1HI#K+}Rf1aedO3Y?_u4?t_z25bRh{05(zDxyHMk~? zq7s}?6=@ZDYL+CoC{372PQZ(j=!r6E8>*n9UQnM_9Dz+~#umipf-c82b$KOPMU0F@ zBhf|SG3@c)(-7pq9gDN0mXP9-L%dVrRNfRf9^M0$2JMIO-{$FE8hr!ZQmIsDr4 zlom9zl~UT+5?P+W%8!nVlhos|xHzR2Y1JoXr1O}?SX4?uHd}?}^-KzqX*rovMP3=I zh%uG7fWc-KW>d+P#l;#iwH7U;cS@98m5`WPSX7kPMy|%tdNB1xy|vwy-AJ)~x9^H(J$2O`eX|>XVj%oxoJji9x^5QW~si?G? zg-O{U3e>gDXf4Jftz*(E#E4n=V$JeGX(^>Ni^?T5p<3GI^)dsFpp(u@ zP}*EhV}h`Ba9AqWa53{(`DhO=GdYz-t-XAwPfr3x=J<_zJ=Ulgsnw{W&yF4OOg+ai8yFP(5%pNSzK;kx3Z{(-I|S0S7Qjc?)-XC zGNA^SL&hW}11LI#&_TKKxfLaGg25eQ^QKe<3sg=tP6Tm+5V zyRc1VLTx!qgmeo9_1TC(+gejUOhi%XLwGbD5Be0{+r>12N^oOM)t6c@rw5Fp1@@4T z+odANM7mneW*e(V^oY_18Z2I3BHWkiI705(OA}3HS;fOcY(&vEP&ce&&8>8DR?7vb z?3PjVrF#RF+6<&|t+bW$<}EG$YxH&ir9coQwO0d9WZ8L7Mg$(~xQVCGH@6~>q1 zdxSNM^OCdDk@Ui0wt++|$&QOJ!L&)~I_#Vd;Vhi1MDe@IF=bg*YSt8XZV)Hw!(&=W z82SqyPbnfTUc4=o)>NZW?0RC69C(Yg6eXdynf;uSlUjxo6?IQ4sYH<5)JiIw$lxq7 zpS+xQ*BbQG~7sggL1m(8}zr6P1YnkVEMrKBWXfp%EJN9D>2GYutd#3Ja3jgzgn zsLCnRE7h~XKOgx-HH#lz%C)V`$mIKl9Sw^?QW88oq8&pLt(`+0kNEgo2RivV9{btl zi0uJuyI*X7^>A>p`TbYRR+l4357-^|^R@W-cXtanuP`SoSNkLX_HT!e{Nv|;|GV8$ z8(V89IQfFF=j}Zm#ynT+e6ll&OaSH=zi>g{m-^ezGiku%@0~y zSXkPbTU-8c;Ae;5fBN}H=i?_Wt$(yjj){#kJ9Hu<+{V@2%F)K#*F7pdKmLT{N%w*@ zd#@m`#1^kMCp&W&$B zRlK}?9D~d1JmbTI?PB6j9JBMZ%#Q^n*W(;LPFng{IHUwuvj*KfeXFglOe%2amr${ z6a6N0VqH${o_Wm>QKhBT$~4g8J1QxcL`n{I$xX3x3P^Mh^@>RIxAt;KGPj8cHcxY} z^rTYUgacxSBPj*INVMBFNc%-jecw~aFZ%|Ee zU}$(+SU_k*L|Dt6z1naeAFurI$d2sPHbY;>#qNc{frWX^WdA(VaDPg((*Bh{Fxkg{ zYHXONwXyk{8yk&|em36v#)8EBB0?rQylHGO*H7RT<7pYt;6Jj`8D46Q6zH6ad}3W< z-AMdgufQSSPI*EB+S%GXCc7v*xE@`W6<(AT7aEwBt}Zo!WOn_Vj|Yn z+5gB%XKhX~K0YBTJWE-a7oC{y?|dl1C#xi(KFKxO=46Dkzq1Kf0DJ*)4*Um!Cjv9N zA#?z!1A-I)B>y67MFAiKkP`R^%bS5BX?WC+5U4;z2_X>#QTrF*5&^&mkHCm?P@Ni} zC=*bE$O{4-G|103k-|5K#6h_)$OLxhhMl=vV2yBCx*Ig50wgBX18ZG3Q-Q-3KyaWS zP?CcFuMp(| zD06@qO_&kfha4dZGy=2?bT*rA06Abaa8-cIk6;+0w7>Ykm4X343N-|<54O=ZeL){I z6bC3xDb*lS8a5?|mcfH6Y@i?)@Pq>p2wc;^<^LCs1rwl>CK*tFD0V-28{$P%iEsj_ zmG<8uQ!ofMfi$pk8z}V!H37Wg`O1D6HyDG=$N-+2)&`kF#R0g)L&ys40KVYf!=`Ak zX1D1xta3*)#gYR$;QxgSf=!GuJ6tk@3?#j`Y(lK0?1Qd`)1jzI@Djd!?FiA)RfNM%d?tS*u@JATc5_osH*0zCEmt!sbm z;N+~WOY7}joqcOd`kBwTTjzy;;PE7E-`1Q`q8*mb4@hYIw&@3xgWEze@iCiwjx@)4 zbMNZ67we}$(=C#q@0<~TZG89A4$@9t{yK268{y1;Sj3-s)**lKh1z%TI_dl8k9ZaT zy=J=OyY~5+y;Cx2*A49V+39P~WS@IBwze1Lt545gkcckzv6Mo=z#shgvy8XO&B>{q z>rx(ptm|Iu5T7AZdT9eRBVxF8{o>nG=U$RK*E-(yu_j3u2kyQ`P9a1!9ue$OH$gYw z;clt&O8;qn_bmnQ`S}q_+Xn76ZszeN<|ae)#}NDbFnf0Ex>h|Y!xLuTuoz_ChnMR; za>kW5(cV)wi+T-r=hlMSxH2|(ZS?k5+f~*52MW^kOWxV>WgdUw9DQz;a(X*Aq<`DA{x z>m~Q;>%P7<+Whv*fHa)zb3*{53KUR^~GUtD|l_4WFn#OsFnSC85+T+{L1cWix>jQ=^w!++dD zRt9Ov@W!L*ws&g?TXANref8AL!Wy-M#%v=?yX2dM)@^`3nC-idXzzLKowLm614EbZ zx9J(Q2Ynq62d9-+$rQx!Wr~4aZF@V!A25K}kU?Z%s%v>jJ-XX7^=)VD)}`CCfQSsJyHMi5s}IfJjAgXtADQCU@Ry=RljFn2oodyyf)r#5i&gbEzWN* zub<^eUW>bH$pfl;uW@f*%x_&=AZoV92M6_2UpR|Tu23IN-j(w=jW-w0Z{u(GZ9KWB z)ghEtoq&VnZ&p?lx-*(p`XXXWA%>vKZ?Es)kdbDlHQGrIF9(~|LdhEKY0c^>V}YvW z`1z@_!l~Yz0?_$bu=O@y6#aR_nMtQa%28U}Pb>=Yh z!cldi)Z7|GSwo9Y$;jxUatuPy0hY=YSC`e+;hJ))#Yt`QvcZhx#1yKAkAV2*QWCzY zth@}Pm1%}*YBG$)Es8WkCSTazCr41lsFtMSQfzsGsD&YKN9uC9XBd(?;9=Kd8|F`y z#9;Wbd3Kf94ke&BFgUioW$h3B2-a6Au+irqdB#yuu-h;8DVg=@ipvPeQklPx|`lNokCAY zu1iIl)&yHEE!j;qdDVJeuS`8!pQmDI5q=klU=Osf&^}f#979P1o3QC#xsLR_s^U~XB zsSU`yKEFaULTx2zyR;MRY`#Ru&<|6asu%x%p56i|&h6V1t*N?m=hm$^^X}Z5x-;*8 zJSUF3ySuy7IE}l1?e0z+-AF^@?k*t^AV5fnhqx>8oaF7@oI4e|+25A6*IN5aD!;vq zUbEiFoNuaAun~3FKwVQ2ORzSy)2(G)BCib*DUI2zrn$zQ%7Na70!+qmEpwMcC*C_p z#7qxxSR=b=ik6zIkj|^fU7fT+`5dv9d?oLoVFM|zU@E3@8|n{u*~7b?(^xXLgI3;A zDI&Kjsxh3}(riL^9+y~6oERZ&HqEj|ugj`N zv3C5xAdmgLY4%((b&gko9+VY~^UxVWZMUF$vO6D-krApD9V-_{Gb&IS<>@tiLK~m9 zyfT+vt+_Ciw^>-w)>Sw|ZCxAA#}?(b5U_)dyc%%|v6Qt>PYTE7tE{|HgTdFc58XxK+a4*Z>R+uSJy1yV(VC2<-F~|BzZYM zBd#HzPG<`H#b8^`@qy< zUw1DDJ8M%@Km8al#}p@hJ-fv0taQJ?cw1-x05D=7gXI%k9rWU@V*K=6PFwjW`#GB# zowfq$%TAmW1GFb^e#x|3#*qp7=L zM6kc3otZ;nNV=PyjeTH-01==h0K zXDkeiZ1nYAEIbW7J$=Gsadn}tzQ-)R%-v1xO2hM`ve3pZXU}>VBVqmAI_SpXlzbWQgSxBz{@5rJv<<$ILO1VH#rgf^ITq(QJRm`lobc&d!Pjq#iPuUG)<)d z6&Moj6dG3%)18@?=Xv`{+(Tw;MH>dbFuXB=%$m{_`ah0+mHczl$7Xr`T>(@J{5T&SDLAGSW@S&8(ox^{%!i!zaWK@e;;0Hz*A8`gViosarBYKc1MQ3M* zhI`NppfW^U(DDoXx#28ejfcU zxE;^|p7cbJbW2AbN)Ge_46np`L#P!U5(QfxDG*A0#2QrD5hJ=yz%ppp*MZq1^&bfe zxB(g30e?r%=Ri}sOApAdPHw=E4wJ*m+8~cSBoE{OOTZ`@)XD~%!5zT|XbzxNavdwSLsR0E3_r`#^<6u7M0)L=LP#Dkw^>OqJn-GVCn(aENbkc$(_<%OP_CG+UZYMY$ zUK{Cc+>5xJ3hea|AHL; zC&{Coq1xeHNv-Zp0+c~kzuFV0iFUj|4&-Zl2BFqiN4^*w5Pa(RAZ zZ)kp6s*G_dEu<#3K*nC+9jPbsXwnuv4rO`9}i#Kay6WZZh=f+wFS=`3AxS# zw*>5SZOe_0FV_^;5V`W(+l!-vA1}~oe#yk$@4Gj?OWureKCW=L_FoWQBHa@$Uv9k-zM~-12v5RP&yG`yu)*)sLRl=U4Vp0x`DOBmLRtL#zMhnxHR%U8emU%bNX z+3Gq^AA3u_yU;k%`J{Q6wJ+@49)3sDJZk=n*!SYc<}7D>iNE)H^ML!kUq$%xQOMH% z^#PHuO9ooxxb`6)6$EPC{w93};$mbv2SioXg^w&a?Ht0ui12%#n8@s39%;NaB||!BKOSz( zH(pk>{zW@vO+Mb6=pTFEKfchS(jc1i)Herxe_`-=qM(Z;dHj0y?e}K`U%qi=SWR=! zhxgAr)pPWnO(IPr6Y&1(=3QL4uyTK~j6Byy8+_C^vNF@d`5}9>G>Q!Ds}F{x^HTi& zC*(lg1_DZ_&v!o`Q!b302Wg#&xixjgW2ofR@}e{}B{r_Jww#@*ooXPEqB&nPu8W@^E5($=&=>^`^YvODg+?f?s?E&LN}|i-<0=_c7QRT+RHzwXj`2tM z)QsFRB&UpBCCDvmk3lyKuxKe_i6A1AN*3ocBkA;ER-G6@gyQZ2d0|;{UM?y(r82gW zEY8SpVqpq7kuj0jMpSxmLL@a-K+C7bpkj)7glKjfQI@2M8)P?VDhjh&REQFzP0XCA zO=l1a3upQ%<&EP=2|j0P5`!JhC_SLHf%*u|`RNn=3^Kc-R!poYtWHb;k|lKaWTvLc zkklk>r64;Stt_WhXJhm8LfN5V%$$5dp_-nj%&IHZ^mNk+LvjF-@=IxSs+8IyRZ)_2 z>SYL$jI?)>Nj1g%vQ$=1Pkvfxl9-5JMK{#Y2ck+6vPBqS4TgeB#OC)!qf?8?HPS3r z<#PX6Wpq|vdNy8GR7#AgYeTAYM@Ik}?#)YK_em~s+e)N4HKh$?Ou+yM3vS(@Pu4Ke zQA0PDrv~LsHx~aE?<<4MyHox z>a(QT**7j+-M&elBH|yd406lddH)?fp!qPhylD=C*~#KS8^ofDajIE=Qsb(}L?kXbfX$}H@?e@R}Ll%3vQl3B8t znWI)$)W?*dGxFA$I5ksH-K5d1m){hqr|9Aq0=aSR09)F>rRKKOoO>~$5o_zu?Owwc z?=F+-iW_swbJ7IlIV?+BhAG@_6xB8&jm*hnb*E^suWgocLvg#I7e6Rb;OE)-3nZ~Z zE}dv;AapW7&^nUdOQ6j2N*1x|t{a8Qxwh5(IdSR!`R9EVNsTC^g;A|$-hMcAv4mQw zmc?xhRFd;6d1*!2Wmpysm(n(>7Prq0?aKIjtmO38imZg>B79xm_OJwLL3OJntcu1W z+)id^7GBFEOXV91A|72{5?|Lze*bv(dkshoj>{8?a;_E+2${+3UhD)H=_`z4aKlN-S*XGc zlA7CzlrpFSB;M8*AZII-qp7KrsiBee@jpV%L1HUZz8x^CdKLNjy4zSJCx?3$#k!pG zwK<)i=Hz0nZ)&RVTjmjI=L)RO2FChECr(&cA3JX8=@?>e>g?(jmlTo~pIcd-5T6*J zXG_lV(KB>7Zep72WN+f;=Jdx&Ya2Inr$1dhqud-q5gQNp@WME2D?>9ALlZ;8UoEXY zPn!pr>l@nqaqO76gnm=YGxM@;$dxU8RX_|8bv@d(*1pd%nUq@vcl|sKI3KX)Dawzn3{3i;G|J@X{En| zjo~SqK(?W+xxI&Dh+~*1t~9{%l&!55@Uix@wmD`Qj@XzIYEu17!kw+LJGfk?yS3+wMmS*txIyCzP`ERX}36gOD8ucLpv*bw?L0X1!E86p6KqF zlwN36h&YCa=J@yp-K-8uw6e3Yba1fqNVW02uzGcGJuEw_=GAJ2tDA#iup1H>yMD3n zO17P=hi6uqt<@>>h!DF7yYw{G(7B3OztA*WM_*@O6Sn~U=;$z9MsaAqb%dFfn|+k2 zZERq_lUGhvwX2bLfJ11Uy2=~L@pUavw{h~!uSAMv@t$r`SqYgTDRni)m^_=%@u@RsPMVq;4l9|6#MCn?D8SFjGNHpd*v1v*5lW=?v%SrY98HbA zYU-ZdKL0c?H#?&&&)5pxKu==2{%Pf(hxWop>brW_oIYV=6hf^Kpkgqzdqh8Wcr(&~ zqjwU#jRS@pWBt+!th+6fJp+xxO9F+lfg;;uw!vqd4UJtA!?GKy>YN;dJpKL~gkJzX z;OkEwwGe3OgFppBGk_rAFYpC^0Hgqb2&?YqeKk)I021Hpp&IV7zUO1Ft_3YZ3jg!Ccp zqoUGqDVPa)1NaPNID@2h=oikb1?G5wVZnaDi5{-h$#6s(NKs=5mg=^L@CzcaYMr52 zx5*JY*GUX-2q5kR6~q4~0x_X(V@Mku$p5{f0GZ<8#$Xu{W{3mg!xcJ)b>By(eO*R6 zU}UfPH!uQ;1NorJfH7QW7eCqtssV`ge-)rhGq0-$2LuJU7Nk;xM+z2$IZ$!Hs~$Ar zBHdD*YN-IcgQueo*rVh3-vLoL^Y7{47vPr)?Bwvgpb=SjI|0BsK)1RuYMn~qk-&EX zzBBkbKX_ug&Hp9@)`Hbgk$??wCc4#dhE69?6u74j2*YL2zO9=CkT)JCyVD7(`-ZOz zjK9}i?!e`cBH#)#uX9%iItTga0S$uSJqNF8chCo5>eisb%a3^D{M=oo`qfGPt| zy6vEp@b!U@V3H2XgJXr)MUZFEsava49uc^FzzuZ>9Xmi4?;#&YKXeHRmmjxLw#1kD zKfW`soge+jCxG$#hXZbA5{=^}o zVojVQEE0QW1z+0Q#_8A3k-EP&D<-rHGab({51*Dla?5{_SePIyIad46~ihvl{0?h=3PQ$7)s_Aw*dpH{ct zuFG%Wu%w-H3q22)#9u{hOv{apk4ujyNjI2dePVG3cX7Cjvhb#5>Gh%NL(kH+NADOn zIDd^?U3|-1R1GvSm#$#%knTTx+S$`L(A0+X?Q*-8FCceuByMZ7_*|24ym#?7U$w8q zy!y;OKfk$sbq6Pwe)}RhFI9|5-rkt`(R%-?c4`j$ZDISt%JBa5`L(y0zqpJ$`wQPE ze|#AF)HwaF_0Hzv;MJw)_~*|L+V&@;7pTl<(slBbW?1(0wPX%Kw!Upo_TxWHP=9incgEy0X^Iq6?p#TNDyrUJ$GhmcLGtpJVoJ?LT3$_S)WEd9*6p!F{~k zBqx&V_vy=vg#P=4`Th+pwTIfavVXA&v-9~q;ceTKtFNED+2^(F-F|elRr9Kgi@$it zUKl<9{@fbz)6;@$Dm?-%J)>dC~TGX7wrZ?$zPL z*1_kuZXL))AD(P5rh2efM4N9%u88RBG2y$RiEc4@{o=ie$Lbq`t(UBCcO|d7sZ!GS zcfyMUjp|N`cx6&{4cTboYXtKh>x9RjXctH4)sn+U>$J9;U$%!kF}FSv1&thpJkD?5 zI3Q!X4_@&$F7NaI= zLV-nQuv8(w9{4L4T+XTM;L&QeB_m}W?aeooD&qKU(v0#Pcae>k@RTi-%W4Kfr79kO z-X9RZY2NJ}rCn${&l^YPkjJ;*Tq9p+sR>giTo+hYwGiFWsJ9QZ^$(`ow|oGI4D5`N+%)f!V_uR&~E^{YLvfJ-)fI-;7&a zZC1-^yhl6@SJd;@xdX!8Yf4c!CPQ3x99fElW*q*)0iK^Da_it zgBz3dx?1j+1LVh6?%knnI*I!hduc(o#(69G!BF?iUF+8pJGy9$O9wATm*ro!Wg9Ow z8;cq>W%JGWDw0o2%M->8GG>wdWLA4=x};c^+N#Zv2y#p6@+AuN0G(b{kS}4E5;!eX zaHEi-tV5S7W%22S@~MvAjF_0xxbPsL`pB%LI%YaMlZa0c3@?mhrINEObw1Rz&fDY>}g-q$+c0n6%W& zJSGK$YMHBJ4fmE^Q%#*aH<#0d8ltEf+LSur5S+x~MKvcWTAFJpt!->JLYP8hT2)Ev z)by-^A~H8Js-lX+P08Togf$Omidu%IM+P#f^aq#A>M}||xhQu1K!sY&?`X-{Y#z9N zzHdV-X`as*K_y5=>qQkkO(p$N6`PeZ0hh@qEo8SfN~a_{ zS~sbxG_t!rt+y2^O^IPpg*o;8l+}&7rS|gNq!by2U7WMkkE@Gi&(^1DV)!lEj)W*l z>3mxcD^HR*qONHokdQsRT2>-b1fmP^nNbz#OPaNK zENgeJSVpR>tu3k$lZ&J={K}%*e15GkZEy|M0{)X+I6Bf*P8wcp!x1vO$5KnG^O1aJ z5pi-3$zcrKz<0J#O9+dIqM)RHivFxvf$Azv#nNc?$_9lZHNBLTA+Jr$$?Rq-YiNRO z8on%{Y=)!OaM+q*R@MDd+NefGo+GRv6B^<`&j4@vQo&f0vTlTiLke)rvX1K9wCs%X zp~Y58&1G^YhnG7{Qy1|NNrqOYRb&qqRAP2lFEZ$>>m=c&`oTe@GFgT167W+%&Vbe` zPCb#!-^pFQ+fVIWYwzL`vdc19odvRjp_NxWDm?*(p{j+_h1!|)IV^96qpVAz(eq1c zic7lDHRZ*a<(B^R={XTgS|G1qR}FCld9B4M4V@)))*-?eD`E=x1hP_-Uso%}rg8!Ak<2Qdv*TiYu8O9LtR!qmXn%NlVqv5GKo^7cGwZSQ~D(!k`b(Qy+u z`(La;*)a!;-+ndFvoO%}G1NEx>gv9;2-JadECUr-sp_4^RZ}S_lOAZ zXpsb|M?z!{36%*ZUS{T|#ulaVKmB587wT$YVD;y3{_z&^L_W9&4Qaq_4#!#RJ9{{K zIoJm}2ZxkXYQiyf%B_+1Ic`W{tyAckh@ z4fBuv8Dj0MXKFz%i}VK;^ApYq)}XFgK(xNECt`M5&mpwjDOOF{y}2=6#3%dS?Z_ooE=h)qfwPvhQEin6Hw`{wtjk%f$l0Sq5fh+g|lr^=r4w*wgzXco#ira zg5fcXpb{fjJ$E-RkMLASCvW#~R}+0NbG<*UqjKUM9sKOv&-(f}2x?-zO>Hb(alXYU zcf{N}KQF}9(~&36vbJ$B@v4fpi42LN=5LX5{B0w*uk7BcG>MMzGH~=V!xVv1(plDa zj-F0sUha0TR^C3LULjU-?g2r@(P5FaaC>J5dag~BpQpRCLvSicCU!Q^#nsI+!Y#}? z9dCoqj&!omuBu6nE2}Q@jB&{>v~=}%LA-)pP+iKJ;LOUcLL?=^E2}mj#?vEZxOhFa z$~el)A*ebmAj%^YWVZM4u@3UGakN9DLfkw8oP0gpt&@kFrl%Bb6RVAwPuS+w=^^12 z#Z}JkQ~_sxQnNhbH_%+1(oUu%Ifm!N6}mY&JK4JyqT++2hLTcJGMyw@`RU){|Y3$(?kNt=wqmAsmPzkOAw!Y1XeaZ!S9{ILya7%-YA^**G{M%E!hu7=ZfJw4^BiB&VD@CK?!%kDvoUB>+G` z2m|3Z%!u|g01rBx1R)4?2Zj?M0E7612=k2Bff!VoFx8D8T>wBV1wfvz z69PgAuwaL7&XJuLA~B$z|E`+{+B#JbL8vw)M5y~k2QGo}6lw?{I|v+gLqNk2C;tn? znxF@;@ZVvbaUD_vI{-8eleYmgFr<0JIYiE25nKSA0BXS)Y#;SNw{plFiiIZZ5D>(AC=37OTjpFO@K|%55x4q=|P|h?ByV58EBFqWw__xe8bJ5 zZ5{N$6@c=80iN;jx&{0Oe(GeHm8}NY#{Y+oQ@9jp2-cJXMbdTZfn0&r-~%<63VOkO zpojnL`&$P`r*y<40JBgS$OYt72fCqVfou>Q!YMSO*mjxBxT$ zlgq#70Ym(e;|E|J=G21{=#cl#y=N`BrZ%qd5vEZ>dv|SKs@~_%Dk%^8+Xdffvdfb_ zRPpU@9MaFBOJ6P0)%W(*q=&qF($3-TmscL#YVJIL_;{Fth&gYTGSdtcy zG-v++dCFx^FZ2%Gp4_@H^Vhj6l)cy2c4v2Z5)O;dD(t)2-__BVl+%9HlfjKMLBD1e@J_`Ff=N9fy@3l4e3|~|- zZjuf)w_OxE@E!?^j_b8`uy+;(!?Zd?&Fc2zAr00B5vlf zuy;ayNMmvOZVkSF&HvE4$v>}9wXwe3p>Q95xbk)D<@^0D5kl!3KH$F{9Ibz`yF=-C z-9CPON{HnWFQa!K-O_&gK01R__cpa{Fm8M&z%W+ z%M?X={oCayv≥ji}?=6}n2z$NgygN}L{;e0@j2`QA^x$zFbYbNbbjosJ7bxQ-u} z{$kPJu~+*Br1utIsKzL5TXV`q>~L4t%jY6O2Q=IiX5g-nN#L$OoyN;nMx~uy z*DuQ3=$IQ9IN#?!V25Su2cO?GK3l=h4cyzrUcm~V_aRN6uPjgY@usifwhu0UCx|#J zSl*UE@^IkNb7ZMad1d_i=Mm~Ir@iAMzw5S;+qFpk^qr*q&ToHC8q|Ko4;=P%(g!P= z>D`05RB|4!C~dB4N=Q-dtjw@>mu9#vns4*ZXD(`a0ulEbm&uW|Fa*7<3*WYerj`dq z{X_wR-zP70ec_PtTy#+p?tLpPo?+irBeUwAnnQ!fv5 z+7x7r@Bs4^N4d*8oE&FuuqQ|NZa;i=eH6JqF(vHLv?%#x;c6@L`RYfU;M;=a#b?gK z=)mQx)X)1o-pBVpXmY~Mu@3IAh)d%wU}x^Ag!9B(N+s^~Iql%!Biyu7raAvn)sJ76 z({cQE^)ih*);ikJG5LrrqYOS4kiKoG7!36@V(-Powpa9~vvP*}v<>Xa(&@rMMpN}-4Qpt5 zZHl;4B}=T6p;NTg?a>wCyn^`n7+gv%EwUo1Mcq)7fW!h%!1hi>W-7Tr-q5xdSJfPk z;-S?%Vd9{Sc%ij7EkjwAn;KioLUW0d=)|eq98uvsz4Scx>T-|fg_@hF6(EhE)Vq`x zmYp1t-5Bm)pUtRCM%T+XIZ6q3I6f&hyR&|7HAkICNus7iBqj}rnUo zi7O~qRXpq&CVjnjoz*o~&gf(nCgg+-m)?3b-L%?6SH_|X(S@uOLSYns2mw{Z74@KU zAp;>Z=SmdPuQYk3ltM#Aw$Hs*cJz<8k`{4kNo~a`lpMrDWikJ_d zZPl_G(yDs6qdDcf#R3Yqx=XS^$0ZcgvH65#9JpIKSB@%g?JJ+pETyG^NCQ-M`N|qM zsg#Y$uc>a5Rw3Exa$)HV=X@rqpibS>S23y1Qjn$w3$*BpF%nX{Iy5#cEaSAHR2?Jp z$%VO`jPm|+M`Tayml|5}1EmcUQf2)x z7sOE2P=(XNEKC8pD@#yTkd<1|+AGYb)ofSe%2~?-#zuEXC$+VwymCVRpm&j4g%vRK zaJYD#ex*r6=YzV$&9711QE2y`W8o8(?x& zio|7U9qY}#PZV*^47Z_yUQv>pTo%UOsmiL0Wo2eWDsXvK72>!7xxBLf8AnattSfH- z35NT{{4th(9p@) z5ELCVv$8NfYj?&pCEAYA7HsEGZfkJbz}Uy%(&m_ziJ__aFTdFZ)CBu_nxFp1SsO#s zGp1+Hp7`yg@t+1(r_LDZ86eIkei7kL-g(|G9?nKKre3E`*#72p_V=HS^lZ(3F*gLB z>!9MXjms%iSfG)S%}FmkGgE8JaCi5tST|5=`?#}dgs;DqUz$~%MY>NaD#+OUa>k_gre{`$ietg_s&dTYDTc`PI(g*I$0MHn1@N)zm&L#?ARGa@x^5x2i1C z%+SUtAuzl7lu4eYfs0wRpYxf@s!B~J+QD9)=U{2=VsYHw&gr;$wxwx=DL=u9P_{9l zQSagG_0w~l{A}zTo!w8Goc#H$^XWfqKn%NqUv-X#PN_my{(17)>AGMJ&&6BM>QtP` zFUL(2g3ZiAJgfrZJ;Jk`k0U4a%%dW1cMdVX?mZA`(YC>9VVps*nt6xB1_*T?#F)WjR1REQ3a?+ws9?PF#V z?huLhFtc!QcXc^ytmp0Hnq(gCe8$tw?1ZneUv->Uu+zyiPTnr=j!3Y(owb9Tr>TEY zm{q1-z-c>sThDNF)6~!~w6kBJPvWz;o8G}bPL^T*@peh$A#o9rLFoz1x=3Ry9}hbh z6IT~+8q?RtEj-*=VUy}>;}>IK=Ik}1NwIVebg^-A3JLRYwXh2eiY!gSI)vGIg~TR! z*A=_v2XMHtIX>Pweu#HHr*En}Bs$$XHI1DIGVupG`w_g;pRaFR&I$GPY6w{4g}G(A zL?)txl42a4JVK3QYuo~|?L+b{y`0e=c^$$5%_9AZeD5xA4h1j6%|08%B3L<_`Q)MUiu3WPxFA;_3lqc$ZDA8zlak?PN8?`na!4Ai z98(N=d-?L3+^kYWF2Sj{((rz%xs_h7IoVmBRb{Av+>Dy!oN!Ag+u%5t5Km7pQ%lbX z595@mr=D4EDOjd>e{hKCnvxOY#}ZyrGzEnF1%*2$Bskh-<@*wCywfcF?TidUPMA2v z=KA~j`6D!Ele5J>Ag$hUlSFTq`se`j`s76aaHqV+xb&oOJxo|S@$%XMp5x4q^DYBM zbgz>qe@&isFgE?e;?HBhIU0h$B=&lI3f-1*vzp4k9PF1B>y+8pA{{PCiDbkKr3E>l zqAX%%!UAIxGk-%@w_s;`y)&VqPTn5QL4IC7DX@wZz$m{%oB**1eAEFzhR}Br08PQ#280iS#9^^9fCPa7Qis-Il`${| z7U^gc8i0#2#AQ0<1Xk+0!8pF|U%`Ve?-uk4{;v?P0WM%(b?^i2jDRFy1_YHumvJZu z_yr=JVS+V?j&!6z4QWUb+R}CAT(ArhfWm?>Xn>g^c7sKyb`+op?Hn5ok zkpRSla1inf{h0qhNLTlCBq3<(ux3L81G=X}xgar+UL9UG0I>m)qj2$BQr*Akv0~y-Dy$vum>w{e(2!b-p$S<06luE|xJ2M7j7!+(9aKYaPg-PMn{k8DsO8vj|Syne7p$II_x zc*}Qs-w#T=TR^nBVio^xfpYiKojL04Bf`7)U48cmqfZFyUq0P@!+v^=x%Xr7(x9UI z>xIq-6RVfon){{ecYAw>#LHssg~#k(9H*Ir`HtbfzS?@{DMv{pY6L&n+{fcmJ1&l4X+&x3hk*ma_{yt=yJGqwU!u8lab=*D zM3C}UAN2BG?x~k3-GfrXEOX^C_Tl)IksH{%taI-lPmcB>>(?<~r=PFgAtU*D1(aux z1T%N`8^5kLU45y&z`Y>5)z|-eUop@^YuWg?Ls}i7PKh+cd%PXsBsw_NFO&<{wX=uq z7gp7B_3OusiAPV*Hxu8?l39bF+Bi2CNPqQg>|Q$f^kJN%B{C;LWp57ocJsmeDJF~Z zkpCBJMA(ju4)%<0y=-PMq;I~HdD>1kSzSf%~2*VLgUSh7W#Ek=&=$wb+*SBx3&78mTc(9tluP7_P z4wRRYOB*gAA_nIA!XBB)RLr+4Fb%D0MK?!#<<{4pjxE`p+s|LMEMW$P?ZBR_0nizl zzD0 zC6|d;9|}32wqMh<&yhCd_h>(U>`VIY^3I(jkFQ?+@B_g=Ij_Db5WQHU&$o~?>O;vo7Bhg^?%L}k^A?t$ z?raLmX~20_a445B6uX>H@?O^<59Z?rzx!0i!ZhGgW5Nh z>fu$)BC~IZ!4*CsU^x#aZZ5anz+HOywMqExV1AJ~`bo6*>B=5nwR#mvjIB#TSB$W- zg;*4`Y+$-x(@p0_G|=hHrn(dyyEUUUzHx+`nZ%gSsUB$TjS+JKD-x6P=tbB95X4H8 z_om8cXv^h`^e;U`WhX)_t5?()3gfs+W_o!vgIm}%R9lLvE^VUbnuZ5lZuuz>pK|&4W*VrZ*4CtXO@nTNU|O*D~G|a%v*>@t##D4 zXwaoOs48@Se3Gy%EriQL=dwf@l#H?(5|%7Mn40?HjHXfo5??Td+^l18aP<`x)q-Jc zUV(PFs18kw8><fDhg6c9 zC{k2+mE4xN|akrtUxis=`$(x*`^nXKiOs){0n#Y0WA z_LlC5`6OJGd~>X_xldBC#O5tsQ!J3yt2Ib-8=Hj9i6@Zd%mfM{gHuH;oGfi?%j}Ry z2NgZdTkVr?u^c8&QZ8-A^genc&W&in#if$BScFHjwQJ>knYgj3sVbv3E1y+?QzXT3 z(eid-MRgWGMV(ZiTLLbD8wf&eVMbhvwKHtlP+MVoQ9-S+UCJ*SMDjX` zvxRpWi;}AfLqPS{EzHMd}~hmu`C zm(kx#%dBof({-i&jWkS3&1^nE=rBLskU~}E@=Vgzn?vBV-*}j%}CBl@$hjteb(6gr+@tP%P$TVriK>Q zb|%(80TcFV#Io{~VQ`qg-WkhaV-xRiD|f>`jv1Z&`Ip}vMq z{P~aHjE`IVs&DV(<)iPA{KxO7J@7cT4A`99%pCOfdg;;8AY=M3{|gjHw=v90N{isz z2AO!!+|5i(5x)St{LIzayB+;~8rm#3Gq5H#$b%h;pWmkUHmn8a_({?dYZLU(WZ1d7 z8@jlf_`3&qRk+7Q*nxYrT2yq_g1mb#+}PT$}^^W0I|{Y^>rk9jx^H{SA!t zPq~>oMEWI$7kOB+vDH4|L6O*e7vOA=n35C(e5Zp52?@z#A*RmOj&?4Fo_3CrB7ZY$ zOZU`wsXm460j6Y>Pg;F>1S;9i(?8MA-z~{G-6O!+#lfc3I@JPXpO5xLbwoy{MWRU2 z;RT3KZb(=b3Pko>J9vfqdfUW$IHSUF$rtc;CVoC~QTtJK1;LnZbykXVq`PBZMQuPa zxOH*OO~@FCL#HH%qr=N4uh1E-6f#@0%i)8x34h6lFp4|EMmA5_%&w!CkWg3_sMSuX zZBB6Ub}qx>F+nj_@c|JQrwnZJ&{jx7R5=mD5R*b8ejs;0p5Mz)i*%22%Br+5v&Hb@ z?PEJvgOezXHhxN+M^&&{KxQUN9_XR12(d0pwemtr`aNvDj+>oLbV$j+_edD$HQY{@ zFuSpRIewl+h2xp&(GfvuL5>!YX%=A(dDZUOGMjKuGkvp24^u-|M-P;Oj+jP9q)s}X zc6BfbwgopVg^sEyw-`@X(@=-w#u3xOWW;#NxdsV&caT^H0?EMcAnF~-5G$lev1ThVy48wKt4KNX# z4zEK<1A!6v0olgE{_qJ*2Zgi&1E39(X&wCn`iV9lv!XbkGjsV<4*zC+V`9gGXQ!#n=2#FjXhm5#$2Pb+&aK90S?Sbt-`v?MO_x z4=6|lMu8#rs6;kEgfNBIF|alK0Zf2rfUm*kz!w|3iGv?7a)iTSd^iNBuzEM70XE0i zfY9k91wot#@gTexfVT!v6;NKtEZ__r1_a)^+Tfrc-vH}o|1%f@;q=&V?OzCa->_?LYGgx zlB3>HmCV_CA)|y}Z5Ev#_tkbx~A}as{#ZeA{)- zO@7m2-?p5ZbumEiN3v+1G%)nPd3wq?G?Nnx~saRzDGNFx%u?! z`Dc&bvy|gIBih|*9ART&`3sYCiQc5?db4;{u>9;Qq5XkmgR$TEruoxwzl1>)_uUs> z!PbAdIPv+>thPr?9i6<(op{4pTEeg?vNi4e0W!zizs6;8SV%QGBOT4gPzhhZ^|x{H zPu@NpJ$G;I2WM)kk4{iu=pSP|zdbqeY^3MgyLT_A8KaC#ifz>xA6HY)UHie)3Z5NK z9Z0EnyIbGBC%#ymRgOxo+<4fI+}ru<_56tRS_?sfIlMeJ*rOeLuab2smN+1D-gRax z(oeWBxu|(Y29CNC(fql^f$vnY24oSHtq)!7rs1_*qICWaTO&RP@OgXRoyBL*_xSfj zat*$3@Re$A^2v7^{(RT^%D1n}H@k(6myog5r}!If^09}scaQEZ%(NhT*vZRmJe|1M zxU213eDtuB#2S3QcboZob!(ZxSwL_^@}0K|`u5@5HyDDDO(f1<-RZ%8>i*EW@@lf3 za+AAwwUhp^QFTe$-=)}WKfl+_I@o@u5uW3U)^_^de#avBUW@Q5YCW38qjd{3)m=UN zY^6|fXKHq+Z}XgzbnWKA!LVff)4c_P_;OeC`9bXMmI?Oe&Xu=QLo5OhxpRPMsZ44G zX@Rp?cX9HdjW9)=A9<${9=;boX`dVGxXru9m|e#X-qF5Z8NK;xVum!YPz$>Hh>ZI@ z(vzX-Ddh*HiZOZpwp?(7eZ6d3IdW+Yi*H?GNIon*dx;EAz16;-+CER^HZ2goc5wKM zB&1Ks+1R=~|8i(sa}ywibE?*fJGdRrH}1`I{a>U{M;T99!sjoSscYBAwdbC_`+=eI zRyp%aG`Zp-lXGx>>gph2XQTJQ*4OsAjt3j0jsE+CZ)xi-+mil;zFQh*T_N)(Ua);} zZQ*J|!#cBOVCd3tYZJ3?MvWQV>i;x;o43$9&iMkF0$N)d6an4sV*nZ>dE z3<)czwu4v6&Ccl3q|R`4n`ynrLN3$ zB;lm^>N*y;sjfIYE}<+jjv(O0(d#!6Wpbl@U<{MgBQPssnsU|bCFgH!y zkXW55ubir&7jO8Z$&G$S#t}C*?)QMub+C^c5-Bih1g4P#L$eUb=yd;=6krIE^X^ z7h6?{2+?^tD|1v9QgQXc?cVuoy$9&#!A^2Tg`~V9s;Ps3v=Zz3XXlnAXlg-6g}hd! zWZ{U))eUr2@mPC}tfX?2TdW$+&@kDR#KOMo?*&mbdatsfI!j(&PORK-tgS37t!XK$ z!lOBAGc)DtQ@(=say$VKf+8Fe@wRZyT37jUcTH5rMOnMs)#RfVuf5)ofq z*U%%M9Pg;>&(6+^E2?Vz|9N@~;JA`5T`=Cn#J-(3J8#~`#_SvD{=407w?P&&%NDc6 z%ur%xDBWUaMyWu|%*%u@dwl5X8fIOpWabVq-A2vu6y+>;b5#K}0V zE%Z7Zra}`(lQf133JVG97>!&)rdK32#$vg#so9CbG7u}H>h8p$($UQzQ~B*ll_VQ0 z1787ei~|pI)sRO*!Zl0vifCS&Tus{gcegNJB{;8{Om?y zV`(lcCzq!Nksa~zJu4Lj8WN?VzDYh*KY)z%JQR2GD9wW2hPoy>scLYX+sDBxW(Q=b zTs5BFLQm_WFf)}PQwE1qjwK^kt`@6m7+fNEU$#~~r8yv`a#A`do#puh^GF|>$Dtnb zHml_W>Efl@4b9NOYJ&j9EUPXhViHs9b5aM03`SmC4z^I(-i~3t;B8dgsGqvKLo2GJ zrWcJj?+hkj8U4gb5>Jtzm&Z%LC8)&{ql0tuQ#eEtQCl`Vu!~g2vPpcNIvSK1D{K@H zuT;L$;2Tltqs^2k-iWGg{pjmEESc7Xrzsh=yMYd{SLHx=2WhA{R^0 zuQ`*pi@+PAUfMG9I=lo2p!6t;~FEWm;_p&$`OZ%#?3R#c|S z7-h(%G)}C$O`?IfmuIqP^dA?_Imeh;xC6tasb0LVd4-ej#Xx&w3m;UNiZtVwm*j1t zZ(wlR%+TmReBIpbleE?r`9601OI`)f9=tBhUdr>#D=RV$^>J_yGWIxs;grJ}YqN9S zmi9*8!U(rYr*!wz=PJ@7K>`R{PlrE#J?-lLJK}iG;dgyMYnw0&P*L2}$k@{6)EN_- z^Z)kyFMs@GVECWE+t`|%{|^ut9&pao-Pz9doQWSvRpJ~&DD!aA(?5Oc%x~7dewE46 z(1fZ8uL};@S(yZdgcEYnW(ZGDt1XEPh}1L6FvF#L7}(mFJGox8b~iZx^WRPw{C>jJ zBlL`ULLU-y`a)oSS%N{lUqxYNp1t1BCryp5D+w0o41PaT?q*`A@8F>Hw$qC+cQiAw zyF{4keO^QGaWOi}q-GRT?I|UuryN4ho%qel+UOU3^NS{-1&#q8@#ij_&-O$@JkB_I zUO4A!j_$EN=VyQJKmYT@uXbh`PI;t@{#oh17eoCmQ?y9irG%suS?knTze--K)_B<3 zWTb{xWgz0-Hx;D7En? zt$Yf7O+DQb2l6dlbDUxWB7B2QPX$TJ^sQ||TrI84V?DD9a_6G0tt>38-7S5BEJDp) zoz6sM`6I?>9c-O!W6iDXFI9Lj@+-1x4D~=Zz5uI08%G;6BYP`zGux=Z8t)uK17|14 zsOZ?Ltc)-}2al-S+|ar1)VP536a)bCjFbxw?YO8IBNIy#BV+$+Y^WPI z9OV@j>FeWM=~p&X?27feq>d>>l^$q^d$Mc-JTKYUc{WlQM6#4DU*Nq|n(Szs6o#f{co(Ec+9u}~65j4H0%By7C0K3lM5L?I4^5m*ZL6;J5aHq?Oa#xf@-dZqpz{H1GyEuD! z`8ydJ1z$7~h5H7W`xwP}B^BkRP(De=katrzzCIPkTm*p+vBb^{D^Rs9nQ85j6Xa|b z?ATk@R_bE(%UO3LeuqdlYI_oFkNHU>JxlAGRBoa+w>+ios9Po^ zs9$p^s`fGB3XwTQq;Lbhoc;X_Y`Ad&k<_e`vUn%!D2AC|_{9sR{tg#T>hJ|{l+}R+ zfKGHcMF%C|JAfMyQULQPz))}~8U2$E5`)BU5MjWl&SD6Sw*Z{L8e$NzK{x`@2lxZu zb@&V56acSu@D)NZKpa9k=;RC{caO_;{}m_>n1GDafV%DhYl8uB1&9D@B%Kiz0H5O` z%s>PJ`fre-jv$m603HC;fE^jmhGt28l`~)g#ev{Swn~;O8}#ERlva{ z0Pg@uhQ#1Hzybh2Bk%?n0z}cZLYpp-2~q~j(y@iCL5ogoH1Ng-MaN(-kb_(aocMu9 zIGhUcr4HS~CBg~dj|fV+L5U%qV~9=!CCi|0VXqEh11gmOBmWEJ1=pct4twATpa+=x zOeZmL2M3@Q?iUxlw1c_7!acZfgo)EZ{X{3!D}!GVof|ugRXl67I^@)kInqV z8c-Y#%+hViv3x)(m<$biorC)ixCD4IAl@cb{R(ISIUzmx1WJS}hHC;Z;1@^(il~9B z2x66V6_GS7Tq6AwWUG@NT#JBn4qZE7!oU9u zx~GFK@CV(}VK#W+$x-#cb!&r~g0jP3Fdt0&D+3#&R>QhEfUm>!zIZTC7OL5gM;?6` zmr$7`Y12NTmU?Sh_<}G(zW1t@OTf(hxea`PyLzyF!&)tCSax)cpd<)~#n0%U=kH8h z<@eoS^b6!<^&+8racgT&GI~wOZr>lh-6UQUjJGuj_C}?|$1>%I$2cuxq4f#UIk}5a z)gP}2@alGkSR#6HSJF4fsG>WIvatbGdvm?Kv1e;;Y2fzK+LQHLv$E-_@4Eww zyQDqRy}`LY&WqhI9aR3(%IX@_e$y>()pe}c^xw{pl%0Q z(B{8wi<=ln*voewj6LgGmAz+RuTFe^x3EBd^?l^-70egT{J45^WxbZ78t+jzJXPTq zx46vvoj-<}+77Qg+2-8ktZj_3IQP4dwac$S5#4K8A%0?eP8K0^Cc!vp%49`)DtwbuD2iE!-Bvr+NUmbQLrwdtBnG(mhmF@vElrK4( zm}k%X_J;b}=2@Q~;AgP{%HV@`!uzM2Tg}(TuCBofb>nsWYu88Wm!G^;-dcKC+cPuL zE$Sx>$l7|R*FFs@pG_m;&vOg6DK{|G*Uep@`P;i&4dkH@lUvAB(*C=)wgx5A`M7I) zq<(0CzPWTwO?(AgByF8rA21Ofe5!bHPX_tDB8XIirBl>w>sU(V-A#8u%~(S3D)c3 zhX+fCt&5`sE=feFm2;YVh0k89Rxz9r*@L;3{m0j|YFaDh@yyN+p7-bTuJ;_p{KwXr zw~t#`hs%-!{*&1W6_ZcbydIkEKU`96eUY-hH>i=NS52KAw*hEp+{b?$c&NC~=zjMR z8Q;Lj`s!}%?Or9mXCp^{a^=%sMf+Xk_VvNW{Q(vo)6OJ3Ar3sef%!CiIITGB+uM0b zX!=OkaxsE@JVjnzDP*e0)k_QtgQ@%q%F{L9*?G9|^xI=0RZL(E47T<^r;Zm{J6liOQ(YSE%BGlaeV_5hy`+k`zf8if?9Nc9A9)gl~$f^5W`ZWqck6B(|bG$p@|h>LxNKv~Q0-sE*Jk(~)>; z4L&{~H7g?}Z@e&pNllCqR8JF&3m9CLG_5fab6iPN=;jz~VWNSePh(f_pO)!@~pp0_)9yYuq1%8N3~@tKn) zI1!;xl-QPD6tC?{%U!wNh5M#XK$8j^b9!i{EgWGHzN|2VUe{HZx!YGoQQ~rBY3Wsw z^)y;|oG_jcSILv3@wM%mRFLDhIx_=@?rOx`hsVoKOb0f$_w#$tryICNd`-Ncp5GHn-*JJ-Q2 ztmS0M6WZvc0t^#hJxg+wOQ96(*csL$cK?=_= zLrIqp_Ha}9vWHJtbV+Z?WpY+yhl(+#ObNe~9T%&LELF=QI}sr|TdvsMea}>F6VT;k zb!7#$fyPh?6)l2o0h=qpv~odk#nkXBuW#p?mcqi|1PosL6%@5Lt%H(<80v-i$Gf}P znp*QK9i1$^O(P0IU9AoEY|TxbE}gYCaE_>sHMTd7inq7*wMi3X1?w3Y8Jse9IeYpK z_lrJ3=gsxbTi9eKEtDaJzGqE*e%C)|Y+&zi=tJ=-)!gjt-waF)^&N=-g_@uF!`AJRxwV;8uxIYH>aw$SP2YX4ibCnO$(UNpOn@wDSrH zH@9*2u#S$&C)uQ${bpQfX&kJtZ=oL<6kuSG;^1yzVdrF#f<>ZDO$|?2Ioc;8?iXC` ztW2zfBWz1AudS~uG!ZH3VP0lNralhNwvldj`T<_1iMh*zNnUnAdC`7%79-nA@-p*- zUH|a#_II?rQ$E7=j@dBcix+VzRf3t3z>RV3?1Kx4(0BCAPSbj`&pPRuz>7 zW<*{fRK-=&Lme_a`JXy8b?aI2QSq*zUi^7$OiWn~h$FZ1i7z0F<*ym*8e#pDrN!-B zWF_5Y;W9oXF74t4KYvpn=ROdFZHbCOr3BVr!1NYC|QvAOM2Y03HCDd~*NNLH|`m%cto^lxQqU~$PU zEZQSZ-_Xt~DX=sjEg292uf4BxPv3CZ@(5RjtzSumuO~aIBrwFs#zo&h$l9flUJ^_U zH8lyfHMDd*ah6z#Aj|+8C;Q?w2ehN>$qSx2mPJm*y9MUpUzf%ClRn*>Gi9{G%-Kas zReaFJbzc_+gOH)9Hv09a^JmWoo;M2#(vP&U*FW!4u`>0XPEl6}Me&*mIfQz#qD4a^ zlw6naMaoFe3x4Npg$lKE4sx}RNF^ZI(K)Ja7gry%cvr{20T=?20suY7=D@$O3&1S! z7uq&;kOqPa9Ug(XxOEr@2GIUHXoBvyuvZ6)AR&mbAWk`kaG)2K(}t}8^601lx&Y{q zYyKzr1cuAwj%qZ$hN>%D4aP$7qMHF^Bk52jghCJoK@Vjt0EPbu!~j6{G|1TgNBmz3Y@&H~2fzr@|4fjH)UC@3k732fM;IY6y{;z)x zfSlnk$Y%~U3@#WTbs#I~fGY(B+d!7PV*=pY@tq0**ynW)4xm~cP&J6=2g1V50LzDP z8i@V>z=Q;l2lO4#9X#NqxKK z4#eHkJH#Kz%7cyvb-NQBmas!otU>Bc|(er- zZ6|&iQ>*IfGvv`(QOn)=w!VieoEH-OD+)n)uR9PP_N zsOv-ZTjMWR=8?AoT04uxlPz+ti8kx^*>77n@6UZZe9m6es^4DS9OYnn&u513&T)lL z>tA2z{8*4vpMgSOG{)zK^`7~?`-_j5tmV6c(K>{SFnSy3v2+q|_2H)vLkEP#Aw{ zt7%LpX*1#6N;ady)#>g(6cZj)*MTCbM&cR#J z&J`u6u6dd>S5IGjuA;plKe?8ai(H&|7rVOkpy>dTFPO!Jg;4&JiYrWo}I@W z7~AUOOB-f@9|Tp&pwGVEufN3^!gKcK7)#)OiM>AemBj3A6W=}>TDG|AHpCcYmRE zlscfja&3!GMJkg!XxGY%vamJti%PyQL&_{s7gtHs3&+D^+wzKv$@Cs{YU@-#m7m5} zFYtSkS&5k$alCd)eUUti87*l{EJz)wlXI)$F_lp{fg(;-Wlcy_Ew-*OH+!@I7o0C* zXUj8FvJw=@LPiz`sbxrHqKLq{JbYSKI6g>;P*4 zhYAYvXPMY$=ET}s1;U$>6SR_9b#w7{SsuM4x2TdG#Y*MSHYoS-t+S1vSB@}ECFv3h z1Ia2vZuW>fn#(K3YK8>yT0(B3hLOZf&L1o0W9S?ePhMWeRVE`jF(omH#f3Cffq*$a zt!*cW!tm87kyw?IT*gU}qDx~`1ZE0FLCmYpC?O*f9!rU-D3RY<#m&6@c6?cH35z$r-@@2xqxE&wHI8+b zlFADt`1rvdUKvj|TvRPz7TvwIF!_Mnvn&@;ap}~R(ee0dX%{YGOpRWgBBo8(h*Tw= z&5P5idCgTSLc69vpD@+egK#!E73hNI;e4F1bGog)pem(DR+f*Dx(XG=-5t+zG!=r5 zt_E5`IlZ=Xxw@=6Ba1$!VD+ctqtk`VOkO@(p3mhk<7p~JMQ>*vRxmNK)GI`)`{A@HVlfrB)!`rfjkH6cufQxt*$3q^!DdeU?jqNn-SN4{5ry$;1YU zAQ^?&oQXosIR$yx+fmzaaGpgFj zSIxnFI}tlTV4o%8WX^>T5DF|#>ge!Z>;Jlvqh0FvyyPT-dOb1sJn~0cV zXDtB8{GBI@us#pmH zuECxen&){JOF-#!lXF4-L2>9(=X1u6#bHJ^jwX7c=@&U#aipt(^*KvBYa2HgJM$p# zh!|tX!f;Da+x*ucH|w-OKUb>?H#g_XocL_&{V!knh_E@=IV=KHnM+}KxdwZ=dU#y? z-R8V+=@Mxzgut&^BOiui-3{!lJ>1+gvv)LE+04Ym?!~6BAfuo|Elm zWN8B83vz(xw!MRWB&p`nCmu4@e)wqRE>hrr(dn$6zLS^pDYGco@V@#MS`#Qj7erRj zFnA(zW#?K|Szn${UxJUllc7z7n|q+Ica*VlsENOA9xC{Po3*p8nf^JwbAGPwxW*WE zc4A|CTH+8UI;0X6k?kBNNC`}i&jJ4Gk$4xxC)>x~n_wSZUSa2*R*+JY8&`()_a}Oz zlUxXs)49a-B2=^_C9c#pHV~Pt&Y8n<=Y~Wyeu`sgU|^!NS#DIAcX&>T7b>Ss@b1a& zjrXE~fqZ{YS36ITzRJjnlLB5`8tMqI|ur@2II=BaM@{0LP1dxU8Jc^^=MK{VawHvZM#1 z?i1ad^NW(xth0Jq?dKz*rC}dparv3GoI0;d5ow-Y#wPy*AP)dW0I;Y5 zCm&wX^MC5#mW~Fr&=YEY(oKSR3$OqWxTL?9 zSOcQbb%uVx10sK2M7vHTFzy)L>p&&}Kv@#{4~WtLb)8>1kO1ln$^c~otRPK@h(RGR z*b3TVYO`a3|DLw&7`XkVJunmmxkJZk9XbXo1O(w6KnJiTR)WZ5ooaO860U+!31W+D zfEo5*A>@bLAVaVsk}m8XiU%cvmmYAje<>Tx(`8megAj3;F8p{D6c8K*G86&4g9l() z{V!0v@H<=&uvz~D^tA`nj$6PJi~>@?69Tck&fpCtfV0sxl;h}m0x%PU?>b7l(+9}` zL7~h0{{eLa1cqMdun(S1VA6*>0{SU1Hk}MGFLYu6S3q#T{*vJDivzQONX8H|gID+i zsep0NCJp2R*cqN&c+UiPTGtJC2jmcd@fP4;!T$@}bTR`ebr4)9KOVqpkY)g=l~nZ; zP%P9RlnIUo9N?LQPv{u&k5K12A9KlryLVblg`Ef)h`IQnxSeFG+SU zcgeB$TH3z0Ut3eH43EF~!QFd}8T~+b`b8{P*ImWmz)NZP&iYlQX8S6$1wSfp=o5&3 zNCevE*E3&m(zao)^5rW+)5yD~i{_y)_&GS~#ZT{g~q`ryAe@bcP zY}ehmws2W?XA*n#?A?d$dQ$Df0qmbVnye3)&={>sG5+q0O+?0^ zWbm;XI0x@fX*v$c5dI^mT>DjXZQia=&u!QcYSUX<>e1Z1)o?Q zJ2c$8siz2!I)NjS$OxtO>4;p>bVYDYcDQy(s_UM4y{nPVHmp6QF02Z77R76W{p71+ z`Qa0Swz*EwOPFLo7g9+5Z}_k3xSy0;tIMAbRShp+T^Gw+UJK{PRtMS_FAreaKP>(b zzZ)gIL6#>pTkAK+CER@8nASjN>HQXY`MC?@!=a}871Z;d@1Y`WFHq@{}R zgKYAjn0Kpd*Dikqlk+>s z)QITS2jp;Vw022whoR-&yCbX_!*zt)OU-TS)x*)ghh!4*YTM1$=QoGNEBt5D zTXl0!Ntn@Z^IIR5I$!t5Iik6aw!0HK`O2B2rJbQGbDSU4Nl8T=c^*H!(#lk|%?uv( zvTA2%6^|$6vpww3+D-Y7Y5cAhSvY)y#Sia;o1(j8k6s8iHfs6Uoxy(P{Fs1v3)9iw zjq7`&{>B_#URrsimc7~}5x5xSbE|TY@MPfaqj7rEt?4Ta?1V<~^<6WI^pQxVs~G+OBe6b^Qh7Ba+jgmDk8BD%+(c z6`5plYnoPgi;@(CEKGzZ8R6En7T4veN{H0VUZgfnDw@8gZXhq-of0Ps*+o^sn2>~` zmi%gdeilMzsWRi^Nf>ZH+FepWYm!Gs5G%9mWuZAy#knCIHkn(@rKJ=_MP+vpo14ap z1>Gf50+*UkPe>>lTI@_gXEEb4@Z~X#ilSyxX(28wf+X(IUgef{4)tQiUB$F^B#nnI z>5*Jv112(bSwE_f86T#qk%eX^3b9NE9bH~hPb>iC&Jvrc`%AkRftn?+!&R`eFp3l= zEuGKGm#_sWZgQ5oD<-R~oK{cl$m%W3O~JQkwdCZj7IWF;CP`LaQ&U}L4zfg-&{;JE zKDj)(R7q$|7FI`V5GJKkKvxhliXK1vu-(?RJ-@!UL&0wq%;g_e;L`GO1qg$OuEXZ@ zvBccOtSki!_qg=k+V<|kQ8BuBrcROH+tZSi*Hv4b9y`*+YwItpkT++~5`>DZCE0tP%tBfpCwoboNX$#8p5^CDT@py1O&8yt6B?)-F za|guBGm3-Bghr4$OkOmQRaJU>Hn$1Oo7^la=7S3YtPshlCxeUwnh_kYynnu_x_u55 zA*PmHrtkOQ>t$t1MO}3TbGt%-PL>M#b82fc7sl#Fnc6vKbw^Gm`k-NqFx3pI*q3$} zDoX_oDKXSmgr!!C#;P+DQ#Gx`xvA1Jtm5TlE4!1PIhi-DLOOBUOsZH`!K|he8mdr5 zXhxy9JheJAvZt7sAgd0dmLbiv_iM5#e5t5GOBh_JP%Cl^Vr13W+*WQey)z=WKv01n zEuYBm9VN#FG)1@vNE+u2y_eO1;hk67SFG4?B)?L&Yq#?U8_o*yz(#(?x!p) z9nGvRd0V?&IHiBu-q_Rj%vpB>eFx_4nAjNZDSl@6mrqp z!pXw&tofv=%lTwpO>}8d17j0t+-JeX!z5wR{B5L{rq2`X!kEa z{e1e=x!+uk9W3}2j35}#;gV`-|N?tb3rSIZNoR%X#*h4vYt_SP5k5Py^4(1wnXSkL9d zp=<*?kMqVq8=X3F-qzUILjMl~S1Vh+Q~LRZg;nKr8&eOuua&8nkpaf<*R#J`TA#g; z9EU+g*cuw1{Q0z}aZzo1o~S)B&&}J{1VAF|{E;#vQ$trv%ZOBCKQkl00B?6+gLAGS zG00>seE?66kIZxTNky!~ZU4y5WrY-}xdq;~&W8F{XHL1EwLI%&pIyabkgGC$V}qQ` z%x(3HO0TW0S5o;=K^aM?ObZZ#?_{g*4DK=_lkHvfjAGMF%)Gs-2niWyK(X_4MkeP% zEnKKx0sbDB{LC!_reBJw#(O_n0k&B?!nm>Hj9 zdBM!X#xcdu6mhR$^{0eJWf$W^3v4``^Dp?6I0ZR51!pCMIoTxorKgXM&d6A@IA+=f zcFSf`Mq$tB!d(?FI4aCCEZ^J2JJ8)fI%2chGeN4F`NF@lR5y*a3iR^y3cgU}aKZI* zqfdTRP4{Miqc2FP=IrTe8XFz$??Y>eM~4Y3i~LYENRm%%>Ojm$ZfJa%SFyS{n#kou z^DbNr2~75*M!MlT*vmP^E&lf5erXkla(SpAImNxirQkx4Z*+jEWl*T8w_kO6nTv^` zapgc-`z9U}hI-eW7nbL0k>EbrL7pxv@eA~>j4$`}4+ycbayEB%bTHA^|Lshql?Cv< z_?x*qf{|P+_4aag^-M^ysbofm2bjC)frDd055L4pJZETJnCVsJUhdo2R-BUUVp-a! z_p{#VQ_cn_&gjLP`1*OAH?%g-Ksi+s@h{e~Ww?*knadN@y9!m)(ELhx8kG>06A_qU z8kQaG5bJ8;jS5Rvi}=ny$S0VAqG8zfFf!{BGY2c-T2jUX8rK)=xC7|00h=72IDeIClC!?Zfqkgtv) z_<(AGAnRBGa3;u#4zq)SX&_JBv0{K21mKkoCjsmW!>>X3xDEjWdLSYg%!ejo*sYUF zCokv#0zoR$P%791T@4I$ zh!z|@2=0e$M&LGF+|^do>%;gtd)1x@cDSsOg4a65?T{~K=C@uov9f?;^H1$6$_ zO^2`?Y%*l`|I4bA1oDD);*Zq_C;*YbO$%HN+(h^QuH|5vzx;Iu!131U0n7t~K|eed zfSt}~LI=9*nh1}Z@$7@QTk1jW{1w*D^Jav>xZZz&Z@6+*_;UFU@|MKV&d9qy%qk9L zOYBkU)OVra#*Y@7hND?o@O1Db(^~KJodkos!JS4Q%b@tAj09M5NW7(MQ`G!!u8Bil5yP56VV~_uF^hJlyRVIQ%-(DqPxrFi6oJ z&Z}`xZkJLNG{ueUFEE|=*9UH1;Uk;Z_`7|)o7#c#`c+~p?dev_!GngIA`VZ|LE#Z= zk+pBHmsaMeJFqC##=sc&nYO9r+w;9EBW!i=H&WxrN7HM6RwFNONO&*bljdF$x)rUI zm)O>a_=ToA_3*&K-Og>9xSP`2##p$GZ)q7_`LwqvBQScK=t%3%7vj6U2Y+5?j6Ws+ zpek7GIr6@$Nh%+{aZp099cl0G$KF7eX{~(n*q!??+VD#0*V(!$_Ts#Py8DDLYig_K zzN}NSXd{ga9R&H}+T-mFYUj++XSGy#x%JBU-ebj%Xzc4&ua?BeayPMv^tXH6{|X(F(`2%3gP zvy`L5#myTx*5?;?=XS>~KUoJh{X<6cK;P_9>(~8#={TErmtCjoR48#IPHD+lKbiCT z$u2|jXWK}}I}lVbcbC8aia&^1kv*Y(dOgE<(KO2(|C3pJ`PR{sSus(8yL+|&9hQre zKYucYpIe{2Exq}!yJsFDzpq>Ps$9FXaAU5X*|@c+n7+xNZH{lZ9AP@fyESyyE^(!4 zU)$0~Ym)H$J|D?j`@V0erNh^Tu&s}V$1xAoJ>9rP5k;Z+f!UygBI})lEBE%K_#Wms z8LORbsqH#cUg^3mQpv|igCCcA23TB~jH{lOzgg$ZNr<Q!uE8aBvWoS^%;X!A(C`?Za#eoGj;+|f5Px%i&4HhIvpvi!Y+HTPL2nwQ-~)`!QA z-cjbq--!B(3v;%5u#FAd3;WNzFO$hE+USc#`6s#LLlc#9e}1r*`}NhATlA^6JA2Js zqL#q@+Kbc)akK*=e)!Ag_D8XVCGVJzWTPW5N=HED~>A3e;%>M zR2_p;L*GBXQDR?w#BR>#Usk0SP^_U)RBO_;m z+Alx~QyaB(J|Q|zN~)~m#F5Z(VZbEY1{}Gi5@IO5F}5LDUMfk>3dM()BPoTQ8EjNo z6d#9cj4Z8Sp;c-LEFMbzLj zBPoq#WDqOOeIcw!imoYT6(r%N7w>Mbkea$w&E+{6v}BG@-CD@WAWbw$*d^H!vDEnZ zqSew@!bYW9ojY9HP$-sk#Ib8jBbc24>q|1@GdoI|&7GpwRs}hpo*JE#Dwj9q<)k3_ zF^Oa8h1D5#gf};qw{G9Mc6oJY?Z(u?{zTbMxh$)us+`(Xsl-uI8ObT4xfFjWjBZMKLzRNmGh)Nrcvu+0snvXO#JwLpvOMX@`$=;E4Q zjGEL?T8Yn+$ZPxVY!ErJD~eRQ;o9wo0*(?FSzOFKr zhF9lgGCS}Db$@=Zpeeg3mzhePlY)qYYNlM?&`n%YAiX8I`-orw&lnIgP}v;>d}rNw zHBVh7ORW}W7G`8&2higB9PJZTHf|<~Ute0@*xo&xD&Z&*RqYBfPdbv9hRtM$)MKjz z+IR$nWVcjT7tg6H$u;dgef7vtZZ0X4Hm@z1sjR-vOh?rsW$iu9{7%!Gr&_$O#InjQ&b9*H0Qm<&+c2b6L&FDkQHJ z)zL9t&6pOIBP{&n(8A#>q_lvlARl{9)ngV(4@BysMqV8TT`RJ_U&(ZeEm2 zW#RTFhCUvS&TdBMFW85NT|8}~fBFxj5W9$r7FL0m+)p{WopL?pWN2~D^f&7>7Ko{p zm!6HmnNv3AX3nSL<9$4`P;tJ7MtZ*(=v$vQw7h6)WO4Furk0kr0D_oa@-w+;Z+_9z zPtVK3*3RJUX-jusCtK_INM5Xkd0;p$clRciA|(!9zxx8!x7d<3Cib-ObUG6XLd^Az zERC&xIrTRyb0d2jGrGT}y~PE68yhnu5K~^17h>uW>7I$H2r@MeFuCX&Yz)ez{q2mM z*YEDp-XVSm*wXEm5j8sGsHPZW|Ru-%PbOI&3fjnYhgJkn8mK8S+Gl+FLC>glL+3Gy}$MM51D zq7z0pDb*f!4nf%$Po4V}SfGEmj*iMJR<|&pWBpA|+FtZCamZiTd~|IUqiK$c3UKoX z(D!t*@He$RZ=Vv2%8s!={fE7gnK#c(;eW}&#?#Er#vULtzu&{+>mlbGP^72y$JYH-oi-96aC&;ZdtYm{hgV{2Z6d9}B=b?45l{k`3-yKBq)gN5s{ zAuc{PmOinzZWcCX*>)xu^e)DTg({9j!N4E1qbZW&JR7H&fV4|Vfet?Y(N4kPm!j>H zoibeTm4zvjsAPN3cq_-?*rMt(AE%&8N=;IkrE{Q176xORlo+4t7+d0MAA~qoIr^Z2 z@o53UKCaG}3adSnaGuVoNvYl_r__ctub3=+MNxXJjf<}vr>VPtsxBk1xH}7JYv_r# z3Qmd=rK)onUQydg7gTK>m}`7lOIR|>Hz3&G(mylT*}p>S87pOY@G8?Rtu4YGgG&Ou z-Q1E8d0TgFsw^=@66Cdngv94YRE7juxK~DdVr89~JZaP=Z{GkLH%AkfoaB6zUBP{k zn?KqvCELOhEszVXLu38@3ky||9w|AFXF(#gvjy%JmH~$59_!g7Oz?kL?1E&UQaRS! zwbtDW;~YyM+EoQccI0`uhTGa2{qCOZYx&E`UrpRkp81>p#ozpW5RbCToUkw>e@4kA z&x=*o_G$3~Ge;Bi@?>j6%gbBQd7;MV&ITaWs11bs_+5D?;%a1JWoPU2+b@17@q5$>O}(1cV_ zYqrMsKKzJszL3Ij`*$6#gs1_c4G0@_7!CMoSN%PW7XTpu{Xi52vQ-02^Ivc zAi?9M0K+d1piSV84>YqYX!bba7xc*eZ7A z|A5jS^8{vZ$Oo)~T=m~|s1Pn0MqI;8Yw!oJvrR*3p)?Sd{_|e~L+*rQBeiZM=!TaV zAUz(`-0_NZ5(4wHF6$le_r_QM8(^)|FC?bZDoim33U@(B3fiE1H=GVS;UD}3%ysVQ zz}wvnt{t?1BL;>0yM~U3>AvflzzDEex-p;;I9tG1oqXT{uW@v{4x7M%AXdfxogF;8 zfIb|g69z6Dd;x0*AMgn3FftGna@R=)lKg=ekktU#yg@%yAv~_24Ja9&7NBaK_dS>k zsOxTMz&^pKZW!4PP2Z3l@JN6R;Xc8|{sT0I{}VW_P{gWZM{_=%D-+*cS;s!Uy(1f0 zf3-2F-csNFtmO^Ju-HM3yuDMjO(jp=$I9RSpsle!A&Tz7p6_2@zvGuvzlh?;+s`95~Liz%T!x+(ek ztwXuLs^Q4HdM4Mw*Z{Kmf&1m6uTppSDtfuB2zv<2RCmN&sCbk`<4Fjb!>sO@T z2Q-ruP~Baya`Q5+|EnCQ=JjBw`pC5#+$&3>%b(s4;MFbIj!D|xHqj_jw|JjKo>)}2 zZ8Xc+%vlZY^{Dza_WHm?`>p51_kZ#(*NPvjd7Bf$&h56wE+s*_)A_Y+Y^kxex2xxJ zt57KT^5MFg)(lMSJ)d#SSSG3e$?b_(IbQ$#JJZ9O0!{(37>+}pt4yfsWA-(P+;{q6(h z&Di1-%KOi4E1lw_Z_ge~^Vf*&Z)KEvsibS;iKOp)v<3UBlU{@J&g z=j3N!#SFfnp4ij#{QXPmP$PLxGvBs+>lzu;huo7q;LwC1Xkb9u{k}*1cKmwtS}R*N z{cQBp_El_e%_E#*X@gR5ARa6b^F^$B)}iY2lg{@I^vUlcUhSGfqT^ZD6iN>xgEMQH^(y)89{(U6kax{)l; z?Fq(LlL^}TEOc55!mq%}Gl?jAbwoyCTrGAwrwY~3QdWa4Xj8VTq{MP&oKO}o#$&Rp z34BR>dTx3OfkI47ODU;G*kWvIyi6V)kCd@0aCAaRQdUM%Vs|l_piYl#Oh}8bD~Vvq zalkwk_Zml%_Zm4-x%s?b3xMUu(%%9y0+5R^PGno=BepAv@ z*hKFUkeA5ac_jo&MOHPtnj2LwOAbj+&_pmYizsbnYAU*aP(o#wKGB3CMO9r*IZEk} zn9fKTkRn}4xzSCE#7JUU{75RHNHr-Nq)e@J?3eW9Mq>jhAz`)tY7$YL5fN7^&QfX1 zGcJ|JR@cZAlS5;asm0|od>$qxp*}mJSrS3l(#ZW(3OAuo%?{MG61eqAWzkLLBML_Q zcnxQ|V=gOysF#J1G+UJN(#qNL`1F)CZe37DW=W(hxIDG|V1q$ttV(mpbP&Xwh*VcB z9%9xt40=|J0@c`BUMye~Wu%u7=xIde0xqr!)0p2h#2naGsh@ur*G}R&Y2BnWG&?q- zT~Q-0&O<_Cni~~&UN6^)l9P(aa}h{q-rb5Ga`BX|Bt7)0B&pP^2BRv zwzg)6ws!wBvoqiOzW2i5n3(hNscKQ2951zeTzqvNNK1v=;>+Nntr>iE!Jt%4<4M)cnOtsb$ z$%9e?bp`#DRKdaDM`P|4V8-RoX*6bgB9fg~E~rRH6ctNCW>*OYota;!kYsZf3*(DR zi7{kSLYXS3o}aJ0I7iQ@Mv{qOBSkezfS~2FxOkSTuu6z7$c zwXuw9tf^=(&J;5X_^k}G3Y%WmNuNaoGrj#?&7DmwKBH{o)nis+%M`av^^(|MQd7kl zX_8zkQB8^qWHXDk`AwS{ETpGCv7OaWIh{V1TR|DDKq^{ff;u6u5TPU^%zIc;VRd!e zI6oy1r|52<>5(XDxh2%9e2$P9AI8Kt(c2ai8WdSB2v(iR$ds(mISXJB>)Fk}p;W+gNqDs!D!* za1f__(>7}D{{)~>Tuc^m*0~>6>@$TkzRAJf;jG}1nQ!O-IOKP*g5 z{y25sO&sEU;ljC7W^U(C80nootK(x580xO&Z4+NpQSq~g6_AA&X89H+)W>BMXS$nO zc-Xs~vGWA!(oR_)Gto0J4=`{DEbEXEqWzt3rJqF%+!~9Fd;?%~ zJ$c$nJ3GIQ7#MAB5@>MR!~Lv7Xhdv+m%pPWrzrB6m3LBLphc8U1ZtR_&uJyL&E}T7 zI>$%*BmUJ_x}-wxf~TJGf1LD;JYjH3=aj=SBZuVG(O{>n{%lbC%0?^Pps&f6C=blj{hP0s0<>LZ{ix|fZGp?+DlPtN1Jcb|T_`QY~S zje!c0eNwcqS*Tc&q(}_XwzYDL3vElZwQ^T-i0nP;4;rC?a1SBOy13_}ZxC@2kzk&k zoPz>f1Crg#Q!}~YDREvt*$FYWfmv2Y)&V{`uHX!Rf>TnQT~b9^q+?W|wQqpEkF#YI z;+f*BYv`5d;wNXg0V_r#Sl04qttthZK zBx7u5s+lc}OW+dx_y>cPC7h)V0 z66u|1mG2XqREdv|kx|2fqWuEn677)qrJz7pXP5NKGz&*h%9N7QgG$bd33PGsboKT! zK51$e8XUtlbF(nFJ#JO(;brX@6iFpURgf^T z`96_W*^yddMGk59>L5L%^Jjv>!wn27AD5RH|91YAmSbk_P%d@8`mt{`LEB5u=(wSs z(FrpnGgB*_v!~8lI#-0Y7Km`~Ijy-w3GqPDK%0t+wX-n^(GQD?DYGyv%r`W#3<-}2 zV1jx(twS6v2=`1GcpC-y6F@pMfQRtar@<8>2n_&-cMxyDI$khN2sRjjCqO^|C=i6F zHK+pQssb@u2>njz}X2JcIpD0Qo@h1F#JMCIFnnh9ejXkPVE7 z!(HnC0bq)TMr<06A%*!VqZxE6_oM&>$c_B8R8DPe2R6GX$s_ zxPFA$0kK96*rh?35Gz6hA!LFI;o-h!jb7jxY_~pwTF^Cs5BPyK$Dn&42nLm_DuMC; z3ZXd!c0f5G1^7o}5Lf|#*zLcfvJe2nlhFTic2vms&S1* zaqy%8h8hh)iF2@X8(l@K{1=EEfub7z(0w3rxuy^qzUto~RMZFtG*BbR8$^?js!5}( z$Ut{kBpiA|<82rph6m_DA-5yf|7pI)F`7s+JWH=R>kc6$$Oxy=97eyv26CtmuvfFx z0aq;GS$hcX{~o+1npcUSITwB!h=8Q<`sZ*!1|@0ifNs{jR{sKL7_b1kL5~A}fQ1mq z5<=3HqVTo|44V+lbmI-i=N7KPBb*Q{1 z&i(Wmd;HC%!OIPo+uN@^s^`^_>*O1EKixw_tJ|FCva5G*FV*gne~yDnL!Y1oX~n`l z<;{*E&Oq1O(cPw|xpirCQ|GJ3SIWJ6tOtnn$4B8OkmIbs_WfbqUKf9gLq%RH=DzRu zP7U;OFRg#O^LBPkJ=8EWw0ygM>w&6;px&f!Hz5R~{0atx9k{eOD->XV@!IF=IrVk4 zgXWo5GN_>|7*yRJ<5K3xL)Yi$6%u6dUB~w7ovER(?^YLo5w9|&Pa210ZyHuVAY2N& zZH2=e`ErP~i7B%$P)wgncvWI(6xAW!8je}2*Reg6i z*(;Ygn=K8i%ixa5APmqt=4neh}dTS^Uu<$3C6(EPB-!9sJin9{^d2)90#f#Uk4xdX`AAh)0yVSRSSxli53(C<;WtSEF z2d#whuY+TU@3xt;&TdTe)m}>Pgq*cAHXvIjY&FdF-F|!RV^{0k{$Y15p?&<U*m1_>0n}=VGd$fyxw9Z#O);eXD8WW2qP^&jXOIp zrhc(Rs!eWl6GlX7mrFM~y0;L~F28P9bpWE+Q@G}xshL{({5=7u>8E6Qjm?#}hz~KG z-7h~|M#m5u=HAR^^SrR9sZY>#Tiqb)=gFvhyRy}N+1BTm`&*dRPW-~9ufokw`|oBu zhHi*PU(A1fyv30y@6)Kmz2C14@+jMVya(OXujGr5`)@NBWFk%r`<=LV?sb!84yC9h|R z1g!~OSOP87pIKi}Lk!`2#FdFED>E?k6jEwgR8g6#oPo-(CS>I0Vdrw0DQIpI3yGCW z(|cmjnCf_WV^#wJMNf|l5#)S~L5yjT*cgTpRHGBT1&@<2^6COtDJf+$NA=S74^ zWH3TQ!^>$5dU9s$SZW2QxS*DUUL~?Ba_E&kdH6grF*}A3lufN978S--H=}3-kn_K( zfkJK%<5Q|P+Iso76vOjKVHJ}tD9ERek0dclQy9$|IpX4!DAcu$JqabLR865Za+Wz) zXE>!r2+t1`?apYd5;mt-mzK1oKD=L*PY5oLq>5@%+8UAy;?v6qYY2FDeNS6-b~cVU zb$6&CR}?RpP>^aB;!r5$RJ5Iv!ynqM5s<>8Rtq?V$B z{P@J^YIb_oaEE-Eg%S6uSsjQv6U&S%zRt|f!j^Va=XdqwZ7E9GosF@KC zE)l5}60^fqF}an(wB*FD*;_9ky{No8S(iqMEs`;+nuj(9S7o)7M69UeQk9&_sbg`4 zoJuTVkMK|}de&SjS)wo|x4RHFD7ubo!lu!=6^scHpD;tXERgVF_h%r=tuamN*Zn@ceFsV$z7td~#a4HKh z+2v{d*p`aXyL`v-&kV-7KeJq!d zf{dt;jzUz)w6Z3bmQs+5qUVhFWec+9Squ(u37gv0g%z|6c2hGe5pFSictN4nEZ^?w!}GZWI}#x3Trh7tEA;6S5P>;(W%L0iG%@u z3ss$+nM2B|ZKSn`CfZap6p|{UK%H0IR9c@vMvxUTtqrqacWc3c=AP^3_kDtnqom z+PG4FRck{>F;_B{3UVLxv8ocI82NF-`0$ph#n%(}88W#-+#xuiF}hYur${7OQ&CY} z&Fm_%WrT}cl*$lsdpCoSM=t9sz+SpZDeg}YGh%gr)_B&Vrg^%Anmi-S_VcJT#V10JMJE1 z6KHVm{5f6oFL_&YoBnN9371? zJY(t(QmI{VaO359I~p2V|7LvbjHO4mzt362bGnY&)cz0?lM8moY~1ZFa~*X}&YD;! z+; zG^{FYAkoIn$L)-#nU!ITu(9Yu89e zGj?lRQD>N=oxWc*>IcE+@%rbA`1E3TkCN8n=%N5GtI$+;%gE?3 zrZ_1jp_RIgE37Jx2uX`Fv-j|cGBtPdOSDV!unx5g_Pk)_|+a#4$a4>y&8R4?{ZU?6;geb95pC?F;V$J=bPa7RD*b}pLLBt9jO`2CWh3g1?)H{2pR7}6 zxz0`zb`b_O=_nKTkUG4cR`_^vfSLVC6Bm%uPuIZv*m3i~n!*y0L*A=4#>W%wQkihc?_+m)ahAvr_ z-e!7dPUxLIRpWUqD0Ah*;!AoqIN8_7y;tsu&kITl056}pft`H~H7Fz}(2kr>BR2H4 zCiz)LB<0!1CN~CJ601)`cmqBf`~Yz(KrImefF=z}fk+Y!_6`3VXoNHxkOY9x5gA#N z;u$70gIELB9V67x0el0)0bdRL(6nowKuKfJ`QJbs8x+abgdZVz#epa{IMNL$Ae7O_ zggcTo;a0#5^Hlg>YSCC{O@`JlKf`c?&s)vygbP&Dbh zzzq-s2S69XENp=7|NBBX2fYeW9cTsc_|If>pa~HFPkgB>=fr{_P0F zL+&69TM47ekWj-9rgMks*Z`5HUo&k-e4t)HBD?@w;3jvtLE+DmW^gJrxjD{r~nWFH|_)LNmU*|sUtUm zgV>M)qIS(I1ayQQnjz4WP&~N8FMPo?lyE^tlbjz!y20X5&2K;^T)u#$M|xS*Q5p#N_7Y z^WDiWvy!DJGW9ZEd56;SX-C3d-xcn5%?b_$tAfwMrbSF0b923kHt_hSa+v-~t|Go0 zxcY&q;1RDMtbE14#Erf9%;2e=C|f%$L8M9u(v+ces1LVU3)7cGrzQcMpzvOgDvyZ z2&4TWRxyncTzrRNktuY-^)RQaXV>PM@G1cU5IR* zxhozi$55K4Ue%J`*RS3DQ2%~}Fx2{zK-z8|f3WzzjVQRpUn75berI)_&zrq`?{HbZ zI6cGY6|q0RY85@G9Y%;<)0FRv1M0`07?|5D1HZ0byvO{GFa%e555CpjmcLkjL8Qrl zu6`CBPEHUQjhv<0g|8U$)W)lCR0JH47ySDEYHIlF<8=(Jf3cg@GIaGZzUiQq%DMi& zY4_?5_ZNZFdt-iaezk#o=bN+=jVUP2%P*TOSsQsYckSBS{qNT~KYny~yxNo8Y*~DM z@7nikYuuKJA?)|h{gO?5-_F~IO@u@F+e3B}YidS-yxW{@Zy#nHK4eP9zet#&~Z-%h=A3na0hfpE$ZyeQ}G4T^96HX>9qm(e-PD zuBoWPmwNW9S=YA@$ID{tbBfu`;oWKmeVAUR(Bd69g?nf ztSrAdRD6?3Fx<=CD{s|Pn47Q1_sLS)Ty4`jmRrkZeeNG5_Vc9oiH&vlx4ISgT3^>b z6l`4Vsb$qK{<=M)Xd8HSxI}z9`IIuyyH6bHxPI^X=xq{r42xs&k(ZZe8l}8B>QmM> zT7B&axm)#pYm)Nxa>MS-ef%hUVfS|3{I+_k7k@zFtscJOiBz&{Ei?1m?8Cu9kT6fM ziQAue{2tfIo~cuiKD=6H*FSEX!CrdZMCD%|hQHCqbNcCY!yNXObI1pGSXyivW%jLx-3-8U^TlfB_}qfPEPKOZ454MnoG|ui3yUR z*ulKSYIICOHm^1`Jc{dGtVB8}Dk(Z6AikuM(gCvg^O%jLMVO%$ks_8$K&h}S45kL( z5*a%6O3jAT%hoS&7;8&ee* zc4a5`j5H?~=ani^r9HTOMO~&ayi!^b6IGE^JzFnGNKd7qGSSsBb1On7DA<%mRU?%d zIi&c87)D=x#t^1(xn8Ww>$vosj&7X7`6pooOcWjyTaCfzRiP1ZU^u=xCmFvU7E-{i zVdTYv1nt#XU3ol8T5%StFoRW}O;D9a3PCC8JONTmsc!sqTbfZ>7?YnC$x=07r0oUl zob-D6<-6=QS}Qq$i^?n_A?T*EDdq&0#St*ObK^Qo*_5vGZDu@vL36E%l@wLplZA;+C@qhk5Ri(*{VDN{Qr37Ky)nHn zJT|Wm6wR($CU;U)k@0z5wBC~GdXUCEGmeyu9g0oF)0+Dek@T#jOm%BxRnTYxKIr{Iwa3RQejS;nJ|r015`P$a3*^h`{0 z4ysJal+NejWvr%wOprglm?&szWbw+8hKcFy`oijpRQ_m>029v|>cG9L6sG5>m>b<21sEmDf_h$+owhM}_Xo#Pd(;CMkvCiQ9Y=B z{5qnV+%FXpXS-Rkoq`etOBRDkB(pi06mdDJDih>5RW$P=z>W@LY7wQIbET!FvItwn zjgXXaT7!zqNg3tn7mud|Rciy2sOwKVnbkvW0s8IGa`{`+)KIh?V?Q_BFgsw}rtEbhO zKSC@VPgsCzMkh`i2V0#uaoXxH=bfzFEkcTNoX=W2S-3|TAoe!qjyk$NbbNlnc`FM; zA5f*r!rI2|)bD0ie>2z9arE>!bLyn?NrS)q^|;Zw<7Y3NvGVXgsbvPrin*UTcjDx^ zGoB%iI_5gscCsKF>jYoJsJIwYM_YS;eJ^UFTSS=SljAGbZ*t4%8LzuJF9PFXL#BSMCP?m zYJ&>j9xfNs%?MU6)O`ju#A*Mp>ul_(et}+ai%hg-N7*54Q~4jJE1rR8WYU zM^QkCePVLXj=iNn%5@MI)z&WY1%3{m zQK1r=BNCchC=X}H3lZXYh|aUWw{`>77o@%PO9MK@-4hjdNaQ&E{PC% zJ|WRD!qNGHtDc#;g`tJJk)x6OUU^1NFxcjC?8N!wx^4(rK_>+z6a_n8l_u=zaW+;PBttv5hH*s*#4GRzS4bDg>f?@^Ds9t((jE7Z*v862) zLj@J5AS?lx?0>)?So=v+yb3}wh(ACZ0Vc+VKmr0Thz$V_fr#ZO&shSLMK+d0@1ETT3NstO!u8EXtJWK$Y%rxr+8fR#*D!v93=Yl?m22f$$ zY`_J8*53eL2cp0{LDzyW=!Xvw7E<9F1=NuU0?ryCuwWO^UBgkM9tj@h2ap{sSZH(r zC>K&5aRT9N*r;(9unMwJ zs{VldfIz?L4LgWPA94u>K=q}?IH=eBp>+Pzx;0WQ=8-$vt>?Ehq+8-Dr>Qy*Izu8jy8So zkWTZ-(u?HrJr&C{fi57daiYy1o7DZJW%l8#mYktb^Lu{My6yi+f7Of^vRqeX?H8dD_w3 z*r*y;?*3StZNGmX`}y_$4t0hoy7L}$9bbKketZ1Nl{Z%#kq$b7+!qQKeKi z{qf!Y%%AQkn$50G9QyQ%RfJPhm(Gwwssv}6@2Sxr9G^vF3LgZHTO3c$40?H(%MT( z46|WikU6u@!;l(!xp$Xj%)ak;8gR0@FXH?+aqo+3B+0F{ zUu`dE>c90!Uh~H5MGyL@prU#QR;_3q9k>W~*b~|op3F!k<1`7aTR>@@pf0{>f7o#i zY|4J}_U-c@h%+;YI_2^{{q|{q>`Gh43Cx zwza>$s3cJaWlVwM=jtu`>#L&nCPw$iAtt__d+YmxV*ftwX=C%DxAa}3o3{K}**aYNSjp<2VG{4Y z@7uu4ufPAYy^Eu4tEBHQ)%7esMT$ly^4qCcWx2S$5{ZlJsUyfU3xT12a! zOh;9;BSKXnw=1f>93Pbzt6-01HmBy5)<;tZ+vJS!gaBD%OIR3)OQWM=1k~tgaZY)C zDP>VUO-tp+6%w;DLx|ugcvzr}B;}-#bNh=^3Q}T{Dk3T{9=LKuQc==VS3^^hR0 zB!(N`oSZh!m2?s^Sfvau9goV*exwo+O3H|({9y^XSTa=k;{MJKRh2{yZ_i~Q1?|$N!Z!A*dO4$d^HRy>mbgMic{#mv>uPUN zay0m7svt2uW1_a=`uNuM`PF8%I34T}pp+5{Xt|;o9yPjutW2Cfm>3%_$emG^;CZym zLxYVe$rLnFoDrFu+uD9-4~xhf)WrToE-`}yGLcJbE5%7QsqCJi*oFcYB8o{SGAhtT z?7XyAUSnQ$teS--_7rgm_p28GUZ<6nBuj+K(Bd5op<+ZyJscXVea)iPl!9pa%dNGG z<6D(g*>ZeZ9-2Wxu~a#U85j;Sr9d+9YibbIax=EIY55Tsbn5o{F$)+YuCZMXj8{BEx;ST4q{Gb$(XcP&QXqnpuR(i%zd;uTRR7 z)=gjr+HljfqOLMtd0`{7EIGE649=UQh0PsAWV9IHb*rbkl$2hQ$InSds~Iy>q~@a9 zyvDNb@g=1Sso;}C*yI{k3|3m18C74AiDl=O^~R;8MMp}&S_|)TVQZ{HmZ6I7Mymw0 z?Ou9fCcQipMVX*0Ge%|^+}bQkzZyv@OknjPX>3uDJS(>?kCj7Asj49>qX|d>hFYAO zk40l{Zj^DG>Yoqx<1h_HG=6b+aUQv^JVTn~%R#A&c=`0sN5hOTS!EgnMFf`J*8b0z53Z8nCO(v%lhLrh9(S>Z^M*ox7c z-5m+2fud|RI}gk6Ln5;Z?6VW2ylg!{J?mpSNMJ;YrAbJfj~f!{9q%0)L2~m5i8i-& zv2gd(^0l@*c6tf z*Hfx*en!ti=fX*AU67>gxPz6WrJj#*lDWRNp01VgNn?vYoLrC~EAs$%b4&dMGwWEt z)7Dl-Hddjg4yL97z8>B>dfF~$bhOTC>HTh~qphR$hweEW`+#U)Zxgfgy3YPihA!vK z@wO-Rj+>rx(6YpPZazXpVG2aYFugtUzN1~N?WR;t#U7Y$_mfvY(&-gfZC-cAQoj?8i z|2lhK_srP~rjBuLNufTcPM*{HP5Ye71ziJ^$hf>*P)yA%KoZaMBYBDJyiOPyTO<)% zvp~IyuAFWrsF`J_Wnp1**4Wne#CgXIXEs_C<4?f`nj3l&vn>(b=%`4`#FVZ^v8@Y+ z;lqeJb=ub6I#x6@(-x}zyN;>WiL)2{DP9Rn-Iw+*E~(m34uREyQI<9qRu^nf+j*Z$ zKskk)M(CY8ZEs19F?H~8b~3YYJ^s7l1p{-vQ%0sisjDmAZlOrBt>1Y^8$&O4XL*u` zv6qgawp(D(IagyxBt*x+A0}-JGS-U=@iVp5j|&Q{UDN6D#*embkC#ge0t7N&kFfb7{B<1pTAKot(Y=J?(r#EX?d8;u33G?c*1yXA`a4v0(|Xh)VYO-0B?UgM_;efQhWQDcwY*5OXb)Aw6`m_ zCd4n!)6UAyIwRe}GuqYJ(caEb+r}?ZN7pMp$0Lgwk>_I>;1}!U9+sMKsUKScimCY| z^95;$A}N@)p@?+ya&@vVv@!PO3#KZ3Lv38m!c8Iy7~a07dLZ+ev8#8$2?I9+1Kj{a zZ8J+f<6?aSech9uo>>*bfe7Xq8!P>Cy@cZWn&kGn97ABVp-p_MgS%N$H%N?WXtX{BQy1tRND_FDEwL_=bqVV9Kl2ksWTa}!XTP3Oray1S#)v>YB(+25E_gZW+J&UU zRN4Tv0POP*5WYYd0|DXR0hj@zc>tdgtAB^k0(@cDpJ+vcM~>h&fLJi*{f`j4{27IY zwVuHUh@y}3sr?nA7mXOut^r2y2X5*Gzp#iFz_FSW%tx3T%G2N{$l?D$2oA9iqy^9l zz$_v-Lk!R2LJS0+p)vsG;44i4%mQ!+(10eWtR_Yb)P#Tw_CXGi7LJ7XkP3(Z6_`O% zHOLz7m0K~i@HKfq!4sQRXJ!%1s za6J3~jwc~8v=0D84ZWsa11w<=#Frp;OaLmtUNo&5M7yCb@BtbJfa?E(27vE>Ihq9P z$pL~RIp7L3g!mNXhSxMhLE!xW4%OHWoO)o2Nw2wyUwBjf_-4z4CZC4dJ2bO+ym1WG|ckORKP2y_BE=pHyyGZ{cp zC=aj%zZ#BEipJe=Du7B@@cnOK%?Ko8hsW!oaHs~PMx!-Iy>)uz0AHu%jy>$$TD#RI z?-?GRCv)~b-l&so-Kdk+54@xi_v`BqdPrkx(qqQ6D@b=k!}9#(BjKBOL;Y>D#5ruE zprK!Qld#WN{<8Y0cInB-C0Wlbet`3AU3mTR*iFgH!|MZgxT{kWzcwiMXkAZ{CLDLP ziH=zxcrR>0t~blxewNi?mS%<;>4OiRsU-?|-IeM3`9;;z*5t~arx#oHTOSR6dd8ky z;LT&_S|*j-i=-|kbL>a|Qd^I5k_O6sZ;HP$ukhNoMRh+nTDsU>cfV5B-`$@Zr;65B zne$&Ujo*maS39e-`{-LAZr**q&D`I-3=+Z7uN|x*_xP%&^+i#0ogB}oe?Qi>)%vS* z;>*JB?n44w!lX%;_m@9){@7oVP!HJM&${|Mc-P7GL$Bq;hhHx>v^{G*?0Yac*NhkR zG+gPy04O`ley~UHoYe>=0f+%*4AS} zkMxjuaq%sN{$*%xr}K?c)bp~9hoQCIuU)>QZW0jXmF-)qM)CjwX?P(bF5!2noK5Am zRbDM&uIKA#RU_?={7wr8c`aUDuK$61h|unQy)vbIL|5GUw#fLxVR8nDKatCq4?Z>$ zdlX+=siXtiJMPpfXMFY9g1qkTPad|GfS}fMy9F5fr_uKh=Tw{O{95^B6!k7do|s?Fw~&xZR)E>$n>wX0^y6>cRDA3w)Z#5YI$2fm9uY=<%dgM z^DiGX?e$I~gd3Balk>Qiot~As`-1)!#^TuXo03U3((vHX&&y9+q_Yyq;9X=pEq^!-}ZEGIeS2lNxSU*25uC`pe zvf0te-(@Xe+i67Rb1L-Imsofb^#^bNjwr};z50x#n>*mrlXrx=;;*=Whr%THf&5n(rcqbt{)B!y?)9 z)~>C`J0uRLvG)f15wd)%UbXW|I*ClP-g37e&8+s0biEK_x!)gfnDc|`)`tXSW^eS( zqhDNcr*QSFkTQ9*>#*V701m5MBMs4%wV%}+{0Db#F0{7RwNDZ|-c23czq>l!&0M>^ z)z0pp{WvCG`nth+wS(}P1XXecE{EP()7T)viTXNt;?%;fVc;f^u&D+StCJHYxjBle zL_&3vI%|L%QI?rPW|ayux@1*io-B?S7$1^Ylv3@@NM#T3n$kEU)0~{jYM;#b@yP-e zvy7jrY9GM&=MoTfA1#a?RVfQ9kIWz@`o=O-`APW*7mXh7%*ab%Qg8+F1X*iEMpjBH zu_n8^CZn=CzXG9F

Le29uClK1wfDamGqHH%BI?w@R`z;uBKwloD~tn3$3n)stM%Sdx!QBl<^Y zb5g>jDne>LH*YMHfT=GE$Wckh8iP{G+sneaqS)N>Cc^8(4>TI9b*Vf)pHnR(A%djv zsLGC(0_nnyMMPZP#Up0Z8&L~LRbFRxcXK$mK98Jtt(4nQiR6e;rK@uBKnEi~KBqV@ zCYs6YO0C`BU+bKlUs*v_q|a406S$s19Vn6nJ6VmT^i*U-MV5*anRTFqRSE|uY%3{D zs16A!y_^?C4QIq=af(6c8inGchq^1v^QMa1s!>VZ*-Ua~SC{~aM`ZGGGcX73HirGG^b0{ts35waD&Z%L{hOl(La|*{t6}RL}&dAW^5*|$`C~lRv_vFv#$(dcnMU37`iWpP0 zIKvWE)$t_~ex5WRB;U_UE*!~99Zs$mRv?%SW=BNh*`W68HF8Eg>RJg4+Vd7(`rbANOKxql*TA# z+~^(Nd3lFODMI5^=(Yq=6RJeen_uHw5h;wNDaAc?iu(PcptuHlczAhMRv9}umdUSb zlyxSj6(v!WaiLXBw29h%QDp^FUBD?8mQRq|i@T;r8moxK71;R7UQ&}-TuVl>`I1&l z9BX)skW)JPy>yOSd!Mm9tBp8%2WExoJKFhrdYKwJ zI=C2VUpRBd0+cQ@2Z_VAb@hx4blq*-?EO5?>025ExrF(s+5X-aOii_{s)DjZEp6hQ zGeg}_o@mnuSAz&IQ-4QuYi(2iAY%q)xVMGe(B6sZAQ|Y}pG#Vu85w$6bLHFK<4*-v zcdl)}7BTWeZH$q4eIsi>Pa}hbNL@XbU{~wp!bttB*;XNaAjV1S^jSk2z4OL89(MZ2 zw90Mmb37ev?5xh7J!c4@u$A!zLu(_tfmtxtU(2ge(o}a=$FbPxgrl>TmPJb1Y)&&S=<%`VNwB-PpYjM1@EZgrNY&5v7~nmJiiP_2y5nwdsNIy(k2eKOs3 z|LS7k>ZIp$#u?Fb@wT_N2-Ek8OR+JCFflQ)GKkF{?HJoGbh9!UVUm*-4tSKOuc^0x zsgJc$K%T96AeKh{Ay|_$WqmnKToT>U-_6n~Bf~N_+s`}N-6}PyKf}sB*v17V=gH%v zic6whoh&^99ij+7HzU~D?qqiF1THl++&5g_9H3Z5_ktDpv0`g;s8vVFIrp_#}3LM+bCqk z-fyDcwFbJu=EJz%i`4%FQb%-7nF_Iv(R`nr|Br z>4anrM&t86vn(T}sYzsCADdaMG9y5Ty^YGx{UXW|u)uAw;mYro`8kwGe z&WfHcJ85gIA7pdp!UfO#fa8JL*b9DfI3!rxF~H8-xqN+QWB>CPe2s&bdkiYtB9!Fk z9+z!uc~a+h{gYsu1)D+>EIIuFP8Iy^_p`^(+Zq4O!qZa6!N&2_8LgA%mdF2QlpSAI zK2w^Ro`D6Y+&RISz9gS)HmS@f0vy&bvh^@=uyg=RVAf%tg+6C zs4xQY1wafMKy-v1j!*~z#Ag2i;urXVanHX8$OnKJm`d%RG;I))0KkHWXLkWyg#ZO& z4h_13Ji$27b`*Mr-~|+2)|?T>fqlPB0QKoCsC_0GNP35L|-_ zTu=#U61V_La0fnsT@{R`YxL1fDcERmG-sOC637yiEBg!J02Km+K!E1=h%tO6{!KIO zAV3Xu2V=n%yj-wkI-ms;k4OJIyn_xna-D_&XaT3p!8-tQpTT_Q&;j7w15{K)2$41% z03`y+aIxg~N)28=dKrNQpa*V$hk_vmu@WSw)2IcX@M!SDA0_99836t}&o5a?uP24sX zGPWgJRLpFTH+>ym+?|xQst4Mz%be-?ot3+6(rrF=_x<*j&#K;C^|yi1n;hm~qk`Cu z|8XRr@!8$G>f0D4cd7I8Z45%-NIHIy z9|^m+50s5}6$h^g^FrQ?Y-#E7XZjwuAOHFKV%z0!1JgX^S9asK*PJV)8?%I=9_&K* z%b#1$w@4o(caCLcOqVvk?D)Gm@{OU*5m4SwlCgjPLS;Du=`xDpXeB774)+aYs zNus)@H>9iMG`fPbK1KRI}ZUw=laoxeQ1CTh6);^F{tT;7hss=lb0!@RGb z-m>4mZQ=2dYx}RCt_mj(dQ|Hjn5WYR)Yr>Gg<$6pub5(AyozPDyy$<3Ji51|zE;<> zUyqp^N1Cszn#ZA1Li z>G|_pgyjtd?ILU8LH)v^cxGzvuva=ql`ZUE7Ihq4C$ecTiG1~_f^+!+GWPiugZrE) zsh^W5u^(RGc|X}pv)86&z4-UPkn5cd1BZhG27?o_WtJEHC{OpL#=JNSn>Lyk~%PO=|SUKlS)9^ zR6g7P)ig$F?&FFs?+(?eUQuOgGERw;9(<;ZEGn*II=9z{miwF4b3dlBx7P+5Mz z$L<1?*1i3eHM)04)TKr~f52SsCETYhTv;7n__i+)w${JweK@DMzI%l*w7tfCG4gio z?(Pg>LO!6_;19}|8^4QQ5#CQV^9quh& z5!OxiKj!_E{$fn6j}0+MuNsKsyfyrf4;1mvFqbj#Za~0NN@tb^Zv3Ed8irOT*el}` zFNGafn7HN!d5eTBXn4Sy8eF+KGJL7AZG|Y@7<@l-eRX_X$r9F$uon)*NY4}c(o6Dp zf{SQ*$YVU-ZejOAAfc284>{@y7n~ z_jST9vXVww$6e`tz9hu8-WNz7az66=x@z%PjLvE;1(v9hK}WrFjtp3ZqzM$QEi^T~(aSE~&whSrPTvZc;`> zcyLW}asefe;g=Lvo{kWFe1c=ripP)xM*YwN58;;&jwVvl3fKj5QS(@mB&9M&Eh7~& zi zqU6^ms5wpb_4zrG>fxH+{$WgcjpS8{LQ8$X>D2Bn32cHFBTAx98yv;f0$L>(k&IDBu%o+giKUBh9Rnx6Whzkv?L5D z^4yXg|8Vcx#{W;#TR_FRbcxz){yTH;o%PSX_rEr?zHh#Ba^eOF?k+(Cf#B}$G~U45 z?(Rx=)7?k|jk{aWK#T<9?(Qe{S2f?P5a_pL*RHCUtUR@M?cFwc4*Y72C6r+#`RLFp zVIgmm(J$=SUGAAw0EUrUl3uuVi7wt9j&);it5t!O|OS9TkOt%kLt zdI~BRxK?)$Wm88K0~tswpJnJ(w)9==tiL@bQ|T8G^rTLjpGO~CZd7VpKvLo4{s%QG zMqYa+oy(#ue4Q&SMCCSPT6v8R9&J{OX4+~N*jEId9gJKx23tMD9TW9&XNx)u#yB`e zXO^6hi<2XZxrJ5LBTRxA)mev2Y2;;}TOwV_NGd+ZsV50@kd+=BshXU>oII#o;I|@e zRmDryRekE#^=1Jzm7F|CA2QNtf@w1L@?ej?s0fSctG$Zp&QUTe8z@LCh1^vnO_^?w zPS>*$MuUclrse=AZJU3 ztd@E@zP_d?wYZp;&054G_1X-kHhF_RB_-E(qVc8msOly%W@1Qys@GmBPQ#&MD{95j z*qWvaY(veHdQ44yRXUQJges+hh@&mpz*V<4C5{k5M9CRxXLH49(ll|pOhzOn^b+X! zvi{szQDRp$j>p3k$=gM^6oW|EHJIH)V>R_~ReH6$9YNVfIp(|hScmw!xmcHHzfTeS zg$5M6g;@k1u?qA&bu7@`d;ekAWM@YwXCI#++jxs(t_RG`T)g}}tej))?1C-!9NPc8 zz11-gq78V~+PWM&Y}XKD9dX3W()?KN@dGaVZ8Es(SRRj^;F9DY?s4dVrC)}Vn_XVu zKBvDOIS`(P2m{b(tZl4AJWt!&+aCw_bPBY8dl>{-L+Ydgro&$w)6!P zwaa%|F>Ynm0ez#()626L=2hcEtJTjg^QXTy)q~K`E=Wl58Ov~w=(4kRCl5p*-dXw5 z+VHbAx3luA;-eiMUH9(&>&XK_&W9|WPT2+ox}~N2xLO|m!`$lFfqymku=->F$&di^ z$Ws@lHCTIb3d4e8f_y-n_Y;}^UTJ(ThM#x(w7IRtiI7+;r_GJc z)%Nk}g|#`Ov!x$1$mtJrU;8*oWm`;6TOkNkZt3c1Z|jAs%ivL$P&f(7+1xe2s`W`n zzR%f1)@SMd!G+neUS6l&>wE(OJlt$D0uH;oI=T4Um?L3+f&R`h2VGD5$DXuy@-*{u z@$)qg@-A7<)v${?t14=ub90N1S)M)NWA5zkYJb`{A-JeeLvK=O+xlC?&Cxhc+xIw8;1w4>NY zl44P7ACgd+ljrIh*+wX+jEpY9#8@Sq&rghUNwN0w_6k{kFL1E4K5_a~Tx9607Z>w# zIx3Q63A~(=(jXsnmamtA+aqXW3j?dqG@LmdRcjY{$|W=`lMiI|ZU5)ya`Q#iz`?>PzEGF=CfQ`&8e3$MZAtNIs_%Qwe%qTa>epcd%nj zRaRcuX*X|IvkX78(6jc(ogyj`YN2IFXnZn?q;@@QzQ;c%!OzCd#>U3V%+n*oGNP*l z35c)?Of(}^ZFVV{y*2(WfzD2u2x+F1SWqo(b~xc;f85&A^@xY7ms4SB(WOGWV}}p^ zap;dj?iOb^pMI$!wp^9=j9nfyaJ7b~>$$T2|;+9bRu%StiH(MFuXFn`1rP zJwyCFgHNZ2*=C33Nfdq+aWNTLAz}H1rj|W`ZXo8E01jZVDZw{n3qTPNRG<+V)R94` zY}g8Z27gVJ04TBGFQLH(lt8S36##<}@EuYRq!JVBz)lcQAQ+iw4#Eoocwd{wCBb-Z zfbn<3!+{9b{}%!clmWg>e#GztM14>Q^fDPBp)^R4CUY(*s;9%uWFYA@D96|TAJ7+$ z2FVe0fpi4phJlOYpbWU4!_iIVP&iL;rT_z`K_#KOK%yxv8hnDG*#Y7K<)ER{bSe8^ z|9(thS_+^6u&2VQnY{i@g9BbStr`?Ys{^aHs|b(RN>M)(Kt0HdLqZ1cMah(entsPpDO%{3J zFb|V|!NCFi65tJZFcf%%%LMf?%@ZP~X?wti{v%vZxUc^VcM!HP-Ox5I2nobvgS!WM z!e{uC0KDP7Y_*Lmo@n{Jb^ZsRwfSOW{`2??*7b+-PAz9?iMg<$ zHEvzG-aCniS~}jSw1%C&iPc%=*e{N1s!Mz0&CVuaD$^J$`a)6F)XEd~bNJTl+|W z$8QQmQtlh+O*W?3Tk1m}*H#gRgYg64b%t<9p!&|S| z59Sdj^8L+Q-cQ1hsf|{UaB92l$(uFo;s*0Qb?EY?W%-Wc;gX<#ap`0KHin^oiv9MM ztXetOHQq@!cD-XxHp?D#Dj#ipxjK3Q!zA%^ea5@D~3`Yvuyac^IF^5gQxm2XV!1Why`YFik6JvBj|5Gtpam+)Hcph~y+=d~v^ zQX7RYyLF30)qHufK)^A74d4CNen%jrYCAf6*E(+sAL(=q1@2tOs)mJ7TKk0fWtHOU z`#)QkxG_j+yYBU6qCtSnW2moRQSJ|Q$hfOt zp6iI4iuKR(zE_%OuRcxFbhCrA^x@gTkK&KZj||h==1wB*hr1s?U^TNppJJHe z^-RY&_kY2tbA>Y3>a8o%cSzHy(jT&yRQPtL* zrAjclm9*rJQZbp1iVWk|P28oT+hR)y=nOo)M4VkO0|}E#>Lm?GO>ug73@Xx~ARyGr z5^`ZYUd)TBsi^~rtf^&98PO5=D{EFaBZv@> zPRwJnNT`OMnzmvE9|uCG>p-mSbPT%U<^4-3crhtwQH-i?X(4iz%|)Gf4sKv!ZhF$7 zEo30)<-L4zDGnz}mmx?>{OtO4$z;+1kyBjS+|a~0x7pONJW?~AfU08GL{>*)tCK3K zt64?t*fiYvyos*3jOwbq(%i_Zy57`zfv~$Q1zn`b&aP@L z%FE?eDZ7i&IoVYzb!lu7w_jeIE10=BIVds=GZGTx>qc^sr2L!|p*mmF{(`KfU^ql# zSbkAOWJ)cw>?*AQLrO})UqoRvt*)bC6GISVn=6K z*~X>?D!r|OAbfm}U5%a}k>_USFDVz^tKRY&^XjPtk_^)&y4r56u1!6 zG^#@Dx37{XjY2$b=E7a%Zr>$jxCmitdJK7e=P*+xWjO_^GVFXs9;cHpXl2%UQU3 z&CN+xO)t`aiOd^85BHApGa6X+%mR`O(UdK-xhNVh6lJ4Erl8VYf zO?g|B3{_M{2X0_0B(GYLP*7+%sW zijSSCYp6vUsjbBrkg;q^$i>yQ&gEr|whka=or?P5GP$xS-4H91Dk+Vu^5~+BCNAcp zB#+&YP}bNmn%9*|1B-~sinnq*vUiW|zI}W5IPSACH$QG}vFG5S1CHKUBG$*nClCSA zsuG>;Tx~ooEF6MCZ0|g;B>V6)j<$C86{#K;fViVRyf=_M zn|G?Xf1q7U<3!{o4ANBWa(iEUCo_L5kqBE;6w%ms5Ms6Zyq!LE0vlTMzn zOm+PI@L!G`JLr7E%*xi!!7XPzwl?zUk>dw`KXl-)R_@*hY#jVkPvs^#29rg`w8G+o zAluWZI&-S0*~#Gpx-}Pot3$_x&Ji8^Hkq zXA}ocrMRc6?iWM_cowI7?m1>*^T&QG-{jHk$W(tbbN`t%$Dp*K%&~!m{PnHj)ihE} zO36tF&!Y}@?n~zszOG%w+z62T%IxS#^Ne}$@B8}qCZ;yjKRCjNT{u}D>3L0_u!kF|5O0gG>CeIhv}$v%ad97W10^F8IrYs#)T8Q>O@ z!WXG$hl?YkJzO)x^9Or6qwEut!_Guxheib-v$1qI<>YtT`AA?$n0G{knPr&2TSZ1TB`Vz zaDvjonuRGSO=c?zx^i@>^U+MJfDj)mJAbR+_L*ad<>%s0I3D}`@R5^Po4kz5Q1?If zdperi9ocJh?DzdnwtMYd;^Q(h&t#WZygGi^bx0N)l-EEhM=Y(~LM)v;PlZ{f713^r zYJ#J4Y@MCFz5L=71txp2DOfdB@u3*Oa+;h=Y8ra?r3lmdY6zd(is zI79@u!*_WH01zM-@EM{h$nU+2RDkII+0+M87I`=I7$Ckz7!v&df!$4G08Rm6x*<9N zLj3O#dEggd8!!mI;eVQt3iJmU4Aq0y+})JbCfWjsjRPiNi(QRO%0NN82Lphgpje2q zkOLvu0hj`UA#43tKw2hRBQyerg@6U6L!>fYDF+{5r(H>uhTq_vU^Vy#Q4WgS^-Kl@ zU>-+Js=*rA2+rTs9<(y`0Z<3~!NUPO;C>MC-83MS0C5yNnAQx;=6`@5rv8uwK@|k( zU2HbpnTKZ|;CKRJIJDgVH=sGt6O0PwK~I0vN<(uuI9q@k?ye$WY&bj&mj>%Va&eGI z4K{(JLjk~w4S$%HivSXifms0BhvMN@gWUxmD8L^d>TN0m-(X+3uFwV!{oCORncsb=mEZgbCCM~30Hns7a$J&0n_t^MJ7r&DFu7L zF<~n(EeO)EKm39MG6 z|MdN;P~SR3mJB?9V!Zb9Ghz6i?#fQ*OB}23)f26z4ZE&Z^>vGH5&CC$jEu<@Bk9&J z?E~Eqb-m{a7sTxrw&8|WCUlsmw|Dx+hMRdy2yIpT;)zVze{PnxrS9nGT-Zc3SLZk8 zZvDKh9}w%$_Xw^jTSRyGzeX?Z7-{6Wb=>PYtWJe}yR$%-Y(KoYqcqM>5|B$&*0<4x zd;P|#o+W%|?*ausx`|vpcj?O->)X_z^j?!vd-+%AigEJ=W&302t#fm|>pKtWg8SfR z`{#GJ?sIihS02r6K6%qS(Xp)Btb8c%KF86&XI;I%zOmZZ`+%cr;eOrt`HJ)cquqYD zZtQ&h;mxfU5pvZ?lfE+{xrgBAkqbA} zLee|K+PUV(=hv=cdmo6O^?kYY>E8JZ2oXahT)lT+&)2MtclH=ZSh9sLkLg_Lyln0T zMLl!zmh3J@CL3nUnvEm(I}!Q@a{JtS24}l(vR!qX)YLyZ-1_vHqDT0)Yx#?M`d+VK za#PjLqdl0CaCL1H&8pGv(W`%|=?~uMHYSMm?W)eF`X?gsG<6IarS#9!IEcKRz{5@A zSTqoNu8+}&NWP8VU}30V&Nbb6e*NA0g&R$6>(lye&a8T#`d&GsZJBw*eDnUHczOI; z4?%@TlQ*_Bj5hpF+DbD{bw&E_BJX8C=f*e8V~VU_iKmfP2ZVGMhO5;-!mpDqVRWLQ zHV~@(7LK-gLyk4-`G}sv5&n|AZPwiU!rXlFzH0`#xu$LAGY3c3`@X$3wy*8X^9Zz_ zrspGfny&XS9_k;hT+nxZ>BGId`g4-0q>5=ju1~SAbQmeB8!YAQ!oB8pJefx);0;qB zb~9t9I%0)$97LwjR86@%rt?63G`1vU2z0H{8J0s|^!+J@V=q zo%I^4#H*SfZpbz+|G9Y|yL@G0Nh2hxpA2Ci+`Hc`*=Akg&irC=gm|&=)61D|BAz|Q zyUuC2F!-jM(|P_I_m!O7$9ny6gUITjeOGBl{R#AFJZEo{pgj!^D~qLX&EY2n3IvmS!-L>w>HPg z3@=r>Ur;4eXBU zk((X7v2~?^RoP9?&%q!}bTyCNGIF7;d~FTg(}}^18Ra8rV?nXLj1h^BuOX(SA-PqF znK4LQW)>3{3!VzcIg&0BkBc!J>i#<@k+EqKlC#>GeyH=|jrB@J$j^8l&j2Rj~11dC6$vuzm%|1sM5ylb|$hR z9>)|igcC(0jalflp&oTn0fM?vGNH*PmKT-t5#yc9FPKz1A%|U)C1OX%g3Jb)Jo!*H zA`o}ukd)%oGJHqRqp|ZNBfJu9jd-AVFmr8StS&QK$C8wn#R=-Ovqek^yCs`MC99J( z^;$Hysg7UHD3j{*%TgL@wFU9|>Nt69YC|`gwJH^h#XJJ6s(+=VsEAFH zG!`bZX7mk-6|;>faw9dXR-{5OB`z*bjt9&vM%Wvjp2M!-T;N|V( z9eqX^9TgJgouoUL@K?`(WA-Pk_j%e`9&|8sOwBv#6zUdw+}|g{DFEd6&P2TY&D|Xj z?mc+)$nUl%t*lQv``TGKIXYN6dphnte)MF$)gD_b&yy~P(mf8E?f<|3W*u;%*5_!j z>v5mraGR64p;10|0a0O=W~p|Tn94H|E-nG#0i{Eu+qJ$$2Fyy|d7ST2yZuKGfE3w> z+$oAFQBB0r$kY>&aX}tVUcQdW*~v)C*0VcYbBjYK9BkZ^k+2eMRHTaZ85I;0X726i zWpi}@kt0Vv4j*%IZK7y4WD_wdVW%7p9I|t9a<;bm!`{}$&BL!E+`Q=S4b|o1oMQiq zq6VLI+>t|$dyhDnTiPUenS1R&>5+$&ca)b7EaDc(MA$e}|A z_nk^fi_Whr@CR|V0{8s;QCIH+$ARm8G1}Y8CMd*bJk8rO*e4*!$}iM6Fyc1pD=0X)YeTsOl!i<(xWc7k)bG?3n@-i@|dW(};p; zqKd|~5q!CSk+Wlrxz8cnBhGGSW{A1B5$0RRjT4my z*QHc-w0MqW>4pmv!y{DclmxX*A#H!y*celnrEZ?|c7&#rA#(Bmp z_R6cRbPJ14G(upm)OqJ^UZ&O*W+uIz_HrmW>Es$45*6VS8JSev9~&B) z%__-sGV?V*oK&717~$^_ZWkHlF8(a z6vt`W8eA2j;+%t%=sDJS_aV6;$;Ua=`;?W%es{~g`|MDpYNDlGpp)%BSG%(Tp-};D z7Pi*mQHPHmI({_Ra&K73euv+!lFKqm3DJQi5oNjlM*EcX7`lJ0e`;f@x3jyOPpbI= z^mv`8`x(|L2M;e_bN6uMufPv?mjEF z2BeNMK@+S3Unbfz@fBp)|6p0z_wSmU*w!=>91vPQfu$0*g$VWgF6fzX2||%cDL5@C z8ngrf)F6OCX&|S#sT>Rew1IiYVU_8xX(W(+8icA3y54~z$bkOQ~{ zWsnOYjQ$G{07o*Bn#ml$tBYweP#Dw#NQPtyTLS+A)AeyM2m#P7HGS-K6vG z#DP;hwc)?Q?r0(^s7L1>4Hn~djhAQJF#AcJKBVbFI4LEX?K7}Ko*o{+$c=O*8LQ#mMr zjfD2pFla>LKspFhINNg>cAX#y8%GneM7-d z@KXM7_+9|O1}F>%gP!VO<9-JM!1BQ+kbmI|Xqpdrt>6bh%V0eC$)q6Mzuj4aIRYJk z#{;M`?TjfHJJbrmHzi@L?z>m;fe$CBP%A#!gBmOg!@ zO}x7@(>9`+`}z4jZhTp+;+>!F=X^b{>RrZdus)Nq*thD{$#xlCN`8jL;b=3XTh}|J zx`8=9ut|;&PN@t^b=rq^%Z6!N&DH$5`_%=X;@{NuawPNMM9x6UtX zbEN4FMcXU3uAMT%Zhnh3cD>p%o?BXG>sAdb?|PbNf9aN#5}X>-`~10(*}l=LQvIo@ zQGUNPguT%zV|NK?ZO_+Mo?Mkq%e!B6j0%S|UB=Bz42EI$78|)R_-pO%yPtFxkM)%% zP|i)x88T!A(?Xgg}u7506F+WVHKRkP_esgL5L-+W~jg1$?I~2Xr z@c8YUZB8pfpAk|Yv`R=@IL0h(m@n>lGu$f?b@t#cbxNDZX{5LG@A{{|zR!>JFu%NR z{a~DEBH~Fyq~75V`U}^ZK9i_7uf6P~_AWh;=qELuJZo;A{SSxDMV_XYwl3C=dKN?4c9j|1kD#eUK;3;%G)+}t}kCx&&e5LweBGmq`YR5zf62; zMK0f;o>I~ASGsSHy&k*TF+dP6kQd(fwA^@sRo`BiJkM{U-f7vOz95rY-%W!HrLP!B z7ne8v_Rb^Y2eYMkfkNH3)+Ijm+$Wf^9g0G9C zb9e3t1}`jNhOghdC?u#Kk6jtt>fff%&VSWUwr(!DSc0o-o zb*NB+VyXCPS^0^n`ATk58as>GJCeodS1D?6#pLc5Q4~m8m6wREC{1Z%pjEo`7V=73 zQgl3K0A$W=#Fc~uJ^&k!mKD~Muk7rqo@ zC}$NFCDzB(wGWq8;^(`xt)Im8lJ}$SS(?oFgu;}BDkTxuJ}sCbV5J2$>6HcLr7~4^ zVaxDF12W8?l(lthV`CCi4cS>GI2ji=e{B_AmX=+T68CjN}lFl#5NlvS(i=oq~ zHMKEOs)QlD;`VcS9VfS4n%Adkl*v!h0CLzk`bA_3g3P0%G>~#T{|*&q4Sbqx?OD0 zYVUA4RHU|UTmMpp^bPQNGECk;>#%xQ*kkCgE$5ZVy6ejo&2i z7{oFOvUGJVW4;^_rpcHBW+QK5Vir@hAZ$`=Fc`tSS}0XhN@SSUnu@OF=`uDJlUh6{ zB2!x13eg- z^)O3XJCllag()0G1FkAMFESpLPp+OQt8Z^-_gt2imla(lP>M8p!%YO9JVl;WlU^g2 z)e#%l$AleJ5WWz57C}2(1fB{!WFK!8?4RK4>})GYs^XP^|F*lalk)xi?c5xF8{*;} zyaG>IIM@OoavyKAqxN>*;fYr6`HAHKiR`@H9gn1XA3d?}_@ToGUER)*8a&Vhg{_@= zsCizq+Wz17?sNIu-rrAnds$l_NvVwRv9^njw>fHY{DiI9vHgD_)<|!n4Q%hab!=^|2#=nbjEzet2o)L$C-+OT1VFzzJn^dFVTwzGi zN!t^)*48#br>%l@LsQuZH6bT1InMo$-}hNWJDAxxmHUPa?JO19opkWGJABf7|4H*x zp3ZhYi4;_POwK!Pz^TL5?$*cl+3a()+`DJb!J`(ghhnMOL5>Ehb~1k|zr3`eB=zKe z%i|#YnoXFGeXyCMd$FfkT&SCwzpLFD&p@AIU)<>?pV*AThMFv!gC~%KPF5BnUeOg} zWhl49F5yS_I~_Z8)Z77Fu+OUmly)q{43!x^d%eoH*e5phL}inhQ%~^DE2G2}fhb_U z5pKsEti3(Ga_PWjxvo+6^!jkSL8rO#D#6D!GJq6?RjttByMH1GP-q}XZ6e72E zadZfotFE{9_6rCKKrGEIkMIA@*22ft$`-i%TU$HZSULx|CfYk3D}Aui>vh83{g9o# znPY-83_r=?taG|`DoX$#DQyzsxb}u!%F>`1UpCf^b`?)xnxd$<@(BS zUu9!fRa88>Yjb&)N<6FUoxm*j^$)3MnzgG62Bj=6tqcF2jj&MZ>GDFqhSr*DR7Q2{ zK$d%ARD76&ZD`0b4>T?(#LWDtucPwRH1xwwCC!>{R#x8=s^5 zoSiIBnjdod?QdqTrP6lUkVpVO5Mh34Qw7=N4i3!P5IIbs2i&?LYafRA0{IQ# z4Uq94z-fX`6N=5@MA#@a=1I2BM1xE~PHKf)fn`P1O2 zAaoj38I<9{<#6DKY%9|R*s4}eIP4W$~8aOzB<$yh47r0YU4qP`V7Vb4{4`sp8z+4W1iGoI^!A+yV z83RK)+(S@m5(kbN{*UPaP7EpnuG#}lz%2d~XaUXJrcD7J{%GLiVKQ@1cj4si7w@*T z>IUx;ue@LjYgPf;*AE_F0|C4sT_Q%UtBu0O;>>IdNN>naMTRyx88IqX~o_^Te znbwVNcb;4A9RAvC?0c+Uy2$vwFOpt8qN!y_E{Fe^| z&a_mrLg8J*;kfO_Rphy0mCr+TH0)E&&ip!vTeUXbws`&1JoklWVq|E<@X0WK{zre>3lscB;9(9eAe}@T-Px#u_uwX-VV$dY4+=9BK7;7uQQ*-^OvY=b@-<=GA1u~ zylG=`_KJpeak`Jmo8*j5(I1>=DHNLJF4hC}WBrA$HI^PY`*vYIUH^4Qj{h{TS-$-z z`OcfIxtCkCFY4QOr5BeK5*)7kp7;}ygC{ZOMta6tKDRN27}+$qEIrdhKHs|XOFkiP zZX2f$5VXC`OAmzGSp8kf=bJ0j8g=hH<-vn-&M*FFPV@8e$745!gnH4c6!&tG*t;WI zS^I+j@fo3RPX3xAalTP!uDzSP&X^@#zrg*pEZDhX7((XO+XpmlV?&FVsk|r6Ki_P; zl6C*Qwn7uBAG~G{cQRI=^NG~%o8r;_W?cWL*N?xy-h6uJ#^%kHiJ7}p@CIjzU76LJMGt2ew^QVpdwM{?sKGnZU|LIy?#7*4B+CbPcjWn*IV9D7@LKjD+7iG|R%`$i}9nHIj(BgIQ~njA+G+1DM4=wnV2oe+4U( zYVUP@Li!)+FQ1bzK=Qi_!ds6=NL}N1=P=Cg^J`zvcd>AfnC&9{GNbRASn%dggmPCIZdZeN&GUAV2}4t+h}(X;wWbhr1< zR=H8DFt$G9?TBaZeq7OsC>ZRNjxoZPy>6MGrQRF(Ij~Il#(%)+Gp=zyjjZ&D-dzx1 z2C2t)@I8V@#?KekFF8#Qr2Ll%tuZ0H07J+~%B$0-w09QfROm|5wYB4#>qIrNr4Jlr z_Zw$(a_dS_gSg(Bq*7i{Wmk(ZQJ>k_tdnans5(gvo={vn#A9-e#>4j;)nd&SpBO)fPgjifzz#AG$PRHhCHHIc2XHG}w6_XKJAwDfVJTERvUdq9d z&=d&)gCewyQ`2SnNRymd-GM5p#HR<=h2$|}!L8(+IE6T}r5rD6t|@8DVn*|6^^sMv zUsbg#jDI-JzEi97dVZ7|NohG;s^0lsrl) zTa2nJE~bi@{EA#jsZK&u7tuO+>|~zo-aWLuA-PeTmy%jWNkeL@iq((rU%7jAB22dja*k`9OI+v$z}K) zHRHhrcJ;mTE(|K2U9>cPle8@tzn|8RueM&%7#Jm7-0-=432&mNQb1DP=&vVt4UG0{ z#&~QZojXMy8E!{9mkLONoH`IDpO8Jj#1r%rJ9>>B1?3{aI8sP$#^xr98Y^2G_3Z+6 z8!aWLcdm_P)ML;j^*C`sKqKULR`w8+E1H_B8!$$0dL@QdvpPF@6`A4oa?ls2HoA;0 zBa01>DlTnegnHGj^*2oNWUH)!G)6S4gy*o&ZX!z!q@ubunwZ9)8R%B=`wNSd`c0xT zvje5RJ zibp8Z37qyCjkqK~ePU?@)ufaagIJ5K)FiD?rYF}W$0!mA^$4e=ZL*=Hs~bt{mgQHJ zo;MCOidBp{?scS3QJB(}-`3ZO&T8gYVOvTvnFx_oE#wzvHukqm#BHh!B}!MGQ;~;K zs`_ zHi~`1F78h$?kLG^MFM;*U7S2ztxkFdCfUX$+S~eP1_#h$s2F{{w1$=Gn-t_9%W-t} zv~|lq73F@++TYAM`gG9YkduiKXG?OtJnh`g%}*S$sVu9gsr5m{SlBpNIk^M?570HNhrCGZLnnU!ZOQoC-xlLyVuRi z)!q(-_p-IMc1|yFIbeU-kx-ZG>}GZNh}pq^HQRIW#P6QD;dV#EJob6nxdn!}c@Vu~ z%+Pu6Ad`4#TDpxzR7**?E+$-@zC^=4#|W7O?0jZfl@%aja7oM9C#Yw^9l14 zmKO20u17;cqit;w5USiJ&Beyz=wBV|9dPG2{3=Q>Ts}`Z5pp~vJ!}(aAwQw?b%TIK(E6hlV4!89}7dC4G_ISD?2SXdT+Ukjq>)Lu+ z{UR*ge{*p-6dL0Z=5jbW{cM7Rqos9xRn(bOk1(%@)Ba&Tg>ga2c5K0uyC_cdal2C| zj+>pZI_7Hc9!9-)adED1<2lF_zBSg-GjRBzrE}Di){-2Tvpz2NNx>d9^^yYYr=L5o zHtMYo*~~LBY1} z&SzZRVq+ZaqFD$_oE0gcd*o#JhX)0?`PszOT)n_aGDc;&+S^8lN?B9l*X{a02X!^X z%E_9-$Z%Q;t0534*0?$+M%6BkSyilY7;5K zGbG_L_}T`N5}loVrU@^$2?%qFD#bMk(b}#Y4&Bo$(#qZ5z9^A-GA7(TI@R@*m2gn# z8{>=hj!H=PH$N1Rn*u_vA3NfDBr7M(H9(Bbv^W!hoT#h{_3@b)=?YCxJ>^q+Cn_@e ztZhO7gDVKIDGBy1YzVOSa(8!ij|#OuVi%9Dt*`Sv;&aT~?C`Op{sdaU0o%i7PVrWI z_Z>a>+rhnieD>^3sAKqf<1{~-#`m6$S!%I zDGf*d4wG;ebx;LR1v=E${+*lQG)z;$1Gj#eyfF&DPj{#A`EZvL- zU~z^S!l11eGyw)#Z~@(A6R$wvX8xZr-82-Q*xHdQ@dp(YszA-DN zHc{mIk5~FR_iy4b_ttQ2mzW|vi}QYNajjYQ<$;vBu2m7Xb>x=s+RjV&pXs|lbUkMe zD)C()E#$*@?ZPax{Wa;v`-SPX?zSNsI04w=t6p>ublzd` zpYlkrYAbG2>$dUT=ZEG6SZ14uf}<@FUL$>jO&FC-{k(Z>8@tZ#?tYBBHPlAM&Er@< zwr?PB`sdr5I30HlU2Rh2>A5ilg-uz(-TS2ZY#13H=U~39?p(fheey0HhaZ{WQR_t# zCR00lqq{{r^HSA1v+)t(jg7A=ZnjPRcrF>78=AR%y+bc$Zw#$pV`}>!Zv4_CtoJWp ze;8;q-%$xB3GF|W*zaI?5*hoW=>_idt*wU+~C%? zZ_6`u!}qVxmfMGcfq0YuV3~PEiio8f+pVM6cZRw3=1V)h&97b{M(uMluKV%IGWN~= zE=^nwTb@X9UESwD3wrcz7#!t; z2EX-GuUOpR%QzRVJbJvWGxFFMaj(1Ri}WdmmV86^O{5_RmyjF0c7>SU{{1_#8#lGU zzC0;yVtyG%+Ea!Sib|_X%bO}#g_Y$beGH|R@l;g6f5WF5W-ti8A+b?iDq*KoP||Y+ zIJ~5k(3eB+K$T_l3IZx9RT*)4G1>Xe%*s^0C@ERbi9^woQo`aBEi^)!uAw>vTA?lGBO3M^8nYf(d0%>h>9#KbY$xAC^ zkdz8u8ih}iDYB5*jMDlVt*DU`#jI)WD9+`OJNb7X60`BhU|MZLo+MSO&95hsYO?uP zY6fM(90F!;qIJHxKBqJ^Tp)=OCnzE*eZw=!ZM9|k?9#Z-Cg9;qN-B;|LbL*1Suq}0 zUCEN*(wUv(*rrY#gW8~PuHn+d606gL64HWL72>)qRHY^s6DLG-N`(|AjhLAp5}!*J z)g#GSOSp3-^-&3_Xpw5D_ttY+e_0u~G@sqlpe)2QdMJ$e;okNHg^ZOa5Trz94OCB3 zC#Z>4(*K{R_W+73Sr;_p&WoLieLFF4_q~nTce~Y6cgrG-@E(K*ArRhs@4bgAIOVE7XL1}AJHmj&QQ&qt()pTdYrm9j_5H>Miz**FewC&QGIM}MB zu%e2LU>Tz@v@K1{&PF<7CF81k;K$Qmm7Itdr56q0MMz_Ex-==SA6Na1j(fluUY%Mc zC6zIX6O+pu3i}W=QW#U1lcmk6;U|gXtE)RAIhFa*k+_J&0iGn7SB5RjiYpXWlEnP7 zt+`Q38Ld!}I59(6t(FYP%c@@2H4W_FXy_@&W>BQF^-Zz{5h(q>#sZnw21{!Min;ha zfwHe=LejK%ou{6tt5fv$^=ZTt9m@9XDpKRnECHz)7#*6+t5K;NK&kHGbj(FYg*cNi zmJ{7C4y%uf32(~m$s2B899k+VqmqlMGuqosMqv%EkdVokr=zwmBH5yWwiI+(*I0=- zCnLXCz|3P*a&Ld7@4RLgzZp|0#aC*(r`4-{y&Gy$YtQ(#hQ;opf}O#VkrgSr=AIm> zujuMg7HY&flA&=1Z$lH7#;h-ms8aB+QQG9x!JC3XE-ocqT3vvuOkHrO*<_Vq)NI}7*TFxB{d}vj~d`~Mvv8M*_tcUN(F|!G|YQRCl!)%SAo@by1;J{#wq zZ(?Qmr@?WfQ(hJ(h&T8@nDAhC_euhY;E3=Rmhv9gc$u=DiLbMi2^aQRd3 z_hTpYj65w2&-`v<>Fi}`5$X}@GqLM$8}8+6bk@YZ!aO+6y1*+W#5%ppSCLnGj>)>a z-ndwk_c0`UalI(@&ZMYjqfaPRpZ5emSCVV{2k^ z(u^A180T@~^r?`<^mNj#eT*bF4QFfV=wTb-5MDzJwL8j|bBqFc zf=cK<4!xQA87_VWv#pEm+ci{oQ_E8)%ngp6aJMr#9pN4t?CKh41R{e`)l6RZ5flAWCr=(V4mUS*G7K@c zu!uHvvNAt)%FfWSz}-{d#nRi|%E;QwKClL#IX*R-9!U&Iv11pe@Xw}pqy=Yg1*Y*H zt&|sp<2(XlioL1=Kkr09g<;HT!!Aur!xEEj3U0f7{?i=fC?AB&g zIJ*$dfTN4;-elcp~C}1g50cK3*usmY%INT$%!E(yypEE-s5Lt{MYUN zzJ^!r6PKDdriSmg3&+=Qj%82d&$-qU!gy_E(Pur#{3xA=lrZd8a3i;^$#iTo7hvXL!N-cQ1WggHy)m+?-8|BRu>Ii+One zATPw*D*osx=W9={dS-OEyJHrac_)M1FN9>~)s&Vx`bMzA+>KoA%{(kjTnXlmkqOnn z-9Farl#QW@jR}q;@jZFM?!=##mPh|Q>vrO|U-gVFtgVWeHfM_pqdgtmtujKxOiP1U zCIN{yPI{aYO9wlnu#U&Pwy@N2n?x>?<`Lx&vuY8mae(ZOKzx9_27Vz$L4rLX49G$d zhJkM~WDr4Hyyx&w^7h zn(iAOzz=i-1~tAwdtxsv53mX!fdHh_2dW3?3*y%Sjp-!9 zOxD!ue}M#u{=aqD2?ZVK14teO^};jotsArkT>3u&BZA3;tH5{oAD|7?Jq+~IjRg@9 z-UVX7(&!Wcn!_|{Iwgs^6y)fzG%r!*K zLy%JsI>SjG=mmxbePGb{e}nS|7Xfe|Ah>S1{`dF?e0&TvI#>)S0Y1uu^@D%llZAqT zhxmW!27qILq2Zi#8UR~2>;-Jyx|nOwg>(=Q4z?}8Wib4KQZVBjf`EMzJQ~E#>w>-E z!-ZANKodyYP$U3ZI5t=YI4sl(eo(9`@M^#|(3lKFLaAr~>>wszcMi3Niw0jDUB?4? za4;APuG3Ywp96L!z^eIzHjs{Wn!`r~pC~-h=>X4x8gQ53V3t56R7kgy@FK{o2Hzar z&;Z0?IyvZX5BdXN3OE?JqtjmZszaT?7{HPIU*S0z16;vZ8y%E&*PVia;mZM6v<89J zdMM-I{R0QO$?AZ7^2!49<(tP_S9`u}-NLQQ$M?4GZQc>mUyM=dM8T`E`Oi1MUKcI5 zw=rdtim&ZFqN=u$M!m(l^7i&u(!+}@${(Ldx9&GCTwI?ZbqutTuz3Fcoj2e5vE>)TEAXHD-mE;WhSY_9wo_1og;%Wv!0 zD?@}vfmpoz_|pfOK=pvYe#PCNN6X0BqUM;bNi z&8`=n(>?t-(&PC~1-S>rO80-cy!}ks_>R1_Io!WfyCo8mo)5FTItld6h0PXP<7e>= z-nEy~TD7cYeY|<*(mJb)y#HM`dasuC?Dda&(%P)BvZ544zq|K%Y;_7VN^Giow)cjL ztbE&lup(;yHvf+G;ticUvwCG8;Q*~v61Iv6drMZyS(+f{I!fM zr>oVEu+M%fTji8T*k;++1r3JL+o)-fk-J8QW*ACtr~1nV=4+RlEa>`lvyAc<4fGk3EQk8R(1 zyY-N?hA+vTo65!rhSD-;)4Ea3RmJ?NN4GjxvkLZa@|3TTLE6Tbr&HXv`^a6QYNi{0rb+%oOQ_#^(S^m{Z*8C2 zu3c~0!tD1EWrIU^UdTQp%WX@YKU>vg%1Z$r^N`%O+0(u&yZ%bU5k1#lX?pVpk6~z} z_*okH<4jlE2R>WF9jjwq7ExG}t@CmWs4F}wU*>Y3eYt!^i9~ST#sRhl7k&D`PK{k&>t1hLXCh3{+g;_`=a@ zgu!K1#}?I~;!_gSm3$FJLXS*JVc^MyVO`^rrtqlvoQSY$0Vp8eU6V)bsG)}8{fh!K zimMq&UIwi|EEQMPp_3A$WtE*(scftiC6)Dd^nglj+{-)2qp&cE4f8k{({<^Txn`RQXGLTjZ~#paI@#@ zd&DSVc_kKu!dAV+XU6hIlUTIu_}a*<_=s{@6-+28YO*Vb)a#Hh)?KBlb0Y}b?HcI-rS%nr-zq?ZCW1dtfm*S1bIXG=!G$E zQ+rZIel8|W+c|gZ^5u=0*|83c7}wNLy#|u!B}%I|N~k=(s*E#QR*_F64AO=KS|*Cn zc=^HlW5xy*U9z=S#;TnzEWJ^($N<$9MIfh#V6&+5S_=(xwWg<__DZjSAzeaNO1O(n z6@v8Q)}_kI<#cjhtD>TEu!3Jbd8uVeUV@rLC8nmNu~Erwd6JHe#=4R^TK~pvDpR5E z&Tf;SsGzWM1F5lRF`8OliQ<#X3k6`8BD+o=rONF|$JfsH(+LaJv6aJDIpJY~^lXHl z$1at|*Ox_AYU{@~i31?DAdPiH-NmHM7MD~^7ZO3zv{-?JC@cuBOh^tvDlt7R@{U>slaquK z#Aeb!wSxF-Okg$RB;bi={QPXhp>+rXqKs1_|#GD_gtx8l}wdg1!0Kki=*wx1bUb%xYqE#xlOg(A><(>{nwmi=!5%hwWm{ zINDhoo-_h>VuRDC&RPQ2HTdQ5QFHxMM}7(J%yvF>=Fp=PPal#&YbrM47lKa!OQ@#vUfPBrtBAD?r=6Gx#C=asiCja89PghLx)bBIHm98 z<7RT))5O=o(bDuR$j+8(@9!R-6p`f=S{>?J#vt~lCuJCzIER_&2U_kw=o0hDE$%iJ z{sz9`Htud&nbBjNt(gXvj(Ps}W~PTNjIDf+oji69aXNE8_{gsozy5N_-q6UQ6q^)m z8*rZB5dtzxM}?Rj1-9%%zZso0H}}*#ZRKoe;&RmWq>Gi?d8=cG&itpjiTP>0Kb+ky z{Znj@>Kpk4=jfjU8QonpMT8I=N5_=n>{6s`uf*FpJYDbXSqt-U6O-e|0wRMQ+>C=u zLap>t%q`C%7ROGPeEvjx!V$S0cQ$tLas2!7V}BT$Ii9h~Xbdwxe99ZFwLz>`q?_9X zFRyG5?`!!Zi&NeAg=6_X$1P4BH8VMM5)@1~F|;gn3p*2?ZfWL|JGk5~9~h`Kw>@<> z&=-v=$XP@p&GejO6;ck1AbPO=^wRWrM!Z8{;ML0y5)m(dcX#_!r=0ElOu|bHO)MPF zx*R+1W@Be?A;dx7*}=xv+utlQj)2R@Rgdmr$jNp|A)&&U^wdWD^GV5o64Mwr->}}O zq_9{R$?Tw_yR|&k$u~4KUR9jXlH{f5kv!PNpjF$ssxyZxJpH^aGM7d=hXVpkB26zi zdzWX~BTnAblA^PzK~_O&!is#4@bKtN*JMX`5+*1r(#YtHk%K2g*gQJ5JlQ+m-;l~r zkv2xCB7D3Z;-Wg-d}0y{Jd?^@eL{Rv^8(Y{BhxBKnzgGdPx*I6bnLfhgu1a!JpKpq zsq6}iqf|DR;+}&l87@b|PS z8g03wO!O)WGdp8r8+p#a%P2-R+>~w;2zZ!7jr9r zZ?^zaE~0gaPBIU%u5$KHt#67?tntuu5jUovJZb%>k)wm1hhwstkHPUkHi6WZmx`R% zw@;FACb$H~`GhR0Pr-S6%Mka<^b39=38++yz!VoBD~D4@?9FUq!$SgvKHk_g4^w?d z`%@>+SO(b#@Jsz|ylsvjwXm@CH9LCp$REF*G4T<{c!3QXTW=$4kK-u?-T^_Lf*wEH z0Fh%Ns+xcA^)>Ksb<%lbhkR_Tae6AOv<-*?z!0QC9kGFIU*J&35fEp9eNP8B@C#o9 zoMx*Cu(BAu0ZMiQIE0pL7`O@u4J06km_-B<|N8-G>6!u7CIPb=@?E)O| z54doE>N*BH04NZV4KBmx&@2m#pP&a3@E4S;69b0Qoj_Ov%>bZ6$ONK6em8IdqS%2J zKx^Rr{X1|b|EHxKpd7Tp!T~_bs!B+tU=jyW@6h@U;rjo8W_4gP2YVRcE?7`-{Xip- zQ4Q9}f~INRnBX=MT!ZoE5Ou4-4uLLy8#IR*&VfSEwf|rVfdnGz-yr-MRt5RoEVG0O+Ek|G9p66z~(**>ZKwpn!wbgqlGV)*0QwqXy=98jSdcO9h7j zEp^Na%YTDC1IW8T3*edn^w0q~&>0+q9|Fotho;~VDhB&O2~ZML3H;GLcPJA+e2B{6 z4pav$r>;KyK}&F(2s6UL*Z>d^4upW)U~>b6qyzZ`;PL<$K(}C^ClI20L10!o-IF80 z-3A02(BTrmv0($C2LZ;kLph+t9s00NGu?}%+ZoUa1Y8f_MW76!#u)s8dq%p!K_xyg z4{%5KjzX2-+@bnVdGHNpr^9fCv}an`v2g32oJeL|VXe1(0?6>;?$g1=ySw7OhnML+ z+>gDYoyC_^U%E!g-|oEX8dKqBH$bK`7IA;|GydrWOSy!r!(s<^r=Ku{W8cSL;Fs>; zyB`wgx1YU`%dmUbTky?ws%Exapr&2se0w~q8o)EIZ&HTeK7EaOfNW2^dpYoN71Py& zzaf_OE{;fsUp#n@zqfX8RV?4=R0}w53bp84(|XVP7^nGS)67WgJ^aL9wd`-THD*3+H|6=`1_iGiYZu#b;%X5! zY1kHqw59j%nzXxFgxr$96h53E*_?dKY^QZIZ?sCb)|&)G)jFYhsBwIe^i9;d)wwy+ z)-r&94pK`^bs(fJ0`uLwdkq}Ioi#p&x82zIgCgi0y?eFp(~5%3X0%=2q)pUze7LTW zH4b4gntl8bATia9Bto~h&Sb}HO&3Df>?Og9w z5+A)#H$K`C)4KX6_TRl7zq{JJJbsl+oLk38SzpBurFWa~Z?RmC5cq1Ww%69JlO#83 z6Q7YmTj#g=d()4~qL!xX<_7rzY=xrPj(Dh}62(uTx^;+qoByusaRY>o~@T z0fa~#T;SZ^pphzG-w!(dLoiz2v_f5t}tkA zw{cB8(YyXx#slQmkEctkY{jhTZ3AmWi=!c5DIX+K(eCcZ_cq4bqr0MKAEkFbd}3T& z|8iyP#w+ISnZDkxwO8Hj_05%KHb^PZQ{M%Wzh4$r`cK_t34IHWd%4^mW!RtX%Kkh14vpjQc>Wlj856(QA zbhT-nAZplL9uN!-b$(l!?0DHU-K|}Fc4Lcj^^T_hE%73k)iiN?b)lK6y@=t{_ziuZ zpEPkF@Y-L=i9OHv_q6jU%@Rd{FzQ=YpHisrXqwjTp=omMyD8$`jhAfc(EIKg;f?NH zQlq+^^I&qBzQL2XjnodUJniJN7!>iHRcZax`ZxXa>f7p(#+E@&KWTaTHl|^Lzq+n` z^K9hp%H3r$4X6Cp_Cql6bcFHs1{cpHT_gX6(bQEpxAN)p?QHdB`YWV7yRb4YyA;Q( zEXEM0sypf95;nf8WkoBVsn2bi?@lex908SyXpP)~YG!tGeRB;XJA%PNG360{m@2NH zup}(4(k~_?f=b0p60-0M5|tl94J=f}a0Ci*Tx=kpoE4Q3pOhLJ7n2%JjjOM#NGlBr zBajj+L~L=89MK5t)sk6uL`6lUFfFr!Sd~z&kjcZuv<7KTsh|{C0!vWn^ozICj+A@$&3lFPAjY^S7{^DQ=$-QaaRr>T~wV<4^Iv)ixO7@F94;KPLY;3 zDM|`+e0kwn^gL>1VHGKHyC5hXU*aEDT8vim7#R^4=pZsZnq5-V6&YEGZfxeh8Yu)x z!wbc7kTG0-v8|>IX{f2`kv=ai%892b3W`(Pq8TzAbs#^cqO^jAWM!$j1Vo;mkk4tt z)zL}OTr?Z)6D!5>LJLroq^R~KtTZ-JBMD7PD`~=F9N3jsvIv5d7?LWbIR8FTlrAWaeMJ)Dc~}DZ z-fXk#N@=+&xBf~t4QXr1Xuu#WW?cYTmR?5;?-Hb!<#E*hiTSyaaamXmk{Z{>S=dEg zBucvx%xZ0BX0}#S+TK`7LBHFprIISS*f%X8OoqAEakYgp(8bGPr&cx6Y_^R9D5X(Gc?p*G_Z4GqUq|vYqKpRt}XLlb4!aT%{Id zCr?#X@KO`7tr9M_6CtS(8j_WZ7W5Y7EfLVwZ8CZ)<((#exN{;2ryMM&=Sp$f_`Ix~ zAWS|X8XcTUtfQ&gXVBTH$x#VBdR|^#94wj_&K?Io-wty2~1AIk-PFK zMcAsM(1N^HL8!>zB$iq2WPd)+-X+4)(?8PkoO3`>p!<2f!>&Fqw)Te)85$Y?Vx#xl zpL)LE>%| zY<~22OIrhw%G~;h4^o(a!M6zGt8Zp}%G(q=s{g5X*3J132fN5H3kP?DQ%CVMb3W7Bw}urH=_0n<)8wy6V7S1A`XUC zjd-P1dHA?Q`=(W(>IPesGJiWKi!&#VTOU9Ar-2_@-@x!R;$j(TW@~C_c*^9&iDTvl zp}tP8=VVG*YCu{$Kh*Tp-^~u`d+M8>JYnf?o_ykvo|FC2lTIPQ0d{sLe?Meya_rbi zR~wrov*Xr|iD>Lj``J?`^$mavyEKB)MF{r}qL)?Gk*=nDSn1g(*jb;6Ic{(2<(Xq{ z>}nmAm}+*~+rt)#GdN+zY{g5MsrsSWZf6dgd!KeVu5Vy);#4^+*yFUdkKG9aYv&M8 zFTEgzr$_Yc<#CWt2cfDvvd)?PdGv$@1a>*nJ8hoPNGke^|c zznO`lz55@ALCzoy+Roe2+$_w3TLV?o*hc;lC!zI*1?Q~u92Sp)WrVb zI+<2#=MvzSkPsT=mE>!pZx|eSHr+qku`tXz;GBjQ>6;o9_m$oz6N_mY8j09|`&rwI z#g6gHeM8Yhj|wa4rB(d;_%KpMY;MRqkr*-c^>lHh63Po)DtdAq9BY$utfJ1@n}#`h zt2vR`6cokSOF!_Ok>hb!J^!SX`uJkoDn_ypA#f6cy+P7+AA3_eMV9E~T=U4wx2UjZ}#W+0;e6A+M&N)C*SI--Ku0c^(qqXty` z2ArXz5SZQhR|stf7a(hZdl0E0@IXT$1=RZ1wbyk37Y>}up>*g{{g3k6I=q5?{uyEo zZi9Px^nd8&0g8cRK#T#xKr(a4Gdcx<3o$e-gJS|P%!0z+kaK}*5E22L{teXr0+q;s zN)UzM4g&-*C=2cdK$+xJ{t*s0WR}2M!9&yWkl5E9g`Ohahwt&OnzV4L;Dn!CwHy zz`GjS(*fV355YBrv(!!ZAIk!#0Ym~139!ik7aOVp|9~%oE??R~7n06%9oF^2S0C2h z1r2ns1o#Wr2K0vF!NSvZgX>JpFx(sNLV!&2@R35Hc$C4x;=^$u+rln7YSld{Z~++I zp`PF!1b^^gVxSq&4+JWJwfP0A1D-9o1U~R_z+rWg321u=@H&0qtaNvDV*aTeoGf&@ zfDaFJgYx0r;RN8W5O_OL$H57Vj)0Q`I=~eHYYjEhU4lywM1nPdSK$Y?f&xLGgAE4V zGQbC*gYQAc{6nsk{Ai{15;8K~(A3^dt$Xo$ipXyj60UvOX}vV8d|s;&∨ISC+cx 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π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�!J*~yk+@LdP1$?=Luu96#3--S5bn&eH)$nrx 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

?YTH6HN z_SGf|xwRSyT%^9Tfom&mXd&~(OcK{t+(@JnVO&v?m);|3&gn@iqU!S-1sbh_i!>ly zF|#_UUe9l>D#z7Q`x^#Zl{!&#D@~ymlIly!%PTMwvX&)1>FUBzw_4katH8B##n1c6~$p5ce>olbxc&-;&k`+_}=#|F71P|EVs zlT9(HAYP0LKNS)bo&c6E2gkxVuV@d?RR5&ZD9^a~oDy7Kv1fEzCWsWnV&bC$%X467 zBcs!UGu=E~;yvRdA`_C5l9H2>;8>w~BCej$UGC-{5D^c8zNm=Qu+XSO_Ks)_rH7BF z^RXyj=d|S9I#CQShgpU##Z}-#(>+6@qJ5GPTxrqL)S04seqwr@q#m1FP%lc(D}m`7 zjNYo<17kB%BHSWsvDk`c3dq$}8ZBJ?A$v>!^6u{+pWVLo0%7tbhFM%)MV^URR$NUI zs?;(Ok1JHi#F?}jbsN~hikk@}fBzr=R*=C7{f@qYr-H-agbMI&ZbbZiJl#&X`vitY zBs=ED1)c!cqlc5DYovoKBxTx1hd8*G)}+;jrzS=PSLSdkGdiHxd3XoK#D;pG zv~xJ&=7LQQM@mxLAm6jPvi20Duw>%{W5WIaSAK|}Ur;curMeV@DXFOO1605OI7Hjy zmG-8P929>5nh^npBDP3D)Q93ICg3a{5KA+20&!MY@tPWC@NyX z9+LmdJI4gu8XXNt0pbgNbTHSzbAyhCJ&Fx&Z>OTpH`pw-nF~h%y)PP(g0={t_)zdK z*B2U<0un_)m;cs+VyrUShsz^+eOFJ9d1!upV`*{(j4W2$@Z!qZGvk9}vuAg1-@UPW z;mq8a4H#5|$z<&8pWV3n@a=bK`5+O0ynC>-x_D-D_rZ(zpT7Pg(U>giuQzwE?A*L} zcXzd4c&Cs1@%oujYp;A70$toVI8LOwxz9uisF360LRhB||9JK&qQg zuM~-S(5?X%5heZ8&CT`GXP4(@CdOt)&E_tH$p}%l)-zl8KRiX2y1w^_n$nxJlTev>!e@Nf4RK2cH#P?w_tl(`oL4Q>pBO| zKKM=r2|7pvHDHi8nYwLb(-UUNuUqGrXKW@l|JR*6^r2T`L#JNfY3|bS2~Tfczj^iI z*3EYyr)lp+hQ~(w%{{h>(`y?b&;zd$sC5aiZf>reSsXJ7zHXZNgmPboZ5cWR-NYjX9`XF8LKP@t)aBUY#t5+(^DL!~kG?ahtJF5}>p zUw~P9`azF5J-58Eb$R>Z*5%tzp5I>TZUgO{O3VV}`h2~Uva5T)y*Snj#Gb@3^RoM; z+&Z;%;pWrNWR_6fGcr9r*4F_&xQ{j`l-q(E)0R$?L2t57Ow4SYTfX$<Yu-ivgw(q|F^os?^ZtU#!$Isq+PBJP=4TUnSJg{(_Uw^rTJ)zhsPe7b&i?e^0r_n-Xax5+7+!aGZ= zSD$?R_Wr@m53-4?1hs8)erDJxr6a$7etLLrRPpxo;M6V2@=rDc*+I0(^%35o;;gSE*W7dl4zkYrvF`1P){R%>5Wlc>D1TBcALN=XBXl`z70$UEg9uiN$ zUMA%8ICKiqR9jwAQ(IeI(?sFQwB3D)AjFS1btrgLB84S_5++deC8lO%ru7+QTxgO| z$@#?6UV7#Fq{Yy#=`iRt3Wy54AXlI5<~Ej|U%!AWgKd|VmQ*3Cyhe^(snMHy%sMHP zLL{`Hu#Jq`Wt$pX!1<*~%^swVw9F5W%$@~WlEiK^S`15s*kpLr99YuECuf3P-XLY+E6W=My}89@H4XKREqEf0Ef9-@e4$dSZv#0^ zX$e$w0M$ z9`xlhDVP+^*73=ag^N48yU6zD>cZ5*>Dig-VXM_Tc;-$kSKBu_x4O1oT2bD>km!1? zBa=g&YN=GEX;;vyF_|_ksAx$rk!z}|z+nqlr~1r&1DQCAtx>AiQ&LEcv8|fyva<4$ zv~EdLc`B{8w1$``F=gV)svF8nuo(lg^4y;Gg=(^)kA2>TG%U6tl1)NE zc*A8RrM6v4C`MCTw6@X31#9o%#M1dnX6GtIQi?$q3<5V6orbg!$RvDyVXurMG7St` z2WBy4C7IGvvrN@BI5{^x&^uQrwiGncc|tx5sVvBvo*M0z)2b%be8otEVXL|VYa=5i zGbSOOA?cdCQcIuJcIV-_lfH-$Dj8Yi=JzW6|pi(+ol;Ti%yn-Y6U`slbeM zb-;TIkI4r~V85-GUym!VAfK##QpigT^jSUYD2n>mH@CyF>z~Li@{tos663Pep zb1$RB+1&>i6KEF8N(iS`%-VXoVC>r-5gD6?b#XoE?C9+77yQ>gl=uQ08%on1I(i)9 z77vB^f)&gYq7buV!w)$J8~~68xbX0Szy1lKh~OJL;pPj^@4yjY66`^b=>Uh){lrm- z7y&Bqa9ng`bR3eH5FN^DD$PwFwAzvZ2qh&#K4*N!39q2g(6I2Rxa5SGuv0-Gl=B2< zPf&1x51>p?S3<~SacpC{9)kN9F<4A-c{7m)&gb3E?ojs*UF0OgV(ju7HFQMa2bK+jV_9*!V^bZ~&( zwzo@-4fevN$YGtvB7?xWqLvs_;^pTD(!HRt1BdOLT)ljJJYAjO^+<>c^~sOsvmiDc zUVC|4dwYjQp$129r_lh*gKi55!25cw{ljycB^4lvXlj9m7{37D!0?!)^vqmfc;aK@ z6A}_)LVVm$7Ux3YctS#ALQHsgcxV`?NZ~Ex6%di@AD@{Mb0Q+}uuq&LoV(7)lA{8B zPb7u~1O(d$gdIAL0uEpT3lhCgW~WvK#$YQ_$W_TojkZIphPqR8N-wt-n_EJPNX3+v z79wep^ro6B0#B;#kjb_BuHNMQDm;k)!h!>XfdGt)i;oJAh>8gDbxu6x7aX6Fm64X^ z3@>DAKv_PvstHeMt*dSgOU1eeoC*yK4fb_)JeCH&;?%?lN@YnoF%HKL4?Bg=Ptx*Q zE6ZyUt};3)^5%fH17atxH><@~|6$+%#3=qIZ zC}#y<8L&qr*gsUa2lvA(0RPdE-$@>{y?$;A>_0?`>``35)qFeC-5N1Zz~V?%TD|zw znpr^nNmUH2UwurFn&-}6x_EwL^TMSa_{h3A4+;+sn@Ra}XKVA)?WZrE!b%mP(#fA5 zUfDW#W@?}dDrvQ*p(V&g)QzrQJU`Xdh6ZPIN$(%*oShl$QVW^H&oA!oY{25Z2Z&v% zOwndU2G_qEuXFlVFJIo?f<-alElaxqxSsDHKD>YT;TuBu@$$jL+m|n2xpM8+ty_=2 zP+?U=LEb$5#?ub2UWDwu+1W)Xt~tB3JUg+lw6Y63_3izmd$+DV{77I3ggjUWkqJLO zzj^lb;obYs-+%h_;lsdZcQ?ISB%K*dBu3nh7 z8rvcF8P!-!{6m^W-Z`SD{WwB47cap_0BlzjOV@oqP9gUcL2_z~sTl0EB-@+j=I}z4gbPGuzUfjDdX_5*gfKtBQn(5NE8K&Rpt{_~sPC>oVFaEYOqov*ImBVKV z6vk=6)w4UH6Tx!gwNp!6jR&3M25k|^OshpM{HAz zXRlnnefR#uV>d3Y&J1>ne%;$TGY^aYN56P*CUgJ=U<9pZ-_Y`XlB8>L9nOGD@cNuT zN8Uiz*3NCO4|C44W_d4m&aEy^j}KZQ97wH@fl!erX}50CZC73Z(7C>I_2%vS&)$B9 zGz3|PW#a73*Pp=X1S}u~qp{d58j(o+`QzJnVD*?RCK>tp?fcJfZ*HEQ?CRh_KF*}HKs(4JE9E!T1P^E1O zE=RYHh?Oei_=QIwzkhkM+VNw#U98mi&0o6nib(r)XL)?}gUF!gzPfnvDNQ|c@#)(K z>lWJXF12g<(uH}OQ6>0#ZhZDGZ(!rWPw2qan{C!Ey`gt><@!e&i}Geo^Qhz1)gQ){ z-Mcq77smT~2P0-~vAXBCZ|=^>Ud(AF9jD*3)kdB4`>J4qO<>Aq--%|gT)(ruU={Jm zzdl`>kW-#seDGGj`9@_s|L7Z8&}OhrPEJgYPtMLxbjyArFy<--6;lBQ678DGCzZsq z-1+5PT#Wv7EI0pzt2#a$Wlz`P0=jUW+q;x6;d}(_pEDE}T5v*$7$=&uObQ6YA#Y&RRI_vXToM`1G5t3*W)g(pPn2v>r_yKOn^%fLPl7s@j7Kz zHHE`rb0DgWNh3B_VRN!F#sRO5jLl@{E{^tDOl@Fe15+Q=%cW;!W@MyUd&e-^Yh^gOkmM^X^3l-OQmu-r>Q7&pw}p))s+?jH&8HXm&IfYl>Md5?(u1eCcof_$JSDFsIK>FJqSz!#>brVb4a4W|Lt%}h^rtjS4ODPc>B3P6lHKF~Kf zzr2XS6^@!z#ERE<*(nMwNs~Y%QPdl~RFJ>zP`w6`QR6);1DuqDOB%v$}TY zd8@J?qE{r;rkd)C&0$0*q7g_mIwVREX&mVGrE^4@k;N&iLBYm1wog`&}3e3 zDMev28~K&P5_}_7cNSPlQvGsUIUAFOsS-_A$sp}XCuh}F7oR(Aq1~=ecTRU!*OR94{!Ivq=*2o7N6kg#H6HSP#t~h6fDa; zz5Rd=2@3Ra0g0QP-O+^Th{(7U7D6*yyN;u+Y%(sQ6R|SHIAx zs9Ly~7Tk6WNxlm!2l!zpy75T_jEIF;C+DKPEI30F5`YJZjfqPE00BC@+=DhjJIE4a0p#<6q+G7s#XA*lgS&3<6A zj-i2!2T)E6daw^4`pt1g1o`>+21UjJ-*xz4RAhJ<^n3$B6do4r?*o!Ezra%wk&z+3 zZcYwPZeEZH4-65Q(ft1S3qlz|Ot=s7H1_Qa3H0{^AQut@#L3@)GhpL@pAI62jybwO zT)PkKp*LVjpObcnAi*It05p|e5HMd?nhm5@TzdJb45yQzRJ4x`@T>r9QW&{7H#ZMc zQq|B3!zi8z22HAtuDz=O*vR__N2c<@#9CPalN!i<$;!;k#?=yoLZR9^F(xuRG&(LJ zH7zqIA6xi;!^kNmF`U^_g9EKGa1S12&oaP`Xl~(&6RzHW?mr3|M*zS8FiyfV19l2f zueaN=Am@Zo7{|e+8AxQbkP?OkOej5qSlYP!+SZnaDqKlPNij@N%21H)?&TYBDm)?r zu-8F2tN>Q+kHJxhkBf^tL_Ulh{QIv{!KXrjLxNs4NJH_4BLYy*qpqqL<}a8Usx&$g zt{r)W1%<_!>=cw?@%QrqS!E%{8PJ-S7wocIO;uGrnMMu@34|(@)To%~a4;Sv!>kLQ zS$1BSm0nHwuk^}5K){0Xha8*5OUOHyfI1hB$yRs7CymjV0426TefrlBZC2KWbU+a^KU1QT!&15yo*fO5F-m}n^& z$^oI#i%i%U1@8Ah{>4uL(&4~1&?rXe(*_g-x82kD@&6U;H`}8WP~Y8M?}tw$O;3+j z$@_F`dwG6p!~#+QlVx~*=kc>gcX!WUxN_$$MXa|D^tST}Pr#Tx3dL5S{I-G3U}kZ3 z^U|Fkste*(f_m`ug=_a;eE9nP`;Q;rKfizd;`y`ZuRi{OwJh@K<-^<8uUt60I5pVQ zA>$x-Pj^fHJMr1w=OmH7e`;p>O@pWt333LS<4La~6uV!(u! zOeTJN^Z3ET$Io7UrO?R;^6UNM$IoAWAoE~Itda})e4#|41t!O+Rfu5V07Q`zbUuhm zDVK@a6w6i&zo_>sKDUCo(vo8YD9yKVx`&e0XqZ7&I%~ z&s#Pr3iot8nfl<|0Zeq!qE z#i##oQ|AF+)p=$6pXbFTu^mq`lgUh8GV@|5Zn5J^+-L^Tt3*{ny`lz^kPvED(z#bx zz4zXG?-dCUNJ4ZFU37sEy<^(@?<1V|ev`p~knX+beCPYt+H38#6*2}gurE+k&&y7a zm>6m-%7(|qhKFf&5eYe!?Sm)Bu00G5Pt31w8z2nc`M;jZ$uh-a4%_g1AxXl|T6e&oRLPKvGVd^l`GH2zcfsc7ige=ELv=jm%Vube*E zQc!ENYvO|U7zbUMLJG`cYmoZFnjT-x-^Yz&t|%#gsg?>%zt*vN?H^riC$ zw|6&HmQ^-y-PXV7(7x?Vh|7p3vEIROVJv&O+e|vSR=G5TO#hAw9x1T(`xT`!Pl{T%qf~fOV z`iTQwO4{Ujo%xOwlf+aXW> z^YZAyfx+QDrzRdnrsWhCrbdT7d-Uw?=srz!z{d5~&6U{^!HmJtY5jdR^f%X(6kt@v z+>)H0UDVjq+ePPLRekFYXYb(f2wk9uLpNc20>Zi4^daU$70Sx1dpy$C$C|nYgfmjB z1eOgeX>P2mk%d`R2Xb9!3SrC1OihRmR{}SCxY(KINBB5uOpCIMOzk)N0Uz~HUc3~U z1(j<}j8~Ty!P!@Xm5_TN2M`@|GMP-xOlnH=P>8ehO6e$HwW^{Z1BYg@3F&i=PB?xn zt*q^xMHL~9!b*;DELQe3CrfUHy``yfb!qWxGb?*HZ@(bYM#DoiL4Ka=Z7tS9IzapS zurPfT8EHio=v0>0Xdk?96O;OKBGf#rDl_8ZlCw%p$USy7a`y?2&L}lrXK7`*uD%RKx&;1STw1L$ z<#nvqH82k`B9v;FA9g9E%z~_x_{dOypN)sMH`lfFy9MVCY)PuO^Y9M|@g2zW%=K)^ z&nskZdKwS0WSC{-6qJ;aZc68JVG)l`O+)Lpox}SN9X*9>%hS`-CpauQug1y&hhj*; z28VhEX~(7K)zU?#5kf%Z9{*^geGLPm7|F)SXj^M58wdBzAtV|WSD9MayZZ!&CuK8b zyR^JGD^b72r6Wh#FtD{}+km6nrU05Ji)&gTp|%b#UO~}-=yhmx4kYNAo2@O&%Sgeu zNy;{kK=M==uauCKl37qzSy`H&qMz@#ac_4`Zfvm6h9i512KxKDTbmji>TB_jVvsJ# zqc^*#s{MdpTtR(DXLB`_&(Gs9Q|G(dWD-SnIf($78SDbt7>}~EGSj7KhF?$WGbLpe zb!_+tPn4}rE?Q7*z z7w5ClZwmDsiQ>MTE27o^0>n}d#3&=&&X}d!InK^6r+=YwY|3LXr`9Q;q ztt8tHRl|Jc(q-hWfBrS<$amk!yZm7qRED?q{$Jkx^LrnD3MWJkqd{rfcT>!b=1%|K zgArF!Bf*n5ZTgSm%KHRM;U_DWiauk6Jh0mI^RK30t20}(VyQ5sh49B|o1h?+RfL6@ zHx${Y#>J;BTV>-jXSq3TQgi3e@v&ayz9ybt1=27w$txk1E2p5Ws;<6{Vyw743k!=& zadXtvF+H`(l-HYaT3c}ja(qDb9qdhs*PP+)?BMF|Y;R!{8|2|=W$zU-f7$AF zHa6DpSzCYg&9~DG<}LkbsVe+UMW_HY}>wb7{@^Gj)6Ug&)t4Oxlf6H zB}R$0jEM>leSG!gFgCSfiLHx`3fI1PaOd{zyAK}!^i&g;Sky6cTZu}-UsBo7w*AQU z;Hc!>@|M2c2alh*ICk;u@k4ue5AN#Uwv|8!vWL<{qnS8;ka@N}ovhhLeZ$hmrWWE4 zS~|NsunW}HR$}fVw5p-4XWNecUBictpFVSb?AqOXS4X;wqpx@@7b-fGspJt>Z~oK>6$|~1}P<0_tTY= zhxQ#hedUfOJSnfHvwxt!qarIgwYclR*{io6hepOz48OV~KWzNSoWUL2`v>=(x}gb= zle0TQABGSQvC&4vCZ?okASIB0myliAzJ1rW=KRQs!A5*^Bv({64_*$-ZQXNb;{G$z z2{Z%%B&TKNGQ=x6?AFok&Gl`JN;-M|+^NF@;7I&&l~v`rSjYO+!lL5R3M!;GfNZMFY`K}~smbxe5<@hQ-3JdJJ$i8O z&P^EawJR6SoH)3nJ~Q-mdrtW66Z>`#4ej2uci(AES~Wony#qu21Q*gLQB_sf%IerT zFbFj|eDvh?P>Rz3Xjdh`p#1FgRsGRb;n$nz<*yy;l($4*w3pegQ!pAAwJi~oirgc60 z&)<5kBl)kovAHfk@={xh=Fa^`kM3Q&awn`{_tUJN(T7<4XnD(lSzjN>JexY0s(W^O z;-PV}qOXzM+9#y9S4L4-MElx^D^3tTN{)boYP{ zun!npJ25H}otK=cqWsLHmi6jn655F1E8avkWpVOW1BZ?eKlMB{QYnw z1ZhZ2AOy~f1AK$WCNu$x7Fs=_3atOa^2*{gy^mu}jJIQ7M@MJxpp&bIk6&O2mp3Ur zyRf3R(ZX)Mi~B|o%wt}j8#lPSI@#MuSbgaVd*xI{1eh-6fZuD`~rntUq%8 zyf<(0_1@^_>h9qy$?|bwz8a^d%qS%|BoxFLo?2~7@v#6`6ugF#D@k7)y?ltt_I9^z zU~IZZ+G(=b4kXy$&yVXC9OUcn*i)8640C2lbC1321}~<5d6VAfWY?Uo_difyS|EWp z`K5K;>$ilZG&;C?X(Gv4sHkmfZlDZhW#qhBiB8QctCl>1l3X@U#n;`zvLT=0NbU|6 zrY5H5So#SB^z!uN#sraX$cC7NwqCdri<_;TEr`h4*1^fy*_jgTde)Az{x?p1XyK6N zpa60-oLv-B5BW05hhimkadwiZ3Uf1PNONmPS63H@L5oypYAZ{!qWv6e6N5Gkbv8qU z+q=5A4l|;wxU{07qpPjH92Y=NR%UiS8)kVKZD!R})A~>}d;)O$Mp2z+?bkJ~Vo#_RhSg)+FMt@&COrOXoM{u&h)DJXcP0x zv3eVum?6#CIXJFIm(o!N4C=IT*+lGnSctc6UZCwNZbDskX;GD>XI#^U$f7oD2j>l* zULGX(*Cu%uxh1;W_I0*zwRLp!C7UMKZ2hLdi1dQolo(~Rr!VJCc4bX9M>qiO^qDfFB|KcmM z0aVg4YXL&TXW)3eY_sRc3r(Yn52z>9;4>UrP>XkGVOoQueEqfZ)oRIPAp1?C1!(pG zQ)TM?iRwH-v=GU34hE{mb zR0{LjnVK1Vqx>Xy7i_Fn7N*EW2&q&~^g1XPAxY733zn=jv-{?U8KTiF5%1ea!YI>r~ zKYr(6ZKaWC!DXZGOap{09Cdv6)T!Ql9*HZTJ5PrBLX@C1OAVJVHkj(PZVl6mMAI@{ zwQkC^xyx4JR)yJc558w??VNc;3e2B9)yd3g5zzvOy#QJI`WMcfJD1KXMs>~fabbV4 zr`+KGqxuS8gMWG5=^l3L*5)N}iiPR0LqsPT((~tqX^dW)Maz~WEiIfsZ~prq{T<`h zj9FTPskGAk@ZFTpKmGVanosCc`sAYz-hclCvf0UmV0zf+WWcKqMsC%NnX}$S@`66% z9u$J9eDsF=o_`PZd*uV={nz1 zZK=`9l`B@PAg2<8w7gANBWzTNGSpl&M_wP^uncG8kHXebUFiN=Zn#QTtgJqKi$v(7 z)2VL~QSh^M>pmyXW9kgmYWVFxzOqI`lsmO{9Y)ar-wprUX7z&5E&lq&tIcg}Esc%v zt<76xXl%*0ZLRx4!z=#%Gn#Ow&sn(aW7UH=9TVch??3x+snM#{EAh7d?W-BfznngQ z8EX%HN-pu*r8BMP+8HfPPfmzmuz;qpWlN1dMX;N-VCm9@b7#+BLK+XOg#`xV)i7ZB zK9Nq&W)V6d?gpwaPhAw9I)8t&YM3^AD996h(iOBCL3lnLK1WYc_*QR z#Np`DqkW`66q2DJ5?Ut-a9ZD%(i8LYHoF*AKx+(xtQh|wR?p;24aCm5N zc;CSzM~@ubGq9t#yF)!iO3B{NOi#fW3yORG+1QD!M5UrXUCfpZw&(lD9j3dhC9<~8=biS)1%v$Pwv}6H#ThR;Khg9 zI0~+{Or@!Z{TJtAl1fQS&%$(3*VIC?Tw|T42Dz!Rxw*a~C+gPjs^pMsXO0~{uy1(x zo`WZ^K8r{#Y2AH#;{J0|k7)NPuBfSRYVF!Kxc|uU)1xO34|Uh&#XKHqPN!F*rJ4>3 zutZKiKfGh;*ySg>=v2H!Ege1EcMa}4er{~y-qYtOSWf`8=MVRH*XP7)M{6@Qv6}I- zXU6V?B$jvW9lh~P%vhK_u&bgLC2%`(32l3t-g7~l*?eFkn5u9A!VD9TJGw~KZpJH- zhQTeExWB!fCGn3A)FeDQ(p8a@90NWN(LA|-Yhvuexih1q$R)>+ERGyGLT}9htbT(- zLk!5>zFo6zTVHPaV9&uL$41BQF#Re#Dn5mklV4ih zfXk$_k8;c)g9;8EIxKHw|K2@&_iGM~96NsE)TvX)4-fAkJ+Of6>Lq_DYTX*i?e-V{Q>v(O)Ad4xfXG{~FM_<9#-mUGmjTJ2?##Llf=jX};PQk6Dgd%Zi*(&4;b6h*}|JVf_9GwI%k^n%Kn_Aa% zr$@rsc|Fil)fSA`tSrdjfD0#ii<)>c&Y-ApR0z&_O`yN8&nEg9oC$xk?Bb5McYzb^ zK&dXTxGCXh}hKN>s3Vlcj&wk7ZYXrczW=YloSnLOXQtJvgpxd(*UluUAvt( zcn9j3(w0}+XyvqF6a658fyB!}YIJ(NHps`-rZG28kEFwk;O64OYXYfwB(> zVzxM&@ZY$k%#y}FhYjR^hhZc{fDG06@xh5A=L1M0SzKJKMy^mq6pS_|T;sX3JU-BU zXlr{55t(da4V?qdp8oozyt0}`JR0_lSlYbBKR^?TmMb7%eQ7`U{;I@4*WL=6bK|1L zo)yXGOU@~&X}2Q$ZnHlIOR@}7>DjBSBg>L>Qe5;-X2eAbr5Y+t)832p2>|B;qx6l^i{5 zinR_G=qeLkL~QSdX-%;hsq5$^a&cphizzdSBlQt6Ng3?ywOZrFCO}XIQdwJ= zt}V|?B>Zq)Mv$9LD?F>E%YLJ;pI@LZE~~W3QOR9vv>S^Y(B#l_5NSy%|UVikcjI>QnD7zpEp;eiT4FQPD03!=;A2#^W&*!IstEc1GnL1VZ;rH}r;1&YB;dJB?M+*5?*o!jlZ5Rw+k}v@( z?7AtxSHD7joN6#qDGtbQ)@;S#Q<%VFy2|Gp%=~_e1qJ3!t`rnl*+C(wZfq&sVnB2R z?ol2oZM=p%Os+OwN}1~+B6>zD+iDDc3q8)`sOb3AY-9>{G;D{Kwo`Cjfh5Hk#_P=i zveI)f<9iotlhv!%NJ}0}SsbMN!NShPb4#Em$lrSdC3M*LI%_(k6U^m7oS7SjtNg4A;QMAnFo zOw-INqvgvXN}_mpl1i{LKPR`O&eAm~CabJztF65~MoAkh#d3~_z{ZqVY#hFuwTRTX z9~aPxBYvRC+oWRjuY`5H|JMcc41Q!_(2BV~e7Sbn{7F#>9KXePv*PpCW?wb7m=?2>G9dqSax2iHS>q6^OoKO(G57=;yo1jWKvFjg4xxp%Yk9 zQJ9$=pO98$V&md7YvBrGGc$B(J|3*n+{S^-c6AlWnuEbfXOrAJx~FFH8x|e}gD%;-kJ9*TaCPzUk1l2~TS6{N$pqH2YSn*>s&8%q zZL)xMLdh87rIM;o{`N5xO!=$!FaPJgIkRTXBA4UiPZ0(Y$v#<5cEVJV+*mNnKSZ2c z^dTZ19EES!xS^a1qK>6-Vhy=l9w)7jC;@6?5nAB-~Z?{=qSwXOEL-hh^T`q zx1sS!o>DYKZBSBRV^9ei#7?L|KYB%KU`0R`8bmbOLni-C@-IZk(2^g`fG2EK=``6( zF7{UcWC^f_HngEl5V=N+z7~5}cwinBLyIje2TdcK0Z4KDS7=Kl-(R41mbh!4Ji2%D z>V?r$Cr_R_J$m;1*wyQF0?@R{<0sIP4Ol!Dgosf(63>;`Dq7np5^wF>foEy|ApqLJ zy#u{1m3fI__fBrBNPKdnH8<+X#Y4M#2wY~UkLnFV7cAr~iO6{)H#avYCnuW{$S<>* z<|Du5_xemCJLHe3<|QzPj=rHI=Wjkmp2#Yx?;aevct@irwVF)yp(AIm+_;BNDoV`m zlMLqBwd4IwB^j~Gy|Gh=2DKu0ZC0( z(bs$e=#X^F1%E65aV z3Vu}q)94*Mc;ft(t5?TPAKAZW7^l(Uk&z>Z59}G-v9+VIvLqiC!%Hh^zvfWm2dmZ< zuBuY~n_46rrowVu7Uatb1qhNuP~Kp2Y6gy?VoHszD&)q-T}xs>UM3kI5jwnWPafX8 zbNlA?iL2u@T#ueS4u#t{tk#(K95{UJ{4I^1(3Jv`v8d}0?KyDtG+gZd<7aG3i0M(2 zR)~x|95ZdbgNII?zdSy1?fQ+Iw{G3M{hNC~J%9fA&gGHbviP4)^*2?P=!)M{t)u7? z(i|ys?qre3mEt2o+0?hJOMEj){z^V#PEJ(r|Hw@iiei6r%YLCFT1LP=?VVD*5 zokM4y#N;*ZJV`8cJSo8ObaaO@c~Kj#f+$c!k$4Tzr9j_wDw8;=gv#f?fBVM7<#Q)T z4(=Zw*xrK?4r^9kR!VfptX-2cE!(-c6S5+bxj*LU2M+%dU}2cVFnDle3Ej{S56td<;SYV>(J( z)V@7~JGXVWHzOdI71I_&69a~Yu+ZoCuAWn!huE5OF;i=wTswtw*ichl*V?=L`1oTK zi?p1g#g&a+1E^?Jw3E|?w1bqmqCg*v!Yp&TCv>6D?p(ce;ld^QkgiPJxOsj2!sy8p zqZhA?U%7f43!H#g_(()p=zpz2#Ab=eH_I9pPg-%s8qQIz#Vm?MHsVNf0>%qm_X6mm zBlyzN$XO-hhT;-AlraZ~)5W~rs-EsYx1J&t-hEpeD~d>z(PjRcJIMot7=`yIDJd-Z zHC~B7X%oYe-sFKwNC3FU#l`__)8>arqCnXW$Z4ojn zR39Zpr;7Tn;j{h`X{9aw>o<^d;7u|x;)b;?41nY~p<1LpBWw8)gMdup;Z8#d=*POJ zP3TEUK2HM=0W*9??a5(Vb|3TshMHq>~ES#mwY& zO!oxm{;14&2PjPYfnaX&CVd?F(OYyUfc{BZ{`=qmu6#D(6SW`u1=X91P|g-6_*zmRUJny~6u zYLx2GDsAHK89AW z3kmewvU%e2#S7=pQfE7UjDvd5?jd4z`g(hMdT<603?Dv2YG61*e0E`ZZBtt(#j3-c z$=7be=L2b@!tXZuDk0d@DHm`~CMAeF;t%-61-=K9LXS5mK`X(@-ttuO*MH<`7Ob!0 ze!f#0J5>@U^%W)I5A5M`T&teNVlpS`1p|%X->TO&gx6~u%o?$mv~m&Ei&s+#j>0}l zF%_{oI3i*3GT76Sg>z?-)lG}PfO^67b6~0q7EnJI*2>zOMZ?UD8PmA!C=kwU@!WXK zL^=x%^v0NETj@cQf-n(=9bJ^aI$IlStC*|CS(wcrY^G}0Q5)Q`bLY+-+tm_74}NXA zPv9{L#jR^<@3nLG3JhO_s-})7kY&gyrn&PMEL1r&q?Z;XvH#)z`&#q@QBgjA;2qpEh@u8Vx^IdR+(7ZvyAz8&`$$8b5y~L2kmwF5f}rN4}Jv= z|I2&t{`t={rz=z6RjCbX5-$nQM$t2%lL*d$jz>!knE(A(0R8Q1C;14VJQj~rcwkJx z3;+B6d48$>H31KR@iiz9yMXcGfwe*LC=k(s*+E&z0AfOVO@(2xO3c4Wtps0)9Q2bI zwYplV*~rca=ACqIfJ7eNzIy5G$)gAN4r3TJ>MpuK{@i(V2l{q9eCNvg8)3oSk6LyQ4nV)E2#RP4^z+9-oEX)Oh~64 zIWc;EZ2TJF^7fs(_a8kArs9*3q8f)QN%F66YU{!~wHs1#^yJx#m#1N z6SSf}C=?ge!xx~WZW%GL+PLLXa*!i0M5DHiT)lkh!r3#YPmi8Cck%MXtq0FSbo5bT zTQ93_;0UE`eT+l)`W>1?Uds3?H7FzLrMa!Er+1sO;}ddQI+|RJ6_SNmFXESe@`QMUl>S@%RCd6>UIuq*IH5y1ZOl@oFV| z5-Zw3R4Huj*cJP3_SCS!;mTQ>f7(z7vjv3V;6e*^Fd z-x)Y~>N3b#FX{tR$gAr)4Z3@A%&A)p&j&D5X?j~2Z<~0%as5o9c|??gH`I5|&DCbVBb-R6sIW{{=pX4G z;Gmc4Jq0fnri<%?>ix!z8?_$aGmk~;kW@El=3EU2$l6W8_j*5*xB zv~Ei8l6pXehy3Tu0}9^|BksjI1PH^{;T7ijHog?8*l*e5&#l*EBjOli1*msePFD4E zfcsv4lAJujcS7CRvB~;X?L9b$JcUV6_y$f0W{gcpP9qixKq$|kO8?T+l48R{sme*W zu(d@;3+tUrT3uOAkboSh!WrTd-d9NlcT{?!^-@QZQ%|Oai0R3PckPLYy+P~#2C{~S z2ZklxCh}iJ*v1pHZy3F*SDgvPL&dEF7xxd*EA8${{I2@QqB;pZ=ujuO_fdk_$g1#B2y>(G&7Cr8g+x^j&nk5YXG zajTF<5EjNS$y(Z?erBvgVV7SW8@qJrQuxK+T)H$iHg@^)l`G?Hlamj3*v(gO+_--I zx^nH8*Kf%E^z-BVc#j+IyZPpgYf>Ph{}|ilI@e#t;BsA8!ZiT$VH6Z@!oiRUw;pBUmd)N zTS{3#NWx2&05wnw|EQ`8KZ81vdZgwnfR0tH)f@4OF$pPIg}{rwCup$_j|GnNBXDG= zyhL0AgSb%Q49p}yudP?Q%Ej`={R@Gy=w*8cAIcWU+fw|0HMyk;L{kDkmc#m?*|?nouCd)?oqk*IK<{$-cnGU>>$E#7t-UmKk4C_XxfkZWUsw zw|Eunhm}>F^_w;n@9m^+Y-gv~{@D)m&7|Li#sW(H0?Qx*^B9w{h#IER3T36TLNWR` z!{y5sF95#rE~Ftrpqb9@Uj>(o`|Rb0WT9C8Qr?BULz6ILW$iE5tidL+iiY6u6`?DY zRod0RlRvCr%Hq-`a&SR+fBv#6BDNO;hW(I8WQHh})LCUKPWt4&NX&KKcegvr~0bZ+W zrAFDTYccp41(aZ31%ivDgxewH#ghkju3aWJl%man0|ySGF^?QOdHU>y%M&*-oN82f zJSnRqJtn`aE>M;@lBl3)8b4n=fByX0v!_pf`swkbN4PGu58io*0r&A^PR1wFefli+ z`M*4Su6y>!=Pxt@+Qo+nHkWc$u;%&GpB_Eru+`rEmwR`$_g=gIfX9&f?SHeoz1*64 zc11LS2c+k%SWSwbxus>KECX2t78ZKT*D?Btwi~wI3k4RH$jQ;prnjT14qgLo$_F`Q z{#>pEQ;T;&&M+igIfW-t290r?Rzk7Ztc2wPG=u;~Q*MKPRMfX2HxLczK}0-w9j~D! zFddVXk&$BfAKV_gIs{~^X-;JfGwlc3_q89q@_sEz zPmcmR15eOAkRDJ9X72RQ^(*x6@k{Ve@yqe=3^?Fl8n7*JSVhV6p7OY}xyincLzjJ@ z%3fQ~_M!bF7`Sgez%di15?D;P!We}U_VjHBvhJaVd*moZzSC#Uo;x3Y;V=`M?oH%}T(sHU!UA#mcs?L)^q}PdQ5xtonyz2t2lF1KL3S_x=W!KwHMyHc#%)R$KW&>kGuNo ziK|zyjswOo%lp2lyP%v`&V`;;&Md}GqFyMej~=2BPgS~qd*4>3HL8Uhd6PJjI1Yda z=*&M?iKXWGl4Ph=Jhj#k!SnNKC=XCbI1SwjecFna2-+}3uTeL9*#}e{%E>JqNfbO) zK;GWnw{vLU;p3wh$8Qo;H3`_$xYIPIK{&Y4JESU(|D6VjtJiPed-&wJx>`i+#{t5& zQb65V2o3uR4^cZ6f*vSM|IUG-VHU{2Lz*Ka0>{x$=i-3HZ#D}7Y*yQG(c)(thFMPvdM)g};YDz&W8;1^FG-M`E7fb>W~kncTx z@`TVLuIs)(u>N*q)7i!1c*%@qZFI9bluo6?NYHm%D=S2bE0~<9W7J^(=lKUo%N_U` zqP=`sPGl+WPu5tZOv$yED=*D<>i+j4{Q0*pWNVXSnDPg^+azXD4_+!r|AdTcsgUw7 z^#wrgWRK*ZsE(G>AByK`+m2o8lY;eZlQu#dP83<#5^7YFR}d5n{`TE05Cg301d{KCCYB3SkByKfvyCo}HeHS7c|-|6Kv_Qz}lhLW_z)MHHP%fir2LEc$9) zO?Yj1oq^nWYFIS3mWUuHK0CtG)WWpt`jJzLd#&DVz>;8Y&LqK~D(Dsh;-+;CcTt>Q zlT*jZN$03_(ytG5=C52eZf-O_3nur33xGiV{3jI!xIjue`VFM38Kc_(SPM@+)hP}+ zsh07aQE^qv@KTb)v?l5zeq87eR#ia=s-I<&atb5iS)Z&usLN{deis(~=H&(8(?b_2 zVb$vEUZslF(4aJGn_L=y=GPSQ)Rm7NvOvy1sVz^osszE8)ek#KCtR`OJJ{Rql440W z8*M9NX8*tAQ^YIeKiR_mxq)%=$|6(JwP{M~Jk}O00F^{V&pcGB0>GtaNeG+}hD~g` zT;rF-1{T9Lc6AYxmRw-eYzMNfegUEzQU=2ZLTwd0t-X#86D>Ugit}%QrLI`8xbSN4 z2KmQ|&#$@m0m8$eVW=-k(wm~==D^5_oSJJQ$W+|CU&zs`B19B=Y~pw!7A;w3I0;_G ztjyOYeIPG&dLSC0RZ!ae`O1Ruh0228^SgPNwCB#Dx;0yleu?gxIa51BKm9c@=d@|l zm1$wq-OV5 zlRz4LEI1y_w4OCZ5#C+d@Ed3~^b!6D0aisY#rK^p7|0+_Fe4g|)wy6ATiNH>=w9w~ zlbf8n28FGvN|H3ei|D29oA_7IA5`igjX5gWhHLW#0j1>jx=M?OqpELA0&Fu=Q>}^C z_#H`6okZ2(=oKpxjM5A(jf{*|V9TC#Rp5lNV)Ik!st>8kf?N`k1yR!Y>t+O=9^ok^&v&P=~fF%Pwf zw0s-c0RmvgJ2WwYnf$xtyn+G2_{@*Mfkb(8wleGQa?{1*0qXl+eRhb2rj7WY>sXet z&=Ol)TN@i2opqR1tfgY5vs5fT1JgohAT{z5#u6p_PhznGusP|>S+-O3Kdlf+=I$DX+M^?{yjo-5h!{@&(pAG(i&BoBsP+9&fLp~#+rT9Hw3CIn65p*Xg ck%*iZ{xAHC{7V8}1SST)2#95@_R)a<3-WcQO8@`> literal 0 HcmV?d00001 diff --git a/BCnEncTests/testImages/test_hdr_kiara.png b/BCnEncTests/testImages/test_hdr_kiara.png new file mode 100644 index 0000000000000000000000000000000000000000..2f4264d1713f43ccccf10e0952ff0fabcba0757d GIT binary patch literal 661964 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%0A&+j(WKGUCr9~f4g7257SZ## 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%0AMGL@5kMXEzpD($8=XkcWP$!N)phyZ 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%0D&}O)?GJuhR_Xx52@jMpC~W?ss|fb4YDa* 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 z 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

yIayP5MK_VP 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
&8;PP4MMv#_Y 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

`d2Niw>VTh;E1@%U&SQ#a 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�UoH8-{7q&_s&)|Ph8E`_E;ccR1BZ*C4JS7wUVKfcDx_*CWICo-d`1;A| z;jevlZun3C@ZoSZV|*M37)_kXSQ#o5lOX1=$GJHi`6KmTw#vPS&&tX1JfLu*=LoI< z+hZ=o;c7?fJRi=aZx>I^6`e8>9z|;FVtYIT2VNO)9pKIA zd$gK?cjQo0ew2XIPp&-NDhHX&zzZ@j040lWzLvRmY>%Qnry~pZ45#Mr7G2eA=#@iL zg$M&=C15<@%T_1i#qjOROT&YV|5oVpOz3Ux*|U^co<%}o;m4o?T&&&Ej>}yW(b8B4BMeL`+-X(nf*O+iOG4DR8&WY%bKG{dveC;s=__{gG5P=;UVhLKP* zqHx>f1^RMxo7>k;M75J=GMqtuPuRFW?S-U@-fStMxIIhX^riaQrX|m8{brB=`h%mk z82VC_^Tb#r?`Jo5hMUoc`cMWpV>qW1)_7`t)X#QD=^Z_A^O;_|wOwpQjxA5@;qAI_ZHuGO}z^_A?dZy*dV;zHC% z+sp(cRaXA_%@|R+yc_ss6a^;?O55og55nV-qV-xe-4<982!+3Kn^->Q|4IeV3{()z z_9+gq`9fDU{{b)NS}O11!vct{zt6(wMKgIG+Qs9Z8B$6cjZXYd0yNre{dKoj&a$9` zzF#^qTLCgqL9XD%v9`W@5PrHFTLr&#+?s1VGo3b$EgVT(2g`Vtk(lNRjxA1>fy%KW zca|5Agg!EVLv(5!E33d;ksVh3@e-U^b+^LH5dzYq-#9r{K?REuR{mr_I@`SS@B9>* z)bNT|*$LX~{eWlq2$R%jEBO6+T|O3`@*YjgSa4706AktG_DC|RUtjY-(upgyhXL!i zjCm(Eg^Yx;EBU^^HfM1^_)WH&Y%VnEkDU=QSk8Z6aYqk+!%IcGL6raiTTyLsU|_&x+QpqzQ}81)}@}=(V^q9|Ft=6eJlCo zKm83I3FOsv_*D>QoM68L_xVaN!Wg?9Pgaoe=w1fE)|01IssHonO-|U;7me3|YuK(G z`ttz(w35$;;t2QS2aBiz@J}CvmFrkf=fevI%;dgby)ZL;7JS+^&8E8+CvD=O#eu0> z1bgq?%<$j+pgD1eLPLt=39y$OOCR)){iERAHOSe74TktvKu-4Y`Bqm`k((h zZ&w?C|4;4@H)6Y4HMf<;+yL2mpWWRmJN%d5nH@g8wOg5$0%aWpjn$uOj&a7FS2d$R zZ7~@4q6=mT0=RA@&*Eu349GNF0nUb&KD%qLd$Y4Rn@$H>+vInV1NPZBxzWvs*I+fO=b#x zBHQ+_{mRPlAO3b*VF%y;bbI)xKU|BmFB3ZcR_NkY=;Ckvx)U{q;SYZFXm}Q1;BlS_ ze);WVRjcijIOv@GcTUgNVva1yfAcp_440QDhtHzxfo&$g|J_H!Pp)qaCu9F!I6XQ1 z>GxMFi-Mf6pinY2*Vb$P;?5NOJHOYm5s%KqFT=PD4RG$nTpjxW6n`s-!haBD5AHmA7AIDetOHu_;Qr&?Fnn_anxWYQ@6mA& z*2A^!nh1_4BLx#!`67QX03nJ85UZio-mm;gQB%+cpTU_igK9t5A#l#Y-YRmgmm*^? zI6^)YBjnLWQ!!jSRIu8aYPt%`Py!b1CPnnnHFH5jK1>bw?1<hTu6Dg|QWb%keO$m(}KoQFdxJ z4(Zge5js%V@VlRH*B)LxqH-;tg3-Y#mcA#o+Wvj%QuvzzLSUFPBkjVv46?lcf)Y<- zj7>nO3YqK&G=XLWM!p({@Eh+mW%JK}@^tvoXRCt(Nh|Yh&bPv|9KK$`7F>H6M^;HS6R z3XUUFfVvv?5lbls+fUWpI5hl?UpX;+dS@$hXus%z3d+f%p_HyZ+zFjWMxotw*-?Os z8JcT``*ivyBLuzlJ!I%17%ao18#&M^Yl;zIHLX=cCik9K6<^WlQ&Fl49V#Rw%1u^y zHP3=eKfS&_9F5U%Cvpdn5w<3wVZjz4v*J+{gj6&A;WQo0ANgb@S!HaiK<}wh5t*X? zha&=i^!fT8kCN#Y2@V!h~+o^ zQdQVoanNg(CjWsl;YX4}cW|vH$mwHKMbCm)Jw3EtEhC_F4x0Ql00ndpZ&ExWtJm9h#t7oSJozo^t_eP&em03$fLzKUKBkBogLyU9m-i7xVNvXBm!CQWBOe;!@` z>~)}vE@W_Ob3bUC?kt&+cC<^UA0LlH)D?W~jCetF4gtCMv#VRNp$-L?vQ{RB2U|~T z%c4TO`f6*^c5JT)k%tP<=_@%c!ykRkPfrwnYdcK9i3emPCopK+bFhrdTQnneylt^* zGE=`ptu+SV89{NJ$wqetdF}Ww`W&w%Kgw{A{$LX@a-|ZR;T{lGyNB+CUwAR6rL)pk z!C*!^HxjTTs#a0@reA1+!~Xomvzqs>yuCPl^DFbi($MVH@BIAHa5Z{;bt}9Oo#+{0 zuipW9YOK|GOR-2goDBCo^1joYKGU0=C^Et}EI^WxXMNSPg2LmofRXyxWq{Ob`0V|G zk1xI&TXaM^CPPMm(0Ci|1eduikEr{7XHLir*@kHE{jp}xjp#jv1Z|a+VMv#-e=Mk2 zIH4mZk4#p))ao*LxT;vTV8_9d!$44rem9aXON<4+8vYK%mYN$*Mvs6G&d1hx_-y#z z=bOXr2b*c%Dy1>E@ztnvA9S!S+Q+o#8vo@o*W#yY-}~@%rx_U^<{nPadkgSrEca<6 zZJICbH(N7!%9wiAPd`>%hJ`>E`u@FdogS{O#omwOZo4TSx%F^+xO8g1_PtlZ>DW*T zbl;C1M$fhW=byB2EMvc%Yr*yV>s4b3@4bI+et7%jRLRSq-QKAA`S*YK)bJZ`&JX|j zKfOPEd~1#JQO$DV)V)Kmowfi1%TuQ<7j zqY2a-xRrk4L2dCt)Df~?ApqW;RJ3oJ6{)39^bc)!9n1Fen>tzQkog`d<0Erq?(k08 zk|rg9ufg;YCr89Lj9lnGj;)@J&dDy?COWn78eTNsj7#8>(|$ekLvEQ%fhqSG%Sajp zbh^b;b~hejhoy(ZvG@lo3p2w8k?I{M<9asb^ffzg@u!0iM77)BCyM#YgX+nH@5W z=+UXlX8q{n`=yUA$I1W3`MKd*WZvU3d(-ywOK0YWzx8Wp>oZ&N!<(DKwa|un0_v3X z_jsDPpNnq!8^3a{zT4bv0fo7_SHu0)(EES(zxah$_cGwMDByqeM|Y~D=Z{VdCt{d> zd_NBTNH7SP;gOe8oNvT2x0n8LI&mz{60p}96Hsm@fnq^;RzS|L%ny&(c1qY>TA8k> zk!p^QV<13erKH9X$V(NaxNu^kDtNyo0I-uU5prG~|0S9#0(~nAZ{*+MCCUvP$OKe< zfjAJu`J8<%ISr3oC&|2>o(KT zs?MA5im-AGVt4GsY#ccE5lDyJS7Ih;TZ98M$?9@0QlpmU=Yv46z;23Rt%l7GLogMIVSAYfiQ)M3{c>}`QRY* zKRk>hK#39NaCtO@4D_c`{nAzick;*SFiygVBBZd*I~-GbFh-=Tw#Z|~G8BX@J1J!72x^HF$rGY=O}&llhR`Nt0<#52C7nPDS+0rzu# z$L;f%sxj{b_fE91l_Ab%a8vUTc<*fHDc3uesDI~NVMX%rizIDsS{JfN7uIo$1w?Lu0%#|hac}}Uad574o+vz$;Tgjx>fyB`5I16AD@h3 zeNn3l0%;9Q6aN0A|34+a;; z@%(A4lu-wdjOX>8Gtj_EFL^<^|6+beq?9 z1D#QjXS#0Uuz79$YxguA+_FQ+O97vK^Pl%^?yHH=mD)XrOKzfVd(gGVq3KSfeb(rY z45sTwkx*cV8J!EX3%8x7^kYPO9F>XMUUwv>Sj&)nS{ZYAEmKzgW?y->c`Qg9J!qn@ zUdBHMU5Qy0^hecez!`SfmEL(uw7R_HvDq9Y*94db!2He z>HT(|N0$SIqP3wPekZTcsVv8CU%@%t;S2n5V%(Bx!N#dGP9bnV9off6e&Y-G)-iVJ z8{C6tAE8mfO7ei>jM9h+w~MV6S)4o!lL z2pylKFC93I^zW~}vs@?7{3trh@oD8a1*diDQ?6nEurn6s4-DtxMBa!^w;tVbF{I7rabiKFo z|M~qVb&8c!&}s|9C_eOM$#JQ9Ru%2docp^NyX0JS?|0HR8u{(7A0JLH&krBQ=lJob zkA}00lfySJFIM4Wj^zLIpWM#eHrcP=wi~{Aa&EZtpy}Pe@a9r<^WovY|LD=^MAIz| zf9!EQ1;=bG+y6M}Va@2drt^#^DlT@c>hdp2Rclpx;?wwcr$zkkm zvck6|U(Hz14fieZQ9q3P4(6+7SkyTc7F5H>uut9b`K6e_-Jj|iENe~{h$7Czfs@+ zpZ+gD317wT%7AP;`1Q9Ih95Z9D_^hy?u1$`bxF}xX?J#+fVuomBBHGdY5 zuixF-J2eFU-XDt$_H76Bf$RlAZJGK9{)d0*;;Y4_Bg2&#$T#n9*E#9`@n37vf=@#% z|Lu1l1Szemqm=R|nZeUBMnPo(w4a9S8SrZUIGc@+JYG&J4jd-L6B1nZMfP#FUhww{D=e-HGO+f%-J_fimkp&EPGX@41 zVwOfn_*q$VkGcRrbc+LRZ?bm$p?ojh_yF0v1b$BnV*$JZ}U51&1HHhdCBcXUh}>bw?MZQ$q0vEhLMEXMrN8vGrP@#RgDbnkk3U-hR1g91cm9s9DS3yUCke__MRpYVk3eM2&>2Z6NNV*kF+o>)^Y5n-d&fu6b zD-i0C;CsOr`~^Q80#3euGcMFV;V8ADm5pzI>uV>5H!m#>|L~t*i*xrZO7HdjP)t<4 z`Y37|$l4JQlYP>`Gw~7NtTV3R1sWOF#{92>qT}k~I_WNSibjDzfDAGC>T|7eB-gVp z=tu?(;|}N>xn_^Q6&N>|H#(>Kw+{h(eb@)^t7YGFd>Oyy&t=cvXv0>d7SAI?~;Fq*>$k9X4c>y<#) zz<)XWfsUX3(As3|w;ybC*s~Sz@u4G?kziE`sH%TEhSz5FbCY##RY^OQf}G|K$7qy# zt_Ws#3du(N%F$HO``y!Xbz+7s2aHMd!f>R&++%F|B!$)eeICrS=je9zIo}K1yT*Th zsK8SCw*Nlhy^sA>-(6!a`~g8x7^(Kimt4r^0BGMcOU_3&xkgq2s8sDTYU^X^gtnVj5Ll=3*)m^M!ypNgJcZTca7w`IaSS=Du-*qP{Ix(58EcaK&e^zVN6QPpyC zTsa7J=e`5O8_~^g9BuRQ{ac&EXL01nI=TcLTbLYv?cL+UgXq@0&2J5_AKl)qEr&Zh zyT$9qPp`ata;5?-{1xLn6`S&L?8z!l7`x$@-#k{1>^%Xn;2z)0{M!ug--}KXNQEPr zx}12Xh5!Mu-4On*xU=mA-A3}P#YxUG`@9O+P@YqlPC>fXQbiwbA!41o1{+rK0CkSNK_VDO!)%|PXFRx|8g!U(*Gw9U&p>?tn zt}GhxMGqZN$ggDpyyAnVO)}qe^~uOD9G@Mo#ctn@v$V9JHiAXK7PwuRJs6*Os@+ z5jYem889`em`FQf#VQ44z{y^Ocw|zbz{FpE|LAc3?DX*SD_gZHXD=#Z)?pyRIv++v zoK|+A?O~qV)AXb$0!R3ilFx)9{Bpqa=esY0Xw{)%K7Cw5_%vcb759xW-D{Q53~$vI z84S|yj1dt4!qfF{oSGiq48xyUZg^R{pKCMr^$;Ss7e~jQV8jV}3aK;`Dc2+2$1#nQ zjF7@`(wHgJ61wR>;nYF2he8AW8pP*4LM$a0JYxt#91ePo0Z>j$K$=WT=V{O2v@-(D zm;0MCel5T$V|$*);At@_sPz2^ib_e#^X*4xQ~-jdp9B6RG{SIr{;J_cU4s*G5^q?^ zUXPd^pQ{ZZV#^?<A>&!ZfyP#KT3*bgo&)p@I1 z+fRqN(C!;~z9`;jw_1=55R9KcU_>+{7CzJcnnQHmc&|Auco8sE`}@rLUc?qO!A9A% zy@tRF3b`QA0glAOke1FtTq~pOMffkgm9d^UIy1~ga)0m2<5F_u0$F$a!FJ}c-H-iZ z!*d(?H8d1g*$(G ztsNzEDs7a*l{N)Bj2&?NC)4($@Wz$fPfA_@b8CO>^5S$A1hqeXC5}HZulCeEe{rbz zsBjb1osAOym5YrQ{`^W?8DONLTliHixYgHqS%J!5zc@Qw7o|-<6*?7R#$OaumsjS1 z;yot&X=So%F?@1wD@rdoN?Woy)MV+$=(ykb4nzUl{xUCMF>AG~9eW18^YMB)yys5J za(X%3c@R0D`KH7ax-mzTA?W;QRqpc2%<%cW?UExc6}rh*yy#ff%Em~$6Pb(6I`>xL zr59BVc`3L*o_;>aX8~5}-OjEi=NSg0I4VFAql#<-Rtag1p+?_tqCaL8FFu7 z25m)##4u1vSS=d;WLV+7;;OuHz42LTM_(6X*gx2OF(k!% zd9OdM(E@YcKbZs5tk4*}8qzBo+SqBUid~;t0q+3}22TZK%CO7#ncFTejTuhJN&RcG zq#5l3Ubm{!2syu2Q7r@Q=LaO804D$kkD zy^h~gk^fP2>TH}8G}uza+t}J_RC|v$tDU^pKl+IdFn8MKbQuG~z0psM<9v5MMwqkC z(F|RknG5ckGi0HP-L{Ct;q;xtT~@E@By%drqd>6A@b_1D@*SJ0 zjUU(|qHllkgA-NL;L7#&;qm&@!W|ka>dJt6&}1(F0MhA$sx-E@wV)!<2W+P)`7(}G zHkKfki~@ibz>Bd45fI>HPmpQ!m({vE>#>J29ym0XMOi!N}v9PvSfX^6m#&dgixiEMr<(o{J6CwyK$nCv@G&QviMYYzAyM?U}H?+kYK^S9E(~ zd3v}Mr|O4sqIcp@kRk3n8%Oxq(vjg-oYQvPBKwUlJQzDGycV7zk9$zD0%H51o}J$- zn`4|qcxQLYqMSYaGCD$l^Hub5#x&AoEethu4`=6QhFeweJPvwrICJ1o>82;a>0}7+ zc>2ge#b4mfGYcgz$v3CnyuUJ0!RSAWgJ%nXfT@DBfBRd@!^g30|KQ4Qbi!7(FMIA} z^o3R9sv#AfiLVrJrN0c}uYBXw@a+%U3h{sbkM0cD*P?5~cfhp=gM+7$KXh@)&U{~E z%5xnNYMY92c6;W%*o}|!d<$V{O%@Q7-0%1g)mZez8*CI}m|g(Oq0#H(DzV>vFCc(N zY{T>2{phg1LQj5?GiZ~Xlx4ga8Fj_B$oz)(OJ@4ZbG*vpRN#-zW;~pE0X%*3Cqr8{ zU&)XF9x^gL^i`87jrQFSS9qyspw;#s{94!XpW63-<1d~ZesW`b_*v%7I7&v=_+m#z zp52L|DrgA0>@)V3trMM)d+?v)i;IhSVGi7#GnXAF3n?E-I}nH@G`bExOE9$Eh= z<8sgG_>Oq<%&D0=HEDbGSrw0jhhP2bvEg=X(2s9zkC~_XP|a3R`QQ2a(fAkBbut(D zFaPw;@bTws<(K}(2girs`{kA4-tN|LKX%F8N6&}*k;NZd*1Y`mH`a8#m z1IL%0F%RcjNe4Ew~zoLmFG9Tc)j*818@qFfpq; zVeByqrrl?`E_$>k!it@isW3zBi#oB_m|cGLeY85kQ+7MEIJx!R51gRs{cQ`ni&clgiCle&g6w z5#lHJc7{h$9^1JF!}N>>z+qLzSIq)oRytp+Cgmfq~4R2MjYpQ`Cwghbw~9 ziZBq2$Z*ov*G>~W9T)>H^oT7Rnit&QObc{aorV`+WgeOtoK{*0OeZzCPcQ{wrtn<# z6Z3VGmVt)x;6h}vkEze8)M9P;s>V8wlR@u3V-Y;!fT@Nmidb#9KL1cm40?UaEpCXQnbAbHh*KWd8g{tF%tY>dWy6e=Dj- zj|Fzlck{%#>%!6;bVZIHDDihL zF4Si$$qbU45nATv^6@GD{_rRcIb7N&|H0|G;o|wJ7;z%rPz)pc{i6 z5O@M`0WO?~fR6F=QRd5v>$#(Cy9|SnVZs=3Jf0PNDeP#u*TFD%3|@Tw!I_r2b>Z!~ z;qU#y{m6xeKU*=Jq~Jb#V}Jdfh2h87x9fNqFdxVCz4NoRigqvU_w#<&H=1&Dk8LLI zN2lr*;Bx^=D+`XWl;VFi?N$8&E3j7lGCr#S>B1h^H>koiM;M^r^C#MA5F7+XhXBB< z7mb%yP}UBmo~bV&$D}9rnjhpidjx0;D6OuTEq8p$C}V4_bQ}M;;7c z9bCpZGj7{WI2j!jm2#=?Wp^Doh+g2S-QULVAI5&0|C8Y*bK_J3SuV92lV^JcUANM0 zKq@Rc`RtyPVWL0s9Vf0C_{~uJmqBR;zo)HA?M)x?Mh}j+7592qpDVz~ap1uEJht0b zom)Fr1y>?RuHJ4dMZjM8i_4S4pI>bO#20Z0^vSdR8T*%^%T{2u$^4NK3`7O-+N!6y zX>@~jU2e5ZUj#g5LeV|uOW!@~c?^B?Nw1tgIa>kI*?qxoTl3fFyFB)t6T^%3eHh#|>rzP-O_kOYc*G{$V ze%m`wGLDJJtWmFSHGR`hrICSoC3qvxR<~QFbmQ{8Ml_)bg3@SR327V-D`6BY$YG&hujv_c~3p9d{O_mCp+nvLHHg>j3?{Lpfyc>OARnBv-Kz^4+3i9H80VJ}<*qZEPhvizfR``$YB-oR# zjr8;?&$Mkq(c!6KK2F!hxLPWk$v$dr{?6Br$4)phT)iKkBzDxzyq=9N`^D(rA6?rS zHiMhf#}5sc#=y(N;OR={_ts_{;oLu$IT8Fierzrd*w(PQ{iOKac2o9_XH;tUJB!1$ zwEuVw@5C3#_vVn!f=l-0e)$b;WEXixXV#Xm%qM-#4ze)Q7rTDt?WN&2F3r_8y^n8h z)$9FScVo1{%hX>?^Kh>Zhxj@niC%IdNJJbD&*Uy8g^>{*s}Wq}9xiXN+x zGI6*a-`Jh!wly-pl@4t@(`f*^m5&hcYCiR)oP2YY>-xyiI?x7s?oeCTL@h?>?~H+L zsK9UT?Rv=b$z{*rW1=nmcs91*sqleoes*J{GQ#P7&%JbJv3xi|9LJW^pC4SFA1)uA zs$&H2uEl8&J<$E+m}jZ}?`THbFW}F@?Yoy0SdJXHy&n2&`tZr~r;+Q2hLe+%!_&;c zdkRX%jsS`~-*}*gk}dE~MmjP)c-#tf0}J(nR%ap`CL*_OHNCwS+KRj~&ab|4Y`t>Hm_``vGzj$YUu{`|v@%G$E6dQrqEaQM*6+SYvFKlr_OU#;F>t1s;#c=jSj z^V&{D${Dg>iPHi&|I%Mnc)k}!qF~?I0IT##l??#D)`KQP6fYtO(4M!`)@X5H{P5-3vBVvH~JD2INmG{nUi~~$s%#`mi zr~nEk5oL4?qznp8Nl&YLGH$@RDJMRH*j5Ju%J?}Im_({)LE5Qw=aPOkh#y} ztKEo*y1stP<&G}vDa%l0d=yN-W-2%Nxz|wG@O$3A3Z4|d6s@-s0N_=<0Lr(wi8nwO z+B37cCQghk29F;<85Snc-QnTxqbKRJ$nUdS@vs7}`ZHx=MUk^kc`*X*trlIh$A>^~ zf|p@=pcKaYZ!8Xf``at^yfArt9bq^9AlQ4Y5Br_|&bOC_Kl^xl_y>RTc=&IB^f2?6 zd6LQy=zAwgoHDM*B@qULh&Mx_ueR0-ZN4Y8o$c=Y)E`}YSm{dk->VJ6;IP_^KFy69 z8{5GnK~8WpVE(mVJU)E=!u;@m{s&iwyZ5$+(;5G<;D|wgW@TzPeRh8M*(Yli1n9J^ zUP2YXY9FhBBbb|M#*e6})y&l~(*I7JW>-aa$yzB@AS`1CvX7%yI?crd4$4gdX%aAV_(VTxgZp^?QZSX2|10Mnn zjEOhS&QzePN6i&9#M_*rJCs@Q0KRf&dbkwF?2kU*D#h$1knPYYL&)g|;LVlkVK>I! z^C(wi{gY4EOFqavVl?9c0Y#3dGrS+6k9-Hn*8V zk)wE!?CoHc8x3~g3}`Oh2sB-X-|1pH!?XJH1SqtR-uw=F@V-0$+MhhsoIbpFroU=PPKczd< zw!qTVRO1I*u<~`Y%Z)Y=ws)DZWkD<@zH_4Lpx4yIvUybP=Ue7K*3Xc zsyiOMa3b(R>FW%~S?{2e{_D)nX5^!tj-TpBBc=*k7wp5a>wRqV*1m7Y0JbcE`54_> zk-3`|o!~Rq7p_Ckd(X|E=T#bU_(ryjY$_R@;9uMh0jr*io{Naa?*SX71>ile0woA- z1dC*OS{%cj;y*y{bzU=;I>%oB@}0~>cV9R@H+=o#!f^Tge2n|u;fGgthR^Ojt7G6E zN0!ymi2?Xx_q6wohro!M*ePwh5wK-rHqTbe>r8YLkhQv+{{6{Eo5Lr!w`#xgyXU53 zSL9j2$6A~f&*)>P_jT~iQ%8rT=v-TTuRna8-#oBATfh|v7OzKsa{Nw2u6^^ZrQwqs zRwKv7yKyc}ecsk*Kqr|3HqD9o$;d$apj(!b8$8LSaGt3x9j$mZCtu*J(=pycBWwaE zI$7w$VDm*bEr(r3{~HUEFisccA>UtIRoDUCcCMx`15}z$5q{x<*DIY zaU5^vd3_tu&G>54%X>hMW6vH{cVm9?NN})Ob727xF5%f{y5@N3M%E;otbqIoEQabI zg)YI%&|5#&@qu9Yh##>4#uNW`l}FM^r+y5#TK;b8M2bj9h)tif}C5+ zoGykJK8@Y9tH^5XENS{|Z`*MN7G$h^J$AHH?AEs0sdyGHmX~HjL)+EAL&1fN`ST~+ z;?1>tJLRvgvkNn3`bYsua@;YzvxnQ3%Qr90R@VIwKHsb$FFS;7dNOv&k>CN)FBYKq zrnU@_9mG3d92l3(c{K|FTZ-)?=mabl@@FT5^Fs&PJr|eeh6AUL&%BZbC+)Zg0IuKJ zDC1&fajH^trIv#qT!~@1`6NoB5rlmi^p_L^`%UaA=+STcq~8xi-C5rr?ry)T0Dz#v z!(785>_!11`;~W(4yTSyR7Cm4?d>X1h9Im||9ii8X84c(_L<>3-`N;`c5P#L`nWO7 z$9JDrv9LRY7J`uV=P_J|IQCM>5oM5)eq@-#8z*PW=>Op- zk4s27dPK_B*4A#Av>6Dp0H!0XVsF(7h!tr>-BVBrEllYXp${0ona47^FoNIw5ma4C ziQ*OGg#oKlcWyl&XGwsB@uw&YTf+)%DS-5u5!4LZwA%Q(+7VS#?*Md#>4o#aaIoU@ zf>0grX(=tD(-HQ$-=BrJ^>iAOGBlg8=WsU#E9%^tTiX21Yb{0^=}ytX&d9h@pj~O55$yG4~~q3BB>%<2g3PgoJ1o2K!MR7kL{;MB6D4skr(NZY^ zrLeZ+c~T;K%4-mWNk-#izrkw1W<>j5aHF6jbcB~NKsooSj8kOxxiN^)ru6#^FFXME zoXLa32X8M7zx>X^@agsK7%r=Ec6SSh{=m}IfjGZMivA8npw?EH`TD8gN7r|UAAP=2 z{B$nL@y%27!%uH+*0GGnvNRh5Db832M+QQ4I8WT5?auks8_LmWNvm zli(Q0;@W-^KFfIUlsU&sbHRsm&nuvm_MQh1+zxr;*_eyINB-gG%m0)s#y#O7)L?6dVK-6MsQJL@stMp~~Td!gSqqYI>;|M*%9 zJa9fdU7LXOerD-NMbFVlbuE9*Xx6{x6#J4hqII&%ILIt3cWN5E+cRBaD1Lf7bDB9L zAN#d%$v7DkBT9bMUceY_+F)>Ct#S}upZiY6S-bqk>~JNxxOH#4;gQz_S$xG6@d54#$U9-X3JE$72}RajgQ|85P|CbWhC)b0know{W&3F*s$Suh^Fi z7f?uF!Sm>e4yK@g-{{E~KKQ>mB=!4v&G=IV#smP2z27g`XlPc=>LM-poR0_X0j=-y zlDX;u0B4!E@5X24zcz>MKHurTdpZbSRFSd_cyIMTa=QlxN-vhmXjv23o{X0v&>ib9z~09;UhU~4TFK)|Zglx;-zrDIZ&u~;cc!KaMggmUJuoc* zpifTupf}bdqpakGRoX?Q9cO}|}_b_@3--sa-`ynSwFcx$Xe559kWXZSd> z*O(fO=b549uHVl&c_Mh+57%yOmHe0r-P0Ep4A1MM_1(%~%kcL4B5=AFNC@a>N0|0O zeHHM0(DB;?AU+oD1R5PQ8Q^k`fb9hImDPXg?c`erh0x5ifIQq+hDU#3Agza1V-uO= zKm}SN*MH^m!mtuv{dsIq=fyu7PpSbyO+8zXjvax{1e3^QxI2>PJ9!G+co3&2Ji0i2 zU|3n08ovGh$>@V8!}mYh8GdqYyS5r~k8 zy!)oF;sUfVn|X4a^Ecu+J96;$qh^nI2D)_gH@uV`5%3J{m7EW*pvx0GjhP9*L76T{ z!4?3JT3vG+hp%TJeIpLqduOJrD*By!n`QH3J0!^|G$!?n6#QKX9oatjv(VS)cbY>- zrWw0_;u&C}%@Mb~Sogu;hy6;%{pAls3tnZ+`3ea54VIAE(WK_`Qe2 z$FbLB>+PfyJs{PC`%d;IS%IY;SWBvxBGcL=V<1Z4S7E@n|<~w zxPTkzBew-PfIc4xJy?C#H#8=DlivWZd^YmIR&RU#$ptmKYM*_^eKB%gO&N85Zd9$B z%yar(Cwb*Y^K4OXoVJqng4FouXmrD^I$@yc27!L<7UcS#JvtS6c{uc=Xngrz8Q;tF zmmAX;Xzs4kgQ3TfM{IBXt*@P|V(0($cW+hZ85_^N=Z{6Fk3k8(mVnHO;EUsLdlGwr z9RsZ9A3r`l%xCOsKv}5U2#()Azc8GN{ctDO3j~letKkpl?hE3O`Q4{2f@7_J%CiKhj``_CbuHMnzVyZ(qao-aZH?y2GfcU#0Lu`OkyAZGU`22M6uvOP$*kamT z(^nw!1>Q(&?SA-`)+}p+Be^FS$LkRUK4Q!Q&vi{bHt6ymqt0XwfzO=b>2dr7#1jTV zaKj*Z76k%C^mA#h&ovP)2XkFFRtQY{fn2HoC5Y3$0LM)FYSqc_42y2yV|>p4(Zz<} z<8$M91CH02sgpRZ95km-eTR-isj>PdOF~cp=vz1DeDf;bOBF+lZAHZDOB*woibL3q z`V2q!HsbG@3WuW18PfMQTSU;f;L6y6C_3X!mV!CyDyL$2^<~) z26REtdwt!r1|oW%*^3*61=DUb`UO9nWe=?WgX3ccj3X)uF;P*g|EnXvsrWr3!XJT3 z!RPU1D9O+f9Yj9H(hL2Wjg=TN?_Zc7jvjh7d>jSMsX4zeIn2%<8Xm6M=CfPb1;9R7 zM@e=i8*90}f{Y_tXE+td;r%G*Z-3CPdkt;8fAW*n z;rD<1FfMe%H<*sKp->N}+FYRLxhP^h0z~^?9eP<&{-ehxhQ|+|4*$Oon{cI!1fFW0 z%sd3Y^$ilAjU6b_~Ftr!y`xHls+s^DkPy%rhJ1D9x~jK=hrqxHLQ zEe$`4Be(JFX;tGVJJv*J5563hkIlvjn;3q2WwYdLhhtH?wmn?GyHzXD>0E75LAMk+ zJ~YzGDjI2;(N}z!XG`a2E(w%4GK^A$Zm-AU_{j{QXaxZ6*9NOmbP9_CG>pyAFrZ|d z3IT8S(s}+k+&$=y!hV2P(u{!&;I9{y#^*8ZHN>Fwo#(^a^>6C6EbM&HJ zOK$5U`=mQiC71HHj}hnwXR92rTz}~dCwj7i%#VY|8*vaFe>M7WZf-C6D}yfoF`ygG zW-R#u9|{7`g$_JfFhD@G0`1Y?g2~cD(a$*S+#4CXBY@*OIENo}-JYjyk8aodr_B|k zxC8#~V+F>~PLdAGwgb<{po&1JapTcybZop@&Rg`|v}xnP7Ho6p$dmi}UV(*tXinGb z=c7yWSw-YVz^84s@o*J4>$VSQ&uPymGn_WlwAE0@cG)g)H}aJIVLK?G|I2>P1X1z& zP2I2~$e}JHIv!6)Z~dh>4l83(-BwX%sPz9IU)iemTr0qB9&Fp{_R?G$J`>t-(#-Lx zBg2E(Qp@@7X!`cq-HqYOosBBkStsXYzRTtw1-cpu@M_TewOE_>Xa+1(@h38 z9-(jEyF4?TnK@K}91CEeYFp+0zO{4e@ZsnmPH3}REEwWRpndYswTe8-xDj|oBOH>V zsXT|g0#HOw;VVw0*Gs1yPa4}%aiIX-lm%%F3VpNdrSRX6Gbc-+FC=NvR*&C!cYgTF zg}EwP`^O*0(GEU(|JYLd0{{XUPDN8^f^UMqzIJIWa(v%W%aNPmYjEu3%&?K?ZmvIx zUE6}}7ni4p(6DYF=4W`mnUmCbf%^=ZwCKXk8;MN5(6 zocZQE2?Djiion$4%w;^5W-kQDYi!oH2vq<&k9SmX2V;O^POdGY?02+cYcEi{Dv#O& zSzxlGkB{3t@5Md>G8p?dhYKh1MtrS2Z*tTR6>vx&4vq4Gedf79073vjP@Nsh9=#S_ zuf4a<&JTa#&E?_GKYdggu4m)Kzcm)2|K$E|*-fQiM!sl^mR?)`CSo5R32&Y~HP;q) z>)WA5c@YT9Ul%J zc{w~7BX->Yla?s;RRoO?v!}nU9NPo_d{~RZ7VZ7U<)tcS=KRd-cebiff{y9_We(}Vx`CzAtH*AGqfPK7} z0-Or5{My&1hsC3Zh9CaiF=@{t1Q}2H3!%!4``t{)VjTRn7+P1tpjR{L55sVjGAEQW zbS$0Ylo%wOp=1KY#fBY=j*IDvb@n9`Rvi=JML7LAMx;{s*W22~h3Z%Ys{!YD-1aDvZ~ zI9Ag8J-rCw_;D0J4G1<_6J?lXOcb(qfoCxUq>ptY#ww|mkTN9ldl|$TuWJb}ZBR=7 z7*K$qt`$|+aVdWO6RC0%BZ4?`EfSN<=7bXk&65{3eoSB);Hf?8ou%7^zgN_GsAN3RUD4I=l-l)t*DRm9sV@ExeNkt*I=h>J^+{wa1Drv_ z_yp-$COEI@o1lw%_RMlZYQCCr!bqwWvGku@P((>)(9ziz2ykj@VLO+;o?6lsmA=yh50h5Y-7+S`ozcX z)vu$`2`c0EKBE8)SMNU=PAtXA2>oy*wed2@+=k}!5>})^tdy)1)Kz4RJ{h}90c}16J$2( zc`|3za_N~tSMIe{OB6vj?@ysOE^{YqgYEDjjsZul0ABM?dul$g2@EbkccUSTE`t2_ z({~37e5q>%rN452#~=E0c6zlFJPO94A-F4@H4f0{@y*^G0(vw}w(H!}zAhZFKcw7l zZtYekN_`)PMVyUSCI~wh0#X3iDx3@%ec{w`$iZ%8 zfa1DV$*W%@?UIA^UcM+@00j00*3nnD84l*VU;ALWWW&|FTk&UJRxOx2kt0?K&8^i@ zwrTN&KAVFysUR?ZRp@#neGq7hNwJsB3GT$X#pB({v{>Sp=%Wi$!;LsIx5llsGMe*p*z8pnYHO{pU9Imq)CvF&ySpX(`xfYnXX3kD zY7W}(e{XB}^u}hrzjS80j@CQ!>hN%P?Rl;I@-5U)1GnO^S;e=716{DO6&G!RI`rM- zkwDU$v5(F#PE>L6Yj>a3X;)+kxuOvDmDnZbay@n)d1)Rwd>7KUwa}D|0w6$8ygAa4 zIkUi5??)P9AQ*R_W3@myl`i8z#_}s$TW}scj)4GOReQj^=FgaHtzO&7SVB-1trl{x zOxCAqe<#mx85?AbfI?(q`d^D-89RLR%m_RPWDv?Mvqzg`bI)gYH;Z`};&IzgSt;^CW)(@Ot72q^fQ|=A3Q9<8 z0gT{I7$=WT)e8KTAfO!YOp*%oqHgx{I+hPmNYb?#W(48NqRBlpTv$FbTnuBLS)3g{ zzO_4icw={XBaY4C2yp5A_VnDox3MRP90kR|7uh@!$dSo3ARmgMludm?-D} z%*n}NK1R>gTP;9h-^<-h>QWqK&bP5nOdqL9P|(DlZU!p@(NTelJAh-Vl#fn3xRFWj zfT-;0Brr{^`9zOB;8995KX|1O5rv8G;MseMbp$IhRsa}?0P$E|I1<5GM&n5E^{@bi z4yxj6pewh%cJq4|?&qV(qzn>}jGu~DN3a6|iHy0oE+ZpE9)d4pXf$*vH*MNGUItg5 z<4OHFUN}01i2B?ViOQUWI^rgXBHo&_9XfHYCVX=Upv=m;w$T!r@%{La5wCDr&DUoz zek|yW1P4u7wu@Td2+qTGN(5nQO9t>P0#Ojj3g7eRhhkud&hs6*kg5cKdyw1ArMauQ ztdz_43?GT$_ULvGet-u;`&gd6Fngf(!*`?SPV~|JN87bh;O^}(e6MiJNvAj%HqDWg zE%CC>;&;p(h~6rA809LoYF3#^_U4-X3p9z4j=a4v3p9;L~F?y$aL zpM9gTml>bpJ)A_%b1)Xid0Lsb3ifKa6+;JD?HF04z?=}&QplIbEl^Kl3|MUda94CT z&ZU)Qas=JUDC$LZ$gq2nX?Gt#DH^px$_c9=QJ%q`Cj!y6;28N!yn zmz_gZ1-W!M*9k-j0@&j_J9VH|Rje3+qWg^BU#$S74KhKY9zhI2I$%DG8O?N=P|o}) z2lQDVs>-f8%e}?7-sd;`JXfneEx^|e9~FdeJbGI9pNQ-`Ht}MZnVU}kL&KTlYY(0c z*Y7_q{*it5EcZVjaSR@9a0n@XDd@I^9jclJ=)y@R@UP#kABQR}@Mv_x;~1j1A3x1F zpQY`C#V=K`H20AU=xmO$f8v=BV7=9W(OxAW__?(F@KN~sy!>jA{Oql@ZPD~Cf;rV-^Nk^dG zjDCd=h8~?PI760x^TJ%@Lu*TcPg@73CY$c=1~#6ulEJ9I9UUil1n?yz3SBlMx8cW% zD_NIE<(cT8Gx1t}TA{@Q=#tFSr%J8P6zIyU+}mX#&{qHKUwUR?I<`jU7R;pm4i%^m zzgLz*zHf6zm$tb@_lhf_d&h49D{^d?3bF(@C9p>jXt5$z<1(hSVXU_7ymx-Su5mWF z{il6Zb6NnOyv`h|hJ7Lq*O~E%DDZ=iw<>7+@wLrnkd9e3WXFl6shYQy+~2o#{P61L za5Kg!2cLXE+g9lIY>ePjPhai`u`)dsJgLF+n!(tBS7TFpu42#} ziz?Qdx#|JJqtge5x6ZY!x4Yqwi*eX5MSeV7eLfspIz0U7{`2AHjg81B=ku%D{;Vpc z!d0EW7ETWo^^jy0m95d?CO=wvEsXLom(u&|4%<$tNy)wWxGO~U!cGt zS{49gyKp#VxV?tMwS~>;CS=fja0A!?QlfpwNjsKjGWF=a)5qtA!@&W0^JrsdxHASg zIX;KS`2{le%md~>esm(bx&>9O4ogdSlFj@~8|$Yx(uX)I)03}hRd&dWmreh4mE@gHI9s=>vb}SKeKyKnr*rC*Ic4 zI(9q1lan{{ol{M~(#%9Tsc{SI^EWQd2mgnL`;QOANq#P5`n91%7mOE3z-TF8Jwz3_#rN$-I59+G-h0?YnYL^PI9P177J5 z;Q5)x$gJ0M53lacPbJI3{$*R2eHJ`vi|-&9-+^9dBFMUxU8z0&&DW71u`}`>pLYrj z$}(q@vFRp*H%%!=HSzRys%q zWYts%?b+g@zXuK+WD3id+=Rrr_BdEx9^%f(ssR$V&Ar5ef!|eh2iU$XXCfVhYlUH zd4X(JzW0G|ym|Z;r*J96cQV58bPUY>@KFT8;|LUr90YYWaI1=r3AA5nC!H_>93qbY z<1jYm#prYw~>&)4x(+9GJchqt$fk8f<%o*=LoLc1IViIDsW z1U%l1a!q@TNYB8VmCluC62@@}=Le%~pAVni-mNH^q&tE{WbM%^ zA)ru3GZ;&-2OU;0MHj8WSqbdMXz^wgxae181Y9g!lf0y#V8?F!yl}*^b-5dmZV6B;4u0`le0|fAXFyjiRNH42> zos(@ukrlydcrUoJ|A^xuIxi~Q9mq0NVnA^|&8NATg{uJPb2i3`DE7AElo3LVa_84~ zS}lVwG_o2# z+cOUcDnWpg;bE(tjRp@?%C;j?Zam&jzYY#p;ykv#9UP8MMJX>F8rIThwFM3ZKilaK zextk!GER6=cyBR(J*RUwPL?z71!^l$6zFujlp!*heE(#eCr%4|_AKIF*Wp>YDGls1 z?1~#-F*G`KhnieLXKlsxV6ECRaLLc!WzY*t3XY(E{9Q^d@11qas36esHv`QzBIxD( zhrTE`ul*RTPLp__@@BMJ&0>V+=K_2|1mR76v*mz%??4`IkGL|wfTM#iWwHR{mzK}y z1d2Evj{(-_UGNZ`kKt1gd37dq0&e9uRfc7cb#RXIwfj~+qU3{vTKP&J1V#k1`aC;I zM_(0@BX2lA#>}B3m&~hvVzjPA9YJTzRkOvg(v)YQmrKW6|L%{cDKLo5-B;dSjC`WE z+IX(Tp#ScV9uyv>mG^+EIrjXc;hD2Bo*h%g`muV!KvF1*UQu)jt*hBW?>tLK6p!*e zJW4)PU^F0e<=wMWap1SBaFBi?F@~k_83X-b%;l6sCY+sb_wGba35dwJk`;oMtt483 zrQ0iLoZs~S(zq>275PJX=DFy+4!gTghmYcfnrHa5FPhF$=isgAQsM27ZpWyJJgA^! z9xr3i9F*+K+|gql=pmUY##)d;2po6&fvhY;ZiMlwx(>8Cer=R7>}Jy!)!-F6BUkcs z@RaM*->9Ct25?w{qIw2g$Vy@MAQR6nzR5gt{QHW&Ag5qj3+`mx(dBqefCd=vz39rd zI49afZ~M0-2zWGJYMn)zB z5-ka~-H+4r`#*VHiyi2pAkRlm=yEQ`w!&9?0qk6JVGI`BeY6|=Jum+1^;gIXG7t3B zb_P5BNFEA)&^Kp~H3Pp^svYzn*oqAzd&pdDM7Nu-nIlIcvzp^?pD^4SVvRR~89+Vhhct4F#z=0Jhf%OaL{4fJLR@Y34DGzu=4_qRuJ* z=ze6KxykPWq=J{Lp&vYSI5-A^#^fX#Be$F~B!l2#WS1?c9YXSZAb=;h_h3~~!zMWn=GJNmG&hXitogP1n zKk>Y3mAx0!^nc3`+_#U#M_|K{7X!%wfO(Eq$nVfgIsli_h7= zbHkJTw)?yVg^l~wp(c|E2?46vnW^D++7vW?{@6hmzG@W?8~_oN@__FsSP zK+l7{jHi6=*R=% z_2dLae&Ow-m0bYeOT*-_ndklR>Vx6Ks~q9Tm$ZvF{?@OY9sXB;^Zhuo_lHl%?Wy2a z?7$y?zBPP!b1OW@-f6ZhSx6+HvA_NsXNF(9yfFOp&)0{4{N1}1`0g@nI{e=GOmyPu z&XeK#t(IMN{>Yky=P zJh!Ikk$y$=N8a-1%Erwcia*isd_vE5sd*9MqnPEs>ynlSQS zmHVTkQD1xM^Oo#-_A~?ib#dsBgqFau|Z zf#7b;Y0hAv?{P+w-l8)?lHep5y>Zi6~y{F zP_4A4M&@pB^j$1~)7GEGp@BQa;p~Y%8NKebc{`B_yz#8=D z0wST(%)|dur25{i{cuHP&cJ2_6vIjc7#y2BGMo<%P9BXhmES1v#~B;P_~GX3XO@vp zVZ~sOq9188{=%5!LelmZ~b1o|i!H0hc~Rc#JE-wc??4p!8R z1>IK=FmD;6HD9@33S0+Oyba4dc7uU|L`IJrW-8OdUQ1iN;Fzqzr;Gt;@R{N?e*6H((u%u5 zRlMyr^wi~p&uALX;S+f6JazC;lWV|SK8-^m3u!M1+iuZ#{%r;f^QvJ&{LR@~_anMW45z?zEp`yAdbcX~kQMBgMFco@BNXEib` z{LJpGpnt|iZtHIg`k;$;FFAMQpzM{{r0LUA1ieQ-ZAjt;zdYJT|UrRC6b;{)*7?Knc$6isZjL$1GberfodzkYIf zcPxTBKlLmQwPMq8esAp#|LNbqIsEiWtI0xc0oiB*Q>LT}|7L!=4I+cZVoNXbcIMbj z@M1ef4|p6HP9LAl7+*zqL~qPBU3g-8q5{pgVxvg69!m=hySX=LE#1}%D$>bqzS(V0 zGZvYD#}`Lj1xH^yKR28kgAl9No>Uzv+lxPpixChZ$NY@t)q>r@45rv zuksTZF@d%%hO_^AOEC@BGd@l%PSp40w07M8D!92~ZGBmsnH;_v-gNy=^vIvyjpHA_Uyg6K z6M6pX)xqI(^oZhwfFFwAzJ778vH*Vg;p%YX@or^^niGqKk8|Hz`X(Ev6hS~A0Q>2$ zWKK?=ni_ue$wn>UeD%`oV0#eVaWBvL!B1B!>m0wo|He|;DUZf&iqAq18{3UfWXIfy zJiYg*ohpHj{;gj=TknA^fIAz_zQvO3JE6C6i+yF4Wt=5rM|x;5>Wt8Ay&iz4_&}L6 znGPG<>K!!uiVnAp1YeTz=umNOnb{qFa&>*UAD(k9ptH;?-KZ|ifpe#pUiq>sHH}$0 zQKXD9+l>?8I{PBP{c-Q^*<-DG;nj!h^?LExL>P3T_C5erw1M>J=jkk`ACyraB7jsd zH4+%nbvGRrIe8dC!RR;^qvrCN>006c#@j8ju@NKSXAyQPIoCP!nJmgvimJ$JM-aj# z+&U;SxZmIw5HNN`S$M!8Ba_wrK92&W&Kb>h90#kC_T`8MR+>tbkHRp(HI6@F%wtZ% zMJlT5+`WJqhXYf1k`%TM-T0F>2pAali?rAtA!-2*r)fRuGNgJJXeG=Bncg zBg%|ejL{~Q?dEt^xQMQOzE%$ioEM|VRmN>zeQE-yecwb-142;iY^gnkl;<0#sMtv3 zd%w9p|L=qLp|u>ybqwG6I27i-IpHms;67bIt%c!yc6V=%f&|s;@!I{*>Tj#hBhLNn zExJ=F7;iZ`#C%cw0!wvNTl#b<2AlnF=Vse;z>V+)7tk5Ba4KMD{=3u8xsmeCI57qS z!8y%7duBmAK6s~uI&hu|7)IN(@CRNn9>yGnq#a;R1n#;c1UQhc^&7>j&^FTSbrd*G zb7|WOl$AMPUw7zg zn#0UF=a2cuKC?bY+O>LN&ma08_1GQ`Wc82>3^gg!~OnlS$ucv-RJ)71)e0^bW7 zcX@iMoL?&t&uhMx#!MOdY(C1f*WK8+U|A4M*X!f0m&5Hxy$EiT0q`T6jsYqVax!gL zF?lP_@z>8c1N*0|aVl;E4a#Y{oLM8fnYl{^RoQ zJ`gB4G<;>OIr8(nI~Anwjt73=B+yOfnGTaGx)kHg$vEfcTZQJ^k2#ZV_4!5aMY}TS z)Ur7I^3d?v{mr^pan8QDb2qeXD~T;==EX`aoyoBSRy!>coXidCs&u#-eBX_82Jk)o zKqiraa0nVXwE5VhmCm#I+`eg7^!IxPdinzN#kj|~TS4if(5`vv1~s~BG~M=3OH=PP zf~+uBALY@HaEScKt?U}|q0=^-f_;Kt^i@i|SNhf>foHZ=GJ)^cbJ!LY$hKxjsXgL4 z_;6$(U-kOKI683%SMqsf{y?RAv-Rky3B^4EQr_QRkxBBr0!{1%0By&{dL0~o{6((` zB7>dn)_;pDbpFc1bjE+MY*v|s=T;_aAHQv=pWfasJJABnBPntLP6xUX*aWi{bRwha ze{e9g4d`M(ciMYP{=vDRIKa;W4Fc7Z`L1vIy8SS`lJ{RZGiJ#=*&Tiw{#hgUXQzjS zh1R}!LrAWU-ct)ewnU}Iq=!~=J46wr&TY@YOmTb#_zv2`+;h^*}g5fGSYIO=p(=R zUNCH8Tmh%w=*#Wcxwe>n_43lN5*|Cb((u~hlN-;5PsSD2-}<^Ni^<{pS5}A5Zmrj% znF59%T$mkJ!{1;deRPZ;CszA&Q~&V76?^hnb|P4eZoYGGYq)W@9gQ9g)N8{-rZaq2xCve05%%NC;$)n^BcLT{n%u9r|BQ_b1%Nv zol)NiN;!E#|7`V@Pfr&8#^6=K7;nrsK z;O5ie&e~RR!+s?61`j%-zu^Y$9yoP;;nl^ni*f8{hV>^;hwFF3i0KTVn9sy8Sq@WLv3`_^ zwF=)6jL{uI03L2_XAq;%3?jROQ)x*dpl$@t9(Y+R&v#=;I1Adr5f@IhAObiLL3eUY z(U;b9{oa$keTAoEOdiXF;*Wuak@CJ9a|nv9X>zRy5Yz-rJNLQ?h3>S7lHxr^ zH{$|0wo7Unhx=@dEqmOoLIc?nr=$E#taQE4BNTd-Tt&JVIA@lp>O6k%IFtS$28yE^ zrB5jc_4s8Bqmc-~#K9xO`7ucIc>Bo^bFcPxTj^ihkyhWbH;O^>$H6Z{H3WAi46j17 zNY?ErDGE1J8)LLZ0PTNL6jCG$z?*_Cl}4QRWw?}a*~SM5H4I1Cw3WE_o9{aG_g;!g z^AAJVtJOJkQ-ZMlSl4!_d-La2D_wAc<{&nwpnt#DPW$B6g1R=~WAD!wpno^sN_oOf zrE=#@TV*~t>^SBkQ2Y>jK^pzcea}z@)*1Pi#*;E;pB$+@n12>Q_#lF@3v`bQDuP2KUVD!Qt#elhIEjlaI&2vPuA~Km%!YzFUpl?qK|Qh@Js!k?r+e z#w#=I>oK5WKMtQ<+Zk@oJ3y`V4_8kLnPd<*%@VOwr@0T~7&x-Ez*LmB$?qRqTt*0-t zG{|7iR?lE*cjx)8b+6mUFDp$n@9Q|b@i~R>7;Newn16v5c+e+pkZ=A&>$0==%zKrkjj2?HcoBc<8{v!xcCM0_9d( z91%-DX&(I-{>Il1g^#@UIq_Wek_0^Q%JR%1TkL}e!K-#s5=q9vQ&e$fZZft?>%aOA z>Jv<)t?kHc$B)V8>rZR+K{mDElD^lx?CVcKn}+(Wy|P)_d-G6*TQewgAUMF^RdkIV z1OH1CO%K^ZwX?lFJbBsXt_Kd+cb*il!wIko))yRr>;V}A2h#9#o~6j4)xJlYtp-Zp zQ*MQeL3%efj+Hj^Po`KwCYt~mCurE6o#XR|V(+|&k=>5$1di7NWbEbB^Lc*gGWfUc z@`oR-)=D5;(My2Q+j*ygf$dSHueEXD<@3s(f-|YlJ)p>@vz0_P%42%j{h1%dk_83U z;-rAt(RQ`H#@X*^L-27ib{;(KL^xUyQnzJBpeeYq7-FBX0Id`*8BOfwdk3RIh zMw}RvfIM5xo8S3XtB(Kqjpp1d>emXQJ+BjC=4031j4dxsThe7YHMV z;awI2-5`J<%X4{YZdkG+pK-{{Bzxc*d9o_fOesZsZ+W6(z{N(WFi6h~GR_g+9pFO%X%*Up+jm@bQ zw;#7ciQt2@@f#nU93DO18Gi8j>Tv5(XgxO7+vn$pU%NazOa_nt)ej%l$td8xHx`Bu zF1C5Qez(oL;2PKpe+ne6#wN|o8_wKXhntf++13cc?9gfaV6^*Qq+k@}`o2A>QUir4@iv3j%dRk=L zqgQ>Ts}CQfLtEcZ#s@wd|KUvJiIaG2I{zn1%~G~Hj{uEK3dW7GPlqT+x+-DaQ~#VK zKuNYtgXUP7#C~7LnX(lG9HlH^A@*UVMG-6@nkU+7yThYQcIc)YxT!JpsJdf^t(_>G zzM?cLj*w6h)Am!5-xsy=O9(QsfIih;{Jc^)Rth@t0fwgWad3Qjw!m2YQ=xu4&yB?|Q1`h#P>`GaUx78fw|7vG!tIb=xe*C|n zz8!z_(r#(b@`YD|)rtUtuM$5Xgh8)r-HhkvP}lvLpZ$1XD2p%)@>oT)^}^9SR!%|4tKmBYt_uK0g zANR^ek=ARz?d9r6kf8xlMIMI94?0YHEdyk*hwwZE{!Y=|3 z9WS12b;k;ReKy9t9e=KQR{dYF4%at@kss3J~K{6j+OaWwYsLh3a}-q_S)s)f*3Lvv?I7F?Ggyq zT^-Z5!O_{tGKk?8pO*0yyzay)xffwbuD~~ASn#LzYUf&iiW<(&ME;nJ09nmI7q9?% zo6m6`^86Fg7gyIdhpUex3nOx{B_MZth6;n)sQ|{yIRI8-K`)YOixs#qZYBF92ESt< zjavc6{n-`*vgC9bPUD>SU(IvPXLLxVZJO9|j=jg>B~S8Sc7u;smmhmsuo^t=DQ}_TKk^dw*piz>Y4emzwdG+AAAd{?RInZ#Si;` zuPE!j}|A{Wzh z6_m<7GHs3@ng`YZ)1&<(6$ zr~XAtz9X}}--B1r>qG^>iF6HTQ~x;MOv=UR3&EBz15cv0{mw$$!Mb9@h{ zzj$0SLJt5~;ib>^8{gpdc>MGFx6%ipp$=@Tw@y#j!jd53MC6}sAy(Xvrys{M&sXz| z&+kQlvVER}S0giS#%{fKZ@X-+mEihtXaXpZ+nrten!%CatL(n?kxZmpjJxr@9=dlw z@9BU0w0}&-qyOmBs=Phqr(=lk?Kci^NM4TiS%=-{(P^XZ7a$-zw?kj-M1Yoot*^E~ z35N9GOP6H(9eB3w7a)C1w+f7hj<3GvA9C!A_HKJM4q$vG3*8v-eS2b)55R4EL7pgx zv*Dw=kGIF5&8x~V`pds?ba?MvT(S%4!ej>cyC z`o*Ke)ZsSvyX#NuXum6*#BnbBe8`ZIGUaQOZ^fhOd8L;jDtQE zM|ZKD&Rh4lnk_cs6P`*|!&`WxbOv1Jzm6|kJUL(BLF5wpdlh@4GGQhs$`_D<)Pe&R z&cZD4J>nkp(fg|AWW;@4l7EcR94mfl8m+L~y_alqIFI-rxtc`H_@T2RS zRS(8?qHn&jJY0#h`6x0IIlq5#e)z?29OGz)o}U&?+eS1sIWs)kiGx2D7DeXtfW@S< zi${ic&bPo4xE7!DP;8>FoSqpbV)w|rxt-UzfpwJf?by(=m&nt<@{31@|LAv4)i#&^ z=KGI_dyk&gS^sP!_Jp8g3j};op3Y273~!y8D}8nAetg}B?O5qcXXne$!fS8DSG1r4 zzWecN1)bSeXtiesgK9I4V@JB|ul~jJ!{7PWPY%PaC&NGd@uT4%{`vj#so5{D^+gMc zceeF)|IPe&nigEJ*rnKC2Y~>`&Td5h$|y!({kT=*b;P)gKlBgouRb3R{PO!JUVZh< z%y8z^)bM8?Z45up1iGFO2tbPG+|kL9+QCY(=OAN91S@?T%w__m=L1K5 zC^kc2loOU~?Y~!i1}Jp2`eZkXw+UfJWZ17prm8C@c@?G=5$Lj3zYMg-ZLk5tBBhy}0k>!gLIc$zfyrN$szz%AM()C>`U8v26uo3k`r6Mgj=- zdKm{L*_|ZM241=%0s8E3-&eVy;rq*=O%3?1bdo0fYrTapxWabY^cjP=tpykQ4SVVO z<}SYhzm%dZythAaIP}@~p%V@SboC|BZiP<-ai zH4&tZDf%y>yBgsKe~fR<);RLol{p9T%V6$m4n1dl0M_opgFdMvPhcfZoA5%3lp&VqR8U~--;s>Rin>*p+E&x-{5{x=gJG7S zWG25)jOjss^5+5d?RvcdGXM& zslY|xdsnuH&B&EUV>Z><<1-Zq_~h0`)iRK>Pl$hbvnkS^##fmP;kCJ1nXtFArEdXv zn9TPx!6AR{?K4xuyC-Ldm6fUCUX0$q_b2zuQKs;X<9LkYsY6Ff#Nu65m>I?W$id3Y z3hgv%m>Mz$cetY(sqDaOTL#3eJJHSKItwfBbZKSk8-U+I6axzkgwB zIFSi)?TI*l$5##yzZ7Q;{Ad5gwF+Rag%)~7fctv@U^cW;j?uW(v=XCoaUn+A`twR5 zg~NhzK5a3x#p-YzoW<#h;qg{mStQdKE{vgZ2$?&4ie^n}F1ut-0sZ{K zeo!rFD^P}~zK);2489+S{2I~@;G8c;SJL0MdDz!0*uNYa?Zql>O}iaunc)gbzSq0G zE)>t~^{u)FXU5U~_WCw{rmw4CdEfOQ@R{M`lz~cR3=MM54<3A3wL$2yI#D5gMw?b1 z0sDtxhF@gCZN>@s^!`SS!QC3uj9lvx6ri-2@p&BmPp+>wLp*pu=k~~QHtk8~SOJA4 zPcimFPqi00hA)1;8QWuJVRCRv19%kKEeN2W0*+*E(F)`Q_RkJG#Om)mrzVH@j*iQy z`#_e9bEwz1+P$koTbbuL6~tb_tF~Ln3S8Uup0U?-et%ZYM|;=)&C577Meq6t=YH0w z3iidpei6sPQB-I^58S;s=lP>=v_;ldKzQ;<;SE%9CU{z!n;e$HyKEvEKOF=C1P93R z4!ZC~cuhB+BWMiRYL`yVR2Im3WE>m_JhK-CCCNI_<-7h10&HzIJgR_wQYe471D^$3a-T+pe$+3Paiv=Sf?c2!= zY)jx-B^T-w$Gm09_{?V6o3HWd%^u7j=QXrDpLy8G-1Xyw`xXW?JQI6H_Ndb_j?T8C z)V2Vyw-;s(RDB5c_|3@32fj`&xkCw;G!1AFTQoG77Gs^csl&(+D;w+E{nsMWUpKZ?;VZ3x}J6v z=)Mv=hJHP@G+itI;KSUr7DxN$+HM7dzxL*_;k`Fn00BG>ZK+wc9h;24zkmPf;Am?7 zx-f1FQ{zI`j_)oz=_KQJv}CV6BwOHHZ!8X9dux6;oW86+NgI!z4pegHS0AE$y>ViSlDtK`!9$r*=4)nR`1M~nIs6B| zcV_th_g9DS{(N=#$(7CF&Z>ge@qNw7C@1h#1-(&J+HCd;>S(s8_uBT~7cyk>oj>$O zeh5(U(=0x%EKLq#pE6u*695O^JU##F*DoI(e))|SX}MLq4DxzwXSfw6b+iwV)(b?k z)<&atB?y_%gYIU+>?MNq({bu&Gf)D$9edUyf0PBsG!$GD)c1VRN(}fThg*8!WQKfh zWp+3gCE^GL`^Ol{qW+GC!8Z!@aVWrh=kvVu<5`57)tGy0FJo9ft%{cRP;ltz^V*-9 zN$YYPQca3Kh(8k{I2%Ls##bq^(1qW@xESh)5ms$`&*yeXRlxWO@F*{Y`yB#m#^ti-@j_cRJ-E! zwH^B9a8~&LQhWQ~?+4$v@4npsdRx%O-@Z4OoxFNQ^&nj=yC&m374qeS|Xl%&%fWw_6ONse)_d$&Q#9a4jG)i% zJg*A9<{CbG0a4DV)f&~P?cKi@ImF2JJG3))%z>>kct(Z%(?=)j*|s6QeX?!4`Oc^7 zCA%setPJKRNAF}TKpWa6UwR+#8xTZ%mHFowEzHhDiK{5AxSLhN*Fqn3Rt^WZH-X0c zudf07ZfWu;>WWNhk?{6>1_;CCWE}2=X_){=hBsn(i#Q*dC#&1Tmg6uSy|*(w9<9Yc zc^IX+{c3oy+EUz(N8vo!cg!h+^KhPMPGo3F1w_@o@9Ba86dwpkEoHurM=qaVIx<{7 zKRx`xkJc-w(ob>O2oGI}eq!9b#>H#eGp3Q8_ki5#`~=#VTL+5YbG>`W(8}P-d$Nu} z-<*JU-|KejW4>(;U*pm7FW2<jBFMNAd4)B;L`@4*Z#Eg;!E;YO^)_^a~1@9@v-BiiXYRz z-V`HE@x-}UWn|#f^tqg+qpPY%znV4#Z z@{{4kFdc3?6Wi!f4F2mkH>xn+wFeDv9lFE(>5YxbsAPA%ePMq1${S67T?`L*u)_Li ztcS1>nI+?EYx}@(du=E7Ra@b#Eq}rHi;m}UUKptyIoS+fzqBwMj~x7rv%S5umxTbN z*#jA-_IS@u&BPf$QuQCewYAOR^EaY4WbU_iXf8E5@O#E?ZqubXM=i ztKFaL(F}n56XRZ8+hNrc=vhydZ5jR`(;5B7CU|RG6yRX()wPPef0?!|FxkVd4-9fp zT?ptq`s46{vXeu1_Vj9hRE6n#lSz#F4u0!fL^}=+M_-p?oAy0}&cASCdU)r|Y^{K9 zr!RLRHx)vJKdsR(0&At?cbdFDe|mN}9S3Tus&c&s0k+3+GF$NcRc&*#Wy6@^zt?mc zhd0hc<6V5g$?7(8=Rq&}+ujQVMh}nps8a$)902XP);;ZhZ`yBuKyj}zl&{jBdrH<6 zG`PlsENcS_%TM$Ol#e*v1X3+7_@|C=jw z!wEhYWVcp?(kpy z36D~-`Re2(XhQAV&Dka*LU*hbcBO_gmFMbWpbUZI=3?EJpdqTP56MVD5@7P z8sh*dz|PqP!FNR_Mdd2(I)k%MM#}Z^5a>5Tpr@9nhc}KNtn;5Au0Bg&7)~O=&r7J< z|M4V$eZQaR@_`T-0}_LAUZz4o1R=nvyCHCWY)(hp7uaDk<2kp?!E0x@?gVf5BS3fK z==IAKX%Y?VD~VkYRa7(2;k=3PBT`PlGXaxl2g~qidvr|reghW{noz6B-xIaX$P#e| z1PX!FB8|Cb|2-iTub{WPzx^-5>-liY{`>adQ|*qw)#Ju~_3sgb~~M2}s}f(}%zg zfe&hK^SLu;gNE~-s!5>k8(zKdpWCBbTQEhLeYwZzU%xnE9P`Ntv84(!92#!l->JP? zpwe-}l7|n+z#LQZ6b|hC1j1g0KP&NYTdVCE8=R@GR>abWc}qz!e-;$C&{~ z^av1jXlodGRyw0ky&w&+7uu>G*`iH6>WIn?icYfo1TQG1^Z9%3%(6f`$|-z3Dj!9d zM8uX563d$cVMi~V)Rg+ z0uJX-Ox8-06_t(1$?FfER6hg&07Yo^M{u-O6!H-LLtBmz``X3V5p#QjpG1Cv>ELK* zTaA+E70?0jB2!291kwj;8UR@y_Kn*2uRjb|VC#yYPzOr8gT8eK1bqnrSRK@VPNCz& zWLtsWhnF#6YBexpaowrq_8hBbR$R?FxWD$Kt@w|pvh+ZUI8Ymh+7MB4`AmVIjiVr| z=~d*}<2VYU^lKYdKVzJwO}GQi;Xq%$YjivpI{vHZ_a|n77&HK?~UFUE_HCcRFeB}A{Qv>}O-|oTq-F{kcGR3#;wdgQ^Fvd~q zv<*sT*ErhyJ@B2jedjM9^=a?gj1Q3W4Nq}~3P)`${X5r@pZK!%=Jhjr5WL>!wc7UB z-gZ9kZ?8eF8=q4vs=2m53seS}`^Nd&{~H*ac1gYuEoSc63vl0Y*sp(mTi$rDdt-kJ zr=c};33`Sgef$M|F=s-3 z^rz#!wz~x28jvq|0=-#@Ji9y@C%o~-es~zYfk)B)p^TaQQhi-eL{bj^7rf-4f_|31 z)jITPC`Fg~t@o#1>zfX6EzoSka*XCSEi$a*5zpC*&IT)H!-)~;X8889D)UB_70Dt4ohmoEeYn_Oepn~QE==(i%raM*ec{MPVT zbF7_Q;CHvxoOo7U(g9^Cg4O0|AqK4$5tkz z3l2pG9~@Ti55q^dHU?+<^FQpV2l~oKVBZv7rwudUIRe@;0>~Ep$no>N1yl1So8a8> z`Qa;PmWGGVc85>mIIFkinsPqlg9u0n^f_h@JXqV^%S`5oO3R-(%x8!{6utGge&_P= z%~Ny3)i|90-S_VfKfT*zh@3qcGY%EiUun-}JXTaR{! z&u(oModC86I>$4{OwT#>W2LrYHkd!~B0hb?y{xUxXGey+YddA@XqJ{j%P$-}SeNY z#?C(-rZ72(Q|hwF3b2pdv32V))PPk{#NVT*fFak9DS_CQE>|CGKw*>iVT59&JXpYr zv(*W<3lNcvbH`@(&XvY2nbu)`ezH~^E}opKD)ny$na+>===$#PuM+n5o$hEHPAiDkKDLK$XcmcR690YOu9sm7M2G0l>F8`Opp~xB1{<;FP zA{Tq2hy(OTw?1^@YTtI60sXyKfep&1XvtrGYRX1B^1)#{IAyp1&#ApLt>Jp5JkbN; zb9^pN-|4C0L>T+j(MIG;neh&f)+2nT+r2<_ObY(>5l+D?V>-qL;r%az#j(AojEp!f zcj9Dq5U_FN8#?Fkzz={gH0iacKLYhC1iw@m2dV=1AWp~D>)v+o%f4^_g$u?zdjnsB zGGxd19XdYu&k-QhsYd<6X8qvymkLcDQA39j$h_e@lDm2 z8K9ftF)K0*Bk=TjbH+O;pyK)U?ELvnclK!f^`!;D%-$GXLLs&l63+0!NZ>&EXR>B_&hyFzUh$tb7%{{hASp}u6q;~7qt<|TY z%O-cx>K+{g%;&MlOcm8Th{yH-z+%3iornUDQ=-<0RRBRz;2MG6ad?^A!^54(TgF-6 zuHpJjKpEFoIn*>T%$f_rKLG!Im8{<9cdr6(Xps`0i>zD9{Db2Q_8}kI>ob{sYT?Lm z>QwvvzxadIT0yZ|qd*xagYpNA-2Q5RT6R>7T40Q!x`VUR6VtIE+c zy*7)?0Ca>VRQN{*8$-vymc&Z>?o=>i)=fz74V@B9|XhzVmvKPX$ zR!*l!c>$#1%4&K#uC9U}#IwSz{z{h}1$lO*V0%{Hw-jtYv}+oDx4Aa%n)Cc-{Q0%s z=R@&8hfWXL6l{<&Dmw|7BXYE7dvXxy_P+XG^O32y`hVf%d|hKD64>@+FK*S;8STXu z5Qr?xm^@E$K!Jk}wlW+DuH37xilVNIqXSNEfedeW9LM|Nqu@4rQ}CJNU;LRq^=A~H z=NWm|?n~EY$f>De%hjc$V`fL@7jWbhsCyorN}pA~^UN>cKTzAk_Q8mnIA3vE=BF~3 zGIg8%@AL#tPgN~Xdlg8jU-YL1$jphkYTu#X#9-kUcugt|>Y}qQkNU%CgUxYS(#|YkuJNbM0)VAUm zRea4UO$QFXs4W#TJF5mpo;5!uh&MBwn?GFJ);fImTKtczj_Pb%kI(?8PPPXyU()O8 zYc$4DcdVpL1lyq;OL*}_vpv51+1l{4YpcPXOhuVh6KON_lxY<_z_(y`Yj=ni9?rzp zI2Id={rn)mJ4HpN9(zro3r(UQGM{>ofgwc(0=)4~2n@_(lothd>o^0c~7hB2dxGhc5`d3x0EL+4UoFs-bo~v=7#|cWMp=0nWshl1Xb3 z0=|yLr(8HZJ>1#Y9@e&PQEWlY-VW$K9pdgZzyEjNjb9gU;DhpygCFxG%N5x2$*;8~ zv1Cs5_jOx){4_N+Rp0D?SbIogMt9Xq{wsAkKD@rqi)k5eEkHbk!8>Q?hOeGm7?#F! zRVfR9J<`z`gAof>pM)@_CB1B)@2^Yu&Glh8V3pH3s@=i0ALYF;*>1Z3#75qLNt4$5 zC`LD9)A3sivy;Qo5h)4}zDx%>|CFaK3{z=$Aq-)Un1WtML%@zT5)J?O_C^IazWL_S z;ljDaI$2K#lahJC8*jBNRqvuu5cw0-RVpJiJ}|;2I%*JXV8T+uh2uURK1I zKtpg=P4|KrVJ>s#ST+VRVj{S`Vp6M89h?c=lvjjTD9@_d;&>v!!!<`)w1O6BryIHZ z!TeB|0x1-I1x%hjE4nHJu>Nb$>yGu<%>sB7xku<7A_w*qELa=^DpkBN-#ITQhibd(uP@z@ClZ9_5)Bjb=3y~( z?1(p81ip&S+A>CV5^g(DGA%OihE2fLm>MOrxd$LB<~ z+iyLMemQbu|0x)pT)+7Pic&GEDgv6n$oxGc>tSR{4^DFEIjst1mZAx?aWWJbyfG^B zyLgaPRKnC;F~F>-1LzWUo{n-X2QoBZ&t5n1DB&`*;Ja|kD0b37Qyy?SHO?14bVTSo zM`LhDW--*jmF-u<^?O^jLL*y3Ayg}ICxd(PN&w*V+uM~QE+}(gj4m_Y+CH)tx#slM z9FFAT^aqh+)zg8ZF${9Da`~t}nHAGXLi?yd)17&l}M z{c%3VTx_X=ZsgxuZAXxCTsZ0zW4G+ACt|>zIyO0+IT?POI50e7Tf{EtpulHY$N@$o9laf+SW0x&$zX5j-afno z{n*ow!9@!&v}=qPU$tvEv#xJ?giiWmORcRh!1Z46aAC4FUUkf-W!oR1N1Rf{=zBX(Ygwa8ybgspEq zEnO<>XFqg1K=8z>VehT(cbc0xqR^QY@HjKEC))6PpT9^C4LAA@$9`>Beo-bhK=(`2 z6GcBQ1K~B_&t)vKDHKjqt^Psif^3*fU+67RIw7=Fwq863Jj5pSn0j{gtI5{)&d*h? zfVt>X0f4<4C%Hy|oV|tzR{Q(W=0UaWk`6CM2N>QgTC~;W={QBrAzB@e?|#G<3aIx3 zIJM?$dq;t20S=CNdq&H+9ceNIQm6bxN0nX;&U@A#+m8-3WoV9ofk-zkDM8;L(}1-^R%?2KOF5 zsTvB;$5X4oPV^l!0sp2OO`nGrEflh^8h+cedl2Bj0Y_2BFNxu|FiU=qfwq9-3fUd~ z9`-_)L*}~LGhJxFmtTT5@8gF68t5N8zqp{&hiiT3^L{9L^JCz^+)N7q6u2=jI)mUG zwRHX@!Tnk&+Y)v!j0;rIzqigwWPp#3dW8M)vCzkZOnw?2Uha#kMY|0PAv(a}7pE2d z#0Wy~)j1veWq(D7JZX3sC&9}9Q>iXNl)ZN%*n}D8WiYM8FaT?-F&+raJaaKd-qD5E zdyEwZ5+GQ85`qsg+0%J^b}Hj*M23hS#$b4wK7opUX95TV_-|hl=D|kK_1cmzm7gb`FkD9j2NZ*VDiVD1qCf!3qjgcp!a!1stgC}8w%g;BLx1y*u@ z%|i?+P8a5Iv?0z^kVeXJIm@|LiwC06q}wtM+;`~UK3oT9`6_)9eQ!}d#7be{ky0G_ zpCIjkLJ8FBmI1~rVYp0(w zs7HD}auA>9bDk~bjlg{I(y9@G-kfOo;b7Y*MW8KuV=5F|sGg@PHvKBjYCtQdCwsLY7*UZ1U`IWAB^ zrsMOi=EF|rj)`Ox?N9sez)_k?`}=lf zH692sh-=kJP$YQh3S~dN0ERUv+QAt1AerArEj%rWtqNtBqMiz1~zl>fq4an3_F zs~MbXfu|R*8ou1C={&Wv_k32Qujv?ahw~!{Urp^ne{OHXwm)wg==Jkuvo}fLvT5WkiZpT-BKKdMvA4@*~7KY~uf{=IZ+t*Ni-Una)%q}5Ufi54N zcbxD{_~YQPn|Zt&8E2J^(XJ2s!Q4ryW|Y4^1}*=jAy>i~oze>f8lUHv{TM{BZ8(eC zEn6-3`MzZ)q4CzvzY1Wz%c1>q_vJAH-}SzAU?&K&^zpMvjRU{Btn~bs+GR^tIo3nmwEErevCvp}&KY7OC6=)1U&=OULB)ddrwr*mU~>4sVkv5#&%j(-vR zmg6jYPEfuVKi$q;%TnCKTl&bCkxlrEmllS#*bvv(cI$)@w!Fm!i!5L>wu8kFeD)W= zabozjUtAe}^I{txxOnEsaP{giT)p#j_|C13;p)e0!-w}@`+5o<-dk_JPuHIvyPY44 z<}zO0>pa)T-()1bwr4hZ*V^gVP!*>mU;gdiI5Yg(#kurpvKE?U{eAD|>}mAu^Q&v^IK79PFCq(Hj~9%)AJV7sH6!B3fRiU>KQ#SuE4ssx zmx46t(h=ZJEP;W~?#gg@J{+DuJSN5R59t(xwhYKr<*~sDbr3|01LZr>4d=>j=#Jt%Vq^ zMo5n^V5?fkL;UvRK#)EBjD}*U45+8Mc9MKy8nUL#13HQm> zY*z>bFQg&LZUmQ;m;bwv0nftpXtab}en;qaPsTxzAXxq35Gy!zD1@;;g>W}a&AIKz z9Bs#lAx0RP5Y+;sx0{HKfxHc#>X`9gk!aWt__bBXN9BFV56TYdqE%nu^Rl zuc9$qaRkl3s5HDu|LR6mK{Gt7!E3#$jvqjQ`4+?B!#{_sZ?npuuRzBm=fyD8^e zF>YVHdb*eH2IeymMe9_|pGe;hq;Fut#@fKfs4ov@-oXz(+^Dm4TQG!Esq*=OVJY%& zabaS(FgHD%S)M5zE41^So2$d8*A<+3RSH2G@5$g}E<7awu(tVRm^_f@M+q%0MwZVu z1;xp|`Cxmv^`KSZRneRg;jCM9M22xj9CZqIGj>jaV`ku?3|kWv{%iCreK!2~Qb4VZ z5uS=P^8Fq?j$4?l*jw%E$B%XcfouYdt<~+PF|I6ZI#Tn0_h$Ok|LYh zYequ5-rMSD7_AJ_v`3B$99aE7wRmWF_vBLPpg;d?b+~@NZ4skv!HJcrI+f=7&CQah z^bue*^^-!#d}B3lf;)i0q916JQ6{UT2k}%K-^du-5udG(bP3r@zsgX1`)tdw`sCiu z@Mvwj@DIPXiLbXhz{L5W#qLg zD*k@qi@mwy7`C}GE@MSIWHjf?-_&?6dq0&YO&1^4s!1I6wq>aqez`rk$vwf%#S_!R z2j^yniRH#i^JC!t`GcLx61)|971(mJk4zqc2u@|~ea*P(C-S3cbfh7_cb&L08qKjs zD>c8b8j+QwI4J1bPdbEx$9D}5hJIaQ?E0Rj3r`Z2&=aySj}DyP^Y1)II$I zFM~7mTY4pbPoEtgHZ$p+MjE~hq&Y?vWXo$e=zU+mcNpJ);k$jHH|>}9FS;lMd!N@X zp^bn1y57sEVOx532Z3Ryh^T7VSf|cs` zPt6a%^UI6FnZ=3WR^-FgD?7v0I1|oRzj=SmicR0k3C&z}x!7$y^w2>-Qc=a}=mhXQ zb9gu$4PK;Qz=B%`bG%>I0xRMNL(@;5ptI1=t0ucFdT}_|#C>X^3B7k&4`2AN^m3pw zPeQD=gwmVGoUk#+zTdZOABWUfKf1mVo!!#F$wP9uc-;K-KGyRZopvaS+4uZ$>gt~Q zws*FJYsR<#GQei!i+MH{qT6VEk58r*AP$b%J2E$FRXcb>i?cJ4#?g;^0r$+EBk*jo z&}YdSRdXQM_c5St<5iu%czl%id^2+94O<2y%kI(Np%15B_@0_7ehvB2jb*>b`8zeH zruPiWBL|*U2FLPfv&aZ>IvaQ#nstOa2hv!}p3EOv;^=CN3{G+Cu#~yOPpc0UhJQY6 z#4fvCHqfhKVQ#Y0`vo89BRC)v@f|({7IVmSTXsFmcrC7;NV^>t$J0ITKkh+{gQ2@7 z5?v9w)8c2YnK7`++cY9-oy zqOF~=DlqUl`lXx_LR=6^YqA^Aah=)`e3*CO)DT$%{ltKFON;Q_f44e~D$dhx@BAcAFf@r1W&ci6YQQ->$9G-6d z--r`UmQB1mSV55e0RXR@5j4R5i&_k- z0fWZ^&ynH#_tD9cF;;^pdW8r23t2`n!Ll~_}>xNuYyx!Q@{%z zI?d(oCQL>sr#gLn9{d}JpU}UIAHi&WSL^2J=rjWvP4;gCnOjW%h2Uys;mC0A_{6Z5 zHWtU#q_r3#13n0S0b3z%vm>>6Ee6=rr)n>} z#&Iq$Acu|3{1MSzrgMl$NZ*@l13;uv- zJdM1DFScCmsm}c~2PgJ;;$CnsGs0Y=XDP8(mn-`Qyl4@4ZQ*BI;(CT!-|viu&{%bC z>}Ln~>iQZF3!a_~?b@zkrA`JGS=+%i9IpYRz_~w z=1IOCe(p%iL!}>q>?8Zr+flg4o#fD|689#t;fn2Q8bqKk@LfsGOoLoLR zKUGJ4F3vQ6MK+a1U&jJJ46Uh)!`8u1=m8Da;_aBtZDpB16%VT6KhNW=JJNJ9bFGm4 ztKjPRK3uWWHV=ii*I)C}~CghL(PiJ&|j?-FVqU-Pu_a(&Ve*M0n{``20?I`^Wd5M(hE$Yl1i zBcYEjMc2syU|bUDO}I2e#qkP?OPFM!q97pWF{FuM01-5O3qY;PqzS)athvb}!}*gl z!>Pro;b92Qxu+ts3>&Ml&Mn;wFl3?#g#FG=RV8(1Wv*Xbn67=>&JT5zg4Ju_IRv`1 zfyvZ`Adte|gQ=lbD#lC-w=e7LgK5FlDH7ec{_8SJCkBY%; zAU+NNu)=~QBcIbuxz}UPW_XFm2d( zdt|saD&LI|9oT)cy=R02%}^X22&lbu^!CLbw3RT5rZGE)KrgD-uV&ngbN80^*-Nep7k*{^O^0+@;zL z`=)r$ApBQ>F(5~;9>MvlRmZeV=v%F_e||4(B-aSM=)am1Q&a7FJjb9E#oZ6aW$Q_! zrO1d-ocXd^fG2j+LBIPW7|l63LIJIXmIViUN)=ud4R*v{r%MJDC;8|?44*upG9pG{ zZ_hjS;P`i(P%^#;wx>kol(0sB#)y5)kvT5Bq<_W=ye=##T&2cG7n0G>qyTqC)0N{@kK_R?o~qg$e)Gq-!*727 zW_WjUHqzB|^S9QAr`sDgENcyhbG@fE*pQi&sX+TJ`3pbTVNyLn1A6D5@2Z?nA^?1@ z%DP%ivc#V(yIc|P^BrD#pTdAC(1!S`3c(EO&IYSq4ZYzr+7g7|I>r(P-eaXn&^qQ1 z2jB2pfjrVC$TP^D^Baizg?C85+U@AXsC@7`;M26oY3c`E#~y>uJ@!hNXAuAN#*#jA zi@;Wuh5XTG>ecLR^63D%$^E<)c~f#9HA34)_J9K~OeLPS^Aqy!a~%@|AOP^Y?@!&! z=yEF!o+9vp;Y53LFjw_TetBtB$0G+7)a?V%IBSnv#Tk*smds{t%)-6Q!yc?oy{^5#4$cU4y|tFG}$HPce(>_Mch z_d%=%d{(n`HGtn*P^JQDRDTh4BPjyN6@;W6FbAAEu%W2BApk`Zv1)f*r)Sx1NnkyT zYAyNKW9y>urOXpX8+-bli`m?Of`e%;Y6HD zzQN1b#k4hS>X8RTKRV)A4Srj)mjLKv*}6}5Ll+P%fB!*xAm#UGPq&B9p3&B$ah)7r z4@Yw5zZVS%Lc7BbeJfgQZNyp!j973-jW$5rC{T_s4|a!t_toz3W%fe8dw=B53WE3A zvq0>7M)SeE0wZeZ&wzIUVkj1zjA^_VlJ87UCE$!KWKl!FqSjwZ$9?%M*O)rI7`}Ub zEc^E&Mx=-j+-@fJ5T=tk;rTKW0ej}^rX^2&*0GiT=n;p{2Ve<0RGR*!!cODB3p;x6F!gSq9jxW zlvxyXUul<)ga2uB8_zd~A7}6Om3*cbhiYSb7v)+s_Tjs?7sDI1Mf40jhU{d{tpjH1 z_YnWZE<)~paj+qs!}<-EvUx-2AV-le?&v^=-h`Y$k^*cXI$Ua92iH~FuV5!_69NL* zW0&c#F+z^I+{=!PcXIl%gRVq7z@pPXk)59akL&IE7NZVo-ATQWiKhR#f5|K;Zg!)N=u z(lh77tMe15bI3+pKz@jp=utY{cQgN|sy{k;peG$bv?Z{rYQmO$C7T()YVnW1`s#)S za9BOxQ9Xo?2;CYy7-lS}hrx%yW^O!8g#z5ywI?ztHk4V0-M&yGMF5l&xM2K{Kx&~U zxQ?L|6){}L&<+Z_D}lgV4Cb(4Y_Nf`XI)&5uq3ZFM~plm7-_#8)AKS8OE#h$Fb_tc zoysg5NZn=deDz2J3@01Sy6)jWN|!mKM3vZJDm#uMK1}BMdwMU8x1!ATonZ3KhQegI z1Qd{XP(6DZ8+H66?GEiAo<`4o`HT*4t{_)*eDOqJE&*iGZsFhVWVK0YBAbVp6q@W zBER`I?-_P!zED%ZaI^ubYrvx?Bs6Y=10LG=G$-{^Z2&_tXqY$N0m{sP7L!VVlsIFi zhyGZ=XBwOn`DAe;dRtiW9h{#tgnp_OJ|mL)z*uVtM7h>vkkFG)FZQa6g#tS}k<*Y` z&kl|96}%w&cKpU1#W3h31Ef64_(3U(#e@*Zr^$G^^vDR(^>h>|w39>ep03eusc-!^ zEy4i_nE^jW;0&ij`PK7nmRf@vLF%5|AdRuI!a_Vj;8-12!dP@D8;ug z2ki65TQbU6WKBx_ntA!x!@INV;nmw1eg+?JNnZ0w(pqE@VSXl|4lmGtNgBQz3rZ3QW8U6{%F9TM$9tl&+7@3jCOE-p2M--o zx~&1z>ViNy)QB?uY082;fCbyxsb@+UVDw z9-A$d4ToZ*c|Y~DwU!1`8k`?a<&da+42h3buy5S{=#e3~@m6%Ew}&?2H4u1*@<$m- zXHD`P+B#rKo#=PJQhykhhzsu^VP$*DjzI{(awa_m0<0X8HuOL*0A*d4kGXHE3~DD4mv}_AOQ5FeIrLO+VrHa7hoOU4iGwMF{8@SPP zDGu%UL>*%Hut685qOfpkl!MRaF>IfyU)6hvzCjjvC3?xWBSyd|t;ceH`PB2aoJZF7 zxIo6senfuK{y)5tQ7*&WpOckbb31J!;?T7~-7%_%kyd4AB2yN6rUlLj>9}6FkZJIj zl;?LxP=d6%%~NJ5v_MB1Hspc$mLLJLh#vHt1y0A7?0}Gq8>%F1ZDMv_TE!mRq#QtBgL)Ty5W(Nj-y4$Uj~-EOpW2y0zd>hGpbe2X z_!V$&zSWyI)A1BrFpw~fMfI(3(ysq>Iz^RngFsC zz&C*AgKVNc0r!-D1l?CQLr)j@^3{{waN=IRIhM>mGwm25`sB&x@RfeYHllNqK#v#4 zq#cNN;VUvu{h(_YF~X=997JT1`A;7#U=aU~bLfvAC&=&<<>#B9?0e)Oi#Px7Pp2_G3x3l^=Op}3)lf&Kr^tnkx2I>G zJlY(7w6h{USc`f4@8saVKJ}*S=cv8o6VSGgSWiy80{`AY-8MQLh4Sx41tQXmmp$~X2NlbA|5L^|4|{Sra4HJ1nB2lcuOI?|4*;(~ zsAQI`tUa_d8!a-p8gOClD$W^h4z6pN=mZWVWhY2sn&~(cPyEgzS%AFIkV9NdV2uUP zDyJ40SS37w4Si(jczZCSK^h!#UQABF0Pq~bUx(%V+X2h+QHE%!VIW{o(NJ59@Vudkm!&kQ=6v}}LNXY0pC2wKFR}Z34PF6>iUb1mPH5=+&FE1SJ6cve+wxh_drYNFwBaGZSgFxvY`}b22Z!=?J>}s@+j^t zlu{`H6Eq0rKu}HV4%(kUJwa>{77_8jz)2?T}b1(hdY{!9l!M)kwaBNYYaB%%+O-w1@+HD zcF!b8na9re^b0q-k7@G^LB^O+eYIY20zS{vh16<_>>@$v2uevY7%ia!NBRIK=< zRGb&CB?S1S9E-MqTH&~$EIaSC1L~*Bj{>I5)N>i*wAIs8OgR6{A){9Sl)Up|Y)N7+ zv6(Ma2Fo`bImuoeP1hO1u>ot;@IHEi*zfK}x<^McG7-2*3qTNpMc+K6TSTP{MB*{f zkm2MPy=3D*1v8~D{-Kv*Q-(Um1nrwSf7ErsaxahV`06~1>9!ZnE@hnZ#B>Ub756fW z*I9HBh%>zBH+opU*0%qXT`zd^Pk%fee*61F8|{N}~awGbM$-1hvUB^crcUIwvT8AZ5>@vkZL}D~vLjcWudmphq9P zlR@sDJX+%8+t!EZ_By z>h$O;{f488F&4DeUhjqGrQdiBd`f_Ts;+zh_@dH|+xZi}^BWto*@2l61PMcCbJ^1< zT9kn?B4uFSPu>gUu{P^~xY2p?Mux|G{D|wzc_g8HZY=98ZU6Ogi}oJsy}mjDU8ob@ z3t$!afkhx|z9`^lw>#0B{ajiBf~|2x9cI=H&iQOE{P0*jwx>3*y}haW3A@kixuDZU z4z^^w?FL=vi$xAbNpD?W)1ff&3sVjY$T$LaGzqbzaqdOuBy*(8j?|uR#2+4kqif`c zfCT%|p=+wI+AX6vY9T=62G`betr9ra&aKje_i)0YC2K{Xi(qEtHvwq}yE4C~A+%Mp z4w8%3%i+L{APEl5dnB`s*Fm>Dow-X`B^^AUMGSay8@}5O^aXjV@x;1U;rD?+SdD8&n?9 z`RML9@)L0E7+qq%b3Lw0K1Tug-oM)w$7~$?C)ynoKPI$oChm*CRkS-l)S!J5%ztk? znA&s;bxpbOzS?$S{9OlB2mFXXfs^Jh)1+W!PXC5<^!j=R<_S{C-eg*zgRg1Vtw|q+ zUO>)Yd%<+3lQ0?*?5XX2CdZi|066*}CtvBXf$NnG)$^G@$&AjcKn!33RYv^st^1#T zxi>u5yI!h(U(3m4p+4TXA^pTB09l8LQ8|2tj42!r5_~vy04Rc&+LV`AV?%bQ^2oH0 zuODv?2m7qDe>ME`_lLtDUK|ZC#qaPYHsv$vsy*_bd~?&-S2)U7a;WM3W`rN|W@qze z`0?jE!{7blVEAf(TaNNDeDl+w;kUm#AO6R0Pls=R|ISms8G+(pHw!zTN4b-|45|Wm zN9Pm-I}H9tMkR7JFtbo^$KnX}lVyo{sS^*^daj3UIw;N917T zHFO9={Z~AKn9=jdvb{&E!}G^$w&fVHy7*6j_vH<%{MV4g-#Dr4au$y zBBvHs#-ZdLK}z|6K&9X;0$+13jTo6=utN2^h#>oG1WXIc(B!*{pooy|E8ZvB#X@Q; zVl>`|pxV@R_ULXlQD-Iss$ugy*vyDG41(ar&I69F2{jy)yAWao98fF>P~M4vfU&~p zk>b<+2w3x(Ua?SlLiiOE#QUf;a^q*}oqj)4EKpeSezik8jT53rmU;m^NJ^ENx?(%UxMvCZtI*vCKV7xf8ldI%u_y`PN zOXjcOOa)k=m!s`BDAp-OnwcG~tVcc?Smk5ies>vAUsY$|y5VPZec2~vM4o4hr=0L{ z^n&@4K}Q8W_$*|DQ#Mwc039$m+b<8`fVZeq&y$pLsDMuyO_Fm)IjvP+lo^G)DyHT; zw1t{t@-c8vTTEZFk@a5hBr41hEbY6Bwl{=Dg{nZdb_!GmEIi0jQ%E@O=S&6k26b@4h-b>qLx&l~Vlkiq0P*0XAZg=@I z;Y#nSbJ~xGvLlyMHuDp8LAxgZ*V2fj#jxRBDfwL)B(;zyxJ(A;vw%#cz%XFZqJrCv z_=swU6>Nkyz>otfvi_)kA#4L=Joy@7xfj3?BKZrw?^1Lm&luz3WUK9{?igXfqCR1` zN;&7VfTSup3O}*?E=u&;O+BlUpUYNN|1N(1%YD9 z>aWzOY&&HrD+f+XbcYvcLk#QOltY3n;d57ByC(Uz_z@uUJt{&xQZk(YA9{*(TK?tp zQ#f5X^zUSFV009$__dKg7GA14;r%!`v<>p$qUk>L53mz1`B}qt(PN*@_nq=^MW2A-NO~;DemnudL)DjpUHcFbUHc*0Cuqh zpY^~HPa81W+-7wHd(LsdaacJw4~uSm0ir%Bd?dNXyk>u&I?Lo9AKhE}meFI>>A2;4 z0W_okNMGuBY3uX+&_=cIx!!P zsC(OY))9M;;?Ra%L9S6Y9C$i&z@y~jr!w|IyG9S+#3z7Q_kz+_%v<;H<}?qBhfXuE z<)HVA?9!%jKC8YFv-B<&&Xex6H_(`eOQ4tky?7Mo34WygG2+bfJ=34RT}b+wCgPvZ z9<2;J+nd9qr_m!y0r`G^0f)(QJ7pHZMLrKkn+N;i@%{ZR>qw?DT&^)Uo*p*YF-ema z*EuDuP;-;3O`N7Zgia#};7_3`ohXyIIUi3lYd<;8Mjp_{k$GD(NZ7L>FC9cM@8*qp zT=vkIfZ!=BYTGP`_H=J!*pl5&z!rGak+xdffMCE+KiiRG6hrpky+0lPBi zkIfV8F!58dhu45<%OOx!__})GBLD}T@*&?HPgHp^uxd08=@B}xJtCRRF!PO^4gma zJ@LxT<(WG(7@^{OLddyn0DfQy{=WFZK7=$i`V`qh5CGq9m-MtJD1I#d{qX)mG&>zw z1A))rIoOx&3EPOk!9JgrR2^-tu6g8u7n$@FOVLlZDLwFy_Eok*`h2pN(UfnG zZ-xWWlMxO-`+9fSWnD70P4F`H<*Qd8{MDaV$_oom%Y3wckU@HIRZjc581bOT;=w<=Gd1AuZw9j*_Hub=PT{OIY< z@avx)49}m(ybz*(rzdBQ;*>BX5P;(VCs27+fuc_g!O%V$LKFaD18CSBA}_g@#!2M0 zKm^WnqcL*TfNAhB9_c%(T@5^i7!3>1xM=6dgcdy4lvjuo9wm7^J34jd?6gq%@=|^5}LX`3#ORura0z==u<1vCrbUoEB)}Q-*}{1kdBR z@_eOHJ=_=>0P_O6mXg1bhsmnAJ#Y-b)_T_hodS(3%0-^$BL?QEA?4)|x+j4{9?>D! zp(Azc#?9rtmwIJL8Q>DUVx=O~!cSZ4kv>9}ZD0A@R%0b!s`}w1Bb&Rs^Li~*pr(Kl zDd2D|CfmbN-*!kRi^5a@fB+3f0>+g2LxPpG-P@_m=aL;NM-0I#tf+l5q9Ep+m2!-{ zGLnWKDC*M6LNq@*JGWz5auGHx&7t)p#PeFtKPBP#Z7`<7tnR;2@WO=911{Q zm~%%vXJua$+GEx0v|23AnG8D#SEdXcNm1j-GE@~C&Q1yC(DN*wRttqP4Z?f9%rYkz z_?e)4^)7k}81=E4?U&D!0*1N*)?NS@L6`cCx$i7Q#L#=bXI!|R>x=Pu3{3c|0(=GL z5Cfb+;8n}@YF1z-=t$2opuQ+$$sdkE1*`ydfSjnZvOdIt+QBn9fJ`NLg29lEMqyJl zek7VOAD<~GuP-AXFJGPxe|#tBS!H}L$C1$!^zNhJM%|)3L~b~b`o#IB#}0$sYsxeZ z4Uo<6cD1d1&_e_NPD5e`8B)yMJ+~5Pkv?*>Et$2yv*9^@8*;!I!gs6&W~W+oaobn@ zf$E{9P3_2_db$_o0gM8v9)69{&UuchO7JvOeyRkdU|Es%0sj;5=d+tN zC4c}GU?fpHn&_2ih|znY{4@H>pI*g)%?v?5+M?d5^a;jD9*9_>clAD{OUi7}hxZY{ zdE|PX+U%id>IE(9S(T66TGneHxkKN@h7KporayXH5BM1_2vOI_d*oyU^SR#}sV$;6 zb;9+qE2hH%@!A;52f=1W=P*@)o@lR}o_C9zyjQYDJECDax*g7AmaCB29`j#;0?OgN zwg?iaOv?9q@+a~i!x!77XwI{T9axtPNrPv7V{`aiPT&`OM$c>NYz=#Vvo(D6 zbZhvxUuW0McW1-5(lg(^jWWL?NU8GEMzIwy53#``^VlQUW7vz(fM7f2t+H{9tir#c z?YMIw>0H3R0<_Ygflm!+kd4Y4bqY@=84c`f4n=~L5s^UHEoGfmQOze+jzRRBKyF>dA*x!2ai|9W3ut| z4*UQ{)Q9Uz_5?~X_BpMO?x~g_4T_rv{*k2#Md9pb?$uH6XhS{s4 zw5c50_I)kVqbL9M>FKbRZOyn^^(YU5hVaj!>>1h)c9=&XsXf&61u%91s=NSy1Rekc zT%h}oj7mDw_~P89-bp#i;jbypQO{F*EK~phuwVS=Uw?4}k(g`6FpcWbn<_r`Fq{?J zL~jeGLNQjX0~~+>TDUPNdDB_{$bjtsP(u2r6vm!3mq*8r?D80e(IxX+!<50w6ebE( zJt?)Y-Fi1&`rVL^DWgy0-CEL!M-qU|JNAlFPvCz`7>euB$m}3a}`}Aa3i1J6} z0m>pj%@Hknav)%%9MrRWUWq`;$fx|?y1H*sf@Ll1ZVXCf!v*leq3W6ZdlgUf**wiG=4ilI zPBVF5;95P^IuMkhdd@MTaO`ness|Wnm4!Y4?T3w4MpZ#SoFRV$Rl*YC;)PhMf)gt^ zxXN415f*Q!Y{Tg0b22+gCuoYpzb&EY(E`dB`B|fZ3&-O14-$SjSj=~4C_nNB2O1$C z!>VaRRq#MjlU#X|!G#g$K%3r68Cp5h_Q0cXytrsvk5qcXvO@GM-UYP?DYiPO&z1t( zEM;IwBLBn+OJ@@Zs$}m8FK$gR*f6LIOr~kblcv z>Y!;K$bbx_kElRLDP8h7gMQ`~hDGB@UabWGzWs1EygokjJU)WB<73K(WurFs6;QH{ zP+6#3Heg+*e>QwGfuc{PK`@Qy;JQ$V)d`=h#fx`WfG`XUdIHt7p^cgblS9Ari= zO)-M6O7I9HWYF1^3A}xalO%qkUh}=A$0316_zf^B1aKe0R2*wYQTQ`(;#czC8dyA4 zb;rJ3Z|el5k1e|rPeBrw$RQUjP@5~gMWB=6s3#%2 zB~bd(vcl0L-KO{A{ITA_GdV9fn!1i%ytd<{0sF;8*TdFGpB5y|jB z*W3nlz&Wq+tM!MqG;FVmkEVIV$d(Au;9OE(I!LOm6{yTd>yyyjO$7=$0;JT%LX#5f^M6Q_ZI8l$b(G&qg*)9A^?rg{fH}U52q^yQQS=6sWmCkVeXz*Os_K8MoCjU= zmV%~6aWKV#cIji~u~bDkFUnKy0c{H>0{$CcoApQiyIrUh#}aad`mV8q33~TxV}JmX zFJ%N`h<}`00XFJZ-0^t2d9puJ$|7RZ0~J^%~= z%$0CxGaq7l=m_8HaZj-zpA?fl-vw@Qt@|9H)Njy_5D%F6eo{DKfy{CKliwTp1iAs; za4Y}-8L&x2K~&S|RndK3>{Qz-hGnkV09t1f;IOrL@!?Vmna>eM!WX&6d30bv^oA!# zB)#An*MWY+A*zurypFOVm+5h4ipYUi1Ez-~ja~s-V`%Ud7b5T&$81j5w9+P8qHKNM zTSMSb?4b|K$Vzc<@Mt-pl}su30{m@0)ARIj!>0~@ zX$zSh_rU{f$m?njx ztK=DI4inA80@YV-fqAhk(%?vIZi;J~+dhLiQu$JFE2j9QF^e|-B zbol;I2AYg80`Qb;B6H-WPCN4J`usxay+X?^v^l0Qv<^+(UGioLdLhn20XCuD06ar| zk{-Ge83;eM?GyjGMst8mDTVgD{Vp~-=A1d0pMce_yq!Nbu*fDj%FmTi&Uyr1xa{P$ zKY^J{*GN|xB`JCg;Ss=yfNH1MKk!vcF6U474>FTtS@vW)MQ8F$8X$s>a?VPZ3H2F7 z@-e27;Mlg1lZ}?t{QNJ1gGvp7s{X27_Vrl-2-6{H;a*T(gOardgh#@vd^pt5s=zaz z9%dabda?*>Bq;|=bs*XDUU~@o%4;xCW^M7F*hr%S&y2V$TZ1}{Me>49=xy>53-HBF z7X%UIG@6fuO{M4Hxb&f?@@h{nKAQWu z-@Y9@h2aIC13bR)8cEb4f!3|fP3eU7u?}fJ=NDtwq3Cj%L2cTR?%!Us^ZYdDywiD8 z9XLP8S^xf!sdE=zZzqC`*Lt4&Ibad>+2AOjA<^!L|l?SI+QY^Qt ztcMzT*pF^TXE`880})sVzCfMQsd6EjyRE1mTKi{L6Wf#$)J$oT~U8rK8# z);$gHf|57<4oLnjJR*L3b96N>^S$pL{wTOu#7yM2od|bCmL}OAK_VdSr}@M@$anU^ALdi-G$k^h1TEzi=1Qb zMyw4ZjD@2PWN0u4#_wMB5>95%q5F+k5iVBL+)N2=HsFbL&@Y3kSl zmOb^QJ?jOu_#i1oP>eP$`$vwVqW{cDPt?Ky{K(=~1)LIOM5)L>Srb+j^bFbtPt{&!? zuS$99-w*^vgY@?;fIRvGdUTBnRFtiTY(ocVcB6Y+gASB~%rhI>_@}IzPstC(9Qm*^ zm@m$bV#2g+6>pSOwfh0gJKC5$t2xE$w$i}z4M%27}3m&>}gMc0G%^2!%z9gA9%h)d*`-*A9e zn>h>6<682q+7x>)d?{2f6H_Z#mk8Nw9nsWZm9y%USCY~gtP@(<1^NMnwZQ3aPSKIM z>V3`OylM+5tR(-JBMIHf7wyF|HtVw-O!5Z^LIU(si@pcF?V*i!AF`rwk;m|e+qdZC zdR0DLZ^~cEB6sj)0HNx%49Y^=c8%`*KHCel_5>i$~NVY>RpZ%pXmu1R3c0C<3 z1O*roNm?~R3tA&H84+jQhdk82wQqPYBjK0}j!a>r1AzMpv~H+;d?A1U0{R@id7`|d zD;Yha*Sn(waLrJfyvKIW?uPuHwc&FX@slq0C(GrJV<(>Ioo}@9Nk=a}c*^=5i~@)} z0rCt#Qg>?^h-l^c&d$2OD$xQPs(9Btv`~G?7^1!m$_$;dp34@w6RMBWJs{RGi2zG< zf-hX23WBuB!H?KCmOC743oSSy_&n0b7Ig=6BfrKDt<*6!S~>zM@-NYG+E>5`9vtN#K~~~-(H{J{*+^1+3;&CUMVqWvtY zX<^jy_(c1o;374U$&p9o4dr@cAp|_fh3okYb;$G32gN`!>0u&b1Y#xKxS64I5y=Sy zjp2}C^h5<01HpJMYcf1@zgy7YT3kxHQu**RHqpvTNL%LIBM{f}egpx)0Bq@3hb>8g zg}VyZU0$LW6l+mK8tdvj_YHq_31{)`zBUn6i zR1LvFFkh44RhqENlr*UZaLPcvqI$Ub>-Tu?OWxOc+@?QyOdg{sw4cZuNb*d`Owj%+ zPwb1IlMTcVu^)R^@&}hid+rZ~EZ$L7=WVXnJPgziLR$_F$v0)>7~ZE02s!hq1XD$V z>70RI2?P+WEP3lP=WlGtjJB>owQu;-20I36(+z!*b1H#*<#mq(m)@&9ex~xObJc*F z&V7ztwog=j+oy6c>GL3a*X zp1HgUjp*TfLOY)ktmdlABhJp8ujBIz>o$Lt!9=2b42fsu{V9#L4EEGqMCOFUGgaRc zGEYfA8wc8$({G17H~$>3@)Ml9H=nxH1`W6t# z`UCKD)xGtO=okhI`H*3ut%6YewpfpJOMka;JxZceKYW6b&y{)90(wnC!R=v_MGlpI zK7W(#o$|o{45j9ncJ1jjXP34^D)4)DqTf_ldT@)bZu8nK2Xs%BoRnD?1XPul_~0J4 zY@Q>?V+&}KLZjLdOnR+Hzv?&0UW4E{-FM8!UJSf=JYoxb>G>()r770IvaVDN~Mjvlp!Oz~wc z(!E!5DfwyYdF*r4de;fcCi!K-+~Ixh3)eUxx}Rzec_!JzIr2}}r~|+~V4_#()ymZ< zpH&GQp|fZ|*UD~@{`7K1<%r`_`PYr^htJF5;#p85RA)AS1LREEY@uWFWeMBT$}^99 zpK>(Lb*%G}^XzMiN$^tGJLT{Nkj0@RaNf%{0im;{&-C2Le_0+^hxRKFwE_HN-H`N} zPk<0Q{%UOYYrnA*jkIfL(d8&z^1$2Rhz=BxhcH3=MgAYsVDe3Gn@g^WnX=?_Qk`FW#LG zZx8v>0be1?fRpaYY8nwbjwzukyJ)BXE=`o5Hls6@mmNMFc5FG`^;HJ^DOeEy0J$;t zqX|3P>%(=n!@{~4sPe)4sx!4@?N-3!R$p@{DEAe;2;=lar*(h_W0Z;%M8vA}uRh`9Nf0q>2{Qgy? z;YQIRr_$Fl?g&`JHnR?JSO?PfD0k^36z+KboTfap=toI?M63Dm-@jS2nlGwm;Qw`U`mu-wS{^Dh1Fd=d?TThz-O z9XV>zu@U!^Yc_|M`BZHW2k7%Nj|QvWv{kgrJsuLU^dXp8&^Uf5-z=G?KU6vGQW{9Z3L??Y#8GZAwO{kTXr zMn2IW&M|8EhjN|dOe_XeNOF$`aNmG?dRa*~=1&kw|;dJ<)FQ;LmA5P}^fBQCmdv|y}ygQSzc6{YEN$3e;(YUh33Mp{XGBC)~EJgKaYX&?@_s`+zrG=h zME8wy1s$UVvpAMzz-j3p0Z+<-%%|OCvT>|!u{upLWlvgRuxElD*7CEhg_!yK@u<%S zg573?`-f0p@hQEA0|G9T-f_wr_n514Xa~qt=1mifvrg7AvWeqza;vTI^dyUJ2PA@y z*1_yWyO2X!U%Jj7-eGt*zkybs@?Lt&34mf7SPnW5@mA`K=bdhC{vq~^E+JX21M(dF zH|4qxi_174%a+HK+2!Y+JRUK=AAV4o#8BoR>?9pi9vt98W@SXLKU#gr@blHQPs#?V zKub8Q3$IZIU_Yw0)~p({hyoEP3mB*3=6wCV>tZ$e(IMZQ%4ll3+c(pD|vsa4V!^r z<2Z^?WlOTnq2#M>gTHj1ge+cj07vz}MsGh;F&M^Q>o7gu-H6VPh6h?)Twhcbg{udz zlOX}S>Qe7%Weffh?}}q8Woi$AfHar6gyX;X$G?4QelJD_aYHcqoeoXDbJ4u8j8!VW zgkU=#4b=R@0s-L%9{BfyxD6qS;GUi-y3{o%tE~h=Q+C5Y=QZwSPE_TE{9RwF(WoM- z!3=UJR+}i!tnmu(a?!vm83za%dL~(&60p$P*=by7(JnKNjx7{*Y$i)uf}m->Hxa7z zZp?EdEM55j4fhwIt$R?X>}gUJ!I~N#*K<=nQ`J7!4=o>ZOoO4OQPj~W<%kpmCe}O* zEI=@)bzZzk-UE1_{9@rI!cVwR!G;pMDXR%6c2RtGC~D*X1RQInOfiw=GZ4fA!OJ&vY-~`fbmT=+8U! z_FI2}fM(k}ySDtq41AVqhWl?HuFCO|3?^W7rGLm>s>bp*`K{O6g}Qnh{k!V@ICS*7 zpL!ot?|lkb9L=@a&kw!rUk`WYB!3voeFu??jJ5}K!iKZSBGvFy=zpE-_nKD0yjnEs z3}OasIe_!fm;*)yH_FaH%hxgJ9XK>Pr~q@{(!b}09e4+? z@vC&gIjn;%YJQSWQ6mBv;_uN_Yu6tA1Q`C$6rlPd1K7#fC!cu*m-0vWDnntj`>b?7 zrI^p+&N0;}os_laM+Mn#@YaP=qvy#Gu44}KoZqoe%Ri~1^;{dO$#&u-$cC^tR(mB?#rtabCy#PP~~8A8$OP2J1Sb zzO=7^2`F9(o{!^NGs+D=%Y7@8a!J>ZwBxpVej&QMT;BVNuLIuS*IrlM{)$`+W~B2R zpiB-5aP0C#(8uRV7YJSf0IuESly)wWuf>1;56?1*Ks$HzHna{AXcyT-*p+}NA;@RL zT8tShbgzSWm0=18(JXk_^do#+4tCuGD&G|yDabFMp*vOjUH-JSpP2zfJquN_#pn>R z-LpnkD|7nyxdnUzmY(m?yz4eR_OXg!D`mu zow&tdY$LQC`;SAUM%-a=*18V$nX5wTh7ql?TWA9W4*`K%^S2nHRs2e?meEU`jzg-4 zxUi(~`}URl5k15871p5?Q(X>?bSv~{8Wz}1ZrhEZ*L7)luClObR_j(_@JJ6MX#Qb`lEvMB# zfB)N-*lmjJ-?jbpNB5Peg6OQxc?2kzWGbz z&naIu`A2HG1jv zmqw@V9t4ZRwrG1?jZCmQ1`wB}vP1l}@=n?`pD!JSzF*Q;_h5H`bepP0)^z@Sc?ezBp@lj!3p33jXnxso>+;mvt-#))RMKZ$-r}tjZmwC>p2ME(H zgm)w2R1Z1(%bdbi*pvTPYdipaPwWK$)2$BB)gx6`w-qU0d6MjT@V8F2Jc@Qr^_zW9MkBz+A zB1{WpAqGX;1Hp(GM(CH4^C+0q6jLBC?k7-3l$h_vdQNi+SEgwIM`3wh?b-r4e`i1i z!nuU7hwO2X=Xu+R?)0yYNqT&o9O?5{Pu-Pok>eBb=gG6X@>h76zJK2Pm(W%4Z9P&g zmh#s>pZmgizVu+>&L2JspJu!+%ikyCFU%efVKkKQK>xF?nD$z8 z5=ZfOG#kdB!?vm0Ztkq7M+} z{w^&2zLbGE&>#09G5dUws?VcR(#;{=n7xiianU=nTG_ z_4utFMm@tPnxE?^d7;dvUVimOzT>SUs-x^<@lblKV&9@CXP>{G+Mkx2htZdBwUMvb zDt&vLaC=T#|Cz(~uG^pJu6CzO^t?Th2KT4eW9jFI+C(SsJ{6z(bkD!NyzLY0*EH$* zYh2STulFO|m+X@cefqsTX8KEuC24rSc+}7H_s_-YF#JEXKh-jI9OBIY0000Dekzoxs5@bqK!2UXnbZW-c`*pi0W(YAI|+pqELAX!ArfMURMi6&^v zR>_3vK@yf0&AdjV1jU$tkrI11<+QcLvXLyIIDyoz7aoL~*)3_~(Uv4AqcTr!cIDVs z=msqec5B{#zUSO~fA{z6o^D1nNXYgBY@NRU&pr3t^F8<6``f+yikX{32;-fzLm1(I zjPhTY2rd4v{yUZ544GAY_f;3|+O%9}<6p1gPwn{U)ZQn*eEr+T!d1uSkMWli!*Qcu z6CRuIj0}du>0tCi>#_NNN6G%$FsJWrk>2+7544W94wF1wvGRLf6OPT_M|x}B>r?vZ z$RLC%&mXROY<@58-98;YrS=!*hU(UkU+&L+q#q2PU;R0@NPWTclU4sJzm+$-D6jm~ ze|&N<{`4n4|3rB8Pwt|q{hBo8FQNUII+^;X{)ezSJ=d(iNk{%1ZS~qy49NTc0r<6- z2|hktQF`RZ6!nEqe&zbN9f9AAzqd9Vwgz*NpQ*jnek^~-Fy?=3acU&M&pD$PT1PMX zO#4;+)@quMqpi@JK7ME*eqS>7nyXr2d2Pray*|y~eVX}I^@nuCZCUdd=l3fiOnC7MT`#NQiSo+J^*FXRFKsei_Q#t;7~e7);=KJ=UQ-`hX7Z&mu*^wA}x z@9PXi2iNBzbh;X!)|cm3>(+&e)*ptGTF=PixvpOxdVL(9m%n2u`OV{ZX!JepuhF0NIR0EilTPDhezjg2?IHipzp8w#Kf}qB_iu7lea`7(x9Dbl zThY`|%dhbl`BzbiiAFo{V}4`*v^Mm6;{%_+rd8}`O*)mg0U|HW^zSyU`4~gqyVAc* zNwfW;zcymg6M`Of?@ZdLgui(8I2R@mg<>C&k`oAbXKZ*0CcpOWu0)xL9Yb@Ei}OZ^WG{%^|9 z$;s7nel(_Ld$~UEP;Grv=Z5}O`B$ah3;u}8`rT?%7pwg0;Wji?l=)R*gRb{)I9x5$ zi~Ysg-?lya6W9CEiQG_UQj(vTx=nul$kr`dpt_etMYlGoEU^3r9-%!WLXPExfJKlTA*fI+jS=F!EUP@0Hv>ptPqYWj$&HUTZslH-Aig;4B znLSXWx2x|=r@!sDzk1tfr+ctvXy??&cdGrV+B1!{EkBKaWcAtF*uN@$$nFF`HNT#J zRTFlq{cGkg>N5^C)Bl>@dcEfL!(PvH2+zdzBwPwA*I+b`J9uVVR(gxS@VxhkE^w1EBvA1i%nT5F8`dRG za);rn=U2{=LG-U${T=GZA9$A1@xQn;ct7@n>Q{Dtn$k`DEw%JAKMPv+#wGX{oPAo~ zMSarYZ~NO%+;&^1D~Ho6Jd!<`^V8yFPB-}q!}tE!6Sv)bp7P6{_3@%FI=lL9cB9p{ z%0uIffSvSM_J`>c8q;5z_O+vb-&qwH}#ZJR%i zKkuiBA8|vMJ+Wtk2_1a~X}~_w{Pghubg>7uK16GN4++s}zVEWgQE|GqFV|C-tBW4F$9Ll-*w%f@aEd+mS* z`^nnxS^tqv)`Qot@$ifGaWP)2e}eMMWO4tf_|xqiUK^gcVLJ5hz5hp7MthT?yNG`e z`%U%b{L|k5!1yEoa(@@7ugCd{=ijIPCVO!#%y@r$Z68k$dSLBW`OzOo)A)Kb`2XSW zan5sWJdy6_@%iZZzm_ikP<}kxlVhno`D1x+Z-?V2_&u-skG|mNMT~!M=PB9G;3LTk z{eyn)&|f6Hr2fi39^C#ll#iDio#kKsJuUs9)m76+Y(FK9w9-Us z4_#_nEYWJ-@O;z<@Eh9a-}Jvq*XpzCgfFB&_jP*U9YieGM_JkMnO24TlplRFA1)XP zgNN3#|BKGr6tlm$K2qcSOg>O2;K{*p{JpV!7k}Geh=^o*H|_iRqw4Q=?lJtg(!KZo zA2~mSnTY}VXmK!?_aoPM)&9h2wSOZ&mvA1}4Sz=E2ZQ9(_R~%me7rh6o6FmHhLev{ z|H{;8m|gye`Twi^adLIl{X=7l;V zU*iwu>vXQ)go*l_^)=~S9_vMAn(3!YSK|{t+K6{gxBgQtza9Qd>6}*C5Bf0pbfgvi zQJL0!Auts!c`9j>fJypyWqICSnGQ@s?x^a zljL^=Q{=Z+61}FvGzlH?cpiVEP2zI8lm)*`n>An1R8~ueqPtao+EN9%e59M>ZPHbK z)o$f|er)u{|HvQf-UfND%A=i-_=?|Jufvnim!^yVn*FKD+kC6OpJM*-U!ok)XXLN> zlW0HoSEpO6nt$u>nwZ0{tWOIvrK4REzmhy^zN+$QQ~4iq{kGaFd5rU0$rrt223;ST zB-n&bR^?scR5YDslPdeC8E*2U%FlXWPPR&yMy&ET#uwN>fb2y&qaBv{HT;U-CT&H1 zalJO%Z_?Bs<-5^7eUnHv^Ec_Te-e>gAD!2PHS=fwiJSaGdQCo({4g{V;HrK*4$1R} zXfa`ReW4NL`q3U_sP;QoHyh+}llHUzQ5Vww;H#-7pO{b^<-1v5leYdX!&~YW15*9^ z3%_c=gqPw^l`d&3_q$2+h*s&+FXjHodgM=Ky78;FUnYAD|3er2+c$qb`}b8r=P$#D z7Ylr^)+Z;Uy)oZ;^h?i!H!Qx$^N)nN<9D=^Jr)j+^oB#T_hk>9tMk#ha6IOh{U5@t z$8#wiJhZsZ`9|Y>XXAMw<1za%&qsrf?VsCu_sGIP`~uHJylxt@qFo@q+jv0jgNIOO z_FHYXZ|RPYP2U-wnF#xYw-`zWku~6=)5PUtF+EDzqL}v7gXumJz{zFuLszs)|_s=-=ch+z)yYU2Ktxy zu`&O~_KWVy6U(7hlTk-Je1n6>Qil2f9xO1N&2xd9+L;*cg0gJ z)yE&}zhW#ba2|H!4i1Qf_piVoa$fgN;Vbz+GJleMUS|H1evHSg(#?ZfwFllu>SO;2 zZyGWAEb5c};p5Z%2!AZb{`clI6#F&jJJ(OV+YlG3)u;SX-&gYJ{7LDl!j$f_qxned z)AQr6WWMGlpmYI!s`06QlIbw*rS-yYz>F37>2F*gVTScJqWDj(NBm#VGixj64>sE6 zUoBeuaXr*&ai^Z{{ZV}?Z}!^;|43P%`cu;C@n-tR@qXfWJ-$fgw@N=*eY73tZ}a+K zug%zo@|AwK^{^p5_J_*jdd&J>?RorJV81!Mw4y&W%WFQ4C?2VUzmFsAG(L4ldvw~* zI=!{__zqhS_y@w?UCXVhwEy96-y80czhElt<^1{l*84hd`M1x`z2(m*2Vc~A^i=QZ zH{XswLg&ZAH}`_qdj}4#57*k&{;b)dzv>V1!i!V*D-_>r`1it27}a{mpK9fq?`{Zl zVNlr**b0)#WM9Az(@=)bKR`UD;*;>l=JaUa<@Sxc_#5PZxWVOH^47FpzS}hYjd;SA zobbu!_9FJb_OngWYxZ0-y-6E?lCYu_3VW6XX!d37kGRA7FYu~nFy&t}_*2lzj)KVc zth5R8nDXPjHT_Yf%RJ2W$zV_oRsK4i@cPNeqYhbp2|w9-tLjtj8|`)KtKsSIHJ$kb zKcq9h*ZukH_Rp+*HR~BCv|+mgquWGwA;t<$MAVIzB)c{ z;v*|x;OiQV#aPg|YlROozJtGp$A5mLxL=U)=9+~QRd_b7FWPVBcRWgM`Zd!}mlht6 z@h7G*oAoK(@wa4t)A8hVmWS|prZop!)hGTipI21p^=;wtSl-O>Sl|4J>^E8HRk}*o z+Y{~e&Ft$vwX_1hm?i&b^Y|EHv%KX;zIyMbh2F~CNz-?OKWD>wE#2^{`WyR~#&he; zzMTe1b^gcrdSPEr<->`&t@t4UD(lw>x1vqosD93mz5d=xnP2m9lJ*X^qP}jXpDrES zKbX!7prgNL==iEwADXXnz0_%G*J0tGad{~7i(mA2Q~#R0*X%d)7f3&JLLdI)KS=8z zQ852+`waes{e$BECG!oxwZCy*ucg6{^LqL7i5Co`WInNy@jYF)9XIXo%!SQR(;hih zx@Ny1p{H7YyZqGe_?pEb3#FOA);@Dq(B=Wj_LdQqRXP|#+Amo)k);+;+UM}Ibx zpR&C6tdiCVM@h5dYU!%d!z8|F7w~eoOp4*?f`i@gwM7Y?=bEGdb{kJARh+ z3t<)e3G#0GCdNn504lvqM<1#FE%EzHoo@YEM(||M`FOYNPtK3LntdsM$1>*&ho4>H z{C1u7rt=BTGj0sCv&lZWa9?S=2_stX!xwk``vpekl3Y~{^clAl-%@p-rtTc@q)#-H1J1(PjtK>yybXB#tpwy#X}MQI9|obENQAQ z@h9=E5wCI{)_ck{qVTHYUxzzIdGC+oRq`L!{X;vy{w(<1>;uuHU-@?I>27B~aMkE5 z-aY{y9dI6O?{koTt8#jLKkb2!IiJz#&Pw~7rTsbx|6Lv1sKjPJMe#@=-roP?` z)Qw@#xA9yF-U_|LZT{xvX^->j_SEo&rRg_5@TNZ*dG-5t*=WgO;k41Lm)) z@dfJNfD2U9sz08`s|D4M{{a75cxHOIIA#1(d`8Q5W0QyM&ryELzepPW#e%BxLzd+Q z2AQ8KU8!5wFL|o+Yksz0pX5*ehx+=q-W2Oy-Qfp6@D~t2!F=R+3yXJohTU;R@~U** z&zL%jd{p|W9N#s>x2QS0A0>a|xrn-cbEQ6%McCATNuO%>)sn3I16~2?DPFN9*F=exO|pwGR%bHWtY(X0K*;c(u6m<;-3@#*RQ0kcE?xIZzRI?d)&O9x%z zA=3Rk$`d~qM$m6le!p7y{2m_fIk@ikvlm+2hX>#5{*2-I)?@qbM8CZG#I*0ffp`%f zzglg?^Lu|RUf(uv_(lJmrZaSK!}<41ZGU{P>reKdN+@&`2YztptzBjLYgg5UOXp`* zI%uDN9ly=9XAJNQ?oYqpZTul@;r*87V} zsNv6A|8@FRPnQK4ExM!l?EY{6?#%hUnJ{s2Z`i+MWwtiH zTL0)A9jemZUn~BM1^9F6Gu*G~t>pR{yga;BeqAThcvJg|53k{AX~3F)L@OYbU!(sT zQYycOvSRqd-+af<|I`@RI_$n>n)2%@zsX}!pU!(YAT0U8^i5X%fp@6Lh`-(y;{IRt zU)mL&o9idPRB%O$yPDr>eDv4kXAJvpSN9g;p^EvZ`;=d`{=>fx<2!ywI-iw1XnMkA zHNKIl<1g@jqWPN`@1JphvDYr=OFhc{CkJFXU;c;OUy(KbOZkH!`G=k(zPY)Jl*}pW{nZwU!%YG`*Xzq@%laS(T4wBHY6f; zp0IFrH!R->zF2hn1K5kZTM7T0eG_^&;s98+cz^r>iWis?e#!Qdn8mN6k$+S`w%2@l zY{2JLx-0aGmbF#bZ>%TLo8b9uUs8j$=jT<@w;S!%rv17dUE06ukogOAKYRiEk}IOw z{^qep-EVMv{~GO2*5OmdhTbb~k$-3QmtVhfzr9C+ zxJsZ@pZa&V?ibtrc%#ABI*%W!{&&hhK{}6?Vb44MzUywicW`KG?y|?<^pD$xe;~GZ z3CfxG2&QM7>D$rjUy5JQ{#2*Kuucz$&HCc_@_F`V>8XBZuwEYnj`f2Fwc0|6^)dg( zuF$NnN$2+C{*h^~ZbNy=EAxfE^`H1hyiBM6KP$dS>&g5Z$djl4^6Q_3Kaxk^AESH` zzrcC6&mZ!G|KZVAI2!#&y01XG-yfHMA^C@HxA+bBCt3fJJmU{i`~wdvzclM9`Kyw? zaJ-@s#`X?6-l)=jKDPHCH1$W5rhfb((oe3i;UDoHE&Okb!mnBn_(vCH4z2fjKf8!8 zupP0~hZ2bft@{Nve`!6P{W0Nl;b(pojWHHi(@!c=3y?6zsUG!`2+KX ze`tBI-(zAn-=8H_onoA;)YZ;NN8 zMCPZMhrkuI&bz8~X?v?r@!{rgz#CD>hjtG*80TB@4TIz0sa&5rQ}kc@3Xas;(~MR9 zRsPEVw1)6Ae}#N$I%0eHb9VJc4zA;n%I#@1g?}ctSH)kP!{f5p#YKLkwc?-UXGA$& zqhq~h8u`}&YNpkjM*rj=I+?yv{iQr2zv9RS{n#vjsaZ!Y6`=^H7;!hTiKhSwGc#ZAs6}O;026F{or2J%sA8ogGI^j`M3*+QhG-HCTSs_e_b`PnV`Y52o?J;%)1PU)NOUt26Q+Y}p^He^-jv5Ap|8?V*sH zoaqqs!#IG^lE%H|H`S-u|EgXd6m=PUu#|dAB(4$|G!6xC*aDp(r-TR znjB9M)A1+pcmhB37fpn4_oJLA%=X&yKggfZ!{0yQy~|L8FUEukHibZdc%a8C%qs{R4sEIDTn= z6c&p1KKmgK!*Jv6!=rcTetyLFh_m<;_fH{M{Zt?R077dx@6z`~-2U+6V@wY0of`gc z(kVanF#~oVa?AY9@-KHfj*q!va47g>&)I>7)5)F_oY`P+GQKVGeN~^guwDLBP51g8 z-!uIi?AtP3OS(pzJ?(f(`dRw0md>JR_NPpj2~*Iv9)wSh==@jydd@F$I$(hXEBtZ^ z=fnCQ;1uua&Sg9zcNZM4@Y?>Vqr9IH@n0((K7c?kW&A>aCE$*SI$_@0TN*mP3*CL; zQq<`j-*Yl~m;Rtj{66)LpU3`A-rd+fwx&-G+5wg{x>5Q{)^|O3>F?l{_WL!$rgWR^EnU0kbp(rm&*K# z{>qA9)M)&&`9`&xzbB0s(N=%MC$D(#PwnY&f9f#jJBOxHe;MBa-k&`arN%^4 zR1yoG`Q4fJtzjnorzPYk`77r4=|1x~@ryqGdE~RTg1S!ix57gEzu^C!%KSMzg232( zDSiWa;c?m9+tvD!wSovZKS&P;Z2uR1q{DWw%z4D(plA>O$B7@B{W;`y<+X>0^UTON z@p`$vL3=*}+0N@v>yuwzukzl&KWmTuINTQe`!#CMmK*ZSc~veCcU&K2{|w?=)W`0` z7FN|Saic_T&*1%P>L2gFKHHuRx0n6~>6a?MT7w^3=_i^i{0Az&G5;3jjUQX2tN9J> zH}f~?a{X%niPm{P9sIucuOly)jGZk3@$*SvZ)ToKoFq@!E8Oqzpl=ng=rrdWBZEGV z8YTM${V9P|{DavyQuf*)s`C-N8$Z!0qrsr-r7dl#@wwv5?fpgk85?rWHSMg#3mdHG@@oQNpXg^r6vu zJiv8hy&2B)+Tp3+ze9NYh~aI`AHQb)CT;mUedI;Iq2lqcYsA+ zi|q;j+Jb84Z_?gg6;Ge~D|toS)c!TJ4}T62&p%!A&)W0!nQrL&_sNXbeTrq?LwmE` zZ@7l_oJTg z{$SR=&&&FF?E>G=fqAw*@u!)5wWj(*>|^=cezk>tNBkA(QGYQ1j;BkSzoc{+?7x_P zs6zVXC6P`!{4AElYc<{(R`G&R0{gH_FhO+AD=2M{eJU#_= zs{MryktfkUTlU^A=l$B8_@Thk{>4#;wlmxRc<+Y&Z~yxE4(U_*zd3K=F&xJuY5%h- z%KcC$Y#Hyf^_hZ9`=^{Em~g^xwePuZLT`!ZZU2SUzW=`b&m$P$mgCtjo$>nliw5lW z;wjaa%L6zx`$!$B{?*3bj`lpZ3+HXc`5YB6!kn(VVEpmRK_!q~|z5vbsjQJ@KLT<`K?vFYM;>Pg+H=)VJY}b{tl-ycYXAg8j$)zX^Zaj8}M>`8WB`<&hRGfSli^x603arS;?Tfqdzg@|*LQ zGF5%lhSIHQQ^zNtU$1UM{#@Qx=SKO+^T&Rx{kzHECY|fk=CDcrl#c$k3~783zhr-d zdoQZ-A}=-qpD)%!XLWcKJVAN)ABmr=IZN-f#${g~o#ebt^Vh-uw*LSDc#Fh8#P{gr z-G$@PKhV|vP_3^>vp*eJ=R6{>_h_G>50d{7?$e`8Ggfub%3C}J=X?yKJ<>l{ZQ#TV{ z`2*ztQ++AFNrUu9I`5abFdwICA2##5KLB}<^~Dc7toP5sQyl(rUbmh7+f0x4HuzrK zqs0fjn0Wk%=TvoHJ>@%jwk z3!^}l-?}4w==fLuRo=fc`qm4G|Kq+b@dumZ*^Hkz;PVn+OCV_fJ!7Fa)(Ow7Q2$(& z?(Jt9eXPGgA3H4niMr34tJA{kH@*ja!TCr#%z)aW&YjYLj4lSdigNPc<|4Fm$`qf_oTACbz6Mz zu$^fCUIvgmr)$P|uc4AJjefYnKV|7W-sbbWaXrNJ+IcoutCw!#-UNQEo z*YZDaynSVE#{m6Y^9Q)UK;PR)^(nqf?YlkT`rG}ZYM`m#6aGh2XolKqUn z=(TtbbhY3*Y_>b~{JZ zjP{KFxxoFxJJDCG?QzCa!|z!?Q<_Jnd>+q!jzUfAYfi37`+0e? z>Sy)E@mT*i`rDfP{mVwf4_{B(v9O33-znK2R({#IDafAf8wsc?+{_-*e&9dePsScH zTJ|CTlr$nZ|;1)=cU3E9r2q%>b`k1e!CX0-Ar%Nb-Z(uc<|e9MOJm-`B%m^0{vuGrS?;*EnW_l7URA6zm@XMXl| zmWc;AF+HAX)qjWe=RJE!H~+`%{;z4i9PhzwI9j9m!zOg}H@H8K^hl$hRNnjt50B*Y z|C|n(<41pp&$xEM#!EYS#&vX9?`&r|Ye2&_EMc!YW_WB%u=KAgXkiO+q>&FGS zpsl@%MjlN*6t5Cmy;lU`WB6km% zAp2$Buhd=E+h+Tn?!##;`c?QJfW_ac{ZrCn_Qxshzu(b*t)2^Rsy`JTvGHza-<0{K zF}KVAa!-%rk+f+zcAlNje_@cPGk^Rvh1-p%k>Adr9Y5bP-RB6cN=Kj&V8@H|_I*|K zdC?xN(Y~j%J6+mdou0dW1$)}hYac~<;xEtkx4ovz>IH6i z+#=l|BK)qc2hxlCJc>uCXbrfT|F7vf|4x@5;y3$|9sd7S9?v_QG z(%l@lbmv#x0h;_Lzxf|jm-K&0YXMZW0PX4HQ?IYskMjDbadx``_*!$~vTDu|jRq;XEEGd!d=YPYmf@b^IhLqD8tr%R;QiqvN8!G&)#pk5_mf7bxEM@)~=uR4h3u-lw}-?=RB+ zHGD~R={(=@CK6A1JFgR7*AfwaxA(V9yU4!x_w0JR*V=tTe$#m&@2js54`q9wczWLN z9uAd$&D+`TFYoZ)Gg^1aAqSIeygl-W_jV&;B&tQT+Rf zq453VhvWII02cYL-$T3v_?8Zya2h<_d6eKv{u1%>JpKm1pWt|1{Gl}C`P`p^->dV} zM;?1W?JX$(^tkRbeC`_q!&4Ft&kwEq`dRr*t3TA2>3V)qwRC0QBENUAtglhOiWlV_ z-_ZX>&d0m>4_3l{&YR2rH2aHAF4NWGBVT?0BI~(>|AP1S*BO5`p5}PX-ywdzHt?Lp z-@WgfPdq38!XoeQohug&zd7T-{0n*yl0TV$LH>>Y(*N>J(e7U{|AOQ*&L{p0z2|5C z7Uq}vyobfY5m%glt6hlS^8=-OBSdG~{G0sP_t4${A)4=<&=^;^DPQ>;7(eALohhZe ztJ6wP^2K;pBOMJ~?#pCIa=Q8 zGQP1AKqu)6cAo zvp%WM?l<&4t@{ism48vQL;KQK={}LR@T9*Q@dU`bxc#E_Blj)TK*ImL$D`74jQXR0 zK&dId0R8Oxk@n+z1GL9Kr)$>l^?U4Ew(%>d>-}TN%O~auV0oo zhsXR*nqP@5;VsfPE#J)Fq^tH-{l@V%^MAk5wfSSuFX`_@Usv{uPayRb_xp?ZeJa;{ zDL?kO{Zyi&6>U<|vPX#Li1w85unfTM?6qckviJ0T4E>X6fA1>UlZrnT+%DhibNNm7 z=9+q3w?A#aBmGq3_hr9&ysh;n#^=j^@7np>T*UX?owi>S@8|d9_wxPr0pBl6cz++? zkK_JLu=setPb_J*_+Z_ikNC3oo*OMjydXTq`L*7+E%3UH=j7+_zMofk#j30DOWf~I zg4a3kwey2H;U(sO-rw{0_;&QwKJYo;pR@B`$7_M{0yzwy^}y%v2A}u&{@lsV!xs)5 z8@?61;`sHv?wvaSG`uK0+133g2~-V_VnUU)GE}svlhUIt3n#egdGh};_&)MGtkVAb z$9g_KzSpJta=KVl(yHI{&$PPTHmBwXziqVM8^FJTe+RrveY*b+&HOt(F>@Dq82<+6 z;g&vgd1o-u{gZdDgO_jmAo%@~@D$%e@+Kgjqk-cbG@qbK0UGF!xnmDyN+zU%&z z6{D#idsFpOAML9>X#3t@)gRVFtgkoIZw1~@z<=W7Gx?K!>f@{87u28k^WFmTK4S0X z7x^_^WqCo8)skP5aOmV8vHC080Zc_}2Px-I)|mAt`ZshR#Ns264_dx0Fy0mOR~+U& zKm23r5B$1uk$8u3?B8`Ashd3Fe<4;QpoLzr5SNmoPa{I{FI!_|MW6KhoFxiuOIk7o%SlKVTC^dEQ6hJ~i<#v)so) z-^cg>w}&d4_Bh{Y`h(N{zejEJ-Rl2XAmz#a${R40N05-gD-0W}8 zug|IROSB0OBIkG-b$yuow`^F6?kqpcdwF{QE!oo^kC)HK6pf00s_N5vt=|t&gSkHG z3(hATk9SEqurB{>Q66i_`?E*)^$#z#XK_I{$CK;RWp&~Oi}H3J=l%-$fA!wjN{R1j z)9m4z{87I4ea-FU=~UBIKl;#?9}YFmSFQafUFN65;%_RS{1cgGiR(Nv)3R_X+V$B< zX>Cqqq5azTOI~Wa*`H>6q+bTVvcIdDKcz?c*ZkY~H5UDvbhG}`rBB*^+)q;b(k*3w zBB}n__=^7fc;g?M9!eqe`@*RZ_QuPq?7)2 zdH?=@pU?Sa`Z4J@_yKKHUeC;zR@0f6Pk)aX^*l=a88`SVJTD31{?JMBKB>AN<>{@? zDDU&l>HFRBeI_%PR!{kSpYl2%QoOy%r_-EID_D&kcN2Th?8C~Qjps{Io?j%s_YI0R z&Hl7_XwDz)d_KnOkCM1!knp{IFYNfkYby!g-%b2JQjb09_H=a~UXRa@=XE;2V?HhZ zIKHpO`@8t}&A!+8c26Jdi}-dQ z_*VXugs+X(`A1Bj?>@RT&HF-g(8AMQ#S`==`)@M5jX#6)Hq>n8VkFD|Qy#VDu8-6PO{|`pgzUn8QA)TK?lMa4eA3piuS)P93Ui#1bm0{NE zI~)AjWjx$ZsM_bgIBi7Q?jvZvs&w5qDEq7X0MPg&Xn%h1D1%vbdQAQv`7;!sLI1#O z#Ak3`JxM%z%#S||dO$k-mcIgL#t@TL>Evg8vWKJp!TcMXnhnxR`@z7rM zR}}t-wdn7lKMN+2%D>2chNbTEntjhv^qyY0yrc7Ry+>&D4D$)UkFU*D@`%E4d5Zpp zXIAZ&AqVKexto@SaFOyE|ew6Q^zW#a7f%bpE{B6<)7wnfmNbv%$Kl)xDHFDqQL*@IF zO*-iti&vrv=m!lS#|=Bj8~KKt;uFsMFaI0yN%TVc&f=@gdI~ZAsqzOz|3LmeWz$~} z^|SR?D{6CnZSM=fA*)~hgnXYN?+>I2uxFavm5Mmre7~^rX77;S;{#MV`)i`*k1%_w z!vB~o<`2J&^>RO3@8PBMJ}=?;9etzw=IBS# z%|4fHt_EUyYgd=|H25HTN;mtR9JxNTe>R?9Q~qs7`k37iNo;cvN7$) zrqAs?uv)w+_1Ea4KI2D0r~31ICgMn$E)l6{=T}7&kY4Mrr=Pri_n%Wfjz`jB_o=;o zMyC!n%QtBo|JlULb+I4N??#6Uwf|z@@;zkZ=Y{q@Mc@hhX8EH3=D)W5_abk-uuS-j z-n+Yu_sF4_rgc6P>2yC*@9Rf?`FP9u6TeDYJ9bG&{gdY#TJo*=j6d^#ot8Yt_AItt z`xWD_t&b*6{^*~w`1uX%shR)fPBR|Ir*Jg#*J;BmhR19CDD!JZOIkhx##__3FL%1u zf1M8${E!A}_PUfPiV$ZzrbY!I@~h)<}0f6VYbcxC4T@B18* ze;~ehe;8#3o|3&>jfeB-ik7%nw5w;)>3uWfU`1;*h8K>+_tc7BV$#X6kRtv18+oR>SEkv=9p({wlDb>xZp=K67k2fJ%SJD<(?(B3!mbm2|y zM~*jzM|J;v%Ffe;pV{Ac>3aaWPj7ge{b|7AJ1+!ey1TfJxnp>k{pT+6i|!acuW0a{ z>N`6uS^8IgSo9Kf+MgnQVOMxd=QoyqFEss=d_>yvoBu)O?**Uxef#jpRUcZSzX?B& z8*Tokh^H-mW~AF|FWmic;_01U>OQ4-frsAs>5IN~_DA!1>*OkQIE(lD;`fAyN{9Y% zI{!}TDSq4QyNd52usQO+xzP(P@cCN%I75p4$KPW9ghY4YhkYO8)1QAjoVDv=!)w}) zE&sCkKe9s%6@A3~7kU1c_Jj-Zk1)O$hUdv&!2B(BE(l+HZt>5I|3@Uhy+yt+<^BoH zXSj{}xbQ)J^2acrNF?@1EHD2F;>7xk{+JXGME_Q!{F!`Kw6vS`?}OBL9`pA#^LIRU z)BE=Xz2}hq8OYZ{2;3K$g+DI89v`9#SugTG5zh~^JUzxUSUj)!7slk@K$z#K1%JTe zSda0X6MpabKE-nok6`|#rJ?x~Jf48}DX5S0Jl1!<--1dq{{iF4{=hB$2Y`eP`r`E~ z$L#wR^u@+6|KY?aAA`alLzAX|s_#u~@E272%oH&G!SsGX`{4S~wH2k?`8n!97H0An zP_=&Ocf}K+-)Gva#xPp=3n*dl2`YY|!1MXN0wEaPN7yocAjS(=yb$;s{jBe~5HAy+ zX^a1Pzp(CG{22R5yzj)8)$|WE=^VdiyCe2X-2b$hOQQ7tpzxzEYwJfmK+V3Ce_#*q z<)SR6`Y^@zTgkWms{3`iYoH(Y@Y~Qg^OmJIt@pj7{ip&P@z|NR4_@l}vi+mcU^5i7 zc9e9UJ9KH?%ARt5ZDDU2zl!=z{!7~Cudv@#W0|g5Eof`7pv_*`gs#rta3O8SPwv-S zJf$fsTG%fCcIot|Y9G05=2!Zdgi8jWw^x%_@}E(dx6IgdA}Ha@|*rWAPm;B|4{%^ z`)NPV`JElbc)fo`x>Qn5&*kIzum`M#lplM*?9YN$@l@XSceRlELw;+}^5^)}IR0hE z*JFQ%OX$BE|F@%4{mI_U{b`Oj>c^Zv@hkCD@i2k**{(^|ZzP>))`LgjZOH}C} z9+_r+MY^r1Oq(|_+8fJUFYArmKE$7Fcz>a#`?AE>;(tzfpUqJI8sT@3pOpF->ibT$ z{bCckrVp|`rVcY-C#6&W+@6zuvG1vDXAj17`2%cz%s!NVp%=i9EBSpaTix_PcwY88 z_wV_9D(}0B2A}Q3KdJNIY|mP41)f*`VSwAuidTR=jK}D>--utCR%U+K_lED2zT050 z7w3VJ@OXZY|Aq617Wc8i2MJ$`fd#GW5z4=~=hiUZ*?sMF|J%aXeqI^Q>2ba~sNLtb z{#5bURG0C(HazSR8td@F#fu!n@GNif0c6{ldH+uh-v5`p5Pto&Y?m z_nMU-`r11D?H{>N)?1*7-Z{A@F@zPp7_)-H$)SeFLRa ze`f$F<$VR{kM5b6S=!6`?|c4_l77qH!4Gur{=?~6tG|bPaMuA^U3*^n^ZEDj;Y!I* z&B)d?@hK`V|3eplmFD05CFkmUj+$_%P2L7`;A5kcKL&hc^fLQ5g@=ToP~Xzn!qx2O z7JuG$c@f_8{gnK~TU>a#-oNWB9zb-6_L{yYVEzW|Ir=l#dtUJsAKdd=+Fu}EgYPYi z=6ije_&%ND2cmz==dYp}JyTfH`is-@XR?E7zHGfRKk`55zKGN2FA2Z&%nIv!a5&;s zoi{5Te%pC7=P!0Yq0$G#$)Axec z|E1m3|HbPb458Eip`MKg{i*i|x_1+=B0Qe-r{eL6pq9S92L6rrc7N%IDUQCq;Tpz+ ztIXc}n{$6`m-+Hvq_h8Hlk_e91MDxP&j;RvH2sTzfcphAe2)?14tw0wV>|%*yNUm` zKgIE?L-;oenvin&uUUWdyUqb0@SbTC|8GZYf3^2?aKFnUH~W+QxO?ZwiRu1E`!c7~ z|A0!j{XF^;B!SKS|ND*BciL4Ds# z1*&w{_Z3a=*ndk}{RQt_f&J0Z`#OCfkEQE-L}mM;Bmc5|Mtj2avEmu<_Z*#^()TEv z^1tPJYOcTSXx4l7pXtrLX8xG&)&*low8pCVap?>2jSYw5f93oK@M}x_|NWM3^SNwG zMgPao50=3L$fN9K+dt%g48(h{O?y0Iv=^iT^Ld232lM#`bzv~udh+-Bk$){f?4OAL z`FaC@S9G#JC1FkbsY%Ozisvr^%)@wIGcW(@9Pe9U-^KOr2h7l$*>~oj^z)|r{ZrY8 z_I&{cAbhOzC-4jS0_QRJg^ebDymyb{`R-Ux_9^}X!;^_l_#FH9L5;7VkL2@t8nAd= zIS>0I_MUdOmmTg3@8|el@if!YCv4FbE$*3rpu+b|5cc@>dvyN!?!^K4ZqD#Q54^Cj zFZ{9JuLti7Kitjxft(*Y9?AAIw9Y5fefL8(JVJXB&tES8$jH493g0_^UtkBtW{xx; zG+lji__S#759g)9zc;6NZ=L6Mbv{r0##p59>>M_{F1+;NJo!Z@ z)3f;Qr`~G#`)2TISlYYH3<_TfA5ZW;em{Pn?dqF<+lS~{EjchUcI^*uqm4{`O)cOlQ_pX0jCIPDqT;eB|j zOSJq&oJSC!p7JkqI6)1AAAfMq`MVF#gJ);ndcn6nePZSkd;gyM-j-kZGTbuFdvo$n zRO7e)*6GZT(UFzt|Bye#&(qglA%Ds4^LLNFE-e4c!CYAVQ{zA9!Q3CZ<74N|8AH2AtC%n{AW)eFZG?Jzn1EI+_#56 zalPyfkLr7VVV3n4{bQ(8wQu(!G(O#bXosWnr!m<5_8!Hdn>@epsK+Cd|NTe!eqC#3 zt@XtH-+U69c!F#9g)g=^Pkxp83&6Ac^j;$HK>h&MyT)rjyJ`?x-qrbr731p7(UI+ezgrDUf zP5y%a@aKP_Y-RS3H4ve_X+u4^Nl++VYVNsy)OQq+x5NGWPidC_*c;=bN(P& zie{2zb(UQ&Uz3DosY+OR&&See4>bN z&G$KNdNtoo`>;t{c}cKMs>DxdGy z(!sJm@p}u}PTZ?>AWyWnB|bj`={0;peKoqmH#PzKzIQ$^mjX4~*Oys1hR2tQ z5ATtm_YJ78hNlf*g(}`G;jd&*eFu0ku5Xzq885Ql#ZAMXH?*7h-}Ya_hCXe-W@N>i8LVEHySPwJJb}aiM)3A#cQ~XEQ-Z#c2 zW$E%qX|v<_T< zzQp?D`iJj}>1-dGxK$V^~c5+qB0Ddri%!^sL`Wui1ZQA9B8_^Jvh`tkZ$_#yP*| ze9Y`i)=_Wt7S@x}?R@IouzcOhY+vIuTIc;r*LztXD(}l0o|iq#a^)Y#`xAVyyW5(Y z`@{1##@iNnUt31P_i4YY+uy2>^Lp(2`CalK99lPef&(?qlP#X#?EMz;4|?x!uo=Ej z@%8l3?l<$^8{>x`yzd*&>t`%V*=;d}6@-T!xd4!+U-cfRMA@cg{aBaiF* zb#`7F?7S2)`Ok)*mM{ELtKSaYxz!U!$9T6tMuZHHnLpnBu@ydJdYI6Pc862Md*Ds* zknWe;d9>o=na>~g^L6=e^uC}3y1<*}?+~6{84WXvA3yZu0~bd8t^5Bz9>e1^cR>$y zey{xPQTVg``Rktq|3SZ{y_@p=F!l78Muh*t;}*}Lj?kT(J#Gg=fdkBx^!jq z@EbW|MLxNYaP`4Yxc{Pk!J(1cpRn?yhr1Iaw+xSdQ~i7B((@VL#KqkIXZ)Z3d+UEU z_RlO5)ki$SjK-_`@m_!LjmA&5kRrc!)Zs5EfA`~qH!qAZ=o3S=*B(7ge-nSy|2ub0 zjOf1K-=FmH^r*ib^d6$+@3&_r^nHPU+};I$oF9=t&QIa}ALINNc`W=7(jP{fJ{TG3 z{!H{Qj2;32AG!&CUv=}ZupaOq+=4#?d=5RP`x3+>ASCh!{0jbs`7r3r^oQ5De?Z@3 zRQvc_kT3id3I7f~UH%2h6Ym>D`Lp)G_k}#l`d0hIBfN&p)qRGK9^w81^Z$GCzQ9NK zoXz^I-eXvT-skrRhI-$D`wrpQxsR^4pFHtR^EVt}eNmq8X}9hD2gc*^{`ww4;ZI0eJOSe!r7+(IsPvQDCl#&UZR#(`{!QcGSMd+@X6|b(wAaqQ;Y*5- z%J&bb!Sv^YVHAEo!+jrn9~J*WSh$<{<~vF57_Zep8AJ%=XZu@Ver^i`!e8)bTz>`g?e|sKf@BX?_&Xu}usf3lut^*xa<6A$x&R=?FdaA5uTD$qiFV?g9+nV(k>DHeb-K@V}-^Tno zJ<3C-ojn?Fu3z#Ejed&y0Sh+L`TZ04O?;{LqeV&3cvW7zv*Fce8~zKcKiQA;zn0#l zYwa^3o1|}9pY<=<>-cku{@a?$v{80G7{~7nO5-8kD#=f+zbTz~5Yx{UjkcmhNk@Lv z=6AdKYo<48>d*43`eS=JKB7wZ{jZ{>O{@GI6`@UR{JB1<9onn;8=5ryy<$xMFdXQL z$2EEZ``*6y%>5GW4<3Ku^;iBkyJA-O4|M$R{<$P?bg8-CqrWc4=Omi_%pom1*98t>-tgz8~?YoS**I z^1Ha!(#ewUt3~(Y8G2u0nVRi~KR@Ani=XuUVQksQrv4#cHU1z!Y5vS!BfYNwRUh_r z(D!S=hZUZO{rnQG`$BrLSn_E03l!|p`+GI{cKfHYuM@tPe0hCtPqAT{yk&b!iTs*) z{v`AW+Sn`G{=h7ebZ~WZ`$42zYF}J_oG*iMElG7gFWf?=5EM4 z+WLMr@vEczg`W&x*!|eUi*}!h`^BVl{srDMi*ZWv_sQP1`XW8r@&mlu`I;DpeSN+2 zoA0S{#2xYdeCKcg->*cP`0M`Ka27m7ygu>uwAbS?K+XsAdA$Y)zpC>@6A-;u&wFa{ zzdI88`hK3B&o5jY7KqR8-}gPz*QRvCfA}8& zBj`uR>z#cQ3qSaaPcYvRPu|(-TYSMd=jDIrqf!6SgNRqb-xuSI(D&H%F+1uiK;Kr$6>S-qiiV6kqV^zZd>n?%$6hO*id_0~KxO$vN6rLrWh$+!dZ=Jf7cZzUKu0iu$IKjg`HS5@fAUYGe?j;226OZ& z`Va16{DZk?kQezEdg0>m8RGd{t5+gFikH~C_v5XpC;rI~CVArhzblBZKk-DAH{Ev_ zJPkxj@)w@s`&fD}(dDya>j6Lq{V}uGSYKT5(EWyZUqjY+mVf4(=~leJ<2QYj`zl@8 z*Z%(GO&{HJFaCnjfWBQHw|E45p8s>KFZmyPKkqHh9BcK@Uz`5+lh4QXzmxkC%i-Jq-!(CQK>Ctjx^G~3*c3?CC*}>3 zzChnh%#4R~i1*O@i{>w2e^_V@@CWPt5cwy&k~hUGM1R02@`OYYuaNH}0T_UMCyOWG zeBLa^=ntTOk`DA);U7>2>09m-EPw75ZEkn$0AIVl-WiA&K|e~LV_z#ilm@dufcGyL zEp?i|pr?4wTkyZFM}L9kCx_*a_Numvy#FMAZMz@Y{?og59Q{14`q=-jBtBwq_%k@Z z1OGC3YEPKKe~W*M2Ulf3X8g|eOuC29(-;S$PASA$>S2!vpiSn&JW3B z!l$}VRMK|7pVC=d#=njDJ+2=~zsX|_pHW|tZr{^Pw9KJ|x75D|?e;@1@7+~?>^t2r zphNs}y7jKAFX7{u-^Q;hD%t@+MXNUWSKxIWI90TDub`Ei@2`F0^Z(;$5nsUi;yo4C zbMWucY)sevrUmS?rRk%GtpDgQpFiy%w3q4FU#B&h{F~EFTNO0gTr8k{-jBxq>+!uv z=TEGU3VeQzPVWI&{#()S-PPey-sgS#6W`i6o?H1|E&6smti$goDWAX38oWKq%l>fx zCiA2767@du&(2Sbfw{dN{%h=~CVwh^dwI*B-+x|h`}nzEtJ;tO%Gdk}O`7~kzgvYT zPgnTXs_p|M`Gk9hr%o=9-4Hluk?Z(JrB4h$6*S7-<;UNvfSc(1&HW2W zAF)M6eN&CMq0fqR<499~Hq$HG*MBqrOHG&hp5blqUu@TYxqotmFaE~;z?N^d|3V_+ zTJJI4jyLjrB>jfG)c1!|q^Z9;k3fcymn-)4z-QQ2!-s$HxY0Uq>w!nG_hjE3G5ZgB zV!bHR$`Z{yGS9{h{B67hYipZg6u@6q`m=a0f$ z6~0G4snPAl(fvCIye|sg%jfsf-uw*DPxLUsR;LYbCw#x49o6DjbzU{n8csf|{FQwx z?V8`?(*9x_3hCU>wf-rC-rHZK@_oX$de7hOXY})<#Os2pXIA=iPk2 zK=-?K9?5%Bo!zTPhfh9tay;+bou7Z|{q%uJoZ_v)JEqUgAgJQG+nn#t{Aa^Qx*xv$ z1Hb)Yoi{pu;=R5vJ@+*7mCti^pC6`0{AT!;`4zr@OMBGt?!puIe?8K7@;;gQCv-mk zYw+ii4(I!Gx8pD2JRN@A9hUDqbQ%0`JpS>n@F3GQp784aj8}!X!$qTk6UqC(4*rK8 zJ=`7j{28xLlK;^2!ncOUXUxRoy#uE|-W?@AhWb^0Z+kcN*IU2$ZSx28FBiTY?Q(w3 zc;Ef{hcAESR1aUmNca{7$bb1O4|iTSx;*~W@Xg(47L*=(Go!8EQ2yU9+&}sci2oOU z1WzeH>7%{9qhH@Qpnk?D`p&%*U)TBkaC{lMO*-!(Ku?eVqj%o&sWIJmSU%s*OGW>o zzSrmcn=9%Uz8_jTg4*q`9r~gBzxjmfZ-?F+M<2$Y!u+WIXG53?lkU$@|80EY7xzni z{GE%!>)PRWe&PM=Mvub(W$RD!KfphKuRr-0CK(;ob zALy=L(|^SP|HFenZSf+CH~(k4UvTqX=I>Fw!P@i>7#;8z*?k1zf6}>sp?Iq)9!QWp zkM&yeSLu4T`wPO%dGw$7slgonvfpmi@2^CEf#W;U|7Mxadhz!U;(Y+t>qqy53-K3> zX#KLj@h5;6SOW`Frz@ zb@0FLFXa8X@)vmjq>qlsKTLVzwZP+g?+`o6U_#%{mS>(UFSSAJj#}P zs`g+rzxMYu9`!%ld+?X*p8QKBD*hs{AyLMY>)6&GgECwBc;9Uz_<)m#+Aw_9i`^*WPn1 z-mf!x)9Ao&;-}tM?{Z)3h2e_Pem)=cecw2LytlqMP>q?Mahmzdc%JrzPiy#s{`h&m zHz)ft;~o8}q{Z=)uBUqiMY>rG&{{vNZ+pZtDl}QvG?oX@YCCx1Z9@V5`z| z`{2=jtk23DzBTzR@Gi8>ZTw|Te0#%nW4*IF?C zbN`74Wj~O9^YQR~Se<84KJvru>n5%IjQ8BmGUYh{sM39Xm$c&_)#u-P(R(PK4h^~x zOVWHLe}nl8%wA@H!zCMOofi=AXYp4_o=l%udT++;Cwot_kVnmDQ+}ItC6DS&mS63s z_9H#6uV#FME#1-b?6eKjwQ7Q6FKC42aLNN?uf zj;6j}xBjzwO}-RQVfxDLkrz=u=4Wy7L;vDW*Y_~&zT;f8eAM5Z4=iz?-S~5v-A7IO zI>vK+r+B`a56y*i%|6lsi}usTbn7khWAU0Zc7Igo)ozc`{xbbtYwJBI{HZhJJL7xl z6~2f0956Y)KfKtJJ{A7ec|H2H_sjl%z2SS_SK~Y^a0W*_y~U%NKIjuNaFX*W-%pT{ z%04x9FWT%|+g}jqjPDuYQJtR)&rfik{Zy~bd;1n|kNw=mA3Hrqms7lM0AKQp=l5=J z$|d1=ANzbk{tEDf&iCwlW4*S;=eoT=-ch`@zR%{gy@wCKjJEjW-AmKN7u$KFoj>-3 zS64h9U-)vr&L=sKF3vACC5GRHuX^XthuJ@W&hb0`fNM*c0Uu2fBS|1@cM_}0sb4#KlulLa`&C9?F!FwAD{hPc=wfIv^)A6fEn~vOsD?V z`V-6-^g9gy{yy)?G3lb)svr9-bpCv3H26O-KHbkqH29zK{;k$OdgtNK{V3~+cmm$v z7zFV4=j5-M=&cPOqCQLKyn5o3e2?zohi@<%yzcS$>dzxT^Gfja=(Vlm55e!8z6?Hp z;J*rgMExE=sQdlvbIRWi_%qniapzk4|2u*Fp`ZJIah|sqW~_eV0o320dFAdq!|3uu zU*|krKy z1wf0x_&es#(f8j)x5e*1{((i!XG(7m`VT+p>HTrivXVa+%3 z5%RwfAA&vNbkFviIpW1duY@pT@pH@{@}vBd6OS<2-2X9o8trjk!R!~M7Ee?ajG@QV08tp{6Q7XQil@Rt4p*Wb22Uvt&D-CcVBYjxV<1nSY{Au&7-vI{d0DYzRJx2U~ z0scy-`F=rL+b8<({d^xG;1F;;WAtkmLb!nV1Oo6)AL{!EyJ>Jg_mzI<8@ivA?W0Pc zV$f1!MPrR%k3dKNfLg2jUqz$OuO~hLe+%&ne!uHIZx3Pq?!&}aSUi=*5A1z|rsd}oY>@~ICwBNRmH;v`J zKh$_~`_APp+g~!5n4e7B=D-Rep_cvXLJ=E& zl$TBNXFP;_DSx8vJfom(eL%Awe7$G};Wzj>-cLrqLHqZM+26EZ8a@=h9>~JwK98M` zv%b3QmrK}}qV@e^^s)3|MIYe)jPP2*lP-@XG#dNS-e1!Az{m0a7VoWyMj!6uz3ia#iA*2X`?=W9 zp5M-c{Ji|h$KC$cd!L5qod)Y`KF}A}9|_23cWH=yD|=Y+qbzDGtr$>LTr@tM=qmB1;zV_tf(LZVOm1(VJ_dj@fxT6h# z`Za#etM;#B-=y(&c~7Y=dpC{O-}AwrmB!ByW)H6Ge%3L2FGbv@3DL;6uQ%zN(*IHO zcUX5+Klc9U{%{!kHp-j%Q@R)*@|R`*g!q%<7b<;U%9r$)%b&+PC|)ee>$vtZDu{G| z#@}!A8RcF3x$u$X|5oV_?q{0(YCXmCGU~6^lP2Ih@-O7|t@5$9>3E37yF5g zH{x%qR=8rW4^!3rXO`dn-O66=R}vP{vHkSkP@=iduHj|>2ld+@;7@J8YVymkk^%v>B zJth0c)-Mub@%Px1_(zyOec#j0>$N_(WFw{M-I^RkUr4{7z#n1f@x&vj|HJ1}d^7L!*@`dD z=bfMNd|v1O)3T=`9@6~UjDw$k`h0u;{+YQKo_$LAiu>u@AHUcvo(f+*f_$Mu4S($p z-H9Jr8vf4TX^n6`zxSQ5xG%?-8=eEd${x`E4}JM7cN72JCtmz$FF@irO z;`6-|(Y`ah9m2(L>5shi&fofT&dU$~?vH|}Cs;3Y52^ekSG^MaIJ)HL`C;xu;UrcoYoXZ+-ILvt6e*41x z6aNG4`TD0pXvW*U`Oxz>-K6g$M*i<3{$lz1Cr->!{%6|#_O8IUw83w0iu~UfMn=N_ z$$3JWk97WTq9@ZrIy zFFLOKD#!y00n8--0Q#8qDSHKf0_$}T?^)`-1;+O_TfbV*q>mq8)BS_|9;3FHN3P^O zOO$Pg^Z#kahkxK>W6Pn%_ZasNp8gB;jl~n})BOh12ktL8H#|yvEbu#C`1W#m_4~3s zf%li_e@E*PdrkUH?-AJiN}*lN z{1WjI_b6Tf|A_P{@fBU-7l<#_eX8_+iE0%7m%nwCc$jc#zuhk={IB+2YDJ^sd|=mbUS@Qe7%TZqrV-dDVU{5OvpUII_BKkGihK=R(6)&8CAW3BIMKWBX-G3@s> zJlLekzp1?^{UD80rMrGAY5uaoU(mEK=&#O$@P`qfW%jqx*l&y0LQGdYlG)QIDWCHv zyiB~e?VpL(`#bts|8%~j!SjpuW|t)}Kz|AUNBr&OXc z@xYnR?YVw41ER^_)1_%I&u^TMl9v5l(l-A|9%BDI-G{sF`6c|o-^Key@?XBNB>B5; z?6tj?;?-cF@CEq%g8hm&H2xaB%zH-|$h<$4@l&)1H^XbGf9NOroAI5@?Sl3RrF~m} z_%8$a7wjRO%s0=TUez~VLphBI0Q$Kk79-K$SXR@9bk6?Q6eL1wH-B(&X(v!Rq zuj%LIyuX6|ruZ^DPrG3eyl8k{_vO$J=(C6yVUX%G{Y!twd-guc;#iM(u4NuKp~0B0 z^Q?jJHuiJYhmwbij{N<~;$nI~Mez=`ba-0PRE7-IXqFt~js5rcC#?Mm_6OUqR;MG) z`@!;WO8+`PO&`m@CjRvBk1vdz^EeK1tFIT1?R($Iv5|1>Ipv3c__OiXa-TBO`152x zM!IYMq{+m8{1hZYeFWy|&`FyU=_4ECDy?kktj)})ORi-}iB+N(q{(FZh zALDQHyX5MAqS@ll6I-v|JU(`RVLn#t!_G4wc>b94rdqBqwEa~35%)1jHauKCfBf?* z`)jn{MY8mvXn(i;w$i>zeKGL7e+>V6s!V$nA5qD-fo%5iLwcG2UXwK-l285p|7+RW zw8Q*I?sfVigoz^g=ss__+q(TLXyi9lxeLA20z)KiBtXcF5lq|5oYmiq{FS=Xa6sEwb0kpGJR%2SV4X z{gviB=- z9^n_x&*wJEzuoXn68n50{i+z@`Alni!N``OZ|{lhvEW6`po+hIFW+zHh3xafV_CP9 z@)5JwNBAskz&|0fA4hoF<8$oo*kf~G?YQta_H+CzZ1bdlz?c6Ee3^`eVIO}-g-5YB zXZil3^iMD2KmHKL>=niN$X9{aQ3r^>gO7S$Jf6;G!T-}s%Y`pLv#A|>PI_Bn0}cir zKaW>FKHcwEs#|vTXEvpfc^`5E_V&*_o?8D%Ha!@d%K20G^aYbUFE;$G(Zb*UYAdHd zjNfSS@;d_M8^B&a&&yxyNEgX(M!d??|2Cl$yb69VO&;_6JozRW@0#*4&!>Hi5AA!t z?}`1ck)D!$)Xj$<=)BlJ&+1!y$Imvri~oPrKE{vs)L{?z<-N1g>%6_Pc;5D_5=roW zF_xQla?*Ut;S>1Y1v-DbMkV79HF{HSD zN@qiU?1na-k-&cj{}=KpFurUVtgp?NCIUCZ-H^Vz=WWOFzac(G`t05_h>w}nqVdM~!1KSX$u!;c|E-x#B>ohnE5YvWZ--zxh<*Xkqc&o_|` zfxbz(jmQ7Haz7rYe$O8&)1C^xW_*6jepXYi&#%#k8Bj*Frd$jF<3x%XgF!{^q=wEWE7z(!?K|eR`+j(;kt1p~dht?~{Fk z_%i?dcCCj&ug|bvind;8y$EgA3wYSYnghEpO7HXdbP(s!lbdE&WbWr_VSkL|j?5tb zWqSS(ZzP@xJSu;U`S++ligyctPcnLAoo8?I_=q;b-%2 zD&rl>%lnm$f32+X`U7NB_^S0yto~knh{x~I`?Nc1Kbn`RtJxoGey?9tf6wTQmA!)b zCiP*f$NawhzA^hTzqkJB^5@-3ji2!wmW{xEuX4>t`@M~){LeUV6>nClAGHttzmxq= zd^Wq=N%&dgPXg1g?=|~kg-^kuFHxBikysj*zb<;*XLyjY|LG`QBfG>8L-IGe6Gm_%GR;?fK##I+_FYCnCVK-pcq) z{aquodd&V>E%(o3{VD!}`vS1v@qFVO=rY%GG)6v|>UpB)vHy#&L%%UTo%fa3zjiar zKN;-@9>3dpq3=ikI0|L!>lwaFZk=<7@s%fe{I3kmPh;hnD$o6BfM6Td7B@9|9s(9 z{k>lM%JYSvczeCZi}N2o6Mo6?y!b%zZDwEJDShCw!^5RxhZ>kKW=~MOC_`Mv^Og0+ z{4JkP_Wp|Ow-@O%W5%CyKY!%S==YnlK7)c`_#Ql8jn85Im+`%As1@1XX6rxl@3ih0 z{$K9x_c50$Hh{nJ@033i{#KSh%k(!FczfKi>_z4M!w92_9JN2v2kpEQBjEA9@VQkG zzPJ1BB7F+~0`q4LjQ_pW{Pn%PUd`jo!QMswEeZA~dl&ky+5^7FCG5BDXUhM@d1m9q zeSO}3@BP2-#XeZZ_um7I^2i9^`}_HDkgw|RzQfSp*P_4jK8-*504-Mv}y;ll6i zH-X{}biP&az5MYSvbqlrd!*SD$+z z`O>ehf4*-^Q-3x)d);l)w_2>cui(pL#Z&5+TB!eIQ+h^h_Of{JR=$7l^Q)i4zN7tt zw@4W0Zent6PS$o6$NNicc)z9iWiM)m1o4;G-`_kbh;0w;9a{pwPxZ-ZIF9)sd$Gk!;4eY{=VkAh?)e1n4}^cnE;^bh`uV{4!Z+069}xK;cz%KX3ckSn zCzy}Z=R@Eae~@H875ILdY;rKgU06u0aK{h5Lj1!A6G2#f&m`a=AFTNbKE=EazKR#S zY`!O%pU&r_Gyekg!7j(`1zq4x#V<^CarBk(#i5NiMtnhQdR=PY>c__wjW2NU1^7F( zOw7J-M0`Tf+Z=Rkc*{_D(2@UeF?@z|g+!P@AAt`bUg5q;#t)zY*?JcLHzC}j_-pup z`%`A`;{1pIFuBYR;Lje(@EzdA*hs?m55w2=FTW=r!FlnTd;Zb|wA8`nCO3`zJl^^#Sdl>{rrP zxX(cO1dI>hK2Fvf_8!UYj_;$h>qaEstbB(B-8V9w31a)V@!mhyHIky4COt_E+pj0q(O({%*--i#tKA0(Xjym}KNDho2GrU%dM-?AD7GFxAfN#$`r~!=nX9*MDy@CKR|u-_qqY23 zS+3E)PQ}~yy*2ztSzl8B>-$cvUoJ26ACc_mJMSx(+kC9bYVDijciyM(ujuc3znA^| z(C(ua%Kgpo@w~E(I%Ut3{WdFm2XYjT7cksEna7b=P z|B<~y_en>x-4|4MmGM(5H~UkI8`;f#?F8?)(!S|8K6jSpub$UR{u%A>(qDbP;~>KS zKkU3^r|n;{9)aa(`$BjgkHHqH?`$Y`J9CxA@8>em!>PA|nD8^3iDdW#8*hzg-3l1^NM^tB>%CUi7u3pre=hr1@N)hrkMM(u$dz*2 zFlfJ>5AJT_?Wn^1>ujG2f4#%zE8`{p3421|&kN+`=-2XZGDK-I;{$q!Af0Wjr_g{cN(|yJ&-zk0pe+l?B z`Qudh1A3VDs{VB>7%CGFC^F_Lz63?DC#__?l)}jbU;G%6@#TezZQ09_uWgx_|zma`gO4zC+~beEQw|f+#57cPd`5 zoNpTMH!DB&{L&Y`S$#dP+CFOY0Qv*_JL4PecjfZ(d1U>Cf3TAZh|3A~dgZ%w*aJ!> z<7;+r7C%s~|GV(}o9h=Nk-a`TPyG7y_+E|W&*r1~gQB0Ig0p_g_+ILW){~cgb;*_U zg)g4Odcq%5^E*C@zGwCp*3ad03g;{u=oqT8&)fXcebr@rZxbkzld(GO55&(`>_OgP zr7V~4i#GjG{p*EqFSF#DIs z_XC-*Z{xw^`0vYJFFyP-HMxjC{!#3S@YVcU?>Bs4_E6*J<)4iG5xnHs?@7^N_yfF= z?y=^{p5HN(cxv!0zc%}3lz+|#(3SCwb**4>7qf&&KKZOXMw0eff@b zq5DM3J>m!M-rAH5JJNftKKT3Yt*PEv0KOewJ~TcmPa@Ml=rhY+xO;n35W4wc-0k6g zUUqxl9mek|b{#f(e^Tp*`w@u(Rr&s85`6&W>tw@w{QDSh@e}Gly^nJ2?edp#xj8#? zXU6fbcnJIcYuD6EPHamcLk2XyrC;BZ>T6zt{kkyk=xw83R{wiE?Z2qODQw0e=^r z^}lVM$O*oqkbv~%3oU)>BJ zVDTu0z2l4zG5$dKKZqOtGrqt%e}6&uA^3$Ymk-My;6IicKV^J@@*~0*;Laug8{HQH zA8@!~K6th4UogqEC)*D$O9WG5^If9jwEItP!GC~w1>UzHUSt9jKcM}?;?qrEVgJD& zC~M=5`9%H%YfYbZv~S|5@_({l1)BZZ?n~kaQn{GoJvonDbF|-azrwl2(t*;IhX38{ zp1^I64bfiqOXWYT;AtxlW4urIeeyo>smjOa6i;FMt@weCX6E-%_yP9oZu(cR=MTP9 ze1Y&Z=OOV}+TYPkzE#QRrwDq`3DRSz|iRYkp2n(?+rNAzlD4P0po4= z8~n|~KmUdC?~2ZaKsJ4l^DmUYXV>)k*w@mv{s-0b&g&ml+4NoaI{pNlkJnWE6*#}6 z^VH)-$+wCAyj3xUhx}| z{jJFUb4d9gCA%Ew7xQn_kB_@lYncd{8^z)DBA!DysGA90B2fs)2gU_c4 z{`bDWRlg$J*V*q^os$2pMjx|y6XA3C9yT}p<WIhh!n5V|FT5*! z+7lGJmk(`x%Y4Jj)pF^Z!pr3MEc=5a+x~#^TEWNJ4)Ax8Ap*}?d27Hc*?;P)&l8&^ z{a58a9&1-@-7Co-GU%Yf#(N9B=zDSoy(KFnDfNV(<%=ZDVg(Hee&{g?9U z{POi{WwpOn=6T|Cqxr5s;u_t z_pDEyXT$Tczp$Tse;W96>DR1(^Tz@I@PW2J)cEHZA3%Lqr}%`U_uB8pFLWTwT|&<@ z*>S${7scOj{urBW&$s=rjIVf~mks^U|F+*{b2^WupZRj-ho}4bE6a@TSef8Q{YP~_ zr9b?B4nMB%MH!$y_I$_l1GR6Y?C<9JYIfD%WB>O2M6^HhKAmsn4MqN5WB6R&cMbYO z%<{+ajlRD2TbmC4yb+(1wfihutiIo0s3Ct6!|NTyTN00=e3{50&&z`s3f5oOu>S_i z56A~u{dW0J7LpepBOWdKJ@#WR2lDoP@%=fM;{=0(qCbWI<4E@RCivd=SIWoaLy7Qw zhx%9eDv|@?-J`fbGC%!!W2ceL|C;kd`HO4tJ#VPU{&>}T>|7i=)D6_zPVCXxThOnT zgbyQd{^7r0Og1y$rA+cy#_zVl^Nd{*Ejh+-wVX__&%LwJpA)2_?~aml!^3L#^3Lc z(s#K(&;09kKZ@DQocL)UpN0OshW2&CZ|n2$*F~R}zdd+Z_xYK=-Iom|AK$n<;q~+I z{4{)={MW(rmJg5pOn6lB_t@*<@3nz)-lG36=1bVR4>QLc>%V)v| zqIy?NA+m6Kg46l28JRcw7 zb>SQNpKn?|Rrqvk({~$NS&uK*vA#V%CLezxyzuki$SwjuZ*NN8mm?m0v~&dfHh4RQ zZ20qn36j5)Qa;3WvAov1;ylZh= z2tFVA#QjYN;wJY_nb9{$XRsgaec_&`_80zW*6O{#X2lfUUh1dXGIPUoPA9*<$|buQ zZjPId#j-`ePo=^4+hXC*7Y%Ip<;hkz=k($gA3J?ia^e^9= zihR6rv%nN^v6r@{vUT<+^_NX=bQCs(4TR8vEQCNq2F&$S^PZu7V+7P z$9DLKX6CyipDcU{a)`zl`AfhbY;Ed;A6l0vlpZ_rpk(;$Vr(1p^&;AD{tAQe0h||% zx0mx5xOI>#^ry+Wf0~tEAphu*2IiON4}@Q7uki!pzb5~MqVgv$lfOtfj_;$K{Z{i8 zexrF|Kl6bpHFDmzs}mRhZ6?_LFOzcImu>TVYA*{dG173n^osZa@V9e%{aY=+qUQ_1 zqvAVkJ-K8ynMZ*CH~#{cTi}X^AN=^D;w<9}Sg%^2+b8{z*6+idN78T9KjQOP-;8(Y z3a{NbEI!Z2*T4_pA7=a>@dxa0@Fz#_jp7kp41Q_D!P1e4FSPk|wfpbA=Y16af|+iL z`g3IFdsq+hH(+7AxW~`Ye$^WAe#O&D-l=&0AU-{e!GB!&Y2`2I=;)BY*0g9p{9q5< z>xDnKKfas&a!rbOnjn+-uxnBLl<@)D&(QEoN5<^0oH<@Ld`u0UAGfS(*M3iY{!#K( zB1^yKd<0L?e`EQ9Nt3R7_*)mvobGshA}lUC*~ocPv8PGDi10uAxu2g^nH9nsk&M4_ zMSqL_ouSI zmdiPfWUjB3wZ98LM)=n2U*OL%__(6KjpzkseXd~Vp;S8bm1|S3afRh8;J#Ip`$FkE z?&#KghrNCm>07+Qm&;$3kHG`Gwp=an&l{X<`q!?K;upcw_)Fxd-*5R5qxSmm_rLe; z@!uo7zSXyn1DtY?udVfwzH0s#5gsJIHx+_D!pL5#_o+M!pUf6r`91oI^nu^T=hf#& z{aL~5Zz@O6lRnRU<~~U7>t(;9zxDg%q{tqMT+zSu{-{3df&M7Rvx9%&e@5{q^Y(a$ zwO#h`LYMr7@o(q!*Y}%#ZT58X7oo4CFEAfRc%SbtzOY6%4XujD>(nBTf6Mk2?rSl8 zR`DNcsKw)IuJl3S?`Z!(AO2yd;)Mdk=d9maJgFn9QjUHkf4geAR#PqhlvFEI&foc) zJ~<|z$?uYRzTz*fd-TC$WdHn1x%Q80xw1vn%9Zx``Zim}l&g8w-+T44Dr-9PJorcP zrP2CQf2e)gp2EI0gd?6o|54YiEc71lq#fOyFzd8PiRRyM}CT+V!}ll?t<{@Qx!pO&xS<~!-1vqR#yn4jRp7rY+!_`Jmpi{;cpVW9Ns*|CRZq{Cu3r6&b#ieD&JT z{rn8r&mo*mMqgwFL2q*3y73QwerSkJk!#kEAOD*5V+fi0@=t*uqPsO7Z^$oHeqZGq ztiSku7z>22<$uZk&UwRmSirskq@ul@@Gp~H(fh|)dD%aK14T0DHT+&rq5$MX_VEyp zknf9lPtPZ~!0dIbf=Kr9!`}Zu`~mrVdxl#WVC_%BpPZk5{Jnny{t=xTZ}71BD=40) zp!kKTe$;^@<$Mb^zx{qM{=woMEWf$x}W6lGA zUSxARuWkO?`Jwa1^7Tjg7ozimFW`NZ-!owF0k3!d`T8^nf2=CME(ZxOm&+}mM1_AR z9$)+Qwe(*ulkXlz9aH~uULp_D+3=D2-e`Z0)|1M~&vF^${KO*mgR%I%_Wb9-XFbt> z+K+SE!baI2O!oZ9$gub@e;)bmv5ME#yTr&)KIVL>%C`Mi>X-Qjn{ViQn^@)$y*CC5wJ3 zegOS-{p{9EFtTO-4aKs)3*HA0us;~SciHZsNU#qXU`$_DKK*Qb&aV$*KR5duc$+sA zXtMO{nMvUp)898;b-i-s$aN#rXwF6_V?Wz z&q!dezaly>><7Z{iMIZ1lKu4;L+}sYUcYuVPb_^-_t$~v1MqGv{_@a7vu6@dP5a=Z zl>goEi~I=!t>>k}Kg4fG{KBEqpPAf;|Mj}HjZe{O9v^|P!OOchF8B7=@!*pp`S~}V zi0~Ed=e_`M-v{rn2Y+t6IjGNrpM>8+@Cfk-EyN#4ZtBB6kKAA~_)qU&pz{TMZ1(Cw z#vgsS%L$)?&v`!MwTt{QhEMT7NXLEtg$lma4m3i1d>QWs*q?9Q4t_PfoWmYJTspaY z+TIt|JeBI5((1DA)}c*%TEOQ|?@zkycz^!_`23!y=8z9A?1}g9+f2rK%Hg|sxS!8G zFW&n!e1YL<`S*Kyit!Jcf5^|IlK8t94*lbe%%7-!4!KnNTtm#4^S!Ju#pC<(FxPip zcWLIPGwk;-Ci^3N>*}n$Ewdz@`(w_3|GpQ^{_peAS~>X?=Jh0k?Ju4z`RDbr9x%yr->~MX{m5>w_|RhA z&!1;J0JqU{gfD=fD6Fajk0$2h|E}@fAKpI;{Skh+*aCmEEK#^)lH2-POR4pyM*KHc zmHjt(#w43BIxijV#olZ({s8ZuBYpo+1M>}k1J{{$oA(&rXa4OMU!eR4=;QbwJjwcR z*6&N;KjRPFBeVxT0sLqDLAYub<>IStJv8-YXQXpaE*&yH0sbI_@7l)ujeqEUd~^7- zvp>1{`|=m~__nK9Utuh}I*xyo_cyToiY})5x(|`{>O$5h`wd;h{gNL@yv6(rg8If! z4ZsgPYWo}dn%UF;GJLq*WrGgzgzkIThRpN1uWxU|Yq1s6jW1yRJJ}~azo`8t>F=LB zvhpZ=!tmCWrPd8cyg$P`HsfzVe#JQWmoAC?2cr6=mBbf(F%>TD2%f$9-YvA4{qKvk zr;h$8;u0}m{6NaN)(-G8`Hkk^b$->KKt~e$E9JA5&woqd^x}N>=bHS67NZXhwB5x0$t#NJv$9v#)uV4<|KEz(f6PqP%gY}@t(BD{7>uLgl?a| zTKWO}Ni+Lj3-h-||A_FRl}|Q*HrDT{c=r#L_52FH1TmfZ`!VIbZ>+5RgJbodvE^g( z%Q2oc_Hg=2{a0IGA)YldQY}BA+O_rHP*(p}{7-4$8`#_Z_@eJge-2!)_7l(dus%90 zUY__a%CWZ-A75m@A2I!qcy{a=gN%>2_hGN6d|&r#il6$6KOPpI*ZsuSK*qOoXCL|> z=ZDX~X!yP(6X1+JQTDUQe||@|=}XKf?Bmqekrkq^8@|cLb$@|d^HNJ zf8U;LI6yv8<(IMclMh+>vWGUFq3_rGTMPR*Ph_9^(JgCvKYZ>@-)2H^e+%sum|#9& zU=!b}_5}gwwa!EPz4ZGXhZ4eH=;PSCvgi})Pm}3SS0A2x(~GZl9WVFSz(Cv5{8OCw z)W0(&|KI%S`HPR0wn!%4H+sJF{jc%LY5td-_>FUuy}|fAc$fR7dB5h*+Io~}y)Tj@ zJc9p?FK0Z(mrrl0onK7ZNn>P|(C@)NMDyL_bABJmtZ#nL`?|~ce3$2|Z2e3$KBeOS zKuh)ZvHXD$R8gMe&^4B z#>ZrRAO2^zlRu-JKSAe{_+#S>$j`xe^N2`p)#jx8u_ZI!3YcbJ#y)!lNzfPwhA2H!MGd z$*e!{koJG(L!=)l0fvpg^bN~*0Njv2;;H_Nkv^iYwfA+hKP(CNF`}X355V{ENA-+2 zlScflWb*G@ytnf0|HAC~YAk=X`V#uC{P}C}y&I{;^BMq;=lPxj{@jzLkDcO=kG+Tf zn=Jpskoy87JWpfA5aBQC^*`C)ZT_m9{d}$TCE52X`eVe$qHo?we11<5JhuFJ9r5%Y z-*3hYaW7{>mpycF_q?3!`QUr- zs8+;1rAa31{AUJ#!f;rpb& z-^Tp$y?;I9Vfy>OCO`6C(csFL}*( zQZ5Ofp#A}Gc|2)&TfaB_iTxY@{G= zaWtEBVaq??e&Dn5-D{t#d0(BL&v-Gr+AiI)zO==c(;o$Y{(9M-XZldji)){2Z|e;* z@y&aNj8Eu)u8H?$z;nX8RzK)(wtRlH*uF>p0gSKmKbhRi_|ZSy7r4oPKl7XZRDM6n zFBaCqM|8eL`?2~9{vjvbsPya8L-jA~aqjAM6Wy>oHf-|3d`Gx9#(vgNCwV`72h(z zz)w#8C*()S5-)KP`Jj$;T@OFd^!9&l&E{LwUu(&Ku%+p&WKs6?YZ-s?Ctm%lB=&yd zff(Nw*4Hh5y_Fbm^N%5aLRgoUzdH5_tv~oY??1u*4S%<3P8hmy*-aygS2x)WiZ5V4 zW`FqCr0!d={hbEOp9em#KkGtQ+{ya?q~xG?r1hfs4Q}3wA^3nt!5ie`1(FIC1&$jqI=Y^Zo@LjR`kz{^;{w#=g+Yd;pIcUvQR-1qJ*ml#f*W zKz{bKvBJ!ld(X&ORer$hACX+~r?>t53rj!S*?iLo38jm6K7_7S{^9b!5I>Oe_=T_H z{sj3Gpr51flHED-FPNI!8q3{;x5LQ>&L{M}Eb~kE8R_>`e*#vx^jYEmCE@Af9~7T? zv-knHO~3^V1?MIHYW$w~Cgrm+eNFyvUjHcjo7U=c(Rs}G@kjm2`FyIZ_Mdv5pDI`N z1^G{?eeeliP(JaP_-C(ANPky6s`*Ewuk~pr!GD{6X#S?yf4C0<{tErZ+k*n^XOV3E z*{1bke8CtztooE^$Ooc_)}4x%PnFTXYWWS>i)#E?O+Ty3ys);uk6)PPl+v~yG_%H`kTlpl!CRsGKPkohvm_u?=l{n_+?@R80Z zEAJ!zeP1lt@~Y*h_xa^C-u8aOQT#jmi+*30u~#zbG+wvtl>Qr-{v~^) z*%Re_ujes8s`?cgYOQSV^ZwE3L+pR(7ghYC(%;5EwfIQ-V^#L`%Xl1nF^F9HqT#Wg z%Uw5o=LzArRp8~z!|USxqqkYP$KQJYU0cqh9DJT#qV?hZ@ePm0gty6GC4EqMd~J9a z=LcO*eZ!aFWy1%o*Zb-3A8mc&;g{-gii_~_TJHPM_eoyM`pXRT0#@*sy6fvNRpOUQ zFg{~se((me_)Q}mc%S#*wEk-VkACaYbCcous};X@<209h_*>*>MU0kB5-O2b=!e<)6O>f8u_#Ul8BP`^tO; zw~N{Sy@vV0`Q`NqKcC!!@TJ3B&Lf|!%|G~^koC*{wOcatP5goEYZ3nt<%8k;pj_ug zcVSTaXi@$L(fLu~10q?grFOk&yL;XBRpt+@KF>$a8Q(&6)>Gsk!+3LF5AzvW{8KL8 z;p$FqK~_A3{QKnOqx)(;g>3f)6}FbHsjh#u#-6A1hw;?-PAXQ*t$qGHGW_7{Q(pBy z;J<2RzGo8W%b0wRr^?i?o?m<+?Yo8Z^~bF%;^Z5?*YY!Ze%kksolky#JImK8|Ax?I zf(Od>e$E@tCsZQR-Prz$4BrP|K=Z^8NG8Fz-B;vgC%lb4h51+E8%k{7{C*5y!Fg3% zt`uIA6Q`g)uGs{QTP%kLozuXBK*yzqM)AKm8>>U=hTMx93; z^5?<4!S~#J3;XHXfi~SQPyBlY&qJ2bLgb^yhjYH^5B?Ak>7sK^2^p`0IkKzCC?NRurbSHFPoBqjs%Cy06sXZRwvmU)Yx~$LI^Z6pvcay!mU;Ia1 z9kTL)lRv(Di{cx=_m{C>q2KxVeCf~Zhik39;79Clil+xZabL0CZ~D02&-n(PUE%fh z=Ab!I+_344QLoQuvaW#fnhun{58ekK@JEBO4=TTXHrd_X@VUXWP;cI5R?}lmMBl%~`zrEqe$BxYL_?`G~?KcJRxA4~8jl$>PAH~mC z@O;td(*v)mKNiG(V)$J4-(+tN{|1`3K>qSiHTnAh^1I+he|JDFBg8t-Ww1{m&-wX=X1y zjDHyT_&<5x(saSydi=pg;pHE;`|{lOPn-n55B#txd0&w6_Y`#U1p_3R$_aZ_99 z?EHK;_!>FYMm`2T|HD(<=`C-2^x_Q~&t~I$t=#ho=(%7o)xvn_#4g-YtIkc+mh#i@7*U|;d83L zKY8CJ7GHn+biUWVuY>yyWG~_S`2ODHl7%bWt$n*j)F1!Z)F%6RyvTL0)<3Bot1ejh z;;RkC)_UvDC|-j08ec$v^8I-phCR#oe?NF!`dv}}4Bt-$;f(OSn-zmWRE&y@cj2QBeY;;U9&V*UuU zkM+WOfIr~)s+;(7i{}g667|n+zL)j2CAEHGHp~0@Uh!#L$bTsOPdvMG`#;qCL~8b; zC9}6}?jFj1>H+*~Sby1KjO7G8h2JCoV8@wG`3%`D#OFQ!B9{?_&#-?nU*HEGpVQad z9E|L3*f8mMOT-TtpCAOne!_hY*z=?FOY*SfBKI5Pe}I3{2WC3*R}^($V5yG$gz$|# zkNAhnW2Z&?7x_J1Ebp#5(SpAK_c_*;S~oxZmcrIa3$-660@UX){;cdjCc7zF-bZi2 zSIj*c#WTsDSpEZ_{_@VWyE1sT`CLw-7XHBhqGclfV3eb;W(r?o{^|ZJ`3vB$ z8D7VK-ZQ+#WS`HVp+)yg8NQ=EnjhT9P?70B-IvJuUeV9gf>Y$OzENJgiQ>b}UIRTMeTVX_YYwHKDL=97+0>VR9P`o3@J%~<2uK>y zec-Zh6G+DXj6NNebDsfx9`m_^zfmvv(|rk+|DAYwT4(tW6%QM@3Gu6sPKuTBHs>+# z^ZKFiy7{l-FDrde`N8pz*Lc%jd%we;4me^ys{JZ=-(&HC$FQ$Q{u(5JVE#n*bNI3z z)|dIa3y%lPr(whEW&3*XA>F@TGaj~`gP*H-T^bSnTfytmctmogekEQ-BQVC_m@2ih ze$V)jKLfr_e5?A~b@2I zg7xb0FXy@1!|yA2Rz2p+)jp30kiTgCfqvHY4-tM1vkP>;QU2HV{wROa1baXD{WAP7 zGxT3#+Q#L(@A~>H%8$YZCIW!?q>8+vPJBo1;U_L*zYBC3w7$PuZsGrY-z)5IRXlvE zyzNITzl{CjphjvNvE=>#KpKu1Y!UMITg=Sv*x)&$s&IM^*dE z@=ASQja*VW-(N_@uDIfg_3Iy9e@c1veLPR=!`D}Tb*=2`s+H+J`pd?He9!bR^mPOI zTCIQMYLD6%m9u{R{H1@y?@(X)9>+O~CKU@A2#vfPtn$bGphqBE4k^Ui> z{aEi4pRf5Uz6g7!&*xm3ukc&OU)S;ryf2#HXf|Q#q~$X+|A_pV)7}^JDzs_`Q#}*8XYn2gr)|DQX0r^5Kk$&#sqzNT`2VD&um=WkUO`W$;+y`F6QyZG%q?X~gIevi!eXg>J;AN=dgKe46e z`D&l|V)^WjKlKa_rB_Fv}Trxu5?V4%(H!7b<~pYrR$$Ddd5ePl1M>Nk3R zWWPuG^Q+(d`K2FOnct5id@p=Vt>4zC%svz^c|c^pUl0^$hHnMH z*XVP0Lj(Gr@cmkc|0>e$1?h!t|{l`6o1QpA$(fexO}SN zd2N4%IQj1HIuhB_*233M=X$0{pGIHqNjzUV)+PP>gXHthstdW!TlW3saaKiA7-pBr2NB?*{ zgnu*f?JaJ#@DTCf*n{)rSG02Q{6geqIA3)gPJ*YNN-gY%?-<##<;J47*SAfP{d>^~ z?4cgdgEz3B>pb;%Zc0#Z`~>m(!tddfnEcH{^FK!huZ_>oJb?Z4B1>1Ev;`F`-^+8;JCKIxuB-W@%TJsbQ=ezf#C@ePL>zh4613ZGkhJBTj; z|Nb(4zWnbT?czxs-+BKhg;@>_v^xaYqauu(Fmyw%- z!O8O%%*?*`%X&X@8hbu?cgxAs>#e*GJewC^f6I``vghX$g_E(5AD0aO!1ppA@UJsj z{E7JT##q1q9`1L{pPM}fKVa=`{MO^Yvi@nyYy67zSBuH` zSEP%{;NZ~F)8h1Rds|~?X5W+DL${w4Kk!rR-HLy><~MJ9i)8U3f$(u1@vM^JA7;78 z|K7%rd;$0;6kVY-Y~!o>M*RXRyvbLyn1t`Y{^}OwAEtKvI#u{`>6-er$%qfae^B}w zpKSa=TgJyXY?@^9oS?thy^QsX{a~;B3FuGLr-#7v=6?{i5Bx5<>FQTyPiMA|B+TDH z?OBI2!9c@8;|COU0m#(IQ5*q_c{fc~s}bodX5FCZUeA@+RfvH!8%^92?Eijw&c zq_6H&{)Jgv&L~Juv0W*@K;qb;8@scnNzy z@)IwH-Ls^h6aYx*t>hH` zZDEp+BYrI^kD*`U57JPFy>$#;G<_`6Uv!@d`osu)e%v3Zra!3u?c`swKguJ%z_8)zn*_7c%9$dc_wv0`lax)=~qlz@VNI!cS*)m@wfkV<1Oe{;C1Q$ zMd@SS92DcGYGjKSsLCel_uk&2;RUhQ>emba`4|{q;$w85Z;S53GkqNW zC3Nn)vR`?7AO4NBKd9B;)q6FvH;<0N2huOA_DJ65>qmG3aZI@l2jd}oDgM*USE}=V z!}DtgdQUUHri#z?bm6&*{aj*M=77?K*7)9XKmPXkt4o71e04wTM|d2*vPPCZ1;xU8 z!G99`K)J@FiU+;@w2CLKJ1h9o{E6)SWqj>B1U$YtkwQNy@~{!ZmxgD%{CX2!??_xv zyrr$DlJMt(am`z8z32nMn-6h6&|~60Z7*+3JeP>~{~ARA2dMnjQXb z-k+m9{_I!2f4`i{>pU2F%g}~{<@r?cmmNEwj4u(tW8?3~M|@G1^B(&OM-J_e_y?QM zir*0b)NlB)JfB0?>c^A&!OMIVe8CYmkm`Ez=Sw74_*kAN|Ah|ulNIO!;}h^V>rOJ3 zY>2E!JAZsW1^kmFgWp)M#g_k8`;hSmc=T`LZuEUtU+dk<>HgaM4B8MzYWD}7*OAQD zKrw$+zM$gI(9QE`8U0HKQ?By~Wk>6=HlD%rFSftQe=Zx@>$ShBKl41o@89qToTqu& zJ8b{0oLA~0_CN6nljZvzYVsQo=Vdf6Y(<_Aw4BWu1?>;E>NF{a!f57qkqxT(t8tof^Xp6$2x{le??7gLh) zH~t0v+`ixEx2&G`;%{~SF#hUq+t1~H7z=wDj{?s}f3SG5=zSVb%Khff`^VsWWZ5f> z4`;p!A0T^seNo42qMC2XT5J667<&ox+va12_TU}||Mjf}_@iP^>P{{?+#r7)*)CLDaZ>1V{>Yf2V?pl1K!d-Z(bSt-5u9?e|OpMce2^Do=0yx zcai*2J-`hj`E<@r|F=cM&f|w< zkXg{l`Bj=`_#zEH0iTyjXE^VFzjdx#7T?f4w3z$eAl@?+;z|Mc%E|JFFX(4!oQyVJWO1@ zD|V0k?ZNNzx1V_c{SCZj_&pe4#qm7(kK+#y-sJmA_kv1<=N1mizHa)8;dkQQGt{59 z=p^=e?A=c96Mta#>YtiDIFEgq{-XS+?QQ)_(mQ&VPup{^?C;=n?Db*y$yx8dVOr1b z&%HqWy5{2pvz|I*YFv0a8Lq%S%<{p$F1(z~bZR~7JVxFPUd_R`eDjr3<7voy=)WMn zH+$d*kDf@x_uRiHl?E?TpY8lK$@@7!&=>Ltht6`y!}$B>3@?{na_4S6cl)Z$*2L25 zSFXIB0Xuiwxw|eVf7RS~{rMpMQHt;RyJ7PEi7zO&ynCYSk-YG}6~x0i&hwbc;U`wq z3x6{s&fRw2)6Z9+-Z3s``3CHJ?&tSYR`~vHm~HJ} z=(^JdH@f_Nr}2IF?`iLK3)1UO5B`+#l5Bj0y{}KVVG_O=Z1CU+d<{yOnBj4$)izhC3~V}7skDz*$Zgq}};Z_C93?91| z@CU{ZByIip`w+FhrsiU94*T_@ky)(A?{MB{8E?0f@nZeL7jT}^vn`)_i^==pPYln) zC$ZkQHl2lkfAdXPGcCX2mi^;hmi=$~k)_i-AAmoC^ryNBtlu&}5b+1(A9!L8`3u81 z=P&b({pfM>xn+5u@PD0`_l;{eH%N6gv4&b3X}u0r3b{ACLJl{D7V(ejp@% zRL%|B@8Ab^+Wmt)_&XDS@Im4a!q}A#`zrdP?koH%-z$IAED2N8c;+1!xZu zUl5}Ccy&eoajVeZ>`&|4&ezC4mi@Jb^Sqn$xdVS@Jx=MdQ_csCl`Ug`ZGDPse(&|wsJ(_KrEi{UzbgO!kdzDl{P$|S z4=dl)7<-t?Yw^2&Vf8JZ(EQ68AM?-UJY)V7Uqk;^^kx71ifkI7#xDh)V*;r7RQ+7z zA$^H**|*I>-&iB^X>(yV>7aov(LG=|M-G)6O7$0E2?3$+eLOeSAML>RE&aX&b z0-pHxF3w}-D|m+Wm5&t}{}wOvyb$}wp`^-%&jZ;%?Ojx_}jdZ zz1yr^W-kYyhn8QJAD|Bk4}Kwof0_$^@ye*lxv7)gvV?29|0UML%7@z5KXQ}BSMY%< zpDBEd{iB8aG8H^3K7sZLzqUKKAmjbHOA(&!&+OnlESHmy8T@Se1N!2_^j~GZL^Ay! z;eRX7uEm~g-&ZNeK4j0k^3#uMe=3hZRnZ-_QPpKNaUw zK2fZ5&u;R+hp)`f#NUtoRrSMcPf)~0_nX%g4;B4h{(j&;UvBM%pOF5``&>8mi}UZn z9%l8O_y$+!e&e5~_cI?VzmM*NCf?$j==TeP3B2#W_xj&g;sNmQKmXOMD|{^<;OpD| zOnj&L)6$>%KJ+#Cc*-ML{nsFV;{C(PWMKCHU)3!V|1dKtf6=AKcRhO6fYm42W)QGz zUwP=INLD@=?N2SdU;eb<0n1O=Mfq2EI;ZEAG(R;T;8%i7+x^AT%{D*aW4^YI`zgQu z!o6px-19k%FX^~ak=!Z1NBf2G3)jOxEEpdQ^!E-^j(^4@3xdKs?f#t#1)G`g;nRm2FX|0QP$E zRkj}u-K{x5xQW`KPx zJe&CHiQ0c;zh7(j!9Lg+lYNNyKNP)hn#cE?Pjpd%{Wj7km!O}y`8rR${eG_U&AX8k z#HSK(Z~g#>j@&r3F=O~%{S$(>X>wJc_51{~+3WoPIN|^0tC}r-eq;mV;qiUGV|-5h zA@7$zZrGa*^*$P8GI)FSg6@MBzb^Yd_ovZ>mSZ;;8}QG6vT62=x#^xex?SN@hrNF= z_&yN7F_bcWKRsynTRunjd;E>@w`V+#9y^9TUh&HLxh|J**<;GLF8_P-^|`f;vwSF?gwd z@0vA@$KVTukCHCCdI9=k7dz57c71eOV>s^XI z{iWBwwI=~y`(cy(uk(ptnEhLLo%RraPJex0cpZCuzwq63-G73Ny}f^i?B%;+Im(3} z!Q<=~rC+(zkasurW+sCdoqO@eTMUl|_swz&j*?oHfHPh#$2HIedNXa23>gF znVF9tKe0Q$=ko^^U)tX>F!&hsIeY=~oWb7K)qKwd!q1W~osz3BbU!%j@#XHEynFSz=bo5y+ihUC)zHL=mgP45jUe~I%A`*|$)lZ9_>k(|0=dM+dXfuRr7uUq!_ z2jCMr)9Yq%yp`(CS@!oYwJ+>nF=g;Q#oezp45@z8H@=3y>uLFc7mu`@yM69+YnodV zXSh#(cJ~_M`}cg|z~Zm;E?vFuUBwgVALnjA|G70AS`#ze_1E|PRONinH>OY?FHU=F z-OG|wmu5N!BK&RT>%-RZId|dTEII(cK>5GNvi11mzw%FK(ZBE!@EMDee|hnPe_2}J zQ~bN1rNH-@!gCL_TrjZ^7r(F&{%+rsdm7bW#ruc%?^yd+vS;gjcFq63;>-oavuum! z-}2Gpo=-?JA9#NY`j9w2k=Ep^}Nnk8~TkufDb};ZZpq^e`>dUhLarnS(oN-DhYp}?T=!ZjF8W1bmSB$LRiu z{F8frKJeB+d_k&B&%eLe#raOYi>FgTtS%jFzHO-RnFiMHF4p(Ry9@8iZcm%hn(N*{>)v(~{Ecq>0ju-0sNtR zP5mQT_vLcl2%wn^KcMd;{IUi8uAc9YQ`P(@BDrE8LXP+YZ=c}2UZwn4a_%zy+GO89 zIyma#ao*_Hj+D_=p6nA!lP#2kvUiXu4P%?&iv1j zH{ciI{(7ELm+4=o|6{MfpQ~1GVf`X^r=)*?chnzN-si_p_KNcRh?ZF)4`QoN|3T1- zAF7ng98hC_qH`t7-d@%}=};7+8reFqMwYr%TP`?VBO5-K9N}-zpw!CI^DE{0J^guS z^nEtoCa1GkhJz%}(0vFh$DhRPdCXVIeKj^nds< z?t?gE_dF|?zjEt9GTc2MevWwbh36*iKHkzn>=PD`o>V+K@olfMKD_<1ig&>`?d#oR z@T1PXT%sJjGafmRz9jrnwU6ujJYK>+p7-tXczi17?;XVr!mDNbFzr?RMI`q}@vy?b zvS-&fXSsibgni(1>09_?D&BIV;(OkI3cif+qxcKjZ}^t^&-rfmNqIRWKXH)&{Hd&O z@H7dC&`*w&-!7`(8W7*4d@pyMfAqR&y_rT_E9?8JvLF9@Kh?8~`#m>kHtCP@kJCPH zkKz3Ga%7)jM%9*2_Rp)SPybzcEBTX?S<|=4cVlwc>%6`dm5V?1`vvi-s^5zojfcHo z@AG_D@!ZW<*?q36|C144zYjja#j@!E;*Ios<6{|L?hC4IZ}h#i&$s_~%B+yu-)lkn z=Qn1{{@=CVuNJ<3|5fwTP`^AL)UNG+tvB+8oqrU*L3qEf?QU_XCl!K%ogM0i*01HS8gonMMCGk(FrcNOs8`%USj z@dZwNL(kHoqo2jUEQ&X&^ZZ&Qb3S&^_TIL>M!EE;49dFef(lY#y>#gOMmvUKRWQL^qGqO zz{~h!ymVeIF?%^F>b;yb{Rey^{z(3cJfZ@5pIJw@^N;+JU+vf?-8-y}S%_!*Dq$yZDK zuFen1Gx5hxFPoYD_HT}R ze|+gD@W;kST0Cn%`jqmaE>G0pd+RW7zYnpOt#IU@Bp)C4`*esx!g#5D=(lFi55<4T zo{zl@`?|#oFn+}2U(I=xO>P}2?Y;>6o$$Q&XYvUgjgj9TeYONuYC9DlWzLa&C91@uiu{PCthFv@!&i3ef0VK-1M?U^YfMbW{PJAZ+887oa~ED zX_r%c!v2jPNyuM$aj*Cjch`(pSP_zUzS+9!N_>DN~LJ$M~JJr6wl(&AtCFRc#~4;Lpqp?&1Z@-e7;DpDEHx9kMRdUm1VNUN`e!*$6uPpofL#dAb zznXx5{_;hagV(?GO4GtY+RyiVzccX{?eq3r+}}!g#=Ac9mGxUn=Un^1p|ch?u1)Xx zqwBOjB{zkQ@07pBau@~VUp4jpNoRWRjOEXhUv$~E5B$36d)d|r-LCNmiw>W??AkB? z>a0Eop6q>aV+;BAsh>*zNweF=X0h?0fBpm6bAn}wplR0skNl-W`!CDjpTPdRX}P0) zhvwb=C!G`a#X>$$GVR^4^s;}vzqlz@e4o{aA4#fyY^pnF*_RHsFHCk%>3Pp+Y10{` z)qLg?iG7o@DdE49*YwaI2iteNykudsyY=ctd*`YDUK}4@!uz(A9+E%A=MUUaoL%3S zJU#o*%S#*8|8w%m$-zIw=fuALD*h1XJ$EtZ)dh+5e_DFf{2>lB>3)cN5?2rZd+(;U z=BIBu^P;<1n2BfSee*=AhR<_$P>8SVMlQ2FLu`ZT+|JkGFmTzCiP7zxf;d zbA$V4!$9Hur*1g2aY{C+@mW5c(tIVpV_7c&#;^I_uQPe=FIAN%Dr#i z=<`~C`wNqsL*gI4t9XGI);z=glC8u)1o4lK8x=p$-gn>9^s+DK{zCU_7+=uOe#NdT zys!KOQ~NXXrEi=#bcFq4SE?`K2QV4K2XJ4d@)KBl>hkC9$jx-{D@(brVDVnX6KrkD z&z|hAORT7$)p^q7sb3q3ZF`r?UAW?~`47lHe!<@r7UM95|G<-T!W@$;F%f>D%lHDy zL)vqi>|vDe3_o(Db;HBVmx=73Jx{bx&54h=-2q^1f2BQ{ws_X1SD1|c>MWiLe{S~U zs}j23;TykhSV(*b@m3#Deu4Qekv)y|VEzLrTi*W!d%pY$@J9?}zxYk(fru|~f#ZAe zKS6))nCbApfS-|nviJczKh}*az7KuS_<|()CmDZNU+hB0pJ2)o$RJYe2MW*}eD%XmTsmy}-%ZDLzcS|~e8FtH|6ogu-y@?>U6L7OeMtZGe8Jj` zTV{L~_^mC`#`_k$y>;LhnU}`N#9_+#D{wGFWl*q|-8{Z%BV@{XvrN<-9}xkiHhw^S)i!^CY7Wn0<%|W-{fi zF3b7U^{UnP_7q+Q-mv=8*Yc9tKlFQ)6Y{%R{;)`1QeULp>@_MU-_|~4NPtQ?UCQr$ zd!(=BcweXKcWO`ceAE9VuT^{b{EXd)#(g^DgSZ>$PmX%o^1lQ>_@`k#U;PpI_C>$% z%Wk_om_dG5Yp?Knf4$<5@ozEzT<4zaZadRW!$Uig$*+#S^4g8$-!i<8%zm*crt$Rp zw!V)H6_ITA-^d@Ha`g8+^-L2{q zy7wS^{9UAd^hZTjdp#bv@~HjZzFp(b&-x-CNFso*^6>;7zuwx_wUUH^b;8rHkN+Zn z0m>`*RD6q<%lP}vB7wRfmeuJvd0LElIJ2(Li6+;#rw-*W$e@gKIo zsJ-cZ%^f3$-}=!>2kd#or_EBnZ0{d&JN*aVXv2OE;mPwKZ^wTh%9GwY312~ZI4t`2kVfvz0jZV7x=egPdEQKFWY$HA2F7XnK)*CpqzsjqxnjiCCTwvi-u>qGW@=F^QfUdAUFKC|`h z*O&QYNPn~S#s1eE##a>ed+*=!SSGoe{KLXq=I?^cdgp!v)+_!l)3ewYvg*%|O3pn{ zj4i`{$?qv&JTo_ahQ*s6Jv3zU_0sR1D}3Yy`PW=FGgpo$ynTr0f06Mh^WE$>@Y~pz zgF)~ZCKUD${1L>rSU%6L%6_E%$Mzfcvxu*)kz4IN@_Ym5S@t>lPs_Cw@d-SyPKYwjg z!@KBT<%jq0*M80XonH3mW2Ef!$(DOCkzP+};BlG>@`{|D||5KLf zFW;Y4djYcVpD4ee*1!5I4c^gyMSNT&uSF&wj?FLl8t`_=`#CQtUxPjje($`njNf;< zD4(Xv4ZnleSrOVFBRtfuHD<~OS(VJ^g;Q5f^U^@zXs16|6zDODSulN&zHWbczL!onN)=5 z@y~ZNGGT=0|FY+Co^SjH*V&nUYYydlzQ_BDx5vJxc4pS_1<2XS(;uva`UXG4ubE!ecs=Xw}^7`p}`;23x5v9 zWuI66yQTH6{?(0}Zc7NyH+>g-qwD#_Uw`>R@Cx>K@h5TS5B!kfncl{j+25G}hIbbB zc9S5oYv|<9h=>2&Px<~3|M?R3>xAOLn?m=&_T&;98$ z8^G6X?^iyXlAHUzPn`R;sjcb!z`>!no>mmz#opgJVI9r{rAdik?lYg9*)u)X8%uoi zndLWny#2jo&jj?NtDg9!;q9}&m+zdg?6i-4Xo&cVYrlM?>AU?ik`E<{H^!bl{&f4F z9yC0kxZ;X0eu;c-kNwA|PjA03NIo><0NJSBx@-U8Sd;Me-dLdf;Uv%7@h6wl-=`Jc z+Ev_!c6#~a~Az`o#fPnOfJ1O7PfHzpOqK>eb#OXWjkH?uEm#@ExU6unf8B zvcdid>&^&&ezM^wlIK0Z_{Z*;yXyJdzw{UFe|q2}nbu^TyW(Bzzv%gk{S)r{Eb;H( zEY*NWRUjyy8nMw>;tbhgUl<`-jAZ*WKSIe&x^y3T{s<8{e>J=r#C( zFC1L_*YlVD`&VMc#tVu=CV$2IS4e--d|3Q{?!(_=QttTH*S!D2de<|a`TH-64qQU{ zfjQs4Px#U0m+#&pe}o(Q+_Fs1?C`%n^viL`!>Jvy9PyP8?%Q-mp-28A1s9(m#+wi9 z|Jxz)1?_ErYxxg9x2VV|37-&V_r&6fjzu?!Z;*eA{8`Qw-Wd{qVDTFT;xYf}tO3^3 zPgC5Nke0n2`@Ys2`6&*4O8)G1BdpJU;u#$I0RMMsi1SH&!JKrz;yo1KFkpN^81W+m zuU^A?|9(^Y)sBVa=lh$toi-qU0rD9x&BRa3eQ4u}OOT&wa#M=jN8sGJ702NR@F%#h zXz}@VBjN|1f?uM168U-A&(GVjY-TTfK>WP!FTn?}U+rqb9t;0~c1FAo{DJOAbbG;< zv>1M1d(-;azWnHGdyu!Jrp}%_Z`q^`2X~Wy<*ME-bJEF@}WmFnf^cPvF%EfAT%(gR<|qs(ve3 z_@4JWuir_o*pJayLX^Y=qYzq4|GpI1d6 ztRwo5CzfUM!AY#jG6#6M+#WmNqxPXsd4qv{pWV+({}IoPT(*ay-$=hJ>$m6wT%i}) z&y^2(LIJ+CTJG|QueM{{#IWK(`zN;(`;_iXIs`)K^ zDEr5C8n6G$*1Ld5Rb7AoXD&>JkiZbo(1Oh*3<)ZPpe?~)#hk=xNRUgg^-{Gm2^c{L zH?7ux)trnYMjADVc>9&=B&JGHYd{-XQ8J0hMZAE%zFr2%T3YnIP@+ z=6QS`miwGD=j^l3-s}5a-?esB*~D9fybB&^pGJ zLjT`vu-{8S*Ti3x-^1p9+!}n;>9VuRM(>kjfRM&%T}ZfB7b1ue$?~P|6*%)^?btb z{n%gTd~l&HgrxMh!t(>;bHHYPk$QOQeK{MZySDPYs(if_G@_jJe!E-UbD;mA; zzUA=4*aLh*C4539*Oz>_={onv3H+Y$38o%OJ-^8>NIiezyTS)4zTtZCk#7CEpZ-$( z9rY0zZ}NVX4WAeheV2S6qPGd&7+Zft-=^~C*snv)Pinr1AMfLQrRR%CeTCAsI`^;i za?DTU>!|!g_+Pc&Jda-JddaWZ&i&9n!&W+q_|v8BwZxy4eV%XVFITokd?s?Dd~?oO z))&P$nDulJoH1XbKhV+Jf&R-GA7;IUIL&+dY6NLxV)L!~-pmY;W$Mp+7 zRpvW2pQE3W{29i#rGE>@%X+2OPxgP5^TmcgAis}4Z16Jthn#Qnt%9E`iXw776+dS^ zIj@gU>lerWxL%v*`!!$VgA1u=asK+`hnwrO;A>6#Gotu6_4{tge}zw!dcfQd@0%&c zeMa#;Z|AG{L(t+rC-c`pyFooVb-ya!UV}dxZRQe@S2yQ(vVNdX>|BO^l=n%z-NftM z|Bv`w<`*U))h_;q&Ulga#`HII;Wzk*7@w-XGW*df`bEYYc%AXo#r*YT%2fQBnPWvC zF6)t8&&2O_!hiNPm&y7;y*xYl;VM2o75t8Etk5E*e|O7RFM$j3N9BGLo|pO7 zoIg}M`Q1)yD%rYnJ^#O!GT*wqwgO{oSmO2gn+^JE{55&s5}%rFcr2pN)jcAzoJpS-|vOb9ZK>8Ov|9-kN*D|#pe7nCX zs_;C&r|PXCcs21owtoZjeFVE|7kX{CE6`Zhc~0`}sV_!6-IXWLqxAV7rO!lvo>x)u zL$nM$K>qwz_hh5q>a5XwBwkNE(a2rxx7}7dauxA<^vUFlqeqQoY*O)f^5@t17;ht| zme-C^c%vZ5_2FZl>=gYp_3cKkaFtj_mK}-4DLfw-d4jaqs7e0$8KS_e=;0>aMKFS1(PUlsJnUFZGzzDKHaIp25hef#=U zd_BL)Q!~ znp{6~e(Ivp;eM@j{$I|e@6M{3&{45K?awaw`@^?N3a+&lB&D8~K#&EVUJ`NGDm*YRIcr>Af`QRUk zy0XF72`%WY{xw{+XH@;X2EGCOAH9n9xQrdAR=_WmFWlVC{c!yvBRGNipe#Gl!tV`= zD{>j*MQ@y)WSI9Ctmb}ro)jmxB_k9}d%$9=UUCQZ^f^EKLv_7*w}iiqOPBtr3RNuW zywo_rdX&B(7v(6e3 zK1b|>&T8}p%;&%0{zcD#ULpa$!V^6y`4LC+u}2=5_F)%#?(6cW9+-CD?GL z=gal%V`tzC_8qj3jMMTCrtGw=RQj2Np+}}Wwe`{Je%n;^HeaOQ#{Pz_HVsu}5A`!X zpRL1>80cU2o_>n?;Im9)xkY;-KGXU7sV4Y=J?VN-;`hrn_EYTG`@|>tnhX8VG~ehg z?eL561I8Mc)?ss7{(et0{J=-)0sCa?DW&`{j{Kj!t9PYWx!q3dHIX*fQ{f97T4S=- zy5a%t?Yg5KVfe~X%-7tHFWPrf_yXehs{WvMZ$#$H5}Q3Z%-*W-aEj;+Y$2Q5j{kP{ zshk4%(`MGgxtjGEt#D|s(hFo(l23x3uPL!d_yPP!H{lcN>9e06^ZRXAR^q>vyl;4J z?U#Il6^~@)fk&_NM!m81K(1%MSo8=(9BV&(1jNG2qX> zna}>Z`ms-cwy?ZQ)+foQHT|vIe}_LE;|ug_h-aPdgf9?(jRoFsi*D)*oB9INKalzRA_vGQKAX`igM zS~b_Yd)_f^^c{JucT)|?$5niS)I$@zsn%=lW)+W$`HQALLFPl#e|tJVp7nO?imT5J zCtmUe@t~mAGTF!VCc@9)e<}YC|LNSdD|?h3KYp$&!pZn|7uw3dl;h*6hY-^CE}S$N ze?|FsHx1PL!hbR2MffkG=cHZY)ee_-ZeFcN?T0Sy#GjZ?fPm+Z7yncIfAf65j=x{F zi2UO7*Nfpp(_d8ky~y>?<8OQ!mTUNdfq0gxr*8VI#3N(=zUi+z#NJRA-hzK1_a}PA zpoy>XU-5sR6aL1g;*&}*KVHRGgpZPT@OdirZ?DeLs(QfNf5D##3O^I(A3k~C8vZl- zUls4U3B2wM)ahIwxF_}7>hiIR8d!fp5z1f3|B-kS`}LZ(?B``z-G>n*@V*E1@%RJk zearYe|GvQ&w5xa;oJkWeeUA@LVY`8zq_A@q#kx2^Q2_(!Jg1AldHDGOT^ zUOL~-`w;vjcwF?J_#>}Q?!5>97zfG3dwd`GQ=VM-2e;baU2KJ~<^5{fHo<$;6BhqG z2SS7IP2$ya!7~~OTk`#3^SwqazL4-=3U4YrEqd0NjlV13OALRDzoqcXd0XnsFyHgN z$@%$}K{H-&;%o481MzgZKb}|ct=O!0%D=wZ|6ac4R(vCTnCO#~KZn1poqdvgAF;{L zB>r=Cl=@7qa=hvf-k*G5(oX#*iFe>0;*a{-UzY3B-~7DzpQf!_#;AC{vcad!|I8Ot zBNJLmY+jGXen31Q<3qK3#Ge&>BiD~zkLMRWG+^tNkn*3gd0wR#sBU`DX12TeeU6v- zpV_YXi7)=+`uraIIjiI0Cro^zo=1K!#xKZzu(AFa=znF~b@^VDercc`I|n_sI^NJy zwQsFs&WXNT^_N}g6V!N<{%3rg=QD+Ws0_N#^FKHH;U6r#5795l`S14|86*P*fBk$q?a^<(9DZ1@%3>eIdyzDL<}&HReEUdF48H@CviGC!&D+i=17 z625|Vo@c7)Kcw9VoZpX5eGmM;(ocX-e*At`gra4mMW3-r@z=ax)+=$wCpxAy9rfnDh{|xJstY4i$8~rW$ zd-SKQKg46S3EI15`wz-|JX6(^tY?10MNsQaP@~*{WA_iucK1hgjzpXk7T`Tpg(0kk@X^8D^j-fubeM-@VG7Kg$$X`3(!mCI_s0WlzvC} za=D(ws}&xHZ;w~?L(KWd%)(Hy}2IAd~RN!@qN5g<`?SQT{b97_yjY5Cx*Wj zpRV#LO*~$q_K%nRC3XGrCcmS`OAMdKsp(zT16lvMo*B@le`k{KqAPzw@uh;_xqqp5 z@}lUiPW?}e@6D3;C-}TGWYe|3AB%ocV;}H8sCRe#P`IgB#os&anlAgPEhE1e|HfRu zbmo8I56t>Z^q;H;!f!tG3gfMo_&M`qqU6_8-vj*3`^;AJH~7BNy~pJ(j`qVB;II8o ztyio~%#TXnIaaUM)b}atgTnKCFNz;Xk^InGh(~GY-FLqZqGx_#J+f2pgWspWw}Iy~ zovDI{weZw)rXCeNl+;I)`;~apSfg6Ar&_7M*3=z~&kxspSL(*hv!cguQT6lkHY}6* zRN;BnGw`~*ur{h40^jFr6?C^aT$_6Ef8S4+{CeM%1CI7x^S9$>3YIA@8`q3UA`M+cJO1YoL?y-fkzxhY$JBSzh$38e1{el^S^dWNxkBC<_;MsCxG3kI@hCyrUjf@%eQ68~jebNtF0J`OE>&^`gJf z7CzVmz6j?V9G@oncUvSLzmM`CWydhQAvIo{Xl?3=)sFEJ46& z5&R9_taiekN1GGDqji>Sm!&=-a^fb>;rDaEuY=+eT*SAT?6M~+{F{-G3V-l$R~PvS zFN2q}?JZWX|0%t8X;1Xvf`+&_SM_ee-{pKC9SiyYdTHT4rRwA+5V^SepdiP={SuTSu4SEv2K*mnHaChrSOrZ=aki z?a5^4OlW~G+%#Bw`HokH-S_E;U}oreUo?ENA??|jJM$J^Yh4&7f4-FVL-mfdltnS6(n z7l$N1ztXLNr|aPl4l@71FEn>sMrvYj366`KT0iS&qtPP>Kd_W|UG28Za{uf;C;EcJ z==F7%CnvK1pNYM~7o@LsAHQmWZBP8N9@?p=c$>@ehgR@68-^=AL7+NU3&zo(%Qp)j zkiTPOnlqS;zf&&yfqm#jiPsL@k{CX{4Ew8eZ-C=fe5XzE1Ku@7qVH$FIPwo_zSvJb zfmYArN_<23f=sPCYc=yn+}Se1(q^w8r1NcYO!`MYVelY9fkulj8I8cl1r`FxxD+L*6f99I;ghnL?2e~X@ge1X-m z=M!7%AMiZHQ&hbI#TVeev7ajbBl!jnC-ct$|1ayuD8r?7F+b;=lJ$moqpGLa$#RYV zYHZr35f37MFZ(s9b}eu^_nl_^{h`_dsaG&2pplQGL14>zM?QjYMjhjr9D-N5>;{1MiF*?%_G8GO`^f7GV@v&x1Qf-j{01NpG<4fZUZ{UnOO>*9|o zy&e4{_`PIbwnN!8if!WWI+v#=8kTsV%2yvB6#UTElsNiA zn|Pu4ui$YbDa&VVlnghY@GBbrk#*%jKKWl*|LW1dFA1OF{S4sqi0Tjgb^KeSVZLsR z&1Jus)7a?c-PH>32p=N0iN8-NJZsu>b)%wFTUFNcBOW&$HsxPK1{C?=U$=lKCH^OP zw~ObaerU{=_>9K;fGDeXz$MM(=KH8^5&ny$X*|JR&Ja`;^Zi=?;w}S6dQ?a@0j)g zUyyXMf|M9N%rb;Cj42@QrE@ zsP?%2OKj?XYIhV}7AYp(BPB=d%<-ufH{VB}CpvKdMMgdSy{SFSe7ZA}_sx33^YFga z^Lco`w5#i@{t;W%6OneMr%>@(eqZ`a_z^q&0}}u9w$6SEFPiQ0e%1SUNaowX`^2kF z{)R0LNh~jf;-{uTt>(wj9 zG+EU6Y2o_d|I74RH~2utBm9Km_c+Bz4UA9LzZn0NFM0zz{H~>!dbBd$)%aKa;hPY; z9sCU+&hfQZ7s&U+e8TYLc?I7pJ2u|Ho9H2=o;P?c&Wv}<_b2t|^r7JKGo7(^3vZJ@ z@XgKW7leP{dg^<)89j~3cd7n|f0O(et_OZEm;H0)dmraUzry;5-bUGj_@~v*CzP`U zzPt01<<$FGN%V0j_^w&%?YL>@m@(Qy_ywD8L|EU|{>U=_jJ3;r$@4tS^9Y}S9=b^0 ze?^zruhM_DuHXosSN2zfUr_OL86Q!pw*g;Z@{xl7X@5nnccJ6uQcr>PhRnKGIMF#5ydIj{r+?`~!sdnAq`S5S>;njKs-eG-K_&j$0B%Y^N^Z}|} zeqOV=+sO|!k2k-kSiT>4*;ua5SM#k}58Y1r{#Y;7@uG*~dmgaI4*WjPOFQQikByl5 z!(xvmzO4nVkwPOeBIk=fa3DTy+G_tQ^gg1mlHa2~JTFJBf3jXxx>?UFI_N)%7s&Zi z&m6uFk4@t18vbT0FH?=DfqKZM!0pHS$R_`N9CH!Pzzb#I-*{K9(0 z{@*e`!H+Y4y_=b2=9z#xfe?WzZ>r1k}tpD zy0a(oKi^A-FVO0(3E|LL^sL0Mi2t)coOBTWEcOog!+NpXsE<$mZo53c?Ej|;z6Z~< z-&>l=&#U;E)RVVYcuuo_3-Ps&_+D1HyyW8-)`lehHhU}i`t?@3{GRyRv#GE5(~c8= z4EJ}7KQ8#brgj0Fvz?LrdeP&%$ls`WtNTpZXyWx>QJ-9w{EdvA;B~2gx0QT(|HE!A z)YGr{XTP-$%c#?=j|27PEmE-Q-1Fzq&mR!Idy=~%nnOK470;Yu z=t=dB<*yGVswMT{maeP#dclSj5YRc``6KBG+J=$-<2{>}6iWX3@%*iC4R_8T+t@g6 zSC7gsucE$MNL%|>^IcZayN~vbv{>sNwts#4lhY=Cm-w&f-@^{U@99<58yMe@eLH9A z=njdeZ*7=sZ?zWGf=|=H>lYUo=-rJzsh^NWygAuv7|zs+o;&_FQImLchUnirYz>lM zA@S@u^zX!{weD!n;FrPY$<;>PggT@AyDbw3gVzUVyINXjT8GbC9NwP{K3_GWz^U`e zDZRqt4`z-o&B}93zBa$Ia{YG-A7`I1P9$i?yt{UG4|{LpXO*8-{iD;Jc75sdJNNay ze8;*G$t%b29@;8;gDVCvzV6qTFRjiUlq$=(wK_&L^*2?1fIj}<`q4R& z#w25Yn!Bv5ya)RylRj?PQ=2<@UDu?!N&bVcj?NASlk64NtnS6+KOB7ZlDL`G+u<+v zmXp8lKls`u(~aPX+y!xs6T8sA%kk^0H##GlZ&$cmOT*4t_gei2*QPBhJNF{L_v%k_ zUNhbs>UOS856H@&!xoo1a&WT`)4Y(vrI1&tLD4llD2Uc}~{02YlgM zPZ;X{KKy6J$DM-=;^}hzizZdR=Kr8|m2X!Te93{oU38zT`jt$H_m8`%p#H$$MkLQ% zST~gMSN7N8)xt+)z&9l1POI3PljN$u`%IN;X}@R{D|ZWydd#> z-tXY-4@1Q>ul;H8FMs$`XFcybqjGtP)2%&l-Mih{rNSRn>c!sr#K<8>#KU;8WK-si>;^ zmhb0ie&E{`)IV6O7oPSgeL-;f@!V^yTP$6t@8@xV+K&z?rDDZwn1SV{y;<+2}zCXsM5Qvctw)(B4c!i|7URiN3+r zH7yeEKPfi(37Y(#)Kl2R{1Q(0x+hD$#3>K;4DQ%h^VMuSd_cn%OE`2I{;~RtO!NX3 ztu{k8^nj22{Gb+0{%322=od~ipMB==y0c_`lzQ~ccYD$`m%{&2pH}z+hvp*wzcD5B zP-G7C=STdWs+X7p{~&yU<7V)E>zgZltOtrOU~fRBPj9lp2gLLQ9kwj(O72Ja0rCT! zOSP+0qsPBwK7Zfgqt=y`{S3hel7E0c+U?ZwmjK9$FR0uhdVJOk*0&4z0;T^KzCi18 z>0@wyWPgL-`oTZs8-SOkUGxREK!e+vH`_lJJ&?lxl^$Ky-;?-+@CB8DtfJo56!)+b ztgozR_^+Z*j_W5s5F397{6YOf@E88pEjBxPQQ<@IUzPu554iDHB2vFdwQDX`t}U0a zx{3|{6aU7Hcj52F^rMd$kp-Z@K-s13-z`&?pOBL99%8! z+gMMpP?-=?f6G_^aSWd#lKg0 z0RJn80e~&}?7H-i!e=V}?sf})4gonCkHkY8;xxPD84 zMZ5GLqjEd8ihp>$-pv$LQSs^m^ee5$J4t^~_)X%m=i{N^xqQVRD1CwGE5YB~AN)WJ zKbLgk|1v&1Rs2ig%M0!w{JPCJkge}Nm9m5Q)Omav!rxT!Z}2DAL$9FXQ6|0xKL%Nk zh5wNA$(ND%RZ}AUXX0V-1zQm%1r=YL?y7D8( z!a?|(5^wEs476Vsd^l0zVcIkC?^f48GPRlU$$a$5e)vTpBcgp%Eu8;JCh=|RLHUK ze>ysFzFaSMKELNKGOwQ!cR_n(JCM=5o;Fv;&vqVJ*+z^{2Jgu6`<;Od?gu?$?0$Ty z8CvA~oI>Uw)j#WZ6e<5)^z*8JCn$ei>hqfYKc4=2m-?y7{wQ;Oz%?UF8xzW9zXA1r z))g7&=WF3N*squSkE4F2dcWiG*Mko;fgOKQj^C#CvrSTX4}M^0zU1!`4_5C-@ek(s zR`Z3j?Tq&o^pD~r;1>e9=6F?n4}1ms55~XfP2hJ*I<=7+09>A~4){Mwx!>a1Vh`mh< zoXK6glG(xhUcpBL>k;}g;pb$1lJNrHq4>Li`hKJBG9L(^&=AvW$ohb7$ojLA^@aIG z%@62Jn4gFTh<<1Jf9ZEF;1`s>2Y$iCYf_<8%{PW-f#7mQ3Qu^{{KogMSyg(BtY_4t zG=^y(Bi=Rye={H2C4ZnIWsW9%2=nEI`3=~z9_jE!j9>Bkl!8J7Cmi^*+jI! z(}nR7b3Ts6??wNw&exLJk2o4_w~oh#pViRw%lD?*S?{!)v(zB1zlqE}%2u|5bs*R)&>v51OKm^S@2 z!qhK_?Q~NQslxMExAHIWC**l7k@B!-AYXp2Hq@dm3`gTG#P9t6`TY6gvHb~XF9XjH z@KeW>ZQ^-VPgU@|gYhZr3;GS=zS;dsysk`viQQiqFT7$G_wAXZ}?9ek1kr@|geO13DC*2cNS($oi`M zNBlMPR6=Kvzq%U!*2DgB6=gltcLTp~cSw9bNIm$SZKv^9cRJA1;14VzKi$;d6E6q< zCxp(mp_hI9qx=B)-T!d0BqZSfe&V3My7~Le*MjH0_^0*$?$H-bir_DQHk){UyyTZ_ zgCpqiKX<75-dz6;?_i0?rBfddeEv)H0y*IOFxRJE{Zn>*(H!u6?LO+c!)Ne4@%@7D zsaFQyZmnx73rB~6@7a&deFgEW#wFn`edp_)U8%2s>l=yRgYRck54{6^h3iYaK6Cw= z;?*5m!KZ)i5PW}Rw$k6{*7o*4ZUdim=T`-(k2ZN_!(sN1Ecx?E@(p|mX%#)E-zl?6 zyk6p^2`#z(O=UAiDm?E*f9~e~W@Vz^MjxMm-kS9`C(7{)>iWb#vg;KO_Vg>;l3WFz zuQOgOn?!vA@K{_zb)&Q5IN^h(L%{Fo-?3RgH+?kAD)IK@>gr&E;PYS2un;dE68E9S zCwle_;yZ@K*V%udQm(v`Fwb_$f?jF51&dZ#3IqPf2zJcDu-jUshOX^&fmab$WsGgv*+CJgpG?b?EhR*{eMB zz3=(;PZ#crTJQXO#&rLvv3jS?UAVWuXUOc^=9ap02U%=h@A~!q(tfGJ>sudATYAUh zXx^c}XJq6*_h~_AMZm-NsqBTpPYb#%3&uuMday4~c2B{`5-YC0F~2c~=zfyvBOy z@8fP-HRiK~`4(U8%zlI8$7PrP;VEy5mh;=|y5s&d>(-q7-66+y)|+nF{AgRB;wJ** zCwsk@){WcJy&t|{^d#XU-WzI&J^{YqCzF!u_GH#=iG=GDyE+d1Ejc-qW$i7Y|HkqC z$@~3o%)<$F&l=zV>Sff?ji?6&tVO1Y?3?1Q12Wc2bWJD!UCf7Zy;=nKHtYX8OVsaoR) zD{Woq>q8Z7Km2v{^~@Is4%&kpFZKB&%qP?{7)AX&-}SEM4be8M%r9eHd5&n`R5dw?#$URFzV6YH7yV?~-5e}DxG8-5!9tV`;VOFR<)%Z%S>O3x^Kff00NZN2u`!@Zy2 z4;ZYET+dSx?Pq^RZ15iICHO@0?ZlS+Y1Yp%Qa@VxUtCYcmyQ$PjPVQNk4&ZAj0fdv ztafty!q?x79?-4uj`D{ddXwiXLSHTZqg>C#ubeOV;J_5QU#@(-l1 zQjuG=TgWdVUZi=>Mi&TQF^1{W2cCkD#h;P<32CRitkN6C>a*jYp*J(z@&8@}-#|IQ zSKQdiejDJ`2cl<)-~YG2DDfx!M-@*r@Au7ZhUKQL$lr2^9*Mts<5;P`P!E2FPZ8Tj z{srTeU(d-Ef7IqR+?rnt9ix7eY12QFZy@?;^tQx%SGaumC!8SoTg8uq!iUg53Xhxq zcFxkUsqYp1=@oot9-r@QC~|p~|H1o<;c*>*1-wptPwG=x>3zj7oVSq&$Pe;989#RA zFEL)}kI-#nb>c_(C%mv&JN!~m{J{wQ1D>yRD?O{?BX0IL!zUh&!c+2f$HSxbK z4-g*_|BHNZ;*CD^2lD=Z#OLb$<8N(u)CTp-G(&Dj@Yr_Z)62nMV;CRj?_bc&K@Zhe@jau${zR$DN8xlNC{SOll@;!2W@ZW3t>b&FV zpXpy|r~ZWGUxxQLM+HAie}E@>e8GQ$&;ORYzW(9kN^c?f8vbH+9`R)JeDF5=De?Xl zpYV0%p4s5R)%8!d$Bw6d3i~6#R}?ZtOT(3W9M!@XsQ1VGu^N2Me4|@@ZPCP0*q;eM zBKlR?ZvgxAbc3(QF!37m&u8dEEX4n-yPEoX)&!m-7D3E^9OG ztP)+f8lFY$&&2f{RUX~^ee_jw{)gag>OY0k+r_5+EuDB|qzOC_nfU%)wtW0!_#VnV z&|dYq!_NHIA$(B^^<25X9iCh*IPBZ#RsCH5@h=?u@eF6AciE?ZmFvfjXFN)OtLr(q zUW+Bj{y`Jf?^R|M$@O^u=I_h%Ge4MkpZlYK<@w?mktOo{yq|&irP%2S+z;>j^rny3JW$zY;cl6oS`Rq5N_zb>R^1&7=|DWH>S)%6iPw3y_Q%Y<#6VvxdUfbxb8M29?$pqp5l+;Cvuq2 z_+H;*zBBbUyifUlsc!(j9N;&EzXNZ18O(g}=J(Bb?o#}r`Mpd1J2&GMK*M^(e9@pY z-)Ry*midGAi}_-us-GkCkD9+4cs!O&v4yW1(3fGOk0YKb``^^4^HqIEejhy>`B`ed zvkQN#>I1~qBilIZ#x$8wVz$DM|7`;?WBfS$0sN@&8yp|24{837I zz*o58ubA=&+6C`wFGT4->J2fUk)IIa{ixs1*W51R`?lzauKQIx`atTp>}}?$&Eu(e z4}ZlCYx871V?H5X?}%rAJKmMtF#a3ydGv4f@B{cS;QQ^Y z&+Kon^5bN_gHL9C^Hbjgyf5*3N0rQ1vfktGNxWWXJf>NzPkl=KO5#mY4?wHfLO4s} zQy--lxZn>g_8r)Q=Q-ZOe4fzt*d>DR_oSoOb(Xk)_d`#E)ZhBdQNVtF5!M67hs5h0 zPGfnkypQOnM--md1H|Lu6D$cmDqdgd%5`duYWi$Cviy4C#ux+eMcsvf#U_pT@1 z6}+$X`2Hj-_06U~GECw7gA=YW8lFmUADYuI_&$B+ni`kCE?OR~x0?8Vq%XnG;N4kl zr9NBtuUzEY>)!hwdX=9Z1fNEm{#6!Fe0Feli1X*$>dTfW{rr%O-J!af z)UWUAi4Fs=4NIPl{=R~IgQhzyi$9n>c2yR5{>mHgd;VXWdx*DRlyPER#rO`_qRzq- zHt=Ecq}^HmkF7Q24)Z<^tRFom@{V=u{G^7OCCk9?uU(S8%KotM;Z2sJ9`Jd}^iunK z33b-PN%ImTt)<}8h0oO$Q4fIh%83f!F0{8M1gp#M_@po%`_k;Y+@H?u82-1#;r=-A z^yL`^YmO)6J{{>jTBd=2Cr)3T@Se*O{Nw!J9**-LdSi0NLQj1`=S2Y=rkvJ8Z(Nx% zbIb-;9s3EC*N(LQyYUyxnA6^0^wP#o~MF z>%KT;``u~Ym#o_Lx3hl&$0rv&SM92^M0V{=sct>gcvZ&C=a!Frse;G9+s5(PapTug zKk(9jmz_(o=ly%bFEfniS}Y~jXO@JQMqe$OzhV{p1zI%XKYxNR;Cjvs&(N~Plp}xV4dAsKwiSH&KV%vt4)*|t~?P3a567hII_ol#Rz?p(Vd+HJ`A%Lu%a=gphu8?)uW8Q}}Eci8<-!)bha z>xnqUALz&C>d_M^jXS%t;jiK{K5Q&5xHi++yYNqZ5A}nx1NW?y`2PPXIG73lWlO#- z7<#aE?6K*6cb_RG|6q!v{ zV`=Kz$M^YtddQx{{s-4s_T6(|8hl*-ZKsBZrr|$~Id-@31G8^Yc+2SPdT1rzfA?(m zUle`A;%vra9?U*$l~`imxqNPNLTvw5?l7|XD5oi z-xx%^Kkbrg*{?9h53Kf&4}N-UKl>Lv`Nix2^?*9Y_`cfIC4A`@j?hIMzdoh<_J1?~ zqAv(Nf@}Fh$``mWiZ9svH2lEvdB$ajpFJe}fMHmcI7&-Tmx^8hTlDBw{FxU-U-0-R z4)#YRKj6V|%e^}5!>)8g)r-_3Q;vmMKX!t@k6l$_<`*b_0R1KYD)|a$bFk4943hPy zEealIJ$j%0DKeBl!g|Dd^`44HiGOPPhwuf1XiRoGLsb z_=|j6@uxz#2&|v@U+ArwpQ4MR^Tc*YzO3;16~Z6DCyX*M2jWAbH&F2#@E6yIPuK>( z!TqIZ5^qy{f`@prbxczq@9;(yBhDSuPdGc)nIfxmhz+O$mg6xyXf6KpTo3zeP`+k<~P!Y&RT z?fA2HH;c9K4}#A{pR4>+324w?qR*Wy`3|GLq#mX6hqV=&{%&!P)Q?s+@p2V!7JttG zUpL5pmo~~*i7o!M%0Caa$n^xD<4^O+vb^RfTl{N#jDJ!1JfOqZ^qv(xfW+g$S1P__ z=2K(izvG{(dR2lK3@#QJ@XrD*`9@%}Yk{pO*hjvs!uRI&6+RaH!S6}EC-JwogJ)*D zd0gZU6Vjy9|7bE%}h(?HC>epH*Z?e!}+S zd@m}VjsGRrH}UeGbbe2cm-<~M9>k^|OHak{AMvC3%f$1{cJi6)D~e<1oA|QTd_S~* zo?hwBb#`dhP&f6CmE9zf$^7o=5aNk=M5^ zv02HFYGJ=09)bCX^VRhjpW=T$9#;4~Nd3}d^bdAA^{K@lk^Exw_<)c3rn8y-Y0cy9 z=I@!;3p>2%DS6-IbC~A`;NxVyUw4Z0pWyo9A9H{Bqw4y40RGM4>U~}2M}9A0FyEe- z*E%jZZP(P%n`WtcW?s$P5Z$bP&+Ah4MHViif8>63*Ktd$O>^(>ipukiO*7nfOQJ74 ze&nt8Hl2%hO8?DE&)Bu!mzsrMt2`|DUgdX8(BUW4{3CYe`q+FX^M$l)uaVCt^ZPNyCpc=2 zqPvJ+c+dy3zVJP>9`Jmseu`>nl>8gX-`CW9Ec}9@_=~B+4-V)R%=`=HOW{*l-$ef-_5RfS4<8zd z>3xKsko_kH_6Jby4Z7mXMK3h4-pTs{lbGjoy&%^cXdhT_O}>@&62Pw0zs$$rZ?j$y z^PB9qBJu8Rv}+0MPk}$c`cd`>^tIYQ5k!6=-j)^fzwx-7uj->}>V25|A;#j8JzhBkQ1K+#JcN4x@=1;-*cAfP~>G|E6 z?=LX&AD?OF3**0AjX%D5rYlb3eY5{QVTI%ekWNQDpZa9v+pq4j z`RAs-LB2isU@i5-7Wm_;(F4?%kWXI_s7NTOzWS^FcB|lvbOXIW$%x?V)XSj$T~B&K zO)>TFzrA(d<&n^aPaYbPU#UAZ?41t|2EP!mcY{|R@lY=>NAOL?%r$ihEye?zn+4B{ z-hN~Y{o6Bc=N<6{SA4o^tbf$;hg%*_e|+zZD0pf(c)kMt{w3G6jk6s2V0K16cs@1H z`{<*aclLtEl9N|HXAE_3I5Te3r55noPm&V?*j#VirRc}kk52h`P0P@b``rVXmnuDb zM&+pYW?E~Ogm>(Z8#3$GYfE>B2IcYf0r^)G68z|A}>uFm$1pIwva)GP9prfMTe~&~x;N|R$ z((0N7>qY!tbh_Z-3lJ)SLIow}$0{EK`%GUbtH*=;Nt|WVjweib+#Q$l}HpZuUy+g7V z;jdU1y_J(u&|Bep!+3E?GusRvels_FwWo&qb-r7}TjKJtGgec-zr$j9%2TH1Eqd$P zj2T+R#cvqpWzCmbIRDyt!GOh{Mt&mo1v&rPODler@$v*PhVeIoKURYc5+v@ zF2^T35|q9|@@JLpteoybFR<+L8w~%Vw{qi3jbi)J6Xier@@P&Tc1B61=}lTAsGEE0gh2Sh`zxT&2D2*}ORV;o_OU%~^{6Alp`Y z!>epT*Ky$0lsUmuS9r5(uNge?_nXicj85M1R^HaM(b}5KbI~Io6kT50m^)2C#@89QFxoTaW=JvhUJlY4pcSiV3 zssGR$iDkcjXF>EeIoIUb8_spu!WxvJES0eY_EPTPi(9;ghdOBsdrHlF^YYsT}4*%k+)^)b8 zsqioSfMbkt>?)<_KTiEo@(s-W29AwYdV-pL`|bFT_%p=sZOpGv4eP@v4)o;`&zjnQNc04s475+ZB{HW2en9z?_;b`~!5_soBE&)nj>vun!WUHH zkIV0AN*~L5#P4+^M%qrp7YiS)?Je4|@8mGwFST#+*WS;Bzm|BC=n<5yO^Bc;(6pXt zirB38hbsK1xW4@l=-qtm?}sa9<-cB8Pk+RFN-rBg4+=k{S*iboJ`(+b!$8l8f0?sf z@dw0%0$D8ZIgNrxg+CxZC-EQfrTA+qek1r@@bar~+GF{rS{wwh_$R-Ye7u4Ep79q3 z^a|h|k_uTk$@@T%+wh)q1e^yk$6NaD}I$K&s5O7F|{w#EF%kizTYpW$zC zKLh70JIHzsUR2jNxW0@B<)3jq@a;goa%rdj7WK)*Uljih|5ETa`cBn9%J#T5?oWF{ z_S?q>&`;M}57+8LA}T-lf_S>}e+|ZK zmGuStW8#lV{LPaq{bTxLe&TfvI`#XhFA&AQ!oQa1?NasIe?+-9UVLMQ@YfpS|E~??~!PnS6!9e-gg{ z|DBC)BHj!>^ad4v7k^&a0r*Sa|4y5)N7y!f~5#2)h>KN zt0nR_|4VGCe+-`yIoo!z=F8l^+~$RCh|vGtr^yF>0{>3t2hmsjjQG-%?GCT2*2(q# zm-S_fovypCkbF}8gOhEly?}Z|%un24j_>c=myZyM(LZ%58$LshSNx56JpOTP zevtdeUlo4h-{_m7@_Z-lyf4ACqBoG|^MW_wOQTQq-mjkDS~*GKTX`SSpVYU-R{IN= zNPnRZQ+x;YfRruzSm8IjyLdlO?1LZi$?wO#kW#?=WB+INv(>0?e~ak99;e;NQ16dR z3V$(3@z+<{qMK#B!pG>M2Q&9`l<~rPkfr(q$cc@<*0n;ee=qZ~vb}+#f?7-OH`?GB z{}8Lc3S_1oJ;fTOA7XsO2_GTvgY_xcZTW%Ut3uBve1pW_m$!+1&={VL-iUmz2O;tSq~>!q9|WdTFQ*rNSLOrOF9W@T zs&8PUApqAPB#} z_)+VL=oiShpg&pvW&RYtRO%bDzD8udGWi6aPx_Db>Ha}d&lh&GygVAEo(S`IYOdRt z2>$7l_3Xhx$8IlYGhX$Feg6P|%l9PtN$lrob2Fcn%OSD#PkrCgK7fx|OH_S6exLQ_ z5%?3tb^mp|1lT!0rr(m?dzAg3d~xi2_y{!~idZ}=d12He0*~ic!avLUrSyUd zud_b~!8E=%b-Y17q2$BNjj%tR#M@b4yO@uKFP7^`yuIs~jgSKTj{jY?zQSh-zhmNc z-XGt;=+&r)_pa2#(}LCn>J`iSA^ok#N0fgc?_2e^!uREJKK=*%3VN!@RO0E3kM}a; zHLXWIPG~Ecs+He6I`N7LC3q;}bm3d@^vn(qp>8%Nx4GXUfcaPb%O3;Y7J0 z-^;G_9fn4}{g^my^=ZNL%*Sq-FVFHyIwZb>{#|~L=a>25qjdBbt~|z*iTBap^S$K> z|3my&@=xJwRXuy!i6>FdiupfJ^aAh$QtwLVdq#hdqw4FSUqugKJ|Fseh3~833oESM zFM2Haui+TqJE}j$uJUQq1Mp296*u1X{b{M!-R3CZc|+QmKeWvteowr7rNQeztEYw#oi=jwjgPy~8Mz`a_quPWtNc#$0Q0Y3Zs} z`@ZZ0-yfa*-GrLjt_>5%7J|P;kMA5w{e4SsbNLzSjjjFO;WUf{>M^8W_gE5oV(R0u z9>CWe+Ofzc@kNK!hd01)b5={eyuS3U!92ZVY@o*dNe_6$mRtp2Yps~@=R<8~{kxf- zJ@(u>y7TnJ>vrY?--*Ac-TjCAK3LbQ;-6L8r%s>tyRnB4CmC0KRym?X)yJ=G^tAPt z-tkIu^2T-4Q=7c9H~M7K%jmZ=sUYeY5Z)N=|Z`#~#!JZgbP$l~H zzGa&VUEuji8Gg@LJ?$y`*QH0I5?{^^jCt7GT0d)k@q<0!`(I=S)?RO~A2GPFx2+#M z|I6%E&fJ6w+o)#t4^;Tm-!K`zMk||tGUe!=J0X3ucdT%4EsSZ~{nNqLL@@vG#6iAIvt$Ga}c+KN3V z6in;w7=d2BC)#@WAHT{$|GzcOn)dx|i+ikhH5KN7-#_lK==*-)`}(G-u+8Zt|DmEU zT6o1^>o-l;&1o2wwCW|B&(_}-6?}TEeL)3cLrt4BBR0W^$SM)9mCu;TI zY?_rlV^q!1mr{evqA3=!lV_YY62SXq;CZe;>*&ythKu@u)bFd6>rI+HriT2)NVGpC zB=<9E^=oziw+sJeX-^LAg_9PptN8eU#WxxUb^D^G!ev^8)nonr4eQqTMq9;R?^^jx z{fMse*L~5FyEYYO&#bITvcPmTU7~Bh2-lBDYsm7~Ki+=G)4o=of6@c%+WV*vnV50t zMgQTquKnWWNA7gK@wepb!zuOtg>UBEwBGJ_`8D6p!V}x2zYp!d1bzI5lrPiU|6&zA z!UE4+d*{2|KU;d#rt}M|@E3|N_5FGYc<0W>>F@}7Ex%sYK$29H!JNG>w-M4t=t%Xagb;s{)3rn}W8g2dt zejq34SeDnl%cdpku)IBD?7rjl;mc1iT594%O{YTx^CG%gjWCYyB-VTdFd_FF1 z{tK4mg5^a8Srz^4N8qn7`Ac7V!Kot2Z+L0!@Ji-~a|d@EXa57sZAZopu4eu?=Ln4> z|M#*7jVbJxSp2^yGrgV_tG(99#IsT11CGxAM)oUgwopIrDSzbI?)-*8vBXz?sQ6(S z^H(?ik3}15%d|Xu>^grN`3B%?mwk(+jd-_~wd2M*#-8m$%c zG!OLy_dQ8`EtrfyJO+CZw(OUfs#z^=jd&mPKlM^n{;T*uVP%tlpdW(|2zMv5ez5<+ zNa1VUTHp5)@7j|-M)pq_Ytj3TrwBiQznqKyHYGaluz`Q~N%|;XyT!dyi=5_u!mB?@ z*YJP&UUK@|@&BlASUE_?UqY{Fo67pPGu_O;RsPqVVjDakf5QKxZ(U#uJvB_rJ)KdA zNQ~q0zrd5?4?ih<`*sq*{Wtned> zuaI~;^9}xr1}GK>R!ui$5uU z)MK`rzfXU{m*9U!hegbM-U9Y(=qP@#8Gi!*vBW0%?X0H~kETD#4+fvh@rqv&+avXz zF>Ux;;PqO!?iRdBz9sKZ>bG%!ydS#Mw2Ai(JipmadCVd{0{4b`2P}*=Xnd4_k!Og9@(I)e2$042wz3KL-glzKT(Nq(ykYQhr~Z*dmd_}yOu@GwceV^D4FY$5B+I5yKmX*zZ zq>^tLeQAiLL*mEOH)cQ8#zap!^^yeN8T=mW;U5Qs&!5;Q{+r-W8L#fl?Mp{k$^We5 z_u#i^2Vb+laR=eyvJ(nV9z-uGdIeARP@Q)CtMhny>XEB1d5`*F=+R0`%Sz8i&)bgD zRh3^-f9I-{U4yDa%HJ3N9lU!0d?@%%^@rH$s=n%wNSx;G17D-Bta96f7S_*~`2Fg` z>2~7(_2PdEzQvY$4ES5o@V)Pq?5jTP2r$0+K10-(Kk`3gWBMvh3lYI8*;jLz{Z+Hb z4|NaDtb14NbT9s*W`&@TX~0&$Zri zYL4JV)lPiB-WHVo=S^GTYsDWZ+pgkOn!=0fc-~hBo&S*d$K2n5et`TGc^>!;g+FV* zHf>WcYvM80F3($H(Pwztr;2@${t$fL7rq$&VW7Wcew6d+?@Cv#mN|^gdE$C$KL8&L z-)w%b>U~guO5yeJ7U3^=KO+_X1`p=Q`}Bc@M0PHYik`t{ ztUh|$cX3ovuEUZ#a|BSC0-O;{XX+qoSMIdKL|)Yk4}|OBz%JA&T=*2uQH@ee!&i( zD)X=6A6i(yn2+IG6u-cFr)+clsr66Ocp^zU3x@HYGeczdHIJoSv=ZS;Jp z_%AFTT11|o{gBmoQ}q>0eMP+FQ;S}K z^_=?0?$v%xQ}z5*{2=I-e3u-qK>rJV*H??)DZ1Ta+Oocw^O@jx;z8f5sA;+;s0cPh&KB>M8C;=CC@8-y4cj4o=pBq=Ha{A znBSiGEFJx*;P*J{Ff+e=mTtHE&~v3ko9|-3d-6}^{?H$U_is}1d$}L@jU&zJxhB51 z+jaD5N>8Bhz1OwEWv!S(g}xlAmj&N||7$eg)bF;4zd8cG+L^njDLUzJyov9r&*<0w zdAhGBTk>m7zSiHh;gYL0;`fKCPtWy_pILV6-;z}P{)y@u+0QS0=4gu2=XSj|*;wFz zwr1>{A4I>KSrE``OSCZ$fwu+U=SzKoJZr+JpFB^!eD<$1;EVlM?YJl0PyFxP#ep?* zDM9ZE`(*!g_Gh2jzeP}Bmwfb> zc!lpzjPDq4sebXE@ZmV{{UsT@-SxBEE0&Di867S7D5vY^ciSt{)^#J8kKrka&p-YA z8~dW@?JrFpA81Kv(H^{V-s&Xq*u?CGYpK`oF8p@U(G^Ew?$TMVTG*03922Yaq9(dfd6FvIIY10kx{Ct~d(byw` z=l@umg@54v&C~0@`61d0zRX@ds=mlJybwJ@oW#H5X0V?jd_qoPp+-FWR~g{_q`aCH zqKEe{`p5J+4eQc&j2$sJN#gN>*B4f9c*0^meCy^16`szRvDSc(A)Dd;(cs@%)3*gn zW^NTdKJnmhHqFUiKhmEt*7)7%uMXv;E&k`+l=|`3-gfwa2idRju7CYH`!&zTp|+Z` z&YRn&r!9W_*U9llV?6x9GUoGLH{SC~es#;B;lr=I;eVfxeuDk#l-(`%$yp2XpZjzF z$0dv3z9FNvF)c68_VQy3dZP7Y?fn0{b?|5D)(C`w!Le-DsvAoH=Sb9BKI+#=L$dYOUuF=H{TWAf_`9J&bkR3 zKj{2RaP9ungBbs*lR_g;TC^dd;sgD))Hl2&Iq+}4eUg3ckX_w5Y48PSKKT8ng54V) z`u49Eebuqx<%{A9PHia285~_aHnAFh06oE5d#1I=?auwhxwaDcf-`{?ciKN`d7&#c z$>94Pk{npR(wk!B`2N-HsGlE<%h+ls-@tj>^_#mV^8F9Wh}9!VY`d5J3eXb-WIxJb z`VW>nc4}%BYPVE}44g6@8e1qFgS-}4|9QUqN`T^Ph zpyc7Y#6#$z&<{AYHD^=wj)~3hfsptFsrbyR|61}Nix9UmNcKp*PK6l9e z2;kq4g?P^1$3H(PdW64Mq--h1pWXZTXKH`O5?k@$WyfVb+jEfkAbRxPoUg40@uJcZ z8rN%Cg@5+_ZLELbFYslDxt{KG2SnDBE|(ewTs{+Oy~r{Ya!zD1n)mnxowKWI1c2R89> zPt5;Q{+k&u=X|AaSMB(N_>Z_hqIWI1lKytW$ItpY66a(8$<9zR@n7-BL{G75dp`N? zKP6uuJ=SRDudb&)S%<|v`#Y`=9;ZH>W2aoIP#Xovn@IH8*eDuqLZ+5Ht z;RE^Y;_nN7R`^@Xt?WLL68V;VIMK(O<3W?_;h%p({b7q+^jTxi@&1Vy!q?z$sd`DK zO?;f+>!*tuPs9tehEHv^+5UX$6ZY4{u5wE~H}RjQDZCJ{6iNLZso$dTg~G2go}$F- ziD!BkpO)d^OXAJoA6pvnYn^uX!(sg6|A5CL3SYseJqexyFGl43Mrjute8v0Mw#f0s zmjlF?@yDWr*{^8tlbzsc!AIz`cb@_8b*77d2i}tL?91G-+-42vcJyRYUrXUZqZ+-x z@C$964}SFGKk@wCPs;TLZwvmG`xiV}bNJv^OA&ZP^w|o3vR|o1@--v1zwhCDKN9O- z!*hSX9Dl^&g-`Hlx1BiiL(JxRf;C-ipCER(%Et^EzieuY$F4mJzu9gfUzB`){LR{K z^hW5V*pHj{*?|o{T>*cizs-2ZK8k;?i+;P=^9!rknFU&Le9*}G`5fZQ*s}u-b0r=t z9jMwX*Ayp3PW=B&eQ7{bXBPIoNeE%FhDEW1nt+kGg4UVFj!Obk2ri)Zv;8`14QO3K z!D+Rf)^d|ln=)tvqPEr6kW#CR3s?(Us|3opw{G2|5D-O#$l`*EaKGogp`EY4dVDW8 zcX{u7&hwn-oOjXiMV)%@@x?aAzXQ)$Y76h8eoD(VV1G4BUbyBaAUf%k*=ou#n9=U#{Pg5JlU^%10} zCw>L@r)bz}cJ+o}oZc_=X}xRT8FVxc^Ar4tlZQS7&xa56&KL9#qxqJ^4W{|FHbf0Q z1@Pzv@FO(e^$2|l4e z+O1`w-huQ@OwR!Ris4)E<=mWHiQN66mtXzwpZcf&*=l^RZavm3{5|mSh&ky0pw8+g zJ{&f;2Yfp3#^*`?l5FfJ1b!0wE5^4MsMRHXe5!YRALHX6K4RDB#n(! zZ$bI@KAY(Q+4=>%&FTpah%Y+A<-p&lcOQ`j{7?O5z5R&nBfRxi&||UuI`o9(Uninp z3$sgPvBZax1B3lvZ@*(NUS{}x)JX6}l2RYd1&Sxo&mMf81?y`qi!XrZi`n{0*MoYP zB_TCZHTtiq9%P^&9^w)3ONh^~zPDpNAv+Lw8S7iq@VVe`DW1{rq+ep|nG1NH@HFwE zRBuE16XMU|Kj3fln4ieM=cvJ-O7*l}!Il%>Z1D0W_#RNNgZlS4@C7La8p8K-p)dk? z|AYsClJGq9Cv1ORrq5^mw7-G;qYLYs4gK&#k-sN@+lciq-<2$c^0{e}&GmSoSTDi% zaq2(%^)q~L%`q!D`&(a~tU*0K>RZ8gvU+>;0}7}dc?#b@-ac1S^35?Zz&ZL7>ZOQ3 zF8!+eE7HfpKf!;b@g$Mc!){5~jDA7rkFTi!e?axOjr)Rx;(~szp=U(o?>nLo?8N(z zn0GsSHAnfj!kf3HISy^AC4=6>C4{v8Uu6XEM`t4cPPiQ=7%5ajQ*daLsCWiZ4BmZb+q zYommV)F1HKGq0lm9pzhX)kcdgqvho`^shrbe1f%Tc2QZrn3Ahu`P+oSS%GQD=X727 z;`x>KtiZ()N$79rOL}_f@v{PB`428vW=P|ZkAJCHvo^4%V8ms6&tvG#V|B*CWub8q z`HgiY65z#YI$=;;{1R#C2cbRPgx`G?dDuSy`|}<1=Pb=%Bi~+}zge1}m5%chUT?dF z`f=gS!EYx;2az3?KB!FT;F0g2%Q;panUm-)MLz+lI%9rIcf;)?FX-HRBIBhY>J0Q3 zh-x|VLQH$<%x7hkd=ZLqziW$k{e2ZiHJ-U1=lUsoO4U7$|@O!O_&vUt) zS4Jh>kjv9y2Ub~@PLs!fGUCl%{QV-`?L13hq+wbXGe_j_EAqS5CRQjD z(oZamX>_JFMuzz8Sp8<5B>nh&-L2)H=d2#|c3M(1x4Y%o%i3CFXWc5_(vdN*SAuVN zL6uI=XFzeCKG;V5LfvkDnQ(BxP`|RFXVSnI=!}`>yaU!f2Z#C#vGP0%=IR!?=;KHP+U6Z>Pdrkr5sXYv!WYn|KheT-I_?gblm zq2K<^dpq#`jO;ocv`oe|h(eP8udB|^)-N4bEl=X#h%d2T*b({a9#xkxQX9{o7&1ub zZrZ)%i?A^3=~#nfO8w2hyFK9N2KeTn|3Gi`RQ1tYI(*;#!>rh^uzI5qPzpWiVqC1y zPX1oce|oRNvAD=ji+%yHPxv)H*n#y!sfk;Mj-&U*4-mzMYeL6D?NtxNY?>-H00 zFmP~a2VWJUjyQg=+shARBEKU4fz#aGf%WQ9l#mnT93qY8wzj{-_<)ilsh8tV)I(q9 zCcfaLX#nE8@*ytgI*#!H*uP*l#%qssT_-zg0nVQ$HThK_hfsR~3y}mAAP>B5xq~o|P<+Q#teJh7}`r*Q6;s@%G zZ{wfkq=sOPxC{OOcttP}{`EyB7ybhEt-uRU1sFQlh?TJGPC5rP@y_ITT)(bMMZ5;R z7ve4W^M}KS*x;X#|FpOBX}(IogDn0d|C7j3zP~_ffPX{0Me+E6#uW13;0NT$Z*k~v zts2^x4S$IKVfJx~hAD#UVF<>N&q2L{qJg(RUkAM~=?mgXZxM$0xZTyb|KxJ%iFfU$PlQ8(-1f4`TXR>vZBAk?^eC?5O%Ceve5J_PwF;t!w?WcUcr4|wuil+~#oA@S}H z2>k*29|-W(OwLU4Kp&sbho_j0{14(E;tSX~SB!j*mk*%$f$H_h*-?H4@y4lI|1q!; zZ+qh_#AnoB&8xpfymJci)j0G^hkl&(|AzfXJp{wkINnce+b@pd9dG^#@sGFPIQ<@rA9K|HxMh|PAsf#J_=WvF?g#nt zVgv3EcoOjxvvUm8zn}8acwXo)!QuZdB7C8E3Gu9ANh$|@->--t5ic#r{sq9#yxREL zbv!T9_d<^VzR8IVj$otz8}K;dZx;U`-j0$XztG5Iw_)fH5s%B`kzd98&lbD9whXr2 zdp``H$D#f?R>IlP{}lN{)Vt&uSUxa@!VbJ7)u5jJL;gu)`B)x! z>qZpn6DLZfQ6I4U3+1bkUzS)Jlgft>UW1M6$MdEBiNJf!QCvIv89|?jIfwBU>@Q>r zcH-q=g8<;gmgxALRR06gM$IY8R};R@F$GinV-BUihi%IYb})T$pUv5Vt1+Lhpgx|) z6`^GX#i`w5_e%`lM&~H!`rF@a1itLX`P-tc%C-LX_Z!6k;Js@F9fXe&-y2tA{xn?M zayQyYcsbvV_7uRkTkfL1b8arHC&})GeLorc1!hB^3p{>5iui*#UUMb}8h)~kGBeqa zF7zY2D@uWW%y{3#KY7Pdzv(bPpn4OmUtO%gV6yEgU@iuaHRP9GT=jO~(A|$X8(;_oHa! z?HhV2f3+3-tvb$FjrlmJOQheA%KIzEN8Z{1e8$YiJzSt40y?-4KK8f&NPtC$TSF(S6EHid3L$mdFZ_`5%KHv-%X51DT?3^gzRozH{tWXe7pC3_Sq)V zdlUZ*+l%M%zVL|1M*o(-!vA1B6;{Jzd${g*NyM}TC#zQ zC}`-!{R@*BzGwM+KD@lA4(lKCMKhINJ|Vk6L--!`KXa6EL6|<*DZac8fA$R5Fie8@ z&)fe>P-0=1aLsdFy@*etf6BpnF4V0-eK+!3;3tJltnY(+>Kq*DW97;4XL!C%r!&HV z@9#z*VEmEaWAvA2^|pDTW~H-qLpSiT1NFJ`Jme!`KRJ;R0DbPG1VJ5XTr73uXuj`8 zKCWlrOpQqqfqn)aHHY||*Vbs}%Bm$ve|fsQ+kyPOHqTx(6Z-jmqNoMF_YKQKfBdTP zy{NaBQvTj|W?`AaVBX);y#_Y$J=Nn^@pOHDlwZ^~+T#pW62)IqJ*ZdS^R#yLpiV_S zH@@Nd&X6?Vd)@isLxE;l((k{NQ2)H)zR4Op^b+Ela~V?Lmys&t;7hr&WgDJ|UrSL> z{W9sLBj&!oef#fcMc{kX%MY>`QzK@%z7h3_%MR+a0w+sCOjW@`-4*S(-*T-4unuXUT587 zKHbPCt#YXd&nJZ`0!>dL9*vn{6p$~Tp%->`ytmk*{eFI(Nc#4$QC3?Z;t%NaLL@6I zQWiPKMV?#|qTICP8uIN&UO>MBf%Ns2o(%5XPiwzinpx!&kv4bx_H)g>z@smPZ616` zUa!u$=V|7gUtil7Fe1m4<1FhLduByQL(8{|`mY{Lc%EykTPu~c9#2)xlvR^IA6=QG z@NEU2MlTO_Wc-qCdyn--wVqfO^VA2`dG5~nz}Nb?^vV^g0~4#!PcUiN!d-DFXAb%jG@qkg#R~C(|7gwl+ldV;&V*K;JlH0e~+rl2y zRi{_45)W*;Xmu8$J;k#;&c8|*_`#vob249g{TTYiWmISM-_5NBQ!#1zQIE#(tou+% zx;=Gzz2EZrE-^sjsa{bx{rN8wcAin~`#i|nNPNdD>Ii4m2z%hv8=qF=`L=yKAnY4^ z{*aeP*B?AL@3sHDsI2k{;9i_}{#)@p_<$D@&lVq2N=KTm{N9@=xm__wA3rAcWbsJ% z{!#V&|8pf{*Xr4^GM-C_FIic+3-e=E%*H2K@r&Abjd>c^*L*lhmn)b9or-VM4-P1Z zTk-XbU+i0>xcY00{=uUk#I3Iqf3ZIuHrcUvsBJ`jadlH!tTt{$M11jaciqH#j|BWd zlj8#&7kfwb)o&Z6&KPaEsb zoi=KdvHxU0?&B8^tPt;j9|+RUl$D`AKs@}n;4{z<^bgya)3HI1{R(T_-@Ae4v;bKR2oyO107xcxq+fm{VJ@P>xn?b7MCQT5#nSK@hxG_CB>BR>4ANbFo zUx}zWmJvd0sK%mDKAeC|+iI1lZt12(K`k<$JvG4B4dT#s15Ko%z0q zSE$~hnBo`2S5JHyzW}}82;dQse+T&=;u|!S??t?ic$>v%I3Dqaw?7xfYlyGV@9lr_ z8R^r#@gt6B`gOz`&IiylQoPp}-#N?MR21(aUO~JkA-(@~JsYui~ur+N)Et}BOCpc+4D+7d~7&)=8cf0xWCjg z>~GVn2Yy7qBH(Lh&XepIOvFF%Wdpwt`GAQGZ&UoxH-E@ZK>iwfPfr`Jm+&k2G5B}z z2j>bHenx(X@bq4~9*lS6eFWousEv=?==h$f)5XxEM<)FazC}{Etp|G7RP@W*)%d#y z>kDku8{qd)O)%MDsoN%cuOIuJqko^JZo3%e4}Zz7r*Z@vzhg^PQvd#Mu>TIm6N+VV zSWj9f;(jIW?V@}-uE!pc#IDD^o%fxNzqbRwh`tJp!$yArI^XN)&x7NmO7;{P8+gM? z=RCwhh5xO+3`e7v@}56@Ro z{EPD!E7vl7Z>IGY_HnY$$Q`P0KS&E3v2;y z*ga7>#1BZJS82z3y{$)XY&R)3^G}9-g?>VK{s}eozWQ@6zP*lYIrNADL3{B_CE$cgZeOf9&T|s z;~(xuoeoXo?4$Se@b}QKb_?od3kiQdA^nbbzT*7cs9UtY;_vT9#lJS**xspsH2YZ`?P3Rf?xd&oWt8}dW0Qfiw__!+G z-t*Hy0siKC6zU%sJ|%rVyEzmP+EZm8$I_?hYhaDJq}+4%`y zlYhbQ5nlql{Rf|b@h0Nu1%adg@ciMg36G=x|A5r3pGf{2HeH`x0(l1Y-=yn3%#r`# zxZ1w)!x5ZGVvt}z9r%0bWvg7A8jK}mXXWT>H6BAfgTY{7QhqRfe+<1n_2b6hQ@!|^{5G((BB6W zzJFG*#Tn5rFfaWY!}n3=|9U8}A!1HsQg2Ke)$8Vs%SXSt&%{MV5{B>3hdKheNDuVn zLENE>IUyGG8&q4i;~yR%e($Hv1HP~4X1QFRaL1D3pfDVd_^mnk!Ulij2M1^iO2H50 zXWheo3k^%Yd|G>8#C4;^KFjr7i|=iA2JMZdi9i+`(o)&YF4Z#)ti@7NOf^s+ki zKifAtX8GW<&2jwNUho^xH!oa`{pezsEID?x1<&v1fxqciq9438B4gN@N|gk9Y2Oif zra<_L3Qvag-^r%+OJ~PQgXYcq_+yuc@~3+3zA^dekC3q=L(~#p(pd}5N{MYzqsxPQ z{#Vm6#vKEX(iCRF(~_5{BNdT_Hg}J|(dR`O0^t zv7n23p{Jjt+qcI&GmSUX{_@DrzYsPvuqY7y0>_@2#X(O$Pj_I@mB2{!Cpc3wHLc~F zmsOjK5Bb+~#_Mn1mLMO$Fs3#1U90f!0#B%aw`0|}i(-B#toAqA77Tm2*{@;MiN#?n zM^vA#=MD2cVmRS{)pXJRO>OTm)zDCzDXoB1#QF|7< zLs_P#vs^9_w0nfa5Eo)k8q+K~pS|u3S$Wz}^Z5|>n&Ivn z^!MR;rRMVuX6zp*4xr;FwGK|pwWGg{&ppxoY~zXW)tdaxMbDYD>s~an;}eb;PJaHh zTNmcuP2=4+-%XJ_J1QUO2KqV68@>ryDIi|>Sh#Xw;3fOB4c~<4+47$avJ zC!AHLSrHF~|GSmL_>o~HIjOmZ{mvf`4!9JF=c9WP-#O_?!7Cq)Y?Z~OpIBD+gZWFz z4^_K*{u`XMyXD)(I?gWy-$P`xrt28^m;)g>rLomTCES&(b#-a0jxExjXvco`mTdmZ zd)sIHwDzlYnN`4BZ%sJ%mbl+>`^Zamr_IY07tEjb3?FE-G?&jw*?0te(#WE%wGYB! zr)b{}Y~W3E%U-YR{ikI`c}kPrFKlwrtfApLcOB;EjIhrhc5IjmKK|Oe3e4ZP ztOr9#PhgN#59R#a+tZ*Y@IC$BcH>3!&embUzj22ySwrF#u{qoTVa6-Hr=TC`ueBCu z$-aYraYWZO(i8Yz9f178Z>p8Y+#c`)K4I3wvBv7DRj!ARP*3ogR4b4^KypHM^}$-K zf4q+L2TExQr|AIx-_gC=TAF%!H}1!P{7~vAkD{&W)U)ve-6_y7GFwPTeE{N>g3KiF z16@(y$}YV*Zf%5nYdbdJ-F`PAejobZ9LM*5muLKdAgkxqotJJy|BwDEp1yiWA?XdA zziwLx^oMdq!}r<4iV#18FG$EyVm$^waHL*OHu5E?-)DFkcwn8rH}e8W7;$7MBq{I3&?MC{BhF%>b>z7hx`P^(*syM_6NVu;s=VyWQZ?-rzyXI z{Ppq>3F6fv#24Mbixj`*_#i&Q^Zauh@nZdZ>ZIN#@9~j>n&OL$k%&i0pGxOLyh-@z zPg^jny!i~|!~6P0-~c-QC*ZT$;0HK_bKpN%Jei38bciQK=;0B6Qa%dt$tf{_`p2yd zk>nXEtJKJjDKPJW2{f; z|Hajk9v=GnJR7bzBIz;H)|Dh$v%{SM?RkP z02Ghn`FU+6^qIIG>=ME7N4${bZ{Q6s^m`z@lweR^0^eq^M?Io^?i;8NFd#lTEQ+Ip z@V(rP%Hblp=(TD;GzfrwUp^E3gM-FJ#9zoaQ$OQ4-qa{o625zsK=q3bir?sX%1;*x z%Id7T2h*Z>;Nc#54&|3O1k-$Ac#-%52lC&dFWDmSjfw2XAT$`hCcNB`ul~Rz;;w;j zOZKE1B*3Tmo-xjArxy}FXZH(Rns|H997Vju0YZHCGmzx@lZ{0P#sN z>N$xIaDU{Zy}fS^>QfB`%ip>xF@55rm8nyW#X*fJs1Jedn+U!I`VB#I2FEiSd_Zy8 zrf&Sb#q^1vFY?js_v?U^OX|hqgO*8O7=_*^Z-7FE_VD5Kds__*DFcgfxmAD z-@z>y8v~URvvI$;9}it$>W+Y>K0f0Y+W&`*BOY`_*t1_B!fY+&vm8?AM#R@NuFc^X zp06Z6gpRisj|@ghmA7aZ~Aq*UtcZi&44fMBL6QJd%h({u%C3SeGK##UVBgK z>;^ykT(Oruf8UiK(fe0l@V*ae(^>de(igb~O8VX}o*(b5z$e{j)BJFsauFW^zTpn| zi^zcb!e0X)GTR+0LH=CbJg?;!*xii(v5#cj6$#OzX!~fs;kZZ4GNkuaNJp*D+u|?2;MC z{(~Pte-HR0TYW+fUD;xvdSw9Yio&f7P>V1HR z)yKa8-^}!P#Ak#!AMj7=ytXWY{7Ijl0sh2`mx+G{|GHdCdJhx!r^frj@fgQ?iS?b< zBiP^@;C~FX-jhvy1NejnT3_gR((jRf#`_`t0FC#p=QzGk-`Ceq((FAR*9)L7wHqFH zSJL@e{b03JW;iawUsJt1^zRPx7j!)3*MWD@pHUo*{V~|}Db?QkI?AWh{>kJYDZdW9 zhw&(e$A|fWFL;1)#0USoAF>f2c=0s%*o)U`9N!PpeG~D1Xg`!JWt{m}s&7I(g80Mh z?;eU;W=G|Lzp-#h9@ic8BSHM)y(I94{?=`@B_a0@tp}h zSCw$0C&eN~zRgd2UUMk0o}U$drZ*h<`~KMP-bQ>|k9Z&e`THR4`9g;R`>C%wwP}iD z$?mYQr@&`Nn8mT@Rs}w#b;4KjtgXbuJ2eVeO$kRWswpuNAXDlo7s%{=ZCN zw=HTq5y2y$I2!%R>`z5jb?^Usk_7l-e9Y3qvdv~&#`QC8zSY3@VaA>LinNHN{T}#p z)Ia;m5x?w&3;O`~FG#^}b0pFMDeV60-1}>xVT$eBO_|ph41Y!jmmh_!I z?$%e&zl7rzjUinAV(f3d{BTlY^@xV&zmpEwKfgtcYyNtME>~@tD~(86Li_0ff2C|L z&fg{r%E)k4#u)x~bx%0*?Z_|pjy?8)Kl1S}_n#SPXZ7r}R{H_(&DU<+la}yZWYYXc z7oe|)ett}0SzZxuyI*%`@X3~MQ^PX3>JfHf{@BVS!t<}HrdvyMtMYr-99_c4wN@?* zo36Z^>$ELcryt7`o>vvv>JQlMyVhMmeMD>3n*Pt&+BakUUUMeN-}G$#H{oZksaCt> z*6*(jaSOn=Qh%$B^52z7bNyER{z2EeQsDK7_;p{F^bp=Y5wbkTym1Zp_E#Pc@GlC0-i2Li3jR!;XJ8Mi`VqLR@%h(%3Fn+?oqpmX$pG?h`}%{EVZ` zercH(x9Zb#F8zFh%Pu}R-q6r?AzyDja{26y0Yc%O&S{bD7xF7U8=Khq`N*NhGxY~^ z@0|ZYUy@#vXX4)8d(2~W+&TL}+f&vrHv(Tbei>xrDjKUNl;oN6IQf0Yq=lSGce7fm zuw_0~mE}J1Tr@YkqR~0}`zKjH>ciBHDW>c(dp%ank5ui|%;4Usjsvn!*H$=IeluU6^VhhVVF6r0)T3I- z$|Eo9_r0Ap_u`muUp?3ldXkD4Qcf49JyjHD6007RLq9U_m+Gg(zIF7d<_>pnl{9~y zqJy5msOJ{M&A1Z-dsdSj{@L-pYLGAL3vPXtl=zvoo);|RZ+IS5RxdjQ{YokH@1yL6 zZ#=5EfFICV11$>o2;uDfPNxKXna)%gB%2msNErU8GHzLEY*WpraxQkNDx80f!}mF< ztMOAU$6r<%&<`5?+^fkKowDJab@?u<_#ybav0+QpYik_G-3vAK-~&puy7QrT74>6^ zTnq1WutzpIBT!EO{vye}%mF??cYE@cnKcLOJD0CNG2_fkU2t7B)=b-j6Wf?A-xAAV}-P{sZIulld>&*P^~4z&Bo&AFuyF zT(za25$m0wFZBJ-RSi?CkKcQM_0dP`EUf3z56sZ`P66=)&==&-v`KgFud{+b-627?$_=4zoyWy-1@eTK+QUbmp8U2EhFEVxi_As05sDCU6-;*|!3vPE|J%4oa zzBZ}3+{m*fZl-k9mI>}!-G)Ix}`aJ0qV`- z(C_RC^qSWSZg}&jzV1Y)*zJx!vsS9k%<(yv(g$=#I|L4ycUtqPNcpdv^r}sjC2Y<}^7fMajj`zU-qke(* z+ZwkvnJa%(hjyT@U3OpeH{FJ-LMEmdR!-LLMh*d_z-#kvXP&s_>ZfejDB~d|K(=0`-6Ugwb&A^#jqdV!>;q>|K~{ZncV z$2p57GS|>IMY3`HMXEo@hThGR`e_jGerYbghlk=K3G9%VJi+X5;wG=mXy&~3;rxOI z-afBe2_=U-$ zN)nm&S%@|#r$Axf!t@wqBc41&^G}mBmE*==$dyI`FMvPjyf6pX^VxuyK;g?zh<{32 z8!&p>WbJ0;b9nBJS2tsW>&UcE@%I|Uhlv00tLT10Qjib0+{l}#p8z{Q@UV3(_$=h> z+4yNCUBA7D@IT$Z!e;YFPZjYC==sT>iFyo&AMmfLfR1lE9kf2zu~o(QstkC3K`B;Q z*4$DdTZ4WMu={D_|C)Nb*r!qSaUWzh_FJ0Uz&ls8x`?0X*Mxot!2hB+FHB(X&&okB zAQdM6_5kw%@82jZqV*u<*`f44eVb0dXUG0Z*nazI7x53i@Gr&_!ap?!as9+cz`s1F zmZ)#dMSp0_uckfkz0c0?8ff#*&pm(gM{NEwz5?}{y~l)p19OZ|Ko|46^G^4 zbPVG(&D&{xNyhp>^Of`rY(0Yh34DV)3G;(&;Qds8_`eN)awGVMOJ4qg<2r&w71p;K zQRpX3>mmFB^{@2u2i3TLETO2MIQ6{E3IA~{@I3k}z`uF>D?slgndia&7{s4@*F$gp z0`yG^@R#)W5q`vvUIX7w>!nFVzfJOo(EFIc7rYI=k|j^i@#V*RFm!OWk! zPYoZU#QG0C7VA%f{*4`km;3ZvxZmg6>%4Xj^B>~0%f!c1y%qCcUcMIiI^LE=dWK+E zFZmzfZH&|Rg!Ra4d+{yZuh%BL{)hkSJD%nP`fcL+pnt&rsg#eP=Sz6q7)p5C>C9-s z^ZW3(n>G2U2YAHzbJ)Mg6@TJ$_@57dNgzJB0sF;+51`|tz`w$O8Mueny6O3#-k8?Q^(|o&83w}&tc+<~`k|DzL$bT?Be-99Jz;W%l_o$wp?JrC79r>0V z4TK>Q^>6TR0VhUYdXM6XOdRlt@cmZoSFN4{{*-ei^vdwPpdO4vzg6U$!51K&^CVco z$2OS9grCBCPyMHg;eRX=TWdJO_jjXK?lc73u|A_-9P#4aWa!EM;wXKq_C!XAC3Qzv zvav9=AP4>SA6@q)d=GtxK>Ci1(Huv5eECf92?o+<9SBGKDh`}km>(EhHoh0}LK@Z2 z<`tR)IY-Cm=Qe~R{`J)fnqcSwf2vuBrfqvmL~+KM>7$deA71Qh@$a9)2jR`%V}JRgvW(UXoBRmh>z;Y~dZ4>g zx8wir)wfKam$cLtD<8jj-L{h6$70iseIxaDPNtlZ)nI|E+^nuN)( zCEW>@+&c8Ub`2WP_JMy21o4gjzj)b zH@#38=-|UbeHK#vWbSS`G-slV&l_&T|ly%?v z`|~^pd>(GxX|fgpucsvYTUMXnq^}(}p?a}2a#ltQ@cfOF0l@G6sOMilV>N$n;f~?& zU#ybzFHG3F{^&6=5_nw~ZSVN~bDzC8#9c-w@Orqhu2iEsO&Gr5&J9F9E-IdX}%mjg8a$X&aS#(r7*Gi@}!l6^S3qn2;pl~ zJ$|bHe0RXTN4Rp%bGjkD=FOP%Z(p8X2|c_%_>u*B3vH|QO0Ij5$u*->AU#IR z*?R@2Ra|!34CsT>D_6yweo{~aej#$cC&9An_^aBDja%^#!{cY0U z>;0M@>}pu~&7v45s-ZuWtAXEv|Bt+!ayHLWP&7LBp7~*2b#ui$eaW7Jvo(J)ZMn7X z#ONy-U#^~AB~9Xt@z<>49nAkZx|}_+Gp~;n3SQ|P0KRKZQ*{v%Er*8u`m9?eSq^@{ zQW_f{KhhpDwfRfp3!3ctVH}q{bdb)o6a2umu%+;y)1s?(K78Z`|E33D5Ep2VF?jMH zSCHN1d^(Kde;%3?;Pyl=J@8yi0_rEx&#6^iO+NJHQuoUH#P8P;JhZUiEm0F9=&;@7$2~zSA$JYZvN+hKJerl})LaI{P&} z#QNmr2WD_D$v!rUJ0q7AKdsFJe!m!abyZA|wPEq+A=sb5qOgoGUHQHv(E)xym&c*L zV(`wxF#`(Hzz-l_g!+N0!qp=i+*m(-pdt2Z?w%<=E88b%-{pQt)lpox7 zSH2nkmfFRX4{;*i>$%VDEG zcqad>8u?WK92Re(-#qzW{Y5#&TZo?uGr^~O_1(8n)hEY859g?i70tQqzc!!*@fPAIpL?7sYh9_M4nYoG^+ zg+D%)@hclwaCALS^lv=#G_(KIOI-B!(~1vOd*ernpAi31J_7ka;s?m4_>IGUqrn+H zgwK&rVEStg9|0obDZ&?K^fz9#ItDvX0FNVI8%KI=J%{`_Y{GZ6AGqcy;inxwz}tlXQN5z~ zBfOOeJgam_n=^d8`DN^9T7dnF43}LVmQPNpDUF2wv2;@-zAxatl)S>CV07-Ce|4%K z!+UwfsNau0<6%M6Ye+lvoOl96j1&a`jyDEU18uC4k-oj zo3CE*h5a=6hl?yD$?Ted-X+ENQOjnwNPG{lRl2;x-u-xi4`%!~ZqicJuko{&TR%S9i+;{ULv#W+O`-0L z3y$hR|K=ih+Jaq%^=9nzBMr&D$OU5^A ze(RcXGESeML_EbUUG~;7>IYq<3bPhFj1AB$Ji-cJoNcCqKt1Thl6SL{Dee8R5q#5}G@=^Xs_FzjEYiqHDrqW6{J^Bv_ zt)B-z74^s98_x2}uwOuJ?{Cl-f=`G-KV$G;hL`TC1lW({j9*~-L(Dqp69m+cRZB}V zH1Lo3-lK932XS!$vy;}a`ic7qsBa;E=NgCak*yElzj43eZ?JLHJFt2HJLSt6zd-dg zb}91dZ-ZZeUV->RFCPFrH?sbD#{W`-G<;teXZV%)8lLjKTTmY%q!y%2etXrdP6Pa# zhwb-UP5cGR|F)nXL?ZAy)=%JF@aNHn%v9uu^`&i%a;%?Ne?!$Qe+>Q|{_KW4#~$l+ z;Cny2t{Lk!^%te<5uP9)%)54N77p3fkYOa$N4y!CMf_}EOQMiyc)9QOBJ-ro=S8vHs(`w4YOrD)JX{t@^Zd?WY^>W9N@)OS{szk|LD`t?8RCm!Q@ zvGJO%!0+hKz>z<}xYz%2q=#d6yw^Y88otoN@OcgDjU1yCR}IjY;dsXHJAknNI39cv z@X*i9pFtl_{@kDH=h*$>`jG$jr{@R08TZ5LH*%}-eGX3wM!o_4RXO!W={@COi1bj{TcIx-y=D88S52buO`0P*<))(y0h&Bxe&#d)6FZ1;RO)TP>EznO= zKYa=J>yO~yNG}P!Ao`o&a#Rz6-+%JXhxp>@SbqXejQ$CD9_#P=r9kuy&*S{ygDxQ( zpyHe{=hlU2poff2MLiY#73w?DkAmv07Ddj#LwLSJPW4S``I=#;u5Ttx5-OoBT z!4u=&4O!jr8`iT=d!9u_NCFfv-(K%-)8xI1N3iotEIsARBtcP{_oEopT+M+{@&MSFB@Sfd-I-% z`hV2lhb42D0)Yn`qf+^s$lvQU&xOQSOC3~?9!2%{T-k*9@1(=?7oQW6zt{REW4$+b zh@Nj=<(WP|XJ=Y`m1W%Gy%$8}|5B6TPa>8sv2HxyO!|CX*oeSXMOBfQJwGX!^u#*S z-&uymx=?@d@8s0C;D4mNA--_y*}ab~sAtyY23i8u!h+yaB~u9BgTHuYvO}V{ywoKU zzSpkILp?tB6R6uOslIi1Mq*7d;*XGsUu(M`Q2tXpCdaOfDC-(d``uH%^gR4KU(h;# z{wu-fe#|_`vlw=2L`$oR+?_LN+`CTd&0Ss26dQuVwSwr>CJSdRtz zZtP!Qbhh4{F~5747Ww*Rssq?>fVVGt>zDmu3BYe!`S@vRMInAR%_33#th+qKnrGgq zRxX^MbYSYq^y+`AO05l}3=Hr4M?z1pZ4G?adhp#_H(xP4UYhaW4Pig;=@=CovH$*} z1O6v7PQ4peu%}~REcgi#T|@7jdcXgX5gkue%@L!Yd!A?beWlgpUlk$VJhH-nM(w8~ zx6iJUN5sAN#;>`L+bnGtwyTV??>48j&ma3-GoRLWVMpT1(90h+D3h+YJU|ogTR%)% z%309Ca^YW2mFOcgFYQ{tx$ycw8inPq`E3EFBeyOOTdqva<(=6>R^0HFWL?>--)!yJ zR&DOl{WdGaJ@NL>qnC4OHZJF->&yS!UwE$N*N{=x%)p4O?4jT1N!>?Vu7>Qfs{PgW z$@70XppU!v+wr=0j>@MNe;-yqv9XrMN1w+2nReeC{S3D#f9<#9`i|ww+b_;uwC_J2 zj{Byy)@2FrFNvM1pEK<>b@kexzt*<~79S?R?TmIs(S5DWe3wY{XDnSqssqz=x@Y7kRBn=z!(3he`?F9tjnJ-Yu(!a z-={jNx=s!JM;z{d+36>jXJ?Q2cChD`wPDT0PcQ6y^UJ4x7{BZOSAV%kdWP_&d1imZ z$M&oGfxm-aIXP^pJvQO`e*4Zlcb>a1=#zM}umzt(qGg_No{yk0Tm#r5AM z%#M}Mm#%p6hgInJfBV?tF8h!$nWR&t{I|O{ZRIx$btX>2S>)rIhj*<9U+@z41F)RD z-p~GN?Hw(?k9qo>!x7GDenRjo&HJlY9C`WF8*iTc+fzM@TE5^PTW%dr(LpaTCAB)D zXRNqga_g%Zy3g|Jd5P38QX^JWHyujUSs$W)PWJZaXF3e{ey8~w-!Lm;-V>L65mW&E zK&;O65&3)jtl{@7!S7AcF3pQoxCaYYFL<0-52pA|-q}8-IwaGuq2oczjQLrsFB&BC zxsrJYOT-f551Q;gQ9>2z4c2kQ7yM$_gtTs}#;bJJTzJlA@M;J|HZ| zkh;V%)_o2A8Ne3|@U0mRy~HDxQd9pq^aLSYHDAcNq8qAwl>A}+4bY-K6#beFJ^X7s zzz_Iop+`Wz*mQYPC-DP*O@XrY@fYilRXiU|dIFy&g>qS-Gqp|}-oF6(EotITpe;N9Q7YnuV!~6p8KRHitLKAACDgK*(3Q$;_K0`FoWeo??+8-5dR>*JDTmUMEak<5a2Y7b@`1^C4 zpf}*Tb?e`F<3lUrfg8}{(f)$KdlWwqzmSuOe5Sjvzc<;8UzpgbLchfP>*&X0^7r;5 zGB8^Po8mpvJ7PRJ9{F$!XZkLw;SU@9$Gg-|4E?M~Pm1`$fp{7I|9>{F5BfdigZlRO z8jNfZ(?cMCME56kvwC{q^JJ?H`gJbdRq=XX{cNFu;zMV4oi|>je(Y}EAW(fM#g9gt z`D{Z((mz1KF5NAnEuhK&0$ zr4x2XGV*J=jtQ+I4}47c9R8B(`3rtrL-8-(w;lOzLHa&|OTdNjZTAN5ea68R)#U#R~k^799vzi#l` zi+`YT;E}D&AeSAx| zv-Ah+1dA<5mS%AzX%=;}{50wjDZgI;{s(w&0Oe^Z;&# zN7uY1W#i{VuLN4qFAn-tX6OC&?#xC%LDLgHQ5b*87LX8{B?G>lFN!{qiygzYHRE0| zI4s;J*e^J0u|um39B)}3CyBpo>IQ!Pd}J8#e_#>ciuw&n8rh`BG^=ATz!you5x73@{YfUg@bSl@=p28!FvOI{3nt|2hG*BYzu&28*if~_ zo>vb1h3BKqQ(jiYZZ)~|&!B%5dtQg2Co#Exuk~F@&pWW}yZF?trXACJIs5oa1p%f( zK~qzq2mkC%amLB`Bs>rB3G;@Rpuqv&UxY4i+@YD^S0VV|>3#Zw{|F>}1N_DKkeNb} zBHAn#5ATP1+oB=9M*GD;dS0%f0{EA3-D%|uw0=;29DGe)h%C^+?vMAQ`S^4q>Ti|B z$I%{~@e^S$o#!k{&bn(D>QmW#73}q~HPX^q;sfX`We07%ec79GCxDX?+umgdotQ%iGK)B?hJ=N3IJdA zjNvm$j9*4~7x)Fg6k~g8u#?*vz6&f8_ylcEX@oPLw+}#nVP-?`PW?B{>qO$`cdO^}aqw@zuTAh*;1_n*LvM$IrnY0S#VGsE`sc8|VL#+L@A`oLCQe>> zQV}$W+0OkstQS&Fj{dsDH`oj7pOZ+riFz)z0nilwITUc#4TE9P3jpY_SupDs6TLV3n9s<$G%E>lDQ&G0|22la%qIMT26T_5yk zg~XR*JrKEoDZ@`aKMwhHE`IuB#=lU1BRnrbGO8H|;Qq1SJf4RI&kq~MBj1j3&0Ma* zHzEn&7t6n&79u!xr`B)Ywa17r;2-UM`V`l*cwa3E!0X7bXIuwgW~oDcCGE$`MK+@z z0rgwJ>+ny|Z_#p&cxW5+B`jZ#p9dce{0_ZXD)u|ooPj@qeK!I7-6>@Ku^((oH|FDA zx&KEtwjZXa+z0mk)i;ks8f&D*vm(Jy5q_urOB(q=`B-V!tZ< zp3-iXJwgEi;=P`PnK@>qqjcB)sYzHb(9atE?ny5&7W<_jew1RpL%!P#Hgj7j;!E_$ zSC$3Fn%@+&H-`YWBI5Cv5s%CH*caa0y0@hJ4}2fHWa-9p=UaOjzNh?r zT+o}nJ=o9rChCPp1fu@lELI$czM<*h6x~V9T*CX#X4eDK7l$GL9%zqPi2nL4e;>9S z@5j!E-WH*MN4`-zJx>TM60*e;dqaRfW+dhYI+XRDFSY!!OsMxjzrk6-39Zg7 z?V*o4#uVjewJzEmdJ_41Re`;JdQpCcNBk;W?)mO5tumISsg*5V&J!LeKpu#(R4l>`FG5hH}9@lizeF0$43R4trsGCcb|RU-_m~ROI7rs_QEQ@ zw({KOaKi7)stYGr-wiJANJqUr@cXa?`g>geg}oBPbGLsTE$j=L+#oGokD*zB6lJEWg!rA==M$w54{~N(HBgR4yE|s!1<-?f2uV9~7MR zLQrqN|7&r@-Me=DC4Y`9aQnPj|F_37``_=>jt=CxyqM6*bN{UTzQW(zYC{eU;_`S)W5}tYbJRF~+UP9K8Z&6;jB}o7?(d%3VW*Xx!mKnQzy1{Q z1H&9@&Jrgb_y1UX_kbqOw0(GTfCLB{4mPx?2?rSzE#N7-Ruc{dA}VT^*X>d@97Iuq zVh^@&RVI;QWYGrHo}`*Yv`DRjRjBnqh^_^-inP0JjY0@`Kt%)()FRC9dWP=regFFY z_`c77y7x|)OlF>Wp8LA)>%N}xlb(KRfBUyHbRN!k&QvghtZ%rUA5M>_rdp=Szxc7? zC^hr`jgZ)Kh0%4$(w)b8xbpv1qhbQSORFj>bq$4wi%C?W6ScKXS8y|40LaZW!cH-7_Z=`EuV+oi_}*=RWAa{J~e? zSNFlsfbawFMn1SpzE72*=}zG1+TQMA4oqiwtz&-;cOJ~Xe>z8ArCxs__$XCT`$6lS zd#6??oeV#T|9;}(_u=1v|I~^*w|h6l&*_!t!ru_@NBY$ZA7u-VTE0cQkup13!>@^YyAX*`xff+EhB@$s#rDD%ex^KxtTYB1Po1&}utx zDRsK*8GqIB`y0Ip9=yRS(SJzz z0b@zJ1p0`d(w@SPpeF9lS#SC^XLrG4{d4paEPWSzq96_R2j~}Wx>g*Ssml62eFRll zuzJ?hkF2-8nL>w-HZ;b)%Iti!!3llAv^$LczbNNTRT@uBfxo2bW^>1?V0rtET8|sI zvnpw&;&W>d;~ssh^VxdLk8;`F#*y@0+L`A7T&oBzo{ z=m)-ZgZ>uyj`$-FIgpR>puYwGKHKRa`v3Gj?1BEdSe^X&81ARb&`TxSqJw5x*Z zw!en_3+oZ-7e+n}{(_7DZf^e|V@s*G5_$yZX9MUzYv&13pP{k-lKPGCH1ajQ9DKxM z#7}Q~QYJjldhDM~@ZQq|;(ygCu#J0-)N4L@oPhNZeuhryb7x?EMm;7J^&I#y&LGF3 zM@T~Ka)UmTRe_KH4Sc*n!%L1Qc$)AB1iy3RLC5J6?vwgB`mt@S|khq#qZ43B&q^SJoWXAdF0Njq;_^kK!n%-esnD_LFC+LI--rHdE`I_Z zf9wvuDDn3z_!=q-t{%qKyPRjEN&V}Sew>fs`9kQ)alc9a%lW@iC|7WJJnSy;IQ)6h zKhnnGanhe|4eDZtmr;60;_qdVcq#jql3;8SR@ig~)$a>8u z<5fgM&yD)8`uHF>ev#i)>leFt2Tu_E54-_CP>XM{p4Fvl_`pl3j|&+I_@hvb2c@oQ zE(wXHg4``+zqIB*fVTo=D7LHH1=5_i2tGz!Qr(i&j_bwwfT!j3W#m5!>aE3z7gZUE zfoD62e&YIfOL@S1Ca+bJ^g?yew$8}8JmAA|bmP>__*lOBy5c|h@p!{L7cVyp`Ar7F zrv&dc=+6y7@CiH{Au~x^!qxi1TPc(M2)?C-KG@QYAKH}*zn#nj(Wu9AdhYtVNj$`n zGUx|@_psfyH~#)WG<`YAy2|B|6LM2N!mduNgX_*_nAS?FFP_LA2TdDE+W@YhaT#6 z;4U54nPZj1^fc|jFQkAiPihT3+UOo@j_w?&pf-ykHj>6*?ewZI#0Xv zZ$k|D81OqmKZWz5Pe>Xn0$)S;26sPR>g(H#Y!5dcOE8}^f{nVHMQs?*K}y2cL^E%_ zfqu&jqNlhV)e`R-uicaPc$j~XNHN}OzGM&hP|#l}$^OhdYWk>ctBzKg@c#I{zHw1( z6g66{xu^OH@0Zes`T(9k_>_n0nybZuT7Mpu&NuxP_}ZGW&yP0x>m_Es)3?>T9ekQk zqRrIKGq_iG!;b^;NV-G_zR*M6qJn>K#+TmEfB0a3o9Y-8ys>_HrC>fF`Uv(T;Ag@o zTo$gME2Rq7Xu3pr-!VVH4b4@U0sc zC!9t#x||`+wKBv_LYS_aqdWus%%T z_;C`uH-0qi-vIwavL1$U`f(3+)zCA1ei!K%*Ao5``WD;&)U(ahDb%xZob;Px{JX)g zMy?{UyIK)V_>8jJK?iqSEezuLriNbb^JM+R`)PZo3!uEt($`3RTtrQchg=)=am1z= zzEUt{%PD*Tz7Me)c%BlF^_s*V!7msC!0V3^$h&_o^ag1-QBoeg1_Ti2%n2M;XJC5!I%$#pS|iQ-P}H0pWm=yAD55xCYb#p z?Bg@Jjw{dbd=Q5RBR`YoU_V;KkKGqw{j>MNPkk<_hdd1<{ak8&=kt_20q56ryV7R{ zKSZ$&hO`(j&)tC^q2GGJYVraxo(2|_ROFWlc@jtMpa|o0@KxOJGVlj1i}{4}lMV&{ zW?l~d?FWo+Hf&xYBPHvT(v3p?#uG_|dWiw}GY$Rg-2T?4US1I2y*o_@{t^3MqyI{* zek7lCvYW&6qNH66sjsjpc@*^cUb1GzF|k&$^p7|Dh#nvMGWcyUz4CDu#_lJ1#6QoBa;vp4$-lNc^~jGNnZ{HH~yfydwZF;9Y1pf6#%JgA`vE7s?| z(;JI@)xf_Ih6;tjS|$uhJu@_n-xXAei}&vSL005E`JgqhFr4C}-moX&Bx`;A+nK}% zV#=3Sn6^H#C6OHWnuZ3c&#Ks#Omz?9N z{=TR6jXnj1{fnYAP7H-9PW86NP3BRb1esp*P5gR}ZPw$~Sz#JVe4tF&{qQPlp7o@4 z)~$7v=SXIGdeh~tg*fhb-;essIm=$Ji?@1WpE}Q|aBX)BD$UH`-=`FQ|&5id~;Gp#@8} zLa)#om=Hzr_y5-ZUc{|9+@Dquw%{);YlrraQd{%?Rj0}Y-%;Ux_nTW|HHO}wPb_KN zXdw7L-O=f;ozeAkNTIRJv)w#IT;VX{Qba7wdN-In?E|2 zT6Im^>Fc3(Rl0AK4h~>eUE@FQ?49<~9Lr33%k=g-^>o+S5JUMQ1Md*?)(zKLjMop8 zULR~R(&6QP$+xH9zF+^g{7Pd>Qrr>qjqe6rt~K>KyUYVZShw{3-g;FnLvy~6O(Z-D+#!w4o^|MUF5 zBHMAt;lQHMMeeRimTy|0VL!{-C5d;X84?EiddJhP_Pe#I%8eWQVpQuDRK+_xW1%0Q ztBhq5r@!`6+OuC{@xI@=tzRj;%G=vH#n)!P^KG)I75xSFnoWWSKlaChAE2|LhwnhY zz|dn~!UxE(|KaS0oeN`h?+$=pR6#$A_3le1YZ>b8&=W<*o71o0^Q}Xy9Qc1`q!Ip( zK@sh{hCE&%R*H}hfIm5h_0xg*ZPqXEx$XX7`N$*1A9$p#nVXuLZHf^^@KRI1_yBr? zTUC?#SLw6G)B@IaLGUZ|1VMCPc*i`;1ZTxEkGt963+RW9HA${9<~^+sJ(3&eD)W$E zc~DDUKm2$0Ff|!`K{gd5WCU+@|EsXxmAPMr`5gI}eqZ-A-)1ZH1Ty$LBw6{?o`VDZ z$lr$dN3?oUyVL{y;0s1_dgXNFgL8)(5qrzZP3<3~3!;4AdrtB(FXU^!>N#a|sLp4# z$iF-i&kKFY{)yfPI|FPyTy-w%06_NbQEyZX~zjz+{I>qyS$hQR0JL`R8 zXKNiPz6{nofe8B1xo4TcJ;VA@HY`3WCW-$ERp$QU4)QNH!MHA6$_UCs9mY1~SMbj! z{Q`uKAo}Vr1}{_u!QX%OSO=x}0QuGP1T*p@1HZc6@vOkh7TG;NDh4&6Q}OU)ChIly z2;h5B-(N!TIN=kFGr%9zq~G}cG4LtTClLOCZ%*xEI}rDV384qIx+$7?ohir{dc(MS zSmAQ3qkAjKpArhW{TtIAzjOVn!+4wM-_gH_o34SNnOYpWaw`?KucR?NW9wbJ+A9!0x^mKSW z0-{Hu;3v0s)WQKimp}X01X#E01`5`X#`AQeB_v-${_J?k4Y4Q@em_zn_IFMKz9;yb zj1LC>2fD{{5_9@^T$!VGwg(^iJS`C-U)OgOoYHt;e0fL0Pp&M3r(Qh3a`pL0)Nfm? zKDgda9>EJZp9Q~{Y8mJb9FC(5;4hMN1uUs&j!GncbXmZ6S6DX^FF}2u(<7`|(`K%@ zW(r(o%6G^6V7)#RSe023B$AkT8e0upfO;$N_IMfejNr?ePV5)!$~-V0di?ezGw;cu zDlfoUgZgmM=*7aAvUu`_19)5!fH8K|e&kkKj{T9>LF~z9gsqH+}|w!ucv^$@*sGhr4(&tC5cccOIH0 z-@ zSD0|hM{Iuqbzk$QKCGGK@7dXC=j?HH9*&{m&p=^5+Bx<)OO9jzBplzcq3a&>C!L4m zXydLR;9-u>;o?HGkI*WJXP}sMb$$~gy5Poe{-JOB@U@fwZRYmdi-CUo_wj?|{K`V~ zcWe=89q2FRzHb%uvmHDq>gN=RWyAA{*6}j@B}h#4CEzny;?GI0uL$}bvR^^?ElNH4 z-+Keqk|2H%zxg5XmiE}c%rNLzfKM#||G+1|SLBKJm+&jwe8~ME_a_~E5aB~qR@^^P zNj1)YCLMej&iAjqepxsld0%;t%5Z$P><0GNWuVW-`N{K;NlVi?eODU#_wYP{-%Eu& z4zF|1S9Ew3z7O+Dirn@;zIqSF-!%GRVLtlJ={dCe5`Zp8nl0{m9>dhmlg_mU|71!W* z-(EWodK$!dA6Mf0P7hA=Rb#!9(ZKidQNp+8;`hc!Hy4L23-Dpm1(Vn3lJ(2%r)1t4 zUavx-&jY`3M`GG4vEg~0@HSz77?}wDTT-VRlQr}h^TS?m(r*Jj0MS=C$niF@|4R6g z%7J&Wetqc`iTA6F)St111Y(ar`37}81-%^jg-Gxb-|_zuw2kbihFC=Q2eIqxpNXV4 z!Y2&t8OB4;a0|x~6F#0VFoo{k{0m~9s64cHrhR9W_Qtb*Zv8WYzl1;YIQE%}i@zZL zEyXeS2>vJhf-}5tCVxv%j*hM8*2AjN`e8qjmo%8)`xB15hW@-!C?`C|tcv)ae~dVI zs}p_)FA!sW9QI@Q1g#1fy8F% zqBGl<*QZwO92G#mNf zNUXVZW?mFX#u1>X@>@ zflvHz!w-uNJ;_%awkU$z{+qp>g?{@m&6K3fkkCV+ZNyJ&96ii0e$tsT-xvL}<5kS) zka)fzH0STj2ax|pMut)7->%-*dN!RhWMep0bq z{$14X3&FQrSY29>^N@9(Z}*rx)&bLqeS`$xi; z@}lE5e0u5+cI%q6x=2dTS7g5N$w!AO2Z4w3<&S2-55II?=9_JF*n@_5>1Hwdwbv^r z)E$~*%{~8NgbS-kkY4c|2mX6t_VNEv%FL~Gcoex+v< zdr;T(4^{9f0J-9g}$m!D~S$khRR@4xDnT-lXhZsqqn4sP#MqaN=UPf$XKJ<=SXMI zj}k5Ld&E78!hV1S6Vm>vBK7%@E2KWp@6P;XY?AFSy{&<{0h9#wr&rdn0w>~-7Aa+- ze7iG~H+!go-@Vp}sS!5)&9#mNfr{6jwNA;#_h*)-KIw1c+fMhlCQ}sUUa^x}{2+oo zPvQW`{?lV?-knr%ikjWudP?m@)mmncUDVUwZ^ro^Kk}nWu3GA!p77ab`~FdDa+D7> zqJ1=Taeg0nJrTuX@DYU{cHHX}nQ=Vg>vhzQwWG^3mv$#H_&tFYGbmw*jGFu22W?r1 z9UDPoSpF%mn&sSOfBX8G$h%rfIFecRcTHD=w~$=PjG5)6P+@-hZ9>h4FA>f|B>`k9jYHpa1i>J$p;THd}uSEK6#? zV_ye-!DpqrBh~Ze5ex5i8+w|*YHR)SrSGl0v5Hg9Wv+);_qSE7_^-m7Hwq@!cxz(w zE`KU3uFk(;J>ZK-gZO8dQTGKhQ9nF9=d2|Ka!n=rg4;lPoveUTQ&q!F;+hDkJIK7uucc zHr#}MKtmf#3=*eM>qzS}8CD+C$To-e&bG_c>P=X$R@R_D$k@))dq#Cl>aW*M`PJ+f z^FELHn157={R<7ZkH#pO_u&V~KTCD@Z3w=7WOk(5{79c6u({EwU!cE0v~0A`cMTy8 z^9TFU-}KEiS+FTRKK3Q^((h3JxOI4nDB+#_cK zlCA9J;H(25mNaQPkjWsQDXibs9Sf0Y-yVK4Hnk%`cAOPmwa9c|rM z|Mqz;xm-~u6;9IbxsLiCV%qqmbYV49Ur`U06!--2*$mcW+Y9W!O=7y7X;3Qo3gkJpz2WE&oM#owtU3{`QE`z|&ao)0ApH`Fr?x|EFJ?#0dw7 z{h^6|pNp$LgC9E9e=eUQpC3*9*Uz&o*IxmAUXJs@Pcg!SkLyQ0X*crEr=ipkr*CDE zPvLrd<)4J2J_I}tKAR!>gWo@xjDB?B^UI{(ug_{iJr%zf{ygxbS7X0E@GTKB(>;o$ zcGTxmS8UjDbI_nIho3tIy&$tscQh3D4|x21R4_{1RN1mq$bZU_Z;<*0>RnAb90wkU zUeFicced@n_(cSdH%qNm21@O4+(SKMFZ_Fn{~7$M*(Jn(ZDb_;=1>W{t3y2*u}{k7 zYRmP`=#o$!tHOBjOSDZDsAC1D6%k#i??EqLQf%#Uu7$0WY5}QBziTG9BD;xtD zU#QO${yx2*){OUn-uY!(B5js{U#JKE!1xTLh0#+;y(ag@?*oX((9#-vc)KYJ`vnob z^$x$Hk{CYmkE5E=-?$%o>Rpe>^DC&+#h~5`eb33*c;u%JJb&P&X*Bc-s1K8Rpa^(O zDLPF2((;{aPtB(k$52lW_g5F0N&TiE5O{f(=rWJsGw0d}=+P0=myefD6Za0vAt<_Ezl2jL#>%(0d+*e_kZXKgsz=myW>o7t|I6 zkk6|QN@BrRmxf2K#iUDO9_?FmvK#)f_`RztF&=hv_q!vaC-kb(L=npbp=v7p@#9WB`<58Lneq}+k zn$M$*Aw~$42|qzs{mB>p_N)!@Y|%yV2^i17yJWo1?jPZ=6#`$gC%wg&l2QqOgufpb zjQ;kk;3sB^OeV1NvtOXz%;#dMX=ON>|1`e8k@tiC;&?BwAtXvY4(nZ3Wi-9|HADRV z6VC4G*sr7W(6s)nr3vx-y5(g5L-1h{^uwfYlkA>Yf63<&cRuk|M?sIh;&~hRv@*Z! zUFk&%nRDk<(GBnm;}UKDenP$g`!^SyLO+JdZxxg7&WJYZ#%*&PBzyw=t;DwQ)00%* z8uETCZO2_P9b43zanIZE{+FP?G6v5Z{<-fs7{q=FCF&w-g46N+7+dm%*hu8}LM8w6 z)bc~nr({}2VSX@UemFOD&YQt}GYa}5Gg&{_#Kq9lnSGRvrehK&O6$-(6vah18`sR6 z+CibB_4zh-ALg@>v>5tf%uho*1IT*l4gX9szo~yxe=hv}F+X~& zg+rE;AefU@(Pys2f?$53-cGFKjGUZ^e2#dbfLn)`8_y4VIyLv zKHV;j74oRX?eE${0G6$z}Hg#9A_Zu|HFRA zSf8+7`zg-D@jeaLM9N_PthKZSBJ{a>OKL3<_9_!s(q<@DTPvG>nXeug4B31h0!oy&d=a;7J{x&zAz4 z)5~E$QRw-B*9A&jb@2NxLG7wA7V8oGoJ*!+{tLQGjziC42w_Yh*MS z#WhK+W&0reo&fo2gerltkKmcpA})1_&<`6Kx!V7y5emi9%%&>hr#DTu8h(K7RBHD? z&)9#=U;ZwxPr!?h&#I`Z`h)24>5_@1k__ne@IVN@m%%?ys!wOfCC@d$4?K=u4g78? zjp`)&3DoNoJE!_maRUEsndrZVzE@d-{bDkCnp_9?gH1MwrXSH_;-B8X{f1^=`9WSRZS9q zr(GIJ`j_b)l?`*@4;c8I4Gp`0dWBM4^LB#WcYa{{{Q>L!vpJ~eyDq3LduJCEdjiko zM>?m5*zH?oAHEH}HnWMQC_L?>^EgrjXz76FUC-%#8Yc2&2F}#OHsLv3$UJ5_)-t z;D7!E^hXX+sD}qmkW$4q-q67rD?A7uo+6B<__2oYS6<#TNbqtTA3V*uEuoq$^gGPz zYn@UorKASw_-jAh8%ywfaXUlu?kkT)Moo$9(EZYuv>sN_wHne5?AyL82e<%L}JU zEP5yVH~F>-61OU-v$2Ypiq-dyGWfhh3*VcRvtwNi#mlTuU1!>sMN{8bERqMGbf!|! z6HGCppP@Yf{(aAl$*WF%Sb+8`o+2TB%_mn+AAG0vOyWNmQ%wAib2@@vY9h}gQ1d?J z`SGL|`}g~l+P=HjI;#r$2j^ktr=`z~X2b)|JtG-=&@z6~ty?8C?%nWP#@NoRjji6b zXY(Fs-Q9mj82vLO{Fk+;?~b_CYEJDj#fnDpvR54bqUT4Z?oM;as?YTEVm-|VHf|e= zT?@Y8?3YhxS zRSQ0S&`kUbe2fea9 z9-B0yy@&t6zKJ!A7uor(@?XQ82eP3bP)a?1@@)T%`6;c>n1NWnvAQ9~C5VdYesVT= z%^98S!aIxO+1P@>rn^e;0Xg*9>h?_?f+)91{cRcdzF*OHkGIu$rRK|_X}+cWd*5gN zl2JOnDCXkWYgC_%;|DGX*C$2!Z}gr2@Kt_J-JA4YVITSh6zwm-?`$OB1bt#1_=A^aXM z`~vzN;BPY>`6KEjoL&L^gBE^hX5_OB@+mjy`E zb=h>xlc5y9X$am0A7NAUodmyx^9|wi=tm8O{}#^)d59a1^CF4g4kb|3ka`L}kK_5T zSh3$)0oJ?pa<`NcD&5!06zC$6{~(SmskXGZeB#Sq$W&7o8u{Y}Dg|@7 zmo)B5ms%qp)W`O*$d3cje_bO19)i9f{pZ#(iH&&v!2+k_Rj(I?HNfBCo2YhyBB`AC zz3rEyzt9f7ySn9i|8x>78>_#KKZp9c;u7f}m&;5hSGd_+5EeO(BKf{owz0H`p^`d( zyCOn8o(A3*Xw!Yo`G;AepB_&uqW#_?_;b<#;)4;gvKjVOuF@>XF(XmW+~pN6)E6<^ z2X!aCeW}Smed1SS$}e;l#&d#^5 zmjm8p+did8Os^W9FF}1M^r{^1-#5r-CL-qQzcVsc9Es}}OOW68b`XBz{@k~=!9PVX zPLZ8`^X5Z>FX1nAc-`>l*%>5OR{0wwdh|m8Ph_k(nn+J5H~Dh-8vW}W-rZ#)c$e%i zZCz2FtTKK^_yu*@--m!dk0z7-1{MtOXRE^T`G4YJ;M?YU>#gb(6~X@&_!Ioq%gM!O zD}0!90>w7qHP?#jl*r3s!-zlq;9M(eQX*HG^;bCjEf*nPq%w#47PqldEjgC0~CF`<_-8U^Z7pU@t=Qz@rGEAdijn9ypP0BG5gpXvhdGL zB>yG+fdR+qqKO&t=TI+(9~(JNuY%qHat*Te5LDHy*`W%MuG!3UpkeNYsfjkrp>zPO$EEeuhJQzGFnJi}ECL_pkx=K>hu> z%RWw!#t4I`;IIuFdL9yfXR@E4q(1N;4!r;9UizZMLE z&t9@2VIkoYR!<*3{`D-G5%p+N4~1U__=lM?&R@3lMQDu&b+Gf$6p>MF$g-YkpA_x9 zlbuyLg`V7m@i2VkySYf{Ts)U+IM4pd8Weqy~}SkmF{i} zFAqh(W^&`aMZ~{n3YC~p_1`^L2)__$6vwzTfg5$Zi^=>kPB~F;6|0@ga}RY(!8gdU zUiA^aeJASYSl`g!1HBaEkN(hyBIp@*cx6HV9`q@->peV=%>98h_REMT>nZvbpeHKv zqJLKt|H?I^yczUUK(7#GNQyILm92W-LHKmpWi|Nq@%qrV0TJOF&|d(4k?0#HW4*KZ zK>q~3fp>#V^lc&QpYlBR8xGk@Ir2Wld~5brLN7+<+fa5uWhMMN@!Ra+*}mBfJ_<4P zdoK9-ly}~ER*(4|e6IrQBkmXa8?Zi#5^d&QUe>W1T?N6vdqwDnTKCr|?00d%+lcjs zx3+Prq2+w=p^4Zp2kR#f`k+{KsDLWVyF}Jcb^+lVZWDeK^CQu#8~@yI6a83R%#Qf^1;<;7K92bJ)p-j@OzQo^eEC?cKlpp#eG(rdd?ez8%l-x_)>}u;Lw7E2L~Isy zhKh(E1^ntH(o+A5(qGwvy$UO-uLH0D$v1L%9rvSD(h+3D@{9FopBs(!5a%Dj`s){r z`a1fv^kn>vPFp4zj?H8~Vpuu$3+C$W@E_sk+X9bayly7%3+Ah}fyi%0$`+ccB@GRa z>ysDzS~K_i(DVE)5*t;%v3@=u{vi?BCZcaj-A%^(?aYc%qJ@-YBKGr}RHyL`Blx|A zGK8xiZJ5;5&BJ&t@p1J>P+?DsE#1x*r0}69rIpTVe!M_n+P0@{XyvW1$K&}!Jh-B2!>Rj3e?JNPi|XSo z`jQv@-joaVdX+Xb#0ET88rn_jQ_~`|E7LE=maYojp&Kw{ADyW*n2BD?qh&11a(;S; zP3aQKoEEYKer=pz{w_w^5HqCGX!xj?#fZ>P3H{pOv(q{r@@1@t0odQBRELI%K-B9K zMH3~c_v_inlNw*t>oxR_iPnXgy!qdDvohkR2R;5|DiiB>$fbVN>))Vr18QE1C4L1} z@Xv>z*bXzPFKF)J`9Uw7CP%*W3G|lJPipwqd*3ftUYTlNAn?(wNo$keyLUQ0GEX7s zaq%>(*RZneHD^}R{OC7qK|95PE4$f)YwC6KM~pq(iGGBpra8CQ*z!lNmtHg4t`U6h z5teJ;FmmB%&7OMH2iP6FBH;UxivxO#p{G#(nB)2NZ^gWosNV<0XKda2{cl4|ZHL`& zb!fgZ-Dm!TE|xaec3$wCAkm8TrR;RzefYUGdad%;7ipPI?|k^s)9~=ePi1+)|F&p$ z!=>$>uDq*X(#4g1S2B3>?}P8i0KSKRL9aA6X!q%Y9bWdHYljkxD_kuddgu#S55uFD zqw-w;cHaiYX5I1~UaoaNf2#r?@`a~^{1eYpc>Bmd1!8PdK}ifX9U}af;Cq7i@jtnL|8L^|%@3GyzDqdM9Nyx683m7M z2G>KrZ_YnW(2sWCBG>1@T3Bp8Gxnz!9|+8|o&ujMsDS-*ENjOKmQts{Z@9phxJEO+ zb8mme-JeD&)L*odOaJQF{HgsN=b4_(Gbw8SiLn`95xu~T zGl>u1r^-Gi`vVq!n(?;dOyU<}>MYMI=A&Di>tdlN_(40KDiZu*91KAf*?Sl<|>Y!;K3}oLw`!>xl#p(~gLFfr?-#e{SPPCMXtr2=w^ZTiT z;0Kh=wv5XiZO~&$A`wlVh5(pR+yZ`}D{O6!4Vyi|!MnOtCrNEma<7 zP;Zu;UQ_RF;1fN;*}`ivQR~(4GpqwYkP1J4tF$2;e*V73*t;j*peH;rEsXMJzd7Nf zi6wl2eVmNqPacc?4IK8B$LA}v(f_&7x%~L&-S8_srcoX&T$Chd3W7CvMWp`#`5)#( zo_X+f@D=DkP#WLQ5M#g0kR`pyhmWeb{`|N(4bYqSV?I{(h&lb^M(ppz5Pm=f{lZ1) z7xt{`Ka2T%mMHsh6vOxQsK9>6Rvf37QSeiQpL^O+LB_4aN_urU>O*|z7oDD6;0q#U zC0IXrRZiV6V-2p(uP4cjl|+weo`n6Vk$=HIE2<&MItKd#$r)?sp$O`Z!;vHb6v z?pKk2?Fh_fVhTr+{VlrPk#CJrmOLp-k}}Kxj`2bG1kvST{(&7gfW$OG^fh>=fCwa)AKhzacpB!1t4*-i;DEzy4jPP;Wy%hu>pC zzQ*{XKZ=Xzk$zs(bBC|TC$SOvrd4ov?Ip5Inw05(7M~zV7Ig z5xgxjDbQce%R#>e@}UaU3wBMRf(>7FujvLJuLy$vy)QgQU)Z@E^=;(KbfffbQjdlo zAoRVc*JV{K5~lMMEx)>;CpkD?`QkKR9k)fHfgj94#InUqGyHn6f5dz>@cAUsVsrCE z^orKc&l6+3M2e17!jBDpTnhz2KLP>jkJCg8 z6{X=8;*YSLL9B%TMt*n(FDJMO`7iJU>T6o@$LQxreTl^MW#R`Aog3N>J@&DGm3z5M zkZ%Dm-qDfz@az4aQU-eNjt$8pNDO@bnQ4R-*VFR~@+H)dSC?x?sP$R*Qx@@omo=)& z@YwTlhWP8y`v>2yPL{8hmU^mje^N#eJjmg1PjY{#=6>MEl*rYgr8|I+y$HTSoKiF~ z_F^2V5C1Ym@TGh%_@@25b`B3`A6q0NdPpm;5quKn1K{1l@QiqT{@SX60mP|F^Jrfx zqs&|y+5`XNW2vHv*v}96lGQAR|M9m=XtRR9F;ft&gMPs4$Lym;3md@5PoGBeQTy$0 z-xPT=j0EFFhx^0Dz`K%2eLuNh{5#*i*+0QljqwKkhYydx@_3rkTD}mQ<;Y-w(XGwVR9SlEeS= z`IRS@4*%XU=7;#bv51w$;$u=h6W`+K+e%{Dgg>uWHi`{1a=m2!@n>Z!F1GC=e5V3@D)`;wZ_*P+*GPd^*(TIOasOnwyDSp5p85Ies1_2_ zmC&oJsMkC+w^g{`OJqbpLGVSLTwuWSQl6E#c)^pSx1=59-u+QQvRF z^Gxl(;0-?M+Fn)zJy7gcI$8_V^`Ze>izRHUtcmsS3@mC;x4D?3D( z)!g`F6ntBppnBYcKibInjD)`8qKm`#1tb=QgZ;*M=>B$;<__VPY~XK5|40?vhVh=P zf*&3a`ns-hs88a3h^&-k;QcobmOdf;kp|b7=xO=aSgIBC>8+!$!|-eU2p;&U#zF8$ zM_<3wX;CuP!7&u2Z37>shu@DNn#xZ7dNo_0aqAnEtQh_3G2_jhkG*dRB}ofai?E(z{hEpO44=pScZ^LUFt4_FJ@e zemzZD^~fsGQswBcR^#|ISvl1*Tgz9R*uB|-^)6br&}>PveA%vgE>}RW5DmV#1^XXF zGdvp5ZH+J_dgd-Y3q^>tjve)5nR7 zzvjooKZhRY?CyyE$+UCgiCe)`>f+ChgEzr9$Ym3Q&L#0jK_53LBI_Sr@{V0X^mUOQ zYT(B|{S^KNK8NiA|5@Uv27lWiP`n=cA?DNlGFb`u5tl~;@O)_U4+)%pfk&kVfByN^ zdhid$0(T~*2>kt!(znc9(_G}06p-(3ncZG6SP(#BzoK2~LS~otI{Z9=cSnjOp%`Bn zj~ZVa)))9Izzsvs59-o=NY)?d_XvN_)9z{Q4+U~fQfD{^h@}R z?5C0I_+u=&J`b6gtCy?)z~3YGlA-=C=J-~2IEG&euKxvnauRjvLVO^%{x3{T{S@;Z z>gyx9`np}9AoWMwKOdQiu}I9O4U?|U_e8#ddiyT;t@N^yP2)X~pA`F{ztSD``jEsf zRWSUVvEGt;JbSw~l!xaV2){cE(Nj%G>l&Fs^z#oXtC-_Y;g>=1`VpKT{&JBi<0%fm z_XTuJq?m#==g+Z84a>0)Szk`o%m}dpQ!q!eg z{uZIEFfWeZUnX9>JbB1^>zhd`ZNMAx*l#Z<7x;b!`stI(tyf$=^Vc}Y`T{(^y1aA; z`s)Ey*`CrFdBHiW;@H)j*9qc?N>Xh8{DuT+(%o#gWeGP-$erNmsxnZ9VunL zR^WRYetGjcN^|$;uyXk6rPB&MUlIStilXnoAIu>A_6wvn#f)XB4*1$Ot?js<;WO}Y z*k3SvVBo_2`n9yQ^jNWidF_iIj?8g~pBdd3WxdGLhyMMSRyz2BeM96!#kqL~>HLnS z7Ew{|`AzaiCi`K^w0uoh)5r_C7xeP=0evGHqKiAN@Ovd`bNt{1Wv1&@cR@i&CII?T2pULaMCOF>e{q ztLyZK%NNE{(1*PD>B&nh^C!ON2OH#lZytTBK)pUBS4>IGZtAnk+i#LMq7mDP*!hJm zisu6a4->ur2u1G--v$4a5d2K=yf4v{+}So#4SXGfxETEwl)K{p7ySPJ761P~{k;>{ zdmq<3m3q7AE;WL?UcwhVV)1|CpA)|?4*&g5yE!^_+<=VqBlxYs0_?w4Pvf^y$K#<{l2nb-M!U#s8W1E|vtUscBpJ=*hi&e;zOq;b@I z>hq~*R<`Xag5M#H-Hs*nHa2UgSRMA{#u=qgJ|)SXSiXNL{QJQVq*&u927EwcnDa|D z^aByu=(kAcrK3KSMEHSOmFQp4S3=+Z&^@B#>ks!milJ!!l4*OE^n867;|cX#=S*#^ z#pFMZ%{*>;A^3pi3C>7s zUh@If=5>BUd--SG_CDFe&%5%a>fn=|7gYfpe|qcQtM=~8dz9D9?PsVhQG~z9?!LG? zGVr`-GZzY%=FCe*Lj-?qL&?ezbk4}8IgwDVCPI|qh@H{SWwaNqWBWaT?M$^M7%n|6nu zARqk)eR@h1{n5CBQ^Dxpp-=zrnjN_~>ej9IPPy)#S#u|Q(@L>9MsBNxpD+3kQf~O$ z&!E5V(1D>k1NseAmuHl<-11=dY<|oKUyzpKiV~>fyv*a_&j-HXP5SiV_Dxw^s=etu ztO5Q6^aSYru-?gQ$2Nl>NTDl%C*zMWj_Sb&Yq2agksbiJ6|UC4)~`)Z%`DT zF)w}sQ_kU$qpHZc@Q+3Q(e_MEt(muMQ{KWDfq>xQ9QZxlIx;Jza^m_OS-Z76ue($v zrn4&+?KsD0=AmB``PeLFr72wud%8b#`!u_7mhXe22Iy?>eRhdM62>sB$ z4CeF^oQuf~aLXS5@~dQjgDi3nn)!slENgM8%H`wrm6Ao||A{lcD% zf)GuY3i;F+x<%od$KQ+nz{jcyzu;$-E)w$Gw8`i{fPRk4r^Zn$rhM@Q$p^qMNTDBZ zKt3|lm(-U_I6SNnIQQgvy&!Sm%J*Y1HNCdY@uP~wg4xWBBi}-=vV-FU>>n8R(~wP`zUC#X97xzZilA@TxoHQ0uW9AvnH{-&l7A1$ZfAZ)%Z{1)CdOD+buORGLmUBp z;JNT%!QJb*UN4dx7rvQL9V6oK1N_czXL5Mkg8ZZFPQiKsj;E9QS#*5%hN{aCS>Wwy zGOye?Gmwvqptm6Rdu^RA4)H9d zc^6L@jQxtSUo64nf-s}nT``P5p?99$f5A;Fu?@l>VX;Ab?B9F+LQB-{?K~#yDof)y z^zud@AyNX;KaKGjqpUKfOM(Q>QanErqaFi2XU!n^2Hyn1p0R~OzD(-xaZ0mz z@_+swcq#?{K6?1AC$;<`6WMPcTZDRkDG(W_KL`F=BwKBQU$T$6d+lTo;JG)z-vNK} zoSRPRwjfTW4_6XCC(Dt`PC~pS@k+okX}f8a!|{vf22^;M>}CC7w6I zt92he8sOqeQyGctb@2PXQ=3WWl~^R;ryNOhJV>lWy#?2&Mn0%QyaLDdINrJEpJOOH zVp$&g_y6>pw6CmNA)7ZE?{8@*%PKwWcj{K)epqpTavndB&*0y!TS*@_){y=F9F1cZ z@>hMgk}f`MA;+PY5Rv1FHt7`Pv!tHxh$Y7l5Bnp&jDGFdyWiy`o-Oa2jrp!LbS?77 z?{bvTqe#>|btm*FB&Lrbj^$}PQhdu4Q*Rs(#QWvmPHBJo?HPAG5&JPDo#V%sp?=Su z@1S_S#3Eo+1izE>T{Mx{$;zLxd~&{d72x|Y9}#|m9B&-Hf2^jDe14^D0{q{sqnw-2 zfQ-+tOsqVdkreN)-ii4%mi*qT;}(K{NPQmh3i=}SyeW?gbf=)FURAe3**G;LDUPrG z0{jf_XQs0FHQcZ9Oa(sA#g(S@(>vd%n@!K8dM}aTNc%_S@(g`0)>cikC zQk6_NKfY5GrOE0id=c~(>oO$H#mh4;-G%=);iuqNVHpqp!cT)Zg~Xg*{JOja@6&u` z5xKuxY(rkyujO`4GU=Zn=g0b>0^guf87uWyaDR3UJ>!Ev)2Pg!_3G1otKaP&B7DN@ zs$z2dOWbeN$Fr+nCwdzA>ww<^AGhLYoa*qd^bt-W{CxXN;3MK93*U*J%l6I5Q98+b z7Ne?SV!)@r6`ThB#H}MLn(If2anb|8k1LL-lzT_Fll8Xrn;{l_#D;`F{VMi-0R9B) zADs}eNJ6gnsvQ0h(BHXZ|0%4eEc&;w-YIGHhl_`Q58)q_z|SkeH+8(gd~fZ9KCjpe zev7P!a&A48U7l)4>hRF-A^j+wRgtoJlts+Ak>^8^^-z?gE{(U2Z)cTG!Z*-#UsB5| z*LcXg9}|58Ey|ntXFXa@k@ZogXlmF5KWz>CVXz*K6OAwxfxo=@EYX+rSIFtfmX>f! zne+4ayqwTKsNly=>d}NxfPct=Kv9{w8vYdRst?9e6#Rz;Vu_mb3)a97BlEz^O876j zar5i*Hd4Pf|z|SJWUnAdP+vEboKK+ti&CnCW z{|+^y*!*I`Wp>J zzAvy)5e>agyhD3x5O{o)5_&wbo~*Zh@E@HUnHNR+7vi&xRf8;kZ)9F|j2kvs`zzr) zFEuVuE~qBsotpN^=UBh6{~XrChKV-xL#NF3B=}r*Bnf&9p1Na5{sD*Ar)$owa`|Wi z(}pJDd5xpznXBQqncEM3*G2HU^E;x44Atd22wsn%ixoBESf1L!E;p>1`(|o3(d$dI za}Iq&)*IB{=OW+0_>DX{DK_KQH_^)C00Vw+PKaYjv?e)i1$qBtR%9O}*9-iv6oq3y z8Vk?#jIG0dR7Ym2?AY%wZcBv@0N;>ZJ&WuA0>17)qvMkper%gOL`?}kOiK9T{gEwD@A{na;66J z*9hFKG?+6=oXze+<3)%)Y92KKu%-3tgpAS-%YlQLkU5ygaqc z7k)dhXjlR2^{FYY>fje0;3q=bfbYMDpWd#T&pIg0{j|sa$*J$2DuO;WdP-((-6_W) zGp)7SE2&V6{dmF0=mN8`{~cY;SgX+4pV_q3qv-zGHA>%^_RIVr9llR~drd=rWS{Yv zB#3$Ii>4!UP_KVi85|R$&hQJ?W!~>kfSd z76m*;Yi$Ce0Yw4Z>b9r^L_m&WtJIB3f{GE59ngBHS`(m(iU^8;atdfIo{_e;8ia5V z*c-deV zDGx~_etzAZ<67ezF1Tkn4cKHmB=jT~n1=TMTm=8OM_Jhxfv@A2GMTS_DRs`sO|bT| z`1hx{e@fsrD0(fy0Pi~*Q`Rj5D^7)n>>&Aig8$PfuhHyvRo4HV z{QUn3pa0*mzXjj}JpK;2Lw!YgNWcdWy+FoIw$ysw)(R36y}&1`B72T=%X965!KOd5 z?WjFWOM7EGZ5(r`v+|*2232KXxn429-+EbhUDD}#FKQ|^m%l%ft|IrtH4l7F+d1jU zroj&hA7iz|g)+?kjtb7$+IOMr$E5hx>!|H-zka&mEa&U!7o|z@9$u6!wPe=X<7kX0Y-{*89y1DYei?XB$!Fp=v+r3@ha?0_-hJvJOY%gHSoi3!&7p33>7RXW0 z!8j*9@#W|(uY|{yFVrfQl!?X08SVG2{l7wgU}5xW>;3f~Sah1T#{Yapkot0q&*;kJ z&}E(OUh$7E3Y!!S3mN-7Ha_1~o}zpBgSgH*hpn=cjL7~fPl7c;= z_JC(JtI))4sM+*Mx+%_=Wk9W-g?`BQ!ef5iomhC_Y@XVoYP8g*&M4-_PWM-THN+fc zK~Is|d?vak(OFlY6+`M1cKtCv9R38{^K}Wg4BQycj=a@P>8^_BMv4NLz`uZ=JED_Z zZ7Q|`-ZNH>)iyu2f5f}`>@pwq#B%8|speT13w*(b;I6k>D?O+kLAQJ7LSGOpRL*9; zeQp4LAd&X!1Ye+&X4_DElFw^i{RBQ?-EVswY$?=RKrhf&`?7Sk;7rU)Ke}PPBk(Nr z27yCt<3h|AIU~@E;`fZ_e&n{h+KamdqqF($SV)(sa{e<;_umt{9gij#))eYm}j|0Ca_$NC1kbWTF zl5#dmdin8p=+`aUL)mCGQCwfFw`SOe<;uKs#sfdLfG>xBAx#N=!uWRgQuOCTO!EK8 zcfTF+wUlDMcC}sM0sb7xbFBBVzJmX?>Sq^H@B3tsCNc8IH8Cozw}$PrNSw%#zHm`L zYA%J|7x^D&!M&KD{VYg7-d>_Noh;aLt<5hK>m8p_>TX@Ya;!Jd|H|7t4SIn0@fi4> zg&lzZAhw@syJcSCG_oFg!zJ4Xu0X$TY@e83_io&I?i%R%_J&P@-%oh^xv91s&MV^@ zhmjKBsU)5*F!Z$Y-az!(!{m6UljC<%*}jYgzQOs;fF3o=5P1J6@~das&(E?ow*W(^ zJnhuo&RXWXI(7y49vsh^XCtKkH-Ek$bx(+~gMl_H()2B^=K@v~^5gE%d+PJ!`M~4w zTMK16UEQkpTU%&r1V1Jm{~P!l5rbF;g`VM z4ZXj~TjcNX{5TOkyu=Rq2NK(Y4>PM#k$PdW9tR$Gnu&ZerJe$RA*|^blQo+opx2Q|Kzi9Xxc zJt|)X{dE}OqYy6>-jQc#kbF%k^l!*_4oxHe4P^h&qeom_BYu#cZ3e&D=Sh z1P_LYbxuE9%M?Bu%>x$j{+8e|aHxE-FX)VP!IdEbOU+5%p}%3Tya1CiAlflsN21Suh}53%B%6b zf%#?KpTp#N9_krO_=k#-D`S1g^Ul(Z-ADAk^fe0w_=g~8IrJOk`P(%ttbK8HjdL2| zC-AcBqCXUkYi(ce?`qc%C33;vuZgO4S#@QmCu zO=X~@8U3Y%PY~koGZw+0Aab}5u_vjgVJlgZVbtemWBzkqIw664kA&zysE>V|0-^7b z`VoI%jK8RR=LZ3PhVTswSZw3XdcL`IJemI%*s>2tAZ~=758uO!^TBUOz#lY^qMrbn zA8nxrC*NN|J@oPL2eOTFN%3htr3SzDE|&6Iceb*A*#!O*-*b0o`RmJmo2^e;t%Lsu z^nA|eJ+An8*+@=o9&Q64;VQ`6yxUAW5d3tlb}sPiRA;qvU?KV^?4M5Nhx3yK_Y8kF z!~Ae4&a@Hp4fN&IfSJ_d?M3k2BxZ3Gzv27STn&EU49Rc1`CbWIlp=N7G(1RRf!oC0 zPAc?YU|@a?%lnXJc?|d;-`B|&@3%jm;)3hjC;PgYY|pZspaegl?bFXc=eYWQqtL$* zy%Y3?T=Xvi-wD6Vcl-#~S;4tH%_|f7E8mn3GOqBbjmefBB>pQn9|v1=YxI|wjSgP( zCHQj4*?=CCoOBacII9oWXtd~#MFVNP$ zxU%@&xZ|s^yX%Qw*;MwKty{X%MkX7L)x?@$eY@H}MqYHJP2tl9e;wkVXNUE1nwnY{ z3qGZzt9+f%@S0;-&Tiug5%DzqzCu_Y)FU=eHB9hzD#7<0&+Hzi#qzK<&8&`Sbdet5 zHJq18U0T=tY>WE(1ozi24FxUeC$AYWh5mjkE5NwsBj`Ka=KC^GUteMBg7vuC0(yO4 zh91wCO{ghQp*|ou%M|+KeZuhD%+^H)S&`r`mZ08VU_Esp1Nri#kzS6v=QMt-RDeyr(%u)?ID`aLO&nHy5~l|Q2;$k+3cuV;r^EYI(Tz9#~B z4)~2>VVRJ4?%G@JeE8viMDTslF!UIvcO&6X5B%ov*=MOo?`TGDecfE?Yz_Z9$X2YgTP zKl~ZC_QV&M>ht+gJc{jUv2Dk2mkq)9R>1e5>_+C^-fy`9_;wlaFNZVZvo8|&y(M^8 zpYN~994WZ7iM;{%pWt_oHxl|W{YGDp|9?B4|DPP+qW9zu&VS@lDiQ*!`PAJwa{Ju@85xxb-#ooDVFhlaVu3 z$DZ#x8ja_J@ClQdOPsbxJUku^{C~8N;QhqKC$=|V$o@l9>HZe_h5w{Fz@P7^2+!ZF zRQMIBPDpw^ksp8cdu4LZX39olxFhuLD-q$R7RZSo0qLhVptulnA*mV9pA}BL@$o&UD3T_Bms%Y?qtvFFCl7b$aW zsO*K@`Xk!j)M)irw#6=w@>LhLeRcM?Q@g7ZlIuUi(K$A9!WZz<(0|6kRGS-P z(%2eRxk=FT^_Hb{XmZrub^!%{(OKXR(v(M~Z!=$OnD8SBZv3XU(!qE^aKa z@>Y5n<-o6Yvi2ggvusVgE-%Z*aJ=MD)F_L@!FS-N7c3E?UQq=8;0spISS9qo)yOBM z5&eO<>urJ`{Qjcm_qsDlzmt2Pg!=u+4nw`bNbQT_<>DTvEDrRChmaq~dJKFn_=D#r z%A8T!&I^2kxYdK{?alI73_k#@zkCJhWvCyVs(Lm$MAm1%V)@%ZtUr^HU%~u!Ss0(nIqQdkWJELmsq`mmc1Q{t6`i zUe1u}*XM7lvEC92<+HK=VoIQA=)?MIf$)rn*G(r|Dhu`N(aY8+5n*arBKae%#{|xi`KS*Zqvsp+G4O~! zUwRAqYxpygdTO7xy?Z8+`5UnyDm|0qIaS`+yo%^i1%fJa zNWautzLPJ`7cuJ7J;0BU`f6I(y>#97@Bq{!P=wFdjRH>#;kScv@_StHFPDVypC;?g zx77mVqc&dhME+Q6j(lS^@&(yg-`ZmR`>vim9_tNQ*Rwale{N%u*d5pB0a^d=!1zYs?U-qLeLL3Qwj{Ql#!*U^g6jopr$oT5>Gcm?@I zry}TSUed#>Qh*o0kEH{jpgs@wFwBVJ&zz?rU!B81Huxy|2VMD0tSih8FtFHUhx`ii zp{vDrs8G}^uXQ?_M)ISp#T~_tK2C=WHF3}%6gOUmUy3JNrtogK`+y~#{p_*<@Sa@B zfE!q_CGgs&)m;^#0XLa?z5j)k+n$8${j#jR(a&)Nc(~ZgWsf9{S2J94bt(nCSi(;` zmXOAfd1vAMBKXlY)!NhOy*?KB7cuxlr9pfA_97O_R$AzKiMZ^;FMpt|EWW z#{GMXe6|*`EAAhDPn$eGY*<^|TxANpf%%&*T{F{!#IBJ}3F%lL@_UC_)YaxHtB(}; zeOU|rYytc3=g9^UdcNz6FU}!<$eW{8TaoKSejj@8Gf`^vA3io<<|W(H;BUzw^=% zU$0BO+j)yi&C+-LkwS7+t2XFhNl3jd=2t4aODz+)Ikg1jIH=-reaZ1y;ri*%kLL2E zSGBd>9S7X^D4*CW{sun5`3ideN-;w}A>eaXXjgTzSZmz|y)^VFiSVPT-YIDO#7Yzf zzq%>gX=+Y$g)6=n#<)M|M@MnyG*|KEhJkf-XmE&cub{TGYPJ!<-oJQiE7jl6 zR5J%-75D(~eYKsH+l8a^T1Pe*D5g&zrU_rdKacwP5a8J_M-|{dwzA9*@3R3PLQl5z zVQ#AU%GNx6-v_m?ng_)*MHf~kwq?|l{I9onIrvKOGx35rO2ttrPk#-+e()8s0`N)o z&rPI_yX-K(T#pvlnzfE`xU3@j8s?_!n}Dx?KcH9ewG`of*eHl9%*1?vdNJCb#NrB$ zC1n7<691w0W!VOC-6X<4N$H8uv%D+|Vf7r`2S2<~`szev^-9-?@1&FZC}}&RANr8e zAm@7(;0yG80{DoMHR6}>FUn?V>HV*pP3vPW#r2c?Evav4e#U%x^$S+a9);iOsi^N6 zOVvi89`6os3z^UEHex<|Q5*=qoA|*fPwX0+hxgsz`J-=S9QYT4Z$SMA{C~kOfS(}z z0>-Z_Cw>e>Z!sdURFL`2_9OUX>Yta@Qp|6@wiw6xE5R>krF4K#zf_dwB_-R0Yu(4o{^U^%{VUqd}n#_l@ z{P#F{`S4vS&Aa(#mVYWQwC*NTq=`&w>RuWY0=>u>hQaF3p&!s8UZ>A*Q{juxUnKeM zi|)2{GWc(_-1uX!3GxBZr>E{oA@y%n;M=kN8nQjhz zW3WBVCH|cS(}z0Xw+gEi+gf%SyxerCGvA>nzI__?g20!!i7l0P{zLIldq9s9y&jpD$F( zEu@5hc6ygz7o<#L5Pn)S3O#!V{OUh~ehvDx>620K4ty?#znftg_=KQg%umqE`&o-P zwMBg;sP6+__he1u;CXpP3s8^c^#b~Nd{3aS((@aL7l~W*EDZM;h@QkH4W|IF+v0v& z6FwXL{c2xa5!9O?6{enN9N!! zwgE5m=C+iX`oT{J`S!Tmv24-Y*6Vip`hIr7u21fd>xj9P#67}mjmvh(_%k@pL^-!z zZIv#S8HxHAOuyF2-WPjkpI9U_;C%Mk*|KsS9d}|&tI3kXqEwM8p{MV%8T7}8{PT|i z&nx`epL8;S=Z|uczi;rg$o#W!DZ4hV{*NGe&RsHwWJ6R z^!5RP8^g;qv@7w43-F>WEM}$3@7#Oa{jxGCc{9enytk%ae>x)ixF7j^BH?_~9Sb&`!di%Oy&IGaQn zJ)H6VpJJOwt%F^a51A7ws%2g928&)Z?ZbqkqB~)O)yF??@}} zbvw{mleDkUi<(Huzo^(xKR6Isopc)URK^#RzmxanYv-e%LAVPAJ+}JPu3_sle>7GK z$8D$BJi{F;m+J&dQa^&{+lax|et(Pmga^LB6*2U2Ezf7$%eC`RZ{p2^Kfwo7?39t- zT%uq3-WYxgtQq^C?>ZU-{=jvYu~rz8t^7O}{s)^Mm;V;IcZwPHV6^^U2KB9dKVKcv zjXl~>KcjkZu}$XPrrdRxkbi@Iou3xboZlMv=&bO3+2w%e@aNGD+NZ?T=lI{*amWw; zepW$Uf)rhSPM=gYx+S`(*Z9!%9m?U1#$DHZymF_*^rOzF9?J-PnC+4Jh6YI?Daf>Y9R{f{4qg1t{aD?bB2bOK%YSR&zS9l|MEdO@}a12@cAUf=ZCTC(#b6s zk^fmP$bkO~6a5T*>~CW|wv6a`F=b0N%{I5aBH;fLqsZhi?6r-LKco&kh{$|jukU$2 zjV649nCPPe+Qvvukp9Hz?<&3reRK;Yy5l?GQyWg=JqdmR@H;OD|IvYdG3mq)>07LC zNWC=t6rxB!J%$qUPQ<8>C_ukn _*f8q~T1b@c-K;xTC(yx%r@4(MQpE@3T2jo-3 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Ξ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%0AT4tOl$=2?xW^oS-()u}!ohel> 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 ?9xb4zq6 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

pR5t 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 W~c_GkW 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 literal 0 HcmV?d00001 diff --git a/BCnEncTests/testImages/test_hdr_kiara_bc6h_ktx.ktx b/BCnEncTests/testImages/test_hdr_kiara_bc6h_ktx.ktx new file mode 100644 index 0000000000000000000000000000000000000000..646bcf1ae4939111afb4263d344ca854c34037bf GIT binary patch literal 524356 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�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%0DKP#*mD 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

3-ca8j;M)>7( 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 z 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

eLg_+$9r<-*GnJw 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℞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

nH_kIB09{_#;TW4Fl^8<>k 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�QUjOeeo%?cjU(Au~Fs65>-51mTST}P2i}^z# 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%0D1x{Rdi`enH>B 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ℑ6H9=|^KbzbKm zRnBM1k1r3i?eBS=|8=kPFR*U~brS7cL4Vlm{M*{Q!1?5PXuw=OgU;gH=~?FEAD+_r zslo6e=Bp4i=pfya=O7>Akv`5{3h>4FIDhxJ4)|Dl=|Ugp&+_}fzkdS%Z+-&*3eM{{ ze0;a3*0+!kV4!b5(Q`jf{f?OP;bRp~{r>d3oZx?#w|iddnP1g#o$>MR0d-yAJ(7=x z?Q`disCof2&E5JXI~(nl;u}2QNDnY{yILy zU*9jt@=r!QGs~}xJ+k~033*7iy7>+E#5w}3OA~VaY=Pa+R?p}{M4ljkuakN0y?zJR-u zZ?eCmJ>;&$zwnzEo1|NYOx9Y#-`I1a3$B#{Kevrn5W8diRuby9fBghfqDRU zVgF^3<3MgN;Jd3D04n?HjfuHYO)S;hOgFKGs zLlHS|p4;bQ{uIxjkX%2WzW?R13BKoA`>9=&E-!|ilv98j|zoIRX`_!&k=_L>ncnzpw3z#UaS^^Ez0>(NQP6t`73Lz2YaM zJ$}MLk-1J$pYx+!-w5@3#aze!7d%fm-%{}!*xmy7 zApcdV^1B%bQ_Oxfcc zh`R5uRFV22``{yRKPLycGtyZ#ILMu6^~{I4q3L_rzBHFNKRTSZp2s8I18F1lheo

1Jqu!p%zC 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�Q^dL-|D$I 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%0ANlp7b{>L$l=Z@dclrf)0Jay;&phs&7joQ6J(QL| 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

TJO_0FRw)z|!GqrqOIo~F;f}(e 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

UKEn72y&cvo?e*<{m3_aq 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

h-}#TxZ4q z)&Cdo|3~Gkr4NOC0Qb@A{m(Y0_e0$qe7`v|&%jB<{pA6u|1bV;|Ija{p5l#MudiRw zSf~DOzUQLU^|CJ`@67${$N%vk#A)=8CT~pCN!+QWUY_{&?bO9wnCGn(N79;)mJeWF zLmdEde~)=T@!tW_VWkdc+w_k>KMcJ@bQ^}lOQK(wJPz@Ht&&nIBiyo-BP9-mfiM zTRX=OrVfa8hddnDPrWSh+bz+R!2kI=_z^l)yG7@RdJFQF1-DMV5B&t|{g0`At@Nj8 zrf(KH!SVvc`NjRM`&S3xrp9`8zMp&_{%Duvg8~u_zfE)`$hWMU>tq}~)i}HUXnt27fR_IBx8`+q0mz@i zkDa}JR+B!h;{Pu-Pis7r?<2pYg^JjjIxm_v-zVnT^OMJYp5GhO|Ci73 z)#%;bmd}%iCI3X;4*W~YxMZFZ=flfcCv_TKBN5`>y}1MIY{gybrx_zDK)s z>))l{fa7wD;BnL`S@-X;R{Uz9`9KtD;6-j%gMX&wdl(<;0GwHUxzw4i5k4_G5#s*x z02Urzc$jevu83csQSbks_5b#_x6WVuUOs?!22S4d>wJ#$vHpLvum;eJghfD}Vu5rG zU_a;g&6oIuajQk8fcQmw>bTx{JY@l@&Lqr#QT{S)ZK~uuO7T%o{VSKXZGudR}P8?o6!%z zz5v$!ACx*8_&C=8%L@?y*DhZ@r9!UM5`_Fj5AIbwTFA5HWPV@%hLE>NK0c;pub?OOD3D2FrXj<`H zasGeic@V$eR9~!ieVzyFCF{02|97MghCHct|KdRBv|ng0mEZk#_ty61Ie++n%xCSN zYA;v!%;)B*oHc?U+N`-m(T`CFz`Fm*@uSqmS^qEoe{8p>kH9+2IMw>P`9tge)&2Ka zT(}?qf4ViH$@eyE4_Ye z=4<5vXvJ5o|KBeCTJW!ae)sA#g$G5wCHc-7eE@oS8+HE0`?V|8-zoVI?i=%5D-S?? zUi{y@koH$u73n9S&j0(>wW{-E{8q-UM_z#S|JydF6dtfT06cH@PvC+0aq%Mb!nqFX z|5qIO@(A@RBT*lip7*aewEZADKJK&R*{wMALgC}d1Mt{-e|EQwQ}zEHFXH`cCVvS( z-(&0lPl#STak#iY`waXx^BaHYcv~^5Cq3T8PK7T^9WU{nc>lcJliCkuJRBT641Xsd z!2Rar;e&?A?|v9PF!tl>036zWxJkcz>;1+5=kI*J_$I; zwc`H|W*>nr9sUJBGH-jU(s!BfVZGTpd0TYcRvpv%-={gb|8@1qhG%i9GNNIN8Ef)zW@89uXPs7`sA_ejP|0= zX=Ocep0FMfccN26TuGlAc&5Cc=X7!O5b2F6K4}OV3$js1aZ)Q zsS{`XYG+NIBl;q9wXZKYJmZ@CI59f-8|8J_Im{F14c!SDN92#mC*uFO?nCPJ+I~4c zIs01pYhL$O!I9Z_@!T0d^n(CzWPJ4IUvC_oS6im=7PO9^B^vY8;8(jIetUFc2VFRXzyDNosXBRE^?bEgwZGCtXHmOEr_-eV=cLR-_Km-3{;8*< zJ@)#x%`*x2uUnV6Qrw)^O&iq)RabESPSo|9EL;JbT)8)LK2ig0a0(52LM*p4leuKVr;J%PYW7asK_*{@A;w zKP>elo$zqDzaC%HUbo5qhVR2aX_>c-->rgwz~7%Es@$ymqFV0bBFQGbo4=zU zN?c0)1odl^qOXV_@OYCvZ=TE2@i&Z<*&B

  • 3d(ZU%4IApQj&<=OT7s>Gw(j~aij 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

    F~6`_3HmDV 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�l$~m6{F+-b?Hr^=XI#| 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

  • 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ⅅ^v=y=>a|$>0rULK z@I>inyWz;ZSwUu5<*cFUrJwI10~-%+obh3w*x6F;_oe)vmia@z@EcJ>qz|I{{F^j; z{W0Wwtl#PBnYa&^2LNk^&&vaNE&h(a81ewt9a>{>DBrvJ@RCD6jYao@^-3Oqxc{x~ zCmO%c>&9*HW4O-enx8NF7}iT4mA=Zvm+~z8@qa(Jd8?H+k z0PDWEzy9MV;hEr1eEq@U>;8i;071^6I$fAE@+-xKRmztX6v2?`h(*C@?5!o{G9h^zhqg-vsth6 zcJwLH2iCIRVZ2js5AT%uMqbK!Wj;_p{(QAj_^3;^?yI{WW&Dw6#PT`z1@;G2kFOIn zx0>^qkq_wQ9ez6IXMFvv#>eVw<@d?|u|A6v%{T^u%KmLkx0ihZ>zO=&L$baw&WOM8 zv($%>@14+Ez2s^CHP$!krQoUX56G$!e|e0b7MH|tp?kK(-SpBXu*T<0>?Ln~|N_v8VHPl@}hJC6?imU-Xy>AOun zSKJ?74dYY%pY@aL5N~Y_FIev1T3J8wlb@_!Sa1<}0Qe)~P53yr#KnsV@b$AWy2jsC#`f88gPcy z@moCjllcF^onyoB4G&}VqR!|{ud6Q$Uw}N|(XH8=>??ngyd^p|-ly%8cSkqD>oH%x zTkZ5Jd9P27++D^CI5&A8`UMboeLk!J;!N;r;wz#7@~g8C&0gXI<23XGz`JMIe-)g3 zWbm4zgD>9y%HU-~wS4~%hW;lb5xxLSfnGd8{2=cC!=Z(T@wfL49yY|jXv@LnhKQHs z6L`F2x*LF-X}8I*f;V`4^#BO`3|@lAUe8@aXAh&B?{&`__9J{-c>!4PnWF}OGf4g) z^?&~EF**Rm=Z}Xii%ykxg~5Z0j=~Cqy9_=M|1A$-$)P2O;KOsb{uL|!uayU2oV0Ox zz~o0?4xhK1@A-1#{h@r$c=pN4$4frh_3riPc*EOrUAi`S3G18v0{V|DK{L0^_3T&a z@d>7--i!E1D{dj~FK^D*#S8sC{qSAEr@$u`PF)>%@7alG$g6)fbu;7-#Q(+p#rroJ zo;rko{Y35O75GN5Vwi{PMz?(^$L=fW#{`bQT6JRaSFDokbGIE{Ivysv3$?4$(T)B4 z)RKSNEV{YO&m&XsL>-F!p+m;>{>AIcEQ<>h(YO@A8djKG^&2cD@uQbAAPgsk7h|1Z^2=`oWPkA62i zVD9&d@gwNaTpC^x-(&r&>jHX5#Id8%*(T5EvHZDn8#@->~BGEVwp)_L%v zmBMod_cz~U{r9HP&E$3K^^KR$O}z_wJ$T@(7vlZ$0oEUxG<<)qmpG04uND8_w*G2~ z|E>?7OTOv;*4zb8(~<|_`CXrN^yu6N*U`s-FH_1aP(Ovj|!f?dh_H`Kf^qm znGfLp9{mdV1MD-1SGC?J@qY87+vfYoQ*po8AGi;e4

    5TzB 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