@visactor/vrender-core 0.21.11 → 0.21.12-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 (52) hide show
  1. package/cjs/animate/animate.js +1 -1
  2. package/cjs/animate/config.js +1 -1
  3. package/cjs/animate/custom-animate.js +2 -1
  4. package/cjs/animate/default-ticker.js +1 -1
  5. package/cjs/animate/easing.js +1 -1
  6. package/cjs/animate/group-fade.js +1 -1
  7. package/cjs/animate/index.js +1 -1
  8. package/cjs/animate/morphing.js +1 -1
  9. package/cjs/animate/timeline.js +1 -1
  10. package/cjs/canvas/empty-context.js +1 -2
  11. package/cjs/color-string/store.js +1 -2
  12. package/cjs/common/3d-interceptor.js +2 -1
  13. package/cjs/common/polygon.js +0 -1
  14. package/cjs/common/render-command-list.js +2 -1
  15. package/cjs/common/text.js +1 -1
  16. package/cjs/common/utils.js +1 -1
  17. package/cjs/core/application.js +1 -1
  18. package/cjs/core/camera.js +1 -1
  19. package/cjs/core/constants.js +1 -1
  20. package/cjs/core/contributions/textMeasure/AtextMeasure.js +10 -0
  21. package/cjs/core/contributions/textMeasure/AtextMeasure.js.map +1 -1
  22. package/cjs/core/core-modules.js +1 -1
  23. package/cjs/core/global-module.js +0 -2
  24. package/cjs/core/global.js +1 -1
  25. package/cjs/core/graphic-utils.js +1 -1
  26. package/dist/index.es.js +10 -0
  27. package/es/animate/animate.js +1 -1
  28. package/es/animate/config.js +1 -1
  29. package/es/animate/custom-animate.js +2 -1
  30. package/es/animate/default-ticker.js +1 -1
  31. package/es/animate/easing.js +1 -1
  32. package/es/animate/group-fade.js +1 -1
  33. package/es/animate/index.js +1 -1
  34. package/es/animate/morphing.js +1 -1
  35. package/es/animate/timeline.js +1 -1
  36. package/es/canvas/empty-context.js +1 -2
  37. package/es/color-string/store.js +1 -2
  38. package/es/common/3d-interceptor.js +2 -1
  39. package/es/common/polygon.js +1 -2
  40. package/es/common/render-command-list.js +2 -1
  41. package/es/common/text.js +1 -1
  42. package/es/common/utils.js +1 -1
  43. package/es/core/application.js +1 -1
  44. package/es/core/camera.js +1 -1
  45. package/es/core/constants.js +1 -1
  46. package/es/core/contributions/textMeasure/AtextMeasure.js +10 -0
  47. package/es/core/contributions/textMeasure/AtextMeasure.js.map +1 -1
  48. package/es/core/core-modules.js +1 -1
  49. package/es/core/global-module.js +0 -2
  50. package/es/core/global.js +1 -1
  51. package/es/core/graphic-utils.js +1 -1
  52. package/package.json +3 -3
@@ -400,4 +400,4 @@ class Step {
400
400
  return null;
401
401
  }
402
402
  }
403
- //# sourceMappingURL=animate.js.map
403
+ //# sourceMappingURL=animate.js.map
@@ -10,4 +10,4 @@ exports.DefaultStateAnimateConfig = {
10
10
  duration: 1e3,
11
11
  easing: "quadInOut"
12
12
  };
13
- //# sourceMappingURL=config.js.map
13
+ //# sourceMappingURL=config.js.map
@@ -729,4 +729,5 @@ class AnimateGroup1 extends animate_1.ACustomAnimate {
729
729
  }
730
730
  }
731
731
 
732
- exports.AnimateGroup1 = AnimateGroup1;
732
+ exports.AnimateGroup1 = AnimateGroup1;
733
+ //# sourceMappingURL=custom-animate.js.map
@@ -11,4 +11,4 @@ exports.defaultTicker = new default_ticker_1.DefaultTicker, exports.defaultTicke
11
11
  const TICKER_FPS = 60;
12
12
 
13
13
  exports.defaultTicker.setFPS(60);
14
- //# sourceMappingURL=default-ticker.js.map
14
+ //# sourceMappingURL=default-ticker.js.map
@@ -115,4 +115,4 @@ Easing.quintIn = Easing.getPowIn(5), Easing.quintOut = Easing.getPowOut(5), Easi
115
115
  Easing.backIn = Easing.getBackIn(1.7), Easing.backOut = Easing.getBackOut(1.7),
116
116
  Easing.backInOut = Easing.getBackInOut(1.7), Easing.elasticIn = Easing.getElasticIn(1, .3),
117
117
  Easing.elasticOut = Easing.getElasticOut(1, .3), Easing.elasticInOut = Easing.getElasticInOut(1, .3 * 1.5);
118
- //# sourceMappingURL=easing.js.map
118
+ //# sourceMappingURL=easing.js.map
@@ -63,4 +63,4 @@ class GroupFadeOut extends animate_1.ACustomAnimate {
63
63
  }
64
64
 
65
65
  exports.GroupFadeOut = GroupFadeOut;
66
- //# sourceMappingURL=group-fade.js.map
66
+ //# sourceMappingURL=group-fade.js.map
@@ -21,4 +21,4 @@ Object.defineProperty(exports, "__esModule", {
21
21
  __exportStar(require("./config"), exports), __exportStar(require("./custom-animate"), exports),
22
22
  __exportStar(require("./morphing"), exports), __exportStar(require("./timeline"), exports),
23
23
  __exportStar(require("./group-fade"), exports);
24
- //# sourceMappingURL=index.js.map
24
+ //# sourceMappingURL=index.js.map
@@ -289,4 +289,4 @@ const multiToOneMorph = (fromGraphics, toGraphic, animationConfig) => {
289
289
  };
290
290
 
291
291
  exports.multiToOneMorph = multiToOneMorph;
292
- //# sourceMappingURL=morphing.js.map
292
+ //# sourceMappingURL=morphing.js.map
@@ -43,4 +43,4 @@ class DefaultTimeline {
43
43
  }
44
44
 
45
45
  exports.DefaultTimeline = DefaultTimeline, exports.defaultTimeline = new DefaultTimeline;
46
- //# sourceMappingURL=timeline.js.map
46
+ //# sourceMappingURL=timeline.js.map
@@ -209,5 +209,4 @@ let EmptyContext2d = class {
209
209
  };
210
210
 
211
211
  EmptyContext2d = __decorate([ (0, inversify_lite_1.injectable)(), __metadata("design:paramtypes", [ Object, Number ]) ], EmptyContext2d),
212
- exports.EmptyContext2d = EmptyContext2d;
213
- //# sourceMappingURL=empty-context.js.map
212
+ exports.EmptyContext2d = EmptyContext2d;
@@ -50,5 +50,4 @@ class ColorStore {
50
50
  }
51
51
  }
52
52
 
53
- exports.ColorStore = ColorStore, ColorStore.store255 = {}, ColorStore.store1 = {};
54
- //# sourceMappingURL=store.js.map
53
+ exports.ColorStore = ColorStore, ColorStore.store255 = {}, ColorStore.store1 = {};
@@ -47,4 +47,5 @@ const vutils_1 = require("@visactor/vutils"), constants_1 = require("../graphic/
47
47
  return result;
48
48
  };
49
49
 
50
- exports.draw3dItem = draw3dItem;
50
+ exports.draw3dItem = draw3dItem;
51
+ //# sourceMappingURL=3d-interceptor.js.map
@@ -39,7 +39,6 @@ function getProportionPoint(point, segment, length, dx, dy) {
39
39
  };
40
40
  }
41
41
 
42
- //# sourceMappingURL=polygon.js.map
43
42
  Object.defineProperty(exports, "__esModule", {
44
43
  value: !0
45
44
  }), exports.drawRoundedPolygon = exports.drawPolygon = void 0, exports.drawPolygon = drawPolygon,
@@ -13,4 +13,5 @@ function renderCommandList(commandList, context, x = 0, y = 0, sx = 1, sy = 1, z
13
13
  }
14
14
  }
15
15
 
16
- exports.renderCommandList = renderCommandList;
16
+ exports.renderCommandList = renderCommandList;
17
+ //# sourceMappingURL=render-command-list.js.map
@@ -34,4 +34,4 @@ function textAttributesToStyle(attrs) {
34
34
 
35
35
  exports.textDrawOffsetY = textDrawOffsetY, exports.textDrawOffsetX = textDrawOffsetX,
36
36
  exports.textLayoutOffsetY = textLayoutOffsetY, exports.textAttributesToStyle = textAttributesToStyle;
37
- //# sourceMappingURL=text.js.map
37
+ //# sourceMappingURL=text.js.map
@@ -167,4 +167,4 @@ const calculateLineHeight = (lineHeight, fontSize) => {
167
167
  };
168
168
 
169
169
  exports.calculateLineHeight = calculateLineHeight;
170
- //# sourceMappingURL=utils.js.map
170
+ //# sourceMappingURL=utils.js.map
@@ -3,4 +3,4 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  }), exports.ApplicationContribution = void 0, exports.ApplicationContribution = Symbol("ApplicationContribution");
6
- //# sourceMappingURL=application.js.map
6
+ //# sourceMappingURL=application.js.map
@@ -71,4 +71,4 @@ const registerOrthoCamera = () => {
71
71
  };
72
72
 
73
73
  exports.registerOrthoCamera = registerOrthoCamera;
74
- //# sourceMappingURL=camera.js.map
74
+ //# sourceMappingURL=camera.js.map
@@ -7,4 +7,4 @@ exports.TransformUtil = Symbol.for("TransformUtil"), exports.GraphicUtil = Symbo
7
7
  exports.LayerService = Symbol.for("LayerService"), exports.StaticLayerHandlerContribution = Symbol.for("StaticLayerHandlerContribution"),
8
8
  exports.DynamicLayerHandlerContribution = Symbol.for("DynamicLayerHandlerContribution"),
9
9
  exports.VirtualLayerHandlerContribution = Symbol.for("VirtualLayerHandlerContribution");
10
- //# sourceMappingURL=constants.js.map
10
+ //# sourceMappingURL=constants.js.map
@@ -28,11 +28,21 @@ let ATextMeasure = class {
28
28
  }
