@octane-xplat/lottie 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/README.md +36 -16
  2. package/dist/native/index.js +10 -9
  3. package/dist/native/octane-client-build.json +1 -1
  4. package/dist/web/index.js +39 -25
  5. package/dist/web/octane-client-build.json +1 -1
  6. package/package.json +25 -3
  7. package/platforms/macos/LICENSE-EpoxyCore-Apache-2.0.txt +201 -0
  8. package/platforms/macos/LICENSE-LRUCache-MIT.txt +22 -0
  9. package/platforms/macos/LICENSE-Lottie-Apache-2.0.txt +201 -0
  10. package/platforms/macos/LICENSE-ZIPFoundation-MIT.txt +21 -0
  11. package/platforms/macos/UPSTREAM.md +13 -0
  12. package/platforms/macos/resources/PrivacyInfo.xcprivacy +23 -0
  13. package/platforms/macos/resources/THIRD-PARTY-NOTICES.txt +10 -0
  14. package/platforms/macos/src/XplatAppKitLottie.swift +246 -0
  15. package/platforms/macos/src/vendor/Lottie/PrivacyInfo.xcprivacy +23 -0
  16. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  17. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +476 -0
  18. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +92 -0
  19. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/CustomPathAnimation.swift +89 -0
  20. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/DropShadowAnimation.swift +179 -0
  21. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/EllipseAnimation.swift +53 -0
  22. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/GradientAnimations.swift +287 -0
  23. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/LayerProperty.swift +440 -0
  24. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/OpacityAnimation.swift +53 -0
  25. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/RectangleAnimation.swift +59 -0
  26. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
  27. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/StarAnimation.swift +119 -0
  28. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/StrokeAnimation.swift +96 -0
  29. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/TransformAnimations.swift +380 -0
  30. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Animations/VisibilityAnimation.swift +63 -0
  31. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/CompatibilityTracker.swift +129 -0
  32. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/CoreAnimationLayer.swift +645 -0
  33. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  34. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +28 -0
  35. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Extensions/Keyframes+combined.swift +345 -0
  36. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Extensions/Keyframes+timeRemapping.swift +46 -0
  37. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/AnimationLayer.swift +169 -0
  38. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +46 -0
  39. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +120 -0
  40. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +169 -0
  41. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/GradientRenderLayer.swift +101 -0
  42. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/ImageLayer.swift +81 -0
  43. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/InfiniteOpaqueAnimationLayer.swift +57 -0
  44. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +59 -0
  45. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +139 -0
  46. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/PreCompLayer.swift +107 -0
  47. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/RepeaterLayer.swift +113 -0
  48. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/ShapeItemLayer.swift +346 -0
  49. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/ShapeLayer.swift +569 -0
  50. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/SolidLayer.swift +66 -0
  51. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/TextLayer.swift +157 -0
  52. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/Layers/TransformLayer.swift +13 -0
  53. package/platforms/macos/src/vendor/Lottie/Private/CoreAnimation/ValueProviderStore.swift +157 -0
  54. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Diffing/Collection+Diff.swift +267 -0
  55. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Diffing/Diffable.swift +19 -0
  56. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Diffing/DiffableSection.swift +16 -0
  57. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Diffing/IndexChangeset.swift +187 -0
  58. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Diffing/SectionedChangeset.swift +22 -0
  59. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Logging/EpoxyLogger.swift +102 -0
  60. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/CallbackContextEpoxyModeled.swift +8 -0
  61. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/EpoxyModelArrayBuilder.swift +48 -0
  62. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/EpoxyModelProperty.swift +158 -0
  63. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/EpoxyModelStorage.swift +88 -0
  64. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/EpoxyModeled.swift +54 -0
  65. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Internal/AnyEpoxyModelProperty.swift +31 -0
  66. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Internal/ClassReference.swift +39 -0
  67. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/AnimatedProviding.swift +10 -0
  68. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/DataIDProviding.swift +58 -0
  69. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/DidDisplayProviding.swift +41 -0
  70. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/DidEndDisplayingProviding.swift +42 -0
  71. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/DidSelectProviding.swift +36 -0
  72. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/ErasedContentProviding.swift +49 -0
  73. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/MakeViewProviding.swift +61 -0
  74. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/SetBehaviorsProviding.swift +38 -0
  75. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/SetContentProviding.swift +38 -0
  76. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/StyleIDProviding.swift +38 -0
  77. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/TraitCollectionProviding.swift +14 -0
  78. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/ViewDifferentiatorProviding.swift +34 -0
  79. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/ViewProviding.swift +13 -0
  80. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/WillDisplayProviding.swift +41 -0
  81. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Model/ViewEpoxyModeled.swift +10 -0
  82. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/README.md +30 -0
  83. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/EpoxySwiftUIIntrinsicContentSizeInvalidator.swift +34 -0
  84. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/EpoxySwiftUILayoutMargins.swift +38 -0
  85. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/EpoxyableView+SwiftUIView.swift +165 -0
  86. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/LayoutUtilities/MeasuringViewRepresentable.swift +127 -0
  87. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/LayoutUtilities/SwiftUIMeasurementContainer.swift +468 -0
  88. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/SwiftUIView.swift +146 -0
  89. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/UIView+SwiftUIView.swift +39 -0
  90. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/UIViewConfiguringSwiftUIView.swift +41 -0
  91. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Views/BehaviorsConfigurableView.swift +45 -0
  92. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Views/ContentConfigurableView.swift +36 -0
  93. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Views/EpoxyableView.swift +5 -0
  94. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Views/StyledView.swift +43 -0
  95. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/EpoxyCore/Views/ViewType.swift +47 -0
  96. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/LRUCache/LRUCache.swift +257 -0
  97. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/LRUCache/README.md +24 -0
  98. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/README.md +43 -0
  99. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+BackingConfiguration.swift +149 -0
  100. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+Deprecated.swift +23 -0
  101. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+Helpers.swift +361 -0
  102. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+MemoryFile.swift +205 -0
  103. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+Progress.swift +66 -0
  104. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+Reading.swift +160 -0
  105. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+ReadingDeprecated.swift +50 -0
  106. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+Writing.swift +403 -0
  107. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+WritingDeprecated.swift +95 -0
  108. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive+ZIP64.swift +191 -0
  109. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Archive.swift +404 -0
  110. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Data+Compression.swift +632 -0
  111. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Data+CompressionDeprecated.swift +43 -0
  112. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Data+Serialization.swift +146 -0
  113. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Date+ZIP.swift +101 -0
  114. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Entry+Serialization.swift +191 -0
  115. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Entry+ZIP64.swift +170 -0
  116. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/Entry.swift +669 -0
  117. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/FileManager+ZIP.swift +405 -0
  118. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/FileManager+ZIPDeprecated.swift +28 -0
  119. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/README.md +24 -0
  120. package/platforms/macos/src/vendor/Lottie/Private/EmbeddedLibraries/ZipFoundation/URL+ZIP.swift +34 -0
  121. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/CompLayers/CompositionLayer.swift +177 -0
  122. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/CompLayers/ImageCompositionLayer.swift +54 -0
  123. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/CompLayers/MaskContainerLayer.swift +191 -0
  124. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/CompLayers/NullCompositionLayer.swift +28 -0
  125. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/CompLayers/PreCompositionLayer.swift +137 -0
  126. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/CompLayers/ShapeCompositionLayer.swift +60 -0
  127. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/CompLayers/SolidCompositionLayer.swift +57 -0
  128. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/CompLayers/TextCompositionLayer.swift +247 -0
  129. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift +321 -0
  130. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +56 -0
  131. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/Utility/CompositionLayersInitializer.swift +103 -0
  132. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift +424 -0
  133. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/Utility/InvertedMatteLayer.swift +55 -0
  134. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +39 -0
  135. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/Utility/LayerImageProvider.swift +52 -0
  136. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +38 -0
  137. package/platforms/macos/src/vendor/Lottie/Private/MainThread/LayerContainers/Utility/LayerTransformNode.swift +149 -0
  138. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +146 -0
  139. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/NodeProperties/NodeProperty.swift +62 -0
  140. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +53 -0
  141. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +26 -0
  142. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +23 -0
  143. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +43 -0
  144. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/NodeProperties/ValueContainer.swift +47 -0
  145. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +39 -0
  146. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +43 -0
  147. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/LayerEffectNodes/DropShadowNode.swift +102 -0
  148. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/LayerEffectNodes/LayerEffectNode.swift +25 -0
  149. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/RoundedCornersNode.swift +85 -0
  150. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +281 -0
  151. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +74 -0
  152. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +47 -0
  153. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +89 -0
  154. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +69 -0
  155. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +253 -0
  156. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +64 -0
  157. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift +158 -0
  158. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +165 -0
  159. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +143 -0
  160. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +173 -0
  161. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +238 -0
  162. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +73 -0
  163. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +224 -0
  164. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +162 -0
  165. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +88 -0
  166. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +103 -0
  167. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +149 -0
  168. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +179 -0
  169. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +345 -0
  170. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Protocols/AnimatorNode.swift +197 -0
  171. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Protocols/PathNode.swift +20 -0
  172. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/Protocols/RenderNode.swift +60 -0
  173. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +78 -0
  174. package/platforms/macos/src/vendor/Lottie/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +98 -0
  175. package/platforms/macos/src/vendor/Lottie/Private/Model/Assets/Asset.swift +51 -0
  176. package/platforms/macos/src/vendor/Lottie/Private/Model/Assets/AssetLibrary.swift +75 -0
  177. package/platforms/macos/src/vendor/Lottie/Private/Model/Assets/ImageAsset.swift +141 -0
  178. package/platforms/macos/src/vendor/Lottie/Private/Model/Assets/PrecompAsset.swift +47 -0
  179. package/platforms/macos/src/vendor/Lottie/Private/Model/DictionaryInitializable.swift +73 -0
  180. package/platforms/macos/src/vendor/Lottie/Private/Model/DotLottie/DotLottieAnimation.swift +57 -0
  181. package/platforms/macos/src/vendor/Lottie/Private/Model/DotLottie/DotLottieImageProvider.swift +89 -0
  182. package/platforms/macos/src/vendor/Lottie/Private/Model/DotLottie/DotLottieManifest.swift +42 -0
  183. package/platforms/macos/src/vendor/Lottie/Private/Model/DotLottie/DotLottieUtils.swift +71 -0
  184. package/platforms/macos/src/vendor/Lottie/Private/Model/Extensions/Bundle.swift +58 -0
  185. package/platforms/macos/src/vendor/Lottie/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +71 -0
  186. package/platforms/macos/src/vendor/Lottie/Private/Model/Keyframes/KeyframeData.swift +111 -0
  187. package/platforms/macos/src/vendor/Lottie/Private/Model/Keyframes/KeyframeGroup.swift +265 -0
  188. package/platforms/macos/src/vendor/Lottie/Private/Model/LayerEffects/DropShadowEffect.swift +52 -0
  189. package/platforms/macos/src/vendor/Lottie/Private/Model/LayerEffects/EffectValues/ColorEffectValue.swift +45 -0
  190. package/platforms/macos/src/vendor/Lottie/Private/Model/LayerEffects/EffectValues/EffectValue.swift +98 -0
  191. package/platforms/macos/src/vendor/Lottie/Private/Model/LayerEffects/EffectValues/Vector1DEffectValue.swift +45 -0
  192. package/platforms/macos/src/vendor/Lottie/Private/Model/LayerEffects/LayerEffect.swift +103 -0
  193. package/platforms/macos/src/vendor/Lottie/Private/Model/LayerStyles/DropShadowStyle.swift +79 -0
  194. package/platforms/macos/src/vendor/Lottie/Private/Model/LayerStyles/LayerStyle.swift +85 -0
  195. package/platforms/macos/src/vendor/Lottie/Private/Model/Layers/ImageLayerModel.swift +49 -0
  196. package/platforms/macos/src/vendor/Lottie/Private/Model/Layers/LayerModel.swift +266 -0
  197. package/platforms/macos/src/vendor/Lottie/Private/Model/Layers/PreCompLayerModel.swift +74 -0
  198. package/platforms/macos/src/vendor/Lottie/Private/Model/Layers/ShapeLayerModel.swift +50 -0
  199. package/platforms/macos/src/vendor/Lottie/Private/Model/Layers/SolidLayerModel.swift +63 -0
  200. package/platforms/macos/src/vendor/Lottie/Private/Model/Layers/TextLayerModel.swift +65 -0
  201. package/platforms/macos/src/vendor/Lottie/Private/Model/Objects/DashPattern.swift +42 -0
  202. package/platforms/macos/src/vendor/Lottie/Private/Model/Objects/Marker.swift +35 -0
  203. package/platforms/macos/src/vendor/Lottie/Private/Model/Objects/Mask.swift +80 -0
  204. package/platforms/macos/src/vendor/Lottie/Private/Model/Objects/Transform.swift +261 -0
  205. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Ellipse.swift +79 -0
  206. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Fill.swift +79 -0
  207. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/GradientFill.swift +142 -0
  208. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/GradientStroke.swift +244 -0
  209. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Group.swift +55 -0
  210. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Merge.swift +63 -0
  211. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Rectangle.swift +79 -0
  212. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Repeater.swift +181 -0
  213. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/RoundedCorners.swift +53 -0
  214. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Shape.swift +63 -0
  215. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/ShapeItem.swift +171 -0
  216. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/ShapeTransform.swift +202 -0
  217. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Star.swift +136 -0
  218. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Stroke.swift +144 -0
  219. package/platforms/macos/src/vendor/Lottie/Private/Model/ShapeItems/Trim.swift +90 -0
  220. package/platforms/macos/src/vendor/Lottie/Private/Model/Text/Font.swift +67 -0
  221. package/platforms/macos/src/vendor/Lottie/Private/Model/Text/Glyph.swift +94 -0
  222. package/platforms/macos/src/vendor/Lottie/Private/Model/Text/TextAnimator.swift +240 -0
  223. package/platforms/macos/src/vendor/Lottie/Private/Model/Text/TextDocument.swift +142 -0
  224. package/platforms/macos/src/vendor/Lottie/Private/RootAnimationLayer.swift +54 -0
  225. package/platforms/macos/src/vendor/Lottie/Private/Utility/Debugging/AnimatorNodeDebugging.swift +23 -0
  226. package/platforms/macos/src/vendor/Lottie/Private/Utility/Debugging/LayerDebugging.swift +231 -0
  227. package/platforms/macos/src/vendor/Lottie/Private/Utility/Debugging/TestHelpers.swift +10 -0
  228. package/platforms/macos/src/vendor/Lottie/Private/Utility/Extensions/AnimationKeypathExtension.swift +303 -0
  229. package/platforms/macos/src/vendor/Lottie/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  230. package/platforms/macos/src/vendor/Lottie/Private/Utility/Extensions/CGColor+RGB.swift +45 -0
  231. package/platforms/macos/src/vendor/Lottie/Private/Utility/Extensions/CGFloatExtensions.swift +152 -0
  232. package/platforms/macos/src/vendor/Lottie/Private/Utility/Extensions/DataExtension.swift +33 -0
  233. package/platforms/macos/src/vendor/Lottie/Private/Utility/Extensions/MathKit.swift +454 -0
  234. package/platforms/macos/src/vendor/Lottie/Private/Utility/Extensions/StringExtensions.swift +44 -0
  235. package/platforms/macos/src/vendor/Lottie/Private/Utility/Helpers/AnimationContext.swift +95 -0
  236. package/platforms/macos/src/vendor/Lottie/Private/Utility/Helpers/AnyEquatable.swift +23 -0
  237. package/platforms/macos/src/vendor/Lottie/Private/Utility/Helpers/Binding+Map.swift +19 -0
  238. package/platforms/macos/src/vendor/Lottie/Private/Utility/Helpers/View+ValueChanged.swift +35 -0
  239. package/platforms/macos/src/vendor/Lottie/Private/Utility/Interpolatable/InterpolatableExtensions.swift +143 -0
  240. package/platforms/macos/src/vendor/Lottie/Private/Utility/Interpolatable/KeyframeExtensions.swift +47 -0
  241. package/platforms/macos/src/vendor/Lottie/Private/Utility/Interpolatable/KeyframeInterpolator.swift +250 -0
  242. package/platforms/macos/src/vendor/Lottie/Private/Utility/LottieAnimationSource.swift +51 -0
  243. package/platforms/macos/src/vendor/Lottie/Private/Utility/Primitives/BezierPath.swift +509 -0
  244. package/platforms/macos/src/vendor/Lottie/Private/Utility/Primitives/BezierPathRoundExtension.swift +163 -0
  245. package/platforms/macos/src/vendor/Lottie/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  246. package/platforms/macos/src/vendor/Lottie/Private/Utility/Primitives/ColorExtension.swift +101 -0
  247. package/platforms/macos/src/vendor/Lottie/Private/Utility/Primitives/CompoundBezierPath.swift +169 -0
  248. package/platforms/macos/src/vendor/Lottie/Private/Utility/Primitives/CurveVertex.swift +190 -0
  249. package/platforms/macos/src/vendor/Lottie/Private/Utility/Primitives/PathElement.swift +78 -0
  250. package/platforms/macos/src/vendor/Lottie/Private/Utility/Primitives/UnitBezier.swift +119 -0
  251. package/platforms/macos/src/vendor/Lottie/Private/Utility/Primitives/VectorsExtensions.swift +368 -0
  252. package/platforms/macos/src/vendor/Lottie/Public/Animation/LottieAnimation.swift +179 -0
  253. package/platforms/macos/src/vendor/Lottie/Public/Animation/LottieAnimationHelpers.swift +317 -0
  254. package/platforms/macos/src/vendor/Lottie/Public/Animation/LottieAnimationLayer.swift +1582 -0
  255. package/platforms/macos/src/vendor/Lottie/Public/Animation/LottieAnimationView.swift +1090 -0
  256. package/platforms/macos/src/vendor/Lottie/Public/Animation/LottieAnimationViewInitializers.swift +226 -0
  257. package/platforms/macos/src/vendor/Lottie/Public/Animation/LottiePlaybackMode.swift +266 -0
  258. package/platforms/macos/src/vendor/Lottie/Public/Animation/LottieView.swift +643 -0
  259. package/platforms/macos/src/vendor/Lottie/Public/AnimationCache/AnimationCacheProvider.swift +21 -0
  260. package/platforms/macos/src/vendor/Lottie/Public/AnimationCache/DefaultAnimationCache.swift +67 -0
  261. package/platforms/macos/src/vendor/Lottie/Public/AnimationCache/LRUAnimationCache.swift +11 -0
  262. package/platforms/macos/src/vendor/Lottie/Public/AnimationCache/LottieAnimationCache.swift +15 -0
  263. package/platforms/macos/src/vendor/Lottie/Public/Configuration/DecodingStrategy.swift +15 -0
  264. package/platforms/macos/src/vendor/Lottie/Public/Configuration/LottieConfiguration.swift +54 -0
  265. package/platforms/macos/src/vendor/Lottie/Public/Configuration/LottieURLSession.swift +31 -0
  266. package/platforms/macos/src/vendor/Lottie/Public/Configuration/ReducedMotionOption.swift +128 -0
  267. package/platforms/macos/src/vendor/Lottie/Public/Configuration/RenderingEngineOption.swift +117 -0
  268. package/platforms/macos/src/vendor/Lottie/Public/Controls/AnimatedButton.swift +128 -0
  269. package/platforms/macos/src/vendor/Lottie/Public/Controls/AnimatedControl.swift +248 -0
  270. package/platforms/macos/src/vendor/Lottie/Public/Controls/AnimatedSwitch.swift +271 -0
  271. package/platforms/macos/src/vendor/Lottie/Public/Controls/LottieButton.swift +119 -0
  272. package/platforms/macos/src/vendor/Lottie/Public/Controls/LottieSwitch.swift +144 -0
  273. package/platforms/macos/src/vendor/Lottie/Public/Controls/LottieViewType.swift +79 -0
  274. package/platforms/macos/src/vendor/Lottie/Public/DotLottie/Cache/DotLottieCache.swift +66 -0
  275. package/platforms/macos/src/vendor/Lottie/Public/DotLottie/Cache/DotLottieCacheProvider.swift +21 -0
  276. package/platforms/macos/src/vendor/Lottie/Public/DotLottie/DotLottieConfiguration.swift +72 -0
  277. package/platforms/macos/src/vendor/Lottie/Public/DotLottie/DotLottieFile.swift +186 -0
  278. package/platforms/macos/src/vendor/Lottie/Public/DotLottie/DotLottieFileHelpers.swift +386 -0
  279. package/platforms/macos/src/vendor/Lottie/Public/DynamicProperties/AnimationKeypath.swift +57 -0
  280. package/platforms/macos/src/vendor/Lottie/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  281. package/platforms/macos/src/vendor/Lottie/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +96 -0
  282. package/platforms/macos/src/vendor/Lottie/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +81 -0
  283. package/platforms/macos/src/vendor/Lottie/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +138 -0
  284. package/platforms/macos/src/vendor/Lottie/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +81 -0
  285. package/platforms/macos/src/vendor/Lottie/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +81 -0
  286. package/platforms/macos/src/vendor/Lottie/Public/FontProvider/AnimationFontProvider.swift +41 -0
  287. package/platforms/macos/src/vendor/Lottie/Public/ImageProvider/AnimationImageProvider.swift +43 -0
  288. package/platforms/macos/src/vendor/Lottie/Public/Keyframes/Interpolatable.swift +285 -0
  289. package/platforms/macos/src/vendor/Lottie/Public/Keyframes/Keyframe.swift +98 -0
  290. package/platforms/macos/src/vendor/Lottie/Public/Logging/LottieLogger.swift +138 -0
  291. package/platforms/macos/src/vendor/Lottie/Public/Primitives/AnimationTime.swift +15 -0
  292. package/platforms/macos/src/vendor/Lottie/Public/Primitives/LottieColor.swift +43 -0
  293. package/platforms/macos/src/vendor/Lottie/Public/Primitives/Vectors.swift +36 -0
  294. package/platforms/macos/src/vendor/Lottie/Public/TextProvider/AnimationTextProvider.swift +135 -0
  295. package/platforms/macos/src/vendor/Lottie/Public/iOS/AnimationSubview.swift +19 -0
  296. package/platforms/macos/src/vendor/Lottie/Public/iOS/BundleImageProvider.swift +98 -0
  297. package/platforms/macos/src/vendor/Lottie/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +33 -0
  298. package/platforms/macos/src/vendor/Lottie/Public/iOS/Compatibility/CompatibleAnimationView.swift +567 -0
  299. package/platforms/macos/src/vendor/Lottie/Public/iOS/Compatibility/CompatibleFontProvider.swift +41 -0
  300. package/platforms/macos/src/vendor/Lottie/Public/iOS/Compatibility/CompatibleImageProvider.swift +43 -0
  301. package/platforms/macos/src/vendor/Lottie/Public/iOS/FilepathImageProvider.swift +78 -0
  302. package/platforms/macos/src/vendor/Lottie/Public/iOS/LottieAnimationViewBase.swift +85 -0
  303. package/platforms/macos/src/vendor/Lottie/Public/iOS/UIColorExtension.swift +23 -0
  304. package/platforms/macos/src/vendor/Lottie/Public/macOS/AnimationSubview.macOS.swift +19 -0
  305. package/platforms/macos/src/vendor/Lottie/Public/macOS/BundleImageProvider.macOS.swift +90 -0
  306. package/platforms/macos/src/vendor/Lottie/Public/macOS/FilepathImageProvider.macOS.swift +86 -0
  307. package/platforms/macos/src/vendor/Lottie/Public/macOS/LottieAnimationViewBase.macOS.swift +102 -0
  308. package/src/Lottie.macos.tsrx +129 -0
  309. package/src/Lottie.tsrx +6 -4
  310. package/src/Lottie.web.tsrx +28 -11
  311. package/src/index.macos.ts +2 -0
  312. package/src/props.ts +6 -1
  313. package/types/generated/props.d.ts +5 -1
