lottie-ios 3.2.2 → 3.4.1

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 (316) 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/.spi.yml +6 -0
  5. package/.swift-version +1 -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/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  9. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  10. package/Gemfile +4 -0
  11. package/Gemfile.lock +102 -0
  12. package/Lottie.xcodeproj/project.pbxproj +2003 -1972
  13. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  14. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  15. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (macOS).xcscheme } +7 -20
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  19. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  20. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  21. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  22. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +115 -0
  23. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  24. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  25. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  26. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +39 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +25 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  30. package/Package.resolved +88 -0
  31. package/Package.swift +10 -15
  32. package/README.md +40 -60
  33. package/Rakefile +121 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +448 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +53 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +28 -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 +31 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +95 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +70 -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 +492 -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 +73 -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 +87 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +131 -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 +60 -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/ShapeItemLayer.swift +302 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +319 -0
  64. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  65. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  66. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  67. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  68. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +93 -85
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +61 -44
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  76. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  77. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  78. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  79. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +120 -106
  80. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +25 -24
  81. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  82. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  83. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  84. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +4 -4
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +125 -108
  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 +242 -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 +54 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +65 -57
  113. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +84 -58
  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 +197 -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 +75 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +124 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +186 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -11
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +73 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +136 -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 +136 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +132 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +102 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +78 -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 → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  174. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  175. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  177. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  178. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  179. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  180. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  181. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  182. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  183. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  184. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  185. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  186. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  187. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  188. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  190. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  191. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  194. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  195. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  196. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  197. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  198. package/Sources/Public/LottieConfiguration.swift +143 -0
  199. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  200. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  202. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  203. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  207. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  208. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  209. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  211. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  212. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  213. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  214. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  215. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  216. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  217. package/Tests/AnimationKeypathTests.swift +94 -0
  218. package/Tests/AutomaticEngineTests.swift +57 -0
  219. package/Tests/BundleTests.swift +25 -0
  220. package/Tests/DataURLTests.swift +64 -0
  221. package/Tests/ParsingTests.swift +43 -0
  222. package/Tests/PerformanceTests.swift +215 -0
  223. package/Tests/SnapshotConfiguration.swift +153 -0
  224. package/Tests/SnapshotTests.swift +265 -0
  225. package/Tests/Utils/Bundle+Module.swift +30 -0
  226. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  227. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  228. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  229. package/Tests/ValueProvidersTests.swift +27 -0
  230. package/lottie-ios.podspec +11 -12
  231. package/package.json +1 -1
  232. package/script/test-carthage/Cartfile +1 -0
  233. package/script/test-carthage/Cartfile.resolved +1 -0
  234. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  235. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  236. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  237. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  238. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  239. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  240. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  241. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  242. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  243. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  244. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  245. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  246. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  247. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  248. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  249. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  250. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  251. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  252. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  253. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  254. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  255. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  256. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  257. package/script/test-carthage/Mintfile +1 -0
  258. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  259. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  260. package/script/test-spm/Mintfile +1 -0
  261. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  262. package/Lottie/Info.plist +0 -22
  263. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  264. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  265. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  266. package/lottie-swift/Assets/.gitkeep +0 -0
  267. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  268. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  269. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  270. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  271. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  272. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  273. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  274. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  275. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  276. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  277. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  278. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  279. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  280. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  281. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  282. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  283. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  284. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  285. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  286. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  287. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  288. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  289. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  290. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  291. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  292. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  293. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  294. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  295. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  296. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  297. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  298. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  299. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  300. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  301. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  302. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  303. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  304. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  305. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  306. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  307. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  308. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  309. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  310. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  311. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  312. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  313. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  314. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  315. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  316. 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,42 @@ enum MergeMode: Int, Codable {
16
18
  case exclude
17
19
  }
18
20
 
21
+ // MARK: - Merge
22
+
19
23
  /// An item that define an ellipse shape
20
24
  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
-
25
+
26
+ // MARK: Lifecycle
27
+
29
28
  required init(from decoder: Decoder) throws {
30
29
  let container = try decoder.container(keyedBy: Merge.CodingKeys.self)
31
- self.mode = try container.decode(MergeMode.self, forKey: .mode)
30
+ mode = try container.decode(MergeMode.self, forKey: .mode)
32
31
  try super.init(from: decoder)
33
32
  }
34
-
33
+
34
+ required init(dictionary: [String: Any]) throws {
35
+ let modeRawType: Int = try dictionary.value(for: CodingKeys.mode)
36
+ guard let mode = MergeMode(rawValue: modeRawType) else {
37
+ throw InitializableError.invalidInput
38
+ }
39
+ self.mode = mode
40
+ try super.init(dictionary: dictionary)
41
+ }
42
+
43
+ // MARK: Internal
44
+
45
+ /// The mode of the merge path
46
+ let mode: MergeMode
47
+
35
48
  override func encode(to encoder: Encoder) throws {
36
49
  try super.encode(to: encoder)
37
50
  var container = encoder.container(keyedBy: CodingKeys.self)
38
51
  try container.encode(mode, forKey: .mode)
39
52
  }
