lottie-ios 3.4.1 → 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.github/workflows/stale_issues.yml +17 -0
  2. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  3. package/Lottie.xcodeproj/project.pbxproj +24 -16
  4. package/Lottie.xcodeproj/xcshareddata/xcschemes/Lottie (macOS).xcscheme +2 -2
  5. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +0 -81
  6. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  7. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -17
  8. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +114 -1
  9. package/Package.swift +1 -6
  10. package/Rakefile +41 -2
  11. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +1 -2
  12. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +28 -0
  13. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +31 -4
  14. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +2 -2
  15. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +34 -7
  16. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +25 -14
  17. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +61 -32
  18. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +4 -1
  19. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +6 -1
  20. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +2 -2
  21. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +107 -26
  22. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +2 -1
  23. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +48 -12
  24. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +1 -1
  25. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +4 -0
  26. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +1 -1
  27. package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
  28. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +17 -4
  29. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +124 -53
  30. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +1 -1
  31. package/Sources/Private/MainThread/LayerContainers/CompLayers/CompositionLayer.swift +1 -1
  32. package/Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift +29 -0
  33. package/Sources/Private/MainThread/LayerContainers/Utility/InvertedMatteLayer.swift +1 -0
  34. package/Sources/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +5 -0
  35. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +5 -0
  36. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +3 -0
  37. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +1 -1
  38. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +17 -1
  39. package/Sources/Private/Model/Animation.swift +4 -4
  40. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +25 -0
  41. package/Sources/Private/Model/ShapeItems/Ellipse.swift +0 -1
  42. package/Sources/Private/Model/ShapeItems/Fill.swift +1 -1
  43. package/Sources/Private/Model/ShapeItems/GradientFill.swift +14 -1
  44. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +0 -1
  45. package/Sources/Private/Model/ShapeItems/Merge.swift +0 -1
  46. package/Sources/Private/Model/ShapeItems/Rectangle.swift +0 -1
  47. package/Sources/Private/Model/ShapeItems/Repeater.swift +0 -1
  48. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +0 -1
  49. package/Sources/Private/Model/ShapeItems/Star.swift +0 -1
  50. package/Sources/Private/Model/ShapeItems/Stroke.swift +0 -1
  51. package/Sources/Private/Model/ShapeItems/Trim.swift +0 -1
  52. package/Sources/Private/{MainThread/NodeRenderSystem/NodeProperties/ValueProviders → Utility/Interpolatable}/KeyframeInterpolator.swift +0 -0
  53. package/Sources/Public/Animation/AnimationView.swift +1 -1
  54. package/Sources/Public/iOS/BundleImageProvider.swift +2 -2
  55. package/Sources/Public/iOS/FilepathImageProvider.swift +1 -1
  56. package/Sources/Public/macOS/BundleImageProvider.macOS.swift +1 -1
  57. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +1 -1
  58. package/Tests/AnimationKeypathTests.swift +10 -1
  59. package/Tests/PerformanceTests.swift +19 -20
  60. package/Tests/Samples/9squares_AlBoardman.json +1 -0
  61. package/Tests/Samples/Boat_Loader.json +1 -0
  62. package/Tests/Samples/HamburgerArrow.json +1 -0
  63. package/Tests/Samples/IconTransitions.json +1 -0
  64. package/Tests/Samples/Images/dog.png +0 -0
  65. package/Tests/Samples/Issues/issue_1125.json +1 -0
  66. package/Tests/Samples/Issues/issue_1260.json +1 -0
  67. package/Tests/Samples/Issues/issue_1403.json +1 -0
  68. package/Tests/Samples/Issues/issue_1407.json +1 -0
  69. package/Tests/Samples/Issues/issue_1460.json +1 -0
  70. package/Tests/Samples/Issues/issue_1488.json +1 -0
  71. package/Tests/Samples/Issues/issue_1505.json +1 -0
  72. package/Tests/Samples/Issues/issue_1541.json +1 -0
  73. package/Tests/Samples/Issues/issue_1557.json +1 -0
  74. package/Tests/Samples/Issues/issue_1603.json +1 -0
  75. package/Tests/Samples/Issues/issue_1628.json +1 -0
  76. package/Tests/Samples/Issues/issue_1636.json +1 -0
  77. package/Tests/Samples/Issues/issue_1643.json +1 -0
  78. package/Tests/Samples/Issues/issue_1655.json +1 -0
  79. package/Tests/Samples/Issues/issue_1664.json +1 -0
  80. package/Tests/Samples/Issues/issue_1683.json +1 -0
  81. package/Tests/Samples/Issues/issue_1687.json +1 -0
  82. package/Tests/Samples/Issues/issue_1711.json +1 -0
  83. package/Tests/Samples/Issues/issue_1717.json +1 -0
  84. package/Tests/Samples/Issues/issue_769.json +1 -0
  85. package/Tests/Samples/Issues/issue_885.json +1 -0
  86. package/Tests/Samples/Issues/issue_965.json +1 -0
  87. package/Tests/Samples/Issues/pr_1536.json +1 -0
  88. package/Tests/Samples/Issues/pr_1563.json +8439 -0
  89. package/Tests/Samples/Issues/pr_1592.json +5527 -0
  90. package/Tests/Samples/Issues/pr_1599.json +738 -0
  91. package/Tests/Samples/Issues/pr_1604_1.json +1 -0
  92. package/Tests/Samples/Issues/pr_1604_2.json +1 -0
  93. package/Tests/Samples/Issues/pr_1632_1.json +1 -0
  94. package/Tests/Samples/Issues/pr_1632_2.json +1 -0
  95. package/Tests/Samples/Issues/pr_1686.json +513 -0
  96. package/Tests/Samples/Issues/pr_1698.json +1 -0
  97. package/Tests/Samples/Issues/pr_1699.json +1 -0
  98. package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
  99. package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
  100. package/Tests/Samples/LottieFiles/cactus.json +1 -0
  101. package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
  102. package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
  103. package/Tests/Samples/LottieFiles/fireworks.json +1 -0
  104. package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
  105. package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
  106. package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
  107. package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
  108. package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
  109. package/Tests/Samples/LottieFiles/growth.json +1 -0
  110. package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
  111. package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
  112. package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
  113. package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
  114. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
  115. package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
  116. package/Tests/Samples/LottieFiles/shop.json +1 -0
  117. package/Tests/Samples/LottieFiles/step_loader.json +1 -0
  118. package/Tests/Samples/LottieLogo1.json +1 -0
  119. package/Tests/Samples/LottieLogo1_masked.json +1 -0
  120. package/Tests/Samples/LottieLogo2.json +1 -0
  121. package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
  122. package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
  123. package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
  124. package/Tests/Samples/Nonanimating/FirstText.json +1 -0
  125. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
  126. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
  127. package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
  128. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
  129. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
  130. package/Tests/Samples/Nonanimating/Zoom.json +1 -0
  131. package/Tests/Samples/Nonanimating/_dog.json +1 -0
  132. package/Tests/Samples/Nonanimating/base64Test.json +1 -0
  133. package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
  134. package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
  135. package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
  136. package/Tests/Samples/PinJump.json +1 -0
  137. package/Tests/Samples/Switch.json +1 -0
  138. package/Tests/Samples/Switch_States.json +1 -0
  139. package/Tests/Samples/TwitterHeart.json +1 -0
  140. package/Tests/Samples/TwitterHeartButton.json +1 -0
  141. package/Tests/Samples/TypeFace/A.json +1 -0
  142. package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
  143. package/Tests/Samples/TypeFace/B.json +1 -0
  144. package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
  145. package/Tests/Samples/TypeFace/C.json +1 -0
  146. package/Tests/Samples/TypeFace/Colon.json +1 -0
  147. package/Tests/Samples/TypeFace/Comma.json +1 -0
  148. package/Tests/Samples/TypeFace/D.json +1 -0
  149. package/Tests/Samples/TypeFace/E.json +1 -0
  150. package/Tests/Samples/TypeFace/F.json +1 -0
  151. package/Tests/Samples/TypeFace/G.json +1 -0
  152. package/Tests/Samples/TypeFace/H.json +1 -0
  153. package/Tests/Samples/TypeFace/I.json +1 -0
  154. package/Tests/Samples/TypeFace/J.json +1 -0
  155. package/Tests/Samples/TypeFace/K.json +1 -0
  156. package/Tests/Samples/TypeFace/L.json +1 -0
  157. package/Tests/Samples/TypeFace/M.json +1 -0
  158. package/Tests/Samples/TypeFace/N.json +1 -0
  159. package/Tests/Samples/TypeFace/O.json +1 -0
  160. package/Tests/Samples/TypeFace/P.json +1 -0
  161. package/Tests/Samples/TypeFace/Q.json +1 -0
  162. package/Tests/Samples/TypeFace/R.json +1 -0
  163. package/Tests/Samples/TypeFace/S.json +1 -0
  164. package/Tests/Samples/TypeFace/T.json +1 -0
  165. package/Tests/Samples/TypeFace/U.json +1 -0
  166. package/Tests/Samples/TypeFace/V.json +1 -0
  167. package/Tests/Samples/TypeFace/W.json +1 -0
  168. package/Tests/Samples/TypeFace/X.json +1 -0
  169. package/Tests/Samples/TypeFace/Y.json +1 -0
  170. package/Tests/Samples/TypeFace/Z.json +1 -0
  171. package/Tests/Samples/Watermelon.json +1 -0
  172. package/Tests/Samples/setValueTest.json +1 -0
  173. package/Tests/Samples/timeremap.json +1 -0
  174. package/Tests/Samples/vcTransition1.json +1 -0
  175. package/Tests/Samples/vcTransition2.json +1 -0
  176. package/Tests/SnapshotConfiguration.swift +5 -0
  177. package/lottie-ios.podspec +2 -1
  178. package/package.json +1 -1
  179. package/.swift-version +0 -1
  180. package/Package.resolved +0 -88
