@visactor/vrender-core 0.20.0-alpha.0 → 0.20.0-alpha.1

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 (248) hide show
  1. package/cjs/allocator/matrix-allocate.d.ts +1 -1
  2. package/cjs/allocator/matrix-allocate.js +2 -4
  3. package/cjs/allocator/matrix-allocate.js.map +1 -1
  4. package/cjs/animate/animate.js +4 -2
  5. package/cjs/animate/animate.js.map +1 -1
  6. package/cjs/animate/custom-animate.d.ts +5 -16
  7. package/cjs/animate/custom-animate.js +9 -62
  8. package/cjs/animate/custom-animate.js.map +1 -1
  9. package/cjs/animate/group-fade.d.ts +16 -0
  10. package/cjs/animate/group-fade.js +66 -0
  11. package/cjs/animate/group-fade.js.map +1 -0
  12. package/cjs/animate/index.d.ts +1 -0
  13. package/cjs/animate/index.js +2 -1
  14. package/cjs/animate/index.js.map +1 -1
  15. package/cjs/canvas/util.d.ts +0 -1
  16. package/cjs/canvas/util.js +7 -17
  17. package/cjs/canvas/util.js.map +1 -1
  18. package/cjs/common/3d-interceptor.d.ts +3 -0
  19. package/cjs/common/3d-interceptor.js +51 -0
  20. package/cjs/common/3d-interceptor.js.map +1 -0
  21. package/cjs/common/bezier-utils.js +2 -1
  22. package/cjs/common/bounds-context.js +1 -2
  23. package/cjs/common/canvas-utils.d.ts +1 -1
  24. package/cjs/common/canvas-utils.js +15 -30
  25. package/cjs/common/canvas-utils.js.map +1 -1
  26. package/cjs/common/matrix.d.ts +11 -3
  27. package/cjs/common/matrix.js +97 -19
  28. package/cjs/common/matrix.js.map +1 -1
  29. package/cjs/common/morphing-utils.js +1 -1
  30. package/cjs/common/path-svg.js +1 -1
  31. package/cjs/common/polygon.js +2 -2
  32. package/cjs/common/rect-utils.js +1 -1
  33. package/cjs/common/render-area.js +1 -1
  34. package/cjs/common/render-command-list.js +1 -1
  35. package/cjs/common/render-curve.js +23 -33
  36. package/cjs/common/render-curve.js.map +1 -1
  37. package/cjs/common/render-utils.js +2 -1
  38. package/cjs/common/seg-context.js +1 -1
  39. package/cjs/common/simplify.js +1 -1
  40. package/cjs/common/sort.js +16 -13
  41. package/cjs/common/sort.js.map +1 -1
  42. package/cjs/common/split-path.js +1 -1
  43. package/cjs/common/store.js +1 -1
  44. package/cjs/common/text.d.ts +0 -2
  45. package/cjs/common/text.js +4 -11
  46. package/cjs/common/text.js.map +1 -1
  47. package/cjs/common/utils.js +1 -1
  48. package/cjs/common/utils.js.map +1 -1
  49. package/cjs/core/application.js +1 -2
  50. package/cjs/core/camera.js +4 -4
  51. package/cjs/core/camera.js.map +1 -1
  52. package/cjs/core/constants.js +1 -1
  53. package/cjs/core/core-modules.js +1 -1
  54. package/cjs/core/global-module.js +0 -2
  55. package/cjs/core/global.js +1 -1
  56. package/cjs/core/graphic-utils.js +1 -1
  57. package/cjs/core/index.js +1 -1
  58. package/cjs/core/layer-service.js +1 -1
  59. package/cjs/core/layer.js +1 -1
  60. package/cjs/core/light.js +1 -1
  61. package/cjs/core/stage.js +15 -9
  62. package/cjs/core/stage.js.map +1 -1
  63. package/cjs/core/window.js +1 -1
  64. package/cjs/graphic/builtin-symbol/utils.js +1 -5
  65. package/cjs/graphic/builtin-symbol/utils.js.map +1 -1
  66. package/cjs/graphic/config.js +1 -0
  67. package/cjs/graphic/config.js.map +1 -1
  68. package/cjs/graphic/graphic-service/graphic-service.d.ts +2 -8
  69. package/cjs/graphic/graphic-service/graphic-service.js +17 -107
  70. package/cjs/graphic/graphic-service/graphic-service.js.map +1 -1
  71. package/cjs/graphic/richtext/utils.js +12 -21
  72. package/cjs/graphic/richtext/utils.js.map +1 -1
  73. package/cjs/graphic/richtext.d.ts +1 -1
  74. package/cjs/graphic/richtext.js +2 -2
  75. package/cjs/graphic/richtext.js.map +1 -1
  76. package/cjs/graphic/text.js +1 -1
  77. package/cjs/graphic/text.js.map +1 -1
  78. package/cjs/index.d.ts +1 -0
  79. package/cjs/index.js +3 -3
  80. package/cjs/index.js.map +1 -1
  81. package/cjs/interface/graphic/group.d.ts +1 -1
  82. package/cjs/interface/graphic/group.js.map +1 -1
  83. package/cjs/interface/graphic/richText.d.ts +1 -0
  84. package/cjs/interface/graphic/richText.js.map +1 -1
  85. package/cjs/picker/pick-interceptor.d.ts +1 -1
  86. package/cjs/picker/pick-interceptor.js +2 -42
  87. package/cjs/picker/pick-interceptor.js.map +1 -1
  88. package/cjs/picker/picker-service.js +4 -5
  89. package/cjs/picker/picker-service.js.map +1 -1
  90. package/cjs/plugins/builtin-plugin/edit-module.d.ts +22 -0
  91. package/cjs/plugins/builtin-plugin/edit-module.js +94 -0
  92. package/cjs/plugins/builtin-plugin/edit-module.js.map +1 -0
  93. package/cjs/plugins/builtin-plugin/html-attribute-plugin.js +1 -1
  94. package/cjs/plugins/builtin-plugin/html-attribute-plugin.js.map +1 -1
  95. package/cjs/plugins/builtin-plugin/react-attribute-plugin.d.ts +2 -1
  96. package/cjs/plugins/builtin-plugin/react-attribute-plugin.js +15 -7
  97. package/cjs/plugins/builtin-plugin/react-attribute-plugin.js.map +1 -1
  98. package/cjs/plugins/builtin-plugin/richtext-edit-plugin.d.ts +76 -0
  99. package/cjs/plugins/builtin-plugin/richtext-edit-plugin.js +338 -0
  100. package/cjs/plugins/builtin-plugin/richtext-edit-plugin.js.map +1 -0
  101. package/cjs/render/contributions/render/arc-render.js +1 -4
  102. package/cjs/render/contributions/render/arc-render.js.map +1 -1
  103. package/cjs/render/contributions/render/area-render.js +1 -1
  104. package/cjs/render/contributions/render/area-render.js.map +1 -1
  105. package/cjs/render/contributions/render/base-3d-render.d.ts +10 -0
  106. package/cjs/render/contributions/render/base-3d-render.js +63 -0
  107. package/cjs/render/contributions/render/base-3d-render.js.map +1 -0
  108. package/cjs/render/contributions/render/base-render.js +5 -5
  109. package/cjs/render/contributions/render/base-render.js.map +1 -1
  110. package/cjs/render/contributions/render/draw-interceptor.js +7 -51
  111. package/cjs/render/contributions/render/draw-interceptor.js.map +1 -1
  112. package/cjs/render/contributions/render/group-render.js +4 -5
  113. package/cjs/render/contributions/render/group-render.js.map +1 -1
  114. package/cjs/render/contributions/render/pyramid3d-render.d.ts +3 -5
  115. package/cjs/render/contributions/render/pyramid3d-render.js +4 -54
  116. package/cjs/render/contributions/render/pyramid3d-render.js.map +1 -1
  117. package/cjs/render/contributions/render/rect3d-render.d.ts +3 -5
  118. package/cjs/render/contributions/render/rect3d-render.js +4 -53
  119. package/cjs/render/contributions/render/rect3d-render.js.map +1 -1
  120. package/cjs/render/contributions/render/symbol-render.js +9 -18
  121. package/cjs/render/contributions/render/symbol-render.js.map +1 -1
  122. package/cjs/render/contributions/render/utils.js +2 -5
  123. package/cjs/render/contributions/render/utils.js.map +1 -1
  124. package/dist/index.es.js +1288 -978
  125. package/es/allocator/matrix-allocate.d.ts +1 -1
  126. package/es/allocator/matrix-allocate.js +3 -3
  127. package/es/allocator/matrix-allocate.js.map +1 -1
  128. package/es/animate/animate.js +4 -2
  129. package/es/animate/animate.js.map +1 -1
  130. package/es/animate/custom-animate.d.ts +5 -16
  131. package/es/animate/custom-animate.js +9 -58
  132. package/es/animate/custom-animate.js.map +1 -1
  133. package/es/animate/group-fade.d.ts +16 -0
  134. package/es/animate/group-fade.js +56 -0
  135. package/es/animate/group-fade.js.map +1 -0
  136. package/es/animate/index.d.ts +1 -0
  137. package/es/animate/index.js +2 -0
  138. package/es/animate/index.js.map +1 -1
  139. package/es/canvas/util.d.ts +0 -1
  140. package/es/canvas/util.js +7 -17
  141. package/es/canvas/util.js.map +1 -1
  142. package/es/common/3d-interceptor.d.ts +3 -0
  143. package/es/common/3d-interceptor.js +47 -0
  144. package/es/common/3d-interceptor.js.map +1 -0
  145. package/es/common/bezier-utils.js +2 -1
  146. package/es/common/bounds-context.js +1 -2
  147. package/es/common/canvas-utils.d.ts +1 -1
  148. package/es/common/canvas-utils.js +15 -30
  149. package/es/common/canvas-utils.js.map +1 -1
  150. package/es/common/matrix.d.ts +11 -3
  151. package/es/common/matrix.js +90 -17
  152. package/es/common/matrix.js.map +1 -1
  153. package/es/common/morphing-utils.js +1 -1
  154. package/es/common/path-svg.js +1 -1
  155. package/es/common/polygon.js +1 -1
  156. package/es/common/rect-utils.js +1 -1
  157. package/es/common/render-area.js +1 -1
  158. package/es/common/render-command-list.js +1 -1
  159. package/es/common/render-curve.js +23 -33
  160. package/es/common/render-curve.js.map +1 -1
  161. package/es/common/render-utils.js +2 -1
  162. package/es/common/seg-context.js +1 -1
  163. package/es/common/simplify.js +1 -1
  164. package/es/common/sort.js +16 -13
  165. package/es/common/sort.js.map +1 -1
  166. package/es/common/split-path.js +1 -1
  167. package/es/common/store.js +1 -1
  168. package/es/common/text.d.ts +0 -2
  169. package/es/common/text.js +1 -7
  170. package/es/common/text.js.map +1 -1
  171. package/es/common/utils.js +1 -1
  172. package/es/common/utils.js.map +1 -1
  173. package/es/core/application.js +1 -2
  174. package/es/core/camera.js +6 -4
  175. package/es/core/camera.js.map +1 -1
  176. package/es/core/constants.js +1 -1
  177. package/es/core/core-modules.js +1 -1
  178. package/es/core/global-module.js +0 -2
  179. package/es/core/global.js +1 -1
  180. package/es/core/graphic-utils.js +1 -1
  181. package/es/core/index.js +1 -1
  182. package/es/core/layer-service.js +1 -1
  183. package/es/core/layer.js +1 -1
  184. package/es/core/light.js +1 -1
  185. package/es/core/stage.js +15 -9
  186. package/es/core/stage.js.map +1 -1
  187. package/es/core/window.js +1 -1
  188. package/es/graphic/builtin-symbol/utils.js +1 -4
  189. package/es/graphic/builtin-symbol/utils.js.map +1 -1
  190. package/es/graphic/config.js +1 -0
  191. package/es/graphic/config.js.map +1 -1
  192. package/es/graphic/graphic-service/graphic-service.d.ts +2 -8
  193. package/es/graphic/graphic-service/graphic-service.js +9 -97
  194. package/es/graphic/graphic-service/graphic-service.js.map +1 -1
  195. package/es/graphic/richtext/utils.js +9 -20
  196. package/es/graphic/richtext/utils.js.map +1 -1
  197. package/es/graphic/richtext.d.ts +1 -1
  198. package/es/graphic/richtext.js +2 -2
  199. package/es/graphic/richtext.js.map +1 -1
  200. package/es/graphic/text.js +2 -2
  201. package/es/graphic/text.js.map +1 -1
  202. package/es/index.d.ts +1 -0
  203. package/es/index.js +2 -0
  204. package/es/index.js.map +1 -1
  205. package/es/interface/graphic/group.d.ts +1 -1
  206. package/es/interface/graphic/group.js.map +1 -1
  207. package/es/interface/graphic/richText.d.ts +1 -0
  208. package/es/interface/graphic/richText.js.map +1 -1
  209. package/es/picker/pick-interceptor.d.ts +1 -1
  210. package/es/picker/pick-interceptor.js +4 -44
  211. package/es/picker/pick-interceptor.js.map +1 -1
  212. package/es/picker/picker-service.js +1 -1
  213. package/es/picker/picker-service.js.map +1 -1
  214. package/es/plugins/builtin-plugin/edit-module.d.ts +22 -0
  215. package/es/plugins/builtin-plugin/edit-module.js +86 -0
  216. package/es/plugins/builtin-plugin/edit-module.js.map +1 -0
  217. package/es/plugins/builtin-plugin/html-attribute-plugin.js +1 -1
  218. package/es/plugins/builtin-plugin/html-attribute-plugin.js.map +1 -1
  219. package/es/plugins/builtin-plugin/react-attribute-plugin.d.ts +2 -1
  220. package/es/plugins/builtin-plugin/react-attribute-plugin.js +15 -7
  221. package/es/plugins/builtin-plugin/react-attribute-plugin.js.map +1 -1
  222. package/es/plugins/builtin-plugin/richtext-edit-plugin.d.ts +76 -0
  223. package/es/plugins/builtin-plugin/richtext-edit-plugin.js +334 -0
  224. package/es/plugins/builtin-plugin/richtext-edit-plugin.js.map +1 -0
  225. package/es/render/contributions/render/arc-render.js +1 -4
  226. package/es/render/contributions/render/arc-render.js.map +1 -1
  227. package/es/render/contributions/render/area-render.js +1 -1
  228. package/es/render/contributions/render/area-render.js.map +1 -1
  229. package/es/render/contributions/render/base-3d-render.d.ts +10 -0
  230. package/es/render/contributions/render/base-3d-render.js +57 -0
  231. package/es/render/contributions/render/base-3d-render.js.map +1 -0
  232. package/es/render/contributions/render/base-render.js +3 -1
  233. package/es/render/contributions/render/base-render.js.map +1 -1
  234. package/es/render/contributions/render/draw-interceptor.js +7 -51
  235. package/es/render/contributions/render/draw-interceptor.js.map +1 -1
  236. package/es/render/contributions/render/group-render.js +3 -1
  237. package/es/render/contributions/render/group-render.js.map +1 -1
  238. package/es/render/contributions/render/pyramid3d-render.d.ts +3 -5
  239. package/es/render/contributions/render/pyramid3d-render.js +4 -56
  240. package/es/render/contributions/render/pyramid3d-render.js.map +1 -1
  241. package/es/render/contributions/render/rect3d-render.d.ts +3 -5
  242. package/es/render/contributions/render/rect3d-render.js +4 -55
  243. package/es/render/contributions/render/rect3d-render.js.map +1 -1
  244. package/es/render/contributions/render/symbol-render.js +9 -18
  245. package/es/render/contributions/render/symbol-render.js.map +1 -1
  246. package/es/render/contributions/render/utils.js +2 -5
  247. package/es/render/contributions/render/utils.js.map +1 -1
  248. package/package.json +4 -4
