webgl2-sdf 0.0.1 → 0.0.3

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 (183) hide show
  1. package/browser/index.min.js +1 -0
  2. package/node/bezier/bezier-curves-to-line-segs.js +31 -0
  3. package/node/bezier/bezier-curves-to-line-segs.js.map +1 -0
  4. package/node/bezier/eval-de-casteljau.js +61 -0
  5. package/node/bezier/eval-de-casteljau.js.map +1 -0
  6. package/node/bezier/from-to/from-to-2.js +134 -0
  7. package/node/bezier/from-to/from-to-2.js.map +1 -0
  8. package/node/bezier/from-to/from-to-3.js +159 -0
  9. package/node/bezier/from-to/from-to-3.js.map +1 -0
  10. package/node/bezier/from-to/from-to.js +21 -0
  11. package/node/bezier/from-to/from-to.js.map +1 -0
  12. package/node/bezier/is-cubic-obtuse.js +24 -0
  13. package/node/bezier/is-cubic-obtuse.js.map +1 -0
  14. package/node/bezier/is-quad-obtuse.js +20 -0
  15. package/node/bezier/is-quad-obtuse.js.map +1 -0
  16. package/node/bezier/is-really-point.js +19 -0
  17. package/node/bezier/is-really-point.js.map +1 -0
  18. package/node/bezier/split-by-deviation-from-straight-line-cubic.js +85 -0
  19. package/node/bezier/split-by-deviation-from-straight-line-cubic.js.map +1 -0
  20. package/node/bezier/split-by-deviation-from-straight-line-quad.js +50 -0
  21. package/node/bezier/split-by-deviation-from-straight-line-quad.js.map +1 -0
  22. package/node/bezier/split-into-line-segments.js +29 -0
  23. package/node/bezier/split-into-line-segments.js.map +1 -0
  24. package/node/generate-sdf.js +57 -0
  25. package/node/generate-sdf.js.map +1 -0
  26. package/node/index.js +2 -0
  27. package/node/index.js.map +1 -0
  28. package/node/main-program.js +100 -0
  29. package/node/main-program.js.map +1 -0
  30. package/node/max-aspect-ratio-before-stretch.js +3 -0
  31. package/node/max-aspect-ratio-before-stretch.js.map +1 -0
  32. package/node/prepare-buffers.js +114 -0
  33. package/node/prepare-buffers.js.map +1 -0
  34. package/node/row-count.js +4 -0
  35. package/node/row-count.js.map +1 -0
  36. package/node/shaders/main.fragment.js +149 -0
  37. package/node/shaders/main.fragment.js.map +1 -0
  38. package/node/shaders/main.vertex.js +53 -0
  39. package/node/shaders/main.vertex.js.map +1 -0
  40. package/node/svg/get-beziers-from-raw-paths.js +91 -0
  41. package/node/svg/get-beziers-from-raw-paths.js.map +1 -0
  42. package/node/svg/get-paths-from-str.js +14 -0
  43. package/node/svg/get-paths-from-str.js.map +1 -0
  44. package/node/svg/path-data-polyfill/parse-number.js +101 -0
  45. package/node/svg/path-data-polyfill/parse-number.js.map +1 -0
  46. package/node/svg/path-data-polyfill/parse-path-data-string.js +21 -0
  47. package/node/svg/path-data-polyfill/parse-path-data-string.js.map +1 -0
  48. package/node/svg/path-data-polyfill/source.js +147 -0
  49. package/node/svg/path-data-polyfill/source.js.map +1 -0
  50. package/node/svg/path-segment/c.js +29 -0
  51. package/node/svg/path-segment/c.js.map +1 -0
  52. package/node/svg/path-segment/h.js +23 -0
  53. package/node/svg/path-segment/h.js.map +1 -0
  54. package/node/svg/path-segment/l.js +24 -0
  55. package/node/svg/path-segment/l.js.map +1 -0
  56. package/node/svg/path-segment/q.js +23 -0
  57. package/node/svg/path-segment/q.js.map +1 -0
  58. package/node/svg/path-segment/s.js +34 -0
  59. package/node/svg/path-segment/s.js.map +1 -0
  60. package/node/svg/path-segment/t.js +28 -0
  61. package/node/svg/path-segment/t.js.map +1 -0
  62. package/node/svg/path-segment/v.js +23 -0
  63. package/node/svg/path-segment/v.js.map +1 -0
  64. package/node/svg/path-segment/z.js +21 -0
  65. package/node/svg/path-segment/z.js.map +1 -0
  66. package/node/svg/path-state.js +2 -0
  67. package/node/svg/path-state.js.map +1 -0
  68. package/node/tex-width.js +12 -0
  69. package/node/tex-width.js.map +1 -0
  70. package/node/types/attribute.js +2 -0
  71. package/node/types/attribute.js.map +1 -0
  72. package/node/types/cell.js +2 -0
  73. package/node/types/cell.js.map +1 -0
  74. package/node/types/gl-context.js +2 -0
  75. package/node/types/gl-context.js.map +1 -0
  76. package/node/types/gl-type.js +2 -0
  77. package/node/types/gl-type.js.map +1 -0
  78. package/node/types/gl-usage.js +2 -0
  79. package/node/types/gl-usage.js.map +1 -0
  80. package/node/types/program.d.ts +2 -2
  81. package/node/types/program.js +2 -0
  82. package/node/types/program.js.map +1 -0
  83. package/node/types/strip.js +2 -0
  84. package/node/types/strip.js.map +1 -0
  85. package/node/types/texture.js +2 -0
  86. package/node/types/texture.js.map +1 -0
  87. package/node/utils/calc-circs.js +97 -0
  88. package/node/utils/calc-circs.js.map +1 -0
  89. package/node/utils/clip-line-segment-to-grid.d.ts +1 -1
  90. package/node/utils/clip-line-segment-to-grid.js +98 -0
  91. package/node/utils/clip-line-segment-to-grid.js.map +1 -0
  92. package/node/utils/clip-line-segment-to-strips.d.ts +1 -1
  93. package/node/utils/clip-line-segment-to-strips.js +150 -0
  94. package/node/utils/clip-line-segment-to-strips.js.map +1 -0
  95. package/node/utils/create-empty-grid.d.ts +1 -1
  96. package/node/utils/create-empty-grid.js +24 -0
  97. package/node/utils/create-empty-grid.js.map +1 -0
  98. package/node/utils/create-empty-strips.d.ts +1 -1
  99. package/node/utils/create-empty-strips.js +16 -0
  100. package/node/utils/create-empty-strips.js.map +1 -0
  101. package/node/utils/distance-seg-to-p.js +35 -0
  102. package/node/utils/distance-seg-to-p.js.map +1 -0
  103. package/node/utils/find-close-cells.d.ts +1 -1
  104. package/node/utils/find-close-cells.js +130 -0
  105. package/node/utils/find-close-cells.js.map +1 -0
  106. package/node/utils/find-crossing-cells.d.ts +1 -1
  107. package/node/utils/find-crossing-cells.js +31 -0
  108. package/node/utils/find-crossing-cells.js.map +1 -0
  109. package/node/utils/get-distance-to-line-function.js +45 -0
  110. package/node/utils/get-distance-to-line-function.js.map +1 -0
  111. package/node/utils/jump-idx.js +81 -0
  112. package/node/utils/jump-idx.js.map +1 -0
  113. package/node/utils/map-to-viewbox.js +29 -0
  114. package/node/utils/map-to-viewbox.js.map +1 -0
  115. package/node/utils/seg-box-x.js +69 -0
  116. package/node/utils/seg-box-x.js.map +1 -0
  117. package/node/utils/seg-strip-x.js +58 -0
  118. package/node/utils/seg-strip-x.js.map +1 -0
  119. package/node/vector/dot.js +11 -0
  120. package/node/vector/dot.js.map +1 -0
  121. package/node/vector/from-to-vec.js +11 -0
  122. package/node/vector/from-to-vec.js.map +1 -0
  123. package/node/vector/len.js +9 -0
  124. package/node/vector/len.js.map +1 -0
  125. package/node/webgl-utils/compile-shader.js +8 -0
  126. package/node/webgl-utils/compile-shader.js.map +1 -0
  127. package/node/webgl-utils/get-gl-context.d.ts +1 -1
  128. package/node/webgl-utils/get-gl-context.js +43 -0
  129. package/node/webgl-utils/get-gl-context.js.map +1 -0
  130. package/node/webgl-utils/set-attribute.d.ts +3 -3
  131. package/node/webgl-utils/set-attribute.js +52 -0
  132. package/node/webgl-utils/set-attribute.js.map +1 -0
  133. package/node/webgl-utils/set-uniform-block.d.ts +1 -1
  134. package/node/webgl-utils/set-uniform-block.js +31 -0
  135. package/node/webgl-utils/set-uniform-block.js.map +1 -0
  136. package/node/webgl-utils/set-uniform.d.ts +2 -2
  137. package/node/webgl-utils/set-uniform.js +11 -0
  138. package/node/webgl-utils/set-uniform.js.map +1 -0
  139. package/node/webgl-utils/uniform-block.js +2 -0
  140. package/node/webgl-utils/uniform-block.js.map +1 -0
  141. package/node/webgl-utils/uniform-type.js +2 -0
  142. package/node/webgl-utils/uniform-type.js.map +1 -0
  143. package/node/webgl-utils/use-program.d.ts +2 -2
  144. package/node/webgl-utils/use-program.js +31 -0
  145. package/node/webgl-utils/use-program.js.map +1 -0
  146. package/node/webgl-utils/use-texture.js +25 -0
  147. package/node/webgl-utils/use-texture.js.map +1 -0
  148. package/package.json +4 -5
  149. package/src/bezier/is-cubic-obtuse.ts +2 -2
  150. package/src/bezier/is-quad-obtuse.ts +2 -2
  151. package/src/bezier/split-by-deviation-from-straight-line-quad.ts +3 -3
  152. package/src/bezier/split-into-line-segments.ts +3 -3
  153. package/src/debug-shaders.ts +2 -2
  154. package/src/shaders/main.fragment.ts +1 -1
  155. package/src/shaders/main.vertex.ts +1 -1
  156. package/src/types/program.ts +2 -2
  157. package/src/utils/calc-circs.ts +3 -3
  158. package/src/utils/clip-line-segment-to-grid.ts +2 -3
  159. package/src/utils/clip-line-segment-to-strips.ts +2 -2
  160. package/src/utils/create-empty-grid.ts +2 -2
  161. package/src/utils/create-empty-strips.ts +2 -2
  162. package/src/utils/find-close-cells.ts +5 -5
  163. package/src/utils/find-crossing-cells.ts +2 -2
  164. package/src/utils/jump-idx.ts +1 -1
  165. package/src/webgl-utils/get-gl-context.ts +3 -3
  166. package/src/webgl-utils/set-attribute.ts +3 -3
  167. package/src/webgl-utils/set-uniform-block.ts +1 -1
  168. package/src/webgl-utils/set-uniform.ts +2 -2
  169. package/src/webgl-utils/use-program.ts +5 -5
  170. package/node/helpers/calc-circs.d.ts +0 -11
  171. package/node/helpers/clip-line-segment-to-grid.d.ts +0 -14
  172. package/node/helpers/clip-line-segment-to-strips.d.ts +0 -13
  173. package/node/helpers/create-empty-grid.d.ts +0 -8
  174. package/node/helpers/create-empty-strips.d.ts +0 -7
  175. package/node/helpers/distance-seg-to-p.d.ts +0 -5
  176. package/node/helpers/find-close-cells.d.ts +0 -3
  177. package/node/helpers/find-crossing-cells.d.ts +0 -3
  178. package/node/helpers/get-distance-to-line-function.d.ts +0 -10
  179. package/node/helpers/jump-idx.d.ts +0 -2
  180. package/node/helpers/map-to-viewbox.d.ts +0 -2
  181. package/node/helpers/seg-box-x.d.ts +0 -10
  182. package/node/helpers/seg-strip-x.d.ts +0 -9
  183. package/src/utils/path.ts +0 -137