@@ -0,0 +1,380 @@
1
+ // Created by Cal Stephens on 12/17/21.
2
+ // Copyright © 2021 Airbnb Inc. All rights reserved.
3
+
4
+ import QuartzCore
5
+
6
+ // MARK: - TransformModel
7
+
8
+ /// This protocol mirrors the interface of `Transform`,
9
+ /// but is also implemented by `ShapeTransform` to allow
10
+ /// both transform types to share the same animation implementation.
11
+ protocol TransformModel {
12
+ /// The anchor point of the transform.
13
+ var anchorPoint: KeyframeGroup<LottieVector3D> { get }
14
+
15
+ /// The position of the transform. This is nil if the position data was split.
16
+ var _position: KeyframeGroup<LottieVector3D>? { get }
17
+
18
+ /// The positionX of the transform. This is nil if the position property is set.
19
+ var _positionX: KeyframeGroup<LottieVector1D>? { get }
20
+
21
+ /// The positionY of the transform. This is nil if the position property is set.
22
+ var _positionY: KeyframeGroup<LottieVector1D>? { get }
23
+
24
+ /// The scale of the transform
25
+ var scale: KeyframeGroup<LottieVector3D> { get }
26
+
27
+ /// The rotation of the transform on X axis.
28
+ var rotationX: KeyframeGroup<LottieVector1D> { get }
29
+
30
+ /// The rotation of the transform on Y axis.
31
+ var rotationY: KeyframeGroup<LottieVector1D> { get }
32
+
33
+ /// The rotation of the transform on Z axis.
34
+ var rotationZ: KeyframeGroup<LottieVector1D> { get }
35
+
36
+ /// The skew of the transform (only present on `ShapeTransform`s)
37
+ var _skew: KeyframeGroup<LottieVector1D>? { get }
38
+
39
+ /// The skew axis of the transform (only present on `ShapeTransform`s)
40
+ var _skewAxis: KeyframeGroup<LottieVector1D>? { get }
41
+ }
42
+
43
+ // MARK: - Transform + TransformModel
44
+
45
+ extension Transform: TransformModel {
46
+ var _position: KeyframeGroup<LottieVector3D>? {
47
+ position
48
+ }
49
+
50
+ var _positionX: KeyframeGroup<LottieVector1D>? {
51
+ positionX
52
+ }
53
+
54
+ var _positionY: KeyframeGroup<LottieVector1D>? {
55
+ positionY
56
+ }
57
+
58
+ var _skew: KeyframeGroup<LottieVector1D>? {
59
+ nil
60
+ }
61
+
62
+ var _skewAxis: KeyframeGroup<LottieVector1D>? {
63
+ nil
64
+ }
65
+ }
66
+
67
+ // MARK: - ShapeTransform + TransformModel
68
+
69
+ extension ShapeTransform: TransformModel {
70
+ var anchorPoint: KeyframeGroup<LottieVector3D> {
71
+ anchor
72
+ }
73
+
74
+ var _position: KeyframeGroup<LottieVector3D>? {
75
+ position
76
+ }
77
+
78
+ var _positionX: KeyframeGroup<LottieVector1D>? {
79
+ nil
80
+ }
81
+
82
+ var _positionY: KeyframeGroup<LottieVector1D>? {
83
+ nil
84
+ }
85
+
86
+ var _skew: KeyframeGroup<LottieVector1D>? {
87
+ skew
88
+ }
89
+
90
+ var _skewAxis: KeyframeGroup<LottieVector1D>? {
91
+ skewAxis
92
+ }
93
+ }
94
+
95
+ // MARK: - CALayer + TransformModel
96
+
97
+ extension CALayer {
98
+
99
+ // MARK: Internal
100
+
101
+ /// Adds transform-related animations from the given `TransformModel` to this layer
102
+ /// - This _doesn't_ apply `transform.opacity`, which has to be handled separately
103
+ /// since child layers don't inherit the `opacity` of their parent.
104
+ @nonobjc
105
+ func addTransformAnimations(
106
+ for transformModel: TransformModel,
107
+ context: LayerAnimationContext
108
+ ) throws {
109
+ if
110
+ // CALayers don't support animating skew with its own set of keyframes.
111
+ // If the transform includes a skew, we have to combine all of the transform
112
+ // components into a single set of keyframes.
113
+ transformModel.hasSkew
114
+ // Negative `scale.x` values aren't applied correctly by Core Animation when animating
115
+ // `transform.scale.x` and `transform.scale.y` using separate `CAKeyframeAnimation`s
116
+ // (https://openradar.appspot.com/FB9862872). If the transform includes negative `scale.x`
117
+ // values, we have to combine all of the transform components into a single set of keyframes.
118
+ || transformModel.hasNegativeXScaleValues
119
+ {
120
+ try addCombinedTransformAnimation(for: transformModel, context: context)
121
+ }
122
+
123
+ else {
124
+ try addPositionAnimations(from: transformModel, context: context)
125
+ try addAnchorPointAnimation(from: transformModel, context: context)
126
+ try addScaleAnimations(from: transformModel, context: context)
127
+ try addRotationAnimations(from: transformModel, context: context)
128
+ }
129
+ }
130
+
131
+ // MARK: Private
132
+
133
+ @nonobjc
134
+ private func addPositionAnimations(
135
+ from transformModel: TransformModel,
136
+ context: LayerAnimationContext
137
+ ) throws {
138
+ if let positionKeyframes = transformModel._position {
139
+ try addAnimation(
140
+ for: .position,
141
+ keyframes: positionKeyframes,
142
+ value: \.pointValue,
143
+ context: context
144
+ )
145
+ } else if
146
+ let xKeyframes = transformModel._positionX,
147
+ let yKeyframes = transformModel._positionY
148
+ {
149
+ try addAnimation(
150
+ for: .positionX,
151
+ keyframes: xKeyframes,
152
+ value: \.cgFloatValue,
153
+ context: context
154
+ )
155
+
156
+ try addAnimation(
157
+ for: .positionY,
158
+ keyframes: yKeyframes,
159
+ value: \.cgFloatValue,
160
+ context: context
161
+ )
162
+ } else {
163
+ try context.logCompatibilityIssue("""
164
+ `Transform` values must provide either `position` or `positionX` / `positionY` keyframes
165
+ """)
166
+ }
167
+ }
168
+
169
+ @nonobjc
170
+ private func addAnchorPointAnimation(
171
+ from transformModel: TransformModel,
172
+ context: LayerAnimationContext
173
+ ) throws {
174
+ try addAnimation(
175
+ for: .anchorPoint,
176
+ keyframes: transformModel.anchorPoint,
177
+ value: { absoluteAnchorPoint in
178
+ guard bounds.width > 0, bounds.height > 0 else {
179
+ context.logger.assertionFailure("Size must be non-zero before an animation can be played")
180
+ return .zero
181
+ }
182
+
183
+ // Lottie animation files express anchorPoint as an absolute point value,
184
+ // so we have to divide by the width/height of this layer to get the
185
+ // relative decimal values expected by Core Animation.
186
+ return CGPoint(
187
+ x: CGFloat(absoluteAnchorPoint.x) / bounds.width,
188
+ y: CGFloat(absoluteAnchorPoint.y) / bounds.height
189
+ )
190
+ },
191
+ context: context
192
+ )
193
+ }
194
+
195
+ @nonobjc
196
+ private func addScaleAnimations(
197
+ from transformModel: TransformModel,
198
+ context: LayerAnimationContext
199
+ ) throws {
200
+ try addAnimation(
201
+ for: .scaleX,
202
+ keyframes: transformModel.scale,
203
+ value: { scale in
204
+ // Lottie animation files express scale as a numerical percentage value
205
+ // (e.g. 50%, 100%, 200%) so we divide by 100 to get the decimal values
206
+ // expected by Core Animation (e.g. 0.5, 1.0, 2.0).
207
+ CGFloat(scale.x) / 100
208
+ },
209
+ context: context
210
+ )
211
+
212
+ try addAnimation(
213
+ for: .scaleY,
214
+ keyframes: transformModel.scale,
215
+ value: { scale in
216
+ // Lottie animation files express scale as a numerical percentage value
217
+ // (e.g. 50%, 100%, 200%) so we divide by 100 to get the decimal values
218
+ // expected by Core Animation (e.g. 0.5, 1.0, 2.0).
219
+ CGFloat(scale.y) / 100
220
+ },
221
+ context: context
222
+ )
223
+ }
224
+
225
+ private func addRotationAnimations(
226
+ from transformModel: TransformModel,
227
+ context: LayerAnimationContext
228
+ ) throws {
229
+ let containsXRotationValues = transformModel.rotationX.keyframes.contains(where: { $0.value.cgFloatValue != 0 })
230
+ let containsYRotationValues = transformModel.rotationY.keyframes.contains(where: { $0.value.cgFloatValue != 0 })
231
+
232
+ // When `rotation.x` or `rotation.y` is used, it doesn't render property in test snapshots
233
+ // but do renders correctly on the simulator / device
234
+ if TestHelpers.snapshotTestsAreRunning {
235
+ if containsXRotationValues {
236
+ context.logger.warn("""
237
+ `rotation.x` values are not displayed correctly in snapshot tests
238
+ """)
239
+ }
240
+
241
+ if containsYRotationValues {
242
+ context.logger.warn("""
243
+ `rotation.y` values are not displayed correctly in snapshot tests
244
+ """)
245
+ }
246
+ }
247
+
248
+ // Lottie animation files express rotation in degrees
249
+ // (e.g. 90º, 180º, 360º) so we convert to radians to get the
250
+ // values expected by Core Animation (e.g. π/2, π, 2π)
251
+
252
+ try addAnimation(
253
+ for: .rotationX,
254
+ keyframes: transformModel.rotationX,
255
+ value: { rotationDegrees in
256
+ rotationDegrees.cgFloatValue * .pi / 180
257
+ },
258
+ context: context
259
+ )
260
+
261
+ try addAnimation(
262
+ for: .rotationY,
263
+ keyframes: transformModel.rotationY,
264
+ value: { rotationDegrees in
265
+ rotationDegrees.cgFloatValue * .pi / 180
266
+ },
267
+ context: context
268
+ )
269
+
270
+ try addAnimation(
271
+ for: .rotationZ,
272
+ keyframes: transformModel.rotationZ,
273
+ value: { rotationDegrees in
274
+ // Lottie animation files express rotation in degrees
275
+ // (e.g. 90º, 180º, 360º) so we convert to radians to get the
276
+ // values expected by Core Animation (e.g. π/2, π, 2π)
277
+ rotationDegrees.cgFloatValue * .pi / 180
278
+ },
279
+ context: context
280
+ )
281
+ }
282
+
283
+ /// Adds an animation for the entire `transform` key by combining all of the
284
+ /// position / size / rotation / skew animations into a single set of keyframes.
285
+ /// This is more expensive that animating each component separately, since
286
+ /// it may require manually interpolating the keyframes at each frame.
287
+ private func addCombinedTransformAnimation(
288
+ for transformModel: TransformModel,
289
+ context: LayerAnimationContext
290
+ ) throws {
291
+ let requiresManualInterpolation =
292
+ // Core Animation doesn't animate skew changes properly. If the skew value
293
+ // changes over the course of the animation then we have to manually
294
+ // compute the `CATransform3D` for each frame individually.
295
+ transformModel.hasSkewAnimation
296
+ // `addAnimation` requires that we use an `Interpolatable` value, but we can't interpolate a `CATransform3D`.
297
+ // Since this is only necessary when using `complexTimeRemapping`, we can avoid this by manually interpolating
298
+ // when `context.mustUseComplexTimeRemapping` is true and just returning a `Hold` container.
299
+ // Since our keyframes are already manually interpolated, they won't need to be interpolated again.
300
+ || context.mustUseComplexTimeRemapping
301
+
302
+ let combinedTransformKeyframes = Keyframes.combined(
303
+ transformModel.anchorPoint,
304
+ transformModel._position ?? KeyframeGroup(LottieVector3D(x: 0.0, y: 0.0, z: 0.0)),
305
+ transformModel._positionX ?? KeyframeGroup(LottieVector1D(0)),
306
+ transformModel._positionY ?? KeyframeGroup(LottieVector1D(0)),
307
+ transformModel.scale,
308
+ transformModel.rotationX,
309
+ transformModel.rotationY,
310
+ transformModel.rotationZ,
311
+ transformModel._skew ?? KeyframeGroup(LottieVector1D(0)),
312
+ transformModel._skewAxis ?? KeyframeGroup(LottieVector1D(0)),
313
+ requiresManualInterpolation: requiresManualInterpolation,
314
+ makeCombinedResult: {
315
+ anchor, position, positionX, positionY, scale, rotationX, rotationY, rotationZ, skew, skewAxis
316
+ -> Hold<CATransform3D> in
317
+ let transformPosition: CGPoint =
318
+ if transformModel._positionX != nil, transformModel._positionY != nil {
319
+ CGPoint(x: positionX.cgFloatValue, y: positionY.cgFloatValue)
320
+ } else {
321
+ position.pointValue
322
+ }
323
+
324
+ let transform = CATransform3D.makeTransform(
325
+ anchor: anchor.pointValue,
326
+ position: transformPosition,
327
+ scale: scale.sizeValue,
328
+ rotationX: rotationX.cgFloatValue,
329
+ rotationY: rotationY.cgFloatValue,
330
+ rotationZ: rotationZ.cgFloatValue,
331
+ skew: skew.cgFloatValue,
332
+ skewAxis: skewAxis.cgFloatValue
333
+ )
334
+
335
+ return Hold(value: transform)
336
+ }
337
+ )
338
+
339
+ try addAnimation(
340
+ for: .transform,
341
+ keyframes: combinedTransformKeyframes,
342
+ value: { $0.value },
343
+ context: context
344
+ )
345
+ }
346
+
347
+ }
348
+
349
+ extension TransformModel {
350
+ /// Whether or not this transform has a non-zero skew value
351
+ var hasSkew: Bool {
352
+ guard
353
+ let _skew,
354
+ let _skewAxis,
355
+ !_skew.keyframes.isEmpty,
356
+ !_skewAxis.keyframes.isEmpty
357
+ else {
358
+ return false
359
+ }
360
+
361
+ return _skew.keyframes.contains(where: { $0.value.cgFloatValue != 0 })
362
+ }
363
+
364
+ /// Whether or not this transform has a non-zero skew value which animates
365
+ var hasSkewAnimation: Bool {
366
+ guard
367
+ hasSkew,
368
+ let _skew,
369
+ let _skewAxis
370
+ else { return false }
371
+
372
+ return _skew.keyframes.count > 1
373
+ || _skewAxis.keyframes.count > 1
374
+ }
375
+
376
+ /// Whether or not this `TransformModel` has any negative X scale values
377
+ var hasNegativeXScaleValues: Bool {
378
+ scale.keyframes.contains(where: { $0.value.x < 0 })
379
+ }
380
+ }
@@ -0,0 +1,63 @@
1
+ // Created by Cal Stephens on 12/21/21.
2
+ // Copyright © 2021 Airbnb Inc. All rights reserved.
3
+
4
+ import QuartzCore
5
+
6
+ extension CALayer {
7
+ /// Adds an animation for the given `inTime` and `outTime` to this `CALayer`
8
+ @nonobjc
9
+ func addVisibilityAnimation(
10
+ inFrame: AnimationFrameTime,
11
+ outFrame: AnimationFrameTime,
12
+ context: LayerAnimationContext
13
+ ) throws {
14
+ /// If this layer uses `complexTimeRemapping`, use the `addAnimation` codepath
15
+ /// which uses `Keyframes.manuallyInterpolatedWithTimeRemapping`.
16
+ if context.mustUseComplexTimeRemapping {
17
+ let isHiddenKeyframes = KeyframeGroup(keyframes: [
18
+ Keyframe(value: true, time: 0, isHold: true), // hidden, before `inFrame`
19
+ Keyframe(value: false, time: inFrame, isHold: true), // visible
20
+ Keyframe(value: true, time: outFrame, isHold: true), // hidden, after `outFrame`
21
+ ])
22
+
23
+ try addAnimation(
24
+ for: .isHidden,
25
+ keyframes: isHiddenKeyframes.map { Hold(value: $0) },
26
+ value: { $0.value },
27
+ context: context
28
+ )
29
+ }
30
+
31
+ /// Otherwise continue using the legacy codepath that doesn't support complex time remapping.
32
+ /// - TODO: We could remove this codepath in favor of always using the simpler codepath above,
33
+ /// but would have to solve https://github.com/airbnb/lottie-ios/pull/2254 for that codepath.
34
+ else {
35
+ let animation = CAKeyframeAnimation(keyPath: #keyPath(isHidden))
36
+ animation.calculationMode = .discrete
37
+
38
+ animation.values = [
39
+ true, // hidden, before `inFrame`
40
+ false, // visible
41
+ true, // hidden, after `outFrame`
42
+ ]
43
+
44
+ // From the documentation of `keyTimes`:
45
+ // - If the calculationMode is set to discrete, the first value in the array
46
+ // must be 0.0 and the last value must be 1.0. The array should have one more
47
+ // entry than appears in the values array. For example, if there are two values,
48
+ // there should be three key times.
49
+ animation.keyTimes = [
50
+ NSNumber(value: 0.0),
51
+ NSNumber(value: max(Double(try context.progressTime(for: inFrame)), 0)),
52
+ // Anything visible during the last frame should stay visible until the absolute end of the animation.
53
+ // - This matches the behavior of the main thread rendering engine.
54
+ context.simpleTimeRemapping(outFrame) == context.animation.endFrame
55
+ ? NSNumber(value: Double(1.0))
56
+ : NSNumber(value: min(Double(try context.progressTime(for: outFrame)), 1)),
57
+ NSNumber(value: 1.0),
58
+ ]
59
+
60
+ add(animation, timedWith: context)
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,129 @@
1
+ // Created by Cal Stephens on 5/4/22.
2
+ // Copyright © 2022 Airbnb Inc. All rights reserved.
3
+
4
+ // MARK: - CompatibilityIssue
5
+
6
+ /// A compatibility issue that was encountered while setting up an animation with the Core Animation engine
7
+ struct CompatibilityIssue: CustomStringConvertible {
8
+ let message: String
9
+ let context: String
10
+
11
+ var description: String {
12
+ "[\(context)] \(message)"
13
+ }
14
+ }
15
+
16
+ // MARK: - CompatibilityTracker
17
+
18
+ /// A type that tracks whether or not an animation is compatible with the Core Animation engine
19
+ final class CompatibilityTracker {
20
+
21
+ // MARK: Lifecycle
22
+
23
+ init(mode: Mode, logger: LottieLogger) {
24
+ self.mode = mode
25
+ self.logger = logger
26
+ }
27
+
28
+ // MARK: Internal
29
+
30
+ /// How compatibility issues should be handled
31
+ enum Mode {
32
+ /// When a compatibility issue is encountered, an error will be thrown immediately,
33
+ /// aborting the animation setup process as soon as possible.
34
+ case abort
35
+
36
+ /// When a compatibility issue is encountered, it is stored in `CompatibilityTracker.issues`
37
+ case track
38
+ }
39
+
40
+ enum Error: Swift.Error {
41
+ case encounteredCompatibilityIssue(CompatibilityIssue)
42
+ }
43
+
44
+ /// Records a compatibility issue that will be reported according to `CompatibilityTracker.Mode`
45
+ func logIssue(message: String, context: String) throws {
46
+ logger.assert(!context.isEmpty, "Compatibility issue context is unexpectedly empty")
47
+
48
+ let issue = CompatibilityIssue(
49
+ // Compatibility messages are usually written in source files using multi-line strings,
50
+ // but converting them to be a single line makes it easier to read the ultimate log output.
51
+ message: message.replacingOccurrences(of: "\n", with: " "),
52
+ context: context
53
+ )
54
+
55
+ switch mode {
56
+ case .abort:
57
+ throw CompatibilityTracker.Error.encounteredCompatibilityIssue(issue)
58
+ case .track:
59
+ issues.append(issue)
60
+ }
61
+ }
62
+
63
+ /// Asserts that a condition is true, otherwise logs a compatibility issue that will be reported
64
+ /// according to `CompatibilityTracker.Mode`
65
+ func assert(
66
+ _ condition: Bool,
67
+ _ message: @autoclosure () -> String,
68
+ context: @autoclosure () -> String
69
+ ) throws {
70
+ if !condition {
71
+ try logIssue(message: message(), context: context())
72
+ }
73
+ }
74
+
75
+ /// Reports the compatibility issues that were recorded when setting up the animation,
76
+ /// and clears the set of tracked issues.
77
+ func reportCompatibilityIssues(_ handler: ([CompatibilityIssue]) -> Void) {
78
+ handler(issues)
79
+ issues = []
80
+ }
81
+
82
+ // MARK: Private
83
+
84
+ private let mode: Mode
85
+ private let logger: LottieLogger
86
+
87
+ /// Compatibility issues encountered while setting up the animation
88
+ private var issues = [CompatibilityIssue]()
89
+
90
+ }
91
+
92
+ // MARK: - CompatibilityTrackerProviding
93
+
94
+ protocol CompatibilityTrackerProviding {
95
+ var compatibilityTracker: CompatibilityTracker { get }
96
+ var compatibilityIssueContext: String { get }
97
+ }
98
+
99
+ extension CompatibilityTrackerProviding {
100
+ /// Records a compatibility issue that will be reported according to `CompatibilityTracker.Mode`
101
+ func logCompatibilityIssue(_ message: String) throws {
102
+ try compatibilityTracker.logIssue(message: message, context: compatibilityIssueContext)
103
+ }
104
+
105
+ /// Asserts that a condition is true, otherwise logs a compatibility issue that will be reported
106
+ /// according to `CompatibilityTracker.Mode`
107
+ func compatibilityAssert(
108
+ _ condition: Bool,
109
+ _ message: @autoclosure () -> String
110
+ ) throws {
111
+ try compatibilityTracker.assert(condition, message(), context: compatibilityIssueContext)
112
+ }
113
+ }
114
+
115
+ // MARK: - LayerContext + CompatibilityTrackerProviding
116
+
117
+ extension LayerContext: CompatibilityTrackerProviding {
118
+ var compatibilityIssueContext: String {
119
+ layerName
120
+ }
121
+ }
122
+
123
+ // MARK: - LayerAnimationContext + CompatibilityTrackerProviding
124
+
125
+ extension LayerAnimationContext: CompatibilityTrackerProviding {
126
+ var compatibilityIssueContext: String {
127
+ currentKeypath.fullPath
128
+ }
129
+ }