@@ -0,0 +1,334 @@
1
+ import { isObject, isString, merge } from "@visactor/vutils";
2
+
3
+ import { Generator } from "../../common/generator";
4
+
5
+ import { createGroup, createLine, createRect } from "../../graphic";
6
+
7
+ import { EditModule, findCursorIndexIgnoreLinebreak } from "./edit-module";
8
+
9
+ class Selection {
10
+ constructor(cacheSelectionStartCursorIdx, cacheCurCursorIdx, selectionStartCursorIdx, curCursorIdx, rt) {
11
+ this.curCursorIdx = curCursorIdx, this.selectionStartCursorIdx = selectionStartCursorIdx,
12
+ this.cacheCurCursorIdx = cacheCurCursorIdx, this.cacheSelectionStartCursorIdx = cacheSelectionStartCursorIdx,
13
+ this.rt = rt;
14
+ }
15
+ hasFormat(key) {
16
+ return null != this.getFormat(key);
17
+ }
18
+ getFormat(key) {
19
+ if (!this.rt) return null;
20
+ const config = this.rt.attribute.textConfig, val = config[this.selectionStartCursorIdx + 1][key];
21
+ if (null == val) return null;
22
+ for (let i = this.selectionStartCursorIdx + 2; i <= this.curCursorIdx; i++) {
23
+ if (val !== config[i][key]) return null;
24
+ }
25
+ return val;
26
+ }
27
+ getAllFormat(key) {
28
+ if (!this.rt) return [];
29
+ const config = this.rt.attribute.textConfig, val = config[this.selectionStartCursorIdx + 1][key], set = new Set;
30
+ set.add(val);
31
+ for (let i = this.selectionStartCursorIdx + 2; i <= this.curCursorIdx; i++) {
32
+ const item = config[i];
33
+ set.add(item[key]);
34
+ }
35
+ return Array.from(set.values());
36
+ }
37
+ }
38
+
39
+ export const FORMAT_TEXT_COMMAND = "FORMAT_TEXT_COMMAND";
40
+
41
+ export const FORMAT_ELEMENT_COMMAND = "FORMAT_ELEMENT_COMMAND";
42
+
43
+ export class RichTextEditPlugin {
44
+ constructor() {
45
+ this.name = "RichTextEditPlugin", this.activeEvent = "onRegister", this._uid = Generator.GenAutoIncrementId(),
46
+ this.key = this.name + this._uid, this.editing = !1, this.pointerDown = !1, this.handleInput = (text, isComposing, cursorIdx, rt, orient) => {
47
+ const p = this.getPointByColumnIdx(cursorIdx, rt, orient);
48
+ this.hideSelection(), this.setCursor(p.x, p.y1, p.y2), this.updateCbs.forEach((cb => cb("input", this)));
49
+ }, this.handleChange = (text, isComposing, cursorIdx, rt, orient) => {
50
+ const p = this.getPointByColumnIdx(cursorIdx, rt, orient);
51
+ this.curCursorIdx = cursorIdx, this.selectionStartCursorIdx = cursorIdx, this.setCursorAndTextArea(p.x, p.y1, p.y2, rt),
52
+ this.hideSelection(), this.updateCbs.forEach((cb => cb("change", this)));
53
+ }, this.handleMove = e => {
54
+ this.isRichtext(e) && (this.currRt = e.target, this.handleEnter(e), e.target.once("pointerleave", this.handleLeave),
55
+ this.showSelection(e));
56
+ }, this.handlePointerDown = e => {
57
+ this.editing ? this.onFocus(e) : this.deFocus(e), this.applyUpdate(), this.pointerDown = !0,
58
+ this.updateCbs.forEach((cb => cb(this.editing ? "onfocus" : "defocus", this)));
59
+ }, this.handlePointerUp = e => {
60
+ this.pointerDown = !1;
61
+ }, this.handleEnter = e => {
62
+ this.editing = !0, this.pluginService.stage.setCursor("text");
63
+ }, this.handleLeave = e => {
64
+ this.editing = !1, this.pluginService.stage.setCursor("default");
65
+ }, this.commandCbs = new Map, this.commandCbs.set(FORMAT_TEXT_COMMAND, [ this.formatTextCommandCb ]),
66
+ this.updateCbs = [];
67
+ }
68
+ getSelection() {
69
+ return this.selectionStartCursorIdx && this.curCursorIdx && this.selectionStartCursorIdx !== this.curCursorIdx && this.currRt ? new Selection(this.selectionStartCursorIdx, this.curCursorIdx, findCursorIndexIgnoreLinebreak(this.currRt.attribute.textConfig, this.selectionStartCursorIdx), findCursorIndexIgnoreLinebreak(this.currRt.attribute.textConfig, this.curCursorIdx), this.currRt) : null;
70
+ }
71
+ formatTextCommandCb(payload, p) {
72
+ const rt = p.currRt;
73
+ if (!rt) return;
74
+ const selectionData = p.getSelection();
75
+ if (!selectionData) return;
76
+ const {selectionStartCursorIdx: selectionStartCursorIdx, curCursorIdx: curCursorIdx} = selectionData, config = rt.attribute.textConfig.slice(selectionStartCursorIdx + 1, curCursorIdx + 1);
77
+ "bold" === payload ? config.forEach((item => item.fontWeight = "bold")) : "italic" === payload ? config.forEach((item => item.fontStyle = "italic")) : "underline" === payload ? config.forEach((item => item.underline = !0)) : "lineThrough" === payload ? config.forEach((item => item.lineThrough = !0)) : isObject(payload) && config.forEach((item => merge(item, payload))),
78
+ rt.setAttributes(rt.attribute);
79
+ }
80
+ dispatchCommand(command, payload) {
81
+ const cbs = this.commandCbs.get(command);
82
+ cbs && cbs.forEach((cb => cb(payload, this))), this.updateCbs.forEach((cb => cb("dispatch", this)));
83
+ }
84
+ registerCommand(command, cb) {
85
+ (this.commandCbs.get(command) || []).push(cb);
86
+ }
87
+ registerUpdateListener(cb) {
88
+ (this.updateCbs || []).push(cb);
89
+ }
90
+ activate(context) {
91
+ this.pluginService = context, this.editModule = new EditModule, context.stage.on("pointermove", this.handleMove),
92
+ context.stage.on("pointerdown", this.handlePointerDown), context.stage.on("pointerup", this.handlePointerUp),
93
+ context.stage.on("pointerleave", this.handlePointerUp), this.editModule.onInput(this.handleInput),
94
+ this.editModule.onChange(this.handleChange);
95
+ }
96
+ showSelection(e) {
97
+ const cache = e.target.getFrameCache();
98
+ if (cache && this.editBg && this.pointerDown) {
99
+ let p0 = this.lastPoint, p1 = this.getEventPosition(e), line1Info = this.getLineByPoint(cache, p1);
100
+ const column1 = this.getColumnByLinePoint(line1Info, p1), y1 = line1Info.top, y2 = line1Info.top + line1Info.height;
101
+ let x = column1.left + column1.width, cursorIndex = this.getColumnIndex(cache, column1);
102
+ p1.x < column1.left + column1.width / 2 && (x = column1.left, cursorIndex -= 1),
103
+ p1.x = x, p1.y = (y1 + y2) / 2;
104
+ let line0Info = this.getLineByPoint(cache, p0);
105
+ if ((p0.y > p1.y || p0.y === p1.y && p0.x > p1.x) && ([p0, p1] = [ p1, p0 ], [line1Info, line0Info] = [ line0Info, line1Info ]),
106
+ this.editBg.removeAllChild(), line0Info === line1Info) {
107
+ const column0 = this.getColumnByLinePoint(line0Info, p0);
108
+ this.editBg.setAttributes({
109
+ x: p0.x,
110
+ y: line0Info.top,
111
+ width: p1.x - p0.x,
112
+ height: column0.height,
113
+ fill: "#336df4",
114
+ fillOpacity: .2
115
+ });
116
+ } else {
117
+ this.editBg.setAttributes({
118
+ x: 0,
119
+ y: line0Info.top,
120
+ width: 0,
121
+ height: 0
122
+ });
123
+ const startIdx = cache.lines.findIndex((item => item === line0Info)), endIdx = cache.lines.findIndex((item => item === line1Info));
124
+ let y = 0;
125
+ for (let i = startIdx; i <= endIdx; i++) {
126
+ const line = cache.lines[i];
127
+ if (i === startIdx) {
128
+ const p = line.paragraphs[line.paragraphs.length - 1];
129
+ this.editBg.add(createRect({
130
+ x: p0.x,
131
+ y: y,
132
+ width: p.left + p.width - p0.x,
133
+ height: line.height,
134
+ fill: "#336df4",
135
+ fillOpacity: .2
136
+ }));
137
+ } else if (i === endIdx) {
138
+ const p = line.paragraphs[0];
139
+ this.editBg.add(createRect({
140
+ x: p.left,
141
+ y: y,
142
+ width: p1.x - p.left,
143
+ height: line.height,
144
+ fill: "#336df4",
145
+ fillOpacity: .2
146
+ }));
147
+ } else {
148
+ const p0 = line.paragraphs[0], p1 = line.paragraphs[line.paragraphs.length - 1];
149
+ this.editBg.add(createRect({
150
+ x: p0.left,
151
+ y: y,
152
+ width: p1.left + p1.width - p0.left,
153
+ height: line.height,
154
+ fill: "#336df4",
155
+ fillOpacity: .2
156
+ }));
157
+ }
158
+ y += line.height;
159
+ }
160
+ }
161
+ this.curCursorIdx = cursorIndex, this.setCursorAndTextArea(x, y1 + 2, y2 - 2, e.target),
162
+ this.applyUpdate(), this.updateCbs.forEach((cb => cb("selection", this)));
163
+ }
164
+ }
165
+ hideSelection() {
166
+ this.editBg && (this.editBg.removeAllChild(), this.editBg.setAttributes({
167
+ fill: "transparent"
168
+ }));
169
+ }
170
+ isRichtext(e) {
171
+ return !(!e.target || "richtext" !== e.target.type || !e.target.attribute.editable);
172
+ }
173
+ getEventPosition(e) {
174
+ const p = this.pluginService.stage.eventPointTransform(e), p1 = {
175
+ x: 0,
176
+ y: 0
177
+ };
178
+ return e.target.globalTransMatrix.transformPoint(p, p1), p1;
179
+ }
180
+ getLineByPoint(cache, p1) {
181
+ let lineInfo = cache.lines[0];
182
+ for (let i = 0; i < cache.lines.length && !(lineInfo.top <= p1.y && lineInfo.top + lineInfo.height >= p1.y); i++) lineInfo = cache.lines[i + 1];
183
+ return lineInfo;
184
+ }
185
+ getColumnByLinePoint(lineInfo, p1) {
186
+ let columnInfo = lineInfo.paragraphs[0];
187
+ for (let i = 0; i < lineInfo.paragraphs.length && !(columnInfo.left <= p1.x && columnInfo.left + columnInfo.width >= p1.x); i++) columnInfo = lineInfo.paragraphs[i];
188
+ return columnInfo;
189
+ }
190
+ onFocus(e) {
191
+ this.deFocus(e);
192
+ const target = e.target;
193
+ this.tryUpdateRichtext(target);
194
+ const shadowRoot = target.attachShadow();
195
+ shadowRoot.setAttributes({
196
+ shadowRootIdx: -1
197
+ });
198
+ const cache = target.getFrameCache();
199
+ if (!cache) return;
200
+ if (!this.editLine) {
201
+ const line = createLine({
202
+ x: 0,
203
+ y: 0,
204
+ lineWidth: 1,
205
+ stroke: "black"
206
+ });
207
+ line.animate().to({
208
+ opacity: 1
209
+ }, 10, "linear").wait(700).to({
210
+ opacity: 0
211
+ }, 10, "linear").wait(700).loop(1 / 0), this.editLine = line;
212
+ const g = createGroup({
213
+ x: 0,
214
+ y: 0,
215
+ width: 0,
216
+ height: 0
217
+ });
218
+ this.editBg = g, shadowRoot.add(this.editLine), shadowRoot.add(this.editBg);
219
+ }
220
+ const p1 = this.getEventPosition(e), lineInfo = this.getLineByPoint(cache, p1);
221
+ if (lineInfo) {
222
+ const columnInfo = this.getColumnByLinePoint(lineInfo, p1);
223
+ if (!columnInfo) return;
224
+ let y1 = lineInfo.top, y2 = lineInfo.top + lineInfo.height, x = columnInfo.left + columnInfo.width;
225
+ y1 += 2, y2 -= 2;
226
+ let cursorIndex = this.getColumnIndex(cache, columnInfo);
227
+ p1.x < columnInfo.left + columnInfo.width / 2 && (x = columnInfo.left, cursorIndex -= 1),
228
+ this.lastPoint = {
229
+ x: x,
230
+ y: (y1 + y2) / 2
231
+ }, this.curCursorIdx = cursorIndex, this.selectionStartCursorIdx = cursorIndex,
232
+ this.setCursorAndTextArea(x, y1, y2, target);
233
+ }
234
+ }
235
+ getPointByColumnIdx(idx, rt, orient) {
236
+ const cache = rt.getFrameCache(), {lineInfo: lineInfo, columnInfo: columnInfo} = this.getColumnByIndex(cache, idx);
237
+ let y1 = lineInfo.top, y2 = lineInfo.top + lineInfo.height;
238
+ return y1 += 2, y2 -= 2, {
239
+ x: columnInfo.left + ("left" === orient ? 0 : columnInfo.width),
240
+ y1: y1,
241
+ y2: y2
242
+ };
243
+ }
244
+ getColumnIndex(cache, cInfo) {
245
+ let inputIndex = -1;
246
+ for (let i = 0; i < cache.lines.length; i++) {
247
+ const line = cache.lines[i];
248
+ for (let j = 0; j < line.paragraphs.length; j++) if (inputIndex++, cInfo === line.paragraphs[j]) return inputIndex;
249
+ }
250
+ return -1;
251
+ }
252
+ getColumnByIndex(cache, index) {
253
+ let inputIndex = -1;
254
+ for (let i = 0; i < cache.lines.length; i++) {
255
+ const lineInfo = cache.lines[i];
256
+ for (let j = 0; j < lineInfo.paragraphs.length; j++) {
257
+ const columnInfo = lineInfo.paragraphs[j];
258
+ if (inputIndex++, inputIndex === index) return {
259
+ lineInfo: lineInfo,
260
+ columnInfo: columnInfo
261
+ };
262
+ }
263
+ }
264
+ return null;
265
+ }
266
+ setCursorAndTextArea(x, y1, y2, rt) {
267
+ this.editLine.setAttributes({
268
+ points: [ {
269
+ x: x,
270
+ y: y1
271
+ }, {
272
+ x: x,
273
+ y: y2
274
+ } ]
275
+ });
276
+ const out = {
277
+ x: 0,
278
+ y: 0
279
+ };
280
+ rt.globalTransMatrix.getInverse().transformPoint({
281
+ x: x,
282
+ y: y1
283
+ }, out);
284
+ const {left: left, top: top} = this.pluginService.stage.window.getBoundingClientRect();
285
+ out.x += left, out.y += top, this.editModule.moveTo(out.x, out.y, rt, this.curCursorIdx, this.selectionStartCursorIdx);
286
+ }
287
+ setCursor(x, y1, y2) {
288
+ this.editLine.setAttributes({
289
+ points: [ {
290
+ x: x,
291
+ y: y1
292
+ }, {
293
+ x: x,
294
+ y: y2
295
+ } ]
296
+ });
297
+ }
298
+ applyUpdate() {
299
+ this.pluginService.stage.renderNextFrame();
300
+ }
301
+ deFocus(e) {
302
+ e.target.detachShadow(), this.currRt = null, this.editLine && (this.editLine.parent.removeChild(this.editLine),
303
+ this.editLine.release(), this.editLine = null, this.editBg.parent.removeChild(this.editBg),
304
+ this.editBg.release(), this.editBg = null);
305
+ }
306
+ splitText(text) {
307
+ return Array.from(text);
308
+ }
309
+ tryUpdateRichtext(richtext) {
310
+ if (!richtext.getFrameCache().lines.every((line => line.paragraphs.every((item => !(item.text && isString(item.text) && this.splitText(item.text).length > 1)))))) {
311
+ const tc = [];
312
+ richtext.attribute.textConfig.forEach((item => {
313
+ const textList = this.splitText(item.text.toString());
314
+ if (isString(item.text) && textList.length > 1) for (let i = 0; i < textList.length; i++) {
315
+ const t = textList[i];
316
+ tc.push(Object.assign(Object.assign({}, item), {
317
+ text: t
318
+ }));
319
+ } else tc.push(item);
320
+ })), richtext.setAttributes({
321
+ textConfig: tc
322
+ }), richtext.doUpdateFrameCache(tc);
323
+ }
324
+ }
325
+ onSelect() {}
326
+ deactivate(context) {
327
+ context.stage.off("pointermove", this.handleMove), context.stage.off("pointerdown", this.handlePointerDown),
328
+ context.stage.off("pointerup", this.handlePointerUp), context.stage.off("pointerleave", this.handlePointerUp);
329
+ }
330
+ release() {
331
+ this.editModule.release();
332
+ }
333
+ }
334
+ //# sourceMappingURL=richtext-edit-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/builtin-plugin/richtext-edit-plugin.ts"],"names":[],"mappings":"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","file":"richtext-edit-plugin.js","sourcesContent":["import type { IPointLike } from '@visactor/vutils';\nimport { isObject, isString, merge } from '@visactor/vutils';\nimport { Generator } from '../../common/generator';\nimport { createGroup, createLine, createRect } from '../../graphic';\nimport type {\n IGroup,\n ILine,\n IPlugin,\n IPluginService,\n IRect,\n IRichText,\n IRichTextCharacter,\n IRichTextFrame,\n IRichTextIcon,\n IRichTextLine,\n IRichTextParagraph,\n IRichTextParagraphCharacter\n} from '../../interface';\nimport { EditModule, findCursorIndexIgnoreLinebreak } from './edit-module';\n\ntype UpdateType = 'input' | 'change' | 'onfocus' | 'defocus' | 'selection' | 'dispatch';\n\nclass Selection {\n cacheSelectionStartCursorIdx: number;\n cacheCurCursorIdx: number;\n selectionStartCursorIdx: number;\n curCursorIdx: number;\n rt: IRichText;\n\n constructor(\n cacheSelectionStartCursorIdx: number,\n cacheCurCursorIdx: number,\n selectionStartCursorIdx: number,\n curCursorIdx: number,\n rt: IRichText\n ) {\n this.curCursorIdx = curCursorIdx;\n this.selectionStartCursorIdx = selectionStartCursorIdx;\n this.cacheCurCursorIdx = cacheCurCursorIdx;\n this.cacheSelectionStartCursorIdx = cacheSelectionStartCursorIdx;\n this.rt = rt;\n }\n\n hasFormat(key: string): boolean {\n return this.getFormat(key) != null;\n }\n getFormat(key: string): any {\n if (!this.rt) {\n return null;\n }\n const config = this.rt.attribute.textConfig;\n const val: any = config[this.selectionStartCursorIdx + 1][key];\n if (val == null) {\n return null;\n }\n for (let i = this.selectionStartCursorIdx + 2; i <= this.curCursorIdx; i++) {\n const item = config[i];\n if (val === item[key]) {\n continue;\n }\n return null;\n }\n return val;\n }\n\n getAllFormat(key: string): any {\n if (!this.rt) {\n return [];\n }\n const config = this.rt.attribute.textConfig;\n const val: any = config[this.selectionStartCursorIdx + 1][key];\n const set = new Set();\n set.add(val);\n for (let i = this.selectionStartCursorIdx + 2; i <= this.curCursorIdx; i++) {\n const item = config[i];\n set.add(item[key]);\n }\n const list = Array.from(set.values());\n return list;\n }\n}\n\nexport const FORMAT_TEXT_COMMAND = 'FORMAT_TEXT_COMMAND';\nexport const FORMAT_ELEMENT_COMMAND = 'FORMAT_ELEMENT_COMMAND';\nexport class RichTextEditPlugin implements IPlugin {\n name: 'RichTextEditPlugin' = 'RichTextEditPlugin';\n activeEvent: 'onRegister' = 'onRegister';\n pluginService: IPluginService;\n _uid: number = Generator.GenAutoIncrementId();\n key: string = this.name + this._uid;\n editing: boolean = false;\n editLine: ILine;\n editBg: IGroup;\n pointerDown: boolean = false;\n // 用于selection中保存上一次click时候的位置\n lastPoint?: IPointLike;\n editModule: EditModule;\n currRt: IRichText;\n\n // 当前的cursor信息\n curCursorIdx: number;\n selectionStartCursorIdx: number;\n\n commandCbs: Map<string, Array<(payload: any, p: RichTextEditPlugin) => void>>;\n updateCbs: Array<(type: UpdateType, p: RichTextEditPlugin) => void>;\n\n constructor() {\n this.commandCbs = new Map();\n this.commandCbs.set(FORMAT_TEXT_COMMAND, [this.formatTextCommandCb]);\n this.updateCbs = [];\n }\n\n getSelection() {\n if (\n this.selectionStartCursorIdx &&\n this.curCursorIdx &&\n this.selectionStartCursorIdx !== this.curCursorIdx &&\n this.currRt\n ) {\n return new Selection(\n this.selectionStartCursorIdx,\n this.curCursorIdx,\n findCursorIndexIgnoreLinebreak(this.currRt.attribute.textConfig, this.selectionStartCursorIdx),\n findCursorIndexIgnoreLinebreak(this.currRt.attribute.textConfig, this.curCursorIdx),\n this.currRt\n );\n }\n return null;\n }\n\n /* command */\n formatTextCommandCb(payload: string, p: RichTextEditPlugin) {\n const rt = p.currRt;\n if (!rt) {\n return;\n }\n const selectionData = p.getSelection();\n if (!selectionData) {\n return;\n }\n const { selectionStartCursorIdx, curCursorIdx } = selectionData;\n const config = rt.attribute.textConfig.slice(selectionStartCursorIdx + 1, curCursorIdx + 1);\n if (payload === 'bold') {\n config.forEach((item: IRichTextParagraphCharacter) => (item.fontWeight = 'bold'));\n } else if (payload === 'italic') {\n config.forEach((item: IRichTextParagraphCharacter) => (item.fontStyle = 'italic'));\n } else if (payload === 'underline') {\n config.forEach((item: IRichTextParagraphCharacter) => (item.underline = true));\n } else if (payload === 'lineThrough') {\n config.forEach((item: IRichTextParagraphCharacter) => (item.lineThrough = true));\n } else if (isObject(payload)) {\n config.forEach((item: IRichTextParagraphCharacter) => merge(item, payload));\n }\n rt.setAttributes(rt.attribute);\n }\n\n dispatchCommand(command: string, payload: any) {\n const cbs = this.commandCbs.get(command);\n cbs && cbs.forEach(cb => cb(payload, this));\n this.updateCbs.forEach(cb => cb('dispatch', this));\n }\n\n registerCommand(command: string, cb: (payload: any, p: RichTextEditPlugin) => void) {\n const cbs: Array<(payload: any, p: RichTextEditPlugin) => void> = this.commandCbs.get(command) || [];\n cbs.push(cb);\n }\n\n registerUpdateListener(cb: (type: UpdateType, p: RichTextEditPlugin) => void) {\n const cbs = this.updateCbs || [];\n cbs.push(cb);\n }\n\n activate(context: IPluginService): void {\n this.pluginService = context;\n this.editModule = new EditModule();\n // context.stage.on('click', this.handleClick);\n context.stage.on('pointermove', this.handleMove);\n context.stage.on('pointerdown', this.handlePointerDown);\n context.stage.on('pointerup', this.handlePointerUp);\n context.stage.on('pointerleave', this.handlePointerUp);\n\n this.editModule.onInput(this.handleInput);\n this.editModule.onChange(this.handleChange);\n }\n\n handleInput = (text: string, isComposing: boolean, cursorIdx: number, rt: IRichText, orient: 'left' | 'right') => {\n // 修改cursor的位置,但并不同步,因为这可能是临时的\n const p = this.getPointByColumnIdx(cursorIdx, rt, orient);\n this.hideSelection();\n this.setCursor(p.x, p.y1, p.y2);\n this.updateCbs.forEach(cb => cb('input', this));\n };\n handleChange = (text: string, isComposing: boolean, cursorIdx: number, rt: IRichText, orient: 'left' | 'right') => {\n // 修改cursor的位置,并同步到editModule\n const p = this.getPointByColumnIdx(cursorIdx, rt, orient);\n this.curCursorIdx = cursorIdx;\n this.selectionStartCursorIdx = cursorIdx;\n this.setCursorAndTextArea(p.x, p.y1, p.y2, rt);\n this.hideSelection();\n this.updateCbs.forEach(cb => cb('change', this));\n };\n\n handleMove = (e: PointerEvent) => {\n if (!this.isRichtext(e)) {\n return;\n }\n this.currRt = e.target as IRichText;\n this.handleEnter(e);\n (e.target as any).once('pointerleave', this.handleLeave);\n\n this.showSelection(e);\n };\n\n showSelection(e: PointerEvent) {\n const cache = (e.target as IRichText).getFrameCache();\n if (!(cache && this.editBg)) {\n return;\n }\n if (this.pointerDown) {\n let p0 = this.lastPoint;\n // 计算p1在字符中的位置\n let p1 = this.getEventPosition(e);\n let line1Info = this.getLineByPoint(cache, p1);\n const column1 = this.getColumnByLinePoint(line1Info, p1);\n const y1 = line1Info.top;\n const y2 = line1Info.top + line1Info.height;\n let x = column1.left + column1.width;\n let cursorIndex = this.getColumnIndex(cache, column1);\n if (p1.x < column1.left + column1.width / 2) {\n x = column1.left;\n cursorIndex -= 1;\n }\n p1.x = x;\n p1.y = (y1 + y2) / 2;\n let line0Info = this.getLineByPoint(cache, p0);\n if (p0.y > p1.y || (p0.y === p1.y && p0.x > p1.x)) {\n [p0, p1] = [p1, p0];\n [line1Info, line0Info] = [line0Info, line1Info];\n }\n\n this.editBg.removeAllChild();\n if (line0Info === line1Info) {\n const column0 = this.getColumnByLinePoint(line0Info, p0);\n this.editBg.setAttributes({\n x: p0.x,\n y: line0Info.top,\n width: p1.x - p0.x,\n height: column0.height,\n fill: '#336df4',\n fillOpacity: 0.2\n });\n } else {\n this.editBg.setAttributes({ x: 0, y: line0Info.top, width: 0, height: 0 });\n const startIdx = cache.lines.findIndex(item => item === line0Info);\n const endIdx = cache.lines.findIndex(item => item === line1Info);\n let y = 0;\n for (let i = startIdx; i <= endIdx; i++) {\n const line = cache.lines[i];\n if (i === startIdx) {\n const p = line.paragraphs[line.paragraphs.length - 1];\n this.editBg.add(\n createRect({\n x: p0.x,\n y,\n width: p.left + p.width - p0.x,\n height: line.height,\n fill: '#336df4',\n fillOpacity: 0.2\n })\n );\n } else if (i === endIdx) {\n const p = line.paragraphs[0];\n this.editBg.add(\n createRect({\n x: p.left,\n y,\n width: p1.x - p.left,\n height: line.height,\n fill: '#336df4',\n fillOpacity: 0.2\n })\n );\n } else {\n const p0 = line.paragraphs[0];\n const p1 = line.paragraphs[line.paragraphs.length - 1];\n this.editBg.add(\n createRect({\n x: p0.left,\n y,\n width: p1.left + p1.width - p0.left,\n height: line.height,\n fill: '#336df4',\n fillOpacity: 0.2\n })\n );\n }\n y += line.height;\n }\n }\n\n this.curCursorIdx = cursorIndex;\n this.setCursorAndTextArea(x, y1 + 2, y2 - 2, e.target as IRichText);\n\n this.applyUpdate();\n this.updateCbs.forEach(cb => cb('selection', this));\n }\n }\n\n hideSelection() {\n if (this.editBg) {\n this.editBg.removeAllChild();\n this.editBg.setAttributes({ fill: 'transparent' });\n }\n }\n\n handlePointerDown = (e: PointerEvent) => {\n if (this.editing) {\n this.onFocus(e);\n } else {\n this.deFocus(e);\n }\n this.applyUpdate();\n this.pointerDown = true;\n this.updateCbs.forEach(cb => cb(this.editing ? 'onfocus' : 'defocus', this));\n };\n handlePointerUp = (e: PointerEvent) => {\n this.pointerDown = false;\n };\n\n handleEnter = (e: PointerEvent) => {\n this.editing = true;\n this.pluginService.stage.setCursor('text');\n };\n\n handleLeave = (e: PointerEvent) => {\n this.editing = false;\n this.pluginService.stage.setCursor('default');\n };\n\n isRichtext(e: PointerEvent) {\n return !!(e.target && (e.target as any).type === 'richtext' && (e.target as any).attribute.editable);\n }\n\n protected getEventPosition(e: PointerEvent): IPointLike {\n const p = this.pluginService.stage.eventPointTransform(e);\n\n const p1 = { x: 0, y: 0 };\n (e.target as IRichText).globalTransMatrix.transformPoint(p, p1);\n return p1;\n }\n\n protected getLineByPoint(cache: IRichTextFrame, p1: IPointLike): IRichTextLine {\n let lineInfo = cache.lines[0];\n for (let i = 0; i < cache.lines.length; i++) {\n if (lineInfo.top <= p1.y && lineInfo.top + lineInfo.height >= p1.y) {\n break;\n }\n lineInfo = cache.lines[i + 1];\n }\n\n return lineInfo;\n }\n protected getColumnByLinePoint(lineInfo: IRichTextLine, p1: IPointLike): IRichTextParagraph | IRichTextIcon {\n let columnInfo = lineInfo.paragraphs[0];\n for (let i = 0; i < lineInfo.paragraphs.length; i++) {\n if (columnInfo.left <= p1.x && columnInfo.left + columnInfo.width >= p1.x) {\n break;\n }\n columnInfo = lineInfo.paragraphs[i];\n }\n\n return columnInfo;\n }\n\n onFocus(e: PointerEvent) {\n this.deFocus(e);\n\n // 添加shadowGraphic\n const target = e.target as IRichText;\n this.tryUpdateRichtext(target);\n const shadowRoot = target.attachShadow();\n shadowRoot.setAttributes({ shadowRootIdx: -1 });\n const cache = target.getFrameCache();\n if (!cache) {\n return;\n }\n if (!this.editLine) {\n const line = createLine({ x: 0, y: 0, lineWidth: 1, stroke: 'black' });\n line\n .animate()\n .to({ opacity: 1 }, 10, 'linear')\n .wait(700)\n .to({ opacity: 0 }, 10, 'linear')\n .wait(700)\n .loop(Infinity);\n this.editLine = line;\n\n const g = createGroup({ x: 0, y: 0, width: 0, height: 0 });\n this.editBg = g;\n shadowRoot.add(this.editLine);\n shadowRoot.add(this.editBg);\n }\n\n const p1 = this.getEventPosition(e);\n\n const lineInfo = this.getLineByPoint(cache, p1);\n\n if (lineInfo) {\n const columnInfo = this.getColumnByLinePoint(lineInfo, p1);\n if (!columnInfo) {\n return;\n }\n\n let y1 = lineInfo.top;\n let y2 = lineInfo.top + lineInfo.height;\n let x = columnInfo.left + columnInfo.width;\n y1 += 2;\n y2 -= 2;\n let cursorIndex = this.getColumnIndex(cache, columnInfo);\n if (p1.x < columnInfo.left + columnInfo.width / 2) {\n x = columnInfo.left;\n cursorIndex -= 1;\n }\n\n this.lastPoint = { x, y: (y1 + y2) / 2 };\n\n this.curCursorIdx = cursorIndex;\n this.selectionStartCursorIdx = cursorIndex;\n this.setCursorAndTextArea(x, y1, y2, target);\n }\n }\n\n protected getPointByColumnIdx(idx: number, rt: IRichText, orient: 'left' | 'right') {\n const cache = rt.getFrameCache();\n const { lineInfo, columnInfo } = this.getColumnByIndex(cache, idx);\n let y1 = lineInfo.top;\n let y2 = lineInfo.top + lineInfo.height;\n const x = columnInfo.left + (orient === 'left' ? 0 : columnInfo.width);\n y1 += 2;\n y2 -= 2;\n\n return { x, y1, y2 };\n }\n\n protected getColumnIndex(cache: IRichTextFrame, cInfo: IRichTextParagraph | IRichTextIcon) {\n // TODO 认为都是单个字符拆分的\n let inputIndex = -1;\n for (let i = 0; i < cache.lines.length; i++) {\n const line = cache.lines[i];\n for (let j = 0; j < line.paragraphs.length; j++) {\n inputIndex++;\n if (cInfo === line.paragraphs[j]) {\n return inputIndex;\n }\n }\n }\n return -1;\n }\n protected getColumnByIndex(\n cache: IRichTextFrame,\n index: number\n ): {\n lineInfo: IRichTextLine;\n columnInfo: IRichTextParagraph | IRichTextIcon;\n } | null {\n // TODO 认为都是单个字符拆分的\n let inputIndex = -1;\n for (let i = 0; i < cache.lines.length; i++) {\n const lineInfo = cache.lines[i];\n for (let j = 0; j < lineInfo.paragraphs.length; j++) {\n const columnInfo = lineInfo.paragraphs[j];\n inputIndex++;\n if (inputIndex === index) {\n return {\n lineInfo,\n columnInfo\n };\n }\n }\n }\n return null;\n }\n\n protected setCursorAndTextArea(x: number, y1: number, y2: number, rt: IRichText) {\n this.editLine.setAttributes({\n points: [\n { x, y: y1 },\n { x, y: y2 }\n ]\n });\n const out = { x: 0, y: 0 };\n rt.globalTransMatrix.getInverse().transformPoint({ x, y: y1 }, out);\n // TODO 考虑stage变换\n const { left, top } = this.pluginService.stage.window.getBoundingClientRect();\n out.x += left;\n out.y += top;\n\n this.editModule.moveTo(out.x, out.y, rt, this.curCursorIdx, this.selectionStartCursorIdx);\n }\n protected setCursor(x: number, y1: number, y2: number) {\n this.editLine.setAttributes({\n points: [\n { x, y: y1 },\n { x, y: y2 }\n ]\n });\n }\n\n applyUpdate() {\n this.pluginService.stage.renderNextFrame();\n }\n deFocus(e: PointerEvent) {\n const target = e.target as IRichText;\n target.detachShadow();\n this.currRt = null;\n if (this.editLine) {\n this.editLine.parent.removeChild(this.editLine);\n this.editLine.release();\n this.editLine = null;\n\n this.editBg.parent.removeChild(this.editBg);\n this.editBg.release();\n this.editBg = null;\n }\n }\n\n splitText(text: string) {\n // 😁这种emoji长度算两个,所以得处理一下\n return Array.from(text);\n }\n\n tryUpdateRichtext(richtext: IRichText) {\n const cache = richtext.getFrameCache();\n if (\n !cache.lines.every(line =>\n line.paragraphs.every(item => !(item.text && isString(item.text) && this.splitText(item.text).length > 1))\n )\n ) {\n const tc: IRichTextCharacter[] = [];\n richtext.attribute.textConfig.forEach((item: IRichTextParagraphCharacter) => {\n const textList = this.splitText(item.text.toString());\n if (isString(item.text) && textList.length > 1) {\n // 拆分\n for (let i = 0; i < textList.length; i++) {\n const t = textList[i];\n tc.push({ ...item, text: t });\n }\n } else {\n tc.push(item);\n }\n });\n richtext.setAttributes({ textConfig: tc });\n richtext.doUpdateFrameCache(tc);\n }\n }\n\n onSelect() {\n return;\n }\n\n deactivate(context: IPluginService): void {\n // context.stage.off('pointerdown', this.handleClick);\n context.stage.off('pointermove', this.handleMove);\n context.stage.off('pointerdown', this.handlePointerDown);\n context.stage.off('pointerup', this.handlePointerUp);\n context.stage.off('pointerleave', this.handlePointerUp);\n }\n\n release() {\n this.editModule.release();\n }\n}\n"]}
@@ -44,10 +44,7 @@ let DefaultCanvasArcRender = class extends BaseRender {
44
44
  endAngle = _ea;
45
45
  const deltaAngle = abs(endAngle - startAngle), clockwise = endAngle > startAngle;
46
46
  let collapsedToLine = !1;
47
- if (outerRadius < innerRadius) {
48
- const temp = outerRadius;
49
- outerRadius = innerRadius, innerRadius = temp;
50
- }
47
+ outerRadius < innerRadius && ([innerRadius, outerRadius] = [ outerRadius, innerRadius ]);
51
48
  const cornerRadius = arc.getParsedCornerRadius(), {outerDeltaAngle: outerDeltaAngle, innerDeltaAngle: innerDeltaAngle, outerStartAngle: outerStartAngle, outerEndAngle: outerEndAngle, innerEndAngle: innerEndAngle, innerStartAngle: innerStartAngle} = arc.getParsePadAngle(startAngle, endAngle), outerCornerRadiusStart = cornerRadius, outerCornerRadiusEnd = cornerRadius, innerCornerRadiusEnd = cornerRadius, innerCornerRadiusStart = cornerRadius, maxOuterCornerRadius = Math.max(outerCornerRadiusEnd, outerCornerRadiusStart), maxInnerCornerRadius = Math.max(innerCornerRadiusEnd, innerCornerRadiusStart);
52
49
  let limitedOcr = maxOuterCornerRadius, limitedIcr = maxInnerCornerRadius;
53
50
  const xors = outerRadius * cos(outerStartAngle), yors = outerRadius * sin(outerStartAngle), xire = innerRadius * cos(innerEndAngle), yire = innerRadius * sin(innerEndAngle);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/render/contributions/render/arc-render.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAiB7E,OAAO,EACL,cAAc,EACd,WAAW,EAEX,WAAW,EACX,SAAS,EAIV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,sCAAsC,EACtC,4BAA4B,EAC5B,mCAAmC,EACpC,MAAM,iBAAiB,CAAC;AAmBlB,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,UAAgB;IAI1D,YAGqB,sBAAqE;QAExF,KAAK,EAAE,CAAC;QAFW,2BAAsB,GAAtB,sBAAsB,CAA+C;QAL1F,eAAU,GAAW,eAAe,CAAC;QAQnC,IAAI,CAAC,oBAAoB,GAAG;YAC1B,4BAA4B;YAC5B,sCAAsC;YACtC,mCAAmC;SACpC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACpC,CAAC;IAGD,kBAAkB,CAChB,GAAS,EACT,OAA6B,EAC7B,EAAU,EACV,EAAU,EACV,WAAmB,EACnB,WAAmB,EACnB,GAAW,EACX,GAAW;QAEX,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC7B,QAAQ,GAAG,GAAG,CAAC;QACf,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAY,QAAQ,GAAG,UAAU,CAAC;QACjD,IAAI,eAAe,GAAY,KAAK,CAAC;QAErC,IAAI,WAAW,GAAG,WAAW,EAAE;YAC7B,MAAM,IAAI,GAAG,WAAW,CAAC;YACzB,WAAW,GAAG,WAAW,CAAC;YAC1B,WAAW,GAAG,IAAI,CAAC;SACpB;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAEjD,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,GACxG,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE7C,MAAM,sBAAsB,GAAG,YAAY,CAAC;QAC5C,MAAM,oBAAoB,GAAG,YAAY,CAAC;QAC1C,MAAM,oBAAoB,GAAG,YAAY,CAAC;QAC1C,MAAM,sBAAsB,GAAG,YAAY,CAAC;QAC5C,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;QACpF,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;QACpF,IAAI,UAAU,GAAG,oBAAoB,CAAC;QACtC,IAAI,UAAU,GAAG,oBAAoB,CAAC;QAEtC,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;QAG9C,IAAI,IAAY,CAAC;QACjB,IAAI,IAAY,CAAC;QACjB,IAAI,IAAY,CAAC;QACjB,IAAI,IAAY,CAAC;QAEjB,IAAI,oBAAoB,GAAG,OAAO,IAAI,oBAAoB,GAAG,OAAO,EAAE;YACpE,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;YAC1C,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;YAG1C,IAAI,UAAU,GAAG,EAAE,EAAE;gBACnB,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAErE,IAAI,EAAE,EAAE;oBACN,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxB,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxB,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxB,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxB,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACxG,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE/C,UAAU,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;oBACtE,UAAU,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;iBACvE;aACF;SACF;QAED,IAAI,UAAU,GAAG,OAAO,EAAE;YACxB,MAAM,iBAAiB,GAAG,GAAG,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;YAClE,MAAM,eAAe,GAAG,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;YAE9D,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACrG,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YAGnG,IAAI,UAAU,GAAG,oBAAoB,IAAI,iBAAiB,KAAK,eAAe,EAAE;gBAC9E,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;aAC3G;iBAAM;gBACL,MAAM,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;gBACtC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;gBACrD,eAAe,GAAG,CAAC;oBACjB,OAAO,CAAC,GAAG,CACT,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,eAAe,EACf,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EACrB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EACrB,CAAC,SAAS,CACX,CAAC;aACL;SACF;aAAM;YACL,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;SACtC;QAYD,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,eAAe,GAAG,KAAK,EAAE;YACvD,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YACrC,eAAe,GAAG,IAAI,CAAC;SACxB;aAAM,IAAI,UAAU,GAAG,OAAO,EAAE;YAC/B,MAAM,iBAAiB,GAAG,GAAG,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;YAClE,MAAM,eAAe,GAAG,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;YAE9D,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACpG,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,iBAAiB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YAEtG,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAGzD,IAAI,UAAU,GAAG,oBAAoB,IAAI,iBAAiB,KAAK,eAAe,EAAE;gBAC9E,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;aACjG;iBAAM;gBACL,eAAe,GAAG,CAAC;oBACjB,OAAO,CAAC,GAAG,CACT,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,eAAe,EACf,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EACrB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EACrB,CAAC,SAAS,CACX,CAAC;gBACJ,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBACjD,MAAM,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;aACrD;SACF;aAAM;YACL,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;SAClG;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,SAAS,CACP,GAAS,EACT,OAAmB,EACnB,CAAS,EACT,CAAS,EACT,WAAyB,EACzB,MAAiC,EACjC,MAIY,EACZ,QAIY;QAGZ,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CAAC,CAAC,GAAG,CAAC;QACtD,MAAM,EACJ,IAAI,GAAG,YAAY,CAAC,IAAI,EACxB,MAAM,GAAG,YAAY,CAAC,MAAM,EAC5B,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,EAC3B,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,EAC5B,GAAG,GAAG,CAAC,SAAS,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QACD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAEtD,MAAM,EACJ,YAAY,GAAG,YAAY,CAAC,YAAY,EACxC,YAAY,GAAG,YAAY,CAAC,YAAY,EACxC,GAAG,GAAG,YAAY,CAAC,GAAG,EACtB,YAAY,GAAG,YAAY,CAAC,YAAY,EACzC,GAAG,GAAG,CAAC,SAAS,CAAC;QAClB,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;QACvG,WAAW,IAAI,YAAY,CAAC;QAC5B,WAAW,IAAI,YAAY,CAAC;QAE5B,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,sBAAsB,GAC1B,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAK,IAAuB,CAAC,QAAQ,KAAK,SAAS,CAAC;QACzF,IAAI,sBAAsB,EAAE;YAC1B,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;YAC1D,IAAI,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,GAAG,GAAG,OAAO,EAAE;gBAC9C,aAAa,GAAG,EAAE,IAAI,CAAC,CAAC;gBACvB,IAAyB,CAAC,UAAU,IAAI,aAAa,CAAC;gBACtD,IAAyB,CAAC,QAAQ,IAAI,aAAa,CAAC;aACtD;SACF;QAED,IAAI,8BAA8B,GAAG,KAAK,CAAC;QAC3C,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,MAAM,IAAI,YAAY,EAAE;YAC1B,OAAO,CAAC,SAAS,EAAE,CAAC;YAYpB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YAE1D,8BAA8B,GAAG,IAAI,CAAC;YAEtC,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAC7F,IAAI,CAAC,gBAAgB,CACnB,GAAG,EACH,OAAO,EACP,CAAC,EACD,CAAC,EACD,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,CACT,CAAC;YAEF,IAAI,MAAM,EAAE;gBACV,IAAI,MAAM,EAAE;oBACV,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;iBAC9C;qBAAM,IAAI,QAAQ,EAAE;oBACnB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;oBACnF,OAAO,CAAC,IAAI,EAAE,CAAC;iBAChB;aACF;YAED,IAAI,QAAQ,IAAI,YAAY,EAAE;gBAC5B,IAAI,QAAQ,EAAE;oBACZ,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;iBAChD;qBAAM,IAAI,QAAQ,EAAE;oBACnB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;oBACnF,OAAO,CAAC,MAAM,EAAE,CAAC;iBAClB;aACF;SACF;QAGD,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE;YAC7B,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YAE/F,IAAI,CAAC,8BAA8B,EAAE;gBACnC,IAAI,CAAC,gBAAgB,CACnB,GAAG,EACH,OAAO,EACP,CAAC,EACD,CAAC,EACD,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,CACT,CAAC;aACH;YAED,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;aAChD;iBAAM,IAAI,QAAQ,EAAE;gBACnB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;gBAC/D,OAAO,CAAC,MAAM,EAAE,CAAC;aAClB;SACF;QAGD,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,EAAE;YACvD,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAChC,IAAI,UAAU,IAAI,GAAG,GAAG,OAAO,EAAE;gBAC/B,OAAO,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAEzD,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;gBACxC,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;gBACrF,MAAM,UAAU,GAAG,QAAQ,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;gBAEzG,IAAI,CAAC,8BAA8B,EAAE;oBACnC,IAAI,CAAC,gBAAgB,CACnB,GAAG,EACH,OAAO,EACP,CAAC,EACD,CAAC,EACD,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,CACT,CAAC;iBACH;gBAED,IAAI,MAAM,EAAE;oBAEV,MAAM,KAAK,GAAG,IAAI,CAAC;oBACnB,IAAK,KAAwB,CAAC,QAAQ,KAAK,SAAS,EAAE;wBACpD,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAY,CAAC,CAAC;wBACnE,IAAI,MAAM,EAAE;yBAEX;6BAAM,IAAI,WAAW,EAAE;4BAEtB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;4BAC/D,OAAO,CAAC,SAAS,GAAG,SAAmB,CAAC;4BACxC,OAAO,CAAC,IAAI,EAAE,CAAC;yBAChB;qBACF;iBACF;gBACD,IAAI,QAAQ,EAAE;oBACZ,IAAI,QAAQ,EAAE;qBAEb;yBAAM,IAAI,QAAQ,EAAE;wBACnB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;wBAE/D,OAAO,CAAC,MAAM,EAAE,CAAC;qBAClB;iBACF;aACF;SACF;QAED,IAAI,CAAC,eAAe,CAClB,GAAG,EACH,OAAO,EACP,CAAC,EACD,CAAC,EACD,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,CACT,CAAC;QAEF,IAAI,sBAAsB,EAAE;YACzB,IAAyB,CAAC,UAAU,IAAI,aAAa,CAAC;YACtD,IAAyB,CAAC,QAAQ,IAAI,aAAa,CAAC;SACtD;IACH,CAAC;IAED,IAAI,CAAC,GAAS,EAAE,aAA6B,EAAE,WAAyB,EAAE,MAAiC;QACzG,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CAAC,CAAC,GAAG,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;CACF,CAAA;AArYY,sBAAsB;IADlC,UAAU,EAAE;IAMR,WAAA,MAAM,CAAC,oBAAoB,CAAC,CAAA;IAC5B,WAAA,KAAK,CAAC,qBAAqB,CAAC,CAAA;;GANpB,sBAAsB,CAqYlC;SArYY,sBAAsB","file":"arc-render.js","sourcesContent":["import { abs, acos, atan2, cos, epsilon, min, pi, sin, sqrt, pi2, isBoolean } from '@visactor/vutils';\nimport { inject, injectable, named } from '../../../common/inversify-lite';\nimport { getTheme } from '../../../graphic/theme';\nimport { parseStroke } from '../../../common/utils';\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport { ContributionProvider } from '../../../common/contribution-provider';\nimport type {\n IContext2d,\n IArc,\n IPath2D,\n IGraphicAttribute,\n IMarkAttribute,\n IThemeAttribute,\n IGradientColor,\n IArcRenderContribution,\n IDrawContext,\n IRenderService,\n IGraphicRender,\n IGraphicRenderDrawParams,\n IContributionProvider,\n IConicalGradient\n} from '../../../interface';\nimport {\n cornerTangents,\n drawArcPath,\n drawPathProxy,\n fillVisible,\n intersect,\n runFill,\n runStroke,\n strokeVisible\n} from './utils';\nimport { getConicGradientAt } from '../../../canvas/conical-gradient';\nimport { ArcRenderContribution } from './contributions/constants';\nimport { BaseRenderContributionTime } from '../../../common/enums';\nimport { ARC_NUMBER_TYPE } from '../../../graphic/constants';\nimport { BaseRender } from './base-render';\nimport {\n defaultArcBackgroundRenderContribution,\n defaultArcRenderContribution,\n defaultArcTextureRenderContribution\n} from './contributions';\n/**\n * 部分源码参考 https://github.com/d3/d3-shape/\n * Copyright 2010-2022 Mike Bostock\n\n Permission to use, copy, modify, and/or distribute this software for any purpose\n with or without fee is hereby granted, provided that the above copyright notice\n and this permission notice appear in all copies.\n\n THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\n THIS SOFTWARE.\n */\n\n@injectable()\nexport class DefaultCanvasArcRender extends BaseRender<IArc> implements IGraphicRender {\n type: 'arc';\n numberType: number = ARC_NUMBER_TYPE;\n\n constructor(\n @inject(ContributionProvider)\n @named(ArcRenderContribution)\n protected readonly arcRenderContribitions: IContributionProvider<IArcRenderContribution>\n ) {\n super();\n this.builtinContributions = [\n defaultArcRenderContribution,\n defaultArcBackgroundRenderContribution,\n defaultArcTextureRenderContribution\n ];\n this.init(arcRenderContribitions);\n }\n\n // 绘制尾部cap\n drawArcTailCapPath(\n arc: IArc,\n context: IContext2d | IPath2D,\n cx: number,\n cy: number,\n outerRadius: number,\n innerRadius: number,\n _sa: number,\n _ea: number\n ) {\n const capAngle = _ea - _sa;\n const data = arc.getParsedAngle();\n const startAngle = data.startAngle;\n let endAngle = data.endAngle;\n endAngle = _ea;\n const deltaAngle = abs(endAngle - startAngle);\n const clockwise: boolean = endAngle > startAngle;\n let collapsedToLine: boolean = false;\n // 规范化outerRadius和innerRadius\n if (outerRadius < innerRadius) {\n const temp = outerRadius;\n outerRadius = innerRadius;\n innerRadius = temp;\n }\n\n const cornerRadius = arc.getParsedCornerRadius();\n // Or is it a circular or annular sector?\n const { outerDeltaAngle, innerDeltaAngle, outerStartAngle, outerEndAngle, innerEndAngle, innerStartAngle } =\n arc.getParsePadAngle(startAngle, endAngle);\n\n const outerCornerRadiusStart = cornerRadius;\n const outerCornerRadiusEnd = cornerRadius;\n const innerCornerRadiusEnd = cornerRadius;\n const innerCornerRadiusStart = cornerRadius;\n const maxOuterCornerRadius = Math.max(outerCornerRadiusEnd, outerCornerRadiusStart);\n const maxInnerCornerRadius = Math.max(innerCornerRadiusEnd, innerCornerRadiusStart);\n let limitedOcr = maxOuterCornerRadius;\n let limitedIcr = maxInnerCornerRadius;\n\n const xors = outerRadius * cos(outerStartAngle);\n const yors = outerRadius * sin(outerStartAngle);\n const xire = innerRadius * cos(innerEndAngle);\n const yire = innerRadius * sin(innerEndAngle);\n\n // Apply rounded corners?\n let xore: number;\n let yore: number;\n let xirs: number;\n let yirs: number;\n\n if (maxInnerCornerRadius > epsilon || maxOuterCornerRadius > epsilon) {\n xore = outerRadius * cos(outerEndAngle);\n yore = outerRadius * sin(outerEndAngle);\n xirs = innerRadius * cos(innerStartAngle);\n yirs = innerRadius * sin(innerStartAngle);\n\n // Restrict the corner radius according to the sector angle.\n if (deltaAngle < pi) {\n const oc = intersect(xors, yors, xirs, yirs, xore, yore, xire, yire);\n\n if (oc) {\n const ax = xors - oc[0];\n const ay = yors - oc[1];\n const bx = xore - oc[0];\n const by = yore - oc[1];\n const kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2);\n const lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n\n limitedIcr = min(maxInnerCornerRadius, (innerRadius - lc) / (kc - 1));\n limitedOcr = min(maxOuterCornerRadius, (outerRadius - lc) / (kc + 1));\n }\n }\n }\n\n if (limitedOcr > epsilon) {\n const cornerRadiusStart = min(outerCornerRadiusStart, limitedOcr);\n const cornerRadiusEnd = min(outerCornerRadiusEnd, limitedOcr);\n // Does the sector’s outer ring have rounded corners?\n const t0 = cornerTangents(xirs, yirs, xors, yors, outerRadius, cornerRadiusStart, Number(clockwise));\n const t1 = cornerTangents(xore, yore, xire, yire, outerRadius, cornerRadiusEnd, Number(clockwise));\n\n // Have the corners merged?\n if (limitedOcr < maxOuterCornerRadius && cornerRadiusStart === cornerRadiusEnd) {\n context.moveTo(cx + t0.cx + t0.x01, cy + t0.cy + t0.y01);\n context.arc(cx + t0.cx, cy + t0.cy, limitedOcr, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !clockwise);\n } else {\n const a1 = endAngle - capAngle - 0.03;\n const a2 = atan2(t1.y11, t1.x11);\n context.arc(cx, cy, outerRadius, a1, a2, !clockwise);\n cornerRadiusEnd > 0 &&\n context.arc(\n cx + t1.cx,\n cy + t1.cy,\n cornerRadiusEnd,\n atan2(t1.y11, t1.x11),\n atan2(t1.y01, t1.x01),\n !clockwise\n );\n }\n } else {\n context.moveTo(cx + xors, cy + yors);\n }\n // else {\n // // Or is the outer ring just a circular arc?\n // if (!partStroke || partStroke[0]) {\n // context.moveTo(cx + xors, cy + yors);\n // context.arc(cx, cy, outerRadius, outerStartAngle, outerEndAngle, !clockwise);\n // } else {\n // // context.moveTo(cx + outerRadius * cos(outerEndAngle), cy + yore);\n // }\n // }\n // // Is there no inner ring, and it’s a circular sector?\n // // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(innerRadius > epsilon) || innerDeltaAngle < 0.001) {\n context.lineTo(cx + xire, cy + yire);\n collapsedToLine = true;\n } else if (limitedIcr > epsilon) {\n const cornerRadiusStart = min(innerCornerRadiusStart, limitedIcr);\n const cornerRadiusEnd = min(innerCornerRadiusEnd, limitedIcr);\n // Does the sector’s inner ring (or point) have rounded corners?\n const t0 = cornerTangents(xire, yire, xore, yore, innerRadius, -cornerRadiusEnd, Number(clockwise));\n const t1 = cornerTangents(xors, yors, xirs, yirs, innerRadius, -cornerRadiusStart, Number(clockwise));\n\n context.lineTo(cx + t0.cx + t0.x01, cy + t0.cy + t0.y01);\n\n // Have the corners merged?\n if (limitedIcr < maxInnerCornerRadius && cornerRadiusStart === cornerRadiusEnd) {\n const arcEndAngle = atan2(t1.y01, t1.x01);\n context.arc(cx + t0.cx, cy + t0.cy, limitedIcr, atan2(t0.y01, t0.x01), arcEndAngle, !clockwise);\n } else {\n cornerRadiusEnd > 0 &&\n context.arc(\n cx + t0.cx,\n cy + t0.cy,\n cornerRadiusEnd,\n atan2(t0.y01, t0.x01),\n atan2(t0.y11, t0.x11),\n !clockwise\n );\n const a1 = atan2(t0.cy + t0.y11, t0.cx + t0.x11);\n const a2 = endAngle - capAngle - 0.03;\n context.arc(cx, cy, innerRadius, a1, a2, clockwise);\n }\n } else {\n context.lineTo(cx + innerRadius * cos(innerStartAngle), cy + innerRadius * sin(innerStartAngle));\n }\n\n return collapsedToLine;\n }\n\n drawShape(\n arc: IArc,\n context: IContext2d,\n x: number,\n y: number,\n drawContext: IDrawContext,\n params?: IGraphicRenderDrawParams,\n fillCb?: (\n ctx: IContext2d,\n markAttribute: Partial<IMarkAttribute & IGraphicAttribute>,\n themeAttribute: IThemeAttribute\n ) => boolean,\n strokeCb?: (\n ctx: IContext2d,\n markAttribute: Partial<IMarkAttribute & IGraphicAttribute>,\n themeAttribute: IThemeAttribute\n ) => boolean\n ) {\n // const arcAttribute = graphicService.themeService.getCurrentTheme().arcAttribute;\n const arcAttribute = getTheme(arc, params?.theme).arc;\n const {\n fill = arcAttribute.fill,\n stroke = arcAttribute.stroke,\n x: originX = arcAttribute.x,\n y: originY = arcAttribute.y\n } = arc.attribute;\n const data = this.valid(arc, arcAttribute, fillCb, strokeCb);\n if (!data) {\n return;\n }\n const { fVisible, sVisible, doFill, doStroke } = data;\n\n const {\n outerPadding = arcAttribute.outerPadding,\n innerPadding = arcAttribute.innerPadding,\n cap = arcAttribute.cap,\n forceShowCap = arcAttribute.forceShowCap\n } = arc.attribute;\n let { outerRadius = arcAttribute.outerRadius, innerRadius = arcAttribute.innerRadius } = arc.attribute;\n outerRadius += outerPadding;\n innerRadius -= innerPadding;\n // 判断是否是环形渐变,且有头部cap,那就偏移渐变色角度\n let conicalOffset = 0;\n const tempChangeConicalColor =\n ((isBoolean(cap) && cap) || cap[0]) && (fill as IGradientColor).gradient === 'conical';\n if (tempChangeConicalColor) {\n const { sc, startAngle, endAngle } = arc.getParsedAngle();\n if (abs(endAngle - startAngle) < pi2 - epsilon) {\n conicalOffset = sc || 0;\n (fill as IConicalGradient).startAngle -= conicalOffset;\n (fill as IConicalGradient).endAngle -= conicalOffset;\n }\n }\n\n let beforeRenderContribitionsRuned = false;\n const { isFullStroke, stroke: arrayStroke } = parseStroke(stroke);\n if (doFill || isFullStroke) {\n context.beginPath();\n // if (arc.shouldUpdateShape()) {\n // // 更新shape\n // arc.cache = new Path2D(context);\n // this.drawArcPath(arc, arc.cache, x, y, outerRadius, innerRadius);\n // arc.clearUpdateShapeTag();\n // } else {\n // if (arc.cache) {\n // renderCommandList(arc.cache.commandList, context);\n // }\n // }\n // 测试后,cache对于重绘性能提升不大,但是在首屏有一定性能损耗,因此arc不再使用cache\n drawArcPath(arc, context, x, y, outerRadius, innerRadius);\n\n beforeRenderContribitionsRuned = true;\n // shadow\n context.setShadowBlendStyle && context.setShadowBlendStyle(arc, arc.attribute, arcAttribute);\n this.beforeRenderStep(\n arc,\n context,\n x,\n y,\n doFill,\n doStroke,\n fVisible,\n sVisible,\n arcAttribute,\n drawContext,\n fillCb,\n strokeCb\n );\n\n if (doFill) {\n if (fillCb) {\n fillCb(context, arc.attribute, arcAttribute);\n } else if (fVisible) {\n context.setCommonStyle(arc, arc.attribute, originX - x, originY - y, arcAttribute);\n context.fill();\n }\n }\n\n if (doStroke && isFullStroke) {\n if (strokeCb) {\n strokeCb(context, arc.attribute, arcAttribute);\n } else if (sVisible) {\n context.setStrokeStyle(arc, arc.attribute, originX - x, originY - y, arcAttribute);\n context.stroke();\n }\n }\n }\n\n // 需要局部渲染描边的时候\n if (!isFullStroke && doStroke) {\n context.beginPath();\n const collapsedToLine = drawArcPath(arc, context, x, y, outerRadius, innerRadius, arrayStroke);\n\n if (!beforeRenderContribitionsRuned) {\n this.beforeRenderStep(\n arc,\n context,\n x,\n y,\n doFill,\n doStroke,\n fVisible,\n sVisible,\n arcAttribute,\n drawContext,\n fillCb,\n strokeCb\n );\n }\n\n if (strokeCb) {\n strokeCb(context, arc.attribute, arcAttribute);\n } else if (sVisible) {\n context.setStrokeStyle(arc, arc.attribute, x, y, arcAttribute);\n context.stroke();\n }\n }\n\n // 绘制cap\n if (((isBoolean(cap) && cap) || cap[1]) && forceShowCap) {\n const { startAngle: sa, endAngle: ea } = arc.getParsedAngle();\n const deltaAngle = abs(ea - sa);\n if (deltaAngle >= pi2 - epsilon) {\n context.beginPath();\n const capWidth = Math.abs(outerRadius - innerRadius) / 2;\n // 以外边界长度为准\n const capAngle = capWidth / outerRadius;\n const { endAngle = arcAttribute.endAngle, fill = arcAttribute.fill } = arc.attribute;\n const startAngle = endAngle;\n this.drawArcTailCapPath(arc, context, x, y, outerRadius, innerRadius, startAngle, startAngle + capAngle);\n\n if (!beforeRenderContribitionsRuned) {\n this.beforeRenderStep(\n arc,\n context,\n x,\n y,\n doFill,\n doStroke,\n fVisible,\n sVisible,\n arcAttribute,\n drawContext,\n fillCb,\n strokeCb\n );\n }\n\n if (doFill) {\n // 获取渐变色最后一个颜色\n const color = fill;\n if ((color as IGradientColor).gradient === 'conical') {\n const lastColor = getConicGradientAt(0, 0, endAngle, color as any);\n if (fillCb) {\n // fillCb(context, arc.attribute, arcAttribute);\n } else if (fillVisible) {\n // context.closePath();\n context.setCommonStyle(arc, arc.attribute, x, y, arcAttribute);\n context.fillStyle = lastColor as string;\n context.fill();\n }\n }\n }\n if (doStroke) {\n if (strokeCb) {\n // fillCb(context, arc.attribute, arcAttribute);\n } else if (sVisible) {\n context.setStrokeStyle(arc, arc.attribute, x, y, arcAttribute);\n // context.strokeStyle = 'red';\n context.stroke();\n }\n }\n }\n }\n\n this.afterRenderStep(\n arc,\n context,\n x,\n y,\n doFill,\n doStroke,\n fVisible,\n sVisible,\n arcAttribute,\n drawContext,\n fillCb,\n strokeCb\n );\n\n if (tempChangeConicalColor) {\n (fill as IConicalGradient).startAngle += conicalOffset;\n (fill as IConicalGradient).endAngle += conicalOffset;\n }\n }\n\n draw(arc: IArc, renderService: IRenderService, drawContext: IDrawContext, params?: IGraphicRenderDrawParams) {\n const arcAttribute = getTheme(arc, params?.theme).arc;\n this._draw(arc, arcAttribute, false, drawContext, params);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/render/contributions/render/arc-render.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAiB7E,OAAO,EACL,cAAc,EACd,WAAW,EAEX,WAAW,EACX,SAAS,EAIV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,sCAAsC,EACtC,4BAA4B,EAC5B,mCAAmC,EACpC,MAAM,iBAAiB,CAAC;AAmBlB,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,UAAgB;IAI1D,YAGqB,sBAAqE;QAExF,KAAK,EAAE,CAAC;QAFW,2BAAsB,GAAtB,sBAAsB,CAA+C;QAL1F,eAAU,GAAW,eAAe,CAAC;QAQnC,IAAI,CAAC,oBAAoB,GAAG;YAC1B,4BAA4B;YAC5B,sCAAsC;YACtC,mCAAmC;SACpC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACpC,CAAC;IAGD,kBAAkB,CAChB,GAAS,EACT,OAA6B,EAC7B,EAAU,EACV,EAAU,EACV,WAAmB,EACnB,WAAmB,EACnB,GAAW,EACX,GAAW;QAEX,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC7B,QAAQ,GAAG,GAAG,CAAC;QACf,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAY,QAAQ,GAAG,UAAU,CAAC;QACjD,IAAI,eAAe,GAAY,KAAK,CAAC;QAErC,IAAI,WAAW,GAAG,WAAW,EAAE;YAC7B,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;SACzD;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAEjD,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,GACxG,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE7C,MAAM,sBAAsB,GAAG,YAAY,CAAC;QAC5C,MAAM,oBAAoB,GAAG,YAAY,CAAC;QAC1C,MAAM,oBAAoB,GAAG,YAAY,CAAC;QAC1C,MAAM,sBAAsB,GAAG,YAAY,CAAC;QAC5C,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;QACpF,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;QACpF,IAAI,UAAU,GAAG,oBAAoB,CAAC;QACtC,IAAI,UAAU,GAAG,oBAAoB,CAAC;QAEtC,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;QAG9C,IAAI,IAAY,CAAC;QACjB,IAAI,IAAY,CAAC;QACjB,IAAI,IAAY,CAAC;QACjB,IAAI,IAAY,CAAC;QAEjB,IAAI,oBAAoB,GAAG,OAAO,IAAI,oBAAoB,GAAG,OAAO,EAAE;YACpE,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;YAC1C,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;YAG1C,IAAI,UAAU,GAAG,EAAE,EAAE;gBACnB,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAErE,IAAI,EAAE,EAAE;oBACN,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxB,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxB,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxB,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxB,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACxG,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE/C,UAAU,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;oBACtE,UAAU,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;iBACvE;aACF;SACF;QAED,IAAI,UAAU,GAAG,OAAO,EAAE;YACxB,MAAM,iBAAiB,GAAG,GAAG,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;YAClE,MAAM,eAAe,GAAG,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;YAE9D,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACrG,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YAGnG,IAAI,UAAU,GAAG,oBAAoB,IAAI,iBAAiB,KAAK,eAAe,EAAE;gBAC9E,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;aAC3G;iBAAM;gBACL,MAAM,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;gBACtC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;gBACrD,eAAe,GAAG,CAAC;oBACjB,OAAO,CAAC,GAAG,CACT,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,eAAe,EACf,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EACrB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EACrB,CAAC,SAAS,CACX,CAAC;aACL;SACF;aAAM;YACL,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;SACtC;QAYD,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,eAAe,GAAG,KAAK,EAAE;YACvD,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YACrC,eAAe,GAAG,IAAI,CAAC;SACxB;aAAM,IAAI,UAAU,GAAG,OAAO,EAAE;YAC/B,MAAM,iBAAiB,GAAG,GAAG,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;YAClE,MAAM,eAAe,GAAG,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;YAE9D,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACpG,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,iBAAiB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YAEtG,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAGzD,IAAI,UAAU,GAAG,oBAAoB,IAAI,iBAAiB,KAAK,eAAe,EAAE;gBAC9E,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;aACjG;iBAAM;gBACL,eAAe,GAAG,CAAC;oBACjB,OAAO,CAAC,GAAG,CACT,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,eAAe,EACf,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EACrB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EACrB,CAAC,SAAS,CACX,CAAC;gBACJ,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBACjD,MAAM,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;aACrD;SACF;aAAM;YACL,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;SAClG;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,SAAS,CACP,GAAS,EACT,OAAmB,EACnB,CAAS,EACT,CAAS,EACT,WAAyB,EACzB,MAAiC,EACjC,MAIY,EACZ,QAIY;QAGZ,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CAAC,CAAC,GAAG,CAAC;QACtD,MAAM,EACJ,IAAI,GAAG,YAAY,CAAC,IAAI,EACxB,MAAM,GAAG,YAAY,CAAC,MAAM,EAC5B,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,EAC3B,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,EAC5B,GAAG,GAAG,CAAC,SAAS,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QACD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAEtD,MAAM,EACJ,YAAY,GAAG,YAAY,CAAC,YAAY,EACxC,YAAY,GAAG,YAAY,CAAC,YAAY,EACxC,GAAG,GAAG,YAAY,CAAC,GAAG,EACtB,YAAY,GAAG,YAAY,CAAC,YAAY,EACzC,GAAG,GAAG,CAAC,SAAS,CAAC;QAClB,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;QACvG,WAAW,IAAI,YAAY,CAAC;QAC5B,WAAW,IAAI,YAAY,CAAC;QAE5B,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,sBAAsB,GAC1B,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAK,IAAuB,CAAC,QAAQ,KAAK,SAAS,CAAC;QACzF,IAAI,sBAAsB,EAAE;YAC1B,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;YAC1D,IAAI,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,GAAG,GAAG,OAAO,EAAE;gBAC9C,aAAa,GAAG,EAAE,IAAI,CAAC,CAAC;gBACvB,IAAyB,CAAC,UAAU,IAAI,aAAa,CAAC;gBACtD,IAAyB,CAAC,QAAQ,IAAI,aAAa,CAAC;aACtD;SACF;QAED,IAAI,8BAA8B,GAAG,KAAK,CAAC;QAC3C,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,MAAM,IAAI,YAAY,EAAE;YAC1B,OAAO,CAAC,SAAS,EAAE,CAAC;YAYpB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YAE1D,8BAA8B,GAAG,IAAI,CAAC;YAEtC,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAC7F,IAAI,CAAC,gBAAgB,CACnB,GAAG,EACH,OAAO,EACP,CAAC,EACD,CAAC,EACD,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,CACT,CAAC;YAEF,IAAI,MAAM,EAAE;gBACV,IAAI,MAAM,EAAE;oBACV,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;iBAC9C;qBAAM,IAAI,QAAQ,EAAE;oBACnB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;oBACnF,OAAO,CAAC,IAAI,EAAE,CAAC;iBAChB;aACF;YAED,IAAI,QAAQ,IAAI,YAAY,EAAE;gBAC5B,IAAI,QAAQ,EAAE;oBACZ,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;iBAChD;qBAAM,IAAI,QAAQ,EAAE;oBACnB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;oBACnF,OAAO,CAAC,MAAM,EAAE,CAAC;iBAClB;aACF;SACF;QAGD,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE;YAC7B,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YAE/F,IAAI,CAAC,8BAA8B,EAAE;gBACnC,IAAI,CAAC,gBAAgB,CACnB,GAAG,EACH,OAAO,EACP,CAAC,EACD,CAAC,EACD,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,CACT,CAAC;aACH;YAED,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;aAChD;iBAAM,IAAI,QAAQ,EAAE;gBACnB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;gBAC/D,OAAO,CAAC,MAAM,EAAE,CAAC;aAClB;SACF;QAGD,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,EAAE;YACvD,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAChC,IAAI,UAAU,IAAI,GAAG,GAAG,OAAO,EAAE;gBAC/B,OAAO,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAEzD,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;gBACxC,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;gBACrF,MAAM,UAAU,GAAG,QAAQ,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;gBAEzG,IAAI,CAAC,8BAA8B,EAAE;oBACnC,IAAI,CAAC,gBAAgB,CACnB,GAAG,EACH,OAAO,EACP,CAAC,EACD,CAAC,EACD,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,CACT,CAAC;iBACH;gBAED,IAAI,MAAM,EAAE;oBAEV,MAAM,KAAK,GAAG,IAAI,CAAC;oBACnB,IAAK,KAAwB,CAAC,QAAQ,KAAK,SAAS,EAAE;wBACpD,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAY,CAAC,CAAC;wBACnE,IAAI,MAAM,EAAE;yBAEX;6BAAM,IAAI,WAAW,EAAE;4BAEtB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;4BAC/D,OAAO,CAAC,SAAS,GAAG,SAAmB,CAAC;4BACxC,OAAO,CAAC,IAAI,EAAE,CAAC;yBAChB;qBACF;iBACF;gBACD,IAAI,QAAQ,EAAE;oBACZ,IAAI,QAAQ,EAAE;qBAEb;yBAAM,IAAI,QAAQ,EAAE;wBACnB,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;wBAE/D,OAAO,CAAC,MAAM,EAAE,CAAC;qBAClB;iBACF;aACF;SACF;QAED,IAAI,CAAC,eAAe,CAClB,GAAG,EACH,OAAO,EACP,CAAC,EACD,CAAC,EACD,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,CACT,CAAC;QAEF,IAAI,sBAAsB,EAAE;YACzB,IAAyB,CAAC,UAAU,IAAI,aAAa,CAAC;YACtD,IAAyB,CAAC,QAAQ,IAAI,aAAa,CAAC;SACtD;IACH,CAAC;IAED,IAAI,CAAC,GAAS,EAAE,aAA6B,EAAE,WAAyB,EAAE,MAAiC;QACzG,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CAAC,CAAC,GAAG,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;CACF,CAAA;AAnYY,sBAAsB;IADlC,UAAU,EAAE;IAMR,WAAA,MAAM,CAAC,oBAAoB,CAAC,CAAA;IAC5B,WAAA,KAAK,CAAC,qBAAqB,CAAC,CAAA;;GANpB,sBAAsB,CAmYlC;SAnYY,sBAAsB","file":"arc-render.js","sourcesContent":["import { abs, acos, atan2, cos, epsilon, min, pi, sin, sqrt, pi2, isBoolean } from '@visactor/vutils';\nimport { inject, injectable, named } from '../../../common/inversify-lite';\nimport { getTheme } from '../../../graphic/theme';\nimport { parseStroke } from '../../../common/utils';\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport { ContributionProvider } from '../../../common/contribution-provider';\nimport type {\n IContext2d,\n IArc,\n IPath2D,\n IGraphicAttribute,\n IMarkAttribute,\n IThemeAttribute,\n IGradientColor,\n IArcRenderContribution,\n IDrawContext,\n IRenderService,\n IGraphicRender,\n IGraphicRenderDrawParams,\n IContributionProvider,\n IConicalGradient\n} from '../../../interface';\nimport {\n cornerTangents,\n drawArcPath,\n drawPathProxy,\n fillVisible,\n intersect,\n runFill,\n runStroke,\n strokeVisible\n} from './utils';\nimport { getConicGradientAt } from '../../../canvas/conical-gradient';\nimport { ArcRenderContribution } from './contributions/constants';\nimport { BaseRenderContributionTime } from '../../../common/enums';\nimport { ARC_NUMBER_TYPE } from '../../../graphic/constants';\nimport { BaseRender } from './base-render';\nimport {\n defaultArcBackgroundRenderContribution,\n defaultArcRenderContribution,\n defaultArcTextureRenderContribution\n} from './contributions';\n/**\n * 部分源码参考 https://github.com/d3/d3-shape/\n * Copyright 2010-2022 Mike Bostock\n\n Permission to use, copy, modify, and/or distribute this software for any purpose\n with or without fee is hereby granted, provided that the above copyright notice\n and this permission notice appear in all copies.\n\n THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\n THIS SOFTWARE.\n */\n\n@injectable()\nexport class DefaultCanvasArcRender extends BaseRender<IArc> implements IGraphicRender {\n type: 'arc';\n numberType: number = ARC_NUMBER_TYPE;\n\n constructor(\n @inject(ContributionProvider)\n @named(ArcRenderContribution)\n protected readonly arcRenderContribitions: IContributionProvider<IArcRenderContribution>\n ) {\n super();\n this.builtinContributions = [\n defaultArcRenderContribution,\n defaultArcBackgroundRenderContribution,\n defaultArcTextureRenderContribution\n ];\n this.init(arcRenderContribitions);\n }\n\n // 绘制尾部cap\n drawArcTailCapPath(\n arc: IArc,\n context: IContext2d | IPath2D,\n cx: number,\n cy: number,\n outerRadius: number,\n innerRadius: number,\n _sa: number,\n _ea: number\n ) {\n const capAngle = _ea - _sa;\n const data = arc.getParsedAngle();\n const startAngle = data.startAngle;\n let endAngle = data.endAngle;\n endAngle = _ea;\n const deltaAngle = abs(endAngle - startAngle);\n const clockwise: boolean = endAngle > startAngle;\n let collapsedToLine: boolean = false;\n // 规范化outerRadius和innerRadius\n if (outerRadius < innerRadius) {\n [innerRadius, outerRadius] = [outerRadius, innerRadius];\n }\n\n const cornerRadius = arc.getParsedCornerRadius();\n // Or is it a circular or annular sector?\n const { outerDeltaAngle, innerDeltaAngle, outerStartAngle, outerEndAngle, innerEndAngle, innerStartAngle } =\n arc.getParsePadAngle(startAngle, endAngle);\n\n const outerCornerRadiusStart = cornerRadius;\n const outerCornerRadiusEnd = cornerRadius;\n const innerCornerRadiusEnd = cornerRadius;\n const innerCornerRadiusStart = cornerRadius;\n const maxOuterCornerRadius = Math.max(outerCornerRadiusEnd, outerCornerRadiusStart);\n const maxInnerCornerRadius = Math.max(innerCornerRadiusEnd, innerCornerRadiusStart);\n let limitedOcr = maxOuterCornerRadius;\n let limitedIcr = maxInnerCornerRadius;\n\n const xors = outerRadius * cos(outerStartAngle);\n const yors = outerRadius * sin(outerStartAngle);\n const xire = innerRadius * cos(innerEndAngle);\n const yire = innerRadius * sin(innerEndAngle);\n\n // Apply rounded corners?\n let xore: number;\n let yore: number;\n let xirs: number;\n let yirs: number;\n\n if (maxInnerCornerRadius > epsilon || maxOuterCornerRadius > epsilon) {\n xore = outerRadius * cos(outerEndAngle);\n yore = outerRadius * sin(outerEndAngle);\n xirs = innerRadius * cos(innerStartAngle);\n yirs = innerRadius * sin(innerStartAngle);\n\n // Restrict the corner radius according to the sector angle.\n if (deltaAngle < pi) {\n const oc = intersect(xors, yors, xirs, yirs, xore, yore, xire, yire);\n\n if (oc) {\n const ax = xors - oc[0];\n const ay = yors - oc[1];\n const bx = xore - oc[0];\n const by = yore - oc[1];\n const kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2);\n const lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n\n limitedIcr = min(maxInnerCornerRadius, (innerRadius - lc) / (kc - 1));\n limitedOcr = min(maxOuterCornerRadius, (outerRadius - lc) / (kc + 1));\n }\n }\n }\n\n if (limitedOcr > epsilon) {\n const cornerRadiusStart = min(outerCornerRadiusStart, limitedOcr);\n const cornerRadiusEnd = min(outerCornerRadiusEnd, limitedOcr);\n // Does the sector’s outer ring have rounded corners?\n const t0 = cornerTangents(xirs, yirs, xors, yors, outerRadius, cornerRadiusStart, Number(clockwise));\n const t1 = cornerTangents(xore, yore, xire, yire, outerRadius, cornerRadiusEnd, Number(clockwise));\n\n // Have the corners merged?\n if (limitedOcr < maxOuterCornerRadius && cornerRadiusStart === cornerRadiusEnd) {\n context.moveTo(cx + t0.cx + t0.x01, cy + t0.cy + t0.y01);\n context.arc(cx + t0.cx, cy + t0.cy, limitedOcr, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !clockwise);\n } else {\n const a1 = endAngle - capAngle - 0.03;\n const a2 = atan2(t1.y11, t1.x11);\n context.arc(cx, cy, outerRadius, a1, a2, !clockwise);\n cornerRadiusEnd > 0 &&\n context.arc(\n cx + t1.cx,\n cy + t1.cy,\n cornerRadiusEnd,\n atan2(t1.y11, t1.x11),\n atan2(t1.y01, t1.x01),\n !clockwise\n );\n }\n } else {\n context.moveTo(cx + xors, cy + yors);\n }\n // else {\n // // Or is the outer ring just a circular arc?\n // if (!partStroke || partStroke[0]) {\n // context.moveTo(cx + xors, cy + yors);\n // context.arc(cx, cy, outerRadius, outerStartAngle, outerEndAngle, !clockwise);\n // } else {\n // // context.moveTo(cx + outerRadius * cos(outerEndAngle), cy + yore);\n // }\n // }\n // // Is there no inner ring, and it’s a circular sector?\n // // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(innerRadius > epsilon) || innerDeltaAngle < 0.001) {\n context.lineTo(cx + xire, cy + yire);\n collapsedToLine = true;\n } else if (limitedIcr > epsilon) {\n const cornerRadiusStart = min(innerCornerRadiusStart, limitedIcr);\n const cornerRadiusEnd = min(innerCornerRadiusEnd, limitedIcr);\n // Does the sector’s inner ring (or point) have rounded corners?\n const t0 = cornerTangents(xire, yire, xore, yore, innerRadius, -cornerRadiusEnd, Number(clockwise));\n const t1 = cornerTangents(xors, yors, xirs, yirs, innerRadius, -cornerRadiusStart, Number(clockwise));\n\n context.lineTo(cx + t0.cx + t0.x01, cy + t0.cy + t0.y01);\n\n // Have the corners merged?\n if (limitedIcr < maxInnerCornerRadius && cornerRadiusStart === cornerRadiusEnd) {\n const arcEndAngle = atan2(t1.y01, t1.x01);\n context.arc(cx + t0.cx, cy + t0.cy, limitedIcr, atan2(t0.y01, t0.x01), arcEndAngle, !clockwise);\n } else {\n cornerRadiusEnd > 0 &&\n context.arc(\n cx + t0.cx,\n cy + t0.cy,\n cornerRadiusEnd,\n atan2(t0.y01, t0.x01),\n atan2(t0.y11, t0.x11),\n !clockwise\n );\n const a1 = atan2(t0.cy + t0.y11, t0.cx + t0.x11);\n const a2 = endAngle - capAngle - 0.03;\n context.arc(cx, cy, innerRadius, a1, a2, clockwise);\n }\n } else {\n context.lineTo(cx + innerRadius * cos(innerStartAngle), cy + innerRadius * sin(innerStartAngle));\n }\n\n return collapsedToLine;\n }\n\n drawShape(\n arc: IArc,\n context: IContext2d,\n x: number,\n y: number,\n drawContext: IDrawContext,\n params?: IGraphicRenderDrawParams,\n fillCb?: (\n ctx: IContext2d,\n markAttribute: Partial<IMarkAttribute & IGraphicAttribute>,\n themeAttribute: IThemeAttribute\n ) => boolean,\n strokeCb?: (\n ctx: IContext2d,\n markAttribute: Partial<IMarkAttribute & IGraphicAttribute>,\n themeAttribute: IThemeAttribute\n ) => boolean\n ) {\n // const arcAttribute = graphicService.themeService.getCurrentTheme().arcAttribute;\n const arcAttribute = getTheme(arc, params?.theme).arc;\n const {\n fill = arcAttribute.fill,\n stroke = arcAttribute.stroke,\n x: originX = arcAttribute.x,\n y: originY = arcAttribute.y\n } = arc.attribute;\n const data = this.valid(arc, arcAttribute, fillCb, strokeCb);\n if (!data) {\n return;\n }\n const { fVisible, sVisible, doFill, doStroke } = data;\n\n const {\n outerPadding = arcAttribute.outerPadding,\n innerPadding = arcAttribute.innerPadding,\n cap = arcAttribute.cap,\n forceShowCap = arcAttribute.forceShowCap\n } = arc.attribute;\n let { outerRadius = arcAttribute.outerRadius, innerRadius = arcAttribute.innerRadius } = arc.attribute;\n outerRadius += outerPadding;\n innerRadius -= innerPadding;\n // 判断是否是环形渐变,且有头部cap,那就偏移渐变色角度\n let conicalOffset = 0;\n const tempChangeConicalColor =\n ((isBoolean(cap) && cap) || cap[0]) && (fill as IGradientColor).gradient === 'conical';\n if (tempChangeConicalColor) {\n const { sc, startAngle, endAngle } = arc.getParsedAngle();\n if (abs(endAngle - startAngle) < pi2 - epsilon) {\n conicalOffset = sc || 0;\n (fill as IConicalGradient).startAngle -= conicalOffset;\n (fill as IConicalGradient).endAngle -= conicalOffset;\n }\n }\n\n let beforeRenderContribitionsRuned = false;\n const { isFullStroke, stroke: arrayStroke } = parseStroke(stroke);\n if (doFill || isFullStroke) {\n context.beginPath();\n // if (arc.shouldUpdateShape()) {\n // // 更新shape\n // arc.cache = new Path2D(context);\n // this.drawArcPath(arc, arc.cache, x, y, outerRadius, innerRadius);\n // arc.clearUpdateShapeTag();\n // } else {\n // if (arc.cache) {\n // renderCommandList(arc.cache.commandList, context);\n // }\n // }\n // 测试后,cache对于重绘性能提升不大,但是在首屏有一定性能损耗,因此arc不再使用cache\n drawArcPath(arc, context, x, y, outerRadius, innerRadius);\n\n beforeRenderContribitionsRuned = true;\n // shadow\n context.setShadowBlendStyle && context.setShadowBlendStyle(arc, arc.attribute, arcAttribute);\n this.beforeRenderStep(\n arc,\n context,\n x,\n y,\n doFill,\n doStroke,\n fVisible,\n sVisible,\n arcAttribute,\n drawContext,\n fillCb,\n strokeCb\n );\n\n if (doFill) {\n if (fillCb) {\n fillCb(context, arc.attribute, arcAttribute);\n } else if (fVisible) {\n context.setCommonStyle(arc, arc.attribute, originX - x, originY - y, arcAttribute);\n context.fill();\n }\n }\n\n if (doStroke && isFullStroke) {\n if (strokeCb) {\n strokeCb(context, arc.attribute, arcAttribute);\n } else if (sVisible) {\n context.setStrokeStyle(arc, arc.attribute, originX - x, originY - y, arcAttribute);\n context.stroke();\n }\n }\n }\n\n // 需要局部渲染描边的时候\n if (!isFullStroke && doStroke) {\n context.beginPath();\n const collapsedToLine = drawArcPath(arc, context, x, y, outerRadius, innerRadius, arrayStroke);\n\n if (!beforeRenderContribitionsRuned) {\n this.beforeRenderStep(\n arc,\n context,\n x,\n y,\n doFill,\n doStroke,\n fVisible,\n sVisible,\n arcAttribute,\n drawContext,\n fillCb,\n strokeCb\n );\n }\n\n if (strokeCb) {\n strokeCb(context, arc.attribute, arcAttribute);\n } else if (sVisible) {\n context.setStrokeStyle(arc, arc.attribute, x, y, arcAttribute);\n context.stroke();\n }\n }\n\n // 绘制cap\n if (((isBoolean(cap) && cap) || cap[1]) && forceShowCap) {\n const { startAngle: sa, endAngle: ea } = arc.getParsedAngle();\n const deltaAngle = abs(ea - sa);\n if (deltaAngle >= pi2 - epsilon) {\n context.beginPath();\n const capWidth = Math.abs(outerRadius - innerRadius) / 2;\n // 以外边界长度为准\n const capAngle = capWidth / outerRadius;\n const { endAngle = arcAttribute.endAngle, fill = arcAttribute.fill } = arc.attribute;\n const startAngle = endAngle;\n this.drawArcTailCapPath(arc, context, x, y, outerRadius, innerRadius, startAngle, startAngle + capAngle);\n\n if (!beforeRenderContribitionsRuned) {\n this.beforeRenderStep(\n arc,\n context,\n x,\n y,\n doFill,\n doStroke,\n fVisible,\n sVisible,\n arcAttribute,\n drawContext,\n fillCb,\n strokeCb\n );\n }\n\n if (doFill) {\n // 获取渐变色最后一个颜色\n const color = fill;\n if ((color as IGradientColor).gradient === 'conical') {\n const lastColor = getConicGradientAt(0, 0, endAngle, color as any);\n if (fillCb) {\n // fillCb(context, arc.attribute, arcAttribute);\n } else if (fillVisible) {\n // context.closePath();\n context.setCommonStyle(arc, arc.attribute, x, y, arcAttribute);\n context.fillStyle = lastColor as string;\n context.fill();\n }\n }\n }\n if (doStroke) {\n if (strokeCb) {\n // fillCb(context, arc.attribute, arcAttribute);\n } else if (sVisible) {\n context.setStrokeStyle(arc, arc.attribute, x, y, arcAttribute);\n // context.strokeStyle = 'red';\n context.stroke();\n }\n }\n }\n }\n\n this.afterRenderStep(\n arc,\n context,\n x,\n y,\n doFill,\n doStroke,\n fVisible,\n sVisible,\n arcAttribute,\n drawContext,\n fillCb,\n strokeCb\n );\n\n if (tempChangeConicalColor) {\n (fill as IConicalGradient).startAngle += conicalOffset;\n (fill as IConicalGradient).endAngle += conicalOffset;\n }\n }\n\n draw(arc: IArc, renderService: IRenderService, drawContext: IDrawContext, params?: IGraphicRenderDrawParams) {\n const arcAttribute = getTheme(arc, params?.theme).arc;\n this._draw(arc, arcAttribute, false, drawContext, params);\n }\n}\n"]}
@@ -197,7 +197,7 @@ let DefaultCanvasAreaRender = class extends BaseRender {
197
197
  startP = segments[0].points[0], endP = endSeg.points[endSeg.points.length - 1];
198
198
  } else startP = points[0], endP = points[points.length - 1];
199
199
  const xTotalLength = abs(endP.x - startP.x), yTotalLength = abs(endP.y - startP.y);
200
- direction = Number.isFinite(xTotalLength + yTotalLength) ? xTotalLength > yTotalLength ? Direction.ROW : Direction.COLUMN : Direction.ROW,
200
+ direction = null == endP.x1 ? Direction.ROW : null == endP.y1 ? Direction.COLUMN : Number.isFinite(xTotalLength + yTotalLength) ? xTotalLength > yTotalLength ? Direction.ROW : Direction.COLUMN : Direction.ROW,
201
201
  drawAreaSegments(context.camera ? context : context.nativeContext, cache, clipRange, {
202
202
  offsetX: offsetX,
203
203
  offsetY: offsetY,