@meta2d/core 1.0.55 → 1.0.56

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 (302) hide show
  1. package/README.md +13 -0
  2. package/package.build.json +39 -0
  3. package/package.json +38 -38
  4. package/src/canvas/canvas.ts +8639 -0
  5. package/src/canvas/canvasImage.ts +525 -0
  6. package/src/canvas/canvasTemplate.ts +257 -0
  7. package/src/canvas/magnifierCanvas.ts +142 -0
  8. package/src/canvas/offscreen.ts +14 -0
  9. package/src/core.ts +5128 -0
  10. package/src/data.ts +86 -0
  11. package/src/diagrams/arrow.ts +50 -0
  12. package/src/diagrams/circle.ts +19 -0
  13. package/src/diagrams/cloud.ts +34 -0
  14. package/src/diagrams/cube.ts +94 -0
  15. package/src/diagrams/diamond.ts +14 -0
  16. package/src/diagrams/file.ts +19 -0
  17. package/src/diagrams/gif.ts +105 -0
  18. package/src/diagrams/{hexagon.js → hexagon.ts} +19 -14
  19. package/src/diagrams/iframe.ts +365 -0
  20. package/src/diagrams/{index.js → index.ts} +36 -34
  21. package/src/diagrams/line/arrow.ts +175 -0
  22. package/src/diagrams/line/curve.ts +260 -0
  23. package/src/diagrams/line/line.ts +409 -0
  24. package/src/diagrams/line/polyline.ts +676 -0
  25. package/src/diagrams/line/smooth.ts +133 -0
  26. package/src/diagrams/message.ts +17 -0
  27. package/src/diagrams/mindLine.ts +31 -0
  28. package/src/diagrams/mindNode.ts +177 -0
  29. package/src/diagrams/panel.ts +149 -0
  30. package/src/diagrams/pentagon.ts +48 -0
  31. package/src/diagrams/pentagram.ts +63 -0
  32. package/src/diagrams/people.ts +23 -0
  33. package/src/diagrams/rectangle.ts +29 -0
  34. package/src/diagrams/svg/parse.ts +319 -0
  35. package/src/diagrams/svgPath.ts +53 -0
  36. package/src/diagrams/triangle.ts +43 -0
  37. package/src/diagrams/video.ts +202 -0
  38. package/src/dialog/dialog.ts +177 -0
  39. package/src/event/event.ts +142 -0
  40. package/src/map/map.ts +239 -0
  41. package/src/options.ts +205 -0
  42. package/src/pen/arrow.ts +259 -0
  43. package/src/pen/math.ts +253 -0
  44. package/src/pen/model.ts +785 -0
  45. package/src/pen/plugin.ts +57 -0
  46. package/src/pen/render.ts +3725 -0
  47. package/src/pen/text.ts +341 -0
  48. package/src/pen/utils.ts +21 -0
  49. package/src/point/point.ts +232 -0
  50. package/src/rect/rect.ts +507 -0
  51. package/src/rect/triangle.ts +16 -0
  52. package/src/scroll/scroll.ts +277 -0
  53. package/src/store/global.ts +38 -0
  54. package/src/store/store.ts +293 -0
  55. package/src/theme.ts +35 -0
  56. package/src/title/title.ts +115 -0
  57. package/src/tooltip/tooltip.ts +199 -0
  58. package/src/utils/clone.ts +79 -0
  59. package/src/utils/color.ts +126 -0
  60. package/src/utils/error.ts +7 -0
  61. package/src/utils/file.ts +46 -0
  62. package/src/utils/{index.d.ts → index.ts} +1 -0
  63. package/src/utils/math.ts +120 -0
  64. package/src/utils/object.ts +23 -0
  65. package/src/utils/padding.ts +48 -0
  66. package/src/utils/time.ts +25 -0
  67. package/src/utils/url.ts +30 -0
  68. package/src/utils/uuid.ts +15 -0
  69. package/index.js +0 -10
  70. package/index.js.map +0 -1
  71. package/src/canvas/canvas.d.ts +0 -456
  72. package/src/canvas/canvas.js +0 -8187
  73. package/src/canvas/canvas.js.map +0 -1
  74. package/src/canvas/canvasImage.d.ts +0 -28
  75. package/src/canvas/canvasImage.js +0 -503
  76. package/src/canvas/canvasImage.js.map +0 -1
  77. package/src/canvas/canvasTemplate.d.ts +0 -19
  78. package/src/canvas/canvasTemplate.js +0 -229
  79. package/src/canvas/canvasTemplate.js.map +0 -1
  80. package/src/canvas/index.js +0 -3
  81. package/src/canvas/index.js.map +0 -1
  82. package/src/canvas/magnifierCanvas.d.ts +0 -20
  83. package/src/canvas/magnifierCanvas.js +0 -101
  84. package/src/canvas/magnifierCanvas.js.map +0 -1
  85. package/src/canvas/offscreen.d.ts +0 -2
  86. package/src/canvas/offscreen.js +0 -14
  87. package/src/canvas/offscreen.js.map +0 -1
  88. package/src/core.d.ts +0 -479
  89. package/src/core.js +0 -5199
  90. package/src/core.js.map +0 -1
  91. package/src/data.d.ts +0 -34
  92. package/src/data.js +0 -85
  93. package/src/data.js.map +0 -1
  94. package/src/diagrams/arrow.d.ts +0 -4
  95. package/src/diagrams/arrow.js +0 -47
  96. package/src/diagrams/arrow.js.map +0 -1
  97. package/src/diagrams/circle.d.ts +0 -2
  98. package/src/diagrams/circle.js +0 -9
  99. package/src/diagrams/circle.js.map +0 -1
  100. package/src/diagrams/cloud.d.ts +0 -2
  101. package/src/diagrams/cloud.js +0 -12
  102. package/src/diagrams/cloud.js.map +0 -1
  103. package/src/diagrams/cube.d.ts +0 -2
  104. package/src/diagrams/cube.js +0 -70
  105. package/src/diagrams/cube.js.map +0 -1
  106. package/src/diagrams/diamond.d.ts +0 -2
  107. package/src/diagrams/diamond.js +0 -13
  108. package/src/diagrams/diamond.js.map +0 -1
  109. package/src/diagrams/file.d.ts +0 -2
  110. package/src/diagrams/file.js +0 -18
  111. package/src/diagrams/file.js.map +0 -1
  112. package/src/diagrams/gif.d.ts +0 -5
  113. package/src/diagrams/gif.js +0 -90
  114. package/src/diagrams/gif.js.map +0 -1
  115. package/src/diagrams/hexagon.d.ts +0 -2
  116. package/src/diagrams/hexagon.js.map +0 -1
  117. package/src/diagrams/iframe.d.ts +0 -2
  118. package/src/diagrams/iframe.js +0 -356
  119. package/src/diagrams/iframe.js.map +0 -1
  120. package/src/diagrams/index.d.ts +0 -71
  121. package/src/diagrams/index.js.map +0 -1
  122. package/src/diagrams/line/arrow.d.ts +0 -2
  123. package/src/diagrams/line/arrow.js +0 -128
  124. package/src/diagrams/line/arrow.js.map +0 -1
  125. package/src/diagrams/line/curve.d.ts +0 -16
  126. package/src/diagrams/line/curve.js +0 -236
  127. package/src/diagrams/line/curve.js.map +0 -1
  128. package/src/diagrams/line/index.js +0 -6
  129. package/src/diagrams/line/index.js.map +0 -1
  130. package/src/diagrams/line/line.d.ts +0 -42
  131. package/src/diagrams/line/line.js +0 -431
  132. package/src/diagrams/line/line.js.map +0 -1
  133. package/src/diagrams/line/polyline.d.ts +0 -10
  134. package/src/diagrams/line/polyline.js +0 -657
  135. package/src/diagrams/line/polyline.js.map +0 -1
  136. package/src/diagrams/line/smooth.d.ts +0 -3
  137. package/src/diagrams/line/smooth.js +0 -174
  138. package/src/diagrams/line/smooth.js.map +0 -1
  139. package/src/diagrams/message.d.ts +0 -2
  140. package/src/diagrams/message.js +0 -15
  141. package/src/diagrams/message.js.map +0 -1
  142. package/src/diagrams/mindLine.d.ts +0 -3
  143. package/src/diagrams/mindLine.js +0 -31
  144. package/src/diagrams/mindLine.js.map +0 -1
  145. package/src/diagrams/mindNode.d.ts +0 -3
  146. package/src/diagrams/mindNode.js +0 -189
  147. package/src/diagrams/mindNode.js.map +0 -1
  148. package/src/diagrams/panel.d.ts +0 -2
  149. package/src/diagrams/panel.js +0 -131
  150. package/src/diagrams/panel.js.map +0 -1
  151. package/src/diagrams/pentagon.d.ts +0 -3
  152. package/src/diagrams/pentagon.js +0 -46
  153. package/src/diagrams/pentagon.js.map +0 -1
  154. package/src/diagrams/pentagram.d.ts +0 -3
  155. package/src/diagrams/pentagram.js +0 -77
  156. package/src/diagrams/pentagram.js.map +0 -1
  157. package/src/diagrams/people.d.ts +0 -2
  158. package/src/diagrams/people.js +0 -19
  159. package/src/diagrams/people.js.map +0 -1
  160. package/src/diagrams/rectangle.d.ts +0 -3
  161. package/src/diagrams/rectangle.js +0 -26
  162. package/src/diagrams/rectangle.js.map +0 -1
  163. package/src/diagrams/svg/parse.d.ts +0 -15
  164. package/src/diagrams/svg/parse.js +0 -326
  165. package/src/diagrams/svg/parse.js.map +0 -1
  166. package/src/diagrams/svgPath.d.ts +0 -2
  167. package/src/diagrams/svgPath.js +0 -30
  168. package/src/diagrams/svgPath.js.map +0 -1
  169. package/src/diagrams/triangle.d.ts +0 -3
  170. package/src/diagrams/triangle.js +0 -41
  171. package/src/diagrams/triangle.js.map +0 -1
  172. package/src/diagrams/video.d.ts +0 -5
  173. package/src/diagrams/video.js +0 -185
  174. package/src/diagrams/video.js.map +0 -1
  175. package/src/dialog/dialog.d.ts +0 -21
  176. package/src/dialog/dialog.js +0 -98
  177. package/src/dialog/dialog.js.map +0 -1
  178. package/src/dialog/index.js +0 -2
  179. package/src/dialog/index.js.map +0 -1
  180. package/src/event/event.d.ts +0 -102
  181. package/src/event/event.js +0 -22
  182. package/src/event/event.js.map +0 -1
  183. package/src/event/index.js +0 -2
  184. package/src/event/index.js.map +0 -1
  185. package/src/map/index.js +0 -2
  186. package/src/map/index.js.map +0 -1
  187. package/src/map/map.d.ts +0 -21
  188. package/src/map/map.js +0 -210
  189. package/src/map/map.js.map +0 -1
  190. package/src/options.d.ts +0 -130
  191. package/src/options.js +0 -80
  192. package/src/options.js.map +0 -1
  193. package/src/pen/arrow.d.ts +0 -4
  194. package/src/pen/arrow.js +0 -188
  195. package/src/pen/arrow.js.map +0 -1
  196. package/src/pen/index.js +0 -7
  197. package/src/pen/index.js.map +0 -1
  198. package/src/pen/math.d.ts +0 -28
  199. package/src/pen/math.js +0 -304
  200. package/src/pen/math.js.map +0 -1
  201. package/src/pen/model.d.ts +0 -514
  202. package/src/pen/model.js +0 -210
  203. package/src/pen/model.js.map +0 -1
  204. package/src/pen/plugin.d.ts +0 -5
  205. package/src/pen/plugin.js +0 -88
  206. package/src/pen/plugin.js.map +0 -1
  207. package/src/pen/render.d.ts +0 -147
  208. package/src/pen/render.js +0 -3236
  209. package/src/pen/render.js.map +0 -1
  210. package/src/pen/text.d.ts +0 -8
  211. package/src/pen/text.js +0 -375
  212. package/src/pen/text.js.map +0 -1
  213. package/src/pen/utils.d.ts +0 -2
  214. package/src/pen/utils.js +0 -41
  215. package/src/pen/utils.js.map +0 -1
  216. package/src/point/index.js +0 -2
  217. package/src/point/index.js.map +0 -1
  218. package/src/point/point.d.ts +0 -65
  219. package/src/point/point.js +0 -179
  220. package/src/point/point.js.map +0 -1
  221. package/src/rect/index.js +0 -2
  222. package/src/rect/index.js.map +0 -1
  223. package/src/rect/rect.d.ts +0 -52
  224. package/src/rect/rect.js +0 -486
  225. package/src/rect/rect.js.map +0 -1
  226. package/src/rect/triangle.d.ts +0 -2
  227. package/src/rect/triangle.js +0 -10
  228. package/src/rect/triangle.js.map +0 -1
  229. package/src/scroll/index.js +0 -2
  230. package/src/scroll/index.js.map +0 -1
  231. package/src/scroll/scroll.d.ts +0 -35
  232. package/src/scroll/scroll.js +0 -221
  233. package/src/scroll/scroll.js.map +0 -1
  234. package/src/store/global.d.ts +0 -25
  235. package/src/store/global.js +0 -18
  236. package/src/store/global.js.map +0 -1
  237. package/src/store/index.js +0 -3
  238. package/src/store/index.js.map +0 -1
  239. package/src/store/store.d.ts +0 -228
  240. package/src/store/store.js +0 -121
  241. package/src/store/store.js.map +0 -1
  242. package/src/theme.d.ts +0 -13
  243. package/src/theme.js +0 -23
  244. package/src/theme.js.map +0 -1
  245. package/src/title/index.js +0 -2
  246. package/src/title/index.js.map +0 -1
  247. package/src/title/title.d.ts +0 -30
  248. package/src/title/title.js +0 -99
  249. package/src/title/title.js.map +0 -1
  250. package/src/tooltip/index.js +0 -2
  251. package/src/tooltip/index.js.map +0 -1
  252. package/src/tooltip/tooltip.d.ts +0 -40
  253. package/src/tooltip/tooltip.js +0 -167
  254. package/src/tooltip/tooltip.js.map +0 -1
  255. package/src/utils/browser.d.ts +0 -1
  256. package/src/utils/browser.js +0 -4
  257. package/src/utils/browser.js.map +0 -1
  258. package/src/utils/clone.d.ts +0 -8
  259. package/src/utils/clone.js +0 -88
  260. package/src/utils/clone.js.map +0 -1
  261. package/src/utils/color.d.ts +0 -3
  262. package/src/utils/color.js +0 -126
  263. package/src/utils/color.js.map +0 -1
  264. package/src/utils/error.d.ts +0 -2
  265. package/src/utils/error.js +0 -6
  266. package/src/utils/error.js.map +0 -1
  267. package/src/utils/file.d.ts +0 -3
  268. package/src/utils/file.js +0 -92
  269. package/src/utils/file.js.map +0 -1
  270. package/src/utils/index.js +0 -9
  271. package/src/utils/index.js.map +0 -1
  272. package/src/utils/math.d.ts +0 -18
  273. package/src/utils/math.js +0 -152
  274. package/src/utils/math.js.map +0 -1
  275. package/src/utils/object.d.ts +0 -2
  276. package/src/utils/object.js +0 -21
  277. package/src/utils/object.js.map +0 -1
  278. package/src/utils/padding.d.ts +0 -7
  279. package/src/utils/padding.js +0 -47
  280. package/src/utils/padding.js.map +0 -1
  281. package/src/utils/time.d.ts +0 -1
  282. package/src/utils/time.js +0 -17
  283. package/src/utils/time.js.map +0 -1
  284. package/src/utils/url.d.ts +0 -4
  285. package/src/utils/url.js +0 -27
  286. package/src/utils/url.js.map +0 -1
  287. package/src/utils/uuid.d.ts +0 -4
  288. package/src/utils/uuid.js +0 -13
  289. package/src/utils/uuid.js.map +0 -1
  290. /package/{index.d.ts → index.ts} +0 -0
  291. /package/src/canvas/{index.d.ts → index.ts} +0 -0
  292. /package/src/diagrams/line/{index.d.ts → index.ts} +0 -0
  293. /package/src/dialog/{index.d.ts → index.ts} +0 -0
  294. /package/src/event/{index.d.ts → index.ts} +0 -0
  295. /package/src/map/{index.d.ts → index.ts} +0 -0
  296. /package/src/pen/{index.d.ts → index.ts} +0 -0
  297. /package/src/point/{index.d.ts → index.ts} +0 -0
  298. /package/src/rect/{index.d.ts → index.ts} +0 -0
  299. /package/src/scroll/{index.d.ts → index.ts} +0 -0
  300. /package/src/store/{index.d.ts → index.ts} +0 -0
  301. /package/src/title/{index.d.ts → index.ts} +0 -0
  302. /package/src/tooltip/{index.d.ts → index.ts} +0 -0
