diff --git a/src/ImageSharp.Textures/Formats/Ktx2/Ktx2DecoderCore.cs b/src/ImageSharp.Textures/Formats/Ktx2/Ktx2DecoderCore.cs index 6decbef..4623904 100644 --- a/src/ImageSharp.Textures/Formats/Ktx2/Ktx2DecoderCore.cs +++ b/src/ImageSharp.Textures/Formats/Ktx2/Ktx2DecoderCore.cs @@ -69,7 +69,8 @@ public Texture DecodeTexture(Stream stream) int width = (int)this.ktxHeader.PixelWidth; int height = (int)this.ktxHeader.PixelHeight; - var levelIndices = new LevelIndex[this.ktxHeader.LevelCount]; + // Zero levels means only the base level is present, so we must read at least 1. + LevelIndex[] levelIndices = new LevelIndex[Math.Max(1, this.ktxHeader.LevelCount)]; for (int i = 0; i < levelIndices.Length; i++) { stream.Read(this.buffer, 0, 24); diff --git a/tests/ImageSharp.Textures.Tests/Formats/Ktx2/Ktx2DecoderFlatTests.cs b/tests/ImageSharp.Textures.Tests/Formats/Ktx2/Ktx2DecoderFlatTests.cs new file mode 100644 index 0000000..05952bb --- /dev/null +++ b/tests/ImageSharp.Textures.Tests/Formats/Ktx2/Ktx2DecoderFlatTests.cs @@ -0,0 +1,32 @@ +// Copyright (c) Six Labors. +// Licensed under the Six Labors Split License. + +using System.ComponentModel; +using SixLabors.ImageSharp.Textures.Formats.Ktx2; +using SixLabors.ImageSharp.Textures.Tests.Enums; +using SixLabors.ImageSharp.Textures.Tests.TestUtilities.Attributes; +using SixLabors.ImageSharp.Textures.Tests.TestUtilities.TextureProviders; +using SixLabors.ImageSharp.Textures.TextureFormats; + +namespace SixLabors.ImageSharp.Textures.Tests.Formats.Ktx2; + +[Trait("Format", "Ktx2")] +public class Ktx2DecoderFlatTests +{ + private static readonly Ktx2Decoder Ktx2Decoder = new(); + + [Theory] + [Description("Ensure that a single mipmap level does not result in an empty mipmap collection")] + [WithFile(TestTextureFormat.Ktx2, TestTextureType.Flat, TestTextureTool.ToKtx, TestImages.Ktx2.Rgba32SrgbMips)] + public void Ktx2Decoder_LevelCountZero_DecodesBaseLevelMipMap(TestTextureProvider provider) + { + using Texture texture = provider.GetTexture(Ktx2Decoder); + provider.SaveTextures(texture); + + FlatTexture flatTexture = texture as FlatTexture; + Assert.NotNull(flatTexture); + Assert.Single(flatTexture.MipMaps); + Assert.Equal(256, flatTexture.MipMaps[0].GetImage().Width); + Assert.Equal(256, flatTexture.MipMaps[0].GetImage().Height); + } +} diff --git a/tests/ImageSharp.Textures.Tests/TestImages.cs b/tests/ImageSharp.Textures.Tests/TestImages.cs index d3df36c..4280d5f 100644 --- a/tests/ImageSharp.Textures.Tests/TestImages.cs +++ b/tests/ImageSharp.Textures.Tests/TestImages.cs @@ -12,5 +12,10 @@ public static class Ktx { public const string Rgba = "rgba8888.ktx"; } + + public static class Ktx2 + { + public const string Rgba32SrgbMips = "rgba32-srgb-mips.ktx2"; + } } } diff --git a/tests/Images/Input/Ktx2/rgba32-srgb-mips.ktx2 b/tests/Images/Input/Ktx2/rgba32-srgb-mips.ktx2 new file mode 100644 index 0000000..d5de31e --- /dev/null +++ b/tests/Images/Input/Ktx2/rgba32-srgb-mips.ktx2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90846eff319fdfd03121b3e0300fc4106ddcc2a4df881598cca9978e04710004 +size 393468