vislite 0.2.0 → 0.3.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/AUTHORS.txt +6 -6
  2. package/CHANGELOG +19 -1
  3. package/LICENSE +20 -20
  4. package/README.md +53 -53
  5. package/lib/Canvas/index.umd.js +91 -14
  6. package/lib/Canvas/index.umd.min.js +7 -3
  7. package/lib/Cardinal/index.umd.js +6 -2
  8. package/lib/Cardinal/index.umd.min.js +6 -2
  9. package/lib/Eoap/index.umd.js +6 -2
  10. package/lib/Eoap/index.umd.min.js +6 -2
  11. package/lib/Hermite/index.umd.js +6 -2
  12. package/lib/Hermite/index.umd.min.js +6 -2
  13. package/lib/Matrix4/index.umd.js +6 -2
  14. package/lib/Matrix4/index.umd.min.js +6 -2
  15. package/lib/Mercator/index.umd.js +6 -2
  16. package/lib/Mercator/index.umd.min.js +6 -2
  17. package/lib/OralCanvas/index.es.js +91 -14
  18. package/lib/OralCanvas/index.es.min.js +7 -3
  19. package/lib/OralWebGL/index.es.js +8 -2
  20. package/lib/OralWebGL/index.es.min.js +6 -2
  21. package/lib/SVG/index.umd.js +82 -62
  22. package/lib/SVG/index.umd.min.js +7 -3
  23. package/lib/WebGL/index.umd.js +6 -2
  24. package/lib/WebGL/index.umd.min.js +6 -2
  25. package/lib/animation/index.umd.js +6 -2
  26. package/lib/animation/index.umd.min.js +6 -2
  27. package/lib/getLoopColors/index.umd.js +6 -2
  28. package/lib/getLoopColors/index.umd.min.js +6 -2
  29. package/lib/index.umd.js +167 -74
  30. package/lib/index.umd.min.js +7 -3
  31. package/lib/rotate/index.umd.js +6 -2
  32. package/lib/rotate/index.umd.min.js +6 -2
  33. package/lib/ruler/index.umd.js +6 -2
  34. package/lib/ruler/index.umd.min.js +6 -2
  35. package/lib/viewHandler/index.umd.js +6 -2
  36. package/lib/viewHandler/index.umd.min.js +6 -2
  37. package/miniprogram/ui-canvas/index.json +4 -4
  38. package/miniprogram/ui-canvas/index.wxml +4 -4
  39. package/miniprogram/ui-canvas/index.wxss +5 -5
  40. package/package/Canvas/index.ts +1 -1
  41. package/package/Cardinal/index.ts +2 -2
  42. package/package/Eoap/index.ts +2 -2
  43. package/package/Hermite/index.ts +2 -2
  44. package/package/Matrix4/index.ts +2 -2
  45. package/package/OralCanvas/index.ts +1 -1
  46. package/package/OralWebGL/index.ts +1 -1
  47. package/package/SVG/index.ts +2 -2
  48. package/package/animation/index.ts +2 -2
  49. package/package/getLoopColors/index.ts +2 -2
  50. package/package/rotate/index.ts +2 -2
  51. package/package/ruler/index.ts +2 -2
  52. package/package.json +4 -4
  53. package/src/Matrix4/index.ts +76 -76
  54. package/src/Matrix4/move.ts +12 -12
  55. package/src/Matrix4/rotate.ts +15 -15
  56. package/src/Matrix4/scale.ts +11 -11
  57. package/src/Matrix4/transform.ts +64 -64
  58. package/src/animation.ts +99 -99
  59. package/src/common/canvas/arc.ts +50 -50
  60. package/src/common/canvas/config.ts +142 -61
  61. package/src/common/canvas/gradient.ts +29 -0
  62. package/src/common/canvas/index.ts +122 -82
  63. package/src/common/canvas/painter.ts +12 -0
  64. package/src/common/setStyle.ts +5 -5
  65. package/src/common/svg/config.ts +173 -128
  66. package/src/common/svg/index.ts +315 -266
  67. package/src/common/svg/tool.ts +43 -43
  68. package/src/getLoopColors.ts +42 -42
  69. package/src/interpolation/Cardinal.ts +91 -91
  70. package/src/interpolation/Hermite.ts +65 -65
  71. package/src/rotate.ts +7 -7
  72. package/src/ruler.ts +99 -99
  73. package/types/Canvas.d.ts +282 -221
  74. package/types/CanvasConfig.d.ts +3 -3
  75. package/types/Cardinal.d.ts +13 -13
  76. package/types/Gradient.d.ts +15 -0
  77. package/types/Hermite.d.ts +18 -18
  78. package/types/Matrix4.d.ts +42 -42
  79. package/types/SVG.d.ts +210 -210
  80. package/types/animation.d.ts +6 -6
  81. package/types/getLoopColors.d.ts +2 -2
  82. package/types/rotate.d.ts +2 -2
  83. package/types/ruler.d.ts +2 -2
  84. package/uni-app/ui-canvas.vue +22 -46