40
-
53
+
54
+ // MARK: Private
55
+
56
+ private enum CodingKeys: String, CodingKey {
57
+ case mode = "mm"
58
+ }
41
59
  }
@@ -0,0 +1,73 @@
1
+ //
2
+ // Rectangle.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ /// An item that define an ellipse shape
11
+ final class Rectangle: ShapeItem {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ required init(from decoder: Decoder) throws {
16
+ let container = try decoder.container(keyedBy: Rectangle.CodingKeys.self)
17
+ direction = try container.decodeIfPresent(PathDirection.self, forKey: .direction) ?? .clockwise
18
+ position = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .position)
19
+ size = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .size)
20
+ cornerRadius = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .cornerRadius)
21
+ try super.init(from: decoder)
22
+ }
23
+
24
+ required init(dictionary: [String: Any]) throws {
25
+ if
26
+ let directionRawType = dictionary[CodingKeys.direction.rawValue] as? Int,
27
+ let direction = PathDirection(rawValue: directionRawType)
28
+ {
29
+ self.direction = direction
30
+ } else {
31
+ direction = .clockwise
32
+ }
33
+ let positionDictionary: [String: Any] = try dictionary.value(for: CodingKeys.position)
34
+ position = try KeyframeGroup<Vector3D>(dictionary: positionDictionary)
35
+ let sizeDictionary: [String: Any] = try dictionary.value(for: CodingKeys.size)
36
+ size = try KeyframeGroup<Vector3D>(dictionary: sizeDictionary)
37
+ let cornerRadiusDictionary: [String: Any] = try dictionary.value(for: CodingKeys.cornerRadius)
38
+ cornerRadius = try KeyframeGroup<Vector1D>(dictionary: cornerRadiusDictionary)
39
+ try super.init(dictionary: dictionary)
40
+ }
41
+
42
+ // MARK: Internal
43
+
44
+ /// The direction of the rect.
45
+ let direction: PathDirection
46
+
47
+ /// The position
48
+ let position: KeyframeGroup<Vector3D>
49
+
50
+ /// The size
51
+ let size: KeyframeGroup<Vector3D>
52
+
53
+ /// The Corner radius of the rectangle
54
+ let cornerRadius: KeyframeGroup<Vector1D>
55
+
56
+ override func encode(to encoder: Encoder) throws {
57
+ try super.encode(to: encoder)
58
+ var container = encoder.container(keyedBy: CodingKeys.self)
59
+ try container.encode(direction, forKey: .direction)
60
+ try container.encode(position, forKey: .position)
61
+ try container.encode(size, forKey: .size)
62
+ try container.encode(cornerRadius, forKey: .cornerRadius)
63
+ }
64
+
65
+ // MARK: Private
66
+
67
+ private enum CodingKeys: String, CodingKey {
68
+ case direction = "d"
69
+ case position = "p"
70
+ case size = "s"
71
+ case cornerRadius = "r"
72
+ }
73
+ }
@@ -0,0 +1,136 @@
1
+ //
2
+ // Repeater.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ /// An item that define an ellipse shape
11
+ final class Repeater: ShapeItem {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ required init(from decoder: Decoder) throws {
16
+ let container = try decoder.container(keyedBy: Repeater.CodingKeys.self)
17
+ copies = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .copies) ?? KeyframeGroup(Vector1D(0))
18
+ offset = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .offset) ?? KeyframeGroup(Vector1D(0))
19
+ let transformContainer = try container.nestedContainer(keyedBy: TransformKeys.self, forKey: .transform)
20
+ startOpacity = try transformContainer
21
+ .decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .startOpacity) ?? KeyframeGroup(Vector1D(100))
22
+ endOpacity = try transformContainer
23
+ .decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .endOpacity) ?? KeyframeGroup(Vector1D(100))
24
+ rotation = try transformContainer
25
+ .decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation) ?? KeyframeGroup(Vector1D(0))
26
+ position = try transformContainer
27
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .position) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
28
+ anchorPoint = try transformContainer
29
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .anchorPoint) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
30
+ scale = try transformContainer
31
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .scale) ?? KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
32
+ try super.init(from: decoder)
33
+ }
34
+
35
+ required init(dictionary: [String: Any]) throws {
36
+ if let copiesDictionary = dictionary[CodingKeys.copies.rawValue] as? [String: Any] {
37
+ copies = try KeyframeGroup<Vector1D>(dictionary: copiesDictionary)
38
+ } else {
39
+ copies = KeyframeGroup(Vector1D(0))
40
+ }
41
+ if let offsetDictionary = dictionary[CodingKeys.offset.rawValue] as? [String: Any] {
42
+ offset = try KeyframeGroup<Vector1D>(dictionary: offsetDictionary)
43
+ } else {
44
+ offset = KeyframeGroup(Vector1D(0))
45
+ }
46
+ let transformDictionary: [String: Any] = try dictionary.value(for: CodingKeys.transform)
47
+ if let startOpacityDictionary = transformDictionary[TransformKeys.startOpacity.rawValue] as? [String: Any] {
48
+ startOpacity = try KeyframeGroup<Vector1D>(dictionary: startOpacityDictionary)
49
+ } else {
50
+ startOpacity = KeyframeGroup(Vector1D(100))
51
+ }
52
+ if let endOpacityDictionary = transformDictionary[TransformKeys.endOpacity.rawValue] as? [String: Any] {
53
+ endOpacity = try KeyframeGroup<Vector1D>(dictionary: endOpacityDictionary)
54
+ } else {
55
+ endOpacity = KeyframeGroup(Vector1D(100))
56
+ }
57
+ if let rotationDictionary = transformDictionary[TransformKeys.rotation.rawValue] as? [String: Any] {
58
+ rotation = try KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
59
+ } else {
60
+ rotation = KeyframeGroup(Vector1D(0))
61
+ }
62
+ if let positionDictionary = transformDictionary[TransformKeys.position.rawValue] as? [String: Any] {
63
+ position = try KeyframeGroup<Vector3D>(dictionary: positionDictionary)
64
+ } else {
65
+ position = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
66
+ }
67
+ if let anchorPointDictionary = transformDictionary[TransformKeys.anchorPoint.rawValue] as? [String: Any] {
68
+ anchorPoint = try KeyframeGroup<Vector3D>(dictionary: anchorPointDictionary)
69
+ } else {
70
+ anchorPoint = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
71
+ }
72
+ if let scaleDictionary = transformDictionary[TransformKeys.scale.rawValue] as? [String: Any] {
73
+ scale = try KeyframeGroup<Vector3D>(dictionary: scaleDictionary)
74
+ } else {
75
+ scale = KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
76
+ }
77
+ try super.init(dictionary: dictionary)
78
+ }
79
+
80
+ // MARK: Internal
81
+
82
+ /// The number of copies to repeat
83
+ let copies: KeyframeGroup<Vector1D>
84
+
85
+ /// The offset of each copy
86
+ let offset: KeyframeGroup<Vector1D>
87
+
88
+ /// Start Opacity
89
+ let startOpacity: KeyframeGroup<Vector1D>
90
+
91
+ /// End opacity
92
+ let endOpacity: KeyframeGroup<Vector1D>
93
+
94
+ /// The rotation
95
+ let rotation: KeyframeGroup<Vector1D>
96
+
97
+ /// Anchor Point
98
+ let anchorPoint: KeyframeGroup<Vector3D>
99
+
100
+ /// Position
101
+ let position: KeyframeGroup<Vector3D>
102
+
103
+ /// Scale
104
+ let scale: KeyframeGroup<Vector3D>
105
+
106
+ override func encode(to encoder: Encoder) throws {
107
+ try super.encode(to: encoder)
108
+ var container = encoder.container(keyedBy: CodingKeys.self)
109
+ try container.encode(copies, forKey: .copies)
110
+ try container.encode(offset, forKey: .offset)
111
+ var transformContainer = container.nestedContainer(keyedBy: TransformKeys.self, forKey: .transform)
112
+ try transformContainer.encode(startOpacity, forKey: .startOpacity)
113
+ try transformContainer.encode(endOpacity, forKey: .endOpacity)
114
+ try transformContainer.encode(rotation, forKey: .rotation)
115
+ try transformContainer.encode(position, forKey: .position)
116
+ try transformContainer.encode(anchorPoint, forKey: .anchorPoint)
117
+ try transformContainer.encode(scale, forKey: .scale)
118
+ }
119
+
120
+ // MARK: Private
121
+
122
+ private enum CodingKeys: String, CodingKey {
123
+ case copies = "c"
124
+ case offset = "o"
125
+ case transform = "tr"
126
+ }
127
+
128
+ private enum TransformKeys: String, CodingKey {
129
+ case rotation = "r"
130
+ case startOpacity = "so"
131
+ case endOpacity = "eo"
132
+ case anchorPoint = "a"
133
+ case position = "p"
134
+ case scale = "s"
135
+ }
136
+ }
@@ -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,136 @@
1
+ //
2
+ // TransformItem.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ /// An item that define an ellipse shape
11
+ final class ShapeTransform: ShapeItem {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ required init(from decoder: Decoder) throws {
16
+ let container = try decoder.container(keyedBy: ShapeTransform.CodingKeys.self)
17
+ anchor = try container
18
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .anchor) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
19
+ position = try container
20
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .position) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
21
+ scale = try container
22
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .scale) ?? KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
23
+ rotation = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation) ?? KeyframeGroup(Vector1D(0))
24
+ opacity = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .opacity) ?? KeyframeGroup(Vector1D(100))
25
+ skew = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skew) ?? KeyframeGroup(Vector1D(0))
26
+ skewAxis = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .skewAxis) ?? KeyframeGroup(Vector1D(0))
27
+ try super.init(from: decoder)
28
+ }
29
+
30
+ required init(dictionary: [String: Any]) throws {
31
+ if
32
+ let anchorDictionary = dictionary[CodingKeys.anchor.rawValue] as? [String: Any],
33
+ let anchor = try? KeyframeGroup<Vector3D>(dictionary: anchorDictionary)
34
+ {
35
+ self.anchor = anchor
36
+ } else {
37
+ anchor = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
38
+ }
39
+ if
40
+ let positionDictionary = dictionary[CodingKeys.position.rawValue] as? [String: Any],
41
+ let position = try? KeyframeGroup<Vector3D>(dictionary: positionDictionary)
42
+ {
43
+ self.position = position
44
+ } else {
45
+ position = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
46
+ }
47
+ if
48
+ let scaleDictionary = dictionary[CodingKeys.scale.rawValue] as? [String: Any],
49
+ let scale = try? KeyframeGroup<Vector3D>(dictionary: scaleDictionary)
50
+ {
51
+ self.scale = scale
52
+ } else {
53
+ scale = KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
54
+ }
55
+ if
56
+ let rotationDictionary = dictionary[CodingKeys.rotation.rawValue] as? [String: Any],
57
+ let rotation = try? KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
58
+ {
59
+ self.rotation = rotation
60
+ } else {
61
+ rotation = KeyframeGroup(Vector1D(0))
62
+ }
63
+ if
64
+ let opacityDictionary = dictionary[CodingKeys.opacity.rawValue] as? [String: Any],
65
+ let opacity = try? KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
66
+ {
67
+ self.opacity = opacity
68
+ } else {
69
+ opacity = KeyframeGroup(Vector1D(100))
70
+ }
71
+ if
72
+ let skewDictionary = dictionary[CodingKeys.skew.rawValue] as? [String: Any],
73
+ let skew = try? KeyframeGroup<Vector1D>(dictionary: skewDictionary)
74
+ {
75
+ self.skew = skew
76
+ } else {
77
+ skew = KeyframeGroup(Vector1D(0))
78
+ }
79
+ if
80
+ let skewAxisDictionary = dictionary[CodingKeys.skewAxis.rawValue] as? [String: Any],
81
+ let skewAxis = try? KeyframeGroup<Vector1D>(dictionary: skewAxisDictionary)
82
+ {
83
+ self.skewAxis = skewAxis
84
+ } else {
85
+ skewAxis = KeyframeGroup(Vector1D(0))
86
+ }
87
+ try super.init(dictionary: dictionary)
88
+ }
89
+
90
+ // MARK: Internal
91
+
92
+ /// Anchor Point
93
+ let anchor: KeyframeGroup<Vector3D>
94
+
95
+ /// Position
96
+ let position: KeyframeGroup<Vector3D>
97
+
98
+ /// Scale
99
+ let scale: KeyframeGroup<Vector3D>
100
+
101
+ /// Rotation
102
+ let rotation: KeyframeGroup<Vector1D>
103
+
104
+ /// opacity
105
+ let opacity: KeyframeGroup<Vector1D>
106
+
107
+ /// Skew
108
+ let skew: KeyframeGroup<Vector1D>
109
+
110
+ /// Skew Axis
111
+ let skewAxis: KeyframeGroup<Vector1D>
112
+
113
+ override func encode(to encoder: Encoder) throws {
114
+ try super.encode(to: encoder)
115
+ var container = encoder.container(keyedBy: CodingKeys.self)
116
+ try container.encode(anchor, forKey: .anchor)
117
+ try container.encode(position, forKey: .position)
118
+ try container.encode(scale, forKey: .scale)
119
+ try container.encode(rotation, forKey: .rotation)
120
+ try container.encode(opacity, forKey: .opacity)
121
+ try container.encode(skew, forKey: .skew)
122
+ try container.encode(skewAxis, forKey: .skewAxis)
123
+ }
124
+
125
+ // MARK: Private
126
+
127
+ private enum CodingKeys: String, CodingKey {
128
+ case anchor = "a"
129
+ case position = "p"
130
+ case scale = "s"
131
+ case rotation = "r"
132
+ case opacity = "o"
133
+ case skew = "sk"
134
+ case skewAxis = "sa"
135
+ }
136
+ }