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
8d61a57a
Unverified
Commit
8d61a57a
authored
Feb 21, 2022
by
Igor Demin
Committed by
GitHub
Feb 21, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix rendering of an empty layer on metal (#504)
* Fix rendering of an empty layer on metal * Fix Windows
parent
47985faa
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
113 additions
and
37 deletions
+113
-37
DirectSoftwareContextHandler.kt
...g/jetbrains/skiko/context/DirectSoftwareContextHandler.kt
+15
-7
MetalContextHandler.kt
...kotlin/org/jetbrains/skiko/context/MetalContextHandler.kt
+16
-10
MetalContextHandler.kt
...kotlin/org/jetbrains/skiko/context/MetalContextHandler.kt
+16
-10
SkiaLayerTest.kt
...o/src/jvmTest/kotlin/org/jetbrains/skiko/SkiaLayerTest.kt
+50
-0
MetalContextHandler.macos.kt
.../org/jetbrains/skiko/context/MetalContextHandler.macos.kt
+16
-10
No files found.
skiko/src/awtMain/kotlin/org/jetbrains/skiko/context/DirectSoftwareContextHandler.kt
View file @
8d61a57a
...
...
@@ -38,17 +38,25 @@ internal class DirectSoftwareContextHandler(layer: SkiaLayer) : JvmContextHandle
val
h
=
(
layer
.
height
*
scale
).
toInt
().
coerceAtLeast
(
0
)
if
(
isSizeChanged
(
w
,
h
)
||
surface
==
null
)
{
disposeCanvas
()
softwareRedrawer
.
resize
(
w
,
h
)
surface
=
softwareRedrawer
.
acquireSurface
()
canvas
=
surface
!!
.
canvas
if
(
w
>
0
&&
h
>
0
)
{
softwareRedrawer
.
resize
(
w
,
h
)
surface
=
softwareRedrawer
.
acquireSurface
()
canvas
=
surface
!!
.
canvas
}
else
{
surface
=
null
canvas
=
null
}
}
}
override
fun
flush
()
{
try
{
softwareRedrawer
.
finishFrame
(
getPtr
(
surface
!!
))
}
finally
{
Reference
.
reachabilityFence
(
surface
!!
)
val
surface
=
surface
if
(
surface
!=
null
)
{
try
{
softwareRedrawer
.
finishFrame
(
getPtr
(
surface
))
}
finally
{
Reference
.
reachabilityFence
(
surface
)
}
}
}
}
\ No newline at end of file
skiko/src/awtMain/kotlin/org/jetbrains/skiko/context/MetalContextHandler.kt
View file @
8d61a57a
...
...
@@ -34,22 +34,28 @@ internal class MetalContextHandler(layer: SkiaLayer) : JvmContextHandler(layer)
val
w
=
(
layer
.
width
*
scale
).
toInt
().
coerceAtLeast
(
0
)
val
h
=
(
layer
.
height
*
scale
).
toInt
().
coerceAtLeast
(
0
)
renderTarget
=
metalRedrawer
.
makeRenderTarget
(
w
,
h
)
if
(
w
>
0
&&
h
>
0
)
{
renderTarget
=
metalRedrawer
.
makeRenderTarget
(
w
,
h
)
surface
=
Surface
.
makeFromBackendRenderTarget
(
context
!!
,
renderTarget
!!
,
SurfaceOrigin
.
TOP_LEFT
,
SurfaceColorFormat
.
BGRA_8888
,
ColorSpace
.
sRGB
)
?:
throw
RenderException
(
"Cannot create surface"
)
surface
=
Surface
.
makeFromBackendRenderTarget
(
context
!!
,
renderTarget
!!
,
SurfaceOrigin
.
TOP_LEFT
,
SurfaceColorFormat
.
BGRA_8888
,
ColorSpace
.
sRGB
)
?:
throw
RenderException
(
"Cannot create surface"
)
canvas
=
surface
!!
.
canvas
canvas
=
surface
!!
.
canvas
}
else
{
renderTarget
=
null
surface
=
null
canvas
=
null
}
}
override
fun
flush
()
{
super
.
flush
()
surface
!!
.
flushAndSubmit
()
surface
?
.
flushAndSubmit
()
metalRedrawer
.
finishFrame
()
}
...
...
skiko/src/iosMain/kotlin/org/jetbrains/skiko/context/MetalContextHandler.kt
View file @
8d61a57a
...
...
@@ -47,23 +47,29 @@ internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer, lay
metalRedrawer
.
syncSize
()
}
renderTarget
=
metalRedrawer
.
makeRenderTarget
(
w
,
h
)
if
(
w
>
0
&&
h
>
0
)
{
renderTarget
=
metalRedrawer
.
makeRenderTarget
(
w
,
h
)
surface
=
Surface
.
makeFromBackendRenderTarget
(
context
!!
,
renderTarget
!!
,
SurfaceOrigin
.
TOP_LEFT
,
SurfaceColorFormat
.
BGRA_8888
,
ColorSpace
.
sRGB
)
?:
throw
RenderException
(
"Cannot create surface"
)
surface
=
Surface
.
makeFromBackendRenderTarget
(
context
!!
,
renderTarget
!!
,
SurfaceOrigin
.
TOP_LEFT
,
SurfaceColorFormat
.
BGRA_8888
,
ColorSpace
.
sRGB
)
?:
throw
RenderException
(
"Cannot create surface"
)
canvas
=
surface
!!
.
canvas
canvas
=
surface
!!
.
canvas
}
else
{
renderTarget
=
null
surface
=
null
canvas
=
null
}
}
override
fun
flush
()
{
// TODO: maybe make flush async as in JVM version.
super
.
flush
()
surface
!!
.
flushAndSubmit
()
surface
?
.
flushAndSubmit
()
metalRedrawer
.
finishFrame
()
}
...
...
skiko/src/jvmTest/kotlin/org/jetbrains/skiko/SkiaLayerTest.kt
View file @
8d61a57a
...
...
@@ -25,6 +25,7 @@ import java.awt.Color
import
java.awt.Dimension
import
java.awt.event.WindowEvent
import
javax.swing.JFrame
import
javax.swing.JLayeredPane
import
javax.swing.WindowConstants
import
kotlin.random.Random
import
kotlin.test.assertTrue
...
...
@@ -135,6 +136,55 @@ class SkiaLayerTest {
}
}
@Test
fun
`
render
empty
layer
`
()
=
uiTest
{
val
window
=
JFrame
()
val
layer
=
SkiaLayer
(
properties
=
SkiaLayerProperties
(
renderApi
=
renderApi
)
)
var
renderedWidth
=
-
1
layer
.
skikoView
=
object
:
SkikoView
{
override
fun
onRender
(
canvas
:
Canvas
,
width
:
Int
,
height
:
Int
,
nanoTime
:
Long
)
{
renderedWidth
=
width
}
}
layer
.
size
=
Dimension
(
0
,
0
)
val
density
=
window
.
graphicsConfiguration
.
defaultTransform
.
scaleX
try
{
val
panel
=
JLayeredPane
()
panel
.
add
(
layer
)
window
.
contentPane
.
add
(
panel
)
window
.
setLocation
(
200
,
200
)
window
.
size
=
Dimension
(
200
,
200
)
window
.
defaultCloseOperation
=
WindowConstants
.
DISPOSE_ON_CLOSE
window
.
isUndecorated
=
true
window
.
isVisible
=
true
layer
.
needRedraw
()
delay
(
1000
)
assertEquals
(
0
,
renderedWidth
)
renderedWidth
=
-
1
layer
.
needRedraw
()
delay
(
1000
)
assertEquals
(
0
,
renderedWidth
)
renderedWidth
=
-
1
layer
.
size
=
Dimension
(
30
,
40
)
layer
.
needRedraw
()
delay
(
1000
)
assertEquals
((
30
*
density
).
toInt
(),
renderedWidth
)
renderedWidth
=
-
1
layer
.
size
=
Dimension
(
0
,
0
)
layer
.
needRedraw
()
delay
(
1000
)
assertEquals
(
0
,
renderedWidth
)
}
finally
{
layer
.
dispose
()
window
.
close
()
}
}
@Test
fun
`
resize
window
`
()
=
uiTest
{
val
window
=
UiTestWindow
()
...
...
skiko/src/macosMain/kotlin/org/jetbrains/skiko/context/MetalContextHandler.macos.kt
View file @
8d61a57a
...
...
@@ -35,23 +35,29 @@ internal class MacOsMetalContextHandler(layer: SkiaLayer) : ContextHandler(layer
val
w
=
(
layer
.
nsView
.
frame
.
useContents
{
size
.
width
}
*
scale
).
toInt
().
coerceAtLeast
(
0
)
val
h
=
(
layer
.
nsView
.
frame
.
useContents
{
size
.
height
}
*
scale
).
toInt
().
coerceAtLeast
(
0
)
renderTarget
=
metalRedrawer
.
makeRenderTarget
(
w
,
h
)
if
(
w
>
0
&&
h
>
0
)
{
renderTarget
=
metalRedrawer
.
makeRenderTarget
(
w
,
h
)
surface
=
Surface
.
makeFromBackendRenderTarget
(
context
!!
,
renderTarget
!!
,
SurfaceOrigin
.
TOP_LEFT
,
SurfaceColorFormat
.
BGRA_8888
,
ColorSpace
.
sRGB
)
?:
throw
RenderException
(
"Cannot create surface"
)
surface
=
Surface
.
makeFromBackendRenderTarget
(
context
!!
,
renderTarget
!!
,
SurfaceOrigin
.
TOP_LEFT
,
SurfaceColorFormat
.
BGRA_8888
,
ColorSpace
.
sRGB
)
?:
throw
RenderException
(
"Cannot create surface"
)
canvas
=
surface
!!
.
canvas
canvas
=
surface
!!
.
canvas
}
else
{
renderTarget
=
null
surface
=
null
canvas
=
null
}
}
override
fun
flush
()
{
// TODO: maybe make flush async as in JVM version.
super
.
flush
()
surface
!!
.
flushAndSubmit
()
surface
?
.
flushAndSubmit
()
metalRedrawer
.
finishFrame
()
}
...
...
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