vislite 0.2.0 → 0.3.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 (88) hide show
  1. package/AUTHORS.txt +6 -6
  2. package/CHANGELOG +27 -1
  3. package/LICENSE +20 -20
  4. package/README.md +53 -53
  5. package/lib/Canvas/index.umd.js +87 -14
  6. package/lib/Canvas/index.umd.min.js +3 -3
  7. package/lib/Cardinal/index.umd.js +16 -5
  8. package/lib/Cardinal/index.umd.min.js +3 -3
  9. package/lib/Eoap/index.umd.js +2 -2
  10. package/lib/Eoap/index.umd.min.js +2 -2
  11. package/lib/Hermite/index.umd.js +2 -2
  12. package/lib/Hermite/index.umd.min.js +2 -2
  13. package/lib/Matrix4/index.umd.js +2 -2
  14. package/lib/Matrix4/index.umd.min.js +2 -2
  15. package/lib/Mercator/index.umd.js +2 -2
  16. package/lib/Mercator/index.umd.min.js +2 -2
  17. package/lib/OralCanvas/index.es.js +87 -14
  18. package/lib/OralCanvas/index.es.min.js +3 -3
  19. package/lib/OralWebGL/index.es.js +17 -6
  20. package/lib/OralWebGL/index.es.min.js +3 -3
  21. package/lib/SVG/index.umd.js +78 -62
  22. package/lib/SVG/index.umd.min.js +3 -3
  23. package/lib/WebGL/index.umd.js +15 -6
  24. package/lib/WebGL/index.umd.min.js +3 -3
  25. package/lib/animation/index.umd.js +2 -2
  26. package/lib/animation/index.umd.min.js +2 -2
  27. package/lib/getLoopColors/index.umd.js +2 -2
  28. package/lib/getLoopColors/index.umd.min.js +2 -2
  29. package/lib/index.umd.js +190 -81
  30. package/lib/index.umd.min.js +3 -3
  31. package/lib/rotate/index.umd.js +2 -2
  32. package/lib/rotate/index.umd.min.js +2 -2
  33. package/lib/ruler/index.umd.js +2 -2
  34. package/lib/ruler/index.umd.min.js +2 -2
  35. package/lib/viewHandler/index.umd.js +2 -2
  36. package/lib/viewHandler/index.umd.min.js +2 -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/common/webgl/doDraw.ts +13 -3
  69. package/src/common/webgl/getShader.ts +6 -0
  70. package/src/common/webgl/index.ts +4 -0
  71. package/src/getLoopColors.ts +42 -42
  72. package/src/interpolation/Cardinal.ts +109 -91
  73. package/src/interpolation/Hermite.ts +65 -65
  74. package/src/rotate.ts +7 -7
  75. package/src/ruler.ts +99 -99
  76. package/types/Canvas.d.ts +282 -221
  77. package/types/CanvasConfig.d.ts +3 -3
  78. package/types/Cardinal.d.ts +13 -13
  79. package/types/Gradient.d.ts +15 -0
  80. package/types/Hermite.d.ts +18 -18
  81. package/types/Matrix4.d.ts +42 -42
  82. package/types/Object3D.d.ts +7 -0
  83. package/types/SVG.d.ts +210 -210
  84. package/types/animation.d.ts +6 -6
  85. package/types/getLoopColors.d.ts +2 -2
  86. package/types/rotate.d.ts +2 -2
  87. package/types/ruler.d.ts +2 -2
  88. package/uni-app/ui-canvas.vue +22 -46
@@ -1,76 +1,157 @@
1
- import arc from './arc'
2
- import CanvasConfigType from '../../../types/CanvasConfig'
1
+ import arc from "./arc"
2
+ import CanvasConfigType from "../../../types/CanvasConfig"
3
3
 
4
4
  // 文字统一设置方法