@@ -0,0 +1,319 @@
1
+ import { Rect } from '../../rect';
2
+
3
+ export interface SvgCommand {
4
+ key: string;
5
+ values: number[];
6
+ relative?: boolean;
7
+ worldPoints?: number[];
8
+ }
9
+
10
+ export interface SvgPath {
11
+ commands: SvgCommand[];
12
+ }
13
+
14
+ // This logic is shamelessly borrowed from Yqnn/svg-path-editor
15
+ // https://github.com/Yqnn/svg-path-editor
16
+ const commandRegex = /^[\t\n\f\r ]*([MLHVZCSQTAmlhvzcsqta])[\t\n\f\r ]*/;
17
+ const flagRegex = /^[01]/;
18
+ const numberRegex =
19
+ /^[+-]?(([0-9]*\.[0-9]+)|([0-9]+\.)|([0-9]+))([eE][+-]?[0-9]+)?/;
20
+ const commaWsp = /^(([\t\n\f\r ]+,?[\t\n\f\r ]*)|(,[\t\n\f\r ]*))/;
21
+
22
+ const grammar: { [key: string]: RegExp[] } = {
23
+ M: [numberRegex, numberRegex],
24
+ L: [numberRegex, numberRegex],
25
+ H: [numberRegex],
26
+ V: [numberRegex],
27
+ Z: [],
28
+ C: [
29
+ numberRegex,
30
+ numberRegex,
31
+ numberRegex,
32
+ numberRegex,
33
+ numberRegex,
34
+ numberRegex,
35
+ ],
36
+ S: [numberRegex, numberRegex, numberRegex, numberRegex],
37
+ Q: [numberRegex, numberRegex, numberRegex, numberRegex],
38
+ T: [numberRegex, numberRegex],
39
+ A: [
40
+ numberRegex,
41
+ numberRegex,
42
+ numberRegex,
43
+ flagRegex,
44
+ flagRegex,
45
+ numberRegex,
46
+ numberRegex,
47
+ ],
48
+ };
49
+
50
+ export function parseSvgPath(path: string): SvgPath {
51
+ let cursor = 0;
52
+ const commands: SvgCommand[] = [];
53
+ while (cursor < path.length) {
54
+ const match = path.slice(cursor).match(commandRegex);
55
+ if (match !== null) {
56
+ const command = match[1];
57
+ cursor += match[0].length;
58
+ const parser = parseCommands(command, path, cursor);
59
+ cursor = parser.cursor;
60
+ commands.push(...parser.commands);
61
+ } else {
62
+ throw new Error('malformed path (first error at ' + cursor + ')');
63
+ }
64
+ }
65
+ return { commands };
66
+ }
67
+
68
+ export function getRect(path: SvgPath): Rect {
69
+ let x = Infinity;
70
+ let y = Infinity;
71
+ let ex = -Infinity;
72
+ let ey = -Infinity;
73
+
74
+ calcWorldPositions(path);
75
+
76
+ path.commands.forEach((item) => {
77
+ item.worldPoints.forEach((num: number, index: number) => {
78
+ if (index % 2 === 0) {
79
+ if (num < x) {
80
+ x = num;
81
+ }
82
+ if (num > ex) {
83
+ ex = num;
84
+ }
85
+ } else {
86
+ if (num < y) {
87
+ y = num;
88
+ }
89
+ if (num > ey) {
90
+ ey = num;
91
+ }
92
+ }
93
+ });
94
+ });
95
+
96
+ --x;
97
+ --y;
98
+ return {
99
+ x,
100
+ y,
101
+ ex,
102
+ ey,
103
+ width: ex - x + 1,
104
+ height: ey - y + 1,
105
+ };
106
+ }
107
+
108
+ export function translatePath(path: SvgPath, x: number, y?: number) {
109
+ if (y == null) {
110
+ y = x;
111
+ }
112
+
113
+ path.commands.forEach((item, index) => {
114
+ if (item.relative && index) {
115
+ return;
116
+ }
117
+
118
+ switch (item.key) {
119
+ case 'A':
120
+ case 'a':
121
+ item.values[5] += x;
122
+ item.values[6] += y;
123
+ break;
124
+ case 'V':
125
+ case 'v':
126
+ item.values[0] += y;
127
+ break;
128
+ default:
129
+ item.values.forEach((val, i) => {
130
+ item.values[i] = val + (i % 2 === 0 ? x : y);
131
+ });
132
+ break;
133
+ }
134
+ });
135
+ }
136
+
137
+ export function scalePath(path: SvgPath, x: number, y?: number) {
138
+ if (y == null) {
139
+ y = x;
140
+ }
141
+
142
+ path.commands.forEach((item) => {
143
+ switch (item.key) {
144
+ case 'A':
145
+ case 'a':
146
+ const a = item.values[0];
147
+ const b = item.values[1];
148
+ const angle = (Math.PI * item.values[2]) / 180;
149
+ const cos = Math.cos(angle);
150
+ const sin = Math.sin(angle);
151
+ const A = b * b * y * y * cos * cos + a * a * y * y * sin * sin;
152
+ const B = 2 * x * y * cos * sin * (b * b - a * a);
153
+ const C = a * a * x * x * cos * cos + b * b * x * x * sin * sin;
154
+ const F = -(a * a * b * b * x * x * y * y);
155
+ const det = B * B - 4 * A * C;
156
+ const val1 = Math.sqrt((A - C) * (A - C) + B * B);
157
+
158
+ // New rotation:
159
+ item.values[2] =
160
+ B !== 0
161
+ ? (Math.atan((C - A - val1) / B) * 180) / Math.PI
162
+ : A < C
163
+ ? 0
164
+ : 90;
165
+
166
+ // New radius-x, radius-y
167
+ item.values[0] = -Math.sqrt(2 * det * F * (A + C + val1)) / det;
168
+ item.values[1] = -Math.sqrt(2 * det * F * (A + C - val1)) / det;
169
+
170
+ // New target
171
+ item.values[5] *= x;
172
+ item.values[6] *= y;
173
+
174
+ // New sweep flag
175
+ item.values[4] = x * y >= 0 ? item.values[4] : 1 - item.values[4];
176
+ break;
177
+ case 'V':
178
+ case 'v':
179
+ item.values[0] *= y;
180
+ break;
181
+ default:
182
+ item.values.forEach((val, index) => {
183
+ item.values[index] = val * (index % 2 === 0 ? x : y);
184
+ });
185
+ break;
186
+ }
187
+ });
188
+ }
189
+
190
+ export function pathToString(path: SvgPath): string {
191
+ let text = '';
192
+
193
+ path.commands.forEach((item) => {
194
+ text += item.key + ' ';
195
+ item.values.forEach((num) => {
196
+ text += num + ' ';
197
+ });
198
+ });
199
+ return text;
200
+ }
201
+
202
+ function parseCommands(
203
+ type: string,
204
+ path: string,
205
+ cursor: number
206
+ ): { cursor: number; commands: SvgCommand[] } {
207
+ const expectedRegexList = grammar[type.toUpperCase()];
208
+
209
+ const commands: SvgCommand[] = [];
210
+ while (cursor <= path.length) {
211
+ const command: SvgCommand = { key: type, values: [] };
212
+ for (const regex of expectedRegexList) {
213
+ const match = path.slice(cursor).match(regex);
214
+
215
+ if (match !== null) {
216
+ command.values.push(+match[0]);
217
+ cursor += match[0].length;
218
+ const ws = path.slice(cursor).match(commaWsp);
219
+ if (ws !== null) {
220
+ cursor += ws[0].length;
221
+ }
222
+ } else if (command.values.length === 0) {
223
+ return { cursor, commands };
224
+ } else {
225
+ throw new Error('malformed path (first error at ' + cursor + ')');
226
+ }
227
+ }
228
+ command.relative = command.key.toUpperCase() !== command.key;
229
+ commands.push(command);
230
+ if (expectedRegexList.length === 0) {
231
+ return { cursor, commands };
232
+ }
233
+ if (type === 'm') {
234
+ type = 'l';
235
+ }
236
+ if (type === 'M') {
237
+ type = 'L';
238
+ }
239
+ }
240
+ throw new Error('malformed path (first error at ' + cursor + ')');
241
+ }
242
+
243
+ function calcWorldPoints(command: SvgCommand, previous: SvgCommand) {
244
+ const worldPoints: number[] = [];
245
+ let current =
246
+ command.relative && previous
247
+ ? {
248
+ x: previous.worldPoints[previous.worldPoints.length - 2],
249
+ y: previous.worldPoints[previous.worldPoints.length - 1],
250
+ }
251
+ : { x: 0, y: 0 };
252
+ for (let i = 0; i < command.values.length - 1; i += 2) {
253
+ worldPoints.push(current.x + command.values[i]);
254
+ worldPoints.push(current.y + command.values[i + 1]);
255
+ }
256
+
257
+ command.worldPoints = worldPoints;
258
+ }
259
+
260
+ function calcWorldPositions(path: SvgPath) {
261
+ let previous: SvgCommand;
262
+ let x = 0;
263
+ let y = 0;
264
+ path.commands.forEach((item) => {
265
+ switch (item.key) {
266
+ case 'Z':
267
+ case 'z':
268
+ item.worldPoints = [x, y];
269
+ break;
270
+ case 'H':
271
+ item.worldPoints = [
272
+ item.values[0],
273
+ previous.worldPoints[previous.worldPoints.length - 1],
274
+ ];
275
+ break;
276
+ case 'h':
277
+ item.worldPoints = [
278
+ item.values[0] +
279
+ previous.worldPoints[previous.worldPoints.length - 2],
280
+ previous.worldPoints[previous.worldPoints.length - 1],
281
+ ];
282
+ break;
283
+ case 'V':
284
+ item.worldPoints = [
285
+ previous.worldPoints[previous.worldPoints.length - 2],
286
+ item.values[0],
287
+ ];
288
+ break;
289
+ case 'v':
290
+ item.worldPoints = [
291
+ previous.worldPoints[previous.worldPoints.length - 2],
292
+ item.values[0] +
293
+ previous.worldPoints[previous.worldPoints.length - 1],
294
+ ];
295
+ break;
296
+ case 'A':
297
+ item.worldPoints = [
298
+ previous.worldPoints[previous.worldPoints.length - 2],
299
+ item.values[0] +
300
+ previous.worldPoints[previous.worldPoints.length - 1],
301
+ ];
302
+ break;
303
+ default:
304
+ calcWorldPoints(item, previous);
305
+ break;
306
+ }
307
+
308
+ if (
309
+ item.key === 'M' ||
310
+ item.key === 'm' ||
311
+ item.key === 'Z' ||
312
+ item.key === 'z'
313
+ ) {
314
+ x = item.worldPoints[item.worldPoints.length - 2];
315
+ y = item.worldPoints[item.worldPoints.length - 1];
316
+ }
317
+ previous = item;
318
+ });
319
+ }
@@ -0,0 +1,53 @@
1
+ import { Meta2dStore } from './../store/store';
2
+ import { Pen } from '../pen';
3
+ import { calcCenter } from '../rect';
4
+ import {
5
+ getRect,
6
+ parseSvgPath,
7
+ pathToString,
8
+ scalePath,
9
+ translatePath,
10
+ } from './svg/parse';
11
+
12
+ export function svgPath(pen: Pen, ctx?: CanvasRenderingContext2D): Path2D {
13
+ const store: Meta2dStore = pen.calculative.canvas.store;
14
+ const pathText = store.data.paths[pen.pathId];
15
+ if (!pathText) {
16
+ return new Path2D();
17
+ }
18
+
19
+ const path = parseSvgPath(pathText);
20
+ pen.calculative.svgRect = getRect(path);
21
+ calcCenter(pen.calculative.svgRect);
22
+
23
+ if (
24
+ pen.calculative.svgRect.width !== pen.calculative.worldRect.width ||
25
+ pen.calculative.svgRect.height !== pen.calculative.worldRect.height
26
+ ) {
27
+ scalePath(
28
+ path,
29
+ pen.calculative.worldRect.width / pen.calculative.svgRect.width,
30
+ pen.calculative.worldRect.height / pen.calculative.svgRect.height
31
+ );
32
+ }
33
+
34
+ const rect = getRect(path);
35
+ calcCenter(rect);
36
+ translatePath(
37
+ path,
38
+ pen.calculative.worldRect.x - rect.x,
39
+ pen.calculative.worldRect.y - rect.y
40
+ );
41
+
42
+ const pathStr = pathToString(path);
43
+ if (ctx) {
44
+ (ctx as any).svgPath?.(pathStr);
45
+ return;
46
+ }
47
+
48
+ const path2D = new Path2D(pathStr);
49
+ // TODO: 为何要闭合曲线
50
+ // path2D.closePath();
51
+
52
+ return path2D;
53
+ }
@@ -0,0 +1,43 @@
1
+ import { Pen } from '../pen';
2
+ import { Point } from '../point';
3
+
4
+ export function triangle(pen: Pen, ctx?: CanvasRenderingContext2D): Path2D {
5
+ const path = !ctx ? new Path2D() : ctx;
6
+ const { x, y, width, height } = pen.calculative.worldRect;
7
+ path.moveTo(x + width / 2, y);
8
+ path.lineTo(x + width, y + height);
9
+ path.lineTo(x, y + height);
10
+ path.lineTo(x + width / 2, y);
11
+
12
+ path.closePath();
13
+ if (path instanceof Path2D) return path;
14
+ }
15
+
16
+ export function triangleAnchors(pen: Pen) {
17
+ const points = [
18
+ {
19
+ x: 0.5,
20
+ y: 0,
21
+ },
22
+ {
23
+ x: 0.75,
24
+ y: 0.5,
25
+ },
26
+ {
27
+ x: 0.5,
28
+ y: 1,
29
+ },
30
+ {
31
+ x: 0.25,
32
+ y: 0.5,
33
+ },
34
+ ] as const;
35
+ pen.anchors = points.map(({ x, y }, index) => {
36
+ return {
37
+ id: `${index}`,
38
+ penId: pen.id,
39
+ x,
40
+ y,
41
+ };
42
+ });
43
+ }
@@ -0,0 +1,202 @@
1
+ import { Pen, setElemPosition } from '../pen';
2
+
3
+ export const videos: {
4
+ [id: string]: HTMLDivElement;
5
+ } = {};
6
+
7
+ const mutedIcons =['<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M473.088 125.44L256 256H52.224C23.552 256 0 279.552 0 308.224V716.8c0 28.16 23.04 51.2 51.2 51.2h204.8l217.088 130.56c16.896 10.24 38.912-2.048 38.912-22.016V147.456c0-19.968-21.504-32.256-38.912-22.016zM699.904 320.512c-20.992-18.944-53.248-17.408-72.192 3.584-18.944 20.992-17.408 53.248 3.584 72.192 0.512 0.512 58.368 54.784 58.368 121.344 0 37.888-19.456 74.752-58.368 110.08-20.992 18.944-22.528 51.2-3.584 72.192 10.24 11.264 24.064 16.896 37.888 16.896 12.288 0 24.576-4.608 34.304-13.312 61.44-55.296 92.16-117.76 92.16-185.856 0-112.64-88.576-193.536-92.16-197.12z" fill="" p-id="2434"></path><path d="M853.504 166.4c-20.992-18.944-53.248-16.896-72.192 4.096-18.944 20.992-16.896 53.248 4.096 72.192 1.536 1.024 135.68 122.88 135.68 280.576 0 90.624-45.568 177.152-135.68 257.536-20.992 18.944-23.04 51.2-4.096 72.192 10.24 11.264 24.064 16.896 38.4 16.896 12.288 0 24.576-4.096 34.304-12.8 112.64-100.864 169.984-212.992 169.984-333.824-1.024-202.752-163.84-350.208-170.496-356.864z"></path></svg>','<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" ><path d="M256 768H51.2c-28.16 0-51.2-23.04-51.2-51.2V308.224C0 279.552 23.552 256 52.224 256H256v512zM512 147.456v728.576c0 19.968-21.504 32.256-38.912 22.016L256 768V256l217.088-130.56c17.408-10.24 38.912 2.048 38.912 22.016zM623.104 656.896c-19.968-19.968-19.968-52.224 0-72.192l217.088-217.088c19.968-19.968 52.224-19.968 72.192 0 19.968 19.968 19.968 52.224 0 72.192l-217.088 217.088c-19.456 19.968-52.224 19.968-72.192 0z" fill="" p-id="2582"></path><path d="M623.104 367.104c19.968-19.968 52.224-19.968 72.192 0l217.088 217.088c19.968 19.968 19.968 52.224 0 72.192-19.968 19.968-52.224 19.968-72.192 0l-217.088-217.088c-19.968-19.456-19.968-52.224 0-72.192z"></path></svg>'];
8
+
9
+ export function video(pen: Pen) {
10
+ if (!pen.onDestroy) {
11
+ pen.onDestroy = destory;
12
+ pen.onMove = move;
13
+ pen.onResize = move;
14
+ pen.onRotate = move;
15
+ pen.onClick = click;
16
+ pen.onValue = value;
17
+ pen.onChangeId = changeId;
18
+ }
19
+
20
+ if (!videos[pen.id]) {
21
+ const player = document.createElement('div');
22
+
23
+ const progress = document.createElement('div');
24
+ progress.style.position = 'absolute';
25
+ progress.style.outline = 'none';
26
+ progress.style.left = '0';
27
+ progress.style.bottom = '0';
28
+ progress.style.width = '0';
29
+ progress.style.height = '2px';
30
+ progress.style.background = '#52c41a';
31
+ progress.style.zIndex = '1';
32
+ if((pen as any).hideProgress){
33
+ progress.style.display = 'none';
34
+ }
35
+ const muted = document.createElement('div');
36
+ muted.innerHTML = mutedIcons[1];
37
+ muted.style.position = 'absolute';
38
+ muted.style.right = '0';
39
+ muted.style.bottom = '0';
40
+ muted.style.width = '20px';
41
+ muted.style.height = '20px';
42
+ muted.style.fill = 'hsla(0, 0%, 100%, .8)';
43
+ muted.style.zIndex = '1';
44
+ muted.style.display = 'none';
45
+ player.appendChild(progress);
46
+ player.appendChild(muted);
47
+
48
+ muted.onclick = (e)=>{
49
+ e.stopPropagation();
50
+ if(pen.calculative.media.muted){
51
+ muted.innerHTML = mutedIcons[0];
52
+ pen.calculative.media.muted = false;
53
+ }else{
54
+ muted.innerHTML = mutedIcons[1];
55
+ pen.calculative.media.muted = true;
56
+ }
57
+ }
58
+ if(!pen.calculative.singleton){
59
+ pen.calculative.singleton = {};
60
+ }
61
+ pen.calculative.singleton.muted = muted;
62
+ player.onmouseenter = (e)=>{
63
+ muted.style.display = 'block';
64
+ }
65
+ player.onmouseleave = (e)=>{
66
+ muted.style.display = 'none';
67
+ }
68
+ player.onclick = (e)=>{
69
+ e.stopPropagation();
70
+ click(pen);
71
+ }
72
+ let media: HTMLMediaElement;
73
+ if (pen.video) {
74
+ media = document.createElement('video');
75
+ media.src = pen.video;
76
+ } else if (pen.audio) {
77
+ media = document.createElement('audio');
78
+ media.src = pen.audio;
79
+ }
80
+ media.loop = pen.playLoop;
81
+ media.ontimeupdate = () => {
82
+ resizeProcessWidth(progress, media, pen.calculative.worldRect.width);
83
+ };
84
+ media.onended = () => {
85
+ pen.calculative.onended && pen.calculative.onended(pen);
86
+ };
87
+ pen.calculative.media = media;
88
+ media.style.position = 'absolute';
89
+ media.style.outline = 'none';
90
+ media.style.left = '0';
91
+ media.style.top = '0';
92
+ media.style.width = '100%';
93
+ media.style.height = '100%';
94
+ player.appendChild(media);
95
+ videos[pen.id] = player;
96
+ pen.calculative.canvas.externalElements?.parentElement.appendChild(player);
97
+ setElemPosition(pen, player);
98
+ if (pen.autoPlay) {
99
+ media.autoplay = true;
100
+ media.muted = true;
101
+ }
102
+ } else if (
103
+ pen.video &&
104
+ pen.calculative.media &&
105
+ pen.video !== pen.calculative.video
106
+ ) {
107
+ console.warn('video 更改, 此处是否执行?');
108
+ pen.calculative.media.src = pen.video;
109
+ if (pen.autoPlay) {
110
+ pen.calculative.media.muted = true;
111
+ pen.calculative.media.autoplay = true;
112
+ }
113
+ pen.calculative.media.loop = pen.playLoop;
114
+ pen.calculative.video = pen.video;
115
+ } else if (
116
+ pen.audio &&
117
+ pen.calculative.media &&
118
+ pen.audio !== pen.calculative.audio
119
+ ) {
120
+ pen.calculative.media.src = pen.audio;
121
+ if (pen.autoPlay) {
122
+ pen.calculative.media.muted = true;
123
+ pen.calculative.media.autoplay = true;
124
+ }
125
+ pen.calculative.media.loop = pen.playLoop;
126
+ pen.calculative.audio = pen.audio;
127
+ }
128
+ if (pen.calculative.patchFlags) {
129
+ setElemPosition(pen, videos[pen.id]);
130
+ }
131
+ return new Path2D();
132
+ }
133
+
134
+ function destory(pen: Pen) {
135
+ videos[pen.id].onclick = null;
136
+ videos[pen.id].remove();
137
+ videos[pen.id] = undefined;
138
+ }
139
+
140
+ function move(pen: Pen) {
141
+ setElemPosition(pen, videos[pen.id]);
142
+ const progress = videos[pen.id].children[0];
143
+ const media = videos[pen.id].children[1];
144
+ resizeProcessWidth(
145
+ progress as HTMLDivElement,
146
+ media as HTMLMediaElement,
147
+ pen.calculative.worldRect.width
148
+ );
149
+ }
150
+
151
+ function click(pen: Pen) {
152
+ if (pen.calculative.media) {
153
+ pen.calculative.media.muted = false;
154
+ pen.calculative.singleton.muted.innerHTML = mutedIcons[0];
155
+ if (pen.calculative.media.paused) {
156
+ pen.calculative.media.play();
157
+ } else {
158
+ pen.calculative.media.pause();
159
+ }
160
+ }
161
+ }
162
+ function resizeProcessWidth(
163
+ progress: HTMLDivElement,
164
+ media: HTMLMediaElement,
165
+ width: number
166
+ ) {
167
+ // worldRect 会重新赋值,而 pen 不会变,这里才能取到实时的 worldRect
168
+ progress.style.width = (media.currentTime / media.duration) * width + 'px';
169
+ }
170
+
171
+ function changeId(pen: Pen, oldId: string, newId: string) {
172
+ if (!videos[oldId]) {
173
+ return;
174
+ }
175
+ videos[newId] = videos[oldId];
176
+ delete videos[oldId];
177
+ }
178
+
179
+ function value(pen: Pen) {
180
+ const video = videos[pen.id];
181
+ if (!video) {
182
+ return;
183
+ }
184
+ setElemPosition(pen, video);
185
+ const currentSrc = pen.calculative.media.getAttribute('src');
186
+ if (pen.video) {
187
+ if (currentSrc !== pen.video) {
188
+ pen.calculative.media.src = pen.video;
189
+ }
190
+ } else if (pen.audio) {
191
+ if (currentSrc !== pen.audio) {
192
+ pen.calculative.media.src = pen.audio;
193
+ }
194
+ }
195
+ // TODO: 下面每次都改动,是否影响性能?
196
+ if (pen.autoPlay) {
197
+ pen.calculative.media.muted = true;
198
+ // TODO: 自动播放何时关?
199
+ pen.calculative.media.autoplay = true;
200
+ }
201
+ pen.calculative.media.loop = pen.playLoop;
202
+ }