@@ -0,0 +1,17 @@
1
+ name: 'Close stale issues'
2
+ on:
3
+ schedule:
4
+ - cron: '30 1 * * *'
5
+
6
+ jobs:
7
+ stale:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/stale@v5
11
+ with:
12
+ only-labels: >
13
+ can't reproduce
14
+ stale-issue-message: >
15
+ This issue is stale because it is marked "can't reproduce" and has had no activity in the past week. Please comment with additional information, or this issue will be closed due to inactivity in one week.
16
+ days-before-stale: 7
17
+ days-before-close: 7
@@ -7,6 +7,14 @@
7
7
  objects = {
8
8
 
9
9
  /* Begin PBXBuildFile section */
10
+ 08EF21DC289C643B0097EA47 /* KeyframeInterpolator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08EF21DB289C643B0097EA47 /* KeyframeInterpolator.swift */; };
11
+ 08EF21DD289C643B0097EA47 /* KeyframeInterpolator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08EF21DB289C643B0097EA47 /* KeyframeInterpolator.swift */; };
12
+ 08EF21DE289C643B0097EA47 /* KeyframeInterpolator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08EF21DB289C643B0097EA47 /* KeyframeInterpolator.swift */; };
13
+ 08F8B20D2898A7B100CB5323 /* RepeaterLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F8B20C2898A7B100CB5323 /* RepeaterLayer.swift */; };
14
+ 08F8B20E2898A7B100CB5323 /* RepeaterLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F8B20C2898A7B100CB5323 /* RepeaterLayer.swift */; };
15
+ 08F8B20F2898A7B100CB5323 /* RepeaterLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F8B20C2898A7B100CB5323 /* RepeaterLayer.swift */; };
16
+ 08F8B211289990B700CB5323 /* Samples in Resources */ = {isa = PBXBuildFile; fileRef = 08F8B210289990B700CB5323 /* Samples */; };
17
+ 08F8B213289990CB00CB5323 /* SnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F8B212289990CB00CB5323 /* SnapshotTests.swift */; };
10
18
  19465F52282F998B00BB2C97 /* CachedImageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19465F51282F998B00BB2C97 /* CachedImageProvider.swift */; };
11
19
  19465F53282F998B00BB2C97 /* CachedImageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19465F51282F998B00BB2C97 /* CachedImageProvider.swift */; };
