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

Implement AnimationBuilder for Native (#371)

parent f48e508f
@file:Suppress("NESTED_EXTERNAL_DECLARATION") @file:Suppress("NESTED_EXTERNAL_DECLARATION")
package org.jetbrains.skia.skottie package org.jetbrains.skia.skottie
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.Data
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.FontMgr
import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.Library.Companion.staticLoad
class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) { class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) {
companion object { companion object {
...@@ -63,7 +60,7 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _ ...@@ -63,7 +60,7 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _
fun buildFromString(data: String): Animation { fun buildFromString(data: String): Animation {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
val ptr = _nBuildFromString(_ptr, data) val ptr = interopScope { _nBuildFromString(_ptr, toInterop(data)) }
require(ptr != NullPointer) { "Failed to create Animation from string: \"$data\"" } require(ptr != NullPointer) { "Failed to create Animation from string: \"$data\"" }
Animation(ptr) Animation(ptr)
} finally { } finally {
...@@ -71,17 +68,6 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _ ...@@ -71,17 +68,6 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _
} }
} }
fun buildFromFile(path: String): Animation {
return try {
Stats.onNativeCall()
val ptr = _nBuildFromFile(_ptr, path)
require(ptr != NullPointer) { "Failed to create Animation from path: $path" }
Animation(ptr)
} finally {
reachabilityBarrier(this)
}
}
fun buildFromData(data: Data): Animation { fun buildFromData(data: Data): Animation {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
...@@ -108,10 +94,10 @@ private external fun _nSetFontManager(ptr: NativePointer, fontMgrPtr: NativePoin ...@@ -108,10 +94,10 @@ private external fun _nSetFontManager(ptr: NativePointer, fontMgrPtr: NativePoin
private external fun _nSetLogger(ptr: NativePointer, loggerPtr: NativePointer) private external fun _nSetLogger(ptr: NativePointer, loggerPtr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromString") @ExternalSymbolName("org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromString")
private external fun _nBuildFromString(ptr: NativePointer, data: String?): NativePointer private external fun _nBuildFromString(ptr: NativePointer, data: InteropPointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromFile") @ExternalSymbolName("org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromFile")
private external fun _nBuildFromFile(ptr: NativePointer, path: String?): NativePointer internal external fun _nBuildFromFile(ptr: NativePointer, path: InteropPointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromData") @ExternalSymbolName("org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromData")
private external fun _nBuildFromData(ptr: NativePointer, dataPtr: NativePointer): NativePointer private external fun _nBuildFromData(ptr: NativePointer, dataPtr: NativePointer): NativePointer
...@@ -18,4 +18,18 @@ class AnimationTest { ...@@ -18,4 +18,18 @@ class AnimationTest {
assertEquals(0.0f, animation.inPoint) assertEquals(0.0f, animation.inPoint)
assertEquals(180.0f, animation.outPoint) assertEquals(180.0f, animation.outPoint)
} }
@Test
fun canCreateFromStringBuilder() {
val animation = AnimationBuilder().buildFromString(
"""{"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
package org.jetbrains.skia.skottie
import org.jetbrains.skia.impl.Native
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.interopScope
import org.jetbrains.skia.impl.reachabilityBarrier
fun AnimationBuilder.buildFromFile(path: String): Animation {
return try {
Stats.onNativeCall()
val ptr = interopScope { _nBuildFromFile(_ptr, toInterop(path)) }
require(ptr != Native.NullPointer) { "Failed to create Animation from path: $path" }
Animation(ptr)
} finally {
reachabilityBarrier(this)
}
}
\ No newline at end of file
package org.jetbrains.skiko.tests.org.jetbrains.skia.skottie package org.jetbrains.skiko.tests.org.jetbrains.skia.skottie
import org.jetbrains.skia.Data
import org.jetbrains.skia.Point import org.jetbrains.skia.Point
import org.jetbrains.skia.skottie.Animation import org.jetbrains.skia.skottie.Animation
import org.jetbrains.skia.skottie.AnimationBuilder
import org.jetbrains.skia.skottie.buildFromFile
import org.jetbrains.skia.skottie.makeFromFile import org.jetbrains.skia.skottie.makeFromFile
import org.jetbrains.skiko.KotlinBackend import org.jetbrains.skia.tests.makeFromResource
import org.jetbrains.skiko.kotlinBackend
import org.jetbrains.skiko.resourcePath import org.jetbrains.skiko.resourcePath
import org.jetbrains.skiko.tests.runTest
import org.junit.Test import org.junit.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
...@@ -24,4 +27,46 @@ class AnimationTestJVM { ...@@ -24,4 +27,46 @@ class AnimationTestJVM {
assertEquals(0.0f, animation.inPoint) assertEquals(0.0f, animation.inPoint)
assertEquals(180.0f, animation.outPoint) assertEquals(180.0f, animation.outPoint)
} }
@Test
fun canCreateFromFileWithBuilder() {
val animation = AnimationBuilder().buildFromFile(
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)
}
@Test
fun canCreateFromData() = runTest {
val animation = Animation.makeFromData(
Data.makeFromResource("./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)
}
@Test
fun canCreateFromDataWithBuilder() = runTest {
val animation = AnimationBuilder().buildFromData(
Data.makeFromResource("./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
...@@ -35,39 +35,21 @@ SKIKO_EXPORT void org_jetbrains_skia_skottie_AnimationBuilder__1nSetLogger ...@@ -35,39 +35,21 @@ SKIKO_EXPORT void org_jetbrains_skia_skottie_AnimationBuilder__1nSetLogger
instance->setLogger(logger); instance->setLogger(logger);
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromString
(KNativePointer ptr, KInteropPointer dataStr) {
TODO("implement org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromString");
}
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromString SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromString
(KNativePointer ptr, KInteropPointer dataStr) { (KNativePointer ptr, KInteropPointer dataStr) {
Animation::Builder* instance = reinterpret_cast<Animation::Builder*>((ptr)); Animation::Builder* instance = reinterpret_cast<Animation::Builder*>((ptr));
SkString data = skString(env, dataStr); SkString data = skString(dataStr);
sk_sp<Animation> animation = instance->make(data.c_str(), data.size()); sk_sp<Animation> animation = instance->make(data.c_str(), data.size());
return reinterpret_cast<KNativePointer>(animation.release()); return reinterpret_cast<KNativePointer>(animation.release());
} }
#endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromFile
(KNativePointer ptr, KInteropPointer pathStr) {
TODO("implement org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromFile");
}
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromFile SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromFile
(KNativePointer ptr, KInteropPointer pathStr) { (KNativePointer ptr, KInteropPointer pathStr) {
Animation::Builder* instance = reinterpret_cast<Animation::Builder*>((ptr)); Animation::Builder* instance = reinterpret_cast<Animation::Builder*>((ptr));
SkString path = skString(env, pathStr); SkString path = skString(pathStr);
sk_sp<Animation> animation = instance->makeFromFile(path.c_str()); sk_sp<Animation> animation = instance->makeFromFile(path.c_str());
return reinterpret_cast<KNativePointer>(animation.release()); return reinterpret_cast<KNativePointer>(animation.release());
} }
#endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromData SKIKO_EXPORT KNativePointer org_jetbrains_skia_skottie_AnimationBuilder__1nBuildFromData
(KNativePointer ptr, KNativePointer dataPtr) { (KNativePointer ptr, KNativePointer dataPtr) {
......
package org.jetbrains.skia.skottie
import org.jetbrains.skia.impl.Native
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.interopScope
import org.jetbrains.skia.impl.reachabilityBarrier
fun AnimationBuilder.buildFromFile(path: String): Animation {
return try {
Stats.onNativeCall()
val ptr = interopScope { _nBuildFromFile(_ptr, toInterop(path)) }
require(ptr != Native.NullPointer) { "Failed to create Animation from path: $path" }
Animation(ptr)
} finally {
reachabilityBarrier(this)
}
}
\ No newline at end of file
package org.jetbrains.skia.skottie package org.jetbrains.skia.skottie
import org.jetbrains.skia.Point import org.jetbrains.skia.Point
import org.jetbrains.skiko.KotlinBackend
import org.jetbrains.skiko.kotlinBackend
import org.jetbrains.skiko.resourcePath import org.jetbrains.skiko.resourcePath
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
...@@ -22,4 +20,18 @@ class AnimationTestNative { ...@@ -22,4 +20,18 @@ class AnimationTestNative {
assertEquals(0.0f, animation.inPoint) assertEquals(0.0f, animation.inPoint)
assertEquals(180.0f, animation.outPoint) assertEquals(180.0f, animation.outPoint)
} }
@Test
fun canCreateFromFileWithBuilder() {
val animation = AnimationBuilder().buildFromFile(
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