vislite 1.2.0-alpha.2 → 1.2.0-alpha.4
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.
- package/CHANGELOG +266 -254
- package/lib/Buffer/index.es.js +1 -1
- package/lib/Buffer/index.es.min.js +1 -1
- package/lib/Canvas/index.es.js +16 -5
- package/lib/Canvas/index.es.min.js +2 -2
- package/lib/Cardinal/index.es.js +1 -1
- package/lib/Cardinal/index.es.min.js +1 -1
- package/lib/Eoap/index.es.js +1 -1
- package/lib/Eoap/index.es.min.js +1 -1
- package/lib/Hermite/index.es.js +1 -1
- package/lib/Hermite/index.es.min.js +1 -1
- package/lib/Matrix4/index.es.js +1 -1
- package/lib/Matrix4/index.es.min.js +1 -1
- package/lib/Mercator/index.es.js +1 -1
- package/lib/Mercator/index.es.min.js +1 -1
- package/lib/RawCanvas/index.es.js +15 -4
- package/lib/RawCanvas/index.es.min.js +2 -2
- package/lib/SVG/index.es.js +12 -8
- package/lib/SVG/index.es.min.js +2 -2
- package/lib/Shader/index.es.js +1 -1
- package/lib/Shader/index.es.min.js +1 -1
- package/lib/Texture/index.es.js +1 -1
- package/lib/Texture/index.es.min.js +1 -1
- package/lib/TreeLayout/index.es.js +38 -8
- package/lib/TreeLayout/index.es.min.js +2 -2
- package/lib/animation/index.es.js +38 -8
- package/lib/animation/index.es.min.js +2 -2
- package/lib/assemble/index.es.js +1 -1
- package/lib/assemble/index.es.min.js +1 -1
- package/lib/getLoopColors/index.es.js +1 -1
- package/lib/getLoopColors/index.es.min.js +1 -1
- package/lib/getWebGLContext/index.es.js +1 -1
- package/lib/getWebGLContext/index.es.min.js +1 -1
- package/lib/index.umd.js +88 -36
- package/lib/index.umd.min.js +2 -2
- package/lib/initOption/index.es.js +1 -1
- package/lib/initOption/index.es.min.js +1 -1
- package/lib/mergeOption/index.es.js +1 -1
- package/lib/mergeOption/index.es.min.js +1 -1
- package/lib/move/index.es.js +1 -1
- package/lib/move/index.es.min.js +1 -1
- package/lib/rotate/index.es.js +1 -1
- package/lib/rotate/index.es.min.js +1 -1
- package/lib/ruler/index.es.js +1 -1
- package/lib/ruler/index.es.min.js +1 -1
- package/lib/scale/index.es.js +1 -1
- package/lib/scale/index.es.min.js +1 -1
- package/lib/throttle/index.es.js +25 -25
- package/lib/throttle/index.es.min.js +2 -2
- package/miniprogram/ui-canvas/index.js +115 -115
- package/package/animation/index.ts +1 -1
- package/package/throttle/index.ts +1 -1
- package/package.json +7 -2
- package/src/Canvas.ts +84 -84
- package/src/common/canvas/gradient.ts +32 -24
- package/src/common/canvas/index.ts +182 -177
- package/src/common/canvas/painter.ts +9 -3
- package/src/common/svg/config.ts +194 -190
- package/src/common/svg/index.ts +350 -347
- package/src/common/svg/tool.ts +42 -44
- package/src/layout/TreeLayout.ts +1 -1
- package/types/Canvas.d.ts +10 -1
- package/types/CanvasConfig.d.ts +116 -106
- package/types/SVGConfig.d.ts +89 -79
- package/types/animation.d.ts +2 -6
- package/types/index.d.ts +160 -158
- package/types/painterConfig.d.ts +5 -3
- package/types/throttle.d.ts +2 -4
- package/types/throttleOption.d.ts +1 -22
- package/types/uni-canvas.d.ts +4 -0
- package/src/animation.ts +0 -99
- package/src/throttle.ts +0 -53
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
import RawCanvas from "../../lib/RawCanvas/index.es.min.js";
|
|
2
|
-
import drawImage from "./drawImage.js";
|
|
3
|
-
|
|
4
|
-
let dpr = wx.getSystemInfoSync().pixelRatio;
|
|
5
|
-
|
|
6
|
-
Component({
|
|
7
|
-
properties: {
|
|
8
|
-
width: {
|
|
9
|
-
type: Number,
|
|
10
|
-
default: 300
|
|
11
|
-
},
|
|
12
|
-
height: {
|
|
13
|
-
type: Number,
|
|
14
|
-
default: 150
|
|
15
|
-
},
|
|
16
|
-
region: {
|
|
17
|
-
type: Boolean,
|
|
18
|
-
default:
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
data: {
|
|
22
|
-
help: {}
|
|
23
|
-
},
|
|
24
|
-
lifetimes: {
|
|
25
|
-
ready() {
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
methods: {
|
|
30
|
-
fetch() {
|
|
31
|
-
return new Promise((resolve, reject) => {
|
|
32
|
-
|
|
33
|
-
let getCanvasContext = (idName, doback) => {
|
|
34
|
-
if (idName != 'region' || this.data.region) {
|
|
35
|
-
const query = wx.createSelectorQuery().in(this);
|
|
36
|
-
query.select('#' + idName)
|
|
37
|
-
.fields({ node: true, size: true })
|
|
38
|
-
.exec((res) => {
|
|
39
|
-
const canvas = res[0].node;
|
|
40
|
-
const ctx = canvas.getContext('2d');
|
|
41
|
-
|
|
42
|
-
canvas.width = res[0].width * (idName == "region" ? 1 : dpr);
|
|
43
|
-
canvas.height = res[0].height * (idName == "region" ? 1 : dpr);
|
|
44
|
-
|
|
45
|
-
if (idName != "region") {
|
|
46
|
-
ctx.scale(dpr, dpr);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
doback(ctx, idName != 'region' ? canvas : null);
|
|
50
|
-
});
|
|
51
|
-
} else {
|
|
52
|
-
doback(null);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
getCanvasContext("painter", (painter, panvas) => {
|
|
57
|
-
getCanvasContext("region", region => {
|
|
58
|
-
this.data.help.instance = new RawCanvas({
|
|
59
|
-
getContext() {
|
|
60
|
-
return painter;
|
|
61
|
-
}
|
|
62
|
-
}, this.data.region ? {
|
|
63
|
-
getContext() {
|
|
64
|
-
return region;
|
|
65
|
-
}
|
|
66
|
-
} : null);
|
|
67
|
-
|
|
68
|
-
this.data.help.instance.toDataURL = () => {
|
|
69
|
-
return new Promise((resolveUrl) => {
|
|
70
|
-
if (panvas.toDataURL) {
|
|
71
|
-
resolveUrl(panvas.toDataURL());
|
|
72
|
-
} else {
|
|
73
|
-
wx.canvasToTempFilePath({
|
|
74
|
-
canvasId: "painter",
|
|
75
|
-
success: function (e) {
|
|
76
|
-
resolveUrl(e.tempFilePath);
|
|
77
|
-
},
|
|
78
|
-
fail: function (e) {
|
|
79
|
-
console.log(e)
|
|
80
|
-
}
|
|
81
|
-
}, this);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
this.data.help.instance.drawImage = drawImage(
|
|
87
|
-
this.data.help.instance,
|
|
88
|
-
this.data.help.instance.drawImage,
|
|
89
|
-
panvas
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
resolve(this.data.help.instance);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
});
|
|
97
|
-
},
|
|
98
|
-
doit(event) {
|
|
99
|
-
let x = event.touches[0].x;
|
|
100
|
-
let y = event.touches[0].y;
|
|
101
|
-
|
|
102
|
-
this.data.help.instance.getRegion(x, y).then((regionName) => {
|
|
103
|
-
this.triggerEvent('dotouchstart', {
|
|
104
|
-
name: regionName,
|
|
105
|
-
x: x,
|
|
106
|
-
y: y
|
|
107
|
-
})
|
|
108
|
-
});
|
|
109
|
-
},
|
|
110
|
-
doitstart(event) {
|
|
111
|
-
this.doit(event);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
});
|
|
1
|
+
import RawCanvas from "../../lib/RawCanvas/index.es.min.js";
|
|
2
|
+
import drawImage from "./drawImage.js";
|
|
3
|
+
|
|
4
|
+
let dpr = wx.getSystemInfoSync().pixelRatio;
|
|
5
|
+
|
|
6
|
+
Component({
|
|
7
|
+
properties: {
|
|
8
|
+
width: {
|
|
9
|
+
type: Number,
|
|
10
|
+
default: 300
|
|
11
|
+
},
|
|
12
|
+
height: {
|
|
13
|
+
type: Number,
|
|
14
|
+
default: 150
|
|
15
|
+
},
|
|
16
|
+
region: {
|
|
17
|
+
type: Boolean,
|
|
18
|
+
default: false
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
data: {
|
|
22
|
+
help: {}
|
|
23
|
+
},
|
|
24
|
+
lifetimes: {
|
|
25
|
+
ready() {
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
methods: {
|
|
30
|
+
fetch() {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
|
|
33
|
+
let getCanvasContext = (idName, doback) => {
|
|
34
|
+
if (idName != 'region' || this.data.region) {
|
|
35
|
+
const query = wx.createSelectorQuery().in(this);
|
|
36
|
+
query.select('#' + idName)
|
|
37
|
+
.fields({ node: true, size: true })
|
|
38
|
+
.exec((res) => {
|
|
39
|
+
const canvas = res[0].node;
|
|
40
|
+
const ctx = canvas.getContext('2d');
|
|
41
|
+
|
|
42
|
+
canvas.width = res[0].width * (idName == "region" ? 1 : dpr);
|
|
43
|
+
canvas.height = res[0].height * (idName == "region" ? 1 : dpr);
|
|
44
|
+
|
|
45
|
+
if (idName != "region") {
|
|
46
|
+
ctx.scale(dpr, dpr);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
doback(ctx, idName != 'region' ? canvas : null);
|
|
50
|
+
});
|
|
51
|
+
} else {
|
|
52
|
+
doback(null);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
getCanvasContext("painter", (painter, panvas) => {
|
|
57
|
+
getCanvasContext("region", region => {
|
|
58
|
+
this.data.help.instance = new RawCanvas({
|
|
59
|
+
getContext() {
|
|
60
|
+
return painter;
|
|
61
|
+
}
|
|
62
|
+
}, this.data.region ? {
|
|
63
|
+
getContext() {
|
|
64
|
+
return region;
|
|
65
|
+
}
|
|
66
|
+
} : null);
|
|
67
|
+
|
|
68
|
+
this.data.help.instance.toDataURL = () => {
|
|
69
|
+
return new Promise((resolveUrl) => {
|
|
70
|
+
if (panvas.toDataURL) {
|
|
71
|
+
resolveUrl(panvas.toDataURL());
|
|
72
|
+
} else {
|
|
73
|
+
wx.canvasToTempFilePath({
|
|
74
|
+
canvasId: "painter",
|
|
75
|
+
success: function (e) {
|
|
76
|
+
resolveUrl(e.tempFilePath);
|
|
77
|
+
},
|
|
78
|
+
fail: function (e) {
|
|
79
|
+
console.log(e)
|
|
80
|
+
}
|
|
81
|
+
}, this);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
this.data.help.instance.drawImage = drawImage(
|
|
87
|
+
this.data.help.instance,
|
|
88
|
+
this.data.help.instance.drawImage,
|
|
89
|
+
panvas
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
resolve(this.data.help.instance);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
doit(event) {
|
|
99
|
+
let x = event.touches[0].x;
|
|
100
|
+
let y = event.touches[0].y;
|
|
101
|
+
|
|
102
|
+
this.data.help.instance.getRegion(x, y).then((regionName) => {
|
|
103
|
+
this.triggerEvent('dotouchstart', {
|
|
104
|
+
name: regionName,
|
|
105
|
+
x: x,
|
|
106
|
+
y: y
|
|
107
|
+
})
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
doitstart(event) {
|
|
111
|
+
this.doit(event);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
});
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vislite",
|
|
3
|
-
"version": "1.2.0-alpha.
|
|
3
|
+
"version": "1.2.0-alpha.4",
|
|
4
4
|
"description": "灵活、快速、简单的数据可视化交互式跨端前端库",
|
|
5
5
|
"main": "./lib/index.umd.min.js",
|
|
6
6
|
"typings": "./types/index.d.ts",
|
|
7
7
|
"unpkg": "./lib/index.umd.min.js",
|
|
8
|
-
"jsdelivr":"./lib/index.umd.min.js",
|
|
8
|
+
"jsdelivr": "./lib/index.umd.min.js",
|
|
9
9
|
"sideEffects": false,
|
|
10
10
|
"scripts": {
|
|
11
11
|
"init": "npm install && devby --copy ./node_modules/pageby/dist/pageby.min.js ./docs/js/min/pageby.min.js",
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
},
|
|
51
51
|
"homepage": "https://oi-contrib.github.io/VISLite",
|
|
52
52
|
"devDependencies": {
|
|
53
|
+
"@rollup/plugin-commonjs": "^25.0.7",
|
|
54
|
+
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
53
55
|
"@rollup/plugin-typescript": "^11.1.0",
|
|
54
56
|
"@types/jasmine": "^4.3.1",
|
|
55
57
|
"@typescript-eslint/eslint-plugin": "^6.14.0",
|
|
@@ -69,5 +71,8 @@
|
|
|
69
71
|
"webpack": "^5.70.0",
|
|
70
72
|
"webpack-cli": "^4.9.2",
|
|
71
73
|
"webpack-dev-server": "^4.7.4"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"@oipage/core.js": "^0.1.0-alpha.1"
|
|
72
77
|
}
|
|
73
78
|
}
|
package/src/Canvas.ts
CHANGED
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
import type CanvasType from '../types/Canvas'
|
|
2
|
-
import type CanvasOptionType from '../types/CanvasOption'
|
|
3
|
-
|
|
4
|
-
import OralCanvas from './common/canvas/index'
|
|
5
|
-
import { initOption } from './common/option'
|
|
6
|
-
|
|
7
|
-
class Canvas extends OralCanvas implements CanvasType {
|
|
8
|
-
private __canvas: HTMLCanvasElement
|
|
9
|
-
private __el: HTMLElement
|
|
10
|
-
constructor(el: HTMLElement | null, option: CanvasOptionType = {}, width: number = 0, height: number = 0) {
|
|
11
|
-
if (!el) {
|
|
12
|
-
throw new Error("VISLite Canvas:The mount point requires an HTMLElement type but encountered null.")
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
option = initOption(option, {
|
|
16
|
-
region: true,
|
|
17
|
-
willReadFrequently: false
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
width = width || el.clientWidth
|
|
21
|
-
height = height || el.clientHeight
|
|
22
|
-
|
|
23
|
-
let ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement | null = null
|
|
24
|
-
|
|
25
|
-
const _el = el as any
|
|
26
|
-
|
|
27
|
-
// 如果已经初始化过了
|
|
28
|
-
if (_el._vislite_canvas_) {
|
|
29
|
-
ViewCanvas = _el._vislite_canvas_[0]
|
|
30
|
-
RegionCanvas = _el._vislite_canvas_[1]
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// 否则就初始化
|
|
34
|
-
else {
|
|
35
|
-
ViewCanvas = document.createElement('canvas')
|
|
36
|
-
el.appendChild(ViewCanvas)
|
|
37
|
-
|
|
38
|
-
if (option.region) {
|
|
39
|
-
RegionCanvas = document.createElement('canvas')
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
_el._vislite_canvas_ = [ViewCanvas, RegionCanvas]
|
|
43
|
-
|
|
44
|
-
el.setAttribute('vislite', 'Canvas')
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// 设置画布大小
|
|
48
|
-
const canvasArray = [RegionCanvas, ViewCanvas]
|
|
49
|
-
for (let index = 0; index < canvasArray.length; index++) {
|
|
50
|
-
const canvas = canvasArray[index]
|
|
51
|
-
if (canvas) {
|
|
52
|
-
canvas.style.width = width + "px"
|
|
53
|
-
canvas.setAttribute('width', (index * width + width) + "")
|
|
54
|
-
|
|
55
|
-
canvas.style.height = height + "px"
|
|
56
|
-
canvas.setAttribute('height', (index * height + height) + "")
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
super(ViewCanvas, RegionCanvas, {
|
|
61
|
-
willReadFrequently: option.willReadFrequently,
|
|
62
|
-
}, 2)
|
|
63
|
-
|
|
64
|
-
this.__canvas = ViewCanvas
|
|
65
|
-
this.__el = el
|
|
66
|
-
this.painter.scale(2, 2)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
toDataURL(): Promise<string> {
|
|
70
|
-
return new Promise(resolve => {
|
|
71
|
-
resolve(this.__canvas.toDataURL())
|
|
72
|
-
})
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
bind(eventName: string, callback: (regionName: string) => void) {
|
|
76
|
-
this.__el.addEventListener(eventName, (event: any) => {
|
|
77
|
-
this.getRegion(event.offsetX, event.offsetY).then(regionName => {
|
|
78
|
-
callback(regionName)
|
|
79
|
-
})
|
|
80
|
-
})
|
|
81
|
-
return this
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
1
|
+
import type CanvasType from '../types/Canvas'
|
|
2
|
+
import type CanvasOptionType from '../types/CanvasOption'
|
|
3
|
+
|
|
4
|
+
import OralCanvas from './common/canvas/index'
|
|
5
|
+
import { initOption } from './common/option'
|
|
6
|
+
|
|
7
|
+
class Canvas extends OralCanvas implements CanvasType {
|
|
8
|
+
private __canvas: HTMLCanvasElement
|
|
9
|
+
private __el: HTMLElement
|
|
10
|
+
constructor(el: HTMLElement | null, option: CanvasOptionType = {}, width: number = 0, height: number = 0) {
|
|
11
|
+
if (!el) {
|
|
12
|
+
throw new Error("VISLite Canvas:The mount point requires an HTMLElement type but encountered null.")
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
option = initOption(option, {
|
|
16
|
+
region: true,
|
|
17
|
+
willReadFrequently: false
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
width = width || el.clientWidth
|
|
21
|
+
height = height || el.clientHeight
|
|
22
|
+
|
|
23
|
+
let ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement | null = null
|
|
24
|
+
|
|
25
|
+
const _el = el as any
|
|
26
|
+
|
|
27
|
+
// 如果已经初始化过了
|
|
28
|
+
if (_el._vislite_canvas_) {
|
|
29
|
+
ViewCanvas = _el._vislite_canvas_[0]
|
|
30
|
+
RegionCanvas = _el._vislite_canvas_[1]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 否则就初始化
|
|
34
|
+
else {
|
|
35
|
+
ViewCanvas = document.createElement('canvas')
|
|
36
|
+
el.appendChild(ViewCanvas)
|
|
37
|
+
|
|
38
|
+
if (option.region) {
|
|
39
|
+
RegionCanvas = document.createElement('canvas')
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
_el._vislite_canvas_ = [ViewCanvas, RegionCanvas]
|
|
43
|
+
|
|
44
|
+
el.setAttribute('vislite', 'Canvas')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 设置画布大小
|
|
48
|
+
const canvasArray = [RegionCanvas, ViewCanvas]
|
|
49
|
+
for (let index = 0; index < canvasArray.length; index++) {
|
|
50
|
+
const canvas = canvasArray[index]
|
|
51
|
+
if (canvas) {
|
|
52
|
+
canvas.style.width = width + "px"
|
|
53
|
+
canvas.setAttribute('width', (index * width + width) + "")
|
|
54
|
+
|
|
55
|
+
canvas.style.height = height + "px"
|
|
56
|
+
canvas.setAttribute('height', (index * height + height) + "")
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
super(ViewCanvas, RegionCanvas, {
|
|
61
|
+
willReadFrequently: option.willReadFrequently,
|
|
62
|
+
}, 2)
|
|
63
|
+
|
|
64
|
+
this.__canvas = ViewCanvas
|
|
65
|
+
this.__el = el
|
|
66
|
+
this.painter.scale(2, 2)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
toDataURL(): Promise<string> {
|
|
70
|
+
return new Promise(resolve => {
|
|
71
|
+
resolve(this.__canvas.toDataURL())
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
bind(eventName: string, callback: (regionName: string, x: number, y: number) => void) {
|
|
76
|
+
this.__el.addEventListener(eventName, (event: any) => {
|
|
77
|
+
this.getRegion(event.offsetX, event.offsetY).then(regionName => {
|
|
78
|
+
callback(regionName, event.offsetX, event.offsetY)
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
return this
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
85
|
export default Canvas
|
|
@@ -1,24 +1,32 @@
|
|
|
1
|
-
let enhanceGradient = function (gradient: CanvasGradient) {
|
|
2
|
-
const enhanceGradient = {
|
|
3
|
-
"value": function () {
|
|
4
|
-
return gradient
|
|
5
|
-
},
|
|
6
|
-
"setColor": function (stop: number, color: string) {
|
|
7
|
-
gradient.addColorStop(stop, color)
|
|
8
|
-
return enhanceGradient
|
|
9
|
-
}
|
|
10
|
-
};
|
|
11
|
-
return enhanceGradient
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// 线性渐变
|
|
15
|
-
export const linearGradient = function (painter: CanvasRenderingContext2D, x0: number, y0: number, x1: number, y1: number) {
|
|
16
|
-
const gradient = painter.createLinearGradient(x0, y0, x1, y1)
|
|
17
|
-
return enhanceGradient(gradient)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// 环形渐变
|
|
21
|
-
export const radialGradient = function (painter: CanvasRenderingContext2D, cx: number, cy: number, r: number) {
|
|
22
|
-
const gradient = painter.createRadialGradient(cx, cy, 0, cx, cy, r)
|
|
23
|
-
return enhanceGradient(gradient)
|
|
24
|
-
}
|
|
1
|
+
let enhanceGradient = function (gradient: CanvasGradient, calcStop?: Function) {
|
|
2
|
+
const enhanceGradient = {
|
|
3
|
+
"value": function () {
|
|
4
|
+
return gradient
|
|
5
|
+
},
|
|
6
|
+
"setColor": function (stop: number, color: string) {
|
|
7
|
+
gradient.addColorStop(calcStop ? calcStop(stop) : stop, color)
|
|
8
|
+
return enhanceGradient
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
return enhanceGradient
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// 线性渐变
|
|
15
|
+
export const linearGradient = function (painter: CanvasRenderingContext2D, x0: number, y0: number, x1: number, y1: number) {
|
|
16
|
+
const gradient = painter.createLinearGradient(x0, y0, x1, y1)
|
|
17
|
+
return enhanceGradient(gradient)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// 环形渐变
|
|
21
|
+
export const radialGradient = function (painter: CanvasRenderingContext2D, cx: number, cy: number, r: number) {
|
|
22
|
+
const gradient = painter.createRadialGradient(cx, cy, 0, cx, cy, r)
|
|
23
|
+
return enhanceGradient(gradient)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// 角度渐变
|
|
27
|
+
export const conicGradient = function (painter: CanvasRenderingContext2D, cx: number, cy: number, startDeg: number, deg?: number) {
|
|
28
|
+
const gradient = painter.createConicGradient(startDeg, cx, cy)
|
|
29
|
+
return enhanceGradient(gradient, deg ? (stop: number) => {
|
|
30
|
+
return deg / (Math.PI * 2) * stop
|
|
31
|
+
} : undefined)
|
|
32
|
+
}
|