Copy disabled (too large)
Download .txt
Showing preview only (24,153K chars total). Download the full file to get everything.
Repository: gindemit/unity-rlottie
Branch: dev
Commit: d692157d1349
Files: 697
Total size: 36.2 MB
Directory structure:
gitextract_iryq256z/
├── .editorconfig
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── activation.yaml
│ └── build_native_libraries.yaml
├── .gitignore
├── .gitmodules
├── AGENTS.md
├── LICENSE
├── README.md
├── dependency/
│ └── pixman/
│ ├── pixman-arm-intrisics.cpp
│ ├── pixman-arm-neon-asm.S
│ ├── pixman-arm-neon-asm.h
│ ├── pixman-arma64-neon-asm.S
│ ├── pixman-arma64-neon-asm.h
│ └── pixman-cpp-standard.cpp
├── projects/
│ ├── AndroidStudio/
│ │ ├── .gitignore
│ │ ├── .idea/
│ │ │ ├── .gitignore
│ │ │ ├── .name
│ │ │ ├── compiler.xml
│ │ │ ├── gradle.xml
│ │ │ ├── misc.xml
│ │ │ └── vcs.xml
│ │ ├── app/
│ │ │ ├── .gitignore
│ │ │ ├── build.gradle
│ │ │ ├── proguard-rules.pro
│ │ │ └── src/
│ │ │ ├── androidTest/
│ │ │ │ └── java/
│ │ │ │ └── com/
│ │ │ │ └── gindemit/
│ │ │ │ └── rlottie/
│ │ │ │ └── ExampleInstrumentedTest.java
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── gindemit/
│ │ │ │ │ └── rlottie/
│ │ │ │ │ └── MainActivity.java
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ └── ic_launcher_background.xml
│ │ │ │ ├── drawable-v24/
│ │ │ │ │ └── ic_launcher_foreground.xml
│ │ │ │ ├── layout/
│ │ │ │ │ └── activity_main.xml
│ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ ├── ic_launcher.xml
│ │ │ │ │ └── ic_launcher_round.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── themes.xml
│ │ │ │ └── values-night/
│ │ │ │ └── themes.xml
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── gindemit/
│ │ │ └── rlottie/
│ │ │ └── ExampleUnitTest.java
│ │ ├── build.gradle
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ └── settings.gradle
│ └── CMake/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ └── CMakeSettings.json
├── src/
│ ├── ExportApi.h
│ ├── LottiePlugin.cpp
│ └── LottiePlugin.h
└── unity/
└── RLottieUnity/
├── .editorconfig
├── .gitignore
├── .vsconfig
├── Assets/
│ ├── LottiePlugin/
│ │ ├── Editor/
│ │ │ ├── LottiePlugin.Editor.asmdef
│ │ │ ├── LottiePlugin.Editor.asmdef.meta
│ │ │ ├── src/
│ │ │ │ ├── AnimatedButtonEditor.cs
│ │ │ │ ├── AnimatedButtonEditor.cs.meta
│ │ │ │ ├── AnimatedImageEditor.cs
│ │ │ │ ├── AnimatedImageEditor.cs.meta
│ │ │ │ ├── OpenPersistentDataPathFolder.cs
│ │ │ │ └── OpenPersistentDataPathFolder.cs.meta
│ │ │ └── src.meta
│ │ ├── Editor.meta
│ │ ├── Plugins/
│ │ │ ├── Android/
│ │ │ │ ├── arm64-v8a/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ ├── arm64-v8a.meta
│ │ │ │ ├── armeabi-v7a/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ ├── armeabi-v7a.meta
│ │ │ │ ├── x86/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ ├── x86.meta
│ │ │ │ ├── x86_64/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ └── x86_64.meta
│ │ │ ├── Android.meta
│ │ │ ├── Linux/
│ │ │ │ ├── x86_64/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ └── x86_64.meta
│ │ │ ├── Linux.meta
│ │ │ ├── OSX/
│ │ │ │ └── libLottiePlugin.dylib.meta
│ │ │ ├── OSX.meta
│ │ │ ├── WebGL/
│ │ │ │ ├── LottiePlugin.bc
│ │ │ │ ├── LottiePlugin.bc.meta
│ │ │ │ ├── libLottiePlugin.a
│ │ │ │ ├── libLottiePlugin.a.meta
│ │ │ │ ├── librlottie.a
│ │ │ │ └── librlottie.a.meta
│ │ │ ├── WebGL.meta
│ │ │ ├── Windows/
│ │ │ │ ├── x86/
│ │ │ │ │ └── LottiePlugin.dll.meta
│ │ │ │ ├── x86.meta
│ │ │ │ ├── x86_64/
│ │ │ │ │ └── LottiePlugin.dll.meta
│ │ │ │ └── x86_64.meta
│ │ │ ├── Windows.meta
│ │ │ ├── iOS/
│ │ │ │ ├── libLottiePlugin.a
│ │ │ │ ├── libLottiePlugin.a.meta
│ │ │ │ ├── librlottie.a
│ │ │ │ ├── librlottie.a.meta
│ │ │ │ ├── x86_64/
│ │ │ │ │ ├── libLottiePlugin.a
│ │ │ │ │ ├── libLottiePlugin.a.meta
│ │ │ │ │ ├── librlottie.a
│ │ │ │ │ └── librlottie.a.meta
│ │ │ │ └── x86_64.meta
│ │ │ └── iOS.meta
│ │ ├── Plugins.meta
│ │ ├── Runtime/
│ │ │ ├── AssemblyAttributes.cs
│ │ │ ├── AssemblyAttributes.cs.meta
│ │ │ ├── LottiePlugin.Runtime.asmdef
│ │ │ ├── LottiePlugin.Runtime.asmdef.meta
│ │ │ ├── src/
│ │ │ │ ├── LottieAnimation.cs
│ │ │ │ ├── LottieAnimation.cs.meta
│ │ │ │ ├── LottieAnimationsAtlas.cs
│ │ │ │ ├── LottieAnimationsAtlas.cs.meta
│ │ │ │ ├── NativeBridge.cs
│ │ │ │ ├── NativeBridge.cs.meta
│ │ │ │ ├── Support/
│ │ │ │ │ ├── FIleSizeFormatter.cs
│ │ │ │ │ ├── FIleSizeFormatter.cs.meta
│ │ │ │ │ ├── FilesHelper.cs
│ │ │ │ │ ├── FilesHelper.cs.meta
│ │ │ │ │ ├── StreamingAssetsHelper.cs
│ │ │ │ │ └── StreamingAssetsHelper.cs.meta
│ │ │ │ ├── Support.meta
│ │ │ │ ├── UI/
│ │ │ │ │ ├── AnimatedButton.cs
│ │ │ │ │ ├── AnimatedButton.cs.meta
│ │ │ │ │ ├── AnimatedImage.cs
│ │ │ │ │ └── AnimatedImage.cs.meta
│ │ │ │ ├── UI.meta
│ │ │ │ ├── Utility/
│ │ │ │ │ ├── ThrowIf.cs
│ │ │ │ │ └── ThrowIf.cs.meta
│ │ │ │ └── Utility.meta
│ │ │ └── src.meta
│ │ ├── Runtime.meta
│ │ ├── Samples~/
│ │ │ ├── SceneUI/
│ │ │ │ ├── ExternalDlls/
│ │ │ │ │ ├── Newtonsoft.Json.dll.meta
│ │ │ │ │ ├── System.Buffers.dll.meta
│ │ │ │ │ ├── System.Memory.dll.meta
│ │ │ │ │ ├── System.Threading.Tasks.Extensions.dll.meta
│ │ │ │ │ └── Telegram.Bot.dll.meta
│ │ │ │ ├── ExternalDlls.meta
│ │ │ │ ├── Graphy - Ultimate Stats Monitor/
│ │ │ │ │ ├── Changelog.txt
│ │ │ │ │ ├── Changelog.txt.meta
│ │ │ │ │ ├── Editor/
│ │ │ │ │ │ ├── GraphyDebuggerEditor.cs
│ │ │ │ │ │ ├── GraphyDebuggerEditor.cs.meta
│ │ │ │ │ │ ├── GraphyEditorStyle.cs
│ │ │ │ │ │ ├── GraphyEditorStyle.cs.meta
│ │ │ │ │ │ ├── GraphyManagerEditor.cs
│ │ │ │ │ │ ├── GraphyManagerEditor.cs.meta
│ │ │ │ │ │ ├── GraphyMenuItem.cs
│ │ │ │ │ │ ├── GraphyMenuItem.cs.meta
│ │ │ │ │ │ ├── Tayx.Graphy.Editor.asmdef
│ │ │ │ │ │ └── Tayx.Graphy.Editor.asmdef.meta
│ │ │ │ │ ├── Editor.meta
│ │ │ │ │ ├── Font/
│ │ │ │ │ │ ├── Northwest-Bold/
│ │ │ │ │ │ │ ├── ERIC-TIRADO-NORTHWEST-LICENSE.txt
│ │ │ │ │ │ │ ├── ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta
│ │ │ │ │ │ │ ├── NORTHWEST-B.otf
│ │ │ │ │ │ │ └── NORTHWEST-B.otf.meta
│ │ │ │ │ │ ├── Northwest-Bold.meta
│ │ │ │ │ │ ├── Roboto/
│ │ │ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ │ │ ├── LICENSE.txt.meta
│ │ │ │ │ │ │ ├── Roboto-Bold.ttf.meta
│ │ │ │ │ │ │ └── Roboto-Regular.ttf.meta
│ │ │ │ │ │ └── Roboto.meta
│ │ │ │ │ ├── Font.meta
│ │ │ │ │ ├── GUI/
│ │ │ │ │ │ ├── GraphyGUISkin.guiskin
│ │ │ │ │ │ └── GraphyGUISkin.guiskin.meta
│ │ │ │ │ ├── GUI.meta
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── LICENSE.meta
│ │ │ │ │ ├── Materials/
│ │ │ │ │ │ ├── Audio_Spectrum_Graph.mat
│ │ │ │ │ │ ├── Audio_Spectrum_Graph.mat.meta
│ │ │ │ │ │ ├── Audio_Spectrum_Highest_Values_Graph.mat
│ │ │ │ │ │ ├── Audio_Spectrum_Highest_Values_Graph.mat.meta
│ │ │ │ │ │ ├── FPS_Graph.mat
│ │ │ │ │ │ ├── FPS_Graph.mat.meta
│ │ │ │ │ │ ├── RAM_Allocated_Graph.mat
│ │ │ │ │ │ ├── RAM_Allocated_Graph.mat.meta
│ │ │ │ │ │ ├── RAM_Mono_Graph.mat
│ │ │ │ │ │ ├── RAM_Mono_Graph.mat.meta
│ │ │ │ │ │ ├── RAM_Reserved_Graph.mat
│ │ │ │ │ │ └── RAM_Reserved_Graph.mat.meta
│ │ │ │ │ ├── Materials.meta
│ │ │ │ │ ├── Prefab/
│ │ │ │ │ │ ├── Internal/
│ │ │ │ │ │ │ ├── ADVANCED - Module.prefab
│ │ │ │ │ │ │ ├── ADVANCED - Module.prefab.meta
│ │ │ │ │ │ │ ├── AUDIO - Module.prefab
│ │ │ │ │ │ │ ├── AUDIO - Module.prefab.meta
│ │ │ │ │ │ │ ├── FPS - Module.prefab
│ │ │ │ │ │ │ ├── FPS - Module.prefab.meta
│ │ │ │ │ │ │ ├── RAM - Module.prefab
│ │ │ │ │ │ │ └── RAM - Module.prefab.meta
│ │ │ │ │ │ ├── Internal.meta
│ │ │ │ │ │ ├── [Graphy].prefab
│ │ │ │ │ │ └── [Graphy].prefab.meta
│ │ │ │ │ ├── Prefab.meta
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── README.md.meta
│ │ │ │ │ ├── Readme! - Graphy - Documentation.pdf.meta
│ │ │ │ │ ├── Runtime/
│ │ │ │ │ │ ├── Advanced/
│ │ │ │ │ │ │ ├── G_AdvancedData.cs
│ │ │ │ │ │ │ └── G_AdvancedData.cs.meta
│ │ │ │ │ │ ├── Advanced.meta
│ │ │ │ │ │ ├── Audio/
│ │ │ │ │ │ │ ├── G_AudioGraph.cs
│ │ │ │ │ │ │ ├── G_AudioGraph.cs.meta
│ │ │ │ │ │ │ ├── G_AudioManager.cs
│ │ │ │ │ │ │ ├── G_AudioManager.cs.meta
│ │ │ │ │ │ │ ├── G_AudioMonitor.cs
│ │ │ │ │ │ │ ├── G_AudioMonitor.cs.meta
│ │ │ │ │ │ │ ├── G_AudioText.cs
│ │ │ │ │ │ │ └── G_AudioText.cs.meta
│ │ │ │ │ │ ├── Audio.meta
│ │ │ │ │ │ ├── Fps/
│ │ │ │ │ │ │ ├── G_FpsGraph.cs
│ │ │ │ │ │ │ ├── G_FpsGraph.cs.meta
│ │ │ │ │ │ │ ├── G_FpsManager.cs
│ │ │ │ │ │ │ ├── G_FpsManager.cs.meta
│ │ │ │ │ │ │ ├── G_FpsMonitor.cs
│ │ │ │ │ │ │ ├── G_FpsMonitor.cs.meta
│ │ │ │ │ │ │ ├── G_FpsText.cs
│ │ │ │ │ │ │ └── G_FpsText.cs.meta
│ │ │ │ │ │ ├── Fps.meta
│ │ │ │ │ │ ├── Graph/
│ │ │ │ │ │ │ ├── G_Graph.cs
│ │ │ │ │ │ │ └── G_Graph.cs.meta
│ │ │ │ │ │ ├── Graph.meta
│ │ │ │ │ │ ├── GraphyDebugger.cs
│ │ │ │ │ │ ├── GraphyDebugger.cs.meta
│ │ │ │ │ │ ├── GraphyManager.cs
│ │ │ │ │ │ ├── GraphyManager.cs.meta
│ │ │ │ │ │ ├── Ram/
│ │ │ │ │ │ │ ├── G_RamGraph.cs
│ │ │ │ │ │ │ ├── G_RamGraph.cs.meta
│ │ │ │ │ │ │ ├── G_RamManager.cs
│ │ │ │ │ │ │ ├── G_RamManager.cs.meta
│ │ │ │ │ │ │ ├── G_RamMonitor.cs
│ │ │ │ │ │ │ ├── G_RamMonitor.cs.meta
│ │ │ │ │ │ │ ├── G_RamText.cs
│ │ │ │ │ │ │ └── G_RamText.cs.meta
│ │ │ │ │ │ ├── Ram.meta
│ │ │ │ │ │ ├── Shader/
│ │ │ │ │ │ │ ├── G_GraphShader.cs
│ │ │ │ │ │ │ └── G_GraphShader.cs.meta
│ │ │ │ │ │ ├── Shader.meta
│ │ │ │ │ │ ├── Tayx.Graphy.asmdef
│ │ │ │ │ │ ├── Tayx.Graphy.asmdef.meta
│ │ │ │ │ │ ├── UI/
│ │ │ │ │ │ │ ├── IModifiableState.cs
│ │ │ │ │ │ │ ├── IModifiableState.cs.meta
│ │ │ │ │ │ │ ├── IMovable.cs
│ │ │ │ │ │ │ └── IMovable.cs.meta
│ │ │ │ │ │ ├── UI.meta
│ │ │ │ │ │ ├── Util/
│ │ │ │ │ │ │ ├── G_ExtensionMethods.cs
│ │ │ │ │ │ │ ├── G_ExtensionMethods.cs.meta
│ │ │ │ │ │ │ ├── G_FloatString.cs
│ │ │ │ │ │ │ ├── G_FloatString.cs.meta
│ │ │ │ │ │ │ ├── G_Intstring.cs
│ │ │ │ │ │ │ ├── G_Intstring.cs.meta
│ │ │ │ │ │ │ ├── G_Singleton.cs
│ │ │ │ │ │ │ └── G_Singleton.cs.meta
│ │ │ │ │ │ └── Util.meta
│ │ │ │ │ ├── Runtime.meta
│ │ │ │ │ ├── Shaders/
│ │ │ │ │ │ ├── GraphMobile.shader
│ │ │ │ │ │ ├── GraphMobile.shader.meta
│ │ │ │ │ │ ├── GraphStandard.shader
│ │ │ │ │ │ └── GraphStandard.shader.meta
│ │ │ │ │ ├── Shaders.meta
│ │ │ │ │ ├── Textures/
│ │ │ │ │ │ ├── 2x2_Texture.png.meta
│ │ │ │ │ │ ├── Debugger_Logo_Dark.png.meta
│ │ │ │ │ │ ├── Debugger_Logo_White.png.meta
│ │ │ │ │ │ ├── Manager_Logo_Dark.png.meta
│ │ │ │ │ │ ├── Manager_Logo_White.png.meta
│ │ │ │ │ │ └── Rounded_Rect_10px.png.meta
│ │ │ │ │ ├── Textures.meta
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── package.json.meta
│ │ │ │ ├── Graphy - Ultimate Stats Monitor.meta
│ │ │ │ ├── LottieJsons/
│ │ │ │ │ ├── UI/
│ │ │ │ │ │ ├── Common/
│ │ │ │ │ │ │ ├── loading_animation.json
│ │ │ │ │ │ │ ├── loading_animation.json.meta
│ │ │ │ │ │ │ ├── no_data_found_animation.json
│ │ │ │ │ │ │ └── no_data_found_animation.json.meta
│ │ │ │ │ │ ├── Common.meta
│ │ │ │ │ │ ├── LottiePlayerScreen/
│ │ │ │ │ │ │ ├── hamburger_menu.json
│ │ │ │ │ │ │ ├── hamburger_menu.json.meta
│ │ │ │ │ │ │ ├── next_track.json
│ │ │ │ │ │ │ ├── next_track.json.meta
│ │ │ │ │ │ │ ├── pause_play.json
│ │ │ │ │ │ │ └── pause_play.json.meta
│ │ │ │ │ │ ├── LottiePlayerScreen.meta
│ │ │ │ │ │ ├── MainMenu/
│ │ │ │ │ │ │ ├── 3d_cubes_icon.json
│ │ │ │ │ │ │ ├── 3d_cubes_icon.json.meta
│ │ │ │ │ │ │ ├── explore_icon.json
│ │ │ │ │ │ │ ├── explore_icon.json.meta
│ │ │ │ │ │ │ ├── home_icon.json
│ │ │ │ │ │ │ ├── home_icon.json.meta
│ │ │ │ │ │ │ ├── video_player_icon.json
│ │ │ │ │ │ │ └── video_player_icon.json.meta
│ │ │ │ │ │ └── MainMenu.meta
│ │ │ │ │ └── UI.meta
│ │ │ │ ├── LottieJsons.meta
│ │ │ │ ├── Materials/
│ │ │ │ │ ├── UIMaterial.mat
│ │ │ │ │ └── UIMaterial.mat.meta
│ │ │ │ ├── Materials.meta
│ │ │ │ ├── Prefabs/
│ │ │ │ │ ├── UI/
│ │ │ │ │ │ ├── AnimationPreview.prefab
│ │ │ │ │ │ ├── AnimationPreview.prefab.meta
│ │ │ │ │ │ ├── LottieAnimationsPreview.prefab
│ │ │ │ │ │ └── LottieAnimationsPreview.prefab.meta
│ │ │ │ │ └── UI.meta
│ │ │ │ ├── Prefabs.meta
│ │ │ │ ├── README.txt
│ │ │ │ ├── README.txt.meta
│ │ │ │ ├── Scenes/
│ │ │ │ │ ├── SampleScene.unity
│ │ │ │ │ └── SampleScene.unity.meta
│ │ │ │ ├── Scenes.meta
│ │ │ │ ├── ScriptableObjects/
│ │ │ │ │ ├── LottieAnimationsArray.asset
│ │ │ │ │ └── LottieAnimationsArray.asset.meta
│ │ │ │ ├── ScriptableObjects.meta
│ │ │ │ ├── Scripts/
│ │ │ │ │ ├── Editor/
│ │ │ │ │ │ ├── LottiePlugin.Sample.SceneUI.Editor.asmdef
│ │ │ │ │ │ ├── LottiePlugin.Sample.SceneUI.Editor.asmdef.meta
│ │ │ │ │ │ ├── src/
│ │ │ │ │ │ │ ├── PopulateLottieAnimations.cs
│ │ │ │ │ │ │ ├── PopulateLottieAnimations.cs.meta
│ │ │ │ │ │ │ ├── StreamingAssetsChecker.cs
│ │ │ │ │ │ │ └── StreamingAssetsChecker.cs.meta
│ │ │ │ │ │ └── src.meta
│ │ │ │ │ ├── Editor.meta
│ │ │ │ │ ├── Runtime/
│ │ │ │ │ │ ├── LottiePlugin.Sample.SceneUI.Runtime.asmdef
│ │ │ │ │ │ ├── LottiePlugin.Sample.SceneUI.Runtime.asmdef.meta
│ │ │ │ │ │ ├── src/
│ │ │ │ │ │ │ ├── Data/
│ │ │ │ │ │ │ │ ├── LottieAnimations.cs
│ │ │ │ │ │ │ │ └── LottieAnimations.cs.meta
│ │ │ │ │ │ │ ├── Data.meta
│ │ │ │ │ │ │ ├── State/
│ │ │ │ │ │ │ │ ├── AppState.cs
│ │ │ │ │ │ │ │ └── AppState.cs.meta
│ │ │ │ │ │ │ ├── State.meta
│ │ │ │ │ │ │ ├── Storage/
│ │ │ │ │ │ │ │ ├── CanNotFindStickerPackException.cs
│ │ │ │ │ │ │ │ ├── CanNotFindStickerPackException.cs.meta
│ │ │ │ │ │ │ │ ├── TelegramStickerStorage.cs
│ │ │ │ │ │ │ │ └── TelegramStickerStorage.cs.meta
│ │ │ │ │ │ │ ├── Storage.meta
│ │ │ │ │ │ │ ├── UI/
│ │ │ │ │ │ │ │ ├── AnimationPreview.cs
│ │ │ │ │ │ │ │ ├── AnimationPreview.cs.meta
│ │ │ │ │ │ │ │ ├── AnimationsHomeScreen.cs
│ │ │ │ │ │ │ │ ├── AnimationsHomeScreen.cs.meta
│ │ │ │ │ │ │ │ ├── ExploreTelegramStickers.cs
│ │ │ │ │ │ │ │ ├── ExploreTelegramStickers.cs.meta
│ │ │ │ │ │ │ │ ├── LottieAnimationsPreview.cs
│ │ │ │ │ │ │ │ ├── LottieAnimationsPreview.cs.meta
│ │ │ │ │ │ │ │ ├── LottiePlayerScreen.cs
│ │ │ │ │ │ │ │ ├── LottiePlayerScreen.cs.meta
│ │ │ │ │ │ │ │ ├── MainMenu.cs
│ │ │ │ │ │ │ │ └── MainMenu.cs.meta
│ │ │ │ │ │ │ └── UI.meta
│ │ │ │ │ │ └── src.meta
│ │ │ │ │ └── Runtime.meta
│ │ │ │ ├── Scripts.meta
│ │ │ │ ├── Shaders/
│ │ │ │ │ ├── UI-Default.shader
│ │ │ │ │ ├── UI-Default.shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored (TextureClip).shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored (TextureClip).shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored 1.shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored 1.shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored 2.shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored 2.shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored 3.shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored 3.shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored.shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored.shader.meta
│ │ │ │ │ ├── Unlit - Text (TextureClip).shader
│ │ │ │ │ ├── Unlit - Text (TextureClip).shader.meta
│ │ │ │ │ ├── Unlit - Text 1.shader
│ │ │ │ │ ├── Unlit - Text 1.shader.meta
│ │ │ │ │ ├── Unlit - Text 2.shader
│ │ │ │ │ ├── Unlit - Text 2.shader.meta
│ │ │ │ │ ├── Unlit - Text 3.shader
│ │ │ │ │ ├── Unlit - Text 3.shader.meta
│ │ │ │ │ ├── Unlit - Text.shader
│ │ │ │ │ ├── Unlit - Text.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored (Packed) (TextureClip).shader
│ │ │ │ │ ├── Unlit - Transparent Colored (Packed) (TextureClip).shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored (TextureClip).shader
│ │ │ │ │ ├── Unlit - Transparent Colored (TextureClip).shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored 1.shader
│ │ │ │ │ ├── Unlit - Transparent Colored 1.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored 2.shader
│ │ │ │ │ ├── Unlit - Transparent Colored 2.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored 3.shader
│ │ │ │ │ ├── Unlit - Transparent Colored 3.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored.shader
│ │ │ │ │ ├── Unlit - Transparent Colored.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Masked 1.shader
│ │ │ │ │ ├── Unlit - Transparent Masked 1.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Masked 2.shader
│ │ │ │ │ ├── Unlit - Transparent Masked 2.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Masked 3.shader
│ │ │ │ │ ├── Unlit - Transparent Masked 3.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Masked.shader
│ │ │ │ │ ├── Unlit - Transparent Masked.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Packed 1.shader
│ │ │ │ │ ├── Unlit - Transparent Packed 1.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Packed 2.shader
│ │ │ │ │ ├── Unlit - Transparent Packed 2.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Packed 3.shader
│ │ │ │ │ ├── Unlit - Transparent Packed 3.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Packed.shader
│ │ │ │ │ └── Unlit - Transparent Packed.shader.meta
│ │ │ │ ├── Shaders.meta
│ │ │ │ ├── StreamingAssets/
│ │ │ │ │ ├── LottieSamples/
│ │ │ │ │ │ ├── alright_sticker.json
│ │ │ │ │ │ ├── alright_sticker.json.meta
│ │ │ │ │ │ ├── black_friday_animation.json
│ │ │ │ │ │ ├── black_friday_animation.json.meta
│ │ │ │ │ │ ├── body_movin.json
│ │ │ │ │ │ ├── body_movin.json.meta
│ │ │ │ │ │ ├── butterfly_loading.json
│ │ │ │ │ │ ├── butterfly_loading.json.meta
│ │ │ │ │ │ ├── check_animation.json
│ │ │ │ │ │ ├── check_animation.json.meta
│ │ │ │ │ │ ├── concept_floral_branch_butterfly_and_tree.json
│ │ │ │ │ │ ├── concept_floral_branch_butterfly_and_tree.json.meta
│ │ │ │ │ │ ├── confetti.json
│ │ │ │ │ │ ├── confetti.json.meta
│ │ │ │ │ │ ├── favourite_app_icon.json
│ │ │ │ │ │ ├── favourite_app_icon.json.meta
│ │ │ │ │ │ ├── glow_loading.json
│ │ │ │ │ │ ├── glow_loading.json.meta
│ │ │ │ │ │ ├── hamburger_arrow_transition.json
│ │ │ │ │ │ ├── hamburger_arrow_transition.json.meta
│ │ │ │ │ │ ├── hubit.json
│ │ │ │ │ │ ├── hubit.json.meta
│ │ │ │ │ │ ├── lottiefiles_sticker_2.json
│ │ │ │ │ │ ├── lottiefiles_sticker_2.json.meta
│ │ │ │ │ │ ├── lottiefiles_sticker_5.json
│ │ │ │ │ │ ├── lottiefiles_sticker_5.json.meta
│ │ │ │ │ │ ├── marketing.json
│ │ │ │ │ │ ├── marketing.json.meta
│ │ │ │ │ │ ├── motorcycle.json
│ │ │ │ │ │ ├── motorcycle.json.meta
│ │ │ │ │ │ ├── phone.json
│ │ │ │ │ │ ├── phone.json.meta
│ │ │ │ │ │ ├── power_sticker.json
│ │ │ │ │ │ ├── power_sticker.json.meta
│ │ │ │ │ │ ├── preloader.json
│ │ │ │ │ │ ├── preloader.json.meta
│ │ │ │ │ │ ├── squid_game/
│ │ │ │ │ │ │ ├── 0.json
│ │ │ │ │ │ │ ├── 0.json.meta
│ │ │ │ │ │ │ ├── 1.json
│ │ │ │ │ │ │ ├── 1.json.meta
│ │ │ │ │ │ │ ├── 10.json
│ │ │ │ │ │ │ ├── 10.json.meta
│ │ │ │ │ │ │ ├── 11.json
│ │ │ │ │ │ │ ├── 11.json.meta
│ │ │ │ │ │ │ ├── 12.json
│ │ │ │ │ │ │ ├── 12.json.meta
│ │ │ │ │ │ │ ├── 13.json
│ │ │ │ │ │ │ ├── 13.json.meta
│ │ │ │ │ │ │ ├── 14.json
│ │ │ │ │ │ │ ├── 14.json.meta
│ │ │ │ │ │ │ ├── 15.json
│ │ │ │ │ │ │ ├── 15.json.meta
│ │ │ │ │ │ │ ├── 16.json
│ │ │ │ │ │ │ ├── 16.json.meta
│ │ │ │ │ │ │ ├── 17.json
│ │ │ │ │ │ │ ├── 17.json.meta
│ │ │ │ │ │ │ ├── 18.json
│ │ │ │ │ │ │ ├── 18.json.meta
│ │ │ │ │ │ │ ├── 19.json
│ │ │ │ │ │ │ ├── 19.json.meta
│ │ │ │ │ │ │ ├── 2.json
│ │ │ │ │ │ │ ├── 2.json.meta
│ │ │ │ │ │ │ ├── 20.json
│ │ │ │ │ │ │ ├── 20.json.meta
│ │ │ │ │ │ │ ├── 21.json
│ │ │ │ │ │ │ ├── 21.json.meta
│ │ │ │ │ │ │ ├── 22.json
│ │ │ │ │ │ │ ├── 22.json.meta
│ │ │ │ │ │ │ ├── 23.json
│ │ │ │ │ │ │ ├── 23.json.meta
│ │ │ │ │ │ │ ├── 24.json
│ │ │ │ │ │ │ ├── 24.json.meta
│ │ │ │ │ │ │ ├── 3.json
│ │ │ │ │ │ │ ├── 3.json.meta
│ │ │ │ │ │ │ ├── 4.json
│ │ │ │ │ │ │ ├── 4.json.meta
│ │ │ │ │ │ │ ├── 5.json
│ │ │ │ │ │ │ ├── 5.json.meta
│ │ │ │ │ │ │ ├── 6.json
│ │ │ │ │ │ │ ├── 6.json.meta
│ │ │ │ │ │ │ ├── 7.json
│ │ │ │ │ │ │ ├── 7.json.meta
│ │ │ │ │ │ │ ├── 8.json
│ │ │ │ │ │ │ ├── 8.json.meta
│ │ │ │ │ │ │ ├── 9.json
│ │ │ │ │ │ │ └── 9.json.meta
│ │ │ │ │ │ ├── squid_game.meta
│ │ │ │ │ │ ├── sticker.json
│ │ │ │ │ │ ├── sticker.json.meta
│ │ │ │ │ │ ├── taking_the_duggy_out.json
│ │ │ │ │ │ └── taking_the_duggy_out.json.meta
│ │ │ │ │ └── LottieSamples.meta
│ │ │ │ └── StreamingAssets.meta
│ │ │ └── SceneUI.meta
│ │ ├── Tests/
│ │ │ ├── Audio/
│ │ │ │ ├── pause.mp3.meta
│ │ │ │ ├── start.mp3.meta
│ │ │ │ └── stop.mp3.meta
│ │ │ ├── Audio.meta
│ │ │ ├── Resources/
│ │ │ │ ├── body_movin.json
│ │ │ │ ├── body_movin.json.meta
│ │ │ │ ├── video_player_icon.json
│ │ │ │ └── video_player_icon.json.meta
│ │ │ ├── Resources.meta
│ │ │ ├── Runtime/
│ │ │ │ ├── LottiePlugin.Tests.Runtime.asmdef
│ │ │ │ ├── LottiePlugin.Tests.Runtime.asmdef.meta
│ │ │ │ ├── src/
│ │ │ │ │ ├── AnimatedImageTests.cs
│ │ │ │ │ └── AnimatedImageTests.cs.meta
│ │ │ │ └── src.meta
│ │ │ └── Runtime.meta
│ │ ├── Tests.meta
│ │ ├── package.json
│ │ └── package.json.meta
│ ├── LottiePlugin.meta
│ ├── Scenes/
│ │ ├── Main.unity
│ │ └── Main.unity.meta
│ ├── Scenes.meta
│ ├── StreamingAssets/
│ │ ├── LottieSamples/
│ │ │ ├── alright_sticker.json
│ │ │ ├── alright_sticker.json.meta
│ │ │ ├── black_friday_animation.json
│ │ │ ├── black_friday_animation.json.meta
│ │ │ ├── body_movin.json
│ │ │ ├── body_movin.json.meta
│ │ │ ├── butterfly_loading.json
│ │ │ ├── butterfly_loading.json.meta
│ │ │ ├── check_animation.json
│ │ │ ├── check_animation.json.meta
│ │ │ ├── concept_floral_branch_butterfly_and_tree.json
│ │ │ ├── concept_floral_branch_butterfly_and_tree.json.meta
│ │ │ ├── confetti.json
│ │ │ ├── confetti.json.meta
│ │ │ ├── favourite_app_icon.json
│ │ │ ├── favourite_app_icon.json.meta
│ │ │ ├── glow_loading.json
│ │ │ ├── glow_loading.json.meta
│ │ │ ├── hamburger_arrow_transition.json
│ │ │ ├── hamburger_arrow_transition.json.meta
│ │ │ ├── hubit.json
│ │ │ ├── hubit.json.meta
│ │ │ ├── lottiefiles_sticker_2.json
│ │ │ ├── lottiefiles_sticker_2.json.meta
│ │ │ ├── lottiefiles_sticker_5.json
│ │ │ ├── lottiefiles_sticker_5.json.meta
│ │ │ ├── marketing.json
│ │ │ ├── marketing.json.meta
│ │ │ ├── motorcycle.json
│ │ │ ├── motorcycle.json.meta
│ │ │ ├── phone.json
│ │ │ ├── phone.json.meta
│ │ │ ├── power_sticker.json
│ │ │ ├── power_sticker.json.meta
│ │ │ ├── preloader.json
│ │ │ ├── preloader.json.meta
│ │ │ ├── squid_game/
│ │ │ │ ├── 0.json
│ │ │ │ ├── 0.json.meta
│ │ │ │ ├── 1.json
│ │ │ │ ├── 1.json.meta
│ │ │ │ ├── 10.json
│ │ │ │ ├── 10.json.meta
│ │ │ │ ├── 11.json
│ │ │ │ ├── 11.json.meta
│ │ │ │ ├── 12.json
│ │ │ │ ├── 12.json.meta
│ │ │ │ ├── 13.json
│ │ │ │ ├── 13.json.meta
│ │ │ │ ├── 14.json
│ │ │ │ ├── 14.json.meta
│ │ │ │ ├── 15.json
│ │ │ │ ├── 15.json.meta
│ │ │ │ ├── 16.json
│ │ │ │ ├── 16.json.meta
│ │ │ │ ├── 17.json
│ │ │ │ ├── 17.json.meta
│ │ │ │ ├── 18.json
│ │ │ │ ├── 18.json.meta
│ │ │ │ ├── 19.json
│ │ │ │ ├── 19.json.meta
│ │ │ │ ├── 2.json
│ │ │ │ ├── 2.json.meta
│ │ │ │ ├── 20.json
│ │ │ │ ├── 20.json.meta
│ │ │ │ ├── 21.json
│ │ │ │ ├── 21.json.meta
│ │ │ │ ├── 22.json
│ │ │ │ ├── 22.json.meta
│ │ │ │ ├── 23.json
│ │ │ │ ├── 23.json.meta
│ │ │ │ ├── 24.json
│ │ │ │ ├── 24.json.meta
│ │ │ │ ├── 3.json
│ │ │ │ ├── 3.json.meta
│ │ │ │ ├── 4.json
│ │ │ │ ├── 4.json.meta
│ │ │ │ ├── 5.json
│ │ │ │ ├── 5.json.meta
│ │ │ │ ├── 6.json
│ │ │ │ ├── 6.json.meta
│ │ │ │ ├── 7.json
│ │ │ │ ├── 7.json.meta
│ │ │ │ ├── 8.json
│ │ │ │ ├── 8.json.meta
│ │ │ │ ├── 9.json
│ │ │ │ └── 9.json.meta
│ │ │ ├── squid_game.meta
│ │ │ ├── sticker.json
│ │ │ ├── sticker.json.meta
│ │ │ ├── taking_the_duggy_out.json
│ │ │ └── taking_the_duggy_out.json.meta
│ │ └── LottieSamples.meta
│ ├── StreamingAssets.meta
│ ├── TextMesh Pro/
│ │ ├── Documentation/
│ │ │ └── TextMesh Pro User Guide 2016.pdf.meta
│ │ ├── Documentation.meta
│ │ ├── Fonts/
│ │ │ ├── LiberationSans - OFL.txt
│ │ │ ├── LiberationSans - OFL.txt.meta
│ │ │ └── LiberationSans.ttf.meta
│ │ ├── Fonts.meta
│ │ ├── Resources/
│ │ │ ├── Fonts & Materials/
│ │ │ │ ├── LiberationSans SDF - Drop Shadow.mat
│ │ │ │ ├── LiberationSans SDF - Drop Shadow.mat.meta
│ │ │ │ ├── LiberationSans SDF - Fallback.asset
│ │ │ │ ├── LiberationSans SDF - Fallback.asset.meta
│ │ │ │ ├── LiberationSans SDF - Outline.mat
│ │ │ │ ├── LiberationSans SDF - Outline.mat.meta
│ │ │ │ ├── LiberationSans SDF.asset
│ │ │ │ └── LiberationSans SDF.asset.meta
│ │ │ ├── Fonts & Materials.meta
│ │ │ ├── LineBreaking Following Characters.txt
│ │ │ ├── LineBreaking Following Characters.txt.meta
│ │ │ ├── LineBreaking Leading Characters.txt
│ │ │ ├── LineBreaking Leading Characters.txt.meta
│ │ │ ├── Sprite Assets/
│ │ │ │ ├── EmojiOne.asset
│ │ │ │ └── EmojiOne.asset.meta
│ │ │ ├── Sprite Assets.meta
│ │ │ ├── Style Sheets/
│ │ │ │ ├── Default Style Sheet.asset
│ │ │ │ └── Default Style Sheet.asset.meta
│ │ │ ├── Style Sheets.meta
│ │ │ ├── TMP Settings.asset
│ │ │ └── TMP Settings.asset.meta
│ │ ├── Resources.meta
│ │ ├── Shaders/
│ │ │ ├── TMP_Bitmap-Custom-Atlas.shader
│ │ │ ├── TMP_Bitmap-Custom-Atlas.shader.meta
│ │ │ ├── TMP_Bitmap-Mobile.shader
│ │ │ ├── TMP_Bitmap-Mobile.shader.meta
│ │ │ ├── TMP_Bitmap.shader
│ │ │ ├── TMP_Bitmap.shader.meta
│ │ │ ├── TMP_SDF Overlay.shader
│ │ │ ├── TMP_SDF Overlay.shader.meta
│ │ │ ├── TMP_SDF SSD.shader
│ │ │ ├── TMP_SDF SSD.shader.meta
│ │ │ ├── TMP_SDF-Mobile Masking.shader
│ │ │ ├── TMP_SDF-Mobile Masking.shader.meta
│ │ │ ├── TMP_SDF-Mobile Overlay.shader
│ │ │ ├── TMP_SDF-Mobile Overlay.shader.meta
│ │ │ ├── TMP_SDF-Mobile SSD.shader
│ │ │ ├── TMP_SDF-Mobile SSD.shader.meta
│ │ │ ├── TMP_SDF-Mobile.shader
│ │ │ ├── TMP_SDF-Mobile.shader.meta
│ │ │ ├── TMP_SDF-Surface-Mobile.shader
│ │ │ ├── TMP_SDF-Surface-Mobile.shader.meta
│ │ │ ├── TMP_SDF-Surface.shader
│ │ │ ├── TMP_SDF-Surface.shader.meta
│ │ │ ├── TMP_SDF.shader
│ │ │ ├── TMP_SDF.shader.meta
│ │ │ ├── TMP_Sprite.shader
│ │ │ ├── TMP_Sprite.shader.meta
│ │ │ ├── TMPro.cginc
│ │ │ ├── TMPro.cginc.meta
│ │ │ ├── TMPro_Mobile.cginc
│ │ │ ├── TMPro_Mobile.cginc.meta
│ │ │ ├── TMPro_Properties.cginc
│ │ │ ├── TMPro_Properties.cginc.meta
│ │ │ ├── TMPro_Surface.cginc
│ │ │ └── TMPro_Surface.cginc.meta
│ │ ├── Shaders.meta
│ │ ├── Sprites/
│ │ │ ├── EmojiOne Attribution.txt
│ │ │ ├── EmojiOne Attribution.txt.meta
│ │ │ ├── EmojiOne.json
│ │ │ ├── EmojiOne.json.meta
│ │ │ └── EmojiOne.png.meta
│ │ └── Sprites.meta
│ └── TextMesh Pro.meta
├── Packages/
│ ├── manifest.json
│ └── packages-lock.json
├── ProjectSettings/
│ ├── AudioManager.asset
│ ├── ClusterInputManager.asset
│ ├── DynamicsManager.asset
│ ├── EditorBuildSettings.asset
│ ├── EditorSettings.asset
│ ├── GraphicsSettings.asset
│ ├── InputManager.asset
│ ├── MemorySettings.asset
│ ├── NavMeshAreas.asset
│ ├── PackageManagerSettings.asset
│ ├── Physics2DSettings.asset
│ ├── PresetManager.asset
│ ├── ProjectSettings.asset
│ ├── ProjectVersion.txt
│ ├── QualitySettings.asset
│ ├── TagManager.asset
│ ├── TimeManager.asset
│ ├── UnityConnectSettings.asset
│ ├── VFXManager.asset
│ ├── VersionControlSettings.asset
│ └── XRSettings.asset
└── UserSettings/
├── AndroidLogcatSettings.asset
├── EditorUserSettings.asset
├── Search.index
└── Search.settings
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017
# top-most EditorConfig file
root = true
[*.cs]
indent_style = space
indent_size = 4
charset = utf-8
end_of_line = lf
insert_final_newline = true
# <<< ---------- Naming conventions ---------- >>>
# The following items need pascal case
dotnet_naming_symbols.pascal_case_items.applicable_kinds = namespace,class,struct,interface,enum,property,method,event,delegate,local_function
dotnet_naming_rule.must_be_pascal_case.symbols = pascal_case_items
dotnet_naming_rule.must_be_pascal_case.style = pascal_case_style
dotnet_naming_rule.must_be_pascal_case.severity = warning
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
# Fields use camel case and begin with underscore, but not const and static
dotnet_naming_symbols.all_fields.applicable_kinds = field
dotnet_naming_symbols.all_fields.required_modifiers = *
dotnet_naming_rule.must_be_camel_case_with_underscore.symbols = all_fields
dotnet_naming_rule.must_be_camel_case_with_underscore.style = camel_case_style_with_underscore
dotnet_naming_rule.must_be_camel_case_with_underscore.severity = warning
dotnet_naming_style.camel_case_style_with_underscore.capitalization = camel_case
dotnet_naming_style.camel_case_style_with_underscore.required_prefix = _
# Const fields use upper case and underscore for words separation
dotnet_naming_symbols.all_const_fields.applicable_kinds = field
dotnet_naming_symbols.all_const_fields.required_modifiers = const
dotnet_naming_rule.must_be_upper_case.symbols = all_const_fields
dotnet_naming_rule.must_be_upper_case.style = upper_case_style
dotnet_naming_rule.must_be_upper_case.severity = warning
dotnet_naming_style.upper_case_style.capitalization = all_upper
dotnet_naming_style.upper_case_style.word_separator = _
# Static fields use camel case and 's' at the begin
dotnet_naming_symbols.all_static_fields.applicable_kinds = field
dotnet_naming_symbols.all_static_fields.required_modifiers = static
dotnet_naming_rule.must_be_pascal_case_with_s.symbols = all_static_fields
dotnet_naming_rule.must_be_pascal_case_with_s.style = pascal_case_with_s
dotnet_naming_rule.must_be_pascal_case_with_s.severity = warning
dotnet_naming_style.pascal_case_with_s.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_s.required_prefix = s
# Readonly fields use camel case and 'm' at the begin
dotnet_naming_symbols.all_readonly_fields.applicable_kinds = field
dotnet_naming_symbols.all_readonly_fields.required_modifiers = readonly
dotnet_naming_rule.must_be_pascal_case_with_m.symbols = all_readonly_fields
dotnet_naming_rule.must_be_pascal_case_with_m.style = pascal_case_with_m
dotnet_naming_rule.must_be_pascal_case_with_m.severity = warning
dotnet_naming_style.pascal_case_with_m.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_m.required_prefix = m
# Parameters use camel case
dotnet_naming_symbols.all_parameters.applicable_kinds = parameter
dotnet_naming_rule.parameters_must_be_camel_case.symbols = all_parameters
dotnet_naming_rule.parameters_must_be_camel_case.style = camel_case_style
dotnet_naming_rule.parameters_must_be_camel_case.severity = warning
dotnet_naming_style.camel_case_style.capitalization = camel_case
# Locals use camel case
dotnet_naming_symbols.all_locals.applicable_kinds = local
dotnet_naming_symbols.all_locals.required_modifiers = *
dotnet_naming_rule.locals_must_be_camel_case.symbols = all_locals
dotnet_naming_rule.locals_must_be_camel_case.style = camel_case_style
dotnet_naming_rule.locals_must_be_camel_case.severity = warning
# Const locals use upper case and underscore for words separation
dotnet_naming_symbols.all_const_locals.applicable_kinds = local
dotnet_naming_symbols.all_const_locals.required_modifiers = const
dotnet_naming_rule.const_local_must_be_upper_case.symbols = all_const_locals
dotnet_naming_rule.const_local_must_be_upper_case.style = upper_case_style
dotnet_naming_rule.const_local_must_be_upper_case.severity = warning
# Type parameters begin with T and use pascal case
dotnet_naming_symbols.all_type_parameters.applicable_kinds = type_parameter
dotnet_naming_rule.must_be_pascal_case_with_T.symbols = all_type_parameters
dotnet_naming_rule.must_be_pascal_case_with_T.style = pascal_case_with_T
dotnet_naming_rule.must_be_pascal_case_with_T.severity = warning
dotnet_naming_style.pascal_case_with_T.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_T.required_prefix = T
# >>> ---------- Naming conventions ---------- <<<
# <<< ---------- Formatting conventions ---------- >>>
# Organize usings
dotnet_sort_system_directives_first = true
# Newline options
csharp_new_line_before_open_brace = types,control_blocks,local_functions,methods,accessors,properties
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_between_query_expression_clauses = true
#Indentation options
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
# Spacing options
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
# Wrapping options
csharp_preserve_single_line_statements = false
csharp_preserve_single_line_blocks = true
# >>> ---------- Formatting conventions ---------- <<<
# <<< ---------- C# code style settings ---------- >>>
# Implicit and explicit types
csharp_style_var_for_built_in_types = false:warning
csharp_style_var_when_type_is_apparent = false:suggestion
csharp_style_var_elsewhere = false:suggestion
# Expression-bodied members
csharp_style_expression_bodied_methods = true:suggestion
csharp_style_expression_bodied_constructors = true:suggestion
csharp_style_expression_bodied_operators = true:suggestion
csharp_style_expression_bodied_properties = true:suggestion
csharp_style_expression_bodied_indexers = true:suggestion
csharp_style_expression_bodied_accessors = true:suggestion
# Pattern matching
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
# Inlined variable declarations
csharp_style_inlined_variable_declaration = true:warning
# Expression-level preferences
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_deconstructed_variable_declaration = false:suggestion
csharp_style_pattern_local_over_anonymous_function = true:suggestion
# "Null" checking preferences
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:warning
# Code block preferences
csharp_prefer_braces = true:warning
# >>> ---------- C# code style settings ---------- <<<
# Null-checking preferences
dotnet_style_coalesce_expression = true:warning
dotnet_style_null_propagation = true:warning
# Expression-level preferences
dotnet_style_object_initializer = true:warning
dotnet_style_collection_initializer = true:warning
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_auto_properties = true:warning
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:warning
dotnet_style_prefer_conditional_expression_over_return = true:warning
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_other_operators =never_if_unnecessary:none
# Modifier preferences
dotnet_style_require_accessibility_modifiers = always:warning
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:warning
dotnet_style_readonly_field = true:suggestion
# Language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
dotnet_style_predefined_type_for_member_access = true:warning
# "This." and "Me." qualifiers
dotnet_style_qualification_for_field = false:warning
dotnet_style_qualification_for_property = false:warning
dotnet_style_qualification_for_method = false:warning
dotnet_style_qualification_for_event = false:warning
================================================
FILE: .gitattributes
================================================
# Sources
*.c text diff=c
*.cc text diff=cpp
*.cxx text diff=cpp
*.cpp text diff=cpp
*.c++ text diff=cpp
*.hpp text diff=cpp
*.h text diff=c
*.h++ text diff=cpp
*.hh text diff=cpp
# Compiled Object files
*.slo binary
*.lo binary
*.o binary
*.obj binary
# Precompiled Headers
*.gch binary
*.pch binary
# Compiled Dynamic libraries
*.so binary
*.dylib binary
*.dll binary
# Compiled Static libraries
*.lai binary
*.la binary
*.a binary
*.lib binary
# Executables
*.exe binary
*.out binary
*.app binary
================================================
FILE: .github/workflows/activation.yaml
================================================
name: Acquire activation file
on:
workflow_dispatch: {}
jobs:
activation:
name: Request manual activation file 🔑
runs-on: ubuntu-latest
steps:
# Request manual activation file
- name: Request manual activation file
id: getManualLicenseFile
uses: game-ci/unity-request-activation-file@v2
# Upload artifact (Unity_v20XX.X.XXXX.alf)
- name: Expose as artifact
uses: actions/upload-artifact@v4
with:
name: ${{ steps.getManualLicenseFile.outputs.filePath }}
path: ${{ steps.getManualLicenseFile.outputs.filePath }}
================================================
FILE: .github/workflows/build_native_libraries.yaml
================================================
name: Build and Test
on:
push:
branches:
- dev
- codex/remove-texture.apply-and-move-updates-to-native
paths:
- 'dependency/**'
- 'projects/**'
- 'src/**'
pull_request:
branches:
- dev
- codex/remove-texture.apply-and-move-updates-to-native
paths:
- 'dependency/**'
- 'projects/**'
- 'src/**'
jobs:
build_windows:
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Build
run: |
cd projects/CMake
cmake -S . -B ./build_x86 -A Win32 -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON
cmake -S . -B ./build_x86_64 -A x64 -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON
cmake --build ./build_x86 --config Release
cmake --build ./build_x86_64 --config Release
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: LottiePluginWindowsArtifacts
path: |
out/Release/Plugins/Windows/x86/LottiePlugin.dll
out/Release/Plugins/Windows/x86_64/LottiePlugin.dll
build_android:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
- name: Setup CMake
uses: jwlawson/actions-setup-cmake@v1.14
with:
cmake-version: '3.25.2'
- name: Set execution permissions for gradlew
run: chmod +x projects/AndroidStudio/gradlew
- name: Build Gradle project
run: |
echo $ANDROID_NDK_HOME
result=$(find $ANDROID_NDK_HOME -name aarch64-linux-android-strip)
echo $result
cd projects/AndroidStudio
./gradlew -PANDROID_16K_PAGE=ON assembleRelease
tree ../../out
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: LottiePluginAndroidArtifacts
path: |
out/RelWithDebInfo/Plugins/Android/arm64-v8a/libLottiePlugin.so
out/RelWithDebInfo/Plugins/Android/armeabi-v7a/libLottiePlugin.so
out/RelWithDebInfo/Plugins/Android/x86/libLottiePlugin.so
out/RelWithDebInfo/Plugins/Android/x86_64/libLottiePlugin.so
build_macos:
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup CMake
uses: jwlawson/actions-setup-cmake@v1.14
with:
cmake-version: '3.29.6'
- name: Build
shell: bash
run: |
set -euxo pipefail
cd projects/CMake
# 1) Build universal (optional, kept because it’s already there)
cmake -S . -B ./buildOSX -G Xcode -DRLOTTIE_OSX=1 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
cmake --build ./buildOSX --config Release
# 2) Build arm64 only
cmake -S . -B ./buildOSX_arm64 -G Xcode -DRLOTTIE_OSX=1 -DCMAKE_OSX_ARCHITECTURES=arm64
cmake --build ./buildOSX_arm64 --config Release
# 3) Build x86_64 only
cmake -S . -B ./buildOSX_x86_64 -G Xcode -DRLOTTIE_OSX=1 -DCMAKE_OSX_ARCHITECTURES=x86_64
cmake --build ./buildOSX_x86_64 --config Release
# 4) Find actual outputs produced by Xcode/CMake
ARM64_DYLIB="$(find ./buildOSX_arm64 -type f -name libLottiePlugin.dylib | head -n1)"
X64_DYLIB="$(find ./buildOSX_x86_64 -type f -name libLottiePlugin.dylib | head -n1)"
ARM64_RLOTTIE="$(find ./buildOSX_arm64 -type f -name librlottie.a | head -n1)"
X64_RLOTTIE="$(find ./buildOSX_x86_64 -type f -name librlottie.a | head -n1)"
# 5) Prepare the expected out/ layout
mkdir -p ../../out/Release/Plugins/Darwin/arm64
mkdir -p ../../out/Release/Plugins/Darwin/x86_64
# 6) Copy thin libs into arch-specific folders for inspection
cp "$ARM64_DYLIB" ../../out/Release/Plugins/Darwin/arm64/
cp "$X64_DYLIB" ../../out/Release/Plugins/Darwin/x86_64/
cp "$ARM64_RLOTTIE" ../../out/Release/Plugins/Darwin/arm64/ || true
cp "$X64_RLOTTIE" ../../out/Release/Plugins/Darwin/x86_64/ || true
# 7) Create universal binaries into Darwin/ (no arch subfolder)
lipo -create "$ARM64_DYLIB" "$X64_DYLIB" -output ../../out/Release/Plugins/Darwin/libLottiePlugin.dylib
# librlottie is a static lib — lipo can merge it too if both variants exist
if [[ -f "$ARM64_RLOTTIE" && -f "$X64_RLOTTIE" ]]; then
lipo -create "$ARM64_RLOTTIE" "$X64_RLOTTIE" -output ../../out/Release/Plugins/Darwin/librlottie.a
fi
# 8) (Optional) show tree for debugging
brew install tree
tree ../../out
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: LottiePluginMacOSArtifacts
path: |
out/Release/Plugins/Darwin/arm64/libLottiePlugin.dylib
out/Release/Plugins/Darwin/x86_64/libLottiePlugin.dylib
out/Release/Plugins/Darwin/libLottiePlugin.dylib
out/Release/Plugins/Darwin/librlottie.a
if-no-files-found: error
build_ios:
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup CMake
uses: jwlawson/actions-setup-cmake@v1.14
with:
cmake-version: '3.29.6'
- name: Build
run: |
cd projects/CMake
cmake -S . -B ./buildIOS -G Xcode -DCMAKE_TOOLCHAIN_FILE=../../dependency/cmake-ios-toolchain/ios.toolchain.cmake -DPLATFORM=OS64 -DRLOTTIE_IOS=1
cmake --build ./buildIOS --config Release --target LottiePlugin
brew install tree
tree ../../out
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: LottiePluginIOSArtifacts
path: |
out/Release/Plugins/iOS/aarch64/libLottiePlugin.a
out/Release/Plugins/iOS/aarch64/librlottie.a
build_ios_simulator_x64:
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup CMake
uses: jwlawson/actions-setup-cmake@v1.14
with:
cmake-version: '3.29.6'
- name: Build (iOS Simulator x86_64)
shell: bash
run: |
set -euxo pipefail
cd projects/CMake
# Build iOS SIMULATOR (x86_64) using the ios-cmake toolchain
cmake -S . -B ./buildIOSSim_x64 \
-G Xcode \
-DCMAKE_TOOLCHAIN_FILE=../../dependency/cmake-ios-toolchain/ios.toolchain.cmake \
-DPLATFORM=SIMULATOR64 \
-DARCHS=x86_64 \
-DRLOTTIE_IOS=1
cmake --build ./buildIOSSim_x64 --config Release --target LottiePlugin
brew install tree
tree ../../out || true
- name: Upload artifacts (iOS Simulator x86_64)
uses: actions/upload-artifact@v4
with:
name: LottiePluginIOSSimulatorX64Artifacts
path: |
out/Release/Plugins/iOS/x86_64/libLottiePlugin.a
out/Release/Plugins/iOS/x86_64/librlottie.a
if-no-files-found: error
build_linux:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install CMake
run: sudo apt-get install cmake
- name: Build
run: |
cd projects/CMake
cmake -S . -B ./buildLinux -G "Unix Makefiles" -DRLOTTIE_LINUX=1
cmake --build ./buildLinux --config Release
tree ../../out
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: LottiePluginLinuxArtifacts
path: |
out/Plugins/Linux/x86_64/libLottiePlugin.so
build_webgl:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Disable rlottie examples
run: |
sed -i '/add_subdirectory[[:space:]]*(example)/d' dependency/rlottie/CMakeLists.txt
- name: Install Emscripten 3.1.39
run: |
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install 3.1.39
./emsdk activate 3.1.39
source ./emsdk_env.sh
emcc -v || true
- name: Build WebGL static libs (.a)
run: |
source emsdk/emsdk_env.sh
cd projects/CMake
emcmake cmake -S . -B ./buildWebGL \
-DRLOTTIE_WEB_ASSEMBLY=1 \
-DLOTTIE_MODULE=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTING=OFF
cmake --build ./buildWebGL --config Release
cd ../..
ls -al out/Plugins/WebGL || true
# sanity: list objects inside the archives
emar t out/Plugins/WebGL/libLottiePlugin.a || true
emar t out/Plugins/WebGL/librlottie.a || true
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: LottiePluginWebGLArtifacts
path: |
out/Plugins/WebGL/libLottiePlugin.a
out/Plugins/WebGL/librlottie.a
# run_tests_and_build_unity_ubuntulatest:
# needs: [build_windows, build_android, build_macos, build_ios, build_linux, build_webgl]
# runs-on: ubuntu-latest
# steps:
# - name: Checkout code
# uses: actions/checkout@v4
# with:
# submodules: recursive
# - name: Download artifacts
# uses: actions/download-artifact@v4
# with:
# name: LottiePluginLinuxArtifacts
# path: out/Plugins/Linux
# - name: Force replace the native libraries
# run: |
# tree out
# cp -f out/Plugins/Linux/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux/x86_64/libLottiePlugin.so
# tree unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux
# - name: Run Tests in Unity
# uses: game-ci/unity-test-runner@v3
# env:
# UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
# with:
# projectPath: unity/RLottieUnity
# githubToken: ${{ secrets.GITHUB_TOKEN }}
# customParameters: -logFile -
# run_tests_and_build_unity_windows:
# needs: [build_windows, build_android, build_macos, build_ios, build_linux, build_webgl]
# runs-on: windows-latest
# steps:
# - name: Checkout code
# uses: actions/checkout@v4
# with:
# submodules: recursive
# - name: Download artifacts
# uses: actions/download-artifact@v4
# with:
# name: LottiePluginWindowsArtifacts
# path: out/Plugins/Windows
# - name: Force replace the native libraries
# run: |
# Copy-Item -Force out/Plugins/Windows/x86/LottiePlugin.dll -Destination unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86/LottiePlugin.dll
# Copy-Item -Force out/Plugins/Windows/x86_64/LottiePlugin.dll -Destination unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86_64/LottiePlugin.dll
# - name: Run Tests in Unity
# uses: game-ci/unity-test-runner@v4
# env:
# UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
# with:
# projectPath: unity/RLottieUnity
# githubToken: ${{ secrets.GITHUB_TOKEN }}
# customParameters: -logFile -
commit_and_push_native_libraries:
needs: [build_windows, build_android, build_macos, build_ios, build_linux, build_webgl, build_ios_simulator_x64]
runs-on: ubuntu-latest
if: >
github.event_name == 'push' ||
(github.event_name == 'pull_request' &&
github.event.pull_request.head.repo.full_name == github.repository)
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
repository: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name || github.repository }}
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || github.ref_name }}
submodules: recursive
fetch-depth: 0
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
- name: Download artifacts windows
uses: actions/download-artifact@v4
with:
name: LottiePluginWindowsArtifacts
path: out/Plugins/Windows
- name: Download artifacts android
uses: actions/download-artifact@v4
with:
name: LottiePluginAndroidArtifacts
path: out/Plugins/Android
- name: Download artifacts macos
uses: actions/download-artifact@v4
with:
name: LottiePluginMacOSArtifacts
path: out/Plugins/Darwin
- name: Download artifacts ios
uses: actions/download-artifact@v4
with:
name: LottiePluginIOSArtifacts
path: out/Plugins/iOS/aarch64
- name: Download artifacts ios-simulator-x64
uses: actions/download-artifact@v4
with:
name: LottiePluginIOSSimulatorX64Artifacts
path: out/Plugins/iOS/x86_64
- name: Download artifacts linux
uses: actions/download-artifact@v4
with:
name: LottiePluginLinuxArtifacts
path: out/Plugins/Linux
- name: Download artifacts webgl
uses: actions/download-artifact@v4
with:
name: LottiePluginWebGLArtifacts
path: out/Plugins/WebGL
- name: Commit and push native libraries
env:
MY_SECRET: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
TARGET_BRANCH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || (github.ref_name == 'dev' && 'development' || github.ref_name) }}
TARGET_REPOSITORY: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name || github.repository }}
run: |
cp -f out/Plugins/Windows/x86/LottiePlugin.dll unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86/LottiePlugin.dll
cp -f out/Plugins/Windows/x86_64/LottiePlugin.dll unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86_64/LottiePlugin.dll
cp -f out/Plugins/Android/arm64-v8a/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/arm64-v8a/libLottiePlugin.so
cp -f out/Plugins/Android/armeabi-v7a/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/armeabi-v7a/libLottiePlugin.so
cp -f out/Plugins/Android/x86/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86/libLottiePlugin.so
cp -f out/Plugins/Android/x86_64/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86_64/libLottiePlugin.so
cp -f out/Plugins/Darwin/libLottiePlugin.dylib unity/RLottieUnity/Assets/LottiePlugin/Plugins/OSX/libLottiePlugin.dylib
cp -f out/Plugins/iOS/aarch64/libLottiePlugin.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/libLottiePlugin.a
cp -f out/Plugins/iOS/aarch64/librlottie.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/librlottie.a
# iOS Simulator x86_64
mkdir -p unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64
cp -f out/Plugins/iOS/x86_64/libLottiePlugin.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64/libLottiePlugin.a
cp -f out/Plugins/iOS/x86_64/librlottie.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64/librlottie.a
cp -f out/Plugins/Linux/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux/x86_64/libLottiePlugin.so
mkdir -p unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL
cp -f out/Plugins/WebGL/libLottiePlugin.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/libLottiePlugin.a
cp -f out/Plugins/WebGL/librlottie.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/librlottie.a
git add .
git status
git config --global user.email "konstantin.gindemit@gmail.com"
git config --global user.name "Konstantin Gindemit"
git remote -v
git commit --allow-empty -m "[skip ci] New native libraries version: 0.5.0-dev.${{ github.run_number }}"
git tag -a 0.5.0-dev.${{ github.run_number }} -m "[skip ci] New native libraries version: 0.5.0-dev.${{ github.run_number }}"
git config -l | grep 'http\..*\.extraheader' | cut -d= -f1 | xargs -L1 git config --unset-all
echo "Trying to push..."
git remote set-url origin https://token:$MY_SECRET@github.com/${TARGET_REPOSITORY}.git
echo "Pushing to ${TARGET_REPOSITORY}:${TARGET_BRANCH}"
git push origin HEAD:${TARGET_BRANCH}
git push origin --tags
================================================
FILE: .gitignore
================================================
.vs
.vscode
projects/CMake/build*
out/*
.DS_Store
================================================
FILE: .gitmodules
================================================
[submodule "dependency/rlottie"]
path = dependency/rlottie
url = git@github.com:gindemit/rlottie.git
branch = unity-rlottie-win-fixes
[submodule "dependency/cmake-ios-toolchain"]
path = dependency/cmake-ios-toolchain
url = git@github.com:leetal/ios-cmake.git
================================================
FILE: AGENTS.md
================================================
# Unity RLottie Plugin
This repository hosts a Unity plugin that brings the [rlottie](https://github.com/Samsung/rlottie) animation library to the Unity ecosystem. The project builds native binaries for multiple platforms using CMake and provides C# scripts to integrate Lottie animations inside Unity games or applications.
## Repository layout
```
/ (root)
├── dependency/ # External dependencies as git submodules
│ ├── cmake-ios-toolchain/ # iOS toolchain for CMake (submodule)
│ ├── pixman/ # Assembly files required for rlottie on ARM
│ └── rlottie/ # rlottie library source (submodule)
├── projects/
│ ├── AndroidStudio/ # Android example project
│ └── CMake/ # CMake configuration to build the native plugin
├── src/ # C++ implementation of the plugin interface
├── unity/
│ └── RLottieUnity/ # Unity package with assets, runtime and editor code
├── README.md # Usage instructions
└── LICENSE # MIT license information
```
### Native plugin
- **src/** contains three files that expose rlottie functions to Unity via a C style API.
- **projects/CMake/CMakeLists.txt** builds `LottiePlugin` along with the rlottie dependency for each target platform.
- The CMake script handles architecture specific flags (e.g. NEON assembly on Android) and copies the output into `out/Plugins` for Unity to consume.
### Unity package
- **unity/RLottieUnity/Assets** holds the Unity package contents.
- `Runtime` contains C# wrappers around the native library (`LottieAnimation`, `NativeBridge`, etc.).
- `Editor` includes custom inspector scripts.
- `Samples~` provides sample scenes and prefabs demonstrating how to use the plugin.
- Prebuilt plugin binaries for platforms (Windows, Android, iOS, Linux, macOS, WebGL) reside under `Assets/LottiePlugin/Plugins`.
### Examples & Tools
- The Android Studio project under `projects/AndroidStudio` is a minimal Android application showcasing the plugin.
- Sample scenes in the Unity package (`Samples~/SceneUI`) show how to play Lottie JSON animations as `Texture2D`.
## Building
1. Initialise the git submodules to fetch rlottie and the iOS toolchain:
```bash
git submodule update --init --recursive
```
2. Use CMake from the `projects/CMake` directory to build the native library for your target platform. Generated binaries will appear in `out/Plugins/<Platform>/<arch>`.
## Usage in Unity
Import the Unity package found under `unity/RLottieUnity` into your project or reference it via Git using the path `unity/RLottieUnity/Assets/LottiePlugin`. The runtime scripts expose an `AnimatedImage` component that can play Lottie JSON files on UI `RawImage` elements.
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2023 Gindemit Konstantin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# Unity Lottie Animation Plugin



> 🧪 **EXPERIMENTAL RELEASE AVAILABLE!**
> We need your help testing [v0.5.0-experimental.1](https://github.com/gindemit/unity-rlottie/releases/tag/0.5.0-experimental.1) which introduces native rendering features and WebGL support!
> This release moves texture updates to the native plugin layer for better performance. Please test and report any issues you encounter.
Welcome to the **Unity Lottie Animation** plugin! This Unity library enables you to play Lottie animations as Texture2D in your Unity projects. It's a powerful and easy-to-use solution that leverages Samsung's [rlottie](https://github.com/Samsung/rlottie) library to bring smooth Lottie animations to your games and applications.
Lottie loads and renders animations and vectors exported in the bodymovin JSON format. Bodymovin JSON can be created and exported from After Effects with bodymovin, Sketch with Lottie Sketch Export, and from Haiku.
For the first time, designers can create and ship beautiful animations without an engineer painstakingly recreating it by hand. Since the animation is backed by JSON they are extremely small in size but can be large in complexity!
## Features
* Play Lottie animations as Texture2D in Unity
* Easy integration and usage
* High performance and low memory footprint
* Uses Samsung's rlottie library internally
* Compatible with Unity 2019.4 and later
## Supported Platforms
* Android
* iOS
* Windows
* OSX
* Linux
## Installation
To install the Unity Lottie Animation to Texture2D plugin using the Unity Package Manager, follow these steps:
1. Open your Unity project and navigate to `Window` > `Package Manager`.
2. Click the `+` button in the top-left corner and select `Add package from git URL...`.
3. Enter the following URL and click `Add`:
```
https://github.com/gindemit/unity-rlottie.git?path=/unity/RLottieUnity/Assets/LottiePlugin/#0.4.5
```
## Quick Start
The `LottiePlugin.UI` namespace includes a `AnimatedImage` class which allows you to use Lottie animations as `RawImage` in your Unity game.
Here are the steps to use the `AnimatedImage` class in your Unity project:
1. **Import the Class:** First, make sure the `AnimatedImage` class is included in your Unity project.
2. **Create an RawImage:** In your Unity scene, create a new RawImage UGUI game object and attach the `AnimatedImage` script to it.
3. **Assign Parameters:** In the `AnimatedImage` component, you will see several parameters:
- **Animation Json**: A `TextAsset` representing the JSON data for your Lottie animation. You can drag and drop it from your Assets folder.
- **Texture Width**: Defines the width of the texture for the animation. Increasing this value will improve the quality of the animation by increasing the number of pixels, but it may also impact performance, especially on lower-end hardware.
- **Texture Height**: Defines the height of the texture for the animation. Similar to Texture Width, increasing this value enhances the quality of the animation by adding more pixels, but it could potentially degrade performance on less powerful devices.
- **Animation Speed**: Speed at which animation plays. 1 is normal speed.
- **Play On Awake**: If checked, the animation will start playing as soon as the scene starts.
- **Loop**: If checked, the animation will keep playing in a loop.
Fill these in according to your needs.
4. **Play/Stop the Animation:** You can use the `Play()` and `Stop()` methods to control the animation at runtime. You can call these from any other script.
```csharp
// Get a reference to the AnimatedImage
AnimatedImage animatedImage = gameObject.GetComponent<AnimatedImage>();
// Play the animation
animatedImage.Play();
// Stop the animation
animatedImage.Stop();
```
And that's it! You are now able to use Lottie animations in your Unity projects using the `AnimatedImage` class.
## Example
Here's an example of how to use the `AnimatedImage` class:
```csharp
// Attach this script to a GameObject with AnimatedImage component
using UnityEngine;
using LottiePlugin.UI;
public class AnimationController : MonoBehaviour
{
private AnimatedImage animatedImage;
private void Awake()
{
animatedImage = GetComponent<AnimatedImage>();
}
private void Start()
{
animatedImage.Play(); // Start the animation
}
private void OnDisable()
{
animatedImage.Stop(); // Stop the animation
}
}
```
This script, when attached to the same GameObject as the `AnimatedImage` component, will start the animation when the game starts and stop it when the GameObject is disabled.
## Other Examples
Check out the 'Scene UI' Sample in Unity Package manager.
1. Open your Unity project and navigate to `Window` > `Package Manager`.
2. Select the installed Lottie Animation package on the left
3. Fold out the Samples section
4. Click 'Import' button on the Scene UI sample
5. After importing it will ask you to copy the sample animations to the Assets/StreaminAssets folder
6. Click 'Copy' button in the 'Missing lottie animations' dialog
7. Open the 'SampleScene' from the sample in 'Assets/Samples/Lottie Animation/[version]/Scene UI/Scenes/' folder
8. Hit play in Unity editor
https://github.com/gindemit/unity-rlottie/assets/5675979/3301d00e-fc9e-49c0-bc7f-7408f1f72ce4
## Support
If you encounter any issues or have questions, please [create an issue](https://github.com/gindemit/unity-rlottie/issues/new) on GitHub.
## Credits
This plugin is built on top of Samsung's [rlottie](https://github.com/Samsung/rlottie) library, which is used internally for Lottie animation rendering.
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
================================================
FILE: dependency/pixman/pixman-arm-intrisics.cpp
================================================
#include <arm_neon.h>
extern "C" void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,
uint32_t *dst,
int32_t dst_stride,
uint32_t src)
{
uint8x8_t v_src = vdup_n_u8(src);
for (int32_t y = 0; y < h; y++)
{
for (int32_t x = 0; x < w; x += 8)
{
vst1_u8((uint8_t *)(dst + x), v_src);
}
dst += dst_stride;
}
}
extern "C" void pixman_composite_over_n_8888_asm_neon(int32_t w, int32_t h,
uint32_t *dst,
int32_t dst_stride,
uint32_t src)
{
// Extract the source alpha and replicate it to all 8 lanes of a NEON vector
uint8x8_t v_src_alpha = vdup_n_u8(src >> 24);
// Extract the source color and replicate it to all 8 lanes of a NEON vector
uint8x8_t v_src_color = vdup_n_u8(src);
for (int32_t y = 0; y < h; y++)
{
for (int32_t x = 0; x < w; x += 8)
{
// Load 8 destination pixels
uint8x8_t v_dst_color = vld1_u8((uint8_t *)(dst + x));
// Calculate the result color = source color * source alpha + destination color * (1 - source alpha)
// Note that we need to shift right by 8 because the alpha blending operation can result in values greater than 255
uint8x8_t v_res_color = vshrq_n_u8(vmlaq_u8(vmlsq_u8(v_dst_color, v_dst_color, v_src_alpha), v_src_color, v_src_alpha), 8);
// Store the result to memory
vst1_u8((uint8_t *)(dst + x), v_res_color);
}
dst += dst_stride;
}
}
================================================
FILE: dependency/pixman/pixman-arm-neon-asm.S
================================================
/*
* Copyright © 2009 Nokia Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Author: Siarhei Siamashka (siarhei.siamashka@nokia.com)
*/
/*
* This file contains implementations of NEON optimized pixel processing
* functions. There is no full and detailed tutorial, but some functions
* (those which are exposing some new or interesting features) are
* extensively commented and can be used as examples.
*
* You may want to have a look at the comments for following functions:
* - pixman_composite_over_8888_0565_asm_neon
* - pixman_composite_over_n_8_0565_asm_neon
*/
/* Prevent the stack from becoming executable for no reason... */
#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif
.text
.fpu neon
.arch armv7a
.object_arch armv4
.eabi_attribute 10, 0 /* suppress Tag_FP_arch */
.eabi_attribute 12, 0 /* suppress Tag_Advanced_SIMD_arch */
.arm
.altmacro
.p2align 2
//#include "pixman-arm-asm.h"
/* Supplementary macro for setting function attributes */
.macro pixman_asm_function fname
.func fname
.global fname
#ifdef __ELF__
.hidden fname
.type fname, %function
#endif
fname:
.endm
//#include "pixman-private.h"
/*
* The defines which are shared between C and assembly code
*/
/* bilinear interpolation precision (must be < 8) */
#define BILINEAR_INTERPOLATION_BITS 7
#define BILINEAR_INTERPOLATION_RANGE (1 << BILINEAR_INTERPOLATION_BITS)
#include "pixman-arm-neon-asm.h"
/* Global configuration options and preferences */
/*
* The code can optionally make use of unaligned memory accesses to improve
* performance of handling leading/trailing pixels for each scanline.
* Configuration variable RESPECT_STRICT_ALIGNMENT can be set to 0 for
* example in linux if unaligned memory accesses are not configured to
* generate.exceptions.
*/
.set RESPECT_STRICT_ALIGNMENT, 1
/*
* Set default prefetch type. There is a choice between the following options:
*
* PREFETCH_TYPE_NONE (may be useful for the ARM cores where PLD is set to work
* as NOP to workaround some HW bugs or for whatever other reason)
*
* PREFETCH_TYPE_SIMPLE (may be useful for simple single-issue ARM cores where
* advanced prefetch intruduces heavy overhead)
*
* PREFETCH_TYPE_ADVANCED (useful for superscalar cores such as ARM Cortex-A8
* which can run ARM and NEON instructions simultaneously so that extra ARM
* instructions do not add (many) extra cycles, but improve prefetch efficiency)
*
* Note: some types of function can't support advanced prefetch and fallback
* to simple one (those which handle 24bpp pixels)
*/
.set PREFETCH_TYPE_DEFAULT, PREFETCH_TYPE_ADVANCED
/* Prefetch distance in pixels for simple prefetch */
.set PREFETCH_DISTANCE_SIMPLE, 64
/*
* Implementation of pixman_composite_over_8888_0565_asm_neon
*
* This function takes a8r8g8b8 source buffer, r5g6b5 destination buffer and
* performs OVER compositing operation. Function fast_composite_over_8888_0565
* from pixman-fast-path.c does the same in C and can be used as a reference.
*
* First we need to have some NEON assembly code which can do the actual
* operation on the pixels and provide it to the template macro.
*
* Template macro quite conveniently takes care of emitting all the necessary
* code for memory reading and writing (including quite tricky cases of
* handling unaligned leading/trailing pixels), so we only need to deal with
* the data in NEON registers.
*
* NEON registers allocation in general is recommented to be the following:
* d0, d1, d2, d3 - contain loaded source pixel data
* d4, d5, d6, d7 - contain loaded destination pixels (if they are needed)
* d24, d25, d26, d27 - contain loading mask pixel data (if mask is used)
* d28, d29, d30, d31 - place for storing the result (destination pixels)
*
* As can be seen above, four 64-bit NEON registers are used for keeping
* intermediate pixel data and up to 8 pixels can be processed in one step
* for 32bpp formats (16 pixels for 16bpp, 32 pixels for 8bpp).
*
* This particular function uses the following registers allocation:
* d0, d1, d2, d3 - contain loaded source pixel data
* d4, d5 - contain loaded destination pixels (they are needed)
* d28, d29 - place for storing the result (destination pixels)
*/
/*
* Step one. We need to have some code to do some arithmetics on pixel data.
* This is implemented as a pair of macros: '*_head' and '*_tail'. When used
* back-to-back, they take pixel data from {d0, d1, d2, d3} and {d4, d5},
* perform all the needed calculations and write the result to {d28, d29}.
* The rationale for having two macros and not just one will be explained
* later. In practice, any single monolitic function which does the work can
* be split into two parts in any arbitrary way without affecting correctness.
*
* There is one special trick here too. Common template macro can optionally
* make our life a bit easier by doing R, G, B, A color components
* deinterleaving for 32bpp pixel formats (and this feature is used in
* 'pixman_composite_over_8888_0565_asm_neon' function). So it means that
* instead of having 8 packed pixels in {d0, d1, d2, d3} registers, we
* actually use d0 register for blue channel (a vector of eight 8-bit
* values), d1 register for green, d2 for red and d3 for alpha. This
* simple conversion can be also done with a few NEON instructions:
*
* Packed to planar conversion:
* vuzp.8 d0, d1
* vuzp.8 d2, d3
* vuzp.8 d1, d3
* vuzp.8 d0, d2
*
* Planar to packed conversion:
* vzip.8 d0, d2
* vzip.8 d1, d3
* vzip.8 d2, d3
* vzip.8 d0, d1
*
* But pixel can be loaded directly in planar format using VLD4.8 NEON
* instruction. It is 1 cycle slower than VLD1.32, so this is not always
* desirable, that's why deinterleaving is optional.
*
* But anyway, here is the code:
*/
/*
* OK, now we got almost everything that we need. Using the above two
* macros, the work can be done right. But now we want to optimize
* it a bit. ARM Cortex-A8 is an in-order core, and benefits really
* a lot from good code scheduling and software pipelining.
*
* Let's construct some code, which will run in the core main loop.
* Some pseudo-code of the main loop will look like this:
* head
* while (...) {
* tail
* head
* }
* tail
*
* It may look a bit weird, but this setup allows to hide instruction
* latencies better and also utilize dual-issue capability more
* efficiently (make pairs of load-store and ALU instructions).
*
* So what we need now is a '*_tail_head' macro, which will be used
* in the core main loop. A trivial straightforward implementation
* of this macro would look like this:
*
* pixman_composite_over_8888_0565_process_pixblock_tail
* vst1.16 {d28, d29}, [DST_W, :128]!
* vld1.16 {d4, d5}, [DST_R, :128]!
* vld4.32 {d0, d1, d2, d3}, [SRC]!
* pixman_composite_over_8888_0565_process_pixblock_head
* cache_preload 8, 8
*
* Now it also got some VLD/VST instructions. We simply can't move from
* processing one block of pixels to the other one with just arithmetics.
* The previously processed data needs to be written to memory and new
* data needs to be fetched. Fortunately, this main loop does not deal
* with partial leading/trailing pixels and can load/store a full block
* of pixels in a bulk. Additionally, destination buffer is already
* 16 bytes aligned here (which is good for performance).
*
* New things here are DST_R, DST_W, SRC and MASK identifiers. These
* are the aliases for ARM registers which are used as pointers for
* accessing data. We maintain separate pointers for reading and writing
* destination buffer (DST_R and DST_W).
*
* Another new thing is 'cache_preload' macro. It is used for prefetching
* data into CPU L2 cache and improve performance when dealing with large
* images which are far larger than cache size. It uses one argument
* (actually two, but they need to be the same here) - number of pixels
* in a block. Looking into 'pixman-arm-neon-asm.h' can provide some
* details about this macro. Moreover, if good performance is needed
* the code from this macro needs to be copied into '*_tail_head' macro
* and mixed with the rest of code for optimal instructions scheduling.
* We are actually doing it below.
*
* Now after all the explanations, here is the optimized code.
* Different instruction streams (originaling from '*_head', '*_tail'
* and 'cache_preload' macro) use different indentation levels for
* better readability. Actually taking the code from one of these
* indentation levels and ignoring a few VLD/VST instructions would
* result in exactly the code from '*_head', '*_tail' or 'cache_preload'
* macro!
*/
/*
* And now the final part. We are using 'generate_composite_function' macro
* to put all the stuff together. We are specifying the name of the function
* which we want to get, number of bits per pixel for the source, mask and
* destination (0 if unused, like mask in this case). Next come some bit
* flags:
* FLAG_DST_READWRITE - tells that the destination buffer is both read
* and written, for write-only buffer we would use
* FLAG_DST_WRITEONLY flag instead
* FLAG_DEINTERLEAVE_32BPP - tells that we prefer to work with planar data
* and separate color channels for 32bpp format.
* The next things are:
* - the number of pixels processed per iteration (8 in this case, because
* that's the maximum what can fit into four 64-bit NEON registers).
* - prefetch distance, measured in pixel blocks. In this case it is 5 times
* by 8 pixels. That would be 40 pixels, or up to 160 bytes. Optimal
* prefetch distance can be selected by running some benchmarks.
*
* After that we specify some macros, these are 'default_init',
* 'default_cleanup' here which are empty (but it is possible to have custom
* init/cleanup macros to be able to save/restore some extra NEON registers
* like d8-d15 or do anything else) followed by
* 'pixman_composite_over_8888_0565_process_pixblock_head',
* 'pixman_composite_over_8888_0565_process_pixblock_tail' and
* 'pixman_composite_over_8888_0565_process_pixblock_tail_head'
* which we got implemented above.
*
* The last part is the NEON registers allocation scheme.
*/
/******************************************************************************/
/******************************************************************************/
.macro pixman_composite_out_reverse_8888_8888_process_pixblock_head
vmvn.8 d24, d3 /* get inverted alpha */
/* do alpha blending */
vmull.u8 q8, d24, d4
vmull.u8 q9, d24, d5
vmull.u8 q10, d24, d6
vmull.u8 q11, d24, d7
.endm
.macro pixman_composite_out_reverse_8888_8888_process_pixblock_tail
vrshr.u16 q14, q8, #8
vrshr.u16 q15, q9, #8
vrshr.u16 q12, q10, #8
vrshr.u16 q13, q11, #8
vraddhn.u16 d28, q14, q8
vraddhn.u16 d29, q15, q9
vraddhn.u16 d30, q12, q10
vraddhn.u16 d31, q13, q11
.endm
/******************************************************************************/
.macro pixman_composite_over_8888_8888_process_pixblock_head
pixman_composite_out_reverse_8888_8888_process_pixblock_head
.endm
.macro pixman_composite_over_8888_8888_process_pixblock_tail
pixman_composite_out_reverse_8888_8888_process_pixblock_tail
vqadd.u8 q14, q0, q14
vqadd.u8 q15, q1, q15
.endm
.macro pixman_composite_over_8888_8888_process_pixblock_tail_head
vld4.8 {d4, d5, d6, d7}, [DST_R, :128]!
vrshr.u16 q14, q8, #8
PF add PF_X, PF_X, #8
PF tst PF_CTL, #0xF
vrshr.u16 q15, q9, #8
vrshr.u16 q12, q10, #8
vrshr.u16 q13, q11, #8
PF addne PF_X, PF_X, #8
PF subne PF_CTL, PF_CTL, #1
vraddhn.u16 d28, q14, q8
vraddhn.u16 d29, q15, q9
PF cmp PF_X, ORIG_W
vraddhn.u16 d30, q12, q10
vraddhn.u16 d31, q13, q11
vqadd.u8 q14, q0, q14
vqadd.u8 q15, q1, q15
fetch_src_pixblock
PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift]
vmvn.8 d22, d3
PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift]
vst4.8 {d28, d29, d30, d31}, [DST_W, :128]!
PF subge PF_X, PF_X, ORIG_W
vmull.u8 q8, d22, d4
PF subges PF_CTL, PF_CTL, #0x10
vmull.u8 q9, d22, d5
PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]!
vmull.u8 q10, d22, d6
PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]!
vmull.u8 q11, d22, d7
.endm
generate_composite_function \
pixman_composite_over_8888_8888_asm_neon, 32, 0, 32, \
FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
8, /* number of pixels, processed in a single block */ \
5, /* prefetch distance */ \
default_init, \
default_cleanup, \
pixman_composite_over_8888_8888_process_pixblock_head, \
pixman_composite_over_8888_8888_process_pixblock_tail, \
pixman_composite_over_8888_8888_process_pixblock_tail_head
generate_composite_function_single_scanline \
pixman_composite_scanline_over_asm_neon, 32, 0, 32, \
FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
8, /* number of pixels, processed in a single block */ \
default_init, \
default_cleanup, \
pixman_composite_over_8888_8888_process_pixblock_head, \
pixman_composite_over_8888_8888_process_pixblock_tail, \
pixman_composite_over_8888_8888_process_pixblock_tail_head
/******************************************************************************/
.macro pixman_composite_over_n_8888_process_pixblock_head
/* deinterleaved source pixels in {d0, d1, d2, d3} */
/* inverted alpha in {d24} */
/* destination pixels in {d4, d5, d6, d7} */
vmull.u8 q8, d24, d4
vmull.u8 q9, d24, d5
vmull.u8 q10, d24, d6
vmull.u8 q11, d24, d7
.endm
.macro pixman_composite_over_n_8888_process_pixblock_tail
vrshr.u16 q14, q8, #8
vrshr.u16 q15, q9, #8
vrshr.u16 q2, q10, #8
vrshr.u16 q3, q11, #8
vraddhn.u16 d28, q14, q8
vraddhn.u16 d29, q15, q9
vraddhn.u16 d30, q2, q10
vraddhn.u16 d31, q3, q11
vqadd.u8 q14, q0, q14
vqadd.u8 q15, q1, q15
.endm
.macro pixman_composite_over_n_8888_process_pixblock_tail_head
vrshr.u16 q14, q8, #8
vrshr.u16 q15, q9, #8
vrshr.u16 q2, q10, #8
vrshr.u16 q3, q11, #8
vraddhn.u16 d28, q14, q8
vraddhn.u16 d29, q15, q9
vraddhn.u16 d30, q2, q10
vraddhn.u16 d31, q3, q11
vld4.8 {d4, d5, d6, d7}, [DST_R, :128]!
vqadd.u8 q14, q0, q14
PF add PF_X, PF_X, #8
PF tst PF_CTL, #0x0F
PF addne PF_X, PF_X, #8
PF subne PF_CTL, PF_CTL, #1
vqadd.u8 q15, q1, q15
PF cmp PF_X, ORIG_W
vmull.u8 q8, d24, d4
PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift]
vmull.u8 q9, d24, d5
PF subge PF_X, PF_X, ORIG_W
vmull.u8 q10, d24, d6
PF subges PF_CTL, PF_CTL, #0x10
vmull.u8 q11, d24, d7
PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]!
vst4.8 {d28, d29, d30, d31}, [DST_W, :128]!
.endm
.macro pixman_composite_over_n_8888_init
add DUMMY, sp, #ARGS_STACK_OFFSET
vld1.32 {d3[0]}, [DUMMY]
vdup.8 d0, d3[0]
vdup.8 d1, d3[1]
vdup.8 d2, d3[2]
vdup.8 d3, d3[3]
vmvn.8 d24, d3 /* get inverted alpha */
.endm
generate_composite_function \
pixman_composite_over_n_8888_asm_neon, 0, 0, 32, \
FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
8, /* number of pixels, processed in a single block */ \
5, /* prefetch distance */ \
pixman_composite_over_n_8888_init, \
default_cleanup, \
pixman_composite_over_8888_8888_process_pixblock_head, \
pixman_composite_over_8888_8888_process_pixblock_tail, \
pixman_composite_over_n_8888_process_pixblock_tail_head
/******************************************************************************/
.macro pixman_composite_src_n_8888_process_pixblock_head
.endm
.macro pixman_composite_src_n_8888_process_pixblock_tail
.endm
.macro pixman_composite_src_n_8888_process_pixblock_tail_head
vst1.32 {d0, d1, d2, d3}, [DST_W, :128]!
.endm
.macro pixman_composite_src_n_8888_init
add DUMMY, sp, #ARGS_STACK_OFFSET
vld1.32 {d0[0]}, [DUMMY]
vsli.u64 d0, d0, #32
vorr d1, d0, d0
vorr q1, q0, q0
.endm
.macro pixman_composite_src_n_8888_cleanup
.endm
generate_composite_function \
pixman_composite_src_n_8888_asm_neon, 0, 0, 32, \
FLAG_DST_WRITEONLY, \
8, /* number of pixels, processed in a single block */ \
0, /* prefetch distance */ \
pixman_composite_src_n_8888_init, \
pixman_composite_src_n_8888_cleanup, \
pixman_composite_src_n_8888_process_pixblock_head, \
pixman_composite_src_n_8888_process_pixblock_tail, \
pixman_composite_src_n_8888_process_pixblock_tail_head, \
0, /* dst_w_basereg */ \
0, /* dst_r_basereg */ \
0, /* src_basereg */ \
0 /* mask_basereg */
/******************************************************************************/
.macro pixman_composite_src_8888_8888_process_pixblock_head
.endm
.macro pixman_composite_src_8888_8888_process_pixblock_tail
.endm
.macro pixman_composite_src_8888_8888_process_pixblock_tail_head
vst1.32 {d0, d1, d2, d3}, [DST_W, :128]!
fetch_src_pixblock
cache_preload 8, 8
.endm
generate_composite_function \
pixman_composite_src_8888_8888_asm_neon, 32, 0, 32, \
FLAG_DST_WRITEONLY, \
8, /* number of pixels, processed in a single block */ \
10, /* prefetch distance */ \
default_init, \
default_cleanup, \
pixman_composite_src_8888_8888_process_pixblock_head, \
pixman_composite_src_8888_8888_process_pixblock_tail, \
pixman_composite_src_8888_8888_process_pixblock_tail_head, \
0, /* dst_w_basereg */ \
0, /* dst_r_basereg */ \
0, /* src_basereg */ \
0 /* mask_basereg */
/******************************************************************************/
================================================
FILE: dependency/pixman/pixman-arm-neon-asm.h
================================================
/*
* Copyright © 2009 Nokia Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Author: Siarhei Siamashka (siarhei.siamashka@nokia.com)
*/
/*
* This file contains a macro ('generate_composite_function') which can
* construct 2D image processing functions, based on a common template.
* Any combinations of source, destination and mask images with 8bpp,
* 16bpp, 24bpp, 32bpp color formats are supported.
*
* This macro takes care of:
* - handling of leading and trailing unaligned pixels
* - doing most of the work related to L2 cache preload
* - encourages the use of software pipelining for better instructions
* scheduling
*
* The user of this macro has to provide some configuration parameters
* (bit depths for the images, prefetch distance, etc.) and a set of
* macros, which should implement basic code chunks responsible for
* pixels processing. See 'pixman-arm-neon-asm.S' file for the usage
* examples.
*
* TODO:
* - try overlapped pixel method (from Ian Rickards) when processing
* exactly two blocks of pixels
* - maybe add an option to do reverse scanline processing
*/
/*
* Bit flags for 'generate_composite_function' macro which are used
* to tune generated functions behavior.
*/
.set FLAG_DST_WRITEONLY, 0
.set FLAG_DST_READWRITE, 1
.set FLAG_DEINTERLEAVE_32BPP, 2
/*
* Offset in stack where mask and source pointer/stride can be accessed
* from 'init' macro. This is useful for doing special handling for solid mask.
*/
.set ARGS_STACK_OFFSET, 40
/*
* Constants for selecting preferable prefetch type.
*/
.set PREFETCH_TYPE_NONE, 0 /* No prefetch at all */
.set PREFETCH_TYPE_SIMPLE, 1 /* A simple, fixed-distance-ahead prefetch */
.set PREFETCH_TYPE_ADVANCED, 2 /* Advanced fine-grained prefetch */
/*
* Definitions of supplementary pixld/pixst macros (for partial load/store of
* pixel data).
*/
.macro pixldst1 op, elem_size, reg1, mem_operand, abits
.if abits > 0
op&.&elem_size {d®1}, [&mem_operand&, :&abits&]!
.else
op&.&elem_size {d®1}, [&mem_operand&]!
.endif
.endm
.macro pixldst2 op, elem_size, reg1, reg2, mem_operand, abits
.if abits > 0
op&.&elem_size {d®1, d®2}, [&mem_operand&, :&abits&]!
.else
op&.&elem_size {d®1, d®2}, [&mem_operand&]!
.endif
.endm
.macro pixldst4 op, elem_size, reg1, reg2, reg3, reg4, mem_operand, abits
.if abits > 0
op&.&elem_size {d®1, d®2, d®3, d®4}, [&mem_operand&, :&abits&]!
.else
op&.&elem_size {d®1, d®2, d®3, d®4}, [&mem_operand&]!
.endif
.endm
.macro pixldst0 op, elem_size, reg1, idx, mem_operand, abits
op&.&elem_size {d®1[idx]}, [&mem_operand&]!
.endm
.macro pixldst3 op, elem_size, reg1, reg2, reg3, mem_operand
op&.&elem_size {d®1, d®2, d®3}, [&mem_operand&]!
.endm
.macro pixldst30 op, elem_size, reg1, reg2, reg3, idx, mem_operand
op&.&elem_size {d®1[idx], d®2[idx], d®3[idx]}, [&mem_operand&]!
.endm
.macro pixldst numbytes, op, elem_size, basereg, mem_operand, abits
.if numbytes == 32
pixldst4 op, elem_size, %(basereg+4), %(basereg+5), \
%(basereg+6), %(basereg+7), mem_operand, abits
.elseif numbytes == 16
pixldst2 op, elem_size, %(basereg+2), %(basereg+3), mem_operand, abits
.elseif numbytes == 8
pixldst1 op, elem_size, %(basereg+1), mem_operand, abits
.elseif numbytes == 4
.if !RESPECT_STRICT_ALIGNMENT || (elem_size == 32)
pixldst0 op, 32, %(basereg+0), 1, mem_operand, abits
.elseif elem_size == 16
pixldst0 op, 16, %(basereg+0), 2, mem_operand, abits
pixldst0 op, 16, %(basereg+0), 3, mem_operand, abits
.else
pixldst0 op, 8, %(basereg+0), 4, mem_operand, abits
pixldst0 op, 8, %(basereg+0), 5, mem_operand, abits
pixldst0 op, 8, %(basereg+0), 6, mem_operand, abits
pixldst0 op, 8, %(basereg+0), 7, mem_operand, abits
.endif
.elseif numbytes == 2
.if !RESPECT_STRICT_ALIGNMENT || (elem_size == 16)
pixldst0 op, 16, %(basereg+0), 1, mem_operand, abits
.else
pixldst0 op, 8, %(basereg+0), 2, mem_operand, abits
pixldst0 op, 8, %(basereg+0), 3, mem_operand, abits
.endif
.elseif numbytes == 1
pixldst0 op, 8, %(basereg+0), 1, mem_operand, abits
.else
.error "unsupported size: numbytes"
.endif
.endm
.macro pixld numpix, bpp, basereg, mem_operand, abits=0
.if bpp > 0
.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0)
pixldst4 vld4, 8, %(basereg+4), %(basereg+5), \
%(basereg+6), %(basereg+7), mem_operand, abits
.elseif (bpp == 24) && (numpix == 8)
pixldst3 vld3, 8, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand
.elseif (bpp == 24) && (numpix == 4)
pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand
pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand
pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand
pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand
.elseif (bpp == 24) && (numpix == 2)
pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand
pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand
.elseif (bpp == 24) && (numpix == 1)
pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand
.else
pixldst %(numpix * bpp / 8), vld1, %(bpp), basereg, mem_operand, abits
.endif
.endif
.endm
.macro pixst numpix, bpp, basereg, mem_operand, abits=0
.if bpp > 0
.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0)
pixldst4 vst4, 8, %(basereg+4), %(basereg+5), \
%(basereg+6), %(basereg+7), mem_operand, abits
.elseif (bpp == 24) && (numpix == 8)
pixldst3 vst3, 8, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand
.elseif (bpp == 24) && (numpix == 4)
pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand
pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand
pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand
pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand
.elseif (bpp == 24) && (numpix == 2)
pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand
pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand
.elseif (bpp == 24) && (numpix == 1)
pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand
.else
pixldst %(numpix * bpp / 8), vst1, %(bpp), basereg, mem_operand, abits
.endif
.endif
.endm
.macro pixld_a numpix, bpp, basereg, mem_operand
.if (bpp * numpix) <= 128
pixld numpix, bpp, basereg, mem_operand, %(bpp * numpix)
.else
pixld numpix, bpp, basereg, mem_operand, 128
.endif
.endm
.macro pixst_a numpix, bpp, basereg, mem_operand
.if (bpp * numpix) <= 128
pixst numpix, bpp, basereg, mem_operand, %(bpp * numpix)
.else
pixst numpix, bpp, basereg, mem_operand, 128
.endif
.endm
/*
* Pixel fetcher for nearest scaling (needs TMP1, TMP2, VX, UNIT_X register
* aliases to be defined)
*/
.macro pixld1_s elem_size, reg1, mem_operand
.if elem_size == 16
mov TMP1, VX, asr #16
adds VX, VX, UNIT_X
5: subpls VX, VX, SRC_WIDTH_FIXED
bpl 5b
add TMP1, mem_operand, TMP1, asl #1
mov TMP2, VX, asr #16
adds VX, VX, UNIT_X
5: subpls VX, VX, SRC_WIDTH_FIXED
bpl 5b
add TMP2, mem_operand, TMP2, asl #1
vld1.16 {d®1&[0]}, [TMP1, :16]
mov TMP1, VX, asr #16
adds VX, VX, UNIT_X
5: subpls VX, VX, SRC_WIDTH_FIXED
bpl 5b
add TMP1, mem_operand, TMP1, asl #1
vld1.16 {d®1&[1]}, [TMP2, :16]
mov TMP2, VX, asr #16
adds VX, VX, UNIT_X
5: subpls VX, VX, SRC_WIDTH_FIXED
bpl 5b
add TMP2, mem_operand, TMP2, asl #1
vld1.16 {d®1&[2]}, [TMP1, :16]
vld1.16 {d®1&[3]}, [TMP2, :16]
.elseif elem_size == 32
mov TMP1, VX, asr #16
adds VX, VX, UNIT_X
5: subpls VX, VX, SRC_WIDTH_FIXED
bpl 5b
add TMP1, mem_operand, TMP1, asl #2
mov TMP2, VX, asr #16
adds VX, VX, UNIT_X
5: subpls VX, VX, SRC_WIDTH_FIXED
bpl 5b
add TMP2, mem_operand, TMP2, asl #2
vld1.32 {d®1&[0]}, [TMP1, :32]
vld1.32 {d®1&[1]}, [TMP2, :32]
.else
.error "unsupported"
.endif
.endm
.macro pixld2_s elem_size, reg1, reg2, mem_operand
.if 0 /* elem_size == 32 */
mov TMP1, VX, asr #16
add VX, VX, UNIT_X, asl #1
add TMP1, mem_operand, TMP1, asl #2
mov TMP2, VX, asr #16
sub VX, VX, UNIT_X
add TMP2, mem_operand, TMP2, asl #2
vld1.32 {d®1&[0]}, [TMP1, :32]
mov TMP1, VX, asr #16
add VX, VX, UNIT_X, asl #1
add TMP1, mem_operand, TMP1, asl #2
vld1.32 {d®2&[0]}, [TMP2, :32]
mov TMP2, VX, asr #16
add VX, VX, UNIT_X
add TMP2, mem_operand, TMP2, asl #2
vld1.32 {d®1&[1]}, [TMP1, :32]
vld1.32 {d®2&[1]}, [TMP2, :32]
.else
pixld1_s elem_size, reg1, mem_operand
pixld1_s elem_size, reg2, mem_operand
.endif
.endm
.macro pixld0_s elem_size, reg1, idx, mem_operand
.if elem_size == 16
mov TMP1, VX, asr #16
adds VX, VX, UNIT_X
5: subpls VX, VX, SRC_WIDTH_FIXED
bpl 5b
add TMP1, mem_operand, TMP1, asl #1
vld1.16 {d®1&[idx]}, [TMP1, :16]
.elseif elem_size == 32
mov TMP1, VX, asr #16
adds VX, VX, UNIT_X
5: subpls VX, VX, SRC_WIDTH_FIXED
bpl 5b
add TMP1, mem_operand, TMP1, asl #2
vld1.32 {d®1&[idx]}, [TMP1, :32]
.endif
.endm
.macro pixld_s_internal numbytes, elem_size, basereg, mem_operand
.if numbytes == 32
pixld2_s elem_size, %(basereg+4), %(basereg+5), mem_operand
pixld2_s elem_size, %(basereg+6), %(basereg+7), mem_operand
pixdeinterleave elem_size, %(basereg+4)
.elseif numbytes == 16
pixld2_s elem_size, %(basereg+2), %(basereg+3), mem_operand
.elseif numbytes == 8
pixld1_s elem_size, %(basereg+1), mem_operand
.elseif numbytes == 4
.if elem_size == 32
pixld0_s elem_size, %(basereg+0), 1, mem_operand
.elseif elem_size == 16
pixld0_s elem_size, %(basereg+0), 2, mem_operand
pixld0_s elem_size, %(basereg+0), 3, mem_operand
.else
pixld0_s elem_size, %(basereg+0), 4, mem_operand
pixld0_s elem_size, %(basereg+0), 5, mem_operand
pixld0_s elem_size, %(basereg+0), 6, mem_operand
pixld0_s elem_size, %(basereg+0), 7, mem_operand
.endif
.elseif numbytes == 2
.if elem_size == 16
pixld0_s elem_size, %(basereg+0), 1, mem_operand
.else
pixld0_s elem_size, %(basereg+0), 2, mem_operand
pixld0_s elem_size, %(basereg+0), 3, mem_operand
.endif
.elseif numbytes == 1
pixld0_s elem_size, %(basereg+0), 1, mem_operand
.else
.error "unsupported size: numbytes"
.endif
.endm
.macro pixld_s numpix, bpp, basereg, mem_operand
.if bpp > 0
pixld_s_internal %(numpix * bpp / 8), %(bpp), basereg, mem_operand
.endif
.endm
.macro vuzp8 reg1, reg2
vuzp.8 d®1, d®2
.endm
.macro vzip8 reg1, reg2
vzip.8 d®1, d®2
.endm
/* deinterleave B, G, R, A channels for eight 32bpp pixels in 4 registers */
.macro pixdeinterleave bpp, basereg
.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0)
vuzp8 %(basereg+0), %(basereg+1)
vuzp8 %(basereg+2), %(basereg+3)
vuzp8 %(basereg+1), %(basereg+3)
vuzp8 %(basereg+0), %(basereg+2)
.endif
.endm
/* interleave B, G, R, A channels for eight 32bpp pixels in 4 registers */
.macro pixinterleave bpp, basereg
.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0)
vzip8 %(basereg+0), %(basereg+2)
vzip8 %(basereg+1), %(basereg+3)
vzip8 %(basereg+2), %(basereg+3)
vzip8 %(basereg+0), %(basereg+1)
.endif
.endm
/*
* This is a macro for implementing cache preload. The main idea is that
* cache preload logic is mostly independent from the rest of pixels
* processing code. It starts at the top left pixel and moves forward
* across pixels and can jump across scanlines. Prefetch distance is
* handled in an 'incremental' way: it starts from 0 and advances to the
* optimal distance over time. After reaching optimal prefetch distance,
* it is kept constant. There are some checks which prevent prefetching
* unneeded pixel lines below the image (but it still can prefetch a bit
* more data on the right side of the image - not a big issue and may
* be actually helpful when rendering text glyphs). Additional trick is
* the use of LDR instruction for prefetch instead of PLD when moving to
* the next line, the point is that we have a high chance of getting TLB
* miss in this case, and PLD would be useless.
*
* This sounds like it may introduce a noticeable overhead (when working with
* fully cached data). But in reality, due to having a separate pipeline and
* instruction queue for NEON unit in ARM Cortex-A8, normal ARM code can
* execute simultaneously with NEON and be completely shadowed by it. Thus
* we get no performance overhead at all (*). This looks like a very nice
* feature of Cortex-A8, if used wisely. We don't have a hardware prefetcher,
* but still can implement some rather advanced prefetch logic in software
* for almost zero cost!
*
* (*) The overhead of the prefetcher is visible when running some trivial
* pixels processing like simple copy. Anyway, having prefetch is a must
* when working with the graphics data.
*/
.macro PF a, x:vararg
.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_ADVANCED)
a x
.endif
.endm
.macro cache_preload std_increment, boost_increment
.if (src_bpp_shift >= 0) || (dst_r_bpp != 0) || (mask_bpp_shift >= 0)
.if regs_shortage
PF ldr ORIG_W, [sp] /* If we are short on regs, ORIG_W is kept on stack */
.endif
.if std_increment != 0
PF add PF_X, PF_X, #std_increment
.endif
PF tst PF_CTL, #0xF
PF addne PF_X, PF_X, #boost_increment
PF subne PF_CTL, PF_CTL, #1
PF cmp PF_X, ORIG_W
.if src_bpp_shift >= 0
PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift]
.endif
.if dst_r_bpp != 0
PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift]
.endif
.if mask_bpp_shift >= 0
PF pld, [PF_MASK, PF_X, lsl #mask_bpp_shift]
.endif
PF subge PF_X, PF_X, ORIG_W
PF subges PF_CTL, PF_CTL, #0x10
.if src_bpp_shift >= 0
PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]!
.endif
.if dst_r_bpp != 0
PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]!
.endif
.if mask_bpp_shift >= 0
PF ldrgeb DUMMY, [PF_MASK, MASK_STRIDE, lsl #mask_bpp_shift]!
.endif
.endif
.endm
.macro cache_preload_simple
.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_SIMPLE)
.if src_bpp > 0
pld [SRC, #(PREFETCH_DISTANCE_SIMPLE * src_bpp / 8)]
.endif
.if dst_r_bpp > 0
pld [DST_R, #(PREFETCH_DISTANCE_SIMPLE * dst_r_bpp / 8)]
.endif
.if mask_bpp > 0
pld [MASK, #(PREFETCH_DISTANCE_SIMPLE * mask_bpp / 8)]
.endif
.endif
.endm
.macro fetch_mask_pixblock
pixld pixblock_size, mask_bpp, \
(mask_basereg - pixblock_size * mask_bpp / 64), MASK
.endm
/*
* Macro which is used to process leading pixels until destination
* pointer is properly aligned (at 16 bytes boundary). When destination
* buffer uses 16bpp format, this is unnecessary, or even pointless.
*/
.macro ensure_destination_ptr_alignment process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
.if dst_w_bpp != 24
tst DST_R, #0xF
beq 2f
.irp lowbit, 1, 2, 4, 8, 16
local skip1
.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp))
.if lowbit < 16 /* we don't need more than 16-byte alignment */
tst DST_R, #lowbit
beq 1f
.endif
pixld_src (lowbit * 8 / dst_w_bpp), src_bpp, src_basereg, SRC
pixld (lowbit * 8 / dst_w_bpp), mask_bpp, mask_basereg, MASK
.if dst_r_bpp > 0
pixld_a (lowbit * 8 / dst_r_bpp), dst_r_bpp, dst_r_basereg, DST_R
.else
add DST_R, DST_R, #lowbit
.endif
PF add PF_X, PF_X, #(lowbit * 8 / dst_w_bpp)
sub W, W, #(lowbit * 8 / dst_w_bpp)
1:
.endif
.endr
pixdeinterleave src_bpp, src_basereg
pixdeinterleave mask_bpp, mask_basereg
pixdeinterleave dst_r_bpp, dst_r_basereg
process_pixblock_head
cache_preload 0, pixblock_size
cache_preload_simple
process_pixblock_tail
pixinterleave dst_w_bpp, dst_w_basereg
.irp lowbit, 1, 2, 4, 8, 16
.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp))
.if lowbit < 16 /* we don't need more than 16-byte alignment */
tst DST_W, #lowbit
beq 1f
.endif
pixst_a (lowbit * 8 / dst_w_bpp), dst_w_bpp, dst_w_basereg, DST_W
1:
.endif
.endr
.endif
2:
.endm
/*
* Special code for processing up to (pixblock_size - 1) remaining
* trailing pixels. As SIMD processing performs operation on
* pixblock_size pixels, anything smaller than this has to be loaded
* and stored in a special way. Loading and storing of pixel data is
* performed in such a way that we fill some 'slots' in the NEON
* registers (some slots naturally are unused), then perform compositing
* operation as usual. In the end, the data is taken from these 'slots'
* and saved to memory.
*
* cache_preload_flag - allows to suppress prefetch if
* set to 0
* dst_aligned_flag - selects whether destination buffer
* is aligned
*/
.macro process_trailing_pixels cache_preload_flag, \
dst_aligned_flag, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
tst W, #(pixblock_size - 1)
beq 2f
.irp chunk_size, 16, 8, 4, 2, 1
.if pixblock_size > chunk_size
tst W, #chunk_size
beq 1f
pixld_src chunk_size, src_bpp, src_basereg, SRC
pixld chunk_size, mask_bpp, mask_basereg, MASK
.if dst_aligned_flag != 0
pixld_a chunk_size, dst_r_bpp, dst_r_basereg, DST_R
.else
pixld chunk_size, dst_r_bpp, dst_r_basereg, DST_R
.endif
.if cache_preload_flag != 0
PF add PF_X, PF_X, #chunk_size
.endif
1:
.endif
.endr
pixdeinterleave src_bpp, src_basereg
pixdeinterleave mask_bpp, mask_basereg
pixdeinterleave dst_r_bpp, dst_r_basereg
process_pixblock_head
.if cache_preload_flag != 0
cache_preload 0, pixblock_size
cache_preload_simple
.endif
process_pixblock_tail
pixinterleave dst_w_bpp, dst_w_basereg
.irp chunk_size, 16, 8, 4, 2, 1
.if pixblock_size > chunk_size
tst W, #chunk_size
beq 1f
.if dst_aligned_flag != 0
pixst_a chunk_size, dst_w_bpp, dst_w_basereg, DST_W
.else
pixst chunk_size, dst_w_bpp, dst_w_basereg, DST_W
.endif
1:
.endif
.endr
2:
.endm
/*
* Macro, which performs all the needed operations to switch to the next
* scanline and start the next loop iteration unless all the scanlines
* are already processed.
*/
.macro advance_to_next_scanline start_of_loop_label
.if regs_shortage
ldrd W, [sp] /* load W and H (width and height) from stack */
.else
mov W, ORIG_W
.endif
add DST_W, DST_W, DST_STRIDE, lsl #dst_bpp_shift
.if src_bpp != 0
add SRC, SRC, SRC_STRIDE, lsl #src_bpp_shift
.endif
.if mask_bpp != 0
add MASK, MASK, MASK_STRIDE, lsl #mask_bpp_shift
.endif
.if (dst_w_bpp != 24)
sub DST_W, DST_W, W, lsl #dst_bpp_shift
.endif
.if (src_bpp != 24) && (src_bpp != 0)
sub SRC, SRC, W, lsl #src_bpp_shift
.endif
.if (mask_bpp != 24) && (mask_bpp != 0)
sub MASK, MASK, W, lsl #mask_bpp_shift
.endif
subs H, H, #1
mov DST_R, DST_W
.if regs_shortage
str H, [sp, #4] /* save updated height to stack */
.endif
bge start_of_loop_label
.endm
/*
* Registers are allocated in the following way by default:
* d0, d1, d2, d3 - reserved for loading source pixel data
* d4, d5, d6, d7 - reserved for loading destination pixel data
* d24, d25, d26, d27 - reserved for loading mask pixel data
* d28, d29, d30, d31 - final destination pixel data for writeback to memory
*/
.macro generate_composite_function fname, \
src_bpp_, \
mask_bpp_, \
dst_w_bpp_, \
flags, \
pixblock_size_, \
prefetch_distance, \
init, \
cleanup, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head, \
dst_w_basereg_ = 28, \
dst_r_basereg_ = 4, \
src_basereg_ = 0, \
mask_basereg_ = 24
pixman_asm_function fname
push {r4-r12, lr} /* save all registers */
/*
* Select prefetch type for this function. If prefetch distance is
* set to 0 or one of the color formats is 24bpp, SIMPLE prefetch
* has to be used instead of ADVANCED.
*/
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_DEFAULT
.if prefetch_distance == 0
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE
.elseif (PREFETCH_TYPE_CURRENT > PREFETCH_TYPE_SIMPLE) && \
((src_bpp_ == 24) || (mask_bpp_ == 24) || (dst_w_bpp_ == 24))
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_SIMPLE
.endif
/*
* Make some macro arguments globally visible and accessible
* from other macros
*/
.set src_bpp, src_bpp_
.set mask_bpp, mask_bpp_
.set dst_w_bpp, dst_w_bpp_
.set pixblock_size, pixblock_size_
.set dst_w_basereg, dst_w_basereg_
.set dst_r_basereg, dst_r_basereg_
.set src_basereg, src_basereg_
.set mask_basereg, mask_basereg_
.macro pixld_src x:vararg
pixld x
.endm
.macro fetch_src_pixblock
pixld_src pixblock_size, src_bpp, \
(src_basereg - pixblock_size * src_bpp / 64), SRC
.endm
/*
* Assign symbolic names to registers
*/
W .req r0 /* width (is updated during processing) */
H .req r1 /* height (is updated during processing) */
DST_W .req r2 /* destination buffer pointer for writes */
DST_STRIDE .req r3 /* destination image stride */
SRC .req r4 /* source buffer pointer */
SRC_STRIDE .req r5 /* source image stride */
DST_R .req r6 /* destination buffer pointer for reads */
MASK .req r7 /* mask pointer */
MASK_STRIDE .req r8 /* mask stride */
PF_CTL .req r9 /* combined lines counter and prefetch */
/* distance increment counter */
PF_X .req r10 /* pixel index in a scanline for current */
/* pretetch position */
PF_SRC .req r11 /* pointer to source scanline start */
/* for prefetch purposes */
PF_DST .req r12 /* pointer to destination scanline start */
/* for prefetch purposes */
PF_MASK .req r14 /* pointer to mask scanline start */
/* for prefetch purposes */
/*
* Check whether we have enough registers for all the local variables.
* If we don't have enough registers, original width and height are
* kept on top of stack (and 'regs_shortage' variable is set to indicate
* this for the rest of code). Even if there are enough registers, the
* allocation scheme may be a bit different depending on whether source
* or mask is not used.
*/
.if (PREFETCH_TYPE_CURRENT < PREFETCH_TYPE_ADVANCED)
ORIG_W .req r10 /* saved original width */
DUMMY .req r12 /* temporary register */
.set regs_shortage, 0
.elseif mask_bpp == 0
ORIG_W .req r7 /* saved original width */
DUMMY .req r8 /* temporary register */
.set regs_shortage, 0
.elseif src_bpp == 0
ORIG_W .req r4 /* saved original width */
DUMMY .req r5 /* temporary register */
.set regs_shortage, 0
.else
ORIG_W .req r1 /* saved original width */
DUMMY .req r1 /* temporary register */
.set regs_shortage, 1
.endif
.set mask_bpp_shift, -1
.if src_bpp == 32
.set src_bpp_shift, 2
.elseif src_bpp == 24
.set src_bpp_shift, 0
.elseif src_bpp == 16
.set src_bpp_shift, 1
.elseif src_bpp == 8
.set src_bpp_shift, 0
.elseif src_bpp == 0
.set src_bpp_shift, -1
.else
.error "requested src bpp (src_bpp) is not supported"
.endif
.if mask_bpp == 32
.set mask_bpp_shift, 2
.elseif mask_bpp == 24
.set mask_bpp_shift, 0
.elseif mask_bpp == 8
.set mask_bpp_shift, 0
.elseif mask_bpp == 0
.set mask_bpp_shift, -1
.else
.error "requested mask bpp (mask_bpp) is not supported"
.endif
.if dst_w_bpp == 32
.set dst_bpp_shift, 2
.elseif dst_w_bpp == 24
.set dst_bpp_shift, 0
.elseif dst_w_bpp == 16
.set dst_bpp_shift, 1
.elseif dst_w_bpp == 8
.set dst_bpp_shift, 0
.else
.error "requested dst bpp (dst_w_bpp) is not supported"
.endif
.if (((flags) & FLAG_DST_READWRITE) != 0)
.set dst_r_bpp, dst_w_bpp
.else
.set dst_r_bpp, 0
.endif
.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0)
.set DEINTERLEAVE_32BPP_ENABLED, 1
.else
.set DEINTERLEAVE_32BPP_ENABLED, 0
.endif
.if prefetch_distance < 0 || prefetch_distance > 15
.error "invalid prefetch distance (prefetch_distance)"
.endif
.if src_bpp > 0
ldr SRC, [sp, #40]
.endif
.if mask_bpp > 0
ldr MASK, [sp, #48]
.endif
PF mov PF_X, #0
.if src_bpp > 0
ldr SRC_STRIDE, [sp, #44]
.endif
.if mask_bpp > 0
ldr MASK_STRIDE, [sp, #52]
.endif
mov DST_R, DST_W
.if src_bpp == 24
sub SRC_STRIDE, SRC_STRIDE, W
sub SRC_STRIDE, SRC_STRIDE, W, lsl #1
.endif
.if mask_bpp == 24
sub MASK_STRIDE, MASK_STRIDE, W
sub MASK_STRIDE, MASK_STRIDE, W, lsl #1
.endif
.if dst_w_bpp == 24
sub DST_STRIDE, DST_STRIDE, W
sub DST_STRIDE, DST_STRIDE, W, lsl #1
.endif
/*
* Setup advanced prefetcher initial state
*/
PF mov PF_SRC, SRC
PF mov PF_DST, DST_R
PF mov PF_MASK, MASK
/* PF_CTL = prefetch_distance | ((h - 1) << 4) */
PF mov PF_CTL, H, lsl #4
PF add PF_CTL, #(prefetch_distance - 0x10)
init
.if regs_shortage
push {r0, r1}
.endif
subs H, H, #1
.if regs_shortage
str H, [sp, #4] /* save updated height to stack */
.else
mov ORIG_W, W
.endif
blt 9f
cmp W, #(pixblock_size * 2)
blt 8f
/*
* This is the start of the pipelined loop, which if optimized for
* long scanlines
*/
0:
ensure_destination_ptr_alignment process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
/* Implement "head (tail_head) ... (tail_head) tail" loop pattern */
pixld_a pixblock_size, dst_r_bpp, \
(dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
fetch_src_pixblock
pixld pixblock_size, mask_bpp, \
(mask_basereg - pixblock_size * mask_bpp / 64), MASK
PF add PF_X, PF_X, #pixblock_size
process_pixblock_head
cache_preload 0, pixblock_size
cache_preload_simple
subs W, W, #(pixblock_size * 2)
blt 2f
1:
process_pixblock_tail_head
cache_preload_simple
subs W, W, #pixblock_size
bge 1b
2:
process_pixblock_tail
pixst_a pixblock_size, dst_w_bpp, \
(dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
/* Process the remaining trailing pixels in the scanline */
process_trailing_pixels 1, 1, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
advance_to_next_scanline 0b
.if regs_shortage
pop {r0, r1}
.endif
cleanup
pop {r4-r12, pc} /* exit */
/*
* This is the start of the loop, designed to process images with small width
* (less than pixblock_size * 2 pixels). In this case neither pipelining
* nor prefetch are used.
*/
8:
/* Process exactly pixblock_size pixels if needed */
tst W, #pixblock_size
beq 1f
pixld pixblock_size, dst_r_bpp, \
(dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
fetch_src_pixblock
pixld pixblock_size, mask_bpp, \
(mask_basereg - pixblock_size * mask_bpp / 64), MASK
process_pixblock_head
process_pixblock_tail
pixst pixblock_size, dst_w_bpp, \
(dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
1:
/* Process the remaining trailing pixels in the scanline */
process_trailing_pixels 0, 0, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
advance_to_next_scanline 8b
9:
.if regs_shortage
pop {r0, r1}
.endif
cleanup
pop {r4-r12, pc} /* exit */
.purgem fetch_src_pixblock
.purgem pixld_src
.unreq SRC
.unreq MASK
.unreq DST_R
.unreq DST_W
.unreq ORIG_W
.unreq W
.unreq H
.unreq SRC_STRIDE
.unreq DST_STRIDE
.unreq MASK_STRIDE
.unreq PF_CTL
.unreq PF_X
.unreq PF_SRC
.unreq PF_DST
.unreq PF_MASK
.unreq DUMMY
.endfunc
.endm
/*
* A simplified variant of function generation template for a single
* scanline processing (for implementing pixman combine functions)
*/
.macro generate_composite_function_scanline use_nearest_scaling, \
fname, \
src_bpp_, \
mask_bpp_, \
dst_w_bpp_, \
flags, \
pixblock_size_, \
init, \
cleanup, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head, \
dst_w_basereg_ = 28, \
dst_r_basereg_ = 4, \
src_basereg_ = 0, \
mask_basereg_ = 24
pixman_asm_function fname
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE
/*
* Make some macro arguments globally visible and accessible
* from other macros
*/
.set src_bpp, src_bpp_
.set mask_bpp, mask_bpp_
.set dst_w_bpp, dst_w_bpp_
.set pixblock_size, pixblock_size_
.set dst_w_basereg, dst_w_basereg_
.set dst_r_basereg, dst_r_basereg_
.set src_basereg, src_basereg_
.set mask_basereg, mask_basereg_
.if use_nearest_scaling != 0
/*
* Assign symbolic names to registers for nearest scaling
*/
W .req r0
DST_W .req r1
SRC .req r2
VX .req r3
UNIT_X .req ip
MASK .req lr
TMP1 .req r4
TMP2 .req r5
DST_R .req r6
SRC_WIDTH_FIXED .req r7
.macro pixld_src x:vararg
pixld_s x
.endm
ldr UNIT_X, [sp]
push {r4-r8, lr}
ldr SRC_WIDTH_FIXED, [sp, #(24 + 4)]
.if mask_bpp != 0
ldr MASK, [sp, #(24 + 8)]
.endif
.else
/*
* Assign symbolic names to registers
*/
W .req r0 /* width (is updated during processing) */
DST_W .req r1 /* destination buffer pointer for writes */
SRC .req r2 /* source buffer pointer */
DST_R .req ip /* destination buffer pointer for reads */
MASK .req r3 /* mask pointer */
.macro pixld_src x:vararg
pixld x
.endm
.endif
.if (((flags) & FLAG_DST_READWRITE) != 0)
.set dst_r_bpp, dst_w_bpp
.else
.set dst_r_bpp, 0
.endif
.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0)
.set DEINTERLEAVE_32BPP_ENABLED, 1
.else
.set DEINTERLEAVE_32BPP_ENABLED, 0
.endif
.macro fetch_src_pixblock
pixld_src pixblock_size, src_bpp, \
(src_basereg - pixblock_size * src_bpp / 64), SRC
.endm
init
mov DST_R, DST_W
cmp W, #pixblock_size
blt 8f
ensure_destination_ptr_alignment process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
subs W, W, #pixblock_size
blt 7f
/* Implement "head (tail_head) ... (tail_head) tail" loop pattern */
pixld_a pixblock_size, dst_r_bpp, \
(dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
fetch_src_pixblock
pixld pixblock_size, mask_bpp, \
(mask_basereg - pixblock_size * mask_bpp / 64), MASK
process_pixblock_head
subs W, W, #pixblock_size
blt 2f
1:
process_pixblock_tail_head
subs W, W, #pixblock_size
bge 1b
2:
process_pixblock_tail
pixst_a pixblock_size, dst_w_bpp, \
(dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
7:
/* Process the remaining trailing pixels in the scanline (dst aligned) */
process_trailing_pixels 0, 1, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
cleanup
.if use_nearest_scaling != 0
pop {r4-r8, pc} /* exit */
.else
bx lr /* exit */
.endif
8:
/* Process the remaining trailing pixels in the scanline (dst unaligned) */
process_trailing_pixels 0, 0, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
cleanup
.if use_nearest_scaling != 0
pop {r4-r8, pc} /* exit */
.unreq DST_R
.unreq SRC
.unreq W
.unreq VX
.unreq UNIT_X
.unreq TMP1
.unreq TMP2
.unreq DST_W
.unreq MASK
.unreq SRC_WIDTH_FIXED
.else
bx lr /* exit */
.unreq SRC
.unreq MASK
.unreq DST_R
.unreq DST_W
.unreq W
.endif
.purgem fetch_src_pixblock
.purgem pixld_src
.endfunc
.endm
.macro generate_composite_function_single_scanline x:vararg
generate_composite_function_scanline 0, x
.endm
.macro generate_composite_function_nearest_scanline x:vararg
generate_composite_function_scanline 1, x
.endm
/* Default prologue/epilogue, nothing special needs to be done */
.macro default_init
.endm
.macro default_cleanup
.endm
/*
* Prologue/epilogue variant which additionally saves/restores d8-d15
* registers (they need to be saved/restored by callee according to ABI).
* This is required if the code needs to use all the NEON registers.
*/
.macro default_init_need_all_regs
vpush {d8-d15}
.endm
.macro default_cleanup_need_all_regs
vpop {d8-d15}
.endm
/******************************************************************************/
================================================
FILE: dependency/pixman/pixman-arma64-neon-asm.S
================================================
/*
* Copyright © 2009 Nokia Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Author: Siarhei Siamashka (siarhei.siamashka@nokia.com)
*/
/*
* This file contains implementations of NEON optimized pixel processing
* functions. There is no full and detailed tutorial, but some functions
* (those which are exposing some new or interesting features) are
* extensively commented and can be used as examples.
*
* You may want to have a look at the comments for following functions:
* - pixman_composite_over_8888_0565_asm_neon
* - pixman_composite_over_n_8_0565_asm_neon
*/
/* Prevent the stack from becoming executable for no reason... */
#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif
.text
.arch armv8-a
.altmacro
.p2align 2
/* Supplementary macro for setting function attributes */
.macro pixman_asm_function fname
.func fname
.global fname
#ifdef __ELF__
.hidden fname
.type fname, %function
#endif
fname:
.endm
#include "pixman-arma64-neon-asm.h"
/* Global configuration options and preferences */
/*
* The code can optionally make use of unaligned memory accesses to improve
* performance of handling leading/trailing pixels for each scanline.
* Configuration variable RESPECT_STRICT_ALIGNMENT can be set to 0 for
* example in linux if unaligned memory accesses are not configured to
* generate.exceptions.
*/
.set RESPECT_STRICT_ALIGNMENT, 1
/*
* Set default prefetch type. There is a choice between the following options:
*
* PREFETCH_TYPE_NONE (may be useful for the ARM cores where PLD is set to work
* as NOP to workaround some HW bugs or for whatever other reason)
*
* PREFETCH_TYPE_SIMPLE (may be useful for simple single-issue ARM cores where
* advanced prefetch intruduces heavy overhead)
*
* PREFETCH_TYPE_ADVANCED (useful for superscalar cores such as ARM Cortex-A8
* which can run ARM and NEON instructions simultaneously so that extra ARM
* instructions do not add (many) extra cycles, but improve prefetch efficiency)
*
* Note: some types of function can't support advanced prefetch and fallback
* to simple one (those which handle 24bpp pixels)
*/
.set PREFETCH_TYPE_DEFAULT, PREFETCH_TYPE_ADVANCED
/* Prefetch distance in pixels for simple prefetch */
.set PREFETCH_DISTANCE_SIMPLE, 64
/*
* Implementation of pixman_composite_over_8888_0565_asm_neon
*
* This function takes a8r8g8b8 source buffer, r5g6b5 destination buffer and
* performs OVER compositing operation. Function fast_composite_over_8888_0565
* from pixman-fast-path.c does the same in C and can be used as a reference.
*
* First we need to have some NEON assembly code which can do the actual
* operation on the pixels and provide it to the template macro.
*
* Template macro quite conveniently takes care of emitting all the necessary
* code for memory reading and writing (including quite tricky cases of
* handling unaligned leading/trailing pixels), so we only need to deal with
* the data in NEON registers.
*
* NEON registers allocation in general is recommented to be the following:
* v0, v1, v2, v3 - contain loaded source pixel data
* v4, v5, v6, v7 - contain loaded destination pixels (if they are needed)
* v24, v25, v26, v27 - contain loading mask pixel data (if mask is used)
* v28, v29, v30, v31 - place for storing the result (destination pixels)
*
* As can be seen above, four 64-bit NEON registers are used for keeping
* intermediate pixel data and up to 8 pixels can be processed in one step
* for 32bpp formats (16 pixels for 16bpp, 32 pixels for 8bpp).
*
* This particular function uses the following registers allocation:
* v0, v1, v2, v3 - contain loaded source pixel data
* v4, v5 - contain loaded destination pixels (they are needed)
* v28, v29 - place for storing the result (destination pixels)
*/
/*
* Step one. We need to have some code to do some arithmetics on pixel data.
* This is implemented as a pair of macros: '*_head' and '*_tail'. When used
* back-to-back, they take pixel data from {v0, v1, v2, v3} and {v4, v5},
* perform all the needed calculations and write the result to {v28, v29}.
* The rationale for having two macros and not just one will be explained
* later. In practice, any single monolitic function which does the work can
* be split into two parts in any arbitrary way without affecting correctness.
*
* There is one special trick here too. Common template macro can optionally
* make our life a bit easier by doing R, G, B, A color components
* deinterleaving for 32bpp pixel formats (and this feature is used in
* 'pixman_composite_over_8888_0565_asm_neon' function). So it means that
* instead of having 8 packed pixels in {v0, v1, v2, v3} registers, we
* actually use v0 register for blue channel (a vector of eight 8-bit
* values), v1 register for green, v2 for red and v3 for alpha. This
* simple conversion can be also done with a few NEON instructions:
*
* Packed to planar conversion: // vuzp8 is a wrapper macro
* vuzp8 v0, v1
* vuzp8 v2, v3
* vuzp8 v1, v3
* vuzp8 v0, v2
*
* Planar to packed conversion: // vzip8 is a wrapper macro
* vzip8 v0, v2
* vzip8 v1, v3
* vzip8 v2, v3
* vzip8 v0, v1
*
* But pixel can be loaded directly in planar format using LD4 / b NEON
* instruction. It is 1 cycle slower than LD1 / s, so this is not always
* desirable, that's why deinterleaving is optional.
*
* But anyway, here is the code:
*/
.macro pixman_composite_out_reverse_8888_8888_process_pixblock_head
mvn v24.8b, v3.8b /* get inverted alpha */
/* do alpha blending */
umull v8.8h, v24.8b, v4.8b
umull v9.8h, v24.8b, v5.8b
umull v10.8h, v24.8b, v6.8b
umull v11.8h, v24.8b, v7.8b
.endm
.macro pixman_composite_out_reverse_8888_8888_process_pixblock_tail
urshr v14.8h, v8.8h, #8
urshr v15.8h, v9.8h, #8
urshr v16.8h, v10.8h, #8
urshr v17.8h, v11.8h, #8
raddhn v28.8b, v14.8h, v8.8h
raddhn v29.8b, v15.8h, v9.8h
raddhn v30.8b, v16.8h, v10.8h
raddhn v31.8b, v17.8h, v11.8h
.endm
/******************************************************************************/
.macro pixman_composite_over_8888_8888_process_pixblock_head
pixman_composite_out_reverse_8888_8888_process_pixblock_head
.endm
.macro pixman_composite_over_8888_8888_process_pixblock_tail
pixman_composite_out_reverse_8888_8888_process_pixblock_tail
uqadd v28.8b, v0.8b, v28.8b
uqadd v29.8b, v1.8b, v29.8b
uqadd v30.8b, v2.8b, v30.8b
uqadd v31.8b, v3.8b, v31.8b
.endm
.macro pixman_composite_over_8888_8888_process_pixblock_tail_head
ld4 {v4.8b, v5.8b, v6.8b, v7.8b}, [DST_R], #32
urshr v14.8h, v8.8h, #8
PF add PF_X, PF_X, #8
PF tst PF_CTL, #0xF
urshr v15.8h, v9.8h, #8
urshr v16.8h, v10.8h, #8
urshr v17.8h, v11.8h, #8
PF beq 10f
PF add PF_X, PF_X, #8
PF sub PF_CTL, PF_CTL, #1
10:
raddhn v28.8b, v14.8h, v8.8h
raddhn v29.8b, v15.8h, v9.8h
PF cmp PF_X, ORIG_W
raddhn v30.8b, v16.8h, v10.8h
raddhn v31.8b, v17.8h, v11.8h
uqadd v28.8b, v0.8b, v28.8b
uqadd v29.8b, v1.8b, v29.8b
uqadd v30.8b, v2.8b, v30.8b
uqadd v31.8b, v3.8b, v31.8b
fetch_src_pixblock
PF lsl DUMMY, PF_X, #src_bpp_shift
PF prfm PREFETCH_MODE, [PF_SRC, DUMMY]
mvn v22.8b, v3.8b
PF lsl DUMMY, PF_X, #dst_bpp_shift
PF prfm PREFETCH_MODE, [PF_DST, DUMMY]
st4 {v28.8b, v29.8b, v30.8b, v31.8b}, [DST_W], #32
PF ble 10f
PF sub PF_X, PF_X, ORIG_W
10:
umull v8.8h, v22.8b, v4.8b
PF ble 10f
PF subs PF_CTL, PF_CTL, #0x10
10:
umull v9.8h, v22.8b, v5.8b
PF ble 10f
PF lsl DUMMY, SRC_STRIDE, #src_bpp_shift
PF ldrsb DUMMY, [PF_SRC, DUMMY]
PF add PF_SRC, PF_SRC, #1
10:
umull v10.8h, v22.8b, v6.8b
PF ble 10f
PF lsl DUMMY, DST_STRIDE, #dst_bpp_shift
PF ldrsb DUMMY, [PF_DST, DUMMY]
PF add PF_DST, PF_DST, #1
10:
umull v11.8h, v22.8b, v7.8b
.endm
generate_composite_function \
pixman_composite_over_8888_8888_asm_neon, 32, 0, 32, \
FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
8, /* number of pixels, processed in a single block */ \
5, /* prefetch distance */ \
default_init, \
default_cleanup, \
pixman_composite_over_8888_8888_process_pixblock_head, \
pixman_composite_over_8888_8888_process_pixblock_tail, \
pixman_composite_over_8888_8888_process_pixblock_tail_head
generate_composite_function_single_scanline \
pixman_composite_scanline_over_asm_neon, 32, 0, 32, \
FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
8, /* number of pixels, processed in a single block */ \
default_init, \
default_cleanup, \
pixman_composite_over_8888_8888_process_pixblock_head, \
pixman_composite_over_8888_8888_process_pixblock_tail, \
pixman_composite_over_8888_8888_process_pixblock_tail_head
/******************************************************************************/
.macro pixman_composite_over_n_8888_process_pixblock_head
/* deinterleaved source pixels in {v0, v1, v2, v3} */
/* inverted alpha in {v24} */
/* destination pixels in {v4, v5, v6, v7} */
umull v8.8h, v24.8b, v4.8b
umull v9.8h, v24.8b, v5.8b
umull v10.8h, v24.8b, v6.8b
umull v11.8h, v24.8b, v7.8b
.endm
.macro pixman_composite_over_n_8888_process_pixblock_tail
urshr v14.8h, v8.8h, #8
urshr v15.8h, v9.8h, #8
urshr v16.8h, v10.8h, #8
urshr v17.8h, v11.8h, #8
raddhn v28.8b, v14.8h, v8.8h
raddhn v29.8b, v15.8h, v9.8h
raddhn v30.8b, v16.8h, v10.8h
raddhn v31.8b, v17.8h, v11.8h
uqadd v28.8b, v0.8b, v28.8b
uqadd v29.8b, v1.8b, v29.8b
uqadd v30.8b, v2.8b, v30.8b
uqadd v31.8b, v3.8b, v31.8b
.endm
.macro pixman_composite_over_n_8888_process_pixblock_tail_head
urshr v14.8h, v8.8h, #8
urshr v15.8h, v9.8h, #8
urshr v16.8h, v10.8h, #8
urshr v17.8h, v11.8h, #8
raddhn v28.8b, v14.8h, v8.8h
raddhn v29.8b, v15.8h, v9.8h
raddhn v30.8b, v16.8h, v10.8h
raddhn v31.8b, v17.8h, v11.8h
ld4 {v4.8b, v5.8b, v6.8b, v7.8b}, [DST_R], #32
uqadd v28.8b, v0.8b, v28.8b
PF add PF_X, PF_X, #8
PF tst PF_CTL, #0x0F
PF beq 10f
PF add PF_X, PF_X, #8
PF sub PF_CTL, PF_CTL, #1
10:
uqadd v29.8b, v1.8b, v29.8b
uqadd v30.8b, v2.8b, v30.8b
uqadd v31.8b, v3.8b, v31.8b
PF cmp PF_X, ORIG_W
umull v8.8h, v24.8b, v4.8b
PF lsl DUMMY, PF_X, #dst_bpp_shift
PF prfm PREFETCH_MODE, [PF_DST, DUMMY]
umull v9.8h, v24.8b, v5.8b
PF ble 10f
PF sub PF_X, PF_X, ORIG_W
10:
umull v10.8h, v24.8b, v6.8b
PF subs PF_CTL, PF_CTL, #0x10
umull v11.8h, v24.8b, v7.8b
PF ble 10f
PF lsl DUMMY, DST_STRIDE, #dst_bpp_shift
PF ldrsb DUMMY, [PF_DST, DUMMY]
PF add PF_DST, PF_DST, #1
10:
st4 {v28.8b, v29.8b, v30.8b, v31.8b}, [DST_W], #32
.endm
.macro pixman_composite_over_n_8888_init
mov v3.s[0], w4
dup v0.8b, v3.b[0]
dup v1.8b, v3.b[1]
dup v2.8b, v3.b[2]
dup v3.8b, v3.b[3]
mvn v24.8b, v3.8b /* get inverted alpha */
.endm
generate_composite_function \
pixman_composite_over_n_8888_asm_neon, 0, 0, 32, \
FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
8, /* number of pixels, processed in a single block */ \
5, /* prefetch distance */ \
pixman_composite_over_n_8888_init, \
default_cleanup, \
pixman_composite_over_8888_8888_process_pixblock_head, \
pixman_composite_over_8888_8888_process_pixblock_tail, \
pixman_composite_over_n_8888_process_pixblock_tail_head
/******************************************************************************/
.macro pixman_composite_src_n_8888_process_pixblock_head
.endm
.macro pixman_composite_src_n_8888_process_pixblock_tail
.endm
.macro pixman_composite_src_n_8888_process_pixblock_tail_head
st1 {v0.2s, v1.2s, v2.2s, v3.2s}, [DST_W], #32
.endm
.macro pixman_composite_src_n_8888_init
mov v0.s[0], w4
dup v3.2s, v0.s[0]
dup v2.2s, v0.s[0]
dup v1.2s, v0.s[0]
dup v0.2s, v0.s[0]
.endm
.macro pixman_composite_src_n_8888_cleanup
.endm
generate_composite_function \
pixman_composite_src_n_8888_asm_neon, 0, 0, 32, \
FLAG_DST_WRITEONLY, \
8, /* number of pixels, processed in a single block */ \
0, /* prefetch distance */ \
pixman_composite_src_n_8888_init, \
pixman_composite_src_n_8888_cleanup, \
pixman_composite_src_n_8888_process_pixblock_head, \
pixman_composite_src_n_8888_process_pixblock_tail, \
pixman_composite_src_n_8888_process_pixblock_tail_head, \
0, /* dst_w_basereg */ \
0, /* dst_r_basereg */ \
0, /* src_basereg */ \
0 /* mask_basereg */
/******************************************************************************/
.macro pixman_composite_src_8888_8888_process_pixblock_head
.endm
.macro pixman_composite_src_8888_8888_process_pixblock_tail
.endm
.macro pixman_composite_src_8888_8888_process_pixblock_tail_head
st1 {v0.2s, v1.2s, v2.2s, v3.2s}, [DST_W], #32
fetch_src_pixblock
cache_preload 8, 8
.endm
generate_composite_function \
pixman_composite_src_8888_8888_asm_neon, 32, 0, 32, \
FLAG_DST_WRITEONLY, \
8, /* number of pixels, processed in a single block */ \
10, /* prefetch distance */ \
default_init, \
default_cleanup, \
pixman_composite_src_8888_8888_process_pixblock_head, \
pixman_composite_src_8888_8888_process_pixblock_tail, \
pixman_composite_src_8888_8888_process_pixblock_tail_head, \
0, /* dst_w_basereg */ \
0, /* dst_r_basereg */ \
0, /* src_basereg */ \
0 /* mask_basereg */
/******************************************************************************/
================================================
FILE: dependency/pixman/pixman-arma64-neon-asm.h
================================================
/*
* Copyright © 2009 Nokia Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Author: Siarhei Siamashka (siarhei.siamashka@nokia.com)
*/
/*
* This file contains a macro ('generate_composite_function') which can
* construct 2D image processing functions, based on a common template.
* Any combinations of source, destination and mask images with 8bpp,
* 16bpp, 24bpp, 32bpp color formats are supported.
*
* This macro takes care of:
* - handling of leading and trailing unaligned pixels
* - doing most of the work related to L2 cache preload
* - encourages the use of software pipelining for better instructions
* scheduling
*
* The user of this macro has to provide some configuration parameters
* (bit depths for the images, prefetch distance, etc.) and a set of
* macros, which should implement basic code chunks responsible for
* pixels processing. See 'pixman-armv8-neon-asm.S' file for the usage
* examples.
*
* TODO:
* - try overlapped pixel method (from Ian Rickards) when processing
* exactly two blocks of pixels
* - maybe add an option to do reverse scanline processing
*/
/*
* Bit flags for 'generate_composite_function' macro which are used
* to tune generated functions behavior.
*/
.set FLAG_DST_WRITEONLY, 0
.set FLAG_DST_READWRITE, 1
.set FLAG_DEINTERLEAVE_32BPP, 2
/*
* Constants for selecting preferable prefetch type.
*/
.set PREFETCH_TYPE_NONE, 0 /* No prefetch at all */
.set PREFETCH_TYPE_SIMPLE, 1 /* A simple, fixed-distance-ahead prefetch */
.set PREFETCH_TYPE_ADVANCED, 2 /* Advanced fine-grained prefetch */
/*
* prefetch mode
* available modes are:
* pldl1keep
* pldl1strm
* pldl2keep
* pldl2strm
* pldl3keep
* pldl3strm
*/
#define PREFETCH_MODE pldl1keep
/*
* Definitions of supplementary pixld/pixst macros (for partial load/store of
* pixel data).
*/
.macro pixldst1 op, elem_size, reg1, mem_operand, abits
op {v®1&.&elem_size}, [&mem_operand&], #8
.endm
.macro pixldst2 op, elem_size, reg1, reg2, mem_operand, abits
op {v®1&.&elem_size, v®2&.&elem_size}, [&mem_operand&], #16
.endm
.macro pixldst4 op, elem_size, reg1, reg2, reg3, reg4, mem_operand, abits
op {v®1&.&elem_size, v®2&.&elem_size, v®3&.&elem_size, v®4&.&elem_size}, [&mem_operand&], #32
.endm
.macro pixldst0 op, elem_size, reg1, idx, mem_operand, abits, bytes
op {v®1&.&elem_size}[idx], [&mem_operand&], #&bytes&
.endm
.macro pixldst3 op, elem_size, reg1, reg2, reg3, mem_operand
op {v®1&.&elem_size, v®2&.&elem_size, v®3&.&elem_size}, [&mem_operand&], #24
.endm
.macro pixldst30 op, elem_size, reg1, reg2, reg3, idx, mem_operand
op {v®1&.&elem_size, v®2&.&elem_size, v®3&.&elem_size}[idx], [&mem_operand&], #3
.endm
.macro pixldst numbytes, op, elem_size, basereg, mem_operand, abits
.if numbytes == 32
.if elem_size==32
pixldst4 op, 2s, %(basereg+4), %(basereg+5), \
%(basereg+6), %(basereg+7), mem_operand, abits
.elseif elem_size==16
pixldst4 op, 4h, %(basereg+4), %(basereg+5), \
%(basereg+6), %(basereg+7), mem_operand, abits
.else
pixldst4 op, 8b, %(basereg+4), %(basereg+5), \
%(basereg+6), %(basereg+7), mem_operand, abits
.endif
.elseif numbytes == 16
.if elem_size==32
pixldst2 op, 2s, %(basereg+2), %(basereg+3), mem_operand, abits
.elseif elem_size==16
pixldst2 op, 4h, %(basereg+2), %(basereg+3), mem_operand, abits
.else
pixldst2 op, 8b, %(basereg+2), %(basereg+3), mem_operand, abits
.endif
.elseif numbytes == 8
.if elem_size==32
pixldst1 op, 2s, %(basereg+1), mem_operand, abits
.elseif elem_size==16
pixldst1 op, 4h, %(basereg+1), mem_operand, abits
.else
pixldst1 op, 8b, %(basereg+1), mem_operand, abits
.endif
.elseif numbytes == 4
.if !RESPECT_STRICT_ALIGNMENT || (elem_size == 32)
pixldst0 op, s, %(basereg+0), 1, mem_operand, abits, 4
.elseif elem_size == 16
pixldst0 op, h, %(basereg+0), 2, mem_operand, abits, 2
pixldst0 op, h, %(basereg+0), 3, mem_operand, abits, 2
.else
pixldst0 op, b, %(basereg+0), 4, mem_operand, abits, 1
pixldst0 op, b, %(basereg+0), 5, mem_operand, abits, 1
pixldst0 op, b, %(basereg+0), 6, mem_operand, abits, 1
pixldst0 op, b, %(basereg+0), 7, mem_operand, abits, 1
.endif
.elseif numbytes == 2
.if !RESPECT_STRICT_ALIGNMENT || (elem_size == 16)
pixldst0 op, h, %(basereg+0), 1, mem_operand, abits, 2
.else
pixldst0 op, b, %(basereg+0), 2, mem_operand, abits, 1
pixldst0 op, b, %(basereg+0), 3, mem_operand, abits, 1
.endif
.elseif numbytes == 1
pixldst0 op, b, %(basereg+0), 1, mem_operand, abits, 1
.else
.error "unsupported size: numbytes"
.endif
.endm
.macro pixld numpix, bpp, basereg, mem_operand, abits=0
.if bpp > 0
.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0)
pixldst4 ld4, 8b, %(basereg+4), %(basereg+5), \
%(basereg+6), %(basereg+7), mem_operand, abits
.elseif (bpp == 24) && (numpix == 8)
pixldst3 ld3, 8b, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand
.elseif (bpp == 24) && (numpix == 4)
pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand
pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand
pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand
pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand
.elseif (bpp == 24) && (numpix == 2)
pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand
pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand
.elseif (bpp == 24) && (numpix == 1)
pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand
.else
pixldst %(numpix * bpp / 8), ld1, %(bpp), basereg, mem_operand, abits
.endif
.endif
.endm
.macro pixst numpix, bpp, basereg, mem_operand, abits=0
.if bpp > 0
.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0)
pixldst4 st4, 8b, %(basereg+4), %(basereg+5), \
%(basereg+6), %(basereg+7), mem_operand, abits
.elseif (bpp == 24) && (numpix == 8)
pixldst3 st3, 8b, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand
.elseif (bpp == 24) && (numpix == 4)
pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand
pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand
pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand
pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand
.elseif (bpp == 24) && (numpix == 2)
pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand
pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand
.elseif (bpp == 24) && (numpix == 1)
pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand
.else
pixldst %(numpix * bpp / 8), st1, %(bpp), basereg, mem_operand, abits
.endif
.endif
.endm
.macro pixld_a numpix, bpp, basereg, mem_operand
.if (bpp * numpix) <= 128
pixld numpix, bpp, basereg, mem_operand, %(bpp * numpix)
.else
pixld numpix, bpp, basereg, mem_operand, 128
.endif
.endm
.macro pixst_a numpix, bpp, basereg, mem_operand
.if (bpp * numpix) <= 128
pixst numpix, bpp, basereg, mem_operand, %(bpp * numpix)
.else
pixst numpix, bpp, basereg, mem_operand, 128
.endif
.endm
/*
* Pixel fetcher for nearest scaling (needs TMP1, TMP2, VX, UNIT_X register
* aliases to be defined)
*/
.macro pixld1_s elem_size, reg1, mem_operand
.if elem_size == 16
asr TMP1, VX, #16
adds VX, VX, UNIT_X
bmi 55f
5: subs VX, VX, SRC_WIDTH_FIXED
bpl 5b
55:
add TMP1, mem_operand, TMP1, lsl #1
asr TMP2, VX, #16
adds VX, VX, UNIT_X
bmi 55f
5: subs VX, VX, SRC_WIDTH_FIXED
bpl 5b
55:
add TMP2, mem_operand, TMP2, lsl #1
ld1 {v®1&.h}[0], [TMP1]
asr TMP1, VX, #16
adds VX, VX, UNIT_X
bmi 55f
5: subs VX, VX, SRC_WIDTH_FIXED
bpl 5b
55:
add TMP1, mem_operand, TMP1, lsl #1
ld1 {v®1&.h}[1], [TMP2]
asr TMP2, VX, #16
adds VX, VX, UNIT_X
bmi 55f
5: subs VX, VX, SRC_WIDTH_FIXED
bpl 5b
55:
add TMP2, mem_operand, TMP2, lsl #1
ld1 {v®1&.h}[2], [TMP1]
ld1 {v®1&.h}[3], [TMP2]
.elseif elem_size == 32
asr TMP1, VX, #16
adds VX, VX, UNIT_X
bmi 55f
5: subs VX, VX, SRC_WIDTH_FIXED
bpl 5b
55:
add TMP1, mem_operand, TMP1, lsl #2
asr TMP2, VX, #16
adds VX, VX, UNIT_X
bmi 55f
5: subs VX, VX, SRC_WIDTH_FIXED
bpl 5b
55:
add TMP2, mem_operand, TMP2, lsl #2
ld1 {v®1&.s}[0], [TMP1]
ld1 {v®1&.s}[1], [TMP2]
.else
.error "unsupported"
.endif
.endm
.macro pixld2_s elem_size, reg1, reg2, mem_operand
.if 0 /* elem_size == 32 */
mov TMP1, VX, asr #16
add VX, VX, UNIT_X, asl #1
add TMP1, mem_operand, TMP1, asl #2
mov TMP2, VX, asr #16
sub VX, VX, UNIT_X
add TMP2, mem_operand, TMP2, asl #2
ld1 {v®1&.s}[0], [TMP1]
mov TMP1, VX, asr #16
add VX, VX, UNIT_X, asl #1
add TMP1, mem_operand, TMP1, asl #2
ld1 {v®2&.s}[0], [TMP2, :32]
mov TMP2, VX, asr #16
add VX, VX, UNIT_X
add TMP2, mem_operand, TMP2, asl #2
ld1 {v®1&.s}[1], [TMP1]
ld1 {v®2&.s}[1], [TMP2]
.else
pixld1_s elem_size, reg1, mem_operand
pixld1_s elem_size, reg2, mem_operand
.endif
.endm
.macro pixld0_s elem_size, reg1, idx, mem_operand
.if elem_size == 16
asr TMP1, VX, #16
adds VX, VX, UNIT_X
bmi 55f
5: subs VX, VX, SRC_WIDTH_FIXED
bpl 5b
55:
add TMP1, mem_operand, TMP1, lsl #1
ld1 {v®1&.h}[idx], [TMP1]
.elseif elem_size == 32
asr DUMMY, VX, #16
mov TMP1, DUMMY
adds VX, VX, UNIT_X
bmi 55f
5: subs VX, VX, SRC_WIDTH_FIXED
bpl 5b
55:
add TMP1, mem_operand, TMP1, lsl #2
ld1 {v®1&.s}[idx], [TMP1]
.endif
.endm
.macro pixld_s_internal numbytes, elem_size, basereg, mem_operand
.if numbytes == 32
pixld2_s elem_size, %(basereg+4), %(basereg+5), mem_operand
pixld2_s elem_size, %(basereg+6), %(basereg+7), mem_operand
pixdeinterleave elem_size, %(basereg+4)
.elseif numbytes == 16
pixld2_s elem_size, %(basereg+2), %(basereg+3), mem_operand
.elseif numbytes == 8
pixld1_s elem_size, %(basereg+1), mem_operand
.elseif numbytes == 4
.if elem_size == 32
pixld0_s elem_size, %(basereg+0), 1, mem_operand
.elseif elem_size == 16
pixld0_s elem_size, %(basereg+0), 2, mem_operand
pixld0_s elem_size, %(basereg+0), 3, mem_operand
.else
pixld0_s elem_size, %(basereg+0), 4, mem_operand
pixld0_s elem_size, %(basereg+0), 5, mem_operand
pixld0_s elem_size, %(basereg+0), 6, mem_operand
pixld0_s elem_size, %(basereg+0), 7, mem_operand
.endif
.elseif numbytes == 2
.if elem_size == 16
pixld0_s elem_size, %(basereg+0), 1, mem_operand
.else
pixld0_s elem_size, %(basereg+0), 2, mem_operand
pixld0_s elem_size, %(basereg+0), 3, mem_operand
.endif
.elseif numbytes == 1
pixld0_s elem_size, %(basereg+0), 1, mem_operand
.else
.error "unsupported size: numbytes"
.endif
.endm
.macro pixld_s numpix, bpp, basereg, mem_operand
.if bpp > 0
pixld_s_internal %(numpix * bpp / 8), %(bpp), basereg, mem_operand
.endif
.endm
.macro vuzp8 reg1, reg2
umov DUMMY, v16.d[0]
uzp1 v16.8b, v®1&.8b, v®2&.8b
uzp2 v®2&.8b, v®1&.8b, v®2&.8b
mov v®1&.8b, v16.8b
mov v16.d[0], DUMMY
.endm
.macro vzip8 reg1, reg2
umov DUMMY, v16.d[0]
zip1 v16.8b, v®1&.8b, v®2&.8b
zip2 v®2&.8b, v®1&.8b, v®2&.8b
mov v®1&.8b, v16.8b
mov v16.d[0], DUMMY
.endm
/* deinterleave B, G, R, A channels for eight 32bpp pixels in 4 registers */
.macro pixdeinterleave bpp, basereg
.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0)
vuzp8 %(basereg+0), %(basereg+1)
vuzp8 %(basereg+2), %(basereg+3)
vuzp8 %(basereg+1), %(basereg+3)
vuzp8 %(basereg+0), %(basereg+2)
.endif
.endm
/* interleave B, G, R, A channels for eight 32bpp pixels in 4 registers */
.macro pixinterleave bpp, basereg
.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0)
vzip8 %(basereg+0), %(basereg+2)
vzip8 %(basereg+1), %(basereg+3)
vzip8 %(basereg+2), %(basereg+3)
vzip8 %(basereg+0), %(basereg+1)
.endif
.endm
/*
* This is a macro for implementing cache preload. The main idea is that
* cache preload logic is mostly independent from the rest of pixels
* processing code. It starts at the top left pixel and moves forward
* across pixels and can jump across scanlines. Prefetch distance is
* handled in an 'incremental' way: it starts from 0 and advances to the
* optimal distance over time. After reaching optimal prefetch distance,
* it is kept constant. There are some checks which prevent prefetching
* unneeded pixel lines below the image (but it still can prefetch a bit
* more data on the right side of the image - not a big issue and may
* be actually helpful when rendering text glyphs). Additional trick is
* the use of LDR instruction for prefetch instead of PLD when moving to
* the next line, the point is that we have a high chance of getting TLB
* miss in this case, and PLD would be useless.
*
* This sounds like it may introduce a noticeable overhead (when working with
* fully cached data). But in reality, due to having a separate pipeline and
* instruction queue for NEON unit in ARM Cortex-A8, normal ARM code can
* execute simultaneously with NEON and be completely shadowed by it. Thus
* we get no performance overhead at all (*). This looks like a very nice
* feature of Cortex-A8, if used wisely. We don't have a hardware prefetcher,
* but still can implement some rather advanced prefetch logic in software
* for almost zero cost!
*
* (*) The overhead of the prefetcher is visible when running some trivial
* pixels processing like simple copy. Anyway, having prefetch is a must
* when working with the graphics data.
*/
.macro PF a, x:vararg
.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_ADVANCED)
a x
.endif
.endm
.macro cache_preload std_increment, boost_increment
.if (src_bpp_shift >= 0) || (dst_r_bpp != 0) || (mask_bpp_shift >= 0)
.if std_increment != 0
PF add PF_X, PF_X, #std_increment
.endif
PF tst PF_CTL, #0xF
PF beq 71f
PF add PF_X, PF_X, #boost_increment
PF sub PF_CTL, PF_CTL, #1
71:
PF cmp PF_X, ORIG_W
.if src_bpp_shift >= 0
PF lsl DUMMY, PF_X, #src_bpp_shift
PF prfm PREFETCH_MODE, [PF_SRC, DUMMY]
.endif
.if dst_r_bpp != 0
PF lsl DUMMY, PF_X, #dst_bpp_shift
PF prfm PREFETCH_MODE, [PF_DST, DUMMY]
.endif
.if mask_bpp_shift >= 0
PF lsl DUMMY, PF_X, #mask_bpp_shift
PF prfm PREFETCH_MODE, [PF_MASK, DUMMY]
.endif
PF ble 71f
PF sub PF_X, PF_X, ORIG_W
PF subs PF_CTL, PF_CTL, #0x10
71:
PF ble 72f
.if src_bpp_shift >= 0
PF lsl DUMMY, SRC_STRIDE, #src_bpp_shift
PF ldrsb DUMMY, [PF_SRC, DUMMY]
PF add PF_SRC, PF_SRC, #1
.endif
.if dst_r_bpp != 0
PF lsl DUMMY, DST_STRIDE, #dst_bpp_shift
PF ldrsb DUMMY, [PF_DST, DUMMY]
PF add PF_DST, PF_DST, #1
.endif
.if mask_bpp_shift >= 0
PF lsl DUMMY, MASK_STRIDE, #mask_bpp_shift
PF ldrsb DUMMY, [PF_MASK, DUMMY]
PF add PF_MASK, PF_MASK, #1
.endif
72:
.endif
.endm
.macro cache_preload_simple
.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_SIMPLE)
.if src_bpp > 0
prfm PREFETCH_MODE, [SRC, #(PREFETCH_DISTANCE_SIMPLE * src_bpp / 8)]
.endif
.if dst_r_bpp > 0
prfm PREFETCH_MODE, [DST_R, #(PREFETCH_DISTANCE_SIMPLE * dst_r_bpp / 8)]
.endif
.if mask_bpp > 0
prfm PREFETCH_MODE, [MASK, #(PREFETCH_DISTANCE_SIMPLE * mask_bpp / 8)]
.endif
.endif
.endm
.macro fetch_mask_pixblock
pixld pixblock_size, mask_bpp, \
(mask_basereg - pixblock_size * mask_bpp / 64), MASK
.endm
/*
* Macro which is used to process leading pixels until destination
* pointer is properly aligned (at 16 bytes boundary). When destination
* buffer uses 16bpp format, this is unnecessary, or even pointless.
*/
.macro ensure_destination_ptr_alignment process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
.if dst_w_bpp != 24
tst DST_R, #0xF
beq 52f
.irp lowbit, 1, 2, 4, 8, 16
local skip1
.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp))
.if lowbit < 16 /* we don't need more than 16-byte alignment */
tst DST_R, #lowbit
beq 51f
.endif
pixld_src (lowbit * 8 / dst_w_bpp), src_bpp, src_basereg, SRC
pixld (lowbit * 8 / dst_w_bpp), mask_bpp, mask_basereg, MASK
.if dst_r_bpp > 0
pixld_a (lowbit * 8 / dst_r_bpp), dst_r_bpp, dst_r_basereg, DST_R
.else
add DST_R, DST_R, #lowbit
.endif
PF add PF_X, PF_X, #(lowbit * 8 / dst_w_bpp)
sub W, W, #(lowbit * 8 / dst_w_bpp)
51:
.endif
.endr
pixdeinterleave src_bpp, src_basereg
pixdeinterleave mask_bpp, mask_basereg
pixdeinterleave dst_r_bpp, dst_r_basereg
process_pixblock_head
cache_preload 0, pixblock_size
cache_preload_simple
process_pixblock_tail
pixinterleave dst_w_bpp, dst_w_basereg
.irp lowbit, 1, 2, 4, 8, 16
.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp))
.if lowbit < 16 /* we don't need more than 16-byte alignment */
tst DST_W, #lowbit
beq 51f
.endif
pixst_a (lowbit * 8 / dst_w_bpp), dst_w_bpp, dst_w_basereg, DST_W
51:
.endif
.endr
.endif
52:
.endm
/*
* Special code for processing up to (pixblock_size - 1) remaining
* trailing pixels. As SIMD processing performs operation on
* pixblock_size pixels, anything smaller than this has to be loaded
* and stored in a special way. Loading and storing of pixel data is
* performed in such a way that we fill some 'slots' in the NEON
* registers (some slots naturally are unused), then perform compositing
* operation as usual. In the end, the data is taken from these 'slots'
* and saved to memory.
*
* cache_preload_flag - allows to suppress prefetch if
* set to 0
* dst_aligned_flag - selects whether destination buffer
* is aligned
*/
.macro process_trailing_pixels cache_preload_flag, \
dst_aligned_flag, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
tst W, #(pixblock_size - 1)
beq 52f
.irp chunk_size, 16, 8, 4, 2, 1
.if pixblock_size > chunk_size
tst W, #chunk_size
beq 51f
pixld_src chunk_size, src_bpp, src_basereg, SRC
pixld chunk_size, mask_bpp, mask_basereg, MASK
.if dst_aligned_flag != 0
pixld_a chunk_size, dst_r_bpp, dst_r_basereg, DST_R
.else
pixld chunk_size, dst_r_bpp, dst_r_basereg, DST_R
.endif
.if cache_preload_flag != 0
PF add PF_X, PF_X, #chunk_size
.endif
51:
.endif
.endr
pixdeinterleave src_bpp, src_basereg
pixdeinterleave mask_bpp, mask_basereg
pixdeinterleave dst_r_bpp, dst_r_basereg
process_pixblock_head
.if cache_preload_flag != 0
cache_preload 0, pixblock_size
cache_preload_simple
.endif
process_pixblock_tail
pixinterleave dst_w_bpp, dst_w_basereg
.irp chunk_size, 16, 8, 4, 2, 1
.if pixblock_size > chunk_size
tst W, #chunk_size
beq 51f
.if dst_aligned_flag != 0
pixst_a chunk_size, dst_w_bpp, dst_w_basereg, DST_W
.else
pixst chunk_size, dst_w_bpp, dst_w_basereg, DST_W
.endif
51:
.endif
.endr
52:
.endm
/*
* Macro, which performs all the needed operations to switch to the next
* scanline and start the next loop iteration unless all the scanlines
* are already processed.
*/
.macro advance_to_next_scanline start_of_loop_label
mov W, ORIG_W
add DST_W, DST_W, DST_STRIDE, lsl #dst_bpp_shift
.if src_bpp != 0
add SRC, SRC, SRC_STRIDE, lsl #src_bpp_shift
.endif
.if mask_bpp != 0
add MASK, MASK, MASK_STRIDE, lsl #mask_bpp_shift
.endif
.if (dst_w_bpp != 24)
sub DST_W, DST_W, W, lsl #dst_bpp_shift
.endif
.if (src_bpp != 24) && (src_bpp != 0)
sub SRC, SRC, W, lsl #src_bpp_shift
.endif
.if (mask_bpp != 24) && (mask_bpp != 0)
sub MASK, MASK, W, lsl #mask_bpp_shift
.endif
subs H, H, #1
mov DST_R, DST_W
bge start_of_loop_label
.endm
/*
* Registers are allocated in the following way by default:
* v0, v1, v2, v3 - reserved for loading source pixel data
* v4, v5, v6, v7 - reserved for loading destination pixel data
* v24, v25, v26, v27 - reserved for loading mask pixel data
* v28, v29, v30, v31 - final destination pixel data for writeback to memory
*/
.macro generate_composite_function fname, \
src_bpp_, \
mask_bpp_, \
dst_w_bpp_, \
flags, \
pixblock_size_, \
prefetch_distance, \
init, \
cleanup, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head, \
dst_w_basereg_ = 28, \
dst_r_basereg_ = 4, \
src_basereg_ = 0, \
mask_basereg_ = 24
pixman_asm_function fname
stp x29, x30, [sp, -16]!
mov x29, sp
sub sp, sp, 232 /* push all registers */
sub x29, x29, 64
st1 {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], #32
st1 {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], #32
stp x8, x9, [x29, -80]
stp x10, x11, [x29, -96]
stp x12, x13, [x29, -112]
stp x14, x15, [x29, -128]
stp x16, x17, [x29, -144]
stp x18, x19, [x29, -160]
stp x20, x21, [x29, -176]
stp x22, x23, [x29, -192]
stp x24, x25, [x29, -208]
stp x26, x27, [x29, -224]
str x28, [x29, -232]
/*
* Select prefetch type for this function. If prefetch distance is
* set to 0 or one of the color formats is 24bpp, SIMPLE prefetch
* has to be used instead of ADVANCED.
*/
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_DEFAULT
.if prefetch_distance == 0
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE
.elseif (PREFETCH_TYPE_CURRENT > PREFETCH_TYPE_SIMPLE) && \
((src_bpp_ == 24) || (mask_bpp_ == 24) || (dst_w_bpp_ == 24))
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_SIMPLE
.endif
/*
* Make some macro arguments globally visible and accessible
* from other macros
*/
.set src_bpp, src_bpp_
.set mask_bpp, mask_bpp_
.set dst_w_bpp, dst_w_bpp_
.set pixblock_size, pixblock_size_
.set dst_w_basereg, dst_w_basereg_
.set dst_r_basereg, dst_r_basereg_
.set src_basereg, src_basereg_
.set mask_basereg, mask_basereg_
.macro pixld_src x:vararg
pixld x
.endm
.macro fetch_src_pixblock
pixld_src pixblock_size, src_bpp, \
(src_basereg - pixblock_size * src_bpp / 64), SRC
.endm
/*
* Assign symbolic names to registers
*/
W .req x0 /* width (is updated during processing) */
H .req x1 /* height (is updated during processing) */
DST_W .req x2 /* destination buffer pointer for writes */
DST_STRIDE .req x3 /* destination image stride */
SRC .req x4 /* source buffer pointer */
SRC_STRIDE .req x5 /* source image stride */
MASK .req x6 /* mask pointer */
MASK_STRIDE .req x7 /* mask stride */
DST_R .req x8 /* destination buffer pointer for reads */
PF_CTL .req x9 /* combined lines counter and prefetch */
/* distance increment counter */
PF_X .req x10 /* pixel index in a scanline for current */
/* pretetch position */
PF_SRC .req x11 /* pointer to source scanline start */
/* for prefetch purposes */
PF_DST .req x12 /* pointer to destination scanline start */
/* for prefetch purposes */
PF_MASK .req x13 /* pointer to mask scanline start */
/* for prefetch purposes */
ORIG_W .req x14 /* saved original width */
DUMMY .req x15 /* temporary register */
sxtw x0, w0
sxtw x1, w1
sxtw x3, w3
sxtw x5, w5
sxtw x7, w7
.set mask_bpp_shift, -1
.if src_bpp == 32
.set src_bpp_shift, 2
.elseif src_bpp == 24
.set src_bpp_shift, 0
.elseif src_bpp == 16
.set src_bpp_shift, 1
.elseif src_bpp == 8
.set src_bpp_shift, 0
.elseif src_bpp == 0
.set src_bpp_shift, -1
.else
.error "requested src bpp (src_bpp) is not supported"
.endif
.if mask_bpp == 32
.set mask_bpp_shift, 2
.elseif mask_bpp == 24
.set mask_bpp_shift, 0
.elseif mask_bpp == 8
.set mask_bpp_shift, 0
.elseif mask_bpp == 0
.set mask_bpp_shift, -1
.else
.error "requested mask bpp (mask_bpp) is not supported"
.endif
.if dst_w_bpp == 32
.set dst_bpp_shift, 2
.elseif dst_w_bpp == 24
.set dst_bpp_shift, 0
.elseif dst_w_bpp == 16
.set dst_bpp_shift, 1
.elseif dst_w_bpp == 8
.set dst_bpp_shift, 0
.else
.error "requested dst bpp (dst_w_bpp) is not supported"
.endif
.if (((flags) & FLAG_DST_READWRITE) != 0)
.set dst_r_bpp, dst_w_bpp
.else
.set dst_r_bpp, 0
.endif
.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0)
.set DEINTERLEAVE_32BPP_ENABLED, 1
.else
.set DEINTERLEAVE_32BPP_ENABLED, 0
.endif
.if prefetch_distance < 0 || prefetch_distance > 15
.error "invalid prefetch distance (prefetch_distance)"
.endif
PF mov PF_X, #0
mov DST_R, DST_W
.if src_bpp == 24
sub SRC_STRIDE, SRC_STRIDE, W
sub SRC_STRIDE, SRC_STRIDE, W, lsl #1
.endif
.if mask_bpp == 24
sub MASK_STRIDE, MASK_STRIDE, W
sub MASK_STRIDE, MASK_STRIDE, W, lsl #1
.endif
.if dst_w_bpp == 24
sub DST_STRIDE, DST_STRIDE, W
sub DST_STRIDE, DST_STRIDE, W, lsl #1
.endif
/*
* Setup advanced prefetcher initial state
*/
PF mov PF_SRC, SRC
PF mov PF_DST, DST_R
PF mov PF_MASK, MASK
/* PF_CTL = prefetch_distance | ((h - 1) << 4) */
PF lsl DUMMY, H, #4
PF mov PF_CTL, DUMMY
PF add PF_CTL, PF_CTL, #(prefetch_distance - 0x10)
init
subs H, H, #1
mov ORIG_W, W
blt 9f
cmp W, #(pixblock_size * 2)
blt 800f
/*
* This is the start of the pipelined loop, which if optimized for
* long scanlines
*/
0:
ensure_destination_ptr_alignment process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
/* Implement "head (tail_head) ... (tail_head) tail" loop pattern */
pixld_a pixblock_size, dst_r_bpp, \
(dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
fetch_src_pixblock
pixld pixblock_size, mask_bpp, \
(mask_basereg - pixblock_size * mask_bpp / 64), MASK
PF add PF_X, PF_X, #pixblock_size
process_pixblock_head
cache_preload 0, pixblock_size
cache_preload_simple
subs W, W, #(pixblock_size * 2)
blt 200f
100:
process_pixblock_tail_head
cache_preload_simple
subs W, W, #pixblock_size
bge 100b
200:
process_pixblock_tail
pixst_a pixblock_size, dst_w_bpp, \
(dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
/* Process the remaining trailing pixels in the scanline */
process_trailing_pixels 1, 1, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
advance_to_next_scanline 0b
cleanup
1000:
/* pop all registers */
sub x29, x29, 64
ld1 {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
ld1 {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
ldp x8, x9, [x29, -80]
ldp x10, x11, [x29, -96]
ldp x12, x13, [x29, -112]
ldp x14, x15, [x29, -128]
ldp x16, x17, [x29, -144]
ldp x18, x19, [x29, -160]
ldp x20, x21, [x29, -176]
ldp x22, x23, [x29, -192]
ldp x24, x25, [x29, -208]
ldp x26, x27, [x29, -224]
ldr x28, [x29, -232]
mov sp, x29
ldp x29, x30, [sp], 16
ret /* exit */
/*
* This is the start of the loop, designed to process images with small width
* (less than pixblock_size * 2 pixels). In this case neither pipelining
* nor prefetch are used.
*/
800:
/* Process exactly pixblock_size pixels if needed */
tst W, #pixblock_size
beq 100f
pixld pixblock_size, dst_r_bpp, \
(dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
fetch_src_pixblock
pixld pixblock_size, mask_bpp, \
(mask_basereg - pixblock_size * mask_bpp / 64), MASK
process_pixblock_head
process_pixblock_tail
pixst pixblock_size, dst_w_bpp, \
(dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
100:
/* Process the remaining trailing pixels in the scanline */
process_trailing_pixels 0, 0, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
advance_to_next_scanline 800b
9:
cleanup
/* pop all registers */
sub x29, x29, 64
ld1 {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
ld1 {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
ldp x8, x9, [x29, -80]
ldp x10, x11, [x29, -96]
ldp x12, x13, [x29, -112]
ldp x14, x15, [x29, -128]
ldp x16, x17, [x29, -144]
ldp x18, x19, [x29, -160]
ldp x20, x21, [x29, -176]
ldp x22, x23, [x29, -192]
ldp x24, x25, [x29, -208]
ldp x26, x27, [x29, -224]
ldr x28, [x29, -232]
mov sp, x29
ldp x29, x30, [sp], 16
ret /* exit */
.purgem fetch_src_pixblock
.purgem pixld_src
.unreq SRC
.unreq MASK
.unreq DST_R
.unreq DST_W
.unreq ORIG_W
.unreq W
.unreq H
.unreq SRC_STRIDE
.unreq DST_STRIDE
.unreq MASK_STRIDE
.unreq PF_CTL
.unreq PF_X
.unreq PF_SRC
.unreq PF_DST
.unreq PF_MASK
.unreq DUMMY
.endfunc
.endm
/*
* A simplified variant of function generation template for a single
* scanline processing (for implementing pixman combine functions)
*/
.macro generate_composite_function_scanline use_nearest_scaling, \
fname, \
src_bpp_, \
mask_bpp_, \
dst_w_bpp_, \
flags, \
pixblock_size_, \
init, \
cleanup, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head, \
dst_w_basereg_ = 28, \
dst_r_basereg_ = 4, \
src_basereg_ = 0, \
mask_basereg_ = 24
pixman_asm_function fname
.set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE
/*
* Make some macro arguments globally visible and accessible
* from other macros
*/
.set src_bpp, src_bpp_
.set mask_bpp, mask_bpp_
.set dst_w_bpp, dst_w_bpp_
.set pixblock_size, pixblock_size_
.set dst_w_basereg, dst_w_basereg_
.set dst_r_basereg, dst_r_basereg_
.set src_basereg, src_basereg_
.set mask_basereg, mask_basereg_
.if use_nearest_scaling != 0
/*
* Assign symbolic names to registers for nearest scaling
*/
W .req x0
DST_W .req x1
SRC .req x2
VX .req x3
UNIT_X .req x4
SRC_WIDTH_FIXED .req x5
MASK .req x6
TMP1 .req x8
TMP2 .req x9
DST_R .req x10
DUMMY .req x30
.macro pixld_src x:vararg
pixld_s x
.endm
sxtw x0, w0
sxtw x3, w3
sxtw x4, w4
sxtw x5, w5
stp x29, x30, [sp, -16]!
mov x29, sp
sub sp, sp, 88
sub x29, x29, 64
st1 {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
st1 {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
stp x8, x9, [x29, -80]
str x10, [x29, -88]
.else
/*
* Assign symbolic names to registers
*/
W .req x0 /* width (is updated during processing) */
DST_W .req x1 /* destination buffer pointer for writes */
SRC .req x2 /* source buffer pointer */
MASK .req x3 /* mask pointer */
DST_R .req x4 /* destination buffer pointer for reads */
DUMMY .req x30
.macro pixld_src x:vararg
pixld x
.endm
sxtw x0, w0
stp x29, x30, [sp, -16]!
mov x29, sp
sub sp, sp, 64
sub x29, x29, 64
st1 {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
st1 {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
.endif
.if (((flags) & FLAG_DST_READWRITE) != 0)
.set dst_r_bpp, dst_w_bpp
.else
.set dst_r_bpp, 0
.endif
.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0)
.set DEINTERLEAVE_32BPP_ENABLED, 1
.else
.set DEINTERLEAVE_32BPP_ENABLED, 0
.endif
.macro fetch_src_pixblock
pixld_src pixblock_size, src_bpp, \
(src_basereg - pixblock_size * src_bpp / 64), SRC
.endm
init
mov DST_R, DST_W
cmp W, #pixblock_size
blt 800f
ensure_destination_ptr_alignment process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
subs W, W, #pixblock_size
blt 700f
/* Implement "head (tail_head) ... (tail_head) tail" loop pattern */
pixld_a pixblock_size, dst_r_bpp, \
(dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
fetch_src_pixblock
pixld pixblock_size, mask_bpp, \
(mask_basereg - pixblock_size * mask_bpp / 64), MASK
process_pixblock_head
subs W, W, #pixblock_size
blt 200f
100:
process_pixblock_tail_head
subs W, W, #pixblock_size
bge 100b
200:
process_pixblock_tail
pixst_a pixblock_size, dst_w_bpp, \
(dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
700:
/* Process the remaining trailing pixels in the scanline (dst aligned) */
process_trailing_pixels 0, 1, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
cleanup
.if use_nearest_scaling != 0
sub x29, x29, 64
ld1 {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
ld1 {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
ldp x8, x9, [x29, -80]
ldr x10, [x29, -96]
mov sp, x29
ldp x29, x30, [sp], 16
ret /* exit */
.else
sub x29, x29, 64
ld1 {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
ld1 {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
mov sp, x29
ldp x29, x30, [sp], 16
ret /* exit */
.endif
800:
/* Process the remaining trailing pixels in the scanline (dst unaligned) */
process_trailing_pixels 0, 0, \
process_pixblock_head, \
process_pixblock_tail, \
process_pixblock_tail_head
cleanup
.if use_nearest_scaling != 0
sub x29, x29, 64
ld1 {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
ld1 {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
ldp x8, x9, [x29, -80]
ldr x10, [x29, -88]
mov sp, x29
ldp x29, x30, [sp], 16
ret /* exit */
.unreq DUMMY
.unreq DST_R
.unreq SRC
.unreq W
.unreq VX
.unreq UNIT_X
.unreq TMP1
.unreq TMP2
.unreq DST_W
.unreq MASK
.unreq SRC_WIDTH_FIXED
.else
sub x29, x29, 64
ld1 {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
ld1 {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
mov sp, x29
ldp x29, x30, [sp], 16
ret /* exit */
.unreq DUMMY
.unreq SRC
.unreq MASK
.unreq DST_R
.unreq DST_W
.unreq W
.endif
.purgem fetch_src_pixblock
.purgem pixld_src
.endfunc
.endm
.macro generate_composite_function_single_scanline x:vararg
generate_composite_function_scanline 0, x
.endm
.macro generate_composite_function_nearest_scanline x:vararg
generate_composite_function_scanline 1, x
.endm
/* Default prologue/epilogue, nothing special needs to be done */
.macro default_init
.endm
.macro default_cleanup
.endm
/*
* Prologue/epilogue variant which additionally saves/restores v8-v15
* registers (they need to be saved/restored by callee according to ABI).
* This is required if the code needs to use all the NEON registers.
*/
.macro default_init_need_all_regs
.endm
.macro default_cleanup_need_all_regs
.endm
/******************************************************************************/
================================================
FILE: dependency/pixman/pixman-cpp-standard.cpp
================================================
#include <memory>
#define BYTE_MUL(c, a) \
((((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \
(((((c)&0x00ff00ff) * (a)) >> 8) & 0x00ff00ff))
extern "C" void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,
uint32_t *dst,
int32_t dst_stride,
uint32_t src)
{
int total_len = w * h;
memset(dst, src, total_len);
}
inline constexpr int vAlpha(uint32_t c)
{
return c >> 24;
}
extern "C" void pixman_composite_over_n_8888_asm_neon(int32_t w, int32_t h,
uint32_t *dst,
int32_t dst_stride,
uint32_t color) {
int total_len = w * h;
int ialpha = 255 - vAlpha(color);
for (int i = 0; i < total_len; ++i)
{
dst[i] = color + BYTE_MUL(dst[i], ialpha);
}
}
================================================
FILE: projects/AndroidStudio/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
================================================
FILE: projects/AndroidStudio/.idea/.gitignore
================================================
# Default ignored files
/shelf/
/workspace.xml
================================================
FILE: projects/AndroidStudio/.idea/.name
================================================
UnityRLottie
================================================
FILE: projects/AndroidStudio/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
</component>
</project>
================================================
FILE: projects/AndroidStudio/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="11" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
================================================
FILE: projects/AndroidStudio/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
================================================
FILE: projects/AndroidStudio/.idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>
================================================
FILE: projects/AndroidStudio/app/.gitignore
================================================
/build
/.cxx
================================================
FILE: projects/AndroidStudio/app/build.gradle
================================================
plugins {
id 'com.android.application'
}
android {
namespace 'com.gindemit.rlottie'
compileSdk 33
ndkVersion '22.1.7171670'
defaultConfig {
applicationId "com.gindemit.rlottie"
minSdk 21
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
}
externalNativeBuild {
cmake {
cppFlags '-std=c++14'
if (project.hasProperty('ANDROID_16K_PAGE') && project.getProperty('ANDROID_16K_PAGE') == 'ON') {
arguments "-DRLOTTIE_ANDROID_PAGE_SIZE_16K=ON"
}
}
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
externalNativeBuild {
cmake {
path file('../../CMake/CMakeLists.txt')
version '3.25.2'
}
}
buildFeatures {
viewBinding true
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
================================================
FILE: projects/AndroidStudio/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: projects/AndroidStudio/app/src/androidTest/java/com/gindemit/rlottie/ExampleInstrumentedTest.java
================================================
package com.gindemit.rlottie;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.gindemit.rlottie", appContext.getPackageName());
}
}
================================================
FILE: projects/AndroidStudio/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.UnityRLottie">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
================================================
FILE: projects/AndroidStudio/app/src/main/java/com/gindemit/rlottie/MainActivity.java
================================================
package com.gindemit.rlottie;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.gindemit.rlottie.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
// Used to load the 'rlottie' library on application startup.
static {
System.loadLibrary("rlottie");
}
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// Example of a call to a native method
TextView tv = binding.sampleText;
tv.setText(stringFromJNI());
}
/**
* A native method that is implemented by the 'rlottie' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}
================================================
FILE: projects/AndroidStudio/app/src/main/res/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
================================================
FILE: projects/AndroidStudio/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
================================================
FILE: projects/AndroidStudio/app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/sample_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: projects/AndroidStudio/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
================================================
FILE: projects/AndroidStudio/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
================================================
FILE: projects/AndroidStudio/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>
================================================
FILE: projects/AndroidStudio/app/src/main/res/values/strings.xml
================================================
<resources>
<string name="app_name">UnityRLottie</string>
</resources>
================================================
FILE: projects/AndroidStudio/app/src/main/res/values/themes.xml
================================================
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.UnityRLottie" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
================================================
FILE: projects/AndroidStudio/app/src/main/res/values-night/themes.xml
================================================
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.UnityRLottie" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
================================================
FILE: projects/AndroidStudio/app/src/test/java/com/gindemit/rlottie/ExampleUnitTest.java
================================================
package com.gindemit.rlottie;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}
================================================
FILE: projects/AndroidStudio/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:8.0.2"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: projects/AndroidStudio/gradle/wrapper/gradle-wrapper.properties
================================================
#Sat Nov 13 22:19:53 CET 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
================================================
FILE: projects/AndroidStudio/gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
================================================
FILE: projects/AndroidStudio/gradlew
================================================
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"
================================================
FILE: projects/AndroidStudio/gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: projects/AndroidStudio/settings.gradle
================================================
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
}
}
rootProject.name = "UnityRLottie"
include ':app'
================================================
FILE: projects/CMake/.gitignore
================================================
CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps
out
.vs
================================================
FILE: projects/CMake/CMakeLists.txt
================================================
# CMakeList.txt : CMake project for LottiePlugin, include source and define
cmake_minimum_required (VERSION 3.6)
#set (MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL)
project(LottiePlugin)
option(RLOTTIE_ANDROID_PAGE_SIZE_16K "Build Android libraries with 16KB page size" OFF)
set(BUILD_SHARED_LIBS FALSE)
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
set (RLOTTIE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../dependency/rlottie)
set (PIXMAN_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../dependency/pixman)
# Disable the LOTTIE_MODULE in rlottie
set(LOTTIE_MODULE OFF CACHE BOOL "Disable LOTTIE MODULE SUPPORT" FORCE)
if (RLOTTIE_IOS)
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/LottiePluginBuild)
elseif (RLOTTIE_OSX)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/LottiePluginBuild)
endif()
if (WIN32)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()
add_subdirectory(${RLOTTIE_ROOT} ${CMAKE_CURRENT_BINARY_DIR}/rlottie_build)
# Make rlottie compile as C++17 (doesn't affect your plugin target)
target_compile_features(rlottie PUBLIC cxx_std_17)
target_compile_definitions(rlottie PRIVATE LOTTIE_LOGGING_SUPPORT)
include_directories ($<BUILD_INTERFACE:${RLOTTIE_ROOT}/inc> ${RLOTTIE_ROOT}/src/vector/ ${RLOTTIE_ROOT}/vs2019/)
message("Lottie root directory: ${RLOTTIE_ROOT}")
set (RLOTTIE_PLUGIN_LIBRARY_SOURCES
../../src/LottiePlugin.cpp)
message("CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
if (RLOTTIE_IOS OR RLOTTIE_WEB_ASSEMBLY)
add_library (LottiePlugin STATIC ${RLOTTIE_PLUGIN_LIBRARY_SOURCES})
else()
add_library (LottiePlugin SHARED ${RLOTTIE_PLUGIN_LIBRARY_SOURCES})
endif()
target_compile_definitions(LottiePlugin PRIVATE LOTTIE_LOGGING_SUPPORT)
# Add WebGL to platforms that need pixman-cpp shim:
if (RLOTTIE_IOS OR ANDROID OR RLOTTIE_OSX OR RLOTTIE_WEB_ASSEMBLY)
message("Compile cpp source for iOS/Android/macOS/WebAssembly")
target_sources(rlottie PRIVATE ${PIXMAN_ROOT}/pixman-cpp-standard.cpp)
endif()
# Build static lib for WebAssembly
if (RLOTTIE_WEB_ASSEMBLY)
set(BUILD_SHARED_LIBS OFF)
endif()
if (WIN32)
set(RLOTTIE_LIBRARY_NAME rlottie.lib)
elseif(RLOTTIE_OSX)
set(RLOTTIE_LIBRARY_NAME Release/rlottie.a)
add_compile_definitions(RLOTTIE_OSX)
#set_target_properties(LottiePlugin PROPERTIES BUNDLE TRUE)
#set_target_properties(LottiePlugin PROPERTIES SUFFIX ".bundle")
else()
set(RLOTTIE_LIBRARY_NAME librlottie.a)
endif()
#declare common target compilation options
if(MSVC)
target_compile_options(rlottie
PRIVATE
/std:c++17
/EHsc # enable exceptions
/Zc:__cplusplus # enable C++17 features
/permissive-) # standards compliant mode
target_compile_options(LottiePlugin
PUBLIC
PRIVATE
/std:c++17
/EHsc- # disable exceptions
/Zc:__cplusplus # enable C++17 features
/permissive- # standards compliant mode
/W3 # warning level
)
else()
target_compile_options(LottiePlugin
PUBLIC
PRIVATE
-std=c++14
-fno-exceptions
-fno-unwind-tables
-fno-asynchronous-unwind-tables
-fno-rtti
-Wall
-fvisibility=hidden
-Wnon-virtual-dtor
-Woverloaded-virtual
-Wno-unused-parameter
)
endif()
add_dependencies(LottiePlugin rlottie)
target_link_libraries(LottiePlugin rlottie)
if(ANDROID AND RLOTTIE_ANDROID_PAGE_SIZE_16K)
target_link_options(LottiePlugin PRIVATE "-Wl,-z,max-page-size=16384" "-Wl,-z,common-page-size=16384")
target_link_options(rlottie PRIVATE "-Wl,-z,max-page-size=16384" "-Wl,-z,common-page-size=16384")
endif()
message(${CMAKE_CURRENT_BINARY_DIR}/rlottie_build/${RLOTTIE_LIBRARY_NAME})
#Adding simple test program:
#add_executable(LottiePluginTest ../../src/PluginTest.c)
#target_link_libraries(LottiePluginTest LottiePlugin)
# if (RLOTTIE_IOS)
# set_xcode_property(LottiePluginTest PRODUCT_BUNDLE_IDENTIFIER "com.soulside.app" All)
# endif()
if (WIN32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set (RLOTTIE_PLUGIN_TARGET_ARCHITECTURE x86_64)
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
set (RLOTTIE_PLUGIN_TARGET_ARCHITECTURE x86)
endif()
elseif(ANDROID)
set (RLOTTIE_PLUGIN_TARGET_ARCHITECTURE ${CMAKE_ANDROID_ARCH_ABI})
else()
set (RLOTTIE_PLUGIN_TARGET_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
endif()
add_custom_command(
TARGET LottiePlugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}")
add_custom_command(
TARGET LottiePlugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"$<TARGET_FILE:LottiePlugin>"
"${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_FILE_NAME:LottiePlugin>"
COMMENT "Copied final library to out directory")
add_custom_command(
TARGET LottiePlugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"$<TARGET_FILE:rlottie>"
"${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_FILE_NAME:rlottie>"
COMMENT "Copied final library to out directory")
if (RLOTTIE_WEB_ASSEMBLY)
add_custom_command(
TARGET LottiePlugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"${CMAKE_CURRENT_SOURCE_DIR}/../../out/Plugins/WebGL"
)
add_custom_command(
TARGET LottiePlugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"$<TARGET_FILE:LottiePlugin>"
"${CMAKE_CURRENT_SOURCE_DIR}/../../out/Plugins/WebGL/libLottiePlugin.a"
COMMENT "Copied libLottiePlugin.a to out/Plugins/WebGL"
)
add_custom_command(
TARGET LottiePlugin POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"$<TARGET_FILE:rlottie>"
"${CMAKE_CURRENT_SOURCE_DIR}/../../out/Plugins/WebGL/librlottie.a"
COMMENT "Copied librlottie.a to out/Plugins/WebGL"
)
endif()
# Uncomment following lines if you want to copy the pdb files for Debug builds:
#if (WIN32)
# add_custom_command(
# TARGET LottiePlugin POST_BUILD
# COMMAND ${CMAKE_COMMAND} -E copy_if_different
# "$<TARGET_PDB_FILE:LottiePlugin>"
# "${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_PDB_FILE_NAME:LottiePlugin>")
# endif()
# uncomment end
if (ANDROID)
add_custom_command(
TARGET LottiePlugin POST_BUILD
COMMAND "${ANDROID_TOOLCHAIN_PREFIX}strip" -g -S -d --strip-debug --verbose
"${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_FILE_NAME:LottiePlugin>"
COMMENT "Strip debug symbols done on final binary.")
add_custom_command(
TARGET LottiePlugin POST_BUILD
COMMAND "${ANDROID_TOOLCHAIN_PREFIX}strip" -g -S -d --strip-debug --verbose
"${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_FILE_NAME:rlottie>"
COMMENT "Strip debug symbols done on final binary.")
endif()
================================================
FILE: projects/CMake/CMakeSettings.json
================================================
{
"configurations": [
{
"name": "x64-Debug",
"generator": "Ninja",
"configurationType": "Debug",
"inheritEnvironments": [ "msvc_x64_x64" ],
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"buildCommandArgs": "-v",
"ctestCommandArgs": ""
},
{
"name": "x64-Release",
"generator": "Ninja",
"configurationType": "Release",
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
gitextract_iryq256z/
├── .editorconfig
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── activation.yaml
│ └── build_native_libraries.yaml
├── .gitignore
├── .gitmodules
├── AGENTS.md
├── LICENSE
├── README.md
├── dependency/
│ └── pixman/
│ ├── pixman-arm-intrisics.cpp
│ ├── pixman-arm-neon-asm.S
│ ├── pixman-arm-neon-asm.h
│ ├── pixman-arma64-neon-asm.S
│ ├── pixman-arma64-neon-asm.h
│ └── pixman-cpp-standard.cpp
├── projects/
│ ├── AndroidStudio/
│ │ ├── .gitignore
│ │ ├── .idea/
│ │ │ ├── .gitignore
│ │ │ ├── .name
│ │ │ ├── compiler.xml
│ │ │ ├── gradle.xml
│ │ │ ├── misc.xml
│ │ │ └── vcs.xml
│ │ ├── app/
│ │ │ ├── .gitignore
│ │ │ ├── build.gradle
│ │ │ ├── proguard-rules.pro
│ │ │ └── src/
│ │ │ ├── androidTest/
│ │ │ │ └── java/
│ │ │ │ └── com/
│ │ │ │ └── gindemit/
│ │ │ │ └── rlottie/
│ │ │ │ └── ExampleInstrumentedTest.java
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── gindemit/
│ │ │ │ │ └── rlottie/
│ │ │ │ │ └── MainActivity.java
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ └── ic_launcher_background.xml
│ │ │ │ ├── drawable-v24/
│ │ │ │ │ └── ic_launcher_foreground.xml
│ │ │ │ ├── layout/
│ │ │ │ │ └── activity_main.xml
│ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ ├── ic_launcher.xml
│ │ │ │ │ └── ic_launcher_round.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── themes.xml
│ │ │ │ └── values-night/
│ │ │ │ └── themes.xml
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── gindemit/
│ │ │ └── rlottie/
│ │ │ └── ExampleUnitTest.java
│ │ ├── build.gradle
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ └── settings.gradle
│ └── CMake/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ └── CMakeSettings.json
├── src/
│ ├── ExportApi.h
│ ├── LottiePlugin.cpp
│ └── LottiePlugin.h
└── unity/
└── RLottieUnity/
├── .editorconfig
├── .gitignore
├── .vsconfig
├── Assets/
│ ├── LottiePlugin/
│ │ ├── Editor/
│ │ │ ├── LottiePlugin.Editor.asmdef
│ │ │ ├── LottiePlugin.Editor.asmdef.meta
│ │ │ ├── src/
│ │ │ │ ├── AnimatedButtonEditor.cs
│ │ │ │ ├── AnimatedButtonEditor.cs.meta
│ │ │ │ ├── AnimatedImageEditor.cs
│ │ │ │ ├── AnimatedImageEditor.cs.meta
│ │ │ │ ├── OpenPersistentDataPathFolder.cs
│ │ │ │ └── OpenPersistentDataPathFolder.cs.meta
│ │ │ └── src.meta
│ │ ├── Editor.meta
│ │ ├── Plugins/
│ │ │ ├── Android/
│ │ │ │ ├── arm64-v8a/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ ├── arm64-v8a.meta
│ │ │ │ ├── armeabi-v7a/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ ├── armeabi-v7a.meta
│ │ │ │ ├── x86/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ ├── x86.meta
│ │ │ │ ├── x86_64/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ └── x86_64.meta
│ │ │ ├── Android.meta
│ │ │ ├── Linux/
│ │ │ │ ├── x86_64/
│ │ │ │ │ └── libLottiePlugin.so.meta
│ │ │ │ └── x86_64.meta
│ │ │ ├── Linux.meta
│ │ │ ├── OSX/
│ │ │ │ └── libLottiePlugin.dylib.meta
│ │ │ ├── OSX.meta
│ │ │ ├── WebGL/
│ │ │ │ ├── LottiePlugin.bc
│ │ │ │ ├── LottiePlugin.bc.meta
│ │ │ │ ├── libLottiePlugin.a
│ │ │ │ ├── libLottiePlugin.a.meta
│ │ │ │ ├── librlottie.a
│ │ │ │ └── librlottie.a.meta
│ │ │ ├── WebGL.meta
│ │ │ ├── Windows/
│ │ │ │ ├── x86/
│ │ │ │ │ └── LottiePlugin.dll.meta
│ │ │ │ ├── x86.meta
│ │ │ │ ├── x86_64/
│ │ │ │ │ └── LottiePlugin.dll.meta
│ │ │ │ └── x86_64.meta
│ │ │ ├── Windows.meta
│ │ │ ├── iOS/
│ │ │ │ ├── libLottiePlugin.a
│ │ │ │ ├── libLottiePlugin.a.meta
│ │ │ │ ├── librlottie.a
│ │ │ │ ├── librlottie.a.meta
│ │ │ │ ├── x86_64/
│ │ │ │ │ ├── libLottiePlugin.a
│ │ │ │ │ ├── libLottiePlugin.a.meta
│ │ │ │ │ ├── librlottie.a
│ │ │ │ │ └── librlottie.a.meta
│ │ │ │ └── x86_64.meta
│ │ │ └── iOS.meta
│ │ ├── Plugins.meta
│ │ ├── Runtime/
│ │ │ ├── AssemblyAttributes.cs
│ │ │ ├── AssemblyAttributes.cs.meta
│ │ │ ├── LottiePlugin.Runtime.asmdef
│ │ │ ├── LottiePlugin.Runtime.asmdef.meta
│ │ │ ├── src/
│ │ │ │ ├── LottieAnimation.cs
│ │ │ │ ├── LottieAnimation.cs.meta
│ │ │ │ ├── LottieAnimationsAtlas.cs
│ │ │ │ ├── LottieAnimationsAtlas.cs.meta
│ │ │ │ ├── NativeBridge.cs
│ │ │ │ ├── NativeBridge.cs.meta
│ │ │ │ ├── Support/
│ │ │ │ │ ├── FIleSizeFormatter.cs
│ │ │ │ │ ├── FIleSizeFormatter.cs.meta
│ │ │ │ │ ├── FilesHelper.cs
│ │ │ │ │ ├── FilesHelper.cs.meta
│ │ │ │ │ ├── StreamingAssetsHelper.cs
│ │ │ │ │ └── StreamingAssetsHelper.cs.meta
│ │ │ │ ├── Support.meta
│ │ │ │ ├── UI/
│ │ │ │ │ ├── AnimatedButton.cs
│ │ │ │ │ ├── AnimatedButton.cs.meta
│ │ │ │ │ ├── AnimatedImage.cs
│ │ │ │ │ └── AnimatedImage.cs.meta
│ │ │ │ ├── UI.meta
│ │ │ │ ├── Utility/
│ │ │ │ │ ├── ThrowIf.cs
│ │ │ │ │ └── ThrowIf.cs.meta
│ │ │ │ └── Utility.meta
│ │ │ └── src.meta
│ │ ├── Runtime.meta
│ │ ├── Samples~/
│ │ │ ├── SceneUI/
│ │ │ │ ├── ExternalDlls/
│ │ │ │ │ ├── Newtonsoft.Json.dll.meta
│ │ │ │ │ ├── System.Buffers.dll.meta
│ │ │ │ │ ├── System.Memory.dll.meta
│ │ │ │ │ ├── System.Threading.Tasks.Extensions.dll.meta
│ │ │ │ │ └── Telegram.Bot.dll.meta
│ │ │ │ ├── ExternalDlls.meta
│ │ │ │ ├── Graphy - Ultimate Stats Monitor/
│ │ │ │ │ ├── Changelog.txt
│ │ │ │ │ ├── Changelog.txt.meta
│ │ │ │ │ ├── Editor/
│ │ │ │ │ │ ├── GraphyDebuggerEditor.cs
│ │ │ │ │ │ ├── GraphyDebuggerEditor.cs.meta
│ │ │ │ │ │ ├── GraphyEditorStyle.cs
│ │ │ │ │ │ ├── GraphyEditorStyle.cs.meta
│ │ │ │ │ │ ├── GraphyManagerEditor.cs
│ │ │ │ │ │ ├── GraphyManagerEditor.cs.meta
│ │ │ │ │ │ ├── GraphyMenuItem.cs
│ │ │ │ │ │ ├── GraphyMenuItem.cs.meta
│ │ │ │ │ │ ├── Tayx.Graphy.Editor.asmdef
│ │ │ │ │ │ └── Tayx.Graphy.Editor.asmdef.meta
│ │ │ │ │ ├── Editor.meta
│ │ │ │ │ ├── Font/
│ │ │ │ │ │ ├── Northwest-Bold/
│ │ │ │ │ │ │ ├── ERIC-TIRADO-NORTHWEST-LICENSE.txt
│ │ │ │ │ │ │ ├── ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta
│ │ │ │ │ │ │ ├── NORTHWEST-B.otf
│ │ │ │ │ │ │ └── NORTHWEST-B.otf.meta
│ │ │ │ │ │ ├── Northwest-Bold.meta
│ │ │ │ │ │ ├── Roboto/
│ │ │ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ │ │ ├── LICENSE.txt.meta
│ │ │ │ │ │ │ ├── Roboto-Bold.ttf.meta
│ │ │ │ │ │ │ └── Roboto-Regular.ttf.meta
│ │ │ │ │ │ └── Roboto.meta
│ │ │ │ │ ├── Font.meta
│ │ │ │ │ ├── GUI/
│ │ │ │ │ │ ├── GraphyGUISkin.guiskin
│ │ │ │ │ │ └── GraphyGUISkin.guiskin.meta
│ │ │ │ │ ├── GUI.meta
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── LICENSE.meta
│ │ │ │ │ ├── Materials/
│ │ │ │ │ │ ├── Audio_Spectrum_Graph.mat
│ │ │ │ │ │ ├── Audio_Spectrum_Graph.mat.meta
│ │ │ │ │ │ ├── Audio_Spectrum_Highest_Values_Graph.mat
│ │ │ │ │ │ ├── Audio_Spectrum_Highest_Values_Graph.mat.meta
│ │ │ │ │ │ ├── FPS_Graph.mat
│ │ │ │ │ │ ├── FPS_Graph.mat.meta
│ │ │ │ │ │ ├── RAM_Allocated_Graph.mat
│ │ │ │ │ │ ├── RAM_Allocated_Graph.mat.meta
│ │ │ │ │ │ ├── RAM_Mono_Graph.mat
│ │ │ │ │ │ ├── RAM_Mono_Graph.mat.meta
│ │ │ │ │ │ ├── RAM_Reserved_Graph.mat
│ │ │ │ │ │ └── RAM_Reserved_Graph.mat.meta
│ │ │ │ │ ├── Materials.meta
│ │ │ │ │ ├── Prefab/
│ │ │ │ │ │ ├── Internal/
│ │ │ │ │ │ │ ├── ADVANCED - Module.prefab
│ │ │ │ │ │ │ ├── ADVANCED - Module.prefab.meta
│ │ │ │ │ │ │ ├── AUDIO - Module.prefab
│ │ │ │ │ │ │ ├── AUDIO - Module.prefab.meta
│ │ │ │ │ │ │ ├── FPS - Module.prefab
│ │ │ │ │ │ │ ├── FPS - Module.prefab.meta
│ │ │ │ │ │ │ ├── RAM - Module.prefab
│ │ │ │ │ │ │ └── RAM - Module.prefab.meta
│ │ │ │ │ │ ├── Internal.meta
│ │ │ │ │ │ ├── [Graphy].prefab
│ │ │ │ │ │ └── [Graphy].prefab.meta
│ │ │ │ │ ├── Prefab.meta
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── README.md.meta
│ │ │ │ │ ├── Readme! - Graphy - Documentation.pdf.meta
│ │ │ │ │ ├── Runtime/
│ │ │ │ │ │ ├── Advanced/
│ │ │ │ │ │ │ ├── G_AdvancedData.cs
│ │ │ │ │ │ │ └── G_AdvancedData.cs.meta
│ │ │ │ │ │ ├── Advanced.meta
│ │ │ │ │ │ ├── Audio/
│ │ │ │ │ │ │ ├── G_AudioGraph.cs
│ │ │ │ │ │ │ ├── G_AudioGraph.cs.meta
│ │ │ │ │ │ │ ├── G_AudioManager.cs
│ │ │ │ │ │ │ ├── G_AudioManager.cs.meta
│ │ │ │ │ │ │ ├── G_AudioMonitor.cs
│ │ │ │ │ │ │ ├── G_AudioMonitor.cs.meta
│ │ │ │ │ │ │ ├── G_AudioText.cs
│ │ │ │ │ │ │ └── G_AudioText.cs.meta
│ │ │ │ │ │ ├── Audio.meta
│ │ │ │ │ │ ├── Fps/
│ │ │ │ │ │ │ ├── G_FpsGraph.cs
│ │ │ │ │ │ │ ├── G_FpsGraph.cs.meta
│ │ │ │ │ │ │ ├── G_FpsManager.cs
│ │ │ │ │ │ │ ├── G_FpsManager.cs.meta
│ │ │ │ │ │ │ ├── G_FpsMonitor.cs
│ │ │ │ │ │ │ ├── G_FpsMonitor.cs.meta
│ │ │ │ │ │ │ ├── G_FpsText.cs
│ │ │ │ │ │ │ └── G_FpsText.cs.meta
│ │ │ │ │ │ ├── Fps.meta
│ │ │ │ │ │ ├── Graph/
│ │ │ │ │ │ │ ├── G_Graph.cs
│ │ │ │ │ │ │ └── G_Graph.cs.meta
│ │ │ │ │ │ ├── Graph.meta
│ │ │ │ │ │ ├── GraphyDebugger.cs
│ │ │ │ │ │ ├── GraphyDebugger.cs.meta
│ │ │ │ │ │ ├── GraphyManager.cs
│ │ │ │ │ │ ├── GraphyManager.cs.meta
│ │ │ │ │ │ ├── Ram/
│ │ │ │ │ │ │ ├── G_RamGraph.cs
│ │ │ │ │ │ │ ├── G_RamGraph.cs.meta
│ │ │ │ │ │ │ ├── G_RamManager.cs
│ │ │ │ │ │ │ ├── G_RamManager.cs.meta
│ │ │ │ │ │ │ ├── G_RamMonitor.cs
│ │ │ │ │ │ │ ├── G_RamMonitor.cs.meta
│ │ │ │ │ │ │ ├── G_RamText.cs
│ │ │ │ │ │ │ └── G_RamText.cs.meta
│ │ │ │ │ │ ├── Ram.meta
│ │ │ │ │ │ ├── Shader/
│ │ │ │ │ │ │ ├── G_GraphShader.cs
│ │ │ │ │ │ │ └── G_GraphShader.cs.meta
│ │ │ │ │ │ ├── Shader.meta
│ │ │ │ │ │ ├── Tayx.Graphy.asmdef
│ │ │ │ │ │ ├── Tayx.Graphy.asmdef.meta
│ │ │ │ │ │ ├── UI/
│ │ │ │ │ │ │ ├── IModifiableState.cs
│ │ │ │ │ │ │ ├── IModifiableState.cs.meta
│ │ │ │ │ │ │ ├── IMovable.cs
│ │ │ │ │ │ │ └── IMovable.cs.meta
│ │ │ │ │ │ ├── UI.meta
│ │ │ │ │ │ ├── Util/
│ │ │ │ │ │ │ ├── G_ExtensionMethods.cs
│ │ │ │ │ │ │ ├── G_ExtensionMethods.cs.meta
│ │ │ │ │ │ │ ├── G_FloatString.cs
│ │ │ │ │ │ │ ├── G_FloatString.cs.meta
│ │ │ │ │ │ │ ├── G_Intstring.cs
│ │ │ │ │ │ │ ├── G_Intstring.cs.meta
│ │ │ │ │ │ │ ├── G_Singleton.cs
│ │ │ │ │ │ │ └── G_Singleton.cs.meta
│ │ │ │ │ │ └── Util.meta
│ │ │ │ │ ├── Runtime.meta
│ │ │ │ │ ├── Shaders/
│ │ │ │ │ │ ├── GraphMobile.shader
│ │ │ │ │ │ ├── GraphMobile.shader.meta
│ │ │ │ │ │ ├── GraphStandard.shader
│ │ │ │ │ │ └── GraphStandard.shader.meta
│ │ │ │ │ ├── Shaders.meta
│ │ │ │ │ ├── Textures/
│ │ │ │ │ │ ├── 2x2_Texture.png.meta
│ │ │ │ │ │ ├── Debugger_Logo_Dark.png.meta
│ │ │ │ │ │ ├── Debugger_Logo_White.png.meta
│ │ │ │ │ │ ├── Manager_Logo_Dark.png.meta
│ │ │ │ │ │ ├── Manager_Logo_White.png.meta
│ │ │ │ │ │ └── Rounded_Rect_10px.png.meta
│ │ │ │ │ ├── Textures.meta
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── package.json.meta
│ │ │ │ ├── Graphy - Ultimate Stats Monitor.meta
│ │ │ │ ├── LottieJsons/
│ │ │ │ │ ├── UI/
│ │ │ │ │ │ ├── Common/
│ │ │ │ │ │ │ ├── loading_animation.json
│ │ │ │ │ │ │ ├── loading_animation.json.meta
│ │ │ │ │ │ │ ├── no_data_found_animation.json
│ │ │ │ │ │ │ └── no_data_found_animation.json.meta
│ │ │ │ │ │ ├── Common.meta
│ │ │ │ │ │ ├── LottiePlayerScreen/
│ │ │ │ │ │ │ ├── hamburger_menu.json
│ │ │ │ │ │ │ ├── hamburger_menu.json.meta
│ │ │ │ │ │ │ ├── next_track.json
│ │ │ │ │ │ │ ├── next_track.json.meta
│ │ │ │ │ │ │ ├── pause_play.json
│ │ │ │ │ │ │ └── pause_play.json.meta
│ │ │ │ │ │ ├── LottiePlayerScreen.meta
│ │ │ │ │ │ ├── MainMenu/
│ │ │ │ │ │ │ ├── 3d_cubes_icon.json
│ │ │ │ │ │ │ ├── 3d_cubes_icon.json.meta
│ │ │ │ │ │ │ ├── explore_icon.json
│ │ │ │ │ │ │ ├── explore_icon.json.meta
│ │ │ │ │ │ │ ├── home_icon.json
│ │ │ │ │ │ │ ├── home_icon.json.meta
│ │ │ │ │ │ │ ├── video_player_icon.json
│ │ │ │ │ │ │ └── video_player_icon.json.meta
│ │ │ │ │ │ └── MainMenu.meta
│ │ │ │ │ └── UI.meta
│ │ │ │ ├── LottieJsons.meta
│ │ │ │ ├── Materials/
│ │ │ │ │ ├── UIMaterial.mat
│ │ │ │ │ └── UIMaterial.mat.meta
│ │ │ │ ├── Materials.meta
│ │ │ │ ├── Prefabs/
│ │ │ │ │ ├── UI/
│ │ │ │ │ │ ├── AnimationPreview.prefab
│ │ │ │ │ │ ├── AnimationPreview.prefab.meta
│ │ │ │ │ │ ├── LottieAnimationsPreview.prefab
│ │ │ │ │ │ └── LottieAnimationsPreview.prefab.meta
│ │ │ │ │ └── UI.meta
│ │ │ │ ├── Prefabs.meta
│ │ │ │ ├── README.txt
│ │ │ │ ├── README.txt.meta
│ │ │ │ ├── Scenes/
│ │ │ │ │ ├── SampleScene.unity
│ │ │ │ │ └── SampleScene.unity.meta
│ │ │ │ ├── Scenes.meta
│ │ │ │ ├── ScriptableObjects/
│ │ │ │ │ ├── LottieAnimationsArray.asset
│ │ │ │ │ └── LottieAnimationsArray.asset.meta
│ │ │ │ ├── ScriptableObjects.meta
│ │ │ │ ├── Scripts/
│ │ │ │ │ ├── Editor/
│ │ │ │ │ │ ├── LottiePlugin.Sample.SceneUI.Editor.asmdef
│ │ │ │ │ │ ├── LottiePlugin.Sample.SceneUI.Editor.asmdef.meta
│ │ │ │ │ │ ├── src/
│ │ │ │ │ │ │ ├── PopulateLottieAnimations.cs
│ │ │ │ │ │ │ ├── PopulateLottieAnimations.cs.meta
│ │ │ │ │ │ │ ├── StreamingAssetsChecker.cs
│ │ │ │ │ │ │ └── StreamingAssetsChecker.cs.meta
│ │ │ │ │ │ └── src.meta
│ │ │ │ │ ├── Editor.meta
│ │ │ │ │ ├── Runtime/
│ │ │ │ │ │ ├── LottiePlugin.Sample.SceneUI.Runtime.asmdef
│ │ │ │ │ │ ├── LottiePlugin.Sample.SceneUI.Runtime.asmdef.meta
│ │ │ │ │ │ ├── src/
│ │ │ │ │ │ │ ├── Data/
│ │ │ │ │ │ │ │ ├── LottieAnimations.cs
│ │ │ │ │ │ │ │ └── LottieAnimations.cs.meta
│ │ │ │ │ │ │ ├── Data.meta
│ │ │ │ │ │ │ ├── State/
│ │ │ │ │ │ │ │ ├── AppState.cs
│ │ │ │ │ │ │ │ └── AppState.cs.meta
│ │ │ │ │ │ │ ├── State.meta
│ │ │ │ │ │ │ ├── Storage/
│ │ │ │ │ │ │ │ ├── CanNotFindStickerPackException.cs
│ │ │ │ │ │ │ │ ├── CanNotFindStickerPackException.cs.meta
│ │ │ │ │ │ │ │ ├── TelegramStickerStorage.cs
│ │ │ │ │ │ │ │ └── TelegramStickerStorage.cs.meta
│ │ │ │ │ │ │ ├── Storage.meta
│ │ │ │ │ │ │ ├── UI/
│ │ │ │ │ │ │ │ ├── AnimationPreview.cs
│ │ │ │ │ │ │ │ ├── AnimationPreview.cs.meta
│ │ │ │ │ │ │ │ ├── AnimationsHomeScreen.cs
│ │ │ │ │ │ │ │ ├── AnimationsHomeScreen.cs.meta
│ │ │ │ │ │ │ │ ├── ExploreTelegramStickers.cs
│ │ │ │ │ │ │ │ ├── ExploreTelegramStickers.cs.meta
│ │ │ │ │ │ │ │ ├── LottieAnimationsPreview.cs
│ │ │ │ │ │ │ │ ├── LottieAnimationsPreview.cs.meta
│ │ │ │ │ │ │ │ ├── LottiePlayerScreen.cs
│ │ │ │ │ │ │ │ ├── LottiePlayerScreen.cs.meta
│ │ │ │ │ │ │ │ ├── MainMenu.cs
│ │ │ │ │ │ │ │ └── MainMenu.cs.meta
│ │ │ │ │ │ │ └── UI.meta
│ │ │ │ │ │ └── src.meta
│ │ │ │ │ └── Runtime.meta
│ │ │ │ ├── Scripts.meta
│ │ │ │ ├── Shaders/
│ │ │ │ │ ├── UI-Default.shader
│ │ │ │ │ ├── UI-Default.shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored (TextureClip).shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored (TextureClip).shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored 1.shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored 1.shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored 2.shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored 2.shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored 3.shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored 3.shader.meta
│ │ │ │ │ ├── Unlit - Premultiplied Colored.shader
│ │ │ │ │ ├── Unlit - Premultiplied Colored.shader.meta
│ │ │ │ │ ├── Unlit - Text (TextureClip).shader
│ │ │ │ │ ├── Unlit - Text (TextureClip).shader.meta
│ │ │ │ │ ├── Unlit - Text 1.shader
│ │ │ │ │ ├── Unlit - Text 1.shader.meta
│ │ │ │ │ ├── Unlit - Text 2.shader
│ │ │ │ │ ├── Unlit - Text 2.shader.meta
│ │ │ │ │ ├── Unlit - Text 3.shader
│ │ │ │ │ ├── Unlit - Text 3.shader.meta
│ │ │ │ │ ├── Unlit - Text.shader
│ │ │ │ │ ├── Unlit - Text.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored (Packed) (TextureClip).shader
│ │ │ │ │ ├── Unlit - Transparent Colored (Packed) (TextureClip).shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored (TextureClip).shader
│ │ │ │ │ ├── Unlit - Transparent Colored (TextureClip).shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored 1.shader
│ │ │ │ │ ├── Unlit - Transparent Colored 1.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored 2.shader
│ │ │ │ │ ├── Unlit - Transparent Colored 2.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored 3.shader
│ │ │ │ │ ├── Unlit - Transparent Colored 3.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Colored.shader
│ │ │ │ │ ├── Unlit - Transparent Colored.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Masked 1.shader
│ │ │ │ │ ├── Unlit - Transparent Masked 1.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Masked 2.shader
│ │ │ │ │ ├── Unlit - Transparent Masked 2.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Masked 3.shader
│ │ │ │ │ ├── Unlit - Transparent Masked 3.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Masked.shader
│ │ │ │ │ ├── Unlit - Transparent Masked.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Packed 1.shader
│ │ │ │ │ ├── Unlit - Transparent Packed 1.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Packed 2.shader
│ │ │ │ │ ├── Unlit - Transparent Packed 2.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Packed 3.shader
│ │ │ │ │ ├── Unlit - Transparent Packed 3.shader.meta
│ │ │ │ │ ├── Unlit - Transparent Packed.shader
│ │ │ │ │ └── Unlit - Transparent Packed.shader.meta
│ │ │ │ ├── Shaders.meta
│ │ │ │ ├── StreamingAssets/
│ │ │ │ │ ├── LottieSamples/
│ │ │ │ │ │ ├── alright_sticker.json
│ │ │ │ │ │ ├── alright_sticker.json.meta
│ │ │ │ │ │ ├── black_friday_animation.json
│ │ │ │ │ │ ├── black_friday_animation.json.meta
│ │ │ │ │ │ ├── body_movin.json
│ │ │ │ │ │ ├── body_movin.json.meta
│ │ │ │ │ │ ├── butterfly_loading.json
│ │ │ │ │ │ ├── butterfly_loading.json.meta
│ │ │ │ │ │ ├── check_animation.json
│ │ │ │ │ │ ├── check_animation.json.meta
│ │ │ │ │ │ ├── concept_floral_branch_butterfly_and_tree.json
│ │ │ │ │ │ ├── concept_floral_branch_butterfly_and_tree.json.meta
│ │ │ │ │ │ ├── confetti.json
│ │ │ │ │ │ ├── confetti.json.meta
│ │ │ │ │ │ ├── favourite_app_icon.json
│ │ │ │ │ │ ├── favourite_app_icon.json.meta
│ │ │ │ │ │ ├── glow_loading.json
│ │ │ │ │ │ ├── glow_loading.json.meta
│ │ │ │ │ │ ├── hamburger_arrow_transition.json
│ │ │ │ │ │ ├── hamburger_arrow_transition.json.meta
│ │ │ │ │ │ ├── hubit.json
│ │ │ │ │ │ ├── hubit.json.meta
│ │ │ │ │ │ ├── lottiefiles_sticker_2.json
│ │ │ │ │ │ ├── lottiefiles_sticker_2.json.meta
│ │ │ │ │ │ ├── lottiefiles_sticker_5.json
│ │ │ │ │ │ ├── lottiefiles_sticker_5.json.meta
│ │ │ │ │ │ ├── marketing.json
│ │ │ │ │ │ ├── marketing.json.meta
│ │ │ │ │ │ ├── motorcycle.json
│ │ │ │ │ │ ├── motorcycle.json.meta
│ │ │ │ │ │ ├── phone.json
│ │ │ │ │ │ ├── phone.json.meta
│ │ │ │ │ │ ├── power_sticker.json
│ │ │ │ │ │ ├── power_sticker.json.meta
│ │ │ │ │ │ ├── preloader.json
│ │ │ │ │ │ ├── preloader.json.meta
│ │ │ │ │ │ ├── squid_game/
│ │ │ │ │ │ │ ├── 0.json
│ │ │ │ │ │ │ ├── 0.json.meta
│ │ │ │ │ │ │ ├── 1.json
│ │ │ │ │ │ │ ├── 1.json.meta
│ │ │ │ │ │ │ ├── 10.json
│ │ │ │ │ │ │ ├── 10.json.meta
│ │ │ │ │ │ │ ├── 11.json
│ │ │ │ │ │ │ ├── 11.json.meta
│ │ │ │ │ │ │ ├── 12.json
│ │ │ │ │ │ │ ├── 12.json.meta
│ │ │ │ │ │ │ ├── 13.json
│ │ │ │ │ │ │ ├── 13.json.meta
│ │ │ │ │ │ │ ├── 14.json
│ │ │ │ │ │ │ ├── 14.json.meta
│ │ │ │ │ │ │ ├── 15.json
│ │ │ │ │ │ │ ├── 15.json.meta
│ │ │ │ │ │ │ ├── 16.json
│ │ │ │ │ │ │ ├── 16.json.meta
│ │ │ │ │ │ │ ├── 17.json
│ │ │ │ │ │ │ ├── 17.json.meta
│ │ │ │ │ │ │ ├── 18.json
│ │ │ │ │ │ │ ├── 18.json.meta
│ │ │ │ │ │ │ ├── 19.json
│ │ │ │ │ │ │ ├── 19.json.meta
│ │ │ │ │ │ │ ├── 2.json
│ │ │ │ │ │ │ ├── 2.json.meta
│ │ │ │ │ │ │ ├── 20.json
│ │ │ │ │ │ │ ├── 20.json.meta
│ │ │ │ │ │ │ ├── 21.json
│ │ │ │ │ │ │ ├── 21.json.meta
│ │ │ │ │ │ │ ├── 22.json
│ │ │ │ │ │ │ ├── 22.json.meta
│ │ │ │ │ │ │ ├── 23.json
│ │ │ │ │ │ │ ├── 23.json.meta
│ │ │ │ │ │ │ ├── 24.json
│ │ │ │ │ │ │ ├── 24.json.meta
│ │ │ │ │ │ │ ├── 3.json
│ │ │ │ │ │ │ ├── 3.json.meta
│ │ │ │ │ │ │ ├── 4.json
│ │ │ │ │ │ │ ├── 4.json.meta
│ │ │ │ │ │ │ ├── 5.json
│ │ │ │ │ │ │ ├── 5.json.meta
│ │ │ │ │ │ │ ├── 6.json
│ │ │ │ │ │ │ ├── 6.json.meta
│ │ │ │ │ │ │ ├── 7.json
│ │ │ │ │ │ │ ├── 7.json.meta
│ │ │ │ │ │ │ ├── 8.json
│ │ │ │ │ │ │ ├── 8.json.meta
│ │ │ │ │ │ │ ├── 9.json
│ │ │ │ │ │ │ └── 9.json.meta
│ │ │ │ │ │ ├── squid_game.meta
│ │ │ │ │ │ ├── sticker.json
│ │ │ │ │ │ ├── sticker.json.meta
│ │ │ │ │ │ ├── taking_the_duggy_out.json
│ │ │ │ │ │ └── taking_the_duggy_out.json.meta
│ │ │ │ │ └── LottieSamples.meta
│ │ │ │ └── StreamingAssets.meta
│ │ │ └── SceneUI.meta
│ │ ├── Tests/
│ │ │ ├── Audio/
│ │ │ │ ├── pause.mp3.meta
│ │ │ │ ├── start.mp3.meta
│ │ │ │ └── stop.mp3.meta
│ │ │ ├── Audio.meta
│ │ │ ├── Resources/
│ │ │ │ ├── body_movin.json
│ │ │ │ ├── body_movin.json.meta
│ │ │ │ ├── video_player_icon.json
│ │ │ │ └── video_player_icon.json.meta
│ │ │ ├── Resources.meta
│ │ │ ├── Runtime/
│ │ │ │ ├── LottiePlugin.Tests.Runtime.asmdef
│ │ │ │ ├── LottiePlugin.Tests.Runtime.asmdef.meta
│ │ │ │ ├── src/
│ │ │ │ │ ├── AnimatedImageTests.cs
│ │ │ │ │ └── AnimatedImageTests.cs.meta
│ │ │ │ └── src.meta
│ │ │ └── Runtime.meta
│ │ ├── Tests.meta
│ │ ├── package.json
│ │ └── package.json.meta
│ ├── LottiePlugin.meta
│ ├── Scenes/
│ │ ├── Main.unity
│ │ └── Main.unity.meta
│ ├── Scenes.meta
│ ├── StreamingAssets/
│ │ ├── LottieSamples/
│ │ │ ├── alright_sticker.json
│ │ │ ├── alright_sticker.json.meta
│ │ │ ├── black_friday_animation.json
│ │ │ ├── black_friday_animation.json.meta
│ │ │ ├── body_movin.json
│ │ │ ├── body_movin.json.meta
│ │ │ ├── butterfly_loading.json
│ │ │ ├── butterfly_loading.json.meta
│ │ │ ├── check_animation.json
│ │ │ ├── check_animation.json.meta
│ │ │ ├── concept_floral_branch_butterfly_and_tree.json
│ │ │ ├── concept_floral_branch_butterfly_and_tree.json.meta
│ │ │ ├── confetti.json
│ │ │ ├── confetti.json.meta
│ │ │ ├── favourite_app_icon.json
│ │ │ ├── favourite_app_icon.json.meta
│ │ │ ├── glow_loading.json
│ │ │ ├── glow_loading.json.meta
│ │ │ ├── hamburger_arrow_transition.json
│ │ │ ├── hamburger_arrow_transition.json.meta
│ │ │ ├── hubit.json
│ │ │ ├── hubit.json.meta
│ │ │ ├── lottiefiles_sticker_2.json
│ │ │ ├── lottiefiles_sticker_2.json.meta
│ │ │ ├── lottiefiles_sticker_5.json
│ │ │ ├── lottiefiles_sticker_5.json.meta
│ │ │ ├── marketing.json
│ │ │ ├── marketing.json.meta
│ │ │ ├── motorcycle.json
│ │ │ ├── motorcycle.json.meta
│ │ │ ├── phone.json
│ │ │ ├── phone.json.meta
│ │ │ ├── power_sticker.json
│ │ │ ├── power_sticker.json.meta
│ │ │ ├── preloader.json
│ │ │ ├── preloader.json.meta
│ │ │ ├── squid_game/
│ │ │ │ ├── 0.json
│ │ │ │ ├── 0.json.meta
│ │ │ │ ├── 1.json
│ │ │ │ ├── 1.json.meta
│ │ │ │ ├── 10.json
│ │ │ │ ├── 10.json.meta
│ │ │ │ ├── 11.json
│ │ │ │ ├── 11.json.meta
│ │ │ │ ├── 12.json
│ │ │ │ ├── 12.json.meta
│ │ │ │ ├── 13.json
│ │ │ │ ├── 13.json.meta
│ │ │ │ ├── 14.json
│ │ │ │ ├── 14.json.meta
│ │ │ │ ├── 15.json
│ │ │ │ ├── 15.json.meta
│ │ │ │ ├── 16.json
│ │ │ │ ├── 16.json.meta
│ │ │ │ ├── 17.json
│ │ │ │ ├── 17.json.meta
│ │ │ │ ├── 18.json
│ │ │ │ ├── 18.json.meta
│ │ │ │ ├── 19.json
│ │ │ │ ├── 19.json.meta
│ │ │ │ ├── 2.json
│ │ │ │ ├── 2.json.meta
│ │ │ │ ├── 20.json
│ │ │ │ ├── 20.json.meta
│ │ │ │ ├── 21.json
│ │ │ │ ├── 21.json.meta
│ │ │ │ ├── 22.json
│ │ │ │ ├── 22.json.meta
│ │ │ │ ├── 23.json
│ │ │ │ ├── 23.json.meta
│ │ │ │ ├── 24.json
│ │ │ │ ├── 24.json.meta
│ │ │ │ ├── 3.json
│ │ │ │ ├── 3.json.meta
│ │ │ │ ├── 4.json
│ │ │ │ ├── 4.json.meta
│ │ │ │ ├── 5.json
│ │ │ │ ├── 5.json.meta
│ │ │ │ ├── 6.json
│ │ │ │ ├── 6.json.meta
│ │ │ │ ├── 7.json
│ │ │ │ ├── 7.json.meta
│ │ │ │ ├── 8.json
│ │ │ │ ├── 8.json.meta
│ │ │ │ ├── 9.json
│ │ │ │ └── 9.json.meta
│ │ │ ├── squid_game.meta
│ │ │ ├── sticker.json
│ │ │ ├── sticker.json.meta
│ │ │ ├── taking_the_duggy_out.json
│ │ │ └── taking_the_duggy_out.json.meta
│ │ └── LottieSamples.meta
│ ├── StreamingAssets.meta
│ ├── TextMesh Pro/
│ │ ├── Documentation/
│ │ │ └── TextMesh Pro User Guide 2016.pdf.meta
│ │ ├── Documentation.meta
│ │ ├── Fonts/
│ │ │ ├── LiberationSans - OFL.txt
│ │ │ ├── LiberationSans - OFL.txt.meta
│ │ │ └── LiberationSans.ttf.meta
│ │ ├── Fonts.meta
│ │ ├── Resources/
│ │ │ ├── Fonts & Materials/
│ │ │ │ ├── LiberationSans SDF - Drop Shadow.mat
│ │ │ │ ├── LiberationSans SDF - Drop Shadow.mat.meta
│ │ │ │ ├── LiberationSans SDF - Fallback.asset
│ │ │ │ ├── LiberationSans SDF - Fallback.asset.meta
│ │ │ │ ├── LiberationSans SDF - Outline.mat
│ │ │ │ ├── LiberationSans SDF - Outline.mat.meta
│ │ │ │ ├── LiberationSans SDF.asset
│ │ │ │ └── LiberationSans SDF.asset.meta
│ │ │ ├── Fonts & Materials.meta
│ │ │ ├── LineBreaking Following Characters.txt
│ │ │ ├── LineBreaking Following Characters.txt.meta
│ │ │ ├── LineBreaking Leading Characters.txt
│ │ │ ├── LineBreaking Leading Characters.txt.meta
│ │ │ ├── Sprite Assets/
│ │ │ │ ├── EmojiOne.asset
│ │ │ │ └── EmojiOne.asset.meta
│ │ │ ├── Sprite Assets.meta
│ │ │ ├── Style Sheets/
│ │ │ │ ├── Default Style Sheet.asset
│ │ │ │ └── Default Style Sheet.asset.meta
│ │ │ ├── Style Sheets.meta
│ │ │ ├── TMP Settings.asset
│ │ │ └── TMP Settings.asset.meta
│ │ ├── Resources.meta
│ │ ├── Shaders/
│ │ │ ├── TMP_Bitmap-Custom-Atlas.shader
│ │ │ ├── TMP_Bitmap-Custom-Atlas.shader.meta
│ │ │ ├── TMP_Bitmap-Mobile.shader
│ │ │ ├── TMP_Bitmap-Mobile.shader.meta
│ │ │ ├── TMP_Bitmap.shader
│ │ │ ├── TMP_Bitmap.shader.meta
│ │ │ ├── TMP_SDF Overlay.shader
│ │ │ ├── TMP_SDF Overlay.shader.meta
│ │ │ ├── TMP_SDF SSD.shader
│ │ │ ├── TMP_SDF SSD.shader.meta
│ │ │ ├── TMP_SDF-Mobile Masking.shader
│ │ │ ├── TMP_SDF-Mobile Masking.shader.meta
│ │ │ ├── TMP_SDF-Mobile Overlay.shader
│ │ │ ├── TMP_SDF-Mobile Overlay.shader.meta
│ │ │ ├── TMP_SDF-Mobile SSD.shader
│ │ │ ├── TMP_SDF-Mobile SSD.shader.meta
│ │ │ ├── TMP_SDF-Mobile.shader
│ │ │ ├── TMP_SDF-Mobile.shader.meta
│ │ │ ├── TMP_SDF-Surface-Mobile.shader
│ │ │ ├── TMP_SDF-Surface-Mobile.shader.meta
│ │ │ ├── TMP_SDF-Surface.shader
│ │ │ ├── TMP_SDF-Surface.shader.meta
│ │ │ ├── TMP_SDF.shader
│ │ │ ├── TMP_SDF.shader.meta
│ │ │ ├── TMP_Sprite.shader
│ │ │ ├── TMP_Sprite.shader.meta
│ │ │ ├── TMPro.cginc
│ │ │ ├── TMPro.cginc.meta
│ │ │ ├── TMPro_Mobile.cginc
│ │ │ ├── TMPro_Mobile.cginc.meta
│ │ │ ├── TMPro_Properties.cginc
│ │ │ ├── TMPro_Properties.cginc.meta
│ │ │ ├── TMPro_Surface.cginc
│ │ │ └── TMPro_Surface.cginc.meta
│ │ ├── Shaders.meta
│ │ ├── Sprites/
│ │ │ ├── EmojiOne Attribution.txt
│ │ │ ├── EmojiOne Attribution.txt.meta
│ │ │ ├── EmojiOne.json
│ │ │ ├── EmojiOne.json.meta
│ │ │ └── EmojiOne.png.meta
│ │ └── Sprites.meta
│ └── TextMesh Pro.meta
├── Packages/
│ ├── manifest.json
│ └── packages-lock.json
├── ProjectSettings/
│ ├── AudioManager.asset
│ ├── ClusterInputManager.asset
│ ├── DynamicsManager.asset
│ ├── EditorBuildSettings.asset
│ ├── EditorSettings.asset
│ ├── GraphicsSettings.asset
│ ├── InputManager.asset
│ ├── MemorySettings.asset
│ ├── NavMeshAreas.asset
│ ├── PackageManagerSettings.asset
│ ├── Physics2DSettings.asset
│ ├── PresetManager.asset
│ ├── ProjectSettings.asset
│ ├── ProjectVersion.txt
│ ├── QualitySettings.asset
│ ├── TagManager.asset
│ ├── TimeManager.asset
│ ├── UnityConnectSettings.asset
│ ├── VFXManager.asset
│ ├── VersionControlSettings.asset
│ └── XRSettings.asset
└── UserSettings/
├── AndroidLogcatSettings.asset
├── EditorUserSettings.asset
├── Search.index
└── Search.settings
SYMBOL INDEX (419 symbols across 59 files)
FILE: dependency/pixman/pixman-arm-intrisics.cpp
function pixman_composite_src_n_8888_asm_neon (line 3) | void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,
function pixman_composite_over_n_8888_asm_neon (line 20) | void pixman_composite_over_n_8888_asm_neon(int32_t w, int32_t h,
FILE: dependency/pixman/pixman-cpp-standard.cpp
function pixman_composite_src_n_8888_asm_neon (line 7) | void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,
function vAlpha (line 16) | inline constexpr int vAlpha(uint32_t c)
function pixman_composite_over_n_8888_asm_neon (line 21) | void pixman_composite_over_n_8888_asm_neon(int32_t w, int32_t h,
FILE: projects/AndroidStudio/app/src/androidTest/java/com/gindemit/rlottie/ExampleInstrumentedTest.java
class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
method useAppContext (line 20) | @Test
FILE: projects/AndroidStudio/app/src/main/java/com/gindemit/rlottie/MainActivity.java
class MainActivity (line 10) | public class MainActivity extends AppCompatActivity {
method onCreate (line 19) | @Override
method stringFromJNI (line 35) | public native String stringFromJNI();
FILE: projects/AndroidStudio/app/src/test/java/com/gindemit/rlottie/ExampleUnitTest.java
class ExampleUnitTest (line 12) | public class ExampleUnitTest {
method addition_isCorrect (line 13) | @Test
FILE: src/LottiePlugin.cpp
function lottie_animation_wrapper (line 6) | static lottie_animation_wrapper* create_animation_wrapper(std::unique_pt...
function EXPORT_API (line 29) | EXPORT_API int32_t lottie_load_from_data(
function EXPORT_API (line 42) | EXPORT_API int32_t lottie_load_from_file(
function EXPORT_API (line 55) | EXPORT_API int32_t lottie_dispose_wrapper(lottie_animation_wrapper** ani...
function EXPORT_API (line 61) | EXPORT_API int32_t lottie_render_immediately(
function EXPORT_API (line 78) | EXPORT_API int32_t lottie_render_create_future_async(
function EXPORT_API (line 92) | EXPORT_API int32_t lottie_render_get_future_result(
function EXPORT_API (line 99) | EXPORT_API int32_t lottie_render_create_future_async(
function EXPORT_API (line 112) | EXPORT_API int32_t lottie_render_get_future_result(
function EXPORT_API (line 120) | EXPORT_API int32_t lottie_allocate_render_data(lottie_render_data** rend...
function EXPORT_API (line 129) | EXPORT_API int32_t lottie_dispose_render_data(lottie_render_data** rende...
FILE: src/LottiePlugin.h
type lottie_animation_wrapper (line 9) | typedef struct lottie_animation_wrapper {
type lottie_render_data (line 19) | typedef struct lottie_render_data {
FILE: unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedButtonEditor.cs
class AnimatedButtonEditor (line 10) | [CustomEditor(typeof(AnimatedButton), true)]
method OnEnable (line 32) | protected override void OnEnable()
method OnDisable (line 61) | protected override void OnDisable()
method OnInspectorGUI (line 73) | public override void OnInspectorGUI()
method CreateAnimationIfNecessaryAndAttachToGraphic (line 150) | private void CreateAnimationIfNecessaryAndAttachToGraphic()
method UpdateTheAnimationInfoBoxText (line 174) | private void UpdateTheAnimationInfoBoxText()
method DrawListItems (line 196) | private void DrawListItems(Rect rect, int index, bool isActive, bool i...
method DrawHeader (line 245) | private void DrawHeader(Rect rect)
method AddCallback (line 252) | private void AddCallback(ReorderableList list)
method SetStateValuesAtIndex (line 259) | private void SetStateValuesAtIndex(int index, string stateName, int fr...
method OnSelectCallback (line 267) | private void OnSelectCallback(ReorderableList list)
method GetStateNameProperty (line 279) | private static SerializedProperty GetStateNameProperty(SerializedPrope...
method GetFrameNumberProperty (line 281) | private static SerializedProperty GetFrameNumberProperty(SerializedPro...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedImageEditor.cs
class AnimatedImageEditor (line 8) | [CustomEditor(typeof(AnimatedImage), true)]
method OnEnable (line 28) | private void OnEnable()
method OnInspectorGUI (line 46) | public override void OnInspectorGUI()
method CreateAnimationIfNecessaryAndAttachToGraphic (line 107) | private void CreateAnimationIfNecessaryAndAttachToGraphic()
method UpdateTheAnimationInfoBoxText (line 131) | private void UpdateTheAnimationInfoBoxText()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Editor/src/OpenPersistentDataPathFolder.cs
class OpenPersistentDataPathFolder (line 6) | internal static class OpenPersistentDataPathFolder
method OpenPersistentDataFolder (line 8) | [MenuItem("Tools/Open Persistent Data Folder")]
FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimation.cs
class LottieAnimation (line 11) | public sealed class LottieAnimation : IDisposable
method LottieAnimation (line 37) | private LottieAnimation(string jsonData, string resourcesPath, uint wi...
method LottieAnimation (line 49) | private LottieAnimation(string jsonFilePath, uint width, uint height)
method Dispose (line 61) | public void Dispose()
method Update (line 71) | public void Update(float animationSpeed = 1f)
method UpdateAsync (line 75) | public void UpdateAsync(float animationSpeed = 1f)
method TogglePlay (line 79) | public void TogglePlay()
method Play (line 83) | public void Play()
method Pause (line 89) | public void Pause()
method Stop (line 94) | public void Stop()
method DrawOneFrame (line 100) | public void DrawOneFrame(int frameNumber)
method DrawOneFrameAsyncPrepare (line 106) | public void DrawOneFrameAsyncPrepare(int frameNumber)
method DrawOneFrameAsyncGetResult (line 110) | public void DrawOneFrameAsyncGetResult()
method CreateRenderDataTexture2DMarshalToNative (line 120) | private unsafe void CreateRenderDataTexture2DMarshalToNative(uint widt...
method UpdateInternal (line 137) | private void UpdateInternal(float animationSpeed, Action<int> drawOneF...
method LoadFromJsonFile (line 157) | public static LottieAnimation LoadFromJsonFile(string filePath, uint w...
method LoadFromJsonData (line 162) | public static LottieAnimation LoadFromJsonData(string jsonData, string...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimationsAtlas.cs
class LottieAnimationsAtlas (line 11) | public sealed class LottieAnimationsAtlas : IDisposable
method LottieAnimationsAtlas (line 43) | private LottieAnimationsAtlas(string[] jsonFilePaths, uint width, uint...
method Dispose (line 68) | public void Dispose()
method Update (line 82) | public void Update(float animationSpeed = 1f)
method UpdateAsync (line 86) | public void UpdateAsync(float animationSpeed = 1f)
method TogglePlay (line 90) | public void TogglePlay()
method Play (line 94) | public void Play()
method Pause (line 102) | public void Pause()
method Stop (line 106) | public void Stop()
method DrawOneFrame (line 114) | public void DrawOneFrame(int frameNumber, int index)
method DrawOneFrameAsyncPrepare (line 120) | public void DrawOneFrameAsyncPrepare(int frameNumber, int index)
method DrawOneFrameAsyncGetResult (line 124) | public void DrawOneFrameAsyncGetResult()
method CreateRenderDataAtlasTexture2DMarshalToNative (line 142) | private unsafe void CreateRenderDataAtlasTexture2DMarshalToNative(int ...
method UpdateInternal (line 176) | private void UpdateInternal(float animationSpeed, Action<int, int> dra...
method LoadFromJsonFiles (line 199) | public static LottieAnimationsAtlas LoadFromJsonFiles(string[] filePat...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/NativeBridge.cs
type LottieAnimationWrapper (line 7) | [StructLayout(LayoutKind.Sequential)]
type LottieRenderData (line 18) | [StructLayout(LayoutKind.Sequential)]
class NativeBridge (line 26) | internal static class NativeBridge
method LottieLoadFromData (line 34) | [DllImport(PLUGIN_NAME,
method LottieLoadFromFile (line 42) | [DllImport(PLUGIN_NAME,
method LottieDisposeWrapper (line 49) | [DllImport(PLUGIN_NAME,
method LottieRenderImmediately (line 55) | [DllImport(PLUGIN_NAME,
method LottieRenderCreateFutureAsync (line 64) | [DllImport(PLUGIN_NAME,
method LottieRenderGetFutureResult (line 72) | [DllImport(PLUGIN_NAME,
method LottieAllocateRenderData (line 79) | [DllImport(PLUGIN_NAME,
method LottieDisposeRenderData (line 84) | [DllImport(PLUGIN_NAME,
method LoadFromData (line 90) | internal static LottieAnimationWrapper LoadFromData(string filePath, s...
method LoadFromFile (line 95) | internal static LottieAnimationWrapper LoadFromFile(string filePath, o...
method Dispose (line 100) | internal static void Dispose(LottieAnimationWrapper lottieAnimationWra...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FIleSizeFormatter.cs
class FIleSizeFormatter (line 3) | public static class FIleSizeFormatter
method ToPrettyFileSize (line 7) | public static string ToPrettyFileSize(long fileSize)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FilesHelper.cs
class FilesHelper (line 6) | public static class FilesHelper
method CopyAnimationsJsonsFromStreamingAssetsToPersistentData (line 10) | public static void CopyAnimationsJsonsFromStreamingAssetsToPersistentD...
method CopyFileFromStreamingAssetsToPersistentData (line 23) | public static void CopyFileFromStreamingAssetsToPersistentData(string ...
method GetPersistentAnimationsPaths (line 29) | public static string[] GetPersistentAnimationsPaths(string[] animations)
method GetPersistentAnimationPath (line 38) | public static string GetPersistentAnimationPath(string animation)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/StreamingAssetsHelper.cs
class StreamingAssetsHelper (line 5) | public static class StreamingAssetsHelper
method LoadFileFromStreamingAssets (line 7) | public static byte[] LoadFileFromStreamingAssets(string streamingAsset...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedButton.cs
class AnimatedButton (line 9) | public sealed class AnimatedButton : Selectable, IPointerClickHandler, I...
type State (line 11) | [System.Serializable]
class ButtonClickedEvent (line 17) | [System.Serializable]
method Awake (line 42) | protected override void Awake()
method Start (line 48) | protected override void Start()
method OnDestroy (line 58) | protected override void OnDestroy()
method ResetState (line 63) | public void ResetState()
method OnPointerClick (line 69) | public void OnPointerClick(PointerEventData eventData)
method OnSubmit (line 75) | public void OnSubmit(BaseEventData eventData)
method CreateIfNeededAndReturnLottieAnimation (line 79) | internal LottieAnimation CreateIfNeededAndReturnLottieAnimation()
method SetTextureToTheTargetRawImage (line 100) | internal void SetTextureToTheTargetRawImage()
method DisposeLottieAnimation (line 108) | internal void DisposeLottieAnimation()
method Press (line 117) | private void Press()
method AnimateToNextState (line 137) | private IEnumerator AnimateToNextState()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedImage.cs
class AnimatedImage (line 8) | [RequireComponent(typeof(RawImage))]
class AnimationEvent (line 12) | [System.Serializable]
method Awake (line 42) | private void Awake()
method Start (line 48) | private void Start()
method OnDestroy (line 65) | private void OnDestroy()
method Play (line 70) | public void Play()
method Pause (line 79) | public void Pause()
method Stop (line 83) | public void Stop()
method LoadFromAnimationJson (line 94) | public void LoadFromAnimationJson(string json, uint width, uint height...
method CreateIfNeededAndReturnLottieAnimation (line 121) | internal LottieAnimation CreateIfNeededAndReturnLottieAnimation()
method DisposeLottieAnimation (line 149) | internal void DisposeLottieAnimation()
method RenderLottieAnimationCoroutine (line 161) | private IEnumerator RenderLottieAnimationCoroutine()
method OnAnimationStarted (line 177) | private void OnAnimationStarted(LottieAnimation animation)
method OnAnimationPaused (line 181) | private void OnAnimationPaused(LottieAnimation animation)
method OnAnimationStopped (line 185) | private void OnAnimationStopped(LottieAnimation animation)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Utility/ThrowIf.cs
class ThrowIf (line 6) | public static class ThrowIf
class Argument (line 8) | public static class Argument
method IsNull (line 10) | public static void IsNull(object argument, string argumentName)
class String (line 18) | public static class String
method IsNullOrEmpty (line 20) | public static void IsNullOrEmpty(string str, string strName)
class Collection (line 32) | public static class Collection
method IsNullOrEmpty (line 34) | public static void IsNullOrEmpty(ICollection collection, string coll...
class Field (line 46) | public static class Field
method IsNull (line 48) | public static void IsNull(object argument, string argumentName)
method IsNotNull (line 55) | public static void IsNotNull(object argument, string argumentName)
class Value (line 63) | public static class Value
method IsZero (line 65) | public static void IsZero(int value, string valueName)
method IsZero (line 72) | public static void IsZero(uint value, string valueName)
method IsZeroOrNegative (line 79) | public static void IsZeroOrNegative(int value, string valueName)
class Index (line 87) | public static class Index
method IsOutOfBounds (line 89) | public static void IsOutOfBounds(int index, string collectionName, I...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs
class GraphyDebuggerEditor (line 22) | [CustomEditor(typeof(GraphyDebugger))]
method OnEnable (line 48) | private void OnEnable()
method OnInspectorGUI (line 57) | public override void OnInspectorGUI()
method SetDefaultDebugPacketValues (line 501) | private void SetDefaultDebugPacketValues(SerializedProperty debugPacke...
method GetComparerStringFromDebugVariable (line 526) | private string GetComparerStringFromDebugVariable(GraphyDebugger.Debug...
method GetComparerStringFromDebugComparer (line 555) | private string GetComparerStringFromDebugComparer(GraphyDebugger.Debug...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs
class GraphyEditorStyle (line 21) | internal static class GraphyEditorStyle
method GraphyEditorStyle (line 48) | static GraphyEditorStyle()
method SetGuiStyleFontColor (line 104) | private static void SetGuiStyleFontColor(GUIStyle guiStyle, Color color)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs
class GraphyManagerEditor (line 21) | [CustomEditor(typeof(GraphyManager))]
method OnEnable (line 142) | private void OnEnable()
method OnInspectorGUI (line 241) | public override void OnInspectorGUI()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs
class GraphyMenuItem (line 19) | public class GraphyMenuItem
method CreatePrefabVariant (line 21) | [MenuItem("Tools/Graphy/Create Prefab Variant")]
method ImportGraphyCustomizationScene (line 53) | [MenuItem( "Tools/Graphy/Import Graphy Customization Scene" )]
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Advanced/G_AdvancedData.cs
class G_AdvancedData (line 28) | public class G_AdvancedData : MonoBehaviour, IMovable, IModifiableState
method OnEnable (line 79) | private void OnEnable()
method Update (line 84) | private void Update()
method SetPosition (line 111) | public void SetPosition(GraphyManager.ModulePosition newModulePosition)
method SetState (line 206) | public void SetState(GraphyManager.ModuleState state, bool silentUpdat...
method RestorePreviousState (line 227) | public void RestorePreviousState()
method UpdateParameters (line 232) | public void UpdateParameters()
method RefreshParameters (line 243) | public void RefreshParameters()
method Init (line 258) | private void Init()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioGraph.cs
class G_AudioGraph (line 20) | public class G_AudioGraph : G_Graph
method OnEnable (line 52) | private void OnEnable()
method Update (line 71) | private void Update()
method UpdateParameters (line 83) | public void UpdateParameters()
method UpdateGraph (line 122) | protected override void UpdateGraph()
method CreatePoints (line 214) | protected override void CreatePoints()
method Init (line 267) | private void Init()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs
class G_AudioManager (line 22) | public class G_AudioManager : MonoBehaviour, IMovable, IModifiableState
method Awake (line 52) | private void Awake()
method Start (line 57) | private void Start()
method SetPosition (line 66) | public void SetPosition(GraphyManager.ModulePosition newModulePosition)
method SetState (line 112) | public void SetState(GraphyManager.ModuleState state, bool silentUpdat...
method RestorePreviousState (line 171) | public void RestorePreviousState()
method UpdateParameters (line 176) | public void UpdateParameters()
method RefreshParameters (line 190) | public void RefreshParameters()
method Init (line 208) | private void Init()
method SetGraphActive (line 227) | private void SetGraphActive(bool active)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs
class G_AudioMonitor (line 24) | public class G_AudioMonitor : MonoBehaviour
method Awake (line 68) | private void Awake()
method Update (line 73) | private void Update()
method OnDestroy (line 125) | private void OnDestroy()
method UpdateParameters (line 134) | public void UpdateParameters()
method lin2dB (line 157) | public float lin2dB(float linear)
method dBNormalized (line 167) | public float dBNormalized(float db)
method FindAudioListener (line 179) | private AudioListener FindAudioListener()
method OnSceneLoaded (line 191) | private void OnSceneLoaded(Scene scene, LoadSceneMode loadSceneMode)
method Init (line 199) | private void Init()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioText.cs
class G_AudioText (line 20) | public class G_AudioText : MonoBehaviour
method Awake (line 42) | private void Awake()
method Update (line 47) | private void Update()
method UpdateParameters (line 68) | public void UpdateParameters()
method Init (line 77) | private void Init()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsGraph.cs
class G_FpsGraph (line 20) | public class G_FpsGraph : G_Graph
method Update (line 52) | private void Update()
method UpdateParameters (line 61) | public void UpdateParameters()
method UpdateGraph (line 93) | protected override void UpdateGraph()
method CreatePoints (line 153) | protected override void CreatePoints()
method Init (line 179) | private void Init()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsManager.cs
class G_FpsManager (line 22) | public class G_FpsManager : MonoBehaviour, IMovable, IModifiableState
method Awake (line 53) | private void Awake()
method Start (line 58) | private void Start()
method SetPosition (line 67) | public void SetPosition(GraphyManager.ModulePosition newModulePosition)
method SetState (line 111) | public void SetState(GraphyManager.ModuleState state, bool silentUpdat...
method RestorePreviousState (line 185) | public void RestorePreviousState()
method UpdateParameters (line 190) | public void UpdateParameters()
method RefreshParameters (line 204) | public void RefreshParameters()
method Init (line 222) | private void Init()
method SetGraphActive (line 241) | private void SetGraphActive(bool active)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsMonitor.cs
class G_FpsMonitor (line 21) | public class G_FpsMonitor : MonoBehaviour
method Awake (line 48) | private void Awake()
method Update (line 53) | private void Update()
method UpdateParameters (line 125) | public void UpdateParameters()
method Init (line 135) | private void Init()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsText.cs
class G_FpsText (line 20) | public class G_FpsText : MonoBehaviour
method Awake (line 55) | private void Awake()
method Update (line 60) | private void Update()
method UpdateParameters (line 103) | public void UpdateParameters()
method SetFpsRelatedTextColor (line 124) | private void SetFpsRelatedTextColor(Text text, float fps)
method Init (line 140) | private void Init()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Graph/G_Graph.cs
class G_Graph (line 18) | public abstract class G_Graph : MonoBehaviour
method UpdateGraph (line 25) | protected abstract void UpdateGraph();
method CreatePoints (line 30) | protected abstract void CreatePoints();
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/GraphyDebugger.cs
class GraphyDebugger (line 32) | public class GraphyDebugger : G_Singleton<GraphyDebugger>
method GraphyDebugger (line 41) | protected GraphyDebugger () { }
type DebugVariable (line 45) | public enum DebugVariable
type DebugComparer (line 57) | public enum DebugComparer
type ConditionEvaluation (line 66) | public enum ConditionEvaluation
type MessageType (line 73) | public enum MessageType
type DebugCondition (line 84) | [System.Serializable]
class DebugPacket (line 99) | [System.Serializable]
method Update (line 138) | public void Update()
method Executed (line 154) | public void Executed()
method Start (line 179) | private void Start()
method Update (line 186) | private void Update()
method AddNewDebugPacket (line 198) | public void AddNewDebugPacket(DebugPacket newDebugPacket)
method AddNewDebugPacket (line 206) | public void AddNewDebugPacket
method AddNewDebugPacket (line 231) | public void AddNewDebugPacket
method AddNewDebugPacket (line 256) | public void AddNewDebugPacket
method AddNewDebugPacket (line 281) | public void AddNewDebugPacket
method GetFirstDebugPacketWithId (line 308) | public DebugPacket GetFirstDebugPacketWithId(int packetId)
method GetAllDebugPacketsWithId (line 318) | public List<DebugPacket> GetAllDebugPacketsWithId(int packetId)
method RemoveFirstDebugPacketWithId (line 328) | public void RemoveFirstDebugPacketWithId(int packetId)
method RemoveAllDebugPacketsWithId (line 341) | public void RemoveAllDebugPacketsWithId(int packetId)
method AddCallbackToFirstDebugPacketWithId (line 354) | public void AddCallbackToFirstDebugPacketWithId(System.Action callback...
method AddCallbackToAllDebugPacketWithId (line 367) | public void AddCallbackToAllDebugPacketWithId(System.Action callback, ...
method CheckDebugPackets (line 388) | private void CheckDebugPackets()
method CheckIfConditionIsMet (line 460) | private bool CheckIfConditionIsMet(DebugCondition debugCondition)
method GetRequestedValueFromDebugVariable (line 485) | private float GetRequestedValueFromDebugVariable(DebugVariable debugVa...
method ExecuteOperationsInDebugPacket (line 518) | private void ExecuteOperationsInDebugPacket(DebugPacket debugPacket)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/GraphyManager.cs
class GraphyManager (line 32) | public class GraphyManager : G_Singleton<GraphyManager>
method GraphyManager (line 34) | protected GraphyManager () { }
type Mode (line 39) | public enum Mode
type ModuleType (line 45) | public enum ModuleType
type ModuleState (line 53) | public enum ModuleState
type ModulePosition (line 62) | public enum ModulePosition
type LookForAudioListener (line 71) | public enum LookForAudioListener
type ModulePreset (line 78) | public enum ModulePreset
method Start (line 354) | private void Start()
method OnDestroy (line 359) | private void OnDestroy()
method Update (line 365) | private void Update()
method OnApplicationFocus (line 373) | private void OnApplicationFocus(bool isFocused)
method SetModulePosition (line 387) | public void SetModulePosition(ModuleType moduleType, ModulePosition mo...
method SetModuleMode (line 407) | public void SetModuleMode(ModuleType moduleType, ModuleState moduleState)
method ToggleModes (line 429) | public void ToggleModes()
method SetPreset (line 443) | public void SetPreset(ModulePreset modulePreset)
method ToggleActive (line 539) | public void ToggleActive()
method Enable (line 551) | public void Enable()
method Disable (line 571) | public void Disable()
method Init (line 588) | private void Init()
method CheckForHotkeyPresses (line 625) | private void CheckForHotkeyPresses()
method CheckFor1KeyPress (line 773) | private bool CheckFor1KeyPress(Key key)
method CheckFor2KeyPress (line 785) | private bool CheckFor2KeyPress(Key key1, Key key2)
method CheckFor3KeyPress (line 798) | private bool CheckFor3KeyPress(Key key1, Key key2, Key key3)
method CheckFor1KeyPress (line 812) | private bool CheckFor1KeyPress(KeyCode key)
method CheckFor2KeyPress (line 817) | private bool CheckFor2KeyPress(KeyCode key1, KeyCode key2)
method CheckFor3KeyPress (line 823) | private bool CheckFor3KeyPress(KeyCode key1, KeyCode key2, KeyCode key3)
method UpdateAllParameters (line 830) | private void UpdateAllParameters()
method RefreshAllParameters (line 838) | private void RefreshAllParameters()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamGraph.cs
class G_RamGraph (line 24) | public class G_RamGraph : G_Graph
method Update (line 61) | private void Update()
method UpdateParameters (line 70) | public void UpdateParameters()
method UpdateGraph (line 125) | protected override void UpdateGraph()
method CreatePoints (line 175) | protected override void CreatePoints()
method Init (line 250) | private void Init()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamManager.cs
class G_RamManager (line 22) | public class G_RamManager : MonoBehaviour, IMovable, IModifiableState
method Awake (line 59) | private void Awake()
method Start (line 64) | private void Start()
method SetPosition (line 73) | public void SetPosition(GraphyManager.ModulePosition newModulePosition)
method SetState (line 117) | public void SetState(GraphyManager.ModuleState state, bool silentUpdat...
method RestorePreviousState (line 176) | public void RestorePreviousState()
method UpdateParameters (line 181) | public void UpdateParameters()
method RefreshParameters (line 194) | public void RefreshParameters()
method Init (line 211) | private void Init()
method SetGraphActive (line 229) | private void SetGraphActive(bool active)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamMonitor.cs
class G_RamMonitor (line 22) | public class G_RamMonitor : MonoBehaviour
method Update (line 34) | private void Update()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamText.cs
class G_RamText (line 20) | public class G_RamText : MonoBehaviour
method Awake (line 44) | private void Awake()
method Update (line 49) | private void Update()
method UpdateParameters (line 68) | public void UpdateParameters()
method Init (line 81) | private void Init()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Shader/G_GraphShader.cs
class G_GraphShader (line 23) | public class G_GraphShader
method InitializeShader (line 74) | public void InitializeShader()
method UpdateArray (line 91) | public void UpdateArray()
method UpdateAverage (line 99) | public void UpdateAverage()
method UpdateThresholds (line 107) | public void UpdateThresholds()
method UpdateColors (line 116) | public void UpdateColors()
method UpdatePoints (line 126) | public void UpdatePoints()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/UI/IModifiableState.cs
type IModifiableState (line 16) | public interface IModifiableState
method SetState (line 24) | void SetState(GraphyManager.ModuleState newState, bool silentUpdate);
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/UI/IMovable.cs
type IMovable (line 16) | public interface IMovable
method SetPosition (line 24) | void SetPosition(GraphyManager.ModulePosition newModulePosition);
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Util/G_ExtensionMethods.cs
class G_ExtensionMethods (line 20) | public static class G_ExtensionMethods
method SetAllActive (line 33) | public static List<GameObject> SetAllActive(this List<GameObject> game...
method SetOneActive (line 43) | public static List<Image> SetOneActive(this List<Image> images, int ac...
method SetAllActive (line 53) | public static List<Image> SetAllActive(this List<Image> images, bool a...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Util/G_FloatString.cs
class G_FloatString (line 18) | public static class G_FloatString
method Init (line 69) | public static void Init( float minNegativeValue, float maxPositiveValue )
method Dispose (line 93) | public static void Dispose()
method ToStringNonAlloc (line 108) | public static string ToStringNonAlloc(this float value)
method ToStringNonAlloc (line 135) | public static string ToStringNonAlloc(this float value, string format)
method ToInt (line 161) | public static int ToInt(this float f)
method ToFloat (line 175) | public static float ToFloat(this int i)
method ToIndex (line 184) | private static int ToIndex(this float f)
method FromIndex (line 189) | private static float FromIndex(this int i)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Util/G_Intstring.cs
class G_IntString (line 18) | public static class G_IntString
method Init (line 59) | public static void Init( int minNegativeValue, int maxPositiveValue )
method Dispose (line 84) | public static void Dispose()
method ToStringNonAlloc (line 99) | public static string ToStringNonAlloc(this int value)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Util/G_Singleton.cs
class G_Singleton (line 24) | public class G_Singleton<T> : MonoBehaviour where T : MonoBehaviour
method Awake (line 62) | void Awake()
method OnDestroy (line 74) | void OnDestroy()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Editor/src/PopulateLottieAnimations.cs
class PopulateLottieAnimationsWindow (line 9) | public class PopulateLottieAnimationsWindow : EditorWindow
method ShowWindow (line 16) | [MenuItem("Tools/Populate Lottie Animations")]
method OnEnable (line 22) | private void OnEnable()
method OnGUI (line 31) | private void OnGUI()
method PopulateLottieAnimations (line 75) | private void PopulateLottieAnimations()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Editor/src/StreamingAssetsChecker.cs
class StreamingAssetsChecker (line 8) | internal static class StreamingAssetsChecker
method CheckIfStreaminAssetsContainLottieFiles (line 15) | [InitializeOnLoadMethod]
method CopyFilesRecursively (line 61) | private static void CopyFilesRecursively(string sourcePath, string des...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/Data/LottieAnimations.cs
class LottieAnimations (line 5) | [CreateAssetMenu(fileName ="LottieAnimationsArray", menuName = "Data/Lot...
method SetAnimationsEditorCall (line 12) | public void SetAnimationsEditorCall(string[] animations)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/State/AppState.cs
class AppState (line 6) | internal class AppState : MonoBehaviour
method Start (line 11) | private void Start()
method OnDestroy (line 19) | private void OnDestroy()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/Storage/CanNotFindStickerPackException.cs
class CanNotFindStickerPackException (line 3) | internal class CanNotFindStickerPackException : System.Exception
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/Storage/TelegramStickerStorage.cs
class TelegramStickerStorage (line 10) | internal sealed class TelegramStickerStorage : System.IDisposable
method TelegramStickerStorage (line 23) | internal TelegramStickerStorage(string botKey)
method Dispose (line 29) | public void Dispose()
method DownloadTelegramStickersPackAsync (line 39) | public async Task<string[]> DownloadTelegramStickersPackAsync(string p...
method DownloadTelegramStickersPackIfNecessaryAsync (line 76) | public Task<string[]> DownloadTelegramStickersPackIfNecessaryAsync(str...
method UnpackLocalTgsFilesToJsonFilesAsync (line 98) | public async Task<string[]> UnpackLocalTgsFilesToJsonFilesAsync(string...
method UnpackLocalTgsFilesToJsonFilesIfNecessaryAsync (line 129) | public Task<string[]> UnpackLocalTgsFilesToJsonFilesIfNecessaryAsync(s...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/AnimationPreview.cs
class AnimationPreview (line 6) | internal sealed class AnimationPreview : MonoBehaviour, System.IDisposable
method InitFromFile (line 17) | internal void InitFromFile(string jsonFilePath, uint width, uint height)
method InitFromData (line 23) | internal void InitFromData(uint width, uint height)
method Dispose (line 34) | public void Dispose()
method DoUpdate (line 40) | internal void DoUpdate()
method DoUpdateAsync (line 48) | internal void DoUpdateAsync()
method DoDrawOneFrameAsyncGetResult (line 56) | internal void DoDrawOneFrameAsyncGetResult()
method DisableAnimation (line 65) | internal void DisableAnimation()
method EnableAnimation (line 70) | internal void EnableAnimation()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/AnimationsHomeScreen.cs
class AnimationsHomeScreen (line 5) | internal sealed class AnimationsHomeScreen : MonoBehaviour, System.IDisp...
method Init (line 12) | internal void Init(string[] animationPaths)
method Dispose (line 18) | public void Dispose()
method OnTextureSizeDropdownValueChanged (line 24) | private void OnTextureSizeDropdownValueChanged(int index)
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/ExploreTelegramStickers.cs
class ExploreTelegramStickers (line 6) | internal sealed class ExploreTelegramStickers : MonoBehaviour, System.ID...
method Init (line 20) | internal void Init()
method Dispose (line 34) | public void Dispose()
method Update (line 43) | private void Update()
method OnTokenInputFieldValueChanged (line 55) | private void OnTokenInputFieldValueChanged(string value)
method OnStickerPackNameInputFieldSubmit (line 60) | private void OnStickerPackNameInputFieldSubmit(string value)
method OnFindButtonClick (line 64) | private void OnFindButtonClick()
method CreateStorageIfTokenIsNotEmpty (line 68) | private void CreateStorageIfTokenIsNotEmpty()
method DisposeStorageIfNecessary (line 78) | private void DisposeStorageIfNecessary()
method LoadTelegramStickersIfNecessary (line 86) | private async void LoadTelegramStickersIfNecessary()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/LottieAnimationsPreview.cs
class LottieAnimationsPreview (line 8) | internal sealed class LottieAnimationsPreview : MonoBehaviour, System.ID...
method Init (line 24) | internal void Init(string[] animationPaths, uint textureSize)
method Dispose (line 56) | public void Dispose()
method RestartCoroutine (line 71) | private void RestartCoroutine()
method OnEnable (line 79) | private void OnEnable()
method OnScrollRectValueChanged (line 84) | private void OnScrollRectValueChanged(Vector2 scrollPosition)
method RenderLottieAnimationCoroutine (line 104) | private IEnumerator RenderLottieAnimationCoroutine()
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/LottiePlayerScreen.cs
class LottiePlayerScreen (line 8) | public class LottiePlayerScreen : MonoBehaviour, System.IDisposable
method Init (line 23) | internal void Init(string[] animationPaths, string[] animations)
method Dispose (line 46) | public void Dispose()
method Update (line 63) | private void Update()
method OnAnimationDropdownValueChanged (line 75) | private void OnAnimationDropdownValueChanged(int newValue)
method OnPlayPositionSliderValueChanged (line 93) | private void OnPlayPositionSliderValueChanged(float newValue)
method OnPlayPauseButtonClick (line 101) | private void OnPlayPauseButtonClick(int currentStateIndex, LottiePlugi...
method OnNextAnimationClick (line 105) | private void OnNextAnimationClick(int currentStateIndex, LottiePlugin....
FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/MainMenu.cs
class MainMenu (line 6) | internal sealed class MainMenu : MonoBehaviour, System.IDisposable
method Init (line 20) | internal void Init(string[] animationPaths, string[] animations)
method Dispose (line 34) | public void Dispose()
method UpdateTheButtonsPositions (line 45) | private void UpdateTheButtonsPositions()
method UpdateActiveButtonPosition (line 55) | private void UpdateActiveButtonPosition(Transform transform)
method OnHomeButtonClick (line 61) | private void OnHomeButtonClick(int stateIndex, AnimatedButton.State st...
method OnPlayerButtonClick (line 68) | private void OnPlayerButtonClick(int stateIndex, AnimatedButton.State ...
method OnExploreButtonClick (line 75) | private void OnExploreButtonClick(int stateIndex, AnimatedButton.State...
method On3dObjectsButtonClick (line 82) | private void On3dObjectsButtonClick(int stateIndex, AnimatedButton.Sta...
FILE: unity/RLottieUnity/Assets/LottiePlugin/Tests/Runtime/src/AnimatedImageTests.cs
class AnimatedImageTests (line 9) | public class AnimatedImageTests
method SetUp (line 14) | [SetUp]
method TearDown (line 24) | [TearDown]
method CheckAwakeFunctionality (line 30) | [UnityTest]
method CheckStartFunctionalityWithNoJsonAnimation (line 37) | [UnityTest]
method CheckStartFunctionalityWithJsonAnimation (line 45) | [UnityTest]
method CheckPlayFunctionality (line 55) | [UnityTest]
method CheckStopFunctionality (line 64) | [UnityTest]
method CheckTextureDimensions (line 75) | [UnityTest]
method CheckDisposeFunctionality (line 84) | [UnityTest]
Copy disabled (too large)
Download .json
Condensed preview — 697 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (26,929K chars).
[
{
"path": ".editorconfig",
"chars": 9135,
"preview": "# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017\n\n# top-most "
},
{
"path": ".gitattributes",
"chars": 600,
"preview": "# Sources\r\n*.c text diff=c\r\n*.cc text diff=cpp\r\n*.cxx text diff=cpp\r\n*.cpp text diff=cpp\r\n*.c++ text diff=c"
},
{
"path": ".github/workflows/activation.yaml",
"chars": 602,
"preview": "name: Acquire activation file\non:\n workflow_dispatch: {}\njobs:\n activation:\n name: Request manual activation file 🔑"
},
{
"path": ".github/workflows/build_native_libraries.yaml",
"chars": 17457,
"preview": "name: Build and Test\n\non:\n push:\n branches:\n - dev\n - codex/remove-texture.apply-and-move-updates-to-nativ"
},
{
"path": ".gitignore",
"chars": 49,
"preview": ".vs\n.vscode\nprojects/CMake/build*\nout/*\n.DS_Store"
},
{
"path": ".gitmodules",
"chars": 264,
"preview": "[submodule \"dependency/rlottie\"]\n\tpath = dependency/rlottie\n\turl = git@github.com:gindemit/rlottie.git\n\tbranch = unity-r"
},
{
"path": "AGENTS.md",
"chars": 2730,
"preview": "# Unity RLottie Plugin\n\nThis repository hosts a Unity plugin that brings the [rlottie](https://github.com/Samsung/rlotti"
},
{
"path": "LICENSE",
"chars": 1076,
"preview": "MIT License\n\nCopyright (c) 2023 Gindemit Konstantin\n\nPermission is hereby granted, free of charge, to any person obtaini"
},
{
"path": "README.md",
"chars": 6042,
"preview": "# Unity Lottie Animation Plugin\n\n![Un"
},
{
"path": "dependency/pixman/pixman-arm-intrisics.cpp",
"chars": 1815,
"preview": "#include <arm_neon.h>\n\nextern \"C\" void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,\n "
},
{
"path": "dependency/pixman/pixman-arm-neon-asm.S",
"chars": 19929,
"preview": "/*\n * Copyright © 2009 Nokia Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n "
},
{
"path": "dependency/pixman/pixman-arm-neon-asm.h",
"chars": 37636,
"preview": "/*\n * Copyright © 2009 Nokia Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n "
},
{
"path": "dependency/pixman/pixman-arma64-neon-asm.S",
"chars": 16531,
"preview": "/*\n * Copyright © 2009 Nokia Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n "
},
{
"path": "dependency/pixman/pixman-arma64-neon-asm.h",
"chars": 40685,
"preview": "/*\n * Copyright © 2009 Nokia Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n "
},
{
"path": "dependency/pixman/pixman-cpp-standard.cpp",
"chars": 1066,
"preview": "#include <memory>\n\n#define BYTE_MUL(c, a) \\\n ((((((c) >> 8) & 0x00ff00ff) * (a)) & 0"
},
{
"path": "projects/AndroidStudio/.gitignore",
"chars": 225,
"preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor."
},
{
"path": "projects/AndroidStudio/.idea/.gitignore",
"chars": 50,
"preview": "# Default ignored files\r\n/shelf/\r\n/workspace.xml\r\n"
},
{
"path": "projects/AndroidStudio/.idea/.name",
"chars": 12,
"preview": "UnityRLottie"
},
{
"path": "projects/AndroidStudio/.idea/compiler.xml",
"chars": 174,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n <component name=\"CompilerConfiguration\">\r\n <bytecode"
},
{
"path": "projects/AndroidStudio/.idea/gradle.xml",
"chars": 813,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n <component name=\"GradleMigrationSettings\" migrationVers"
},
{
"path": "projects/AndroidStudio/.idea/misc.xml",
"chars": 364,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n <component name=\"ProjectRootManager\" version=\"2\" langua"
},
{
"path": "projects/AndroidStudio/.idea/vcs.xml",
"chars": 191,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n <component name=\"VcsDirectoryMappings\">\r\n <mapping d"
},
{
"path": "projects/AndroidStudio/app/.gitignore",
"chars": 13,
"preview": "/build\r\n/.cxx"
},
{
"path": "projects/AndroidStudio/app/build.gradle",
"chars": 1676,
"preview": "plugins {\n id 'com.android.application'\n}\n\nandroid {\n namespace 'com.gindemit.rlottie'\n compileSdk 33\n ndkVe"
},
{
"path": "projects/AndroidStudio/app/proguard-rules.pro",
"chars": 750,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "projects/AndroidStudio/app/src/androidTest/java/com/gindemit/rlottie/ExampleInstrumentedTest.java",
"chars": 754,
"preview": "package com.gindemit.rlottie;\n\nimport android.content.Context;\n\nimport androidx.test.platform.app.InstrumentationRegistr"
},
{
"path": "projects/AndroidStudio/app/src/main/AndroidManifest.xml",
"chars": 756,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <appl"
},
{
"path": "projects/AndroidStudio/app/src/main/java/com/gindemit/rlottie/MainActivity.java",
"chars": 969,
"preview": "package com.gindemit.rlottie;\n\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport android.os.Bundle;\nimport androi"
},
{
"path": "projects/AndroidStudio/app/src/main/res/drawable/ic_launcher_background.xml",
"chars": 5606,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "projects/AndroidStudio/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
"chars": 1702,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:aapt=\"http://schemas.android.com/aapt\"\n "
},
{
"path": "projects/AndroidStudio/app/src/main/res/layout/activity_main.xml",
"chars": 818,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "projects/AndroidStudio/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "projects/AndroidStudio/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "projects/AndroidStudio/app/src/main/res/values/colors.xml",
"chars": 378,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"purple_200\">#FFBB86FC</color>\n <color name=\"purpl"
},
{
"path": "projects/AndroidStudio/app/src/main/res/values/strings.xml",
"chars": 74,
"preview": "<resources>\n <string name=\"app_name\">UnityRLottie</string>\n</resources>"
},
{
"path": "projects/AndroidStudio/app/src/main/res/values/themes.xml",
"chars": 834,
"preview": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Base application theme. -->\n <style name=\"Theme.U"
},
{
"path": "projects/AndroidStudio/app/src/main/res/values-night/themes.xml",
"chars": 834,
"preview": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Base application theme. -->\n <style name=\"Theme.U"
},
{
"path": "projects/AndroidStudio/app/src/test/java/com/gindemit/rlottie/ExampleUnitTest.java",
"chars": 381,
"preview": "package com.gindemit.rlottie;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test"
},
{
"path": "projects/AndroidStudio/build.gradle",
"chars": 458,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n re"
},
{
"path": "projects/AndroidStudio/gradle/wrapper/gradle-wrapper.properties",
"chars": 238,
"preview": "#Sat Nov 13 22:19:53 CET 2021\r\ndistributionBase=GRADLE_USER_HOME\r\ndistributionUrl=https\\://services.gradle.org/distribut"
},
{
"path": "projects/AndroidStudio/gradle.properties",
"chars": 1093,
"preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
},
{
"path": "projects/AndroidStudio/gradlew",
"chars": 5766,
"preview": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "projects/AndroidStudio/gradlew.bat",
"chars": 2763,
"preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
},
{
"path": "projects/AndroidStudio/settings.gradle",
"chars": 287,
"preview": "dependencyResolutionManagement {\n repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n repositories {\n "
},
{
"path": "projects/CMake/.gitignore",
"chars": 184,
"preview": "CMakeLists.txt.user\r\nCMakeCache.txt\r\nCMakeFiles\r\nCMakeScripts\r\nTesting\r\nMakefile\r\ncmake_install.cmake\r\ninstall_manifest."
},
{
"path": "projects/CMake/CMakeLists.txt",
"chars": 7998,
"preview": "# CMakeList.txt : CMake project for LottiePlugin, include source and define\r\ncmake_minimum_required (VERSION 3.6)\r\n\r\n#se"
},
{
"path": "projects/CMake/CMakeSettings.json",
"chars": 1493,
"preview": "{\r\n \"configurations\": [\r\n {\r\n \"name\": \"x64-Debug\",\r\n \"generator\": \"Ninja\",\r\n \"configurationType\": \"D"
},
{
"path": "src/ExportApi.h",
"chars": 312,
"preview": "#ifndef _EXPORT_API_H_\n#define _EXPORT_API_H_\n\n#if defined(__EMSCRIPTEN__)\n #include <emscripten/emscripten.h>\n #defin"
},
{
"path": "src/LottiePlugin.cpp",
"chars": 4869,
"preview": "#include \"LottiePlugin.h\"\n#include \"vdebug.h\"\n\nextern \"C\" {\n\n static lottie_animation_wrapper* create_animation_wrapp"
},
{
"path": "src/LottiePlugin.h",
"chars": 1819,
"preview": "#ifndef _VORBIS_PLUGIN_H_\n#define _VORBIS_PLUGIN_H_\n\n#include \"ExportApi.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#incl"
},
{
"path": "unity/RLottieUnity/.editorconfig",
"chars": 257,
"preview": "# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017\n\n# top-most "
},
{
"path": "unity/RLottieUnity/.gitignore",
"chars": 1023,
"preview": "# This .gitignore file should be placed at the root of your Unity project directory\r\n#\r\n# Get latest from https://github"
},
{
"path": "unity/RLottieUnity/.vsconfig",
"chars": 99,
"preview": "{\n \"version\": \"1.0\",\n \"components\": [ \n \"Microsoft.VisualStudio.Workload.ManagedGame\"\n ]\n} \n"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/LottiePlugin.Editor.asmdef",
"chars": 402,
"preview": "{\n \"name\": \"LottiePlugin.Editor\",\n \"references\": [\n \"GUID:2511835434a4c014d9d18a4681bf1136\"\n ],\n \"inc"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/LottiePlugin.Editor.asmdef.meta",
"chars": 166,
"preview": "fileFormatVersion: 2\nguid: fbc69261922547442af6ce2b4f7f8318\nAssemblyDefinitionImporter:\n externalObjects: {}\n userData"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedButtonEditor.cs",
"chars": 12514,
"preview": "#if UNITY_EDITOR\nusing System.Text;\nusing UnityEditor;\nusing UnityEditor.UI;\nusing UnityEditorInternal;\nusing UnityEngin"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedButtonEditor.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 4748ea48fc23cd04f84ebb4333de8cd5\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedImageEditor.cs",
"chars": 6246,
"preview": "#if UNITY_EDITOR\nusing System.Text;\nusing UnityEditor;\nusing UnityEngine;\n\nnamespace LottiePlugin.UI.Editor\n{\n [Custo"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedImageEditor.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 849d0cdde8e851240ae6d1fb559f256a\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/OpenPersistentDataPathFolder.cs",
"chars": 352,
"preview": "using UnityEditor;\r\nusing UnityEngine;\r\n\r\nnamespace MyEditor.Menu\r\n{\r\n internal static class OpenPersistentDataPathFo"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/OpenPersistentDataPathFolder.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: c7e8f23675e57ea45ba5ec2bcb0ba68d\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: d5d1324eb0130f84a986bcd8f3169be0\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Editor.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 17417d3e71704134986dd3a95c59bd56\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/arm64-v8a/libLottiePlugin.so.meta",
"chars": 1769,
"preview": "fileFormatVersion: 2\nguid: 9979f9cdf97890a4294636e42f8d6b09\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/arm64-v8a.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 801a6ec6f5f938949a8d09beef48a4a6\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/armeabi-v7a/libLottiePlugin.so.meta",
"chars": 1772,
"preview": "fileFormatVersion: 2\nguid: 2c80d7a027bdec245b63d96df51fca6f\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/armeabi-v7a.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: fd6f97734e4c98a4ead99d4c9d8c94d6\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86/libLottiePlugin.so.meta",
"chars": 1770,
"preview": "fileFormatVersion: 2\nguid: f3abf920cc86fd14b8bce9ef9cfd0a1e\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: fc810c8bf266cb34eb889bdd809983b9\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86_64/libLottiePlugin.so.meta",
"chars": 1772,
"preview": "fileFormatVersion: 2\nguid: b46637c2d6cfbf34caaec0ac6fe28060\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86_64.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: e32f62b9c1154cc4eba1944fe7cfcab1\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 24158343e8bbd8e458b94aecb46e58bb\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux/x86_64/libLottiePlugin.so.meta",
"chars": 1317,
"preview": "fileFormatVersion: 2\nguid: b7374bb31a258ebe49f95ff1092573b7\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux/x86_64.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 7146e101b78799b4284df5c9d17af42a\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 7393f7fda2beb6241b6174ece6283a9e\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/OSX/libLottiePlugin.dylib.meta",
"chars": 1524,
"preview": "fileFormatVersion: 2\nguid: 7e05edcb1cc5a4944adb53efc7b936ea\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/OSX.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: ac961d6817f1b49f1b1a512bf728e930\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/LottiePlugin.bc.meta",
"chars": 1601,
"preview": "fileFormatVersion: 2\nguid: 802189a482d5445e38e17bd66bff4025\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/libLottiePlugin.a.meta",
"chars": 1773,
"preview": "fileFormatVersion: 2\nguid: 27f7c518adc62ff4ca72e224a4174916\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/librlottie.a.meta",
"chars": 1773,
"preview": "fileFormatVersion: 2\nguid: 947404206898326488621deb8a96fa4b\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: c415353a7bdb74ee281fa32aae79b464\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86/LottiePlugin.dll.meta",
"chars": 1770,
"preview": "fileFormatVersion: 2\nguid: 4a32b4e01daae5b41818751d844d8234\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: b487f6482c7c4e34fbff765a11b1cd00\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86_64/LottiePlugin.dll.meta",
"chars": 1773,
"preview": "fileFormatVersion: 2\nguid: c82ab44078100784c96c6a72bc0685ba\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86_64.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 2a46775488083fc4d913f12fcba9f0c1\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 811705017c1ec9e4a88d14d0d8336147\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/libLottiePlugin.a.meta",
"chars": 1522,
"preview": "fileFormatVersion: 2\nguid: 9de81b1084cc14811b0a512e6c3aa72f\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/librlottie.a.meta",
"chars": 1522,
"preview": "fileFormatVersion: 2\nguid: b1aa33924a83c484083a3eb8fd7ca7bd\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64/libLottiePlugin.a.meta",
"chars": 1692,
"preview": "fileFormatVersion: 2\nguid: 776e704a5a10eaa4fad8bc0f1f5ff958\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64/librlottie.a.meta",
"chars": 1692,
"preview": "fileFormatVersion: 2\nguid: 73eef34f40a57d94084e509395e2e853\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 3318df43de3eda14cae18710be5be1e6\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: f383d3ea0acac42dcb91af51564d8340\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: bf81dc9040a9db846b53e8d34f1e15a7\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/AssemblyAttributes.cs",
"chars": 155,
"preview": "using System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"LottiePlugin.Editor\")]\n[assembly: InternalsVisibl"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/AssemblyAttributes.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 9aa4083744b9fe34a9d1dfd1d5c8bc90\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/LottiePlugin.Runtime.asmdef",
"chars": 327,
"preview": "{\n \"name\": \"LottiePlugin.Runtime\",\n \"references\": [],\n \"includePlatforms\": [],\n \"excludePlatforms\": [],\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/LottiePlugin.Runtime.asmdef.meta",
"chars": 166,
"preview": "fileFormatVersion: 2\nguid: 2511835434a4c014d9d18a4681bf1136\nAssemblyDefinitionImporter:\n externalObjects: {}\n userData"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimation.cs",
"chars": 6760,
"preview": "using LottiePlugin.Utility;\nusing System;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing Unity.Collections"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimation.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 837b9dc5354525641903bac7adb98b6a\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimationsAtlas.cs",
"chars": 9525,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServi"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimationsAtlas.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 271cc01adb53c7945bfd4ded2088874e\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/NativeBridge.cs",
"chars": 4056,
"preview": "using System;\nusing System.Runtime.InteropServices;\nusing UnityEngine;\n\nnamespace LottiePlugin\n{\n [StructLayout(Layou"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/NativeBridge.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: cafc31676b56ff0479ed5f2929c80f50\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FIleSizeFormatter.cs",
"chars": 1800,
"preview": "namespace LottiePlugin.Support\r\n{\r\n public static class FIleSizeFormatter\r\n {\r\n private static readonly str"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FIleSizeFormatter.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 5b60aac282992a04faf2c428d9461e9f\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FilesHelper.cs",
"chars": 1738,
"preview": "using System.IO;\nusing UnityEngine;\n\nnamespace LottiePlugin.Support\n{\n public static class FilesHelper\n {\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FilesHelper.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 5142b9d6649d413429bc44b000c65542\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/StreamingAssetsHelper.cs",
"chars": 979,
"preview": "using System.IO;\n\nnamespace LottiePlugin.Support\n{\n public static class StreamingAssetsHelper\n {\n public st"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/StreamingAssetsHelper.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 15f6afe52c432724aaa79f9b850c4d62\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 6ab7aed18ac8fef40af90d11627b213c\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedButton.cs",
"chars": 5172,
"preview": "using System.Collections;\nusing UnityEngine;\nusing UnityEngine.EventSystems;\nusing UnityEngine.Serialization;\nusing Unit"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedButton.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 3021768183fd1164198729d595c17231\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedImage.cs",
"chars": 6585,
"preview": "using System.Collections;\nusing UnityEngine;\nusing UnityEngine.Events;\nusing UnityEngine.UI;\n\nnamespace LottiePlugin.UI\n"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedImage.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: dd340d501d30f364781da00b0938e032\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: a8c6c0d2ec2d29543bf1ed3638ed4390\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Utility/ThrowIf.cs",
"chars": 3099,
"preview": "using System;\nusing System.Collections;\n\nnamespace LottiePlugin.Utility\n{\n public static class ThrowIf\n {\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Utility/ThrowIf.cs.meta",
"chars": 243,
"preview": "fileFormatVersion: 2\nguid: 64e429e2f957f704b88a11edde317669\nMonoImporter:\n externalObjects: {}\n serializedVersion: 2\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Utility.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: 1547b3a830b337141a4e7326f228cae9\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: f0f30590af313224495bc547b6c74ef2\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: f6510d9a8a0ff6c4ea6f124d613c350c\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/Newtonsoft.Json.dll.meta",
"chars": 1542,
"preview": "fileFormatVersion: 2\nguid: 97604fef140520c4bbbf28c4ab295281\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/System.Buffers.dll.meta",
"chars": 1397,
"preview": "fileFormatVersion: 2\nguid: 44eab852d4878a64f851dc501431d94b\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/System.Memory.dll.meta",
"chars": 1397,
"preview": "fileFormatVersion: 2\nguid: 392ba60219e281e45a32762ec090e222\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/System.Threading.Tasks.Extensions.dll.meta",
"chars": 1397,
"preview": "fileFormatVersion: 2\nguid: 276ed90f3c1d6e64991704c19b801824\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/Telegram.Bot.dll.meta",
"chars": 1397,
"preview": "fileFormatVersion: 2\nguid: d7aef7f374e3e944786e7a15fde417d9\nPluginImporter:\n externalObjects: {}\n serializedVersion: 2"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls.meta",
"chars": 172,
"preview": "fileFormatVersion: 2\nguid: c72ccb32fe8c9294fbef7e5399eeb188\nfolderAsset: yes\nDefaultImporter:\n externalObjects: {}\n us"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Changelog.txt",
"chars": 6060,
"preview": "-----------------------------\r\nv2.1.3\r\n\r\n- Added null check for Keyboard.current.\r\n\r\n-----------------------------\r\nv2.1"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Changelog.txt.meta",
"chars": 232,
"preview": "fileFormatVersion: 2\r\nguid: 425066d07b7c1204887be96c53348ac6\r\nlabels:\r\n- counter\r\n- fps\r\n- graphy\r\n- tayx\r\ntimeCreated: "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs",
"chars": 22191,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs.meta",
"chars": 276,
"preview": "fileFormatVersion: 2\r\nguid: 4a96825e094d61441b5247d0c32652b3\r\ntimeCreated: 1514907656\r\nlicenseType: Store\r\nMonoImporter:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs",
"chars": 4116,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs.meta",
"chars": 254,
"preview": "fileFormatVersion: 2\r\nguid: 1bb06e7c222a60f47a476e2648224330\r\nMonoImporter:\r\n externalObjects: {}\r\n serializedVersion:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs",
"chars": 28932,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs.meta",
"chars": 254,
"preview": "fileFormatVersion: 2\r\nguid: f01a5c28e5127404da343db2a7409c10\r\nMonoImporter:\r\n externalObjects: {}\r\n serializedVersion:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs",
"chars": 2611,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs.meta",
"chars": 254,
"preview": "fileFormatVersion: 2\r\nguid: 68962e071a0ce0549a853f10c6af3f54\r\nMonoImporter:\r\n externalObjects: {}\r\n serializedVersion:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef",
"chars": 564,
"preview": "{\r\n \"name\": \"Tayx.Graphy.Editor\",\r\n \"references\": [\r\n \"GUID:18e5109d897e1b244ab2dfeaf5482c7b\"\r\n ],\r\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef.meta",
"chars": 173,
"preview": "fileFormatVersion: 2\r\nguid: 9c59a049deefdf64bbbaa730a340bb3f\r\nAssemblyDefinitionImporter:\r\n externalObjects: {}\r\n user"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor.meta",
"chars": 180,
"preview": "fileFormatVersion: 2\r\nguid: 74026f7916b08a343916493b0a1752cc\r\nfolderAsset: yes\r\nDefaultImporter:\r\n externalObjects: {}\r"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt",
"chars": 734,
"preview": "Eric Tirado - NORTHWEST - BOLD, ROUGH - BETA\r\n\r\nVersion 0.6 2016\r\n______________________________________________________"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta",
"chars": 204,
"preview": "fileFormatVersion: 2\r\nguid: 67bbd8c5103323b4688fcfa3abe68927\r\nlabels:\r\n- font\r\ntimeCreated: 1516718196\r\nlicenseType: Sto"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/NORTHWEST-B.otf.meta",
"chars": 471,
"preview": "fileFormatVersion: 2\r\nguid: d523cde1d178d7c4ca6bb724b9d5213e\r\nlabels:\r\n- font\r\ntimeCreated: 1516718196\r\nlicenseType: Sto"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold.meta",
"chars": 202,
"preview": "fileFormatVersion: 2\r\nguid: 2b891f35198da7642a30fd430ae0d619\r\nfolderAsset: yes\r\ntimeCreated: 1516718193\r\nlicenseType: St"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt",
"chars": 11560,
"preview": "\r\n Apache License\r\n Version 2.0, January 2004\r\n "
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt.meta",
"chars": 204,
"preview": "fileFormatVersion: 2\r\nguid: eb908df110bf2314d94d245f8a338830\r\nlabels:\r\n- font\r\ntimeCreated: 1515073036\r\nlicenseType: Sto"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Bold.ttf.meta",
"chars": 538,
"preview": "fileFormatVersion: 2\r\nguid: 9568ece128856a54cbc1060379ab498d\r\nlabels:\r\n- font\r\ntimeCreated: 1515090903\r\nlicenseType: Sto"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Regular.ttf.meta",
"chars": 538,
"preview": "fileFormatVersion: 2\r\nguid: 76ed11d84beb10846a746b4259e26d39\r\nlabels:\r\n- font\r\ntimeCreated: 1515073036\r\nlicenseType: Sto"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto.meta",
"chars": 202,
"preview": "fileFormatVersion: 2\r\nguid: 37f53a7f00580aa4fa7797d9308063e7\r\nfolderAsset: yes\r\ntimeCreated: 1515073036\r\nlicenseType: St"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font.meta",
"chars": 202,
"preview": "fileFormatVersion: 2\r\nguid: 3ac48df14c942a247a9e31f953e82768\r\nfolderAsset: yes\r\ntimeCreated: 1511635919\r\nlicenseType: St"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/GUI/GraphyGUISkin.guiskin",
"chars": 37909,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!114 &11400000\r\nMonoBehaviour:\r\n m_ObjectHideFlags: 0\r\n m_Correspondi"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/GUI/GraphyGUISkin.guiskin.meta",
"chars": 205,
"preview": "fileFormatVersion: 2\r\nguid: 663039f397abaa648854c3b8ef8f4256\r\nlabels:\r\n- gui\r\ntimeCreated: 1513980352\r\nlicenseType: Stor"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/GUI.meta",
"chars": 202,
"preview": "fileFormatVersion: 2\r\nguid: 88ea372125bb21f49adbb31579e66715\r\nfolderAsset: yes\r\ntimeCreated: 1513980359\r\nlicenseType: St"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/LICENSE",
"chars": 1089,
"preview": "MIT License\r\n\r\nCopyright (c) 2018 Martín Pane\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/LICENSE.meta",
"chars": 162,
"preview": "fileFormatVersion: 2\r\nguid: 7dcb986197a7fca43a1547994c1e7ad8\r\nDefaultImporter:\r\n externalObjects: {}\r\n userData: \r\n a"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Graph.mat",
"chars": 2523,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n serializedVersion: 6\r\n m_ObjectHideFlags: 0"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Graph.mat.meta",
"chars": 266,
"preview": "fileFormatVersion: 2\r\nguid: 61a418be8e5d13c448865432314f8277\r\nlabels:\r\n- audio\r\n- graph\r\n- material\r\n- shader\r\n- spectro"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Highest_Values_Graph.mat",
"chars": 2536,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n serializedVersion: 6\r\n m_ObjectHideFlags: 0"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Highest_Values_Graph.mat.meta",
"chars": 266,
"preview": "fileFormatVersion: 2\r\nguid: a65c67e8efa392e4faaf526ab060ac88\r\nlabels:\r\n- audio\r\n- graph\r\n- material\r\n- shader\r\n- spectro"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/FPS_Graph.mat",
"chars": 2593,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n serializedVersion: 6\r\n m_ObjectHideFlags: 0"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/FPS_Graph.mat.meta",
"chars": 267,
"preview": "fileFormatVersion: 2\r\nguid: 8a88e148dbc2d0f45a027f72e59aee4d\r\nlabels:\r\n- counter\r\n- fps\r\n- graph\r\n- material\r\n- monitor\r"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Allocated_Graph.mat",
"chars": 2603,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n serializedVersion: 6\r\n m_ObjectHideFlags: 0"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Allocated_Graph.mat.meta",
"chars": 268,
"preview": "fileFormatVersion: 2\r\nguid: 6b025b045db969e4988a6267cc04938d\r\nlabels:\r\n- counter\r\n- graph\r\n- material\r\n- memory\r\n- monit"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Mono_Graph.mat",
"chars": 2568,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n serializedVersion: 6\r\n m_ObjectHideFlags: 0"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Mono_Graph.mat.meta",
"chars": 268,
"preview": "fileFormatVersion: 2\r\nguid: cb5c252f19f1cd2448f88d7f9dd989e8\r\nlabels:\r\n- counter\r\n- graph\r\n- material\r\n- memory\r\n- monit"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Reserved_Graph.mat",
"chars": 2599,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n serializedVersion: 6\r\n m_ObjectHideFlags: 0"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Reserved_Graph.mat.meta",
"chars": 268,
"preview": "fileFormatVersion: 2\r\nguid: 5ec99183bcca10249ac54cd6dcee6372\r\nlabels:\r\n- counter\r\n- graph\r\n- material\r\n- memory\r\n- monit"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials.meta",
"chars": 202,
"preview": "fileFormatVersion: 2\r\nguid: c859b3e9d83661640842bbb8989b021a\r\nfolderAsset: yes\r\ntimeCreated: 1511697723\r\nlicenseType: St"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/ADVANCED - Module.prefab",
"chars": 27684,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &3842867399166853360\r\nGameObject:\r\n m_ObjectHideFlags: 0\r\n m_Corre"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/ADVANCED - Module.prefab.meta",
"chars": 161,
"preview": "fileFormatVersion: 2\r\nguid: 8e60b58e9eec36e46ba32caf55a802f4\r\nPrefabImporter:\r\n externalObjects: {}\r\n userData: \r\n as"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/AUDIO - Module.prefab",
"chars": 20670,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &8023522192042546097\r\nGameObject:\r\n m_ObjectHideFlags: 0\r\n m_Corre"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/AUDIO - Module.prefab.meta",
"chars": 161,
"preview": "fileFormatVersion: 2\r\nguid: 78081648e28527242bb334a6bdf7bfce\r\nPrefabImporter:\r\n externalObjects: {}\r\n userData: \r\n as"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/FPS - Module.prefab",
"chars": 44163,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &6364973415932893355\r\nGameObject:\r\n m_ObjectHideFlags: 0\r\n m_Corre"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/FPS - Module.prefab.meta",
"chars": 161,
"preview": "fileFormatVersion: 2\r\nguid: fed2d45066a6d2a4191aa0c744a03147\r\nPrefabImporter:\r\n externalObjects: {}\r\n userData: \r\n as"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/RAM - Module.prefab",
"chars": 43141,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &824167088398547643\r\nGameObject:\r\n m_ObjectHideFlags: 0\r\n m_Corres"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/RAM - Module.prefab.meta",
"chars": 161,
"preview": "fileFormatVersion: 2\r\nguid: 6387d68cbe02d2d4fb8912f794606585\r\nPrefabImporter:\r\n externalObjects: {}\r\n userData: \r\n as"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal.meta",
"chars": 180,
"preview": "fileFormatVersion: 2\r\nguid: 1551dbe188c02e544b8dd95d263ae1a3\r\nfolderAsset: yes\r\nDefaultImporter:\r\n externalObjects: {}\r"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/[Graphy].prefab",
"chars": 24169,
"preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &177638\r\nGameObject:\r\n m_ObjectHideFlags: 0\r\n m_CorrespondingSourc"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/[Graphy].prefab.meta",
"chars": 326,
"preview": "fileFormatVersion: 2\r\nguid: 0abab5bb77339e4428787a870eb31bd3\r\nlabels:\r\n- audio\r\n- counter\r\n- debugger\r\n- fps\r\n- graph\r\n-"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab.meta",
"chars": 202,
"preview": "fileFormatVersion: 2\r\nguid: 3be1e89ca880cc644a2aa20d1854250c\r\nfolderAsset: yes\r\ntimeCreated: 1511555560\r\nlicenseType: St"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/README.md",
"chars": 5739,
"preview": "# Graphy - Ultimate FPS Counter - Stats Monitor & Debugger (Unity)\r\n\r\n[ (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Advanced/G_AdvancedData.cs.meta",
"chars": 276,
"preview": "fileFormatVersion: 2\r\nguid: 5c1019d31db77fd468164577146737ad\r\ntimeCreated: 1512484835\r\nlicenseType: Store\r\nMonoImporter:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Advanced.meta",
"chars": 202,
"preview": "fileFormatVersion: 2\r\nguid: 1ac38d39b5dd9f442a088b7284b58236\r\nfolderAsset: yes\r\ntimeCreated: 1513377123\r\nlicenseType: St"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioGraph.cs",
"chars": 10929,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioGraph.cs.meta",
"chars": 276,
"preview": "fileFormatVersion: 2\r\nguid: f2d6ca19dafe21b4b983441274e7f12a\r\ntimeCreated: 1513169449\r\nlicenseType: Store\r\nMonoImporter:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs",
"chars": 8060,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs.meta",
"chars": 276,
"preview": "fileFormatVersion: 2\r\nguid: 8c0448d8db852b54480670d291c04f1a\r\ntimeCreated: 1514998347\r\nlicenseType: Store\r\nMonoImporter:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs",
"chars": 7137,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs.meta",
"chars": 276,
"preview": "fileFormatVersion: 2\r\nguid: 2216f4eff6a7a8a43b38b180fdd2fd9e\r\ntimeCreated: 1513377074\r\nlicenseType: Store\r\nMonoImporter:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioText.cs",
"chars": 2446,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioText.cs.meta",
"chars": 276,
"preview": "fileFormatVersion: 2\r\nguid: 766a588f9a6cb55499c66ea772072e11\r\ntimeCreated: 1513377063\r\nlicenseType: Store\r\nMonoImporter:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio.meta",
"chars": 202,
"preview": "fileFormatVersion: 2\r\nguid: 2523395741efc1c48822a27d9fcb57d2\r\nfolderAsset: yes\r\ntimeCreated: 1513377094\r\nlicenseType: St"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsGraph.cs",
"chars": 6392,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsGraph.cs.meta",
"chars": 276,
"preview": "fileFormatVersion: 2\r\nguid: 2e119c7747ac400478c7cfcaea03214e\r\ntimeCreated: 1511794194\r\nlicenseType: Store\r\nMonoImporter:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsManager.cs",
"chars": 8549,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsManager.cs.meta",
"chars": 276,
"preview": "fileFormatVersion: 2\r\nguid: 221dc0b3655ddb749ace6bad55f0159f\r\ntimeCreated: 1514998359\r\nlicenseType: Store\r\nMonoImporter:"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsMonitor.cs",
"chars": 4965,
"preview": "/* ---------------------------------------\r\n * Author: Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contrib"
},
{
"path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsMonitor.cs.meta",
"chars": 276,
"preview": "fileFormatVersion: 2\r\nguid: b205584e495e4634aa3a332a78102a19\r\ntimeCreated: 1513376950\r\nlicenseType: Store\r\nMonoImporter:"
}
]
// ... and 497 more files (download for full content)
About this extraction
This page contains the full source code of the gindemit/unity-rlottie GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 697 files (36.2 MB), approximately 6.0M tokens, and a symbol index with 419 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.