vislite 0.1.1 → 0.2.0-alpha.7

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 (112) hide show
  1. package/AUTHORS.txt +6 -6
  2. package/CHANGELOG +19 -1
  3. package/LICENSE +20 -20
  4. package/README.md +53 -52
  5. package/lib/Canvas/index.umd.js +135 -46
  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 +9 -5
  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 +42 -0
  16. package/lib/Mercator/index.umd.min.js +15 -0
  17. package/lib/OralCanvas/index.es.js +124 -44
  18. package/lib/OralCanvas/index.es.min.js +7 -3
  19. package/lib/OralWebGL/index.es.js +567 -0
  20. package/lib/OralWebGL/index.es.min.js +15 -0
  21. package/lib/SVG/index.umd.js +16 -5
  22. package/lib/SVG/index.umd.min.js +7 -3
  23. package/lib/WebGL/index.umd.js +626 -0
  24. package/lib/WebGL/index.umd.min.js +15 -0
  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 +1514 -863
  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 +129 -0
  36. package/lib/viewHandler/index.umd.min.js +15 -0
  37. package/miniprogram/ui-canvas/index.js +21 -7
  38. package/miniprogram/ui-canvas/index.json +4 -4
  39. package/miniprogram/ui-canvas/index.wxml +4 -4
  40. package/miniprogram/ui-canvas/index.wxss +5 -5
  41. package/package/Canvas/index.ts +1 -1
  42. package/package/Cardinal/index.ts +2 -2
  43. package/package/Eoap/index.ts +2 -2
  44. package/package/Hermite/index.ts +2 -2
  45. package/package/Matrix4/index.ts +2 -2
  46. package/package/Mercator/index.ts +3 -0
  47. package/package/OralCanvas/index.ts +1 -1
  48. package/package/OralWebGL/index.ts +2 -0
  49. package/package/SVG/index.ts +2 -2
  50. package/package/WebGL/index.ts +2 -0
  51. package/package/animation/index.ts +2 -2
  52. package/package/getLoopColors/index.ts +2 -2
  53. package/package/index.ts +32 -9
  54. package/package/rotate/index.ts +2 -2
  55. package/package/ruler/index.ts +2 -2
  56. package/package/viewHandler/index.ts +3 -0
  57. package/package.json +11 -2
  58. package/src/Canvas.ts +10 -1
  59. package/src/Eoap.ts +5 -5
  60. package/src/Matrix4/index.ts +76 -76
  61. package/src/Matrix4/move.ts +12 -12
  62. package/src/Matrix4/rotate.ts +15 -15
  63. package/src/Matrix4/scale.ts +11 -11
  64. package/src/Matrix4/transform.ts +64 -64
  65. package/src/Mercator.ts +27 -0
  66. package/src/SVG.ts +1 -1
  67. package/src/WebGL.ts +53 -0
  68. package/src/animation.ts +99 -99
  69. package/src/common/assemble.ts +23 -0
  70. package/src/common/canvas/arc.ts +50 -50
  71. package/src/common/canvas/config.ts +7 -6
  72. package/src/common/canvas/index.ts +29 -28
  73. package/src/common/canvas/painter.ts +51 -8
  74. package/src/common/canvas/texts.ts +19 -0
  75. package/src/common/setStyle.ts +5 -5
  76. package/src/common/svg/config.ts +127 -126
  77. package/src/common/svg/index.ts +13 -3
  78. package/src/common/svg/tool.ts +43 -42
  79. package/src/common/webgl/buffer.ts +80 -0
  80. package/src/common/webgl/doDraw.ts +97 -0
  81. package/src/common/webgl/getColorFactory.ts +27 -0
  82. package/src/common/webgl/getShader.ts +62 -0
  83. package/src/common/webgl/getTexture.ts +12 -0
  84. package/src/common/webgl/getWebGLContext.ts +28 -0
  85. package/src/common/webgl/index.ts +212 -0
  86. package/src/common/webgl/shader.ts +76 -0
  87. package/src/common/webgl/texture.ts +99 -0
  88. package/src/getLoopColors.ts +42 -42
  89. package/src/interpolation/Cardinal.ts +91 -91
  90. package/src/interpolation/Hermite.ts +65 -65
  91. package/src/rotate.ts +7 -7
  92. package/src/ruler.ts +99 -99
  93. package/src/viewHandler.ts +140 -0
  94. package/types/Canvas.d.ts +220 -283
  95. package/types/CanvasConfig.d.ts +81 -0
  96. package/types/Cardinal.d.ts +13 -13
  97. package/types/Hermite.d.ts +18 -18
  98. package/types/Map.d.ts +10 -0
  99. package/types/Matrix4.d.ts +42 -42
  100. package/types/Object3D.d.ts +106 -0
  101. package/types/SVG.d.ts +210 -264
  102. package/types/SVGConfig.d.ts +59 -0
  103. package/types/Scene3D.d.ts +7 -0
  104. package/types/WebGL.d.ts +29 -0
  105. package/types/animation.d.ts +6 -6
  106. package/types/getLoopColors.d.ts +2 -2
  107. package/types/index.d.ts +70 -26
  108. package/types/rotate.d.ts +2 -2
  109. package/types/ruler.d.ts +2 -2
  110. package/types/viewHandler.d.ts +13 -0
  111. package/uni-app/ui-canvas.vue +79 -7
  112. package/types/Eoap.d.ts +0 -10