12
20
  19465F54282F998B00BB2C97 /* CachedImageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19465F51282F998B00BB2C97 /* CachedImageProvider.swift */; };
@@ -20,10 +28,8 @@
20
28
  2E8040B027A072B8006E74CB /* Lottie.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E80409A27A0725D006E74CB /* Lottie.framework */; };
21
29
  2E8044AD27A07347006E74CB /* HardcodedImageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8040BE27A07343006E74CB /* HardcodedImageProvider.swift */; };
22
30
  2E8044AE27A07347006E74CB /* Snapshotting+presentationLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8040BF27A07343006E74CB /* Snapshotting+presentationLayer.swift */; };
23
- 2E80450C27A07347006E74CB /* SnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E80412427A07343006E74CB /* SnapshotTests.swift */; };
24
31
  2E80450D27A07347006E74CB /* SnapshotConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E80412527A07343006E74CB /* SnapshotConfiguration.swift */; };
25
32
  2E80489427A07377006E74CB /* __Snapshots__ in Resources */ = {isa = PBXBuildFile; fileRef = 2E80489227A07377006E74CB /* __Snapshots__ */; };
26
- 2E80489527A07377006E74CB /* Samples in Resources */ = {isa = PBXBuildFile; fileRef = 2E80489327A07377006E74CB /* Samples */; };
27
33
  2E804A1A27A0740F006E74CB /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 2E804A1927A0740F006E74CB /* SnapshotTesting */; };
28
34
  2E9C95D32822F43100677516 /* Fill.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C95252822F43000677516 /* Fill.swift */; };
29
35
  2E9C95D42822F43100677516 /* Fill.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C95252822F43000677516 /* Fill.swift */; };
@@ -262,9 +268,6 @@
262
268
  2E9C96BD2822F43100677516 /* AnyValueContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C95882822F43000677516 /* AnyValueContainer.swift */; };
263
269
  2E9C96BE2822F43100677516 /* AnyValueContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C95882822F43000677516 /* AnyValueContainer.swift */; };
264
270
  2E9C96BF2822F43100677516 /* AnyValueContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C95882822F43000677516 /* AnyValueContainer.swift */; };
265
- 2E9C96C02822F43100677516 /* KeyframeInterpolator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C958A2822F43000677516 /* KeyframeInterpolator.swift */; };
266
- 2E9C96C12822F43100677516 /* KeyframeInterpolator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C958A2822F43000677516 /* KeyframeInterpolator.swift */; };
267
- 2E9C96C22822F43100677516 /* KeyframeInterpolator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C958A2822F43000677516 /* KeyframeInterpolator.swift */; };
268
271
  2E9C96C32822F43100677516 /* SingleValueProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C958B2822F43000677516 /* SingleValueProvider.swift */; };
269
272
  2E9C96C42822F43100677516 /* SingleValueProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C958B2822F43000677516 /* SingleValueProvider.swift */; };
270
273
  2E9C96C52822F43100677516 /* SingleValueProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9C958B2822F43000677516 /* SingleValueProvider.swift */; };
@@ -587,6 +590,10 @@
587
590
  /* End PBXContainerItemProxy section */
588
591
 
589
592
  /* Begin PBXFileReference section */
593
+ 08EF21DB289C643B0097EA47 /* KeyframeInterpolator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyframeInterpolator.swift; sourceTree = "<group>"; };
594
+ 08F8B20C2898A7B100CB5323 /* RepeaterLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepeaterLayer.swift; sourceTree = "<group>"; };
595
+ 08F8B210289990B700CB5323 /* Samples */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Samples; sourceTree = "<group>"; };
596
+ 08F8B212289990CB00CB5323 /* SnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapshotTests.swift; sourceTree = "<group>"; };
590
597
  19465F51282F998B00BB2C97 /* CachedImageProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedImageProvider.swift; sourceTree = "<group>"; };
591
598
  2E044E262820536800FA773B /* AutomaticEngineTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutomaticEngineTests.swift; sourceTree = "<group>"; };
592
599
  2E09FA0527B6CEB600BA84E5 /* HardcodedFontProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HardcodedFontProvider.swift; sourceTree = "<group>"; };
@@ -597,10 +604,8 @@
597
604
  2E8040AC27A072B8006E74CB /* LottieTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LottieTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
598
605
  2E8040BE27A07343006E74CB /* HardcodedImageProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HardcodedImageProvider.swift; sourceTree = "<group>"; };
599
606
  2E8040BF27A07343006E74CB /* Snapshotting+presentationLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Snapshotting+presentationLayer.swift"; sourceTree = "<group>"; };
600
- 2E80412427A07343006E74CB /* SnapshotTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SnapshotTests.swift; sourceTree = "<group>"; };
601
607
  2E80412527A07343006E74CB /* SnapshotConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SnapshotConfiguration.swift; sourceTree = "<group>"; };
602
608
  2E80489227A07377006E74CB /* __Snapshots__ */ = {isa = PBXFileReference; lastKnownFileType = folder; path = __Snapshots__; sourceTree = "<group>"; };
