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
@@ -0,0 +1,179 @@
1
+ //
2
+ // Transform.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/7/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ /// The animatable transform for a layer. Controls position, rotation, scale, and opacity.
11
+ final class Transform: Codable, DictionaryInitializable {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ required init(from decoder: Decoder) throws {
16
+ /// This manual override of decode is required because we want to throw an error
17
+ /// in the case that there is not position data.
18
+ let container = try decoder.container(keyedBy: Transform.CodingKeys.self)
19
+
20
+ // AnchorPoint
21
+ anchorPoint = try container
22
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .anchorPoint) ?? KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
23
+
24
+ // Position
25
+ if container.contains(.positionX), container.contains(.positionY) {
26
+ // Position dimensions are split into two keyframe groups
27
+ positionX = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .positionX)
28
+ positionY = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .positionY)
29
+ position = nil
30
+ } else if let positionKeyframes = try? container.decode(KeyframeGroup<Vector3D>.self, forKey: .position) {
31
+ // Position dimensions are a single keyframe group.
32
+ position = positionKeyframes
33
+ positionX = nil
34
+ positionY = nil
35
+ } else if
36
+ let positionContainer = try? container.nestedContainer(keyedBy: PositionCodingKeys.self, forKey: .position),
37
+ let positionX = try? positionContainer.decode(KeyframeGroup<Vector1D>.self, forKey: .positionX),
38
+ let positionY = try? positionContainer.decode(KeyframeGroup<Vector1D>.self, forKey: .positionY)
39
+ {
40
+ /// Position keyframes are split and nested.
41
+ self.positionX = positionX
42
+ self.positionY = positionY
43
+ position = nil
44
+ } else {
45
+ /// Default value.
46
+ position = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
47
+ positionX = nil
48
+ positionY = nil
49
+ }
50
+
51
+ // Scale
52
+ scale = try container
53
+ .decodeIfPresent(KeyframeGroup<Vector3D>.self, forKey: .scale) ?? KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
54
+
55
+ // Rotation
56
+ if let rotationZ = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotationZ) {
57
+ rotation = rotationZ
58
+ } else {
59
+ rotation = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .rotation) ?? KeyframeGroup(Vector1D(0))
60
+ }
61
+ rotationZ = nil
62
+
63
+ // Opacity
64
+ opacity = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .opacity) ?? KeyframeGroup(Vector1D(100))
65
+ }
66
+
67
+ init(dictionary: [String: Any]) throws {
68
+ if
69
+ let anchorPointDictionary = dictionary[CodingKeys.anchorPoint.rawValue] as? [String: Any],
70
+ let anchorPoint = try? KeyframeGroup<Vector3D>(dictionary: anchorPointDictionary)
71
+ {
72
+ self.anchorPoint = anchorPoint
73
+ } else {
74
+ anchorPoint = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
75
+ }
76
+
77
+ if
78
+ let xDictionary = dictionary[CodingKeys.positionX.rawValue] as? [String: Any],
79
+ let yDictionary = dictionary[CodingKeys.positionY.rawValue] as? [String: Any]
80
+ {
81
+ positionX = try KeyframeGroup<Vector1D>(dictionary: xDictionary)
82
+ positionY = try KeyframeGroup<Vector1D>(dictionary: yDictionary)
83
+ position = nil
84
+ } else if
85
+ let positionDictionary = dictionary[CodingKeys.position.rawValue] as? [String: Any],
86
+ positionDictionary[KeyframeGroup<Vector3D>.KeyframeWrapperKey.keyframeData.rawValue] != nil
87
+ {
88
+ position = try KeyframeGroup<Vector3D>(dictionary: positionDictionary)
89
+ positionX = nil
90
+ positionY = nil
91
+ } else if
92
+ let positionDictionary = dictionary[CodingKeys.position.rawValue] as? [String: Any],
93
+ let xDictionary = positionDictionary[PositionCodingKeys.positionX.rawValue] as? [String: Any],
94
+ let yDictionary = positionDictionary[PositionCodingKeys.positionY.rawValue] as? [String: Any]
95
+ {
96
+ positionX = try KeyframeGroup<Vector1D>(dictionary: xDictionary)
97
+ positionY = try KeyframeGroup<Vector1D>(dictionary: yDictionary)
98
+ position = nil
99
+ } else {
100
+ position = KeyframeGroup(Vector3D(x: Double(0), y: 0, z: 0))
101
+ positionX = nil
102
+ positionY = nil
103
+ }
104
+
105
+ if
106
+ let scaleDictionary = dictionary[CodingKeys.scale.rawValue] as? [String: Any],
107
+ let scale = try? KeyframeGroup<Vector3D>(dictionary: scaleDictionary)
108
+ {
109
+ self.scale = scale
110
+ } else {
111
+ scale = KeyframeGroup(Vector3D(x: Double(100), y: 100, z: 100))
112
+ }
113
+ if
114
+ let rotationDictionary = dictionary[CodingKeys.rotationZ.rawValue] as? [String: Any],
115
+ let rotation = try? KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
116
+ {
117
+ self.rotation = rotation
118
+ } else if
119
+ let rotationDictionary = dictionary[CodingKeys.rotation.rawValue] as? [String: Any],
120
+ let rotation = try? KeyframeGroup<Vector1D>(dictionary: rotationDictionary)
121
+ {
122
+ self.rotation = rotation
123
+ } else {
124
+ rotation = KeyframeGroup(Vector1D(0))
125
+ }
126
+ rotationZ = nil
127
+ if
128
+ let opacityDictionary = dictionary[CodingKeys.opacity.rawValue] as? [String: Any],
129
+ let opacity = try? KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
130
+ {
131
+ self.opacity = opacity
132
+ } else {
133
+ opacity = KeyframeGroup(Vector1D(100))
134
+ }
135
+ }
136
+
137
+ // MARK: Internal
138
+
139
+ enum CodingKeys: String, CodingKey {
140
+ case anchorPoint = "a"
141
+ case position = "p"
142
+ case positionX = "px"
143
+ case positionY = "py"
144
+ case scale = "s"
145
+ case rotation = "r"
146
+ case rotationZ = "rz"
147
+ case opacity = "o"
148
+ }
149
+
150
+ enum PositionCodingKeys: String, CodingKey {
151
+ case split = "s"
152
+ case positionX = "x"
153
+ case positionY = "y"
154
+ }
155
+
156
+ /// The anchor point of the transform.
157
+ let anchorPoint: KeyframeGroup<Vector3D>
158
+
159
+ /// The position of the transform. This is nil if the position data was split.
160
+ let position: KeyframeGroup<Vector3D>?
161
+
162
+ /// The positionX of the transform. This is nil if the position property is set.
163
+ let positionX: KeyframeGroup<Vector1D>?
164
+
165
+ /// The positionY of the transform. This is nil if the position property is set.
166
+ let positionY: KeyframeGroup<Vector1D>?
167
+
168
+ /// The scale of the transform
169
+ let scale: KeyframeGroup<Vector3D>
170
+
171
+ /// The rotation of the transform. Note: This is single dimensional rotation.
172
+ let rotation: KeyframeGroup<Vector1D>
173
+
174
+ /// The opacity of the transform.
175
+ let opacity: KeyframeGroup<Vector1D>
176
+
177
+ /// Should always be nil.
178
+ let rotationZ: KeyframeGroup<Vector1D>?
179
+ }
@@ -0,0 +1,75 @@
1
+ //
2
+ // EllipseItem.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: - PathDirection
11
+
12
+ enum PathDirection: Int, Codable {
13
+ case clockwise = 1
14
+ case userSetClockwise = 2
15
+ case counterClockwise = 3
16
+ }
17
+
18
+ // MARK: - Ellipse
19
+
20
+ /// An item that define an ellipse shape
21
+ final class Ellipse: ShapeItem {
22
+
23
+ // MARK: Lifecycle
24
+
25
+ required init(from decoder: Decoder) throws {
26
+ let container = try decoder.container(keyedBy: Ellipse.CodingKeys.self)
27
+ direction = try container.decodeIfPresent(PathDirection.self, forKey: .direction) ?? .clockwise
28
+ position = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .position)
29
+ size = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .size)
30
+ try super.init(from: decoder)
31
+ }
32
+
33
+ required init(dictionary: [String: Any]) throws {
34
+ if
35
+ let directionRawType = dictionary[CodingKeys.direction.rawValue] as? Int,
36
+ let direction = PathDirection(rawValue: directionRawType)
37
+ {
38
+ self.direction = direction
39
+ } else {
40
+ direction = .clockwise
41
+ }
42
+ let positionDictionary: [String: Any] = try dictionary.value(for: CodingKeys.position)
43
+ position = try KeyframeGroup<Vector3D>(dictionary: positionDictionary)
44
+ let sizeDictionary: [String: Any] = try dictionary.value(for: CodingKeys.size)
45
+ size = try KeyframeGroup<Vector3D>(dictionary: sizeDictionary)
46
+ try super.init(dictionary: dictionary)
47
+ }
48
+
49
+ // MARK: Internal
50
+
51
+ /// The direction of the ellipse.
52
+ let direction: PathDirection
53
+
54
+ /// The position of the ellipse
55
+ let position: KeyframeGroup<Vector3D>
56
+
57
+ /// The size of the ellipse
58
+ let size: KeyframeGroup<Vector3D>
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(direction, forKey: .direction)
64
+ try container.encode(position, forKey: .position)
65
+ try container.encode(size, forKey: .size)
66
+ }
67
+
68
+ // MARK: Private
69
+
70
+ private enum CodingKeys: String, CodingKey {
71
+ case direction = "d"
72
+ case position = "p"
73
+ case size = "s"
74
+ }
75
+ }
@@ -0,0 +1,74 @@
1
+ //
2
+ // FillShape.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: - FillRule
11
+
12
+ enum FillRule: Int, Codable {
13
+ case none
14
+ case nonZeroWinding
15
+ case evenOdd
16
+ }
17
+
18
+ // MARK: - Fill
19
+
20
+ /// An item that defines a fill render
21
+ final class Fill: ShapeItem {
22
+
23
+ // MARK: Lifecycle
24
+
25
+ required init(from decoder: Decoder) throws {
26
+ let container = try decoder.container(keyedBy: Fill.CodingKeys.self)
27
+ opacity = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .opacity)
28
+ color = try container.decode(KeyframeGroup<Color>.self, forKey: .color)
29
+ fillRule = try container.decodeIfPresent(FillRule.self, forKey: .fillRule) ?? .nonZeroWinding
30
+ try super.init(from: decoder)
31
+ }
32
+
33
+ required init(dictionary: [String: Any]) throws {
34
+ let opacityDictionary: [String: Any] = try dictionary.value(for: CodingKeys.opacity)
35
+ opacity = try KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
36
+ let colorDictionary: [String: Any] = try dictionary.value(for: CodingKeys.color)
37
+ color = try KeyframeGroup<Color>(dictionary: colorDictionary)
38
+ if
39
+ let fillRuleRawValue = dictionary[CodingKeys.fillRule.rawValue] as? Int,
40
+ let fillRule = FillRule(rawValue: fillRuleRawValue)
41
+ {
42
+ self.fillRule = fillRule
43
+ } else {
44
+ fillRule = .nonZeroWinding
45
+ }
46
+ try super.init(dictionary: dictionary)
47
+ }
48
+
49
+ // MARK: Internal
50
+
51
+ /// The opacity of the fill
52
+ let opacity: KeyframeGroup<Vector1D>
53
+
54
+ /// The color keyframes for the fill
55
+ let color: KeyframeGroup<Color>
56
+
57
+ let fillRule: FillRule
58
+
59
+ override func encode(to encoder: Encoder) throws {
60
+ try super.encode(to: encoder)
61
+ var container = encoder.container(keyedBy: CodingKeys.self)
62
+ try container.encode(opacity, forKey: .opacity)
63
+ try container.encode(color, forKey: .color)
64
+ try container.encode(fillRule, forKey: .fillRule)
65
+ }
66
+
67
+ // MARK: Private
68
+
69
+ private enum CodingKeys: String, CodingKey {
70
+ case opacity = "o"
71
+ case color = "c"
72
+ case fillRule = "r"
73
+ }
74
+ }
@@ -0,0 +1,124 @@
1
+ //
2
+ // GradientFill.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: - GradientType
11
+
12
+ enum GradientType: Int, Codable {
13
+ case none
14
+ case linear
15
+ case radial
16
+ }
17
+
18
+ // MARK: - GradientFill
19
+
20
+ /// An item that define a gradient fill
21
+ final class GradientFill: ShapeItem {
22
+
23
+ // MARK: Lifecycle
24
+
25
+ required init(from decoder: Decoder) throws {
26
+ let container = try decoder.container(keyedBy: GradientFill.CodingKeys.self)
27
+ opacity = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .opacity)
28
+ startPoint = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .startPoint)
29
+ endPoint = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .endPoint)
30
+ gradientType = try container.decode(GradientType.self, forKey: .gradientType)
31
+ highlightLength = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .highlightLength)
32
+ highlightAngle = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .highlightAngle)
33
+ let colorsContainer = try container.nestedContainer(keyedBy: GradientDataKeys.self, forKey: .colors)
34
+ colors = try colorsContainer.decode(KeyframeGroup<[Double]>.self, forKey: .colors)
35
+ numberOfColors = try colorsContainer.decode(Int.self, forKey: .numberOfColors)
36
+ try super.init(from: decoder)
37
+ }
38
+
39
+ required init(dictionary: [String: Any]) throws {
40
+ let opacityDictionary: [String: Any] = try dictionary.value(for: CodingKeys.opacity)
41
+ opacity = try KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
42
+ let startPointDictionary: [String: Any] = try dictionary.value(for: CodingKeys.startPoint)
43
+ startPoint = try KeyframeGroup<Vector3D>(dictionary: startPointDictionary)
44
+ let endPointDictionary: [String: Any] = try dictionary.value(for: CodingKeys.endPoint)
45
+ endPoint = try KeyframeGroup<Vector3D>(dictionary: endPointDictionary)
46
+ let gradientRawType: Int = try dictionary.value(for: CodingKeys.gradientType)
47
+ guard let gradient = GradientType(rawValue: gradientRawType) else {
48
+ throw InitializableError.invalidInput
49
+ }
50
+ gradientType = gradient
51
+ if let highlightLengthDictionary = dictionary[CodingKeys.highlightLength.rawValue] as? [String: Any] {
52
+ highlightLength = try? KeyframeGroup<Vector1D>(dictionary: highlightLengthDictionary)
53
+ } else {
54
+ highlightLength = nil
55
+ }
56
+ if let highlightAngleDictionary = dictionary[CodingKeys.highlightAngle.rawValue] as? [String: Any] {
57
+ highlightAngle = try? KeyframeGroup<Vector1D>(dictionary: highlightAngleDictionary)
58
+ } else {
59
+ highlightAngle = nil
60
+ }
61
+ let colorsDictionary: [String: Any] = try dictionary.value(for: CodingKeys.colors)
62
+ let nestedColorsDictionary: [String: Any] = try colorsDictionary.value(for: GradientDataKeys.colors)
63
+ colors = try KeyframeGroup<[Double]>(dictionary: nestedColorsDictionary)
64
+ numberOfColors = try colorsDictionary.value(for: GradientDataKeys.numberOfColors)
65
+ try super.init(dictionary: dictionary)
66
+ }
67
+
68
+ // MARK: Internal
69
+
70
+ /// The opacity of the fill
71
+ let opacity: KeyframeGroup<Vector1D>
72
+
73
+ /// The start of the gradient
74
+ let startPoint: KeyframeGroup<Vector3D>
75
+
76
+ /// The end of the gradient
77
+ let endPoint: KeyframeGroup<Vector3D>
78
+
79
+ /// The type of gradient
80
+ let gradientType: GradientType
81
+
82
+ /// Gradient Highlight Length. Only if type is Radial
83
+ let highlightLength: KeyframeGroup<Vector1D>?
84
+
85
+ /// Highlight Angle. Only if type is Radial
86
+ let highlightAngle: KeyframeGroup<Vector1D>?
87
+
88
+ /// The number of color points in the gradient
89
+ let numberOfColors: Int
90
+
91
+ /// The Colors of the gradient.
92
+ let colors: KeyframeGroup<[Double]>
93
+
94
+ override func encode(to encoder: Encoder) throws {
95
+ try super.encode(to: encoder)
96
+ var container = encoder.container(keyedBy: CodingKeys.self)
97
+ try container.encode(opacity, forKey: .opacity)
98
+ try container.encode(startPoint, forKey: .startPoint)
99
+ try container.encode(endPoint, forKey: .endPoint)
100
+ try container.encode(gradientType, forKey: .gradientType)
101
+ try container.encodeIfPresent(highlightLength, forKey: .highlightLength)
102
+ try container.encodeIfPresent(highlightAngle, forKey: .highlightAngle)
103
+ var colorsContainer = container.nestedContainer(keyedBy: GradientDataKeys.self, forKey: .colors)
104
+ try colorsContainer.encode(numberOfColors, forKey: .numberOfColors)
105
+ try colorsContainer.encode(colors, forKey: .colors)
106
+ }
107
+
108
+ // MARK: Private
109
+
110
+ private enum CodingKeys: String, CodingKey {
111
+ case opacity = "o"
112
+ case startPoint = "s"
113
+ case endPoint = "e"
114
+ case gradientType = "t"
115
+ case highlightLength = "h"
116
+ case highlightAngle = "a"
117
+ case colors = "g"
118
+ }
119
+
120
+ private enum GradientDataKeys: String, CodingKey {
121
+ case numberOfColors = "p"
122
+ case colors = "k"
123
+ }
124
+ }
@@ -0,0 +1,186 @@
1
+ //
2
+ // GradientStroke.swift
3
+ // lottie-swift
4
+ //
5
+ // Created by Brandon Withrow on 1/8/19.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ // MARK: - LineCap
11
+
12
+ enum LineCap: Int, Codable {
13
+ case none
14
+ case butt
15
+ case round
16
+ case square
17
+ }
18
+
19
+ // MARK: - LineJoin
20
+
21
+ enum LineJoin: Int, Codable {
22
+ case none
23
+ case miter
24
+ case round
25
+ case bevel
26
+ }
27
+
28
+ // MARK: - GradientStroke
29
+
30
+ /// An item that define an ellipse shape
31
+ final class GradientStroke: ShapeItem {
32
+
33
+ // MARK: Lifecycle
34
+
35
+ required init(from decoder: Decoder) throws {
36
+ let container = try decoder.container(keyedBy: GradientStroke.CodingKeys.self)
37
+ opacity = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .opacity)
38
+ startPoint = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .startPoint)
39
+ endPoint = try container.decode(KeyframeGroup<Vector3D>.self, forKey: .endPoint)
40
+ gradientType = try container.decode(GradientType.self, forKey: .gradientType)
41
+ highlightLength = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .highlightLength)
42
+ highlightAngle = try container.decodeIfPresent(KeyframeGroup<Vector1D>.self, forKey: .highlightAngle)
43
+ width = try container.decode(KeyframeGroup<Vector1D>.self, forKey: .width)
44
+ lineCap = try container.decodeIfPresent(LineCap.self, forKey: .lineCap) ?? .round
45
+ lineJoin = try container.decodeIfPresent(LineJoin.self, forKey: .lineJoin) ?? .round
46
+ miterLimit = try container.decodeIfPresent(Double.self, forKey: .miterLimit) ?? 4
47
+ // TODO Decode Color Objects instead of array.
48
+ let colorsContainer = try container.nestedContainer(keyedBy: GradientDataKeys.self, forKey: .colors)
49
+ colors = try colorsContainer.decode(KeyframeGroup<[Double]>.self, forKey: .colors)
50
+ numberOfColors = try colorsContainer.decode(Int.self, forKey: .numberOfColors)
51
+ dashPattern = try container.decodeIfPresent([DashElement].self, forKey: .dashPattern)
52
+ try super.init(from: decoder)
53
+ }
54
+
55
+ required init(dictionary: [String: Any]) throws {
56
+ let opacityDictionary: [String: Any] = try dictionary.value(for: CodingKeys.opacity)
57
+ opacity = try KeyframeGroup<Vector1D>(dictionary: opacityDictionary)
58
+ let startPointDictionary: [String: Any] = try dictionary.value(for: CodingKeys.startPoint)
59
+ startPoint = try KeyframeGroup<Vector3D>(dictionary: startPointDictionary)
60
+ let endPointDictionary: [String: Any] = try dictionary.value(for: CodingKeys.endPoint)
61
+ endPoint = try KeyframeGroup<Vector3D>(dictionary: endPointDictionary)
62
+ let gradientRawType: Int = try dictionary.value(for: CodingKeys.gradientType)
63
+ guard let gradient = GradientType(rawValue: gradientRawType) else {
64
+ throw InitializableError.invalidInput
65
+ }
66
+ gradientType = gradient
67
+ if let highlightLengthDictionary = dictionary[CodingKeys.highlightLength.rawValue] as? [String: Any] {
68
+ highlightLength = try? KeyframeGroup<Vector1D>(dictionary: highlightLengthDictionary)
69
+ } else {
70
+ highlightLength = nil
71
+ }
72
+ if let highlightAngleDictionary = dictionary[CodingKeys.highlightAngle.rawValue] as? [String: Any] {
73
+ highlightAngle = try? KeyframeGroup<Vector1D>(dictionary: highlightAngleDictionary)
74
+ } else {
75
+ highlightAngle = nil
76
+ }
77
+ let widthDictionary: [String: Any] = try dictionary.value(for: CodingKeys.width)
78
+ width = try KeyframeGroup<Vector1D>(dictionary: widthDictionary)
79
+ if
80
+ let lineCapRawValue = dictionary[CodingKeys.lineCap.rawValue] as? Int,
81
+ let lineCap = LineCap(rawValue: lineCapRawValue)
82
+ {
83
+ self.lineCap = lineCap
84
+ } else {
85
+ lineCap = .round
86
+ }
87
+ if
88
+ let lineJoinRawValue = dictionary[CodingKeys.lineJoin.rawValue] as? Int,
89
+ let lineJoin = LineJoin(rawValue: lineJoinRawValue)
90
+ {
91
+ self.lineJoin = lineJoin
92
+ } else {
93
+ lineJoin = .round
94
+ }
95
+ miterLimit = (try? dictionary.value(for: CodingKeys.miterLimit)) ?? 4
96
+ let colorsDictionary: [String: Any] = try dictionary.value(for: CodingKeys.colors)
97
+ let nestedColorsDictionary: [String: Any] = try colorsDictionary.value(for: GradientDataKeys.colors)
98
+ colors = try KeyframeGroup<[Double]>(dictionary: nestedColorsDictionary)
99
+ numberOfColors = try colorsDictionary.value(for: GradientDataKeys.numberOfColors)
100
+ let dashPatternDictionaries = dictionary[CodingKeys.dashPattern.rawValue] as? [[String: Any]]
101
+ dashPattern = try? dashPatternDictionaries?.map({ try DashElement(dictionary: $0) })
102
+ try super.init(dictionary: dictionary)
103
+ }
104
+
105
+ // MARK: Internal
106
+
107
+ /// The opacity of the fill
108
+ let opacity: KeyframeGroup<Vector1D>
109
+
110
+ /// The start of the gradient
111
+ let startPoint: KeyframeGroup<Vector3D>
112
+
113
+ /// The end of the gradient
114
+ let endPoint: KeyframeGroup<Vector3D>
115
+
116
+ /// The type of gradient
117
+ let gradientType: GradientType
118
+
119
+ /// Gradient Highlight Length. Only if type is Radial
120
+ let highlightLength: KeyframeGroup<Vector1D>?
121
+
122
+ /// Highlight Angle. Only if type is Radial
123
+ let highlightAngle: KeyframeGroup<Vector1D>?
124
+
125
+ /// The number of color points in the gradient
126
+ let numberOfColors: Int
127
+
128
+ /// The Colors of the gradient.
129
+ let colors: KeyframeGroup<[Double]>
130
+
131
+ /// The width of the stroke
132
+ let width: KeyframeGroup<Vector1D>
133
+
134
+ /// Line Cap
135
+ let lineCap: LineCap
136
+
137
+ /// Line Join
138
+ let lineJoin: LineJoin
139
+
140
+ /// Miter Limit
141
+ let miterLimit: Double
142
+
143
+ /// The dash pattern of the stroke
144
+ let dashPattern: [DashElement]?
145
+
146
+ override func encode(to encoder: Encoder) throws {
147
+ try super.encode(to: encoder)
148
+ var container = encoder.container(keyedBy: CodingKeys.self)
149
+ try container.encode(opacity, forKey: .opacity)
150
+ try container.encode(startPoint, forKey: .startPoint)
151
+ try container.encode(endPoint, forKey: .endPoint)
152
+ try container.encode(gradientType, forKey: .gradientType)
153
+ try container.encodeIfPresent(highlightLength, forKey: .highlightLength)
154
+ try container.encodeIfPresent(highlightAngle, forKey: .highlightAngle)
155
+ try container.encode(width, forKey: .width)
156
+ try container.encode(lineCap, forKey: .lineCap)
157
+ try container.encode(lineJoin, forKey: .lineJoin)
158
+ try container.encode(miterLimit, forKey: .miterLimit)
159
+ var colorsContainer = container.nestedContainer(keyedBy: GradientDataKeys.self, forKey: .colors)
160
+ try colorsContainer.encode(numberOfColors, forKey: .numberOfColors)
161
+ try colorsContainer.encode(colors, forKey: .colors)
162
+ try container.encodeIfPresent(dashPattern, forKey: .dashPattern)
163
+ }
164
+
165
+ // MARK: Private
166
+
167
+ private enum CodingKeys: String, CodingKey {
168
+ case opacity = "o"
169
+ case startPoint = "s"
170
+ case endPoint = "e"
171
+ case gradientType = "t"
172
+ case highlightLength = "h"
173
+ case highlightAngle = "a"
174
+ case colors = "g"
175
+ case width = "w"
176
+ case lineCap = "lc"
177
+ case lineJoin = "lj"
178
+ case miterLimit = "ml"
179
+ case dashPattern = "d"
180
+ }
181
+
182
+ private enum GradientDataKeys: String, CodingKey {
183
+ case numberOfColors = "p"
184
+ case colors = "k"
185
+ }
186
+ }
@@ -0,0 +1,48 @@
1
+ //
2
+ // GroupItem.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 a a group of shape items
11
+ final class Group: ShapeItem {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ required init(from decoder: Decoder) throws {
16
+ let container = try decoder.container(keyedBy: Group.CodingKeys.self)
17
+ items = try container.decode([ShapeItem].self, ofFamily: ShapeType.self, forKey: .items)
18
+ try super.init(from: decoder)
19
+ }
20
+
21
+ required init(dictionary: [String: Any]) throws {
22
+ let itemDictionaries: [[String: Any]] = try dictionary.value(for: CodingKeys.items)
23
+ items = try [ShapeItem].fromDictionaries(itemDictionaries)
24
+ try super.init(dictionary: dictionary)
25
+ }
26
+
27
+ init(items: [ShapeItem], name: String) {
28
+ self.items = items
29
+ super.init(name: name, type: .group, hidden: false)
30
+ }
31
+
32
+ // MARK: Internal
33
+
34
+ /// A list of shape items.
35
+ let items: [ShapeItem]
36
+
37
+ override func encode(to encoder: Encoder) throws {
38
+ try super.encode(to: encoder)
39
+ var container = encoder.container(keyedBy: CodingKeys.self)
40
+ try container.encode(items, forKey: .items)
41
+ }
42
+
43
+ // MARK: Private
44
+
45
+ private enum CodingKeys: String, CodingKey {
46
+ case items = "it"
47
+ }
48
+ }