Unverified Commit c959b367 authored by Pavel's avatar Pavel Committed by GitHub

Use background layer size and position for CALayer; make default logger configurable (#693)

* allow to configure logger in example applications

* use `layer.backedLayer` position and size as source to update CALayer

* non zero layer origin test
parent 4783e8a3
...@@ -14,6 +14,7 @@ import java.nio.file.Files ...@@ -14,6 +14,7 @@ import java.nio.file.Files
import javax.imageio.ImageIO import javax.imageio.ImageIO
fun main(args: Array<String>) { fun main(args: Array<String>) {
setupSkikoLoggerFactory { DefaultConsoleLogger.fromLevel(System.getProperty("skiko.log.level", "INFO")) }
val windows = parseArgs(args) val windows = parseArgs(args)
repeat(windows) { repeat(windows) {
when (System.getProperty("skiko.swing.interop")) { when (System.getProperty("skiko.swing.interop")) {
......
...@@ -29,11 +29,11 @@ internal class MetalContextHandler(layer: SkiaLayer) : JvmContextHandler(layer) ...@@ -29,11 +29,11 @@ internal class MetalContextHandler(layer: SkiaLayer) : JvmContextHandler(layer)
disposeCanvas() disposeCanvas()
val scale = layer.contentScale val scale = layer.contentScale
val w = (layer.width * scale).toInt().coerceAtLeast(0) val width = (layer.backedLayer.width * scale).toInt().coerceAtLeast(0)
val h = (layer.height * scale).toInt().coerceAtLeast(0) val height = (layer.backedLayer.height * scale).toInt().coerceAtLeast(0)
if (w > 0 && h > 0) { if (width > 0 && height > 0) {
renderTarget = metalRedrawer.makeRenderTarget(w, h) renderTarget = metalRedrawer.makeRenderTarget(width, height)
surface = Surface.makeFromBackendRenderTarget( surface = Surface.makeFromBackendRenderTarget(
context!!, context!!,
......
...@@ -125,13 +125,13 @@ internal class MetalRedrawer( ...@@ -125,13 +125,13 @@ internal class MetalRedrawer(
override fun syncSize() = synchronized(drawLock) { override fun syncSize() = synchronized(drawLock) {
check(isEventDispatchThread()) { "Method should be called from AWT event dispatch thread" } check(isEventDispatchThread()) { "Method should be called from AWT event dispatch thread" }
val rootPane = getRootPane(layer) val rootPane = getRootPane(layer)
val globalPosition = convertPoint(layer, layer.x, layer.y, rootPane) val globalPosition = convertPoint(layer.backedLayer, 0, 0, rootPane)
setContentScale(device, layer.contentScale) setContentScale(device, layer.contentScale)
val x = globalPosition.x val x = globalPosition.x
val y = rootPane.height - globalPosition.y - layer.height val y = rootPane.height - globalPosition.y - layer.height
val width = layer.width.coerceAtLeast(0) val width = layer.backedLayer.width.coerceAtLeast(0)
val height = layer.height.coerceAtLeast(0) val height = layer.backedLayer.height.coerceAtLeast(0)
Logger.debug { "MetalRedrawer#resizeLayers $this $x $y $width $height" } Logger.debug { "MetalRedrawer#resizeLayers $this {x: $x y: $y width: $width height: $height} rootPane: ${rootPane.size}" }
resizeLayers(device, x, y, width, height) resizeLayers(device, x, y, width, height)
} }
......
...@@ -21,6 +21,7 @@ import org.junit.Assert.assertEquals ...@@ -21,6 +21,7 @@ import org.junit.Assert.assertEquals
import org.junit.Assume.assumeTrue import org.junit.Assume.assumeTrue
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
import java.awt.BorderLayout
import java.awt.Color import java.awt.Color
import java.awt.Dimension import java.awt.Dimension
import java.awt.event.ComponentAdapter import java.awt.event.ComponentAdapter
...@@ -28,6 +29,7 @@ import java.awt.event.ComponentEvent ...@@ -28,6 +29,7 @@ import java.awt.event.ComponentEvent
import java.awt.event.WindowEvent import java.awt.event.WindowEvent
import javax.swing.JFrame import javax.swing.JFrame
import javax.swing.JLayeredPane import javax.swing.JLayeredPane
import javax.swing.JPanel
import javax.swing.SwingUtilities import javax.swing.SwingUtilities
import javax.swing.WindowConstants import javax.swing.WindowConstants
import kotlin.random.Random import kotlin.random.Random
...@@ -596,6 +598,31 @@ class SkiaLayerTest { ...@@ -596,6 +598,31 @@ class SkiaLayerTest {
} }
@Test
fun `non zero layer origin`() = uiTest {
val window = UiTestWindow(setupContent = {
isUndecorated = true
setLocation(200, 200)
setSize(300, 100)
val panel = JPanel()
panel.preferredSize = Dimension(100, 100)
panel.background = Color.GREEN
contentPane.add(panel, BorderLayout.WEST)
layer.skikoView = RectRenderer(layer, 100, 100, Color.RED)
contentPane.add(layer, BorderLayout.CENTER)
})
try {
window.isUndecorated = true
window.isVisible = true
delay(1000)
screenshots.assert(window.bounds, "frame")
} finally {
window.close()
}
}
@Test @Test
fun `render text (Windows)`() { fun `render text (Windows)`() {
testRenderText(OS.Windows) testRenderText(OS.Windows)
......
...@@ -34,7 +34,8 @@ internal class UiTestScope( ...@@ -34,7 +34,8 @@ internal class UiTestScope(
fun UiTestWindow( fun UiTestWindow(
properties: SkiaLayerProperties = SkiaLayerProperties(), properties: SkiaLayerProperties = SkiaLayerProperties(),
analytics: SkiaLayerAnalytics = SkiaLayerAnalytics.Empty, analytics: SkiaLayerAnalytics = SkiaLayerAnalytics.Empty,
renderFactory: RenderFactory = RenderFactory.Default renderFactory: RenderFactory = RenderFactory.Default,
setupContent: UiTestWindow.() -> Unit = { contentPane.add(layer) }
) = object : UiTestWindow() { ) = object : UiTestWindow() {
override val layer: SkiaLayer = SkiaLayer( override val layer: SkiaLayer = SkiaLayer(
properties = properties.copy(renderApi = renderApi), properties = properties.copy(renderApi = renderApi),
...@@ -43,7 +44,7 @@ internal class UiTestScope( ...@@ -43,7 +44,7 @@ internal class UiTestScope(
) )
init { init {
contentPane.add(layer) setupContent()
} }
override fun dispose() { override fun dispose() {
......
...@@ -24,17 +24,36 @@ fun setupSkikoLoggerFactory(createLogger: () -> SkikoLoggerInterface) { ...@@ -24,17 +24,36 @@ fun setupSkikoLoggerFactory(createLogger: () -> SkikoLoggerInterface) {
Logger.loggerFactory = createLogger Logger.loggerFactory = createLogger
} }
internal object DefaultConsoleLogger: SkikoLoggerInterface { internal enum class LogLevel {
override val isTraceEnabled: Boolean TRACE,
get() = false DEBUG,
override val isDebugEnabled: Boolean INFO,
get() = false WARN,
override val isInfoEnabled: Boolean ERROR;
get() = true
override val isWarnEnabled: Boolean fun noMoreVerboseThan(other: LogLevel): Boolean {
get() = true return this.ordinal >= other.ordinal
override val isErrorEnabled: Boolean }
get() = true }
class DefaultConsoleLogger(override val isTraceEnabled: Boolean = false,
override val isDebugEnabled: Boolean = false,
override val isInfoEnabled: Boolean = true,
override val isWarnEnabled: Boolean = true,
override val isErrorEnabled: Boolean = true): SkikoLoggerInterface {
companion object {
fun fromLevel(level: String): DefaultConsoleLogger {
val logLevel = LogLevel.values().filter { it.name == level }.firstOrNull() ?: LogLevel.INFO
return DefaultConsoleLogger(
isTraceEnabled = LogLevel.TRACE.noMoreVerboseThan(logLevel),
isDebugEnabled = LogLevel.DEBUG.noMoreVerboseThan(logLevel),
isInfoEnabled = LogLevel.INFO.noMoreVerboseThan(logLevel),
isWarnEnabled = LogLevel.WARN.noMoreVerboseThan(logLevel),
isErrorEnabled = LogLevel.ERROR.noMoreVerboseThan(logLevel)
)
}
}
override fun trace(message: String) { override fun trace(message: String) {
println("[SKIKO] trace: $message") println("[SKIKO] trace: $message")
...@@ -83,7 +102,7 @@ internal object DefaultConsoleLogger: SkikoLoggerInterface { ...@@ -83,7 +102,7 @@ internal object DefaultConsoleLogger: SkikoLoggerInterface {
} }
internal object Logger { internal object Logger {
var loggerFactory: () -> SkikoLoggerInterface = { DefaultConsoleLogger } var loggerFactory: () -> SkikoLoggerInterface = { DefaultConsoleLogger() }
val loggerImpl by lazy { val loggerImpl by lazy {
loggerFactory() loggerFactory()
......
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