603
- 2E80489327A07377006E74CB /* Samples */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Samples; sourceTree = "<group>"; };
604
609
  2E9C95252822F43000677516 /* Fill.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fill.swift; sourceTree = "<group>"; };
605
610
  2E9C95262822F43000677516 /* Ellipse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Ellipse.swift; sourceTree = "<group>"; };
606
611
  2E9C95272822F43000677516 /* Trim.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Trim.swift; sourceTree = "<group>"; };
@@ -680,7 +685,6 @@
680
685
  2E9C95862822F43000677516 /* NodePropertyMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NodePropertyMap.swift; sourceTree = "<group>"; };
681
686
  2E9C95872822F43000677516 /* KeypathSearchable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeypathSearchable.swift; sourceTree = "<group>"; };
682
687
  2E9C95882822F43000677516 /* AnyValueContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyValueContainer.swift; sourceTree = "<group>"; };
683
- 2E9C958A2822F43000677516 /* KeyframeInterpolator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyframeInterpolator.swift; sourceTree = "<group>"; };
684
688
  2E9C958B2822F43000677516 /* SingleValueProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleValueProvider.swift; sourceTree = "<group>"; };
685
689
  2E9C958C2822F43000677516 /* GroupInterpolator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupInterpolator.swift; sourceTree = "<group>"; };
686
690
  2E9C958E2822F43000677516 /* ItemsExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemsExtension.swift; sourceTree = "<group>"; };
@@ -849,9 +853,9 @@
849
853
  2E8040BA27A07343006E74CB /* Tests */ = {
850
854
  isa = PBXGroup;
851
855
  children = (
856
+ 08F8B210289990B700CB5323 /* Samples */,
852
857
  2E80489227A07377006E74CB /* __Snapshots__ */,
853
- 2E80489327A07377006E74CB /* Samples */,
854
- 2E80412427A07343006E74CB /* SnapshotTests.swift */,
858
+ 08F8B212289990CB00CB5323 /* SnapshotTests.swift */,
855
859
  2E80412527A07343006E74CB /* SnapshotConfiguration.swift */,
856
860
  2E72128227BB329C0027BC56 /* AnimationKeypathTests.swift */,
857
861
  2E72128427BB32DB0027BC56 /* PerformanceTests.swift */,
@@ -1146,7 +1150,6 @@
1146
1150
  2E9C95892822F43000677516 /* ValueProviders */ = {
1147
1151
  isa = PBXGroup;
1148
1152
  children = (
1149
- 2E9C958A2822F43000677516 /* KeyframeInterpolator.swift */,
1150
1153
  2E9C958B2822F43000677516 /* SingleValueProvider.swift */,
1151
1154
  2E9C958C2822F43000677516 /* GroupInterpolator.swift */,
1152
1155
  );
@@ -1210,6 +1213,7 @@
1210
1213
  2E9C95A32822F43100677516 /* CALayer+setupLayerHierarchy.swift */,
1211
1214
  2E9C95A42822F43100677516 /* BaseAnimationLayer.swift */,
1212
1215
  2E9C95A52822F43100677516 /* PreCompLayer.swift */,
1216
+ 08F8B20C2898A7B100CB5323 /* RepeaterLayer.swift */,
1213
1217
  );
1214
1218
  path = Layers;
1215
1219
  sourceTree = "<group>";
@@ -1302,6 +1306,7 @@
1302
1306
  2E9C95CF2822F43100677516 /* InterpolatableExtensions.swift */,
1303
1307
  2E9C95D02822F43100677516 /* KeyframeExtensions.swift */,
1304
1308
  7E48BF5F2860D4FA00A39198 /* KeyframeGroup+Extensions.swift */,
1309
+ 08EF21DB289C643B0097EA47 /* KeyframeInterpolator.swift */,
1305
1310
  );
1306
1311
  path = Interpolatable;
1307
1312
  sourceTree = "<group>";
@@ -1646,7 +1651,7 @@
1646
1651
  isa = PBXResourcesBuildPhase;
1647
1652
  buildActionMask = 2147483647;
1648
1653
  files = (
1649
- 2E80489527A07377006E74CB /* Samples in Resources */,
1654
+ 08F8B211289990B700CB5323 /* Samples in Resources */,
1650
1655
  2E80489427A07377006E74CB /* __Snapshots__ in Resources */,
1651
1656
  );
1652
1657
  runOnlyForDeploymentPostprocessing = 0;
@@ -1692,6 +1697,7 @@
1692
1697
  2EAF5AE927A0798700E00531 /* AnimationTextProvider.swift in Sources */,
1693
1698
  2E9C96662822F43100677516 /* LayerTransformNode.swift in Sources */,
1694
1699
  2E9C97412822F43100677516 /* TestHelpers.swift in Sources */,
1700
+ 08EF21DC289C643B0097EA47 /* KeyframeInterpolator.swift in Sources */,
1695
1701
  2E9C96152822F43100677516 /* Transform.swift in Sources */,
1696
1702
  2E9C97472822F43100677516 /* CGFloatExtensions.swift in Sources */,
1697
1703
  2EAF5AC527A0798700E00531 /* UIColorExtension.swift in Sources */,
@@ -1706,7 +1712,6 @@
1706
1712
  2E9C965D2822F43100677516 /* MainThreadAnimationLayer.swift in Sources */,
1707
1713
  2E9C964E2822F43100677516 /* SolidCompositionLayer.swift in Sources */,
1708
1714
  2E9C963F2822F43100677516 /* Asset.swift in Sources */,
1709
- 2E9C96C02822F43100677516 /* KeyframeInterpolator.swift in Sources */,
1710
1715
  2E9C96F92822F43100677516 /* BaseCompositionLayer.swift in Sources */,
1711
1716
  2EAF5A9B27A0798700E00531 /* BundleImageProvider.macOS.swift in Sources */,
1712
1717
  2E9C969F2822F43100677516 /* TextAnimatorNode.swift in Sources */,
@@ -1747,6 +1752,7 @@
1747
1752
  2E9C95E82822F43100677516 /* Merge.swift in Sources */,
1748
1753
  2E9C96032822F43100677516 /* ImageLayerModel.swift in Sources */,
1749
1754
  19465F52282F998B00BB2C97 /* CachedImageProvider.swift in Sources */,
1755
+ 08F8B20D2898A7B100CB5323 /* RepeaterLayer.swift in Sources */,
1750
1756
  2E9C96BA2822F43100677516 /* KeypathSearchable.swift in Sources */,
1751
1757
  2E9C963C2822F43100677516 /* AssetLibrary.swift in Sources */,
1752
1758
  2E9C97022822F43100677516 /* PreCompLayer.swift in Sources */,
@@ -1862,9 +1868,9 @@
1862
1868
  isa = PBXSourcesBuildPhase;
1863
1869
  buildActionMask = 2147483647;
1864
1870
  files = (
1871
+ 08F8B213289990CB00CB5323 /* SnapshotTests.swift in Sources */,
1865
1872
  A1D5BAAC27C731A500777D06 /* DataURLTests.swift in Sources */,
1866
1873
  2E8044AD27A07347006E74CB /* HardcodedImageProvider.swift in Sources */,
1867
- 2E80450C27A07347006E74CB /* SnapshotTests.swift in Sources */,
1868
1874
  2E09FA0627B6CEB600BA84E5 /* HardcodedFontProvider.swift in Sources */,
1869
1875
  2E80450D27A07347006E74CB /* SnapshotConfiguration.swift in Sources */,
1870
1876
  6DEF696E2824A76C007D640F /* BundleTests.swift in Sources */,
@@ -1902,6 +1908,7 @@
1902
1908
  2EAF5AEA27A0798700E00531 /* AnimationTextProvider.swift in Sources */,
1903
1909
  2E9C96672822F43100677516 /* LayerTransformNode.swift in Sources */,
1904
1910
  2E9C97422822F43100677516 /* TestHelpers.swift in Sources */,
1911
+ 08EF21DD289C643B0097EA47 /* KeyframeInterpolator.swift in Sources */,
1905
1912
  2E9C96162822F43100677516 /* Transform.swift in Sources */,
1906
1913
  2E9C97482822F43100677516 /* CGFloatExtensions.swift in Sources */,
1907
1914
  2EAF5AC627A0798700E00531 /* UIColorExtension.swift in Sources */,
@@ -1916,7 +1923,6 @@
1916
1923
  2E9C965E2822F43100677516 /* MainThreadAnimationLayer.swift in Sources */,
1917
1924
  2E9C964F2822F43100677516 /* SolidCompositionLayer.swift in Sources */,
1918
1925
  2E9C96402822F43100677516 /* Asset.swift in Sources */,
1919
- 2E9C96C12822F43100677516 /* KeyframeInterpolator.swift in Sources */,
1920
1926
  2E9C96FA2822F43100677516 /* BaseCompositionLayer.swift in Sources */,
1921
1927
  2EAF5A9C27A0798700E00531 /* BundleImageProvider.macOS.swift in Sources */,
1922
1928
  2E9C96A02822F43100677516 /* TextAnimatorNode.swift in Sources */,
@@ -1957,6 +1963,7 @@
1957
1963
  2E9C95E92822F43100677516 /* Merge.swift in Sources */,
1958
1964
  2E9C96042822F43100677516 /* ImageLayerModel.swift in Sources */,
1959
1965
  19465F53282F998B00BB2C97 /* CachedImageProvider.swift in Sources */,
1966
+ 08F8B20E2898A7B100CB5323 /* RepeaterLayer.swift in Sources */,
1960
1967
  2E9C96BB2822F43100677516 /* KeypathSearchable.swift in Sources */,
1961
1968
  2E9C963D2822F43100677516 /* AssetLibrary.swift in Sources */,
1962
1969
  2E9C97032822F43100677516 /* PreCompLayer.swift in Sources */,
@@ -2092,6 +2099,7 @@
2092
2099
  2EAF5AEB27A0798700E00531 /* AnimationTextProvider.swift in Sources */,
2093
2100
  2E9C96682822F43100677516 /* LayerTransformNode.swift in Sources */,
2094
2101
  2E9C97432822F43100677516 /* TestHelpers.swift in Sources */,
2102
+ 08EF21DE289C643B0097EA47 /* KeyframeInterpolator.swift in Sources */,
2095
2103
  2E9C96172822F43100677516 /* Transform.swift in Sources */,
2096
2104
  2E9C97492822F43100677516 /* CGFloatExtensions.swift in Sources */,
2097
2105
  2EAF5AC727A0798700E00531 /* UIColorExtension.swift in Sources */,
@@ -2106,7 +2114,6 @@
2106
2114
  2E9C965F2822F43100677516 /* MainThreadAnimationLayer.swift in Sources */,
2107
2115
  2E9C96502822F43100677516 /* SolidCompositionLayer.swift in Sources */,
2108
2116
  2E9C96412822F43100677516 /* Asset.swift in Sources */,
2109
- 2E9C96C22822F43100677516 /* KeyframeInterpolator.swift in Sources */,
2110
2117
  2E9C96FB2822F43100677516 /* BaseCompositionLayer.swift in Sources */,
2111
2118
  2EAF5A9D27A0798700E00531 /* BundleImageProvider.macOS.swift in Sources */,
2112
2119
  2E9C96A12822F43100677516 /* TextAnimatorNode.swift in Sources */,
@@ -2147,6 +2154,7 @@
2147
2154
  2E9C95EA2822F43100677516 /* Merge.swift in Sources */,
2148
2155
  2E9C96052822F43100677516 /* ImageLayerModel.swift in Sources */,
2149
2156
  19465F54282F998B00BB2C97 /* CachedImageProvider.swift in Sources */,
2157
+ 08F8B20F2898A7B100CB5323 /* RepeaterLayer.swift in Sources */,
2150
2158
  2E9C96BC2822F43100677516 /* KeypathSearchable.swift in Sources */,
2151
2159
  2E9C963E2822F43100677516 /* AssetLibrary.swift in Sources */,
2152
2160
  2E9C97042822F43100677516 /* PreCompLayer.swift in Sources */,
@@ -15,7 +15,7 @@
15
15
  <BuildableReference
16
16
  BuildableIdentifier = "primary"
17
17
  BlueprintIdentifier = "2EAF59AC27A0787B00E00531"
18
- BuildableName = "Lottie_macOS.framework"
18
+ BuildableName = "Lottie.framework"
19
19
  BlueprintName = "Lottie-macOS"
20
20
  ReferencedContainer = "container:Lottie.xcodeproj">
21
21
  </BuildableReference>
@@ -51,7 +51,7 @@
51
51
  <BuildableReference
52
52
  BuildableIdentifier = "primary"
53
53
  BlueprintIdentifier = "2EAF59AC27A0787B00E00531"
54
- BuildableName = "Lottie_macOS.framework"
54
+ BuildableName = "Lottie.framework"
55
55
  BlueprintName = "Lottie-macOS"
56
56
  ReferencedContainer = "container:Lottie.xcodeproj">
57
57
  </BuildableReference>
@@ -19,33 +19,6 @@
19
19
  "version": "0.7.0"
20
20
  }
21
21
  },
