@lumen5/lottie-web 5.14.0

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 (300) hide show
  1. package/.babelrc.json +3 -0
  2. package/.eslintrc.json +46 -0
  3. package/.gitattributes +1 -0
  4. package/.github/FUNDING.yml +1 -0
  5. package/.github/ISSUE_TEMPLATE.md +22 -0
  6. package/.github/workflows/publish.yml +26 -0
  7. package/.github/workflows/testAnimations.yml +29 -0
  8. package/.github/workflows/updateScreenshots.yml +34 -0
  9. package/CHANGELOG.md +601 -0
  10. package/History.md +1230 -0
  11. package/LICENSE.md +21 -0
  12. package/README.md +351 -0
  13. package/bower.json +31 -0
  14. package/build/old_parser/bodymovin_parser.jsx +3023 -0
  15. package/build/old_parser/helperProject.aep +0 -0
  16. package/build/player/cjs/lottie.min.js +18229 -0
  17. package/build/player/cjs/lottie_canvas.min.js +16465 -0
  18. package/build/player/cjs/lottie_html.min.js +16312 -0
  19. package/build/player/cjs/lottie_light.min.js +11584 -0
  20. package/build/player/cjs/lottie_light_canvas.min.js +13518 -0
  21. package/build/player/cjs/lottie_light_html.min.js +12843 -0
  22. package/build/player/cjs/lottie_svg.min.js +15053 -0
  23. package/build/player/esm/lottie.min.js +18225 -0
  24. package/build/player/esm/lottie_canvas.min.js +16461 -0
  25. package/build/player/esm/lottie_html.min.js +16308 -0
  26. package/build/player/esm/lottie_light.min.js +11580 -0
  27. package/build/player/esm/lottie_light_canvas.min.js +13514 -0
  28. package/build/player/esm/lottie_light_html.min.js +12839 -0
  29. package/build/player/esm/lottie_svg.min.js +15049 -0
  30. package/build/player/lottie.d.ts +5 -0
  31. package/build/player/lottie.js +17151 -0
  32. package/build/player/lottie.min.js +1 -0
  33. package/build/player/lottie_canvas.js +15506 -0
  34. package/build/player/lottie_canvas.min.js +1 -0
  35. package/build/player/lottie_canvas_worker.js +18196 -0
  36. package/build/player/lottie_canvas_worker.min.js +15 -0
  37. package/build/player/lottie_html.d.ts +5 -0
  38. package/build/player/lottie_html.js +15354 -0
  39. package/build/player/lottie_html.min.js +1 -0
  40. package/build/player/lottie_light.d.ts +5 -0
  41. package/build/player/lottie_light.js +10854 -0
  42. package/build/player/lottie_light.min.js +1 -0
  43. package/build/player/lottie_light_canvas.d.ts +5 -0
  44. package/build/player/lottie_light_canvas.js +12666 -0
  45. package/build/player/lottie_light_canvas.min.js +1 -0
  46. package/build/player/lottie_light_html.d.ts +5 -0
  47. package/build/player/lottie_light_html.js +12029 -0
  48. package/build/player/lottie_light_html.min.js +1 -0
  49. package/build/player/lottie_svg.d.ts +5 -0
  50. package/build/player/lottie_svg.js +14179 -0
  51. package/build/player/lottie_svg.min.js +1 -0
  52. package/build/player/lottie_worker.js +18196 -0
  53. package/build/player/lottie_worker.min.js +15 -0
  54. package/docs/json/animation.json +101 -0
  55. package/docs/json/effects/angle.json +40 -0
  56. package/docs/json/effects/checkBox.json +40 -0
  57. package/docs/json/effects/color.json +40 -0
  58. package/docs/json/effects/customValue.json +4 -0
  59. package/docs/json/effects/dropDown.json +40 -0
  60. package/docs/json/effects/fill.json +55 -0
  61. package/docs/json/effects/group.json +41 -0
  62. package/docs/json/effects/index.json +51 -0
  63. package/docs/json/effects/layer.json +33 -0
  64. package/docs/json/effects/noValue.json +1 -0
  65. package/docs/json/effects/point.json +43 -0
  66. package/docs/json/effects/proLevels.json +130 -0
  67. package/docs/json/effects/slider.json +40 -0
  68. package/docs/json/effects/stroke.json +64 -0
  69. package/docs/json/effects/tint.json +43 -0
  70. package/docs/json/effects/tritone.json +46 -0
  71. package/docs/json/helpers/blendMode.json +71 -0
  72. package/docs/json/helpers/boolean.json +14 -0
  73. package/docs/json/helpers/composite.json +15 -0
  74. package/docs/json/helpers/lineCap.json +19 -0
  75. package/docs/json/helpers/lineJoin.json +19 -0
  76. package/docs/json/helpers/mask.json +80 -0
  77. package/docs/json/helpers/textBased.json +23 -0
  78. package/docs/json/helpers/textGrouping.json +23 -0
  79. package/docs/json/helpers/textShape.json +31 -0
  80. package/docs/json/helpers/transform.json +146 -0
  81. package/docs/json/layers/image.json +113 -0
  82. package/docs/json/layers/null.json +87 -0
  83. package/docs/json/layers/preComp.json +118 -0
  84. package/docs/json/layers/shape.json +157 -0
  85. package/docs/json/layers/solid.json +120 -0
  86. package/docs/json/layers/text.json +523 -0
  87. package/docs/json/properties/doubleKeyframe.json +50 -0
  88. package/docs/json/properties/multiDimensional.json +21 -0
  89. package/docs/json/properties/multiDimensionalKeyframed.json +35 -0
  90. package/docs/json/properties/offsetKeyframe.json +53 -0
  91. package/docs/json/properties/shape.json +27 -0
  92. package/docs/json/properties/shapeKeyframed.json +35 -0
  93. package/docs/json/properties/shapeProp.json +50 -0
  94. package/docs/json/properties/shapePropKeyframe.json +54 -0
  95. package/docs/json/properties/value.json +21 -0
  96. package/docs/json/properties/valueKeyframe.json +33 -0
  97. package/docs/json/properties/valueKeyframed.json +25 -0
  98. package/docs/json/shapes/ellipse.json +54 -0
  99. package/docs/json/shapes/fill.json +48 -0
  100. package/docs/json/shapes/gFill.json +107 -0
  101. package/docs/json/shapes/gStroke.json +137 -0
  102. package/docs/json/shapes/group.json +89 -0
  103. package/docs/json/shapes/merge.json +27 -0
  104. package/docs/json/shapes/rect.json +66 -0
  105. package/docs/json/shapes/repeater.json +63 -0
  106. package/docs/json/shapes/round.json +35 -0
  107. package/docs/json/shapes/shape.json +40 -0
  108. package/docs/json/shapes/star.json +133 -0
  109. package/docs/json/shapes/stroke.json +78 -0
  110. package/docs/json/shapes/transform.json +102 -0
  111. package/docs/json/shapes/trim.json +61 -0
  112. package/docs/json/sources/chars.json +61 -0
  113. package/docs/json/sources/image.json +31 -0
  114. package/docs/json/sources/precomp.json +39 -0
  115. package/index.d.ts +197 -0
  116. package/package.json +54 -0
  117. package/player/index.html +115 -0
  118. package/player/js/3rd_party/BezierEaser.js +158 -0
  119. package/player/js/3rd_party/howler.js +5 -0
  120. package/player/js/3rd_party/seedrandom.js +237 -0
  121. package/player/js/3rd_party/transformation-matrix.js +449 -0
  122. package/player/js/EffectsManager.js +83 -0
  123. package/player/js/animation/AnimationItem.js +809 -0
  124. package/player/js/animation/AnimationItemWorkerOverride.js +157 -0
  125. package/player/js/animation/AnimationManager.js +248 -0
  126. package/player/js/animation/AnimationManagerWorkerOverride.js +201 -0
  127. package/player/js/effects/EffectsManagerPlaceholder.js +5 -0
  128. package/player/js/effects/SliderEffect.js +37 -0
  129. package/player/js/effects/TransformEffect.js +44 -0
  130. package/player/js/elements/AudioElement.js +102 -0
  131. package/player/js/elements/BaseElement.js +78 -0
  132. package/player/js/elements/BaseTextElement.js +4 -0
  133. package/player/js/elements/CompElement.js +107 -0
  134. package/player/js/elements/FootageElement.js +47 -0
  135. package/player/js/elements/ImageElement.js +42 -0
  136. package/player/js/elements/NullElement.js +39 -0
  137. package/player/js/elements/ShapeElement.js +76 -0
  138. package/player/js/elements/SolidElement.js +23 -0
  139. package/player/js/elements/TextElement.js +94 -0
  140. package/player/js/elements/canvasElements/CVBaseElement.js +167 -0
  141. package/player/js/elements/canvasElements/CVCompBaseElement.js +11 -0
  142. package/player/js/elements/canvasElements/CVCompElement.js +57 -0
  143. package/player/js/elements/canvasElements/CVContextData.js +239 -0
  144. package/player/js/elements/canvasElements/CVEffects.js +57 -0
  145. package/player/js/elements/canvasElements/CVImageElement.js +58 -0
  146. package/player/js/elements/canvasElements/CVMaskElement.js +72 -0
  147. package/player/js/elements/canvasElements/CVShapeElement.js +521 -0
  148. package/player/js/elements/canvasElements/CVSolidElement.js +30 -0
  149. package/player/js/elements/canvasElements/CVTextElement.js +244 -0
  150. package/player/js/elements/canvasElements/effects/CVGaussianBlurEffect.js +29 -0
  151. package/player/js/elements/canvasElements/effects/CVTransformEffect.js +9 -0
  152. package/player/js/elements/helpers/FrameElement.js +54 -0
  153. package/player/js/elements/helpers/HierarchyElement.js +52 -0
  154. package/player/js/elements/helpers/RenderableDOMElement.js +72 -0
  155. package/player/js/elements/helpers/RenderableElement.js +87 -0
  156. package/player/js/elements/helpers/TransformElement.js +140 -0
  157. package/player/js/elements/helpers/shapes/CVShapeData.js +33 -0
  158. package/player/js/elements/helpers/shapes/ProcessedElement.js +6 -0
  159. package/player/js/elements/helpers/shapes/SVGElementsRenderer.js +239 -0
  160. package/player/js/elements/helpers/shapes/SVGFillStyleData.js +18 -0
  161. package/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js +100 -0
  162. package/player/js/elements/helpers/shapes/SVGGradientStrokeStyleData.js +20 -0
  163. package/player/js/elements/helpers/shapes/SVGNoStyleData.js +15 -0
  164. package/player/js/elements/helpers/shapes/SVGShapeData.js +28 -0
  165. package/player/js/elements/helpers/shapes/SVGStrokeStyleData.js +21 -0
  166. package/player/js/elements/helpers/shapes/SVGStyleData.js +19 -0
  167. package/player/js/elements/helpers/shapes/SVGTransformData.js +11 -0
  168. package/player/js/elements/helpers/shapes/ShapeElement.js +5 -0
  169. package/player/js/elements/helpers/shapes/ShapeGroupData.js +9 -0
  170. package/player/js/elements/helpers/shapes/ShapeTransformManager.js +61 -0
  171. package/player/js/elements/htmlElements/HBaseElement.js +88 -0
  172. package/player/js/elements/htmlElements/HCameraElement.js +170 -0
  173. package/player/js/elements/htmlElements/HCompElement.js +61 -0
  174. package/player/js/elements/htmlElements/HEffects.js +3 -0
  175. package/player/js/elements/htmlElements/HImageElement.js +42 -0
  176. package/player/js/elements/htmlElements/HShapeElement.js +261 -0
  177. package/player/js/elements/htmlElements/HSolidElement.js +36 -0
  178. package/player/js/elements/htmlElements/HTextElement.js +290 -0
  179. package/player/js/elements/svgElements/SVGBaseElement.js +181 -0
  180. package/player/js/elements/svgElements/SVGCompElement.js +28 -0
  181. package/player/js/elements/svgElements/SVGEffects.js +70 -0
  182. package/player/js/elements/svgElements/SVGEffectsPlaceholder.js +3 -0
  183. package/player/js/elements/svgElements/SVGShapeElement.js +366 -0
  184. package/player/js/elements/svgElements/SVGTextElement.js +322 -0
  185. package/player/js/elements/svgElements/effects/SVGComposableEffect.js +22 -0
  186. package/player/js/elements/svgElements/effects/SVGDropShadowEffect.js +83 -0
  187. package/player/js/elements/svgElements/effects/SVGFillFilter.js +22 -0
  188. package/player/js/elements/svgElements/effects/SVGGaussianBlurEffect.js +44 -0
  189. package/player/js/elements/svgElements/effects/SVGMatte3Effect.js +101 -0
  190. package/player/js/elements/svgElements/effects/SVGProLevelsFilter.js +108 -0
  191. package/player/js/elements/svgElements/effects/SVGStrokeEffect.js +119 -0
  192. package/player/js/elements/svgElements/effects/SVGTintEffect.js +47 -0
  193. package/player/js/elements/svgElements/effects/SVGTransformEffect.js +10 -0
  194. package/player/js/elements/svgElements/effects/SVGTritoneFilter.js +43 -0
  195. package/player/js/main.js +21 -0
  196. package/player/js/mask.js +239 -0
  197. package/player/js/module.js +153 -0
  198. package/player/js/modules/canvas.js +22 -0
  199. package/player/js/modules/canvas_light.js +25 -0
  200. package/player/js/modules/full.js +70 -0
  201. package/player/js/modules/full_worker.js +0 -0
  202. package/player/js/modules/html.js +37 -0
  203. package/player/js/modules/html_light.js +25 -0
  204. package/player/js/modules/main.js +162 -0
  205. package/player/js/modules/svg.js +37 -0
  206. package/player/js/modules/svg_light.js +25 -0
  207. package/player/js/renderers/BaseRenderer.js +187 -0
  208. package/player/js/renderers/CanvasRenderer.js +67 -0
  209. package/player/js/renderers/CanvasRendererBase.js +318 -0
  210. package/player/js/renderers/CanvasRendererWorkerOverride.js +54 -0
  211. package/player/js/renderers/HybridRenderer.js +47 -0
  212. package/player/js/renderers/HybridRendererBase.js +344 -0
  213. package/player/js/renderers/SVGRenderer.js +82 -0
  214. package/player/js/renderers/SVGRendererBase.js +255 -0
  215. package/player/js/renderers/renderersManager.js +29 -0
  216. package/player/js/utils/BaseEvent.js +42 -0
  217. package/player/js/utils/DataManager.js +676 -0
  218. package/player/js/utils/DataManagerWorkerOverrides.js +13 -0
  219. package/player/js/utils/FontManager.js +443 -0
  220. package/player/js/utils/FontManagerWorkerOverride.js +16 -0
  221. package/player/js/utils/PolynomialBezier.js +253 -0
  222. package/player/js/utils/PropertyFactory.js +489 -0
  223. package/player/js/utils/SlotManager.js +17 -0
  224. package/player/js/utils/TransformProperty.js +251 -0
  225. package/player/js/utils/animationFramePolyFill.js +25 -0
  226. package/player/js/utils/asset_loader.js +53 -0
  227. package/player/js/utils/asset_loader_worker_override.js +3 -0
  228. package/player/js/utils/audio/AudioController.js +85 -0
  229. package/player/js/utils/audio/AudioElement.js +6 -0
  230. package/player/js/utils/bez.js +251 -0
  231. package/player/js/utils/common.js +280 -0
  232. package/player/js/utils/expressions/CompInterface.js +28 -0
  233. package/player/js/utils/expressions/EffectInterface.js +111 -0
  234. package/player/js/utils/expressions/ExpressionManager.js +752 -0
  235. package/player/js/utils/expressions/ExpressionPropertyDecorator.js +463 -0
  236. package/player/js/utils/expressions/ExpressionTextPropertyDecorator.js +40 -0
  237. package/player/js/utils/expressions/ExpressionValue.js +61 -0
  238. package/player/js/utils/expressions/ExpressionValueFactory.js +102 -0
  239. package/player/js/utils/expressions/Expressions.js +48 -0
  240. package/player/js/utils/expressions/FootageInterface.js +60 -0
  241. package/player/js/utils/expressions/InterfacesProvider.js +21 -0
  242. package/player/js/utils/expressions/LayerInterface.js +179 -0
  243. package/player/js/utils/expressions/MaskInterface.js +50 -0
  244. package/player/js/utils/expressions/ProjectInterface.js +31 -0
  245. package/player/js/utils/expressions/PropertyGroupFactory.js +13 -0
  246. package/player/js/utils/expressions/PropertyInterface.js +19 -0
  247. package/player/js/utils/expressions/ShapeInterface.js +543 -0
  248. package/player/js/utils/expressions/TextInterface.js +35 -0
  249. package/player/js/utils/expressions/TextSelectorPropertyDecorator.js +44 -0
  250. package/player/js/utils/expressions/TransformInterface.js +126 -0
  251. package/player/js/utils/expressions/expressionHelpers.js +86 -0
  252. package/player/js/utils/expressions/shapes/ShapePathInterface.js +47 -0
  253. package/player/js/utils/featureSupport.js +16 -0
  254. package/player/js/utils/filters.js +32 -0
  255. package/player/js/utils/functionExtensions.js +27 -0
  256. package/player/js/utils/getFontProperties.js +42 -0
  257. package/player/js/utils/helpers/arrays.js +43 -0
  258. package/player/js/utils/helpers/assetManager.js +96 -0
  259. package/player/js/utils/helpers/blendModes.js +26 -0
  260. package/player/js/utils/helpers/bufferManager.js +61 -0
  261. package/player/js/utils/helpers/dynamicProperties.js +29 -0
  262. package/player/js/utils/helpers/effectTypes.js +3 -0
  263. package/player/js/utils/helpers/html_elements.js +6 -0
  264. package/player/js/utils/helpers/propTypes.js +3 -0
  265. package/player/js/utils/helpers/shapeEnums.js +16 -0
  266. package/player/js/utils/helpers/svg_elements.js +8 -0
  267. package/player/js/utils/imagePreloader.js +213 -0
  268. package/player/js/utils/imagePreloaderWorkerOverride.js +3 -0
  269. package/player/js/utils/markers/markerParser.js +47 -0
  270. package/player/js/utils/pooling/bezier_length_pool.js +20 -0
  271. package/player/js/utils/pooling/point_pool.js +13 -0
  272. package/player/js/utils/pooling/pool_factory.js +44 -0
  273. package/player/js/utils/pooling/pooling.js +15 -0
  274. package/player/js/utils/pooling/segments_length_pool.js +24 -0
  275. package/player/js/utils/pooling/shapeCollection_pool.js +48 -0
  276. package/player/js/utils/pooling/shape_pool.js +44 -0
  277. package/player/js/utils/shapes/DashProperty.js +63 -0
  278. package/player/js/utils/shapes/GradientProperty.js +93 -0
  279. package/player/js/utils/shapes/MouseModifier.js +222 -0
  280. package/player/js/utils/shapes/OffsetPathModifier.js +306 -0
  281. package/player/js/utils/shapes/PuckerAndBloatModifier.js +80 -0
  282. package/player/js/utils/shapes/RepeaterModifier.js +232 -0
  283. package/player/js/utils/shapes/RoundCornersModifier.js +122 -0
  284. package/player/js/utils/shapes/ShapeCollection.js +29 -0
  285. package/player/js/utils/shapes/ShapeModifiers.js +71 -0
  286. package/player/js/utils/shapes/ShapePath.js +100 -0
  287. package/player/js/utils/shapes/ShapeProperty.js +546 -0
  288. package/player/js/utils/shapes/TrimModifier.js +359 -0
  289. package/player/js/utils/shapes/ZigZagModifier.js +174 -0
  290. package/player/js/utils/shapes/shapePathBuilder.js +20 -0
  291. package/player/js/utils/text/LetterProps.js +60 -0
  292. package/player/js/utils/text/TextAnimatorDataProperty.js +34 -0
  293. package/player/js/utils/text/TextAnimatorProperty.js +610 -0
  294. package/player/js/utils/text/TextProperty.js +461 -0
  295. package/player/js/utils/text/TextSelectorProperty.js +179 -0
  296. package/player/js/worker_wrapper.js +1029 -0
  297. package/rollup.config.js +215 -0
  298. package/tasks/build.js +773 -0
  299. package/tasks/build_worker.js +164 -0
  300. package/tasks/watch.js +34 -0
