@visactor/vutils 0.11.1 → 0.12.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/common/isType.js +1 -1
- package/cjs/common/isType.js.map +1 -1
- package/cjs/dom.d.ts +5 -2
- package/cjs/dom.js +21 -29
- package/cjs/dom.js.map +1 -1
- package/cjs/graphics/text/measure/interface.d.ts +1 -1
- package/cjs/graphics/text/measure/interface.js.map +1 -1
- package/cjs/graphics/text/measure/test.js +1 -1
- package/cjs/graphics/text/measure/test.js.map +1 -1
- package/cjs/graphics/text/measure/textMeasure.d.ts +1 -1
- package/cjs/graphics/text/measure/textMeasure.js +6 -4
- package/cjs/graphics/text/measure/textMeasure.js.map +1 -1
- package/cjs/graphics/text/measure/util.js.map +1 -1
- package/dist/index.js +29 -41
- package/dist/index.min.js +1 -1
- package/es/common/isType.js +1 -1
- package/es/common/isType.js.map +1 -1
- package/es/dom.d.ts +5 -2
- package/es/dom.js +11 -27
- package/es/dom.js.map +1 -1
- package/es/graphics/text/measure/interface.d.ts +1 -1
- package/es/graphics/text/measure/interface.js.map +1 -1
- package/es/graphics/text/measure/test.js +1 -1
- package/es/graphics/text/measure/test.js.map +1 -1
- package/es/graphics/text/measure/textMeasure.d.ts +1 -1
- package/es/graphics/text/measure/textMeasure.js +5 -4
- package/es/graphics/text/measure/textMeasure.js.map +1 -1
- package/es/graphics/text/measure/util.js.map +1 -1
- package/package.json +3 -2
package/cjs/common/isType.js
CHANGED
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: !0
|
|
5
5
|
});
|
|
6
6
|
|
|
7
|
-
const isType = (value, type) => toString.call(value) === `[object ${type}]`;
|
|
7
|
+
const isType = (value, type) => Object.prototype.toString.call(value) === `[object ${type}]`;
|
|
8
8
|
|
|
9
9
|
exports.default = isType;
|
|
10
10
|
//# sourceMappingURL=isType.js.map
|
package/cjs/common/isType.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/isType.ts"],"names":[],"mappings":";;AAMA,MAAM,MAAM,GAAG,CAAC,KAAU,EAAE,IAAY,EAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,WAAW,IAAI,GAAG,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/common/isType.ts"],"names":[],"mappings":";;AAMA,MAAM,MAAM,GAAG,CAAC,KAAU,EAAE,IAAY,EAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,WAAW,IAAI,GAAG,CAAC;AAEnH,kBAAe,MAAM,CAAC","file":"isType.js","sourcesContent":["/**\n * check value type\n * @param value the value to check\n * @param type type\n * @returns\n */\nconst isType = (value: any, type: string): boolean => Object.prototype.toString.call(value) === `[object ${type}]`;\n\nexport default isType;\n"]}
|
package/cjs/dom.d.ts
CHANGED
|
@@ -5,6 +5,9 @@ export declare function getContainerSize(el: HTMLElement | null, defaultWidth?:
|
|
|
5
5
|
};
|
|
6
6
|
export declare function getElementAbsolutePosition(element: HTMLElement): IPointLike;
|
|
7
7
|
export declare function getElementRelativePosition(element: HTMLElement, base: HTMLElement): IPointLike;
|
|
8
|
-
export declare
|
|
9
|
-
export declare
|
|
8
|
+
export declare const getScrollLeft: (element: HTMLElement) => number;
|
|
9
|
+
export declare const getScrollTop: (element: HTMLElement) => number;
|
|
10
|
+
export declare const getScaleX: (element: HTMLElement) => number;
|
|
11
|
+
export declare const getScaleY: (element: HTMLElement) => number;
|
|
12
|
+
export declare const getScale: (element: HTMLElement) => number;
|
|
10
13
|
export declare function hasParentElement(element: HTMLElement, target: HTMLElement): boolean;
|
package/cjs/dom.js
CHANGED
|
@@ -19,14 +19,10 @@ function getContainerSize(el, defaultWidth = 0, defaultHeight = 0) {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
function getElementAbsolutePosition(element) {
|
|
22
|
-
|
|
23
|
-
for (;current; ) actualLeft += current.offsetLeft, current = current.offsetParent;
|
|
24
|
-
let actualTop = element.offsetTop;
|
|
25
|
-
for (current = element.offsetParent; current; ) actualTop += current.offsetTop + current.clientTop,
|
|
26
|
-
current = current.offsetParent;
|
|
22
|
+
const {x: x, y: y} = element.getBoundingClientRect();
|
|
27
23
|
return {
|
|
28
|
-
x:
|
|
29
|
-
y:
|
|
24
|
+
x: x,
|
|
25
|
+
y: y
|
|
30
26
|
};
|
|
31
27
|
}
|
|
32
28
|
|
|
@@ -40,37 +36,34 @@ function getElementRelativePosition(element, base) {
|
|
|
40
36
|
|
|
41
37
|
Object.defineProperty(exports, "__esModule", {
|
|
42
38
|
value: !0
|
|
43
|
-
}), exports.hasParentElement = exports.
|
|
39
|
+
}), exports.hasParentElement = exports.getScale = exports.getScaleY = exports.getScaleX = exports.getScrollTop = exports.getScrollLeft = exports.getElementRelativePosition = exports.getElementAbsolutePosition = exports.getContainerSize = void 0,
|
|
44
40
|
exports.getContainerSize = getContainerSize, exports.getElementAbsolutePosition = getElementAbsolutePosition,
|
|
45
41
|
exports.getElementRelativePosition = getElementRelativePosition;
|
|
46
42
|
|
|
47
43
|
const getScrollLeft = element => {
|
|
48
44
|
var _a, _b, _c;
|
|
49
45
|
return element === (null === (_a = null === globalThis || void 0 === globalThis ? void 0 : globalThis.document) || void 0 === _a ? void 0 : _a.body) ? (null === (_c = null === (_b = null === globalThis || void 0 === globalThis ? void 0 : globalThis.document) || void 0 === _b ? void 0 : _b.documentElement) || void 0 === _c ? void 0 : _c.scrollLeft) || element.scrollLeft : "html" === element.tagName.toLowerCase() ? 0 : element.scrollLeft;
|
|
50
|
-
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
exports.getScrollLeft = getScrollLeft;
|
|
49
|
+
|
|
50
|
+
const getScrollTop = element => {
|
|
51
51
|
var _a, _b, _c;
|
|
52
52
|
return element === (null === (_a = null === globalThis || void 0 === globalThis ? void 0 : globalThis.document) || void 0 === _a ? void 0 : _a.body) ? (null === (_c = null === (_b = null === globalThis || void 0 === globalThis ? void 0 : globalThis.document) || void 0 === _b ? void 0 : _b.documentElement) || void 0 === _c ? void 0 : _c.scrollTop) || element.scrollTop : "html" === element.tagName.toLowerCase() ? 0 : element.scrollTop;
|
|
53
53
|
};
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
let actualLeft = getScrollLeft(element), current = element.parentElement;
|
|
57
|
-
for (;current; ) actualLeft += getScrollLeft(current), current = current.parentElement;
|
|
58
|
-
let actualTop = getScrollTop(element);
|
|
59
|
-
for (current = element.parentElement; current; ) actualTop += getScrollTop(current),
|
|
60
|
-
current = current.parentElement;
|
|
61
|
-
return {
|
|
62
|
-
x: actualLeft,
|
|
63
|
-
y: actualTop
|
|
64
|
-
};
|
|
65
|
-
}
|
|
55
|
+
exports.getScrollTop = getScrollTop;
|
|
66
56
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
57
|
+
const getScaleX = element => element.getBoundingClientRect().width / element.offsetWidth;
|
|
58
|
+
|
|
59
|
+
exports.getScaleX = getScaleX;
|
|
60
|
+
|
|
61
|
+
const getScaleY = element => element.getBoundingClientRect().height / element.offsetHeight;
|
|
62
|
+
|
|
63
|
+
exports.getScaleY = getScaleY;
|
|
64
|
+
|
|
65
|
+
const getScale = element => element.offsetWidth > 0 ? (0, exports.getScaleX)(element) : (0,
|
|
66
|
+
exports.getScaleY)(element);
|
|
74
67
|
|
|
75
68
|
function hasParentElement(element, target) {
|
|
76
69
|
let parent = element.parentNode;
|
|
@@ -81,6 +74,5 @@ function hasParentElement(element, target) {
|
|
|
81
74
|
return !1;
|
|
82
75
|
}
|
|
83
76
|
|
|
84
|
-
exports.
|
|
85
|
-
exports.hasParentElement = hasParentElement;
|
|
77
|
+
exports.getScale = getScale, exports.hasParentElement = hasParentElement;
|
|
86
78
|
//# sourceMappingURL=dom.js.map
|
package/cjs/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dom.ts"],"names":[],"mappings":";;;AAEA,SAAgB,gBAAgB,CAAC,EAAsB,EAAE,eAAuB,CAAC,EAAE,gBAAwB,CAAC;IAC1G,IAAI,CAAC,EAAE,EAAE;QACP,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;KACvD;IAED,IAAI,gBAAgB,CAAC;IACrB,IAAI;QACF,gBAAgB,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC;KAC7C;IAAC,OAAO,CAAC,EAAE;QACV,gBAAgB,GAAG,GAAG,EAAE;YACtB,OAAO,EAAyB,CAAC;QACnC,CAAC,CAAC;KACH;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAKnC,MAAM,aAAa,GACjB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,GAAG,CAAC,CAAC;IAEjH,MAAM,cAAc,GAClB,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,YAAY,GAAG,CAAC,CAAC;IAGnH,OAAO;QACL,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;QACxD,MAAM,EAAE,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc;KAC7D,CAAC;AACJ,CAAC;AA9BD,4CA8BC;AAOD,SAAgB,0BAA0B,CAAC,OAAoB;
|
|
1
|
+
{"version":3,"sources":["../src/dom.ts"],"names":[],"mappings":"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","file":"dom.js","sourcesContent":["import type { IPointLike } from './data-structure';\n\nexport function getContainerSize(el: HTMLElement | null, defaultWidth: number = 0, defaultHeight: number = 0) {\n if (!el) {\n return { width: defaultWidth, height: defaultHeight };\n }\n\n let getComputedStyle;\n try {\n getComputedStyle = window?.getComputedStyle;\n } catch (e) {\n getComputedStyle = () => {\n return {} as CSSStyleDeclaration;\n };\n }\n\n const style = getComputedStyle(el);\n\n // clientWidth/clientHeight: 默认整数,会向上取整,导致canvas > container\n // getBoundingClientRect:默认小数,但是在container上有css类似 transform: scale(0.5)时,获取结果不对\n // getComputedStyle:默认小数,获取最终结果,但是会包含padding;\n const computedWidth =\n parseFloat(style.width) - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight) || el.clientWidth - 1;\n\n const computedHeight =\n parseFloat(style.height) - parseFloat(style.paddingTop) - parseFloat(style.paddingBottom) || el.clientHeight - 1;\n\n // 理论上不用向下取整,目前没加。\n return {\n width: computedWidth <= 0 ? defaultWidth : computedWidth,\n height: computedHeight <= 0 ? defaultHeight : computedHeight\n };\n}\n\n/**\n * 获取元素的绝对位置坐标(相对于页面左上角)\n * @param element\n * @returns\n */\nexport function getElementAbsolutePosition(element: HTMLElement): IPointLike {\n const { x, y } = element.getBoundingClientRect();\n return { x, y };\n}\n\n/**\n * 获取元素的相对位置坐标(相对于其他dom元素)\n * @param element\n * @returns\n */\nexport function getElementRelativePosition(element: HTMLElement, base: HTMLElement): IPointLike {\n const posElement = getElementAbsolutePosition(element);\n const posBase = getElementAbsolutePosition(base);\n return { x: posElement.x - posBase.x, y: posElement.y - posBase.y };\n}\n\nexport const getScrollLeft = (element: HTMLElement) => {\n if (element === globalThis?.document?.body) {\n return globalThis?.document?.documentElement?.scrollLeft || element.scrollLeft;\n } else if (element.tagName.toLowerCase() === 'html') {\n return 0;\n }\n return element.scrollLeft;\n};\nexport const getScrollTop = (element: HTMLElement) => {\n if (element === globalThis?.document?.body) {\n return globalThis?.document?.documentElement?.scrollTop || element.scrollTop;\n } else if (element.tagName.toLowerCase() === 'html') {\n return 0;\n }\n return element.scrollTop;\n};\n\nexport const getScaleX = (element: HTMLElement) => {\n return element.getBoundingClientRect().width / element.offsetWidth;\n};\n\nexport const getScaleY = (element: HTMLElement) => {\n return element.getBoundingClientRect().height / element.offsetHeight;\n};\n\n/**\n * 获取目标元素的缩放因数\n * @param element 目标 dom 元素\n * @returns\n */\nexport const getScale = (element: HTMLElement) => {\n if (element.offsetWidth > 0) {\n return getScaleX(element);\n }\n return getScaleY(element);\n};\n\n/**\n * 判断是否是元素的父元素\n * @param element 从其父元素开始查找的 DOM 元素\n * @param target 要查找的目标父元素\n * @returns boolean, true 代表查找到,false 表示未找到\n */\nexport function hasParentElement(element: HTMLElement, target: HTMLElement): boolean {\n let parent = element.parentNode;\n\n while (parent !== null) {\n if (parent === target) {\n return true;\n }\n parent = parent.parentNode;\n }\n\n return false;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IBounds } from '../../../data-structure';
|
|
2
|
-
export type TextMeasureMethod = 'simple' | 'quick' | 'canvas' | '
|
|
2
|
+
export type TextMeasureMethod = 'simple' | 'quick' | 'canvas' | 'vrender';
|
|
3
3
|
export interface ITextSize {
|
|
4
4
|
width: number;
|
|
5
5
|
height: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphics/text/measure/interface.ts"],"names":[],"mappings":"","file":"interface.js","sourcesContent":["import type { IBounds } from '../../../data-structure';\n\n/**\n * 文本估算方法\n * simple:完全不调用
|
|
1
|
+
{"version":3,"sources":["../src/graphics/text/measure/interface.ts"],"names":[],"mappings":"","file":"interface.js","sourcesContent":["import type { IBounds } from '../../../data-structure';\n\n/**\n * 文本估算方法\n * simple:完全不调用 vrender,快速文本大小估算,速度最快、最粗糙\n * canvas:调用原生 canvas 的文本大小估算,宽度较精准,高度为估算\n * vrender:调用 vrender 的文本大小估算,速度最慢、最精细\n * quick(默认):部分调用 vrender 的文本大小估算,速度和精确度平衡\n */\nexport type TextMeasureMethod = 'simple' | 'quick' | 'canvas' | 'vrender';\n\nexport interface ITextSize {\n width: number;\n height: number;\n}\n\n// FIXME: from VRender\nexport interface ITextFontParams {\n fontStyle: string;\n fontVariant: string;\n fontWeight: string | number;\n fontSize: number;\n fontFamily: string;\n}\n\n/** 文本测量需要用到的text spec */\nexport interface ITextMeasureSpec extends Partial<ITextFontParams> {\n fontSize: number;\n fontFamily: string;\n align?: string;\n textAlign: string;\n baseline?: string;\n textBaseline: string;\n ellipsis?: string | boolean;\n limit?: number;\n lineHeight?: number;\n}\n\nexport interface ITextMeasureOption {\n /** 默认字体属性 */\n defaultFontParams?: Partial<ITextFontParams>;\n\n /** 特殊字符集 */\n specialCharSet?: string;\n\n /** 来自 vrender 的测量方法 */\n getTextBounds?: (params: any) => IBounds;\n\n /** 外部获取 canvas 的方法(小组件工作台移动端无法创建公共canvas,需要传入) */\n getCanvasForMeasure?: () => any;\n}\n\nexport type TextMeasureInput = number | string | (number | string)[];\n"]}
|
|
@@ -19,7 +19,7 @@ class TestTextMeasure extends textMeasure_1.TextMeasure {
|
|
|
19
19
|
return mean(numbers.map((num => Math.pow(num - m, 2))));
|
|
20
20
|
}, callback = null != getStrCallback ? getStrCallback : () => `测试${(0, exports.getTestWord)(8)} ${(0,
|
|
21
21
|
exports.getTestNumbers)(4)}/${(0, exports.getTestNumbers)(2)}-${(0, exports.getTestNumbers)(2)}`, textArr = Array(null != count ? count : 1e5).fill(0).map(callback), methodMap = {
|
|
22
|
-
|
|
22
|
+
vrender: this.fullMeasure.bind(this),
|
|
23
23
|
canvas: this.measureWithNaiveCanvas.bind(this),
|
|
24
24
|
simple: this.quickMeasureWithoutCanvas.bind(this),
|
|
25
25
|
quick: this.quickMeasure.bind(this),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphics/text/measure/test.ts"],"names":[],"mappings":";;;AAAA,4CAAwC;AAExC,+CAA4C;AAE5C,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,OAAO,eAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,eAAe,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/G,CAAC,CAAC;AACK,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAAvF,QAAA,cAAc,kBAAyE;AAEpG,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,OAAO,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AACjH,CAAC,CAAC;AACK,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAApF,QAAA,WAAW,eAAyE;AAEjG,MAAa,eAAqD,SAAQ,yBAAc;IAEtF,IAAI,CAAC,OAA6B,EAAE,cAA6B,EAAE,KAAc;QAC/E,MAAM,GAAG,GAAG,CAAC,OAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,CAAC,OAAiB,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAClE,MAAM,QAAQ,GAAG,CAAC,OAAiB,EAAE,EAAE;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC;QAEF,MAAM,QAAQ,GACZ,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,CAAC,GAAG,EAAE,CAAC,KAAK,IAAA,mBAAW,EAAC,CAAC,CAAC,IAAI,IAAA,sBAAc,EAAC,CAAC,CAAC,IAAI,IAAA,sBAAc,EAAC,CAAC,CAAC,IAAI,IAAA,sBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEjH,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,MAAM,CAAC;aACnC,IAAI,CAAC,CAAC,CAAC;aACP,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEjB,MAAM,SAAS,GAAyD;YACtE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YACpC,MAAM,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9C,MAAM,EAAE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,GAAG,EAAE,CAAC,IAAqB,EAAE,EAAE;gBAC7B,IAAI,IAAA,cAAK,EAAC,IAAI,CAAC,EAAE;oBACf,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;iBAChC;gBACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACnC,OAAO;oBACL,KAAK,EAAE,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM;oBAClC,MAAM,EAAE,QAAQ;iBACjB,CAAC;YACJ,CAAC;SACF,CAAC;QACF,MAAM,UAAU,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAErD,MAAM,MAAM,GAOR,EAAS,CAAC;QAGd,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QACjD,MAAM,CAAC,QAAQ,GAAG;YAChB,IAAI,EAAE,YAAY;SACnB,CAAC;QAGF,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC1B,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,UAAU,EAAE;gBACd,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAkD,CAAC,CAAC;gBACnF,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;gBAE7C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CACzB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC;oBACC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK;oBACpD,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM;iBAC1C,CAAA,CAClB,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,GAAG;oBACf,OAAO,EAAE;wBACP,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBACtC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;qBACzC;oBACD,MAAM,EAAE;wBACN,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBAC1C,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;qBAC7C;oBACD,IAAI,EAAE,QAAQ;iBACf,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,MAAM;YACN,OAAO;SACR,CAAC;IACJ,CAAC;CACF;AAvFD,0CAuFC","file":"test.js","sourcesContent":["import { isNil } from '../../../common';\nimport type { ITextMeasureSpec, ITextSize, TextMeasureMethod } from './interface';\nimport { TextMeasure } from './textMeasure';\n\nconst getNumberChar = () => {\n return TestTextMeasure.NUMBERS_CHAR_SET[Math.floor(Math.random() * TestTextMeasure.NUMBERS_CHAR_SET.length)];\n};\nexport const getTestNumbers = (length: number) => Array(length).fill(0).map(getNumberChar).join('');\n\nconst getLetterChar = () => {\n return TestTextMeasure.ALPHABET_CHAR_SET[Math.floor(Math.random() * TestTextMeasure.ALPHABET_CHAR_SET.length)];\n};\nexport const getTestWord = (length: number) => Array(length).fill(0).map(getLetterChar).join('');\n\nexport class TestTextMeasure<T extends Partial<ITextMeasureSpec>> extends TextMeasure<T> {\n /** 测试方法 */\n test(methods?: TextMeasureMethod[], getStrCallback?: () => string, count?: number) {\n const sub = (numbers: number[]) => numbers.reduce((sum, cur) => sum + cur, 0);\n const mean = (numbers: number[]) => sub(numbers) / numbers.length;\n const variance = (numbers: number[]) => {\n const m = mean(numbers);\n return mean(numbers.map(num => Math.pow(num - m, 2)));\n };\n\n const callback =\n getStrCallback ?? (() => `测试${getTestWord(8)} ${getTestNumbers(4)}/${getTestNumbers(2)}-${getTestNumbers(2)}`);\n // 测试文本\n const textArr = Array(count ?? 100000)\n .fill(0)\n .map(callback);\n\n const methodMap: Record<string, (text: number | string) => ITextSize> = {\n
|
|
1
|
+
{"version":3,"sources":["../src/graphics/text/measure/test.ts"],"names":[],"mappings":"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","file":"test.js","sourcesContent":["import { isNil } from '../../../common';\nimport type { ITextMeasureSpec, ITextSize, TextMeasureMethod } from './interface';\nimport { TextMeasure } from './textMeasure';\n\nconst getNumberChar = () => {\n return TestTextMeasure.NUMBERS_CHAR_SET[Math.floor(Math.random() * TestTextMeasure.NUMBERS_CHAR_SET.length)];\n};\nexport const getTestNumbers = (length: number) => Array(length).fill(0).map(getNumberChar).join('');\n\nconst getLetterChar = () => {\n return TestTextMeasure.ALPHABET_CHAR_SET[Math.floor(Math.random() * TestTextMeasure.ALPHABET_CHAR_SET.length)];\n};\nexport const getTestWord = (length: number) => Array(length).fill(0).map(getLetterChar).join('');\n\nexport class TestTextMeasure<T extends Partial<ITextMeasureSpec>> extends TextMeasure<T> {\n /** 测试方法 */\n test(methods?: TextMeasureMethod[], getStrCallback?: () => string, count?: number) {\n const sub = (numbers: number[]) => numbers.reduce((sum, cur) => sum + cur, 0);\n const mean = (numbers: number[]) => sub(numbers) / numbers.length;\n const variance = (numbers: number[]) => {\n const m = mean(numbers);\n return mean(numbers.map(num => Math.pow(num - m, 2)));\n };\n\n const callback =\n getStrCallback ?? (() => `测试${getTestWord(8)} ${getTestNumbers(4)}/${getTestNumbers(2)}-${getTestNumbers(2)}`);\n // 测试文本\n const textArr = Array(count ?? 100000)\n .fill(0)\n .map(callback);\n\n const methodMap: Record<string, (text: number | string) => ITextSize> = {\n vrender: this.fullMeasure.bind(this),\n canvas: this.measureWithNaiveCanvas.bind(this),\n simple: this.quickMeasureWithoutCanvas.bind(this),\n quick: this.quickMeasure.bind(this),\n old: (text: number | string) => {\n if (isNil(text)) {\n return { width: 0, height: 0 };\n }\n const str = text.toString();\n const { fontSize } = this.textSpec;\n return {\n width: fontSize * 0.8 * str.length,\n height: fontSize\n };\n }\n };\n const methodList = methods ?? Object.keys(methodMap);\n\n const report: Record<\n keyof typeof methodMap,\n {\n errMean?: ITextSize;\n errVar?: ITextSize;\n time: number;\n }\n > = {} as any;\n\n // 标准方法\n const timetmp = performance.now();\n const standardResult = textArr.map(this._standardMethod);\n const standardTime = performance.now() - timetmp;\n report.standard = {\n time: standardTime\n };\n\n // 测试方法\n methodList.forEach(method => {\n const testMethod = methodMap[method];\n if (testMethod) {\n const timetmp = performance.now();\n const testResult = textArr.map(testMethod as (text: number | string) => ITextSize);\n const testTime = performance.now() - timetmp;\n // 计算误差\n const errList = textArr.map(\n (_, i) =>\n ({\n width: testResult[i].width - standardResult[i].width,\n height: testResult[i].height - standardResult[i].height\n } as ITextSize)\n );\n report[method] = {\n errMean: {\n width: mean(errList.map(e => e.width)),\n height: mean(errList.map(e => e.height))\n },\n errVar: {\n width: variance(errList.map(e => e.width)),\n height: variance(errList.map(e => e.height))\n },\n time: testTime\n };\n }\n });\n\n return {\n report,\n textArr\n };\n }\n}\n"]}
|
|
@@ -12,7 +12,7 @@ export declare class TextMeasure<T extends Partial<ITextMeasureSpec>> {
|
|
|
12
12
|
protected _context: Maybe<CanvasRenderingContext2D>;
|
|
13
13
|
protected _contextSaved: boolean;
|
|
14
14
|
protected _notSupportCanvas: boolean;
|
|
15
|
-
protected
|
|
15
|
+
protected _notSupportVRender: boolean;
|
|
16
16
|
protected readonly _userSpec: Partial<T>;
|
|
17
17
|
textSpec: ITextMeasureSpec;
|
|
18
18
|
protected readonly _option: ITextMeasureOption;
|
|
@@ -10,7 +10,7 @@ class TextMeasure {
|
|
|
10
10
|
constructor(option, textSpec) {
|
|
11
11
|
this._numberCharSize = null, this._fullCharSize = null, this._letterCharSize = null,
|
|
12
12
|
this._specialCharSizeMap = {}, this._canvas = null, this._context = null, this._contextSaved = !1,
|
|
13
|
-
this._notSupportCanvas = !1, this.
|
|
13
|
+
this._notSupportCanvas = !1, this._notSupportVRender = !1, this._userSpec = {},
|
|
14
14
|
this.specialCharSet = "-/: .,@%'\"~", this._option = option, this._userSpec = null != textSpec ? textSpec : {},
|
|
15
15
|
this.textSpec = this._initSpec(), (0, common_1.isValid)(option.specialCharSet) && (this.specialCharSet = option.specialCharSet),
|
|
16
16
|
this._standardMethod = (0, common_1.isValid)(option.getTextBounds) ? this.fullMeasure.bind(this) : this.measureWithNaiveCanvas.bind(this);
|
|
@@ -18,7 +18,8 @@ class TextMeasure {
|
|
|
18
18
|
initContext() {
|
|
19
19
|
if (this._notSupportCanvas) return !1;
|
|
20
20
|
if ((0, common_1.isNil)(this._canvas) && ((0, common_1.isValid)(this._option.getCanvasForMeasure) && (this._canvas = this._option.getCanvasForMeasure()),
|
|
21
|
-
(0, common_1.isNil)(this._canvas) &&
|
|
21
|
+
(0, common_1.isNil)(this._canvas) && "undefined" != typeof window && void 0 !== window.document && (0,
|
|
22
|
+
common_1.isValid)(globalThis.document) && (this._canvas = globalThis.document.createElement("canvas"))),
|
|
22
23
|
(0, common_1.isNil)(this._context) && (0, common_1.isValid)(this._canvas)) {
|
|
23
24
|
const context = this._canvas.getContext("2d");
|
|
24
25
|
(0, common_1.isValid)(context) && (context.save(), context.font = (0, util_1.getContextFont)(this.textSpec),
|
|
@@ -44,6 +45,7 @@ class TextMeasure {
|
|
|
44
45
|
}
|
|
45
46
|
measure(text, method) {
|
|
46
47
|
switch (method) {
|
|
48
|
+
case "vrender":
|
|
47
49
|
case "canopus":
|
|
48
50
|
return this.fullMeasure(text);
|
|
49
51
|
|
|
@@ -62,7 +64,7 @@ class TextMeasure {
|
|
|
62
64
|
width: 0,
|
|
63
65
|
height: 0
|
|
64
66
|
};
|
|
65
|
-
if ((0, common_1.isNil)(this._option.getTextBounds) || !this.
|
|
67
|
+
if ((0, common_1.isNil)(this._option.getTextBounds) || !this._notSupportVRender) return this.measureWithNaiveCanvas(text);
|
|
66
68
|
const {fontFamily: fontFamily, fontSize: fontSize, fontWeight: fontWeight, textAlign: textAlign, textBaseline: textBaseline, ellipsis: ellipsis, limit: limit, lineHeight: lineHeight} = this.textSpec;
|
|
67
69
|
let size;
|
|
68
70
|
try {
|
|
@@ -82,7 +84,7 @@ class TextMeasure {
|
|
|
82
84
|
height: bounds.height()
|
|
83
85
|
};
|
|
84
86
|
} catch (e) {
|
|
85
|
-
this.
|
|
87
|
+
this._notSupportVRender = !0, size = this.measureWithNaiveCanvas(text);
|
|
86
88
|
}
|
|
87
89
|
return size;
|
|
88
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphics/text/measure/textMeasure.ts"],"names":[],"mappings":"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","file":"textMeasure.js","sourcesContent":["import { isArray, isNil, isValid } from '../../../common';\nimport type { Maybe } from '../../../type';\nimport { eastAsianCharacterInfo } from '../stringWidth';\nimport type { ITextMeasureOption, ITextMeasureSpec, ITextSize, TextMeasureInput, TextMeasureMethod } from './interface';\nimport { getContextFont } from './util';\n\nexport class TextMeasure<T extends Partial<ITextMeasureSpec>> {\n /** 英文字母集 */\n static readonly ALPHABET_CHAR_SET = 'abcdefghijklmnopqrstuvwxyz';\n\n /** 数字集 */\n static readonly NUMBERS_CHAR_SET = '0123456789';\n\n /** 全角字符 */\n static readonly FULL_SIZE_CHAR = '字';\n\n /** 数字大小缓存 */\n _numberCharSize: Maybe<ITextSize> = null;\n\n /** 全角字符大小缓存 */\n _fullCharSize: Maybe<ITextSize> = null;\n\n /** 字母大小缓存 */\n _letterCharSize: Maybe<ITextSize> = null;\n\n /** 特殊字符缓存 */\n _specialCharSizeMap: Record<string, ITextSize> = {};\n\n /** 内置测量 canvas */\n protected _canvas: Maybe<HTMLCanvasElement> = null;\n protected _context: Maybe<CanvasRenderingContext2D> = null;\n protected _contextSaved: boolean = false;\n\n /** 是否不支持 canvas */\n protected _notSupportCanvas: boolean = false;\n /** 是否不支持 canopus */\n protected _notSupportCanopus: boolean = false;\n\n /** 文字 spec */\n protected readonly _userSpec: Partial<T> = {};\n textSpec: ITextMeasureSpec;\n\n protected readonly _option: ITextMeasureOption;\n\n /** 标准测量方法 */\n protected readonly _standardMethod: (text: TextMeasureInput) => ITextSize;\n\n /** 特殊字符集 */\n specialCharSet: string = '-/: .,@%\\'\"~';\n\n constructor(option: ITextMeasureOption, textSpec?: Partial<T>) {\n this._option = option;\n this._userSpec = textSpec ?? {};\n this.textSpec = this._initSpec();\n if (isValid(option.specialCharSet)) {\n this.specialCharSet = option.specialCharSet;\n }\n this._standardMethod = isValid(option.getTextBounds)\n ? this.fullMeasure.bind(this)\n : this.measureWithNaiveCanvas.bind(this);\n }\n\n /** 初始化测量相关上下文 */\n initContext() {\n if (this._notSupportCanvas) {\n return false;\n }\n if (isNil(this._canvas)) {\n if (isValid(this._option.getCanvasForMeasure)) {\n this._canvas = this._option.getCanvasForMeasure();\n }\n if (isNil(this._canvas) && isValid(globalThis.document)) {\n // 默认创建方法\n this._canvas = globalThis.document.createElement('canvas');\n }\n }\n if (isNil(this._context) && isValid(this._canvas)) {\n const context = this._canvas.getContext('2d');\n if (isValid(context)) {\n context.save();\n context.font = getContextFont(this.textSpec);\n this._contextSaved = true;\n this._context = context;\n }\n }\n if (isNil(this._context)) {\n this._notSupportCanvas = true;\n return false;\n }\n return true;\n }\n\n protected _initSpec(): ITextMeasureSpec {\n const { defaultFontParams = {} } = this._option;\n const {\n fontStyle = defaultFontParams.fontStyle,\n fontVariant = defaultFontParams.fontVariant,\n fontWeight = defaultFontParams.fontWeight ?? 'normal',\n fontSize = defaultFontParams.fontSize ?? 12,\n fontFamily = defaultFontParams.fontFamily ?? 'sans-serif',\n align,\n textAlign = align ?? 'center',\n baseline,\n textBaseline = baseline ?? 'middle',\n ellipsis,\n limit,\n lineHeight = fontSize\n } = this._userSpec;\n\n return {\n fontStyle,\n fontVariant,\n fontFamily,\n fontSize,\n fontWeight,\n textAlign,\n textBaseline,\n ellipsis,\n limit,\n lineHeight\n };\n }\n\n /** 计算文本宽高 */\n measure(text: TextMeasureInput, method?: TextMeasureMethod): ITextSize {\n switch (method) {\n case 'canopus':\n return this.fullMeasure(text);\n case 'canvas':\n return this.measureWithNaiveCanvas(text);\n case 'simple':\n return this.quickMeasureWithoutCanvas(text);\n case 'quick':\n default:\n return this.quickMeasure(text);\n }\n }\n\n /** 精确计算文本宽高 */\n fullMeasure(text: TextMeasureInput): ITextSize {\n if (isNil(text)) {\n return { width: 0, height: 0 };\n }\n if (isNil(this._option.getTextBounds) || !this._notSupportCanopus) {\n return this.measureWithNaiveCanvas(text); // 降级\n }\n const { fontFamily, fontSize, fontWeight, textAlign, textBaseline, ellipsis, limit, lineHeight } = this.textSpec;\n let size: ITextSize;\n try {\n const bounds = this._option.getTextBounds({\n text,\n fontFamily,\n fontSize,\n fontWeight,\n textAlign,\n textBaseline,\n ellipsis: !!ellipsis,\n maxLineWidth: limit || Infinity,\n lineHeight\n });\n size = { width: bounds.width(), height: bounds.height() };\n } catch (e) {\n this._notSupportCanopus = true;\n size = this.measureWithNaiveCanvas(text); // 降级\n }\n return size;\n }\n\n /** 通过原生 canvas 精确计算文本宽度,高度为估算 */\n measureWithNaiveCanvas(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._measureWithNaiveCanvas.bind(this));\n }\n protected _measureWithNaiveCanvas(text: string): ITextSize {\n if (!this.initContext()) {\n return this._quickMeasureWithoutCanvas(text); // 降级\n }\n const metrics = this._context!.measureText(text);\n const { fontSize, lineHeight } = this.textSpec;\n return { width: metrics.width, height: lineHeight ?? fontSize };\n }\n\n /** 快速估算文本宽高 */\n quickMeasure(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._quickMeasure.bind(this));\n }\n protected _quickMeasure(text: string): ITextSize {\n const totalSize: ITextSize = {\n width: 0,\n height: 0\n };\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n // 先判断是否特殊字符\n let size = this._measureSpecialChar(char);\n // 再判断是否数字\n if (isNil(size) && TextMeasure.NUMBERS_CHAR_SET.includes(char)) {\n size = this._measureNumberChar();\n }\n // 再判断全角字符\n if (isNil(size) && ['F', 'W'].includes(eastAsianCharacterInfo(char))) {\n size = this._measureFullSizeChar();\n }\n // 最后按半角字符处理\n if (isNil(size)) {\n size = this._measureLetterChar();\n }\n totalSize.width += size.width;\n totalSize.height = Math.max(totalSize.height, size.height);\n }\n return totalSize;\n }\n\n /** 不使用 canvas 来快速估算文本宽高 */\n quickMeasureWithoutCanvas(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._quickMeasureWithoutCanvas.bind(this));\n }\n protected _quickMeasureWithoutCanvas(text: string): ITextSize {\n const totalSize: ITextSize = {\n width: 0,\n height: 0\n };\n\n const { fontSize, lineHeight } = this.textSpec;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n // 判断全角字符\n const size = ['F', 'W'].includes(eastAsianCharacterInfo(char)) ? 1 : 0.53;\n totalSize.width += size * fontSize;\n }\n totalSize.height = lineHeight ?? fontSize;\n return totalSize;\n }\n\n protected _measureReduce(text: TextMeasureInput, processor: (str: string) => ITextSize): ITextSize {\n const { fontSize, lineHeight } = this.textSpec;\n const defaultResult = { width: 0, height: 0 };\n\n if (isNil(text)) {\n return defaultResult;\n } else if (isArray(text)) {\n const textArr = text.filter(isValid).map(s => s.toString());\n if (textArr.length === 0) {\n return defaultResult;\n } else if (textArr.length === 1) {\n return processor(textArr[0]);\n }\n return {\n width: textArr.reduce((maxWidth, cur) => Math.max(maxWidth, processor(cur).width), 0),\n height: textArr.length * ((lineHeight ?? fontSize) + 1) + 1 // 经验值\n };\n }\n return processor(text.toString());\n }\n\n /** 测量一个数字 */\n protected _measureNumberChar(): ITextSize {\n if (isNil(this._numberCharSize)) {\n const numberBounds = this._standardMethod(TextMeasure.NUMBERS_CHAR_SET);\n this._numberCharSize = {\n width: numberBounds.width / TextMeasure.NUMBERS_CHAR_SET.length, // 宽度取均值\n height: numberBounds.height\n };\n }\n return this._numberCharSize;\n }\n\n /** 测量一个全角字符 */\n protected _measureFullSizeChar(): ITextSize {\n if (isNil(this._fullCharSize)) {\n this._fullCharSize = this._standardMethod(TextMeasure.FULL_SIZE_CHAR);\n }\n return this._fullCharSize;\n }\n\n /** 测量一个英文字符 */\n protected _measureLetterChar(): ITextSize {\n if (isNil(this._letterCharSize)) {\n const alphabetBounds = this._standardMethod(TextMeasure.ALPHABET_CHAR_SET);\n this._letterCharSize = {\n width: alphabetBounds.width / TextMeasure.ALPHABET_CHAR_SET.length, // 宽度取均值\n height: alphabetBounds.height\n };\n }\n return this._letterCharSize;\n }\n\n /** 测量一个特殊字符 */\n protected _measureSpecialChar(char: string): Maybe<ITextSize> {\n if (isValid(this._specialCharSizeMap[char])) {\n return this._specialCharSizeMap[char];\n }\n if (this.specialCharSet.includes(char)) {\n this._specialCharSizeMap[char] = this._standardMethod(char);\n return this._specialCharSizeMap[char];\n }\n return null;\n }\n\n release() {\n if (isValid(this._canvas)) {\n this._canvas = null;\n }\n if (isValid(this._context)) {\n if (this._contextSaved) {\n this._context.restore();\n this._contextSaved = false;\n }\n this._context = null;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graphics/text/measure/textMeasure.ts"],"names":[],"mappings":"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","file":"textMeasure.js","sourcesContent":["import { isArray, isNil, isValid } from '../../../common';\nimport type { Maybe } from '../../../type';\nimport { eastAsianCharacterInfo } from '../stringWidth';\nimport type { ITextMeasureOption, ITextMeasureSpec, ITextSize, TextMeasureInput, TextMeasureMethod } from './interface';\nimport { getContextFont } from './util';\n\nexport class TextMeasure<T extends Partial<ITextMeasureSpec>> {\n /** 英文字母集 */\n static readonly ALPHABET_CHAR_SET = 'abcdefghijklmnopqrstuvwxyz';\n\n /** 数字集 */\n static readonly NUMBERS_CHAR_SET = '0123456789';\n\n /** 全角字符 */\n static readonly FULL_SIZE_CHAR = '字';\n\n /** 数字大小缓存 */\n _numberCharSize: Maybe<ITextSize> = null;\n\n /** 全角字符大小缓存 */\n _fullCharSize: Maybe<ITextSize> = null;\n\n /** 字母大小缓存 */\n _letterCharSize: Maybe<ITextSize> = null;\n\n /** 特殊字符缓存 */\n _specialCharSizeMap: Record<string, ITextSize> = {};\n\n /** 内置测量 canvas */\n protected _canvas: Maybe<HTMLCanvasElement> = null;\n protected _context: Maybe<CanvasRenderingContext2D> = null;\n protected _contextSaved: boolean = false;\n\n /** 是否不支持 canvas */\n protected _notSupportCanvas: boolean = false;\n /** 是否不支持 vrender */\n protected _notSupportVRender: boolean = false;\n\n /** 文字 spec */\n protected readonly _userSpec: Partial<T> = {};\n textSpec: ITextMeasureSpec;\n\n protected readonly _option: ITextMeasureOption;\n\n /** 标准测量方法 */\n protected readonly _standardMethod: (text: TextMeasureInput) => ITextSize;\n\n /** 特殊字符集 */\n specialCharSet: string = '-/: .,@%\\'\"~';\n\n constructor(option: ITextMeasureOption, textSpec?: Partial<T>) {\n this._option = option;\n this._userSpec = textSpec ?? {};\n this.textSpec = this._initSpec();\n if (isValid(option.specialCharSet)) {\n this.specialCharSet = option.specialCharSet;\n }\n this._standardMethod = isValid(option.getTextBounds)\n ? this.fullMeasure.bind(this)\n : this.measureWithNaiveCanvas.bind(this);\n }\n\n /** 初始化测量相关上下文 */\n initContext() {\n if (this._notSupportCanvas) {\n return false;\n }\n if (isNil(this._canvas)) {\n if (isValid(this._option.getCanvasForMeasure)) {\n this._canvas = this._option.getCanvasForMeasure();\n }\n if (\n isNil(this._canvas) &&\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n isValid(globalThis.document)\n ) {\n // 默认创建方法\n this._canvas = globalThis.document.createElement('canvas');\n }\n }\n if (isNil(this._context) && isValid(this._canvas)) {\n const context = this._canvas.getContext('2d');\n if (isValid(context)) {\n context.save();\n context.font = getContextFont(this.textSpec);\n this._contextSaved = true;\n this._context = context;\n }\n }\n if (isNil(this._context)) {\n this._notSupportCanvas = true;\n return false;\n }\n return true;\n }\n\n protected _initSpec(): ITextMeasureSpec {\n const { defaultFontParams = {} } = this._option;\n const {\n fontStyle = defaultFontParams.fontStyle,\n fontVariant = defaultFontParams.fontVariant,\n fontWeight = defaultFontParams.fontWeight ?? 'normal',\n fontSize = defaultFontParams.fontSize ?? 12,\n fontFamily = defaultFontParams.fontFamily ?? 'sans-serif',\n align,\n textAlign = align ?? 'center',\n baseline,\n textBaseline = baseline ?? 'middle',\n ellipsis,\n limit,\n lineHeight = fontSize\n } = this._userSpec;\n\n return {\n fontStyle,\n fontVariant,\n fontFamily,\n fontSize,\n fontWeight,\n textAlign,\n textBaseline,\n ellipsis,\n limit,\n lineHeight\n };\n }\n\n /** 计算文本宽高 */\n measure(text: TextMeasureInput, method?: TextMeasureMethod): ITextSize {\n switch (method) {\n case 'vrender':\n case 'canopus' as any:\n return this.fullMeasure(text);\n case 'canvas':\n return this.measureWithNaiveCanvas(text);\n case 'simple':\n return this.quickMeasureWithoutCanvas(text);\n case 'quick':\n default:\n return this.quickMeasure(text);\n }\n }\n\n /** 精确计算文本宽高 */\n fullMeasure(text: TextMeasureInput): ITextSize {\n if (isNil(text)) {\n return { width: 0, height: 0 };\n }\n if (isNil(this._option.getTextBounds) || !this._notSupportVRender) {\n return this.measureWithNaiveCanvas(text); // 降级\n }\n const { fontFamily, fontSize, fontWeight, textAlign, textBaseline, ellipsis, limit, lineHeight } = this.textSpec;\n let size: ITextSize;\n try {\n const bounds = this._option.getTextBounds({\n text,\n fontFamily,\n fontSize,\n fontWeight,\n textAlign,\n textBaseline,\n ellipsis: !!ellipsis,\n maxLineWidth: limit || Infinity,\n lineHeight\n });\n size = { width: bounds.width(), height: bounds.height() };\n } catch (e) {\n this._notSupportVRender = true;\n size = this.measureWithNaiveCanvas(text); // 降级\n }\n return size;\n }\n\n /** 通过原生 canvas 精确计算文本宽度,高度为估算 */\n measureWithNaiveCanvas(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._measureWithNaiveCanvas.bind(this));\n }\n protected _measureWithNaiveCanvas(text: string): ITextSize {\n if (!this.initContext()) {\n return this._quickMeasureWithoutCanvas(text); // 降级\n }\n const metrics = this._context!.measureText(text);\n const { fontSize, lineHeight } = this.textSpec;\n return { width: metrics.width, height: lineHeight ?? fontSize };\n }\n\n /** 快速估算文本宽高 */\n quickMeasure(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._quickMeasure.bind(this));\n }\n protected _quickMeasure(text: string): ITextSize {\n const totalSize: ITextSize = {\n width: 0,\n height: 0\n };\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n // 先判断是否特殊字符\n let size = this._measureSpecialChar(char);\n // 再判断是否数字\n if (isNil(size) && TextMeasure.NUMBERS_CHAR_SET.includes(char)) {\n size = this._measureNumberChar();\n }\n // 再判断全角字符\n if (isNil(size) && ['F', 'W'].includes(eastAsianCharacterInfo(char))) {\n size = this._measureFullSizeChar();\n }\n // 最后按半角字符处理\n if (isNil(size)) {\n size = this._measureLetterChar();\n }\n totalSize.width += size.width;\n totalSize.height = Math.max(totalSize.height, size.height);\n }\n return totalSize;\n }\n\n /** 不使用 canvas 来快速估算文本宽高 */\n quickMeasureWithoutCanvas(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._quickMeasureWithoutCanvas.bind(this));\n }\n protected _quickMeasureWithoutCanvas(text: string): ITextSize {\n const totalSize: ITextSize = {\n width: 0,\n height: 0\n };\n\n const { fontSize, lineHeight } = this.textSpec;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n // 判断全角字符\n const size = ['F', 'W'].includes(eastAsianCharacterInfo(char)) ? 1 : 0.53;\n totalSize.width += size * fontSize;\n }\n totalSize.height = lineHeight ?? fontSize;\n return totalSize;\n }\n\n protected _measureReduce(text: TextMeasureInput, processor: (str: string) => ITextSize): ITextSize {\n const { fontSize, lineHeight } = this.textSpec;\n const defaultResult = { width: 0, height: 0 };\n\n if (isNil(text)) {\n return defaultResult;\n } else if (isArray(text)) {\n const textArr = text.filter(isValid).map(s => s.toString());\n if (textArr.length === 0) {\n return defaultResult;\n } else if (textArr.length === 1) {\n return processor(textArr[0]);\n }\n return {\n width: textArr.reduce((maxWidth, cur) => Math.max(maxWidth, processor(cur).width), 0),\n height: textArr.length * ((lineHeight ?? fontSize) + 1) + 1 // 经验值\n };\n }\n return processor(text.toString());\n }\n\n /** 测量一个数字 */\n protected _measureNumberChar(): ITextSize {\n if (isNil(this._numberCharSize)) {\n const numberBounds = this._standardMethod(TextMeasure.NUMBERS_CHAR_SET);\n this._numberCharSize = {\n width: numberBounds.width / TextMeasure.NUMBERS_CHAR_SET.length, // 宽度取均值\n height: numberBounds.height\n };\n }\n return this._numberCharSize;\n }\n\n /** 测量一个全角字符 */\n protected _measureFullSizeChar(): ITextSize {\n if (isNil(this._fullCharSize)) {\n this._fullCharSize = this._standardMethod(TextMeasure.FULL_SIZE_CHAR);\n }\n return this._fullCharSize;\n }\n\n /** 测量一个英文字符 */\n protected _measureLetterChar(): ITextSize {\n if (isNil(this._letterCharSize)) {\n const alphabetBounds = this._standardMethod(TextMeasure.ALPHABET_CHAR_SET);\n this._letterCharSize = {\n width: alphabetBounds.width / TextMeasure.ALPHABET_CHAR_SET.length, // 宽度取均值\n height: alphabetBounds.height\n };\n }\n return this._letterCharSize;\n }\n\n /** 测量一个特殊字符 */\n protected _measureSpecialChar(char: string): Maybe<ITextSize> {\n if (isValid(this._specialCharSizeMap[char])) {\n return this._specialCharSizeMap[char];\n }\n if (this.specialCharSet.includes(char)) {\n this._specialCharSizeMap[char] = this._standardMethod(char);\n return this._specialCharSizeMap[char];\n }\n return null;\n }\n\n release() {\n if (isValid(this._canvas)) {\n this._canvas = null;\n }\n if (isValid(this._context)) {\n if (this._contextSaved) {\n this._context.restore();\n this._contextSaved = false;\n }\n this._context = null;\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphics/text/measure/util.ts"],"names":[],"mappings":";;;AAGA,SAAgB,cAAc,CAAC,IAA8B,EAAE,cAAwC,EAAE;IACvG,MAAM,EACJ,SAAS,GAAG,WAAW,CAAC,SAAS,EACjC,WAAW,GAAG,WAAW,CAAC,WAAW,EACrC,UAAU,GAAG,WAAW,CAAC,UAAU,EACnC,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAC/B,UAAU,GAAG,WAAW,CAAC,UAAU,EACpC,GAAG,IAAI,CAAC;IACT,OAAO,CACL,EAAE;QACF,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,QAAQ;QACR,KAAK;QACL,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CACzC,CAAC;AACJ,CAAC;AAjBD,wCAiBC","file":"util.js","sourcesContent":["import type { ITextFontParams } from './interface';\n\n// FIXME: from
|
|
1
|
+
{"version":3,"sources":["../src/graphics/text/measure/util.ts"],"names":[],"mappings":";;;AAGA,SAAgB,cAAc,CAAC,IAA8B,EAAE,cAAwC,EAAE;IACvG,MAAM,EACJ,SAAS,GAAG,WAAW,CAAC,SAAS,EACjC,WAAW,GAAG,WAAW,CAAC,WAAW,EACrC,UAAU,GAAG,WAAW,CAAC,UAAU,EACnC,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAC/B,UAAU,GAAG,WAAW,CAAC,UAAU,EACpC,GAAG,IAAI,CAAC;IACT,OAAO,CACL,EAAE;QACF,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,QAAQ;QACR,KAAK;QACL,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CACzC,CAAC;AACJ,CAAC;AAjBD,wCAiBC","file":"util.js","sourcesContent":["import type { ITextFontParams } from './interface';\n\n// FIXME: from VRender\nexport function getContextFont(text: Partial<ITextFontParams>, defaultAttr: Partial<ITextFontParams> = {}): string {\n const {\n fontStyle = defaultAttr.fontStyle,\n fontVariant = defaultAttr.fontVariant,\n fontWeight = defaultAttr.fontWeight,\n fontSize = defaultAttr.fontSize,\n fontFamily = defaultAttr.fontFamily\n } = text;\n return (\n '' +\n (fontStyle ? fontStyle + ' ' : '') +\n (fontVariant ? fontVariant + ' ' : '') +\n (fontWeight ? fontWeight + ' ' : '') +\n fontSize +\n 'px ' +\n (fontFamily ? fontFamily : 'sans-serif')\n );\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -325,7 +325,7 @@
|
|
|
325
325
|
var eventemitter3Exports = eventemitter3.exports;
|
|
326
326
|
var index$1 = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
|
|
327
327
|
|
|
328
|
-
const isType = (value, type) => toString.call(value) === `[object ${type}]`;
|
|
328
|
+
const isType = (value, type) => Object.prototype.toString.call(value) === `[object ${type}]`;
|
|
329
329
|
|
|
330
330
|
const isBoolean = (value, fuzzy = false) => {
|
|
331
331
|
if (fuzzy) {
|
|
@@ -3713,7 +3713,7 @@
|
|
|
3713
3713
|
_context = null;
|
|
3714
3714
|
_contextSaved = false;
|
|
3715
3715
|
_notSupportCanvas = false;
|
|
3716
|
-
|
|
3716
|
+
_notSupportVRender = false;
|
|
3717
3717
|
_userSpec = {};
|
|
3718
3718
|
textSpec;
|
|
3719
3719
|
_option;
|
|
@@ -3738,7 +3738,10 @@
|
|
|
3738
3738
|
if (isValid(this._option.getCanvasForMeasure)) {
|
|
3739
3739
|
this._canvas = this._option.getCanvasForMeasure();
|
|
3740
3740
|
}
|
|
3741
|
-
if (isNil(this._canvas) &&
|
|
3741
|
+
if (isNil(this._canvas) &&
|
|
3742
|
+
typeof window !== 'undefined' &&
|
|
3743
|
+
typeof window.document !== 'undefined' &&
|
|
3744
|
+
isValid(globalThis.document)) {
|
|
3742
3745
|
this._canvas = globalThis.document.createElement('canvas');
|
|
3743
3746
|
}
|
|
3744
3747
|
}
|
|
@@ -3775,6 +3778,7 @@
|
|
|
3775
3778
|
}
|
|
3776
3779
|
measure(text, method) {
|
|
3777
3780
|
switch (method) {
|
|
3781
|
+
case 'vrender':
|
|
3778
3782
|
case 'canopus':
|
|
3779
3783
|
return this.fullMeasure(text);
|
|
3780
3784
|
case 'canvas':
|
|
@@ -3790,7 +3794,7 @@
|
|
|
3790
3794
|
if (isNil(text)) {
|
|
3791
3795
|
return { width: 0, height: 0 };
|
|
3792
3796
|
}
|
|
3793
|
-
if (isNil(this._option.getTextBounds) || !this.
|
|
3797
|
+
if (isNil(this._option.getTextBounds) || !this._notSupportVRender) {
|
|
3794
3798
|
return this.measureWithNaiveCanvas(text);
|
|
3795
3799
|
}
|
|
3796
3800
|
const { fontFamily, fontSize, fontWeight, textAlign, textBaseline, ellipsis, limit, lineHeight } = this.textSpec;
|
|
@@ -3810,7 +3814,7 @@
|
|
|
3810
3814
|
size = { width: bounds.width(), height: bounds.height() };
|
|
3811
3815
|
}
|
|
3812
3816
|
catch (e) {
|
|
3813
|
-
this.
|
|
3817
|
+
this._notSupportVRender = true;
|
|
3814
3818
|
size = this.measureWithNaiveCanvas(text);
|
|
3815
3819
|
}
|
|
3816
3820
|
return size;
|
|
@@ -3960,7 +3964,7 @@
|
|
|
3960
3964
|
.fill(0)
|
|
3961
3965
|
.map(callback);
|
|
3962
3966
|
const methodMap = {
|
|
3963
|
-
|
|
3967
|
+
vrender: this.fullMeasure.bind(this),
|
|
3964
3968
|
canvas: this.measureWithNaiveCanvas.bind(this),
|
|
3965
3969
|
simple: this.quickMeasureWithoutCanvas.bind(this),
|
|
3966
3970
|
quick: this.quickMeasure.bind(this),
|
|
@@ -4509,19 +4513,8 @@
|
|
|
4509
4513
|
};
|
|
4510
4514
|
}
|
|
4511
4515
|
function getElementAbsolutePosition(element) {
|
|
4512
|
-
|
|
4513
|
-
|
|
4514
|
-
while (current) {
|
|
4515
|
-
actualLeft += current.offsetLeft;
|
|
4516
|
-
current = current.offsetParent;
|
|
4517
|
-
}
|
|
4518
|
-
let actualTop = element.offsetTop;
|
|
4519
|
-
current = element.offsetParent;
|
|
4520
|
-
while (current) {
|
|
4521
|
-
actualTop += current.offsetTop + current.clientTop;
|
|
4522
|
-
current = current.offsetParent;
|
|
4523
|
-
}
|
|
4524
|
-
return { x: actualLeft, y: actualTop };
|
|
4516
|
+
const { x, y } = element.getBoundingClientRect();
|
|
4517
|
+
return { x, y };
|
|
4525
4518
|
}
|
|
4526
4519
|
function getElementRelativePosition(element, base) {
|
|
4527
4520
|
const posElement = getElementAbsolutePosition(element);
|
|
@@ -4546,26 +4539,18 @@
|
|
|
4546
4539
|
}
|
|
4547
4540
|
return element.scrollTop;
|
|
4548
4541
|
};
|
|
4549
|
-
|
|
4550
|
-
|
|
4551
|
-
|
|
4552
|
-
|
|
4553
|
-
|
|
4554
|
-
|
|
4555
|
-
|
|
4556
|
-
|
|
4557
|
-
|
|
4558
|
-
|
|
4559
|
-
|
|
4560
|
-
|
|
4561
|
-
}
|
|
4562
|
-
return { x: actualLeft, y: actualTop };
|
|
4563
|
-
}
|
|
4564
|
-
function getElementRelativeScrollOffset(element, base) {
|
|
4565
|
-
const posElement = getElementAbsoluteScrollOffset(element);
|
|
4566
|
-
const posBase = getElementAbsoluteScrollOffset(base);
|
|
4567
|
-
return { x: posElement.x - posBase.x, y: posElement.y - posBase.y };
|
|
4568
|
-
}
|
|
4542
|
+
const getScaleX = (element) => {
|
|
4543
|
+
return element.getBoundingClientRect().width / element.offsetWidth;
|
|
4544
|
+
};
|
|
4545
|
+
const getScaleY = (element) => {
|
|
4546
|
+
return element.getBoundingClientRect().height / element.offsetHeight;
|
|
4547
|
+
};
|
|
4548
|
+
const getScale = (element) => {
|
|
4549
|
+
if (element.offsetWidth > 0) {
|
|
4550
|
+
return getScaleX(element);
|
|
4551
|
+
}
|
|
4552
|
+
return getScaleY(element);
|
|
4553
|
+
};
|
|
4569
4554
|
function hasParentElement(element, target) {
|
|
4570
4555
|
let parent = element.parentNode;
|
|
4571
4556
|
while (parent !== null) {
|
|
@@ -4754,14 +4739,17 @@
|
|
|
4754
4739
|
exports.getContainerSize = getContainerSize;
|
|
4755
4740
|
exports.getContextFont = getContextFont;
|
|
4756
4741
|
exports.getElementAbsolutePosition = getElementAbsolutePosition;
|
|
4757
|
-
exports.getElementAbsoluteScrollOffset = getElementAbsoluteScrollOffset;
|
|
4758
4742
|
exports.getElementRelativePosition = getElementRelativePosition;
|
|
4759
|
-
exports.getElementRelativeScrollOffset = getElementRelativeScrollOffset;
|
|
4760
4743
|
exports.getFormatFromValue = getFormatFromValue;
|
|
4761
4744
|
exports.getIntersectPoint = getIntersectPoint;
|
|
4762
4745
|
exports.getIntervalOptions = getIntervalOptions;
|
|
4763
4746
|
exports.getOBBFromLine = getOBBFromLine;
|
|
4764
4747
|
exports.getRectIntersect = getRectIntersect;
|
|
4748
|
+
exports.getScale = getScale;
|
|
4749
|
+
exports.getScaleX = getScaleX;
|
|
4750
|
+
exports.getScaleY = getScaleY;
|
|
4751
|
+
exports.getScrollLeft = getScrollLeft;
|
|
4752
|
+
exports.getScrollTop = getScrollTop;
|
|
4765
4753
|
exports.getTestNumbers = getTestNumbers;
|
|
4766
4754
|
exports.getTestWord = getTestWord;
|
|
4767
4755
|
exports.getTimeFormatter = getTimeFormatter;
|