22
- {
23
- "package": "SourceKitten",
24
- "repositoryURL": "https://github.com/jpsim/SourceKitten.git",
25
- "state": {
26
- "branch": null,
27
- "revision": "817dfa6f2e09b0476f3a6c9dbc035991f02f0241",
28
- "version": "0.32.0"
29
- }
30
- },
31
- {
32
- "package": "AirbnbSwift",
33
- "repositoryURL": "https://github.com/airbnb/swift",
34
- "state": {
35
- "branch": "master",
36
- "revision": "b844956fd69f05e550038469a5d498462176f87a",
37
- "version": null
38
- }
39
- },
40
- {
41
- "package": "swift-argument-parser",
42
- "repositoryURL": "https://github.com/apple/swift-argument-parser.git",
43
- "state": {
44
- "branch": null,
45
- "revision": "e394bf350e38cb100b6bc4172834770ede1b7232",
46
- "version": "1.0.3"
47
- }
48
- },
49
22
  {
50
23
  "package": "swift-snapshot-testing",
51
24
  "repositoryURL": "https://github.com/pointfreeco/swift-snapshot-testing.git",
@@ -54,60 +27,6 @@
54
27
  "revision": "88f6e2c0afe04221fcfb1601a2ecaad83115a05f",
55
28
  "version": null
56
29
  }
