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
import javax.imageio.ImageIO
fun main(args: Array<String>) {
setupSkikoLoggerFactory { DefaultConsoleLogger.fromLevel(System.getProperty("skiko.log.level", "INFO")) }
val windows = parseArgs(args)
repeat(windows) {
when (System.getProperty("skiko.swing.interop")) {
......
......@@ -29,11 +29,11 @@ internal class MetalContextHandler(layer: SkiaLayer) : JvmContextHandler(layer)
disposeCanvas()
val scale = layer.contentScale
val w = (layer.width * scale).toInt().coerceAtLeast(0)
val h = (layer.height * scale).toInt().coerceAtLeast(0)
val width = (layer.backedLayer.width * scale).toInt().coerceAtLeast(0)
val height = (layer.backedLayer.height * scale).toInt().coerceAtLeast(0)
if (w > 0 && h > 0) {
renderTarget = metalRedrawer.makeRenderTarget(w, h)
if (width > 0 && height > 0) {
renderTarget = metalRedrawer.makeRenderTarget(width, height)
surface = Surface.makeFromBackendRenderTarget(
context!!,
......
......@@ -125,13 +125,13 @@ internal class MetalRedrawer(
override fun syncSize() = synchronized(drawLock) {
check(isEventDispatchThread()) { "Method should be called from AWT event dispatch thread" }
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)
val x = globalPosition.x
val y = rootPane.height - globalPosition.y - layer.height
val width = layer.width.coerceAtLeast(0)
val height = layer.height.coerceAtLeast(0)
Logger.debug { "MetalRedrawer#resizeLayers $this $x $y $width $height" }
val width = layer.backedLayer.width.coerceAtLeast(0)
val height = layer.backedLayer.height.coerceAtLeast(0)
Logger.debug { "MetalRedrawer#resizeLayers $this {x: $x y: $y width: $width height: $height} rootPane: ${rootPane.size}" }
resizeLayers(device, x, y, width, height)
}
......
......@@ -21,6 +21,7 @@ import org.junit.Assert.assertEquals
import org.junit.Assume.assumeTrue
import org.junit.Rule
import org.junit.Test
import java.awt.BorderLayout
import java.awt.Color
import java.awt.Dimension
import java.awt.event.ComponentAdapter
......@@ -28,6 +29,7 @@ import java.awt.event.ComponentEvent
import java.awt.event.WindowEvent
import javax.swing.JFrame
import javax.swing.JLayeredPane
import javax.swing.JPanel
import javax.swing.SwingUtilities
import javax.swing.WindowConstants
import kotlin.random.Random
......@@ -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
fun `render text (Windows)`() {
testRenderText(OS.Windows)
......
......@@ -34,7 +34,8 @@ internal class UiTestScope(
fun UiTestWindow(
properties: SkiaLayerProperties = SkiaLayerProperties(),
analytics: SkiaLayerAnalytics = SkiaLayerAnalytics.Empty,
renderFactory: RenderFactory = RenderFactory.Default
renderFactory: RenderFactory = RenderFactory.Default,
setupContent: UiTestWindow.() -> Unit = { contentPane.add(layer) }
) = object : UiTestWindow() {
override val layer: SkiaLayer = SkiaLayer(
properties = properties.copy(renderApi = renderApi),
......@@ -43,7 +44,7 @@ internal class UiTestScope(
)
init {
contentPane.add(layer)
setupContent()
}
override fun dispose() {
......
......@@ -24,17 +24,36 @@ fun setupSkikoLoggerFactory(createLogger: () -> SkikoLoggerInterface) {
Logger.loggerFactory = createLogger
}
internal object DefaultConsoleLogger: SkikoLoggerInterface {
override val isTraceEnabled: Boolean
get() = false
override val isDebugEnabled: Boolean
get() = false
override val isInfoEnabled: Boolean
get() = true
override val isWarnEnabled: Boolean
get() = true
override val isErrorEnabled: Boolean
get() = true
internal enum class LogLevel {
TRACE,
DEBUG,
INFO,
WARN,
ERROR;
fun noMoreVerboseThan(other: LogLevel): Boolean {
return this.ordinal >= other.ordinal
}
}
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) {
println("[SKIKO] trace: $message")
......@@ -83,7 +102,7 @@ internal object DefaultConsoleLogger: SkikoLoggerInterface {
}
internal object Logger {
var loggerFactory: () -> SkikoLoggerInterface = { DefaultConsoleLogger }
var loggerFactory: () -> SkikoLoggerInterface = { DefaultConsoleLogger() }
val loggerImpl by lazy {
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