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
@@ -7,6 +7,8 @@
7
7
 
8
8
  import Foundation
9
9
 
10
+ // MARK: - MergeMode
11
+
10
12
  enum MergeMode: Int, Codable {
11
13
  case none
12
14
  case merge
@@ -16,26 +18,41 @@ enum MergeMode: Int, Codable {
16
18
  case exclude
17
19
  }
18
20
 
19
- /// An item that define an ellipse shape
21
+ // MARK: - Merge
22
+
20
23
  final class Merge: ShapeItem {
21
-
22
- /// The mode of the merge path
23
- let mode: MergeMode
24
-
25
- private enum CodingKeys : String, CodingKey {
26
- case mode = "mm"
27
- }
28
-
24
+
25
+ // MARK: Lifecycle
26
+
29
27
  required init(from decoder: Decoder) throws {
30
28
  let container = try decoder.container(keyedBy: Merge.CodingKeys.self)
31
- self.mode = try container.decode(MergeMode.self, forKey: .mode)
29
+ mode = try container.decode(MergeMode.self, forKey: .mode)
32
30
  try super.init(from: decoder)
33
31
  }
34
-
32
+
33
+ required init(dictionary: [String: Any]) throws {
34
+ let modeRawType: Int = try dictionary.value(for: CodingKeys.mode)
35
+ guard let mode = MergeMode(rawValue: modeRawType) else {
36
+ throw InitializableError.invalidInput
37
+ }
38
+ self.mode = mode
39
+ try super.init(dictionary: dictionary)
40
+ }
41
+
42
+ // MARK: Internal
43
+
44
+ /// The mode of the merge path
45
+ let mode: MergeMode
46
+
35
47
  override func encode(to encoder: Encoder) throws {
36
48
  try super.encode(to: encoder)
37
49
  var container = encoder.container(keyedBy: CodingKeys.self)
38
50
  try container.encode(mode, forKey: .mode)
39
51
  }
40
-
52
+
53
+ // MARK: Private
54
+
55
+ private enum CodingKeys: String, CodingKey {
56
+ case mode = "mm"
57
+ }
41
58
  }
@@ -0,0 +1,72 @@
1
+ //
2
+ // Rectangle.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ final class Rectangle: ShapeItem {
11
+
12
+ // MARK: Lifecycle
13
+
14
+ required init(from decoder: Decoder) throws {
15
+ let container = try decoder.container(keyedBy: Rectangle.CodingKeys.self)
16
+ direction = try container.decodeIfPresent(PathDirection.self, forKey: .direction) ?? .clockwise
17
+ position = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .position)
18
+ size = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .size)
19
+ cornerRadius = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .cornerRadius)
20
+ try super.init(from: decoder)
21
+ }
22
+
23
+ required init(dictionary: [String: Any]) throws {
24
+ if
25
+ let directionRawType = dictionary[CodingKeys.direction.rawValue] as? Int,
26
+ let direction = PathDirection(rawValue: directionRawType)
27
+ {
28
+ self.direction = direction
29
+ } else {
30
+ direction = .clockwise
31
+ }
32
+ let positionDictionary: [String: Any] = try dictionary.value(for: CodingKeys.position)
33
+ position = try KeyframeGroup<Vector3D>(dictionary: positionDictionary)
34
+ let sizeDictionary: [String: Any] = try dictionary.value(for: CodingKeys.size)
35
+ size = try KeyframeGroup<Vector3D>(dictionary: sizeDictionary)
36
+ let cornerRadiusDictionary: [String: Any] = try dictionary.value(for: CodingKeys.cornerRadius)
37
+ cornerRadius = try KeyframeGroup<Vector1D>(dictionary: cornerRadiusDictionary)
38
+ try super.init(dictionary: dictionary)
39
+ }
40
+
41
+ // MARK: Internal
42
+
43
+ /// The direction of the rect.
44
+ let direction: PathDirection
45
+
46
+ /// The position
47
+ let position: KeyframeGroup<Vector3D>
48
+
49
+ /// The size
50
+ let size: KeyframeGroup<Vector3D>
51
+
52
+ /// The Corner radius of the rectangle
53
+ let cornerRadius: KeyframeGroup<Vector1D>
54
+
55
+ override func encode(to encoder: Encoder) throws {
56
+ try super.encode(to: encoder)
57
+ var container = encoder.container(keyedBy: CodingKeys.self)
58
+ try container.encode(direction, forKey: .direction)
59
+ try container.encode(position, forKey: .position)
60
+ try container.encode(size, forKey: .size)
61
+ try container.encode(cornerRadius, forKey: .cornerRadius)
62
+ }
63
+
64
+ // MARK: Private
65
+
66
+ private enum CodingKeys: String, CodingKey {
67
+ case direction = "d"
68
+ case position = "p"
69
+ case size = "s"
70
+ case cornerRadius = "r"
71
+ }
72
+ }
@@ -0,0 +1,135 @@
1
+ //
2
+ // Repeater.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ final class Repeater: ShapeItem {
11
+
12
+ // MARK: Lifecycle
13
+
14
+ required init(from decoder: Decoder) throws {
15
+ let container = try decoder.container(keyedBy: Repeater.CodingKeys.self)
16
+ copies = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .copies) ?? KeyframeGroup(Vector1D(0))
17
+ offset = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .offset) ?? KeyframeGroup(Vector1D(0))
18
+ let transformContainer = try container.nestedContainer(keyedBy: TransformKeys.self, forKey: .transform)
19
+ startOpacity = try transformContainer
20
+ .decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .startOpacity) ?? KeyframeGroup(Vector1D(100))
21
+ endOpacity = try transformContainer
22
+ .decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .endOpacity) ?? KeyframeGroup(Vector1D(100))
23
+ rotation = try transformContainer
24
+ .decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation) ?? KeyframeGroup(Vector1D(0))
25
+ position = try transformContainer
26
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .position) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
27
+ anchorPoint = try transformContainer
28
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .anchorPoint) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
29
+ scale = try transformContainer
30
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .scale) ?? KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
31
+ try super.init(from: decoder)
32
+ }
33
+
34
+ required init(dictionary: [String: Any]) throws {
35
+ if let copiesDictionary = dictionary[CodingKeys.copies.rawValue] as? [String: Any] {
36
+ copies = try KeyframeGroup<Vector1D>(dictionary: copiesDictionary)
37
+ } else {
38
+ copies = KeyframeGroup(Vector1D(0))
39
+ }
40
+ if let offsetDictionary = dictionary[CodingKeys.offset.rawValue] as? [String: Any] {
41
+ offset = try KeyframeGroup<Vector1D>(dictionary: offsetDictionary)
42
+ } else {
43
+ offset = KeyframeGroup(Vector1D(0))
44
+ }
45
+ let transformDictionary: [String: Any] = try dictionary.value(for: CodingKeys.transform)
46
+ if let startOpacityDictionary = transformDictionary[TransformKeys.startOpacity.rawValue] as? [String: Any] {
47
+ startOpacity = try KeyframeGroup<Vector1D>(dictionary: startOpacityDictionary)
48
+ } else {
49
+ startOpacity = KeyframeGroup(Vector1D(100))
50
+ }
51
+ if let endOpacityDictionary = transformDictionary[TransformKeys.endOpacity.rawValue] as? [String: Any] {
52
+ endOpacity = try KeyframeGroup<Vector1D>(dictionary: endOpacityDictionary)
53
+ } else {
54
+ endOpacity = KeyframeGroup(Vector1D(100))
55
+ }
56
+ if let rotationDictionary = transformDictionary[TransformKeys.rotation.rawValue] as? [String: Any] {
57
+ rotation = try KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
58
+ } else {
59
+ rotation = KeyframeGroup(Vector1D(0))
60
+ }
61
+ if let positionDictionary = transformDictionary[TransformKeys.position.rawValue] as? [String: Any] {
62
+ position = try KeyframeGroup<Vector3D>(dictionary: positionDictionary)
63
+ } else {
64
+ position = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
65
+ }
66
+ if let anchorPointDictionary = transformDictionary[TransformKeys.anchorPoint.rawValue] as? [String: Any] {
67
+ anchorPoint = try KeyframeGroup<Vector3D>(dictionary: anchorPointDictionary)
68
+ } else {
69
+ anchorPoint = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
70
+ }
71
+ if let scaleDictionary = transformDictionary[TransformKeys.scale.rawValue] as? [String: Any] {
72
+ scale = try KeyframeGroup<Vector3D>(dictionary: scaleDictionary)
73
+ } else {
74
+ scale = KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
75
+ }
76
+ try super.init(dictionary: dictionary)
77
+ }
78
+
79
+ // MARK: Internal
80
+
81
+ /// The number of copies to repeat
82
+ let copies: KeyframeGroup<Vector1D>
83
+
84
+ /// The offset of each copy
85
+ let offset: KeyframeGroup<Vector1D>
86
+
87
+ /// Start Opacity
88
+ let startOpacity: KeyframeGroup<Vector1D>
89
+
90
+ /// End opacity
91
+ let endOpacity: KeyframeGroup<Vector1D>
92
+
93
+ /// The rotation
94
+ let rotation: KeyframeGroup<Vector1D>
95
+
96
+ /// Anchor Point
97
+ let anchorPoint: KeyframeGroup<Vector3D>
98
+
99
+ /// Position
100
+ let position: KeyframeGroup<Vector3D>
101
+
102
+ /// Scale
103
+ let scale: KeyframeGroup<Vector3D>
104
+
105
+ override func encode(to encoder: Encoder) throws {
106
+ try super.encode(to: encoder)
107
+ var container = encoder.container(keyedBy: CodingKeys.self)
108
+ try container.encode(copies, forKey: .copies)
109
+ try container.encode(offset, forKey: .offset)
110
+ var transformContainer = container.nestedContainer(keyedBy: TransformKeys.self, forKey: .transform)
111
+ try transformContainer.encode(startOpacity, forKey: .startOpacity)
112
+ try transformContainer.encode(endOpacity, forKey: .endOpacity)
113
+ try transformContainer.encode(rotation, forKey: .rotation)
114
+ try transformContainer.encode(position, forKey: .position)
115
+ try transformContainer.encode(anchorPoint, forKey: .anchorPoint)
116
+ try transformContainer.encode(scale, forKey: .scale)
117
+ }
118
+
119
+ // MARK: Private
120
+
121
+ private enum CodingKeys: String, CodingKey {
122
+ case copies = "c"
123
+ case offset = "o"
124
+ case transform = "tr"
125
+ }
126
+
127
+ private enum TransformKeys: String, CodingKey {
128
+ case rotation = "r"
129
+ case startOpacity = "so"
130
+ case endOpacity = "eo"
131
+ case anchorPoint = "a"
132
+ case position = "p"
133
+ case scale = "s"
134
+ }
135
+ }
@@ -0,0 +1,56 @@
1
+ //
2
+ // VectorShape.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ /// An item that defines an custom shape
11
+ final class Shape: ShapeItem {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ required init(from decoder: Decoder) throws {
16
+ let container = try decoder.container(keyedBy: Shape.CodingKeys.self)
17
+ path = try container.decode(KeyframeGroup<BezierPath>.self, forKey: .path)
18
+ direction = try container.decodeIfPresent(PathDirection.self, forKey: .direction)
19
+ try super.init(from: decoder)
20
+ }
21
+
22
+ required init(dictionary: [String: Any]) throws {
23
+ let pathDictionary: [String: Any] = try dictionary.value(for: CodingKeys.path)
24
+ path = try KeyframeGroup<BezierPath>(dictionary: pathDictionary)
25
+ if
26
+ let directionRawValue = dictionary[CodingKeys.direction.rawValue] as? Int,
27
+ let direction = PathDirection(rawValue: directionRawValue)
28
+ {
29
+ self.direction = direction
30
+ } else {
31
+ direction = nil
32
+ }
33
+ try super.init(dictionary: dictionary)
34
+ }
35
+
36
+ // MARK: Internal
37
+
38
+ /// The Path
39
+ let path: KeyframeGroup<BezierPath>
40
+
41
+ let direction: PathDirection?
42
+
43
+ override func encode(to encoder: Encoder) throws {
44
+ try super.encode(to: encoder)
45
+ var container = encoder.container(keyedBy: CodingKeys.self)
46
+ try container.encode(path, forKey: .path)
47
+ try container.encodeIfPresent(direction, forKey: .direction)
48
+ }
49
+
50
+ // MARK: Private
51
+
52
+ private enum CodingKeys: String, CodingKey {
53
+ case path = "ks"
54
+ case direction = "d"
55
+ }
56
+ }
@@ -0,0 +1,163 @@
1
+ //
2
+ // ShapeItem.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: - ShapeType + ClassFamily
11
+
12
+ /// Used for mapping a heterogeneous list to classes for parsing.
13
+ extension ShapeType: ClassFamily {
14
+
15
+ static var discriminator: Discriminator = .type
16
+
17
+ func getType() -> AnyObject.Type {
18
+ switch self {
19
+ case .ellipse:
20
+ return Ellipse.self
21
+ case .fill:
22
+ return Fill.self
23
+ case .gradientFill:
24
+ return GradientFill.self
25
+ case .group:
26
+ return Group.self
27
+ case .gradientStroke:
28
+ return GradientStroke.self
29
+ case .merge:
30
+ return Merge.self
31
+ case .rectangle:
32
+ return Rectangle.self
33
+ case .repeater:
34
+ return Repeater.self
35
+ case .shape:
36
+ return Shape.self
37
+ case .star:
38
+ return Star.self
39
+ case .stroke:
40
+ return Stroke.self
41
+ case .trim:
42
+ return Trim.self
43
+ case .transform:
44
+ return ShapeTransform.self
45
+ default:
46
+ return ShapeItem.self
47
+ }
48
+ }
49
+ }
50
+
51
+ // MARK: - ShapeType
52
+
53
+ enum ShapeType: String, Codable {
54
+ case ellipse = "el"
55
+ case fill = "fl"
56
+ case gradientFill = "gf"
57
+ case group = "gr"
58
+ case gradientStroke = "gs"
59
+ case merge = "mm"
60
+ case rectangle = "rc"
61
+ case repeater = "rp"
62
+ case round = "rd"
63
+ case shape = "sh"
64
+ case star = "sr"
65
+ case stroke = "st"
66
+ case trim = "tm"
67
+ case transform = "tr"
68
+ case unknown
69
+
70
+ public init(from decoder: Decoder) throws {
71
+ self = try ShapeType(rawValue: decoder.singleValueContainer().decode(RawValue.self)) ?? .unknown
72
+ }
73
+ }
74
+
75
+ // MARK: - ShapeItem
76
+
77
+ /// An item belonging to a Shape Layer
78
+ class ShapeItem: Codable, DictionaryInitializable {
79
+
80
+ // MARK: Lifecycle
81
+
82
+ required init(from decoder: Decoder) throws {
83
+ let container = try decoder.container(keyedBy: ShapeItem.CodingKeys.self)
84
+ name = try container.decodeIfPresent(String.self, forKey: .name) ?? "Layer"
85
+ type = try container.decode(ShapeType.self, forKey: .type)
86
+ hidden = try container.decodeIfPresent(Bool.self, forKey: .hidden) ?? false
87
+ }
88
+
89
+ required init(dictionary: [String: Any]) throws {
90
+ name = (try? dictionary.value(for: CodingKeys.name)) ?? "Layer"
91
+ type = ShapeType(rawValue: try dictionary.value(for: CodingKeys.type)) ?? .unknown
92
+ hidden = (try? dictionary.value(for: CodingKeys.hidden)) ?? false
93
+ }
94
+
95
+ init(
96
+ name: String,
97
+ type: ShapeType,
98
+ hidden: Bool)
99
+ {
100
+ self.name = name
101
+ self.type = type
102
+ self.hidden = hidden
103
+ }
104
+
105
+ // MARK: Internal
106
+
107
+ /// The name of the shape
108
+ let name: String
109
+
110
+ /// The type of shape
111
+ let type: ShapeType
112
+
113
+ let hidden: Bool
114
+
115
+ // MARK: Fileprivate
116
+
117
+ fileprivate enum CodingKeys: String, CodingKey {
118
+ case name = "nm"
119
+ case type = "ty"
120
+ case hidden = "hd"
121
+ }
122
+ }
123
+
124
+ extension Array where Element == ShapeItem {
125
+
126
+ static func fromDictionaries(_ dictionaries: [[String: Any]]) throws -> [ShapeItem] {
127
+ try dictionaries.compactMap { dictionary in
128
+ let shapeType = dictionary[ShapeItem.CodingKeys.type.rawValue] as? String
129
+ switch ShapeType(rawValue: shapeType ?? ShapeType.unknown.rawValue) {
130
+ case .ellipse:
131
+ return try Ellipse(dictionary: dictionary)
132
+ case .fill:
133
+ return try Fill(dictionary: dictionary)
134
+ case .gradientFill:
135
+ return try GradientFill(dictionary: dictionary)
136
+ case .group:
137
+ return try Group(dictionary: dictionary)
138
+ case .gradientStroke:
139
+ return try GradientStroke(dictionary: dictionary)
140
+ case .merge:
141
+ return try Merge(dictionary: dictionary)
142
+ case .rectangle:
143
+ return try Rectangle(dictionary: dictionary)
144
+ case .repeater:
145
+ return try Repeater(dictionary: dictionary)
146
+ case .shape:
147
+ return try Shape(dictionary: dictionary)
148
+ case .star:
149
+ return try Star(dictionary: dictionary)
150
+ case .stroke:
151
+ return try Stroke(dictionary: dictionary)
152
+ case .trim:
153
+ return try Trim(dictionary: dictionary)
154
+ case .transform:
155
+ return try ShapeTransform(dictionary: dictionary)
156
+ case .none:
157
+ return nil
158
+ default:
159
+ return try ShapeItem(dictionary: dictionary)
160
+ }
161
+ }
162
+ }
163
+ }
@@ -0,0 +1,135 @@
1
+ //
2
+ // TransformItem.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ final class ShapeTransform: ShapeItem {
11
+
12
+ // MARK: Lifecycle
13
+
14
+ required init(from decoder: Decoder) throws {
15
+ let container = try decoder.container(keyedBy: ShapeTransform.CodingKeys.self)
16
+ anchor = try container
17
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .anchor) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
18
+ position = try container
19
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .position) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
20
+ scale = try container
21
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .scale) ?? KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
22
+ rotation = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation) ?? KeyframeGroup(Vector1D(0))
23
+ opacity = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .opacity) ?? KeyframeGroup(Vector1D(100))
24
+ skew = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skew) ?? KeyframeGroup(Vector1D(0))
25
+ skewAxis = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skewAxis) ?? KeyframeGroup(Vector1D(0))
26
+ try super.init(from: decoder)
27
+ }
28
+
29
+ required init(dictionary: [String: Any]) throws {
30
+ if
31
+ let anchorDictionary = dictionary[CodingKeys.anchor.rawValue] as? [String: Any],
32
+ let anchor = try? KeyframeGroup<Vector3D>(dictionary: anchorDictionary)
33
+ {
34
+ self.anchor = anchor
35
+ } else {
36
+ anchor = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
37
+ }
38
+ if
39
+ let positionDictionary = dictionary[CodingKeys.position.rawValue] as? [String: Any],
40
+ let position = try? KeyframeGroup<Vector3D>(dictionary: positionDictionary)
41
+ {
42
+ self.position = position
43
+ } else {
44
+ position = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
45
+ }
46
+ if
47
+ let scaleDictionary = dictionary[CodingKeys.scale.rawValue] as? [String: Any],
48
+ let scale = try? KeyframeGroup<Vector3D>(dictionary: scaleDictionary)
49
+ {
50
+ self.scale = scale
51
+ } else {
52
+ scale = KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
53
+ }
54
+ if
55
+ let rotationDictionary = dictionary[CodingKeys.rotation.rawValue] as? [String: Any],
56
+ let rotation = try? KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
57
+ {
58
+ self.rotation = rotation
59
+ } else {
60
+ rotation = KeyframeGroup(Vector1D(0))
61
+ }
62
+ if
63
+ let opacityDictionary = dictionary[CodingKeys.opacity.rawValue] as? [String: Any],
64
+ let opacity = try? KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
65
+ {
66
+ self.opacity = opacity
67
+ } else {
68
+ opacity = KeyframeGroup(Vector1D(100))
69
+ }
70
+ if
71
+ let skewDictionary = dictionary[CodingKeys.skew.rawValue] as? [String: Any],
72
+ let skew = try? KeyframeGroup<Vector1D>(dictionary: skewDictionary)
73
+ {
74
+ self.skew = skew
75
+ } else {
76
+ skew = KeyframeGroup(Vector1D(0))
77
+ }
78
+ if
79
+ let skewAxisDictionary = dictionary[CodingKeys.skewAxis.rawValue] as? [String: Any],
80
+ let skewAxis = try? KeyframeGroup<Vector1D>(dictionary: skewAxisDictionary)
81
+ {
82
+ self.skewAxis = skewAxis
83
+ } else {
84
+ skewAxis = KeyframeGroup(Vector1D(0))
85
+ }
86
+ try super.init(dictionary: dictionary)
87
+ }
88
+
89
+ // MARK: Internal
90
+
91
+ /// Anchor Point
92
+ let anchor: KeyframeGroup<Vector3D>
93
+
94
+ /// Position
95
+ let position: KeyframeGroup<Vector3D>
96
+
97
+ /// Scale
98
+ let scale: KeyframeGroup<Vector3D>
99
+
100
+ /// Rotation
101
+ let rotation: KeyframeGroup<Vector1D>
102
+
103
+ /// opacity
104
+ let opacity: KeyframeGroup<Vector1D>
105
+
106
+ /// Skew
107
+ let skew: KeyframeGroup<Vector1D>
108
+
109
+ /// Skew Axis
110
+ let skewAxis: KeyframeGroup<Vector1D>
111
+
112
+ override func encode(to encoder: Encoder) throws {
113
+ try super.encode(to: encoder)
114
+ var container = encoder.container(keyedBy: CodingKeys.self)
115
+ try container.encode(anchor, forKey: .anchor)
116
+ try container.encode(position, forKey: .position)
117
+ try container.encode(scale, forKey: .scale)
118
+ try container.encode(rotation, forKey: .rotation)
119
+ try container.encode(opacity, forKey: .opacity)
120
+ try container.encode(skew, forKey: .skew)
121
+ try container.encode(skewAxis, forKey: .skewAxis)
122
+ }
123
+
124
+ // MARK: Private
125
+
126
+ private enum CodingKeys: String, CodingKey {
127
+ case anchor = "a"
128
+ case position = "p"
129
+ case scale = "s"
130
+ case rotation = "r"
131
+ case opacity = "o"
132
+ case skew = "sk"
133
+ case skewAxis = "sa"
134
+ }
135
+ }