Unverified Commit ab1d03de authored by Nikolai Rykunov's avatar Nikolai Rykunov Committed by GitHub

Simplify clear colors (#718)

* Use naming constants instead of numbers for clear colors

* Simplify clear colors logic and add comments
parent decca00f
package org.jetbrains.skiko.context package org.jetbrains.skiko.context
import org.jetbrains.skia.Bitmap import org.jetbrains.skia.*
import org.jetbrains.skia.Canvas
import org.jetbrains.skia.ColorAlphaType
import org.jetbrains.skia.ImageInfo
import org.jetbrains.skiko.Logger import org.jetbrains.skiko.Logger
import org.jetbrains.skia.SurfaceProps import org.jetbrains.skiko.OS
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.hostOs import org.jetbrains.skiko.hostOs
import org.jetbrains.skiko.OS
import java.awt.Transparency
import java.awt.Color import java.awt.Color
import java.awt.Transparency
import java.awt.color.ColorSpace import java.awt.color.ColorSpace
import java.awt.image.BufferedImage import java.awt.image.*
import java.awt.image.ComponentColorModel
import java.awt.image.DataBuffer
import java.awt.image.DataBufferByte
import java.awt.image.Raster
import java.awt.image.WritableRaster
internal class SoftwareContextHandler(layer: SkiaLayer) : JvmContextHandler(layer) { internal class SoftwareContextHandler(layer: SkiaLayer) : JvmContextHandler(layer) {
override val clearColor = if (layer.transparency && hostOs == OS.MacOS) 0 else -1 override fun isTransparentBackground(): Boolean {
// TODO: why Software rendering has another transparency logic from the begginning
return hostOs == OS.MacOS && layer.transparency
}
val colorModel = ComponentColorModel( val colorModel = ComponentColorModel(
ColorSpace.getInstance(ColorSpace.CS_sRGB), ColorSpace.getInstance(ColorSpace.CS_sRGB),
......
package org.jetbrains.skiko.context package org.jetbrains.skiko.context
import org.jetbrains.skia.BackendRenderTarget import org.jetbrains.skia.*
import org.jetbrains.skia.Canvas
import org.jetbrains.skia.DirectContext
import org.jetbrains.skia.Picture
import org.jetbrains.skia.Surface
import org.jetbrains.skiko.* import org.jetbrains.skiko.*
import org.jetbrains.skiko.RenderException
internal abstract class ContextHandler( internal abstract class ContextHandler(
protected val layer: SkiaLayer, protected val layer: SkiaLayer,
private val drawContent: Canvas.() -> Unit private val drawContent: Canvas.() -> Unit
) { ) {
// TODO can we simplify clearColor logic? is there a reason why SoftwareContextHandler has opposite logic?
protected open val clearColor = if (layer.transparency || hostOs == OS.MacOS) 0 else -1
protected var context: DirectContext? = null protected var context: DirectContext? = null
protected var renderTarget: BackendRenderTarget? = null protected var renderTarget: BackendRenderTarget? = null
protected var surface: Surface? = null protected var surface: Surface? = null
...@@ -48,9 +41,22 @@ internal abstract class ContextHandler( ...@@ -48,9 +41,22 @@ internal abstract class ContextHandler(
} }
initCanvas() initCanvas()
canvas?.apply { canvas?.apply {
clear(if (layer.fullscreen && hostOs != OS.MacOS) -1 else clearColor) clear(if (isTransparentBackground()) Color.TRANSPARENT else Color.WHITE)
drawContent() drawContent()
} }
flush() flush()
} }
protected open fun isTransparentBackground(): Boolean {
if (hostOs == OS.MacOS) {
// MacOS transparency is always supported
return true
}
if (layer.fullscreen) {
// for non-MacOS in fullscreen transparency is not supported
return false
}
// for non-MacOS in non-fullscreen transparency provided by [layer]
return layer.transparency
}
} }
...@@ -95,7 +95,7 @@ abstract class CanvasRenderer constructor(val htmlCanvas: HTMLCanvasElement) { ...@@ -95,7 +95,7 @@ abstract class CanvasRenderer constructor(val htmlCanvas: HTMLCanvasElement) {
redrawScheduled = false redrawScheduled = false
GL.makeContextCurrent(contextPointer) GL.makeContextCurrent(contextPointer)
// `clear` and `resetMatrix` make canvas not accumulate previous effects // `clear` and `resetMatrix` make canvas not accumulate previous effects
canvas?.clear(-1) canvas?.clear(Color.WHITE)
canvas?.resetMatrix() canvas?.resetMatrix()
drawFrame(timestamp) drawFrame(timestamp)
surface?.flushAndSubmit() surface?.flushAndSubmit()
......
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