11package direct
22
3+ import androidx.compose.foundation.background
34import androidx.compose.foundation.layout.*
45import androidx.compose.material.Button
56import androidx.compose.material.MaterialTheme
67import androidx.compose.material.Surface
78import androidx.compose.material.Text
9+ import androidx.compose.runtime.getValue
10+ import androidx.compose.runtime.mutableStateOf
11+ import androidx.compose.runtime.setValue
812import androidx.compose.ui.Alignment
913import androidx.compose.ui.InternalComposeUiApi
1014import androidx.compose.ui.Modifier
15+ import androidx.compose.ui.graphics.Color
16+ import androidx.compose.ui.graphics.asComposeCanvas
1117import androidx.compose.ui.scene.PlatformLayersComposeScene
1218import androidx.compose.ui.unit.dp
1319import androidx.compose.ui.window.Window
1420import androidx.compose.ui.window.application
1521import dev.silenium.compose.gl.canvas.GLCanvas
1622import dev.silenium.compose.gl.graphicsApi
23+ import org.jetbrains.skia.*
1724import org.jetbrains.skiko.Version
1825
1926@OptIn(InternalComposeUiApi ::class )
2027fun main () = application {
2128 val glScene = PlatformLayersComposeScene ()
2229 glScene.setContent {
23- Text (" Hello from Skia on OpenGL" , style = MaterialTheme .typography.h2)
30+ Text (
31+ " Hello from Skia on OpenGL" ,
32+ style = MaterialTheme .typography.h2,
33+ modifier = Modifier .background(Color .White .copy(alpha = 0.5f )).padding(10 .dp),
34+ )
2435 }
2536
37+ var glSurface: Surface ? by mutableStateOf(null )
38+ var glContext: DirectContext ? by mutableStateOf(null )
39+ var glRenderTarget: BackendRenderTarget ? by mutableStateOf(null )
40+
2641 val renderer = SampleRenderer ()
2742 Window (onCloseRequest = ::exitApplication, title = " Test" ) {
2843 Box (Modifier .fillMaxSize()) {
@@ -34,9 +49,37 @@ fun main() = application {
3449 },
3550 onResize = { old, new ->
3651 println (" Resized from $old to $new , new fbo: ${fbo.id} " )
52+
53+ if (glContext == null ) {
54+ glContext = DirectContext .makeGL()
55+ }
56+ glSurface?.close()
57+ glRenderTarget?.close()
58+ glRenderTarget = BackendRenderTarget .makeGL(
59+ width = new.width,
60+ height = new.height,
61+ sampleCnt = 1 ,
62+ stencilBits = 8 ,
63+ fbId = fbo.id,
64+ fbFormat = fbo.colorAttachment.internalFormat,
65+ )
66+ glSurface = Surface .makeFromBackendRenderTarget(
67+ context = glContext!! , rt = glRenderTarget!! ,
68+ origin = SurfaceOrigin .TOP_LEFT ,
69+ colorFormat = SurfaceColorFormat .RGBA_8888 ,
70+ colorSpace = ColorSpace .sRGB,
71+ )
3772 },
3873 ) {
3974 renderer.draw()
75+ glContext?.resetGLAll()
76+ glSurface?.canvas?.let {
77+ it.save()
78+ it.translate(50f , 200f )
79+ glScene.render(it.asComposeCanvas(), 0L )
80+ it.restore()
81+ }
82+ glSurface?.flushAndSubmit()
4083 }
4184 Surface (
4285 shape = MaterialTheme .shapes.medium,
0 commit comments