fix reading of png rgb

This commit is contained in:
Moritz Zwerger 2023-11-25 22:42:00 +01:00
parent 35a9a08880
commit 6cfb689f7b
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
4 changed files with 38 additions and 3 deletions

View File

@ -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()
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

View File

@ -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)

View File

@ -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)
}