5
- export let initText = function (painter: CanvasRenderingContext2D, config: CanvasConfigType, x: number, y: number, deg: number) {
6
-
7
- painter.beginPath()
8
- painter.translate(x, y)
9
- painter.rotate(deg)
10
- painter.font = config.fontStyle + " " + config.fontWeight + " " + config.fontSize + "px " + config.fontFamily
11
- return painter
12
- };
5
+ export let initText = function (
6
+ painter: CanvasRenderingContext2D,
7
+ config: CanvasConfigType,
8
+ x: number,
9
+ y: number,
10
+ deg: number
11
+ ) {
12
+ painter.beginPath();
13
+ painter.translate(x, y);
14
+ painter.rotate(deg);
15
+ painter.font =
16
+ config.fontStyle +
17
+ " " +
18
+ config.fontWeight +
19
+ " " +
20
+ config.fontSize +
21
+ "px " +
22
+ config.fontFamily;
23
+ return painter
24
+ }
13
25
 
14
26
  // 画弧统一设置方法
15
- export let initArc = function (painter: CanvasRenderingContext2D, config: CanvasConfigType, cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) {
27
+ export let initArc = function (
28
+ painter: CanvasRenderingContext2D,
29
+ config: CanvasConfigType,
30
+ cx: number,
31
+ cy: number,
32
+ r1: number,
33
+ r2: number,
34
+ beginDeg: number,
35
+ deg: number
36
+ ) {
37
+ if (r1 > r2) {
38
+ let temp = r1
39
+ r1 = r2
40
+ r2 = temp
41
+ }
16
42
 
17
- if (r1 > r2) {
18
- let temp = r1
19
- r1 = r2
20
- r2 = temp
21
- }
43
+ beginDeg = beginDeg % (Math.PI * 2)
22
44
 
23
- beginDeg = beginDeg % (Math.PI * 2)
45
+ // 当|deg|>=2π的时候都认为是一个圆环
46
+ // 为什么不取2π比较,是怕部分浏览器浮点不精确
47
+ if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
48
+ deg = Math.PI * 2
49
+ } else {
50
+ deg = deg % (Math.PI * 2)
51
+ }
24
52
 
25
- // 当|deg|>=2π的时候都认为是一个圆环
26
- // 为什么不取2π比较,是怕部分浏览器浮点不精确
27
- if (deg >= Math.PI * 1.999999 || deg <= -Math.PI * 1.999999) {
28
- deg = Math.PI * 2
29
- } else {
30
- deg = deg % (Math.PI * 2)
31
- }
32
-
33
- arc(beginDeg, deg, cx, cy, r1, r2, function (
34
- beginA: number, endA: number,
35
- begInnerX: number, begInnerY: number,
36
- begOuterX: number, begOuterY: number,
37
- endInnerX: number, endInnerY: number,
38
- endOuterX: number, endOuterY: number,
39
- r: number
53
+ arc(
54
+ beginDeg,
55
+ deg,
56
+ cx,
57
+ cy,
58
+ r1,
59
+ r2,
60
+ function (
61
+ beginA: number,
62
+ endA: number,
63
+ begInnerX: number,
64
+ begInnerY: number,
65
+ begOuterX: number,
66
+ begOuterY: number,
67
+ endInnerX: number,
68
+ endInnerY: number,
69
+ endOuterX: number,
70
+ endOuterY: number,
71
+ r: number
40
72
  ) {
41
- if (r < 0) r = -r;
42
- painter.beginPath()
43
- painter.moveTo(begInnerX, begInnerY)
73
+ if (r < 0) r = -r
74
+ painter.beginPath()
75
+ painter.moveTo(begInnerX, begInnerY)
76
+ painter.arc(
77
+ // (圆心x,圆心y,半径,开始角度,结束角度,true逆时针/false顺时针)
78
+ cx,
79
+ cy,
80
+ r1,
81
+ beginA,
82
+ endA,
83
+ false
84
+ )
85
+ // 结尾
86
+ if (config.arcEndCap == "round")
87
+ painter.arc(
88
+ (endInnerX + endOuterX) * 0.5,
89
+ (endInnerY + endOuterY) * 0.5,
90
+ r,
91
+ endA - Math.PI,
92
+ endA,
93
+ true
94
+ )
95
+ else if (config.arcEndCap == "-round")
44
96
  painter.arc(
45
- // (圆心x,圆心y,半径,开始角度,结束角度,true逆时针/false顺时针)
46
- cx, cy, r1, beginA, endA, false)
47
- // 结尾
48
- if (config.arcEndCap != 'round')
49
- painter.lineTo(endOuterX, endOuterY)
50
- else
51
- painter.arc((endInnerX + endOuterX) * 0.5, (endInnerY + endOuterY) * 0.5, r, endA - Math.PI, endA, true)
52
- painter.arc(cx, cy, r2, endA, beginA, true)
53
- // 开头
54
- if (config.arcStartCap != 'round')
55
- painter.lineTo(begInnerX, begInnerY);
56
- else
57
- painter.arc((begInnerX + begOuterX) * 0.5, (begInnerY + begOuterY) * 0.5, r, beginA, beginA - Math.PI, true)
58
- })
59
- if (config.arcStartCap == 'butt') painter.closePath()
60
- return painter
97
+ (endInnerX + endOuterX) * 0.5,
98
+ (endInnerY + endOuterY) * 0.5,
99
+ r,
100
+ endA - Math.PI,
101
+ endA,
102
+ false
103
+ )
104
+ else painter.lineTo(endOuterX, endOuterY)
105
+
106
+ painter.arc(cx, cy, r2, endA, beginA, true)
107
+ // 开头
108
+ if (config.arcStartCap == "round")
109
+ painter.arc(
110
+ (begInnerX + begOuterX) * 0.5,
111
+ (begInnerY + begOuterY) * 0.5,
112
+ r,
113
+ beginA,
114
+ beginA - Math.PI,
115
+ true
116
+ )
117
+ else if (config.arcStartCap == "-round")
118
+ painter.arc(
119
+ (begInnerX + begOuterX) * 0.5,
120
+ (begInnerY + begOuterY) * 0.5,
121
+ r,
122
+ beginA,
123
+ beginA - Math.PI,
124
+ false
125
+ )
126
+ else painter.lineTo(begInnerX, begInnerY)
127
+ }
128
+ )
129
+ if (config.arcStartCap == "butt") painter.closePath()
130
+ return painter
61
131
  }
