@visactor/vrender-core 0.20.16 → 0.21.0-alpha.10

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 (108) hide show
  1. package/cjs/animate/Ticker/default-ticker.d.ts +4 -2
  2. package/cjs/animate/Ticker/default-ticker.js +8 -5
  3. package/cjs/animate/Ticker/default-ticker.js.map +1 -1
  4. package/cjs/animate/custom-animate.d.ts +2 -0
  5. package/cjs/animate/custom-animate.js +11 -2
  6. package/cjs/animate/custom-animate.js.map +1 -1
  7. package/cjs/common/color-utils.js +2 -2
  8. package/cjs/common/color-utils.js.map +1 -1
  9. package/cjs/core/contributions/textMeasure/AtextMeasure.d.ts +56 -4
  10. package/cjs/core/contributions/textMeasure/AtextMeasure.js +107 -14
  11. package/cjs/core/contributions/textMeasure/AtextMeasure.js.map +1 -1
  12. package/cjs/core/contributions/textMeasure/layout.d.ts +7 -3
  13. package/cjs/core/contributions/textMeasure/layout.js +40 -39
  14. package/cjs/core/contributions/textMeasure/layout.js.map +1 -1
  15. package/cjs/core/stage.d.ts +2 -0
  16. package/cjs/core/stage.js +9 -5
  17. package/cjs/core/stage.js.map +1 -1
  18. package/cjs/graphic/config.d.ts +1 -1
  19. package/cjs/graphic/config.js +4 -2
  20. package/cjs/graphic/config.js.map +1 -1
  21. package/cjs/graphic/graphic-service/graphic-service.d.ts +2 -0
  22. package/cjs/graphic/graphic-service/graphic-service.js +10 -5
  23. package/cjs/graphic/graphic-service/graphic-service.js.map +1 -1
  24. package/cjs/graphic/richtext/line.js +2 -9
  25. package/cjs/graphic/richtext/line.js.map +1 -1
  26. package/cjs/graphic/richtext/paragraph.js +3 -2
  27. package/cjs/graphic/richtext/paragraph.js.map +1 -1
  28. package/cjs/graphic/richtext/utils.d.ts +1 -2
  29. package/cjs/graphic/richtext/utils.js +3 -5
  30. package/cjs/graphic/richtext/utils.js.map +1 -1
  31. package/cjs/graphic/text.d.ts +11 -11
  32. package/cjs/graphic/text.js +99 -170
  33. package/cjs/graphic/text.js.map +1 -1
  34. package/cjs/graphic/wrap-text.js +12 -4
  35. package/cjs/graphic/wrap-text.js.map +1 -1
  36. package/cjs/interface/animate.d.ts +3 -1
  37. package/cjs/interface/animate.js.map +1 -1
  38. package/cjs/interface/graphic/text.d.ts +9 -3
  39. package/cjs/interface/graphic/text.js +6 -1
  40. package/cjs/interface/graphic/text.js.map +1 -1
  41. package/cjs/interface/graphic-service.d.ts +2 -0
  42. package/cjs/interface/graphic-service.js.map +1 -1
  43. package/cjs/interface/stage.d.ts +1 -0
  44. package/cjs/interface/stage.js.map +1 -1
  45. package/cjs/interface/text.d.ts +9 -1
  46. package/cjs/interface/text.js.map +1 -1
  47. package/cjs/plugins/builtin-plugin/dirty-bounds-plugin.js +3 -0
  48. package/cjs/plugins/builtin-plugin/dirty-bounds-plugin.js.map +1 -1
  49. package/cjs/render/contributions/render/draw-interceptor.js +2 -3
  50. package/cjs/render/contributions/render/draw-interceptor.js.map +1 -1
  51. package/cjs/render/contributions/render/text-render.d.ts +1 -1
  52. package/cjs/render/contributions/render/text-render.js +24 -46
  53. package/cjs/render/contributions/render/text-render.js.map +1 -1
  54. package/dist/index.es.js +2725 -2712
  55. package/es/animate/Ticker/default-ticker.d.ts +4 -2
  56. package/es/animate/Ticker/default-ticker.js +9 -6
  57. package/es/animate/Ticker/default-ticker.js.map +1 -1
  58. package/es/animate/custom-animate.d.ts +2 -0
  59. package/es/animate/custom-animate.js +11 -2
  60. package/es/animate/custom-animate.js.map +1 -1
  61. package/es/common/color-utils.js +2 -2
  62. package/es/common/color-utils.js.map +1 -1
  63. package/es/core/contributions/textMeasure/AtextMeasure.d.ts +56 -4
  64. package/es/core/contributions/textMeasure/AtextMeasure.js +108 -13
  65. package/es/core/contributions/textMeasure/AtextMeasure.js.map +1 -1
  66. package/es/core/contributions/textMeasure/layout.d.ts +7 -3
  67. package/es/core/contributions/textMeasure/layout.js +40 -39
  68. package/es/core/contributions/textMeasure/layout.js.map +1 -1
  69. package/es/core/stage.d.ts +2 -0
  70. package/es/core/stage.js +9 -5
  71. package/es/core/stage.js.map +1 -1
  72. package/es/graphic/config.d.ts +1 -1
  73. package/es/graphic/config.js +5 -1
  74. package/es/graphic/config.js.map +1 -1
  75. package/es/graphic/graphic-service/graphic-service.d.ts +2 -0
  76. package/es/graphic/graphic-service/graphic-service.js +11 -4
  77. package/es/graphic/graphic-service/graphic-service.js.map +1 -1
  78. package/es/graphic/richtext/line.js +3 -10
  79. package/es/graphic/richtext/line.js.map +1 -1
  80. package/es/graphic/richtext/paragraph.js +3 -2
  81. package/es/graphic/richtext/paragraph.js.map +1 -1
  82. package/es/graphic/richtext/utils.d.ts +1 -2
  83. package/es/graphic/richtext/utils.js +2 -6
  84. package/es/graphic/richtext/utils.js.map +1 -1
  85. package/es/graphic/text.d.ts +11 -11
  86. package/es/graphic/text.js +98 -165
  87. package/es/graphic/text.js.map +1 -1
  88. package/es/graphic/wrap-text.js +12 -4
  89. package/es/graphic/wrap-text.js.map +1 -1
  90. package/es/interface/animate.d.ts +3 -1
  91. package/es/interface/animate.js.map +1 -1
  92. package/es/interface/graphic/text.d.ts +9 -3
  93. package/es/interface/graphic/text.js +6 -1
  94. package/es/interface/graphic/text.js.map +1 -1
  95. package/es/interface/graphic-service.d.ts +2 -0
  96. package/es/interface/graphic-service.js.map +1 -1
  97. package/es/interface/stage.d.ts +1 -0
  98. package/es/interface/stage.js.map +1 -1
  99. package/es/interface/text.d.ts +9 -1
  100. package/es/interface/text.js.map +1 -1
  101. package/es/plugins/builtin-plugin/dirty-bounds-plugin.js +3 -0
  102. package/es/plugins/builtin-plugin/dirty-bounds-plugin.js.map +1 -1
  103. package/es/render/contributions/render/draw-interceptor.js +2 -3
  104. package/es/render/contributions/render/draw-interceptor.js.map +1 -1
  105. package/es/render/contributions/render/text-render.d.ts +1 -1
  106. package/es/render/contributions/render/text-render.js +23 -45
  107. package/es/render/contributions/render/text-render.js.map +1 -1
  108. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/graphic/richtext/utils.ts"],"names":[],"mappings":"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","file":"utils.js","sourcesContent":["import type { IBoundsLike } from '@visactor/vutils';\nimport { application } from '../../application';\nimport { createColor } from '../../common/canvas-utils';\nimport type { IContext2d, ITextStyleParams, IRichTextParagraphCharacter } from '../../interface';\n\nexport const DIRECTION_KEY = {\n horizontal: {\n width: 'width',\n height: 'height',\n left: 'left',\n top: 'top',\n x: 'x',\n y: 'y',\n bottom: 'bottom'\n },\n vertical: {\n width: 'height',\n height: 'width',\n left: 'top',\n top: 'left',\n x: 'y',\n y: 'x',\n bottom: 'right'\n }\n};\n\nconst defaultFormatting = {\n fontSize: 16,\n fontFamily: 'sans-serif',\n fill: true,\n stroke: false,\n fontWeight: 'normal',\n lineHeight: 'normal',\n fontStyle: 'normal', // normal, italic, oblique\n textDecoration: 'none', // none, underline, line-through\n textAlign: 'left', // left, right, center\n script: 'normal' // normal, sub, super\n};\nconst nbsp = String.fromCharCode(160);\n\nexport const regLetter = /\\w|\\(|\\)|-/;\nconst regPunctuation = /[.?!,;:/,。?!、;:]/;\nexport const regFirstSpace = /\\S/;\n\nconst setTextStyle = (ctx: IContext2d, character: IRichTextParagraphCharacter) => {\n let fontSize = character.fontSize || 16;\n switch (character.script) {\n case 'super':\n case 'sub':\n fontSize *= 0.8;\n break;\n }\n\n ctx.setTextStyle({\n textAlign: 'left',\n textBaseline: character.textBaseline || 'alphabetic',\n fontStyle: character.fontStyle || '',\n fontWeight: character.fontWeight || '',\n fontSize,\n fontFamily: character.fontFamily || 'sans-serif'\n } as ITextStyleParams);\n};\n\n// Applies the style of a run to the canvas context\nexport function applyFillStyle(ctx: IContext2d, character: IRichTextParagraphCharacter, b?: IBoundsLike) {\n const fillStyle = (character && (character.fill as string)) || defaultFormatting.fill;\n if (!fillStyle) {\n ctx.globalAlpha = 0;\n return;\n }\n\n const { fillOpacity = 1, opacity = 1 } = character;\n\n ctx.globalAlpha = fillOpacity * opacity;\n ctx.fillStyle = b ? createColor(ctx, fillStyle, { AABBBounds: b }) : (fillStyle as string);\n\n setTextStyle(ctx, character);\n}\n\nexport function applyStrokeStyle(ctx: IContext2d, character: IRichTextParagraphCharacter) {\n const strokeStyle = (character && (character.stroke as string)) || (defaultFormatting.stroke as any);\n if (!strokeStyle) {\n ctx.globalAlpha = 0;\n return;\n }\n\n const { strokeOpacity = 1, opacity = 1 } = character;\n\n ctx.globalAlpha = strokeOpacity * opacity;\n ctx.lineWidth = character && typeof character.lineWidth === 'number' ? character.lineWidth : 1;\n ctx.strokeStyle = strokeStyle as string;\n\n setTextStyle(ctx, character);\n}\n\nexport function prepareContext(ctx: IContext2d) {\n ctx.setTextStyle({\n textAlign: 'left',\n textBaseline: 'bottom'\n });\n}\n\n// 确认达到availableWidth的字符串截取index\nexport function getStrByWithDom(\n desc: string,\n width: number,\n style: string,\n guessIndex: number,\n needTestLetter?: boolean\n): number {\n desc = desc.replace(/\\s/g, nbsp);\n\n // 测量用DOM\n const span = document.createElement('span');\n span.setAttribute('style', style);\n span.style.visibility = 'hidden';\n span.style.whiteSpace = 'nowrap';\n document.body.appendChild(span);\n\n // 测量从头到当前位置宽度以及从头到下一个字符位置宽度\n let index = guessIndex;\n let temp = desc.slice(0, index);\n span.innerText = temp;\n let tempWidth = span.offsetWidth;\n\n let tempNext = desc.slice(0, index + 1);\n span.innerText = tempNext;\n let tempWidthNext = span.offsetWidth;\n\n // 到当前位置宽度 < width && 到下一个字符位置宽度 > width时,认为找到准确阶段位置\n while (tempWidth > width || tempWidthNext <= width) {\n if (tempWidth > width) {\n index--;\n } else {\n index++;\n }\n\n temp = desc.slice(0, index);\n span.innerText = temp;\n tempWidth = span.offsetWidth;\n\n tempNext = desc.slice(0, index + 1);\n span.innerText = tempNext;\n tempWidthNext = span.offsetWidth;\n }\n\n // 处理特殊情况\n if (needTestLetter) {\n index = testLetter(desc, index);\n }\n\n document.body.removeChild(span);\n return index;\n}\nexport function getStrByWithCanvas(\n desc: string,\n width: number,\n character: IRichTextParagraphCharacter,\n // ctx: IContext2d,\n guessIndex: number,\n needTestLetter?: boolean\n): number {\n if (!width || width <= 0) {\n return 0;\n }\n const textMeasure = application.graphicUtil.textMeasure;\n // const measurement = textMeasure.measureText(text, character);\n\n // 测量从头到当前位置宽度以及从头到下一个字符位置宽度\n let index = guessIndex;\n let temp = desc.slice(0, index);\n let tempWidth = Math.floor(textMeasure.measureText(temp, character as any).width);\n\n let tempNext = desc.slice(0, index + 1);\n let tempWidthNext = Math.floor(textMeasure.measureText(tempNext, character as any).width);\n\n // 到当前位置宽度 < width && 到下一个字符位置宽度 > width时,认为找到准确阶段位置\n while (tempWidth > width || tempWidthNext <= width) {\n if (tempWidth > width) {\n index--;\n } else {\n index++;\n }\n\n if (index > desc.length) {\n index = desc.length;\n break;\n } else if (index < 0) {\n index = 0;\n break;\n }\n\n temp = desc.slice(0, index);\n tempWidth = Math.floor(textMeasure.measureText(temp, character as any).width);\n\n tempNext = desc.slice(0, index + 1);\n tempWidthNext = Math.floor(textMeasure.measureText(tempNext, character as any).width);\n }\n\n // 处理特殊情况\n if (needTestLetter) {\n index = testLetter(desc, index);\n }\n\n return index;\n}\n\n/**\n * 向前找到单词结尾处换行\n * @param string\n * @param index\n * @param negativeWrongMatch 如果为true,那么如果无法匹配就会向后找到单词的结尾,否则就直接返回index\n * @returns\n */\nexport function testLetter(string: string, index: number, negativeWrongMatch: boolean = false): number {\n let i = index;\n // 切分前后都是英文字母数字下划线,向前找到非英文字母处换行\n while (\n (regLetter.test(string[i - 1]) && regLetter.test(string[i])) ||\n // 行首标点符号处理\n regPunctuation.test(string[i])\n ) {\n i--;\n // 无法满足所有条件,放弃匹配,直接截断,避免陷入死循环\n if (i <= 0) {\n return negativeWrongMatch ? testLetter2(string, index) : index;\n }\n }\n return i;\n}\n\n/**\n * 向后找到单词结尾处换行\n * @param string\n * @param index\n * @returns\n */\nexport function testLetter2(string: string, index: number) {\n let i = index;\n // 切分前后都是英文字母数字下划线,向前找到非英文字母处换行\n while (\n (regLetter.test(string[i - 1]) && regLetter.test(string[i])) ||\n // 行首标点符号处理\n regPunctuation.test(string[i])\n ) {\n i++;\n // 无法满足所有条件,放弃匹配,直接截断,避免陷入死循环\n if (i >= string.length) {\n return i;\n }\n }\n return i;\n}\n\n// 测量文字详细信息\nexport function measureTextDom(\n text: string,\n style: string\n): { ascent?: number; height?: number; descent?: number; width?: number } {\n let div;\n\n const span = document.createElement('span');\n const block = document.createElement('div');\n div = document.createElement('div');\n\n block.style.display = 'inline-block';\n block.style.width = '1px';\n block.style.height = '0';\n\n div.style.visibility = 'hidden';\n div.style.position = 'absolute';\n div.style.top = '0';\n div.style.left = '0';\n div.style.width = '500px';\n div.style.height = '200px';\n div.style.whiteSpace = 'nowrap';\n\n div.appendChild(span);\n div.appendChild(block);\n document.body.appendChild(div);\n\n const result: { ascent?: number; height?: number; descent?: number; width?: number } = {};\n try {\n span.setAttribute('style', style);\n span.style.whiteSpace = 'nowrap';\n span.style.display = 'inline-block';\n\n span.innerHTML = '';\n span.appendChild(document.createTextNode(text.replace(/\\s/g, nbsp)));\n\n block.style.verticalAlign = 'baseline';\n result.ascent = block.offsetTop - span.offsetTop;\n block.style.verticalAlign = 'bottom';\n result.height = block.offsetTop - span.offsetTop;\n result.descent = result.height - result.ascent;\n result.width = span.offsetWidth;\n } finally {\n div.parentNode?.removeChild(div);\n div = null;\n }\n return result;\n}\n\n// 测量文字详细信息\nexport function measureTextCanvas(\n text: string,\n character: IRichTextParagraphCharacter\n): { ascent: number; height: number; descent: number; width: number } {\n const textMeasure = application.graphicUtil.textMeasure;\n const measurement = textMeasure.measureText(text, character as any) as TextMetrics;\n const result: { ascent: number; height: number; descent: number; width: number } = {\n ascent: 0,\n height: 0,\n descent: 0,\n width: 0\n };\n if (\n typeof measurement.actualBoundingBoxAscent !== 'number' ||\n typeof measurement.actualBoundingBoxDescent !== 'number'\n ) {\n result.width = Math.floor(measurement.width);\n result.height = character.fontSize || 0;\n result.ascent = result.height;\n result.descent = 0;\n } else {\n result.width = Math.floor(measurement.width);\n result.height = Math.floor(measurement.actualBoundingBoxAscent + measurement.actualBoundingBoxDescent);\n result.ascent = Math.floor(measurement.actualBoundingBoxAscent);\n result.descent = result.height - result.ascent;\n }\n return result;\n}\n\nexport function getFontString(character: IRichTextParagraphCharacter, ctx: IContext2d | null) {\n let fontSize = (character && character.fontSize) || defaultFormatting.fontSize;\n\n if (character) {\n switch (character.script) {\n case 'super':\n case 'sub':\n fontSize *= 0.8;\n break;\n }\n }\n\n return (\n ((character && character.fontStyle) || '') +\n ' ' +\n ((character && character.fontWeight) || '') +\n ' ' +\n (fontSize || 12) +\n 'px ' +\n ((character && character.fontFamily) || defaultFormatting.fontFamily)\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/graphic/richtext/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,UAAU,EAAE;QACV,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,MAAM,EAAE,QAAQ;KACjB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,MAAM;QACX,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,MAAM,EAAE,OAAO;KAChB;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,QAAQ;IACpB,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,QAAQ;IACnB,cAAc,EAAE,MAAM;IACtB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,QAAQ;CACjB,CAAC;AACF,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AACtC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,GAAe,EAAE,SAAsC,EAAE,EAAE;IAC/E,IAAI,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,QAAQ,SAAS,CAAC,MAAM,EAAE;QACxB,KAAK,OAAO,CAAC;QACb,KAAK,KAAK;YACR,QAAQ,IAAI,GAAG,CAAC;YAChB,MAAM;KACT;IAED,GAAG,CAAC,YAAY,CAAC;QACf,SAAS,EAAE,MAAM;QACjB,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,YAAY;QACpD,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE;QACpC,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,EAAE;QACtC,QAAQ;QACR,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,YAAY;KAC7B,CAAC,CAAC;AACzB,CAAC,CAAC;AAGF,MAAM,UAAU,cAAc,CAAC,GAAe,EAAE,SAAsC;IACpF,MAAM,SAAS,GAAG,CAAC,SAAS,IAAK,SAAS,CAAC,IAAe,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC;IACtF,IAAI,CAAC,SAAS,EAAE;QACd,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;QACpB,OAAO;KACR;IAED,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IAEnD,GAAG,CAAC,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;IACxC,GAAG,CAAC,SAAS,GAAG,SAAmB,CAAC;IAEpC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAe,EAAE,SAAsC;IACtF,MAAM,WAAW,GAAG,CAAC,SAAS,IAAK,SAAS,CAAC,MAAiB,CAAC,IAAK,iBAAiB,CAAC,MAAc,CAAC;IACrG,IAAI,CAAC,WAAW,EAAE;QAChB,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;QACpB,OAAO;KACR;IAED,MAAM,EAAE,aAAa,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IAErD,GAAG,CAAC,WAAW,GAAG,aAAa,GAAG,OAAO,CAAC;IAC1C,GAAG,CAAC,SAAS,GAAG,SAAS,IAAI,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,GAAG,CAAC,WAAW,GAAG,WAAqB,CAAC;IAExC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAe;IAC5C,GAAG,CAAC,YAAY,CAAC;QACf,SAAS,EAAE,MAAM;QACjB,YAAY,EAAE,QAAQ;KACvB,CAAC,CAAC;AACL,CAAC;AAGD,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,KAAa,EACb,KAAa,EACb,UAAkB,EAClB,cAAwB;IAExB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAGjC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAGhC,IAAI,KAAK,GAAG,UAAU,CAAC;IACvB,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACtB,IAAI,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;IAEjC,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC1B,IAAI,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC;IAGrC,OAAO,SAAS,GAAG,KAAK,IAAI,aAAa,IAAI,KAAK,EAAE;QAClD,IAAI,SAAS,GAAG,KAAK,EAAE;YACrB,KAAK,EAAE,CAAC;SACT;aAAM;YACL,KAAK,EAAE,CAAC;SACT;QAED,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QAE7B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC;KAClC;IAGD,IAAI,cAAc,EAAE;QAClB,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACjC;IAED,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,KAAa,EACb,SAAsC,EAEtC,UAAkB,EAClB,cAAwB;IAExB,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,EAAE;QACxB,OAAO,CAAC,CAAC;KACV;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;IAIxD,IAAI,KAAK,GAAG,UAAU,CAAC;IACvB,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChC,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,SAAgB,CAAC,CAAC,KAAK,CAAC,CAAC;IAElF,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACxC,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAgB,CAAC,CAAC,KAAK,CAAC,CAAC;IAG1F,OAAO,SAAS,GAAG,KAAK,IAAI,aAAa,IAAI,KAAK,EAAE;QAClD,IAAI,SAAS,GAAG,KAAK,EAAE;YACrB,KAAK,EAAE,CAAC;SACT;aAAM;YACL,KAAK,EAAE,CAAC;SACT;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;YACvB,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACpB,MAAM;SACP;aAAM,IAAI,KAAK,GAAG,CAAC,EAAE;YACpB,KAAK,GAAG,CAAC,CAAC;YACV,MAAM;SACP;QAED,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5B,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,SAAgB,CAAC,CAAC,KAAK,CAAC,CAAC;QAE9E,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAgB,CAAC,CAAC,KAAK,CAAC,CAAC;KACvF;IAGD,IAAI,cAAc,EAAE;QAClB,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACjC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AASD,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,KAAa,EAAE,qBAA8B,KAAK;IAC3F,IAAI,CAAC,GAAG,KAAK,CAAC;IAEd,OACE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5D,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAC9B;QACA,CAAC,EAAE,CAAC;QAEJ,IAAI,CAAC,IAAI,CAAC,EAAE;YACV,OAAO,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SAChE;KACF;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAQD,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,KAAa;IACvD,IAAI,CAAC,GAAG,KAAK,CAAC;IAEd,OACE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5D,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAC9B;QACA,CAAC,EAAE,CAAC;QAEJ,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;YACtB,OAAO,CAAC,CAAC;SACV;KACF;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAGD,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,KAAa;;IAEb,IAAI,GAAG,CAAC;IAER,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAEpC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;IACrC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC1B,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IAEzB,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;IACpB,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;IACrB,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;IAC3B,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IAEhC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACtB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE/B,MAAM,MAAM,GAA2E,EAAE,CAAC;IAC1F,IAAI;QACF,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;QAEpC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAErE,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC;QACvC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjD,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC;QACrC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjD,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/C,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;KACjC;YAAS;QACR,MAAA,GAAG,CAAC,UAAU,0CAAE,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,GAAG,GAAG,IAAI,CAAC;KACZ;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,SAAsC;IAEtC,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;IACxD,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,SAAgB,CAAgB,CAAC;IACnF,MAAM,MAAM,GAAuE;QACjF,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,CAAC;KACT,CAAC;IACF,IACE,OAAO,WAAW,CAAC,uBAAuB,KAAK,QAAQ;QACvD,OAAO,WAAW,CAAC,wBAAwB,KAAK,QAAQ,EACxD;QACA,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;KACpB;SAAM;QACL,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,uBAAuB,GAAG,WAAW,CAAC,wBAAwB,CAAC,CAAC;QACvG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;QAChE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;KAChD;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAsC,EAAE,GAAsB;IAC1F,IAAI,QAAQ,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC;IAE/E,IAAI,SAAS,EAAE;QACb,QAAQ,SAAS,CAAC,MAAM,EAAE;YACxB,KAAK,OAAO,CAAC;YACb,KAAK,KAAK;gBACR,QAAQ,IAAI,GAAG,CAAC;gBAChB,MAAM;SACT;KACF;IAED,OAAO,CACL,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1C,GAAG;QACH,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC3C,GAAG;QACH,CAAC,QAAQ,IAAI,EAAE,CAAC;QAChB,KAAK;QACL,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,iBAAiB,CAAC,UAAU,CAAC,CACtE,CAAC;AACJ,CAAC","file":"utils.js","sourcesContent":["import { application } from '../../application';\nimport type { IContext2d, ITextStyleParams, IRichTextParagraphCharacter } from '../../interface';\n\nexport const DIRECTION_KEY = {\n horizontal: {\n width: 'width',\n height: 'height',\n left: 'left',\n top: 'top',\n x: 'x',\n y: 'y',\n bottom: 'bottom'\n },\n vertical: {\n width: 'height',\n height: 'width',\n left: 'top',\n top: 'left',\n x: 'y',\n y: 'x',\n bottom: 'right'\n }\n};\n\nconst defaultFormatting = {\n fontSize: 16,\n fontFamily: 'sans-serif',\n fill: true,\n stroke: false,\n fontWeight: 'normal',\n lineHeight: 'normal',\n fontStyle: 'normal', // normal, italic, oblique\n textDecoration: 'none', // none, underline, line-through\n textAlign: 'left', // left, right, center\n script: 'normal' // normal, sub, super\n};\nconst nbsp = String.fromCharCode(160);\n\nexport const regLetter = /\\w|\\(|\\)|-/;\nconst regPunctuation = /[.?!,;:/,。?!、;:]/;\nexport const regFirstSpace = /\\S/;\n\nconst setTextStyle = (ctx: IContext2d, character: IRichTextParagraphCharacter) => {\n let fontSize = character.fontSize || 16;\n switch (character.script) {\n case 'super':\n case 'sub':\n fontSize *= 0.8;\n break;\n }\n\n ctx.setTextStyle({\n textAlign: 'left',\n textBaseline: character.textBaseline || 'alphabetic',\n fontStyle: character.fontStyle || '',\n fontWeight: character.fontWeight || '',\n fontSize,\n fontFamily: character.fontFamily || 'sans-serif'\n } as ITextStyleParams);\n};\n\n// Applies the style of a run to the canvas context\nexport function applyFillStyle(ctx: IContext2d, character: IRichTextParagraphCharacter) {\n const fillStyle = (character && (character.fill as string)) || defaultFormatting.fill;\n if (!fillStyle) {\n ctx.globalAlpha = 0;\n return;\n }\n\n const { fillOpacity = 1, opacity = 1 } = character;\n\n ctx.globalAlpha = fillOpacity * opacity;\n ctx.fillStyle = fillStyle as string;\n\n setTextStyle(ctx, character);\n}\n\nexport function applyStrokeStyle(ctx: IContext2d, character: IRichTextParagraphCharacter) {\n const strokeStyle = (character && (character.stroke as string)) || (defaultFormatting.stroke as any);\n if (!strokeStyle) {\n ctx.globalAlpha = 0;\n return;\n }\n\n const { strokeOpacity = 1, opacity = 1 } = character;\n\n ctx.globalAlpha = strokeOpacity * opacity;\n ctx.lineWidth = character && typeof character.lineWidth === 'number' ? character.lineWidth : 1;\n ctx.strokeStyle = strokeStyle as string;\n\n setTextStyle(ctx, character);\n}\n\nexport function prepareContext(ctx: IContext2d) {\n ctx.setTextStyle({\n textAlign: 'left',\n textBaseline: 'bottom'\n });\n}\n\n// 确认达到availableWidth的字符串截取index\nexport function getStrByWithDom(\n desc: string,\n width: number,\n style: string,\n guessIndex: number,\n needTestLetter?: boolean\n): number {\n desc = desc.replace(/\\s/g, nbsp);\n\n // 测量用DOM\n const span = document.createElement('span');\n span.setAttribute('style', style);\n span.style.visibility = 'hidden';\n span.style.whiteSpace = 'nowrap';\n document.body.appendChild(span);\n\n // 测量从头到当前位置宽度以及从头到下一个字符位置宽度\n let index = guessIndex;\n let temp = desc.slice(0, index);\n span.innerText = temp;\n let tempWidth = span.offsetWidth;\n\n let tempNext = desc.slice(0, index + 1);\n span.innerText = tempNext;\n let tempWidthNext = span.offsetWidth;\n\n // 到当前位置宽度 < width && 到下一个字符位置宽度 > width时,认为找到准确阶段位置\n while (tempWidth > width || tempWidthNext <= width) {\n if (tempWidth > width) {\n index--;\n } else {\n index++;\n }\n\n temp = desc.slice(0, index);\n span.innerText = temp;\n tempWidth = span.offsetWidth;\n\n tempNext = desc.slice(0, index + 1);\n span.innerText = tempNext;\n tempWidthNext = span.offsetWidth;\n }\n\n // 处理特殊情况\n if (needTestLetter) {\n index = testLetter(desc, index);\n }\n\n document.body.removeChild(span);\n return index;\n}\nexport function getStrByWithCanvas(\n desc: string,\n width: number,\n character: IRichTextParagraphCharacter,\n // ctx: IContext2d,\n guessIndex: number,\n needTestLetter?: boolean\n): number {\n if (!width || width <= 0) {\n return 0;\n }\n const textMeasure = application.graphicUtil.textMeasure;\n // const measurement = textMeasure.measureText(text, character);\n\n // 测量从头到当前位置宽度以及从头到下一个字符位置宽度\n let index = guessIndex;\n let temp = desc.slice(0, index);\n let tempWidth = Math.floor(textMeasure.measureText(temp, character as any).width);\n\n let tempNext = desc.slice(0, index + 1);\n let tempWidthNext = Math.floor(textMeasure.measureText(tempNext, character as any).width);\n\n // 到当前位置宽度 < width && 到下一个字符位置宽度 > width时,认为找到准确阶段位置\n while (tempWidth > width || tempWidthNext <= width) {\n if (tempWidth > width) {\n index--;\n } else {\n index++;\n }\n\n if (index > desc.length) {\n index = desc.length;\n break;\n } else if (index < 0) {\n index = 0;\n break;\n }\n\n temp = desc.slice(0, index);\n tempWidth = Math.floor(textMeasure.measureText(temp, character as any).width);\n\n tempNext = desc.slice(0, index + 1);\n tempWidthNext = Math.floor(textMeasure.measureText(tempNext, character as any).width);\n }\n\n // 处理特殊情况\n if (needTestLetter) {\n index = testLetter(desc, index);\n }\n\n return index;\n}\n\n/**\n * 向前找到单词结尾处换行\n * @param string\n * @param index\n * @param negativeWrongMatch 如果为true,那么如果无法匹配就会向后找到单词的结尾,否则就直接返回index\n * @returns\n */\nexport function testLetter(string: string, index: number, negativeWrongMatch: boolean = false): number {\n let i = index;\n // 切分前后都是英文字母数字下划线,向前找到非英文字母处换行\n while (\n (regLetter.test(string[i - 1]) && regLetter.test(string[i])) ||\n // 行首标点符号处理\n regPunctuation.test(string[i])\n ) {\n i--;\n // 无法满足所有条件,放弃匹配,直接截断,避免陷入死循环\n if (i <= 0) {\n return negativeWrongMatch ? testLetter2(string, index) : index;\n }\n }\n return i;\n}\n\n/**\n * 向后找到单词结尾处换行\n * @param string\n * @param index\n * @returns\n */\nexport function testLetter2(string: string, index: number) {\n let i = index;\n // 切分前后都是英文字母数字下划线,向前找到非英文字母处换行\n while (\n (regLetter.test(string[i - 1]) && regLetter.test(string[i])) ||\n // 行首标点符号处理\n regPunctuation.test(string[i])\n ) {\n i++;\n // 无法满足所有条件,放弃匹配,直接截断,避免陷入死循环\n if (i >= string.length) {\n return i;\n }\n }\n return i;\n}\n\n// 测量文字详细信息\nexport function measureTextDom(\n text: string,\n style: string\n): { ascent?: number; height?: number; descent?: number; width?: number } {\n let div;\n\n const span = document.createElement('span');\n const block = document.createElement('div');\n div = document.createElement('div');\n\n block.style.display = 'inline-block';\n block.style.width = '1px';\n block.style.height = '0';\n\n div.style.visibility = 'hidden';\n div.style.position = 'absolute';\n div.style.top = '0';\n div.style.left = '0';\n div.style.width = '500px';\n div.style.height = '200px';\n div.style.whiteSpace = 'nowrap';\n\n div.appendChild(span);\n div.appendChild(block);\n document.body.appendChild(div);\n\n const result: { ascent?: number; height?: number; descent?: number; width?: number } = {};\n try {\n span.setAttribute('style', style);\n span.style.whiteSpace = 'nowrap';\n span.style.display = 'inline-block';\n\n span.innerHTML = '';\n span.appendChild(document.createTextNode(text.replace(/\\s/g, nbsp)));\n\n block.style.verticalAlign = 'baseline';\n result.ascent = block.offsetTop - span.offsetTop;\n block.style.verticalAlign = 'bottom';\n result.height = block.offsetTop - span.offsetTop;\n result.descent = result.height - result.ascent;\n result.width = span.offsetWidth;\n } finally {\n div.parentNode?.removeChild(div);\n div = null;\n }\n return result;\n}\n\n// 测量文字详细信息\nexport function measureTextCanvas(\n text: string,\n character: IRichTextParagraphCharacter\n): { ascent: number; height: number; descent: number; width: number } {\n const textMeasure = application.graphicUtil.textMeasure;\n const measurement = textMeasure.measureText(text, character as any) as TextMetrics;\n const result: { ascent: number; height: number; descent: number; width: number } = {\n ascent: 0,\n height: 0,\n descent: 0,\n width: 0\n };\n if (\n typeof measurement.actualBoundingBoxAscent !== 'number' ||\n typeof measurement.actualBoundingBoxDescent !== 'number'\n ) {\n result.width = Math.floor(measurement.width);\n result.height = character.fontSize || 0;\n result.ascent = result.height;\n result.descent = 0;\n } else {\n result.width = Math.floor(measurement.width);\n result.height = Math.floor(measurement.actualBoundingBoxAscent + measurement.actualBoundingBoxDescent);\n result.ascent = Math.floor(measurement.actualBoundingBoxAscent);\n result.descent = result.height - result.ascent;\n }\n return result;\n}\n\nexport function getFontString(character: IRichTextParagraphCharacter, ctx: IContext2d | null) {\n let fontSize = (character && character.fontSize) || defaultFormatting.fontSize;\n\n if (character) {\n switch (character.script) {\n case 'super':\n case 'sub':\n fontSize *= 0.8;\n break;\n }\n }\n\n return (\n ((character && character.fontStyle) || '') +\n ' ' +\n ((character && character.fontWeight) || '') +\n ' ' +\n (fontSize || 12) +\n 'px ' +\n ((character && character.fontFamily) || defaultFormatting.fontFamily)\n );\n}\n"]}
@@ -48,7 +48,6 @@ export declare class Text extends Graphic<ITextGraphicAttribute> implements ITex
48
48
  get clipedWidth(): number | undefined;
49
49
  get cliped(): boolean | undefined;
50
50
  get multilineLayout(): LayoutType | undefined;
51
- private isSimplify;
52
51
  get isMultiLine(): boolean;
53
52
  constructor(params?: ITextGraphicAttribute);
54
53
  isValid(): boolean;
@@ -56,10 +55,18 @@ export declare class Text extends Graphic<ITextGraphicAttribute> implements ITex
56
55
  getGraphicTheme(): Required<ITextGraphicAttribute>;
57
56
  protected doUpdateOBBBounds(): IOBBBounds;
58
57
  protected updateAABBBounds(attribute: ITextGraphicAttribute, textTheme: Required<ITextGraphicAttribute>, aabbBounds: IAABBBounds): import("@visactor/vutils").IBounds;
59
- updateWrapAABBBounds(text: (number | string) | (number | string)[]): import("@visactor/vutils").IBounds;
60
58
  updateSingallineAABBBounds(text: number | string): IAABBBounds;
61
- updateMultilineAABBBounds(text: (number | string)[]): IAABBBounds;
62
- updateHorizontalSinglelineAABBBounds(text: number | string): IAABBBounds;
59
+ protected updateMultilineAABBBounds(text: (number | string)[]): IAABBBounds;
60
+ guessLineHeightBuf(fontSize: number): number;
61
+ updateHorizontalMultilineAABBBounds(text: (number | string)[]): IAABBBounds;
62
+ updateWrapAABBBounds(text: (number | string) | (number | string)[]): import("@visactor/vutils").IBounds;
63
+ updateVerticalMultilineAABBBounds(text: (number | string)[]): IAABBBounds;
64
+ protected getMaxWidth(theme: ITextGraphicAttribute): number;
65
+ protected getLineHeight(attribute: ITextGraphicAttribute, textTheme: ITextGraphicAttribute): number;
66
+ protected needUpdateTags(keys: string[], k?: string[]): boolean;
67
+ protected needUpdateTag(key: string, k?: string[]): boolean;
68
+ clone(): Text;
69
+ getNoWorkAnimateAttr(): Record<string, number>;
63
70
  getBaselineMapAlign(): Record<string, string>;
64
71
  getAlignMapBaseline(): Record<string, string>;
65
72
  static baselineMapAlign: {
@@ -72,12 +79,5 @@ export declare class Text extends Graphic<ITextGraphicAttribute> implements ITex
72
79
  right: string;
73
80
  center: string;
74
81
  };
75
- updateVerticalSinglelineAABBBounds(text: number | string): IAABBBounds;
76
- updateHorizontalMultilineAABBBounds(text: (number | string)[]): IAABBBounds;
77
- updateVerticalMultilineAABBBounds(text: (number | string)[]): IAABBBounds;
78
- protected needUpdateTags(keys: string[], k?: string[]): boolean;
79
- protected needUpdateTag(key: string, k?: string[]): boolean;
80
- clone(): Text;
81
- getNoWorkAnimateAttr(): Record<string, number>;
82
82
  }