57
- },
58
- {
59
- "package": "SwiftSyntax",
60
- "repositoryURL": "https://github.com/apple/swift-syntax.git",
61
- "state": {
62
- "branch": null,
63
- "revision": "0b6c22b97f8e9320bca62e82cdbee601cf37ad3f",
64
- "version": "0.50600.1"
65
- }
66
- },
67
- {
68
- "package": "SwiftFormat",
69
- "repositoryURL": "https://github.com/calda/SwiftFormat",
70
- "state": {
71
- "branch": null,
72
- "revision": "2a9ed335450d3b3f66b2699d65124b9089195f5d",
73
- "version": "0.49.11-beta-2"
74
- }
75
- },
76
- {
77
- "package": "SwiftLint",
78
- "repositoryURL": "https://github.com/realm/SwiftLint",
79
- "state": {
80
- "branch": "e497f1f",
81
- "revision": "e497f1f5b161af96ba439049d21970c6204d06c6",
82
- "version": null
83
- }
84
- },
85
- {
86
- "package": "SwiftyTextTable",
87
- "repositoryURL": "https://github.com/scottrhoyt/SwiftyTextTable.git",
88
- "state": {
89
- "branch": null,
90
- "revision": "c6df6cf533d120716bff38f8ff9885e1ce2a4ac3",
91
- "version": "0.9.0"
92
- }
93
- },
94
- {
95
- "package": "SWXMLHash",
96
- "repositoryURL": "https://github.com/drmohundro/SWXMLHash.git",
97
- "state": {
98
- "branch": null,
99
- "revision": "6469881a3f30417c5bb02404ea4b69207f297592",
100
- "version": "6.0.0"
101
- }
102
- },
103
- {
104
- "package": "Yams",
105
- "repositoryURL": "https://github.com/jpsim/Yams.git",
106
- "state": {
107
- "branch": null,
108
- "revision": "9ff1cc9327586db4e0c8f46f064b6a82ec1566fa",
109
- "version": "4.0.6"
110
- }
111
30
  }
112
31
  ]
113
32
  },
@@ -18,22 +18,5 @@
18
18
  endingLineNumber = "44">
19
19
  </BreakpointContent>
20
20
  </BreakpointProxy>
21
- <BreakpointProxy
22
- BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
23
- <BreakpointContent
24
- uuid = "E2A7ABE7-5600-4664-AFAF-E57EDC35B39F"
25
- shouldBeEnabled = "No"
26
- condition = "outFrame == 601"
27
- ignoreCount = "0"
28
- continueAfterRunningActions = "No"
29
- filePath = "Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift"
30
- startingColumnNumber = "9223372036854775807"
31
- endingColumnNumber = "9223372036854775807"
32
- startingLineNumber = "17"
33
- endingLineNumber = "17"
34
- landmarkName = "addVisibilityAnimation(inFrame:outFrame:context:)"
35
- landmarkType = "7">
36
- </BreakpointContent>
37
- </BreakpointProxy>
38
21
  </Breakpoints>
39
22
  </Bucket>
@@ -2,6 +2,104 @@
2
2
  <VariablesViewState
3
3
  version = "1.0">
4
4
  <ContextStates>