62
132
 
63
133
  // 画圆统一设置方法
64
- export let initCircle = function (painter: CanvasRenderingContext2D, cx: number, cy: number, r: number) {
65
- painter.beginPath()
66
- painter.moveTo(cx + r, cy)
67
- painter.arc(cx, cy, r, 0, Math.PI * 2)
68
- return painter
69
- }
134
+ export let initCircle = function (
135
+ painter: CanvasRenderingContext2D,
136
+ cx: number,
137
+ cy: number,
138
+ r: number
139
+ ) {
140
+ painter.beginPath()
141
+ painter.moveTo(cx + r, cy)
142
+ painter.arc(cx, cy, r, 0, Math.PI * 2)
143
+ return painter
144
+ };
70
145
 
71
146
  // 画矩形统一设置方法
72
- export let initRect = function (painter: CanvasRenderingContext2D, x: number, y: number, width: number, height: number) {
73
- painter.beginPath()
74
- painter.rect(x, y, width, height)
75
- return painter
147
+ export let initRect = function (
148
+ painter: CanvasRenderingContext2D,
149
+ x: number,
150
+ y: number,
151
+ width: number,
152
+ height: number
153
+ ) {
154
+ painter.beginPath()
155
+ painter.rect(x, y, width, height)
156
+ return painter
76
157
  }
@@ -0,0 +1,29 @@
1
+ // 线性渐变
2
+ export let linearGradient = function (painter: CanvasRenderingContext2D, x0: number, y0: number, x1: number, y1: number) {
3
+ let gradient = painter.createLinearGradient(x0, y0, x1, y1)
4
+ let enhanceGradient = {
5
+ "value": function () {
6
+ return gradient
7
+ },
8
+ "setColor": function (stop: number, color: string) {
9
+ gradient.addColorStop(stop, color)
10
+ return enhanceGradient
11
+ }
12
+ };
13
+ return enhanceGradient
14
+ }
15
+
16
+ // 环形渐变
17
+ export let radialGradient = function (painter: CanvasRenderingContext2D, cx: number, cy: number, r: number) {
18
+ let gradient = painter.createRadialGradient(cx, cy, 0, cx, cy, r)
19
+ let enhanceGradient = {
20
+ "value": function () {
21
+ return gradient
22
+ },
23
+ "setColor": function (stop: number, color: string) {
24
+ gradient.addColorStop(stop, color)
25
+ return enhanceGradient
26
+ }
27
+ }
28
+ return enhanceGradient
29
+ }
@@ -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
  }