@@ -0,0 +1,149 @@
1
+ import { ROW_COUNT } from "../row-count.js";
2
+ const cache = {};
3
+ function getMainFragment(colCount, padCount) {
4
+ const fragment = cache[1024 * colCount + padCount];
5
+ if (fragment !== undefined) {
6
+ return fragment;
7
+ }
8
+ const main_Fragment =
9
+ /*glsl*/ `#version 300 es
10
+
11
+ precision highp float;
12
+
13
+ uniform float uMaxDistance;
14
+ uniform float uExponent;
15
+ uniform highp sampler2D uSegs;
16
+ uniform highp isampler2D uCloseCellIdxs;
17
+ uniform highp isampler2D uCrossCellIdxs;
18
+ uniform int uIncl; // bit 0 -> incl inside, bit 1 -> incl outside
19
+
20
+ uniform SegIdxRangePerCellBlock {
21
+ ivec4 uSegIdxRangePerCell[${(ROW_COUNT + 2 * padCount) * (colCount + 2 * padCount) / 2}];
22
+ };
23
+ uniform SegIdxRangePerStripBlock {
24
+ ivec4 uSegIdxRangePerStrip[${ROW_COUNT / 2}];
25
+ };
26
+
27
+ in vec2 vXY;
28
+ flat in int instanceId;
29
+ flat in ivec2 closeCellIdxRange;
30
+ flat in ivec2 crossCellIdxRange;
31
+ out vec4 FragColor;
32
+
33
+
34
+ float absDistToSegment(vec2 point, vec2 lineA, vec2 lineB) {
35
+ vec2 lineDir = lineB - lineA;
36
+ float lenSq = dot(lineDir, lineDir);
37
+ float t = clamp(dot(point - lineA, lineDir) / lenSq, 0.0, 1.0);
38
+ vec2 linePt = lineA + t * lineDir;
39
+
40
+ return distance(point, linePt);
41
+ }
42
+
43
+
44
+ void main() {
45
+ ///////////////////////////////////////////////////////////////////////////
46
+ // Project a ray to the left to check if it crosses the segment in order
47
+ // to find the fragment's winding number to determine whether fragment
48
+ // is inside or outside the shape.
49
+
50
+ int crossIdxS = crossCellIdxRange.x;
51
+ int crossLen = crossCellIdxRange.y;
52
+ float winds = 0.0;
53
+ // Iterate over all relevant cell indexes
54
+ for (int i = crossIdxS; i < crossIdxS + crossLen; i++) {
55
+ int crossIdx = texelFetch(uCrossCellIdxs, ivec2(i%256, i/256), 0).x;
56
+
57
+ bool isEven = crossIdx % 2 == 0;
58
+
59
+ ivec4 uSegIdxRange = uSegIdxRangePerCell[crossIdx / 2];
60
+ int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;
61
+ int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;
62
+
63
+ for (int j = segIdx; j < segIdx + segLen; j++) {
64
+ // Fetch segment from texture
65
+ vec4 seg = texelFetch(uSegs, ivec2(j, 0), 0);
66
+
67
+ // line segment's min-y is excluded
68
+ bool crossing =
69
+ (seg.y > vXY.y != seg.w > vXY.y) &&
70
+ (vXY.x > (seg.z - seg.x)*(vXY.y - seg.y) / (seg.w - seg.y) + seg.x);
71
+
72
+ bool crossingUp = seg.y < seg.w;
73
+
74
+ winds += crossing ? (crossingUp ? 1.0 : -1.0) : 0.0;
75
+ }
76
+ }
77
+
78
+ {
79
+ bool isEven = (instanceId % ${ROW_COUNT}) % 2 == 0;
80
+
81
+ ivec4 uSegIdxRange = uSegIdxRangePerStrip[(instanceId % ${ROW_COUNT}) / 2];
82
+ int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;
83
+ int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;
84
+
85
+ for (int j = segIdx; j < segIdx + segLen; j++) {
86
+ // Fetch segment from texture
87
+ vec4 seg = texelFetch(uSegs, ivec2(j, 0), 0);
88
+
89
+ // line segment's min-y is excluded
90
+ bool crossing =
91
+ (seg.y > vXY.y != seg.w > vXY.y) &&
92
+ (vXY.x > (seg.z - seg.x)*(vXY.y - seg.y) / (seg.w - seg.y) + seg.x);
93
+
94
+ bool crossingUp = seg.y < seg.w;
95
+
96
+ winds += crossing ? (crossingUp ? 1.0 : -1.0) : 0.0;
97
+ }
98
+ }
99
+
100
+
101
+ bool inside = winds != 0.0;
102
+ ///////////////////////////////////////////////////////////////////////////
103
+
104
+ ///////////////////////////////////////////////////////////////////////////
105
+ float res = 1.0; // sdf result
106
+
107
+ if ((inside && (uIncl % 2 != 0)) || (!inside && (uIncl > 1))) {
108
+ int cellIdxS = closeCellIdxRange.x;
109
+ int cellLen = closeCellIdxRange.y;
110
+ // Iterate over all relevant cell indexes
111
+ for (int i = cellIdxS; i < cellIdxS + cellLen; i++) {
112
+ int cellIdx = texelFetch(uCloseCellIdxs, ivec2(i%256, i/256), 0).x;
113
+
114
+ bool isEven = cellIdx % 2 == 0;
115
+ ivec4 uSegIdxRange = uSegIdxRangePerCell[cellIdx / 2];
116
+ int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;
117
+ int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;
118
+
119
+ for (int j = segIdx; j < segIdx + segLen; j++) {
120
+ // Fetch segment from texture
121
+ vec4 seg = texelFetch(uSegs, ivec2(j, 0), 0);
122
+
123
+ // Find unsigned distance to the segment; only the nearest will be kept
124
+ float d = absDistToSegment(vXY, seg.xy, seg.zw);
125
+ // Apply exponential transform TODO
126
+ // val = pow(1.0 - clamp(d / uMaxDistance, 0.0, 1.0), uExponent) * 0.5;
127
+ float val = clamp(d / uMaxDistance, 0.0, 1.0);
128
+ res = min(res, val);
129
+ }
130
+ }
131
+ }
132
+ ///////////////////////////////////////////////////////////////////////////
133
+
134
+ // DEBUG!
135
+ float alpha = ((instanceId + instanceId/${ROW_COUNT}) % 2 == 0 ? 0.3 : 0.5);
136
+
137
+ float red = inside ? 0.2 : 0.8;
138
+ float green = abs(sin(50.0 * res));
139
+ float blue = 0.5;
140
+ // float alpha = inside ? 0.5 : 0.0;
141
+
142
+ FragColor = vec4(red, green, blue, alpha);
143
+ }
144
+ `;
145
+ cache[1024 * colCount + padCount] = main_Fragment;
146
+ return main_Fragment;
147
+ }
148
+ export { getMainFragment };
149
+ //# sourceMappingURL=main.fragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.fragment.js","sourceRoot":"","sources":["../../src/shaders/main.fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,KAAK,GAAkD,EAAE,CAAC;AAGhE,SAAS,eAAe,CAChB,QAAgB,EAChB,QAAgB;IAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,GAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAAC,OAAO,QAAQ,CAAC;IAAC,CAAC;IAEpD,MAAM,aAAa;IACnB,QAAQ,CAAA;;;;;;;;;;;;gCAYwB,CAAC,SAAS,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAC,CAAC,QAAQ,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAG,CAAC;;;iCAGnD,SAAS,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAuDR,SAAS;;kEAEmB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8CAsD7B,SAAS;;;;;;;;;CAStD,CAAA;IAEG,KAAK,CAAC,IAAI,GAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,aAAa,CAAC;IAChD,OAAO,aAAa,CAAC;AACzB,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,53 @@
1
+ import { ROW_COUNT } from "../row-count.js";
2
+ const main_Vertex = /*glsl*/ `#version 300 es
3
+
4
+ precision highp float;
5
+
6
+ uniform vec2 uWidthHeight;
7
+ uniform float uStretch;
8
+ in vec2 aUV;
9
+ in ivec2 aCloseCellIdxRangePerCell;
10
+ in ivec2 aCrossIdxRangePerCell;
11
+ out vec2 vXY;
12
+ flat out int instanceId;
13
+ flat out ivec2 closeCellIdxRange;
14
+ flat out ivec2 crossCellIdxRange;
15
+
16
+
17
+ void main() {
18
+ instanceId = gl_InstanceID;
19
+ closeCellIdxRange = aCloseCellIdxRangePerCell;
20
+ crossCellIdxRange = aCrossIdxRangePerCell;
21
+
22
+ // drawn column-by-column
23
+ float i = float(instanceId / ${ROW_COUNT}); // column index
24
+ float j = float(instanceId % ${ROW_COUNT}); // row index
25
+
26
+ vec2 trans = vec2(
27
+ i / float(${ROW_COUNT}),
28
+ j / float(${ROW_COUNT})
29
+ );
30
+
31
+ vec2 uv = aUV + trans;
32
+
33
+ float width = uWidthHeight.x;
34
+ float height = uWidthHeight.y;
35
+
36
+ vXY = vec2(
37
+ height * uv.x,
38
+ height * uv.y
39
+ );
40
+
41
+ float aspectRatio = width / height;
42
+
43
+ gl_Position = vec4(
44
+ vec2(
45
+ (2.0*(uv.x / aspectRatio) - 1.0),
46
+ 2.0*uv.y - 1.0
47
+ ),
48
+ 0.0, 1.0
49
+ );
50
+ }
51
+ `;
52
+ export { main_Vertex };
53
+ //# sourceMappingURL=main.vertex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.vertex.js","sourceRoot":"","sources":["../../src/shaders/main.vertex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,GAAG,QAAQ,CAAA;;;;;;;;;;;;;;;;;;;;;mCAqBO,SAAS;mCACT,SAAS;;;oBAGxB,SAAS;oBACT,SAAS;;;;;;;;;;;;;;;;;;;;;;;CAuB5B,CAAC;AAGF,OAAO,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,91 @@
1
+ import { z } from './path-segment/z.js';
2
+ import { c } from './path-segment/c.js';
3
+ import { s } from './path-segment/s.js';
4
+ import { l } from './path-segment/l.js';
5
+ import { h } from './path-segment/h.js';
6
+ import { v } from './path-segment/v.js';
7
+ import { q } from './path-segment/q.js';
8
+ import { t } from './path-segment/t.js';
9
+ const pathFs = {
10
+ c, // cubic bezier
11
+ h, // horizontal line
12
+ l, // line
13
+ q, // quadratic bezier
14
+ s, // cubic bezier (smooth)
15
+ t, // quadratic bezier (smooth)
16
+ v, // vertical line
17
+ z // close path
18
+ };
19
+ /**
20
+ * Returns order 1, 2 and 3 beziers from the given SVG DOM element. If a path
21
+ * data tag is not "C, Q or L, etc", i.e. if it is not an absolute bezier
22
+ * coordinate then it is converted into one.
23
+ *
24
+ * @param paths An SVG element
25
+ */
26
+ function getBeziersFromRawPaths(paths) {
27
+ if (paths.length === 0) {
28
+ return []; // A shape is not described
29
+ }
30
+ if (paths[0].type.toLowerCase() !== 'm') {
31
+ throw new Error('Invalid SVG - every new path must start with an M or m.');
32
+ }
33
+ const s = { p: [0, 0] };
34
+ const beziersArrays = [];
35
+ let beziers = [];
36
+ let prevType = undefined;
37
+ for (let i = 0; i < paths.length; i++) {
38
+ const pathSeg = paths[i];
39
+ const type = pathSeg.type.toLowerCase();
40
+ s.vals = pathSeg.values;
41
+ // If pathSeg was lowercase, it is relative - make absolute
42
+ if (pathSeg.type === type) {
43
+ if (type === 'v') {
44
+ s.vals[0] += s.p[1];
45
+ }
46
+ else if (type === 'a') {
47
+ s.vals[5] += s.p[0];
48
+ s.vals[6] += s.p[1];
49
+ }
50
+ else {
51
+ for (let i = 0; i < s.vals.length; i++) {
52
+ s.vals[i] += s.p[i % 2];
53
+ }
54
+ }
55
+ }
56
+ if (type === 'm') {
57
+ if (beziers.length) {
58
+ // This is a subpath, close as if the previous command was a
59
+ // Z or z.
60
+ if (prevType !== 'z') {
61
+ beziers.push(z(s));
62
+ }
63
+ // Start new path
64
+ beziersArrays.push(beziers);
65
+ beziers = [];
66
+ }
67
+ s.initialPoint = s.p = s.vals;
68
+ prevType = type;
69
+ continue;
70
+ }
71
+ const f = pathFs[type];
72
+ if (!f) {
73
+ throw new Error('Invalid SVG - command not recognized.');
74
+ }
75
+ const ps = f(s);
76
+ s.p = ps[ps.length - 1]; // Update current point
77
+ beziers.push(ps);
78
+ prevType = type;
79
+ }
80
+ if (beziers.length > 0) {
81
+ // This is a subpath, close as if the previous command was a Z or z.
82
+ if (prevType !== 'z') {
83
+ beziers.push(z(s));
84
+ }
85
+ // Start new path
86
+ beziersArrays.push(beziers);
87
+ }
88
+ return beziersArrays;
89
+ }
90
+ export { getBeziersFromRawPaths };
91
+ //# sourceMappingURL=get-beziers-from-raw-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-beziers-from-raw-paths.js","sourceRoot":"","sources":["../../src/svg/get-beziers-from-raw-paths.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AAGxC,MAAM,MAAM,GAAsD;IACjE,CAAC,EAAE,eAAe;IAClB,CAAC,EAAE,kBAAkB;IACrB,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,mBAAmB;IACtB,CAAC,EAAE,wBAAwB;IAC3B,CAAC,EAAE,4BAA4B;IAC/B,CAAC,EAAE,gBAAgB;IACnB,CAAC,CAAE,aAAa;CAChB,CAAC;AAGF;;;;;;GAMG;AACH,SAAS,sBAAsB,CAAC,KAA2C;IAE1E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC,CAAC,8BAA8B;IAC1C,CAAC;IAED,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACd,yDAAyD,CACzD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAc,EAAE,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC;IAElC,MAAM,aAAa,GAAmB,EAAE,CAAC;IACzC,IAAI,OAAO,GAAiB,EAAE,CAAC;IAE/B,IAAI,QAAQ,GAAuB,SAAS,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;QAExB,2DAA2D;QAC3D,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBAClB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACzB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACP,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACpC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;gBACvB,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAClB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,6DAA6D;gBAC7D,UAAU;gBACV,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;oBACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;gBAED,iBAAiB;gBACjB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5B,OAAO,GAAG,EAAE,CAAC;YACd,CAAC;YAED,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC9B,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACV,CAAC;QAED,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,CAAC,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAAC,CAAC;QAErE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;QAC9C,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjB,QAAQ,GAAG,IAAI,CAAC;IACjB,CAAC;IAGD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,oEAAoE;QACpE,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,iBAAiB;QACjB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,aAAa,CAAC;AACtB,CAAC;AAGD,OAAO,EAAE,sBAAsB,EAAE,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { getBeziersFromRawPaths } from './get-beziers-from-raw-paths.js';
2
+ import { parsePathDataString } from './path-data-polyfill/parse-path-data-string.js';
3
+ /**
4
+ * Returns an array of loops with each loop consisting of an array of beziers
5
+ * and each bezier in turn consisting of an array of control points from the
6
+ * given SVG path string. An array of loops are returned (as opposed to a single
7
+ * loop) since an SVG path may have sub-paths.
8
+ * @param str The SVG path string, e.g. 'M1 1 C 5 1 5 2 4 2 C 3 3 1 3 1 1 z'
9
+ */
10
+ function getPathsFromStr(str) {
11
+ return getBeziersFromRawPaths(parsePathDataString(str));
12
+ }
13
+ export { getPathsFromStr };
14
+ //# sourceMappingURL=get-paths-from-str.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-paths-from-str.js","sourceRoot":"","sources":["../../src/svg/get-paths-from-str.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAGrF;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,GAAW;IAChC,OAAO,sBAAsB,CACzB,mBAAmB,CAAC,GAAG,CAAC,CAC3B,CAAC;AACN,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * @hidden
3
+ * Parse a number from an SVG path. This very closely follows genericParseNumber(...) from
4
+ * Source/core/svg/SVGParserUtilities.cpp.
5
+ * Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-PathDataBNF
6
+ * @param source
7
+ */
8
+ function parseNumber(source) {
9
+ let exponent = 0;
10
+ let integer = 0;
11
+ let frac = 1;
12
+ let decimal = 0;
13
+ let sign = 1;
14
+ let expsign = 1;
15
+ const startIndex = source._currentIndex;
16
+ source._skipOptionalSpaces();
17
+ // Read the sign.
18
+ if (source._currentIndex < source._endIndex && source._string[source._currentIndex] === "+") {
19
+ source._currentIndex += 1;
20
+ }
21
+ else if (source._currentIndex < source._endIndex && source._string[source._currentIndex] === "-") {
22
+ source._currentIndex += 1;
23
+ sign = -1;
24
+ }
25
+ if (source._currentIndex === source._endIndex ||
26
+ ((source._string[source._currentIndex] < "0" || source._string[source._currentIndex] > "9") &&
27
+ source._string[source._currentIndex] !== ".")) {
28
+ throw new Error('The first character of a number must be one of [0-9+-.].');
29
+ }
30
+ // Read the integer part, build right-to-left.
31
+ const startIntPartIndex = source._currentIndex;
32
+ while (source._currentIndex < source._endIndex &&
33
+ source._string[source._currentIndex] >= "0" &&
34
+ source._string[source._currentIndex] <= "9") {
35
+ source._currentIndex += 1; // Advance to first non-digit.
36
+ }
37
+ if (source._currentIndex !== startIntPartIndex) {
38
+ let scanIntPartIndex = source._currentIndex - 1;
39
+ let multiplier = 1;
40
+ while (scanIntPartIndex >= startIntPartIndex) {
41
+ integer += multiplier * (Number(source._string[scanIntPartIndex]) - 0);
42
+ scanIntPartIndex -= 1;
43
+ multiplier *= 10;
44
+ }
45
+ }
46
+ // Read the decimals.
47
+ if (source._currentIndex < source._endIndex && source._string[source._currentIndex] === ".") {
48
+ source._currentIndex += 1;
49
+ if (source._currentIndex >= source._endIndex ||
50
+ source._string[source._currentIndex] < "0" ||
51
+ source._string[source._currentIndex] > "9") {
52
+ throw new Error('There must be a least one digit following the .');
53
+ }
54
+ while (source._currentIndex < source._endIndex &&
55
+ source._string[source._currentIndex] >= "0" &&
56
+ source._string[source._currentIndex] <= "9") {
57
+ frac *= 10;
58
+ decimal += (Number(source._string.charAt(source._currentIndex))) / frac;
59
+ source._currentIndex += 1;
60
+ }
61
+ }
62
+ // Read the exponent part.
63
+ if (source._currentIndex !== startIndex &&
64
+ source._currentIndex + 1 < source._endIndex &&
65
+ (source._string[source._currentIndex] === "e" || source._string[source._currentIndex] === "E") &&
66
+ (source._string[source._currentIndex + 1] !== "x" && source._string[source._currentIndex + 1] !== "m")) {
67
+ source._currentIndex += 1;
68
+ // Read the sign of the exponent.
69
+ if (source._string[source._currentIndex] === "+") {
70
+ source._currentIndex += 1;
71
+ }
72
+ else if (source._string[source._currentIndex] === "-") {
73
+ source._currentIndex += 1;
74
+ expsign = -1;
75
+ }
76
+ if (source._currentIndex >= source._endIndex ||
77
+ source._string[source._currentIndex] < "0" ||
78
+ source._string[source._currentIndex] > "9") {
79
+ throw new Error('There must be an exponent.');
80
+ }
81
+ while (source._currentIndex < source._endIndex &&
82
+ source._string[source._currentIndex] >= "0" &&
83
+ source._string[source._currentIndex] <= "9") {
84
+ exponent *= 10;
85
+ exponent += (Number(source._string[source._currentIndex]));
86
+ source._currentIndex += 1;
87
+ }
88
+ }
89
+ let number = integer + decimal;
90
+ number *= sign;
91
+ if (exponent) {
92
+ number *= Math.pow(10, expsign * exponent);
93
+ }
94
+ if (startIndex === source._currentIndex) {
95
+ throw new Error('Internal error: startIndex === source._currentIndex');
96
+ }
97
+ source._skipOptionalSpacesOrDelimiter();
98
+ return number;
99
+ }
100
+ export { parseNumber };
101
+ //# sourceMappingURL=parse-number.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-number.js","sourceRoot":"","sources":["../../../src/svg/path-data-polyfill/parse-number.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Source } from './source.js';
2
+ /**
3
+ * @hidden
4
+ * @param string
5
+ */
6
+ function parsePathDataString(string) {
7
+ if (!string.length) {
8
+ return [];
9
+ }
10
+ const source = new Source(string);
11
+ const pathData = [];
12
+ if (!source.initialCommandIsMoveTo()) {
13
+ throw new Error('Path must start with m or M');
14
+ }
15
+ while (source.hasMoreData()) {
16
+ pathData.push(source.parseSegment());
17
+ }
18
+ return pathData;
19
+ }
20
+ export { parsePathDataString };
21
+ //# sourceMappingURL=parse-path-data-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-path-data-string.js","sourceRoot":"","sources":["../../../src/svg/path-data-polyfill/parse-path-data-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;;GAGG;AACH,SAAS,mBAAmB,CAAC,MAAc;IACvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,EAAE,CAAC;IAEpB,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAGD,OAAO,EAAE,mBAAmB,EAAE,CAAA"}
@@ -0,0 +1,147 @@
1
+ import { parseNumber } from './parse-number.js';
2
+ /** @hidden */
3
+ const COMMAND_MAP = {
4
+ Z: "Z", M: "M", L: "L", C: "C", Q: "Q", A: "A", H: "H", V: "V", S: "S", T: "T",
5
+ z: "Z", m: "m", l: "l", c: "c", q: "q", a: "a", h: "h", v: "v", s: "s", t: "t"
6
+ };
7
+ /** @hidden */
8
+ class Source {
9
+ _string;
10
+ _currentIndex;
11
+ _endIndex;
12
+ _prevCommand;
13
+ constructor(string) {
14
+ this._string = string;
15
+ this._currentIndex = 0;
16
+ this._endIndex = this._string.length;
17
+ this._prevCommand = undefined;
18
+ this._skipOptionalSpaces();
19
+ }
20
+ parseSegment() {
21
+ const char = this._string[this._currentIndex];
22
+ let command = COMMAND_MAP[char];
23
+ if (command === undefined) {
24
+ if (this._prevCommand === undefined) {
25
+ throw new Error('Implicit command not allowed for first commands.');
26
+ }
27
+ // Check for remaining coordinates in the current command.
28
+ if ((char === "+" || char === "-" || char === "." || (char >= "0" && char <= "9")) &&
29
+ this._prevCommand !== "Z") {
30
+ if (this._prevCommand === "M") {
31
+ command = "L";
32
+ }
33
+ else if (this._prevCommand === "m") {
34
+ command = "l";
35
+ }
36
+ else {
37
+ command = this._prevCommand;
38
+ }
39
+ }
40
+ else {
41
+ throw new Error('Remaining coordinates not found for implicit command');
42
+ }
43
+ }
44
+ else {
45
+ this._currentIndex += 1;
46
+ }
47
+ this._prevCommand = command;
48
+ let values = undefined;
49
+ const cmd = command.toUpperCase();
50
+ if (cmd === "H" || cmd === "V") {
51
+ values = [parseNumber(this)];
52
+ }
53
+ else if (cmd === "M" || cmd === "L" || cmd === "T") {
54
+ values = [parseNumber(this), parseNumber(this)];
55
+ }
56
+ else if (cmd === "S" || cmd === "Q") {
57
+ values = [parseNumber(this), parseNumber(this), parseNumber(this), parseNumber(this)];
58
+ }
59
+ else if (cmd === "C") {
60
+ values = [
61
+ parseNumber(this),
62
+ parseNumber(this),
63
+ parseNumber(this),
64
+ parseNumber(this),
65
+ parseNumber(this),
66
+ parseNumber(this)
67
+ ];
68
+ }
69
+ else if (cmd === "A") {
70
+ values = [
71
+ parseNumber(this),
72
+ parseNumber(this),
73
+ parseNumber(this),
74
+ this._parseArcFlag(),
75
+ this._parseArcFlag(),
76
+ parseNumber(this),
77
+ parseNumber(this)
78
+ ];
79
+ }
80
+ else if (cmd === "Z") {
81
+ this._skipOptionalSpaces();
82
+ values = [];
83
+ }
84
+ if (values === undefined) {
85
+ throw new Error('Unknown command');
86
+ }
87
+ else {
88
+ return { type: command, values };
89
+ }
90
+ }
91
+ hasMoreData() {
92
+ return this._currentIndex < this._endIndex;
93
+ }
94
+ initialCommandIsMoveTo() {
95
+ // If the path is empty it is still valid, so return true.
96
+ if (!this.hasMoreData()) {
97
+ return true;
98
+ }
99
+ const command = COMMAND_MAP[this._string[this._currentIndex]];
100
+ return command === "M" || command === "m";
101
+ }
102
+ _isCurrentSpace() {
103
+ const char = this._string[this._currentIndex];
104
+ return char <= " " && (char === " " || char === "\n" || char === "\t" || char === "\r" || char === "\f");
105
+ }
106
+ _skipOptionalSpaces() {
107
+ while (this._currentIndex < this._endIndex && this._isCurrentSpace()) {
108
+ this._currentIndex += 1;
109
+ }
110
+ return this._currentIndex < this._endIndex;
111
+ }
112
+ _skipOptionalSpacesOrDelimiter() {
113
+ if (this._currentIndex < this._endIndex &&
114
+ !this._isCurrentSpace() &&
115
+ this._string[this._currentIndex] !== ",") {
116
+ return false;
117
+ }
118
+ if (this._skipOptionalSpaces()) {
119
+ if (this._currentIndex < this._endIndex && this._string[this._currentIndex] === ",") {
120
+ this._currentIndex += 1;
121
+ this._skipOptionalSpaces();
122
+ }
123
+ }
124
+ return this._currentIndex < this._endIndex;
125
+ }
126
+ _parseArcFlag() {
127
+ if (this._currentIndex >= this._endIndex) {
128
+ throw new Error('Unable to parse arc flag');
129
+ }
130
+ let flag = undefined;
131
+ const flagChar = this._string[this._currentIndex];
132
+ this._currentIndex += 1;
133
+ if (flagChar === "0") {
134
+ flag = 0;
135
+ }
136
+ else if (flagChar === "1") {
137
+ flag = 1;
138
+ }
139
+ else {
140
+ throw new Error('Unable to parse arc flag - arc flag must be 0 or 1');
141
+ }
142
+ this._skipOptionalSpacesOrDelimiter();
143
+ return flag;
144
+ }
145
+ }
146
+ export { Source };
147
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/svg/path-data-polyfill/source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @hidden
3
+ * C and c: (from www.w3.org)
4
+ *
5
+ * params: x1 y1 x2 y2 x y
6
+ *
7
+ * Draws a cubic Bézier curve from the current point to (x,y)
8
+ * using (x1,y1) as the control point at the beginning of the
9
+ * curve and (x2,y2) as the control point at the end of the
10
+ * curve. C (uppercase) indicates that absolute coordinates
11
+ * will follow; c (lowercase) indicates that relative
12
+ * coordinates will follow. Multiple sets of coordinates may
13
+ * be specified to draw a polybézier. At the end of the
14
+ * command, the new current point becomes the final (x,y)
15
+ * coordinate pair used in the polybézier.
16
+ */
17
+ function c(s) {
18
+ const ps = [
19
+ s.p,
20
+ [s.vals[0], s.vals[1]],
21
+ [s.vals[2], s.vals[3]],
22
+ [s.vals[4], s.vals[5]]
23
+ ];
24
+ s.prev2ndCubicControlPoint = ps[2];
25
+ s.prev2ndQuadraticControlPoint = undefined;
26
+ return ps;
27
+ }
28
+ export { c };
29
+ //# sourceMappingURL=c.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c.js","sourceRoot":"","sources":["../../../src/svg/path-segment/c.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,SAAS,CAAC,CAAC,CAAY;IACnB,MAAM,EAAE,GAAG;QACP,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC;KAC3B,CAAC;IACF,CAAC,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,4BAA4B,GAAG,SAAS,CAAC;IAE3C,OAAO,EAAE,CAAC;AACd,CAAC;AAGD,OAAO,EAAE,CAAC,EAAE,CAAA"}