Unverified Commit a077e19b authored by Aleksandr Veselov's avatar Aleksandr Veselov Committed by GitHub

Implement Animation native methods, add test (#341)

* Implement Animation native methods, add test

* Remove dead code
parent 333d444e
...@@ -4,27 +4,18 @@ package org.jetbrains.skia.skottie ...@@ -4,27 +4,18 @@ package org.jetbrains.skia.skottie
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.sksg.InvalidationController import org.jetbrains.skia.sksg.InvalidationController
import org.jetbrains.skia.* import org.jetbrains.skia.*
import org.jetbrains.skia.impl.Managed
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.reachabilityBarrier
import org.jetbrains.skia.ExternalSymbolName import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.getPtr
class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) { class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) {
companion object { companion object {
fun makeFromString(data: String): Animation { fun makeFromString(data: String): Animation {
Stats.onNativeCall() Stats.onNativeCall()
val ptr = _nMakeFromString(data) interopScope {
val ptr = _nMakeFromString(toInterop(data))
require(ptr != NullPointer) { "Failed to create Animation from string=\"$data\"" } require(ptr != NullPointer) { "Failed to create Animation from string=\"$data\"" }
return Animation(ptr) return Animation(ptr)
} }
fun makeFromFile(path: String): Animation {
Stats.onNativeCall()
val ptr = _nMakeFromFile(path)
require(ptr != NullPointer) { "Failed to create Animation from path=\"$path\"" }
return Animation(ptr)
} }
fun makeFromData(data: Data): Animation { fun makeFromData(data: Data): Animation {
...@@ -261,7 +252,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -261,7 +252,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
val version: String val version: String
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetVersion(_ptr) withStringReferenceResult { _nGetVersion(_ptr) }
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -270,7 +261,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -270,7 +261,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
val size: Point val size: Point
get() { get() {
if (_size == null) { if (_size == null) {
_size = _nGetSize(_ptr) _size = Point.fromInteropPointer { _nGetSize(_ptr, it) }
} }
return _size!! return _size!!
} }
...@@ -285,10 +276,10 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -285,10 +276,10 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
private external fun _nGetFinalizer(): NativePointer private external fun _nGetFinalizer(): NativePointer
@ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nMakeFromString") @ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nMakeFromString")
private external fun _nMakeFromString(data: String?): NativePointer private external fun _nMakeFromString(data: InteropPointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nMakeFromFile") @ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nMakeFromFile")
private external fun _nMakeFromFile(path: String?): NativePointer internal external fun _nMakeFromFile(path: InteropPointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nMakeFromData") @ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nMakeFromData")
private external fun _nMakeFromData(dataPtr: NativePointer): NativePointer private external fun _nMakeFromData(dataPtr: NativePointer): NativePointer
...@@ -327,7 +318,7 @@ private external fun _nGetInPoint(ptr: NativePointer): Float ...@@ -327,7 +318,7 @@ private external fun _nGetInPoint(ptr: NativePointer): Float
private external fun _nGetOutPoint(ptr: NativePointer): Float private external fun _nGetOutPoint(ptr: NativePointer): Float
@ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nGetVersion") @ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nGetVersion")
private external fun _nGetVersion(ptr: NativePointer): String private external fun _nGetVersion(ptr: NativePointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nGetSize") @ExternalSymbolName("org_jetbrains_skia_skottie_Animation__1nGetSize")
private external fun _nGetSize(ptr: NativePointer): Point? private external fun _nGetSize(ptr: NativePointer, dst: InteropPointer)
package org.jetbrains.skia.skottie
import org.jetbrains.skia.Point
import kotlin.test.Test
import kotlin.test.assertEquals
class AnimationTest {
@Test
fun canCreateFromString() {
val animation = Animation.makeFromString(
"""{"nm": "Test","v": "1.42.0","ip": 0,"op": 180,"fr": 60,"w": 32,"h": 32,"layers": []}"""
)
assertEquals("1.42.0", animation.version)
assertEquals(Point(32.0f, 32.0f), animation.size)
assertEquals(60.0f, animation.fPS)
assertEquals(3.0f, animation.duration)
assertEquals(0.0f, animation.inPoint)
assertEquals(180.0f, animation.outPoint)
}
}
\ No newline at end of file
{"nm": "Test","v": "1.42.0","ip": 0,"op": 180,"fr": 60,"w": 32,"h": 32,"layers": []}
\ No newline at end of file
...@@ -90,15 +90,16 @@ extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_skottie_AnimationKt_ ...@@ -90,15 +90,16 @@ extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_skottie_AnimationKt_
return (jfloat) instance->outPoint(); return (jfloat) instance->outPoint();
} }
extern "C" JNIEXPORT jstring JNICALL Java_org_jetbrains_skia_skottie_AnimationKt__1nGetVersion extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_skottie_AnimationKt__1nGetVersion
(JNIEnv* env, jclass jclass, jlong ptr) { (JNIEnv* env, jclass jclass, jlong ptr) {
Animation* instance = reinterpret_cast<Animation*>(static_cast<uintptr_t>(ptr)); Animation* instance = reinterpret_cast<Animation*>(static_cast<uintptr_t>(ptr));
return javaString(env, instance->version()); const SkString* version = &instance->version();
return reinterpret_cast<jlong>(const_cast<SkString*>(version));
} }
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_skottie_AnimationKt__1nGetSize extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_skottie_AnimationKt__1nGetSize
(JNIEnv* env, jclass jclass, jlong ptr) { (JNIEnv* env, jclass jclass, jlong ptr, jfloatArray dst) {
Animation* instance = reinterpret_cast<Animation*>(static_cast<uintptr_t>(ptr)); Animation* instance = reinterpret_cast<Animation*>(static_cast<uintptr_t>(ptr));
const SkSize& size = instance->size(); const SkSize& size = instance->size();
return skija::Point::make(env, size.fWidth, size.fHeight); skija::Point::copyToInterop(env, {size.fWidth, size.fHeight}, dst);
} }
package org.jetbrains.skia.skottie
import org.jetbrains.skia.impl.Native
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.interopScope
fun Animation.Companion.makeFromFile(path: String): Animation {
Stats.onNativeCall()
interopScope {
val ptr = _nMakeFromFile(toInterop(path))
require(ptr != Native.NullPointer) { "Failed to create Animation from path=\"$path\"" }
return Animation(ptr)
}
}
\ No newline at end of file
package org.jetbrains.skiko.tests.org.jetbrains.skia.skottie
import org.jetbrains.skia.Point
import org.jetbrains.skia.skottie.Animation
import org.jetbrains.skia.skottie.makeFromFile
import org.jetbrains.skiko.KotlinBackend
import org.jetbrains.skiko.kotlinBackend
import org.jetbrains.skiko.resourcePath
import org.junit.Test
import kotlin.test.assertEquals
class AnimationTestJVM {
@Test
fun canCreateFromFile() {
val animation = Animation.makeFromFile(
resourcePath("./skottie/test_animation01.json")
)
assertEquals("1.42.0", animation.version)
assertEquals(Point(32.0f, 32.0f), animation.size)
assertEquals(60.0f, animation.fPS)
assertEquals(3.0f, animation.duration)
assertEquals(0.0f, animation.inPoint)
assertEquals(180.0f, animation.outPoint)
}
}
\ No newline at end of file
...@@ -59,7 +59,7 @@ namespace skija { ...@@ -59,7 +59,7 @@ namespace skija {
} }
namespace Point { namespace Point {
void copyToInterop(const SkPoint& rect, KInteropPointer pointer); void copyToInterop(const SkPoint& point, KInteropPointer pointer);
} }
namespace RRect { namespace RRect {
......
...@@ -19,33 +19,18 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nGetFinalizer ...@@ -19,33 +19,18 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nGetFinalizer
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nMakeFromString SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nMakeFromString
(KInteropPointer dataStr) { (KInteropPointer dataStr) {
TODO("implement org_jetbrains_skia_skottie_Animation__1nMakeFromString"); SkString data = skString(dataStr);
}
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nMakeFromString
(KInteropPointer dataStr) {
SkString data = skString(env, dataStr);
sk_sp<Animation> instance = Animation::Make(data.c_str(), data.size()); sk_sp<Animation> instance = Animation::Make(data.c_str(), data.size());
return reinterpret_cast<KNativePointer>(instance.release()); return reinterpret_cast<KNativePointer>(instance.release());
} }
#endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nMakeFromFile SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nMakeFromFile
(KInteropPointer pathStr) { (KInteropPointer pathStr) {
TODO("implement org_jetbrains_skia_skottie_Animation__1nMakeFromFile"); SkString path = skString(pathStr);
}
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nMakeFromFile
(KInteropPointer pathStr) {
SkString path = skString(env, pathStr);
sk_sp<Animation> instance = Animation::MakeFromFile(path.c_str()); sk_sp<Animation> instance = Animation::MakeFromFile(path.c_str());
return reinterpret_cast<KNativePointer>(instance.release()); return reinterpret_cast<KNativePointer>(instance.release());
} }
#endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nMakeFromData SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_Animation__1nMakeFromData
...@@ -110,32 +95,18 @@ SKIKO_EXPORT KFloat org_jetbrains_skia_skottie_Animation__1nGetOutPoint ...@@ -110,32 +95,18 @@ SKIKO_EXPORT KFloat org_jetbrains_skia_skottie_Animation__1nGetOutPoint
} }
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_skottie_Animation__1nGetVersion
(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_skottie_Animation__1nGetVersion");
}
#if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_skottie_Animation__1nGetVersion SKIKO_EXPORT KInteropPointer org_jetbrains_skia_skottie_Animation__1nGetVersion
(KNativePointer ptr) { (KNativePointer ptr) {
Animation* instance = reinterpret_cast<Animation*>((ptr)); Animation* instance = reinterpret_cast<Animation*>((ptr));
return javaString(env, instance->version()); const SkString* version = &instance->version();
return reinterpret_cast<KInteropPointer>(const_cast<SkString*>(version));
} }
#endif
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_skottie_Animation__1nGetSize SKIKO_EXPORT void org_jetbrains_skia_skottie_Animation__1nGetSize
(KNativePointer ptr) { (KNativePointer ptr, KInteropPointer dst) {
TODO("implement org_jetbrains_skia_skottie_Animation__1nGetSize");
}
#if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_skottie_Animation__1nGetSize
(KNativePointer ptr) {
Animation* instance = reinterpret_cast<Animation*>((ptr)); Animation* instance = reinterpret_cast<Animation*>((ptr));
const SkSize& size = instance->size(); const SkSize& size = instance->size();
return skija::Point::make(env, size.fWidth, size.fHeight); return skija::Point::copyToInterop({ size.fWidth, size.fHeight }, dst);
} }
#endif
package org.jetbrains.skia.skottie
import org.jetbrains.skia.impl.Native
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.interopScope
fun Animation.Companion.makeFromFile(path: String): Animation {
Stats.onNativeCall()
interopScope {
val ptr = _nMakeFromFile(toInterop(path))
require(ptr != Native.NullPointer) { "Failed to create Animation from path=\"$path\"" }
return Animation(ptr)
}
}
\ No newline at end of file
package org.jetbrains.skia.skottie
import org.jetbrains.skia.Point
import org.jetbrains.skiko.KotlinBackend
import org.jetbrains.skiko.kotlinBackend
import org.jetbrains.skiko.resourcePath
import kotlin.test.Test
import kotlin.test.assertEquals
class AnimationTestNative {
@Test
fun canCreateFromFile() {
val animation = Animation.makeFromFile(
resourcePath("./skottie/test_animation01.json")
)
assertEquals("1.42.0", animation.version)
assertEquals(Point(32.0f, 32.0f), animation.size)
assertEquals(60.0f, animation.fPS)
assertEquals(3.0f, animation.duration)
assertEquals(0.0f, animation.inPoint)
assertEquals(180.0f, animation.outPoint)
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment