vislite 1.3.0 → 1.4.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 (191) hide show
  1. package/AUTHORS.txt +6 -6
  2. package/CHANGELOG +12 -5
  3. package/LICENSE +20 -20
  4. package/README.md +284 -284
  5. package/lib/BarLayout/index.es.d.ts +3 -0
  6. package/lib/BarLayout/index.es.js +467 -0
  7. package/lib/BarLayout/index.es.min.d.ts +3 -0
  8. package/lib/BarLayout/index.es.min.js +10 -0
  9. package/lib/Buffer/index.es.js +1 -1
  10. package/lib/Buffer/index.es.min.js +1 -1
  11. package/lib/Canvas/index.es.js +2 -2
  12. package/lib/Canvas/index.es.min.js +1 -1
  13. package/lib/Cardinal/index.es.js +1 -1
  14. package/lib/Cardinal/index.es.min.js +1 -1
  15. package/lib/Eoap/index.es.js +1 -1
  16. package/lib/Eoap/index.es.min.js +1 -1
  17. package/lib/Hermite/index.es.js +1 -1
  18. package/lib/Hermite/index.es.min.js +1 -1
  19. package/lib/MapCoordinate/index.es.js +1 -1
  20. package/lib/MapCoordinate/index.es.min.js +1 -1
  21. package/lib/Matrix4/index.es.js +1 -1
  22. package/lib/Matrix4/index.es.min.js +1 -1
  23. package/lib/Mercator/index.es.js +1 -1
  24. package/lib/Mercator/index.es.min.js +1 -1
  25. package/lib/PieLayout/index.es.d.ts +3 -0
  26. package/lib/PieLayout/index.es.js +234 -0
  27. package/lib/PieLayout/index.es.min.d.ts +3 -0
  28. package/lib/PieLayout/index.es.min.js +9 -0
  29. package/lib/RawCanvas/index.es.js +2 -2
  30. package/lib/RawCanvas/index.es.min.js +1 -1
  31. package/lib/SVG/index.es.js +29 -6
  32. package/lib/SVG/index.es.min.js +2 -2
  33. package/lib/Shader/index.es.js +1 -1
  34. package/lib/Shader/index.es.min.js +1 -1
  35. package/lib/Texture/index.es.js +1 -1
  36. package/lib/Texture/index.es.min.js +1 -1
  37. package/lib/TreeLayout/index.es.js +109 -102
  38. package/lib/TreeLayout/index.es.min.js +6 -2
  39. package/lib/animation/index.es.js +114 -103
  40. package/lib/animation/index.es.min.js +6 -2
  41. package/lib/assemble/index.es.js +1 -1
  42. package/lib/assemble/index.es.min.js +1 -1
  43. package/lib/getLoopColors/index.es.js +1 -1
  44. package/lib/getLoopColors/index.es.min.js +1 -1
  45. package/lib/getWebGLContext/index.es.js +1 -1
  46. package/lib/getWebGLContext/index.es.min.js +1 -1
  47. package/lib/index.umd.js +510 -158
  48. package/lib/index.umd.min.js +12 -2
  49. package/lib/initOption/index.es.js +1 -1
  50. package/lib/initOption/index.es.min.js +1 -1
  51. package/lib/mergeOption/index.es.js +1 -1
  52. package/lib/mergeOption/index.es.min.js +1 -1
  53. package/lib/move/index.es.js +1 -1
  54. package/lib/move/index.es.min.js +1 -1
  55. package/lib/rotate/index.es.js +1 -1
  56. package/lib/rotate/index.es.min.js +1 -1
  57. package/lib/ruler/index.es.js +1 -1
  58. package/lib/ruler/index.es.min.js +1 -1
  59. package/lib/scale/index.es.js +1 -1
  60. package/lib/scale/index.es.min.js +1 -1
  61. package/lib/throttle/index.es.js +55 -50
  62. package/lib/throttle/index.es.min.js +5 -1
  63. package/minialipay/ui-canvas/drawImage.js +35 -35
  64. package/minialipay/ui-canvas/index.acss +4 -4
  65. package/minialipay/ui-canvas/index.axml +3 -3
  66. package/minialipay/ui-canvas/index.d.ts +1 -1
  67. package/minialipay/ui-canvas/index.js +100 -100
  68. package/minialipay/ui-canvas/index.json +6 -6
  69. package/miniprogram/ui-canvas/drawImage.js +35 -35
  70. package/miniprogram/ui-canvas/index.js +117 -117
  71. package/miniprogram/ui-canvas/index.json +4 -4
  72. package/miniprogram/ui-canvas/index.wxml +4 -4
  73. package/miniprogram/ui-canvas/index.wxss +5 -5
  74. package/package/BarLayout/index.ts +3 -0
  75. package/package/Buffer/index.ts +2 -2
  76. package/package/Canvas/index.ts +2 -2
  77. package/package/Cardinal/index.ts +2 -2
  78. package/package/Eoap/index.ts +2 -2
  79. package/package/Hermite/index.ts +2 -2
  80. package/package/MapCoordinate/index.ts +2 -2
  81. package/package/Matrix4/index.ts +2 -2
  82. package/package/Mercator/index.ts +2 -2
  83. package/package/PieLayout/index.ts +3 -0
  84. package/package/RawCanvas/index.ts +2 -2
  85. package/package/SVG/index.ts +2 -2
  86. package/package/Shader/index.ts +2 -2
  87. package/package/Texture/index.ts +2 -2
  88. package/package/TreeLayout/index.ts +2 -2
  89. package/package/animation/index.ts +5 -2
  90. package/package/assemble/index.ts +2 -2
  91. package/package/getLoopColors/index.ts +2 -2
  92. package/package/getWebGLContext/index.ts +40 -40
  93. package/package/index.ts +4 -0
  94. package/package/initOption/index.ts +2 -2
  95. package/package/mergeOption/index.ts +2 -2
  96. package/package/move/index.ts +2 -2
  97. package/package/rotate/index.ts +2 -2
  98. package/package/ruler/index.ts +2 -2
  99. package/package/scale/index.ts +2 -2
  100. package/package/throttle/index.ts +1 -1
  101. package/package.json +3 -3
  102. package/src/Canvas.ts +84 -84
  103. package/src/Eoap.ts +66 -66
  104. package/src/Matrix4/index.ts +84 -84
  105. package/src/Matrix4/move.ts +12 -12
  106. package/src/Matrix4/rotate.ts +15 -15
  107. package/src/Matrix4/scale.ts +11 -11
  108. package/src/Matrix4/transform.ts +64 -64
  109. package/src/Mercator.ts +27 -27
  110. package/src/SVG.ts +31 -0
  111. package/src/common/assemble.ts +22 -22
  112. package/src/common/canvas/arc.ts +51 -51
  113. package/src/common/canvas/config.ts +176 -176
  114. package/src/common/canvas/default.ts +64 -64
  115. package/src/common/canvas/gradient.ts +1 -1
  116. package/src/common/canvas/index.ts +188 -188
  117. package/src/common/canvas/painter.ts +443 -443
  118. package/src/common/canvas/texts.ts +18 -18
  119. package/src/common/map/getBoundary.ts +15 -15
  120. package/src/common/map/tool.ts +29 -29
  121. package/src/common/option.ts +29 -29
  122. package/src/common/setStyle.ts +5 -5
  123. package/src/common/svg/config.ts +213 -213
  124. package/src/common/svg/default.ts +2 -2
  125. package/src/common/svg/gradient.ts +2 -2
  126. package/src/common/svg/index.ts +1 -1
  127. package/src/common/svg/tool.ts +51 -51
  128. package/src/common/tree/index.ts +25 -25
  129. package/src/common/tree/toInnerTree.ts +61 -61
  130. package/src/common/tree/toPlainTree.ts +3 -0
  131. package/src/common/type.ts +26 -26
  132. package/src/common/webgl/buffer.ts +79 -79
  133. package/src/common/webgl/getWebGLContext.ts +45 -45
  134. package/src/common/webgl/shader.ts +75 -75
  135. package/src/common/webgl/texture.ts +1 -0
  136. package/src/coordinate/MapCoordinate.ts +80 -80
  137. package/src/getLoopColors.ts +42 -42
  138. package/src/interpolation/Cardinal.ts +110 -110
  139. package/src/interpolation/Hermite.ts +65 -65
  140. package/src/layout/BarLayout.ts +249 -0
  141. package/src/layout/PieLayout.ts +142 -0
  142. package/src/layout/TreeLayout.ts +4 -1
  143. package/src/move.ts +7 -7
  144. package/src/rotate.ts +7 -7
  145. package/src/ruler.ts +209 -209
  146. package/src/scale.ts +6 -6
  147. package/types/Bar.d.ts +92 -0
  148. package/types/BarConfig.d.ts +5 -0
  149. package/types/BarLayout.d.ts +49 -0
  150. package/types/BarOption.d.ts +32 -0
  151. package/types/Buffer.d.ts +23 -23
  152. package/types/Canvas.d.ts +352 -352
  153. package/types/CanvasConfig.d.ts +88 -88
  154. package/types/CanvasOption.d.ts +8 -8
  155. package/types/CanvasOpts.d.ts +9 -9
  156. package/types/Cardinal.d.ts +13 -13
  157. package/types/Gradient.d.ts +14 -14
  158. package/types/Hermite.d.ts +18 -18
  159. package/types/Map.d.ts +9 -9
  160. package/types/MapConfig.d.ts +27 -27
  161. package/types/MapCoordinate.d.ts +22 -22
  162. package/types/Matrix4.d.ts +47 -47
  163. package/types/Pie.d.ts +74 -0
  164. package/types/PieConfig.d.ts +27 -0
  165. package/types/PieLayout.d.ts +41 -0
  166. package/types/PieOption.d.ts +22 -0
  167. package/types/SVG.d.ts +4 -0
  168. package/types/SVGConfig.d.ts +71 -71
  169. package/types/Shader.d.ts +16 -16
  170. package/types/Texture.d.ts +16 -16
  171. package/types/Tree.d.ts +74 -74
  172. package/types/TreeConfig.d.ts +36 -36
  173. package/types/TreeLayout.d.ts +59 -59
  174. package/types/TreeOption.d.ts +48 -48
  175. package/types/animation.d.ts +7 -1
  176. package/types/assemble.d.ts +5 -5
  177. package/types/getLoopColors.d.ts +5 -5
  178. package/types/getWebGLContext.d.ts +7 -7
  179. package/types/index.d.ts +16 -0
  180. package/types/move.d.ts +5 -5
  181. package/types/option.d.ts +12 -12
  182. package/types/painterConfig.d.ts +4 -4
  183. package/types/rotate.d.ts +5 -5
  184. package/types/ruler.d.ts +10 -10
  185. package/types/scale.d.ts +5 -5
  186. package/types/throttle.d.ts +1 -1
  187. package/types/throttleOption.d.ts +1 -1
  188. package/types/ui-canvas.d.ts +4 -4
  189. package/types/uni-canvas.d.ts +3 -3
  190. package/uni-app/drawImage.js +19 -19
  191. package/uni-app/ui-canvas.vue +284 -284