5
+ <ContextState
6
+ contextName = "closure #1 in CAShapeLayer.addAnimations(for:context:pathMultiplier:transformPath:):CustomPathAnimation.swift">
7
+ <PersistentStrings>
8
+ <PersistentString
9
+ value = "UIBezierPath(cgPath: pathKeyframe.cgPath())">
10
+ </PersistentString>
11
+ <PersistentString
12
+ value = "path.boundingBox">
13
+ </PersistentString>
14
+ </PersistentStrings>
15
+ </ContextState>
16
+ <ContextState
17
+ contextName = "closure #1 in CAShapeLayer.addAnimations(for:context:pathMultiplier:):CombinedShapeAnimation.swift">
18
+ <PersistentStrings>
19
+ <PersistentString
20
+ value = "UIBezierPath(cgPath: combinedPath)">
21
+ </PersistentString>
22
+ </PersistentStrings>
23
+ </ContextState>
24
+ <ContextState
25
+ contextName = "closure #2 in GradientRenderLayer.addGradientAnimations(for:type:context:):GradientAnimations.swift">
26
+ <PersistentStrings>
27
+ <PersistentString
28
+ value = "gradient.colorConfiguration(from: colorComponents, type: type)">
29
+ </PersistentString>
30
+ </PersistentStrings>
31
+ </ContextState>
32
+ <ContextState
33
+ contextName = "closure #1 in MaskCompositionLayer.MaskLayer.setupAnimations(context:):MaskCompositionLayer.swift">
34
+ <PersistentStrings>
35
+ <PersistentString
36
+ value = "UIBezierPath(cgPath: maskPath)">
37
+ </PersistentString>
38
+ </PersistentStrings>
39
+ </ContextState>
40
+ <ContextState
41
+ contextName = "GradientRenderLayer.addGradientAnimations(for:type:context:):GradientAnimations.swift">
42
+ </ContextState>
43
+ <ContextState
44
+ contextName = "ShapeNodeProperties.init(shape:):ShapeNode.swift">
45
+ <PersistentStrings>
46
+ <PersistentString
47
+ value = "UIBezierPath(cgPath: shape.path.keyframes[0].value.cgPath())">
48
+ </PersistentString>
49
+ </PersistentStrings>
50
+ </ContextState>
51
+ <ContextState
52
+ contextName = "ShapeNode.rebuildOutputs(frame:):ShapeNode.swift">
53
+ <PersistentStrings>
54
+ <PersistentString
55
+ value = "properties.path">
56
+ </PersistentString>
57
+ </PersistentStrings>
58
+ </ContextState>
59
+ <ContextState
60
+ contextName = "MaskLayer.updateWithFrame(frame:forceUpdates:):MaskContainerLayer.swift">
61
+ <PersistentStrings>
62
+ <PersistentString
63
+ value = "UIBezierPath(cgPath: shapePath)">
64
+ </PersistentString>
65
+ </PersistentStrings>
66
+ </ContextState>
67
+ <ContextState
68
+ contextName = "MaskCompositionLayer.init(masks:):MaskCompositionLayer.swift">
69
+ </ContextState>
70
+ <ContextState
71
+ contextName = "CoreAnimationLayer.init(animation:imageProvider:fontProvider:compatibilityTrackerMode:logger:):CoreAnimationLayer.swift">
72
+ </ContextState>
73
+ <ContextState
74
+ contextName = "closure #1 in CAShapeLayer.addAnimations(for:context:pathMultiplier:):RectangleAnimation.swift">
75
+ <PersistentStrings>
76
+ <PersistentString
77
+ value = "UIBezierPath(cgPath: BezierPath.rectangle(position: keyframe.position.pointValue, size: keyframe.size.sizeValue, cornerRadius: keyframe.cornerRadius.cgFloatValue, direction: rectangle.direction).cgPath())">
78
+ </PersistentString>
79
+ </PersistentStrings>
80
+ </ContextState>
81
+ <ContextState
82
+ contextName = "Array&lt;&#x3c4;_0_0&gt;.shapeRenderGroups.getter:ShapeLayer.swift">
83
+ </ContextState>
84
+ <ContextState
85
+ contextName = "CALayer.path&lt;&#x3c4;_0_0&gt;(keyframes:value:):CALayer+addAnimation.swift">
86
+ <PersistentStrings>
87
+ <PersistentString
88
+ value = "UIBezierPath(cgPath: path)">
89
+ </PersistentString>
90
+ </PersistentStrings>
91
+ </ContextState>
92
+ <ContextState
93
+ contextName = "CAShapeLayer.addStrokeAnimations(for:context:):StrokeAnimation.swift">
94
+ <PersistentStrings>
95
+ <PersistentString
96
+ value = "UIColor(cgColor: strokeColor.keyframes[0].value.cgColorValue)">
97
+ </PersistentString>
98
+ </PersistentStrings>
99
+ </ContextState>
100
+ <ContextState
101
+ contextName = "Collection&lt;&gt;.pairedLayersAndMasks(context:):CALayer+setupLayerHierarchy.swift">
102
+ </ContextState>
5
103
  <ContextState
6
104
  contextName = "ShapeItemLayer.setupSolidFillAnimations(shapeLayer:context:):ShapeItemLayer.swift">
7
105
  <PersistentStrings>
@@ -11,7 +109,7 @@
11
109
  </PersistentStrings>
12
110
  </ContextState>
13
111
  <ContextState
14
- contextName = "CALayer.keyframeAnimation&lt;&#x3c4;_0_0, &#x3c4;_0_1&gt;(for:keyframes:value:context:):CALayer+addAnimation.swift">
112
+ contextName = "ShapeItemLayer.init(shape:otherItems:context:):ShapeItemLayer.swift">
15
113
  </ContextState>
16
114
  <ContextState
17
115
  contextName = "FillNode.rebuildOutputs(frame:):FillNode.swift">
@@ -21,5 +119,20 @@
21
119
  </PersistentString>
22
120
  </PersistentStrings>
23
121
  </ContextState>
122
+ <ContextState
123
+ contextName = "CALayer.keyframeAnimation&lt;&#x3c4;_0_0, &#x3c4;_0_1&gt;(for:keyframes:value:context:):CALayer+addAnimation.swift">
124
+ </ContextState>
125
+ <ContextState
126
+ contextName = "CALayer.makeGroupLayers(from:parentGroup:context:):ShapeLayer.swift">
127
+ </ContextState>
128
+ <ContextState
129
+ contextName = "CALayer.addPositionAnimations(from:context:):TransformAnimations.swift">
130
+ </ContextState>
131
+ <ContextState
132
+ contextName = "closure #1 in Array&lt;&#x3c4;_0_0&gt;.shapeRenderGroups.getter:ShapeLayer.swift">
133
+ </ContextState>
134
+ <ContextState
135
+ contextName = "GroupLayer.init(group:inheritedItems:context:):ShapeLayer.swift">
136
+ </ContextState>
24
137
  </ContextStates>
25
138
  </VariablesViewState>
package/Package.swift CHANGED
@@ -5,9 +5,4 @@ let package = Package(
5
5
  name: "Lottie",
6
6
  platforms: [.iOS("11.0"), .macOS("10.10"), .tvOS("11.0")],
7
7
  products: [.library(name: "Lottie", targets: ["Lottie"])],
8
- targets: [.target(name: "Lottie", path: "Sources")])
9
-
10
- #if swift(>=5.6)
11
- // Add the Airbnb Swift formatting plugin if possible
12
- package.dependencies.append(.package(url: "https://github.com/airbnb/swift", .branch("master")))
13
- #endif
8
+ targets: [.target(name: "Lottie", path: "Sources")])
package/Rakefile CHANGED
@@ -93,7 +93,7 @@ end
93
93
  namespace :lint do
94
94
  desc 'Lints swift files'
95
95
  task :swift do
96
- sh 'swift package --allow-writing-to-package-directory format --lint'
96
+ formatTool('format --lint')
97
97
  end