83
83
  export declare function createText(attributes: ITextGraphicAttribute): IText;
@@ -16,7 +16,7 @@ import { TEXT_NUMBER_TYPE } from "./constants";
16
16
 
17
17
  import { boundStroke, TextDirection, verticalLayout } from "./tools";
18
18
 
19
- const TEXT_UPDATE_TAG_KEY = [ "text", "maxLineWidth", "textAlign", "textBaseline", "heightLimit", "lineClamp", "fontSize", "fontFamily", "fontWeight", "ellipsis", "lineHeight", "direction", "wordBreak", "heightLimit", "lineClamp", ...GRAPHIC_UPDATE_TAG_KEY ];
19
+ const TEXT_UPDATE_TAG_KEY = [ "text", "maxLineWidth", "maxWidth", "textAlign", "textBaseline", "heightLimit", "lineClamp", "fontSize", "fontFamily", "fontWeight", "ellipsis", "lineHeight", "direction", "wordBreak", "heightLimit", "lineClamp", ...GRAPHIC_UPDATE_TAG_KEY ];
20
20
 
21
21
  export class Text extends Graphic {
22
22
  get font() {
@@ -25,18 +25,17 @@ export class Text extends Graphic {
25
25
  }
26
26
  get clipedText() {
27
27
  var _a;
28
- const attribute = this.attribute, textTheme = this.getGraphicTheme();
29
- if (!this.isSimplify()) return;
30
- const {maxLineWidth: maxLineWidth = textTheme.maxLineWidth} = attribute;
31
- return Number.isFinite(maxLineWidth) ? (this.tryUpdateAABBBounds(), this.cache.clipedText) : (null !== (_a = attribute.text) && void 0 !== _a ? _a : textTheme.text).toString();
28
+ const attribute = this.attribute, textTheme = this.getGraphicTheme(), maxWidth = this.getMaxWidth(textTheme);
29
+ return Number.isFinite(maxWidth) ? (this.tryUpdateAABBBounds(), this.cache.clipedText) : (null !== (_a = attribute.text) && void 0 !== _a ? _a : textTheme.text).toString();
32
30
  }
33
31
  get clipedWidth() {
34
- if (this.isSimplify()) return this.tryUpdateAABBBounds(), this.cache.clipedWidth;
32
+ return this.tryUpdateAABBBounds(), this.cache.clipedWidth;
35
33
  }
36
34
  get cliped() {
37
35
  var _a, _b;
38
- const textTheme = this.getGraphicTheme(), attribute = this.attribute, {maxLineWidth: maxLineWidth = textTheme.maxLineWidth, text: text, whiteSpace: whiteSpace = textTheme.whiteSpace} = attribute;
39
- if (!Number.isFinite(maxLineWidth)) return !1;
36
+ const textTheme = this.getGraphicTheme(), attribute = this.attribute, maxWidth = this.getMaxWidth(textTheme);
37
+ if (!Number.isFinite(maxWidth)) return !1;
38
+ const {text: text} = this.attribute;
40
39
  if (this.tryUpdateAABBBounds(), null === (_b = null === (_a = this.cache) || void 0 === _a ? void 0 : _a.layoutData) || void 0 === _b ? void 0 : _b.lines) {
41
40
  let mergedText = "";
42
41
  this.cache.layoutData.lines.forEach((item => {
@@ -47,10 +46,7 @@ export class Text extends Graphic {
47
46
  return "vertical" === attribute.direction && this.cache.verticalList && this.cache.verticalList[0] ? this.cache.verticalList[0].map((item => item.text)).join("") !== attribute.text.toString() : null != this.clipedText && this.clipedText !== attribute.text.toString();
48
47
  }
49
48
  get multilineLayout() {
50
- if (this.isMultiLine) return this.tryUpdateAABBBounds(), this.cache.layoutData;
51
- }
52
- isSimplify() {
53
- return !this.isMultiLine && "vertical" !== this.attribute.direction;
49
+ return this.tryUpdateAABBBounds(), this.cache.layoutData;
54
50
  }
55
51
  get isMultiLine() {
56
52
  return Array.isArray(this.attribute.text) || "normal" === this.attribute.whiteSpace;
@@ -103,19 +99,59 @@ export class Text extends Graphic {
103
99
  return application.graphicService.combindShadowAABBBounds(aabbBounds, this), null == attribute.forceBoundsHeight && null == attribute.forceBoundsWidth || application.graphicService.updateHTMLTextAABBBounds(attribute, textTheme, aabbBounds),
104
100
  transformBoundsWithMatrix(aabbBounds, aabbBounds, this.transMatrix), aabbBounds;
105
101
  }
102
+ updateSingallineAABBBounds(text) {
103
+ this.updateMultilineAABBBounds([ text ]);
104
+ const layoutData = this.cache.layoutData;
105
+ if (layoutData) {
106
+ const line = layoutData.lines[0];
107
+ this.cache.clipedText = line.str, this.cache.clipedWidth = line.width;
108
+ }
109
+ return this._AABBBounds;
110
+ }
111
+ updateMultilineAABBBounds(text) {
112
+ const textTheme = this.getGraphicTheme(), {direction: direction = textTheme.direction, underlineOffset: underlineOffset = textTheme.underlineOffset} = this.attribute, b = "horizontal" === direction ? this.updateHorizontalMultilineAABBBounds(text) : this.updateVerticalMultilineAABBBounds(text);
113
+ return "horizontal" === direction && underlineOffset && this._AABBBounds.add(this._AABBBounds.x1, this._AABBBounds.y2 + underlineOffset),
114
+ b;
115
+ }
116
+ guessLineHeightBuf(fontSize) {
117
+ return fontSize ? .1 * fontSize : 0;
118
+ }
119
+ updateHorizontalMultilineAABBBounds(text) {
120
+ var _a;
121
+ const textTheme = this.getGraphicTheme(), attribute = this.attribute, {fontFamily: fontFamily = textTheme.fontFamily, textAlign: textAlign = textTheme.textAlign, textBaseline: textBaseline = textTheme.textBaseline, fontSize: fontSize = textTheme.fontSize, fontWeight: fontWeight = textTheme.fontWeight, ellipsis: ellipsis = textTheme.ellipsis, maxLineWidth: maxLineWidth, stroke: stroke = textTheme.stroke, wrap: wrap = textTheme.wrap, measureMode: measureMode = textTheme.measureMode, lineWidth: lineWidth = textTheme.lineWidth, whiteSpace: whiteSpace = textTheme.whiteSpace, suffixPosition: suffixPosition = textTheme.suffixPosition, ignoreBuf: ignoreBuf = textTheme.ignoreBuf} = attribute, buf = ignoreBuf ? 0 : this.guessLineHeightBuf(fontSize), lineHeight = this.getLineHeight(attribute, textTheme) + buf;
122
+ if ("normal" === whiteSpace || wrap) return this.updateWrapAABBBounds(text);
123
+ if (!this.shouldUpdateShape() && (null === (_a = this.cache) || void 0 === _a ? void 0 : _a.layoutData)) {
124
+ const bbox = this.cache.layoutData.bbox;
125
+ return this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height),
126
+ stroke && this._AABBBounds.expand(lineWidth / 2), this._AABBBounds;
127
+ }
128
+ const textMeasure = application.graphicUtil.textMeasure, layoutData = new CanvasTextLayout(fontFamily, {
129
+ fontSize: fontSize,
130
+ fontWeight: fontWeight,
131
+ fontFamily: fontFamily,
132
+ lineHeight: lineHeight
133
+ }, textMeasure).GetLayoutByLines(text, textAlign, textBaseline, lineHeight, !0 === ellipsis ? textTheme.ellipsis : ellipsis || void 0, !1, {
134
+ lineWidth: maxLineWidth,
135
+ suffixPosition: suffixPosition,
136
+ measureMode: measureMode
137
+ }), {bbox: bbox} = layoutData;
138
+ return this.cache.layoutData = layoutData, this.clearUpdateShapeTag(), this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height),
139
+ stroke && this._AABBBounds.expand(lineWidth / 2), this._AABBBounds;
140
+ }
106
141
  updateWrapAABBBounds(text) {
107
- var _a, _b, _c, _d;
108
- const textTheme = this.getGraphicTheme(), {fontFamily: fontFamily = textTheme.fontFamily, textAlign: textAlign = textTheme.textAlign, textBaseline: textBaseline = textTheme.textBaseline, fontSize: fontSize = textTheme.fontSize, ellipsis: ellipsis = textTheme.ellipsis, maxLineWidth: maxLineWidth, stroke: stroke = textTheme.stroke, lineWidth: lineWidth = textTheme.lineWidth, wordBreak: wordBreak = textTheme.wordBreak, fontWeight: fontWeight = textTheme.fontWeight, ignoreBuf: ignoreBuf = textTheme.ignoreBuf, suffixPosition: suffixPosition = textTheme.suffixPosition, heightLimit: heightLimit = 0, lineClamp: lineClamp} = this.attribute, lineHeight = null !== (_a = calculateLineHeight(this.attribute.lineHeight, this.attribute.fontSize || textTheme.fontSize)) && void 0 !== _a ? _a : this.attribute.fontSize || textTheme.fontSize, buf = ignoreBuf ? 0 : 2;
109
- if (!this.shouldUpdateShape() && (null === (_b = this.cache) || void 0 === _b ? void 0 : _b.layoutData)) {
142
+ var _a, _b, _c;
143
+ const textTheme = this.getGraphicTheme(), {fontFamily: fontFamily = textTheme.fontFamily, textAlign: textAlign = textTheme.textAlign, textBaseline: textBaseline = textTheme.textBaseline, fontSize: fontSize = textTheme.fontSize, ellipsis: ellipsis = textTheme.ellipsis, maxLineWidth: maxLineWidth, stroke: stroke = textTheme.stroke, lineWidth: lineWidth = textTheme.lineWidth, wordBreak: wordBreak = textTheme.wordBreak, fontWeight: fontWeight = textTheme.fontWeight, ignoreBuf: ignoreBuf = textTheme.ignoreBuf, measureMode: measureMode = textTheme.measureMode, suffixPosition: suffixPosition = textTheme.suffixPosition, heightLimit: heightLimit = 0, lineClamp: lineClamp} = this.attribute, buf = ignoreBuf ? 0 : this.guessLineHeightBuf(fontSize), lineHeight = this.getLineHeight(this.attribute, textTheme) + buf;
144
+ if (!this.shouldUpdateShape() && (null === (_a = this.cache) || void 0 === _a ? void 0 : _a.layoutData)) {
110
145
  const bbox = this.cache.layoutData.bbox;
111
146
  return this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height),
112
147
  stroke && this._AABBBounds.expand(lineWidth / 2), this._AABBBounds;
113
148
  }
114
- const textMeasure = application.graphicUtil.textMeasure, layoutObj = new CanvasTextLayout(fontFamily, {
149
+ const textMeasure = application.graphicUtil.textMeasure, textOptions = {
115
150
  fontSize: fontSize,
116
151
  fontWeight: fontWeight,
117
- fontFamily: fontFamily
118
- }, textMeasure), lines = isArray(text) ? text.map((l => l.toString())) : [ text.toString() ], linesLayout = [], bboxWH = [ 0, 0 ];
152
+ fontFamily: fontFamily,
153
+ lineHeight: lineHeight
154
+ }, layoutObj = new CanvasTextLayout(fontFamily, textOptions, textMeasure), lines = isArray(text) ? text.map((l => l.toString())) : [ text.toString() ], linesLayout = [], bboxWH = [ 0, 0 ];
119
155
  let lineCountLimit = 1 / 0;
120
156
  if (heightLimit > 0 && (lineCountLimit = Math.max(Math.floor(heightLimit / lineHeight), 1)),
121
157
  lineClamp && (lineCountLimit = Math.min(lineCountLimit, lineClamp)), "number" == typeof maxLineWidth && maxLineWidth !== 1 / 0) {
@@ -123,30 +159,35 @@ export class Text extends Graphic {
123
159
  const str = lines[i];
124
160
  let needCut = !0;
125
161
  if (i === lineCountLimit - 1) {
126
- const clip = layoutObj.textMeasure.clipTextWithSuffix(str, layoutObj.textOptions, maxLineWidth, ellipsis, !1, suffixPosition, i !== lines.length - 1);
162
+ const clip = textMeasure.clipTextWithSuffix(str, textOptions, maxLineWidth, ellipsis, !1, suffixPosition, i !== lines.length - 1), matrics = textMeasure.measureTextPixelADscentAndWidth(clip.str, textOptions, measureMode);
127
163
  linesLayout.push({
128
164
  str: clip.str,
129
- width: clip.width
165
+ width: clip.width,
166
+ ascent: matrics.ascent,
167
+ descent: matrics.descent
130
168
  });
131
169
  break;
132
170
  }
133
- const clip = layoutObj.textMeasure.clipText(str, layoutObj.textOptions, maxLineWidth, "break-all" !== wordBreak, "keep-all" === wordBreak);
171
+ const clip = textMeasure.clipText(str, textOptions, maxLineWidth, "break-all" !== wordBreak, "keep-all" === wordBreak);
134
172
  if ("" !== str && "" === clip.str || clip.wordBreaked) {
135
173
  if (ellipsis) {
136
- const clipEllipsis = layoutObj.textMeasure.clipTextWithSuffix(str, layoutObj.textOptions, maxLineWidth, ellipsis, !1, suffixPosition);
137
- clip.str = null !== (_c = clipEllipsis.str) && void 0 !== _c ? _c : "", clip.width = null !== (_d = clipEllipsis.width) && void 0 !== _d ? _d : 0;
174
+ const clipEllipsis = textMeasure.clipTextWithSuffix(str, textOptions, maxLineWidth, ellipsis, !1, suffixPosition);
175
+ clip.str = null !== (_b = clipEllipsis.str) && void 0 !== _b ? _b : "", clip.width = null !== (_c = clipEllipsis.width) && void 0 !== _c ? _c : 0;
138
176
  } else clip.str = "", clip.width = 0;
139
177
  needCut = !1;
140
178
  }
179
+ const matrics = textMeasure.measureTextPixelADscentAndWidth(clip.str, textOptions, measureMode);
141
180
  linesLayout.push({
142
181
  str: clip.str,
143
- width: clip.width
182
+ width: clip.width,
183
+ ascent: matrics.ascent,
184
+ descent: matrics.descent
144
185
  });
145
186
  let cutLength = clip.str.length;
146
187
  if (!clip.wordBreaked || "" !== str && "" === clip.str || (needCut = !0, cutLength = clip.wordBreaked),
147
188
  clip.str.length === str.length) ; else if (needCut) {
148
- let newStr = str.substring(cutLength);
149
- "keep-all" === wordBreak && (newStr = newStr.replace(/^\s+/g, "")), lines.splice(i + 1, 0, newStr);
189
+ const newStr = str.substring(cutLength);
190
+ lines.splice(i + 1, 0, newStr);
150
191
  }
151
192
  }
152
193
  let maxWidth = 0;
@@ -157,171 +198,48 @@ export class Text extends Graphic {
157
198
  let width, text, lineWidth = 0;
158
199
  for (let i = 0, len = lines.length; i < len; i++) {
159
200
  if (i === lineCountLimit - 1) {
160
- const clip = layoutObj.textMeasure.clipTextWithSuffix(lines[i], layoutObj.textOptions, maxLineWidth, ellipsis, !1, suffixPosition);
201
+ const clip = textMeasure.clipTextWithSuffix(lines[i], textOptions, maxLineWidth, ellipsis, !1, suffixPosition), matrics = textMeasure.measureTextPixelADscentAndWidth(clip.str, textOptions, measureMode);
161
202
  linesLayout.push({
162
203
  str: clip.str,
163
- width: clip.width
204
+ width: clip.width,
205
+ ascent: matrics.ascent,
206
+ descent: matrics.descent
164
207
  }), lineWidth = Math.max(lineWidth, clip.width);
165
208
  break;
166
209
  }
167
- text = lines[i], width = layoutObj.textMeasure.measureTextWidth(text, layoutObj.textOptions, "break-word" === wordBreak),
168
- lineWidth = Math.max(lineWidth, width), linesLayout.push({
210
+ text = lines[i], width = textMeasure.measureTextWidth(text, textOptions), lineWidth = Math.max(lineWidth, width);
211
+ const matrics = textMeasure.measureTextPixelADscentAndWidth(text, textOptions, measureMode);
212
+ linesLayout.push({
169
213
  str: text,
170
- width: width
214
+ width: width,
215
+ ascent: matrics.ascent,
216
+ descent: matrics.descent
171
217
  });
172
218
  }
173
219
  bboxWH[0] = lineWidth;
174
220
  }
175
- bboxWH[1] = linesLayout.length * (lineHeight + buf);
221
+ bboxWH[1] = linesLayout.length * lineHeight;
176
222
  const bbox = {
177
223
  xOffset: 0,
178
224
  yOffset: 0,
179
225
  width: bboxWH[0],
180
226
  height: bboxWH[1]
181
227
  };
182
- layoutObj.LayoutBBox(bbox, textAlign, textBaseline);
228
+ layoutObj.LayoutBBox(bbox, textAlign, textBaseline, linesLayout);
183
229
  const layoutData = layoutObj.layoutWithBBox(bbox, linesLayout, textAlign, textBaseline, lineHeight);
184
230
  return this.cache.layoutData = layoutData, this.clearUpdateShapeTag(), this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height),
185
231
  stroke && this._AABBBounds.expand(lineWidth / 2), this._AABBBounds;
186
232
  }
187
- updateSingallineAABBBounds(text) {
188
- const textTheme = this.getGraphicTheme(), {direction: direction = textTheme.direction, underlineOffset: underlineOffset = textTheme.underlineOffset} = this.attribute, b = "horizontal" === direction ? this.updateHorizontalSinglelineAABBBounds(text) : this.updateVerticalSinglelineAABBBounds(text);
189
- return "horizontal" === direction && underlineOffset && this._AABBBounds.add(this._AABBBounds.x1, this._AABBBounds.y2 + underlineOffset),
190
- b;
191
- }
192
- updateMultilineAABBBounds(text) {
193
- const textTheme = this.getGraphicTheme(), {direction: direction = textTheme.direction, underlineOffset: underlineOffset = textTheme.underlineOffset} = this.attribute, b = "horizontal" === direction ? this.updateHorizontalMultilineAABBBounds(text) : this.updateVerticalMultilineAABBBounds(text);
194
- return "horizontal" === direction && underlineOffset && this._AABBBounds.add(this._AABBBounds.x1, this._AABBBounds.y2 + underlineOffset),
195
- b;
196
- }
197
- updateHorizontalSinglelineAABBBounds(text) {
198
- var _a, _b;
199
- const textTheme = this.getGraphicTheme(), {wrap: wrap = textTheme.wrap} = this.attribute;
200
- if (wrap) return this.updateWrapAABBBounds([ text ]);
201
- const textMeasure = application.graphicUtil.textMeasure;
202
- let width, str;
203
- const attribute = this.attribute, {maxLineWidth: maxLineWidth = textTheme.maxLineWidth, ellipsis: ellipsis = textTheme.ellipsis, textAlign: textAlign = textTheme.textAlign, textBaseline: textBaseline = textTheme.textBaseline, fontFamily: fontFamily = textTheme.fontFamily, fontSize: fontSize = textTheme.fontSize, fontWeight: fontWeight = textTheme.fontWeight, stroke: stroke = textTheme.stroke, lineWidth: lineWidth = textTheme.lineWidth, ignoreBuf: ignoreBuf = textTheme.ignoreBuf, whiteSpace: whiteSpace = textTheme.whiteSpace, suffixPosition: suffixPosition = textTheme.suffixPosition} = attribute;
204
- if ("normal" === whiteSpace) return this.updateWrapAABBBounds(text);
205
- const buf = ignoreBuf ? 0 : Math.max(2, .075 * fontSize), textFontSize = attribute.fontSize || textTheme.fontSize, lineHeight = null !== (_a = calculateLineHeight(attribute.lineHeight, textFontSize)) && void 0 !== _a ? _a : textFontSize + buf;
206
- if (!this.shouldUpdateShape() && this.cache) {
207
- width = null !== (_b = this.cache.clipedWidth) && void 0 !== _b ? _b : 0;
208
- const dx = textDrawOffsetX(textAlign, width), dy = textLayoutOffsetY(textBaseline, lineHeight, fontSize);
209
- return this._AABBBounds.set(dx, dy, dx + width, dy + lineHeight), stroke && this._AABBBounds.expand(lineWidth / 2),
210
- this._AABBBounds;
211
- }
212
- if (Number.isFinite(maxLineWidth)) {
213
- if (ellipsis) {
214
- const strEllipsis = !0 === ellipsis ? textTheme.ellipsis : ellipsis, data = textMeasure.clipTextWithSuffix(text.toString(), {
215
- fontSize: fontSize,
216
- fontWeight: fontWeight,
217
- fontFamily: fontFamily
218
- }, maxLineWidth, strEllipsis, !1, suffixPosition);
219
- str = data.str, width = data.width;
220
- } else {
221
- const data = textMeasure.clipText(text.toString(), {
222
- fontSize: fontSize,
223
- fontWeight: fontWeight,
224
- fontFamily: fontFamily
225
- }, maxLineWidth, !1);
226
- str = data.str, width = data.width;
227
- }
228
- this.cache.clipedText = str, this.cache.clipedWidth = width;
229
- } else width = textMeasure.measureTextWidth(text.toString(), {
230
- fontSize: fontSize,
231
- fontWeight: fontWeight,
232
- fontFamily: fontFamily
233
- }), this.cache.clipedText = text.toString(), this.cache.clipedWidth = width;
234
- this.clearUpdateShapeTag();
235
- const dx = textDrawOffsetX(textAlign, width);
236
- let lh = lineHeight;
237
- application.global && application.global.isSafari() && (lh += .2 * fontSize);
238
- const dy = textLayoutOffsetY(textBaseline, lh, fontSize, buf);
239
- return this._AABBBounds.set(dx, dy, dx + width, dy + lh), stroke && this._AABBBounds.expand(lineWidth / 2),
240
- this._AABBBounds;
241
- }
242
- getBaselineMapAlign() {
243
- return Text.baselineMapAlign;
244
- }
245
- getAlignMapBaseline() {
246
- return Text.alignMapBaseline;
247
- }
248
- updateVerticalSinglelineAABBBounds(text) {
249
- var _a, _b, _c;
250
- const textTheme = this.getGraphicTheme(), textMeasure = application.graphicUtil.textMeasure;
251
- let width;
252
- const attribute = this.attribute, {ignoreBuf: ignoreBuf = textTheme.ignoreBuf} = attribute, buf = ignoreBuf ? 0 : 2, {maxLineWidth: maxLineWidth = textTheme.maxLineWidth, ellipsis: ellipsis = textTheme.ellipsis, fontSize: fontSize = textTheme.fontSize, fontWeight: fontWeight = textTheme.fontWeight, fontFamily: fontFamily = textTheme.fontFamily, stroke: stroke = textTheme.stroke, lineWidth: lineWidth = textTheme.lineWidth, verticalMode: verticalMode = textTheme.verticalMode, suffixPosition: suffixPosition = textTheme.suffixPosition} = attribute, lineHeight = null !== (_a = calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize)) && void 0 !== _a ? _a : (attribute.fontSize || textTheme.fontSize) + buf;
253
- let {textAlign: textAlign = textTheme.textAlign, textBaseline: textBaseline = textTheme.textBaseline} = attribute;
254
- if (!verticalMode) {
255
- const t = textAlign;
256
- textAlign = null !== (_b = Text.baselineMapAlign[textBaseline]) && void 0 !== _b ? _b : "left",
257
- textBaseline = null !== (_c = Text.alignMapBaseline[t]) && void 0 !== _c ? _c : "top";
258
- }
259
- if (!this.shouldUpdateShape() && this.cache) {
260
- width = this.cache.clipedWidth;
261
- const dx = textDrawOffsetX(textAlign, width), dy = textLayoutOffsetY(textBaseline, lineHeight, fontSize);
262
- return this._AABBBounds.set(dy, dx, dy + lineHeight, dx + width), stroke && this._AABBBounds.expand(lineWidth / 2),
263
- this._AABBBounds;
264
- }
265
- let verticalList = [ verticalLayout(text.toString()) ];
266
- if (Number.isFinite(maxLineWidth)) {
267
- if (ellipsis) {
268
- const strEllipsis = !0 === ellipsis ? textTheme.ellipsis : ellipsis, data = textMeasure.clipTextWithSuffixVertical(verticalList[0], {
269
- fontSize: fontSize,
270
- fontWeight: fontWeight,
271
- fontFamily: fontFamily
272
- }, maxLineWidth, strEllipsis, !1, suffixPosition);
273
- verticalList = [ data.verticalList ], width = data.width;
274
- } else {
275
- const data = textMeasure.clipTextVertical(verticalList[0], {
276
- fontSize: fontSize,
277
- fontWeight: fontWeight,
278
- fontFamily: fontFamily
279
- }, maxLineWidth, !1);
280
- verticalList = [ data.verticalList ], width = data.width;
281
- }
282
- this.cache.verticalList = verticalList, this.cache.clipedWidth = width;
283
- } else width = 0, verticalList[0].forEach((t => {
284
- const w = t.direction === TextDirection.HORIZONTAL ? fontSize : textMeasure.measureTextWidth(t.text, {
285
- fontSize: fontSize,
286
- fontWeight: fontWeight,
287
- fontFamily: fontFamily
288
- });
289
- width += w, t.width = w;
290
- })), this.cache.verticalList = verticalList, this.cache.clipedWidth = width;
291
- this.clearUpdateShapeTag();
292
- const dx = textDrawOffsetX(textAlign, width), dy = textLayoutOffsetY(textBaseline, lineHeight, fontSize);
293
- return this._AABBBounds.set(dy, dx, dy + lineHeight, dx + width), stroke && this._AABBBounds.expand(lineWidth / 2),
294
- this._AABBBounds;
295
- }
296
- updateHorizontalMultilineAABBBounds(text) {
297
- var _a, _b;
298
- const textTheme = this.getGraphicTheme(), {wrap: wrap = textTheme.wrap} = this.attribute;
299
- if (wrap) return this.updateWrapAABBBounds(text);
300
- const attribute = this.attribute, {fontFamily: fontFamily = textTheme.fontFamily, textAlign: textAlign = textTheme.textAlign, textBaseline: textBaseline = textTheme.textBaseline, fontSize: fontSize = textTheme.fontSize, fontWeight: fontWeight = textTheme.fontWeight, ellipsis: ellipsis = textTheme.ellipsis, maxLineWidth: maxLineWidth, stroke: stroke = textTheme.stroke, lineWidth: lineWidth = textTheme.lineWidth, whiteSpace: whiteSpace = textTheme.whiteSpace, suffixPosition: suffixPosition = textTheme.suffixPosition} = attribute, lineHeight = null !== (_a = calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize)) && void 0 !== _a ? _a : attribute.fontSize || textTheme.fontSize;
301
- if ("normal" === whiteSpace) return this.updateWrapAABBBounds(text);
302
- if (!this.shouldUpdateShape() && (null === (_b = this.cache) || void 0 === _b ? void 0 : _b.layoutData)) {
303
- const bbox = this.cache.layoutData.bbox;
304
- return this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height),
305
- stroke && this._AABBBounds.expand(lineWidth / 2), this._AABBBounds;
306
- }
307
- const textMeasure = application.graphicUtil.textMeasure, layoutData = new CanvasTextLayout(fontFamily, {
308
- fontSize: fontSize,
309
- fontWeight: fontWeight,
310
- fontFamily: fontFamily
311
- }, textMeasure).GetLayoutByLines(text, textAlign, textBaseline, lineHeight, !0 === ellipsis ? textTheme.ellipsis : ellipsis || void 0, !1, maxLineWidth, suffixPosition), {bbox: bbox} = layoutData;
312
- return this.cache.layoutData = layoutData, this.clearUpdateShapeTag(), this._AABBBounds.set(bbox.xOffset, bbox.yOffset, bbox.xOffset + bbox.width, bbox.yOffset + bbox.height),
313
- stroke && this._AABBBounds.expand(lineWidth / 2), this._AABBBounds;
314
- }
315
233
  updateVerticalMultilineAABBBounds(text) {
316
- var _a, _b, _c;
234
+ var _a, _b;
317
235
  const textTheme = this.getGraphicTheme(), textMeasure = application.graphicUtil.textMeasure;
318
236
  let width;
319
- const attribute = this.attribute, {ignoreBuf: ignoreBuf = textTheme.ignoreBuf} = attribute, buf = ignoreBuf ? 0 : 2, {maxLineWidth: maxLineWidth = textTheme.maxLineWidth, ellipsis: ellipsis = textTheme.ellipsis, fontFamily: fontFamily = textTheme.fontFamily, fontSize: fontSize = textTheme.fontSize, fontWeight: fontWeight = textTheme.fontWeight, stroke: stroke = textTheme.stroke, lineWidth: lineWidth = textTheme.lineWidth, verticalMode: verticalMode = textTheme.verticalMode, suffixPosition: suffixPosition = textTheme.suffixPosition} = attribute, lineHeight = null !== (_a = calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize)) && void 0 !== _a ? _a : (attribute.fontSize || textTheme.fontSize) + buf;
237
+ const attribute = this.attribute, {maxLineWidth: maxLineWidth = textTheme.maxLineWidth, ellipsis: ellipsis = textTheme.ellipsis, fontFamily: fontFamily = textTheme.fontFamily, fontSize: fontSize = textTheme.fontSize, fontWeight: fontWeight = textTheme.fontWeight, stroke: stroke = textTheme.stroke, lineWidth: lineWidth = textTheme.lineWidth, verticalMode: verticalMode = textTheme.verticalMode, suffixPosition: suffixPosition = textTheme.suffixPosition} = attribute, lineHeight = this.getLineHeight(attribute, textTheme);
320
238
  let {textAlign: textAlign = textTheme.textAlign, textBaseline: textBaseline = textTheme.textBaseline} = attribute;
321
239
  if (!verticalMode) {
322
240
  const t = textAlign;
323
- textAlign = null !== (_b = Text.baselineMapAlign[textBaseline]) && void 0 !== _b ? _b : "left",
324
- textBaseline = null !== (_c = Text.alignMapBaseline[t]) && void 0 !== _c ? _c : "top";
241
+ textAlign = null !== (_a = Text.baselineMapAlign[textBaseline]) && void 0 !== _a ? _a : "left",
242
+ textBaseline = null !== (_b = Text.alignMapBaseline[t]) && void 0 !== _b ? _b : "top";
325
243
  }
326
244
  if (width = 0, !this.shouldUpdateShape() && this.cache) {
327
245
  this.cache.verticalList.forEach((item => {
@@ -364,6 +282,15 @@ export class Text extends Graphic {
364
282
  return this._AABBBounds.set(dy, dx, dy + height, dx + width), stroke && this._AABBBounds.expand(lineWidth / 2),
365
283
  this._AABBBounds;
366
284
  }
285
+ getMaxWidth(theme) {
286
+ var _a, _b;
287
+ const attribute = this.attribute;
288
+ return null !== (_b = null !== (_a = attribute.maxLineWidth) && void 0 !== _a ? _a : attribute.maxWidth) && void 0 !== _b ? _b : theme.maxWidth;
289
+ }
290
+ getLineHeight(attribute, textTheme) {
291
+ var _a;
292
+ return null !== (_a = calculateLineHeight(attribute.lineHeight, attribute.fontSize || textTheme.fontSize)) && void 0 !== _a ? _a : attribute.fontSize || textTheme.fontSize;
293
+ }
367
294
  needUpdateTags(keys, k = TEXT_UPDATE_TAG_KEY) {
368
295
  return super.needUpdateTags(keys, k);
369
296
  }
@@ -376,6 +303,12 @@ export class Text extends Graphic {
376
303
  getNoWorkAnimateAttr() {
377
304
  return Text.NOWORK_ANIMATE_ATTR;
378
305
  }
306
+ getBaselineMapAlign() {
307
+ return Text.baselineMapAlign;
308
+ }
309
+ getAlignMapBaseline() {
310
+ return Text.alignMapBaseline;
311
+ }
379
312
  }
380
313
 
381
314
  Text.NOWORK_ANIMATE_ATTR = Object.assign({