29
29
  compatibleMetrics(metrics, options) {
30
30
  if (null == metrics.actualBoundingBoxAscent || null == metrics.actualBoundingBoxDescent || null == metrics.fontBoundingBoxAscent || null == metrics.fontBoundingBoxDescent) {
31
+ metrics = {
32
+ width: metrics.width
33
+ };
31
34
  const {ascent: ascent, descent: descent} = this.measureTextBoundADscentEstimate(options);
32
35
  metrics.actualBoundingBoxAscent = ascent, metrics.actualBoundingBoxDescent = descent,
33
36
  metrics.fontBoundingBoxAscent = ascent, metrics.fontBoundingBoxDescent = descent;
34
37
  }
35
38
  if (null == metrics.actualBoundingBoxLeft || null == metrics.actualBoundingBoxRight) {
39
+ metrics = {
40
+ width: metrics.width,
41
+ actualBoundingBoxAscent: metrics.actualBoundingBoxAscent,
42
+ actualBoundingBoxDescent: metrics.actualBoundingBoxDescent,
43
+ fontBoundingBoxAscent: metrics.fontBoundingBoxAscent,
44
+ fontBoundingBoxDescent: metrics.fontBoundingBoxDescent
45
+ };
36
46
  const {left: left, right: right} = this.measureTextBoundLeftRightEstimate(options);
37
47
  metrics.actualBoundingBoxLeft = left, metrics.actualBoundingBoxRight = right;
38
48
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/contributions/textMeasure/AtextMeasure.ts"],"names":[],"mappings":"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","file":"AtextMeasure.js","sourcesContent":["import { injectable } from '../../../common/inversify-lite';\nimport type { IGraphicUtil } from '../../../interface/core';\nimport type { ICanvas, IContext2d, EnvType } from '../../../interface';\nimport { MeasureModeEnum } from '../../../interface';\nimport type { TextOptionsType, ITextMeasure } from '../../../interface/text';\nimport { DefaultTextAttribute, DefaultTextStyle } from '../../../graphic/config';\nimport { testLetter } from '../../../graphic/richtext/utils';\nimport { Logger } from '@visactor/vutils';\n\n@injectable()\nexport class ATextMeasure implements ITextMeasure {\n release: (...params: any) => void;\n protected canvas?: ICanvas;\n protected context?: IContext2d | null;\n\n configure(service: IGraphicUtil, env: EnvType): void {\n this.canvas = service.canvas;\n this.context = service.context;\n service.bindTextMeasure(this);\n }\n\n protected _measureTextWithoutAlignBaseline(text: string, options: TextOptionsType, compatible?: boolean) {\n this.context.setTextStyleWithoutAlignBaseline(options);\n const metrics = this.context.measureText(text);\n\n return compatible ? this.compatibleMetrics(metrics, options) : metrics;\n }\n\n protected _measureTextWithAlignBaseline(text: string, options: TextOptionsType, compatible?: boolean) {\n this.context.setTextStyle(options);\n const metrics = this.context.measureText(text);\n\n return compatible ? this.compatibleMetrics(metrics, options) : metrics;\n }\n\n protected compatibleMetrics(metrics: TextMetrics | { width: number }, options: TextOptionsType) {\n if (\n (metrics as any).actualBoundingBoxAscent == null ||\n (metrics as any).actualBoundingBoxDescent == null ||\n (metrics as any).fontBoundingBoxAscent == null ||\n (metrics as any).fontBoundingBoxDescent == null\n ) {\n const { ascent, descent } = this.measureTextBoundADscentEstimate(options);\n (metrics as any).actualBoundingBoxAscent = ascent;\n (metrics as any).actualBoundingBoxDescent = descent;\n (metrics as any).fontBoundingBoxAscent = ascent;\n (metrics as any).fontBoundingBoxDescent = descent;\n }\n if ((metrics as any).actualBoundingBoxLeft == null || (metrics as any).actualBoundingBoxRight == null) {\n const { left, right } = this.measureTextBoundLeftRightEstimate(options);\n (metrics as any).actualBoundingBoxLeft = left;\n (metrics as any).actualBoundingBoxRight = right;\n }\n return metrics;\n }\n\n // 估算文字长度\n protected estimate(\n text: string,\n { fontSize = DefaultTextAttribute.fontSize }: TextOptionsType\n ): { width: number; height: number } {\n // 假设只有英文和中文字符\n let eCharLen = 0; // 英文字符\n let cCharLen = 0; // 中文字符\n // 判断ascii码,如果是\n for (let i = 0; i < text.length; i++) {\n text.charCodeAt(i) < 128 ? eCharLen++ : cCharLen++;\n }\n return {\n width: ~~(0.8 * eCharLen * fontSize + cCharLen * fontSize),\n height: fontSize\n };\n }\n\n /**\n * 获取text宽度,measureText.width\n * @param text\n * @param options\n */\n measureTextWidth(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }): number {\n if (!this.context) {\n return this.estimate(text, options).width;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options);\n return textMeasure.width;\n }\n /**\n * 获取text宽度,measureText.width\n * @param text\n * @param options\n */\n measureTextBoundsWidth(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return this.estimate(text, options).width;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options);\n return textMeasure.width;\n }\n\n measureTextBoundsLeftRight(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundLeftRightEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n left: (textMeasure as any).actualBoundingBoxLeft,\n right: (textMeasure as any).actualBoundingBoxRight\n };\n }\n\n /**\n * 获取text像素高度,基于actualBoundingBoxAscent和actualBoundingBoxDescent\n * @param text\n * @param options\n */\n measureTextPixelHeight(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return options.fontSize ?? DefaultTextStyle.fontSize;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options, true);\n return Math.abs((textMeasure as any).actualBoundingBoxAscent - (textMeasure as any).actualBoundingBoxDescent);\n }\n\n measureTextPixelADscent(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundADscentEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n ascent: (textMeasure as any).actualBoundingBoxAscent,\n descent: (textMeasure as any).actualBoundingBoxDescent\n };\n }\n\n /**\n * 获取text包围盒的高度,基于fontBoundingBoxAscent和fontBoundingBoxDescent\n * @param text\n * @param options\n */\n measureTextBoundHieght(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return options.fontSize ?? DefaultTextStyle.fontSize;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options, true);\n return Math.abs((textMeasure as any).fontBoundingBoxAscent - (textMeasure as any).fontBoundingBoxDescent);\n }\n\n measureTextBoundADscent(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundADscentEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n ascent: (textMeasure as any).fontBoundingBoxAscent,\n descent: (textMeasure as any).fontBoundingBoxDescent\n };\n }\n\n protected measureTextBoundADscentEstimate(options: TextOptionsType) {\n const fontSize = options.fontSize ?? DefaultTextStyle.fontSize;\n return {\n ascent: 0.79 * fontSize,\n descent: 0.21 * fontSize\n };\n // const { textBaseline } = options;\n // if (textBaseline === 'bottom') {\n // return {\n // ascent: fontSize,\n // descent: 0\n // };\n // } else if (textBaseline === 'middle') {\n // return {\n // ascent: fontSize / 2,\n // descent: fontSize / 2\n // };\n // } else if (textBaseline === 'alphabetic') {\n // return {\n // ascent: 0.79 * fontSize,\n // descent: 0.21 * fontSize\n // };\n // }\n\n // return {\n // ascent: 0,\n // descent: fontSize\n // };\n }\n\n protected measureTextBoundLeftRightEstimate(options: TextOptionsType) {\n const fontSize = options.fontSize ?? DefaultTextStyle.fontSize;\n const { textAlign } = options;\n\n if (textAlign === 'center') {\n return {\n left: fontSize / 2,\n right: fontSize / 2\n };\n } else if (textAlign === 'right' || textAlign === 'end') {\n return {\n left: fontSize,\n right: 0\n };\n }\n return {\n left: 0,\n right: fontSize\n };\n }\n\n measureTextPixelADscentAndWidth(\n text: string,\n options: TextOptionsType,\n mode: MeasureModeEnum\n ): { width: number; ascent: number; descent: number } {\n if (!this.context) {\n return {\n ...this.measureTextBoundADscentEstimate(options),\n width: this.estimate(text, options).width\n };\n }\n const out = this._measureTextWithoutAlignBaseline(text, options, true);\n\n if (mode === MeasureModeEnum.actualBounding) {\n return {\n ascent: (out as any).actualBoundingBoxAscent,\n descent: (out as any).actualBoundingBoxDescent,\n width: (out as any).width\n };\n } else if (mode === MeasureModeEnum.estimate) {\n return {\n ...this.measureTextBoundADscentEstimate(options),\n width: (out as any).width\n };\n } else if (mode === MeasureModeEnum.fontBounding) {\n // const { lineHeight = options.fontSize } = options;\n // let ratio = 1;\n // if (lineHeight) {\n // const fontBoundingHeight = (out as any).fontBoundingBoxAscent + (out as any).fontBoundingBoxDescent;\n // ratio = lineHeight / fontBoundingHeight;\n // }\n // 避免二次矫正,应当保证所有字符组合的基线都一样,否则fontBounding就失去意义了\n // 但如果超出边界了,就只能进行二次矫正\n let ascent = (out as any).fontBoundingBoxAscent;\n let descent = (out as any).fontBoundingBoxDescent;\n // 只能一边超出,都超出的话目前无法矫正,因为行高不能超\n if ((out as any).actualBoundingBoxDescent && descent < (out as any).actualBoundingBoxDescent) {\n const delta = (out as any).actualBoundingBoxDescent - descent;\n descent += delta;\n ascent -= delta;\n } else if ((out as any).actualBoundingBoxAscent && ascent < (out as any).actualBoundingBoxAscent) {\n const delta = (out as any).actualBoundingBoxAscent - ascent;\n ascent += delta;\n descent -= delta;\n }\n return {\n ascent,\n descent,\n width: (out as any).width\n };\n }\n return {\n ascent: (out as any).actualBoundingBoxAscent,\n descent: (out as any).actualBoundingBoxDescent,\n width: (out as any).width\n };\n }\n\n /**\n * 获取text测量对象\n * @param text\n * @param options\n */\n measureText(text: string, options: TextOptionsType): TextMetrics | { width: number } {\n if (!this.context) {\n return this.estimate(text, options);\n }\n this.context.setTextStyleWithoutAlignBaseline(options);\n return this.context.measureText(text);\n }\n\n clipTextVertical(\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n wordBreak: boolean\n ): {\n verticalList: { text: string; width?: number; direction: number }[];\n width: number;\n } {\n if (verticalList.length === 0) {\n return { verticalList, width: 0 };\n }\n const { fontSize = 12 } = options;\n // 计算每一个区域的width\n verticalList.forEach(item => {\n item.width = item.direction === 0 ? fontSize : this.measureTextWidth(item.text, options);\n });\n const out: { text: string; width?: number; direction: number }[] = [];\n let length = 0;\n let i = 0;\n for (; i < verticalList.length; i++) {\n if (length + verticalList[i].width < width) {\n length += verticalList[i].width;\n out.push(verticalList[i]);\n } else {\n break;\n }\n }\n if (verticalList[i] && verticalList[i].text.length > 1) {\n const clipedData = this._clipText(\n verticalList[i].text,\n options,\n width - length,\n 0,\n verticalList[i].text.length - 1,\n 'end',\n false\n );\n if (wordBreak && clipedData.str !== verticalList[i].text) {\n let text = '';\n let length = 0;\n for (let j = 0; j < i; j++) {\n const item = verticalList[j];\n text += item.text;\n length += item.text.length;\n }\n text += verticalList[i].text;\n const totalLength = length + clipedData.str.length;\n let index = testLetter(text, totalLength);\n index = index - length;\n if (index !== clipedData.str.length - 1) {\n clipedData.str = clipedData.str.substring(0, index);\n clipedData.width = this.measureTextWidth(clipedData.str, options);\n }\n }\n out.push({ ...verticalList[i], text: clipedData.str, width: clipedData.width });\n length += clipedData.width;\n }\n\n return {\n verticalList: out,\n width: length\n };\n }\n\n /**\n * 将文本裁剪到width宽\n * @param text\n * @param options\n * @param width\n */\n clipText(\n text: string,\n options: TextOptionsType,\n width: number,\n wordBreak: boolean,\n keepAllBreak?: boolean\n ): {\n str: string;\n width: number;\n wordBreaked?: number;\n } {\n if (text.length === 0) {\n return { str: '', width: 0 };\n }\n let length = this.measureTextWidth(text, options);\n if (length <= width) {\n return { str: text, width: length };\n }\n length = this.measureTextWidth(text[0], options);\n if (length > width) {\n return { str: '', width: 0 };\n }\n const data = this._clipText(text, options, width, 0, text.length - 1, 'end', false);\n // 如果需要文字截断\n if (wordBreak && data.str !== text) {\n let index = testLetter(text, data.str.length, keepAllBreak);\n if (index !== data.str.length) {\n if (index > data.str.length) {\n (data as any).wordBreaked = index;\n index = data.str.length;\n }\n data.str = text.substring(0, index);\n data.width = this.measureTextWidth(data.str, options);\n }\n }\n return data;\n }\n\n // 二分法找到最佳宽\n // TODO: 后续考虑代码合并\n private _clipText(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number,\n position: 'start' | 'end' | 'middle',\n suffix: string | false\n ): { str: string; width: number; result?: string } {\n let data: { str: string; width: number; result?: string };\n if (position === 'start') {\n data = this._clipTextStart(text, options, width, leftIdx, rightIdx);\n suffix && (data.result = suffix + data.str);\n } else if (position === 'middle') {\n const d = this._clipTextMiddle(text, options, width, '', '', 0, 0, 1);\n data = { str: 'none', width: d.width, result: d.left + suffix + d.right };\n } else {\n data = this._clipTextEnd(text, options, width, leftIdx, rightIdx);\n suffix && (data.result = data.str + suffix);\n }\n return data;\n }\n\n private _clipTextEnd(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number\n ): { str: string; width: number } {\n // 添加退出条件,如果leftIdx和rightIdx相等,那么就返回这个字符串(理论上这时出问题了)\n if (leftIdx === rightIdx) {\n Logger.getInstance().warn(`【_clipTextEnd】不应该走到这里${text}, ${leftIdx}, ${rightIdx}`);\n // console.warn(`【_clipTextEnd】不应该走到这里${text}, ${leftIdx}, ${rightIdx}`);\n const subText = text.substring(0, rightIdx + 1);\n return { str: subText, width: this.measureTextWidth(subText, options) };\n }\n const middleIdx = Math.floor((leftIdx + rightIdx) / 2);\n const subText = text.substring(0, middleIdx + 1);\n const strWidth = this.measureTextWidth(subText, options);\n let length: number;\n if (strWidth > width) {\n // 如果字符串的宽度大于限制宽度\n if (subText.length <= 1) {\n return { str: '', width: 0 };\n } // 如果子字符串长度小于1,而且大于给定宽的话,返回空字符串\n // 先判断是不是左侧的那个字符\n const str = text.substring(0, middleIdx);\n // 如果到左侧的字符小于或等于width,那么说明就是左侧的字符\n length = this.measureTextWidth(str, options);\n if (length <= width) {\n return { str, width: length };\n }\n // 返回leftIdx到middleIdx\n return this._clipTextEnd(text, options, width, leftIdx, middleIdx);\n } else if (strWidth < width) {\n // 如果字符串的宽度小于限制宽度\n if (middleIdx >= text.length - 1) {\n return { str: text, width: this.measureTextWidth(text, options) };\n } // 如果已经到结尾了,返回text\n // 先判断是不是右侧的那个字符\n const str = text.substring(0, middleIdx + 2);\n // 如果到右侧的字符大于或等于width,那么说明就是这个字符串\n length = this.measureTextWidth(str, options);\n if (length >= width) {\n return { str: subText, width: strWidth };\n }\n // 返回middleIdx到rightIdx\n return this._clipTextEnd(text, options, width, middleIdx, rightIdx);\n }\n // 如果相同,那么就找到text\n return { str: subText, width: strWidth };\n }\n\n private _clipTextStart(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number\n ): { str: string; width: number } {\n const middleIdx = Math.ceil((leftIdx + rightIdx) / 2);\n const subText = text.substring(middleIdx - 1, text.length);\n const strWidth = this.measureTextWidth(subText, options);\n let length: number;\n if (strWidth > width) {\n // 如果字符串的宽度大于限制宽度\n if (subText.length <= 1) {\n return { str: '', width: 0 };\n } // 如果子字符串长度小于1,而且大于给定宽的话,返回空字符串\n // 先判断是不是左侧的那个字符\n const str = text.substring(middleIdx, text.length);\n // 如果到左侧的字符小于或等于width,那么说明就是左侧的字符\n length = this.measureTextWidth(str, options);\n if (length <= width) {\n return { str, width: length };\n }\n // 返回leftIdx到middleIdx\n return this._clipTextStart(text, options, width, middleIdx, text.length);\n } else if (strWidth < width) {\n // 如果字符串的宽度小于限制宽度\n if (middleIdx <= 0) {\n return { str: text, width: this.measureTextWidth(text, options) };\n } // 如果已经到结尾了,返回text\n // 先判断是不是右侧的那个字符\n const str = text.substring(middleIdx - 2, text.length);\n // 如果到右侧的字符大于或等于width,那么说明就是这个字符串\n length = this.measureTextWidth(str, options);\n if (length >= width) {\n return { str: subText, width: strWidth };\n }\n // 返回middleIdx到rightIdx\n return this._clipTextStart(text, options, width, leftIdx, middleIdx);\n }\n // 如果相同,那么就找到text\n return { str: subText, width: strWidth };\n }\n\n private _clipTextMiddle(\n text: string,\n options: TextOptionsType,\n width: number,\n left: string,\n right: string,\n leftW: number,\n rightW: number,\n buffer: number\n ): { left: string; right: string; width: number } {\n const subLeftText = text.substring(0, buffer);\n const strLeftWidth = this.measureTextWidth(subLeftText, options);\n if (strLeftWidth + rightW > width) {\n return { left, right, width: leftW + rightW };\n }\n const subRightText = text.substring(text.length - buffer, text.length);\n const strRightWidth = this.measureTextWidth(subRightText, options);\n if (strLeftWidth + strRightWidth > width) {\n return { left: subLeftText, right, width: strLeftWidth + rightW };\n }\n return this._clipTextMiddle(\n text,\n options,\n width,\n subLeftText,\n subRightText,\n strLeftWidth,\n strRightWidth,\n buffer + 1\n );\n }\n\n clipTextWithSuffixVertical(\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n suffixPosition: 'start' | 'end' | 'middle'\n ): {\n verticalList: { text: string; width?: number; direction: number }[];\n width: number;\n } {\n if (suffix === '') {\n return this.clipTextVertical(verticalList, options, width, wordBreak);\n }\n if (verticalList.length === 0) {\n return { verticalList, width: 0 };\n }\n\n const output = this.clipTextVertical(verticalList, options, width, wordBreak);\n if (\n output.verticalList.length === verticalList.length &&\n output.verticalList[output.verticalList.length - 1].width === verticalList[verticalList.length - 1].width\n ) {\n return output;\n }\n\n const suffixWidth = this.measureTextWidth(suffix, options);\n if (suffixWidth > width) {\n return output;\n }\n\n width -= suffixWidth;\n\n let out;\n if (suffixPosition === 'start') {\n const nextVerticalList = this.revertVerticalList(verticalList);\n out = this.clipTextVertical(nextVerticalList, options, width, wordBreak);\n const v = this.revertVerticalList(out.verticalList);\n v.unshift({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n out.verticalList = v;\n } else if (suffixPosition === 'middle') {\n const leftOut = this.clipTextVertical(verticalList, options, width / 2, wordBreak);\n const nextVerticalList = this.revertVerticalList(verticalList);\n const rightOut = this.clipTextVertical(nextVerticalList, options, width / 2, wordBreak);\n // 添加suffix\n leftOut.verticalList.push({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n this.revertVerticalList(rightOut.verticalList).forEach(v => leftOut.verticalList.push(v));\n out = {\n verticalList: leftOut.verticalList,\n width: leftOut.width + rightOut.width\n };\n } else {\n out = this.clipTextVertical(verticalList, options, width, wordBreak);\n out.verticalList.push({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n }\n out.width += suffixWidth;\n return out;\n }\n\n revertVerticalList(\n verticalList: {\n text: string;\n width?: number;\n direction: number;\n }[]\n ) {\n return verticalList.reverse().map(l => {\n const t = l.text.split('').reverse().join('');\n return {\n ...l,\n text: t\n };\n });\n }\n\n clipTextWithSuffix(\n text: string,\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n position: 'start' | 'end' | 'middle',\n forceSuffix: boolean = false\n ): {\n str: string;\n width: number;\n } {\n if (suffix === '') {\n return this.clipText(text, options, width, wordBreak);\n }\n if (text.length === 0) {\n return { str: '', width: 0 };\n }\n const length = this.measureTextWidth(text, options);\n if (!forceSuffix && length <= width) {\n return { str: text, width: length };\n }\n const suffixWidth = this.measureTextWidth(suffix, options);\n if (suffixWidth > width) {\n return { str: '', width: 0 };\n }\n if (forceSuffix && length + suffixWidth <= width) {\n return { str: text + suffix, width: length + suffixWidth };\n }\n width -= suffixWidth;\n const data = this._clipText(text, options, width, 0, text.length - 1, position, suffix);\n\n // 如果需要文字截断\n if (wordBreak && data.str !== text) {\n const index = testLetter(text, data.str.length);\n if (index !== data.str.length) {\n data.result = text.substring(0, index);\n data.width = this.measureTextWidth(data.str, options);\n }\n } else if (forceSuffix && data.str === text) {\n data.result = text + suffix;\n }\n data.str = data.result!;\n data.width += suffixWidth;\n return data;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/contributions/textMeasure/AtextMeasure.ts"],"names":[],"mappings":"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","file":"AtextMeasure.js","sourcesContent":["import { injectable } from '../../../common/inversify-lite';\nimport type { IGraphicUtil } from '../../../interface/core';\nimport type { ICanvas, IContext2d, EnvType } from '../../../interface';\nimport { MeasureModeEnum } from '../../../interface';\nimport type { TextOptionsType, ITextMeasure } from '../../../interface/text';\nimport { DefaultTextAttribute, DefaultTextStyle } from '../../../graphic/config';\nimport { testLetter } from '../../../graphic/richtext/utils';\nimport { Logger } from '@visactor/vutils';\n\n@injectable()\nexport class ATextMeasure implements ITextMeasure {\n release: (...params: any) => void;\n protected canvas?: ICanvas;\n protected context?: IContext2d | null;\n\n configure(service: IGraphicUtil, env: EnvType): void {\n this.canvas = service.canvas;\n this.context = service.context;\n service.bindTextMeasure(this);\n }\n\n protected _measureTextWithoutAlignBaseline(text: string, options: TextOptionsType, compatible?: boolean) {\n this.context.setTextStyleWithoutAlignBaseline(options);\n const metrics = this.context.measureText(text);\n\n return compatible ? this.compatibleMetrics(metrics, options) : metrics;\n }\n\n protected _measureTextWithAlignBaseline(text: string, options: TextOptionsType, compatible?: boolean) {\n this.context.setTextStyle(options);\n const metrics = this.context.measureText(text);\n\n return compatible ? this.compatibleMetrics(metrics, options) : metrics;\n }\n\n protected compatibleMetrics(metrics: TextMetrics | { width: number }, options: TextOptionsType) {\n if (\n (metrics as any).actualBoundingBoxAscent == null ||\n (metrics as any).actualBoundingBoxDescent == null ||\n (metrics as any).fontBoundingBoxAscent == null ||\n (metrics as any).fontBoundingBoxDescent == null\n ) {\n metrics = {\n width: metrics.width\n };\n const { ascent, descent } = this.measureTextBoundADscentEstimate(options);\n (metrics as any).actualBoundingBoxAscent = ascent;\n (metrics as any).actualBoundingBoxDescent = descent;\n (metrics as any).fontBoundingBoxAscent = ascent;\n (metrics as any).fontBoundingBoxDescent = descent;\n }\n if ((metrics as any).actualBoundingBoxLeft == null || (metrics as any).actualBoundingBoxRight == null) {\n metrics = {\n width: metrics.width,\n actualBoundingBoxAscent: (metrics as any).actualBoundingBoxAscent,\n actualBoundingBoxDescent: (metrics as any).actualBoundingBoxDescent,\n fontBoundingBoxAscent: (metrics as any).fontBoundingBoxAscent,\n fontBoundingBoxDescent: (metrics as any).fontBoundingBoxDescent\n };\n const { left, right } = this.measureTextBoundLeftRightEstimate(options);\n (metrics as any).actualBoundingBoxLeft = left;\n (metrics as any).actualBoundingBoxRight = right;\n }\n return metrics;\n }\n\n // 估算文字长度\n protected estimate(\n text: string,\n { fontSize = DefaultTextAttribute.fontSize }: TextOptionsType\n ): { width: number; height: number } {\n // 假设只有英文和中文字符\n let eCharLen = 0; // 英文字符\n let cCharLen = 0; // 中文字符\n // 判断ascii码,如果是\n for (let i = 0; i < text.length; i++) {\n text.charCodeAt(i) < 128 ? eCharLen++ : cCharLen++;\n }\n return {\n width: ~~(0.8 * eCharLen * fontSize + cCharLen * fontSize),\n height: fontSize\n };\n }\n\n /**\n * 获取text宽度,measureText.width\n * @param text\n * @param options\n */\n measureTextWidth(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }): number {\n if (!this.context) {\n return this.estimate(text, options).width;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options);\n return textMeasure.width;\n }\n /**\n * 获取text宽度,measureText.width\n * @param text\n * @param options\n */\n measureTextBoundsWidth(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return this.estimate(text, options).width;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options);\n return textMeasure.width;\n }\n\n measureTextBoundsLeftRight(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundLeftRightEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n left: (textMeasure as any).actualBoundingBoxLeft,\n right: (textMeasure as any).actualBoundingBoxRight\n };\n }\n\n /**\n * 获取text像素高度,基于actualBoundingBoxAscent和actualBoundingBoxDescent\n * @param text\n * @param options\n */\n measureTextPixelHeight(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return options.fontSize ?? DefaultTextStyle.fontSize;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options, true);\n return Math.abs((textMeasure as any).actualBoundingBoxAscent - (textMeasure as any).actualBoundingBoxDescent);\n }\n\n measureTextPixelADscent(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundADscentEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n ascent: (textMeasure as any).actualBoundingBoxAscent,\n descent: (textMeasure as any).actualBoundingBoxDescent\n };\n }\n\n /**\n * 获取text包围盒的高度,基于fontBoundingBoxAscent和fontBoundingBoxDescent\n * @param text\n * @param options\n */\n measureTextBoundHieght(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return options.fontSize ?? DefaultTextStyle.fontSize;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options, true);\n return Math.abs((textMeasure as any).fontBoundingBoxAscent - (textMeasure as any).fontBoundingBoxDescent);\n }\n\n measureTextBoundADscent(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundADscentEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n ascent: (textMeasure as any).fontBoundingBoxAscent,\n descent: (textMeasure as any).fontBoundingBoxDescent\n };\n }\n\n protected measureTextBoundADscentEstimate(options: TextOptionsType) {\n const fontSize = options.fontSize ?? DefaultTextStyle.fontSize;\n return {\n ascent: 0.79 * fontSize,\n descent: 0.21 * fontSize\n };\n // const { textBaseline } = options;\n // if (textBaseline === 'bottom') {\n // return {\n // ascent: fontSize,\n // descent: 0\n // };\n // } else if (textBaseline === 'middle') {\n // return {\n // ascent: fontSize / 2,\n // descent: fontSize / 2\n // };\n // } else if (textBaseline === 'alphabetic') {\n // return {\n // ascent: 0.79 * fontSize,\n // descent: 0.21 * fontSize\n // };\n // }\n\n // return {\n // ascent: 0,\n // descent: fontSize\n // };\n }\n\n protected measureTextBoundLeftRightEstimate(options: TextOptionsType) {\n const fontSize = options.fontSize ?? DefaultTextStyle.fontSize;\n const { textAlign } = options;\n\n if (textAlign === 'center') {\n return {\n left: fontSize / 2,\n right: fontSize / 2\n };\n } else if (textAlign === 'right' || textAlign === 'end') {\n return {\n left: fontSize,\n right: 0\n };\n }\n return {\n left: 0,\n right: fontSize\n };\n }\n\n measureTextPixelADscentAndWidth(\n text: string,\n options: TextOptionsType,\n mode: MeasureModeEnum\n ): { width: number; ascent: number; descent: number } {\n if (!this.context) {\n return {\n ...this.measureTextBoundADscentEstimate(options),\n width: this.estimate(text, options).width\n };\n }\n const out = this._measureTextWithoutAlignBaseline(text, options, true);\n\n if (mode === MeasureModeEnum.actualBounding) {\n return {\n ascent: (out as any).actualBoundingBoxAscent,\n descent: (out as any).actualBoundingBoxDescent,\n width: (out as any).width\n };\n } else if (mode === MeasureModeEnum.estimate) {\n return {\n ...this.measureTextBoundADscentEstimate(options),\n width: (out as any).width\n };\n } else if (mode === MeasureModeEnum.fontBounding) {\n // const { lineHeight = options.fontSize } = options;\n // let ratio = 1;\n // if (lineHeight) {\n // const fontBoundingHeight = (out as any).fontBoundingBoxAscent + (out as any).fontBoundingBoxDescent;\n // ratio = lineHeight / fontBoundingHeight;\n // }\n // 避免二次矫正,应当保证所有字符组合的基线都一样,否则fontBounding就失去意义了\n // 但如果超出边界了,就只能进行二次矫正\n let ascent = (out as any).fontBoundingBoxAscent;\n let descent = (out as any).fontBoundingBoxDescent;\n // 只能一边超出,都超出的话目前无法矫正,因为行高不能超\n if ((out as any).actualBoundingBoxDescent && descent < (out as any).actualBoundingBoxDescent) {\n const delta = (out as any).actualBoundingBoxDescent - descent;\n descent += delta;\n ascent -= delta;\n } else if ((out as any).actualBoundingBoxAscent && ascent < (out as any).actualBoundingBoxAscent) {\n const delta = (out as any).actualBoundingBoxAscent - ascent;\n ascent += delta;\n descent -= delta;\n }\n return {\n ascent,\n descent,\n width: (out as any).width\n };\n }\n return {\n ascent: (out as any).actualBoundingBoxAscent,\n descent: (out as any).actualBoundingBoxDescent,\n width: (out as any).width\n };\n }\n\n /**\n * 获取text测量对象\n * @param text\n * @param options\n */\n measureText(text: string, options: TextOptionsType): TextMetrics | { width: number } {\n if (!this.context) {\n return this.estimate(text, options);\n }\n this.context.setTextStyleWithoutAlignBaseline(options);\n return this.context.measureText(text);\n }\n\n clipTextVertical(\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n wordBreak: boolean\n ): {\n verticalList: { text: string; width?: number; direction: number }[];\n width: number;\n } {\n if (verticalList.length === 0) {\n return { verticalList, width: 0 };\n }\n const { fontSize = 12 } = options;\n // 计算每一个区域的width\n verticalList.forEach(item => {\n item.width = item.direction === 0 ? fontSize : this.measureTextWidth(item.text, options);\n });\n const out: { text: string; width?: number; direction: number }[] = [];\n let length = 0;\n let i = 0;\n for (; i < verticalList.length; i++) {\n if (length + verticalList[i].width < width) {\n length += verticalList[i].width;\n out.push(verticalList[i]);\n } else {\n break;\n }\n }\n if (verticalList[i] && verticalList[i].text.length > 1) {\n const clipedData = this._clipText(\n verticalList[i].text,\n options,\n width - length,\n 0,\n verticalList[i].text.length - 1,\n 'end',\n false\n );\n if (wordBreak && clipedData.str !== verticalList[i].text) {\n let text = '';\n let length = 0;\n for (let j = 0; j < i; j++) {\n const item = verticalList[j];\n text += item.text;\n length += item.text.length;\n }\n text += verticalList[i].text;\n const totalLength = length + clipedData.str.length;\n let index = testLetter(text, totalLength);\n index = index - length;\n if (index !== clipedData.str.length - 1) {\n clipedData.str = clipedData.str.substring(0, index);\n clipedData.width = this.measureTextWidth(clipedData.str, options);\n }\n }\n out.push({ ...verticalList[i], text: clipedData.str, width: clipedData.width });\n length += clipedData.width;\n }\n\n return {\n verticalList: out,\n width: length\n };\n }\n\n /**\n * 将文本裁剪到width宽\n * @param text\n * @param options\n * @param width\n */\n clipText(\n text: string,\n options: TextOptionsType,\n width: number,\n wordBreak: boolean,\n keepAllBreak?: boolean\n ): {\n str: string;\n width: number;\n wordBreaked?: number;\n } {\n if (text.length === 0) {\n return { str: '', width: 0 };\n }\n let length = this.measureTextWidth(text, options);\n if (length <= width) {\n return { str: text, width: length };\n }\n length = this.measureTextWidth(text[0], options);\n if (length > width) {\n return { str: '', width: 0 };\n }\n const data = this._clipText(text, options, width, 0, text.length - 1, 'end', false);\n // 如果需要文字截断\n if (wordBreak && data.str !== text) {\n let index = testLetter(text, data.str.length, keepAllBreak);\n if (index !== data.str.length) {\n if (index > data.str.length) {\n (data as any).wordBreaked = index;\n index = data.str.length;\n }\n data.str = text.substring(0, index);\n data.width = this.measureTextWidth(data.str, options);\n }\n }\n return data;\n }\n\n // 二分法找到最佳宽\n // TODO: 后续考虑代码合并\n private _clipText(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number,\n position: 'start' | 'end' | 'middle',\n suffix: string | false\n ): { str: string; width: number; result?: string } {\n let data: { str: string; width: number; result?: string };\n if (position === 'start') {\n data = this._clipTextStart(text, options, width, leftIdx, rightIdx);\n suffix && (data.result = suffix + data.str);\n } else if (position === 'middle') {\n const d = this._clipTextMiddle(text, options, width, '', '', 0, 0, 1);\n data = { str: 'none', width: d.width, result: d.left + suffix + d.right };\n } else {\n data = this._clipTextEnd(text, options, width, leftIdx, rightIdx);\n suffix && (data.result = data.str + suffix);\n }\n return data;\n }\n\n private _clipTextEnd(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number\n ): { str: string; width: number } {\n // 添加退出条件,如果leftIdx和rightIdx相等,那么就返回这个字符串(理论上这时出问题了)\n if (leftIdx === rightIdx) {\n Logger.getInstance().warn(`【_clipTextEnd】不应该走到这里${text}, ${leftIdx}, ${rightIdx}`);\n // console.warn(`【_clipTextEnd】不应该走到这里${text}, ${leftIdx}, ${rightIdx}`);\n const subText = text.substring(0, rightIdx + 1);\n return { str: subText, width: this.measureTextWidth(subText, options) };\n }\n const middleIdx = Math.floor((leftIdx + rightIdx) / 2);\n const subText = text.substring(0, middleIdx + 1);\n const strWidth = this.measureTextWidth(subText, options);\n let length: number;\n if (strWidth > width) {\n // 如果字符串的宽度大于限制宽度\n if (subText.length <= 1) {\n return { str: '', width: 0 };\n } // 如果子字符串长度小于1,而且大于给定宽的话,返回空字符串\n // 先判断是不是左侧的那个字符\n const str = text.substring(0, middleIdx);\n // 如果到左侧的字符小于或等于width,那么说明就是左侧的字符\n length = this.measureTextWidth(str, options);\n if (length <= width) {\n return { str, width: length };\n }\n // 返回leftIdx到middleIdx\n return this._clipTextEnd(text, options, width, leftIdx, middleIdx);\n } else if (strWidth < width) {\n // 如果字符串的宽度小于限制宽度\n if (middleIdx >= text.length - 1) {\n return { str: text, width: this.measureTextWidth(text, options) };\n } // 如果已经到结尾了,返回text\n // 先判断是不是右侧的那个字符\n const str = text.substring(0, middleIdx + 2);\n // 如果到右侧的字符大于或等于width,那么说明就是这个字符串\n length = this.measureTextWidth(str, options);\n if (length >= width) {\n return { str: subText, width: strWidth };\n }\n // 返回middleIdx到rightIdx\n return this._clipTextEnd(text, options, width, middleIdx, rightIdx);\n }\n // 如果相同,那么就找到text\n return { str: subText, width: strWidth };\n }\n\n private _clipTextStart(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number\n ): { str: string; width: number } {\n const middleIdx = Math.ceil((leftIdx + rightIdx) / 2);\n const subText = text.substring(middleIdx - 1, text.length);\n const strWidth = this.measureTextWidth(subText, options);\n let length: number;\n if (strWidth > width) {\n // 如果字符串的宽度大于限制宽度\n if (subText.length <= 1) {\n return { str: '', width: 0 };\n } // 如果子字符串长度小于1,而且大于给定宽的话,返回空字符串\n // 先判断是不是左侧的那个字符\n const str = text.substring(middleIdx, text.length);\n // 如果到左侧的字符小于或等于width,那么说明就是左侧的字符\n length = this.measureTextWidth(str, options);\n if (length <= width) {\n return { str, width: length };\n }\n // 返回leftIdx到middleIdx\n return this._clipTextStart(text, options, width, middleIdx, text.length);\n } else if (strWidth < width) {\n // 如果字符串的宽度小于限制宽度\n if (middleIdx <= 0) {\n return { str: text, width: this.measureTextWidth(text, options) };\n } // 如果已经到结尾了,返回text\n // 先判断是不是右侧的那个字符\n const str = text.substring(middleIdx - 2, text.length);\n // 如果到右侧的字符大于或等于width,那么说明就是这个字符串\n length = this.measureTextWidth(str, options);\n if (length >= width) {\n return { str: subText, width: strWidth };\n }\n // 返回middleIdx到rightIdx\n return this._clipTextStart(text, options, width, leftIdx, middleIdx);\n }\n // 如果相同,那么就找到text\n return { str: subText, width: strWidth };\n }\n\n private _clipTextMiddle(\n text: string,\n options: TextOptionsType,\n width: number,\n left: string,\n right: string,\n leftW: number,\n rightW: number,\n buffer: number\n ): { left: string; right: string; width: number } {\n const subLeftText = text.substring(0, buffer);\n const strLeftWidth = this.measureTextWidth(subLeftText, options);\n if (strLeftWidth + rightW > width) {\n return { left, right, width: leftW + rightW };\n }\n const subRightText = text.substring(text.length - buffer, text.length);\n const strRightWidth = this.measureTextWidth(subRightText, options);\n if (strLeftWidth + strRightWidth > width) {\n return { left: subLeftText, right, width: strLeftWidth + rightW };\n }\n return this._clipTextMiddle(\n text,\n options,\n width,\n subLeftText,\n subRightText,\n strLeftWidth,\n strRightWidth,\n buffer + 1\n );\n }\n\n clipTextWithSuffixVertical(\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n suffixPosition: 'start' | 'end' | 'middle'\n ): {\n verticalList: { text: string; width?: number; direction: number }[];\n width: number;\n } {\n if (suffix === '') {\n return this.clipTextVertical(verticalList, options, width, wordBreak);\n }\n if (verticalList.length === 0) {\n return { verticalList, width: 0 };\n }\n\n const output = this.clipTextVertical(verticalList, options, width, wordBreak);\n if (\n output.verticalList.length === verticalList.length &&\n output.verticalList[output.verticalList.length - 1].width === verticalList[verticalList.length - 1].width\n ) {\n return output;\n }\n\n const suffixWidth = this.measureTextWidth(suffix, options);\n if (suffixWidth > width) {\n return output;\n }\n\n width -= suffixWidth;\n\n let out;\n if (suffixPosition === 'start') {\n const nextVerticalList = this.revertVerticalList(verticalList);\n out = this.clipTextVertical(nextVerticalList, options, width, wordBreak);\n const v = this.revertVerticalList(out.verticalList);\n v.unshift({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n out.verticalList = v;\n } else if (suffixPosition === 'middle') {\n const leftOut = this.clipTextVertical(verticalList, options, width / 2, wordBreak);\n const nextVerticalList = this.revertVerticalList(verticalList);\n const rightOut = this.clipTextVertical(nextVerticalList, options, width / 2, wordBreak);\n // 添加suffix\n leftOut.verticalList.push({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n this.revertVerticalList(rightOut.verticalList).forEach(v => leftOut.verticalList.push(v));\n out = {\n verticalList: leftOut.verticalList,\n width: leftOut.width + rightOut.width\n };\n } else {\n out = this.clipTextVertical(verticalList, options, width, wordBreak);\n out.verticalList.push({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n }\n out.width += suffixWidth;\n return out;\n }\n\n revertVerticalList(\n verticalList: {\n text: string;\n width?: number;\n direction: number;\n }[]\n ) {\n return verticalList.reverse().map(l => {\n const t = l.text.split('').reverse().join('');\n return {\n ...l,\n text: t\n };\n });\n }\n\n clipTextWithSuffix(\n text: string,\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n position: 'start' | 'end' | 'middle',\n forceSuffix: boolean = false\n ): {\n str: string;\n width: number;\n } {\n if (suffix === '') {\n return this.clipText(text, options, width, wordBreak);\n }\n if (text.length === 0) {\n return { str: '', width: 0 };\n }\n const length = this.measureTextWidth(text, options);\n if (!forceSuffix && length <= width) {\n return { str: text, width: length };\n }\n const suffixWidth = this.measureTextWidth(suffix, options);\n if (suffixWidth > width) {\n return { str: '', width: 0 };\n }\n if (forceSuffix && length + suffixWidth <= width) {\n return { str: text + suffix, width: length + suffixWidth };\n }\n width -= suffixWidth;\n const data = this._clipText(text, options, width, 0, text.length - 1, position, suffix);\n\n // 如果需要文字截断\n if (wordBreak && data.str !== text) {\n const index = testLetter(text, data.str.length);\n if (index !== data.str.length) {\n data.result = text.substring(0, index);\n data.width = this.measureTextWidth(data.str, options);\n }\n } else if (forceSuffix && data.str === text) {\n data.result = text + suffix;\n }\n data.str = data.result!;\n data.width += suffixWidth;\n return data;\n }\n}\n"]}
@@ -12,4 +12,4 @@ exports.default = new inversify_lite_1.ContainerModule((bind => {
12
12
  bind(constants_1.TransformUtil).to(graphic_utils_1.DefaultTransformUtil).inSingletonScope(),
13
13
  bind(constants_1.LayerService).to(layer_service_1.DefaultLayerService).inSingletonScope();
14
14
  }));
15
- //# sourceMappingURL=core-modules.js.map
15
+ //# sourceMappingURL=core-modules.js.map
@@ -1,3 +1 @@
1
-
2
-
3
1
  //# sourceMappingURL=global-module.js.map
@@ -214,4 +214,4 @@ DefaultGlobal = __decorate([ (0, inversify_lite_1.injectable)(), __param(0, (0,
214
214
  inversify_lite_1.inject)(contribution_provider_1.ContributionProvider)), __param(0, (0,
215
215
  inversify_lite_1.named)(constants_1.EnvContribution)), __metadata("design:paramtypes", [ Object ]) ], DefaultGlobal),
216
216
  exports.DefaultGlobal = DefaultGlobal;
217
- //# sourceMappingURL=global.js.map
217
+ //# sourceMappingURL=global.js.map
@@ -172,4 +172,4 @@ let DefaultTransformUtil = class {
172
172
 
173
173
  DefaultTransformUtil = __decorate([ (0, inversify_lite_1.injectable)(), __metadata("design:paramtypes", []) ], DefaultTransformUtil),
174
174
  exports.DefaultTransformUtil = DefaultTransformUtil;
175
- //# sourceMappingURL=graphic-utils.js.map
175
+ //# sourceMappingURL=graphic-utils.js.map
package/dist/index.es.js CHANGED
@@ -3766,6 +3766,9 @@ let ATextMeasure = class ATextMeasure {
3766
3766
  metrics.actualBoundingBoxDescent == null ||
3767
3767
  metrics.fontBoundingBoxAscent == null ||
3768
3768
  metrics.fontBoundingBoxDescent == null) {
3769
+ metrics = {
3770
+ width: metrics.width
3771
+ };
3769
3772
  const { ascent, descent } = this.measureTextBoundADscentEstimate(options);
3770
3773
  metrics.actualBoundingBoxAscent = ascent;
3771
3774
  metrics.actualBoundingBoxDescent = descent;
@@ -3773,6 +3776,13 @@ let ATextMeasure = class ATextMeasure {
3773
3776
  metrics.fontBoundingBoxDescent = descent;
3774
3777
  }
3775
3778
  if (metrics.actualBoundingBoxLeft == null || metrics.actualBoundingBoxRight == null) {
3779
+ metrics = {
3780
+ width: metrics.width,
3781
+ actualBoundingBoxAscent: metrics.actualBoundingBoxAscent,
3782
+ actualBoundingBoxDescent: metrics.actualBoundingBoxDescent,
3783
+ fontBoundingBoxAscent: metrics.fontBoundingBoxAscent,
3784
+ fontBoundingBoxDescent: metrics.fontBoundingBoxDescent
3785
+ };
3776
3786
  const { left, right } = this.measureTextBoundLeftRightEstimate(options);
3777
3787
  metrics.actualBoundingBoxLeft = left;
3778
3788
  metrics.actualBoundingBoxRight = right;
@@ -395,4 +395,4 @@ class Step {
395
395
  return null;
396
396
  }
397
397
  }
398
- //# sourceMappingURL=animate.js.map
398
+ //# sourceMappingURL=animate.js.map
@@ -7,4 +7,4 @@ export const DefaultMorphingAnimateConfig = {
7
7
  duration: 1e3,
8
8
  easing: "quadInOut"
9
9
  };
10
- //# sourceMappingURL=config.js.map
10
+ //# sourceMappingURL=config.js.map
@@ -706,4 +706,5 @@ export class AnimateGroup1 extends ACustomAnimate {
706
706
  ratio = easingFunc(ratio), a.onUpdate(end, ratio, out);
707
707
  })), this.updating = !1);
708
708
  }
709
- }
709
+ }
710
+ //# sourceMappingURL=custom-animate.js.map
@@ -9,4 +9,4 @@ defaultTicker.addTimeline(defaultTimeline);
9
9
  const TICKER_FPS = 60;
