From 6cfb689f7bddf87cb17bf5cb77b63c068113d088 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Sat, 25 Nov 2023 22:42:00 +0100 Subject: [PATCH] fix reading of png rgb --- .../rendering/textures/TextureReadingTest.kt | 33 ++++++++++++++++++ .../resources/texture_reading/sand.png | Bin 0 -> 189 bytes .../opengl/texture/OpenGLTextureUtil.kt | 2 +- .../gui/rendering/textures/TextureUtil.kt | 6 ++-- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/integration-test/resources/texture_reading/sand.png diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/textures/TextureReadingTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/textures/TextureReadingTest.kt index 51e617620..6e02b9803 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/textures/TextureReadingTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/textures/TextureReadingTest.kt @@ -14,6 +14,8 @@ package de.bixilon.minosoft.gui.rendering.textures import de.bixilon.kotlinglm.vec2.Vec2i +import de.bixilon.minosoft.gui.rendering.system.base.texture.data.buffer.RGB8Buffer +import de.bixilon.minosoft.gui.rendering.system.base.texture.data.buffer.RGBA8Buffer import de.bixilon.minosoft.gui.rendering.system.base.texture.data.buffer.TextureBuffer import de.bixilon.minosoft.gui.rendering.system.base.texture.data.buffer.TextureBufferFactory import org.testng.Assert.assertEquals @@ -25,6 +27,7 @@ import java.io.InputStream class TextureReadingTest { private val GRAY_GRAY = TextureReadingTest::class.java.getResourceAsStream("/texture_reading/gray_gray.png")!!.readAllBytes() private val GRAY_RGB = TextureReadingTest::class.java.getResourceAsStream("/texture_reading/gray_rgb.png")!!.readAllBytes() + private val SAND = TextureReadingTest::class.java.getResourceAsStream("/texture_reading/sand.png")!!.readAllBytes() private val READ_1 = TextureUtil::class.java.getDeclaredMethod("readTexture1", InputStream::class.java, TextureBufferFactory::class.java).apply { isAccessible = true } private val READ_2 = TextureUtil::class.java.getDeclaredMethod("readTexture2", InputStream::class.java, TextureBufferFactory::class.java).apply { isAccessible = true } @@ -62,4 +65,34 @@ class TextureReadingTest { val texture = READ_2.invoke(TextureUtil, ByteArrayInputStream(GRAY_GRAY), null) as TextureBuffer texture.assertGray() } + + private fun TextureBuffer.assertSand() { + assertEquals(getRGBA(0, 0), 0xE7E4BBFF.toInt()) + assertEquals(getRGBA(1, 0), 0xDACFA3FF.toInt()) + assertEquals(getRGBA(0, 1), 0xD5C496FF.toInt()) + + } + + fun `read1 sand rgba`() { + val texture = READ_1.invoke(TextureUtil, ByteArrayInputStream(SAND), TextureBufferFactory { RGBA8Buffer(it) }) as TextureBuffer + texture.assertSand() + } + + @Test(enabled = false) + fun `read1 sand rgb`() { + val texture = READ_1.invoke(TextureUtil, ByteArrayInputStream(SAND), TextureBufferFactory { RGB8Buffer(it) }) as TextureBuffer + texture.assertSand() + } + + @Test(enabled = false) + fun `read2 sand rgba`() { + val texture = READ_2.invoke(TextureUtil, ByteArrayInputStream(SAND), TextureBufferFactory { RGBA8Buffer(it) }) as TextureBuffer + texture.assertSand() + } + + @Test(enabled = false) + fun `read2 sand rgb`() { + val texture = READ_2.invoke(TextureUtil, ByteArrayInputStream(SAND), TextureBufferFactory { RGB8Buffer(it) }) as TextureBuffer + texture.assertSand() + } } diff --git a/src/integration-test/resources/texture_reading/sand.png b/src/integration-test/resources/texture_reading/sand.png new file mode 100644 index 0000000000000000000000000000000000000000..b03c96babcb261df63c81c921d3c03a51f904b55 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWef#?K^C!C>-`;TR{Nk%e zrd{0C6@Qh_8Yr9Q>Eaktaf{XAAnzdqfz1woChl^SVOw$j@8#kMhF$-4IA;57liK+E zmYj9P+|aTGFD-Ai-icntvF_j*F2DVo>&#*{Ue9a!RU(nIvUGbP0l+XkKNp4RZ literal 0 HcmV?d00001 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureUtil.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureUtil.kt index 02578efaf..d4f2aeb9e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureUtil.kt @@ -27,7 +27,7 @@ object OpenGLTextureUtil { glBindTexture(GL_TEXTURE_2D_ARRAY, textureId) glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT) - glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, if (mipmaps == 0) GL_NEAREST else GL_NEAREST_MIPMAP_NEAREST) + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, if (mipmaps == 0) GL_NEAREST else GL_NEAREST_MIPMAP_LINEAR) glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, mipmaps) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureUtil.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureUtil.kt index 91f5fb557..4c2b2ebf9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureUtil.kt @@ -52,8 +52,9 @@ object TextureUtil { val decoder = PNGDecoder(this) val size = Vec2i(decoder.width, decoder.height) val buffer = factory?.create(size) ?: when { - decoder.hasAlphaChannel() -> RGBA8Buffer(size) - else -> RGB8Buffer(size) + decoder.hasAlphaChannel() && decoder.hasAlpha() -> RGBA8Buffer(size) + // else -> RGB8Buffer(size) // TODO: pngdecoder is broken + else -> RGBA8Buffer(size) } val format = when { buffer.bits == 8 && buffer.components == 4 && buffer.alpha -> PNGDecoder.Format.RGBA @@ -99,6 +100,7 @@ object TextureUtil { return try { readTexture1(factory) } catch (exception: Throwable) { + exception.printStackTrace() this.reset() readTexture2(factory) }