Commit 07c14932 authored by Roman Sedaikin's avatar Roman Sedaikin

Added SkiaPanel. Added Swing integration support.

parent f6f64305
package SkijaInjectSample
import java.awt.Color
import java.awt.Dimension
import java.awt.BorderLayout
import java.awt.event.KeyEvent
......@@ -7,9 +8,11 @@ import java.awt.event.MouseEvent
import java.awt.event.MouseMotionAdapter
import javax.swing.JFrame
import javax.swing.JButton
import javax.swing.JLayeredPane
import javax.swing.JPanel
import javax.swing.event.MouseInputAdapter
import javax.swing.WindowConstants
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkiaPanel
fun Button(text: String): JButton {
val btn = JButton(text)
......@@ -23,13 +26,25 @@ fun SwingSkia() {
window.defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE
window.title = "SwingSkiaWindow"
val layer = SkiaLayer()
val panel = SkiaPanel()
window.contentPane.add(Button("North"), BorderLayout.NORTH)
window.contentPane.add(Button("West"), BorderLayout.WEST)
window.contentPane.add(Button("East"), BorderLayout.EAST)
window.contentPane.add(Button("South"), BorderLayout.SOUTH)
window.contentPane.add(layer, BorderLayout.CENTER)
window.contentPane.add(panel, BorderLayout.CENTER)
val btnPanelOK = JPanel()
btnPanelOK.setLayout(BorderLayout(0, 0))
btnPanelOK.setBounds(50, 50, 200, 40)
btnPanelOK.setBackground(Color.white)
btnPanelOK.add(JButton("OK"))
val btnCancel = JButton("Cancel")
btnCancel.setBounds(300, 50, 200, 40)
panel.add(btnPanelOK)
panel.add(btnCancel)
val state = State()
state.text = window.title
......@@ -37,13 +52,13 @@ fun SwingSkia() {
var mouseX = 0
var mouseY = 0
layer.renderer = Renderer { renderer, w, h -> displayScene(renderer, w, h, mouseX, mouseY, state) }
panel.layer.renderer = Renderer { renderer, w, h -> displayScene(renderer, w, h, mouseX, mouseY, state) }
layer.addMouseMotionListener(object : MouseMotionAdapter() {
panel.layer.addMouseMotionListener(object : MouseMotionAdapter() {
override fun mouseMoved(event: MouseEvent) {
mouseX = event.x
mouseY = event.y
layer.display()
panel.layer.display()
}
})
......
package org.jetbrains.skiko
import java.awt.Component
import org.jetbrains.skija.BackendRenderTarget
import org.jetbrains.skija.Canvas
import org.jetbrains.skija.ColorSpace
import org.jetbrains.skija.DirectContext
import org.jetbrains.skija.FramebufferFormat
import org.jetbrains.skija.Rect
import org.jetbrains.skija.Surface
import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skija.ClipMode
private class SkijaState {
val canvasBleach: () -> Unit
init {
when (hostOs) {
OS.MacOS -> canvasBleach = { canvas?.clear(0) }
else -> canvasBleach = { canvas?.clear(-1) }
}
}
var context: DirectContext? = null
var renderTarget: BackendRenderTarget? = null
var surface: Surface? = null
......@@ -32,6 +42,7 @@ open class SkiaLayer() : HardwareLayer() {
open val api: GraphicsApi = GraphicsApi.OPENGL
var renderer: SkiaRenderer? = null
val clipComponets = mutableListOf<Component>()
private val skijaState = SkijaState()
protected var inited: Boolean = false
......@@ -60,12 +71,33 @@ open class SkiaLayer() : HardwareLayer() {
}
initSkija()
skijaState.apply {
canvas!!.clear(-1)
canvasBleach.invoke()
// cliping
for (component in clipComponets) {
clipRectBy(component)
}
renderer?.onRender(canvas!!, width, height)
context!!.flush()
}
}
private fun clipRectBy(component: Component) {
skijaState.apply {
canvas!!.clipRect(
Rect.makeLTRB(
component.x.toFloat(),
component.y.toFloat(),
component.x.toFloat() + component.width.toFloat(),
component.y.toFloat() + component.height.toFloat()
),
ClipMode.DIFFERENCE,
true
)
}
}
private fun initSkija() {
val dpi = contentScale
initRenderTarget(dpi)
......
package org.jetbrains.skiko
import java.awt.Color
import java.awt.Component
import java.awt.event.ComponentAdapter
import java.awt.event.ComponentEvent
import javax.swing.JLayeredPane
import org.jetbrains.skija.Rect
open class SkiaPanel: JLayeredPane {
val layer = SkiaLayer()
constructor() : super() {
setLayout(null)
setBackground(Color.white)
}
override fun add(component: Component): Component {
layer.clipComponets.add(component)
return super.add(component, Integer.valueOf(0))
}
override fun addNotify() {
super.addNotify()
super.add(layer, Integer.valueOf(10))
addComponentListener(object : ComponentAdapter() {
override fun componentResized(e: ComponentEvent) {
layer.reinit()
layer.setSize(width, height)
}
})
}
override fun removeNotify() {
super.removeNotify()
}
}
......@@ -5,7 +5,7 @@ import java.awt.event.ComponentEvent
import javax.swing.JFrame
open class SkiaWindow : JFrame() {
val layer: SkiaLayer = SkiaLayer()
val layer = SkiaLayer()
init {
contentPane.add(layer)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment