@visactor/vrender-core 0.20.9-alpha.2 → 0.21.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/cjs/core/contributions/textMeasure/AtextMeasure.d.ts +2 -1
  2. package/cjs/core/contributions/textMeasure/AtextMeasure.js +4 -3
  3. package/cjs/core/contributions/textMeasure/AtextMeasure.js.map +1 -1
  4. package/cjs/graphic/graphic-service/graphic-service.d.ts +2 -0
  5. package/cjs/graphic/graphic-service/graphic-service.js +10 -5
  6. package/cjs/graphic/graphic-service/graphic-service.js.map +1 -1
  7. package/cjs/graphic/richtext/utils.d.ts +2 -1
  8. package/cjs/graphic/richtext/utils.js +11 -4
  9. package/cjs/graphic/richtext/utils.js.map +1 -1
  10. package/cjs/graphic/text.js +9 -6
  11. package/cjs/graphic/text.js.map +1 -1
  12. package/cjs/interface/graphic/text.d.ts +1 -1
  13. package/cjs/interface/graphic/text.js.map +1 -1
  14. package/cjs/interface/graphic-service.d.ts +2 -0
  15. package/cjs/interface/graphic-service.js.map +1 -1
  16. package/cjs/interface/text.d.ts +3 -1
  17. package/cjs/interface/text.js.map +1 -1
  18. package/cjs/plugins/builtin-plugin/dirty-bounds-plugin.js +3 -0
  19. package/cjs/plugins/builtin-plugin/dirty-bounds-plugin.js.map +1 -1
  20. package/dist/index.es.js +56 -15
  21. package/es/core/contributions/textMeasure/AtextMeasure.d.ts +2 -1
  22. package/es/core/contributions/textMeasure/AtextMeasure.js +4 -3
  23. package/es/core/contributions/textMeasure/AtextMeasure.js.map +1 -1
  24. package/es/graphic/graphic-service/graphic-service.d.ts +2 -0
  25. package/es/graphic/graphic-service/graphic-service.js +11 -4
  26. package/es/graphic/graphic-service/graphic-service.js.map +1 -1
  27. package/es/graphic/richtext/utils.d.ts +2 -1
  28. package/es/graphic/richtext/utils.js +9 -2
  29. package/es/graphic/richtext/utils.js.map +1 -1
  30. package/es/graphic/text.js +9 -6
  31. package/es/graphic/text.js.map +1 -1
  32. package/es/interface/graphic/text.d.ts +1 -1
  33. package/es/interface/graphic/text.js.map +1 -1
  34. package/es/interface/graphic-service.d.ts +2 -0
  35. package/es/interface/graphic-service.js.map +1 -1
  36. package/es/interface/text.d.ts +3 -1
  37. package/es/interface/text.js.map +1 -1
  38. package/es/plugins/builtin-plugin/dirty-bounds-plugin.js +3 -0
  39. package/es/plugins/builtin-plugin/dirty-bounds-plugin.js.map +1 -1
  40. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/graphic/text.ts"],"names":[],"mappings":"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","file":"text.js","sourcesContent":["import type { IAABBBounds, IOBBBounds } from '@visactor/vutils';\nimport { max, isArray, getContextFont, transformBoundsWithMatrix, rotatePoint } from '@visactor/vutils';\nimport { textDrawOffsetX, textLayoutOffsetY } from '../common/text';\nimport { CanvasTextLayout } from '../core/contributions/textMeasure/layout';\nimport { application } from '../application';\nimport type { IText, ITextCache, ITextGraphicAttribute, LayoutItemType, LayoutType } from '../interface';\nimport { Graphic, GRAPHIC_UPDATE_TAG_KEY, NOWORK_ANIMATE_ATTR } from './graphic';\nimport { getTheme } from './theme';\nimport { calculateLineHeight } from '../common/utils';\nimport { TEXT_NUMBER_TYPE } from './constants';\nimport { boundStroke, TextDirection, verticalLayout } from './tools';\n\nconst TEXT_UPDATE_TAG_KEY = [\n 'text',\n 'maxLineWidth',\n // 多行文本要用到\n 'textAlign',\n 'textBaseline',\n 'heightLimit',\n 'lineClamp',\n 'fontSize',\n 'fontFamily',\n 'fontWeight',\n 'ellipsis',\n 'lineHeight',\n 'direction',\n 'wordBreak',\n 'heightLimit',\n 'lineClamp',\n ...GRAPHIC_UPDATE_TAG_KEY\n];\n\nexport class Text extends Graphic<ITextGraphicAttribute> implements IText {\n type: 'text' = 'text';\n\n static NOWORK_ANIMATE_ATTR = {\n ellipsis: 1,\n wordBreak: 1,\n direction: 1,\n textAlign: 1,\n textBaseline: 1,\n fontFamily: 1,\n fontWeight: 1,\n ...NOWORK_ANIMATE_ATTR\n };\n\n cache: ITextCache;\n _font: string;\n\n protected declare obbText?: Text;\n\n get font(): string {\n const textTheme = this.getGraphicTheme();\n if (!this._font) {\n this._font = getContextFont(this.attribute, textTheme);\n }\n return this._font as string;\n }\n\n get clipedText(): string | undefined {\n const attribute = this.attribute;\n const textTheme = this.getGraphicTheme();\n if (!this.isSimplify()) {\n return undefined;\n }\n const { maxLineWidth = textTheme.maxLineWidth } = attribute;\n if (!Number.isFinite(maxLineWidth)) {\n return (attribute.text ?? textTheme.text).toString();\n }\n this.tryUpdateAABBBounds();\n return this.cache.clipedText;\n }\n get clipedWidth(): number | undefined {\n if (!this.isSimplify()) {\n return undefined;\n }\n this.tryUpdateAABBBounds();\n return this.cache.clipedWidth;\n }\n get cliped(): boolean | undefined {\n const textTheme = this.getGraphicTheme();\n const attribute = this.attribute;\n const { maxLineWidth = textTheme.maxLineWidth, text, whiteSpace = textTheme.whiteSpace } = attribute;\n if (!Number.isFinite(maxLineWidth)) {\n return false;\n }\n this.tryUpdateAABBBounds();\n if (this.cache?.layoutData?.lines) {\n let mergedText = '';\n this.cache.layoutData.lines.forEach(item => {\n mergedText += item.str;\n });\n const originText = Array.isArray(text) ? text.join('') : text;\n\n return originText !== mergedText;\n }\n if (attribute.direction === 'vertical' && this.cache.verticalList && this.cache.verticalList[0]) {\n return this.cache.verticalList[0].map(item => item.text).join('') !== attribute.text.toString();\n }\n if (this.clipedText == null) {\n return false;\n }\n return this.clipedText !== attribute.text.toString();\n }\n get multilineLayout(): LayoutType | undefined {\n if (!this.isMultiLine) {\n return undefined;\n }\n this.tryUpdateAABBBounds();\n return this.cache.layoutData;\n }\n\n // 是否是简单文字\n // 单行,横排\n private isSimplify(): boolean {\n return !this.isMultiLine && this.attribute.direction !== 'vertical';\n }\n get isMultiLine(): boolean {\n return Array.isArray(this.attribute.text) || this.attribute.whiteSpace === 'normal';\n }\n\n constructor(params: ITextGraphicAttribute = { text: '', fontSize: 16 }) {\n super(params);\n this.numberType = TEXT_NUMBER_TYPE;\n this.cache = {};\n }\n\n isValid(): boolean {\n return super.isValid() && this._isValid();\n }\n protected _isValid(): boolean {\n const { text } = this.attribute;\n if (isArray(text)) {\n return !(text as any[]).every((t: any) => t == null || t === '');\n }\n return text != null && text !== '';\n }\n\n getGraphicTheme(): Required<ITextGraphicAttribute> {\n return getTheme(this).text;\n }\n\n protected doUpdateOBBBounds(): IOBBBounds {\n const graphicTheme = this.getGraphicTheme();\n this._OBBBounds.clear();\n const attribute = this.attribute;\n const { angle = graphicTheme.angle } = attribute;\n if (!angle) {\n const b = this.AABBBounds;\n this._OBBBounds.setValue(b.x1, b.y1, b.x2, b.y2);\n return this._OBBBounds;\n }\n if (!this.obbText) {\n this.obbText = new Text({});\n }\n this.obbText.setAttributes({ ...attribute, angle: 0 });\n const bounds1 = this.obbText.AABBBounds;\n const { x, y } = attribute;\n const boundsCenter = { x: (bounds1.x1 + bounds1.x2) / 2, y: (bounds1.y1 + bounds1.y2) / 2 };\n const center = rotatePoint(boundsCenter, angle, { x, y });\n this._OBBBounds.copy(bounds1);\n this._OBBBounds.translate(center.x - boundsCenter.x, center.y - boundsCenter.y);\n this._OBBBounds.angle = angle;\n return this._OBBBounds;\n }\n\n protected updateAABBBounds(\n attribute: ITextGraphicAttribute,\n textTheme: Required<ITextGraphicAttribute>,\n aabbBounds: IAABBBounds\n ) {\n const { text = textTheme.text } = this.attribute;\n if (Array.isArray(text)) {\n this.updateMultilineAABBBounds(text as (number | string)[]);\n } else {\n this.updateSingallineAABBBounds(text as number | string);\n }\n\n const { tb1 } = application.graphicService.updateTempAABBBounds(aabbBounds);\n\n const {\n scaleX = textTheme.scaleX,\n scaleY = textTheme.scaleY,\n shadowBlur = textTheme.shadowBlur,\n strokeBoundsBuffer = textTheme.strokeBoundsBuffer\n } = attribute;\n if (shadowBlur) {\n const shadowBlurHalfWidth = shadowBlur / Math.abs(scaleX + scaleY);\n boundStroke(tb1, shadowBlurHalfWidth, true, strokeBoundsBuffer);\n aabbBounds.union(tb1);\n }\n // 合并shadowRoot的bounds\n application.graphicService.combindShadowAABBBounds(aabbBounds, this);\n\n if (attribute.forceBoundsHeight != null || attribute.forceBoundsWidth != null) {\n application.graphicService.updateHTMLTextAABBBounds(attribute, textTheme, aabbBounds);\n }\n\n transformBoundsWithMatrix(aabbBounds, aabbBounds, this.transMatrix);\n return aabbBounds;\n }\n\n /**\n * 计算多行文字的bounds,缓存每行文字的布局位置\n * 自动折行params.text是数组,因此只重新updateMultilineAABBBounds\n * @param text\n */\n updateWrapAABBBounds(text: (number | string) | (number | string)[]) {\n const textTheme = this.getGraphicTheme();\n const {\n fontFamily = textTheme.fontFamily,\n textAlign = textTheme.textAlign,\n textBaseline = textTheme.textBaseline,\n fontSize = textTheme.fontSize,\n ellipsis = textTheme.ellipsis,\n maxLineWidth,\n stroke = textTheme.stroke,\n lineWidth = textTheme.lineWidth,\n wordBreak = textTheme.wordBreak,\n fontWeight = textTheme.fontWeight,\n // widthLimit,\n ignoreBuf = textTheme.ignoreBuf,\n suffixPosition = textTheme.suffixPosition,\n heightLimit = 0,\n lineClamp\n } = this.attribute;\n const lineHeight =\n calculateLineHeight(this.attribute.lineHeight, this.attribute.fontSize || textTheme.fontSize) ??\n (this.attribute.fontSize || textTheme.fontSize);\n const buf = ignoreBuf ? 0 : 2;\n if (!this.shouldUpdateShape() && this.cache?.layoutData) {\n const bbox = this.cache.layoutData.bbox;\n this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n\n const textMeasure = application.graphicUtil.textMeasure;\n const layoutObj = new CanvasTextLayout(fontFamily, { fontSize, fontWeight, fontFamily }, textMeasure as any) as any;\n\n // layoutObj内逻辑\n const lines = isArray(text) ? (text.map(l => l.toString()) as string[]) : [text.toString()];\n const linesLayout: LayoutItemType[] = [];\n const bboxWH: [number, number] = [0, 0];\n\n let lineCountLimit = Infinity;\n if (heightLimit > 0) {\n lineCountLimit = Math.max(Math.floor(heightLimit / lineHeight), 1);\n }\n if (lineClamp) {\n // 处理行数限制\n lineCountLimit = Math.min(lineCountLimit, lineClamp);\n }\n\n if (typeof maxLineWidth === 'number' && maxLineWidth !== Infinity) {\n // widthLimit > 0\n if (maxLineWidth > 0) {\n for (let i = 0; i < lines.length; i++) {\n const str = lines[i] as string;\n let needCut = true;\n // // 测量当前行宽度\n // width = Math.min(\n // layoutObj.textMeasure.measureTextWidth(str, layoutObj.textOptions),\n // maxLineWidth\n // );\n\n // 判断是否超过高度限制\n if (i === lineCountLimit - 1) {\n // 当前行为最后一行,如果后面还有行,需要显示省略号\n const clip = layoutObj.textMeasure.clipTextWithSuffix(\n str,\n layoutObj.textOptions,\n maxLineWidth,\n ellipsis,\n false,\n suffixPosition,\n i !== lines.length - 1\n );\n linesLayout.push({\n str: clip.str,\n width: clip.width\n });\n break; // 不处理后续行\n }\n\n // 测量截断位置\n const clip = layoutObj.textMeasure.clipText(\n str,\n layoutObj.textOptions,\n maxLineWidth,\n wordBreak === 'break-word'\n );\n if (str !== '' && clip.str === '') {\n if (ellipsis) {\n const clipEllipsis = layoutObj.textMeasure.clipTextWithSuffix(\n str,\n layoutObj.textOptions,\n maxLineWidth,\n ellipsis,\n false,\n suffixPosition\n );\n clip.str = clipEllipsis.str ?? '';\n clip.width = clipEllipsis.width ?? 0;\n } else {\n // 宽度限制不足一个字符,不显示\n clip.str = '';\n clip.width = 0;\n }\n needCut = false;\n }\n\n linesLayout.push({\n str: clip.str,\n width: clip.width\n });\n if (clip.str.length === str.length) {\n // 不需要截断\n } else if (needCut) {\n const newStr = str.substring(clip.str.length);\n lines.splice(i + 1, 0, newStr);\n }\n }\n }\n // bboxWH[0] = maxLineWidth;\n let maxWidth = 0;\n linesLayout.forEach(layout => {\n maxWidth = Math.max(maxWidth, layout.width);\n });\n bboxWH[0] = maxWidth;\n } else {\n // 使用所有行中最长的作为lineWidth\n let lineWidth = 0;\n let width: number;\n let text: string;\n for (let i = 0, len = lines.length; i < len; i++) {\n // 判断是否超过高度限制\n if (i === lineCountLimit - 1) {\n // 当前行为最后一行\n const clip = layoutObj.textMeasure.clipTextWithSuffix(\n lines[i],\n layoutObj.textOptions,\n maxLineWidth,\n ellipsis,\n false,\n suffixPosition\n );\n linesLayout.push({\n str: clip.str,\n width: clip.width\n });\n lineWidth = Math.max(lineWidth, clip.width);\n break; // 不处理后续行\n }\n\n text = lines[i] as string;\n width = layoutObj.textMeasure.measureTextWidth(text, layoutObj.textOptions, wordBreak === 'break-word');\n lineWidth = Math.max(lineWidth, width);\n linesLayout.push({ str: text, width });\n }\n bboxWH[0] = lineWidth;\n }\n bboxWH[1] = linesLayout.length * (lineHeight + buf);\n\n const bbox = {\n xOffset: 0,\n yOffset: 0,\n width: bboxWH[0],\n height: bboxWH[1]\n };\n\n layoutObj.LayoutBBox(bbox, textAlign, textBaseline as any);\n\n const layoutData = layoutObj.layoutWithBBox(bbox, linesLayout, textAlign, textBaseline as any, lineHeight);\n\n // const layoutData = layoutObj.GetLayoutByLines(\n // text,\n // textAlign,\n // textBaseline as any,\n // lineHeight,\n // ellipsis === true ? (DefaultTextAttribute.ellipsis as string) : ellipsis || undefined,\n // maxLineWidth\n // );\n // const { bbox } = layoutData;\n this.cache.layoutData = layoutData;\n this.clearUpdateShapeTag();\n this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n /**\n * 计算单行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateSingallineAABBBounds(text: number | string): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const { direction = textTheme.direction, underlineOffset = textTheme.underlineOffset } = this.attribute;\n\n const b =\n direction === 'horizontal'\n ? this.updateHorizontalSinglelineAABBBounds(text)\n : this.updateVerticalSinglelineAABBBounds(text);\n if (direction === 'horizontal') {\n if (underlineOffset) {\n this._AABBBounds.add(this._AABBBounds.x1, this._AABBBounds.y2 + underlineOffset);\n }\n }\n return b;\n }\n\n /**\n * 计算单行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateMultilineAABBBounds(text: (number | string)[]): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const { direction = textTheme.direction, underlineOffset = textTheme.underlineOffset } = this.attribute;\n\n const b =\n direction === 'horizontal'\n ? this.updateHorizontalMultilineAABBBounds(text)\n : this.updateVerticalMultilineAABBBounds(text);\n\n if (direction === 'horizontal') {\n if (underlineOffset) {\n this._AABBBounds.add(this._AABBBounds.x1, this._AABBBounds.y2 + underlineOffset);\n }\n }\n return b;\n }\n\n /**\n * 计算单行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateHorizontalSinglelineAABBBounds(text: number | string): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const { wrap = textTheme.wrap } = this.attribute;\n if (wrap) {\n return this.updateWrapAABBBounds([text]);\n }\n\n const textMeasure = application.graphicUtil.textMeasure;\n let width: number;\n let str: string;\n const attribute = this.attribute;\n const {\n maxLineWidth = textTheme.maxLineWidth,\n ellipsis = textTheme.ellipsis,\n textAlign = textTheme.textAlign,\n textBaseline = textTheme.textBaseline,\n fontFamily = textTheme.fontFamily,\n fontSize = textTheme.fontSize,\n fontWeight = textTheme.fontWeight,\n stroke = textTheme.stroke,\n lineWidth = textTheme.lineWidth,\n // wordBreak = textTheme.wordBreak,\n ignoreBuf = textTheme.ignoreBuf,\n whiteSpace = textTheme.whiteSpace,\n suffixPosition = textTheme.suffixPosition\n } = attribute;\n if (whiteSpace === 'normal') {\n return this.updateWrapAABBBounds(text);\n }\n const buf = ignoreBuf ? 0 : Math.max(2, fontSize * 0.075);\n const textFontSize = attribute.fontSize || textTheme.fontSize;\n const lineHeight = calculateLineHeight(attribute.lineHeight, textFontSize) ?? textFontSize + buf;\n if (!this.shouldUpdateShape() && this.cache) {\n width = this.cache.clipedWidth ?? 0;\n const dx = textDrawOffsetX(textAlign, width);\n const dy = textLayoutOffsetY(textBaseline, lineHeight, fontSize);\n this._AABBBounds.set(dx, dy, dx + width, dy + lineHeight);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n\n if (Number.isFinite(maxLineWidth)) {\n if (ellipsis) {\n const strEllipsis = (ellipsis === true ? textTheme.ellipsis : ellipsis) as string;\n const data = textMeasure.clipTextWithSuffix(\n text.toString(),\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n strEllipsis,\n false,\n suffixPosition\n );\n str = data.str;\n width = data.width;\n } else {\n const data = textMeasure.clipText(text.toString(), { fontSize, fontWeight, fontFamily }, maxLineWidth, false);\n str = data.str;\n width = data.width;\n }\n this.cache.clipedText = str;\n this.cache.clipedWidth = width;\n // todo 计算原本的宽度\n } else {\n width = textMeasure.measureTextWidth(text.toString(), { fontSize, fontWeight, fontFamily });\n this.cache.clipedText = text.toString();\n this.cache.clipedWidth = width;\n }\n this.clearUpdateShapeTag();\n\n const dx = textDrawOffsetX(textAlign, width);\n let lh = lineHeight;\n if (application.global && application.global.isSafari()) {\n // 如果是safari,那么需要额外增加高度\n lh += fontSize * 0.2;\n }\n const dy = textLayoutOffsetY(textBaseline, lh, fontSize, buf);\n this._AABBBounds.set(dx, dy, dx + width, dy + lh);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n getBaselineMapAlign(): Record<string, string> {\n return Text.baselineMapAlign;\n }\n\n getAlignMapBaseline(): Record<string, string> {\n return Text.alignMapBaseline;\n }\n\n static baselineMapAlign = {\n top: 'left',\n bottom: 'right',\n middle: 'center'\n };\n\n static alignMapBaseline = {\n left: 'top',\n right: 'bottom',\n center: 'middle'\n };\n\n /**\n * 计算垂直布局的单行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateVerticalSinglelineAABBBounds(text: number | string): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const textMeasure = application.graphicUtil.textMeasure;\n let width: number;\n let str: string;\n const attribute = this.attribute;\n const { ignoreBuf = textTheme.ignoreBuf } = attribute;\n const buf = ignoreBuf ? 0 : 2;\n const {\n maxLineWidth = textTheme.maxLineWidth,\n ellipsis = textTheme.ellipsis,\n fontSize = textTheme.fontSize,\n fontWeight = textTheme.fontWeight,\n fontFamily = textTheme.fontFamily,\n stroke = textTheme.stroke,\n lineWidth = textTheme.lineWidth,\n verticalMode = textTheme.verticalMode,\n suffixPosition = textTheme.suffixPosition\n } = attribute;\n\n const lineHeight =\n calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize) ??\n (attribute.fontSize || textTheme.fontSize) + buf;\n\n let { textAlign = textTheme.textAlign, textBaseline = textTheme.textBaseline } = attribute;\n if (!verticalMode) {\n const t = textAlign;\n textAlign = (Text.baselineMapAlign as any)[textBaseline] ?? 'left';\n textBaseline = (Text.alignMapBaseline as any)[t] ?? 'top';\n }\n if (!this.shouldUpdateShape() && this.cache) {\n width = this.cache.clipedWidth;\n const dx = textDrawOffsetX(textAlign, width);\n const dy = textLayoutOffsetY(textBaseline, lineHeight, fontSize);\n this._AABBBounds.set(dy, dx, dy + lineHeight, dx + width);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n\n let verticalList: { text: string; width?: number; direction: TextDirection }[][] = [\n verticalLayout(text.toString())\n ];\n if (Number.isFinite(maxLineWidth)) {\n if (ellipsis) {\n const strEllipsis = (ellipsis === true ? textTheme.ellipsis : ellipsis) as string;\n const data = textMeasure.clipTextWithSuffixVertical(\n verticalList[0],\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n strEllipsis,\n false,\n suffixPosition\n );\n verticalList = [data.verticalList];\n width = data.width;\n } else {\n const data = textMeasure.clipTextVertical(\n verticalList[0],\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n false\n );\n verticalList = [data.verticalList];\n width = data.width;\n }\n this.cache.verticalList = verticalList;\n this.cache.clipedWidth = width;\n // todo 计算原本的宽度\n } else {\n width = 0;\n verticalList[0].forEach(t => {\n const w =\n t.direction === TextDirection.HORIZONTAL\n ? fontSize\n : textMeasure.measureTextWidth(t.text, { fontSize, fontWeight, fontFamily });\n\n width += w;\n t.width = w;\n });\n this.cache.verticalList = verticalList;\n this.cache.clipedWidth = width;\n }\n this.clearUpdateShapeTag();\n\n const dx = textDrawOffsetX(textAlign, width);\n const dy = textLayoutOffsetY(textBaseline, lineHeight, fontSize);\n this._AABBBounds.set(dy, dx, dy + lineHeight, dx + width);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n /**\n * 计算多行文字的bounds,缓存每行文字的布局位置\n * @param text\n */\n updateHorizontalMultilineAABBBounds(text: (number | string)[]): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const { wrap = textTheme.wrap } = this.attribute;\n if (wrap) {\n return this.updateWrapAABBBounds(text);\n }\n\n const attribute = this.attribute;\n const {\n fontFamily = textTheme.fontFamily,\n textAlign = textTheme.textAlign,\n textBaseline = textTheme.textBaseline,\n fontSize = textTheme.fontSize,\n fontWeight = textTheme.fontWeight,\n ellipsis = textTheme.ellipsis,\n maxLineWidth,\n stroke = textTheme.stroke,\n // ignoreBuf = textTheme.ignoreBuf,\n lineWidth = textTheme.lineWidth,\n whiteSpace = textTheme.whiteSpace,\n suffixPosition = textTheme.suffixPosition\n } = attribute;\n // const buf = ignoreBuf ? 0 : Math.max(2, fontSize * 0.075);\n const lineHeight =\n calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize) ??\n (attribute.fontSize || textTheme.fontSize);\n if (whiteSpace === 'normal') {\n return this.updateWrapAABBBounds(text);\n }\n if (!this.shouldUpdateShape() && this.cache?.layoutData) {\n const bbox = this.cache.layoutData.bbox;\n this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n const textMeasure = application.graphicUtil.textMeasure;\n const layoutObj = new CanvasTextLayout(fontFamily, { fontSize, fontWeight, fontFamily }, textMeasure);\n const layoutData = layoutObj.GetLayoutByLines(\n text,\n textAlign,\n textBaseline as any,\n lineHeight,\n ellipsis === true ? (textTheme.ellipsis as string) : ellipsis || undefined,\n false,\n maxLineWidth,\n suffixPosition\n );\n const { bbox } = layoutData;\n this.cache.layoutData = layoutData;\n this.clearUpdateShapeTag();\n\n this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n /**\n * 计算垂直布局的多行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateVerticalMultilineAABBBounds(text: (number | string)[]): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const textMeasure = application.graphicUtil.textMeasure;\n let width: number;\n const attribute = this.attribute;\n const { ignoreBuf = textTheme.ignoreBuf } = attribute;\n const buf = ignoreBuf ? 0 : 2;\n const {\n maxLineWidth = textTheme.maxLineWidth,\n ellipsis = textTheme.ellipsis,\n fontFamily = textTheme.fontFamily,\n fontSize = textTheme.fontSize,\n fontWeight = textTheme.fontWeight,\n stroke = textTheme.stroke,\n lineWidth = textTheme.lineWidth,\n // wordBreak = textTheme.wordBreak,\n verticalMode = textTheme.verticalMode,\n suffixPosition = textTheme.suffixPosition\n } = attribute;\n const lineHeight =\n calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize) ??\n (attribute.fontSize || textTheme.fontSize) + buf;\n let { textAlign = textTheme.textAlign, textBaseline = textTheme.textBaseline } = attribute;\n if (!verticalMode) {\n const t = textAlign;\n textAlign = (Text.baselineMapAlign as any)[textBaseline] ?? 'left';\n textBaseline = (Text.alignMapBaseline as any)[t] ?? 'top';\n }\n width = 0;\n if (!this.shouldUpdateShape() && this.cache) {\n this.cache.verticalList.forEach(item => {\n const w = item.reduce((a, b) => a + b.width, 0);\n width = max(w, width);\n });\n const dx = textDrawOffsetX(textAlign, width);\n const height = this.cache.verticalList.length * lineHeight;\n const dy = textLayoutOffsetY(textBaseline, height, fontSize);\n this._AABBBounds.set(dy, dx, dy + height, dx + width);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n\n const verticalLists: { text: string; width?: number; direction: TextDirection }[][] = text.map(str => {\n return verticalLayout(str.toString());\n });\n verticalLists.forEach((verticalData, i) => {\n if (Number.isFinite(maxLineWidth)) {\n if (ellipsis) {\n const strEllipsis = (ellipsis === true ? textTheme.ellipsis : ellipsis) as string;\n const data = textMeasure.clipTextWithSuffixVertical(\n verticalData,\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n strEllipsis,\n false,\n suffixPosition\n );\n verticalLists[i] = data.verticalList;\n width = data.width;\n } else {\n const data = textMeasure.clipTextVertical(\n verticalData,\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n false\n );\n verticalLists[i] = data.verticalList;\n width = data.width;\n }\n // this.cache.clipedWidth = width;\n // todo 计算原本的宽度\n } else {\n width = 0;\n verticalData.forEach(t => {\n const w =\n t.direction === TextDirection.HORIZONTAL\n ? fontSize\n : textMeasure.measureTextWidth(t.text, { fontSize, fontWeight, fontFamily });\n\n width += w;\n t.width = w;\n });\n }\n });\n this.cache.verticalList = verticalLists;\n this.clearUpdateShapeTag();\n\n this.cache.verticalList.forEach(item => {\n const w = item.reduce((a, b) => a + b.width, 0);\n width = max(w, width);\n });\n\n const dx = textDrawOffsetX(textAlign, width);\n const height = this.cache.verticalList.length * lineHeight;\n const dy = textLayoutOffsetY(textBaseline, height, fontSize);\n this._AABBBounds.set(dy, dx, dy + height, dx + width);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n protected needUpdateTags(keys: string[], k = TEXT_UPDATE_TAG_KEY): boolean {\n return super.needUpdateTags(keys, k);\n }\n protected needUpdateTag(key: string, k = TEXT_UPDATE_TAG_KEY): boolean {\n return super.needUpdateTag(key, k);\n }\n\n clone(): Text {\n return new Text({ ...this.attribute });\n }\n\n getNoWorkAnimateAttr(): Record<string, number> {\n return Text.NOWORK_ANIMATE_ATTR;\n }\n}\n\nexport function createText(attributes: ITextGraphicAttribute): IText {\n return new Text(attributes);\n}\n\n// addAttributeToPrototype(DefaultLineStyle, Text, PURE_STYLE_KEY);\n"]}
1
+ {"version":3,"sources":["../src/graphic/text.ts"],"names":[],"mappings":"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","file":"text.js","sourcesContent":["import type { IAABBBounds, IOBBBounds } from '@visactor/vutils';\nimport { max, isArray, getContextFont, transformBoundsWithMatrix, rotatePoint } from '@visactor/vutils';\nimport { textDrawOffsetX, textLayoutOffsetY } from '../common/text';\nimport { CanvasTextLayout } from '../core/contributions/textMeasure/layout';\nimport { application } from '../application';\nimport type { IText, ITextCache, ITextGraphicAttribute, LayoutItemType, LayoutType } from '../interface';\nimport { Graphic, GRAPHIC_UPDATE_TAG_KEY, NOWORK_ANIMATE_ATTR } from './graphic';\nimport { getTheme } from './theme';\nimport { calculateLineHeight } from '../common/utils';\nimport { TEXT_NUMBER_TYPE } from './constants';\nimport { boundStroke, TextDirection, verticalLayout } from './tools';\n\nconst TEXT_UPDATE_TAG_KEY = [\n 'text',\n 'maxLineWidth',\n // 多行文本要用到\n 'textAlign',\n 'textBaseline',\n 'heightLimit',\n 'lineClamp',\n 'fontSize',\n 'fontFamily',\n 'fontWeight',\n 'ellipsis',\n 'lineHeight',\n 'direction',\n 'wordBreak',\n 'heightLimit',\n 'lineClamp',\n ...GRAPHIC_UPDATE_TAG_KEY\n];\n\nexport class Text extends Graphic<ITextGraphicAttribute> implements IText {\n type: 'text' = 'text';\n\n static NOWORK_ANIMATE_ATTR = {\n ellipsis: 1,\n wordBreak: 1,\n direction: 1,\n textAlign: 1,\n textBaseline: 1,\n fontFamily: 1,\n fontWeight: 1,\n ...NOWORK_ANIMATE_ATTR\n };\n\n cache: ITextCache;\n _font: string;\n\n protected declare obbText?: Text;\n\n get font(): string {\n const textTheme = this.getGraphicTheme();\n if (!this._font) {\n this._font = getContextFont(this.attribute, textTheme);\n }\n return this._font as string;\n }\n\n get clipedText(): string | undefined {\n const attribute = this.attribute;\n const textTheme = this.getGraphicTheme();\n if (!this.isSimplify()) {\n return undefined;\n }\n const { maxLineWidth = textTheme.maxLineWidth } = attribute;\n if (!Number.isFinite(maxLineWidth)) {\n return (attribute.text ?? textTheme.text).toString();\n }\n this.tryUpdateAABBBounds();\n return this.cache.clipedText;\n }\n get clipedWidth(): number | undefined {\n if (!this.isSimplify()) {\n return undefined;\n }\n this.tryUpdateAABBBounds();\n return this.cache.clipedWidth;\n }\n get cliped(): boolean | undefined {\n const textTheme = this.getGraphicTheme();\n const attribute = this.attribute;\n const { maxLineWidth = textTheme.maxLineWidth, text, whiteSpace = textTheme.whiteSpace } = attribute;\n if (!Number.isFinite(maxLineWidth)) {\n return false;\n }\n this.tryUpdateAABBBounds();\n if (this.cache?.layoutData?.lines) {\n let mergedText = '';\n this.cache.layoutData.lines.forEach(item => {\n mergedText += item.str;\n });\n const originText = Array.isArray(text) ? text.join('') : text;\n\n return originText !== mergedText;\n }\n if (attribute.direction === 'vertical' && this.cache.verticalList && this.cache.verticalList[0]) {\n return this.cache.verticalList[0].map(item => item.text).join('') !== attribute.text.toString();\n }\n if (this.clipedText == null) {\n return false;\n }\n return this.clipedText !== attribute.text.toString();\n }\n get multilineLayout(): LayoutType | undefined {\n if (!this.isMultiLine) {\n return undefined;\n }\n this.tryUpdateAABBBounds();\n return this.cache.layoutData;\n }\n\n // 是否是简单文字\n // 单行,横排\n private isSimplify(): boolean {\n return !this.isMultiLine && this.attribute.direction !== 'vertical';\n }\n get isMultiLine(): boolean {\n return Array.isArray(this.attribute.text) || this.attribute.whiteSpace === 'normal';\n }\n\n constructor(params: ITextGraphicAttribute = { text: '', fontSize: 16 }) {\n super(params);\n this.numberType = TEXT_NUMBER_TYPE;\n this.cache = {};\n }\n\n isValid(): boolean {\n return super.isValid() && this._isValid();\n }\n protected _isValid(): boolean {\n const { text } = this.attribute;\n if (isArray(text)) {\n return !(text as any[]).every((t: any) => t == null || t === '');\n }\n return text != null && text !== '';\n }\n\n getGraphicTheme(): Required<ITextGraphicAttribute> {\n return getTheme(this).text;\n }\n\n protected doUpdateOBBBounds(): IOBBBounds {\n const graphicTheme = this.getGraphicTheme();\n this._OBBBounds.clear();\n const attribute = this.attribute;\n const { angle = graphicTheme.angle } = attribute;\n if (!angle) {\n const b = this.AABBBounds;\n this._OBBBounds.setValue(b.x1, b.y1, b.x2, b.y2);\n return this._OBBBounds;\n }\n if (!this.obbText) {\n this.obbText = new Text({});\n }\n this.obbText.setAttributes({ ...attribute, angle: 0 });\n const bounds1 = this.obbText.AABBBounds;\n const { x, y } = attribute;\n const boundsCenter = { x: (bounds1.x1 + bounds1.x2) / 2, y: (bounds1.y1 + bounds1.y2) / 2 };\n const center = rotatePoint(boundsCenter, angle, { x, y });\n this._OBBBounds.copy(bounds1);\n this._OBBBounds.translate(center.x - boundsCenter.x, center.y - boundsCenter.y);\n this._OBBBounds.angle = angle;\n return this._OBBBounds;\n }\n\n protected updateAABBBounds(\n attribute: ITextGraphicAttribute,\n textTheme: Required<ITextGraphicAttribute>,\n aabbBounds: IAABBBounds\n ) {\n const { text = textTheme.text } = this.attribute;\n if (Array.isArray(text)) {\n this.updateMultilineAABBBounds(text as (number | string)[]);\n } else {\n this.updateSingallineAABBBounds(text as number | string);\n }\n\n const { tb1 } = application.graphicService.updateTempAABBBounds(aabbBounds);\n\n const {\n scaleX = textTheme.scaleX,\n scaleY = textTheme.scaleY,\n shadowBlur = textTheme.shadowBlur,\n strokeBoundsBuffer = textTheme.strokeBoundsBuffer\n } = attribute;\n if (shadowBlur) {\n const shadowBlurHalfWidth = shadowBlur / Math.abs(scaleX + scaleY);\n boundStroke(tb1, shadowBlurHalfWidth, true, strokeBoundsBuffer);\n aabbBounds.union(tb1);\n }\n // 合并shadowRoot的bounds\n application.graphicService.combindShadowAABBBounds(aabbBounds, this);\n\n if (attribute.forceBoundsHeight != null || attribute.forceBoundsWidth != null) {\n application.graphicService.updateHTMLTextAABBBounds(attribute, textTheme, aabbBounds);\n }\n\n transformBoundsWithMatrix(aabbBounds, aabbBounds, this.transMatrix);\n return aabbBounds;\n }\n\n /**\n * 计算多行文字的bounds,缓存每行文字的布局位置\n * 自动折行params.text是数组,因此只重新updateMultilineAABBBounds\n * @param text\n */\n updateWrapAABBBounds(text: (number | string) | (number | string)[]) {\n const textTheme = this.getGraphicTheme();\n const {\n fontFamily = textTheme.fontFamily,\n textAlign = textTheme.textAlign,\n textBaseline = textTheme.textBaseline,\n fontSize = textTheme.fontSize,\n ellipsis = textTheme.ellipsis,\n maxLineWidth,\n stroke = textTheme.stroke,\n lineWidth = textTheme.lineWidth,\n wordBreak = textTheme.wordBreak,\n fontWeight = textTheme.fontWeight,\n // widthLimit,\n ignoreBuf = textTheme.ignoreBuf,\n suffixPosition = textTheme.suffixPosition,\n heightLimit = 0,\n lineClamp\n } = this.attribute;\n const lineHeight =\n calculateLineHeight(this.attribute.lineHeight, this.attribute.fontSize || textTheme.fontSize) ??\n (this.attribute.fontSize || textTheme.fontSize);\n const buf = ignoreBuf ? 0 : 2;\n if (!this.shouldUpdateShape() && this.cache?.layoutData) {\n const bbox = this.cache.layoutData.bbox;\n this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n\n const textMeasure = application.graphicUtil.textMeasure;\n const layoutObj = new CanvasTextLayout(fontFamily, { fontSize, fontWeight, fontFamily }, textMeasure as any) as any;\n\n // layoutObj内逻辑\n const lines = isArray(text) ? (text.map(l => l.toString()) as string[]) : [text.toString()];\n const linesLayout: LayoutItemType[] = [];\n const bboxWH: [number, number] = [0, 0];\n\n let lineCountLimit = Infinity;\n if (heightLimit > 0) {\n lineCountLimit = Math.max(Math.floor(heightLimit / lineHeight), 1);\n }\n if (lineClamp) {\n // 处理行数限制\n lineCountLimit = Math.min(lineCountLimit, lineClamp);\n }\n\n if (typeof maxLineWidth === 'number' && maxLineWidth !== Infinity) {\n // widthLimit > 0\n if (maxLineWidth > 0) {\n for (let i = 0; i < lines.length; i++) {\n const str = lines[i] as string;\n let needCut = true;\n // // 测量当前行宽度\n // width = Math.min(\n // layoutObj.textMeasure.measureTextWidth(str, layoutObj.textOptions),\n // maxLineWidth\n // );\n\n // 判断是否超过高度限制\n if (i === lineCountLimit - 1) {\n // 当前行为最后一行,如果后面还有行,需要显示省略号\n const clip = layoutObj.textMeasure.clipTextWithSuffix(\n str,\n layoutObj.textOptions,\n maxLineWidth,\n ellipsis,\n false,\n suffixPosition,\n i !== lines.length - 1\n );\n linesLayout.push({\n str: clip.str,\n width: clip.width\n });\n break; // 不处理后续行\n }\n\n // 测量截断位置\n const clip = layoutObj.textMeasure.clipText(\n str,\n layoutObj.textOptions,\n maxLineWidth,\n wordBreak !== 'break-all',\n wordBreak === 'keep-all'\n );\n if ((str !== '' && clip.str === '') || clip.wordBreaked) {\n if (ellipsis) {\n const clipEllipsis = layoutObj.textMeasure.clipTextWithSuffix(\n str,\n layoutObj.textOptions,\n maxLineWidth,\n ellipsis,\n false,\n suffixPosition\n );\n clip.str = clipEllipsis.str ?? '';\n clip.width = clipEllipsis.width ?? 0;\n } else {\n // 宽度限制不足一个字符,不显示\n clip.str = '';\n clip.width = 0;\n }\n needCut = false;\n }\n\n linesLayout.push({\n str: clip.str,\n width: clip.width\n });\n let cutLength = clip.str.length;\n if (clip.wordBreaked && !(str !== '' && clip.str === '')) {\n needCut = true;\n cutLength = clip.wordBreaked;\n }\n if (clip.str.length === str.length) {\n // 不需要截断\n } else if (needCut) {\n let newStr = str.substring(cutLength);\n // 截断后,避免开头有空格很尬,去掉\n if (wordBreak === 'keep-all') {\n newStr = newStr.replace(/^\\s+/g, '');\n }\n lines.splice(i + 1, 0, newStr);\n }\n }\n }\n // bboxWH[0] = maxLineWidth;\n let maxWidth = 0;\n linesLayout.forEach(layout => {\n maxWidth = Math.max(maxWidth, layout.width);\n });\n bboxWH[0] = maxWidth;\n } else {\n // 使用所有行中最长的作为lineWidth\n let lineWidth = 0;\n let width: number;\n let text: string;\n for (let i = 0, len = lines.length; i < len; i++) {\n // 判断是否超过高度限制\n if (i === lineCountLimit - 1) {\n // 当前行为最后一行\n const clip = layoutObj.textMeasure.clipTextWithSuffix(\n lines[i],\n layoutObj.textOptions,\n maxLineWidth,\n ellipsis,\n false,\n suffixPosition\n );\n linesLayout.push({\n str: clip.str,\n width: clip.width\n });\n lineWidth = Math.max(lineWidth, clip.width);\n break; // 不处理后续行\n }\n\n text = lines[i] as string;\n width = layoutObj.textMeasure.measureTextWidth(text, layoutObj.textOptions, wordBreak === 'break-word');\n lineWidth = Math.max(lineWidth, width);\n linesLayout.push({ str: text, width });\n }\n bboxWH[0] = lineWidth;\n }\n bboxWH[1] = linesLayout.length * (lineHeight + buf);\n\n const bbox = {\n xOffset: 0,\n yOffset: 0,\n width: bboxWH[0],\n height: bboxWH[1]\n };\n\n layoutObj.LayoutBBox(bbox, textAlign, textBaseline as any);\n\n const layoutData = layoutObj.layoutWithBBox(bbox, linesLayout, textAlign, textBaseline as any, lineHeight);\n\n // const layoutData = layoutObj.GetLayoutByLines(\n // text,\n // textAlign,\n // textBaseline as any,\n // lineHeight,\n // ellipsis === true ? (DefaultTextAttribute.ellipsis as string) : ellipsis || undefined,\n // maxLineWidth\n // );\n // const { bbox } = layoutData;\n this.cache.layoutData = layoutData;\n this.clearUpdateShapeTag();\n this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n /**\n * 计算单行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateSingallineAABBBounds(text: number | string): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const { direction = textTheme.direction, underlineOffset = textTheme.underlineOffset } = this.attribute;\n\n const b =\n direction === 'horizontal'\n ? this.updateHorizontalSinglelineAABBBounds(text)\n : this.updateVerticalSinglelineAABBBounds(text);\n if (direction === 'horizontal') {\n if (underlineOffset) {\n this._AABBBounds.add(this._AABBBounds.x1, this._AABBBounds.y2 + underlineOffset);\n }\n }\n return b;\n }\n\n /**\n * 计算单行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateMultilineAABBBounds(text: (number | string)[]): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const { direction = textTheme.direction, underlineOffset = textTheme.underlineOffset } = this.attribute;\n\n const b =\n direction === 'horizontal'\n ? this.updateHorizontalMultilineAABBBounds(text)\n : this.updateVerticalMultilineAABBBounds(text);\n\n if (direction === 'horizontal') {\n if (underlineOffset) {\n this._AABBBounds.add(this._AABBBounds.x1, this._AABBBounds.y2 + underlineOffset);\n }\n }\n return b;\n }\n\n /**\n * 计算单行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateHorizontalSinglelineAABBBounds(text: number | string): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const { wrap = textTheme.wrap } = this.attribute;\n if (wrap) {\n return this.updateWrapAABBBounds([text]);\n }\n\n const textMeasure = application.graphicUtil.textMeasure;\n let width: number;\n let str: string;\n const attribute = this.attribute;\n const {\n maxLineWidth = textTheme.maxLineWidth,\n ellipsis = textTheme.ellipsis,\n textAlign = textTheme.textAlign,\n textBaseline = textTheme.textBaseline,\n fontFamily = textTheme.fontFamily,\n fontSize = textTheme.fontSize,\n fontWeight = textTheme.fontWeight,\n stroke = textTheme.stroke,\n lineWidth = textTheme.lineWidth,\n // wordBreak = textTheme.wordBreak,\n ignoreBuf = textTheme.ignoreBuf,\n whiteSpace = textTheme.whiteSpace,\n suffixPosition = textTheme.suffixPosition\n } = attribute;\n if (whiteSpace === 'normal') {\n return this.updateWrapAABBBounds(text);\n }\n const buf = ignoreBuf ? 0 : Math.max(2, fontSize * 0.075);\n const textFontSize = attribute.fontSize || textTheme.fontSize;\n const lineHeight = calculateLineHeight(attribute.lineHeight, textFontSize) ?? textFontSize + buf;\n if (!this.shouldUpdateShape() && this.cache) {\n width = this.cache.clipedWidth ?? 0;\n const dx = textDrawOffsetX(textAlign, width);\n const dy = textLayoutOffsetY(textBaseline, lineHeight, fontSize);\n this._AABBBounds.set(dx, dy, dx + width, dy + lineHeight);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n\n if (Number.isFinite(maxLineWidth)) {\n if (ellipsis) {\n const strEllipsis = (ellipsis === true ? textTheme.ellipsis : ellipsis) as string;\n const data = textMeasure.clipTextWithSuffix(\n text.toString(),\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n strEllipsis,\n false,\n suffixPosition\n );\n str = data.str;\n width = data.width;\n } else {\n const data = textMeasure.clipText(text.toString(), { fontSize, fontWeight, fontFamily }, maxLineWidth, false);\n str = data.str;\n width = data.width;\n }\n this.cache.clipedText = str;\n this.cache.clipedWidth = width;\n // todo 计算原本的宽度\n } else {\n width = textMeasure.measureTextWidth(text.toString(), { fontSize, fontWeight, fontFamily });\n this.cache.clipedText = text.toString();\n this.cache.clipedWidth = width;\n }\n this.clearUpdateShapeTag();\n\n const dx = textDrawOffsetX(textAlign, width);\n let lh = lineHeight;\n if (application.global && application.global.isSafari()) {\n // 如果是safari,那么需要额外增加高度\n lh += fontSize * 0.2;\n }\n const dy = textLayoutOffsetY(textBaseline, lh, fontSize, buf);\n this._AABBBounds.set(dx, dy, dx + width, dy + lh);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n getBaselineMapAlign(): Record<string, string> {\n return Text.baselineMapAlign;\n }\n\n getAlignMapBaseline(): Record<string, string> {\n return Text.alignMapBaseline;\n }\n\n static baselineMapAlign = {\n top: 'left',\n bottom: 'right',\n middle: 'center'\n };\n\n static alignMapBaseline = {\n left: 'top',\n right: 'bottom',\n center: 'middle'\n };\n\n /**\n * 计算垂直布局的单行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateVerticalSinglelineAABBBounds(text: number | string): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const textMeasure = application.graphicUtil.textMeasure;\n let width: number;\n let str: string;\n const attribute = this.attribute;\n const { ignoreBuf = textTheme.ignoreBuf } = attribute;\n const buf = ignoreBuf ? 0 : 2;\n const {\n maxLineWidth = textTheme.maxLineWidth,\n ellipsis = textTheme.ellipsis,\n fontSize = textTheme.fontSize,\n fontWeight = textTheme.fontWeight,\n fontFamily = textTheme.fontFamily,\n stroke = textTheme.stroke,\n lineWidth = textTheme.lineWidth,\n verticalMode = textTheme.verticalMode,\n suffixPosition = textTheme.suffixPosition\n } = attribute;\n\n const lineHeight =\n calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize) ??\n (attribute.fontSize || textTheme.fontSize) + buf;\n\n let { textAlign = textTheme.textAlign, textBaseline = textTheme.textBaseline } = attribute;\n if (!verticalMode) {\n const t = textAlign;\n textAlign = (Text.baselineMapAlign as any)[textBaseline] ?? 'left';\n textBaseline = (Text.alignMapBaseline as any)[t] ?? 'top';\n }\n if (!this.shouldUpdateShape() && this.cache) {\n width = this.cache.clipedWidth;\n const dx = textDrawOffsetX(textAlign, width);\n const dy = textLayoutOffsetY(textBaseline, lineHeight, fontSize);\n this._AABBBounds.set(dy, dx, dy + lineHeight, dx + width);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n\n let verticalList: { text: string; width?: number; direction: TextDirection }[][] = [\n verticalLayout(text.toString())\n ];\n if (Number.isFinite(maxLineWidth)) {\n if (ellipsis) {\n const strEllipsis = (ellipsis === true ? textTheme.ellipsis : ellipsis) as string;\n const data = textMeasure.clipTextWithSuffixVertical(\n verticalList[0],\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n strEllipsis,\n false,\n suffixPosition\n );\n verticalList = [data.verticalList];\n width = data.width;\n } else {\n const data = textMeasure.clipTextVertical(\n verticalList[0],\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n false\n );\n verticalList = [data.verticalList];\n width = data.width;\n }\n this.cache.verticalList = verticalList;\n this.cache.clipedWidth = width;\n // todo 计算原本的宽度\n } else {\n width = 0;\n verticalList[0].forEach(t => {\n const w =\n t.direction === TextDirection.HORIZONTAL\n ? fontSize\n : textMeasure.measureTextWidth(t.text, { fontSize, fontWeight, fontFamily });\n\n width += w;\n t.width = w;\n });\n this.cache.verticalList = verticalList;\n this.cache.clipedWidth = width;\n }\n this.clearUpdateShapeTag();\n\n const dx = textDrawOffsetX(textAlign, width);\n const dy = textLayoutOffsetY(textBaseline, lineHeight, fontSize);\n this._AABBBounds.set(dy, dx, dy + lineHeight, dx + width);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n /**\n * 计算多行文字的bounds,缓存每行文字的布局位置\n * @param text\n */\n updateHorizontalMultilineAABBBounds(text: (number | string)[]): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const { wrap = textTheme.wrap } = this.attribute;\n if (wrap) {\n return this.updateWrapAABBBounds(text);\n }\n\n const attribute = this.attribute;\n const {\n fontFamily = textTheme.fontFamily,\n textAlign = textTheme.textAlign,\n textBaseline = textTheme.textBaseline,\n fontSize = textTheme.fontSize,\n fontWeight = textTheme.fontWeight,\n ellipsis = textTheme.ellipsis,\n maxLineWidth,\n stroke = textTheme.stroke,\n // ignoreBuf = textTheme.ignoreBuf,\n lineWidth = textTheme.lineWidth,\n whiteSpace = textTheme.whiteSpace,\n suffixPosition = textTheme.suffixPosition\n } = attribute;\n // const buf = ignoreBuf ? 0 : Math.max(2, fontSize * 0.075);\n const lineHeight =\n calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize) ??\n (attribute.fontSize || textTheme.fontSize);\n if (whiteSpace === 'normal') {\n return this.updateWrapAABBBounds(text);\n }\n if (!this.shouldUpdateShape() && this.cache?.layoutData) {\n const bbox = this.cache.layoutData.bbox;\n this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n const textMeasure = application.graphicUtil.textMeasure;\n const layoutObj = new CanvasTextLayout(fontFamily, { fontSize, fontWeight, fontFamily }, textMeasure);\n const layoutData = layoutObj.GetLayoutByLines(\n text,\n textAlign,\n textBaseline as any,\n lineHeight,\n ellipsis === true ? (textTheme.ellipsis as string) : ellipsis || undefined,\n false,\n maxLineWidth,\n suffixPosition\n );\n const { bbox } = layoutData;\n this.cache.layoutData = layoutData;\n this.clearUpdateShapeTag();\n\n this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n /**\n * 计算垂直布局的多行文字的bounds,可以缓存长度以及截取的文字\n * @param text\n */\n updateVerticalMultilineAABBBounds(text: (number | string)[]): IAABBBounds {\n const textTheme = this.getGraphicTheme();\n const textMeasure = application.graphicUtil.textMeasure;\n let width: number;\n const attribute = this.attribute;\n const { ignoreBuf = textTheme.ignoreBuf } = attribute;\n const buf = ignoreBuf ? 0 : 2;\n const {\n maxLineWidth = textTheme.maxLineWidth,\n ellipsis = textTheme.ellipsis,\n fontFamily = textTheme.fontFamily,\n fontSize = textTheme.fontSize,\n fontWeight = textTheme.fontWeight,\n stroke = textTheme.stroke,\n lineWidth = textTheme.lineWidth,\n // wordBreak = textTheme.wordBreak,\n verticalMode = textTheme.verticalMode,\n suffixPosition = textTheme.suffixPosition\n } = attribute;\n const lineHeight =\n calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize) ??\n (attribute.fontSize || textTheme.fontSize) + buf;\n let { textAlign = textTheme.textAlign, textBaseline = textTheme.textBaseline } = attribute;\n if (!verticalMode) {\n const t = textAlign;\n textAlign = (Text.baselineMapAlign as any)[textBaseline] ?? 'left';\n textBaseline = (Text.alignMapBaseline as any)[t] ?? 'top';\n }\n width = 0;\n if (!this.shouldUpdateShape() && this.cache) {\n this.cache.verticalList.forEach(item => {\n const w = item.reduce((a, b) => a + b.width, 0);\n width = max(w, width);\n });\n const dx = textDrawOffsetX(textAlign, width);\n const height = this.cache.verticalList.length * lineHeight;\n const dy = textLayoutOffsetY(textBaseline, height, fontSize);\n this._AABBBounds.set(dy, dx, dy + height, dx + width);\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n return this._AABBBounds;\n }\n\n const verticalLists: { text: string; width?: number; direction: TextDirection }[][] = text.map(str => {\n return verticalLayout(str.toString());\n });\n verticalLists.forEach((verticalData, i) => {\n if (Number.isFinite(maxLineWidth)) {\n if (ellipsis) {\n const strEllipsis = (ellipsis === true ? textTheme.ellipsis : ellipsis) as string;\n const data = textMeasure.clipTextWithSuffixVertical(\n verticalData,\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n strEllipsis,\n false,\n suffixPosition\n );\n verticalLists[i] = data.verticalList;\n width = data.width;\n } else {\n const data = textMeasure.clipTextVertical(\n verticalData,\n { fontSize, fontWeight, fontFamily },\n maxLineWidth,\n false\n );\n verticalLists[i] = data.verticalList;\n width = data.width;\n }\n // this.cache.clipedWidth = width;\n // todo 计算原本的宽度\n } else {\n width = 0;\n verticalData.forEach(t => {\n const w =\n t.direction === TextDirection.HORIZONTAL\n ? fontSize\n : textMeasure.measureTextWidth(t.text, { fontSize, fontWeight, fontFamily });\n\n width += w;\n t.width = w;\n });\n }\n });\n this.cache.verticalList = verticalLists;\n this.clearUpdateShapeTag();\n\n this.cache.verticalList.forEach(item => {\n const w = item.reduce((a, b) => a + b.width, 0);\n width = max(w, width);\n });\n\n const dx = textDrawOffsetX(textAlign, width);\n const height = this.cache.verticalList.length * lineHeight;\n const dy = textLayoutOffsetY(textBaseline, height, fontSize);\n this._AABBBounds.set(dy, dx, dy + height, dx + width);\n\n if (stroke) {\n this._AABBBounds.expand(lineWidth / 2);\n }\n\n return this._AABBBounds;\n }\n\n protected needUpdateTags(keys: string[], k = TEXT_UPDATE_TAG_KEY): boolean {\n return super.needUpdateTags(keys, k);\n }\n protected needUpdateTag(key: string, k = TEXT_UPDATE_TAG_KEY): boolean {\n return super.needUpdateTag(key, k);\n }\n\n clone(): Text {\n return new Text({ ...this.attribute });\n }\n\n getNoWorkAnimateAttr(): Record<string, number> {\n return Text.NOWORK_ANIMATE_ATTR;\n }\n}\n\nexport function createText(attributes: ITextGraphicAttribute): IText {\n return new Text(attributes);\n}\n\n// addAttributeToPrototype(DefaultLineStyle, Text, PURE_STYLE_KEY);\n"]}
@@ -42,7 +42,7 @@ export type ITextAttribute = {
42
42
  scaleIn3d: boolean;
43
43
  direction: 'horizontal' | 'vertical';
44
44
  verticalMode: number;
45
- wordBreak: 'break-word' | 'break-all';
45
+ wordBreak: 'break-word' | 'break-all' | 'keep-all';
46
46
  ignoreBuf: boolean;
47
47
  heightLimit: number;
48
48
  lineClamp: number;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/graphic/text.ts"],"names":[],"mappings":"","file":"text.js","sourcesContent":["import type { IAABBBounds } from '@visactor/vutils';\nimport type { IGraphicAttribute, IGraphic } from '../graphic';\n\nexport interface TextLayoutBBox {\n width: number; // 包围盒的宽度\n height: number; // 包围盒的高度\n xOffset: number;\n yOffset: number;\n}\n\nexport interface LayoutItemType {\n str: string; // 这行的字符串\n leftOffset?: number; // 该行距离左侧的偏移\n topOffset?: number; // 该行距离右侧的偏移\n width: number;\n}\n\nexport interface SimplifyLayoutType {\n lines: LayoutItemType[];\n}\n\nexport interface LayoutType {\n bbox: TextLayoutBBox;\n lines: LayoutItemType[];\n fontFamily: string;\n fontSize: number;\n fontWeight?: string | number;\n lineHeight: number;\n textAlign: TextAlignType;\n textBaseline: TextBaselineType;\n}\n\nexport type ITextAttribute = {\n text: string | number | string[] | number[];\n maxLineWidth: number;\n textAlign: TextAlignType;\n textBaseline: TextBaselineType;\n fontSize: number;\n fontFamily: string;\n fontWeight: string | number;\n ellipsis: boolean | string;\n fontVariant: string;\n fontStyle: string;\n lineHeight: number | string;\n underline: number;\n lineThrough: number;\n scaleIn3d: boolean;\n direction: 'horizontal' | 'vertical';\n verticalMode: number; // 垂直布局的模式,0代表默认(横向textAlign,纵向textBaseline),1代表特殊(横向textBaseline,纵向textAlign)\n wordBreak: 'break-word' | 'break-all';\n ignoreBuf: boolean;\n heightLimit: number;\n lineClamp: number;\n wrap: boolean;\n whiteSpace: 'normal' | 'no-wrap';\n suffixPosition: 'start' | 'end' | 'middle';\n underlineDash: number[];\n underlineOffset: number;\n // textDecoration: number;\n // textDecorationWidth: number;\n // padding?: number | number[];\n disableAutoClipedPoptip?: boolean;\n};\nexport type ITextCache = {\n // 单行文本的时候缓存用\n clipedText?: string;\n clipedWidth?: number;\n // 多行文本的布局缓存\n layoutData?: LayoutType;\n verticalList?: { text: string; width?: number; direction: number }[][];\n};\n\nexport type ITextGraphicAttribute = Partial<IGraphicAttribute> & Partial<ITextAttribute>;\n\nexport type IWrapTextGraphicAttribute = ITextGraphicAttribute & {\n heightLimit?: number;\n lineClamp?: number;\n};\n\nexport interface IText extends IGraphic<ITextGraphicAttribute> {\n // 判断是否被ellipisised\n clipedText?: string;\n clipedWidth?: number;\n cliped?: boolean;\n multilineLayout?: LayoutType;\n font?: string;\n isMultiLine: boolean;\n cache?: ITextCache;\n\n getBaselineMapAlign: () => Record<string, string>;\n getAlignMapBaseline: () => Record<string, string>;\n\n updateMultilineAABBBounds: (text: (number | string)[]) => IAABBBounds;\n updateSingallineAABBBounds: (text: number | string) => IAABBBounds;\n}\n\nexport type TextAlignType = 'left' | 'right' | 'center' | 'start' | 'end';\nexport type TextBaselineType = 'top' | 'middle' | 'bottom' | 'alphabetic';\n"]}
1
+ {"version":3,"sources":["../src/interface/graphic/text.ts"],"names":[],"mappings":"","file":"text.js","sourcesContent":["import type { IAABBBounds } from '@visactor/vutils';\nimport type { IGraphicAttribute, IGraphic } from '../graphic';\n\nexport interface TextLayoutBBox {\n width: number; // 包围盒的宽度\n height: number; // 包围盒的高度\n xOffset: number;\n yOffset: number;\n}\n\nexport interface LayoutItemType {\n str: string; // 这行的字符串\n leftOffset?: number; // 该行距离左侧的偏移\n topOffset?: number; // 该行距离右侧的偏移\n width: number;\n}\n\nexport interface SimplifyLayoutType {\n lines: LayoutItemType[];\n}\n\nexport interface LayoutType {\n bbox: TextLayoutBBox;\n lines: LayoutItemType[];\n fontFamily: string;\n fontSize: number;\n fontWeight?: string | number;\n lineHeight: number;\n textAlign: TextAlignType;\n textBaseline: TextBaselineType;\n}\n\nexport type ITextAttribute = {\n text: string | number | string[] | number[];\n maxLineWidth: number;\n textAlign: TextAlignType;\n textBaseline: TextBaselineType;\n fontSize: number;\n fontFamily: string;\n fontWeight: string | number;\n ellipsis: boolean | string;\n fontVariant: string;\n fontStyle: string;\n lineHeight: number | string;\n underline: number;\n lineThrough: number;\n scaleIn3d: boolean;\n direction: 'horizontal' | 'vertical';\n verticalMode: number; // 垂直布局的模式,0代表默认(横向textAlign,纵向textBaseline),1代表特殊(横向textBaseline,纵向textAlign)\n wordBreak: 'break-word' | 'break-all' | 'keep-all';\n ignoreBuf: boolean;\n heightLimit: number;\n lineClamp: number;\n wrap: boolean;\n whiteSpace: 'normal' | 'no-wrap';\n suffixPosition: 'start' | 'end' | 'middle';\n underlineDash: number[];\n underlineOffset: number;\n // textDecoration: number;\n // textDecorationWidth: number;\n // padding?: number | number[];\n disableAutoClipedPoptip?: boolean;\n};\nexport type ITextCache = {\n // 单行文本的时候缓存用\n clipedText?: string;\n clipedWidth?: number;\n // 多行文本的布局缓存\n layoutData?: LayoutType;\n verticalList?: { text: string; width?: number; direction: number }[][];\n};\n\nexport type ITextGraphicAttribute = Partial<IGraphicAttribute> & Partial<ITextAttribute>;\n\nexport type IWrapTextGraphicAttribute = ITextGraphicAttribute & {\n heightLimit?: number;\n lineClamp?: number;\n};\n\nexport interface IText extends IGraphic<ITextGraphicAttribute> {\n // 判断是否被ellipisised\n clipedText?: string;\n clipedWidth?: number;\n cliped?: boolean;\n multilineLayout?: LayoutType;\n font?: string;\n isMultiLine: boolean;\n cache?: ITextCache;\n\n getBaselineMapAlign: () => Record<string, string>;\n getAlignMapBaseline: () => Record<string, string>;\n\n updateMultilineAABBBounds: (text: (number | string)[]) => IAABBBounds;\n updateSingallineAABBBounds: (text: number | string) => IAABBBounds;\n}\n\nexport type TextAlignType = 'left' | 'right' | 'center' | 'start' | 'end';\nexport type TextBaselineType = 'top' | 'middle' | 'bottom' | 'alphabetic';\n"]}
@@ -21,11 +21,13 @@ export interface IGraphicService {
21
21
  afterUpdateAABBBounds: ISyncHook<[IGraphic, IStage, IAABBBounds, {
22
22
  globalAABBBounds: IAABBBounds;
23
23
  }, boolean]>;
24
+ clearAABBBounds: ISyncHook<[IGraphic, IStage, IAABBBounds]>;
24
25
  };
25
26
  beforeUpdateAABBBounds: (graphic: IGraphic, stage: IStage, willUpdate: boolean, bounds: IAABBBounds) => void;
26
27
  afterUpdateAABBBounds: (graphic: IGraphic, stage: IStage, bounds: IAABBBounds, params: {
27
28
  globalAABBBounds: IAABBBounds;
28
29
  }, selfChange: boolean) => void;
30
+ clearAABBBounds: (graphic: IGraphic, stage: IStage, b: IAABBBounds) => void;
29
31
  creator: IGraphicCreator;
30
32
  validCheck: (attribute: Partial<IGraphicAttribute>, theme: Required<IGraphicAttribute>, aabbBounds: IAABBBounds, graphic?: IGraphic) => boolean;
31
33
  transformAABBBounds: (attribute: Partial<IGraphicAttribute>, aabbBounds: IAABBBounds, theme: Required<IGraphicAttribute>, miter: boolean, graphic?: IGraphic) => void;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/graphic-service.ts"],"names":[],"mappings":"","file":"graphic-service.js","sourcesContent":["import type { IAABBBounds } from '@visactor/vutils';\n\nimport type { ISyncHook } from './sync-hook';\nimport type { IGraphic, IGraphicAttribute } from './graphic';\nimport type { IStage } from './stage';\nimport type {\n IRectGraphicAttribute,\n IGroup,\n IGroupGraphicAttribute,\n ISymbolGraphicAttribute,\n ICircleGraphicAttribute,\n ICircle,\n ISymbol,\n IArcGraphicAttribute,\n IArc,\n IAreaGraphicAttribute,\n IArea,\n ILineGraphicAttribute,\n IPathGraphicAttribute,\n ILine,\n IPath,\n IPolygonGraphicAttribute,\n IPolygon,\n ITextGraphicAttribute,\n IText,\n IRichTextGraphicAttribute,\n IRichText,\n IImageGraphicAttribute,\n IImage,\n IRect3dGraphicAttribute,\n IRect,\n IRect3d,\n IShadowRoot,\n IWrapTextGraphicAttribute\n} from './graphic/index';\n\nexport interface IGraphicService {\n // themeService: IThemeService;\n onAttributeUpdate: (graphic: IGraphic) => void;\n onSetStage: (graphic: IGraphic, stage: IStage) => void;\n onRemove: (graphic: IGraphic) => void;\n onRelease: (graphic: IGraphic) => void;\n onAddIncremental: (graphic: IGraphic, group: IGroup, stage: IStage) => void;\n onClearIncremental: (group: IGroup, stage: IStage) => void;\n hooks: {\n onAttributeUpdate: ISyncHook<[IGraphic]>;\n onSetStage: ISyncHook<[IGraphic, IStage]>;\n onRemove: ISyncHook<[IGraphic]>;\n onRelease: ISyncHook<[IGraphic]>;\n onAddIncremental: ISyncHook<[IGraphic, IGroup, IStage]>;\n onClearIncremental: ISyncHook<[IGroup, IStage]>;\n beforeUpdateAABBBounds: ISyncHook<[IGraphic, IStage, boolean, IAABBBounds]>;\n afterUpdateAABBBounds: ISyncHook<[IGraphic, IStage, IAABBBounds, { globalAABBBounds: IAABBBounds }, boolean]>;\n };\n beforeUpdateAABBBounds: (graphic: IGraphic, stage: IStage, willUpdate: boolean, bounds: IAABBBounds) => void;\n afterUpdateAABBBounds: (\n graphic: IGraphic,\n stage: IStage,\n bounds: IAABBBounds,\n params: { globalAABBBounds: IAABBBounds },\n selfChange: boolean\n ) => void;\n\n creator: IGraphicCreator;\n validCheck: (\n attribute: Partial<IGraphicAttribute>,\n theme: Required<IGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => boolean;\n\n transformAABBBounds: (\n attribute: Partial<IGraphicAttribute>,\n aabbBounds: IAABBBounds,\n theme: Required<IGraphicAttribute>,\n miter: boolean,\n graphic?: IGraphic\n ) => void;\n\n updateHTMLTextAABBBounds: (\n attribute: ITextGraphicAttribute,\n textTheme: Required<ITextGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IText\n ) => void;\n\n combindShadowAABBBounds: (bounds: IAABBBounds, graphic?: IGraphic) => void;\n updateTempAABBBounds: (aabbBounds: IAABBBounds) => { tb1: IAABBBounds; tb2: IAABBBounds };\n}\n\nexport type IGraphicCreator = {\n arc: (attributes: IArcGraphicAttribute) => IArc;\n area: (attributes: IAreaGraphicAttribute) => IArea;\n circle: (attributes: ICircleGraphicAttribute) => ICircle;\n group: (attributes: IGroupGraphicAttribute) => IGroup;\n image: (attributes: IImageGraphicAttribute) => IImage;\n line: (attributes: ILineGraphicAttribute) => ILine;\n path: (attributes: IPathGraphicAttribute) => IPath;\n rect: (attributes: IRectGraphicAttribute) => IRect;\n rect3d: (attributes: IRect3dGraphicAttribute) => IRect3d;\n symbol: (attributes: ISymbolGraphicAttribute) => ISymbol;\n text: (attributes: ITextGraphicAttribute) => IText;\n richtext: (attributes: IRichTextGraphicAttribute) => IRichText;\n polygon: (attributes: IPolygonGraphicAttribute) => IPolygon;\n shadowRoot: (graphic?: IGraphic) => IShadowRoot;\n wrapText: (attributes: IWrapTextGraphicAttribute) => IText;\n};\n\nexport interface IArcBoundsContribution {\n updateBounds: (\n attribute: IArcGraphicAttribute,\n arcTheme: Required<IArcGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface IAreaBoundsContribution {\n updateBounds: (\n attribute: IAreaGraphicAttribute,\n arcTheme: Required<IAreaGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface ICircleBoundsContribution {\n updateBounds: (\n attribute: ICircleGraphicAttribute,\n circleTheme: Required<ICircleGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface IPathBoundsContribution {\n updateBounds: (\n attribute: IPathGraphicAttribute,\n pathTheme: Required<IPathGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface IRectBoundsContribution {\n updateBounds: (\n attribute: IRectGraphicAttribute,\n rectTheme: Required<IRectGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface ISymbolBoundsContribution {\n updateBounds: (\n attribute: ISymbolGraphicAttribute,\n SymbolTheme: Required<ISymbolGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\nexport interface IImageBoundsContribution {\n updateBounds: (\n attribute: IImageGraphicAttribute,\n ImageTheme: Required<IImageGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n"]}
1
+ {"version":3,"sources":["../src/interface/graphic-service.ts"],"names":[],"mappings":"","file":"graphic-service.js","sourcesContent":["import type { IAABBBounds } from '@visactor/vutils';\n\nimport type { ISyncHook } from './sync-hook';\nimport type { IGraphic, IGraphicAttribute } from './graphic';\nimport type { IStage } from './stage';\nimport type {\n IRectGraphicAttribute,\n IGroup,\n IGroupGraphicAttribute,\n ISymbolGraphicAttribute,\n ICircleGraphicAttribute,\n ICircle,\n ISymbol,\n IArcGraphicAttribute,\n IArc,\n IAreaGraphicAttribute,\n IArea,\n ILineGraphicAttribute,\n IPathGraphicAttribute,\n ILine,\n IPath,\n IPolygonGraphicAttribute,\n IPolygon,\n ITextGraphicAttribute,\n IText,\n IRichTextGraphicAttribute,\n IRichText,\n IImageGraphicAttribute,\n IImage,\n IRect3dGraphicAttribute,\n IRect,\n IRect3d,\n IShadowRoot,\n IWrapTextGraphicAttribute\n} from './graphic/index';\n\nexport interface IGraphicService {\n // themeService: IThemeService;\n onAttributeUpdate: (graphic: IGraphic) => void;\n onSetStage: (graphic: IGraphic, stage: IStage) => void;\n onRemove: (graphic: IGraphic) => void;\n onRelease: (graphic: IGraphic) => void;\n onAddIncremental: (graphic: IGraphic, group: IGroup, stage: IStage) => void;\n onClearIncremental: (group: IGroup, stage: IStage) => void;\n hooks: {\n onAttributeUpdate: ISyncHook<[IGraphic]>;\n onSetStage: ISyncHook<[IGraphic, IStage]>;\n onRemove: ISyncHook<[IGraphic]>;\n onRelease: ISyncHook<[IGraphic]>;\n onAddIncremental: ISyncHook<[IGraphic, IGroup, IStage]>;\n onClearIncremental: ISyncHook<[IGroup, IStage]>;\n beforeUpdateAABBBounds: ISyncHook<[IGraphic, IStage, boolean, IAABBBounds]>;\n afterUpdateAABBBounds: ISyncHook<[IGraphic, IStage, IAABBBounds, { globalAABBBounds: IAABBBounds }, boolean]>;\n clearAABBBounds: ISyncHook<[IGraphic, IStage, IAABBBounds]>;\n };\n beforeUpdateAABBBounds: (graphic: IGraphic, stage: IStage, willUpdate: boolean, bounds: IAABBBounds) => void;\n afterUpdateAABBBounds: (\n graphic: IGraphic,\n stage: IStage,\n bounds: IAABBBounds,\n params: { globalAABBBounds: IAABBBounds },\n selfChange: boolean\n ) => void;\n clearAABBBounds: (graphic: IGraphic, stage: IStage, b: IAABBBounds) => void;\n\n creator: IGraphicCreator;\n validCheck: (\n attribute: Partial<IGraphicAttribute>,\n theme: Required<IGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => boolean;\n\n transformAABBBounds: (\n attribute: Partial<IGraphicAttribute>,\n aabbBounds: IAABBBounds,\n theme: Required<IGraphicAttribute>,\n miter: boolean,\n graphic?: IGraphic\n ) => void;\n\n updateHTMLTextAABBBounds: (\n attribute: ITextGraphicAttribute,\n textTheme: Required<ITextGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IText\n ) => void;\n\n combindShadowAABBBounds: (bounds: IAABBBounds, graphic?: IGraphic) => void;\n updateTempAABBBounds: (aabbBounds: IAABBBounds) => { tb1: IAABBBounds; tb2: IAABBBounds };\n}\n\nexport type IGraphicCreator = {\n arc: (attributes: IArcGraphicAttribute) => IArc;\n area: (attributes: IAreaGraphicAttribute) => IArea;\n circle: (attributes: ICircleGraphicAttribute) => ICircle;\n group: (attributes: IGroupGraphicAttribute) => IGroup;\n image: (attributes: IImageGraphicAttribute) => IImage;\n line: (attributes: ILineGraphicAttribute) => ILine;\n path: (attributes: IPathGraphicAttribute) => IPath;\n rect: (attributes: IRectGraphicAttribute) => IRect;\n rect3d: (attributes: IRect3dGraphicAttribute) => IRect3d;\n symbol: (attributes: ISymbolGraphicAttribute) => ISymbol;\n text: (attributes: ITextGraphicAttribute) => IText;\n richtext: (attributes: IRichTextGraphicAttribute) => IRichText;\n polygon: (attributes: IPolygonGraphicAttribute) => IPolygon;\n shadowRoot: (graphic?: IGraphic) => IShadowRoot;\n wrapText: (attributes: IWrapTextGraphicAttribute) => IText;\n};\n\nexport interface IArcBoundsContribution {\n updateBounds: (\n attribute: IArcGraphicAttribute,\n arcTheme: Required<IArcGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface IAreaBoundsContribution {\n updateBounds: (\n attribute: IAreaGraphicAttribute,\n arcTheme: Required<IAreaGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface ICircleBoundsContribution {\n updateBounds: (\n attribute: ICircleGraphicAttribute,\n circleTheme: Required<ICircleGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface IPathBoundsContribution {\n updateBounds: (\n attribute: IPathGraphicAttribute,\n pathTheme: Required<IPathGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface IRectBoundsContribution {\n updateBounds: (\n attribute: IRectGraphicAttribute,\n rectTheme: Required<IRectGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n\nexport interface ISymbolBoundsContribution {\n updateBounds: (\n attribute: ISymbolGraphicAttribute,\n SymbolTheme: Required<ISymbolGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\nexport interface IImageBoundsContribution {\n updateBounds: (\n attribute: IImageGraphicAttribute,\n ImageTheme: Required<IImageGraphicAttribute>,\n aabbBounds: IAABBBounds,\n graphic?: IGraphic\n ) => IAABBBounds;\n}\n"]}
@@ -6,12 +6,14 @@ export interface TextOptionsType {
6
6
  fontFamily?: string;
7
7
  fontStyle?: string;
8
8
  fontVariant?: string;
9
+ textBaseline?: 'alphabetic' | 'top' | 'middle' | 'bottom';
10
+ textAlign?: 'left' | 'center' | 'right' | 'start' | 'end';
9
11
  }
10
12
  export interface ITextMeasure extends IContribution<IGraphicUtil> {
11
13
  measureTextWidth: (text: string, options: TextOptionsType) => number;
12
14
  measureTextPixelHeight: (text: string, options: TextOptionsType) => number;
13
15
  measureTextBoundHieght: (text: string, options: TextOptionsType) => number;
14
- clipText: (text: string, options: TextOptionsType, width: number, wordBreak: boolean) => {
16
+ clipText: (text: string, options: TextOptionsType, width: number, wordBreak: boolean, keepAllBreak?: boolean) => {
15
17
  str: string;
16
18
  width: number;
17
19
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/text.ts"],"names":[],"mappings":"","file":"text.js","sourcesContent":["import type { IContribution } from './contribution';\nimport type { IGraphicUtil } from './core';\n\nexport interface TextOptionsType {\n fontSize?: number;\n fontWeight?: string | number;\n fontFamily?: string;\n fontStyle?: string;\n fontVariant?: string;\n}\n\nexport interface ITextMeasure extends IContribution<IGraphicUtil> {\n measureTextWidth: (text: string, options: TextOptionsType) => number;\n measureTextPixelHeight: (text: string, options: TextOptionsType) => number;\n measureTextBoundHieght: (text: string, options: TextOptionsType) => number;\n clipText: (\n text: string,\n options: TextOptionsType,\n width: number,\n wordBreak: boolean\n ) => { str: string; width: number };\n clipTextVertical: (\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n wordBreak: boolean\n ) => { verticalList: { text: string; width?: number; direction: number }[]; width: number };\n clipTextWithSuffix: (\n text: string,\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n position: 'start' | 'end' | 'middle'\n ) => { str: string; width: number };\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 ) => { verticalList: { text: string; width?: number; direction: number }[]; width: number };\n measureText: (text: string, options: TextOptionsType) => { width: number };\n}\n"]}
1
+ {"version":3,"sources":["../src/interface/text.ts"],"names":[],"mappings":"","file":"text.js","sourcesContent":["import type { IContribution } from './contribution';\nimport type { IGraphicUtil } from './core';\n\nexport interface TextOptionsType {\n fontSize?: number;\n fontWeight?: string | number;\n fontFamily?: string;\n fontStyle?: string;\n fontVariant?: string;\n textBaseline?: 'alphabetic' | 'top' | 'middle' | 'bottom';\n textAlign?: 'left' | 'center' | 'right' | 'start' | 'end';\n}\n\nexport interface ITextMeasure extends IContribution<IGraphicUtil> {\n measureTextWidth: (text: string, options: TextOptionsType) => number;\n measureTextPixelHeight: (text: string, options: TextOptionsType) => number;\n measureTextBoundHieght: (text: string, options: TextOptionsType) => number;\n clipText: (\n text: string,\n options: TextOptionsType,\n width: number,\n wordBreak: boolean,\n keepAllBreak?: boolean\n ) => { str: string; width: number };\n clipTextVertical: (\n verticalList: { text: string; width?: number; direction: number }[],\n options: TextOptionsType,\n width: number,\n wordBreak: boolean\n ) => { verticalList: { text: string; width?: number; direction: number }[]; width: number };\n clipTextWithSuffix: (\n text: string,\n options: TextOptionsType,\n width: number,\n suffix: string,\n wordBreak: boolean,\n position: 'start' | 'end' | 'middle'\n ) => { str: string; width: number };\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 ) => { verticalList: { text: string; width?: number; direction: number }[]; width: number };\n measureText: (text: string, options: TextOptionsType) => { width: number };\n}\n"]}
@@ -19,6 +19,8 @@ class DirtyBoundsPlugin {
19
19
  stage.dirty(globalBounds, graphic.parent && graphic.parent.globalTransMatrix)));
20
20
  })), application_1.application.graphicService.hooks.afterUpdateAABBBounds.tap(this.key, ((graphic, stage, bounds, params, selfChange) => {
21
21
  stage && stage === this.pluginService.stage && stage.renderCount && (graphic.isContainer && !selfChange || stage.dirty(params.globalAABBBounds));
22
+ })), application_1.application.graphicService.hooks.clearAABBBounds.tap(this.key, ((graphic, stage, bounds) => {
23
+ stage && stage === this.pluginService.stage && stage.renderCount && stage && stage.dirty(bounds);
22
24
  })), application_1.application.graphicService.hooks.onRemove.tap(this.key, (graphic => {
23
25
  const stage = graphic.stage;
24
26
  stage && stage === this.pluginService.stage && stage.renderCount && stage && stage.dirty(graphic.globalAABBBounds);
@@ -27,6 +29,7 @@ class DirtyBoundsPlugin {
27
29
  deactivate(context) {
28
30
  application_1.application.graphicService.hooks.beforeUpdateAABBBounds.taps = application_1.application.graphicService.hooks.beforeUpdateAABBBounds.taps.filter((item => item.name !== this.key)),
29
31
  application_1.application.graphicService.hooks.afterUpdateAABBBounds.taps = application_1.application.graphicService.hooks.afterUpdateAABBBounds.taps.filter((item => item.name !== this.key)),
32
+ application_1.application.graphicService.hooks.clearAABBBounds.taps = application_1.application.graphicService.hooks.clearAABBBounds.taps.filter((item => item.name !== this.key)),
30
33
  context.stage.hooks.afterRender.taps = context.stage.hooks.afterRender.taps.filter((item => item.name !== this.key)),
31
34
  application_1.application.graphicService.hooks.onRemove.taps = application_1.application.graphicService.hooks.onRemove.taps.filter((item => item.name !== this.key));
32
35
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugins/builtin-plugin/dirty-bounds-plugin.ts"],"names":[],"mappings":"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","file":"dirty-bounds-plugin.js","sourcesContent":["import type { IAABBBounds } from '@visactor/vutils';\nimport { AABBBounds } from '@visactor/vutils';\nimport { Generator } from '../../common/generator';\nimport type { IGraphic, IStage, IPlugin, IPluginService } from '../../interface';\nimport { application } from '../../application';\n\nconst globalBounds = new AABBBounds();\n\nexport class DirtyBoundsPlugin implements IPlugin {\n name: 'DirtyBoundsPlugin' = 'DirtyBoundsPlugin';\n activeEvent: 'onRegister' = 'onRegister';\n pluginService: IPluginService;\n _uid: number = Generator.GenAutoIncrementId();\n key: string = this.name + this._uid;\n\n activate(context: IPluginService): void {\n this.pluginService = context;\n context.stage.hooks.afterRender.tap(this.key, stage => {\n if (!(stage && stage === this.pluginService.stage)) {\n return;\n }\n stage.dirtyBounds.clear();\n });\n application.graphicService.hooks.beforeUpdateAABBBounds.tap(\n this.key,\n (graphic: IGraphic, stage: IStage, willUpdate: boolean, bounds: IAABBBounds) => {\n if (graphic.glyphHost) {\n graphic = graphic.glyphHost;\n }\n if (!(stage && stage === this.pluginService.stage && stage.renderCount)) {\n return;\n }\n // group的子元素导致的bounds更新不用做dirtyBounds\n if (graphic.isContainer && !graphic.shouldSelfChangeUpdateAABBBounds()) {\n return;\n }\n if (willUpdate) {\n globalBounds.setValue(bounds.x1, bounds.y1, bounds.x2, bounds.y2);\n stage.dirty(globalBounds, graphic.parent && graphic.parent.globalTransMatrix);\n }\n }\n );\n application.graphicService.hooks.afterUpdateAABBBounds.tap(\n this.key,\n (\n graphic: IGraphic,\n stage: IStage,\n bounds: IAABBBounds,\n params: { globalAABBBounds: IAABBBounds },\n selfChange: boolean\n ) => {\n if (!(stage && stage === this.pluginService.stage && stage.renderCount)) {\n return;\n }\n // group的子元素导致的bounds更新不用做dirtyBounds\n if (graphic.isContainer && !selfChange) {\n return;\n }\n stage.dirty(params.globalAABBBounds);\n }\n );\n application.graphicService.hooks.onRemove.tap(this.key, (graphic: IGraphic) => {\n const stage = graphic.stage;\n if (!(stage && stage === this.pluginService.stage && stage.renderCount)) {\n return;\n }\n if (stage) {\n stage.dirty(graphic.globalAABBBounds);\n }\n });\n }\n deactivate(context: IPluginService): void {\n application.graphicService.hooks.beforeUpdateAABBBounds.taps =\n application.graphicService.hooks.beforeUpdateAABBBounds.taps.filter(item => {\n return item.name !== this.key;\n });\n application.graphicService.hooks.afterUpdateAABBBounds.taps =\n application.graphicService.hooks.afterUpdateAABBBounds.taps.filter(item => {\n return item.name !== this.key;\n });\n context.stage.hooks.afterRender.taps = context.stage.hooks.afterRender.taps.filter(item => {\n return item.name !== this.key;\n });\n application.graphicService.hooks.onRemove.taps = application.graphicService.hooks.onRemove.taps.filter(item => {\n return item.name !== this.key;\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/plugins/builtin-plugin/dirty-bounds-plugin.ts"],"names":[],"mappings":"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","file":"dirty-bounds-plugin.js","sourcesContent":["import type { IAABBBounds } from '@visactor/vutils';\nimport { AABBBounds } from '@visactor/vutils';\nimport { Generator } from '../../common/generator';\nimport type { IGraphic, IStage, IPlugin, IPluginService } from '../../interface';\nimport { application } from '../../application';\n\nconst globalBounds = new AABBBounds();\n\nexport class DirtyBoundsPlugin implements IPlugin {\n name: 'DirtyBoundsPlugin' = 'DirtyBoundsPlugin';\n activeEvent: 'onRegister' = 'onRegister';\n pluginService: IPluginService;\n _uid: number = Generator.GenAutoIncrementId();\n key: string = this.name + this._uid;\n\n activate(context: IPluginService): void {\n this.pluginService = context;\n context.stage.hooks.afterRender.tap(this.key, stage => {\n if (!(stage && stage === this.pluginService.stage)) {\n return;\n }\n stage.dirtyBounds.clear();\n });\n application.graphicService.hooks.beforeUpdateAABBBounds.tap(\n this.key,\n (graphic: IGraphic, stage: IStage, willUpdate: boolean, bounds: IAABBBounds) => {\n if (graphic.glyphHost) {\n graphic = graphic.glyphHost;\n }\n if (!(stage && stage === this.pluginService.stage && stage.renderCount)) {\n return;\n }\n // group的子元素导致的bounds更新不用做dirtyBounds\n if (graphic.isContainer && !graphic.shouldSelfChangeUpdateAABBBounds()) {\n return;\n }\n if (willUpdate) {\n globalBounds.setValue(bounds.x1, bounds.y1, bounds.x2, bounds.y2);\n stage.dirty(globalBounds, graphic.parent && graphic.parent.globalTransMatrix);\n }\n }\n );\n application.graphicService.hooks.afterUpdateAABBBounds.tap(\n this.key,\n (\n graphic: IGraphic,\n stage: IStage,\n bounds: IAABBBounds,\n params: { globalAABBBounds: IAABBBounds },\n selfChange: boolean\n ) => {\n if (!(stage && stage === this.pluginService.stage && stage.renderCount)) {\n return;\n }\n // group的子元素导致的bounds更新不用做dirtyBounds\n if (graphic.isContainer && !selfChange) {\n return;\n }\n stage.dirty(params.globalAABBBounds);\n }\n );\n application.graphicService.hooks.clearAABBBounds.tap(\n this.key,\n (graphic: IGraphic, stage: IStage, bounds: IAABBBounds) => {\n if (!(stage && stage === this.pluginService.stage && stage.renderCount)) {\n return;\n }\n if (stage) {\n stage.dirty(bounds);\n }\n }\n );\n application.graphicService.hooks.onRemove.tap(this.key, (graphic: IGraphic) => {\n const stage = graphic.stage;\n if (!(stage && stage === this.pluginService.stage && stage.renderCount)) {\n return;\n }\n if (stage) {\n stage.dirty(graphic.globalAABBBounds);\n }\n });\n }\n deactivate(context: IPluginService): void {\n application.graphicService.hooks.beforeUpdateAABBBounds.taps =\n application.graphicService.hooks.beforeUpdateAABBBounds.taps.filter(item => {\n return item.name !== this.key;\n });\n application.graphicService.hooks.afterUpdateAABBBounds.taps =\n application.graphicService.hooks.afterUpdateAABBBounds.taps.filter(item => {\n return item.name !== this.key;\n });\n application.graphicService.hooks.clearAABBBounds.taps =\n application.graphicService.hooks.clearAABBBounds.taps.filter(item => {\n return item.name !== this.key;\n });\n context.stage.hooks.afterRender.taps = context.stage.hooks.afterRender.taps.filter(item => {\n return item.name !== this.key;\n });\n application.graphicService.hooks.onRemove.taps = application.graphicService.hooks.onRemove.taps.filter(item => {\n return item.name !== this.key;\n });\n }\n}\n"]}
package/dist/index.es.js CHANGED
@@ -3189,13 +3189,24 @@ function getStrByWithCanvas(desc, width, character, guessIndex, needTestLetter)
3189
3189
  }
3190
3190
  return index;
3191
3191
  }
3192
- function testLetter(string, index) {
3192
+ function testLetter(string, index, negativeWrongMatch = false) {
3193
3193
  let i = index;
3194
3194
  while ((regLetter.test(string[i - 1]) && regLetter.test(string[i])) ||
3195
3195
  regPunctuation.test(string[i])) {
3196
3196
  i--;
3197
3197
  if (i <= 0) {
3198
- return index;
3198
+ return negativeWrongMatch ? testLetter2(string, index) : index;
3199
+ }
3200
+ }
3201
+ return i;
3202
+ }
3203
+ function testLetter2(string, index) {
3204
+ let i = index;
3205
+ while ((regLetter.test(string[i - 1]) && regLetter.test(string[i])) ||
3206
+ regPunctuation.test(string[i])) {
3207
+ i++;
3208
+ if (i >= string.length) {
3209
+ return i;
3199
3210
  }
3200
3211
  }
3201
3212
  return i;
@@ -3322,7 +3333,7 @@ let ATextMeasure = class ATextMeasure {
3322
3333
  width: length
3323
3334
  };
3324
3335
  }
3325
- clipText(text, options, width, wordBreak) {
3336
+ clipText(text, options, width, wordBreak, keepAllBreak) {
3326
3337
  if (text.length === 0) {
3327
3338
  return { str: '', width: 0 };
3328
3339
  }
@@ -3336,8 +3347,12 @@ let ATextMeasure = class ATextMeasure {
3336
3347
  }
3337
3348
  const data = this._clipText(text, options, width, 0, text.length - 1, 'end', false);
3338
3349
  if (wordBreak && data.str !== text) {
3339
- const index = testLetter(text, data.str.length);
3350
+ let index = testLetter(text, data.str.length, keepAllBreak);
3340
3351
  if (index !== data.str.length) {
3352
+ if (index > data.str.length) {
3353
+ data.wordBreaked = index;
3354
+ index = data.str.length;
3355
+ }
3341
3356
  data.str = text.substring(0, index);
3342
3357
  data.width = this.measureTextWidth(data.str, options);
3343
3358
  }
@@ -14301,7 +14316,8 @@ let DefaultGraphicService = class DefaultGraphicService {
14301
14316
  'aabbBounds',
14302
14317
  'globalAABBBounds',
14303
14318
  'selfChange'
14304
- ])
14319
+ ]),
14320
+ clearAABBBounds: new SyncHook(['graphic', 'stage', 'aabbBounds'])
14305
14321
  };
14306
14322
  this.tempAABBBounds1 = new AABBBounds();
14307
14323
  this.tempAABBBounds2 = new AABBBounds();
@@ -14346,6 +14362,11 @@ let DefaultGraphicService = class DefaultGraphicService {
14346
14362
  this.hooks.afterUpdateAABBBounds.call(graphic, stage, bounds, params, selfChange);
14347
14363
  }
14348
14364
  }
14365
+ clearAABBBounds(graphic, stage, b) {
14366
+ if (this.hooks.clearAABBBounds.taps.length) {
14367
+ this.hooks.clearAABBBounds.call(graphic, stage, b);
14368
+ }
14369
+ }
14349
14370
  updatePathProxyAABBBounds(aabbBounds, graphic) {
14350
14371
  const path = typeof graphic.pathProxy === 'function' ? graphic.pathProxy(graphic.attribute) : graphic.pathProxy;
14351
14372
  if (!path) {
@@ -14411,16 +14432,16 @@ let DefaultGraphicService = class DefaultGraphicService {
14411
14432
  if (attribute.forceBoundsHeight != null || attribute.forceBoundsWidth != null) {
14412
14433
  return true;
14413
14434
  }
14414
- if (graphic.shadowRoot) {
14435
+ if (graphic.shadowRoot || graphic.isContainer) {
14415
14436
  return true;
14416
14437
  }
14417
- if (!graphic.valid) {
14418
- aabbBounds.clear();
14419
- return false;
14420
- }
14421
14438
  const { visible = theme.visible } = attribute;
14422
- if (!visible) {
14423
- aabbBounds.clear();
14439
+ if (!(graphic.valid && visible)) {
14440
+ if (!aabbBounds.empty()) {
14441
+ graphic.parent && aabbBounds.transformWithMatrix(graphic.parent.globalTransMatrix);
14442
+ application.graphicService.clearAABBBounds(graphic, graphic.stage, aabbBounds);
14443
+ aabbBounds.clear();
14444
+ }
14424
14445
  return false;
14425
14446
  }
14426
14447
  return true;
@@ -19172,8 +19193,8 @@ class Text extends Graphic {
19172
19193
  });
19173
19194
  break;
19174
19195
  }
19175
- const clip = layoutObj.textMeasure.clipText(str, layoutObj.textOptions, maxLineWidth, wordBreak === 'break-word');
19176
- if (str !== '' && clip.str === '') {
19196
+ const clip = layoutObj.textMeasure.clipText(str, layoutObj.textOptions, maxLineWidth, wordBreak !== 'break-all', wordBreak === 'keep-all');
19197
+ if ((str !== '' && clip.str === '') || clip.wordBreaked) {
19177
19198
  if (ellipsis) {
19178
19199
  const clipEllipsis = layoutObj.textMeasure.clipTextWithSuffix(str, layoutObj.textOptions, maxLineWidth, ellipsis, false, suffixPosition);
19179
19200
  clip.str = (_c = clipEllipsis.str) !== null && _c !== void 0 ? _c : '';
@@ -19189,9 +19210,17 @@ class Text extends Graphic {
19189
19210
  str: clip.str,
19190
19211
  width: clip.width
19191
19212
  });
19213
+ let cutLength = clip.str.length;
19214
+ if (clip.wordBreaked && !(str !== '' && clip.str === '')) {
19215
+ needCut = true;
19216
+ cutLength = clip.wordBreaked;
19217
+ }
19192
19218
  if (clip.str.length === str.length) ;
19193
19219
  else if (needCut) {
19194
- const newStr = str.substring(clip.str.length);
19220
+ let newStr = str.substring(cutLength);
19221
+ if (wordBreak === 'keep-all') {
19222
+ newStr = newStr.replace(/^\s+/g, '');
19223
+ }
19195
19224
  lines.splice(i + 1, 0, newStr);
19196
19225
  }
19197
19226
  }
@@ -24300,6 +24329,14 @@ class DirtyBoundsPlugin {
24300
24329
  }
24301
24330
  stage.dirty(params.globalAABBBounds);
24302
24331
  });
24332
+ application.graphicService.hooks.clearAABBBounds.tap(this.key, (graphic, stage, bounds) => {
24333
+ if (!(stage && stage === this.pluginService.stage && stage.renderCount)) {
24334
+ return;
24335
+ }
24336
+ if (stage) {
24337
+ stage.dirty(bounds);
24338
+ }
24339
+ });
24303
24340
  application.graphicService.hooks.onRemove.tap(this.key, (graphic) => {
24304
24341
  const stage = graphic.stage;
24305
24342
  if (!(stage && stage === this.pluginService.stage && stage.renderCount)) {
@@ -24319,6 +24356,10 @@ class DirtyBoundsPlugin {
24319
24356
  application.graphicService.hooks.afterUpdateAABBBounds.taps.filter(item => {
24320
24357
  return item.name !== this.key;
24321
24358
  });
24359
+ application.graphicService.hooks.clearAABBBounds.taps =
24360
+ application.graphicService.hooks.clearAABBBounds.taps.filter(item => {
24361
+ return item.name !== this.key;
24362
+ });
24322
24363
  context.stage.hooks.afterRender.taps = context.stage.hooks.afterRender.taps.filter(item => {
24323
24364
  return item.name !== this.key;
24324
24365
  });
@@ -28,9 +28,10 @@ export declare class ATextMeasure implements ITextMeasure {
28
28
  }[];
29
29
  width: number;
30
30
  };
31
- clipText(text: string, options: TextOptionsType, width: number, wordBreak: boolean): {
31
+ clipText(text: string, options: TextOptionsType, width: number, wordBreak: boolean, keepAllBreak?: boolean): {
32
32
  str: string;
33
33
  width: number;
34
+ wordBreaked?: number;
34
35
  };
35
36
  private _clipText;
36
37
  private _clipTextEnd;
@@ -81,7 +81,7 @@ let ATextMeasure = class {
81
81
  width: length
82
82
  };
83
83
  }
84
- clipText(text, options, width, wordBreak) {
84
+ clipText(text, options, width, wordBreak, keepAllBreak) {
85
85
  if (0 === text.length) return {
86
86
  str: "",
87
87
  width: 0
@@ -97,8 +97,9 @@ let ATextMeasure = class {
97
97
  };
98
98
  const data = this._clipText(text, options, width, 0, text.length - 1, "end", !1);
99
99
  if (wordBreak && data.str !== text) {
100
- const index = testLetter(text, data.str.length);
101
- index !== data.str.length && (data.str = text.substring(0, index), data.width = this.measureTextWidth(data.str, options));
100
+ let index = testLetter(text, data.str.length, keepAllBreak);
101
+ index !== data.str.length && (index > data.str.length && (data.wordBreaked = index,
102
+ index = data.str.length), data.str = text.substring(0, index), data.width = this.measureTextWidth(data.str, options));
102
103
  }
103
104
  return data;
104
105
  }