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,131 @@
1
+ //
2
+ // Star.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: - StarType
11
+
12
+ enum StarType: Int, Codable {
13
+ case none
14
+ case star
15
+ case polygon
16
+ }
17
+
18
+ // MARK: - Star
19
+
20
+ final class Star: ShapeItem {
21
+
22
+ // MARK: Lifecycle
23
+
24
+ required init(from decoder: Decoder) throws {
25
+ let container = try decoder.container(keyedBy: Star.CodingKeys.self)
26
+ direction = try container.decodeIfPresent(PathDirection.self, forKey: .direction) ?? .clockwise
27
+ position = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .position)
28
+ outerRadius = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .outerRadius)
29
+ outerRoundness = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .outerRoundness)
30
+ innerRadius = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .innerRadius)
31
+ innerRoundness = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .innerRoundness)
32
+ rotation = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .rotation)
33
+ points = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .points)
34
+ starType = try container.decode(StarType.self, forKey: .starType)
35
+ try super.init(from: decoder)
36
+ }
37
+
38
+ required init(dictionary: [String: Any]) throws {
39
+ if
40
+ let directionRawValue = dictionary[CodingKeys.direction.rawValue] as? Int,
41
+ let direction = PathDirection(rawValue: directionRawValue)
42
+ {
43
+ self.direction = direction
44
+ } else {
45
+ direction = .clockwise
46
+ }
47
+ let positionDictionary: [String: Any] = try dictionary.value(for: CodingKeys.position)
48
+ position = try KeyframeGroup<Vector3D>(dictionary: positionDictionary)
49
+ let outerRadiusDictionary: [String: Any] = try dictionary.value(for: CodingKeys.outerRadius)
50
+ outerRadius = try KeyframeGroup<Vector1D>(dictionary: outerRadiusDictionary)
51
+ let outerRoundnessDictionary: [String: Any] = try dictionary.value(for: CodingKeys.outerRoundness)
52
+ outerRoundness = try KeyframeGroup<Vector1D>(dictionary: outerRoundnessDictionary)
53
+ if let innerRadiusDictionary = dictionary[CodingKeys.innerRadius.rawValue] as? [String: Any] {
54
+ innerRadius = try KeyframeGroup<Vector1D>(dictionary: innerRadiusDictionary)
55
+ } else {
56
+ innerRadius = nil
57
+ }
58
+ if let innerRoundnessDictionary = dictionary[CodingKeys.innerRoundness.rawValue] as? [String: Any] {
59
+ innerRoundness = try KeyframeGroup<Vector1D>(dictionary: innerRoundnessDictionary)
60
+ } else {
61
+ innerRoundness = nil
62
+ }
63
+ let rotationDictionary: [String: Any] = try dictionary.value(for: CodingKeys.rotation)
64
+ rotation = try KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
65
+ let pointsDictionary: [String: Any] = try dictionary.value(for: CodingKeys.points)
66
+ points = try KeyframeGroup<Vector1D>(dictionary: pointsDictionary)
67
+ let starTypeRawValue: Int = try dictionary.value(for: CodingKeys.starType)
68
+ guard let starType = StarType(rawValue: starTypeRawValue) else {
69
+ throw InitializableError.invalidInput
70
+ }
71
+ self.starType = starType
72
+ try super.init(dictionary: dictionary)
73
+ }
74
+
75
+ // MARK: Internal
76
+
77
+ /// The direction of the star.
78
+ let direction: PathDirection
79
+
80
+ /// The position of the star
81
+ let position: KeyframeGroup<Vector3D>
82
+
83
+ /// The outer radius of the star
84
+ let outerRadius: KeyframeGroup<Vector1D>
85
+
86
+ /// The outer roundness of the star
87
+ let outerRoundness: KeyframeGroup<Vector1D>
88
+
89
+ /// The outer radius of the star
90
+ let innerRadius: KeyframeGroup<Vector1D>?
91
+
92
+ /// The outer roundness of the star
93
+ let innerRoundness: KeyframeGroup<Vector1D>?
94
+
95
+ /// The rotation of the star
96
+ let rotation: KeyframeGroup<Vector1D>
97
+
98
+ /// The number of points on the star
99
+ let points: KeyframeGroup<Vector1D>
100
+
101
+ /// The type of star
102
+ let starType: StarType
103
+
104
+ override func encode(to encoder: Encoder) throws {
105
+ try super.encode(to: encoder)
106
+ var container = encoder.container(keyedBy: CodingKeys.self)
107
+ try container.encode(direction, forKey: .direction)
108
+ try container.encode(position, forKey: .position)
109
+ try container.encode(outerRadius, forKey: .outerRadius)
110
+ try container.encode(outerRoundness, forKey: .outerRoundness)
111
+ try container.encode(innerRadius, forKey: .innerRadius)
112
+ try container.encode(innerRoundness, forKey: .innerRoundness)
113
+ try container.encode(rotation, forKey: .rotation)
114
+ try container.encode(points, forKey: .points)
115
+ try container.encode(starType, forKey: .starType)
116
+ }
117
+
118
+ // MARK: Private
119
+
120
+ private enum CodingKeys: String, CodingKey {
121
+ case direction = "d"
122
+ case position = "p"
123
+ case outerRadius = "or"
124
+ case outerRoundness = "os"
125
+ case innerRadius = "ir"
126
+ case innerRoundness = "is"
127
+ case rotation = "r"
128
+ case points = "pt"
129
+ case starType = "sy"
130
+ }
131
+ }
@@ -0,0 +1,101 @@
1
+ //
2
+ // Stroke.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ final class Stroke: ShapeItem {
11
+
12
+ // MARK: Lifecycle
13
+
14
+ required init(from decoder: Decoder) throws {
15
+ let container = try decoder.container(keyedBy: Stroke.CodingKeys.self)
16
+ opacity = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .opacity)
17
+ color = try container.decode(KeyframeGroup<Color>.self, forKey: .color)
18
+ width = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .width)
19
+ lineCap = try container.decodeIfPresent(LineCap.self, forKey: .lineCap) ?? .round
20
+ lineJoin = try container.decodeIfPresent(LineJoin.self, forKey: .lineJoin) ?? .round
21
+ miterLimit = try container.decodeIfPresent(Double.self, forKey: .miterLimit) ?? 4
22
+ dashPattern = try container.decodeIfPresent([DashElement].self, forKey: .dashPattern)
23
+ try super.init(from: decoder)
24
+ }
25
+
26
+ required init(dictionary: [String: Any]) throws {
27
+ let opacityDictionary: [String: Any] = try dictionary.value(for: CodingKeys.opacity)
28
+ opacity = try KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
29
+ let colorDictionary: [String: Any] = try dictionary.value(for: CodingKeys.color)
30
+ color = try KeyframeGroup<Color>(dictionary: colorDictionary)
31
+ let widthDictionary: [String: Any] = try dictionary.value(for: CodingKeys.width)
32
+ width = try KeyframeGroup<Vector1D>(dictionary: widthDictionary)
33
+ if
34
+ let lineCapRawValue = dictionary[CodingKeys.lineCap.rawValue] as? Int,
35
+ let lineCap = LineCap(rawValue: lineCapRawValue)
36
+ {
37
+ self.lineCap = lineCap
38
+ } else {
39
+ lineCap = .round
40
+ }
41
+ if
42
+ let lineJoinRawValue = dictionary[CodingKeys.lineJoin.rawValue] as? Int,
43
+ let lineJoin = LineJoin(rawValue: lineJoinRawValue)
44
+ {
45
+ self.lineJoin = lineJoin
46
+ } else {
47
+ lineJoin = .round
48
+ }
49
+ miterLimit = (try? dictionary.value(for: CodingKeys.miterLimit)) ?? 4
50
+ let dashPatternDictionaries = dictionary[CodingKeys.dashPattern.rawValue] as? [[String: Any]]
51
+ dashPattern = try? dashPatternDictionaries?.map({ try DashElement(dictionary: $0) })
52
+ try super.init(dictionary: dictionary)
53
+ }
54
+
55
+ // MARK: Internal
56
+
57
+ /// The opacity of the stroke
58
+ let opacity: KeyframeGroup<Vector1D>
59
+
60
+ /// The Color of the stroke
61
+ let color: KeyframeGroup<Color>
62
+
63
+ /// The width of the stroke
64
+ let width: KeyframeGroup<Vector1D>
65
+
66
+ /// Line Cap
67
+ let lineCap: LineCap
68
+
69
+ /// Line Join
70
+ let lineJoin: LineJoin
71
+
72
+ /// Miter Limit
73
+ let miterLimit: Double
74
+
75
+ /// The dash pattern of the stroke
76
+ let dashPattern: [DashElement]?
77
+
78
+ override func encode(to encoder: Encoder) throws {
79
+ try super.encode(to: encoder)
80
+ var container = encoder.container(keyedBy: CodingKeys.self)
81
+ try container.encode(opacity, forKey: .opacity)
82
+ try container.encode(color, forKey: .color)
83
+ try container.encode(width, forKey: .width)
84
+ try container.encode(lineCap, forKey: .lineCap)
85
+ try container.encode(lineJoin, forKey: .lineJoin)
86
+ try container.encode(miterLimit, forKey: .miterLimit)
87
+ try container.encodeIfPresent(dashPattern, forKey: .dashPattern)
88
+ }
89
+
90
+ // MARK: Private
91
+
92
+ private enum CodingKeys: String, CodingKey {
93
+ case opacity = "o"
94
+ case color = "c"
95
+ case width = "w"
96
+ case lineCap = "lc"
97
+ case lineJoin = "lj"
98
+ case miterLimit = "ml"
99
+ case dashPattern = "d"
100
+ }
101
+ }
@@ -0,0 +1,77 @@
1
+ //
2
+ // Trim.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: - TrimType
11
+
12
+ enum TrimType: Int, Codable {
13
+ case simultaneously = 1
14
+ case individually = 2
15
+ }
16
+
17
+ // MARK: - Trim
18
+
19
+ final class Trim: ShapeItem {
20
+
21
+ // MARK: Lifecycle
22
+
23
+ required init(from decoder: Decoder) throws {
24
+ let container = try decoder.container(keyedBy: Trim.CodingKeys.self)
25
+ start = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .start)
26
+ end = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .end)
27
+ offset = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .offset)
28
+ trimType = try container.decode(TrimType.self, forKey: .trimType)
29
+ try super.init(from: decoder)
30
+ }
31
+
32
+ required init(dictionary: [String: Any]) throws {
33
+ let startDictionary: [String: Any] = try dictionary.value(for: CodingKeys.start)
34
+ start = try KeyframeGroup<Vector1D>(dictionary: startDictionary)
35
+ let endDictionary: [String: Any] = try dictionary.value(for: CodingKeys.end)
36
+ end = try KeyframeGroup<Vector1D>(dictionary: endDictionary)
37
+ let offsetDictionary: [String: Any] = try dictionary.value(for: CodingKeys.offset)
38
+ offset = try KeyframeGroup<Vector1D>(dictionary: offsetDictionary)
39
+ let trimTypeRawValue: Int = try dictionary.value(for: CodingKeys.trimType)
40
+ guard let trimType = TrimType(rawValue: trimTypeRawValue) else {
41
+ throw InitializableError.invalidInput
42
+ }
43
+ self.trimType = trimType
44
+ try super.init(dictionary: dictionary)
45
+ }
46
+
47
+ // MARK: Internal
48
+
49
+ /// The start of the trim
50
+ let start: KeyframeGroup<Vector1D>
51
+
52
+ /// The end of the trim
53
+ let end: KeyframeGroup<Vector1D>
54
+
55
+ /// The offset of the trim
56
+ let offset: KeyframeGroup<Vector1D>
57
+
58
+ let trimType: TrimType
59
+
60
+ override func encode(to encoder: Encoder) throws {
61
+ try super.encode(to: encoder)
62
+ var container = encoder.container(keyedBy: CodingKeys.self)
63
+ try container.encode(start, forKey: .start)
64
+ try container.encode(end, forKey: .end)
65
+ try container.encode(offset, forKey: .offset)
66
+ try container.encode(trimType, forKey: .trimType)
67
+ }
68
+
69
+ // MARK: Private
70
+
71
+ private enum CodingKeys: String, CodingKey {
72
+ case start = "s"
73
+ case end = "e"
74
+ case offset = "o"
75
+ case trimType = "m"
76
+ }
77
+ }
@@ -0,0 +1,61 @@
1
+ //
2
+ // Font.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/9/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: - Font
11
+
12
+ final class Font: Codable, DictionaryInitializable {
13
+
14
+ // MARK: Lifecycle
15
+
16
+ init(dictionary: [String: Any]) throws {
17
+ name = try dictionary.value(for: CodingKeys.name)
18
+ familyName = try dictionary.value(for: CodingKeys.familyName)
19
+ style = try dictionary.value(for: CodingKeys.style)
20
+ ascent = try dictionary.value(for: CodingKeys.ascent)
21
+ }
22
+
23
+ // MARK: Internal
24
+
25
+ let name: String
26
+ let familyName: String
27
+ let style: String
28
+ let ascent: Double
29
+
30
+ // MARK: Private
31
+
32
+ private enum CodingKeys: String, CodingKey {
33
+ case name = "fName"
34
+ case familyName = "fFamily"
35
+ case style = "fStyle"
36
+ case ascent
37
+ }
38
+
39
+ }
40
+
41
+ // MARK: - FontList
42
+
43
+ /// A list of fonts
44
+ final class FontList: Codable, DictionaryInitializable {
45
+
46
+ // MARK: Lifecycle
47
+
48
+ init(dictionary: [String: Any]) throws {
49
+ let fontDictionaries: [[String: Any]] = try dictionary.value(for: CodingKeys.fonts)
50
+ fonts = try fontDictionaries.map({ try Font(dictionary: $0) })
51
+ }
52
+
53
+ // MARK: Internal
54
+
55
+ enum CodingKeys: String, CodingKey {
56
+ case fonts = "list"
57
+ }
58
+
59
+ let fonts: [Font]
60
+
61
+ }
@@ -8,65 +8,89 @@
8
8
  import Foundation