@@ -0,0 +1,461 @@
1
+ import {
2
+ initialDefaultFrame,
3
+ } from '../../main';
4
+ import getFontProperties from '../getFontProperties';
5
+ import FontManager from '../FontManager';
6
+
7
+ function TextProperty(elem, data) {
8
+ this._frameId = initialDefaultFrame;
9
+ this.pv = '';
10
+ this.v = '';
11
+ this.kf = false;
12
+ this._isFirstFrame = true;
13
+ this._mdf = false;
14
+ if (data.d && data.d.sid) {
15
+ data.d = elem.globalData.slotManager.getProp(data.d);
16
+ }
17
+ this.data = data;
18
+ this.elem = elem;
19
+ this.comp = this.elem.comp;
20
+ this.keysIndex = 0;
21
+ this.canResize = false;
22
+ this.minimumFontSize = 1;
23
+ this.effectsSequence = [];
24
+ this.currentData = {
25
+ ascent: 0,
26
+ boxWidth: this.defaultBoxWidth,
27
+ f: '',
28
+ fStyle: '',
29
+ fWeight: '',
30
+ fc: '',
31
+ j: '',
32
+ justifyOffset: '',
33
+ l: [],
34
+ lh: 0,
35
+ lineWidths: [],
36
+ ls: '',
37
+ of: '',
38
+ s: '',
39
+ sc: '',
40
+ sw: 0,
41
+ t: 0,
42
+ tr: 0,
43
+ sz: 0,
44
+ ps: null,
45
+ fillColorAnim: false,
46
+ strokeColorAnim: false,
47
+ strokeWidthAnim: false,
48
+ yOffset: 0,
49
+ finalSize: 0,
50
+ finalText: [],
51
+ finalLineHeight: 0,
52
+ __complete: false,
53
+
54
+ };
55
+ this.copyData(this.currentData, this.data.d.k[0].s);
56
+
57
+ if (!this.searchProperty()) {
58
+ this.completeTextData(this.currentData);
59
+ }
60
+ }
61
+
62
+ TextProperty.prototype.defaultBoxWidth = [0, 0];
63
+
64
+ TextProperty.prototype.copyData = function (obj, data) {
65
+ for (var s in data) {
66
+ if (Object.prototype.hasOwnProperty.call(data, s)) {
67
+ obj[s] = data[s];
68
+ }
69
+ }
70
+ return obj;
71
+ };
72
+
73
+ TextProperty.prototype.setCurrentData = function (data) {
74
+ if (!data.__complete) {
75
+ this.completeTextData(data);
76
+ }
77
+ this.currentData = data;
78
+ this.currentData.boxWidth = this.currentData.boxWidth || this.defaultBoxWidth;
79
+ this._mdf = true;
80
+ };
81
+
82
+ TextProperty.prototype.searchProperty = function () {
83
+ return this.searchKeyframes();
84
+ };
85
+
86
+ TextProperty.prototype.searchKeyframes = function () {
87
+ this.kf = this.data.d.k.length > 1;
88
+ if (this.kf) {
89
+ this.addEffect(this.getKeyframeValue.bind(this));
90
+ }
91
+ return this.kf;
92
+ };
93
+
94
+ TextProperty.prototype.addEffect = function (effectFunction) {
95
+ this.effectsSequence.push(effectFunction);
96
+ this.elem.addDynamicProperty(this);
97
+ };
98
+
99
+ TextProperty.prototype.getValue = function (_finalValue) {
100
+ if ((this.elem.globalData.frameId === this.frameId || !this.effectsSequence.length) && !_finalValue) {
101
+ return;
102
+ }
103
+ this.currentData.t = this.data.d.k[this.keysIndex].s.t;
104
+ var currentValue = this.currentData;
105
+ var currentIndex = this.keysIndex;
106
+ if (this.lock) {
107
+ this.setCurrentData(this.currentData);
108
+ return;
109
+ }
110
+ this.lock = true;
111
+ this._mdf = false;
112
+ var i; var
113
+ len = this.effectsSequence.length;
114
+ var finalValue = _finalValue || this.data.d.k[this.keysIndex].s;
115
+ for (i = 0; i < len; i += 1) {
116
+ // Checking if index changed to prevent creating a new object every time the expression updates.
117
+ if (currentIndex !== this.keysIndex) {
118
+ finalValue = this.effectsSequence[i](finalValue, finalValue.t);
119
+ } else {
120
+ finalValue = this.effectsSequence[i](this.currentData, finalValue.t);
121
+ }
122
+ }
123
+ if (currentValue !== finalValue) {
124
+ this.setCurrentData(finalValue);
125
+ }
126
+ this.v = this.currentData;
127
+ this.pv = this.v;
128
+ this.lock = false;
129
+ this.frameId = this.elem.globalData.frameId;
130
+ };
131
+
132
+ TextProperty.prototype.getKeyframeValue = function () {
133
+ var textKeys = this.data.d.k;
134
+ var frameNum = this.elem.comp.renderedFrame;
135
+ var i = 0; var
136
+ len = textKeys.length;
137
+ while (i <= len - 1) {
138
+ if (i === len - 1 || textKeys[i + 1].t > frameNum) {
139
+ break;
140
+ }
141
+ i += 1;
142
+ }
143
+ if (this.keysIndex !== i) {
144
+ this.keysIndex = i;
145
+ }
146
+ return this.data.d.k[this.keysIndex].s;
147
+ };
148
+
149
+ TextProperty.prototype.buildFinalText = function (text) {
150
+ var charactersArray = [];
151
+ var i = 0;
152
+ var len = text.length;
153
+ var charCode;
154
+ var secondCharCode;
155
+ var shouldCombine = false;
156
+ var shouldCombineNext = false;
157
+ var currentChars = '';
158
+ while (i < len) {
159
+ shouldCombine = shouldCombineNext;
160
+ shouldCombineNext = false;
161
+ charCode = text.charCodeAt(i);
162
+ currentChars = text.charAt(i);
163
+ if (FontManager.isCombinedCharacter(charCode)) {
164
+ shouldCombine = true;
165
+ // It's a potential surrogate pair (this is the High surrogate)
166
+ } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {
167
+ if (FontManager.isRegionalFlag(text, i)) {
168
+ currentChars = text.substr(i, 14);
169
+ } else {
170
+ secondCharCode = text.charCodeAt(i + 1);
171
+ // It's a surrogate pair (this is the Low surrogate)
172
+ if (secondCharCode >= 0xDC00 && secondCharCode <= 0xDFFF) {
173
+ if (FontManager.isModifier(charCode, secondCharCode)) {
174
+ currentChars = text.substr(i, 2);
175
+ shouldCombine = true;
176
+ } else if (FontManager.isFlagEmoji(text.substr(i, 4))) {
177
+ currentChars = text.substr(i, 4);
178
+ } else {
179
+ currentChars = text.substr(i, 2);
180
+ }
181
+ }
182
+ }
183
+ } else if (charCode > 0xDBFF) {
184
+ secondCharCode = text.charCodeAt(i + 1);
185
+ if (FontManager.isVariationSelector(charCode)) {
186
+ shouldCombine = true;
187
+ }
188
+ } else if (FontManager.isZeroWidthJoiner(charCode)) {
189
+ shouldCombine = true;
190
+ shouldCombineNext = true;
191
+ }
192
+ if (shouldCombine) {
193
+ charactersArray[charactersArray.length - 1] += currentChars;
194
+ shouldCombine = false;
195
+ } else {
196
+ charactersArray.push(currentChars);
197
+ }
198
+ i += currentChars.length;
199
+ }
200
+ return charactersArray;
201
+ };
202
+
203
+ TextProperty.prototype.completeTextData = function (documentData) {
204
+ documentData.__complete = true;
205
+ var fontManager = this.elem.globalData.fontManager;
206
+ var data = this.data;
207
+ var letters = [];
208
+ var i; var
209
+ len;
210
+ var newLineFlag; var index = 0; var
211
+ val;
212
+ var anchorGrouping = data.m.g;
213
+ var currentSize = 0; var currentPos = 0; var currentLine = 0; var
214
+ lineWidths = [];
215
+ var lineWidth = 0;
216
+ var maxLineWidth = 0;
217
+ var j; var
218
+ jLen;
219
+ var fontData = fontManager.getFontByName(documentData.f);
220
+ var charData; var
221
+ cLength = 0;
222
+
223
+ var fontProps = getFontProperties(fontData);
224
+ documentData.fWeight = fontProps.weight;
225
+ documentData.fStyle = fontProps.style;
226
+ documentData.finalSize = documentData.s;
227
+ documentData.finalText = this.buildFinalText(documentData.t);
228
+ len = documentData.finalText.length;
229
+ documentData.finalLineHeight = documentData.lh;
230
+ var trackingOffset = (documentData.tr / 1000) * documentData.finalSize;
231
+ var charCode;
232
+ if (documentData.sz) {
233
+ var flag = true;
234
+ var boxWidth = documentData.sz[0];
235
+ var boxHeight = documentData.sz[1];
236
+ var currentHeight; var
237
+ finalText;
238
+ while (flag) {
239
+ finalText = this.buildFinalText(documentData.t);
240
+ currentHeight = 0;
241
+ lineWidth = 0;
242
+ len = finalText.length;
243
+ trackingOffset = (documentData.tr / 1000) * documentData.finalSize;
244
+ var lastSpaceIndex = -1;
245
+ for (i = 0; i < len; i += 1) {
246
+ charCode = finalText[i].charCodeAt(0);
247
+ newLineFlag = false;
248
+ if (finalText[i] === ' ') {
249
+ lastSpaceIndex = i;
250
+ } else if (charCode === 13 || charCode === 3) {
251
+ lineWidth = 0;
252
+ newLineFlag = true;
253
+ currentHeight += documentData.finalLineHeight || documentData.finalSize * 1.2;
254
+ }
255
+ if (fontManager.chars) {
256
+ charData = fontManager.getCharData(finalText[i], fontData.fStyle, fontData.fFamily);
257
+ cLength = newLineFlag ? 0 : (charData.w * documentData.finalSize) / 100;
258
+ } else {
259
+ // tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily;
260
+ cLength = fontManager.measureText(finalText[i], documentData.f, documentData.finalSize);
261
+ }
262
+ if (lineWidth + cLength > boxWidth && finalText[i] !== ' ') {
263
+ if (lastSpaceIndex === -1) {
264
+ len += 1;
265
+ } else {
266
+ i = lastSpaceIndex;
267
+ }
268
+ currentHeight += documentData.finalLineHeight || documentData.finalSize * 1.2;
269
+ finalText.splice(i, lastSpaceIndex === i ? 1 : 0, '\r');
270
+ // finalText = finalText.substr(0,i) + "\r" + finalText.substr(i === lastSpaceIndex ? i + 1 : i);
271
+ lastSpaceIndex = -1;
272
+ lineWidth = 0;
273
+ } else {
274
+ lineWidth += cLength;
275
+ lineWidth += trackingOffset;
276
+ }
277
+ }
278
+ currentHeight += (fontData.ascent * documentData.finalSize) / 100;
279
+ if (this.canResize && documentData.finalSize > this.minimumFontSize && boxHeight < currentHeight) {
280
+ documentData.finalSize -= 1;
281
+ documentData.finalLineHeight = (documentData.finalSize * documentData.lh) / documentData.s;
282
+ } else {
283
+ documentData.finalText = finalText;
284
+ len = documentData.finalText.length;
285
+ flag = false;
286
+ }
287
+ }
288
+ }
289
+ lineWidth = -trackingOffset;
290
+ cLength = 0;
291
+ var uncollapsedSpaces = 0;
292
+ var currentChar;
293
+ for (i = 0; i < len; i += 1) {
294
+ newLineFlag = false;
295
+ currentChar = documentData.finalText[i];
296
+ charCode = currentChar.charCodeAt(0);
297
+ if (charCode === 13 || charCode === 3) {
298
+ uncollapsedSpaces = 0;
299
+ lineWidths.push(lineWidth);
300
+ maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;
301
+ lineWidth = -2 * trackingOffset;
302
+ val = '';
303
+ newLineFlag = true;
304
+ currentLine += 1;
305
+ } else {
306
+ val = currentChar;
307
+ }
308
+ if (fontManager.chars) {
309
+ charData = fontManager.getCharData(currentChar, fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily);
310
+ cLength = newLineFlag ? 0 : (charData.w * documentData.finalSize) / 100;
311
+ } else {
312
+ // var charWidth = fontManager.measureText(val, documentData.f, documentData.finalSize);
313
+ // tCanvasHelper.font = documentData.finalSize + 'px '+ fontManager.getFontByName(documentData.f).fFamily;
314
+ cLength = fontManager.measureText(val, documentData.f, documentData.finalSize);
315
+ }
316
+
317
+ //
318
+ if (currentChar === ' ') {
319
+ uncollapsedSpaces += cLength + trackingOffset;
320
+ } else {
321
+ lineWidth += cLength + trackingOffset + uncollapsedSpaces;
322
+ uncollapsedSpaces = 0;
323
+ }
324
+ letters.push({
325
+ l: cLength, an: cLength, add: currentSize, n: newLineFlag, anIndexes: [], val: val, line: currentLine, animatorJustifyOffset: 0,
326
+ });
327
+ if (anchorGrouping == 2) { // eslint-disable-line eqeqeq
328
+ currentSize += cLength;
329
+ if (val === '' || val === ' ' || i === len - 1) {
330
+ if (val === '' || val === ' ') {
331
+ currentSize -= cLength;
332
+ }
333
+ while (currentPos <= i) {
334
+ letters[currentPos].an = currentSize;
335
+ letters[currentPos].ind = index;
336
+ letters[currentPos].extra = cLength;
337
+ currentPos += 1;
338
+ }
339
+ index += 1;
340
+ currentSize = 0;
341
+ }
342
+ } else if (anchorGrouping == 3) { // eslint-disable-line eqeqeq
343
+ currentSize += cLength;
344
+ if (val === '' || i === len - 1) {
345
+ if (val === '') {
346
+ currentSize -= cLength;
347
+ }
348
+ while (currentPos <= i) {
349
+ letters[currentPos].an = currentSize;
350
+ letters[currentPos].ind = index;
351
+ letters[currentPos].extra = cLength;
352
+ currentPos += 1;
353
+ }
354
+ currentSize = 0;
355
+ index += 1;
356
+ }
357
+ } else {
358
+ letters[index].ind = index;
359
+ letters[index].extra = 0;
360
+ index += 1;
361
+ }
362
+ }
363
+ documentData.l = letters;
364
+ maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;
365
+ lineWidths.push(lineWidth);
366
+ if (documentData.sz) {
367
+ documentData.boxWidth = documentData.sz[0];
368
+ documentData.justifyOffset = 0;
369
+ } else {
370
+ documentData.boxWidth = maxLineWidth;
371
+ switch (documentData.j) {
372
+ case 1:
373
+ documentData.justifyOffset = -documentData.boxWidth;
374
+ break;
375
+ case 2:
376
+ documentData.justifyOffset = -documentData.boxWidth / 2;
377
+ break;
378
+ default:
379
+ documentData.justifyOffset = 0;
380
+ }
381
+ }
382
+ documentData.lineWidths = lineWidths;
383
+
384
+ var animators = data.a; var animatorData; var
385
+ letterData;
386
+ jLen = animators.length;
387
+ var based; var ind; var
388
+ indexes = [];
389
+ for (j = 0; j < jLen; j += 1) {
390
+ animatorData = animators[j];
391
+ if (animatorData.a.sc) {
392
+ documentData.strokeColorAnim = true;
393
+ }
394
+ if (animatorData.a.sw) {
395
+ documentData.strokeWidthAnim = true;
396
+ }
397
+ if (animatorData.a.fc || animatorData.a.fh || animatorData.a.fs || animatorData.a.fb) {
398
+ documentData.fillColorAnim = true;
399
+ }
400
+ ind = 0;
401
+ based = animatorData.s.b;
402
+ for (i = 0; i < len; i += 1) {
403
+ letterData = letters[i];
404
+ letterData.anIndexes[j] = ind;
405
+ if ((based == 1 && letterData.val !== '') || (based == 2 && letterData.val !== '' && letterData.val !== ' ') || (based == 3 && (letterData.n || letterData.val == ' ' || i == len - 1)) || (based == 4 && (letterData.n || i == len - 1))) { // eslint-disable-line eqeqeq
406
+ if (animatorData.s.rn === 1) {
407
+ indexes.push(ind);
408
+ }
409
+ ind += 1;
410
+ }
411
+ }
412
+ data.a[j].s.totalChars = ind;
413
+ var currentInd = -1; var
414
+ newInd;
415
+ if (animatorData.s.rn === 1) {
416
+ for (i = 0; i < len; i += 1) {
417
+ letterData = letters[i];
418
+ if (currentInd != letterData.anIndexes[j]) { // eslint-disable-line eqeqeq
419
+ currentInd = letterData.anIndexes[j];
420
+ newInd = indexes.splice(Math.floor(Math.random() * indexes.length), 1)[0];
421
+ }
422
+ letterData.anIndexes[j] = newInd;
423
+ }
424
+ }
425
+ }
426
+ documentData.yOffset = documentData.finalLineHeight || documentData.finalSize * 1.2;
427
+ documentData.ls = documentData.ls || 0;
428
+ documentData.ascent = (fontData.ascent * documentData.finalSize) / 100;
429
+ };
430
+
431
+ TextProperty.prototype.updateDocumentData = function (newData, index) {
432
+ index = index === undefined ? this.keysIndex : index;
433
+ var dData = this.copyData({}, this.data.d.k[index].s);
434
+ dData = this.copyData(dData, newData);
435
+ this.data.d.k[index].s = dData;
436
+ this.recalculate(index);
437
+ this.setCurrentData(dData);
438
+ this.elem.addDynamicProperty(this);
439
+ };
440
+
441
+ TextProperty.prototype.recalculate = function (index) {
442
+ var dData = this.data.d.k[index].s;
443
+ dData.__complete = false;
444
+ this.keysIndex = 0;
445
+ this._isFirstFrame = true;
446
+ this.getValue(dData);
447
+ };
448
+
449
+ TextProperty.prototype.canResizeFont = function (_canResize) {
450
+ this.canResize = _canResize;
451
+ this.recalculate(this.keysIndex);
452
+ this.elem.addDynamicProperty(this);
453
+ };
454
+
455
+ TextProperty.prototype.setMinimumFontSize = function (_fontValue) {
456
+ this.minimumFontSize = Math.floor(_fontValue) || 1;
457
+ this.recalculate(this.keysIndex);
458
+ this.elem.addDynamicProperty(this);
459
+ };
460
+
461
+ export default TextProperty;
@@ -0,0 +1,179 @@
1
+ import {
2
+ extendPrototype,
3
+ } from '../functionExtensions';
4
+ import DynamicPropertyContainer from '../helpers/dynamicProperties';
5
+ import PropertyFactory from '../PropertyFactory';
6
+ import BezierFactory from '../../3rd_party/BezierEaser';
7
+
8
+ const TextSelectorProp = (function () {
9
+ var max = Math.max;
10
+ var min = Math.min;
11
+ var floor = Math.floor;
12
+
13
+ function TextSelectorPropFactory(elem, data) {
14
+ this._currentTextLength = -1;
15
+ this.k = false;
16
+ this.data = data;
17
+ this.elem = elem;
18
+ this.comp = elem.comp;
19
+ this.finalS = 0;
20
+ this.finalE = 0;
21
+ this.initDynamicPropertyContainer(elem);
22
+ this.s = PropertyFactory.getProp(elem, data.s || { k: 0 }, 0, 0, this);
23
+ if ('e' in data) {
24
+ this.e = PropertyFactory.getProp(elem, data.e, 0, 0, this);
25
+ } else {
26
+ this.e = { v: 100 };
27
+ }
28
+ this.o = PropertyFactory.getProp(elem, data.o || { k: 0 }, 0, 0, this);
29
+ this.xe = PropertyFactory.getProp(elem, data.xe || { k: 0 }, 0, 0, this);
30
+ this.ne = PropertyFactory.getProp(elem, data.ne || { k: 0 }, 0, 0, this);
31
+ this.sm = PropertyFactory.getProp(elem, data.sm || { k: 100 }, 0, 0, this);
32
+ this.a = PropertyFactory.getProp(elem, data.a, 0, 0.01, this);
33
+ if (!this.dynamicProperties.length) {
34
+ this.getValue();
35
+ }
36
+ }
37
+
38
+ TextSelectorPropFactory.prototype = {
39
+ getMult: function (ind) {
40
+ if (this._currentTextLength !== this.elem.textProperty.currentData.l.length) {
41
+ this.getValue();
42
+ }
43
+ var x1 = 0;
44
+ var y1 = 0;
45
+ var x2 = 1;
46
+ var y2 = 1;
47
+ if (this.ne.v > 0) {
48
+ x1 = this.ne.v / 100.0;
49
+ } else {
50
+ y1 = -this.ne.v / 100.0;
51
+ }
52
+ if (this.xe.v > 0) {
53
+ x2 = 1.0 - this.xe.v / 100.0;
54
+ } else {
55
+ y2 = 1.0 + this.xe.v / 100.0;
56
+ }
57
+ var easer = BezierFactory.getBezierEasing(x1, y1, x2, y2).get;
58
+
59
+ var mult = 0;
60
+ var s = this.finalS;
61
+ var e = this.finalE;
62
+ var type = this.data.sh;
63
+ if (type === 2) {
64
+ if (e === s) {
65
+ mult = ind >= e ? 1 : 0;
66
+ } else {
67
+ mult = max(0, min(0.5 / (e - s) + (ind - s) / (e - s), 1));
68
+ }
69
+ mult = easer(mult);
70
+ } else if (type === 3) {
71
+ if (e === s) {
72
+ mult = ind >= e ? 0 : 1;
73
+ } else {
74
+ mult = 1 - max(0, min(0.5 / (e - s) + (ind - s) / (e - s), 1));
75
+ }
76
+
77
+ mult = easer(mult);
78
+ } else if (type === 4) {
79
+ if (e === s) {
80
+ mult = 0;
81
+ } else {
82
+ mult = max(0, min(0.5 / (e - s) + (ind - s) / (e - s), 1));
83
+ if (mult < 0.5) {
84
+ mult *= 2;
85
+ } else {
86
+ mult = 1 - 2 * (mult - 0.5);
87
+ }
88
+ }
89
+ mult = easer(mult);
90
+ } else if (type === 5) {
91
+ if (e === s) {
92
+ mult = 0;
93
+ } else {
94
+ var tot = e - s;
95
+ /* ind += 0.5;
96
+ mult = -4/(tot*tot)*(ind*ind)+(4/tot)*ind; */
97
+ ind = min(max(0, ind + 0.5 - s), e - s);
98
+ var x = -tot / 2 + ind;
99
+ var a = tot / 2;
100
+ mult = Math.sqrt(1 - (x * x) / (a * a));
101
+ }
102
+ mult = easer(mult);
103
+ } else if (type === 6) {
104
+ if (e === s) {
105
+ mult = 0;
106
+ } else {
107
+ ind = min(max(0, ind + 0.5 - s), e - s);
108
+ mult = (1 + (Math.cos((Math.PI + Math.PI * 2 * (ind) / (e - s))))) / 2; // eslint-disable-line
109
+ }
110
+ mult = easer(mult);
111
+ } else {
112
+ if (ind >= floor(s)) {
113
+ if (ind - s < 0) {
114
+ mult = max(0, min(min(e, 1) - (s - ind), 1));
115
+ } else {
116
+ mult = max(0, min(e - ind, 1));
117
+ }
118
+ }
119
+ mult = easer(mult);
120
+ }
121
+ // Smoothness implementation.
122
+ // The smoothness represents a reduced range of the original [0; 1] range.
123
+ // if smoothness is 25%, the new range will be [0.375; 0.625]
124
+ // Steps are:
125
+ // - find the lower value of the new range (threshold)
126
+ // - if multiplier is smaller than that value, floor it to 0
127
+ // - if it is larger,
128
+ // - subtract the threshold
129
+ // - divide it by the smoothness (this will return the range to [0; 1])
130
+ // Note: If it doesn't work on some scenarios, consider applying it before the easer.
131
+ if (this.sm.v !== 100) {
132
+ var smoothness = this.sm.v * 0.01;
133
+ if (smoothness === 0) {
134
+ smoothness = 0.00000001;
135
+ }
136
+ var threshold = 0.5 - smoothness * 0.5;
137
+ if (mult < threshold) {
138
+ mult = 0;
139
+ } else {
140
+ mult = (mult - threshold) / smoothness;
141
+ if (mult > 1) {
142
+ mult = 1;
143
+ }
144
+ }
145
+ }
146
+ return mult * this.a.v;
147
+ },
148
+ getValue: function (newCharsFlag) {
149
+ this.iterateDynamicProperties();
150
+ this._mdf = newCharsFlag || this._mdf;
151
+ this._currentTextLength = this.elem.textProperty.currentData.l.length || 0;
152
+ if (newCharsFlag && this.data.r === 2) {
153
+ this.e.v = this._currentTextLength;
154
+ }
155
+ var divisor = this.data.r === 2 ? 1 : 100 / this.data.totalChars;
156
+ var o = this.o.v / divisor;
157
+ var s = this.s.v / divisor + o;
158
+ var e = (this.e.v / divisor) + o;
159
+ if (s > e) {
160
+ var _s = s;
161
+ s = e;
162
+ e = _s;
163
+ }
164
+ this.finalS = s;
165
+ this.finalE = e;
166
+ },
167
+ };
168
+ extendPrototype([DynamicPropertyContainer], TextSelectorPropFactory);
169
+
170
+ function getTextSelectorProp(elem, data, arr) {
171
+ return new TextSelectorPropFactory(elem, data, arr);
172
+ }
173
+
174
+ return {
175
+ getTextSelectorProp: getTextSelectorProp,
176
+ };
177
+ }());
178
+
179
+ export default TextSelectorProp;