@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,13 @@
1
+ import dataManager from './DataManager';
2
+
3
+ dataManager.completeData = function (animationData) {
4
+ if (animationData.__complete) {
5
+ return;
6
+ }
7
+ this.checkColors(animationData);
8
+ this.checkChars(animationData);
9
+ this.checkPathProperties(animationData);
10
+ this.checkShapes(animationData);
11
+ this.completeLayers(animationData.layers, animationData.assets);
12
+ animationData.__complete = true;
13
+ };
@@ -0,0 +1,443 @@
1
+ import createNS from './helpers/svg_elements';
2
+ import createTag from './helpers/html_elements';
3
+ import getFontProperties from './getFontProperties';
4
+
5
+ const FontManager = (function () {
6
+ var maxWaitingTime = 5000;
7
+ var emptyChar = {
8
+ w: 0,
9
+ size: 0,
10
+ shapes: [],
11
+ data: {
12
+ shapes: [],
13
+ },
14
+ };
15
+ var combinedCharacters = [];
16
+ // Hindi characters
17
+ combinedCharacters = combinedCharacters.concat([2304, 2305, 2306, 2307, 2362, 2363, 2364, 2364, 2366,
18
+ 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379,
19
+ 2380, 2381, 2382, 2383, 2387, 2388, 2389, 2390, 2391, 2402, 2403]);
20
+
21
+ var BLACK_FLAG_CODE_POINT = 127988;
22
+ var CANCEL_TAG_CODE_POINT = 917631;
23
+ var A_TAG_CODE_POINT = 917601;
24
+ var Z_TAG_CODE_POINT = 917626;
25
+ var VARIATION_SELECTOR_16_CODE_POINT = 65039;
26
+ var ZERO_WIDTH_JOINER_CODE_POINT = 8205;
27
+ var REGIONAL_CHARACTER_A_CODE_POINT = 127462;
28
+ var REGIONAL_CHARACTER_Z_CODE_POINT = 127487;
29
+
30
+ var surrogateModifiers = [
31
+ 'd83cdffb',
32
+ 'd83cdffc',
33
+ 'd83cdffd',
34
+ 'd83cdffe',
35
+ 'd83cdfff',
36
+ ];
37
+
38
+ function trimFontOptions(font) {
39
+ var familyArray = font.split(',');
40
+ var i;
41
+ var len = familyArray.length;
42
+ var enabledFamilies = [];
43
+ for (i = 0; i < len; i += 1) {
44
+ if (familyArray[i] !== 'sans-serif' && familyArray[i] !== 'monospace') {
45
+ enabledFamilies.push(familyArray[i]);
46
+ }
47
+ }
48
+ return enabledFamilies.join(',');
49
+ }
50
+
51
+ function setUpNode(font, family) {
52
+ var parentNode = createTag('span');
53
+ // Node is invisible to screen readers.
54
+ parentNode.setAttribute('aria-hidden', true);
55
+ parentNode.style.fontFamily = family;
56
+ var node = createTag('span');
57
+ // Characters that vary significantly among different fonts
58
+ node.innerText = 'giItT1WQy@!-/#';
59
+ // Visible - so we can measure it - but not on the screen
60
+ parentNode.style.position = 'absolute';
61
+ parentNode.style.left = '-10000px';
62
+ parentNode.style.top = '-10000px';
63
+ // Large font size makes even subtle changes obvious
64
+ parentNode.style.fontSize = '300px';
65
+ // Reset any font properties
66
+ parentNode.style.fontVariant = 'normal';
67
+ parentNode.style.fontStyle = 'normal';
68
+ parentNode.style.fontWeight = 'normal';
69
+ parentNode.style.letterSpacing = '0';
70
+ parentNode.appendChild(node);
71
+ document.body.appendChild(parentNode);
72
+
73
+ // Remember width with no applied web font
74
+ var width = node.offsetWidth;
75
+ node.style.fontFamily = trimFontOptions(font) + ', ' + family;
76
+ return { node: node, w: width, parent: parentNode };
77
+ }
78
+
79
+ function checkLoadedFonts() {
80
+ var i;
81
+ var len = this.fonts.length;
82
+ var node;
83
+ var w;
84
+ var loadedCount = len;
85
+ for (i = 0; i < len; i += 1) {
86
+ if (this.fonts[i].loaded) {
87
+ loadedCount -= 1;
88
+ } else if (this.fonts[i].fOrigin === 'n' || this.fonts[i].origin === 0) {
89
+ this.fonts[i].loaded = true;
90
+ } else {
91
+ node = this.fonts[i].monoCase.node;
92
+ w = this.fonts[i].monoCase.w;
93
+ if (node.offsetWidth !== w) {
94
+ loadedCount -= 1;
95
+ this.fonts[i].loaded = true;
96
+ } else {
97
+ node = this.fonts[i].sansCase.node;
98
+ w = this.fonts[i].sansCase.w;
99
+ if (node.offsetWidth !== w) {
100
+ loadedCount -= 1;
101
+ this.fonts[i].loaded = true;
102
+ }
103
+ }
104
+ if (this.fonts[i].loaded) {
105
+ this.fonts[i].sansCase.parent.parentNode.removeChild(this.fonts[i].sansCase.parent);
106
+ this.fonts[i].monoCase.parent.parentNode.removeChild(this.fonts[i].monoCase.parent);
107
+ }
108
+ }
109
+ }
110
+
111
+ if (loadedCount !== 0 && Date.now() - this.initTime < maxWaitingTime) {
112
+ setTimeout(this.checkLoadedFontsBinded, 20);
113
+ } else {
114
+ setTimeout(this.setIsLoadedBinded, 10);
115
+ }
116
+ }
117
+
118
+ function createHelper(fontData, def) {
119
+ var engine = (document.body && def) ? 'svg' : 'canvas';
120
+ var helper;
121
+ var fontProps = getFontProperties(fontData);
122
+ if (engine === 'svg') {
123
+ var tHelper = createNS('text');
124
+ tHelper.style.fontSize = '100px';
125
+ // tHelper.style.fontFamily = fontData.fFamily;
126
+ tHelper.setAttribute('font-family', fontData.fFamily);
127
+ tHelper.setAttribute('font-style', fontProps.style);
128
+ tHelper.setAttribute('font-weight', fontProps.weight);
129
+ tHelper.textContent = '1';
130
+ if (fontData.fClass) {
131
+ tHelper.style.fontFamily = 'inherit';
132
+ tHelper.setAttribute('class', fontData.fClass);
133
+ } else {
134
+ tHelper.style.fontFamily = fontData.fFamily;
135
+ }
136
+ def.appendChild(tHelper);
137
+ helper = tHelper;
138
+ } else {
139
+ var tCanvasHelper = new OffscreenCanvas(500, 500).getContext('2d');
140
+ tCanvasHelper.font = fontProps.style + ' ' + fontProps.weight + ' 100px ' + fontData.fFamily;
141
+ helper = tCanvasHelper;
142
+ }
143
+ function measure(text) {
144
+ if (engine === 'svg') {
145
+ helper.textContent = text;
146
+ return helper.getComputedTextLength();
147
+ }
148
+ return helper.measureText(text).width;
149
+ }
150
+ return {
151
+ measureText: measure,
152
+ };
153
+ }
154
+
155
+ function addFonts(fontData, defs) {
156
+ if (!fontData) {
157
+ this.isLoaded = true;
158
+ return;
159
+ }
160
+ if (this.chars) {
161
+ this.isLoaded = true;
162
+ this.fonts = fontData.list;
163
+ return;
164
+ }
165
+ if (!document.body) {
166
+ this.isLoaded = true;
167
+ fontData.list.forEach((data) => {
168
+ data.helper = createHelper(data);
169
+ data.cache = {};
170
+ });
171
+ this.fonts = fontData.list;
172
+ return;
173
+ }
174
+
175
+ var fontArr = fontData.list;
176
+ var i;
177
+ var len = fontArr.length;
178
+ var _pendingFonts = len;
179
+ for (i = 0; i < len; i += 1) {
180
+ var shouldLoadFont = true;
181
+ var loadedSelector;
182
+ var j;
183
+ fontArr[i].loaded = false;
184
+ fontArr[i].monoCase = setUpNode(fontArr[i].fFamily, 'monospace');
185
+ fontArr[i].sansCase = setUpNode(fontArr[i].fFamily, 'sans-serif');
186
+ if (!fontArr[i].fPath) {
187
+ fontArr[i].loaded = true;
188
+ _pendingFonts -= 1;
189
+ } else if (fontArr[i].fOrigin === 'p' || fontArr[i].origin === 3) {
190
+ loadedSelector = document.querySelectorAll('style[f-forigin="p"][f-family="' + fontArr[i].fFamily + '"], style[f-origin="3"][f-family="' + fontArr[i].fFamily + '"]');
191
+
192
+ if (loadedSelector.length > 0) {
193
+ shouldLoadFont = false;
194
+ }
195
+
196
+ if (shouldLoadFont) {
197
+ var s = createTag('style');
198
+ s.setAttribute('f-forigin', fontArr[i].fOrigin);
199
+ s.setAttribute('f-origin', fontArr[i].origin);
200
+ s.setAttribute('f-family', fontArr[i].fFamily);
201
+ s.type = 'text/css';
202
+ s.innerText = '@font-face {font-family: ' + fontArr[i].fFamily + "; font-style: normal; src: url('" + fontArr[i].fPath + "');}";
203
+ defs.appendChild(s);
204
+ }
205
+ } else if (fontArr[i].fOrigin === 'g' || fontArr[i].origin === 1) {
206
+ loadedSelector = document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]');
207
+
208
+ for (j = 0; j < loadedSelector.length; j += 1) {
209
+ if (loadedSelector[j].href.indexOf(fontArr[i].fPath) !== -1) {
210
+ // Font is already loaded
211
+ shouldLoadFont = false;
212
+ }
213
+ }
214
+
215
+ if (shouldLoadFont) {
216
+ var l = createTag('link');
217
+ l.setAttribute('f-forigin', fontArr[i].fOrigin);
218
+ l.setAttribute('f-origin', fontArr[i].origin);
219
+ l.type = 'text/css';
220
+ l.rel = 'stylesheet';
221
+ l.href = fontArr[i].fPath;
222
+ document.body.appendChild(l);
223
+ }
224
+ } else if (fontArr[i].fOrigin === 't' || fontArr[i].origin === 2) {
225
+ loadedSelector = document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]');
226
+
227
+ for (j = 0; j < loadedSelector.length; j += 1) {
228
+ if (fontArr[i].fPath === loadedSelector[j].src) {
229
+ // Font is already loaded
230
+ shouldLoadFont = false;
231
+ }
232
+ }
233
+
234
+ if (shouldLoadFont) {
235
+ var sc = createTag('link');
236
+ sc.setAttribute('f-forigin', fontArr[i].fOrigin);
237
+ sc.setAttribute('f-origin', fontArr[i].origin);
238
+ sc.setAttribute('rel', 'stylesheet');
239
+ sc.setAttribute('href', fontArr[i].fPath);
240
+ defs.appendChild(sc);
241
+ }
242
+ }
243
+ fontArr[i].helper = createHelper(fontArr[i], defs);
244
+ fontArr[i].cache = {};
245
+ this.fonts.push(fontArr[i]);
246
+ }
247
+ if (_pendingFonts === 0) {
248
+ this.isLoaded = true;
249
+ } else {
250
+ // On some cases even if the font is loaded, it won't load correctly when measuring text on canvas.
251
+ // Adding this timeout seems to fix it
252
+ setTimeout(this.checkLoadedFonts.bind(this), 100);
253
+ }
254
+ }
255
+
256
+ function addChars(chars) {
257
+ if (!chars) {
258
+ return;
259
+ }
260
+ if (!this.chars) {
261
+ this.chars = [];
262
+ }
263
+ var i;
264
+ var len = chars.length;
265
+ var j;
266
+ var jLen = this.chars.length;
267
+ var found;
268
+ for (i = 0; i < len; i += 1) {
269
+ j = 0;
270
+ found = false;
271
+ while (j < jLen) {
272
+ if (this.chars[j].style === chars[i].style && this.chars[j].fFamily === chars[i].fFamily && this.chars[j].ch === chars[i].ch) {
273
+ found = true;
274
+ }
275
+ j += 1;
276
+ }
277
+ if (!found) {
278
+ this.chars.push(chars[i]);
279
+ jLen += 1;
280
+ }
281
+ }
282
+ }
283
+
284
+ function getCharData(char, style, font) {
285
+ var i = 0;
286
+ var len = this.chars.length;
287
+ while (i < len) {
288
+ if (this.chars[i].ch === char && this.chars[i].style === style && this.chars[i].fFamily === font) {
289
+ return this.chars[i];
290
+ }
291
+ i += 1;
292
+ }
293
+ if (((typeof char === 'string' && char.charCodeAt(0) !== 13) || !char)
294
+ && console
295
+ && console.warn // eslint-disable-line no-console
296
+ && !this._warned
297
+ ) {
298
+ this._warned = true;
299
+ console.warn('Missing character from exported characters list: ', char, style, font); // eslint-disable-line no-console
300
+ }
301
+ return emptyChar;
302
+ }
303
+
304
+ function measureText(char, fontName, size) {
305
+ var fontData = this.getFontByName(fontName);
306
+ // Using the char instead of char.charCodeAt(0)
307
+ // to avoid collisions between equal chars
308
+ var index = char;
309
+ if (!fontData.cache[index]) {
310
+ var tHelper = fontData.helper;
311
+ if (char === ' ') {
312
+ var doubleSize = tHelper.measureText('|' + char + '|');
313
+ var singleSize = tHelper.measureText('||');
314
+ fontData.cache[index] = (doubleSize - singleSize) / 100;
315
+ } else {
316
+ fontData.cache[index] = tHelper.measureText(char) / 100;
317
+ }
318
+ }
319
+ return fontData.cache[index] * size;
320
+ }
321
+
322
+ function getFontByName(name) {
323
+ var i = 0;
324
+ var len = this.fonts.length;
325
+ while (i < len) {
326
+ if (this.fonts[i].fName === name) {
327
+ return this.fonts[i];
328
+ }
329
+ i += 1;
330
+ }
331
+ return this.fonts[0];
332
+ }
333
+
334
+ function getCodePoint(string) {
335
+ var codePoint = 0;
336
+ var first = string.charCodeAt(0);
337
+ if (first >= 0xD800 && first <= 0xDBFF) {
338
+ var second = string.charCodeAt(1);
339
+ if (second >= 0xDC00 && second <= 0xDFFF) {
340
+ codePoint = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
341
+ }
342
+ }
343
+ return codePoint;
344
+ }
345
+
346
+ // Skin tone modifiers
347
+ function isModifier(firstCharCode, secondCharCode) {
348
+ var sum = firstCharCode.toString(16) + secondCharCode.toString(16);
349
+ return surrogateModifiers.indexOf(sum) !== -1;
350
+ }
351
+
352
+ function isZeroWidthJoiner(charCode) {
353
+ return charCode === ZERO_WIDTH_JOINER_CODE_POINT;
354
+ }
355
+
356
+ // This codepoint may change the appearance of the preceding character.
357
+ // If that is a symbol, dingbat or emoji, U+FE0F forces it to be rendered
358
+ // as a colorful image as compared to a monochrome text variant.
359
+ function isVariationSelector(charCode) {
360
+ return charCode === VARIATION_SELECTOR_16_CODE_POINT;
361
+ }
362
+
363
+ // The regional indicator symbols are a set of 26 alphabetic Unicode
364
+ /// characters (A–Z) intended to be used to encode ISO 3166-1 alpha-2
365
+ // two-letter country codes in a way that allows optional special treatment.
366
+ function isRegionalCode(string) {
367
+ var codePoint = getCodePoint(string);
368
+ if (codePoint >= REGIONAL_CHARACTER_A_CODE_POINT && codePoint <= REGIONAL_CHARACTER_Z_CODE_POINT) {
369
+ return true;
370
+ }
371
+ return false;
372
+ }
373
+
374
+ // Some Emoji implementations represent combinations of
375
+ // two “regional indicator” letters as a single flag symbol.
376
+ function isFlagEmoji(string) {
377
+ return isRegionalCode(string.substr(0, 2)) && isRegionalCode(string.substr(2, 2));
378
+ }
379
+
380
+ function isCombinedCharacter(char) {
381
+ return combinedCharacters.indexOf(char) !== -1;
382
+ }
383
+
384
+ // Regional flags start with a BLACK_FLAG_CODE_POINT
385
+ // folowed by 5 chars in the TAG range
386
+ // and end with a CANCEL_TAG_CODE_POINT
387
+ function isRegionalFlag(text, index) {
388
+ var codePoint = getCodePoint(text.substr(index, 2));
389
+ if (codePoint !== BLACK_FLAG_CODE_POINT) {
390
+ return false;
391
+ }
392
+ var count = 0;
393
+ index += 2;
394
+ while (count < 5) {
395
+ codePoint = getCodePoint(text.substr(index, 2));
396
+ if (codePoint < A_TAG_CODE_POINT || codePoint > Z_TAG_CODE_POINT) {
397
+ return false;
398
+ }
399
+ count += 1;
400
+ index += 2;
401
+ }
402
+ return getCodePoint(text.substr(index, 2)) === CANCEL_TAG_CODE_POINT;
403
+ }
404
+
405
+ function setIsLoaded() {
406
+ this.isLoaded = true;
407
+ }
408
+
409
+ var Font = function () {
410
+ this.fonts = [];
411
+ this.chars = null;
412
+ this.typekitLoaded = 0;
413
+ this.isLoaded = false;
414
+ this._warned = false;
415
+ this.initTime = Date.now();
416
+ this.setIsLoadedBinded = this.setIsLoaded.bind(this);
417
+ this.checkLoadedFontsBinded = this.checkLoadedFonts.bind(this);
418
+ };
419
+ Font.isModifier = isModifier;
420
+ Font.isZeroWidthJoiner = isZeroWidthJoiner;
421
+ Font.isFlagEmoji = isFlagEmoji;
422
+ Font.isRegionalCode = isRegionalCode;
423
+ Font.isCombinedCharacter = isCombinedCharacter;
424
+ Font.isRegionalFlag = isRegionalFlag;
425
+ Font.isVariationSelector = isVariationSelector;
426
+ Font.BLACK_FLAG_CODE_POINT = BLACK_FLAG_CODE_POINT;
427
+
428
+ var fontPrototype = {
429
+ addChars: addChars,
430
+ addFonts: addFonts,
431
+ getCharData: getCharData,
432
+ getFontByName: getFontByName,
433
+ measureText: measureText,
434
+ checkLoadedFonts: checkLoadedFonts,
435
+ setIsLoaded: setIsLoaded,
436
+ };
437
+
438
+ Font.prototype = fontPrototype;
439
+
440
+ return Font;
441
+ }());
442
+
443
+ export default FontManager;
@@ -0,0 +1,16 @@
1
+ import FontManager from './FontManager';
2
+
3
+ // TODO: fix overwrite
4
+
5
+ FontManager = (function () {
6
+ var Font = function () {
7
+ this.fonts = [];
8
+ this.chars = null;
9
+ this.typekitLoaded = 0;
10
+ this.isLoaded = false;
11
+ this.initTime = Date.now();
12
+ };
13
+ return Font;
14
+ }());
15
+
16
+ export default FontManager;