Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
skiko
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liuqiang
skiko
Commits
4abc90f9
Unverified
Commit
4abc90f9
authored
Sep 07, 2021
by
Igor Demin
Committed by
GitHub
Sep 07, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Don't draw if window is invisible (JFrame.isVisible = false) (#149)
Partially fix
https://github.com/JetBrains/skiko/issues/137
parent
57f3f868
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
63 additions
and
31 deletions
+63
-31
SkiaLayer.kt
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/SkiaLayer.kt
+27
-8
AngleRedrawer.kt
...Main/kotlin/org/jetbrains/skiko/redrawer/AngleRedrawer.kt
+4
-2
Direct3DRedrawer.kt
...n/kotlin/org/jetbrains/skiko/redrawer/Direct3DRedrawer.kt
+4
-2
LinuxOpenGLRedrawer.kt
...otlin/org/jetbrains/skiko/redrawer/LinuxOpenGLRedrawer.kt
+10
-7
MetalRedrawer.kt
...Main/kotlin/org/jetbrains/skiko/redrawer/MetalRedrawer.kt
+4
-3
SoftwareRedrawer.kt
...n/kotlin/org/jetbrains/skiko/redrawer/SoftwareRedrawer.kt
+5
-3
WindowsOpenGLRedrawer.kt
...lin/org/jetbrains/skiko/redrawer/WindowsOpenGLRedrawer.kt
+9
-6
No files found.
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/SkiaLayer.kt
View file @
4abc90f9
...
@@ -30,13 +30,13 @@ open class SkiaLayer(
...
@@ -30,13 +30,13 @@ open class SkiaLayer(
ContentScale
,
ContentScale
,
}
}
internal
val
backedLayer
:
HardwareLayer
internal
val
backedLayer
:
HardwareLayer
val
canvas
:
java
.
awt
.
Canvas
val
canvas
:
java
.
awt
.
Canvas
get
()
=
backedLayer
get
()
=
backedLayer
init
{
init
{
setOpaque
(
false
)
isOpaque
=
false
layout
=
null
layout
=
null
backedLayer
=
object
:
HardwareLayer
()
{
backedLayer
=
object
:
HardwareLayer
()
{
override
fun
paint
(
g
:
Graphics
)
{
override
fun
paint
(
g
:
Graphics
)
{
...
@@ -54,9 +54,12 @@ open class SkiaLayer(
...
@@ -54,9 +54,12 @@ open class SkiaLayer(
return
this
@SkiaLayer
.
inputMethodRequests
return
this
@SkiaLayer
.
inputMethodRequests
}
}
}
}
add
(
backedLayer
)
@Suppress
(
"LeakingThis"
)
@Suppress
(
"LeakingThis"
)
add
(
backedLayer
)
backedLayer
.
addHierarchyListener
{
backedLayer
.
addHierarchyListener
{
if
(
it
.
changeFlags
and
HierarchyEvent
.
SHOWING_CHANGED
.
toLong
()
!=
0L
)
{
checkShowing
()
}
if
(
it
.
changeFlags
and
HierarchyEvent
.
DISPLAYABILITY_CHANGED
.
toLong
()
!=
0L
)
{
if
(
it
.
changeFlags
and
HierarchyEvent
.
DISPLAYABILITY_CHANGED
.
toLong
()
!=
0L
)
{
checkInit
()
checkInit
()
}
}
...
@@ -69,10 +72,24 @@ open class SkiaLayer(
...
@@ -69,10 +72,24 @@ open class SkiaLayer(
private
fun
checkInit
()
{
private
fun
checkInit
()
{
if
(!
isInited
&&
isDisplayable
)
{
if
(!
isInited
&&
isDisplayable
)
{
backedLayer
.
defineContentScale
()
backedLayer
.
defineContentScale
()
checkShowing
()
init
()
init
()
}
}
}
}
private
fun
checkShowing
()
{
isShowingCached
=
super
.
isShowing
()
if
(
isShowing
)
{
repaint
()
}
}
private
var
isShowingCached
=
false
override
fun
isShowing
():
Boolean
{
return
isShowingCached
}
val
contentScale
:
Float
val
contentScale
:
Float
get
()
=
backedLayer
.
contentScale
get
()
=
backedLayer
.
contentScale
...
@@ -84,7 +101,9 @@ open class SkiaLayer(
...
@@ -84,7 +101,9 @@ open class SkiaLayer(
var
fullscreen
:
Boolean
var
fullscreen
:
Boolean
get
()
=
backedLayer
.
fullscreen
get
()
=
backedLayer
.
fullscreen
set
(
value
)
{
backedLayer
.
fullscreen
=
value
}
set
(
value
)
{
backedLayer
.
fullscreen
=
value
}
var
renderer
:
SkiaRenderer
?
=
null
var
renderer
:
SkiaRenderer
?
=
null
val
clipComponents
=
mutableListOf
<
ClipRectangle
>()
val
clipComponents
=
mutableListOf
<
ClipRectangle
>()
...
@@ -140,7 +159,7 @@ open class SkiaLayer(
...
@@ -140,7 +159,7 @@ open class SkiaLayer(
mutableMapOf
<
PropertyKind
,
MutableList
<(
SkiaLayer
)
->
Unit
>>()
mutableMapOf
<
PropertyKind
,
MutableList
<(
SkiaLayer
)
->
Unit
>>()
fun
onStateChanged
(
kind
:
PropertyKind
,
handler
:
(
SkiaLayer
)
->
Unit
)
{
fun
onStateChanged
(
kind
:
PropertyKind
,
handler
:
(
SkiaLayer
)
->
Unit
)
{
stateHandlers
.
getOrPut
(
kind
,
{
mutableListOf
()
})
+=
handler
stateHandlers
.
getOrPut
(
kind
,
{
mutableListOf
()
})
+=
handler
}
}
private
fun
notifyChange
(
kind
:
PropertyKind
)
{
private
fun
notifyChange
(
kind
:
PropertyKind
)
{
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/redrawer/AngleRedrawer.kt
View file @
4abc90f9
...
@@ -17,9 +17,11 @@ internal class AngleRedrawer(
...
@@ -17,9 +17,11 @@ internal class AngleRedrawer(
private
var
device
:
Long
=
0
private
var
device
:
Long
=
0
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
if
(
layer
.
isShowing
)
{
update
(
System
.
nanoTime
())
update
(
System
.
nanoTime
())
draw
()
draw
()
}
}
}
override
fun
dispose
()
{
override
fun
dispose
()
{
frameDispatcher
.
cancel
()
frameDispatcher
.
cancel
()
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/redrawer/Direct3DRedrawer.kt
View file @
4abc90f9
...
@@ -25,9 +25,11 @@ internal class Direct3DRedrawer(
...
@@ -25,9 +25,11 @@ internal class Direct3DRedrawer(
}
}
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
if
(
layer
.
isShowing
)
{
update
(
System
.
nanoTime
())
update
(
System
.
nanoTime
())
draw
()
draw
()
}
}
}
override
fun
dispose
()
=
synchronized
(
drawLock
)
{
override
fun
dispose
()
=
synchronized
(
drawLock
)
{
disposeDevice
(
device
)
disposeDevice
(
device
)
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/redrawer/LinuxOpenGLRedrawer.kt
View file @
4abc90f9
...
@@ -83,11 +83,14 @@ internal class LinuxOpenGLRedrawer(
...
@@ -83,11 +83,14 @@ internal class LinuxOpenGLRedrawer(
companion
object
{
companion
object
{
private
val
toRedraw
=
mutableSetOf
<
LinuxOpenGLRedrawer
>()
private
val
toRedraw
=
mutableSetOf
<
LinuxOpenGLRedrawer
>()
private
val
toRedrawCopy
=
mutableSetOf
<
LinuxOpenGLRedrawer
>()
private
val
toRedrawCopy
=
mutableSetOf
<
LinuxOpenGLRedrawer
>()
private
val
toRedrawAlive
=
toRedrawCopy
.
asSequence
().
filterNot
(
LinuxOpenGLRedrawer
::
isDisposed
)
private
val
toRedrawVisible
=
toRedrawCopy
.
asSequence
()
.
filterNot
(
LinuxOpenGLRedrawer
::
isDisposed
)
.
filter
{
it
.
layer
.
isShowing
}
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
// we should wait for the window with the maximum frame limit to avoid bottleneck when there is a window on a slower monitor
// we should wait for the window with the maximum frame limit to avoid bottleneck when there is a window on a slower monitor
toRedraw
Aliv
e
.
maxByOrNull
{
it
.
frameLimit
}
?.
limitFramesIfNeeded
()
toRedraw
Visibl
e
.
maxByOrNull
{
it
.
frameLimit
}
?.
limitFramesIfNeeded
()
toRedrawCopy
.
clear
()
toRedrawCopy
.
clear
()
toRedrawCopy
.
addAll
(
toRedraw
)
toRedrawCopy
.
addAll
(
toRedraw
)
...
@@ -95,7 +98,7 @@ internal class LinuxOpenGLRedrawer(
...
@@ -95,7 +98,7 @@ internal class LinuxOpenGLRedrawer(
val
nanoTime
=
System
.
nanoTime
()
val
nanoTime
=
System
.
nanoTime
()
for
(
redrawer
in
toRedraw
Aliv
e
)
{
for
(
redrawer
in
toRedraw
Visibl
e
)
{
try
{
try
{
redrawer
.
update
(
nanoTime
)
redrawer
.
update
(
nanoTime
)
}
catch
(
e
:
CancellationException
)
{
}
catch
(
e
:
CancellationException
)
{
...
@@ -103,9 +106,9 @@ internal class LinuxOpenGLRedrawer(
...
@@ -103,9 +106,9 @@ internal class LinuxOpenGLRedrawer(
}
}
}
}
val
drawingSurfaces
=
toRedraw
Aliv
e
.
associateWith
{
lockLinuxDrawingSurface
(
it
.
layer
.
backedLayer
)
}
val
drawingSurfaces
=
toRedraw
Visibl
e
.
associateWith
{
lockLinuxDrawingSurface
(
it
.
layer
.
backedLayer
)
}
try
{
try
{
toRedraw
Aliv
e
.
forEach
{
redrawer
->
toRedraw
Visibl
e
.
forEach
{
redrawer
->
drawingSurfaces
[
redrawer
]
!!
.
makeCurrent
(
redrawer
.
context
)
drawingSurfaces
[
redrawer
]
!!
.
makeCurrent
(
redrawer
.
context
)
redrawer
.
draw
()
redrawer
.
draw
()
}
}
...
@@ -113,11 +116,11 @@ internal class LinuxOpenGLRedrawer(
...
@@ -113,11 +116,11 @@ internal class LinuxOpenGLRedrawer(
// TODO(demin) it seems now vsync doesn't work as expected with two windows (we have fps = refreshRate / windowCount)
// TODO(demin) it seems now vsync doesn't work as expected with two windows (we have fps = refreshRate / windowCount)
// perhaps we should create frameDispatcher for each display.
// perhaps we should create frameDispatcher for each display.
// Don't know what happened, but on 620547a commit everything was okay. maybe something changed in the code, maybe my system changed
// Don't know what happened, but on 620547a commit everything was okay. maybe something changed in the code, maybe my system changed
toRedraw
Aliv
e
.
forEach
{
redrawer
->
toRedraw
Visibl
e
.
forEach
{
redrawer
->
drawingSurfaces
[
redrawer
]
!!
.
swapBuffers
()
drawingSurfaces
[
redrawer
]
!!
.
swapBuffers
()
}
}
toRedraw
Aliv
e
.
forEach
{
redrawer
->
toRedraw
Visibl
e
.
forEach
{
redrawer
->
drawingSurfaces
[
redrawer
]
!!
.
makeCurrent
(
redrawer
.
context
)
drawingSurfaces
[
redrawer
]
!!
.
makeCurrent
(
redrawer
.
context
)
OpenGLApi
.
instance
.
glFinish
()
OpenGLApi
.
instance
.
glFinish
()
}
}
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/redrawer/MetalRedrawer.kt
View file @
4abc90f9
...
@@ -9,7 +9,6 @@ import org.jetbrains.skia.DirectContext
...
@@ -9,7 +9,6 @@ import org.jetbrains.skia.DirectContext
import
org.jetbrains.skiko.*
import
org.jetbrains.skiko.*
import
javax.swing.SwingUtilities.convertPoint
import
javax.swing.SwingUtilities.convertPoint
import
javax.swing.SwingUtilities.getRootPane
import
javax.swing.SwingUtilities.getRootPane
import
kotlin.time.ExperimentalTime
internal
class
MetalRedrawer
(
internal
class
MetalRedrawer
(
private
val
layer
:
SkiaLayer
,
private
val
layer
:
SkiaLayer
,
...
@@ -32,9 +31,11 @@ internal class MetalRedrawer(
...
@@ -32,9 +31,11 @@ internal class MetalRedrawer(
}
}
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
if
(
layer
.
isShowing
)
{
update
(
System
.
nanoTime
())
update
(
System
.
nanoTime
())
draw
()
draw
()
}
}
}
override
fun
dispose
()
=
synchronized
(
drawLock
)
{
override
fun
dispose
()
=
synchronized
(
drawLock
)
{
frameDispatcher
.
cancel
()
frameDispatcher
.
cancel
()
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/redrawer/SoftwareRedrawer.kt
View file @
4abc90f9
...
@@ -19,11 +19,13 @@ internal class SoftwareRedrawer(
...
@@ -19,11 +19,13 @@ internal class SoftwareRedrawer(
frameLimiter
.
awaitNextFrame
()
frameLimiter
.
awaitNextFrame
()
}
}
if
(
layer
.
isShowing
)
{
layer
.
update
(
System
.
nanoTime
())
layer
.
update
(
System
.
nanoTime
())
if
(
layer
.
prepareDrawContext
())
{
if
(
layer
.
prepareDrawContext
())
{
layer
.
draw
()
layer
.
draw
()
}
}
}
}
}
override
fun
dispose
()
{
override
fun
dispose
()
{
frameDispatcher
.
cancel
()
frameDispatcher
.
cancel
()
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/redrawer/WindowsOpenGLRedrawer.kt
View file @
4abc90f9
...
@@ -65,7 +65,10 @@ internal class WindowsOpenGLRedrawer(
...
@@ -65,7 +65,10 @@ internal class WindowsOpenGLRedrawer(
companion
object
{
companion
object
{
private
val
toRedraw
=
mutableSetOf
<
WindowsOpenGLRedrawer
>()
private
val
toRedraw
=
mutableSetOf
<
WindowsOpenGLRedrawer
>()
private
val
toRedrawCopy
=
mutableSetOf
<
WindowsOpenGLRedrawer
>()
private
val
toRedrawCopy
=
mutableSetOf
<
WindowsOpenGLRedrawer
>()
private
val
toRedrawAlive
=
toRedrawCopy
.
asSequence
().
filterNot
(
WindowsOpenGLRedrawer
::
isDisposed
)
private
val
toRedrawVisible
=
toRedrawCopy
.
asSequence
()
.
filterNot
(
WindowsOpenGLRedrawer
::
isDisposed
)
.
filter
{
it
.
layer
.
isShowing
}
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
private
val
frameDispatcher
=
FrameDispatcher
(
Dispatchers
.
Swing
)
{
toRedrawCopy
.
clear
()
toRedrawCopy
.
clear
()
...
@@ -74,7 +77,7 @@ internal class WindowsOpenGLRedrawer(
...
@@ -74,7 +77,7 @@ internal class WindowsOpenGLRedrawer(
val
nanoTime
=
System
.
nanoTime
()
val
nanoTime
=
System
.
nanoTime
()
for
(
redrawer
in
toRedraw
Aliv
e
)
{
for
(
redrawer
in
toRedraw
Visibl
e
)
{
try
{
try
{
redrawer
.
update
(
nanoTime
)
redrawer
.
update
(
nanoTime
)
}
catch
(
e
:
CancellationException
)
{
}
catch
(
e
:
CancellationException
)
{
...
@@ -82,21 +85,21 @@ internal class WindowsOpenGLRedrawer(
...
@@ -82,21 +85,21 @@ internal class WindowsOpenGLRedrawer(
}
}
}
}
for
(
redrawer
in
toRedraw
Aliv
e
)
{
for
(
redrawer
in
toRedraw
Visibl
e
)
{
redrawer
.
makeCurrent
()
redrawer
.
makeCurrent
()
redrawer
.
draw
()
redrawer
.
draw
()
}
}
for
(
redrawer
in
toRedraw
Aliv
e
)
{
for
(
redrawer
in
toRedraw
Visibl
e
)
{
redrawer
.
swapBuffers
()
redrawer
.
swapBuffers
()
}
}
for
(
redrawer
in
toRedraw
Aliv
e
)
{
for
(
redrawer
in
toRedraw
Visibl
e
)
{
redrawer
.
makeCurrent
()
redrawer
.
makeCurrent
()
OpenGLApi
.
instance
.
glFinish
()
OpenGLApi
.
instance
.
glFinish
()
}
}
val
isVsyncEnabled
=
toRedraw
Aliv
e
.
all
{
it
.
properties
.
isVsyncEnabled
}
val
isVsyncEnabled
=
toRedraw
Visibl
e
.
all
{
it
.
properties
.
isVsyncEnabled
}
if
(
isVsyncEnabled
)
{
if
(
isVsyncEnabled
)
{
withContext
(
Dispatchers
.
IO
)
{
withContext
(
Dispatchers
.
IO
)
{
dwmFlush
()
// wait for vsync
dwmFlush
()
// wait for vsync
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment