Garbage collection capable wrappers for skia interop

This commit is contained in:
Alexander Gorshenev
2021-05-06 19:11:05 +03:00
parent d9483ccb08
commit 9148094bbd
30 changed files with 1114 additions and 121 deletions
@@ -1,6 +1,6 @@
language = C++
compilerOpts = -std=c++14
plugin = org.jetbrains.kotlin.native.interop.skia
---
class CppTest {
@@ -1,6 +1,8 @@
language = C++
compilerOpts = -std=c++17
plugin = org.jetbrains.kotlin.native.interop.skia
package = org.jetbrains.skiko.skia.native
headers = stdio.h
---
// TODO: this one checks the syntactic aspect for now.
@@ -22,20 +24,64 @@ template <typename T> sk_sp<T> sk_ref_sp(T* obj) {
return sk_sp<T>(obj);
}
class Value {
public:
int data;
class SkValue {
public:
SkValue() {
printf("SkValue()\n");
};
void unref() {
printf("unref\n");
};
int data;
void setData(int val) {
data = val;
};
};
class Foo {
public:
Foo() { }
class SkData {
public:
SkData() {
printf("SkData()\n");
};
virtual sk_sp<Value> foo(Value *obj) {
return sk_sp<Value>(obj);
}
~SkData() {
printf("~SkData()\n");
};
virtual Value* bar(sk_sp<Value> obj) {
return obj.release();
}
int data;
void setData(int val) {
data = val;
};
};
class SkFoo {
public:
SkFoo() {
printf("SkFoo()\n");
};
~SkFoo() {
printf("~SkFoo()\n");
};
virtual sk_sp<SkValue> foo(SkData *obj) {
SkValue* value = new SkValue();
value->setData(obj->data);
return sk_sp<SkValue>(value);
};
virtual SkData* bar(sk_sp<SkValue> obj) {
SkValue* value = obj.release();
SkData* data = new SkData();
data->setData(value->data);
return data;
};
virtual SkData* qux() {
return new SkData();
};
};
@@ -1,13 +1,32 @@
@file:Suppress("EXPERIMENTAL_API_USAGE_ERROR")
import kotlinx.cinterop.*
import kotlin.test.*
import kotlin.native.internal.*
import skia.*
import org.jetbrains.skiko.skia.native.*
import platform.posix.printf
fun main() {
// TODO: the test used to work with forceCheckedShutdown,
// but it is broken now. Revisit after it is fixed.
// kotlin.native.internal.Debugging.forceCheckedShutdown = true
Platform.isCleanersLeakCheckerActive = true
val f = Foo()
val a = nativeHeap.alloc<Value>()
a.data = 17
val x = f.foo(a.ptr)
val z = f.bar(x)
println("${a?.data} ${z?.pointed?.data}")
val a = Data()
a.setData(17)
val b = f.qux()!!
b.setData(19)
val v = f.foo(a)
val c = f.bar(v)!!
// Use printf instead of println to avoid messages
// appearing out of order with the native code.
// The native code uses printf.
printf("MANAGED: f: ${f.managed}, a: ${a.managed}, b: ${b.managed}, v: ${v.managed}, c: ${c.managed}\n")
printf("DATA: ${a.cpp.data} ${b.cpp.data} ${v.cpp.data} ${c.cpp.data}\n")
}
@@ -0,0 +1,61 @@
language = C++
compilerOpts = -std=c++17
plugin = org.jetbrains.kotlin.native.interop.skia
package = org.jetbrains.skiko.skia.native
headers = stdio.h
---
// TODO: this one checks the syntactic aspect for now.
// To be updated for proper c++ destructor and
// kotlin garbage collection interaction.
template <typename T> class sk_sp {
public:
sk_sp(T* obj) : data(obj) {}
T* release() {
return data;
}
private:
T* data;
};
template <typename T> sk_sp<T> sk_ref_sp(T* obj) {
return sk_sp<T>(obj);
}
class SkData {
public:
SkData() {
printf("SkData()\n");
};
SkData(int val) {
printf("SkData(%d)\n", val);
data = val + 100;
};
SkData(SkData* obj) {
printf("SkData(SkData*)\n");
data = obj->data + 200;
};
SkData(SkData* obj, SkData* obj2) {
printf("SkData(SkData*, SkData*)\n");
data = obj->data + obj2->data + 300;
};
SkData* foo(SkData* obj, SkData* obj2) {
return new SkData(obj->data + obj2->data + data);
};
int data;
void setData(int val) {
data = val;
};
int checkData(int val) {
return val == data;
};
};
@@ -0,0 +1,28 @@
@file:Suppress("EXPERIMENTAL_API_USAGE_ERROR")
import kotlinx.cinterop.*
import kotlin.test.*
import kotlin.native.internal.*
import org.jetbrains.skiko.skia.native.*
import platform.posix.printf
fun main() {
val a = Data()
a.setData(17)
val b = Data(19)
val c = Data(a)
val d = Data(a, b)
val e = Data(200).foo(a, b)!!
val a1 = a.checkData(17) != 0
val b1 = b.checkData(119) != 0
val c1 = c.checkData(217) != 0
val d1 = d.checkData(436) != 0
val e1 = e.checkData(536) != 0
// Use printf instead of println to avoid messages
// appearing out of order with the native code.
// The native code uses printf.
printf("$a1 $b1 $c1 $d1 $e1\n")
}
@@ -1,5 +1,6 @@
language = C++
compilerOpts = -std=c++14
plugin = org.jetbrains.kotlin.native.interop.skia
package = cpptypes
---