Garbage collection capable wrappers for skia interop
This commit is contained in:
@@ -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
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user