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
60191b83
Unverified
Commit
60191b83
authored
Sep 16, 2021
by
Shagen Ogandzhanian
Committed by
GitHub
Sep 16, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Introduce minimal initialization layer for using it as API on the frontend side (#194)
parent
16b2dee5
Changes
22
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
52 additions
and
91 deletions
+52
-91
App.kt
...le/src/jsMain/kotlin/org/jetbrains/skiko/sample/js/App.kt
+4
-1
index.html
samples/SkiaJsSample/src/jsMain/resources/index.html
+0
-4
build.gradle.kts
skiko/build.gradle.kts
+4
-1
wasm.js
skiko/karma.config.d/wasm.js
+0
-3
Managed.cc
skiko/src/commonMain/cpp/Managed.cc
+2
-4
RefCnt.cc
skiko/src/commonMain/cpp/RefCnt.cc
+3
-3
Paint.cc
skiko/src/commonMain/cpp/generated/Paint.cc
+4
-6
Native.kt
...o/src/commonMain/kotlin/org/jetbrains/skia/impl/Native.kt
+2
-0
RefCnt.cc
skiko/src/jsMain/cpp/RefCnt.cc
+0
-26
common.h
skiko/src/jsMain/cpp/common.h
+0
-9
Library.js.kt
...o/src/jsMain/kotlin/org/jetbrains/skia/impl/Library.js.kt
+0
-2
Managed.js.kt
...o/src/jsMain/kotlin/org/jetbrains/skia/impl/Managed.js.kt
+2
-2
Native.js.kt
skiko/src/jsMain/kotlin/org/jetbrains/skia/impl/Native.js.kt
+4
-0
RefCnt.js.kt
skiko/src/jsMain/kotlin/org/jetbrains/skia/impl/RefCnt.js.kt
+2
-2
Wrapper.kt
skiko/src/jsMain/kotlin/org/jetbrains/skiko/wasm/Wrapper.kt
+3
-0
setup.js
skiko/src/jsMain/resources/setup.js
+7
-0
WasmTests.kt
skiko/src/jsTest/kotlin/WasmTests.kt
+7
-11
Native.jvm.kt
.../src/jvmMain/kotlin/org/jetbrains/skia/impl/Native.jvm.kt
+1
-1
Managed.cc
skiko/src/nativeMain/cpp/common/impl/Managed.cc
+0
-10
Managed.native.kt
...tiveMain/kotlin/org/jetbrains/skia/impl/Managed.native.kt
+1
-1
Native.native.kt
...ativeMain/kotlin/org/jetbrains/skia/impl/Native.native.kt
+4
-3
RefCnt.native.kt
...ativeMain/kotlin/org/jetbrains/skia/impl/RefCnt.native.kt
+2
-2
No files found.
samples/SkiaJsSample/src/jsMain/kotlin/org/jetbrains/skiko/sample/js/App.kt
View file @
60191b83
package
org.jetbrains.skiko.sample.js
import
org.jetbrains.skia.Paint
import
org.jetbrains.skiko.wasm.onWasmReady
fun
main
(
args
:
Array
<
String
>)
{
println
(
Paint
())
onWasmReady
{
println
(
Paint
())
}
}
\ No newline at end of file
samples/SkiaJsSample/src/jsMain/resources/index.html
View file @
60191b83
...
...
@@ -4,10 +4,6 @@
<meta
charset=
"UTF-8"
>
<title>
skiko for web demo
</title>
<script
src=
"skiko.js"
>
</script>
<script>
// Temporary, to debug loading issues.
initRuntime
();
</script>
<script
src=
"SkiaJsSample.js"
>
</script>
</head>
<body>
...
...
skiko/build.gradle.kts
View file @
60191b83
...
...
@@ -354,13 +354,16 @@ val wasmCompile = project.tasks.register<Exec>("wasmCompile") {
val
outJs
=
"$outDir/skiko.js"
val
outWasm
=
"$outDir/skiko.wasm"
workingDir
=
File
(
outDir
)
val
skikoJsPrefix
=
"$projectDir/src/jsMain/resources/setup.js"
if
(
supportWasm
)
{
commandLine
=
listOf
(
"emcc"
,
*
buildType
.
clangFlags
,
*
Arch
.
Wasm
.
clangFlags
,
"-I$projectDir/src/commonMain/cpp"
,
*
skiaPreprocessorFlags
(
skiaDir
),
"-o"
,
outJs
,
"--extern-post-js"
,
skikoJsPrefix
,
*
srcs
)
argumentProviders
.
add
(
CommandLineArgumentProvider
{
...
...
@@ -377,7 +380,7 @@ val wasmCompile = project.tasks.register<Exec>("wasmCompile") {
)
}
file
(
outDir
).
mkdirs
()
inputs
.
files
(
srcs
)
inputs
.
files
(
srcs
+
listOf
(
skikoJsPrefix
)
)
outputs
.
files
(
outJs
,
outWasm
)
}
...
...
skiko/karma.config.d/wasm.js
View file @
60191b83
...
...
@@ -6,13 +6,11 @@ config.browserConsoleLogOptions.level = "debug";
const
basePath
=
config
.
basePath
;
const
projectPath
=
path
.
resolve
(
basePath
,
".."
,
".."
,
".."
,
".."
,
".."
);
const
setupPath
=
path
.
resolve
(
projectPath
,
"src"
,
"jsTest"
,
"config"
);
const
wasmPath
=
path
.
resolve
(
projectPath
,
"build"
,
"wasm"
)
const
debug
=
message
=>
console
.
log
(
`[karma-config]
${
message
}
`
);
debug
(
`karma basePath:
${
basePath
}
`
);
debug
(
`karma setupPath:
${
setupPath
}
`
);
debug
(
`karma wasmPath:
${
wasmPath
}
`
);
config
.
proxies
=
{
...
...
@@ -20,7 +18,6 @@ config.proxies = {
}
config
.
files
=
[
path
.
resolve
(
setupPath
,
"wasmsetup.js"
),
path
.
resolve
(
wasmPath
,
"skiko.js"
),
{
pattern
:
path
.
resolve
(
wasmPath
,
"skiko.wasm"
),
included
:
false
,
served
:
true
,
watched
:
false
},
].
concat
(
config
.
files
);
...
...
skiko/src/
js
Main/cpp/Managed.cc
→
skiko/src/
common
Main/cpp/Managed.cc
View file @
60191b83
#include "common.h"
#include <emscripten.h>
typedef
void
(
*
finalizer_t
)(
void
*
);
EMSCRIPTEN_KEEPALIVE
extern
"C"
void
org_jetbrains_skia_ColorSpace__nInvokeFinalizer
(
KPointer
finalizer
,
KPointer
obj
)
{
SKIKO_EXPORT
void
org_jetbrains_skia_impl_Managed__invokeFinalizer
(
KNativePointer
finalizer
,
KNativePointer
obj
)
{
finalizer_t
finalizer_f
=
reinterpret_cast
<
finalizer_t
>
(
finalizer
);
finalizer_f
(
obj
);
}
\ No newline at end of file
}
skiko/src/
nativeMain/cpp/common/impl
/RefCnt.cc
→
skiko/src/
commonMain/cpp
/RefCnt.cc
View file @
60191b83
#include "common.h"
#include "SkRefCnt.h"
class
SkRefCntHack
{
...
...
@@ -11,12 +12,11 @@ void unrefSkRefCnt(SkRefCnt* p) {
p
->
unref
();
}
extern
"C"
KNativePointer
org_jetbrains_skia_impl_RefCnt__1nG
etFinalizer
()
{
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_impl_RefCnt__g
etFinalizer
()
{
return
reinterpret_cast
<
KNativePointer
>
(
&
unrefSkRefCnt
);
}
extern
"C"
KInt
org_jetbrains_skia_impl_RefCnt__1nG
etRefCount
(
KNativePointer
ptr
)
{
SKIKO_EXPORT
KInt
org_jetbrains_skia_impl_RefCnt__g
etRefCount
(
KNativePointer
ptr
)
{
SkRefCnt
*
instance
=
reinterpret_cast
<
SkRefCnt
*>
(
ptr
);
return
reinterpret_cast
<
SkRefCntHack
*>
(
instance
)
->
fRefCnt
.
load
(
std
::
memory_order_relaxed
);
}
skiko/src/commonMain/cpp/generated/Paint.cc
View file @
60191b83
...
...
@@ -11,17 +11,15 @@
#include "SkFilterQuality.h"
#include "common.h"
static
void
deletePaint
(
SkPaint
*
paint
)
{
void
deletePaint
(
SkPaint
*
paint
)
{
delete
paint
;
}
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_Paint__1nGetFinalizer
(){
return
reinterpret_cast
<
KNativePointer
>
((
&
deletePaint
));
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_Paint__1nGetFinalizer
(){
return
reinterpret_cast
<
KNativePointer
>
(
&
deletePaint
);
}
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_Paint__1nMake
(){
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_Paint__1nMake
(){
SkPaint
*
obj
=
new
SkPaint
();
obj
->
setAntiAlias
(
true
);
return
reinterpret_cast
<
KNativePointer
>
(
obj
);
...
...
skiko/src/commonMain/kotlin/org/jetbrains/skia/impl/Native.kt
View file @
60191b83
...
...
@@ -11,6 +11,8 @@ expect abstract class Native(ptr: NativePointer) {
companion
object
{
val
NullPointer
:
NativePointer
}
override
fun
toString
():
String
}
expect
fun
reachabilityBarrier
(
obj
:
Any
?)
...
...
skiko/src/jsMain/cpp/RefCnt.cc
deleted
100644 → 0
View file @
16b2dee5
#include <emscripten.h>
#include "common.h"
#include "SkRefCnt.h"
class
SkRefCntHack
{
public
:
void
*
x
;
mutable
std
::
atomic
<
int32_t
>
fRefCnt
;
};
void
unrefSkRefCnt
(
SkRefCnt
*
p
)
{
p
->
unref
();
}
EMSCRIPTEN_KEEPALIVE
extern
"C"
KPointer
org_jetbrains_skia_impl_RefCnt__1nGetFinalizer
()
{
return
reinterpret_cast
<
KPointer
>
(
&
unrefSkRefCnt
);
}
EMSCRIPTEN_KEEPALIVE
extern
"C"
KInt
org_jetbrains_skia_impl_RefCnt__1nGetRefCount
(
KPointer
ptr
)
{
SkRefCnt
*
instance
=
reinterpret_cast
<
SkRefCnt
*>
(
ptr
);
return
reinterpret_cast
<
SkRefCntHack
*>
(
instance
)
->
fRefCnt
.
load
(
std
::
memory_order_relaxed
);
}
skiko/src/jsMain/cpp/common.h
deleted
100644 → 0
View file @
16b2dee5
#pragma once
#include <stdint.h>
typedef
int32_t
KInt
;
typedef
int64_t
KLong
;
typedef
void
*
KPointer
;
typedef
uint8_t
*
KByteArray
;
skiko/src/jsMain/kotlin/org/jetbrains/skia/impl/Library.js.kt
View file @
60191b83
...
...
@@ -3,8 +3,6 @@ package org.jetbrains.skia.impl
actual
class
Library
{
actual
companion
object
{
actual
fun
staticLoad
()
{
// TODO: load wasm and js modules, maybe just js, as it will load Wasm.
TODO
()
}
}
}
skiko/src/jsMain/kotlin/org/jetbrains/skia/impl/Managed.js.kt
View file @
60191b83
...
...
@@ -49,12 +49,12 @@ actual abstract class Managed actual constructor(ptr: NativePointer, finalizer:
if
(
managed
)
{
require
(
ptr
!=
0
)
{
"Managed ptr is 0"
}
require
(
finalizer
!=
0
)
{
"Managed finalizer is 0"
}
val
thunk
=
FinalizationThunk
(
ptr
,
finalize
r
)
val
thunk
=
FinalizationThunk
(
finalizer
,
pt
r
)
register
(
this
,
thunk
)
cleaner
=
thunk
}
}
}
@JsName
(
"org_jetbrains_skia_Managed__invokeFinalizer"
)
@JsName
(
"org_jetbrains_skia_
impl_
Managed__invokeFinalizer"
)
private
external
fun
_nInvokeFinalizer
(
finalizer
:
NativePointer
,
obj
:
NativePointer
)
\ No newline at end of file
skiko/src/jsMain/kotlin/org/jetbrains/skia/impl/Native.js.kt
View file @
60191b83
...
...
@@ -10,6 +10,10 @@ actual abstract class Native actual constructor(ptr: NativePointer) {
get
()
=
0
}
actual
override
fun
toString
():
String
{
return
this
::
class
.
simpleName
+
"(_ptr=0x"
+
_ptr
.
toString
(
16
)
+
")"
}
init
{
if
(
ptr
==
NullPointer
)
throw
RuntimeException
(
"Can't wrap nullptr"
)
_ptr
=
ptr
...
...
skiko/src/jsMain/kotlin/org/jetbrains/skia/impl/RefCnt.js.kt
View file @
60191b83
...
...
@@ -20,7 +20,7 @@ private object _FinalizerHolder {
val
PTR
=
_nGetFinalizer
()
}
@JsName
(
"org_jetbrains_skia_
RefCnt__nG
etFinalizer"
)
@JsName
(
"org_jetbrains_skia_
impl_RefCnt__g
etFinalizer"
)
private
external
fun
_nGetFinalizer
():
NativePointer
@JsName
(
"org_jetbrains_skia_
RefCnt__nG
etCount"
)
@JsName
(
"org_jetbrains_skia_
impl_RefCnt__g
etCount"
)
private
external
fun
_nGetRefCount
(
ptr
:
NativePointer
):
Int
skiko/src/jsMain/kotlin/org/jetbrains/skiko/wasm/Wrapper.kt
View file @
60191b83
...
...
@@ -3,7 +3,10 @@ package org.jetbrains.skiko.wasm
import
kotlinx.dom.createElement
import
kotlinx.browser.document
import
org.w3c.dom.HTMLCanvasElement
import
kotlin.js.Promise
external
val
wasmSetup
:
Promise
<
Boolean
>
external
fun
onWasmReady
(
onReady
:
()
->
Unit
)
@JsExport
fun
createSkikoCanvas
():
HTMLCanvasElement
{
...
...
skiko/src/js
Test/config/wasm
setup.js
→
skiko/src/js
Main/resources/
setup.js
View file @
60191b83
var
Module
=
{};
Module
[
'locateFile'
]
=
(
path
,
scriptDirectory
)
=>
{
return
"/wasm/skiko.wasm"
;
};
var
ModulePromised
=
new
Promise
(
function
(
resolve
,
reject
)
{
var
wasmSetup
=
new
Promise
(
function
(
resolve
,
reject
)
{
Module
[
'onRuntimeInitialized'
]
=
_
=>
{
resolve
(
Module
);
};
});
function
onWasmReady
(
onReady
)
{
wasmSetup
.
then
(
onReady
);
}
skiko/src/jsTest/kotlin/WasmTests.kt
View file @
60191b83
...
...
@@ -12,24 +12,20 @@ external interface ModuleInterface {
fun
ping
():
Boolean
}
external
val
Module
Promised
:
Promise
<
ModuleInterface
>
external
val
Module
:
ModuleInterface
suspend
fun
<
T
>
Promise
<
T
>.
await
():
T
=
suspendCoroutine
{
cont
->
then
({
cont
.
resume
(
it
)
},
{
cont
.
resumeWithException
(
it
)
})
}
private
fun
async
(
block
:
suspend
()
->
Unit
):
dynamic
=
GlobalScope
.
promise
{
block
()
}
private
fun
withModule
(
block
:
ModuleInterface
.()
->
Unit
)
=
async
{
val
module
=
ModulePromised
.
await
()
block
.
invoke
(
module
)
private
fun
wasmTest
(
block
:
()
->
Unit
)
=
GlobalScope
.
promise
{
wasmSetup
.
await
()
block
.
invoke
()
}
class
WasmTests
{
@Test
fun
pingTest
()
=
w
ithModule
{
assertTrue
(
this
.
ping
())
@Test
fun
pingTest
()
=
w
asmTest
{
assertTrue
(
Module
.
ping
())
}
}
\ No newline at end of file
skiko/src/jvmMain/kotlin/org/jetbrains/skia/impl/Native.jvm.kt
View file @
60191b83
...
...
@@ -10,7 +10,7 @@ actual abstract class Native actual constructor(ptr: NativePointer) {
get
()
=
0L
}
override
fun
toString
():
String
{
actual
override
fun
toString
():
String
{
return
javaClass
.
simpleName
+
"(_ptr=0x"
+
_ptr
.
toString
(
16
)
+
")"
}
...
...
skiko/src/nativeMain/cpp/common/impl/Managed.cc
deleted
100644 → 0
View file @
16b2dee5
#include <iostream>
#include "common.h"
typedef
void
(
*
FreeFunction
)(
void
*
);
extern
"C"
void
org_jetbrains_skia_impl_Managed__1nInvokeFinalizer
(
KNativePointer
finalizerPtr
,
KNativePointer
ptr
)
{
FreeFunction
finalizer
=
reinterpret_cast
<
FreeFunction
>
(
finalizerPtr
);
finalizer
(
ptr
);
}
skiko/src/nativeMain/kotlin/org/jetbrains/skia/impl/Managed.native.kt
View file @
60191b83
...
...
@@ -59,5 +59,5 @@ actual abstract class Managed actual constructor(
get
()
=
_ptr
==
NullPointer
}
@ExternalSymbolName
(
"org_jetbrains_skia_impl_Managed__
1nI
nvokeFinalizer"
)
@ExternalSymbolName
(
"org_jetbrains_skia_impl_Managed__
i
nvokeFinalizer"
)
external
fun
_nInvokeFinalizer
(
finalizer
:
NativePointer
,
ptr
:
NativePointer
)
skiko/src/nativeMain/kotlin/org/jetbrains/skia/impl/Native.native.kt
View file @
60191b83
...
...
@@ -7,9 +7,6 @@ import kotlin.native.internal.NativePtr
actual
abstract
class
Native
actual
constructor
(
ptr
:
NativePointer
)
{
actual
var
_ptr
:
NativePointer
override
fun
toString
():
String
{
return
this
::
class
.
simpleName
+
"(_ptr=0x$_ptr)"
}
actual
open
fun
_nativeEquals
(
other
:
Native
?):
Boolean
=
this
.
_ptr
==
other
?.
_ptr
?:
Native
.
NullPointer
...
...
@@ -18,6 +15,10 @@ actual abstract class Native actual constructor(ptr: NativePointer) {
get
()
=
NativePtr
.
NULL
}
actual
override
fun
toString
():
String
{
return
this
::
class
.
simpleName
+
"(_ptr=0x"
+
_ptr
.
toString
()
+
")"
}
init
{
if
(
ptr
==
NativePtr
.
NULL
)
throw
RuntimeException
(
"Can't wrap nullptr"
)
_ptr
=
ptr
...
...
skiko/src/nativeMain/kotlin/org/jetbrains/skia/impl/RefCnt.native.kt
View file @
60191b83
...
...
@@ -24,7 +24,7 @@ actual abstract class RefCnt : Managed {
}
}
@ExternalSymbolName
(
"org_jetbrains_skia_impl_RefCnt__
1nG
etFinalizer"
)
@ExternalSymbolName
(
"org_jetbrains_skia_impl_RefCnt__
g
etFinalizer"
)
private
external
fun
_nGetFinalizer
():
NativePointer
@ExternalSymbolName
(
"org_jetbrains_skia_impl_RefCnt__
1nG
etRefCount"
)
@ExternalSymbolName
(
"org_jetbrains_skia_impl_RefCnt__
g
etRefCount"
)
private
external
fun
_nGetRefCount
(
ptr
:
NativePointer
):
Int
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