@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.
- package/cjs/animate/animate.js +1 -1
- package/cjs/animate/config.js +1 -1
- package/cjs/animate/custom-animate.js +2 -1
- package/cjs/animate/default-ticker.js +1 -1
- package/cjs/animate/easing.js +1 -1
- package/cjs/animate/group-fade.js +1 -1
- package/cjs/animate/index.js +1 -1
- package/cjs/animate/morphing.js +1 -1
- package/cjs/animate/timeline.js +1 -1
- package/cjs/canvas/empty-context.js +1 -2
- package/cjs/color-string/store.js +1 -2
- package/cjs/common/3d-interceptor.js +2 -1
- package/cjs/common/polygon.js +0 -1
- package/cjs/common/render-command-list.js +2 -1
- package/cjs/common/text.js +1 -1
- package/cjs/common/utils.js +1 -1
- package/cjs/core/application.js +1 -1
- package/cjs/core/camera.js +1 -1
- package/cjs/core/constants.js +1 -1
- package/cjs/core/contributions/textMeasure/AtextMeasure.js +10 -0
- package/cjs/core/contributions/textMeasure/AtextMeasure.js.map +1 -1
- package/cjs/core/core-modules.js +1 -1
- package/cjs/core/global-module.js +0 -2
- package/cjs/core/global.js +1 -1
- package/cjs/core/graphic-utils.js +1 -1
- package/dist/index.es.js +10 -0
- package/es/animate/animate.js +1 -1
- package/es/animate/config.js +1 -1
- package/es/animate/custom-animate.js +2 -1
- package/es/animate/default-ticker.js +1 -1
- package/es/animate/easing.js +1 -1
- package/es/animate/group-fade.js +1 -1
- package/es/animate/index.js +1 -1
- package/es/animate/morphing.js +1 -1
- package/es/animate/timeline.js +1 -1
- package/es/canvas/empty-context.js +1 -2
- package/es/color-string/store.js +1 -2
- package/es/common/3d-interceptor.js +2 -1
- package/es/common/polygon.js +1 -2
- package/es/common/render-command-list.js +2 -1
- package/es/common/text.js +1 -1
- package/es/common/utils.js +1 -1
- package/es/core/application.js +1 -1
- package/es/core/camera.js +1 -1
- package/es/core/constants.js +1 -1
- package/es/core/contributions/textMeasure/AtextMeasure.js +10 -0
- package/es/core/contributions/textMeasure/AtextMeasure.js.map +1 -1
- package/es/core/core-modules.js +1 -1
- package/es/core/global-module.js +0 -2
- package/es/core/global.js +1 -1
- package/es/core/graphic-utils.js +1 -1
- package/package.json +3 -3
package/cjs/animate/animate.js
CHANGED
package/cjs/animate/config.js
CHANGED
package/cjs/animate/easing.js
CHANGED
|
@@ -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
|
package/cjs/animate/index.js
CHANGED
|
@@ -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
|
package/cjs/animate/morphing.js
CHANGED
package/cjs/animate/timeline.js
CHANGED
|
@@ -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;
|
package/cjs/common/polygon.js
CHANGED
|
@@ -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,
|
package/cjs/common/text.js
CHANGED
|
@@ -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
|
package/cjs/common/utils.js
CHANGED
package/cjs/core/application.js
CHANGED
package/cjs/core/camera.js
CHANGED
package/cjs/core/constants.js
CHANGED
|
@@ -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"]}
|
package/cjs/core/core-modules.js
CHANGED
|
@@ -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
|
package/cjs/core/global.js
CHANGED
|
@@ -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;
|
package/es/animate/animate.js
CHANGED
package/es/animate/config.js
CHANGED
package/es/animate/easing.js
CHANGED
|
@@ -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
|
package/es/animate/group-fade.js
CHANGED
package/es/animate/index.js
CHANGED
package/es/animate/morphing.js
CHANGED
|
@@ -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
|
package/es/animate/timeline.js
CHANGED
|
@@ -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 };
|
package/es/color-string/store.js
CHANGED
package/es/common/polygon.js
CHANGED
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
|
package/es/common/utils.js
CHANGED
package/es/core/application.js
CHANGED
|
@@ -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
package/es/core/constants.js
CHANGED
|
@@ -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"]}
|
package/es/core/core-modules.js
CHANGED
|
@@ -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
|
package/es/core/global-module.js
CHANGED
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
|
package/es/core/graphic-utils.js
CHANGED
|
@@ -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.
|
|
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/
|
|
40
|
-
"@internal/
|
|
39
|
+
"@internal/ts-config": "0.0.1",
|
|
40
|
+
"@internal/eslint-config": "0.0.1"
|
|
41
41
|
},
|
|
42
42
|
"keywords": [
|
|
43
43
|
"VisActor",
|