9
9
 
10
10
  /// A model that holds a vector character
11
- final class Glyph: Codable {
12
-
11
+ final class Glyph: Codable, DictionaryInitializable {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ required init(from decoder: Decoder) throws {
16
+ let container = try decoder.container(keyedBy: Glyph.CodingKeys.self)
17
+ character = try container.decode(String.self, forKey: .character)
18
+ fontSize = try container.decode(Double.self, forKey: .fontSize)
19
+ fontFamily = try container.decode(String.self, forKey: .fontFamily)
20
+ fontStyle = try container.decode(String.self, forKey: .fontStyle)
21
+ width = try container.decode(Double.self, forKey: .width)
22
+ if
23
+ container.contains(.shapeWrapper),
24
+ let shapeContainer = try? container.nestedContainer(keyedBy: ShapeKey.self, forKey: .shapeWrapper),
25
+ shapeContainer.contains(.shapes)
26
+ {
27
+ shapes = try shapeContainer.decode([ShapeItem].self, ofFamily: ShapeType.self, forKey: .shapes)
28
+ } else {
29
+ shapes = []
30
+ }
31
+ }
32
+
33
+ init(dictionary: [String: Any]) throws {
34
+ character = try dictionary.value(for: CodingKeys.character)
35
+ fontSize = try dictionary.value(for: CodingKeys.fontSize)
36
+ fontFamily = try dictionary.value(for: CodingKeys.fontFamily)
37
+ fontStyle = try dictionary.value(for: CodingKeys.fontStyle)
38
+ width = try dictionary.value(for: CodingKeys.width)
39
+ if
40
+ let shapes = dictionary[CodingKeys.shapeWrapper.rawValue] as? [String: Any],
41
+ let shapeDictionaries = shapes[ShapeKey.shapes.rawValue] as? [[String: Any]]
42
+ {
43
+ self.shapes = try [ShapeItem].fromDictionaries(shapeDictionaries)
44
+ } else {
45
+ shapes = [ShapeItem]()
46
+ }
47
+ }
48
+
49
+ // MARK: Internal
50
+
13
51
  /// The character
14
52
  let character: String
15
-
53
+
16
54
  /// The font size of the character
17
55
  let fontSize: Double
18
-
56
+
19
57
  /// The font family of the character
20
58
  let fontFamily: String
21
-
59
+
22
60
  /// The Style of the character
23
61
  let fontStyle: String
24
-
62
+
25
63
  /// The Width of the character
26
64
  let width: Double
27
-
65
+
28
66
  /// The Shape Data of the Character
29
67
  let shapes: [ShapeItem]
30
-
31
- private enum CodingKeys: String, CodingKey {
32
- case character = "ch"
33
- case fontSize = "size"
34
- case fontFamily = "fFamily"
35
- case fontStyle = "style"
36
- case width = "w"
37
- case shapeWrapper = "data"
38
- }
39
-
40
- private enum ShapeKey: String, CodingKey {
41
- case shapes = "shapes"
42
- }
43
-
44
- required init(from decoder: Decoder) throws {
45
- let container = try decoder.container(keyedBy: Glyph.CodingKeys.self)
46
- self.character = try container.decode(String.self, forKey: .character)
47
- self.fontSize = try container.decode(Double.self, forKey: .fontSize)
48
- self.fontFamily = try container.decode(String.self, forKey: .fontFamily)
49
- self.fontStyle = try container.decode(String.self, forKey: .fontStyle)
50
- self.width = try container.decode(Double.self, forKey: .width)
51
- if container.contains(.shapeWrapper),
52
- let shapeContainer = try? container.nestedContainer(keyedBy: ShapeKey.self, forKey: .shapeWrapper),
53
- shapeContainer.contains(.shapes) {
54
- self.shapes = try shapeContainer.decode([ShapeItem].self, ofFamily: ShapeType.self, forKey: .shapes)
55
- } else {
56
- self.shapes = []
57
- }
58
- }
59
-
68
+
60
69
  func encode(to encoder: Encoder) throws {
61
70
  var container = encoder.container(keyedBy: CodingKeys.self)
62
-
71
+
63
72
  try container.encode(character, forKey: .character)
64
73
  try container.encode(fontSize, forKey: .fontSize)
65
74
  try container.encode(fontFamily, forKey: .fontFamily)
66
75
  try container.encode(fontStyle, forKey: .fontStyle)
67
76
  try container.encode(width, forKey: .width)
68
-
77
+
69
78
  var shapeContainer = container.nestedContainer(keyedBy: ShapeKey.self, forKey: .shapeWrapper)
70
79
  try shapeContainer.encode(shapes, forKey: .shapes)
71
80
  }
81
+
82
+ // MARK: Private
83
+
84
+ private enum CodingKeys: String, CodingKey {
85
+ case character = "ch"
86
+ case fontSize = "size"
87
+ case fontFamily = "fFamily"
88
+ case fontStyle = "style"
89
+ case width = "w"
90
+ case shapeWrapper = "data"
91
+ }
92
+
93
+ private enum ShapeKey: String, CodingKey {
94
+ case shapes
95
+ }
72
96
  }
@@ -0,0 +1,164 @@
1
+ //
2
+ // TextAnimator.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/9/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ final class TextAnimator: Codable, DictionaryInitializable {
11
+
12
+ // MARK: Lifecycle
13
+
14
+ required init(from decoder: Decoder) throws {
15
+ let container = try decoder.container(keyedBy: TextAnimator.CodingKeys.self)
16
+ name = try container.decodeIfPresent(String.self, forKey: .name) ?? ""
17
+ let animatorContainer = try container.nestedContainer(keyedBy: TextAnimatorKeys.self, forKey: .textAnimator)
18
+ fillColor = try animatorContainer.decodeIfPresent(KeyframeGroup<Color>.self, forKey: .fillColor)
19
+ strokeColor = try animatorContainer.decodeIfPresent(KeyframeGroup<Color>.self, forKey: .strokeColor)
20
+ strokeWidth = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .strokeWidth)
21
+ tracking = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .tracking)
22
+ anchor = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .anchor)
23
+ position = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .position)
24
+ scale = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .scale)
25
+ skew = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skew)
26
+ skewAxis = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skewAxis)
27
+ rotation = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation)
28
+ opacity = try animatorContainer.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .opacity)
29
+ }
30
+
31
+ init(dictionary: [String: Any]) throws {
32
+ name = (try? dictionary.value(for: CodingKeys.name)) ?? ""
33
+ let animatorDictionary: [String: Any] = try dictionary.value(for: CodingKeys.textAnimator)
34
+ if let fillColorDictionary = animatorDictionary[TextAnimatorKeys.fillColor.rawValue] as? [String: Any] {
35
+ fillColor = try? KeyframeGroup<Color>(dictionary: fillColorDictionary)
36
+ } else {
37
+ fillColor = nil
38
+ }
39
+ if let strokeColorDictionary = animatorDictionary[TextAnimatorKeys.strokeColor.rawValue] as? [String: Any] {
40
+ strokeColor = try? KeyframeGroup<Color>(dictionary: strokeColorDictionary)
41
+ } else {
42
+ strokeColor = nil
43
+ }
44
+ if let strokeWidthDictionary = animatorDictionary[TextAnimatorKeys.strokeWidth.rawValue] as? [String: Any] {
45
+ strokeWidth = try? KeyframeGroup<Vector1D>(dictionary: strokeWidthDictionary)
46
+ } else {
47
+ strokeWidth = nil
48
+ }
49
+ if let trackingDictionary = animatorDictionary[TextAnimatorKeys.tracking.rawValue] as? [String: Any] {
50
+ tracking = try? KeyframeGroup<Vector1D>(dictionary: trackingDictionary)
51
+ } else {
52
+ tracking = nil
53
+ }
54
+ if let anchorDictionary = animatorDictionary[TextAnimatorKeys.anchor.rawValue] as? [String: Any] {
55
+ anchor = try? KeyframeGroup<Vector3D>(dictionary: anchorDictionary)
56
+ } else {
57
+ anchor = nil
58
+ }
59
+ if let positionDictionary = animatorDictionary[TextAnimatorKeys.position.rawValue] as? [String: Any] {
60
+ position = try? KeyframeGroup<Vector3D>(dictionary: positionDictionary)
61
+ } else {
62
+ position = nil
63
+ }
64
+ if let scaleDictionary = animatorDictionary[TextAnimatorKeys.scale.rawValue] as? [String: Any] {
65
+ scale = try? KeyframeGroup<Vector3D>(dictionary: scaleDictionary)
66
+ } else {
67
+ scale = nil
68
+ }
69
+ if let skewDictionary = animatorDictionary[TextAnimatorKeys.skew.rawValue] as? [String: Any] {
70
+ skew = try? KeyframeGroup<Vector1D>(dictionary: skewDictionary)
71
+ } else {
72
+ skew = nil
73
+ }
74
+ if let skewAxisDictionary = animatorDictionary[TextAnimatorKeys.skewAxis.rawValue] as? [String: Any] {
75
+ skewAxis = try? KeyframeGroup<Vector1D>(dictionary: skewAxisDictionary)
76
+ } else {
77
+ skewAxis = nil
78
+ }
79
+ if let rotationDictionary = animatorDictionary[TextAnimatorKeys.rotation.rawValue] as? [String: Any] {
80
+ rotation = try? KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
81
+ } else {
82
+ rotation = nil
83
+ }
84
+ if let opacityDictionary = animatorDictionary[TextAnimatorKeys.opacity.rawValue] as? [String: Any] {
85
+ opacity = try KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
86
+ } else {
87
+ opacity = nil
88
+ }
89
+ }
90
+
91
+ // MARK: Internal
92
+
93
+ let name: String
94
+
95
+ /// Anchor
96
+ let anchor: KeyframeGroup<Vector3D>?
97
+
98
+ /// Position
99
+ let position: KeyframeGroup<Vector3D>?
100
+
101
+ /// Scale
102
+ let scale: KeyframeGroup<Vector3D>?
103
+
104
+ /// Skew
105
+ let skew: KeyframeGroup<Vector1D>?
106
+
107
+ /// Skew Axis
108
+ let skewAxis: KeyframeGroup<Vector1D>?
109
+
110
+ /// Rotation
111
+ let rotation: KeyframeGroup<Vector1D>?
112
+
113
+ /// Opacity
114
+ let opacity: KeyframeGroup<Vector1D>?
115
+
116
+ /// Stroke Color
117
+ let strokeColor: KeyframeGroup<Color>?
118
+
119
+ /// Fill Color
120
+ let fillColor: KeyframeGroup<Color>?
121
+
122
+ /// Stroke Width
123
+ let strokeWidth: KeyframeGroup<Vector1D>?
124
+
125
+ /// Tracking
126
+ let tracking: KeyframeGroup<Vector1D>?
127
+
128
+ func encode(to encoder: Encoder) throws {
129
+ var container = encoder.container(keyedBy: CodingKeys.self)
130
+ var animatorContainer = container.nestedContainer(keyedBy: TextAnimatorKeys.self, forKey: .textAnimator)
131
+ try animatorContainer.encodeIfPresent(fillColor, forKey: .fillColor)
132
+ try animatorContainer.encodeIfPresent(strokeColor, forKey: .strokeColor)
133
+ try animatorContainer.encodeIfPresent(strokeWidth, forKey: .strokeWidth)
134
+ try animatorContainer.encodeIfPresent(tracking, forKey: .tracking)
135
+ }
136
+
137
+ // MARK: Private
138
+
139
+ private enum CodingKeys: String, CodingKey {
140
+ // case textSelector = "s" TODO
141
+ case textAnimator = "a"
142
+ case name = "nm"
143
+ }
144
+
145
+ private enum TextSelectorKeys: String, CodingKey {
146
+ case start = "s"
147
+ case end = "e"
148
+ case offset = "o"
149
+ }
150
+
151
+ private enum TextAnimatorKeys: String, CodingKey {
152
+ case fillColor = "fc"
153
+ case strokeColor = "sc"
154
+ case strokeWidth = "sw"
155
+ case tracking = "t"
156
+ case anchor = "a"
157
+ case position = "p"
158
+ case scale = "s"
159
+ case skew = "sk"
160
+ case skewAxis = "sa"
161
+ case rotation = "r"
162
+ case opacity = "o"
163
+ }
164
+ }