10
10
 
11
11
  defaultTicker.setFPS(60);
12
- //# sourceMappingURL=default-ticker.js.map
12
+ //# sourceMappingURL=default-ticker.js.map
@@ -108,4 +108,4 @@ Easing.quintIn = Easing.getPowIn(5), Easing.quintOut = Easing.getPowOut(5), Easi
108
108
  Easing.backIn = Easing.getBackIn(1.7), Easing.backOut = Easing.getBackOut(1.7),
109
109
  Easing.backInOut = Easing.getBackInOut(1.7), Easing.elasticIn = Easing.getElasticIn(1, .3),
110
110
  Easing.elasticOut = Easing.getElasticOut(1, .3), Easing.elasticInOut = Easing.getElasticInOut(1, .3 * 1.5);
111
- //# sourceMappingURL=easing.js.map
111
+ //# sourceMappingURL=easing.js.map
@@ -53,4 +53,4 @@ export class GroupFadeOut extends ACustomAnimate {
53
53
  });
54
54
  }
55
55
  }
56
- //# sourceMappingURL=group-fade.js.map
56
+ //# sourceMappingURL=group-fade.js.map
@@ -11,4 +11,4 @@ export * from "./morphing";
11
11
  export * from "./timeline";
12
12
 
13
13
  export * from "./group-fade";