98
98
 
99
99
  desc 'Lints the CocoaPods podspec'
@@ -105,7 +105,7 @@ end
105
105
  namespace :format do
106
106
  desc 'Formats swift files'
107
107
  task :swift do
108
- sh 'swift package --allow-writing-to-package-directory format'
108
+ formatTool('format')
109
109
  end
110
110
  end
111
111
 
@@ -119,3 +119,42 @@ def xcodebuild(command)
119
119
  sh "xcodebuild #{command}"
120
120
  end
121
121
  end
122
+
123
+ def formatTool(command)
124
+ # As of Xcode 13.4 / Xcode 14 beta 4, including airbnb/swift as a dependency
125
+ # causes Xcode to spin indefinitely at 100% CPU (due to the remote binary dependencies
126
+ # used by that package). As a workaround, we can specifically add that dependency
127
+ # to our Package.swift file when linting / formatting and remove it afterwards.
128
+ packageDefinition = File.read('Package.swift')
129
+ packageDefinitionWithFormatDependency = packageDefinition +
130
+ <<~EOC
131
+
132
+ #if swift(>=5.6)
133
+ // Add the Airbnb Swift formatting plugin if possible
134
+ package.dependencies.append(
135
+ .package(
136
+ url: "https://github.com/airbnb/swift",
137
+ // Since we don't have a Package.resolved for this, we need to reference a specific commit
138
+ // so changes to the style guide don't cause this repo's checks to start failing.
139
+ .revision("cec29280c35dd6eccba415fa3bfc24c819eae887")))
140
+ #endif
141
+ EOC
142
+
143
+ # Add the format tool dependency to our Package.swift
144
+ File.write('Package.swift', packageDefinitionWithFormatDependency)
145
+
146
+ exitCode = 0
147
+
148
+ # Run the given command
149
+ begin
150
+ sh "swift package --allow-writing-to-package-directory #{command}"
151
+ rescue
152
+ exitCode = $?.exitstatus
153
+ ensure
154
+ # Revert the changes to Package.swift
155
+ File.write('Package.swift', packageDefinition)
156
+ File.delete('Package.resolved')
157
+ end
158
+
159
+ exit exitCode
160
+ end
@@ -336,8 +336,7 @@ extension CALayer {
336
336
  if
337
337
  let controlPoint1 = keyframe.spatialOutTangent?.pointValue,
338
338
  let controlPoint2 = nextKeyframe.spatialInTangent?.pointValue,
339
- controlPoint1 != .zero,
340
- controlPoint2 != .zero
339
+ !(controlPoint1 == .zero && controlPoint2 == .zero)
341
340
  {
342
341
  path.addCurve(
343
342
  to: try keyframeValueMapping(nextKeyframe.value),
@@ -51,3 +51,31 @@ final class CombinedShapeItem: ShapeItem {
51
51
  let shapes: KeyframeGroup<[BezierPath]>
52
52
 
53
53
  }
54
+
55
+ extension CombinedShapeItem {
56
+ /// Manually combines the given shape keyframes by manually interpolating at each frame
57
+ static func manuallyInterpolating(
58
+ shapes: [KeyframeGroup<BezierPath>],
59
+ name: String,
60
+ context: LayerContext)
61
+ -> CombinedShapeItem
62
+ {
63
+ let animationTimeRange = Int(context.animation.startFrame)...Int(context.animation.endFrame)
64
+
65
+ let interpolators = shapes.map { shape in
66
+ KeyframeInterpolator(keyframes: shape.keyframes)
67
+ }
68
+
69
+ let interpolatedKeyframes = animationTimeRange.map { frame in
70
+ Keyframe(
71
+ value: interpolators.compactMap { interpolator in
72
+ interpolator.value(frame: AnimationFrameTime(frame)) as? BezierPath
73
+ },
74
+ time: AnimationFrameTime(frame))
75
+ }
76
+
77
+ return CombinedShapeItem(
78
+ shapes: KeyframeGroup(keyframes: ContiguousArray(interpolatedKeyframes)),
79
+ name: name)
80
+ }
81
+ }
@@ -14,11 +14,11 @@ extension CAShapeLayer {
14
14
  {
15
15
  try addAnimation(
16
16
  for: .path,
17
- keyframes: ellipse.size.keyframes,
18
- value: { sizeKeyframe in
17
+ keyframes: ellipse.combinedKeyframes(context: context).keyframes,
18
+ value: { keyframe in
19
19
  BezierPath.ellipse(
20
- size: sizeKeyframe.sizeValue,
21
- center: try ellipse.position.exactlyOneKeyframe(context: context, description: "ellipse position").value.pointValue,
20
+ size: keyframe.size.sizeValue,
21
+ center: keyframe.position.pointValue,
22
22
  direction: ellipse.direction)
23
23
  .cgPath()
24
24
  .duplicated(times: pathMultiplier)
@@ -26,3 +26,30 @@ extension CAShapeLayer {
26
26
  context: context)
27
27
  }
28
28
  }
29
+
30
+ extension Ellipse {
31
+ /// Data that represents how to render an ellipse at a specific point in time
32
+ struct Keyframe {
33
+ let size: Vector3D
34
+ let position: Vector3D
35
+ }
36
+
37
+ /// Creates a single array of animatable keyframes from the separate arrays of keyframes in this Ellipse
38
+ func combinedKeyframes(context: LayerAnimationContext) throws-> KeyframeGroup<Ellipse.Keyframe> {
39
+ let combinedKeyframes = Keyframes.combinedIfPossible(
40
+ size, position,
41
+ makeCombinedResult: Ellipse.Keyframe.init)
42
+
43
+ if let combinedKeyframes = combinedKeyframes {
44
+ return combinedKeyframes
45
+ } else {
46
+ // If we weren't able to combine all of the keyframes, we have to take the timing values
47
+ // from one property and use a fixed value for the other properties.
48
+ return try size.map { sizeValue in
49
+ Keyframe(
50
+ size: sizeValue,
51
+ position: try position.exactlyOneKeyframe(context: context, description: "ellipse position"))
52
+ }
53
+ }
54
+ }
55
+ }