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

Added SkiaPanel. Added Swing integration support.

parent f6f64305
package SkijaInjectSample package SkijaInjectSample
import java.awt.Color
import java.awt.Dimension import java.awt.Dimension
import java.awt.BorderLayout import java.awt.BorderLayout
import java.awt.event.KeyEvent import java.awt.event.KeyEvent
...@@ -7,9 +8,11 @@ import java.awt.event.MouseEvent ...@@ -7,9 +8,11 @@ import java.awt.event.MouseEvent
import java.awt.event.MouseMotionAdapter import java.awt.event.MouseMotionAdapter
import javax.swing.JFrame import javax.swing.JFrame
import javax.swing.JButton import javax.swing.JButton
import javax.swing.JLayeredPane
import javax.swing.JPanel
import javax.swing.event.MouseInputAdapter import javax.swing.event.MouseInputAdapter
import javax.swing.WindowConstants import javax.swing.WindowConstants
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaPanel
fun Button(text: String): JButton { fun Button(text: String): JButton {
val btn = JButton(text) val btn = JButton(text)
...@@ -23,13 +26,25 @@ fun SwingSkia() { ...@@ -23,13 +26,25 @@ fun SwingSkia() {
window.defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE window.defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE
window.title = "SwingSkiaWindow" window.title = "SwingSkiaWindow"
val layer = SkiaLayer() val panel = SkiaPanel()
window.contentPane.add(Button("North"), BorderLayout.NORTH) window.contentPane.add(Button("North"), BorderLayout.NORTH)
window.contentPane.add(Button("West"), BorderLayout.WEST) window.contentPane.add(Button("West"), BorderLayout.WEST)
window.contentPane.add(Button("East"), BorderLayout.EAST) window.contentPane.add(Button("East"), BorderLayout.EAST)
window.contentPane.add(Button("South"), BorderLayout.SOUTH) 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() val state = State()
state.text = window.title state.text = window.title
...@@ -37,13 +52,13 @@ fun SwingSkia() { ...@@ -37,13 +52,13 @@ fun SwingSkia() {
var mouseX = 0 var mouseX = 0
var mouseY = 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) { override fun mouseMoved(event: MouseEvent) {
mouseX = event.x mouseX = event.x
mouseY = event.y mouseY = event.y
layer.display() panel.layer.display()
} }
}) })
......
package org.jetbrains.skiko package org.jetbrains.skiko
import java.awt.Component
import org.jetbrains.skija.BackendRenderTarget import org.jetbrains.skija.BackendRenderTarget
import org.jetbrains.skija.Canvas import org.jetbrains.skija.Canvas
import org.jetbrains.skija.ColorSpace import org.jetbrains.skija.ColorSpace
import org.jetbrains.skija.DirectContext import org.jetbrains.skija.DirectContext
import org.jetbrains.skija.FramebufferFormat import org.jetbrains.skija.FramebufferFormat
import org.jetbrains.skija.Rect
import org.jetbrains.skija.Surface import org.jetbrains.skija.Surface
import org.jetbrains.skija.SurfaceColorFormat import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skija.ClipMode
private class SkijaState { 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 context: DirectContext? = null
var renderTarget: BackendRenderTarget? = null var renderTarget: BackendRenderTarget? = null
var surface: Surface? = null var surface: Surface? = null
...@@ -32,6 +42,7 @@ open class SkiaLayer() : HardwareLayer() { ...@@ -32,6 +42,7 @@ open class SkiaLayer() : HardwareLayer() {
open val api: GraphicsApi = GraphicsApi.OPENGL open val api: GraphicsApi = GraphicsApi.OPENGL
var renderer: SkiaRenderer? = null var renderer: SkiaRenderer? = null
val clipComponets = mutableListOf<Component>()
private val skijaState = SkijaState() private val skijaState = SkijaState()
protected var inited: Boolean = false protected var inited: Boolean = false
...@@ -60,12 +71,33 @@ open class SkiaLayer() : HardwareLayer() { ...@@ -60,12 +71,33 @@ open class SkiaLayer() : HardwareLayer() {
} }
initSkija() initSkija()
skijaState.apply { skijaState.apply {
canvas!!.clear(-1) canvasBleach.invoke()
// cliping
for (component in clipComponets) {
clipRectBy(component)
}
renderer?.onRender(canvas!!, width, height) renderer?.onRender(canvas!!, width, height)
context!!.flush() 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() { private fun initSkija() {
val dpi = contentScale val dpi = contentScale
initRenderTarget(dpi) 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 ...@@ -5,7 +5,7 @@ import java.awt.event.ComponentEvent
import javax.swing.JFrame import javax.swing.JFrame
open class SkiaWindow : JFrame() { open class SkiaWindow : JFrame() {
val layer: SkiaLayer = SkiaLayer() val layer = SkiaLayer()
init { init {
contentPane.add(layer) 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