Skip to content

Commit

Permalink
Do not fail with non per-platform NativeImage (#2277)
Browse files Browse the repository at this point in the history
  • Loading branch information
soywiz authored Jul 23, 2024
1 parent 4edeb8b commit af50bb1
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 23 deletions.
6 changes: 5 additions & 1 deletion korge-core/src/korlibs/kgl/KmlGl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,11 @@ open class KmlGl : Extra by Extra.Mixin(), AGFeatures {
open fun stencilOp(fail: Int, zfail: Int, zpass: Int): Unit = TODO()
open fun stencilOpSeparate(face: Int, sfail: Int, dpfail: Int, dppass: Int): Unit = TODO()
open fun texImage2D(target: Int, level: Int, internalformat: Int, width: Int, height: Int, border: Int, format: Int, type: Int, pixels: Buffer?): Unit = TODO()
open fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage): Unit = TODO()
open fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage): Unit {
val buffer = Buffer(data.width * data.height * 4, direct = true)
buffer.setArrayLE(0, data.toBMP32IfRequired().ints)
texImage2D(target, level, internalformat, data.width, data.height, 0, format, type, buffer)
}
open fun texParameterf(target: Int, pname: Int, param: Float): Unit = TODO()
open fun texParameterfv(target: Int, pname: Int, params: Buffer): Unit = TODO()
open fun texParameteri(target: Int, pname: Int, param: Int): Unit = TODO()
Expand Down
5 changes: 0 additions & 5 deletions korge-core/src/korlibs/sdl/SDL.kt
Original file line number Diff line number Diff line change
Expand Up @@ -396,11 +396,6 @@ class KmlGlOpenGL(val gl: OpenGL = OpenGL()) : KmlGl() {
override fun texImage2D(target: Int, level: Int, internalformat: Int, width: Int, height: Int, border: Int, format: Int, type: Int, pixels: Buffer?): Unit {
gl.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels?.pointer)
}
override fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage): Unit {
val buffer = Buffer(data.width * data.height * 4)
buffer.setArrayLE(0, data.toBMP32IfRequired().ints)
texImage2D(target, level, internalformat, data.width, data.height, 0, format, type, buffer)
}
override fun texParameterf(target: Int, pname: Int, param: Float): Unit = gl.glTexParameterf(target, pname, param)
override fun texParameterfv(target: Int, pname: Int, params: Buffer): Unit = gl.glTexParameterfv(target, pname, params.pointer)
override fun texParameteri(target: Int, pname: Int, param: Int): Unit = gl.glTexParameteri(target, pname, param)
Expand Down
16 changes: 10 additions & 6 deletions korge-core/src@android/korlibs/kgl/KmlGlAndroid.kt
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,16 @@ class KmlGlAndroid(val clientVersion: () -> Int) : KmlGl() {
override fun stencilOpSeparate(face: Int, sfail: Int, dpfail: Int, dppass: Int): Unit = glStencilOpSeparate(face, sfail, dpfail, dppass)
override fun texImage2D(target: Int, level: Int, internalformat: Int, width: Int, height: Int, border: Int, format: Int, type: Int, pixels: Buffer?): Unit = glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels?.nioBuffer)
override fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage) {
val out = ByteBuffer.allocateDirect(data.width * data.height * 4)
val image = (data as AndroidNativeImage)
image.androidBitmap.copyPixelsToBuffer(out)
out.flip()
glTexImage2D(target, level, internalformat, data.width, data.height, 0, format, type, out)
out.clear()
when (data) {
is AndroidNativeImage -> {
val out = ByteBuffer.allocateDirect(data.width * data.height * 4)
data.androidBitmap.copyPixelsToBuffer(out)
out.flip()
glTexImage2D(target, level, internalformat, data.width, data.height, 0, format, type, out)
out.clear()
}
else -> return super.texImage2D(target, level, internalformat, format, type, data)
}
}
override fun texParameterf(target: Int, pname: Int, param: Float): Unit = glTexParameterf(target, pname, param)
override fun texParameterfv(target: Int, pname: Int, params: Buffer): Unit = glTexParameterfv(target, pname, params.directFloatBuffer)
Expand Down
11 changes: 10 additions & 1 deletion korge-core/src@darwin/korlibs/kgl/KmlGlNative.kt
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,16 @@ actual class KmlGlNative actual constructor() : NativeBaseKmlGl() {
override fun stencilOp(fail: Int, zfail: Int, zpass: Int): Unit = tempBufferAddress { glStencilOp(fail.convert(), zfail.convert(), zpass.convert()) }
override fun stencilOpSeparate(face: Int, sfail: Int, dpfail: Int, dppass: Int): Unit = tempBufferAddress { glStencilOpSeparate(face.convert(), sfail.convert(), dpfail.convert(), dppass.convert()) }
override fun texImage2D(target: Int, level: Int, internalformat: Int, width: Int, height: Int, border: Int, format: Int, type: Int, pixels: Buffer?): Unit = tempBufferAddress { glTexImage2D(target.convert(), level.convert(), internalformat.convert(), width.convert(), height.convert(), border.convert(), format.convert(), type.convert(), pixels?.unsafeAddress()) }
override fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage): Unit = tempBufferAddress { run { val intData = (data as BitmapNativeImage).intData; if (intData != null) { intData.usePinned { dataPin -> glTexImage2D(target.convert(), level.convert(), internalformat.convert(), data.width.convert(), data.height.convert(), 0.convert(), format.convert(), type.convert(), dataPin.addressOf(0)) }} else { glTexImage2D(target.convert(), level.convert(), internalformat.convert(), data.width.convert(), data.height.convert(), 0.convert(), format.convert(), type.convert(), null)}} }
override fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage): Unit {
when (data) {
is BitmapNativeImage -> {
data.intData.usePinned { dataPin ->
glTexImage2D(target.convert(), level.convert(), internalformat.convert(), data.width.convert(), data.height.convert(), 0.convert(), format.convert(), type.convert(), dataPin.addressOf(0))
}
}
else -> super.texImage2D(target, level, internalformat, format, type, data)
}
}
override fun texParameterf(target: Int, pname: Int, param: Float): Unit = tempBufferAddress { glTexParameterf(target.convert(), pname.convert(), param) }
override fun texParameterfv(target: Int, pname: Int, params: Buffer): Unit = tempBufferAddress { glTexParameterfv(target.convert(), pname.convert(), params.unsafeAddress().reinterpret()) }
override fun texParameteri(target: Int, pname: Int, param: Int): Unit = tempBufferAddress { glTexParameteri(target.convert(), pname.convert(), param.convert()) }
Expand Down
11 changes: 8 additions & 3 deletions korge-core/src@js/korlibs/kgl/KmlGlJsCanvas.kt
Original file line number Diff line number Diff line change
Expand Up @@ -193,9 +193,14 @@ class KmlGlJsCanvas(val canvas: HTMLCanvasElement, val glOpts: dynamic) : KmlGl(
gl.texImage2D(target, level, internalformat, width, height, border, format, type, vpixels)
}
override fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage): Unit {
gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, (!data.asumePremultiplied && data.premultiplied).toInt())
gl.texImage2D(target, level, internalformat, format, type, (data as HtmlNativeImage).texSource)
gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0)
when (data) {
is HtmlNativeImage -> {
gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, (!data.asumePremultiplied && data.premultiplied).toInt())
gl.texImage2D(target, level, internalformat, format, type, data.texSource)
gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0)
}
else -> return super.texImage2D(target, level, internalformat, format, type, data)
}
}
override fun texParameterf(target: Int, pname: Int, param: Float): Unit = gl.texParameterf(target, pname, param)
override fun texParameterfv(target: Int, pname: Int, params: Buffer): Unit = gl.texParameterf(target, pname, params.arrayFloat[0])
Expand Down
7 changes: 6 additions & 1 deletion korge-core/src@jvm/korlibs/render/platform/NativeKgl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import com.sun.jna.*
import korlibs.graphics.shader.gl.*
import korlibs.image.awt.*
import korlibs.image.bitmap.*
import korlibs.image.format.*
import korlibs.kgl.*
import korlibs.math.*
import korlibs.memory.*
import java.nio.IntBuffer

