lottie-ios 3.2.3 → 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/.github/actions/setup/action.yml +32 -0
  2. package/.github/issue_template.md +6 -23
  3. package/.github/workflows/main.yml +98 -0
  4. package/.github/workflows/stale_issues.yml +17 -0
  5. package/.spi.yml +6 -0
  6. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  7. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  9. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  10. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  11. package/Gemfile +4 -0
  12. package/Gemfile.lock +102 -0
  13. package/Lottie.xcodeproj/project.pbxproj +2011 -1972
  14. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  15. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (macOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  19. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  20. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  21. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  22. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  23. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
  24. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  25. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  26. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +22 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +138 -0
  30. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  31. package/Package.swift +5 -15
  32. package/README.md +40 -60
  33. package/Rakefile +160 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +447 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +81 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +55 -0
  39. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
  40. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  41. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  42. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +58 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +257 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +124 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +73 -0
  46. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  47. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  48. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  49. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +497 -0
  50. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  51. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  52. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +154 -0
  53. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  55. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +88 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +167 -0
  57. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
  58. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  59. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +64 -0
  60. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  61. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  62. package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +315 -0
  64. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +390 -0
  65. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  66. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  67. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  68. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +94 -86
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +59 -43
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  76. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  77. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  78. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  79. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  80. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +149 -106
  81. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +26 -24
  82. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  83. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  84. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +9 -4
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  99. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  100. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +247 -0
  101. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
  102. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
  103. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  105. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  108. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
  109. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +57 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +66 -58
  113. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +169 -0
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
  119. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
  120. package/Sources/Private/Model/Animation.swift +160 -0
  121. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  122. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  123. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  124. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  125. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  126. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  127. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  128. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  129. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +222 -0
  130. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  131. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  135. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  136. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  137. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  138. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  139. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  140. package/Sources/Private/Model/ShapeItems/Ellipse.swift +74 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +137 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +185 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -12
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +72 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +135 -0
  148. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  150. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +135 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +131 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +101 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +77 -0
  154. package/Sources/Private/Model/Text/Font.swift +61 -0
  155. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  156. package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
  157. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  158. package/Sources/Private/RootAnimationLayer.swift +51 -0
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  160. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
  161. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  162. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  163. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  164. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  165. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  166. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  167. package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
  168. package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
  169. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  170. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
  171. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  172. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  173. package/{lottie-swift/src/Private/NodeRenderSystem/NodeProperties/ValueProviders → Sources/Private/Utility/Interpolatable}/KeyframeInterpolator.swift +125 -108
  174. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  175. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  177. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  178. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  179. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  180. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  181. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  182. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  183. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  184. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  185. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  186. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  187. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  188. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  190. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  191. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  194. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  195. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  196. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  197. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  198. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  199. package/Sources/Public/LottieConfiguration.swift +143 -0
  200. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  202. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  203. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  207. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  208. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  209. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  211. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  212. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  213. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  214. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  215. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  216. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  217. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  218. package/Tests/AnimationKeypathTests.swift +103 -0
  219. package/Tests/AutomaticEngineTests.swift +57 -0
  220. package/Tests/BundleTests.swift +25 -0
  221. package/Tests/DataURLTests.swift +64 -0
  222. package/Tests/ParsingTests.swift +43 -0
  223. package/Tests/PerformanceTests.swift +214 -0
  224. package/Tests/Samples/9squares_AlBoardman.json +1 -0
  225. package/Tests/Samples/Boat_Loader.json +1 -0
  226. package/Tests/Samples/HamburgerArrow.json +1 -0
  227. package/Tests/Samples/IconTransitions.json +1 -0
  228. package/Tests/Samples/Images/dog.png +0 -0
  229. package/Tests/Samples/Issues/issue_1125.json +1 -0
  230. package/Tests/Samples/Issues/issue_1260.json +1 -0
  231. package/Tests/Samples/Issues/issue_1403.json +1 -0
  232. package/Tests/Samples/Issues/issue_1407.json +1 -0
  233. package/Tests/Samples/Issues/issue_1460.json +1 -0
  234. package/Tests/Samples/Issues/issue_1488.json +1 -0
  235. package/Tests/Samples/Issues/issue_1505.json +1 -0
  236. package/Tests/Samples/Issues/issue_1541.json +1 -0
  237. package/Tests/Samples/Issues/issue_1557.json +1 -0
  238. package/Tests/Samples/Issues/issue_1603.json +1 -0
  239. package/Tests/Samples/Issues/issue_1628.json +1 -0
  240. package/Tests/Samples/Issues/issue_1636.json +1 -0
  241. package/Tests/Samples/Issues/issue_1643.json +1 -0
  242. package/Tests/Samples/Issues/issue_1655.json +1 -0
  243. package/Tests/Samples/Issues/issue_1664.json +1 -0
  244. package/Tests/Samples/Issues/issue_1683.json +1 -0
  245. package/Tests/Samples/Issues/issue_1687.json +1 -0
  246. package/Tests/Samples/Issues/issue_1711.json +1 -0
  247. package/Tests/Samples/Issues/issue_1717.json +1 -0
  248. package/Tests/Samples/Issues/issue_769.json +1 -0
  249. package/Tests/Samples/Issues/issue_885.json +1 -0
  250. package/Tests/Samples/Issues/issue_965.json +1 -0
  251. package/Tests/Samples/Issues/pr_1536.json +1 -0
  252. package/Tests/Samples/Issues/pr_1563.json +8439 -0
  253. package/Tests/Samples/Issues/pr_1592.json +5527 -0
  254. package/Tests/Samples/Issues/pr_1599.json +738 -0
  255. package/Tests/Samples/Issues/pr_1604_1.json +1 -0
  256. package/Tests/Samples/Issues/pr_1604_2.json +1 -0
  257. package/Tests/Samples/Issues/pr_1632_1.json +1 -0
  258. package/Tests/Samples/Issues/pr_1632_2.json +1 -0
  259. package/Tests/Samples/Issues/pr_1686.json +513 -0
  260. package/Tests/Samples/Issues/pr_1698.json +1 -0
  261. package/Tests/Samples/Issues/pr_1699.json +1 -0
  262. package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
  263. package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
  264. package/Tests/Samples/LottieFiles/cactus.json +1 -0
  265. package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
  266. package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
  267. package/Tests/Samples/LottieFiles/fireworks.json +1 -0
  268. package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
  269. package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
  270. package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
  271. package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
  272. package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
  273. package/Tests/Samples/LottieFiles/growth.json +1 -0
  274. package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
  275. package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
  276. package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
  277. package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
  278. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
  279. package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
  280. package/Tests/Samples/LottieFiles/shop.json +1 -0
  281. package/Tests/Samples/LottieFiles/step_loader.json +1 -0
  282. package/Tests/Samples/LottieLogo1.json +1 -0
  283. package/Tests/Samples/LottieLogo1_masked.json +1 -0
  284. package/Tests/Samples/LottieLogo2.json +1 -0
  285. package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
  286. package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
  287. package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
  288. package/Tests/Samples/Nonanimating/FirstText.json +1 -0
  289. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
  290. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
  291. package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
  292. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
  293. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
  294. package/Tests/Samples/Nonanimating/Zoom.json +1 -0
  295. package/Tests/Samples/Nonanimating/_dog.json +1 -0
  296. package/Tests/Samples/Nonanimating/base64Test.json +1 -0
  297. package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
  298. package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
  299. package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
  300. package/Tests/Samples/PinJump.json +1 -0
  301. package/Tests/Samples/Switch.json +1 -0
  302. package/Tests/Samples/Switch_States.json +1 -0
  303. package/Tests/Samples/TwitterHeart.json +1 -0
  304. package/Tests/Samples/TwitterHeartButton.json +1 -0
  305. package/Tests/Samples/TypeFace/A.json +1 -0
  306. package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
  307. package/Tests/Samples/TypeFace/B.json +1 -0
  308. package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
  309. package/Tests/Samples/TypeFace/C.json +1 -0
  310. package/Tests/Samples/TypeFace/Colon.json +1 -0
  311. package/Tests/Samples/TypeFace/Comma.json +1 -0
  312. package/Tests/Samples/TypeFace/D.json +1 -0
  313. package/Tests/Samples/TypeFace/E.json +1 -0
  314. package/Tests/Samples/TypeFace/F.json +1 -0
  315. package/Tests/Samples/TypeFace/G.json +1 -0
  316. package/Tests/Samples/TypeFace/H.json +1 -0
  317. package/Tests/Samples/TypeFace/I.json +1 -0
  318. package/Tests/Samples/TypeFace/J.json +1 -0
  319. package/Tests/Samples/TypeFace/K.json +1 -0
  320. package/Tests/Samples/TypeFace/L.json +1 -0
  321. package/Tests/Samples/TypeFace/M.json +1 -0
  322. package/Tests/Samples/TypeFace/N.json +1 -0
  323. package/Tests/Samples/TypeFace/O.json +1 -0
  324. package/Tests/Samples/TypeFace/P.json +1 -0
  325. package/Tests/Samples/TypeFace/Q.json +1 -0
  326. package/Tests/Samples/TypeFace/R.json +1 -0
  327. package/Tests/Samples/TypeFace/S.json +1 -0
  328. package/Tests/Samples/TypeFace/T.json +1 -0
  329. package/Tests/Samples/TypeFace/U.json +1 -0
  330. package/Tests/Samples/TypeFace/V.json +1 -0
  331. package/Tests/Samples/TypeFace/W.json +1 -0
  332. package/Tests/Samples/TypeFace/X.json +1 -0
  333. package/Tests/Samples/TypeFace/Y.json +1 -0
  334. package/Tests/Samples/TypeFace/Z.json +1 -0
  335. package/Tests/Samples/Watermelon.json +1 -0
  336. package/Tests/Samples/setValueTest.json +1 -0
  337. package/Tests/Samples/timeremap.json +1 -0
  338. package/Tests/Samples/vcTransition1.json +1 -0
  339. package/Tests/Samples/vcTransition2.json +1 -0
  340. package/Tests/SnapshotConfiguration.swift +158 -0
  341. package/Tests/SnapshotTests.swift +265 -0
  342. package/Tests/Utils/Bundle+Module.swift +30 -0
  343. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  344. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  345. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  346. package/Tests/ValueProvidersTests.swift +27 -0
  347. package/lottie-ios.podspec +12 -12
  348. package/package.json +1 -1
  349. package/script/test-carthage/Cartfile +1 -0
  350. package/script/test-carthage/Cartfile.resolved +1 -0
  351. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  352. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  353. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  354. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  355. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  356. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  357. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  358. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  359. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  360. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  361. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  362. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  363. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  364. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  365. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  366. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  367. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  368. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  369. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  370. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  371. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  372. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  373. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  374. package/script/test-carthage/Mintfile +1 -0
  375. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  376. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  377. package/script/test-spm/Mintfile +1 -0
  378. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  379. package/Lottie/Info.plist +0 -22
  380. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  381. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  382. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  383. package/lottie-swift/Assets/.gitkeep +0 -0
  384. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  385. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  386. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  387. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  388. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  389. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  390. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  391. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  392. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  393. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  394. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  395. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  396. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  397. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  398. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  399. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  400. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  401. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  402. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  403. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  404. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  405. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  406. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  407. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  408. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  409. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  410. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  411. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  412. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  413. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  414. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  415. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +0 -127
  416. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  417. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  418. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  419. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  420. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  421. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  422. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  423. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  424. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  425. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  426. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  427. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  428. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  429. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  430. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  431. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  432. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  433. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  434. package/lottie-swift-testing.podspec +0 -32
@@ -5,10 +5,10 @@
5
5
  // Created by Brandon Withrow on 8/3/20.
6
6
  //
7
7
 
8
- import Foundation
8
+ import CoreGraphics
9
9
  import CoreText
10
+ import Foundation
10
11
  import QuartzCore
11
- import CoreGraphics
12
12
  /// Needed for NSMutableParagraphStyle...
13
13
  #if os(OSX)
14
14
  import AppKit
@@ -16,132 +16,106 @@ import AppKit
16
16
  import UIKit
17
17
  #endif
18
18
 
19
- final class TextLayer: CALayer {
20
-
19
+ // MARK: - CoreTextRenderLayer
20
+
21
+ /// A CALayer subclass that renders text content using CoreText
22
+ final class CoreTextRenderLayer: CALayer {
23
+
24
+ // MARK: Public
25
+
21
26
  public var text: String? {
22
27
  didSet {
23
28
  needsContentUpdate = true
24
- self.setNeedsLayout()
25
- self.setNeedsDisplay()
29
+ setNeedsLayout()
30
+ setNeedsDisplay()
26
31
  }
27
32
  }
28
-
33
+
29
34
  public var font: CTFont? {
30
35
  didSet {
31
36
  needsContentUpdate = true
32
- self.setNeedsLayout()
33
- self.setNeedsDisplay()
37
+ setNeedsLayout()
38
+ setNeedsDisplay()
34
39
  }
35
40
  }
36
-
41
+
37
42
  public var alignment: NSTextAlignment = .left {
38
43
  didSet {
39
44
  needsContentUpdate = true
40
- self.setNeedsLayout()
41
- self.setNeedsDisplay()
45
+ setNeedsLayout()
46
+ setNeedsDisplay()
42
47
  }
43
48
  }
44
-
49
+
45
50
  public var lineHeight: CGFloat = 0 {
46
51
  didSet {
47
52
  needsContentUpdate = true
48
- self.setNeedsLayout()
49
- self.setNeedsDisplay()
53
+ setNeedsLayout()
54
+ setNeedsDisplay()
50
55
  }
51
56
  }
52
-
57
+
53
58
  public var tracking: CGFloat = 0 {
54
59
  didSet {
55
60
  needsContentUpdate = true
56
- self.setNeedsLayout()
57
- self.setNeedsDisplay()
61
+ setNeedsLayout()
62
+ setNeedsDisplay()
58
63
  }
59
64
  }
60
-
65
+
61
66
  public var fillColor: CGColor? {
62
67
  didSet {
63
68
  needsContentUpdate = true
64
- self.setNeedsLayout()
65
- self.setNeedsDisplay()
69
+ setNeedsLayout()
70
+ setNeedsDisplay()
66
71
  }
67
72
  }
68
-
73
+
69
74
  public var strokeColor: CGColor? {
70
75
  didSet {
71
76
  needsContentUpdate = true
72
- self.setNeedsLayout()
73
- self.setNeedsDisplay()
77
+ setNeedsLayout()
78
+ setNeedsDisplay()
74
79
  }
75
80
  }
76
-
81
+
77
82
  public var strokeWidth: CGFloat = 0 {
78
83
  didSet {
79
84
  needsContentUpdate = true
80
- self.setNeedsLayout()
81
- self.setNeedsDisplay()
85
+ setNeedsLayout()
86
+ setNeedsDisplay()
82
87
  }
83
88
  }
84
-
85
- public var strokeOnTop: Bool = false {
89
+
90
+ public var strokeOnTop = false {
86
91
  didSet {
87
- self.setNeedsLayout()
88
- self.setNeedsDisplay()
92
+ setNeedsLayout()
93
+ setNeedsDisplay()
89
94
  }
90
95
  }
91
-
96
+
92
97
  public var preferredSize: CGSize? {
93
98
  didSet {
94
99
  needsContentUpdate = true
95
- self.setNeedsLayout()
96
- self.setNeedsDisplay()
100
+ setNeedsLayout()
101
+ setNeedsDisplay()
97
102
  }
98
103
  }
99
-
104
+
100
105
  public func sizeToFit() {
101
106
  updateTextContent()
102
107
  bounds = drawingRect
103
108
  anchorPoint = drawingAnchor
104
- self.setNeedsLayout()
105
- self.setNeedsDisplay()
106
- }
107
-
108
- override func action(forKey event: String) -> CAAction? {
109
- return nil
109
+ setNeedsLayout()
110
+ setNeedsDisplay()
110
111
  }
111
-
112
- // Draws Debug colors for the font alignment.
113
- @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
114
- private func drawDebug(_ ctx: CGContext) {
115
- if let font = font {
116
- let ascent = CTFontGetAscent(font)
117
- let descent = CTFontGetDescent(font)
118
- let capHeight = CTFontGetCapHeight(font)
119
- let leading = CTFontGetLeading(font)
120
-
121
- // Ascent Red
122
- ctx.setFillColor(CGColor(srgbRed: 1, green: 0, blue: 0, alpha: 0.5))
123
- ctx.fill(CGRect(x:0, y:0, width:drawingRect.width, height:ascent))
124
-
125
- // Descent Blue
126
- ctx.setFillColor(CGColor(srgbRed: 0, green: 0, blue: 1, alpha: 0.5))
127
- ctx.fill(CGRect(x:0, y:ascent, width:drawingRect.width, height:descent))
128
-
129
- // Leading Yellow
130
- ctx.setFillColor(CGColor(srgbRed: 1, green: 1, blue: 0, alpha: 0.5))
131
- ctx.fill(CGRect(x:0, y:ascent+descent, width:drawingRect.width, height:leading))
132
-
133
- // Cap height Green
134
- ctx.setFillColor(CGColor(srgbRed: 0, green: 1, blue: 0, alpha: 0.5))
135
- ctx.fill(CGRect(x:0, y:ascent - capHeight, width:drawingRect.width, height:capHeight))
136
-
137
- if drawingRect.height - ascent+descent+leading > 0 {
138
- // Remainder
139
- ctx.setFillColor(CGColor(srgbRed: 0, green: 1, blue: 1, alpha: 0.5))
140
- ctx.fill(CGRect(x:0, y:ascent+descent+leading, width:drawingRect.width, height:drawingRect.height - ascent+descent+leading))
141
- }
142
- }
112
+
113
+ // MARK: Internal
114
+
115
+ override func action(forKey _: String) -> CAAction? {
116
+ nil
143
117
  }
144
-
118
+
145
119
  override func draw(in ctx: CGContext) {
146
120
  guard let attributedString = attributedString else { return }
147
121
  updateTextContent()
@@ -149,61 +123,108 @@ final class TextLayer: CALayer {
149
123
 
150
124
  ctx.textMatrix = .identity
151
125
  ctx.setAllowsAntialiasing(true)
152
- ctx.setAllowsFontSmoothing(true)
153
126
  ctx.setAllowsFontSubpixelPositioning(true)
154
127
  ctx.setAllowsFontSubpixelQuantization(true)
155
128
 
156
129
  ctx.setShouldAntialias(true)
157
- ctx.setShouldSmoothFonts(true)
158
130
  ctx.setShouldSubpixelPositionFonts(true)
159
131
  ctx.setShouldSubpixelQuantizeFonts(true)
160
132
 
161
- if self.contentsAreFlipped() {
133
+ if contentsAreFlipped() {
162
134
  ctx.translateBy(x: 0, y: drawingRect.height)
163
135
  ctx.scaleBy(x: 1.0, y: -1.0)
164
136
  }
165
137
 
166
138
  let drawingPath = CGPath(rect: drawingRect, transform: nil)
167
-
139
+
168
140
  let fillFrame: CTFrame?
169
141
  if let setter = fillFrameSetter {
170
142
  fillFrame = CTFramesetterCreateFrame(setter, CFRangeMake(0, attributedString.length), drawingPath, nil)
171
143
  } else {
172
144
  fillFrame = nil
173
145
  }
174
-
146
+
175
147
  let strokeFrame: CTFrame?
176
148
  if let setter = strokeFrameSetter {
177
149
  strokeFrame = CTFramesetterCreateFrame(setter, CFRangeMake(0, attributedString.length), drawingPath, nil)
178
150
  } else {
179
151
  strokeFrame = nil
180
152
  }
181
-
153
+
154
+ // This fixes a vertical padding issue that arises when drawing some fonts.
155
+ // For some reason some fonts, such as Helvetica draw with and ascender that is greater than the one reported by CTFontGetAscender.
156
+ // I suspect this is actually an issue with the Attributed string, but cannot reproduce.
157
+
158
+ if let fillFrame = fillFrame {
159
+ ctx.adjustWithLineOrigins(in: fillFrame, with: font)
160
+ } else if let strokeFrame = strokeFrame {
161
+ ctx.adjustWithLineOrigins(in: strokeFrame, with: font)
162
+ }
182
163
 
183
164
  if !strokeOnTop, let strokeFrame = strokeFrame {
184
165
  CTFrameDraw(strokeFrame, ctx)
185
166
  }
186
-
167
+
187
168
  if let fillFrame = fillFrame {
188
169
  CTFrameDraw(fillFrame, ctx)
189
170
  }
190
-
171
+
191
172
  if strokeOnTop, let strokeFrame = strokeFrame {
192
173
  CTFrameDraw(strokeFrame, ctx)
193
174
  }
194
175
  }
195
-
176
+
177
+ // MARK: Private
178
+
196
179
  private var drawingRect: CGRect = .zero
197
180
  private var drawingAnchor: CGPoint = .zero
198
181
  private var fillFrameSetter: CTFramesetter?
199
182
  private var attributedString: NSAttributedString?
200
183
  private var strokeFrameSetter: CTFramesetter?
201
- private var needsContentUpdate: Bool = false
202
-
184
+ private var needsContentUpdate = false
185
+
186
+ // Draws Debug colors for the font alignment.
187
+ @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
188
+ private func drawDebug(_ ctx: CGContext) {
189
+ if let font = font {
190
+ let ascent = CTFontGetAscent(font)
191
+ let descent = CTFontGetDescent(font)
192
+ let capHeight = CTFontGetCapHeight(font)
193
+ let leading = CTFontGetLeading(font)
194
+
195
+ // Ascent Red
196
+ ctx.setFillColor(CGColor(srgbRed: 1, green: 0, blue: 0, alpha: 0.5))
197
+ ctx.fill(CGRect(x: 0, y: 0, width: drawingRect.width, height: ascent))
198
+
199
+ // Descent Blue
200
+ ctx.setFillColor(CGColor(srgbRed: 0, green: 0, blue: 1, alpha: 0.5))
201
+ ctx.fill(CGRect(x: 0, y: ascent, width: drawingRect.width, height: descent))
202
+
203
+ // Leading Yellow
204
+ ctx.setFillColor(CGColor(srgbRed: 1, green: 1, blue: 0, alpha: 0.5))
205
+ ctx.fill(CGRect(x: 0, y: ascent + descent, width: drawingRect.width, height: leading))
206
+
207
+ // Cap height Green
208
+ ctx.setFillColor(CGColor(srgbRed: 0, green: 1, blue: 0, alpha: 0.5))
209
+ ctx.fill(CGRect(x: 0, y: ascent - capHeight, width: drawingRect.width, height: capHeight))
210
+
211
+ if drawingRect.height - ascent + descent + leading > 0 {
212
+ // Remainder
213
+ ctx.setFillColor(CGColor(srgbRed: 0, green: 1, blue: 1, alpha: 0.5))
214
+ ctx
215
+ .fill(CGRect(
216
+ x: 0,
217
+ y: ascent + descent + leading,
218
+ width: drawingRect.width,
219
+ height: drawingRect.height - ascent + descent + leading))
220
+ }
221
+ }
222
+ }
223
+
203
224
  private func updateTextContent() {
204
225
  guard needsContentUpdate else { return }
205
226
  needsContentUpdate = false
206
- guard let font = font, let text = text, text.count > 0, (fillColor != nil || strokeColor != nil) else {
227
+ guard let font = font, let text = text, text.count > 0, fillColor != nil || strokeColor != nil else {
207
228
  drawingRect = .zero
208
229
  drawingAnchor = .zero
209
230
  attributedString = nil
@@ -218,37 +239,37 @@ final class TextLayer: CALayer {
218
239
  let capHeight = CTFontGetCapHeight(font)
219
240
  let leading = CTFontGetLeading(font)
220
241
  let minLineHeight = -(ascent + descent + leading)
221
-
242
+
222
243
  // Calculate line spacing
223
244
  let lineSpacing = max(CGFloat(minLineHeight) + lineHeight, CGFloat(minLineHeight))
224
245
  // Build Attributes
225
246
  let paragraphStyle = NSMutableParagraphStyle()
226
247
  paragraphStyle.lineSpacing = lineSpacing
227
248
  paragraphStyle.lineHeightMultiple = 1
228
- paragraphStyle.maximumLineHeight = ascent+descent+leading
249
+ paragraphStyle.maximumLineHeight = ascent + descent + leading
229
250
  paragraphStyle.alignment = alignment
230
251
  paragraphStyle.lineBreakMode = NSLineBreakMode.byWordWrapping
231
- var attributes: [NSAttributedString.Key : Any] = [
252
+ var attributes: [NSAttributedString.Key: Any] = [
232
253
  NSAttributedString.Key.ligature: 0,
233
254
  NSAttributedString.Key.font: font,
234
255
  NSAttributedString.Key.kern: tracking,
235
- NSAttributedString.Key.paragraphStyle: paragraphStyle
256
+ NSAttributedString.Key.paragraphStyle: paragraphStyle,
236
257
  ]
237
-
258
+
238
259
  if let fillColor = fillColor {
239
260
  attributes[NSAttributedString.Key.foregroundColor] = fillColor
240
261
  }
241
-
262
+
242
263
  let attrString = NSAttributedString(string: text, attributes: attributes)
243
264
  attributedString = attrString
244
-
265
+
245
266
  if fillColor != nil {
246
267
  let setter = CTFramesetterCreateWithAttributedString(attrString as CFAttributedString)
247
268
  fillFrameSetter = setter
248
269
  } else {
249
270
  fillFrameSetter = nil
250
271
  }
251
-
272
+
252
273
  if let strokeColor = strokeColor {
253
274
  attributes[NSAttributedString.Key.foregroundColor] = nil
254
275
  attributes[NSAttributedString.Key.strokeWidth] = strokeWidth
@@ -259,26 +280,25 @@ final class TextLayer: CALayer {
259
280
  strokeFrameSetter = nil
260
281
  strokeWidth = 0
261
282
  }
262
-
283
+
263
284
  guard let setter = fillFrameSetter ?? strokeFrameSetter else {
264
285
  return
265
286
  }
266
-
287
+
267
288
  // Calculate drawing size and anchor offset
268
289
  let textAnchor: CGPoint
269
290
  if let preferredSize = preferredSize {
270
291
  drawingRect = CGRect(origin: .zero, size: preferredSize)
271
292
  drawingRect.size.height += (ascent - capHeight)
272
293
  drawingRect.size.height += descent
273
- textAnchor = CGPoint(x: 0, y: (ascent-capHeight))
294
+ textAnchor = CGPoint(x: 0, y: ascent - capHeight)
274
295
  } else {
275
296
  let size = CTFramesetterSuggestFrameSizeWithConstraints(
276
297
  setter,
277
298
  CFRange(location: 0, length: attrString.length),
278
299
  nil,
279
300
  CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude),
280
- nil
281
- )
301
+ nil)
282
302
  switch alignment {
283
303
  case .left:
284
304
  textAnchor = CGPoint(x: 0, y: ascent)
@@ -289,18 +309,41 @@ final class TextLayer: CALayer {
289
309
  default:
290
310
  textAnchor = .zero
291
311
  }
292
- drawingRect = CGRect(x: 0, y: 0, width: ceil(size.width),
293
- height: ceil(size.height))
312
+ drawingRect = CGRect(
313
+ x: 0,
314
+ y: 0,
315
+ width: ceil(size.width),
316
+ height: ceil(size.height))
294
317
  }
295
-
318
+
296
319
  // Now Calculate Anchor
297
- drawingAnchor = CGPoint(x: textAnchor.x.remap(fromLow: 0, fromHigh: drawingRect.size.width, toLow: 0, toHigh: 1),
298
- y: textAnchor.y.remap(fromLow: 0, fromHigh: drawingRect.size.height, toLow: 0, toHigh: 1))
320
+ drawingAnchor = CGPoint(
321
+ x: textAnchor.x.remap(fromLow: 0, fromHigh: drawingRect.size.width, toLow: 0, toHigh: 1),
322
+ y: textAnchor.y.remap(fromLow: 0, fromHigh: drawingRect.size.height, toLow: 0, toHigh: 1))
299
323
 
300
- if fillFrameSetter != nil && strokeFrameSetter != nil {
324
+ if fillFrameSetter != nil, strokeFrameSetter != nil {
301
325
  drawingRect.size.width += strokeWidth
302
326
  drawingRect.size.height += strokeWidth
303
327
  }
304
328
  }
305
-
329
+
330
+ }
331
+
332
+ extension CGContext {
333
+
334
+ fileprivate func adjustWithLineOrigins(in frame: CTFrame, with font: CTFont?) {
335
+ guard let font = font else { return }
336
+
337
+ let count = CFArrayGetCount(CTFrameGetLines(frame))
338
+
339
+ guard count > 0 else { return }
340
+
341
+ var o = [CGPoint](repeating: .zero, count: 1)
342
+ CTFrameGetLineOrigins(frame, CFRange(location: count - 1, length: 1), &o)
343
+
344
+ let diff = CTFontGetDescent(font) - o[0].y
345
+ if diff > 0 {
346
+ translateBy(x: 0, y: diff)
347
+ }
348
+ }
306
349
  }
@@ -8,50 +8,52 @@
8
8
  import Foundation
9
9
  import QuartzCore
10
10
 
11
- /**
12
- A layer that inverses the alpha output of its input layer.
13
-
14
- WARNING: This is experimental and probably not very performant.
15
- */
11
+ /// A layer that inverses the alpha output of its input layer.
12
+ ///
13
+ /// WARNING: This is experimental and probably not very performant.
16
14
  final class InvertedMatteLayer: CALayer, CompositionLayerDelegate {
17
-
18
- let inputMatte: CompositionLayer?
19
- let wrapperLayer = CALayer()
20
-
15
+
16
+ // MARK: Lifecycle
17
+
21
18
  init(inputMatte: CompositionLayer) {
22
19
  self.inputMatte = inputMatte
23
20
  super.init()
24
21
  inputMatte.layerDelegate = self
25
- self.anchorPoint = .zero
26
- self.bounds = inputMatte.bounds
27
- self.setNeedsDisplay()
22
+ anchorPoint = .zero
23
+ bounds = inputMatte.bounds
24
+ setNeedsDisplay()
28
25
  }
29
-
26
+
30
27
  override init(layer: Any) {
31
28
  guard let layer = layer as? InvertedMatteLayer else {
32
29
  fatalError("init(layer:) wrong class.")
33
30
  }
34
- self.inputMatte = nil
31
+ inputMatte = nil
35
32
  super.init(layer: layer)
36
33
  }
37
-
38
- func frameUpdated(frame: CGFloat) {
39
- self.setNeedsDisplay()
40
- self.displayIfNeeded()
41
- }
42
-
43
- required init?(coder aDecoder: NSCoder) {
34
+
35
+ required init?(coder _: NSCoder) {
44
36
  fatalError("init(coder:) has not been implemented")
45
37
  }
46
-
38
+
39
+ // MARK: Internal
40
+
41
+ let inputMatte: CompositionLayer?
42
+ let wrapperLayer = CALayer()
43
+
44
+ func frameUpdated(frame _: CGFloat) {
45
+ setNeedsDisplay()
46
+ displayIfNeeded()
47
+ }
48
+
47
49
  override func draw(in ctx: CGContext) {
48
50
  guard let inputMatte = inputMatte else { return }
49
51
  guard let fillColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [0, 0, 0, 1])
50
- else { return }
52
+ else { return }
51
53
  ctx.setFillColor(fillColor)
52
54
  ctx.fill(bounds)
53
55
  ctx.setBlendMode(.destinationOut)
54
56
  inputMatte.render(in: ctx)
55
57
  }
56
-
58
+
57
59
  }
@@ -0,0 +1,41 @@
1
+ //
2
+ // LayerFontProvider.swift
3
+ // Lottie
4
+ //
5
+ // Created by Brandon Withrow on 8/5/20.
6
+ // Copyright © 2020 YurtvilleProds. All rights reserved.
7
+ //
8
+
9
+ import Foundation
10
+
11
+ /// Connects a LottieFontProvider to a group of text layers
12
+ final class LayerFontProvider {
13
+
14
+ // MARK: Lifecycle
15
+
16
+ init(fontProvider: AnimationFontProvider) {
17
+ self.fontProvider = fontProvider
18
+ textLayers = []
19
+ reloadTexts()
20
+ }
21
+
22
+ // MARK: Internal
23
+
24
+ private(set) var textLayers: [TextCompositionLayer]
25
+
26
+ var fontProvider: AnimationFontProvider {
27
+ didSet {
28
+ reloadTexts()
29
+ }
30
+ }
31
+
32
+ func addTextLayers(_ layers: [TextCompositionLayer]) {
33
+ textLayers += layers
34
+ }
35
+
36
+ func reloadTexts() {
37
+ textLayers.forEach {
38
+ $0.fontProvider = fontProvider
39
+ }
40
+ }
41
+ }
@@ -9,27 +9,31 @@ import Foundation
9
9
 
10
10
  /// Connects a LottieImageProvider to a group of image layers
11
11
  final class LayerImageProvider {
12
-
13
- var imageProvider: AnimationImageProvider {
14
- didSet {
15
- reloadImages()
16
- }
17
- }
18
-
19
- fileprivate(set) var imageLayers: [ImageCompositionLayer]
20
- let imageAssets: [String : ImageAsset]
21
-
22
- init(imageProvider: AnimationImageProvider, assets: [String : ImageAsset]?) {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ init(imageProvider: AnimationImageProvider, assets: [String: ImageAsset]?) {
23
16
  self.imageProvider = imageProvider
24
- self.imageLayers = [ImageCompositionLayer]()
17
+ imageLayers = [ImageCompositionLayer]()
25
18
  if let assets = assets {
26
- self.imageAssets = assets
19
+ imageAssets = assets
27
20
  } else {
28
- self.imageAssets = [:]
21
+ imageAssets = [:]
29
22
  }
30
23
  reloadImages()
31
24
  }
32
-
25
+
26
+ // MARK: Internal
27
+
28
+ private(set) var imageLayers: [ImageCompositionLayer]
29
+ let imageAssets: [String: ImageAsset]
30
+
31
+ var imageProvider: AnimationImageProvider {
32
+ didSet {
33
+ reloadImages()
34
+ }
35
+ }
36
+
33
37
  func addImageLayers(_ layers: [ImageCompositionLayer]) {
34
38
  for layer in layers {
35
39
  if imageAssets[layer.imageReferenceID] != nil {
@@ -38,7 +42,7 @@ final class LayerImageProvider {
38
42
  }
39
43
  }
40
44
  }
41
-
45
+
42
46
  func reloadImages() {
43
47
  for imageLayer in imageLayers {
44
48
  if let asset = imageAssets[imageLayer.imageReferenceID] {
@@ -0,0 +1,40 @@
1
+ //
2
+ // LayerTextProvider.swift
3
+ // lottie-ios-iOS
4
+ //
5
+ // Created by Alexandr Goncharov on 07/06/2019.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ /// Connects a LottieTextProvider to a group of text layers
11
+ final class LayerTextProvider {
12
+
13
+ // MARK: Lifecycle
14
+
15
+ init(textProvider: AnimationTextProvider) {
16
+ self.textProvider = textProvider
17
+ textLayers = []
18
+ reloadTexts()
19
+ }
20
+
21
+ // MARK: Internal
22
+
23
+ private(set) var textLayers: [TextCompositionLayer]
24
+
25
+ var textProvider: AnimationTextProvider {
26
+ didSet {
27
+ reloadTexts()
28
+ }
29
+ }
30
+
31
+ func addTextLayers(_ layers: [TextCompositionLayer]) {
32
+ textLayers += layers
33
+ }
34
+
35
+ func reloadTexts() {
36
+ textLayers.forEach {
37
+ $0.textProvider = textProvider
38
+ }
39
+ }
40
+ }