lottie-ios 3.2.3 → 3.4.2

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 (434) hide show
  1. package/.github/actions/setup/action.yml +32 -0
  2. package/.github/issue_template.md +6 -23
  3. package/.github/workflows/main.yml +98 -0
  4. package/.github/workflows/stale_issues.yml +17 -0
  5. package/.spi.yml +6 -0
  6. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  7. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  9. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  10. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  11. package/Gemfile +4 -0
  12. package/Gemfile.lock +102 -0
  13. package/Lottie.xcodeproj/project.pbxproj +2011 -1972
  14. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  15. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (macOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  19. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  20. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  21. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  22. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  23. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
  24. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  25. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  26. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +22 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +138 -0
  30. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  31. package/Package.swift +5 -15
  32. package/README.md +40 -60
  33. package/Rakefile +160 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +447 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +81 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +55 -0
  39. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
  40. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  41. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  42. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +58 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +257 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +124 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +73 -0
  46. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  47. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  48. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  49. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +497 -0
  50. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  51. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  52. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +154 -0
  53. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  55. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +88 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +167 -0
  57. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
  58. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  59. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +64 -0
  60. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  61. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  62. package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +315 -0
  64. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +390 -0
  65. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  66. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  67. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  68. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +94 -86
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +59 -43
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  76. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  77. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  78. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  79. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  80. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +149 -106
  81. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +26 -24
  82. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  83. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  84. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +9 -4
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  99. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  100. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +247 -0
  101. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
  102. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
  103. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  105. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  108. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
  109. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +57 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +66 -58
  113. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +169 -0
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
  119. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
  120. package/Sources/Private/Model/Animation.swift +160 -0
  121. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  122. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  123. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  124. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  125. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  126. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  127. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  128. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  129. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +222 -0
  130. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  131. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  135. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  136. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  137. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  138. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  139. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  140. package/Sources/Private/Model/ShapeItems/Ellipse.swift +74 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +137 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +185 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -12
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +72 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +135 -0
  148. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  150. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +135 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +131 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +101 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +77 -0
  154. package/Sources/Private/Model/Text/Font.swift +61 -0
  155. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  156. package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
  157. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  158. package/Sources/Private/RootAnimationLayer.swift +51 -0
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  160. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
  161. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  162. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  163. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  164. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  165. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  166. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  167. package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
  168. package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
  169. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  170. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
  171. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  172. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  173. package/{lottie-swift/src/Private/NodeRenderSystem/NodeProperties/ValueProviders → Sources/Private/Utility/Interpolatable}/KeyframeInterpolator.swift +125 -108
  174. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  175. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  177. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  178. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  179. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  180. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  181. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  182. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  183. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  184. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  185. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  186. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  187. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  188. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  190. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  191. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  194. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  195. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  196. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  197. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  198. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  199. package/Sources/Public/LottieConfiguration.swift +143 -0
  200. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  202. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  203. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  207. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  208. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  209. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  211. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  212. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  213. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  214. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  215. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  216. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  217. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  218. package/Tests/AnimationKeypathTests.swift +103 -0
  219. package/Tests/AutomaticEngineTests.swift +57 -0
  220. package/Tests/BundleTests.swift +25 -0
  221. package/Tests/DataURLTests.swift +64 -0
  222. package/Tests/ParsingTests.swift +43 -0
  223. package/Tests/PerformanceTests.swift +214 -0
  224. package/Tests/Samples/9squares_AlBoardman.json +1 -0
  225. package/Tests/Samples/Boat_Loader.json +1 -0
  226. package/Tests/Samples/HamburgerArrow.json +1 -0
  227. package/Tests/Samples/IconTransitions.json +1 -0
  228. package/Tests/Samples/Images/dog.png +0 -0
  229. package/Tests/Samples/Issues/issue_1125.json +1 -0
  230. package/Tests/Samples/Issues/issue_1260.json +1 -0
  231. package/Tests/Samples/Issues/issue_1403.json +1 -0
  232. package/Tests/Samples/Issues/issue_1407.json +1 -0
  233. package/Tests/Samples/Issues/issue_1460.json +1 -0
  234. package/Tests/Samples/Issues/issue_1488.json +1 -0
  235. package/Tests/Samples/Issues/issue_1505.json +1 -0
  236. package/Tests/Samples/Issues/issue_1541.json +1 -0
  237. package/Tests/Samples/Issues/issue_1557.json +1 -0
  238. package/Tests/Samples/Issues/issue_1603.json +1 -0
  239. package/Tests/Samples/Issues/issue_1628.json +1 -0
  240. package/Tests/Samples/Issues/issue_1636.json +1 -0
  241. package/Tests/Samples/Issues/issue_1643.json +1 -0
  242. package/Tests/Samples/Issues/issue_1655.json +1 -0
  243. package/Tests/Samples/Issues/issue_1664.json +1 -0
  244. package/Tests/Samples/Issues/issue_1683.json +1 -0
  245. package/Tests/Samples/Issues/issue_1687.json +1 -0
  246. package/Tests/Samples/Issues/issue_1711.json +1 -0
  247. package/Tests/Samples/Issues/issue_1717.json +1 -0
  248. package/Tests/Samples/Issues/issue_769.json +1 -0
  249. package/Tests/Samples/Issues/issue_885.json +1 -0
  250. package/Tests/Samples/Issues/issue_965.json +1 -0
  251. package/Tests/Samples/Issues/pr_1536.json +1 -0
  252. package/Tests/Samples/Issues/pr_1563.json +8439 -0
  253. package/Tests/Samples/Issues/pr_1592.json +5527 -0
  254. package/Tests/Samples/Issues/pr_1599.json +738 -0
  255. package/Tests/Samples/Issues/pr_1604_1.json +1 -0
  256. package/Tests/Samples/Issues/pr_1604_2.json +1 -0
  257. package/Tests/Samples/Issues/pr_1632_1.json +1 -0
  258. package/Tests/Samples/Issues/pr_1632_2.json +1 -0
  259. package/Tests/Samples/Issues/pr_1686.json +513 -0
  260. package/Tests/Samples/Issues/pr_1698.json +1 -0
  261. package/Tests/Samples/Issues/pr_1699.json +1 -0
  262. package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
  263. package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
  264. package/Tests/Samples/LottieFiles/cactus.json +1 -0
  265. package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
  266. package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
  267. package/Tests/Samples/LottieFiles/fireworks.json +1 -0
  268. package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
  269. package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
  270. package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
  271. package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
  272. package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
  273. package/Tests/Samples/LottieFiles/growth.json +1 -0
  274. package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
  275. package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
  276. package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
  277. package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
  278. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
  279. package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
  280. package/Tests/Samples/LottieFiles/shop.json +1 -0
  281. package/Tests/Samples/LottieFiles/step_loader.json +1 -0
  282. package/Tests/Samples/LottieLogo1.json +1 -0
  283. package/Tests/Samples/LottieLogo1_masked.json +1 -0
  284. package/Tests/Samples/LottieLogo2.json +1 -0
  285. package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
  286. package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
  287. package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
  288. package/Tests/Samples/Nonanimating/FirstText.json +1 -0
  289. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
  290. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
  291. package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
  292. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
  293. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
  294. package/Tests/Samples/Nonanimating/Zoom.json +1 -0
  295. package/Tests/Samples/Nonanimating/_dog.json +1 -0
  296. package/Tests/Samples/Nonanimating/base64Test.json +1 -0
  297. package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
  298. package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
  299. package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
  300. package/Tests/Samples/PinJump.json +1 -0
  301. package/Tests/Samples/Switch.json +1 -0
  302. package/Tests/Samples/Switch_States.json +1 -0
  303. package/Tests/Samples/TwitterHeart.json +1 -0
  304. package/Tests/Samples/TwitterHeartButton.json +1 -0
  305. package/Tests/Samples/TypeFace/A.json +1 -0
  306. package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
  307. package/Tests/Samples/TypeFace/B.json +1 -0
  308. package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
  309. package/Tests/Samples/TypeFace/C.json +1 -0
  310. package/Tests/Samples/TypeFace/Colon.json +1 -0
  311. package/Tests/Samples/TypeFace/Comma.json +1 -0
  312. package/Tests/Samples/TypeFace/D.json +1 -0
  313. package/Tests/Samples/TypeFace/E.json +1 -0
  314. package/Tests/Samples/TypeFace/F.json +1 -0
  315. package/Tests/Samples/TypeFace/G.json +1 -0
  316. package/Tests/Samples/TypeFace/H.json +1 -0
  317. package/Tests/Samples/TypeFace/I.json +1 -0
  318. package/Tests/Samples/TypeFace/J.json +1 -0
  319. package/Tests/Samples/TypeFace/K.json +1 -0
  320. package/Tests/Samples/TypeFace/L.json +1 -0
  321. package/Tests/Samples/TypeFace/M.json +1 -0
  322. package/Tests/Samples/TypeFace/N.json +1 -0
  323. package/Tests/Samples/TypeFace/O.json +1 -0
  324. package/Tests/Samples/TypeFace/P.json +1 -0
  325. package/Tests/Samples/TypeFace/Q.json +1 -0
  326. package/Tests/Samples/TypeFace/R.json +1 -0
  327. package/Tests/Samples/TypeFace/S.json +1 -0
  328. package/Tests/Samples/TypeFace/T.json +1 -0
  329. package/Tests/Samples/TypeFace/U.json +1 -0
  330. package/Tests/Samples/TypeFace/V.json +1 -0
  331. package/Tests/Samples/TypeFace/W.json +1 -0
  332. package/Tests/Samples/TypeFace/X.json +1 -0
  333. package/Tests/Samples/TypeFace/Y.json +1 -0
  334. package/Tests/Samples/TypeFace/Z.json +1 -0
  335. package/Tests/Samples/Watermelon.json +1 -0
  336. package/Tests/Samples/setValueTest.json +1 -0
  337. package/Tests/Samples/timeremap.json +1 -0
  338. package/Tests/Samples/vcTransition1.json +1 -0
  339. package/Tests/Samples/vcTransition2.json +1 -0
  340. package/Tests/SnapshotConfiguration.swift +158 -0
  341. package/Tests/SnapshotTests.swift +265 -0
  342. package/Tests/Utils/Bundle+Module.swift +30 -0
  343. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  344. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  345. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  346. package/Tests/ValueProvidersTests.swift +27 -0
  347. package/lottie-ios.podspec +12 -12
  348. package/package.json +1 -1
  349. package/script/test-carthage/Cartfile +1 -0
  350. package/script/test-carthage/Cartfile.resolved +1 -0
  351. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  352. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  353. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  354. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  355. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  356. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  357. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  358. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  359. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  360. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  361. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  362. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  363. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  364. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  365. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  366. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  367. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  368. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  369. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  370. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  371. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  372. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  373. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  374. package/script/test-carthage/Mintfile +1 -0
  375. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  376. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  377. package/script/test-spm/Mintfile +1 -0
  378. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  379. package/Lottie/Info.plist +0 -22
  380. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  381. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  382. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  383. package/lottie-swift/Assets/.gitkeep +0 -0
  384. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  385. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  386. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  387. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  388. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  389. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  390. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  391. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  392. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  393. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  394. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  395. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  396. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  397. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  398. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  399. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  400. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  401. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  402. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  403. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  404. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  405. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  406. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  407. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  408. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  409. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  410. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  411. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  412. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  413. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  414. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  415. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +0 -127
  416. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  417. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  418. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  419. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  420. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  421. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  422. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  423. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  424. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  425. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  426. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  427. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  428. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  429. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  430. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  431. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  432. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  433. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  434. package/lottie-swift-testing.podspec +0 -32
@@ -0,0 +1,92 @@
1
+ // Created by Cal Stephens on 1/24/22.
2
+ // Copyright © 2022 Airbnb Inc. All rights reserved.
3
+
4
+ // MARK: - Keyframe
5
+
6
+ /// A keyframe with a single value, and timing information
7
+ /// about when the value should be displayed and how it
8
+ /// should be interpolated.
9
+ public final class Keyframe<T> {
10
+
11
+ // MARK: Lifecycle
12
+
13
+ /// Initialize a value-only keyframe with no time data.
14
+ public init(
15
+ _ value: T,
16
+ spatialInTangent: Vector3D? = nil,
17
+ spatialOutTangent: Vector3D? = nil)
18
+ {
19
+ self.value = value
20
+ time = 0
21
+ isHold = true
22
+ inTangent = nil
23
+ outTangent = nil
24
+ self.spatialInTangent = spatialInTangent
25
+ self.spatialOutTangent = spatialOutTangent
26
+ }
27
+
28
+ /// Initialize a keyframe
29
+ public init(
30
+ value: T,
31
+ time: AnimationFrameTime,
32
+ isHold: Bool = false,
33
+ inTangent: Vector2D? = nil,
34
+ outTangent: Vector2D? = nil,
35
+ spatialInTangent: Vector3D? = nil,
36
+ spatialOutTangent: Vector3D? = nil)
37
+ {
38
+ self.value = value
39
+ self.time = time
40
+ self.isHold = isHold
41
+ self.outTangent = outTangent
42
+ self.inTangent = inTangent
43
+ self.spatialInTangent = spatialInTangent
44
+ self.spatialOutTangent = spatialOutTangent
45
+ }
46
+
47
+ // MARK: Public
48
+
49
+ /// The value of the keyframe
50
+ public let value: T
51
+ /// The time in frames of the keyframe.
52
+ public let time: AnimationFrameTime
53
+ /// A hold keyframe freezes interpolation until the next keyframe that is not a hold.
54
+ public let isHold: Bool
55
+ /// The in tangent for the time interpolation curve.
56
+ public let inTangent: Vector2D?
57
+ /// The out tangent for the time interpolation curve.
58
+ public let outTangent: Vector2D?
59
+
60
+ /// The spatial in tangent of the vector.
61
+ public let spatialInTangent: Vector3D?
62
+ /// The spatial out tangent of the vector.
63
+ public let spatialOutTangent: Vector3D?
64
+ }
65
+
66
+ // MARK: Equatable
67
+
68
+ extension Keyframe: Equatable where T: Equatable {
69
+ public static func == (lhs: Keyframe<T>, rhs: Keyframe<T>) -> Bool {
70
+ lhs.value == rhs.value
71
+ && lhs.time == rhs.time
72
+ && lhs.isHold == rhs.isHold
73
+ && lhs.inTangent == rhs.inTangent
74
+ && lhs.outTangent == rhs.outTangent
75
+ && lhs.spatialInTangent == rhs.spatialOutTangent
76
+ && lhs.spatialOutTangent == rhs.spatialOutTangent
77
+ }
78
+ }
79
+
80
+ // MARK: Hashable
81
+
82
+ extension Keyframe: Hashable where T: Hashable {
83
+ public func hash(into hasher: inout Hasher) {
84
+ hasher.combine(value)
85
+ hasher.combine(time)
86
+ hasher.combine(isHold)
87
+ hasher.combine(inTangent)
88
+ hasher.combine(outTangent)
89
+ hasher.combine(spatialInTangent)
90
+ hasher.combine(spatialOutTangent)
91
+ }
92
+ }
@@ -0,0 +1,137 @@
1
+ // Created by eric_horacek on 12/9/20.
2
+ // Copyright © 2020 Airbnb Inc. All rights reserved.
3
+
4
+ // MARK: - LottieLogger
5
+
6
+ /// A shared logger that allows consumers to intercept Lottie assertions and warning messages to pipe
7
+ /// into their own logging systems.
8
+ public final class LottieLogger {
9
+
10
+ // MARK: Lifecycle
11
+
12
+ public init(
13
+ assert: @escaping Assert = { condition, message, file, line in
14
+ // If we default to `Swift.assert` directly with `assert: Assert = Swift.assert`,
15
+ // the call will unexpectedly not respect the -O flag and will crash in release
16
+ // https://github.com/apple/swift/issues/60249
17
+ Swift.assert(condition(), message(), file: file, line: line)
18
+ },
19
+ assertionFailure: @escaping AssertionFailure = { message, file, line in
20
+ // If we default to `Swift.assertionFailure` directly with
21
+ // `assertionFailure: AssertionFailure = Swift.assertionFailure`,
22
+ // the call will unexpectedly not respect the -O flag and will crash in release
23
+ // https://github.com/apple/swift/issues/60249
24
+ Swift.assertionFailure(message(), file: file, line: line)
25
+ },
26
+ warn: @escaping Warn = { message, _, _ in
27
+ #if DEBUG
28
+ // swiftlint:disable:next no_direct_standard_out_logs
29
+ print(message())
30
+ #endif
31
+ },
32
+ info: @escaping Info = { message in
33
+ #if DEBUG
34
+ // swiftlint:disable:next no_direct_standard_out_logs
35
+ print(message())
36
+ #endif
37
+ })
38
+ {
39
+ _assert = assert
40
+ _assertionFailure = assertionFailure
41
+ _warn = warn
42
+ _info = info
43
+ }
44
+
45
+ // MARK: Public
46
+
47
+ /// Logs that an assertion occurred.
48
+ public typealias Assert = (
49
+ _ condition: @autoclosure () -> Bool,
50
+ _ message: @autoclosure () -> String,
51
+ _ fileID: StaticString,
52
+ _ line: UInt)
53
+ -> Void
54
+
55
+ /// Logs that an assertion failure occurred.
56
+ public typealias AssertionFailure = (
57
+ _ message: @autoclosure () -> String,
58
+ _ fileID: StaticString,
59
+ _ line: UInt)
60
+ -> Void
61
+
62
+ /// Logs a warning message.
63
+ public typealias Warn = (
64
+ _ message: @autoclosure () -> String,
65
+ _ fileID: StaticString,
66
+ _ line: UInt)
67
+ -> Void
68
+
69
+ /// Prints a purely informational message.
70
+ public typealias Info = (_ message: @autoclosure () -> String) -> Void
71
+
72
+ /// The shared instance used to log Lottie assertions and warnings.
73
+ ///
74
+ /// Set this to a new logger instance to intercept assertions and warnings logged by Lottie.
75
+ public static var shared = LottieLogger()
76
+
77
+ /// Logs that an assertion occurred.
78
+ public func assert(
79
+ _ condition: @autoclosure () -> Bool,
80
+ _ message: @autoclosure () -> String = String(),
81
+ fileID: StaticString = #fileID,
82
+ line: UInt = #line)
83
+ {
84
+ _assert(condition(), message(), fileID, line)
85
+ }
86
+
87
+ /// Logs that an assertion failure occurred.
88
+ public func assertionFailure(
89
+ _ message: @autoclosure () -> String = String(),
90
+ fileID: StaticString = #fileID,
91
+ line: UInt = #line)
92
+ {
93
+ _assertionFailure(message(), fileID, line)
94
+ }
95
+
96
+ /// Logs a warning message.
97
+ public func warn(
98
+ _ message: @autoclosure () -> String = String(),
99
+ fileID: StaticString = #fileID,
100
+ line: UInt = #line)
101
+ {
102
+ _warn(message(), fileID, line)
103
+ }
104
+
105
+ /// Logs a purely informational message.
106
+ public func info(_ message: @autoclosure () -> String = String()) {
107
+ _info(message())
108
+ }
109
+
110
+ // MARK: Private
111
+
112
+ private let _assert: Assert
113
+ private let _assertionFailure: AssertionFailure
114
+ private let _warn: Warn
115
+ private let _info: Info
116
+
117
+ }
118
+
119
+ // MARK: - LottieLogger + printToConsole
120
+
121
+ extension LottieLogger {
122
+ /// A `LottieLogger` instance that always prints to the console (by calling `print`)
123
+ /// instead of calling `assert` / `assertionFailure`, which halt execution in debug builds.
124
+ public static var printToConsole: LottieLogger {
125
+ LottieLogger(
126
+ assert: { condition, message, _, _ in
127
+ if !condition() {
128
+ // swiftlint:disable:next no_direct_standard_out_logs
129
+ print(message())
130
+ }
131
+ },
132
+ assertionFailure: { message, _, _ in
133
+ // swiftlint:disable:next no_direct_standard_out_logs
134
+ print(message())
135
+ })
136
+ }
137
+ }
@@ -0,0 +1,143 @@
1
+ // Created by Cal Stephens on 12/13/21.
2
+ // Copyright © 2021 Airbnb Inc. All rights reserved.
3
+
4
+ // MARK: - LottieConfiguration
5
+
6
+ /// Global configuration options for Lottie animations
7
+ public struct LottieConfiguration: Hashable {
8
+
9
+ public init(
10
+ renderingEngine: RenderingEngineOption = .mainThread,
11
+ decodingStrategy: DecodingStrategy = .codable)
12
+ {
13
+ self.renderingEngine = renderingEngine
14
+ self.decodingStrategy = decodingStrategy
15
+ }
16
+
17
+ /// The global configuration of Lottie,
18
+ /// which applies to all `AnimationView`s by default.
19
+ public static var shared = LottieConfiguration()
20
+
21
+ /// The rendering engine implementation to use when displaying an animation
22
+ public var renderingEngine: RenderingEngineOption
23
+
24
+ /// The decoding implementation to use when parsing an animation JSON file
25
+ public var decodingStrategy: DecodingStrategy
26
+
27
+ }
28
+
29
+ // MARK: - RenderingEngineOption
30
+
31
+ public enum RenderingEngineOption: Hashable {
32
+ /// Uses the Core Animation engine for supported animations, and falls back to using
33
+ /// the Main Thread engine for animations that use features not supported by the
34
+ /// Core Animation engine.
35
+ case automatic
36
+
37
+ /// Uses the specified rendering engine
38
+ case specific(RenderingEngine)
39
+
40
+ /// The Main Thread rendering engine, which supports all Lottie features
41
+ /// but runs on the main thread, which comes with some CPU overhead and
42
+ /// can cause the animation to play at a low framerate when the CPU is busy.
43
+ public static var mainThread: RenderingEngineOption { .specific(.mainThread) }
44
+
45
+ /// The Core Animation rendering engine, that animates using Core Animation
46
+ /// and has better performance characteristics than the Main Thread engine,
47
+ /// but doesn't support all Lottie features.
48
+ public static var coreAnimation: RenderingEngineOption { .specific(.coreAnimation) }
49
+ }
50
+
51
+ // MARK: - RenderingEngine
52
+
53
+ /// The rendering engine implementation to use when displaying an animation
54
+ public enum RenderingEngine: Hashable {
55
+ /// The Main Thread rendering engine, which supports all Lottie features
56
+ /// but runs on the main thread, which comes with some CPU overhead and
57
+ /// can cause the animation to play at a low framerate when the CPU is busy.
58
+ case mainThread
59
+
60
+ /// The Core Animation rendering engine, that animates using Core Animation
61
+ /// and has better performance characteristics than the Main Thread engine,
62
+ /// but doesn't support all Lottie features.
63
+ case coreAnimation
64
+ }
65
+
66
+ // MARK: - RenderingEngineOption + RawRepresentable, CustomStringConvertible
67
+
68
+ extension RenderingEngineOption: RawRepresentable, CustomStringConvertible {
69
+
70
+ // MARK: Lifecycle
71
+
72
+ public init?(rawValue: String) {
73
+ if rawValue == "Automatic" {
74
+ self = .automatic
75
+ } else if let engine = RenderingEngine(rawValue: rawValue) {
76
+ self = .specific(engine)
77
+ } else {
78
+ return nil
79
+ }
80
+ }
81
+
82
+ // MARK: Public
83
+
84
+ public var rawValue: String {
85
+ switch self {
86
+ case .automatic:
87
+ return "Automatic"
88
+ case .specific(let engine):
89
+ return engine.rawValue
90
+ }
91
+ }
92
+
93
+ public var description: String {
94
+ rawValue
95
+ }
96
+
97
+ }
98
+
99
+ // MARK: - RenderingEngine + RawRepresentable, CustomStringConvertible
100
+
101
+ extension RenderingEngine: RawRepresentable, CustomStringConvertible {
102
+
103
+ // MARK: Lifecycle
104
+
105
+ public init?(rawValue: String) {
106
+ switch rawValue {
107
+ case "Main Thread":
108
+ self = .mainThread
109
+ case "Core Animation":
110
+ self = .coreAnimation
111
+ default:
112
+ return nil
113
+ }
114
+ }
115
+
116
+ // MARK: Public
117
+
118
+ public var rawValue: String {
119
+ switch self {
120
+ case .mainThread:
121
+ return "Main Thread"
122
+ case .coreAnimation:
123
+ return "Core Animation"
124
+ }
125
+ }
126
+
127
+ public var description: String {
128
+ rawValue
129
+ }
130
+ }
131
+
132
+ // MARK: - DecodingStrategy
133
+
134
+ /// How animation files should be decoded
135
+ public enum DecodingStrategy: Hashable {
136
+ /// Use Codable. This is the default strategy introduced on Lottie 3.
137
+ case codable
138
+
139
+ /// Manually deserialize a dictionary into an Animation.
140
+ /// This should be at least 2-3x faster than using Codable,
141
+ /// but since it's manually implemented, there might be issues while it's experimental.
142
+ case dictionaryBased
143
+ }
@@ -5,8 +5,8 @@
5
5
  // Created by Brandon Withrow on 2/6/19.
6
6
  //
7
7
 
8
- import Foundation
9
8
  import CoreGraphics
9
+ import Foundation
10
10
 
11
11
  /// Defines animation time in Frames (Seconds * Framerate).
12
12
  public typealias AnimationFrameTime = CGFloat
@@ -7,11 +7,13 @@
7
7
 
8
8
  import Foundation
9
9
 
10
- public enum ColorFormatDenominator {
10
+ // MARK: - ColorFormatDenominator
11
+
12
+ public enum ColorFormatDenominator: Hashable {
11
13
  case One
12
14
  case OneHundred
13
15
  case TwoFiftyFive
14
-
16
+
15
17
  var value: Double {
16
18
  switch self {
17
19
  case .One:
@@ -24,18 +26,20 @@ public enum ColorFormatDenominator {
24
26
  }
25
27
  }
26
28
 
27
- public struct Color {
28
-
29
+ // MARK: - Color
30
+
31
+ public struct Color: Hashable {
32
+
29
33
  public var r: Double
30
34
  public var g: Double
31
35
  public var b: Double
32
36
  public var a: Double
33
-
37
+
34
38
  public init(r: Double, g: Double, b: Double, a: Double, denominator: ColorFormatDenominator = .One) {
35
39
  self.r = r / denominator.value
36
40
  self.g = g / denominator.value
37
41
  self.b = b / denominator.value
38
42
  self.a = a / denominator.value
39
43
  }
40
-
44
+
41
45
  }
@@ -7,31 +7,32 @@
7
7
 
8
8
  import Foundation
9
9
 
10
- public struct Vector1D {
11
-
10
+ // MARK: - Vector1D
11
+
12
+ public struct Vector1D: Hashable {
13
+
12
14
  public init(_ value: Double) {
13
15
  self.value = value
14
16
  }
15
-
17
+
16
18
  public let value: Double
17
-
19
+
18
20
  }
19
21
 
22
+ // MARK: - Vector3D
23
+
24
+ /// A three dimensional vector.
25
+ /// These vectors are encoded and decoded from [Double]
26
+ public struct Vector3D: Hashable {
20
27
 
21
- /**
22
- A three dimensional vector.
23
- These vectors are encoded and decoded from [Double]
24
- */
25
- public struct Vector3D {
26
-
27
28
  public let x: Double
28
29
  public let y: Double
29
30
  public let z: Double
30
-
31
+
31
32
  public init(x: Double, y: Double, z: Double) {
32
33
  self.x = x
33
34
  self.y = y
34
35
  self.z = z
35
36
  }
36
-
37
+
37
38
  }
@@ -0,0 +1,53 @@
1
+ //
2
+ // AnimationImageProvider.swift
3
+ // Lottie_iOS
4
+ //
5
+ // Created by Alexandr Goncharov on 07/06/2019.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: - AnimationTextProvider
11
+
12
+ /// Text provider is a protocol that is used to supply text to `AnimationView`.
13
+ public protocol AnimationTextProvider: AnyObject {
14
+ func textFor(keypathName: String, sourceText: String) -> String
15
+ }
16
+
17
+ // MARK: - DictionaryTextProvider
18
+
19
+ /// Text provider that simply map values from dictionary
20
+ public final class DictionaryTextProvider: AnimationTextProvider {
21
+
22
+ // MARK: Lifecycle
23
+
24
+ public init(_ values: [String: String]) {
25
+ self.values = values
26
+ }
27
+
28
+ // MARK: Public
29
+
30
+ public func textFor(keypathName: String, sourceText: String) -> String {
31
+ values[keypathName] ?? sourceText
32
+ }
33
+
34
+ // MARK: Internal
35
+
36
+ let values: [String: String]
37
+ }
38
+
39
+ // MARK: - DefaultTextProvider
40
+
41
+ /// Default text provider. Uses text in the animation file
42
+ public final class DefaultTextProvider: AnimationTextProvider {
43
+
44
+ // MARK: Lifecycle
45
+
46
+ public init() { }
47
+
48
+ // MARK: Public
49
+
50
+ public func textFor(keypathName _: String, sourceText: String) -> String {
51
+ sourceText
52
+ }
53
+ }
@@ -8,40 +8,51 @@
8
8
  import Foundation
9
9
  #if os(iOS) || os(tvOS) || os(watchOS) || targetEnvironment(macCatalyst)
10
10
  import UIKit
11
- /**
12
- An interactive button that plays an animation when pressed.
13
- */
14
- final public class AnimatedButton: AnimatedControl {
15
-
11
+ /// An interactive button that plays an animation when pressed.
12
+ open class AnimatedButton: AnimatedControl {
13
+
14
+ // MARK: Lifecycle
15
+
16
+ public override init(
17
+ animation: Animation,
18
+ configuration: LottieConfiguration = .shared)
19
+ {
20
+ super.init(animation: animation, configuration: configuration)
21
+ isAccessibilityElement = true
22
+ }
23
+
24
+ public override init() {
25
+ super.init()
26
+ isAccessibilityElement = true
27
+ }
28
+
29
+ required public init?(coder aDecoder: NSCoder) {
30
+ super.init(coder: aDecoder)
31
+ isAccessibilityElement = true
32
+ }
33
+
34
+ // MARK: Public
35
+
36
+ public override var accessibilityTraits: UIAccessibilityTraits {
37
+ set { super.accessibilityTraits = newValue }
38
+ get { super.accessibilityTraits.union(.button) }
39
+ }
40
+
16
41
  /// Sets the play range for the given UIControlEvent.
17
42
  public func setPlayRange(fromProgress: AnimationProgressTime, toProgress: AnimationProgressTime, event: UIControl.Event) {
18
43
  rangesForEvents[event.rawValue] = (from: fromProgress, to: toProgress)
19
44
  }
20
-
45
+
21
46
  /// Sets the play range for the given UIControlEvent.
22
47
  public func setPlayRange(fromMarker fromName: String, toMarker toName: String, event: UIControl.Event) {
23
- if let start = animationView.progressTime(forMarker: fromName),
24
- let end = animationView.progressTime(forMarker: toName) {
48
+ if
49
+ let start = animationView.progressTime(forMarker: fromName),
50
+ let end = animationView.progressTime(forMarker: toName)
51
+ {
25
52
  rangesForEvents[event.rawValue] = (from: start, to: end)
26
53
  }
27
54
  }
28
-
29
- public override init(animation: Animation) {
30
- super.init(animation: animation)
31
- self.accessibilityTraits = UIAccessibilityTraits.button
32
- }
33
-
34
- public override init() {
35
- super.init()
36
- self.accessibilityTraits = UIAccessibilityTraits.button
37
- }
38
55
 
39
- fileprivate var rangesForEvents: [UInt : (from: CGFloat, to: CGFloat)] = [UIControl.Event.touchUpInside.rawValue : (from: 0, to: 1)]
40
-
41
- required public init?(coder aDecoder: NSCoder) {
42
- super.init(coder: aDecoder)
43
- }
44
-
45
56
  public override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
46
57
  let _ = super.beginTracking(touch, with: event)
47
58
  let touchEvent = UIControl.Event.touchDown
@@ -50,7 +61,7 @@ final public class AnimatedButton: AnimatedControl {
50
61
  }
51
62
  return true
52
63
  }
53
-
64
+
54
65
  public override func endTracking(_ touch: UITouch?, with event: UIEvent?) {
55
66
  super.endTracking(touch, with: event)
56
67
  let touchEvent: UIControl.Event
@@ -59,10 +70,15 @@ final public class AnimatedButton: AnimatedControl {
59
70
  } else {
60
71
  touchEvent = UIControl.Event.touchUpOutside
61
72
  }
62
-
73
+
63
74
  if let playrange = rangesForEvents[touchEvent.rawValue] {
64
75
  animationView.play(fromProgress: playrange.from, toProgress: playrange.to, loopMode: LottieLoopMode.playOnce)
65
76
  }
66
77
  }
78
+
79
+ // MARK: Private
80
+
81
+ private var rangesForEvents: [UInt : (from: CGFloat, to: CGFloat)] =
82
+ [UIControl.Event.touchUpInside.rawValue : (from: 0, to: 1)]
67
83
  }
68
84
  #endif