14
- //# sourceMappingURL=index.js.map
14
+ //# sourceMappingURL=index.js.map
@@ -292,4 +292,4 @@ export const multiToOneMorph = (fromGraphics, toGraphic, animationConfig) => {
292
292
  }, null !== (_b = null == animationConfig ? void 0 : animationConfig.duration) && void 0 !== _b ? _b : DefaultMorphingAnimateConfig.duration, null !== (_c = null == animationConfig ? void 0 : animationConfig.easing) && void 0 !== _c ? _c : DefaultMorphingAnimateConfig.easing));
293
293
  }
294
294
  };
295
- //# sourceMappingURL=morphing.js.map
295
+ //# sourceMappingURL=morphing.js.map
@@ -39,4 +39,4 @@ export class DefaultTimeline {
39
39
  }
40
40
 
41
41
  export const defaultTimeline = new DefaultTimeline;
42
- //# sourceMappingURL=timeline.js.map
42
+ //# sourceMappingURL=timeline.js.map
@@ -215,5 +215,4 @@ let EmptyContext2d = class {
215
215
 
216
216
  EmptyContext2d = __decorate([ injectable(), __metadata("design:paramtypes", [ Object, Number ]) ], EmptyContext2d);
217
217
 
218
- export { EmptyContext2d };
219
- //# sourceMappingURL=empty-context.js.map
218
+ export { EmptyContext2d };
@@ -44,5 +44,4 @@ export class ColorStore {
44
44
  }
45
45
  }