package/src/animation.ts CHANGED
@@ -1,100 +1,100 @@
1
- //当前正在运动的动画的tick函数堆栈
2
- let $timers: any[] = []
3
- //唯一定时器的定时间隔
4
- let $interval = 13
5
- //定时器ID
6
- let $timerId: any
7
-
8
- /**
9
- * 动画轮播
10
- * @param {function} doback 轮询函数,有一个形参deep,0-1,表示执行进度
11
- * @param {number} duration 动画时长,可选
12
- * @param {function} callback 动画结束回调,可选,有一个形参deep,0-1,表示执行进度
13
- *
14
- * @returns {function} 返回一个函数,调用该函数,可以提前结束动画
15
- */
16
- export default function (doback: (deep: number) => void, duration: number = 400, callback: (deep: number) => void = () => { }): Function {
17
-
18
-
19
- let clock = {
20
- //把tick函数推入堆栈
21
- "timer": function (tick: (deep: number) => void, duration: number, callback: (deep: number) => void) {
22
- if (!tick) {
23
- throw new Error('Tick is required!')
24
- }
25
- let id = new Date().valueOf() + "_" + (Math.random() * 1000).toFixed(0)
26
- $timers.push({
27
- "id": id,
28
- "createTime": new Date(),
29
- "tick": tick,
30
- "duration": duration,
31
- "callback": callback
32
- });
33
- clock.start()
34
- return id
35
- },
36
-
37
- //开启唯一的定时器timerId
38
- "start": function () {
39
- if (!$timerId) {
40
- $timerId = setInterval(clock.tick, $interval)
41
- }
42
- },
43
-
44
- //被定时器调用,遍历timers堆栈
45
- "tick": function () {
46
- let createTime: Date, flag: number, tick: (deep: number) => void, callback: (deep: number) => void, timer: any, duration: number, passTime: number,
47
- timers: any[] = $timers
48
- $timers = []
49
- $timers.length = 0
50
- for (flag = 0; flag < timers.length; flag++) {
51
- //初始化数据
52
- timer = timers[flag]
53
- createTime = timer.createTime
54
- tick = timer.tick
55
- duration = timer.duration
56
- callback = timer.callback
57
-
58
- //执行
59
- passTime = (+new Date().valueOf() - createTime.valueOf()) / duration
60
- passTime = passTime > 1 ? 1 : passTime
61
- tick(passTime)
62
- if (passTime < 1 && timer.id) {
63
- //动画没有结束再添加
64
- $timers.push(timer)
65
- } else {
66
- callback(passTime)
67
- }
68
- }
69
- if ($timers.length <= 0) {
70
- clock.stop()
71
- }
72
- },
73
-
74
- //停止定时器,重置timerId=null
75
- "stop": function () {
76
- if ($timerId) {
77
- clearInterval($timerId)
78
- $timerId = null
79
- }
80
- }
81
- };
82
-
83
- let id = clock.timer(function (deep: number) {
84
- //其中deep为0-1,表示改变的程度
85
- doback(deep)
86
- }, duration, callback)
87
-
88
- // 返回一个函数
89
- // 用于在动画结束前结束动画
90
- return function () {
91
- let i: string
92
- for (i in $timers) {
93
- if ($timers[i].id == id) {
94
- $timers[i].id = undefined
95
- return
96
- }
97
- }
98
- }
99
-
1
+ //当前正在运动的动画的tick函数堆栈
2
+ let $timers: any[] = []
3
+ //唯一定时器的定时间隔
4
+ let $interval = 13
5
+ //定时器ID
6
+ let $timerId: any
7
+
8
+ /**
9
+ * 动画轮播
10
+ * @param {function} doback 轮询函数,有一个形参deep,0-1,表示执行进度
11
+ * @param {number} duration 动画时长,可选
12
+ * @param {function} callback 动画结束回调,可选,有一个形参deep,0-1,表示执行进度
13
+ *
14
+ * @returns {function} 返回一个函数,调用该函数,可以提前结束动画
15
+ */
16
+ export default function (doback: (deep: number) => void, duration: number = 400, callback: (deep: number) => void = () => { }): Function {
17
+
18
+
19
+ let clock = {
20
+ //把tick函数推入堆栈
21
+ "timer": function (tick: (deep: number) => void, duration: number, callback: (deep: number) => void) {
22
+ if (!tick) {
23
+ throw new Error('Tick is required!')
24
+ }
25
+ let id = new Date().valueOf() + "_" + (Math.random() * 1000).toFixed(0)
26
+ $timers.push({
27
+ "id": id,
28
+ "createTime": new Date(),
29
+ "tick": tick,
30
+ "duration": duration,
31
+ "callback": callback
32
+ });
33
+ clock.start()
34
+ return id
35
+ },
36
+
37
+ //开启唯一的定时器timerId
38
+ "start": function () {
39
+ if (!$timerId) {
40
+ $timerId = setInterval(clock.tick, $interval)
41
+ }
42
+ },
43
+
44
+ //被定时器调用,遍历timers堆栈
45
+ "tick": function () {
46
+ let createTime: Date, flag: number, tick: (deep: number) => void, callback: (deep: number) => void, timer: any, duration: number, passTime: number,
47
+ timers: any[] = $timers
48
+ $timers = []
49
+ $timers.length = 0
50
+ for (flag = 0; flag < timers.length; flag++) {
51
+ //初始化数据
52
+ timer = timers[flag]
53
+ createTime = timer.createTime
54
+ tick = timer.tick
55
+ duration = timer.duration
56
+ callback = timer.callback
57
+
58
+ //执行
59
+ passTime = (+new Date().valueOf() - createTime.valueOf()) / duration
60
+ passTime = passTime > 1 ? 1 : passTime
61
+ tick(passTime)
62
+ if (passTime < 1 && timer.id) {
63
+ //动画没有结束再添加
64
+ $timers.push(timer)
65
+ } else {
66
+ callback(passTime)
67
+ }
68
+ }
69
+ if ($timers.length <= 0) {
70
+ clock.stop()
71
+ }
72
+ },
73
+
74
+ //停止定时器,重置timerId=null
75
+ "stop": function () {
76
+ if ($timerId) {
77
+ clearInterval($timerId)
78
+ $timerId = null
79
+ }
80
+ }
81
+ };
82
+
83
+ let id = clock.timer(function (deep: number) {
84
+ //其中deep为0-1,表示改变的程度
85
+ doback(deep)
86
+ }, duration, callback)
87
+
88
+ // 返回一个函数
89
+ // 用于在动画结束前结束动画
90
+ return function () {
91
+ let i: string
92
+ for (i in $timers) {
93
+ if ($timers[i].id == id) {
94
+ $timers[i].id = undefined
95
+ return
96
+ }
97
+ }
98
+ }
99
+
100
100
  }
@@ -0,0 +1,23 @@
1
+ export default function (begin: number, end: number, step: number, count: number) {
2
+ let val = []
3
+ for (let index = 0; index < count; index++) val[index] = begin
4
+
5
+ // 非常类似进制数,每次调用都+1
6
+ return function () {
7
+ for (let i = 0; i < count; i++) {
8
+
9
+ // 如果当前位可以进1
10
+ if (val[i] < end) {
11
+ val[i] = +(val[i] + step).toFixed(7)
12
+ break
13
+ }
14
+
15
+ // 如果当前位不可以,那当前位归0,尝试下一位
16
+ else if (i < count - 1) {
17
+ val[i] = begin
18
+ }
19
+ }
20
+
21
+ return val
22
+ }
23
+ }
@@ -1,50 +1,50 @@
1
-
2
- // 点(x,y)围绕中心(cx,cy)旋转deg度
3
-
4
- let rotate = function (cx: number, cy: number, deg: number, x: number, y: number) {
5
- let cos = Math.cos(deg), sin = Math.sin(deg)
6
- return [
7
- +((x - cx) * cos - (y - cy) * sin + cx).toFixed(7),
8
- +((x - cx) * sin + (y - cy) * cos + cy).toFixed(7)
9
- ]
10
- }
11
-
12
- // r1和r2,内半径和外半径
13
- // beginA起点弧度,rotateA旋转弧度式
14
-
15
- export default function (beginA: number, rotateA: number, cx: number, cy: number, r1: number, r2: number, doback: Function) {
16
-
17
- // 保证逆时针也是可以的
18
- if (rotateA < 0) {
19
- beginA += rotateA
20
- rotateA *= -1
21
- }
22
-
23
- let temp: number[] = [], p: number[]
24
-
25
- // 内部
26
- p = rotate(0, 0, beginA, r1, 0)
27
- temp[0] = p[0]
28
- temp[1] = p[1]
29
- p = rotate(0, 0, rotateA, p[0], p[1])
30
- temp[2] = p[0]
31
- temp[3] = p[1]
32
-
33
- // 外部
34
- p = rotate(0, 0, beginA, r2, 0)
35
- temp[4] = p[0]
36
- temp[5] = p[1]
37
- p = rotate(0, 0, rotateA, p[0], p[1])
38
- temp[6] = p[0]
39
- temp[7] = p[1]
40
-
41
- doback(
42
- beginA, beginA + rotateA,
43
- temp[0] + cx, temp[1] + cy,
44
- temp[4] + cx, temp[5] + cy,
45
- temp[2] + cx, temp[3] + cy,
46
- temp[6] + cx, temp[7] + cy,
47
- (r2 - r1) * 0.5
48
- )
49
-
50
- }
1
+
2
+ // 点(x,y)围绕中心(cx,cy)旋转deg度
3
+
4
+ let rotate = function (cx: number, cy: number, deg: number, x: number, y: number) {
5
+ let cos = Math.cos(deg), sin = Math.sin(deg)
6
+ return [
7
+ +((x - cx) * cos - (y - cy) * sin + cx).toFixed(7),
8
+ +((x - cx) * sin + (y - cy) * cos + cy).toFixed(7)
9
+ ]
10
+ }
11
+
12
+ // r1和r2,内半径和外半径
13
+ // beginA起点弧度,rotateA旋转弧度式
14
+
15
+ export default function (beginA: number, rotateA: number, cx: number, cy: number, r1: number, r2: number, doback: Function) {
16
+
17
+ // 保证逆时针也是可以的
18
+ if (rotateA < 0) {
19
+ beginA += rotateA
20
+ rotateA *= -1
21
+ }
22
+
23
+ let temp: number[] = [], p: number[]
24
+
25
+ // 内部
26
+ p = rotate(0, 0, beginA, r1, 0)
27
+ temp[0] = p[0]
28
+ temp[1] = p[1]
29
+ p = rotate(0, 0, rotateA, p[0], p[1])
30
+ temp[2] = p[0]
31
+ temp[3] = p[1]
32
+
33
+ // 外部
34
+ p = rotate(0, 0, beginA, r2, 0)
35
+ temp[4] = p[0]
36
+ temp[5] = p[1]
37
+ p = rotate(0, 0, rotateA, p[0], p[1])
38
+ temp[6] = p[0]
39
+ temp[7] = p[1]
40
+
41
+ doback(
42
+ beginA, beginA + rotateA,
43
+ temp[0] + cx, temp[1] + cy,
44
+ temp[4] + cx, temp[5] + cy,
45
+ temp[2] + cx, temp[3] + cy,
46
+ temp[6] + cx, temp[7] + cy,
47
+ (r2 - r1) * 0.5
48
+ )
49
+
50
+ }
@@ -1,17 +1,18 @@
1
1
  import arc from './arc'
2
+ import CanvasConfigType from '../../../types/CanvasConfig'
2
3
 
3
4
  // 文字统一设置方法
4
- export let initText = function (painter: CanvasRenderingContext2D, config: any, x: number, y: number, deg: number) {
5
+ export let initText = function (painter: CanvasRenderingContext2D, config: CanvasConfigType, x: number, y: number, deg: number) {
5
6
 
6
7
  painter.beginPath()
7
8
  painter.translate(x, y)
8
9
  painter.rotate(deg)
9
- painter.font = config['font-style'] + " " + config["font-weight"] + " " + config['font-size'] + "px " + config['font-family']
10
+ painter.font = config.fontStyle + " " + config.fontWeight + " " + config.fontSize + "px " + config.fontFamily
10
11
  return painter
11
12
  };
12
13
 
13
14
  // 画弧统一设置方法
14
- export let initArc = function (painter: CanvasRenderingContext2D, config: any, cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) {
15
+ export let initArc = function (painter: CanvasRenderingContext2D, config: CanvasConfigType, cx: number, cy: number, r1: number, r2: number, beginDeg: number, deg: number) {
15
16
 
16
17
  if (r1 > r2) {
17
18
  let temp = r1
@@ -44,18 +45,18 @@ export let initArc = function (painter: CanvasRenderingContext2D, config: any, c
44
45
  // (圆心x,圆心y,半径,开始角度,结束角度,true逆时针/false顺时针)
45
46
  cx, cy, r1, beginA, endA, false)
46
47
  // 结尾
47
- if (config["arc-end-cap"] != 'round')
48
+ if (config.arcEndCap != 'round')
48
49
  painter.lineTo(endOuterX, endOuterY)
49
50
  else
50
51
  painter.arc((endInnerX + endOuterX) * 0.5, (endInnerY + endOuterY) * 0.5, r, endA - Math.PI, endA, true)
51
52
  painter.arc(cx, cy, r2, endA, beginA, true)
52
53
  // 开头
53
- if (config["arc-start-cap"] != 'round')
54
+ if (config.arcStartCap != 'round')
54
55
  painter.lineTo(begInnerX, begInnerY);
55
56
  else
56
57
  painter.arc((begInnerX + begOuterX) * 0.5, (begInnerY + begOuterY) * 0.5, r, beginA, beginA - Math.PI, true)
57
58
  })
58
- if (config["arc-start-cap"] == 'butt') painter.closePath()
59
+ if (config.arcStartCap == 'butt') painter.closePath()
59
60
  return painter
60
61
  }
61
62
 
@@ -1,12 +1,23 @@
1
+ import CanvasConfigType from '../../../types/CanvasConfig'
1
2
  import PainterRender from './painter'
3
+ import assemble from '../assemble'
4
+
5
+ // 属性名向下兼容
6
+ 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"
13
+ }
2
14
 
3
15
  class Canvas extends PainterRender {
4
16
 
5
17
  readonly name: string = "Canvas"
6
18
 
7
19
  private __regionList = {} //区域映射表
8
- private __rgb: number[] = [0, 0, 0] //区域标识色彩,rgb(0,0,0)表示空白区域
9
- private __p: string = 'r' //色彩增值位置
20
+ private __regionAssemble = assemble(0, 255, 1, 3)
10
21
 
11
22
  constructor(ViewCanvas: HTMLCanvasElement, RegionCanvas: HTMLCanvasElement) {
12
23
  super(ViewCanvas, {}, new PainterRender(RegionCanvas, {
@@ -16,9 +27,10 @@ class Canvas extends PainterRender {
16
27
  this.setRegion("")
17
28
  }
18
29
 
19
- config(configs: any) {
30
+ config(configs: CanvasConfigType) {
20
31
  for (let key in configs) {
21
- this.useConfig(key, configs[key])
32
+ let _key = oldAttrName[key] || key
33
+ this.useConfig(_key, configs[key])
22
34
  }
23
35
 
24
36
  return this
@@ -26,33 +38,17 @@ class Canvas extends PainterRender {
26
38
 
27
39
  // 设置当前绘制区域名称
28
40
  setRegion(regionName: string | number) {
29
- let _this = this
30
41
  if (regionName) {
31
- if (this.__regionList[regionName as string] == undefined) {
32
- this.__regionList[regionName as string] = {
33
- 'r': function () {
34
- _this.__rgb[0] += 1
35
- _this.__p = 'g'
36
- return 'rgb(' + _this.__rgb[0] + ',' + _this.__rgb[1] + ',' + _this.__rgb[2] + ')'
37
- },
38
- 'g': function () {
39
- _this.__rgb[1] += 1
40
- _this.__p = 'b'
41
- return 'rgb(' + _this.__rgb[0] + ',' + _this.__rgb[1] + ',' + _this.__rgb[2] + ')'
42
- },
43
- 'b': function () {
44
- _this.__rgb[2] += 1
45
- _this.__p = 'r'
46
- return 'rgb(' + _this.__rgb[0] + ',' + _this.__rgb[1] + ',' + _this.__rgb[2] + ')'
47
- }
48
- }[this.__p]()
42
+ if (this.__regionList[regionName] == undefined) {
43
+ let tempColor = this.__regionAssemble()
44
+ this.__regionList[regionName] = "rgb(" + tempColor[0] + "," + tempColor[1] + "," + tempColor[2] + ")"
49
45
  }
50
46
 
51
- (this.__region as PainterRender).useConfig("fillStyle", this.__regionList[regionName as string]) &&
52
- (this.__region as PainterRender).useConfig("strokeStyle", this.__regionList[regionName as string])
47
+ this.__region.useConfig("fillStyle", this.__regionList[regionName]) &&
48
+ this.__region.useConfig("strokeStyle", this.__regionList[regionName])
53
49
  } else {
54
- (this.__region as PainterRender).useConfig("fillStyle", "#000000") &&
55
- (this.__region as PainterRender).useConfig("strokeStyle", "#000000")
50
+ this.__region.useConfig("fillStyle", "#000000") &&
51
+ this.__region.useConfig("strokeStyle", "#000000")
56
52
  }
57
53
  return this
58
54
  }
@@ -60,7 +56,7 @@ class Canvas extends PainterRender {
60
56
  // 获取当前事件触发的区域名称
61
57
  getRegion(x: number, y: number): Promise<string> {
62
58
  return new Promise((resolve, reject) => {
63
- let imgData = (this.__region as PainterRender).painter.getImageData(x - 0.5, y - 0.5, 1, 1)
59
+ let imgData = this.__region.painter.getImageData(x - 0.5, y - 0.5, 1, 1)
64
60
 
65
61
  // 获取点击点的颜色
66
62
  let currentRGBA = imgData.data
@@ -91,6 +87,11 @@ class Canvas extends PainterRender {
91
87
  }
92
88
  })
93
89
  }
90
+
91
+ // 获取原始画笔
92
+ getContext(isRegion = false) {
93
+ return isRegion ? this.__region.painter : this.painter
94
+ }
94
95
  }
95
96
 
96
97
  export default Canvas
@@ -1,4 +1,5 @@
1
1
  import { initText, initArc, initCircle, initRect } from './config'
2
+ import texts from './texts'
2
3
 
3
4
  interface OptsType {
4
5
 
@@ -20,22 +21,22 @@ class Painter {
20
21
  private __specialConfig = {
21
22
 
22
23
  // 文字大小
23
- "font-size": 16,
24
+ "fontSize": 16,
24
25
 
25
26
  // 字体
26
- "font-family": "sans-serif",
27
+ "fontFamily": "sans-serif",
27
28
 
28
29
  // 字重
29
- "font-weight": 400,
30
+ "fontWeight": 400,
30
31
 
31
32
  // 字类型
32
- "font-style": "normal",
33
+ "fontStyle": "normal",
33
34
 
34
35
  // 圆弧开始端闭合方式("butt"直线闭合、"round"圆帽闭合)
35
- "arc-start-cap": 'butt',
36
+ "arcStartCap": 'butt',
36
37
 
37
38
  // 圆弧结束端闭合方式,和上一个类似
38
- "arc-end-cap": 'butt'
39
+ "arcEndCap": 'butt'
39
40
  }
40
41
 
41
42
  private __initConfig = {
@@ -129,7 +130,7 @@ class Painter {
129
130
  if (this.__region) this.__region.strokeText(text, x, y, deg)
130
131
 
131
132
  this.painter.save()
132
- initText(this.painter, this.__specialConfig, x, y, deg || 0).strokeText(text, 0, 0)
133
+ initText(this.painter, this.__specialConfig, x, y, deg).strokeText(text, 0, 0)
133
134
  this.painter.restore()
134
135
  return this
135
136
  }
@@ -137,13 +138,55 @@ class Painter {
137
138
  if (this.__region) this.__region.fullText(text, x, y, deg)
138
139
 
139
140
  this.painter.save()
140
- initText(this.painter, this.__specialConfig, x, y, deg || 0)
141
+ initText(this.painter, this.__specialConfig, x, y, deg)
141
142
  this.painter.fillText(text, 0, 0)
142
143
  this.painter.strokeText(text, 0, 0)
143
144
  this.painter.restore()
144
145
  return this
145
146
  }
146
147
 
148
+ // 多行文字
149
+ fillTexts(contents: string, x: number, y: number, width: number, lineHeight: number = 1.2, deg: number = 0) {
150
+ if (this.__region) this.__region.fillTexts(contents, x, y, width, lineHeight)
151
+
152
+ this.painter.save()
153
+ initText(this.painter, this.__specialConfig, x, y, deg)
154
+
155
+ let height = texts(this.painter, contents, width, this.__specialConfig.fontSize * lineHeight, (content, top) => {
156
+ this.painter.fillText(content, 0, top)
157
+ })
158
+
159
+ this.painter.restore()
160
+ return height
161
+ }
162
+ strokeTexts(contents: string, x: number, y: number, width: number, lineHeight: number = 1.2, deg: number = 0) {
163
+ if (this.__region) this.__region.fillTexts(contents, x, y, width, lineHeight)
164
+
165
+ this.painter.save()
166
+ initText(this.painter, this.__specialConfig, x, y, deg)
167
+
168
+ let height = texts(this.painter, contents, width, this.__specialConfig.fontSize * lineHeight, (content, top) => {
169
+ this.painter.strokeText(content, 0, top)
170
+ })
171
+
172
+ this.painter.restore()
173
+ return height
174
+ }
175
+ fullTexts(contents: string, x: number, y: number, width: number, lineHeight: number = 1.2, deg: number = 0) {
176
+ if (this.__region) this.__region.fillTexts(contents, x, y, width, lineHeight)
177
+
178
+ this.painter.save()
179
+ initText(this.painter, this.__specialConfig, x, y, deg)
180
+
181
+ let height = texts(this.painter, contents, width, this.__specialConfig.fontSize * lineHeight, (content, top) => {
182
+ this.painter.fillText(content, 0, top)
183
+ this.painter.strokeText(content, 0, top)
184
+ })
185
+
186
+ this.painter.restore()
187
+ return height
188
+ }
189
+
147
190
  // 路径
148
191
  beginPath() {
149
192
  if (this.__region) this.__region.beginPath()
@@ -0,0 +1,19 @@
1
+ export default function (painter: CanvasRenderingContext2D, contents: string, width: number, height: number, doback: (content: string, top: number) => void) {
2
+
3
+ let lineNumber = 0, content = ""
4
+ for (let i = 0; i < contents.length; i++) {
5
+ if (painter.measureText(content + contents[i]).width > width) {
6
+ lineNumber += 1
7
+ doback(content, (lineNumber - 0.5) * height)
8
+
9
+ content = contents[i]
10
+ } else if (i == contents.length - 1) {
11
+ lineNumber += 1
12
+ doback(content + contents[i], (lineNumber - 0.5) * height)
13
+ } else {
14
+ content += contents[i]
15
+ }
16
+ }
17
+
18
+ return lineNumber * height
19
+ }
@@ -1,6 +1,6 @@
1
- // 修改样式
2
- export default function (el, styles) {
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
  }