@@ -1,97 +1,137 @@
1
- import CanvasConfigType from '../../../types/CanvasConfig'
2
- import PainterRender from './painter'
3
- import assemble from '../assemble'
1
+ import CanvasConfigType from "../../../types/CanvasConfig"
2
+ import PainterRender from "./painter"
3
+ import assemble from "../assemble"
4
+ import { linearGradient, radialGradient } from "./gradient"
4
5
 
5
6
  // 属性名向下兼容
6
7
  let oldAttrName = {
7
- "font-size": "fontSize",
8
- "font-family": "fontFamily",
9
- "font-weight": "fontWeight",
10
- "font-style": "fontStyle",
11
- "arc-start-cap": "arcStartCap",
12
- "arc-end-cap": "arcEndCap"
8
+ "font-size": "fontSize",
9
+ "font-family": "fontFamily",
10
+ "font-weight": "fontWeight",
11
+ "font-style": "fontStyle",
12
+ "arc-start-cap": "arcStartCap",
13
+ "arc-end-cap": "arcEndCap",
13
14
  }
14
15
 
15
16
  class Canvas extends PainterRender {
16
-
17
- readonly name: string = "Canvas"
18
-
19
- private __regionList = {} //区域映射表
20
- private __regionAssemble = assemble(0, 255, 1, 3)
21
-
22
- constructor(ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement) {
23
- super(ViewCanvas, {}, new PainterRender(RegionCanvas, {
24
- willReadFrequently: true
25
- }))
26
-
27
- this.setRegion("")
17
+ readonly name: string = "Canvas"
18
+
19
+ private __regionList = {} //区域映射表
20
+ private __regionAssemble = assemble(0, 255, 1, 3)
21
+
22
+ constructor(ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement) {
23
+ super(
24
+ ViewCanvas,
25
+ {},
26
+ new PainterRender(RegionCanvas, {
27
+ willReadFrequently: true,
28
+ })
29
+ )
30
+
31
+ this.setRegion("")
32
+ }
33
+
34
+ config(configs: CanvasConfigType) {
35
+ for (let key in configs) {
36
+ let _key = oldAttrName[key] || key
37
+ this.useConfig(_key, configs[key])
28
38
  }
29
39
 
30
- config(configs: CanvasConfigType) {
31
- for (let key in configs) {
32
- let _key = oldAttrName[key] || key
33
- this.useConfig(_key, configs[key])
40
+ return this
41
+ }
42
+
43
+ // 设置当前绘制区域名称
44
+ setRegion(regionName: string | number) {
45
+ if (regionName) {
46
+ if (this.__regionList[regionName] == undefined) {
47
+ let tempColor = this.__regionAssemble()
48
+ this.__regionList[regionName] =
49
+ "rgb(" + tempColor[0] + "," + tempColor[1] + "," + tempColor[2] + ")"
50
+ }
51
+
52
+ this.__region.useConfig("fillStyle", this.__regionList[regionName]) &&
53
+ this.__region.useConfig("strokeStyle", this.__regionList[regionName])
54
+ } else {
55
+ this.__region.useConfig("fillStyle", "#000000") &&
56
+ this.__region.useConfig("strokeStyle", "#000000")
57
+ }
58
+ return this
59
+ }
60
+
61
+ // 获取当前事件触发的区域名称
62
+ getRegion(x: number, y: number): Promise<string> {
63
+ return new Promise((resolve, reject) => {
64
+ let imgData = this.__region.painter.getImageData(x - 0.5, y - 0.5, 1, 1)
65
+
66
+ // 获取点击点的颜色
67
+ let currentRGBA = imgData.data
68
+
69
+ let doit = () => {
70
+ // 查找当前点击的区域
71
+ for (let key in this.__regionList) {
72
+ if (
73
+ "rgb(" +
74
+ currentRGBA[0] +
75
+ "," +
76
+ currentRGBA[1] +
77
+ "," +
78
+ currentRGBA[2] +
79
+ ")" ==
80
+ this.__regionList[key]
81
+ ) {
82
+ resolve(key)
83
+ break
84
+ }
34
85
  }
35
86
 
36
- return this
37
- }
87
+ resolve("")
88
+ }
38
89
 
39
- // 设置当前绘制区域名称
40
- setRegion(regionName: string | number) {
41
- if (regionName) {
42
- if (this.__regionList[regionName] == undefined) {
43
- let tempColor = this.__regionAssemble()
44
- this.__regionList[regionName] = "rgb(" + tempColor[0] + "," + tempColor[1] + "," + tempColor[2] + ")"
45
- }
46
-
47
- this.__region.useConfig("fillStyle", this.__regionList[regionName]) &&
48
- this.__region.useConfig("strokeStyle", this.__regionList[regionName])
49
- } else {
50
- this.__region.useConfig("fillStyle", "#000000") &&
51
- this.__region.useConfig("strokeStyle", "#000000")
52
- }
53
- return this
54
- }
90
+ // 如果有值
91
+ if (currentRGBA) {
92
+ doit()
93
+ }
55
94
 
56
- // 获取当前事件触发的区域名称
57
- getRegion(x: number, y: number): Promise<string> {
58
- return new Promise((resolve, reject) => {
59
- let imgData = this.__region.painter.getImageData(x - 0.5, y - 0.5, 1, 1)
60
-
61
- // 获取点击点的颜色
62
- let currentRGBA = imgData.data
63
-
64
- let doit = () => {
65
- // 查找当前点击的区域
66
- for (let key in this.__regionList) {
67
- if ("rgb(" + currentRGBA[0] + "," + currentRGBA[1] + "," + currentRGBA[2] + ")" == this.__regionList[key]) {
68
- resolve(key)
69
- break
70
- }
71
- }
72
-
73
- resolve("")
74
- }
75
-
76
- // 如果有值
77
- if (currentRGBA) {
78
- doit()
79
- }
80
-
81
- // 否则就是在Promise中
82
- else {
83
- (imgData as any).then((data: Uint8ClampedArray) => {
84
- currentRGBA = data
85
- doit()
86
- })
87
- }
95
+ // 否则就是在Promise中
96
+ else {
97
+ (imgData as any).then((data: Uint8ClampedArray) => {
98
+ currentRGBA = data
99
+ doit()
88
100
  })
89
- }
90
-
91
- // 获取原始画笔
92
- getContext(isRegion = false) {
93
- return isRegion ? this.__region.painter : this.painter
94
- }
101
+ }
102
+ })
103
+ }
104
+
105
+ // 获取原始画笔
106
+ getContext(isRegion = false) {
107
+ return isRegion ? this.__region.painter : this.painter
108
+ }
109
+
110
+ // 线性渐变
111
+ createLinearGradient(x0: number, y0: number, x1: number, y1: number) {
112
+ return linearGradient(this.painter, x0, y0, x1, y1)
113
+ }
114
+
115
+ // 环形渐变
116
+ createRadialGradient(cx: number, cy: number, r: number) {
117
+ return radialGradient(this.painter, cx, cy, r)
118
+ }
119
+
120
+ // 获取指定位置颜色
121
+ getColor(x: number, y: number) {
122
+ let currentRGBA = this.painter.getImageData(x - 0.5, y - 0.5, 1, 1).data
123
+ return (
124
+ "rgba(" +
125
+ currentRGBA[0] +
126
+ "," +
127
+ currentRGBA[1] +
128
+ "," +
129
+ currentRGBA[2] +
130
+ "," +
131
+ currentRGBA[3] +
132
+ ")"
133
+ )
134
+ }
95
135
  }
96
136
 
97
- export default Canvas
137
+ export default Canvas
@@ -101,6 +101,12 @@ class Painter {
101
101
 
102
102
  // 如果已经存在默认配置中,说明只需要缓存起来即可
103
103
  else if (key in this.__specialConfig) {
104
+
105
+ // 文字非整数可能存在问题,修复一下
106
+ if (key == 'fontSize') {
107
+ value = Math.round(value)
108
+ }
109
+
104
110
  this.__specialConfig[key] = value
105
111
  }
106
112
 
@@ -251,6 +257,12 @@ class Painter {
251
257
  this.painter.restore()
252
258
  return this
253
259
  }
260
+ clip() {
261
+ if (this.__region) this.__region.clip()
262
+
263
+ this.painter.clip()
264
+ return this
265
+ }
254
266
 
255
267
  // 路径 - 贝塞尔曲线
256
268
  quadraticCurveTo(cpx: number, cpy: number, x: number, y: number) {
@@ -1,6 +1,6 @@
1
- // 修改样式
2
- export default function (el: HTMLElement | SVGElement, styles: any) {
3
- for (let key in styles) {
4
- el.style[key] = styles[key]
5
- }
1
+ // 修改样式
2
+ export default function (el: HTMLElement | SVGElement, styles: any) {
3
+ for (let key in styles) {
4
+ el.style[key] = styles[key]
5
+ }
6
6
  }
@@ -1,128 +1,173 @@
1
- import { setAttribute } from "./tool"
2
- import setStyle from "../setStyle"
3
- import arc from '../canvas/arc'
4
- import SVGConfigType from '../../../types/SVGConfig'
5
-
6
- // 文字统一设置方法
7
- export let initText = (el: SVGElement, config: SVGConfigType, x: number, y: number, deg: number) => {
8
- if (el.nodeName.toLowerCase() !== 'text') throw new Error('Need a <text> !')
9
-
10
- // 垂直对齐采用dy实现
11
- setAttribute(el, "dy", {
12
- "top": config['font-size'] * 0.5,
13
- "middle": 0,
14
- "bottom": -config['font-size'] * 0.5,
15
- }[config.textBaseline])
16
-
17
- setStyle(el, {
18
-
19
- // 文字对齐方式
20
- "text-anchor": {
21
- "left": "start",
22
- "right": "end",
23
- "center": "middle"
24
- }[config.textAlign],
25
- "dominant-baseline": "central",
26
-
27
- // 文字大小和字体设置
28
- "font-size": config['font-size'] + "px",
29
- "font-family": config['font-family']
30
- })
31
-
32
- // 位置
33
- setAttribute(el, "x", x)
34
- setAttribute(el, "y", y)
35
-
36
- // 旋转
37
- if (typeof deg == "number") {
38
- deg = deg % 360
39
- setAttribute(el, "transform", "rotate(" + deg + "," + x + "," + y + ")")
40
- }
41
- }
42
-
43
- // 画圆统一设置方法
44
- export let initCircle = (el: SVGElement, cx: number, cy: number, r: number) => {
45
- if (el.nodeName.toLowerCase() !== 'circle') throw new Error('Need a <circle> !')
46
- setAttribute(el, 'cx', cx)
47
- setAttribute(el, 'cy', cy)
48
- setAttribute(el, 'r', r)
49
- }
50
-
51
- // 路径统一设置方法
52
- export let initPath = (el: SVGElement, path: string) => {
53
- if (el.nodeName.toLowerCase() !== 'path') throw new Error('Need a <path> !')
54
- setAttribute(el, 'd', path)
55
- }
56
-
57
- // 画矩形统一设置方法
58
- export let initRect = (el: SVGElement, x: number, y: number, width: number, height: number) => {
59
- if (el.nodeName.toLowerCase() !== 'rect') throw new Error('Need a <rect> !')
60
-
61
- // 由于高和宽不可以是负数,校对一下
62
- if (height < 0) { height *= -1; y -= height }
63
- if (width < 0) { width *= -1; x -= width }
64
-
65
- setAttribute(el, 'x', x)
66
- setAttribute(el, 'y', y)
67
- setAttribute(el, 'width', width)
68
- setAttribute(el, 'height', height)
69
- }
70
-
71
- // 画弧统一设置方法
72
- export let initArc = (el: SVGElement, config: SVGConfigType, cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) => {
73
-
74
- if (el.nodeName.toLowerCase() !== 'path') throw new Error('Need a <path> !')
75
-
76
- beginDeg = beginDeg % (Math.PI * 2)
77
-
78
- if (r1 > r2) {
79
- let temp = r1
80
- r1 = r2
81
- r2 = temp
82
- }
83
-
84
- // 当|deg|>=2π的时候都认为是一个圆环
85
- if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
86
- deg = Math.PI * 1.999999
87
- } else {
88
- deg = deg % (Math.PI * 2)
89
- }
90
-
91
- arc(beginDeg, deg, cx, cy, r1, r2, function (
92
- beginA: number, endA: number,
93
- begInnerX: number, begInnerY: number,
94
- begOuterX: number, begOuterY: number,
95
- endInnerX: number, endInnerY: number,
96
- endOuterX: number, endOuterY: number,
97
- r: number
98
- ) {
99
-
100
- let f = (endA - beginA) > Math.PI ? 1 : 0,
101
- d = "M" + begInnerX + " " + begInnerY
102
- if (r < 0) r = -r
103
- d +=
104
- // 横半径 竖半径 x轴偏移角度 0小弧/1大弧 0逆时针/1顺时针 终点x 终点y
105
- "A" + r1 + " " + r1 + " 0 " + f + " 1 " + endInnerX + " " + endInnerY
106
-
107
- // 结尾
108
- if (config["arc-end-cap"] == 'round')
109
- d += "A" + r + " " + r + " " + " 0 1 0 " + endOuterX + " " + endOuterY
110
- else if (config["arc-end-cap"] == '-round')
111
- d += "A" + r + " " + r + " " + " 0 1 1 " + endOuterX + " " + endOuterY
112
- else
113
- d += "L" + endOuterX + " " + endOuterY
114
- d += "A" + r2 + " " + r2 + " 0 " + f + " 0 " + begOuterX + " " + begOuterY
115
-
116
- // 开头
117
- if (config["arc-start-cap"] == 'round')
118
- d += "A" + r + " " + r + " " + " 0 1 0 " + begInnerX + " " + begInnerY
119
- else if (config["arc-start-cap"] == '-round')
120
- d += "A" + r + " " + r + " " + " 0 1 1 " + begInnerX + " " + begInnerY
121
- else
122
- d += "L" + begInnerX + " " + begInnerY
123
-
124
- if (config["arc-start-cap"] == 'butt') d += "Z"
125
-
126
- setAttribute(el, 'd', d)
127
- })
128
- }
1
+ import { setAttribute } from "./tool"
2
+ import setStyle from "../setStyle"
3
+ import arc from "../canvas/arc"
4
+ import SVGConfigType from "../../../types/SVGConfig"
5
+
6
+ // 文字统一设置方法
7
+ export let initText = (
8
+ el: SVGElement,
9
+ config: SVGConfigType,
10
+ x: number,
11
+ y: number,
12
+ deg: number
13
+ ) => {
14
+ if (el.nodeName.toLowerCase() !== "text") throw new Error("Need a <text> !")
15
+
16
+ // 垂直对齐采用dy实现
17
+ setAttribute(
18
+ el,
19
+ "dy",
20
+ {
21
+ top: config["fontSize"] * 0.5,
22
+ middle: 0,
23
+ bottom: -config["fontSize"] * 0.5,
24
+ }[config.textBaseline]
25
+ )
26
+
27
+ setStyle(el, {
28
+ // 文字对齐方式
29
+ "text-anchor": {
30
+ left: "start",
31
+ right: "end",
32
+ center: "middle",
33
+ }[config.textAlign],
34
+ "dominant-baseline": "central",
35
+
36
+ // 文字大小和字体设置
37
+ "font-size": config["fontSize"] + "px",
38
+ "font-family": config["fontFamily"],
39
+ })
40
+
41
+ // 位置
42
+ setAttribute(el, "x", x)
43
+ setAttribute(el, "y", y)
44
+
45
+ // 旋转
46
+ if (typeof deg == "number") {
47
+ deg = deg % 360
48
+ setAttribute(el, "transform", "rotate(" + deg + "," + x + "," + y + ")")
49
+ }
50
+ }
51
+
52
+ // 画圆统一设置方法
53
+ export let initCircle = (el: SVGElement, cx: number, cy: number, r: number) => {
54
+ if (el.nodeName.toLowerCase() !== "circle")
55
+ throw new Error("Need a <circle> !")
56
+ setAttribute(el, "cx", cx)
57
+ setAttribute(el, "cy", cy)
58
+ setAttribute(el, "r", r)
59
+ }
60
+
61
+ // 路径统一设置方法
62
+ export let initPath = (el: SVGElement, path: string) => {
63
+ if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
64
+ setAttribute(el, "d", path)
65
+ }
66
+
67
+ // 画矩形统一设置方法
68
+ export let initRect = (
69
+ el: SVGElement,
70
+ x: number,
71
+ y: number,
72
+ width: number,
73
+ height: number
74
+ ) => {
75
+ if (el.nodeName.toLowerCase() !== "rect") throw new Error("Need a <rect> !")
76
+
77
+ // 由于高和宽不可以是负数,校对一下
78
+ if (height < 0) {
79
+ height *= -1
80
+ y -= height
81
+ }
82
+ if (width < 0) {
83
+ width *= -1
84
+ x -= width
85
+ }
86
+
87
+ setAttribute(el, "x", x)
88
+ setAttribute(el, "y", y)
89
+ setAttribute(el, "width", width)
90
+ setAttribute(el, "height", height)
91
+ }
92
+
93
+ // 画弧统一设置方法
94
+ export let initArc = (
95
+ el: SVGElement,
96
+ config: SVGConfigType,
97
+ cx: number,
98
+ cy: number,
99
+ r1: number,
100
+ r2: number,
101
+ beginDeg: number,
102
+ deg: number
103
+ ) => {
104
+ if (el.nodeName.toLowerCase() !== "path") throw new Error("Need a <path> !")
105
+
106
+ beginDeg = (beginDeg / 180) * Math.PI
107
+ deg = (deg / 180) * Math.PI
108
+
109
+ beginDeg = beginDeg % (Math.PI * 2)
110
+
111
+ if (r1 > r2) {
112
+ let temp = r1
113
+ r1 = r2
114
+ r2 = temp
115
+ }
116
+
117
+ // 当|deg|>=2π的时候都认为是一个圆环
118
+ if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
119
+ deg = Math.PI * 1.999999
120
+ } else {
121
+ deg = deg % (Math.PI * 2)
122
+ }
123
+
124
+ arc(
125
+ beginDeg,
126
+ deg,
127
+ cx,
128
+ cy,
129
+ r1,
130
+ r2,
131
+ function (
132
+ beginA: number,
133
+ endA: number,
134
+ begInnerX: number,
135
+ begInnerY: number,
136
+ begOuterX: number,
137
+ begOuterY: number,
138
+ endInnerX: number,
139
+ endInnerY: number,
140
+ endOuterX: number,
141
+ endOuterY: number,
142
+ r: number
143
+ ) {
144
+ let f = endA - beginA > Math.PI ? 1 : 0,
145
+ d = "M" + begInnerX + " " + begInnerY
146
+ if (r < 0) r = -r
147
+
148
+ d +=
149
+ // 横半径 竖半径 x轴偏移角度 0小弧/1大弧 0逆时针/1顺时针 终点x 终点y
150
+ "A" + r1 + " " + r1 + " 0 " + f + " 1 " + endInnerX + " " + endInnerY
151
+
152
+ // 结尾
153
+ if (config.arcEndCap == "round")
154
+ d += "A" + r + " " + r + " " + " 0 1 0 " + endOuterX + " " + endOuterY
155
+ else if (config.arcEndCap == "-round")
156
+ d += "A" + r + " " + r + " " + " 0 1 1 " + endOuterX + " " + endOuterY
157
+ else d += "L" + endOuterX + " " + endOuterY
158
+ d +=
159
+ "A" + r2 + " " + r2 + " 0 " + f + " 0 " + begOuterX + " " + begOuterY
160
+
161
+ // 开头
162
+ if (config.arcStartCap == "round")
163
+ d += "A" + r + " " + r + " " + " 0 1 0 " + begInnerX + " " + begInnerY
164
+ else if (config.arcStartCap == "-round")
165
+ d += "A" + r + " " + r + " " + " 0 1 1 " + begInnerX + " " + begInnerY
166
+ else d += "L" + begInnerX + " " + begInnerY
167
+
168
+ if (config.arcStartCap == "butt") d += "Z"
169
+
170
+ setAttribute(el, "d", d)
171
+ }
172
+ )
173
+ }