46
46
 
47
- ColorStore.store255 = {}, ColorStore.store1 = {};
48
- //# sourceMappingURL=store.js.map
47
+ ColorStore.store255 = {}, ColorStore.store1 = {};
@@ -43,4 +43,5 @@ export const draw3dItem = (context, graphic, callback, output) => {
43
43
  }));
44
44
  } else result = callback(isPie, is3d);
45
45
  return result;
46
- };
46
+ };
47
+ //# sourceMappingURL=3d-interceptor.js.map
@@ -35,5 +35,4 @@ function getProportionPoint(point, segment, length, dx, dy) {
35
35
  x: point.x - dx * factor,
36
36
  y: point.y - dy * factor
37
37
  };
38
- }
39
- //# sourceMappingURL=polygon.js.map
38
+ }
@@ -5,4 +5,5 @@ export function renderCommandList(commandList, context, x = 0, y = 0, sx = 1, sy
5
5
  const command = commandList[i];
6
6
  commandFuncs[command[0]](command, context, x, y, sx, sy, z);
7
7
  }
8
- }
8
+ }
9
+ //# sourceMappingURL=render-command-list.js.map
package/es/common/text.js CHANGED
@@ -24,4 +24,4 @@ export function textAttributesToStyle(attrs) {
24
24
  attrs.underline ? style["text-decoration"] = "underline" : attrs.lineThrough && (style["text-decoration"] = "line-through"),
25
25
  attrs.fill && isString(attrs.fill) && (style.color = attrs.fill), style;
26
26
  }
27
- //# sourceMappingURL=text.js.map
27
+ //# sourceMappingURL=text.js.map
@@ -152,4 +152,4 @@ export const calculateLineHeight = (lineHeight, fontSize) => {
152
152
  const _lh = _calculateLineHeight(lineHeight, fontSize);
153
153
  return isNaN(_lh) ? _lh : Math.max(fontSize, _lh);
154
154
  };
155
- //# sourceMappingURL=utils.js.map
155
+ //# sourceMappingURL=utils.js.map
@@ -1,2 +1,2 @@
1
1
  export const ApplicationContribution = Symbol("ApplicationContribution");