@@ -1,444 +1,444 @@
1
- import type CanvasOptsType from '../../../types/CanvasOpts'
2
-
3
- import { initText, initArc, initCircle, initRect } from './config'
4
- import texts from './texts'
5
- import defaultFactory from "./default"
6
-
7
- class Painter {
8
-
9
- painter: CanvasRenderingContext2D
10
- __region: Painter | null | undefined = null
11
-
12
- __onlyRegion: boolean = false
13
- __onlyView: boolean = false
14
-
15
- __isPainter: boolean
16
-
17
- // 用于记录配置
18
- // 因为部分配置的设置比较特殊,只先记录意图
19
- __specialConfig = defaultFactory("special") as {
20
- [key: string]: any
21
- }
22
-
23
- private __initConfig = defaultFactory("init")
24
-
25
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
26
- constructor(canvas: HTMLCanvasElement, opts: CanvasOptsType = {}, region?: Painter, isPainter = false, scaleSize = 1) {
27
- this.painter = canvas.getContext("2d", opts) as CanvasRenderingContext2D
28
- this.__region = region
29
- this.__isPainter = isPainter
30
-
31
- // 默认配置canvas2D对象已经存在的属性
32
- this.painter.textBaseline = 'middle'
33
- this.painter.textAlign = 'left'
34
- }
35
-
36
- useConfig(key: string, value: any) {
37
- if (this.__region && !this.__onlyView) {
38
- if (['fillStyle', 'strokeStyle', 'shadowBlur', 'shadowColor'].indexOf(key) < 0) {
39
- this.__region.useConfig(key, value)
40
- }
41
- }
42
-
43
- if (this.__isPainter && this.__onlyRegion) return this
44
-
45
- /**
46
- * -----------------------------
47
- * 特殊的设置开始
48
- * -----------------------------
49
- */
50
-
51
- if (key == 'lineDash') {
52
- if (this.painter.setLineDash) this.painter.setLineDash(value)
53
- }
54
-
55
- /**
56
- * -----------------------------
57
- * 常规的配置开始
58
- * -----------------------------
59
- */
60
-
61
- // 如果已经存在默认配置中,说明只需要缓存起来即可
62
- else if (key in this.__specialConfig) {
63
-
64
- // 文字非整数可能存在问题,修复一下
65
- if (key == 'fontSize') {
66
- value = Math.round(value)
67
- }
68
-
69
- this.__specialConfig[key] = value
70
- }
71
-
72
- // 其它情况直接生效即可
73
- else if (key in this.__initConfig) {
74
- (this.painter as any)[key] = value
75
- }
76
-
77
- // 如果属性未被定义
78
- else {
79
- throw new Error('Illegal configuration item of painter : ' + key + " !")
80
- }
81
-
82
- return this
83
- }
84
-
85
- // 文字
86
- fillText(text: string, x: number, y: number, deg: number = 0) {
87
- if (this.__region && !this.__onlyView) this.__region.fillText(text, x, y, deg)
88
-
89
- if (this.__isPainter && this.__onlyRegion) return this
90
-
91
- this.painter.save()
92
- initText(this.painter, this.__specialConfig, x, y, deg).fillText(text, 0, 0)
93
- this.painter.restore()
94
- return this
95
- }
96
- strokeText(text: string, x: number, y: number, deg: number = 0) {
97
- if (this.__region && !this.__onlyView) this.__region.strokeText(text, x, y, deg)
98
-
99
- if (this.__isPainter && this.__onlyRegion) return this
100
-
101
- this.painter.save()
102
- initText(this.painter, this.__specialConfig, x, y, deg).strokeText(text, 0, 0)
103
- this.painter.restore()
104
- return this
105
- }
106
- fullText(text: string, x: number, y: number, deg: number = 0) {
107
- if (this.__region && !this.__onlyView) this.__region.fullText(text, x, y, deg)
108
-
109
- if (this.__isPainter && this.__onlyRegion) return this
110
-
111
- this.painter.save()
112
- initText(this.painter, this.__specialConfig, x, y, deg)
113
- this.painter.fillText(text, 0, 0)
114
- this.painter.strokeText(text, 0, 0)
115
- this.painter.restore()
116
- return this
117
- }
118
-
119
- // 多行文字
120
- fillTexts(contents: string, x: number, y: number, width: number, lineHeight: number = 1.2, deg: number = 0) {
121
- let h = 0
122
- if (this.__region && !this.__onlyView) h = this.__region.fillTexts(contents, x, y, width, lineHeight)
123
-
124
- if (this.__isPainter && this.__onlyRegion) return h
125
-
126
- this.painter.save()
127
- initText(this.painter, this.__specialConfig, x, y, deg)
128
-
129
- const height = texts(this.painter, contents, width, this.__specialConfig.fontSize * lineHeight, (content, top) => {
130
- this.painter.fillText(content, 0, top)
131
- })
132
-
133
- this.painter.restore()
134
- return height
135
- }
136
- strokeTexts(contents: string, x: number, y: number, width: number, lineHeight: number = 1.2, deg: number = 0) {
137
- let h = 0
138
- if (this.__region && !this.__onlyView) h = this.__region.fillTexts(contents, x, y, width, lineHeight)
139
-
140
- if (this.__isPainter && this.__onlyRegion) return h
141
-
142
- this.painter.save()
143
- initText(this.painter, this.__specialConfig, x, y, deg)
144
-
145
- const height = texts(this.painter, contents, width, this.__specialConfig.fontSize * lineHeight, (content, top) => {
146
- this.painter.strokeText(content, 0, top)
147
- })
148
-
149
- this.painter.restore()
150
- return height
151
- }
152
- fullTexts(contents: string, x: number, y: number, width: number, lineHeight: number = 1.2, deg: number = 0) {
153
- let h = 0
154
- if (this.__region && !this.__onlyView) h = this.__region.fillTexts(contents, x, y, width, lineHeight)
155
-
156
- if (this.__isPainter && this.__onlyRegion) return h
157
-
158
- this.painter.save()
159
- initText(this.painter, this.__specialConfig, x, y, deg)
160
-
161
- const height = texts(this.painter, contents, width, this.__specialConfig.fontSize * lineHeight, (content, top) => {
162
- this.painter.fillText(content, 0, top)
163
- this.painter.strokeText(content, 0, top)
164
- })
165
-
166
- this.painter.restore()
167
- return height
168
- }
169
-
170
- // 路径
171
- beginPath() {
172
- if (this.__region && !this.__onlyView) this.__region.beginPath()
173
-
174
- if (this.__isPainter && this.__onlyRegion) return this
175
-
176
- this.painter.beginPath()
177
- return this
178
- }
179
- closePath() {
180
- if (this.__region && !this.__onlyView) this.__region.closePath()
181
-
182
- if (this.__isPainter && this.__onlyRegion) return this
183
-
184
- this.painter.closePath()
185
- return this
186
- }
187
- moveTo(x: number, y: number) {
188
- if (this.__region && !this.__onlyView) this.__region.moveTo(x, y)
189
-
190
- if (this.__isPainter && this.__onlyRegion) return this
191
-
192
- // 解决1px模糊问题,别的地方类似原因
193
- this.painter.moveTo(Math.round(x) + 0.5, Math.round(y) + 0.5)
194
- return this
195
- }
196
- lineTo(x: number, y: number) {
197
- if (this.__region && !this.__onlyView) this.__region.lineTo(x, y)
198
-
199
- if (this.__isPainter && this.__onlyRegion) return this
200
-
201
- this.painter.lineTo(Math.round(x) + 0.5, Math.round(y) + 0.5)
202
- return this
203
- }
204
- arc(x: number, y: number, r: number, beginDeg: number, deg: number) {
205
- if (this.__region && !this.__onlyView) this.__region.arc(x, y, r, beginDeg, deg)
206
-
207
- if (this.__isPainter && this.__onlyRegion) return this
208
-
209
- this.painter.arc(x, y, r, beginDeg, beginDeg + deg, deg < 0)
210
- return this
211
- }
212
- fill() {
213
- if (this.__region && !this.__onlyView) this.__region.fill()
214
-
215
- if (this.__isPainter && this.__onlyRegion) return this
216
-
217
- this.painter.fill()
218
- return this
219
- }
220
- stroke() {
221
- if (this.__region && !this.__onlyView) this.__region.stroke()
222
-
223
- if (this.__isPainter && this.__onlyRegion) return this
224
-
225
- this.painter.stroke()
226
- return this
227
- }
228
- full() {
229
- if (this.__region && !this.__onlyView) this.__region.full()
230
-
231
- if (this.__isPainter && this.__onlyRegion) return this
232
-
233
- this.painter.fill()
234
- this.painter.stroke()
235
- return this
236
- }
237
-
238
- save() {
239
- if (this.__region && !this.__onlyView) this.__region.save()
240
-
241
- if (this.__isPainter && this.__onlyRegion) return this
242
-
243
- this.painter.save()
244
- return this
245
- }
246
- restore() {
247
- if (this.__region && !this.__onlyView) this.__region.restore()
248
-
249
- if (this.__isPainter && this.__onlyRegion) return this
250
-
251
- this.painter.restore()
252
- return this
253
- }
254
- clip() {
255
- if (this.__region && !this.__onlyView) this.__region.clip()
256
-
257
- if (this.__isPainter && this.__onlyRegion) return this
258
-
259
- this.painter.clip()
260
- return this
261
- }
262
-
263
- // 路径 - 贝塞尔曲线
264
- quadraticCurveTo(cpx: number, cpy: number, x: number, y: number) {
265
- if (this.__region && !this.__onlyView) this.__region.quadraticCurveTo(cpx, cpy, x, y)
266
-
267
- if (this.__isPainter && this.__onlyRegion) return this
268
-
269
- this.painter.quadraticCurveTo(cpx, cpy, x, y)
270
- return this
271
- }
272
- bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number) {
273
- if (this.__region && !this.__onlyView) this.__region.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
274
-
275
- if (this.__isPainter && this.__onlyRegion) return this
276
-
277
- this.painter.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
278
- return this
279
- }
280
-
281
- // 擦除画面
282
- clearRect(x: number, y: number, w: number, h: number) {
283
- if (this.__region && !this.__onlyView) this.__region.clearRect(x, y, w, h)
284
-
285
- if (this.__isPainter && this.__onlyRegion) return this
286
-
287
- this.painter.clearRect(x, y, w, h)
288
- return this
289
- }
290
- clearCircle(cx: number, cy: number, r: number) {
291
- if (this.__region && !this.__onlyView) this.__region.clearCircle(cx, cy, r)
292
-
293
- if (this.__isPainter && this.__onlyRegion) return this
294
-
295
- this.painter.beginPath()
296
- this.painter.globalCompositeOperation = "destination-out"
297
- this.painter.arc(cx, cy, r, 0, Math.PI * 2)
298
- this.painter.fill()
299
- this.painter.globalCompositeOperation = "source-over"
300
- this.painter.closePath()
301
- return this
302
- }
303
-
304
- // 弧
305
- fillArc(cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) {
306
- if (this.__region && !this.__onlyView) this.__region.fillArc(cx, cy, r1, r2, beginDeg, deg)
307
-
308
- if (this.__isPainter && this.__onlyRegion) return this
309
-
310
- initArc(this.painter, this.__specialConfig, cx, cy, r1, r2, beginDeg, deg).fill()
311
- return this
312
- }
313
- strokeArc(cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) {
314
- if (this.__region && !this.__onlyView) this.__region.strokeArc(cx, cy, r1, r2, beginDeg, deg)
315
-
316
- if (this.__isPainter && this.__onlyRegion) return this
317
-
318
- initArc(this.painter, this.__specialConfig, cx, cy, r1, r2, beginDeg, deg).stroke()
319
- return this
320
- }
321
- fullArc(cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) {
322
- if (this.__region && !this.__onlyView) this.__region.fullArc(cx, cy, r1, r2, beginDeg, deg)
323
-
324
- if (this.__isPainter && this.__onlyRegion) return this
325
-
326
- initArc(this.painter, this.__specialConfig, cx, cy, r1, r2, beginDeg, deg)
327
- this.painter.fill()
328
- this.painter.stroke()
329
- return this
330
- }
331
-
332
- // 圆形
333
- fillCircle(cx: number, cy: number, r: number) {
334
- if (this.__region && !this.__onlyView) this.__region.fillCircle(cx, cy, r)
335
-
336
- if (this.__isPainter && this.__onlyRegion) return this
337
-
338
- initCircle(this.painter, cx, cy, r).fill()
339
- return this
340
- }
341
- strokeCircle(cx: number, cy: number, r: number) {
342
- if (this.__region && !this.__onlyView) this.__region.strokeCircle(cx, cy, r)
343
-
344
- if (this.__isPainter && this.__onlyRegion) return this
345
-
346
- initCircle(this.painter, cx, cy, r).stroke()
347
- return this
348
- }
349
- fullCircle(cx: number, cy: number, r: number) {
350
- if (this.__region && !this.__onlyView) this.__region.fullCircle(cx, cy, r)
351
-
352
- if (this.__isPainter && this.__onlyRegion) return this
353
-
354
- initCircle(this.painter, cx, cy, r)
355
- this.painter.fill()
356
- this.painter.stroke()
357
- return this
358
- }
359
-
360
- // 矩形
361
- fillRect(x: number, y: number, width: number, height: number) {
362
- if (this.__region && !this.__onlyView) this.__region.fillRect(x, y, width, height)
363
-
364
- if (this.__isPainter && this.__onlyRegion) return this
365
-
366
- initRect(this.painter, this.__specialConfig, x, y, width, height).fill()
367
- return this
368
- }
369
- strokeRect(x: number, y: number, width: number, height: number) {
370
- if (this.__region && !this.__onlyView) this.__region.strokeRect(x, y, width, height)
371
-
372
- if (this.__isPainter && this.__onlyRegion) return this
373
-
374
- initRect(this.painter, this.__specialConfig, x, y, width, height).stroke()
375
- return this
376
- }
377
- fullRect(x: number, y: number, width: number, height: number) {
378
- if (this.__region && !this.__onlyView) this.__region.fullRect(x, y, width, height)
379
-
380
- if (this.__isPainter && this.__onlyRegion) return this
381
-
382
- initRect(this.painter, this.__specialConfig, x, y, width, height)
383
- this.painter.fill()
384
- this.painter.stroke()
385
- return this
386
- }
387
-
388
- // 渲染绘制(uniapp独有)
389
- draw() {
390
-
391
- // 兼容非uniapp环境,防止误用
392
- // 2024年4月3日 于南京
393
- return Promise.resolve()
394
- }
395
-
396
- // 绘制图片
397
- drawImage(img: CanvasImageSource | string, x: number, y: number, w: number, h: number, isImage: boolean = false) {
398
- return new Promise((resolve) => {
399
- if (this.__region && !this.__onlyView) {
400
- this.__region.fillRect(x, y, w, h)
401
- }
402
-
403
- if (this.__isPainter && this.__onlyRegion) {
404
- resolve({})
405
- return
406
- }
407
-
408
- if (typeof img == 'string' && !isImage) {
409
- const imgInstance = new Image()
410
- imgInstance.onload = () => {
411
- this.painter.drawImage(imgInstance, x, y, w, h)
412
- resolve({})
413
- }
414
- imgInstance.src = img
415
- } else {
416
- this.painter.drawImage(img as CanvasImageSource, x, y, w, h)
417
- resolve({})
418
- }
419
-
420
- })
421
- }
422
-
423
- // 扩展绘制方法
424
- install(methods: {
425
- [key: string]: Function
426
- }): any {
427
- for (const key in methods) {
428
-
429
- if (key in this) {
430
- throw new Error("VISLite Canvas:Method already exists and cannot be overwritten.")
431
- } else {
432
- (this as any)[key] = (...args: any) => {
433
- const value = methods[key].apply(this, args)
434
- if (value != void 0) return value
435
- return this
436
- }
437
- }
438
-
439
- }
440
- return this
441
- }
442
- }
443
-
1
+ import type CanvasOptsType from '../../../types/CanvasOpts'
2
+
3
+ import { initText, initArc, initCircle, initRect } from './config'
4
+ import texts from './texts'
5
+ import defaultFactory from "./default"
6
+
7
+ class Painter {
8
+
9
+ painter: CanvasRenderingContext2D
10
+ __region: Painter | null | undefined = null
11
+
12
+ __onlyRegion: boolean = false
13
+ __onlyView: boolean = false
14
+
15
+ __isPainter: boolean
16
+
17
+ // 用于记录配置
18
+ // 因为部分配置的设置比较特殊,只先记录意图
19
+ __specialConfig = defaultFactory("special") as {
20
+ [key: string]: any
21
+ }
22
+
23
+ private __initConfig = defaultFactory("init")
24
+
25
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
26
+ constructor(canvas: HTMLCanvasElement, opts: CanvasOptsType = {}, region?: Painter, isPainter = false, scaleSize = 1) {
27
+ this.painter = canvas.getContext("2d", opts) as CanvasRenderingContext2D
28
+ this.__region = region
29
+ this.__isPainter = isPainter
30
+
31
+ // 默认配置canvas2D对象已经存在的属性
32
+ this.painter.textBaseline = 'middle'
33
+ this.painter.textAlign = 'left'
34
+ }
35
+
36
+ useConfig(key: string, value: any) {
37
+ if (this.__region && !this.__onlyView) {
38
+ if (['fillStyle', 'strokeStyle', 'shadowBlur', 'shadowColor'].indexOf(key) < 0) {
39
+ this.__region.useConfig(key, value)
40
+ }
41
+ }
42
+
43
+ if (this.__isPainter && this.__onlyRegion) return this
44
+
45
+ /**
46
+ * -----------------------------
47
+ * 特殊的设置开始
48
+ * -----------------------------
49
+ */
50
+
51
+ if (key == 'lineDash') {
52
+ if (this.painter.setLineDash) this.painter.setLineDash(value)
53
+ }
54
+
55
+ /**
56
+ * -----------------------------
57
+ * 常规的配置开始
58
+ * -----------------------------
59
+ */
60
+
61
+ // 如果已经存在默认配置中,说明只需要缓存起来即可
62
+ else if (key in this.__specialConfig) {
63
+
64
+ // 文字非整数可能存在问题,修复一下
65
+ if (key == 'fontSize') {
66
+ value = Math.round(value)
67
+ }
68
+
69
+ this.__specialConfig[key] = value
70
+ }
71
+
72
+ // 其它情况直接生效即可
73
+ else if (key in this.__initConfig) {
74
+ (this.painter as any)[key] = value
75
+ }
76
+
77
+ // 如果属性未被定义
78
+ else {
79
+ throw new Error('Illegal configuration item of painter : ' + key + " !")
80
+ }
81
+
82
+ return this
83
+ }
84
+
85
+ // 文字
86
+ fillText(text: string, x: number, y: number, deg: number = 0) {
87
+ if (this.__region && !this.__onlyView) this.__region.fillText(text, x, y, deg)
88
+
89
+ if (this.__isPainter && this.__onlyRegion) return this
90
+
91
+ this.painter.save()
92
+ initText(this.painter, this.__specialConfig, x, y, deg).fillText(text, 0, 0)
93
+ this.painter.restore()
94
+ return this
95
+ }
96
+ strokeText(text: string, x: number, y: number, deg: number = 0) {
97
+ if (this.__region && !this.__onlyView) this.__region.strokeText(text, x, y, deg)
98
+
99
+ if (this.__isPainter && this.__onlyRegion) return this
100
+
101
+ this.painter.save()
102
+ initText(this.painter, this.__specialConfig, x, y, deg).strokeText(text, 0, 0)
103
+ this.painter.restore()
104
+ return this
105
+ }
106
+ fullText(text: string, x: number, y: number, deg: number = 0) {
107
+ if (this.__region && !this.__onlyView) this.__region.fullText(text, x, y, deg)
108
+
109
+ if (this.__isPainter && this.__onlyRegion) return this
110
+
111
+ this.painter.save()
112
+ initText(this.painter, this.__specialConfig, x, y, deg)
113
+ this.painter.fillText(text, 0, 0)
114
+ this.painter.strokeText(text, 0, 0)
115
+ this.painter.restore()
116
+ return this
117
+ }
118
+
119
+ // 多行文字
120
+ fillTexts(contents: string, x: number, y: number, width: number, lineHeight: number = 1.2, deg: number = 0) {
121
+ let h = 0
122
+ if (this.__region && !this.__onlyView) h = this.__region.fillTexts(contents, x, y, width, lineHeight)
123
+
124
+ if (this.__isPainter && this.__onlyRegion) return h
125
+
126
+ this.painter.save()
127
+ initText(this.painter, this.__specialConfig, x, y, deg)
128
+
129
+ const height = texts(this.painter, contents, width, this.__specialConfig.fontSize * lineHeight, (content, top) => {
130
+ this.painter.fillText(content, 0, top)
131
+ })
132
+
133
+ this.painter.restore()
134
+ return height
135
+ }
136
+ strokeTexts(contents: string, x: number, y: number, width: number, lineHeight: number = 1.2, deg: number = 0) {
137
+ let h = 0
138
+ if (this.__region && !this.__onlyView) h = this.__region.fillTexts(contents, x, y, width, lineHeight)
139
+
140
+ if (this.__isPainter && this.__onlyRegion) return h
141
+
142
+ this.painter.save()
143
+ initText(this.painter, this.__specialConfig, x, y, deg)
144
+
145
+ const height = texts(this.painter, contents, width, this.__specialConfig.fontSize * lineHeight, (content, top) => {
146
+ this.painter.strokeText(content, 0, top)
147
+ })
148
+
149
+ this.painter.restore()
150
+ return height
151
+ }
152
+ fullTexts(contents: string, x: number, y: number, width: number, lineHeight: number = 1.2, deg: number = 0) {
153
+ let h = 0
154
+ if (this.__region && !this.__onlyView) h = this.__region.fillTexts(contents, x, y, width, lineHeight)
155
+
156
+ if (this.__isPainter && this.__onlyRegion) return h
157
+
158
+ this.painter.save()
159
+ initText(this.painter, this.__specialConfig, x, y, deg)
160
+
161
+ const height = texts(this.painter, contents, width, this.__specialConfig.fontSize * lineHeight, (content, top) => {
162
+ this.painter.fillText(content, 0, top)
163
+ this.painter.strokeText(content, 0, top)
164
+ })
165
+
166
+ this.painter.restore()
167
+ return height
168
+ }
169
+
170
+ // 路径
171
+ beginPath() {
172
+ if (this.__region && !this.__onlyView) this.__region.beginPath()
173
+
174
+ if (this.__isPainter && this.__onlyRegion) return this
175
+
176
+ this.painter.beginPath()
177
+ return this
178
+ }
179
+ closePath() {
180
+ if (this.__region && !this.__onlyView) this.__region.closePath()
181
+
182
+ if (this.__isPainter && this.__onlyRegion) return this
183
+
184
+ this.painter.closePath()
185
+ return this
186
+ }
187
+ moveTo(x: number, y: number) {
188
+ if (this.__region && !this.__onlyView) this.__region.moveTo(x, y)
189
+
190
+ if (this.__isPainter && this.__onlyRegion) return this
191
+
192
+ // 解决1px模糊问题,别的地方类似原因
193
+ this.painter.moveTo(Math.round(x) + 0.5, Math.round(y) + 0.5)
194
+ return this
195
+ }
196
+ lineTo(x: number, y: number) {
197
+ if (this.__region && !this.__onlyView) this.__region.lineTo(x, y)
198
+
199
+ if (this.__isPainter && this.__onlyRegion) return this
200
+
201
+ this.painter.lineTo(Math.round(x) + 0.5, Math.round(y) + 0.5)
202
+ return this
203
+ }
204
+ arc(x: number, y: number, r: number, beginDeg: number, deg: number) {
205
+ if (this.__region && !this.__onlyView) this.__region.arc(x, y, r, beginDeg, deg)
206
+
207
+ if (this.__isPainter && this.__onlyRegion) return this
208
+
209
+ this.painter.arc(x, y, r, beginDeg, beginDeg + deg, deg < 0)
210
+ return this
211
+ }
212
+ fill() {
213
+ if (this.__region && !this.__onlyView) this.__region.fill()
214
+
215
+ if (this.__isPainter && this.__onlyRegion) return this
216
+
217
+ this.painter.fill()
218
+ return this
219
+ }
220
+ stroke() {
221
+ if (this.__region && !this.__onlyView) this.__region.stroke()
222
+
223
+ if (this.__isPainter && this.__onlyRegion) return this
224
+
225
+ this.painter.stroke()
226
+ return this
227
+ }
228
+ full() {
229
+ if (this.__region && !this.__onlyView) this.__region.full()
230
+
231
+ if (this.__isPainter && this.__onlyRegion) return this
232
+
233
+ this.painter.fill()
234
+ this.painter.stroke()
235
+ return this
236
+ }
237
+
238
+ save() {
239
+ if (this.__region && !this.__onlyView) this.__region.save()
240
+
241
+ if (this.__isPainter && this.__onlyRegion) return this
242
+
243
+ this.painter.save()
244
+ return this
245
+ }
246
+ restore() {
247
+ if (this.__region && !this.__onlyView) this.__region.restore()
248
+
249
+ if (this.__isPainter && this.__onlyRegion) return this
250
+
251
+ this.painter.restore()
252
+ return this
253
+ }
254
+ clip() {
255
+ if (this.__region && !this.__onlyView) this.__region.clip()
256
+
257
+ if (this.__isPainter && this.__onlyRegion) return this
258
+
259
+ this.painter.clip()
260
+ return this
261
+ }
262
+
263
+ // 路径 - 贝塞尔曲线
264
+ quadraticCurveTo(cpx: number, cpy: number, x: number, y: number) {
265
+ if (this.__region && !this.__onlyView) this.__region.quadraticCurveTo(cpx, cpy, x, y)
266
+
267
+ if (this.__isPainter && this.__onlyRegion) return this
268
+
269
+ this.painter.quadraticCurveTo(cpx, cpy, x, y)
270
+ return this
271
+ }
272
+ bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number) {
273
+ if (this.__region && !this.__onlyView) this.__region.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
274
+
275
+ if (this.__isPainter && this.__onlyRegion) return this
276
+
277
+ this.painter.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
278
+ return this
279
+ }
280
+
281
+ // 擦除画面
282
+ clearRect(x: number, y: number, w: number, h: number) {
283
+ if (this.__region && !this.__onlyView) this.__region.clearRect(x, y, w, h)
284
+
285
+ if (this.__isPainter && this.__onlyRegion) return this
286
+
287
+ this.painter.clearRect(x, y, w, h)
288
+ return this
289
+ }
290
+ clearCircle(cx: number, cy: number, r: number) {
291
+ if (this.__region && !this.__onlyView) this.__region.clearCircle(cx, cy, r)
292
+
293
+ if (this.__isPainter && this.__onlyRegion) return this
294
+
295
+ this.painter.beginPath()
296
+ this.painter.globalCompositeOperation = "destination-out"
297
+ this.painter.arc(cx, cy, r, 0, Math.PI * 2)
298
+ this.painter.fill()
299
+ this.painter.globalCompositeOperation = "source-over"
300
+ this.painter.closePath()
301
+ return this
302
+ }
303
+
304
+ // 弧
305
+ fillArc(cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) {
306
+ if (this.__region && !this.__onlyView) this.__region.fillArc(cx, cy, r1, r2, beginDeg, deg)
307
+
308
+ if (this.__isPainter && this.__onlyRegion) return this
309
+
310
+ initArc(this.painter, this.__specialConfig, cx, cy, r1, r2, beginDeg, deg).fill()
311
+ return this
312
+ }
313
+ strokeArc(cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) {
314
+ if (this.__region && !this.__onlyView) this.__region.strokeArc(cx, cy, r1, r2, beginDeg, deg)
315
+
316
+ if (this.__isPainter && this.__onlyRegion) return this
317
+
318
+ initArc(this.painter, this.__specialConfig, cx, cy, r1, r2, beginDeg, deg).stroke()
319
+ return this
320
+ }
321
+ fullArc(cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) {
322
+ if (this.__region && !this.__onlyView) this.__region.fullArc(cx, cy, r1, r2, beginDeg, deg)
323
+
324
+ if (this.__isPainter && this.__onlyRegion) return this
325
+
326
+ initArc(this.painter, this.__specialConfig, cx, cy, r1, r2, beginDeg, deg)
327
+ this.painter.fill()
328
+ this.painter.stroke()
329
+ return this
330
+ }
331
+
332
+ // 圆形
333
+ fillCircle(cx: number, cy: number, r: number) {
334
+ if (this.__region && !this.__onlyView) this.__region.fillCircle(cx, cy, r)
335
+
336
+ if (this.__isPainter && this.__onlyRegion) return this
337
+
338
+ initCircle(this.painter, cx, cy, r).fill()
339
+ return this
340
+ }
341
+ strokeCircle(cx: number, cy: number, r: number) {
342
+ if (this.__region && !this.__onlyView) this.__region.strokeCircle(cx, cy, r)
343
+
344
+ if (this.__isPainter && this.__onlyRegion) return this
345
+
346
+ initCircle(this.painter, cx, cy, r).stroke()
347
+ return this
348
+ }
349
+ fullCircle(cx: number, cy: number, r: number) {
350
+ if (this.__region && !this.__onlyView) this.__region.fullCircle(cx, cy, r)
351
+
352
+ if (this.__isPainter && this.__onlyRegion) return this
353
+
354
+ initCircle(this.painter, cx, cy, r)
355
+ this.painter.fill()
356
+ this.painter.stroke()
357
+ return this
358
+ }
359
+
360
+ // 矩形
361
+ fillRect(x: number, y: number, width: number, height: number) {
362
+ if (this.__region && !this.__onlyView) this.__region.fillRect(x, y, width, height)
363
+
364
+ if (this.__isPainter && this.__onlyRegion) return this
365
+
366
+ initRect(this.painter, this.__specialConfig, x, y, width, height).fill()
367
+ return this
368
+ }
369
+ strokeRect(x: number, y: number, width: number, height: number) {
370
+ if (this.__region && !this.__onlyView) this.__region.strokeRect(x, y, width, height)
371
+
372
+ if (this.__isPainter && this.__onlyRegion) return this
373
+
374
+ initRect(this.painter, this.__specialConfig, x, y, width, height).stroke()
375
+ return this
376
+ }
377
+ fullRect(x: number, y: number, width: number, height: number) {
378
+ if (this.__region && !this.__onlyView) this.__region.fullRect(x, y, width, height)
379
+
380
+ if (this.__isPainter && this.__onlyRegion) return this
381
+
382
+ initRect(this.painter, this.__specialConfig, x, y, width, height)
383
+ this.painter.fill()
384
+ this.painter.stroke()
385
+ return this
386
+ }
387
+
388
+ // 渲染绘制(uniapp独有)
389
+ draw() {
390
+
391
+ // 兼容非uniapp环境,防止误用
392
+ // 2024年4月3日 于南京
393
+ return Promise.resolve()
394
+ }
395
+
396
+ // 绘制图片
397
+ drawImage(img: CanvasImageSource | string, x: number, y: number, w: number, h: number, isImage: boolean = false) {
398
+ return new Promise((resolve) => {
399
+ if (this.__region && !this.__onlyView) {
400
+ this.__region.fillRect(x, y, w, h)
401
+ }
402
+
403
+ if (this.__isPainter && this.__onlyRegion) {
404
+ resolve({})
405
+ return
406
+ }
407
+
408
+ if (typeof img == 'string' && !isImage) {
409
+ const imgInstance = new Image()
410
+ imgInstance.onload = () => {
411
+ this.painter.drawImage(imgInstance, x, y, w, h)
412
+ resolve({})
413
+ }
414
+ imgInstance.src = img
415
+ } else {
416
+ this.painter.drawImage(img as CanvasImageSource, x, y, w, h)
417
+ resolve({})
418
+ }
419
+
420
+ })
421
+ }
422
+
423
+ // 扩展绘制方法
424
+ install(methods: {
425
+ [key: string]: Function
426
+ }): any {
427
+ for (const key in methods) {
428
+
429
+ if (key in this) {
430
+ throw new Error("VISLite Canvas:Method already exists and cannot be overwritten.")
431
+ } else {
432
+ (this as any)[key] = (...args: any) => {
433
+ const value = methods[key].apply(this, args)
434
+ if (value != void 0) return value
435
+ return this
436
+ }
437
+ }
438
+
439
+ }
440
+ return this
441
+ }
442
+ }
443
+
444
444
  export default Painter