open class NativeKgl constructor(private val gl: INativeGL) : KmlGl() {
override val variant: GLVariant = GLVariant.JVM
Expand Down Expand Up @@ -118,7 +120,10 @@ open class NativeKgl constructor(private val gl: INativeGL) : KmlGl() {
override fun stencilOpSeparate(face: Int, sfail: Int, dpfail: Int, dppass: Int): Unit = gl.glStencilOpSeparate(face, sfail, dpfail, dppass)
override fun texImage2D(target: Int, level: Int, internalformat: Int, width: Int, height: Int, border: Int, format: Int, type: Int, pixels: Buffer?): Unit = gl.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels?.nioBuffer)
override fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage): Unit {
gl.glTexImage2D(target, level, internalformat, data.width, data.height, 0, format, type, (data as BaseAwtNativeImage).buffer)
when (data) {
is BaseAwtNativeImage -> gl.glTexImage2D(target, level, internalformat, data.width, data.height, 0, format, type, data.buffer)
else -> super.texImage2D(target, level, internalformat, format, type, data)
}
}
override fun texParameterf(target: Int, pname: Int, param: Float): Unit = gl.glTexParameterf(target, pname, param)
override fun texParameterfv(target: Int, pname: Int, params: Buffer): Unit = gl.glTexParameterfv(target, pname, params.directFloatBuffer)
Expand Down
11 changes: 8 additions & 3 deletions korge-core/src@native/korlibs/kgl/KmlGlNativeExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,14 @@ abstract class NativeBaseKmlGl : KmlGl() {
override fun stencilOpSeparate(face: Int, sfail: Int, dpfail: Int, dppass: Int): Unit = tempBufferAddress { glStencilOpSeparateExt(face.convert(), sfail.convert(), dpfail.convert(), dppass.convert()) }
override fun texImage2D(target: Int, level: Int, internalformat: Int, width: Int, height: Int, border: Int, format: Int, type: Int, pixels: Buffer?): Unit = tempBufferAddress { glTexImage2DExt(target.convert(), level.convert(), internalformat.convert(), width.convert(), height.convert(), border.convert(), format.convert(), type.convert(), pixels?.unsafeAddress()) }
override fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage): Unit = tempBufferAddress {
val intData = (data as BitmapNativeImage).intData;
intData.usePinned { dataPin ->
glTexImage2DExt(target.convert(), level.convert(), internalformat.convert(), data.width.convert(), data.height.convert(), 0.convert(), format.convert(), type.convert(), dataPin.startAddressOf.reinterpret())
when (data) {
is BitmapNativeImage -> {
val intData = data.intData;
intData.usePinned { dataPin ->
glTexImage2DExt(target.convert(), level.convert(), internalformat.convert(), data.width.convert(), data.height.convert(), 0.convert(), format.convert(), type.convert(), dataPin.startAddressOf.reinterpret())
}
}
else -> super.texImage2D(target, level, internalformat, format, type, data)
}
}
override fun texParameterf(target: Int, pname: Int, param: Float): Unit = tempBufferAddress { glTexParameterfExt(target.convert(), pname.convert(), param) }
Expand Down
11 changes: 8 additions & 3 deletions korge-core/src@wasmJs/korlibs/kgl/KmlGlWasmCanvas.kt
Original file line number Diff line number Diff line change
Expand Up @@ -225,9 +225,14 @@ class KmlGlWasmCanvas(val canvas: HTMLCanvasElement, val glOpts: JsAny) : KmlGl(
gl.texImage2D(target, level, internalformat, width, height, border, format, type, vpixels)
}
override fun texImage2D(target: Int, level: Int, internalformat: Int, format: Int, type: Int, data: NativeImage): Unit {
gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, (!data.asumePremultiplied && data.premultiplied).toInt())
gl.texImage2D(target, level, internalformat, format, type, (data as WasmHtmlNativeImage).texSource)
gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0)
when (data) {
is WasmHtmlNativeImage -> {
gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, (!data.asumePremultiplied && data.premultiplied).toInt())
gl.texImage2D(target, level, internalformat, format, type, data.texSource)
gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0)
}
else -> super.texImage2D(target, level, internalformat, format, type, data)
}
}
override fun texParameterf(target: Int, pname: Int, param: Float): Unit = gl.texParameterf(target, pname, param)
override fun texParameterfv(target: Int, pname: Int, params: Buffer): Unit = gl.texParameterf(target, pname, params.arrayFloat[0])
Expand Down

0 comments on commit af50bb1

Please sign in to comment.