2
- //# sourceMappingURL=application.js.map
2
+ //# sourceMappingURL=application.js.map
package/es/core/camera.js CHANGED
@@ -66,4 +66,4 @@ export class OrthoCamera {
66
66
  export const registerOrthoCamera = () => {
67
67
  Factory.registerPlugin("OrthoCamera", OrthoCamera);
68
68
  };
69
- //# sourceMappingURL=camera.js.map
69
+ //# sourceMappingURL=camera.js.map
@@ -9,4 +9,4 @@ export const StaticLayerHandlerContribution = Symbol.for("StaticLayerHandlerCont
9
9
  export const DynamicLayerHandlerContribution = Symbol.for("DynamicLayerHandlerContribution");
10
10
 
11
11
  export const VirtualLayerHandlerContribution = Symbol.for("VirtualLayerHandlerContribution");
12
- //# sourceMappingURL=constants.js.map
12
+ //# sourceMappingURL=constants.js.map
@@ -30,11 +30,21 @@ let ATextMeasure = class {
30
30
  }
31
31
  compatibleMetrics(metrics, options) {
32
32
  if (null == metrics.actualBoundingBoxAscent || null == metrics.actualBoundingBoxDescent || null == metrics.fontBoundingBoxAscent || null == metrics.fontBoundingBoxDescent) {
33
+ metrics = {
34
+ width: metrics.width
35
+ };
33
36
  const {ascent: ascent, descent: descent} = this.measureTextBoundADscentEstimate(options);
34
37
  metrics.actualBoundingBoxAscent = ascent, metrics.actualBoundingBoxDescent = descent,
35
38
  metrics.fontBoundingBoxAscent = ascent, metrics.fontBoundingBoxDescent = descent;
36
39
  }
37
40
  if (null == metrics.actualBoundingBoxLeft || null == metrics.actualBoundingBoxRight) {
41
+ metrics = {
42
+ width: metrics.width,
43
+ actualBoundingBoxAscent: metrics.actualBoundingBoxAscent,
44
+ actualBoundingBoxDescent: metrics.actualBoundingBoxDescent,
45
+ fontBoundingBoxAscent: metrics.fontBoundingBoxAscent,
46
+ fontBoundingBoxDescent: metrics.fontBoundingBoxDescent
47
+ };
38
48
  const {left: left, right: right} = this.measureTextBoundLeftRightEstimate(options);
39
49
  metrics.actualBoundingBoxLeft = left, metrics.actualBoundingBoxRight = right;
40
50
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/contributions/textMeasure/AtextMeasure.ts"],"names":[],"mappings":"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","file":"AtextMeasure.js","sourcesContent":["import { injectable } from '../../../common/inversify-lite';\nimport type { IGraphicUtil } from '../../../interface/core';\nimport type { ICanvas, IContext2d, EnvType } from '../../../interface';\nimport { MeasureModeEnum } from '../../../interface';\nimport type { TextOptionsType, ITextMeasure } from '../../../interface/text';\nimport { DefaultTextAttribute, DefaultTextStyle } from '../../../graphic/config';\nimport { testLetter } from '../../../graphic/richtext/utils';\nimport { Logger } from '@visactor/vutils';\n\n@injectable()\nexport class ATextMeasure implements ITextMeasure {\n release: (...params: any) => void;\n protected canvas?: ICanvas;\n protected context?: IContext2d | null;\n\n configure(service: IGraphicUtil, env: EnvType): void {\n this.canvas = service.canvas;\n this.context = service.context;\n service.bindTextMeasure(this);\n }\n\n protected _measureTextWithoutAlignBaseline(text: string, options: TextOptionsType, compatible?: boolean) {\n this.context.setTextStyleWithoutAlignBaseline(options);\n const metrics = this.context.measureText(text);\n\n return compatible ? this.compatibleMetrics(metrics, options) : metrics;\n }\n\n protected _measureTextWithAlignBaseline(text: string, options: TextOptionsType, compatible?: boolean) {\n this.context.setTextStyle(options);\n const metrics = this.context.measureText(text);\n\n return compatible ? this.compatibleMetrics(metrics, options) : metrics;\n }\n\n protected compatibleMetrics(metrics: TextMetrics | { width: number }, options: TextOptionsType) {\n if (\n (metrics as any).actualBoundingBoxAscent == null ||\n (metrics as any).actualBoundingBoxDescent == null ||\n (metrics as any).fontBoundingBoxAscent == null ||\n (metrics as any).fontBoundingBoxDescent == null\n ) {\n const { ascent, descent } = this.measureTextBoundADscentEstimate(options);\n (metrics as any).actualBoundingBoxAscent = ascent;\n (metrics as any).actualBoundingBoxDescent = descent;\n (metrics as any).fontBoundingBoxAscent = ascent;\n (metrics as any).fontBoundingBoxDescent = descent;\n }\n if ((metrics as any).actualBoundingBoxLeft == null || (metrics as any).actualBoundingBoxRight == null) {\n const { left, right } = this.measureTextBoundLeftRightEstimate(options);\n (metrics as any).actualBoundingBoxLeft = left;\n (metrics as any).actualBoundingBoxRight = right;\n }\n return metrics;\n }\n\n // 估算文字长度\n protected estimate(\n text: string,\n { fontSize = DefaultTextAttribute.fontSize }: TextOptionsType\n ): { width: number; height: number } {\n // 假设只有英文和中文字符\n let eCharLen = 0; // 英文字符\n let cCharLen = 0; // 中文字符\n // 判断ascii码,如果是\n for (let i = 0; i < text.length; i++) {\n text.charCodeAt(i) < 128 ? eCharLen++ : cCharLen++;\n }\n return {\n width: ~~(0.8 * eCharLen * fontSize + cCharLen * fontSize),\n height: fontSize\n };\n }\n\n /**\n * 获取text宽度,measureText.width\n * @param text\n * @param options\n */\n measureTextWidth(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }): number {\n if (!this.context) {\n return this.estimate(text, options).width;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options);\n return textMeasure.width;\n }\n /**\n * 获取text宽度,measureText.width\n * @param text\n * @param options\n */\n measureTextBoundsWidth(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return this.estimate(text, options).width;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options);\n return textMeasure.width;\n }\n\n measureTextBoundsLeftRight(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundLeftRightEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n left: (textMeasure as any).actualBoundingBoxLeft,\n right: (textMeasure as any).actualBoundingBoxRight\n };\n }\n\n /**\n * 获取text像素高度,基于actualBoundingBoxAscent和actualBoundingBoxDescent\n * @param text\n * @param options\n */\n measureTextPixelHeight(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return options.fontSize ?? DefaultTextStyle.fontSize;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options, true);\n return Math.abs((textMeasure as any).actualBoundingBoxAscent - (textMeasure as any).actualBoundingBoxDescent);\n }\n\n measureTextPixelADscent(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundADscentEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n ascent: (textMeasure as any).actualBoundingBoxAscent,\n descent: (textMeasure as any).actualBoundingBoxDescent\n };\n }\n\n /**\n * 获取text包围盒的高度,基于fontBoundingBoxAscent和fontBoundingBoxDescent\n * @param text\n * @param options\n */\n measureTextBoundHieght(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return options.fontSize ?? DefaultTextStyle.fontSize;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options, true);\n return Math.abs((textMeasure as any).fontBoundingBoxAscent - (textMeasure as any).fontBoundingBoxDescent);\n }\n\n measureTextBoundADscent(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundADscentEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n ascent: (textMeasure as any).fontBoundingBoxAscent,\n descent: (textMeasure as any).fontBoundingBoxDescent\n };\n }\n\n protected measureTextBoundADscentEstimate(options: TextOptionsType) {\n const fontSize = options.fontSize ?? DefaultTextStyle.fontSize;\n return {\n ascent: 0.79 * fontSize,\n descent: 0.21 * fontSize\n };\n // const { textBaseline } = options;\n // if (textBaseline === 'bottom') {\n // return {\n // ascent: fontSize,\n // descent: 0\n // };\n // } else if (textBaseline === 'middle') {\n // return {\n // ascent: fontSize / 2,\n // descent: fontSize / 2\n // };\n // } else if (textBaseline === 'alphabetic') {\n // return {\n // ascent: 0.79 * fontSize,\n // descent: 0.21 * fontSize\n // };\n // }\n\n // return {\n // ascent: 0,\n // descent: fontSize\n // };\n }\n\n protected measureTextBoundLeftRightEstimate(options: TextOptionsType) {\n const fontSize = options.fontSize ?? DefaultTextStyle.fontSize;\n const { textAlign } = options;\n\n if (textAlign === 'center') {\n return {\n left: fontSize / 2,\n right: fontSize / 2\n };\n } else if (textAlign === 'right' || textAlign === 'end') {\n return {\n left: fontSize,\n right: 0\n };\n }\n return {\n left: 0,\n right: fontSize\n };\n }\n\n measureTextPixelADscentAndWidth(\n text: string,\n options: TextOptionsType,\n mode: MeasureModeEnum\n ): { width: number; ascent: number; descent: number } {\n if (!this.context) {\n return {\n ...this.measureTextBoundADscentEstimate(options),\n width: this.estimate(text, options).width\n };\n }\n const out = this._measureTextWithoutAlignBaseline(text, options, true);\n\n if (mode === MeasureModeEnum.actualBounding) {\n return {\n ascent: (out as any).actualBoundingBoxAscent,\n descent: (out as any).actualBoundingBoxDescent,\n width: (out as any).width\n };\n } else if (mode === MeasureModeEnum.estimate) {\n return {\n ...this.measureTextBoundADscentEstimate(options),\n width: (out as any).width\n };\n } else if (mode === MeasureModeEnum.fontBounding) {\n // const { lineHeight = options.fontSize } = options;\n // let ratio = 1;\n // if (lineHeight) {\n // const fontBoundingHeight = (out as any).fontBoundingBoxAscent + (out as any).fontBoundingBoxDescent;\n // ratio = lineHeight / fontBoundingHeight;\n // }\n // 避免二次矫正,应当保证所有字符组合的基线都一样,否则fontBounding就失去意义了\n // 但如果超出边界了,就只能进行二次矫正\n let ascent = (out as any).fontBoundingBoxAscent;\n let descent = (out as any).fontBoundingBoxDescent;\n // 只能一边超出,都超出的话目前无法矫正,因为行高不能超\n if ((out as any).actualBoundingBoxDescent && descent < (out as any).actualBoundingBoxDescent) {\n const delta = (out as any).actualBoundingBoxDescent - descent;\n descent += delta;\n ascent -= delta;\n } else if ((out as any).actualBoundingBoxAscent && ascent < (out as any).actualBoundingBoxAscent) {\n const delta = (out as any).actualBoundingBoxAscent - ascent;\n ascent += delta;\n descent -= delta;\n }\n return {\n ascent,\n descent,\n width: (out as any).width\n };\n }\n return {\n ascent: (out as any).actualBoundingBoxAscent,\n descent: (out as any).actualBoundingBoxDescent,\n width: (out as any).width\n };\n }\n\n /**\n * 获取text测量对象\n * @param text\n * @param options\n */\n measureText(text: string, options: TextOptionsType): TextMetrics | { width: number } {\n if (!this.context) {\n return this.estimate(text, options);\n }\n this.context.setTextStyleWithoutAlignBaseline(options);\n return this.context.measureText(text);\n }\n\n clipTextVertical(\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n wordBreak: boolean\n ): {\n verticalList: { text: string; width?: number; direction: number }[];\n width: number;\n } {\n if (verticalList.length === 0) {\n return { verticalList, width: 0 };\n }\n const { fontSize = 12 } = options;\n // 计算每一个区域的width\n verticalList.forEach(item => {\n item.width = item.direction === 0 ? fontSize : this.measureTextWidth(item.text, options);\n });\n const out: { text: string; width?: number; direction: number }[] = [];\n let length = 0;\n let i = 0;\n for (; i < verticalList.length; i++) {\n if (length + verticalList[i].width < width) {\n length += verticalList[i].width;\n out.push(verticalList[i]);\n } else {\n break;\n }\n }\n if (verticalList[i] && verticalList[i].text.length > 1) {\n const clipedData = this._clipText(\n verticalList[i].text,\n options,\n width - length,\n 0,\n verticalList[i].text.length - 1,\n 'end',\n false\n );\n if (wordBreak && clipedData.str !== verticalList[i].text) {\n let text = '';\n let length = 0;\n for (let j = 0; j < i; j++) {\n const item = verticalList[j];\n text += item.text;\n length += item.text.length;\n }\n text += verticalList[i].text;\n const totalLength = length + clipedData.str.length;\n let index = testLetter(text, totalLength);\n index = index - length;\n if (index !== clipedData.str.length - 1) {\n clipedData.str = clipedData.str.substring(0, index);\n clipedData.width = this.measureTextWidth(clipedData.str, options);\n }\n }\n out.push({ ...verticalList[i], text: clipedData.str, width: clipedData.width });\n length += clipedData.width;\n }\n\n return {\n verticalList: out,\n width: length\n };\n }\n\n /**\n * 将文本裁剪到width宽\n * @param text\n * @param options\n * @param width\n */\n clipText(\n text: string,\n options: TextOptionsType,\n width: number,\n wordBreak: boolean,\n keepAllBreak?: boolean\n ): {\n str: string;\n width: number;\n wordBreaked?: number;\n } {\n if (text.length === 0) {\n return { str: '', width: 0 };\n }\n let length = this.measureTextWidth(text, options);\n if (length <= width) {\n return { str: text, width: length };\n }\n length = this.measureTextWidth(text[0], options);\n if (length > width) {\n return { str: '', width: 0 };\n }\n const data = this._clipText(text, options, width, 0, text.length - 1, 'end', false);\n // 如果需要文字截断\n if (wordBreak && data.str !== text) {\n let index = testLetter(text, data.str.length, keepAllBreak);\n if (index !== data.str.length) {\n if (index > data.str.length) {\n (data as any).wordBreaked = index;\n index = data.str.length;\n }\n data.str = text.substring(0, index);\n data.width = this.measureTextWidth(data.str, options);\n }\n }\n return data;\n }\n\n // 二分法找到最佳宽\n // TODO: 后续考虑代码合并\n private _clipText(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number,\n position: 'start' | 'end' | 'middle',\n suffix: string | false\n ): { str: string; width: number; result?: string } {\n let data: { str: string; width: number; result?: string };\n if (position === 'start') {\n data = this._clipTextStart(text, options, width, leftIdx, rightIdx);\n suffix && (data.result = suffix + data.str);\n } else if (position === 'middle') {\n const d = this._clipTextMiddle(text, options, width, '', '', 0, 0, 1);\n data = { str: 'none', width: d.width, result: d.left + suffix + d.right };\n } else {\n data = this._clipTextEnd(text, options, width, leftIdx, rightIdx);\n suffix && (data.result = data.str + suffix);\n }\n return data;\n }\n\n private _clipTextEnd(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number\n ): { str: string; width: number } {\n // 添加退出条件,如果leftIdx和rightIdx相等,那么就返回这个字符串(理论上这时出问题了)\n if (leftIdx === rightIdx) {\n Logger.getInstance().warn(`【_clipTextEnd】不应该走到这里${text}, ${leftIdx}, ${rightIdx}`);\n // console.warn(`【_clipTextEnd】不应该走到这里${text}, ${leftIdx}, ${rightIdx}`);\n const subText = text.substring(0, rightIdx + 1);\n return { str: subText, width: this.measureTextWidth(subText, options) };\n }\n const middleIdx = Math.floor((leftIdx + rightIdx) / 2);\n const subText = text.substring(0, middleIdx + 1);\n const strWidth = this.measureTextWidth(subText, options);\n let length: number;\n if (strWidth > width) {\n // 如果字符串的宽度大于限制宽度\n if (subText.length <= 1) {\n return { str: '', width: 0 };\n } // 如果子字符串长度小于1,而且大于给定宽的话,返回空字符串\n // 先判断是不是左侧的那个字符\n const str = text.substring(0, middleIdx);\n // 如果到左侧的字符小于或等于width,那么说明就是左侧的字符\n length = this.measureTextWidth(str, options);\n if (length <= width) {\n return { str, width: length };\n }\n // 返回leftIdx到middleIdx\n return this._clipTextEnd(text, options, width, leftIdx, middleIdx);\n } else if (strWidth < width) {\n // 如果字符串的宽度小于限制宽度\n if (middleIdx >= text.length - 1) {\n return { str: text, width: this.measureTextWidth(text, options) };\n } // 如果已经到结尾了,返回text\n // 先判断是不是右侧的那个字符\n const str = text.substring(0, middleIdx + 2);\n // 如果到右侧的字符大于或等于width,那么说明就是这个字符串\n length = this.measureTextWidth(str, options);\n if (length >= width) {\n return { str: subText, width: strWidth };\n }\n // 返回middleIdx到rightIdx\n return this._clipTextEnd(text, options, width, middleIdx, rightIdx);\n }\n // 如果相同,那么就找到text\n return { str: subText, width: strWidth };\n }\n\n private _clipTextStart(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number\n ): { str: string; width: number } {\n const middleIdx = Math.ceil((leftIdx + rightIdx) / 2);\n const subText = text.substring(middleIdx - 1, text.length);\n const strWidth = this.measureTextWidth(subText, options);\n let length: number;\n if (strWidth > width) {\n // 如果字符串的宽度大于限制宽度\n if (subText.length <= 1) {\n return { str: '', width: 0 };\n } // 如果子字符串长度小于1,而且大于给定宽的话,返回空字符串\n // 先判断是不是左侧的那个字符\n const str = text.substring(middleIdx, text.length);\n // 如果到左侧的字符小于或等于width,那么说明就是左侧的字符\n length = this.measureTextWidth(str, options);\n if (length <= width) {\n return { str, width: length };\n }\n // 返回leftIdx到middleIdx\n return this._clipTextStart(text, options, width, middleIdx, text.length);\n } else if (strWidth < width) {\n // 如果字符串的宽度小于限制宽度\n if (middleIdx <= 0) {\n return { str: text, width: this.measureTextWidth(text, options) };\n } // 如果已经到结尾了,返回text\n // 先判断是不是右侧的那个字符\n const str = text.substring(middleIdx - 2, text.length);\n // 如果到右侧的字符大于或等于width,那么说明就是这个字符串\n length = this.measureTextWidth(str, options);\n if (length >= width) {\n return { str: subText, width: strWidth };\n }\n // 返回middleIdx到rightIdx\n return this._clipTextStart(text, options, width, leftIdx, middleIdx);\n }\n // 如果相同,那么就找到text\n return { str: subText, width: strWidth };\n }\n\n private _clipTextMiddle(\n text: string,\n options: TextOptionsType,\n width: number,\n left: string,\n right: string,\n leftW: number,\n rightW: number,\n buffer: number\n ): { left: string; right: string; width: number } {\n const subLeftText = text.substring(0, buffer);\n const strLeftWidth = this.measureTextWidth(subLeftText, options);\n if (strLeftWidth + rightW > width) {\n return { left, right, width: leftW + rightW };\n }\n const subRightText = text.substring(text.length - buffer, text.length);\n const strRightWidth = this.measureTextWidth(subRightText, options);\n if (strLeftWidth + strRightWidth > width) {\n return { left: subLeftText, right, width: strLeftWidth + rightW };\n }\n return this._clipTextMiddle(\n text,\n options,\n width,\n subLeftText,\n subRightText,\n strLeftWidth,\n strRightWidth,\n buffer + 1\n );\n }\n\n clipTextWithSuffixVertical(\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n suffixPosition: 'start' | 'end' | 'middle'\n ): {\n verticalList: { text: string; width?: number; direction: number }[];\n width: number;\n } {\n if (suffix === '') {\n return this.clipTextVertical(verticalList, options, width, wordBreak);\n }\n if (verticalList.length === 0) {\n return { verticalList, width: 0 };\n }\n\n const output = this.clipTextVertical(verticalList, options, width, wordBreak);\n if (\n output.verticalList.length === verticalList.length &&\n output.verticalList[output.verticalList.length - 1].width === verticalList[verticalList.length - 1].width\n ) {\n return output;\n }\n\n const suffixWidth = this.measureTextWidth(suffix, options);\n if (suffixWidth > width) {\n return output;\n }\n\n width -= suffixWidth;\n\n let out;\n if (suffixPosition === 'start') {\n const nextVerticalList = this.revertVerticalList(verticalList);\n out = this.clipTextVertical(nextVerticalList, options, width, wordBreak);\n const v = this.revertVerticalList(out.verticalList);\n v.unshift({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n out.verticalList = v;\n } else if (suffixPosition === 'middle') {\n const leftOut = this.clipTextVertical(verticalList, options, width / 2, wordBreak);\n const nextVerticalList = this.revertVerticalList(verticalList);\n const rightOut = this.clipTextVertical(nextVerticalList, options, width / 2, wordBreak);\n // 添加suffix\n leftOut.verticalList.push({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n this.revertVerticalList(rightOut.verticalList).forEach(v => leftOut.verticalList.push(v));\n out = {\n verticalList: leftOut.verticalList,\n width: leftOut.width + rightOut.width\n };\n } else {\n out = this.clipTextVertical(verticalList, options, width, wordBreak);\n out.verticalList.push({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n }\n out.width += suffixWidth;\n return out;\n }\n\n revertVerticalList(\n verticalList: {\n text: string;\n width?: number;\n direction: number;\n }[]\n ) {\n return verticalList.reverse().map(l => {\n const t = l.text.split('').reverse().join('');\n return {\n ...l,\n text: t\n };\n });\n }\n\n clipTextWithSuffix(\n text: string,\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n position: 'start' | 'end' | 'middle',\n forceSuffix: boolean = false\n ): {\n str: string;\n width: number;\n } {\n if (suffix === '') {\n return this.clipText(text, options, width, wordBreak);\n }\n if (text.length === 0) {\n return { str: '', width: 0 };\n }\n const length = this.measureTextWidth(text, options);\n if (!forceSuffix && length <= width) {\n return { str: text, width: length };\n }\n const suffixWidth = this.measureTextWidth(suffix, options);\n if (suffixWidth > width) {\n return { str: '', width: 0 };\n }\n if (forceSuffix && length + suffixWidth <= width) {\n return { str: text + suffix, width: length + suffixWidth };\n }\n width -= suffixWidth;\n const data = this._clipText(text, options, width, 0, text.length - 1, position, suffix);\n\n // 如果需要文字截断\n if (wordBreak && data.str !== text) {\n const index = testLetter(text, data.str.length);\n if (index !== data.str.length) {\n data.result = text.substring(0, index);\n data.width = this.measureTextWidth(data.str, options);\n }\n } else if (forceSuffix && data.str === text) {\n data.result = text + suffix;\n }\n data.str = data.result!;\n data.width += suffixWidth;\n return data;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/contributions/textMeasure/AtextMeasure.ts"],"names":[],"mappings":"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","file":"AtextMeasure.js","sourcesContent":["import { injectable } from '../../../common/inversify-lite';\nimport type { IGraphicUtil } from '../../../interface/core';\nimport type { ICanvas, IContext2d, EnvType } from '../../../interface';\nimport { MeasureModeEnum } from '../../../interface';\nimport type { TextOptionsType, ITextMeasure } from '../../../interface/text';\nimport { DefaultTextAttribute, DefaultTextStyle } from '../../../graphic/config';\nimport { testLetter } from '../../../graphic/richtext/utils';\nimport { Logger } from '@visactor/vutils';\n\n@injectable()\nexport class ATextMeasure implements ITextMeasure {\n release: (...params: any) => void;\n protected canvas?: ICanvas;\n protected context?: IContext2d | null;\n\n configure(service: IGraphicUtil, env: EnvType): void {\n this.canvas = service.canvas;\n this.context = service.context;\n service.bindTextMeasure(this);\n }\n\n protected _measureTextWithoutAlignBaseline(text: string, options: TextOptionsType, compatible?: boolean) {\n this.context.setTextStyleWithoutAlignBaseline(options);\n const metrics = this.context.measureText(text);\n\n return compatible ? this.compatibleMetrics(metrics, options) : metrics;\n }\n\n protected _measureTextWithAlignBaseline(text: string, options: TextOptionsType, compatible?: boolean) {\n this.context.setTextStyle(options);\n const metrics = this.context.measureText(text);\n\n return compatible ? this.compatibleMetrics(metrics, options) : metrics;\n }\n\n protected compatibleMetrics(metrics: TextMetrics | { width: number }, options: TextOptionsType) {\n if (\n (metrics as any).actualBoundingBoxAscent == null ||\n (metrics as any).actualBoundingBoxDescent == null ||\n (metrics as any).fontBoundingBoxAscent == null ||\n (metrics as any).fontBoundingBoxDescent == null\n ) {\n metrics = {\n width: metrics.width\n };\n const { ascent, descent } = this.measureTextBoundADscentEstimate(options);\n (metrics as any).actualBoundingBoxAscent = ascent;\n (metrics as any).actualBoundingBoxDescent = descent;\n (metrics as any).fontBoundingBoxAscent = ascent;\n (metrics as any).fontBoundingBoxDescent = descent;\n }\n if ((metrics as any).actualBoundingBoxLeft == null || (metrics as any).actualBoundingBoxRight == null) {\n metrics = {\n width: metrics.width,\n actualBoundingBoxAscent: (metrics as any).actualBoundingBoxAscent,\n actualBoundingBoxDescent: (metrics as any).actualBoundingBoxDescent,\n fontBoundingBoxAscent: (metrics as any).fontBoundingBoxAscent,\n fontBoundingBoxDescent: (metrics as any).fontBoundingBoxDescent\n };\n const { left, right } = this.measureTextBoundLeftRightEstimate(options);\n (metrics as any).actualBoundingBoxLeft = left;\n (metrics as any).actualBoundingBoxRight = right;\n }\n return metrics;\n }\n\n // 估算文字长度\n protected estimate(\n text: string,\n { fontSize = DefaultTextAttribute.fontSize }: TextOptionsType\n ): { width: number; height: number } {\n // 假设只有英文和中文字符\n let eCharLen = 0; // 英文字符\n let cCharLen = 0; // 中文字符\n // 判断ascii码,如果是\n for (let i = 0; i < text.length; i++) {\n text.charCodeAt(i) < 128 ? eCharLen++ : cCharLen++;\n }\n return {\n width: ~~(0.8 * eCharLen * fontSize + cCharLen * fontSize),\n height: fontSize\n };\n }\n\n /**\n * 获取text宽度,measureText.width\n * @param text\n * @param options\n */\n measureTextWidth(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }): number {\n if (!this.context) {\n return this.estimate(text, options).width;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options);\n return textMeasure.width;\n }\n /**\n * 获取text宽度,measureText.width\n * @param text\n * @param options\n */\n measureTextBoundsWidth(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return this.estimate(text, options).width;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options);\n return textMeasure.width;\n }\n\n measureTextBoundsLeftRight(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundLeftRightEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n left: (textMeasure as any).actualBoundingBoxLeft,\n right: (textMeasure as any).actualBoundingBoxRight\n };\n }\n\n /**\n * 获取text像素高度,基于actualBoundingBoxAscent和actualBoundingBoxDescent\n * @param text\n * @param options\n */\n measureTextPixelHeight(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return options.fontSize ?? DefaultTextStyle.fontSize;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options, true);\n return Math.abs((textMeasure as any).actualBoundingBoxAscent - (textMeasure as any).actualBoundingBoxDescent);\n }\n\n measureTextPixelADscent(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundADscentEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n ascent: (textMeasure as any).actualBoundingBoxAscent,\n descent: (textMeasure as any).actualBoundingBoxDescent\n };\n }\n\n /**\n * 获取text包围盒的高度,基于fontBoundingBoxAscent和fontBoundingBoxDescent\n * @param text\n * @param options\n */\n measureTextBoundHieght(\n text: string,\n options: TextOptionsType,\n textMeasure?: TextMetrics | { width: number }\n ): number {\n if (!this.context) {\n return options.fontSize ?? DefaultTextStyle.fontSize;\n }\n textMeasure = textMeasure ?? this._measureTextWithoutAlignBaseline(text, options, true);\n return Math.abs((textMeasure as any).fontBoundingBoxAscent - (textMeasure as any).fontBoundingBoxDescent);\n }\n\n measureTextBoundADscent(text: string, options: TextOptionsType, textMeasure?: TextMetrics | { width: number }) {\n if (!this.context) {\n return this.measureTextBoundADscentEstimate(options);\n }\n textMeasure = textMeasure ?? this._measureTextWithAlignBaseline(text, options, true);\n return {\n ascent: (textMeasure as any).fontBoundingBoxAscent,\n descent: (textMeasure as any).fontBoundingBoxDescent\n };\n }\n\n protected measureTextBoundADscentEstimate(options: TextOptionsType) {\n const fontSize = options.fontSize ?? DefaultTextStyle.fontSize;\n return {\n ascent: 0.79 * fontSize,\n descent: 0.21 * fontSize\n };\n // const { textBaseline } = options;\n // if (textBaseline === 'bottom') {\n // return {\n // ascent: fontSize,\n // descent: 0\n // };\n // } else if (textBaseline === 'middle') {\n // return {\n // ascent: fontSize / 2,\n // descent: fontSize / 2\n // };\n // } else if (textBaseline === 'alphabetic') {\n // return {\n // ascent: 0.79 * fontSize,\n // descent: 0.21 * fontSize\n // };\n // }\n\n // return {\n // ascent: 0,\n // descent: fontSize\n // };\n }\n\n protected measureTextBoundLeftRightEstimate(options: TextOptionsType) {\n const fontSize = options.fontSize ?? DefaultTextStyle.fontSize;\n const { textAlign } = options;\n\n if (textAlign === 'center') {\n return {\n left: fontSize / 2,\n right: fontSize / 2\n };\n } else if (textAlign === 'right' || textAlign === 'end') {\n return {\n left: fontSize,\n right: 0\n };\n }\n return {\n left: 0,\n right: fontSize\n };\n }\n\n measureTextPixelADscentAndWidth(\n text: string,\n options: TextOptionsType,\n mode: MeasureModeEnum\n ): { width: number; ascent: number; descent: number } {\n if (!this.context) {\n return {\n ...this.measureTextBoundADscentEstimate(options),\n width: this.estimate(text, options).width\n };\n }\n const out = this._measureTextWithoutAlignBaseline(text, options, true);\n\n if (mode === MeasureModeEnum.actualBounding) {\n return {\n ascent: (out as any).actualBoundingBoxAscent,\n descent: (out as any).actualBoundingBoxDescent,\n width: (out as any).width\n };\n } else if (mode === MeasureModeEnum.estimate) {\n return {\n ...this.measureTextBoundADscentEstimate(options),\n width: (out as any).width\n };\n } else if (mode === MeasureModeEnum.fontBounding) {\n // const { lineHeight = options.fontSize } = options;\n // let ratio = 1;\n // if (lineHeight) {\n // const fontBoundingHeight = (out as any).fontBoundingBoxAscent + (out as any).fontBoundingBoxDescent;\n // ratio = lineHeight / fontBoundingHeight;\n // }\n // 避免二次矫正,应当保证所有字符组合的基线都一样,否则fontBounding就失去意义了\n // 但如果超出边界了,就只能进行二次矫正\n let ascent = (out as any).fontBoundingBoxAscent;\n let descent = (out as any).fontBoundingBoxDescent;\n // 只能一边超出,都超出的话目前无法矫正,因为行高不能超\n if ((out as any).actualBoundingBoxDescent && descent < (out as any).actualBoundingBoxDescent) {\n const delta = (out as any).actualBoundingBoxDescent - descent;\n descent += delta;\n ascent -= delta;\n } else if ((out as any).actualBoundingBoxAscent && ascent < (out as any).actualBoundingBoxAscent) {\n const delta = (out as any).actualBoundingBoxAscent - ascent;\n ascent += delta;\n descent -= delta;\n }\n return {\n ascent,\n descent,\n width: (out as any).width\n };\n }\n return {\n ascent: (out as any).actualBoundingBoxAscent,\n descent: (out as any).actualBoundingBoxDescent,\n width: (out as any).width\n };\n }\n\n /**\n * 获取text测量对象\n * @param text\n * @param options\n */\n measureText(text: string, options: TextOptionsType): TextMetrics | { width: number } {\n if (!this.context) {\n return this.estimate(text, options);\n }\n this.context.setTextStyleWithoutAlignBaseline(options);\n return this.context.measureText(text);\n }\n\n clipTextVertical(\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n wordBreak: boolean\n ): {\n verticalList: { text: string; width?: number; direction: number }[];\n width: number;\n } {\n if (verticalList.length === 0) {\n return { verticalList, width: 0 };\n }\n const { fontSize = 12 } = options;\n // 计算每一个区域的width\n verticalList.forEach(item => {\n item.width = item.direction === 0 ? fontSize : this.measureTextWidth(item.text, options);\n });\n const out: { text: string; width?: number; direction: number }[] = [];\n let length = 0;\n let i = 0;\n for (; i < verticalList.length; i++) {\n if (length + verticalList[i].width < width) {\n length += verticalList[i].width;\n out.push(verticalList[i]);\n } else {\n break;\n }\n }\n if (verticalList[i] && verticalList[i].text.length > 1) {\n const clipedData = this._clipText(\n verticalList[i].text,\n options,\n width - length,\n 0,\n verticalList[i].text.length - 1,\n 'end',\n false\n );\n if (wordBreak && clipedData.str !== verticalList[i].text) {\n let text = '';\n let length = 0;\n for (let j = 0; j < i; j++) {\n const item = verticalList[j];\n text += item.text;\n length += item.text.length;\n }\n text += verticalList[i].text;\n const totalLength = length + clipedData.str.length;\n let index = testLetter(text, totalLength);\n index = index - length;\n if (index !== clipedData.str.length - 1) {\n clipedData.str = clipedData.str.substring(0, index);\n clipedData.width = this.measureTextWidth(clipedData.str, options);\n }\n }\n out.push({ ...verticalList[i], text: clipedData.str, width: clipedData.width });\n length += clipedData.width;\n }\n\n return {\n verticalList: out,\n width: length\n };\n }\n\n /**\n * 将文本裁剪到width宽\n * @param text\n * @param options\n * @param width\n */\n clipText(\n text: string,\n options: TextOptionsType,\n width: number,\n wordBreak: boolean,\n keepAllBreak?: boolean\n ): {\n str: string;\n width: number;\n wordBreaked?: number;\n } {\n if (text.length === 0) {\n return { str: '', width: 0 };\n }\n let length = this.measureTextWidth(text, options);\n if (length <= width) {\n return { str: text, width: length };\n }\n length = this.measureTextWidth(text[0], options);\n if (length > width) {\n return { str: '', width: 0 };\n }\n const data = this._clipText(text, options, width, 0, text.length - 1, 'end', false);\n // 如果需要文字截断\n if (wordBreak && data.str !== text) {\n let index = testLetter(text, data.str.length, keepAllBreak);\n if (index !== data.str.length) {\n if (index > data.str.length) {\n (data as any).wordBreaked = index;\n index = data.str.length;\n }\n data.str = text.substring(0, index);\n data.width = this.measureTextWidth(data.str, options);\n }\n }\n return data;\n }\n\n // 二分法找到最佳宽\n // TODO: 后续考虑代码合并\n private _clipText(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number,\n position: 'start' | 'end' | 'middle',\n suffix: string | false\n ): { str: string; width: number; result?: string } {\n let data: { str: string; width: number; result?: string };\n if (position === 'start') {\n data = this._clipTextStart(text, options, width, leftIdx, rightIdx);\n suffix && (data.result = suffix + data.str);\n } else if (position === 'middle') {\n const d = this._clipTextMiddle(text, options, width, '', '', 0, 0, 1);\n data = { str: 'none', width: d.width, result: d.left + suffix + d.right };\n } else {\n data = this._clipTextEnd(text, options, width, leftIdx, rightIdx);\n suffix && (data.result = data.str + suffix);\n }\n return data;\n }\n\n private _clipTextEnd(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number\n ): { str: string; width: number } {\n // 添加退出条件,如果leftIdx和rightIdx相等,那么就返回这个字符串(理论上这时出问题了)\n if (leftIdx === rightIdx) {\n Logger.getInstance().warn(`【_clipTextEnd】不应该走到这里${text}, ${leftIdx}, ${rightIdx}`);\n // console.warn(`【_clipTextEnd】不应该走到这里${text}, ${leftIdx}, ${rightIdx}`);\n const subText = text.substring(0, rightIdx + 1);\n return { str: subText, width: this.measureTextWidth(subText, options) };\n }\n const middleIdx = Math.floor((leftIdx + rightIdx) / 2);\n const subText = text.substring(0, middleIdx + 1);\n const strWidth = this.measureTextWidth(subText, options);\n let length: number;\n if (strWidth > width) {\n // 如果字符串的宽度大于限制宽度\n if (subText.length <= 1) {\n return { str: '', width: 0 };\n } // 如果子字符串长度小于1,而且大于给定宽的话,返回空字符串\n // 先判断是不是左侧的那个字符\n const str = text.substring(0, middleIdx);\n // 如果到左侧的字符小于或等于width,那么说明就是左侧的字符\n length = this.measureTextWidth(str, options);\n if (length <= width) {\n return { str, width: length };\n }\n // 返回leftIdx到middleIdx\n return this._clipTextEnd(text, options, width, leftIdx, middleIdx);\n } else if (strWidth < width) {\n // 如果字符串的宽度小于限制宽度\n if (middleIdx >= text.length - 1) {\n return { str: text, width: this.measureTextWidth(text, options) };\n } // 如果已经到结尾了,返回text\n // 先判断是不是右侧的那个字符\n const str = text.substring(0, middleIdx + 2);\n // 如果到右侧的字符大于或等于width,那么说明就是这个字符串\n length = this.measureTextWidth(str, options);\n if (length >= width) {\n return { str: subText, width: strWidth };\n }\n // 返回middleIdx到rightIdx\n return this._clipTextEnd(text, options, width, middleIdx, rightIdx);\n }\n // 如果相同,那么就找到text\n return { str: subText, width: strWidth };\n }\n\n private _clipTextStart(\n text: string,\n options: TextOptionsType,\n width: number,\n leftIdx: number,\n rightIdx: number\n ): { str: string; width: number } {\n const middleIdx = Math.ceil((leftIdx + rightIdx) / 2);\n const subText = text.substring(middleIdx - 1, text.length);\n const strWidth = this.measureTextWidth(subText, options);\n let length: number;\n if (strWidth > width) {\n // 如果字符串的宽度大于限制宽度\n if (subText.length <= 1) {\n return { str: '', width: 0 };\n } // 如果子字符串长度小于1,而且大于给定宽的话,返回空字符串\n // 先判断是不是左侧的那个字符\n const str = text.substring(middleIdx, text.length);\n // 如果到左侧的字符小于或等于width,那么说明就是左侧的字符\n length = this.measureTextWidth(str, options);\n if (length <= width) {\n return { str, width: length };\n }\n // 返回leftIdx到middleIdx\n return this._clipTextStart(text, options, width, middleIdx, text.length);\n } else if (strWidth < width) {\n // 如果字符串的宽度小于限制宽度\n if (middleIdx <= 0) {\n return { str: text, width: this.measureTextWidth(text, options) };\n } // 如果已经到结尾了,返回text\n // 先判断是不是右侧的那个字符\n const str = text.substring(middleIdx - 2, text.length);\n // 如果到右侧的字符大于或等于width,那么说明就是这个字符串\n length = this.measureTextWidth(str, options);\n if (length >= width) {\n return { str: subText, width: strWidth };\n }\n // 返回middleIdx到rightIdx\n return this._clipTextStart(text, options, width, leftIdx, middleIdx);\n }\n // 如果相同,那么就找到text\n return { str: subText, width: strWidth };\n }\n\n private _clipTextMiddle(\n text: string,\n options: TextOptionsType,\n width: number,\n left: string,\n right: string,\n leftW: number,\n rightW: number,\n buffer: number\n ): { left: string; right: string; width: number } {\n const subLeftText = text.substring(0, buffer);\n const strLeftWidth = this.measureTextWidth(subLeftText, options);\n if (strLeftWidth + rightW > width) {\n return { left, right, width: leftW + rightW };\n }\n const subRightText = text.substring(text.length - buffer, text.length);\n const strRightWidth = this.measureTextWidth(subRightText, options);\n if (strLeftWidth + strRightWidth > width) {\n return { left: subLeftText, right, width: strLeftWidth + rightW };\n }\n return this._clipTextMiddle(\n text,\n options,\n width,\n subLeftText,\n subRightText,\n strLeftWidth,\n strRightWidth,\n buffer + 1\n );\n }\n\n clipTextWithSuffixVertical(\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n suffixPosition: 'start' | 'end' | 'middle'\n ): {\n verticalList: { text: string; width?: number; direction: number }[];\n width: number;\n } {\n if (suffix === '') {\n return this.clipTextVertical(verticalList, options, width, wordBreak);\n }\n if (verticalList.length === 0) {\n return { verticalList, width: 0 };\n }\n\n const output = this.clipTextVertical(verticalList, options, width, wordBreak);\n if (\n output.verticalList.length === verticalList.length &&\n output.verticalList[output.verticalList.length - 1].width === verticalList[verticalList.length - 1].width\n ) {\n return output;\n }\n\n const suffixWidth = this.measureTextWidth(suffix, options);\n if (suffixWidth > width) {\n return output;\n }\n\n width -= suffixWidth;\n\n let out;\n if (suffixPosition === 'start') {\n const nextVerticalList = this.revertVerticalList(verticalList);\n out = this.clipTextVertical(nextVerticalList, options, width, wordBreak);\n const v = this.revertVerticalList(out.verticalList);\n v.unshift({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n out.verticalList = v;\n } else if (suffixPosition === 'middle') {\n const leftOut = this.clipTextVertical(verticalList, options, width / 2, wordBreak);\n const nextVerticalList = this.revertVerticalList(verticalList);\n const rightOut = this.clipTextVertical(nextVerticalList, options, width / 2, wordBreak);\n // 添加suffix\n leftOut.verticalList.push({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n this.revertVerticalList(rightOut.verticalList).forEach(v => leftOut.verticalList.push(v));\n out = {\n verticalList: leftOut.verticalList,\n width: leftOut.width + rightOut.width\n };\n } else {\n out = this.clipTextVertical(verticalList, options, width, wordBreak);\n out.verticalList.push({\n text: suffix,\n direction: 1,\n width: suffixWidth\n });\n }\n out.width += suffixWidth;\n return out;\n }\n\n revertVerticalList(\n verticalList: {\n text: string;\n width?: number;\n direction: number;\n }[]\n ) {\n return verticalList.reverse().map(l => {\n const t = l.text.split('').reverse().join('');\n return {\n ...l,\n text: t\n };\n });\n }\n\n clipTextWithSuffix(\n text: string,\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n position: 'start' | 'end' | 'middle',\n forceSuffix: boolean = false\n ): {\n str: string;\n width: number;\n } {\n if (suffix === '') {\n return this.clipText(text, options, width, wordBreak);\n }\n if (text.length === 0) {\n return { str: '', width: 0 };\n }\n const length = this.measureTextWidth(text, options);\n if (!forceSuffix && length <= width) {\n return { str: text, width: length };\n }\n const suffixWidth = this.measureTextWidth(suffix, options);\n if (suffixWidth > width) {\n return { str: '', width: 0 };\n }\n if (forceSuffix && length + suffixWidth <= width) {\n return { str: text + suffix, width: length + suffixWidth };\n }\n width -= suffixWidth;\n const data = this._clipText(text, options, width, 0, text.length - 1, position, suffix);\n\n // 如果需要文字截断\n if (wordBreak && data.str !== text) {\n const index = testLetter(text, data.str.length);\n if (index !== data.str.length) {\n data.result = text.substring(0, index);\n data.width = this.measureTextWidth(data.str, options);\n }\n } else if (forceSuffix && data.str === text) {\n data.result = text + suffix;\n }\n data.str = data.result!;\n data.width += suffixWidth;\n return data;\n }\n}\n"]}
@@ -17,4 +17,4 @@ export default new ContainerModule((bind => {
17
17
  bind(GraphicUtil).to(DefaultGraphicUtil).inSingletonScope(), bind(TransformUtil).to(DefaultTransformUtil).inSingletonScope(),
18
18
  bind(LayerService).to(DefaultLayerService).inSingletonScope();
19
19
  }));
20
- //# sourceMappingURL=core-modules.js.map
20
+ //# sourceMappingURL=core-modules.js.map
@@ -1,3 +1 @@
1
-
2
-
3
1
  //# sourceMappingURL=global-module.js.map
package/es/core/global.js CHANGED
@@ -217,4 +217,4 @@ let DefaultGlobal = class {
217
217
  DefaultGlobal = __decorate([ injectable(), __param(0, inject(ContributionProvider)), __param(0, named(EnvContribution)), __metadata("design:paramtypes", [ Object ]) ], DefaultGlobal);
218
218
 
219
219
  export { DefaultGlobal };
220
- //# sourceMappingURL=global.js.map
220
+ //# sourceMappingURL=global.js.map
@@ -184,4 +184,4 @@ let DefaultTransformUtil = class {
184
184
  DefaultTransformUtil = __decorate([ injectable(), __metadata("design:paramtypes", []) ], DefaultTransformUtil);
185
185
 
186
186
  export { DefaultTransformUtil };
187
- //# sourceMappingURL=graphic-utils.js.map
187
+ //# sourceMappingURL=graphic-utils.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vrender-core",
3
- "version": "0.21.11",
3
+ "version": "0.21.12-alpha.1",
4
4
  "description": "",
5
5
  "sideEffects": [
6
6
  "./src/modules.ts",
@@ -36,8 +36,8 @@
36
36
  "typescript": "4.9.5",
37
37
  "cross-env": "^7.0.3",
38
38
  "@internal/bundler": "0.0.1",
39
- "@internal/eslint-config": "0.0.1",
40
- "@internal/ts-config": "0.0.1"
39
+ "@internal/ts-config": "0.0.1",
40
+ "@internal/eslint-config": "0.0.1"
41
41
  },
42
42
  "keywords": [
43
43
  "VisActor",