@nasser-sw/fabric 7.0.1-beta1 → 7.0.1-beta10

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 (181) hide show
  1. package/0 +0 -0
  2. package/debug/{konva → konva-master}/CHANGELOG.md +2 -1
  3. package/debug/{konva → konva-master}/README.md +7 -3
  4. package/debug/{konva → konva-master}/package.json +1 -1
  5. package/debug/{konva → konva-master}/release.sh +1 -4
  6. package/debug/{konva → konva-master}/src/Canvas.ts +37 -0
  7. package/debug/{konva → konva-master}/src/shapes/Text.ts +2 -2
  8. package/dist/index.js +1853 -288
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.min.js +1 -1
  11. package/dist/index.min.js.map +1 -1
  12. package/dist/index.min.mjs +1 -1
  13. package/dist/index.min.mjs.map +1 -1
  14. package/dist/index.mjs +1853 -288
  15. package/dist/index.mjs.map +1 -1
  16. package/dist/index.node.cjs +1853 -288
  17. package/dist/index.node.cjs.map +1 -1
  18. package/dist/index.node.mjs +1853 -288
  19. package/dist/index.node.mjs.map +1 -1
  20. package/dist/package.json.min.mjs +1 -1
  21. package/dist/package.json.mjs +1 -1
  22. package/dist/src/shapes/Line.d.ts +33 -86
  23. package/dist/src/shapes/Line.d.ts.map +1 -1
  24. package/dist/src/shapes/Line.min.mjs +1 -1
  25. package/dist/src/shapes/Line.min.mjs.map +1 -1
  26. package/dist/src/shapes/Line.mjs +405 -159
  27. package/dist/src/shapes/Line.mjs.map +1 -1
  28. package/dist/src/shapes/Polyline.d.ts +7 -0
  29. package/dist/src/shapes/Polyline.d.ts.map +1 -1
  30. package/dist/src/shapes/Polyline.min.mjs +1 -1
  31. package/dist/src/shapes/Polyline.min.mjs.map +1 -1
  32. package/dist/src/shapes/Polyline.mjs +48 -16
  33. package/dist/src/shapes/Polyline.mjs.map +1 -1
  34. package/dist/src/shapes/Text/Text.d.ts +19 -0
  35. package/dist/src/shapes/Text/Text.d.ts.map +1 -1
  36. package/dist/src/shapes/Text/Text.min.mjs +1 -1
  37. package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
  38. package/dist/src/shapes/Text/Text.mjs +302 -16
  39. package/dist/src/shapes/Text/Text.mjs.map +1 -1
  40. package/dist/src/shapes/Textbox.d.ts +43 -1
  41. package/dist/src/shapes/Textbox.d.ts.map +1 -1
  42. package/dist/src/shapes/Textbox.min.mjs +1 -1
  43. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  44. package/dist/src/shapes/Textbox.mjs +521 -67
  45. package/dist/src/shapes/Textbox.mjs.map +1 -1
  46. package/dist/src/shapes/Triangle.d.ts +27 -2
  47. package/dist/src/shapes/Triangle.d.ts.map +1 -1
  48. package/dist/src/shapes/Triangle.min.mjs +1 -1
  49. package/dist/src/shapes/Triangle.min.mjs.map +1 -1
  50. package/dist/src/shapes/Triangle.mjs +72 -12
  51. package/dist/src/shapes/Triangle.mjs.map +1 -1
  52. package/dist/src/text/examples/arabicTextExample.d.ts +60 -0
  53. package/dist/src/text/examples/arabicTextExample.d.ts.map +1 -0
  54. package/dist/src/text/measure.d.ts +9 -0
  55. package/dist/src/text/measure.d.ts.map +1 -1
  56. package/dist/src/text/measure.min.mjs +1 -1
  57. package/dist/src/text/measure.min.mjs.map +1 -1
  58. package/dist/src/text/measure.mjs +175 -4
  59. package/dist/src/text/measure.mjs.map +1 -1
  60. package/dist/src/text/overlayEditor.d.ts.map +1 -1
  61. package/dist/src/text/overlayEditor.min.mjs +1 -1
  62. package/dist/src/text/overlayEditor.min.mjs.map +1 -1
  63. package/dist/src/text/overlayEditor.mjs +155 -9
  64. package/dist/src/text/overlayEditor.mjs.map +1 -1
  65. package/dist/src/text/scriptUtils.d.ts +142 -0
  66. package/dist/src/text/scriptUtils.d.ts.map +1 -0
  67. package/dist/src/text/scriptUtils.min.mjs +2 -0
  68. package/dist/src/text/scriptUtils.min.mjs.map +1 -0
  69. package/dist/src/text/scriptUtils.mjs +212 -0
  70. package/dist/src/text/scriptUtils.mjs.map +1 -0
  71. package/dist/src/util/misc/cornerRadius.d.ts +70 -0
  72. package/dist/src/util/misc/cornerRadius.d.ts.map +1 -0
  73. package/dist/src/util/misc/cornerRadius.min.mjs +2 -0
  74. package/dist/src/util/misc/cornerRadius.min.mjs.map +1 -0
  75. package/dist/src/util/misc/cornerRadius.mjs +181 -0
  76. package/dist/src/util/misc/cornerRadius.mjs.map +1 -0
  77. package/dist-extensions/src/shapes/CustomLine.d.ts +10 -0
  78. package/dist-extensions/src/shapes/CustomLine.d.ts.map +1 -0
  79. package/dist-extensions/src/shapes/Line.d.ts +33 -86
  80. package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
  81. package/dist-extensions/src/shapes/Polyline.d.ts +7 -0
  82. package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -1
  83. package/dist-extensions/src/shapes/Text/Text.d.ts +19 -0
  84. package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
  85. package/dist-extensions/src/shapes/Textbox.d.ts +43 -1
  86. package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
  87. package/dist-extensions/src/shapes/Triangle.d.ts +27 -2
  88. package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -1
  89. package/dist-extensions/src/text/measure.d.ts +9 -0
  90. package/dist-extensions/src/text/measure.d.ts.map +1 -1
  91. package/dist-extensions/src/text/overlayEditor.d.ts.map +1 -1
  92. package/dist-extensions/src/text/scriptUtils.d.ts +142 -0
  93. package/dist-extensions/src/text/scriptUtils.d.ts.map +1 -0
  94. package/dist-extensions/src/util/misc/cornerRadius.d.ts +70 -0
  95. package/dist-extensions/src/util/misc/cornerRadius.d.ts.map +1 -0
  96. package/fabric-test-editor.html +3552 -0
  97. package/fabric-test2.html +647 -0
  98. package/fabric.ts +182 -182
  99. package/fonts/STV Bold.ttf +0 -0
  100. package/fonts/STV Light.ttf +0 -0
  101. package/fonts/STV Regular.ttf +0 -0
  102. package/package.json +164 -164
  103. package/src/shapes/Line.ts +484 -157
  104. package/src/shapes/Polyline.ts +70 -29
  105. package/src/shapes/Text/Text.ts +317 -19
  106. package/src/shapes/Textbox.ts +544 -12
  107. package/src/shapes/Triangle.spec.ts +76 -0
  108. package/src/shapes/Triangle.ts +85 -15
  109. package/src/text/measure.ts +200 -50
  110. package/src/text/overlayEditor.ts +164 -12
  111. package/src/util/misc/cornerRadius.spec.ts +141 -0
  112. package/src/util/misc/cornerRadius.ts +269 -0
  113. /package/debug/{konva → konva-master}/LICENSE +0 -0
  114. /package/debug/{konva → konva-master}/gulpfile.mjs +0 -0
  115. /package/debug/{konva → konva-master}/resources/doc-includes/ContainerParams.txt +0 -0
  116. /package/debug/{konva → konva-master}/resources/doc-includes/NodeParams.txt +0 -0
  117. /package/debug/{konva → konva-master}/resources/doc-includes/ShapeParams.txt +0 -0
  118. /package/debug/{konva → konva-master}/resources/jsdoc.conf.json +0 -0
  119. /package/debug/{konva → konva-master}/rollup.config.mjs +0 -0
  120. /package/debug/{konva → konva-master}/src/Animation.ts +0 -0
  121. /package/debug/{konva → konva-master}/src/BezierFunctions.ts +0 -0
  122. /package/debug/{konva → konva-master}/src/Container.ts +0 -0
  123. /package/debug/{konva → konva-master}/src/Context.ts +0 -0
  124. /package/debug/{konva → konva-master}/src/Core.ts +0 -0
  125. /package/debug/{konva → konva-master}/src/DragAndDrop.ts +0 -0
  126. /package/debug/{konva → konva-master}/src/Factory.ts +0 -0
  127. /package/debug/{konva → konva-master}/src/FastLayer.ts +0 -0
  128. /package/debug/{konva → konva-master}/src/Global.ts +0 -0
  129. /package/debug/{konva → konva-master}/src/Group.ts +0 -0
  130. /package/debug/{konva → konva-master}/src/Layer.ts +0 -0
  131. /package/debug/{konva → konva-master}/src/Node.ts +0 -0
  132. /package/debug/{konva → konva-master}/src/PointerEvents.ts +0 -0
  133. /package/debug/{konva → konva-master}/src/Shape.ts +0 -0
  134. /package/debug/{konva → konva-master}/src/Stage.ts +0 -0
  135. /package/debug/{konva → konva-master}/src/Tween.ts +0 -0
  136. /package/debug/{konva → konva-master}/src/Util.ts +0 -0
  137. /package/debug/{konva → konva-master}/src/Validators.ts +0 -0
  138. /package/debug/{konva → konva-master}/src/_CoreInternals.ts +0 -0
  139. /package/debug/{konva → konva-master}/src/_FullInternals.ts +0 -0
  140. /package/debug/{konva → konva-master}/src/canvas-backend.ts +0 -0
  141. /package/debug/{konva → konva-master}/src/filters/Blur.ts +0 -0
  142. /package/debug/{konva → konva-master}/src/filters/Brighten.ts +0 -0
  143. /package/debug/{konva → konva-master}/src/filters/Brightness.ts +0 -0
  144. /package/debug/{konva → konva-master}/src/filters/Contrast.ts +0 -0
  145. /package/debug/{konva → konva-master}/src/filters/Emboss.ts +0 -0
  146. /package/debug/{konva → konva-master}/src/filters/Enhance.ts +0 -0
  147. /package/debug/{konva → konva-master}/src/filters/Grayscale.ts +0 -0
  148. /package/debug/{konva → konva-master}/src/filters/HSL.ts +0 -0
  149. /package/debug/{konva → konva-master}/src/filters/HSV.ts +0 -0
  150. /package/debug/{konva → konva-master}/src/filters/Invert.ts +0 -0
  151. /package/debug/{konva → konva-master}/src/filters/Kaleidoscope.ts +0 -0
  152. /package/debug/{konva → konva-master}/src/filters/Mask.ts +0 -0
  153. /package/debug/{konva → konva-master}/src/filters/Noise.ts +0 -0
  154. /package/debug/{konva → konva-master}/src/filters/Pixelate.ts +0 -0
  155. /package/debug/{konva → konva-master}/src/filters/Posterize.ts +0 -0
  156. /package/debug/{konva → konva-master}/src/filters/RGB.ts +0 -0
  157. /package/debug/{konva → konva-master}/src/filters/RGBA.ts +0 -0
  158. /package/debug/{konva → konva-master}/src/filters/Sepia.ts +0 -0
  159. /package/debug/{konva → konva-master}/src/filters/Solarize.ts +0 -0
  160. /package/debug/{konva → konva-master}/src/filters/Threshold.ts +0 -0
  161. /package/debug/{konva → konva-master}/src/index.ts +0 -0
  162. /package/debug/{konva → konva-master}/src/shapes/Arc.ts +0 -0
  163. /package/debug/{konva → konva-master}/src/shapes/Arrow.ts +0 -0
  164. /package/debug/{konva → konva-master}/src/shapes/Circle.ts +0 -0
  165. /package/debug/{konva → konva-master}/src/shapes/Ellipse.ts +0 -0
  166. /package/debug/{konva → konva-master}/src/shapes/Image.ts +0 -0
  167. /package/debug/{konva → konva-master}/src/shapes/Label.ts +0 -0
  168. /package/debug/{konva → konva-master}/src/shapes/Line.ts +0 -0
  169. /package/debug/{konva → konva-master}/src/shapes/Path.ts +0 -0
  170. /package/debug/{konva → konva-master}/src/shapes/Rect.ts +0 -0
  171. /package/debug/{konva → konva-master}/src/shapes/RegularPolygon.ts +0 -0
  172. /package/debug/{konva → konva-master}/src/shapes/Ring.ts +0 -0
  173. /package/debug/{konva → konva-master}/src/shapes/Sprite.ts +0 -0
  174. /package/debug/{konva → konva-master}/src/shapes/Star.ts +0 -0
  175. /package/debug/{konva → konva-master}/src/shapes/TextPath.ts +0 -0
  176. /package/debug/{konva → konva-master}/src/shapes/Transformer.ts +0 -0
  177. /package/debug/{konva → konva-master}/src/shapes/Wedge.ts +0 -0
  178. /package/debug/{konva → konva-master}/src/skia-backend.ts +0 -0
  179. /package/debug/{konva → konva-master}/src/types.ts +0 -0
  180. /package/debug/{konva → konva-master}/tsconfig.json +0 -0
  181. /package/debug/{konva → konva-master}/tsconfig.test.json +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Text.mjs","sources":["../../../../src/shapes/Text/Text.ts"],"sourcesContent":["import { cache } from '../../cache';\r\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\r\nimport type { ObjectEvents } from '../../EventTypeDefs';\r\nimport type {\r\n CompleteTextStyleDeclaration,\r\n TextStyle,\r\n TextStyleDeclaration,\r\n} from './StyledText';\r\nimport { StyledText } from './StyledText';\r\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\r\nimport { parseAttributes } from '../../parser/parseAttributes';\r\nimport type {\r\n Abortable,\r\n TCacheCanvasDimensions,\r\n TClassProperties,\r\n TFiller,\r\n TOptions,\r\n} from '../../typedefs';\r\nimport { classRegistry } from '../../ClassRegistry';\r\nimport { graphemeSplit } from '../../util/lang_string';\r\nimport { createCanvasElementFor } from '../../util/misc/dom';\r\nimport { layoutText, type LayoutResult, type TextLayoutOptions } from '../../text/layout';\r\nimport { measureGrapheme, measureGraphemeWithKerning } from '../../text/measure';\r\nimport { applyEllipsis } from '../../text/ellipsis';\r\nimport { segmentGraphemes } from '../../text/unicode';\r\nimport type { TextStyleArray } from '../../util/misc/textStyles';\r\nimport {\r\n hasStyleChanged,\r\n stylesFromArray,\r\n stylesToArray,\r\n} from '../../util/misc/textStyles';\r\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\r\nimport { cacheProperties } from '../Object/FabricObject';\r\nimport type { Path } from '../Path';\r\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\r\nimport { applyMixins } from '../../util/applyMixins';\r\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\r\nimport type { StylePropertiesType } from './constants';\r\nimport {\r\n additionalProps,\r\n textDefaultValues,\r\n textLayoutProperties,\r\n JUSTIFY,\r\n JUSTIFY_CENTER,\r\n JUSTIFY_LEFT,\r\n JUSTIFY_RIGHT,\r\n TEXT_DECORATION_THICKNESS,\r\n} from './constants';\r\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\r\nimport { isFiller } from '../../util/typeAssertions';\r\nimport type { Gradient } from '../../gradient/Gradient';\r\nimport type { Pattern } from '../../Pattern';\r\nimport type { CSSRules } from '../../parser/typedefs';\r\nimport { getBrowserLines, clearBrowserLines } from '../../text/browserLines';\r\nimport type { BrowserLine } from '../../text/browserLines';\r\n\r\nlet measuringContext: CanvasRenderingContext2D | null;\r\n\r\n/**\r\n * Return a context for measurement of text string.\r\n * if created it gets stored for reuse\r\n */\r\nfunction getMeasuringContext() {\r\n if (!measuringContext) {\r\n const canvas = createCanvasElementFor({\r\n width: 0,\r\n height: 0,\r\n });\r\n measuringContext = canvas.getContext('2d');\r\n }\r\n return measuringContext;\r\n}\r\n\r\nexport type TPathSide = 'left' | 'right';\r\n\r\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\r\n\r\nexport type TextLinesInfo = {\r\n lines: string[];\r\n graphemeLines: string[][];\r\n graphemeText: string[];\r\n _unwrappedLines: string[][];\r\n};\r\n\r\n/**\r\n * Measure and return the info of a single grapheme.\r\n * needs the the info of previous graphemes already filled\r\n * Override to customize measuring\r\n */\r\nexport type GraphemeBBox = {\r\n width: number;\r\n height: number;\r\n kernedWidth: number;\r\n left: number;\r\n deltaY: number;\r\n renderLeft?: number;\r\n renderTop?: number;\r\n angle?: number;\r\n};\r\n\r\n// @TODO this is not complete\r\ninterface UniqueTextProps {\r\n charSpacing: number;\r\n lineHeight: number;\r\n fontSize: number;\r\n fontWeight: string | number;\r\n fontFamily: string;\r\n fontStyle: string;\r\n pathSide: TPathSide;\r\n pathAlign: TPathAlign;\r\n underline: boolean;\r\n overline: boolean;\r\n linethrough: boolean;\r\n textAlign: string;\r\n direction: CanvasDirection;\r\n path?: Path;\r\n textDecorationThickness: number;\r\n wrap: 'word' | 'char' | 'none';\r\n ellipsis: boolean | string;\r\n letterSpacing: number;\r\n enableAdvancedLayout: boolean;\r\n verticalAlign: 'top' | 'middle' | 'bottom';\r\n useOverlayEditing: boolean;\r\n}\r\n\r\nexport interface SerializedTextProps\r\n extends SerializedObjectProps,\r\n UniqueTextProps {\r\n styles: TextStyleArray | TextStyle;\r\n}\r\n\r\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\r\n styles: TextStyle;\r\n}\r\n\r\n/**\r\n * Text class\r\n * @see {@link http://fabricjs.com/fabric-intro-part-2#text}\r\n */\r\nexport class FabricText<\r\n Props extends TOptions<TextProps> = Partial<TextProps>,\r\n SProps extends SerializedTextProps = SerializedTextProps,\r\n EventSpec extends ObjectEvents = ObjectEvents,\r\n >\r\n extends StyledText<Props, SProps, EventSpec>\r\n implements UniqueTextProps\r\n{\r\n /**\r\n * Properties that requires a text layout recalculation when changed\r\n * @type string[]\r\n * @protected\r\n */\r\n static textLayoutProperties: string[] = textLayoutProperties;\r\n\r\n /**\r\n * @private\r\n */\r\n declare _reNewline: RegExp;\r\n\r\n /**\r\n * Use this regular expression to filter for whitespaces that is not a new line.\r\n * Mostly used when text is 'justify' aligned.\r\n * @private\r\n */\r\n declare _reSpacesAndTabs: RegExp;\r\n\r\n /**\r\n * Use this regular expression to filter for whitespace that is not a new line.\r\n * Mostly used when text is 'justify' aligned.\r\n * @private\r\n */\r\n declare _reSpaceAndTab: RegExp;\r\n\r\n /**\r\n * Use this regular expression to filter consecutive groups of non spaces.\r\n * Mostly used when text is 'justify' aligned.\r\n * @private\r\n */\r\n declare _reWords: RegExp;\r\n\r\n declare text: string;\r\n\r\n /**\r\n * Font size (in pixels)\r\n * @type Number\r\n */\r\n declare fontSize: number;\r\n\r\n /**\r\n * Font weight (e.g. bold, normal, 400, 600, 800)\r\n * @type {(Number|String)}\r\n */\r\n declare fontWeight: string | number;\r\n\r\n /**\r\n * Font family\r\n * @type String\r\n */\r\n declare fontFamily: string;\r\n\r\n /**\r\n * Text decoration underline.\r\n * @type Boolean\r\n */\r\n declare underline: boolean;\r\n\r\n /**\r\n * Text decoration overline.\r\n * @type Boolean\r\n */\r\n declare overline: boolean;\r\n\r\n /**\r\n * Text decoration linethrough.\r\n * @type Boolean\r\n */\r\n declare linethrough: boolean;\r\n\r\n /**\r\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\r\n * \"justify-left\", \"justify-center\" or \"justify-right\".\r\n * @type String\r\n */\r\n declare textAlign: string;\r\n\r\n /**\r\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\r\n * @type String\r\n */\r\n declare fontStyle: string;\r\n\r\n /**\r\n * Line height\r\n * @type Number\r\n */\r\n declare lineHeight: number;\r\n\r\n /**\r\n * Superscript schema object (minimum overlap)\r\n */\r\n declare superscript: {\r\n /**\r\n * fontSize factor\r\n * @default 0.6\r\n */\r\n size: number;\r\n /**\r\n * baseline-shift factor (upwards)\r\n * @default -0.35\r\n */\r\n baseline: number;\r\n };\r\n\r\n /**\r\n * Subscript schema object (minimum overlap)\r\n */\r\n declare subscript: {\r\n /**\r\n * fontSize factor\r\n * @default 0.6\r\n */\r\n size: number;\r\n /**\r\n * baseline-shift factor (downwards)\r\n * @default 0.11\r\n */\r\n baseline: number;\r\n };\r\n\r\n /**\r\n * Background color of text lines\r\n * @type String\r\n */\r\n declare textBackgroundColor: string;\r\n\r\n declare styles: TextStyle;\r\n\r\n /**\r\n * Path that the text should follow.\r\n * since 4.6.0 the path will be drawn automatically.\r\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\r\n * if you want it to be hidden, assign visible = false to the path.\r\n * This feature is in BETA, and SVG import/export is not yet supported.\r\n * @type Path\r\n * @example\r\n * const textPath = new Text('Text on a path', {\r\n * top: 150,\r\n * left: 150,\r\n * textAlign: 'center',\r\n * charSpacing: -50,\r\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\r\n * strokeWidth: 1,\r\n * visible: false\r\n * }),\r\n * pathSide: 'left',\r\n * pathStartOffset: 0\r\n * });\r\n */\r\n declare path?: Path;\r\n\r\n /**\r\n * Text wrapping mode\r\n * @type string\r\n * @default 'word'\r\n */\r\n declare wrap: 'word' | 'char' | 'none';\r\n\r\n /**\r\n * Ellipsis truncation\r\n * @type boolean | string\r\n * @default false\r\n */\r\n declare ellipsis: boolean | string;\r\n\r\n /**\r\n * Letter spacing in pixels (Konva-style)\r\n * @type number\r\n * @default 0\r\n */\r\n declare letterSpacing: number;\r\n\r\n /**\r\n * Enable advanced text layout engine\r\n * @type boolean\r\n * @default false\r\n */\r\n declare enableAdvancedLayout: boolean;\r\n\r\n /**\r\n * Vertical text alignment\r\n * @type string\r\n * @default 'top'\r\n */\r\n declare verticalAlign: 'top' | 'middle' | 'bottom';\r\n\r\n /**\r\n * Use overlay editor for inline text editing instead of hidden textarea.\r\n * @default false\r\n */\r\n declare useOverlayEditing: boolean;\r\n\r\n /**\r\n * The text decoration tickness for underline, overline and strikethrough\r\n * The tickness is expressed in thousandths of fontSize ( em ).\r\n * The original value was 1/15 that translates to 66.6667 thousandths.\r\n * The choice of unit of measure is to align with charSpacing.\r\n * You can slim the tickness without issues, while large underline or overline may end up\r\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\r\n * is needed and is out of scope for now. If you need such large overline on the first line\r\n * of text or large underline on the last line of text, consider disabling caching as a\r\n * workaround\r\n * @default 66.667\r\n */\r\n declare textDecorationThickness: number;\r\n\r\n /**\r\n * Offset amount for text path starting position\r\n * Only used when text has a path\r\n */\r\n declare pathStartOffset: number;\r\n\r\n /**\r\n * Which side of the path the text should be drawn on.\r\n * Only used when text has a path\r\n * @type {TPathSide} 'left|right'\r\n */\r\n declare pathSide: TPathSide;\r\n\r\n /**\r\n * How text is aligned to the path. This property determines\r\n * the perpendicular position of each character relative to the path.\r\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\r\n * This feature is in BETA, and its behavior may change\r\n * @type TPathAlign\r\n */\r\n declare pathAlign: TPathAlign;\r\n\r\n /**\r\n * @private\r\n */\r\n declare _fontSizeFraction: number;\r\n\r\n /**\r\n * @private\r\n */\r\n declare offsets: { underline: number; linethrough: number; overline: number };\r\n\r\n /**\r\n * Text Line proportion to font Size (in pixels)\r\n * @type Number\r\n */\r\n declare _fontSizeMult: number;\r\n\r\n /**\r\n * additional space between characters\r\n * expressed in thousands of em unit\r\n * @type Number\r\n */\r\n declare charSpacing: number;\r\n\r\n /**\r\n * Baseline shift, styles only, keep at 0 for the main text object\r\n * @type {Number}\r\n */\r\n declare deltaY: number;\r\n\r\n /**\r\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\r\n * determine the direction of the text.\r\n * This has to be set manually together with textAlign and originX for proper\r\n * experience.\r\n * some interesting link for the future\r\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\r\n * @since 4.5.0\r\n * @type {CanvasDirection} 'ltr|rtl'\r\n */\r\n declare direction: CanvasDirection;\r\n\r\n /**\r\n * contains characters bounding boxes\r\n * This variable is considered to be protected.\r\n * But for how mixins are implemented right now, we can't leave it private\r\n * @protected\r\n */\r\n __charBounds: GraphemeBBox[][] = [];\r\n\r\n /**\r\n * use this size when measuring text. To avoid IE11 rounding errors\r\n * @type {Number}\r\n * @readonly\r\n * @private\r\n */\r\n declare CACHE_FONT_SIZE: number;\r\n\r\n /**\r\n * contains the min text width to avoid getting 0\r\n * @type {Number}\r\n */\r\n declare MIN_TEXT_WIDTH: number;\r\n\r\n /**\r\n * contains the the text of the object, divided in lines as they are displayed\r\n * on screen. Wrapping will divide the text independently of line breaks\r\n * @type {string[]}\r\n */\r\n declare textLines: string[];\r\n\r\n /**\r\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\r\n * @type {string[]}\r\n */\r\n declare _textLines: string[][];\r\n\r\n declare _unwrappedTextLines: string[][];\r\n declare _text: string[];\r\n declare cursorWidth: number;\r\n declare __lineHeights: number[];\r\n declare __lineWidths: number[];\r\n declare initialized?: true;\r\n\r\n static cacheProperties = [...cacheProperties, ...additionalProps];\r\n\r\n static ownDefaults = textDefaultValues;\r\n\r\n static type = 'Text';\r\n\r\n static getDefaults(): Record<string, any> {\r\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\r\n }\r\n\r\n constructor(text: string, options?: Props) {\r\n super();\r\n Object.assign(this, FabricText.ownDefaults);\r\n this.setOptions(options);\r\n if (!this.styles) {\r\n this.styles = {};\r\n }\r\n this.text = text;\r\n this.initialized = true;\r\n if (this.path) {\r\n this.setPathInfo();\r\n }\r\n this.initDimensions();\r\n this.setCoords();\r\n }\r\n\r\n /**\r\n * If text has a path, it will add the extra information needed\r\n * for path and text calculations\r\n */\r\n setPathInfo() {\r\n const path = this.path;\r\n if (path) {\r\n path.segmentsInfo = getPathSegmentsInfo(path.path);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * Divides text into lines of text and lines of graphemes.\r\n * Uses browser lines when available for pixel-perfect consistency.\r\n */\r\n _splitText(): TextLinesInfo {\r\n // Check if we have valid browser lines and should use them\r\n const browserLines = getBrowserLines(this);\r\n if (browserLines && this.useOverlayEditing) {\r\n return this._splitTextFromBrowserLines(browserLines);\r\n }\r\n \r\n const newLines = this._splitTextIntoLines(this.text);\r\n this.textLines = newLines.lines;\r\n this._textLines = newLines.graphemeLines;\r\n this._unwrappedTextLines = newLines._unwrappedLines;\r\n this._text = newLines.graphemeText;\r\n return newLines;\r\n }\r\n\r\n /**\r\n * Create TextLinesInfo from browser-extracted lines\r\n * @private\r\n */\r\n _splitTextFromBrowserLines(browserLines: BrowserLine[]): TextLinesInfo {\r\n const lines: string[] = [];\r\n const graphemeLines: string[][] = [];\r\n const unwrappedLines: string[][] = [];\r\n let graphemeText: string[] = [];\r\n\r\n for (const browserLine of browserLines) {\r\n lines.push(browserLine.text);\r\n const lineGraphemes = this.graphemeSplit(browserLine.text);\r\n graphemeLines.push(lineGraphemes);\r\n unwrappedLines.push(lineGraphemes);\r\n graphemeText = graphemeText.concat(lineGraphemes);\r\n \r\n // Add newline separator between lines (except for the last line)\r\n if (browserLine !== browserLines[browserLines.length - 1]) {\r\n graphemeText.push('\\n');\r\n }\r\n }\r\n\r\n const result: TextLinesInfo = {\r\n lines,\r\n graphemeLines,\r\n graphemeText,\r\n _unwrappedLines: unwrappedLines,\r\n };\r\n\r\n // Update instance properties\r\n this.textLines = result.lines;\r\n this._textLines = result.graphemeLines;\r\n this._unwrappedTextLines = result._unwrappedLines;\r\n this._text = result.graphemeText;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Initialize or update text dimensions.\r\n * Updates this.width and this.height with the proper values.\r\n * Does not return dimensions.\r\n */\r\n initDimensions(): void {\r\n // Use advanced layout if enabled\r\n if (this.enableAdvancedLayout && !this.path) {\r\n return this.initDimensionsAdvanced();\r\n }\r\n \r\n this._splitText();\r\n this._clearCache();\r\n this.dirty = true;\r\n if (this.path) {\r\n this.width = this.path.width;\r\n this.height = this.path.height;\r\n } else {\r\n this.width =\r\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\r\n this.height = this.calcTextHeight();\r\n }\r\n if (this.textAlign.includes(JUSTIFY)) {\r\n // once text is measured we need to make space fatter to make justified text.\r\n this.enlargeSpaces();\r\n }\r\n }\r\n\r\n /**\r\n * Enlarge space boxes and shift the others\r\n */\r\n enlargeSpaces() {\r\n let diffSpace,\r\n currentLineWidth,\r\n numberOfSpaces,\r\n accumulatedSpace,\r\n line,\r\n charBound,\r\n spaces;\r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n if (\r\n this.textAlign !== JUSTIFY &&\r\n (i === len - 1 || this.isEndOfWrapping(i))\r\n ) {\r\n continue;\r\n }\r\n accumulatedSpace = 0;\r\n line = this._textLines[i];\r\n currentLineWidth = this.getLineWidth(i);\r\n if (\r\n currentLineWidth < this.width &&\r\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\r\n ) {\r\n numberOfSpaces = spaces.length;\r\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\r\n for (let j = 0; j <= line.length; j++) {\r\n charBound = this.__charBounds[i][j];\r\n if (this._reSpaceAndTab.test(line[j])) {\r\n charBound.width += diffSpace;\r\n charBound.kernedWidth += diffSpace;\r\n charBound.left += accumulatedSpace;\r\n accumulatedSpace += diffSpace;\r\n } else {\r\n charBound.left += accumulatedSpace;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Advanced layout using new text engine (Konva-compatible)\r\n * @private\r\n */\r\n _layoutTextAdvanced(): LayoutResult {\r\n const options = this._getAdvancedLayoutOptions();\r\n return layoutText(options);\r\n }\r\n\r\n /**\r\n * Get advanced layout options from current text properties\r\n * @private\r\n */\r\n _getAdvancedLayoutOptions(): TextLayoutOptions {\r\n return {\r\n text: this.text,\r\n width: this.width,\r\n height: this.height,\r\n wrap: this.wrap || 'word',\r\n align: this._mapTextAlignToAlign(this.textAlign),\r\n ellipsis: this.ellipsis || false,\r\n fontSize: this.fontSize,\r\n lineHeight: this.lineHeight,\r\n letterSpacing: this.letterSpacing || 0,\r\n charSpacing: this.charSpacing,\r\n direction: this.direction === 'inherit' ? 'ltr' : this.direction,\r\n fontFamily: this.fontFamily,\r\n fontStyle: this.fontStyle,\r\n fontWeight: this.fontWeight,\r\n verticalAlign: this.verticalAlign || 'top',\r\n };\r\n }\r\n\r\n /**\r\n * Map Fabric textAlign to Konva align format\r\n * @private\r\n */\r\n _mapTextAlignToAlign(textAlign: string): 'left' | 'center' | 'right' | 'justify' {\r\n switch (textAlign) {\r\n case 'center':\r\n case CENTER:\r\n return 'center';\r\n case 'right':\r\n case RIGHT:\r\n return 'right';\r\n case 'justify':\r\n case JUSTIFY:\r\n case JUSTIFY_LEFT:\r\n case JUSTIFY_RIGHT:\r\n case JUSTIFY_CENTER:\r\n return 'justify';\r\n default:\r\n return 'left';\r\n }\r\n }\r\n\r\n /**\r\n * Enhanced initDimensions that uses advanced layout when enabled\r\n */\r\n initDimensionsAdvanced(): void {\r\n if (!this.enableAdvancedLayout) {\r\n return this.initDimensions();\r\n }\r\n\r\n const layout = this._layoutTextAdvanced();\r\n \r\n // Update dimensions from layout\r\n this.width = layout.totalWidth || this.MIN_TEXT_WIDTH;\r\n this.height = layout.totalHeight;\r\n \r\n // Convert layout to legacy format for compatibility\r\n this._convertLayoutToLegacyFormat(layout);\r\n \r\n this.dirty = true;\r\n }\r\n\r\n /**\r\n * Convert new layout format to legacy _textLines and __charBounds format\r\n * @private\r\n */\r\n _convertLayoutToLegacyFormat(layout: LayoutResult): void {\r\n this._textLines = layout.lines.map(line => line.graphemes);\r\n (this as any).textLines = layout.lines.map(line => line.text);\r\n \r\n // Convert bounds to legacy format\r\n this.__charBounds = layout.lines.map(line => \r\n line.bounds.map(bound => ({\r\n left: bound.left,\r\n top: bound.y,\r\n width: bound.width,\r\n height: bound.height,\r\n kernedWidth: bound.kernedWidth,\r\n deltaY: bound.deltaY || 0,\r\n }))\r\n );\r\n \r\n // Update grapheme info for compatibility\r\n if (layout.lines.length > 0) {\r\n (this as any)._unwrappedTextLines = layout.lines.map(line => line.graphemes);\r\n }\r\n }\r\n\r\n /**\r\n * Detect if the text line is ended with an hard break\r\n * text and itext do not have wrapping, return false\r\n * @return {Boolean}\r\n */\r\n isEndOfWrapping(lineIndex: number): boolean {\r\n return lineIndex === this._textLines.length - 1;\r\n }\r\n\r\n /**\r\n * Detect if a line has a linebreak and so we need to account for it when moving\r\n * and counting style.\r\n * It return always 1 for text and Itext. Textbox has its own implementation\r\n * @return Number\r\n */\r\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\r\n missingNewlineOffset(_lineIndex: number): 1 {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Returns 2d representation (lineIndex and charIndex) of cursor\r\n * @param {Number} selectionStart\r\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\r\n */\r\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\r\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\r\n let i: number;\r\n for (i = 0; i < lines.length; i++) {\r\n if (selectionStart <= lines[i].length) {\r\n return {\r\n lineIndex: i,\r\n charIndex: selectionStart,\r\n };\r\n }\r\n selectionStart -=\r\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\r\n }\r\n return {\r\n lineIndex: i - 1,\r\n charIndex:\r\n lines[i - 1].length < selectionStart\r\n ? lines[i - 1].length\r\n : selectionStart,\r\n };\r\n }\r\n\r\n /**\r\n * Returns string representation of an instance\r\n * @return {String} String representation of text object\r\n */\r\n toString(): string {\r\n return `#<Text (${this.complexity()}): { \"text\": \"${\r\n this.text\r\n }\", \"fontFamily\": \"${this.fontFamily}\" }>`;\r\n }\r\n\r\n /**\r\n * Return the dimension and the zoom level needed to create a cache canvas\r\n * big enough to host the object to be cached.\r\n * @private\r\n * @param {Object} dim.x width of object to be cached\r\n * @param {Object} dim.y height of object to be cached\r\n * @return {Object}.width width of canvas\r\n * @return {Object}.height height of canvas\r\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\r\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\r\n */\r\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\r\n const dims = super._getCacheCanvasDimensions();\r\n const fontSize = this.fontSize;\r\n dims.width += fontSize * dims.zoomX;\r\n dims.height += fontSize * dims.zoomY;\r\n return dims;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _render(ctx: CanvasRenderingContext2D) {\r\n const path = this.path;\r\n path && !path.isNotVisible() && path._render(ctx);\r\n this._setTextStyles(ctx);\r\n this._renderTextLinesBackground(ctx);\r\n this._renderTextDecoration(ctx, 'underline');\r\n this._renderText(ctx);\r\n this._renderTextDecoration(ctx, 'overline');\r\n this._renderTextDecoration(ctx, 'linethrough');\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderText(ctx: CanvasRenderingContext2D) {\r\n // Skip text rendering if in overlay editing mode\r\n if ((this as any).__overlayEditor) {\r\n return;\r\n }\r\n if (this.paintFirst === STROKE) {\r\n this._renderTextStroke(ctx);\r\n this._renderTextFill(ctx);\r\n } else {\r\n this._renderTextFill(ctx);\r\n this._renderTextStroke(ctx);\r\n }\r\n }\r\n\r\n /**\r\n * Set the font parameter of the context with the object properties or with charStyle\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {Object} [charStyle] object with font style properties\r\n * @param {String} [charStyle.fontFamily] Font Family\r\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\r\n * @param {String} [charStyle.fontWeight] Font weight\r\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\r\n */\r\n _setTextStyles(\r\n ctx: CanvasRenderingContext2D,\r\n charStyle?: any,\r\n forMeasuring?: boolean,\r\n ) {\r\n ctx.textBaseline = 'alphabetic';\r\n if (this.path) {\r\n switch (this.pathAlign) {\r\n case CENTER:\r\n ctx.textBaseline = 'middle';\r\n break;\r\n case 'ascender':\r\n ctx.textBaseline = TOP;\r\n break;\r\n case 'descender':\r\n ctx.textBaseline = BOTTOM;\r\n break;\r\n }\r\n }\r\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\r\n }\r\n\r\n /**\r\n * calculate and return the text Width measuring each line.\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @return {Number} Maximum width of Text object\r\n */\r\n calcTextWidth(): number {\r\n let maxWidth = this.getLineWidth(0);\r\n\r\n for (let i = 1, len = this._textLines.length; i < len; i++) {\r\n const currentLineWidth = this.getLineWidth(i);\r\n if (currentLineWidth > maxWidth) {\r\n maxWidth = currentLineWidth;\r\n }\r\n }\r\n return maxWidth;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {String} line Text to render\r\n * @param {Number} left Left position of text\r\n * @param {Number} top Top position of text\r\n * @param {Number} lineIndex Index of a line in a text\r\n */\r\n _renderTextLine(\r\n method: 'fillText' | 'strokeText',\r\n ctx: CanvasRenderingContext2D,\r\n line: string[],\r\n left: number,\r\n top: number,\r\n lineIndex: number,\r\n ) {\r\n this._renderChars(method, ctx, line, left, top, lineIndex);\r\n }\r\n\r\n /**\r\n * Renders the text background for lines, taking care of style\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\r\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\r\n return;\r\n }\r\n const originalFill = ctx.fillStyle,\r\n leftOffset = this._getLeftOffset();\r\n let lineTopOffset = this._getTopOffset();\r\n\r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n const heightOfLine = this.getHeightOfLine(i);\r\n if (\r\n !this.textBackgroundColor &&\r\n !this.styleHas('textBackgroundColor', i)\r\n ) {\r\n lineTopOffset += heightOfLine;\r\n continue;\r\n }\r\n const jlen = this._textLines[i].length;\r\n const lineLeftOffset = this._getLineLeftOffset(i);\r\n let boxWidth = 0;\r\n let boxStart = 0;\r\n let drawStart;\r\n let currentColor;\r\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\r\n for (let j = 0; j < jlen; j++) {\r\n // at this point charbox are either standard or full with pathInfo if there is a path.\r\n const charBox = this.__charBounds[i][j] as Required<GraphemeBBox>;\r\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\r\n if (this.path) {\r\n ctx.save();\r\n ctx.translate(charBox.renderLeft, charBox.renderTop);\r\n ctx.rotate(charBox.angle);\r\n ctx.fillStyle = currentColor;\r\n currentColor &&\r\n ctx.fillRect(\r\n -charBox.width / 2,\r\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\r\n charBox.width,\r\n heightOfLine / this.lineHeight,\r\n );\r\n ctx.restore();\r\n } else if (currentColor !== lastColor) {\r\n drawStart = leftOffset + lineLeftOffset + boxStart;\r\n if (this.direction === 'rtl') {\r\n drawStart = this.width - drawStart - boxWidth;\r\n }\r\n ctx.fillStyle = lastColor;\r\n lastColor &&\r\n ctx.fillRect(\r\n drawStart,\r\n lineTopOffset,\r\n boxWidth,\r\n heightOfLine / this.lineHeight,\r\n );\r\n boxStart = charBox.left;\r\n boxWidth = charBox.width;\r\n lastColor = currentColor;\r\n } else {\r\n boxWidth += charBox.kernedWidth;\r\n }\r\n }\r\n if (currentColor && !this.path) {\r\n drawStart = leftOffset + lineLeftOffset + boxStart;\r\n if (this.direction === 'rtl') {\r\n drawStart = this.width - drawStart - boxWidth;\r\n }\r\n ctx.fillStyle = currentColor;\r\n ctx.fillRect(\r\n drawStart,\r\n lineTopOffset,\r\n boxWidth,\r\n heightOfLine / this.lineHeight,\r\n );\r\n }\r\n lineTopOffset += heightOfLine;\r\n }\r\n ctx.fillStyle = originalFill;\r\n // if there is text background color no\r\n // other shadows should be casted\r\n this._removeShadow(ctx);\r\n }\r\n\r\n /**\r\n * measure and return the width of a single character.\r\n * possibly overridden to accommodate different measure logic or\r\n * to hook some external lib for character measurement\r\n * @private\r\n * @param {String} _char, char to be measured\r\n * @param {Object} charStyle style of char to be measured\r\n * @param {String} [previousChar] previous char\r\n * @param {Object} [prevCharStyle] style of previous char\r\n */\r\n _measureChar(\r\n _char: string,\r\n charStyle: CompleteTextStyleDeclaration,\r\n previousChar: string | undefined,\r\n prevCharStyle: CompleteTextStyleDeclaration | Record<string, never>,\r\n ) {\r\n const fontCache = cache.getFontCache(charStyle),\r\n fontDeclaration = this._getFontDeclaration(charStyle),\r\n couple = previousChar + _char,\r\n stylesAreEqual =\r\n previousChar &&\r\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\r\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\r\n let width: number | undefined,\r\n coupleWidth: number | undefined,\r\n previousWidth: number | undefined,\r\n kernedWidth: number | undefined;\r\n\r\n if (previousChar && fontCache[previousChar] !== undefined) {\r\n previousWidth = fontCache[previousChar];\r\n }\r\n if (fontCache[_char] !== undefined) {\r\n kernedWidth = width = fontCache[_char];\r\n }\r\n if (stylesAreEqual && fontCache[couple] !== undefined) {\r\n coupleWidth = fontCache[couple];\r\n kernedWidth = coupleWidth - previousWidth!;\r\n }\r\n if (\r\n width === undefined ||\r\n previousWidth === undefined ||\r\n coupleWidth === undefined\r\n ) {\r\n const ctx = getMeasuringContext()!;\r\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\r\n this._setTextStyles(ctx, charStyle, true);\r\n if (width === undefined) {\r\n kernedWidth = width = ctx.measureText(_char).width;\r\n fontCache[_char] = width;\r\n }\r\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\r\n previousWidth = ctx.measureText(previousChar).width;\r\n fontCache[previousChar] = previousWidth;\r\n }\r\n if (stylesAreEqual && coupleWidth === undefined) {\r\n // we can measure the kerning couple and subtract the width of the previous character\r\n coupleWidth = ctx.measureText(couple).width;\r\n fontCache[couple] = coupleWidth;\r\n // safe to use the non-null since if undefined we defined it before.\r\n kernedWidth = coupleWidth - previousWidth!;\r\n }\r\n }\r\n return {\r\n width: width * fontMultiplier,\r\n kernedWidth: kernedWidth! * fontMultiplier,\r\n };\r\n }\r\n\r\n /**\r\n * Computes height of character at given position\r\n * @param {Number} line the line index number\r\n * @param {Number} _char the character index number\r\n * @return {Number} fontSize of the character\r\n */\r\n getHeightOfChar(line: number, _char: number): number {\r\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\r\n }\r\n\r\n /**\r\n * measure a text line measuring all characters.\r\n * @param {Number} lineIndex line number\r\n */\r\n measureLine(lineIndex: number) {\r\n const lineInfo = this._measureLine(lineIndex);\r\n if (this.charSpacing !== 0) {\r\n lineInfo.width -= this._getWidthOfCharSpacing();\r\n }\r\n if (lineInfo.width < 0) {\r\n lineInfo.width = 0;\r\n }\r\n return lineInfo;\r\n }\r\n\r\n /**\r\n * measure every grapheme of a line, populating __charBounds\r\n * @param {Number} lineIndex\r\n * @return {Object} object.width total width of characters\r\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\r\n */\r\n _measureLine(lineIndex: number) {\r\n let width = 0,\r\n prevGrapheme: string | undefined,\r\n graphemeInfo: GraphemeBBox | undefined;\r\n\r\n const reverse = this.pathSide === RIGHT,\r\n path = this.path,\r\n line = this._textLines[lineIndex],\r\n llength = line.length,\r\n lineBounds = new Array<GraphemeBBox>(llength);\r\n\r\n this.__charBounds[lineIndex] = lineBounds;\r\n for (let i = 0; i < llength; i++) {\r\n const grapheme = line[i];\r\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\r\n lineBounds[i] = graphemeInfo;\r\n width += graphemeInfo.kernedWidth;\r\n prevGrapheme = grapheme;\r\n }\r\n // this latest bound box represent the last character of the line\r\n // to simplify cursor handling in interactive mode.\r\n lineBounds[llength] = {\r\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\r\n width: 0,\r\n kernedWidth: 0,\r\n height: this.fontSize,\r\n deltaY: 0,\r\n } as GraphemeBBox;\r\n if (path && path.segmentsInfo) {\r\n let positionInPath = 0;\r\n const totalPathLength =\r\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\r\n switch (this.textAlign) {\r\n case LEFT:\r\n positionInPath = reverse ? totalPathLength - width : 0;\r\n break;\r\n case CENTER:\r\n positionInPath = (totalPathLength - width) / 2;\r\n break;\r\n case RIGHT:\r\n positionInPath = reverse ? 0 : totalPathLength - width;\r\n break;\r\n //todo - add support for justify\r\n }\r\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\r\n for (\r\n let i = reverse ? llength - 1 : 0;\r\n reverse ? i >= 0 : i < llength;\r\n reverse ? i-- : i++\r\n ) {\r\n graphemeInfo = lineBounds[i];\r\n if (positionInPath > totalPathLength) {\r\n positionInPath %= totalPathLength;\r\n } else if (positionInPath < 0) {\r\n positionInPath += totalPathLength;\r\n }\r\n // it would probably much faster to send all the grapheme position for a line\r\n // and calculate path position/angle at once.\r\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\r\n positionInPath += graphemeInfo.kernedWidth;\r\n }\r\n }\r\n return { width: width, numOfSpaces: 0 };\r\n }\r\n\r\n /**\r\n * Calculate the angle and the left,top position of the char that follow a path.\r\n * It appends it to graphemeInfo to be reused later at rendering\r\n * @private\r\n * @param {Number} positionInPath to be measured\r\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\r\n * @param {Object} startingPoint position of the point\r\n */\r\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\r\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\r\n path = this.path!;\r\n\r\n // we are at currentPositionOnPath. we want to know what point on the path is.\r\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\r\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\r\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\r\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\r\n }\r\n\r\n /**\r\n *\r\n * @param {String} grapheme to be measured\r\n * @param {Number} lineIndex index of the line where the char is\r\n * @param {Number} charIndex position in the line\r\n * @param {String} [prevGrapheme] character preceding the one to be measured\r\n * @returns {GraphemeBBox} grapheme bbox\r\n */\r\n _getGraphemeBox(\r\n grapheme: string,\r\n lineIndex: number,\r\n charIndex: number,\r\n prevGrapheme?: string,\r\n skipLeft?: boolean,\r\n ): GraphemeBBox {\r\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\r\n prevStyle = prevGrapheme\r\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\r\n : {},\r\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\r\n let kernedWidth = info.kernedWidth,\r\n width = info.width,\r\n charSpacing;\r\n\r\n if (this.charSpacing !== 0) {\r\n charSpacing = this._getWidthOfCharSpacing();\r\n width += charSpacing;\r\n kernedWidth += charSpacing;\r\n }\r\n\r\n const box: GraphemeBBox = {\r\n width,\r\n left: 0,\r\n height: style.fontSize,\r\n kernedWidth,\r\n deltaY: style.deltaY,\r\n };\r\n if (charIndex > 0 && !skipLeft) {\r\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\r\n box.left =\r\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\r\n }\r\n return box;\r\n }\r\n\r\n /**\r\n * Calculate height of line at 'lineIndex'\r\n * @param {Number} lineIndex index of line to calculate\r\n * @return {Number}\r\n */\r\n getHeightOfLine(lineIndex: number): number {\r\n if (this.__lineHeights[lineIndex]) {\r\n return this.__lineHeights[lineIndex];\r\n }\r\n\r\n // char 0 is measured before the line cycle because it needs to char\r\n // emptylines\r\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\r\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\r\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\r\n }\r\n\r\n return (this.__lineHeights[lineIndex] =\r\n maxHeight * this.lineHeight * this._fontSizeMult);\r\n }\r\n\r\n /**\r\n * Calculate text box height\r\n */\r\n calcTextHeight() {\r\n let lineHeight,\r\n height = 0;\r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n lineHeight = this.getHeightOfLine(i);\r\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\r\n }\r\n return height;\r\n }\r\n\r\n /**\r\n * @private\r\n * @return {Number} Left offset\r\n */\r\n _getLeftOffset(): number {\r\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\r\n }\r\n\r\n /**\r\n * @private\r\n * @return {Number} Top offset\r\n */\r\n _getTopOffset(): number {\r\n return -this.height / 2;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\r\n */\r\n _renderTextCommon(\r\n ctx: CanvasRenderingContext2D,\r\n method: 'fillText' | 'strokeText',\r\n ) {\r\n ctx.save();\r\n let lineHeights = 0;\r\n const left = this._getLeftOffset(),\r\n top = this._getTopOffset();\r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n const heightOfLine = this.getHeightOfLine(i),\r\n maxHeight = heightOfLine / this.lineHeight,\r\n leftOffset = this._getLineLeftOffset(i);\r\n this._renderTextLine(\r\n method,\r\n ctx,\r\n this._textLines[i],\r\n left + leftOffset,\r\n top + lineHeights + maxHeight,\r\n i,\r\n );\r\n lineHeights += heightOfLine;\r\n }\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderTextFill(ctx: CanvasRenderingContext2D) {\r\n if (!this.fill && !this.styleHas(FILL)) {\r\n return;\r\n }\r\n\r\n this._renderTextCommon(ctx, 'fillText');\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\r\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\r\n return;\r\n }\r\n\r\n if (this.shadow && !this.shadow.affectStroke) {\r\n this._removeShadow(ctx);\r\n }\r\n\r\n ctx.save();\r\n this._setLineDash(ctx, this.strokeDashArray);\r\n ctx.beginPath();\r\n this._renderTextCommon(ctx, 'strokeText');\r\n ctx.closePath();\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {String} method fillText or strokeText.\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {Array} line Content of the line, splitted in an array by grapheme\r\n * @param {Number} left\r\n * @param {Number} top\r\n * @param {Number} lineIndex\r\n */\r\n _renderChars(\r\n method: 'fillText' | 'strokeText',\r\n ctx: CanvasRenderingContext2D,\r\n line: Array<any>,\r\n left: number,\r\n top: number,\r\n lineIndex: number,\r\n ) {\r\n const lineHeight = this.getHeightOfLine(lineIndex),\r\n isJustify = this.textAlign.includes(JUSTIFY),\r\n path = this.path,\r\n shortCut =\r\n !isJustify &&\r\n this.charSpacing === 0 &&\r\n this.isEmptyStyles(lineIndex) &&\r\n !path,\r\n isLtr = this.direction === 'ltr',\r\n sign = this.direction === 'ltr' ? 1 : -1,\r\n // this was changed in the PR #7674\r\n // currentDirection = ctx.canvas.getAttribute('dir');\r\n currentDirection = ctx.direction;\r\n\r\n let actualStyle,\r\n nextStyle,\r\n charsToRender = '',\r\n charBox,\r\n boxWidth = 0,\r\n timeToRender,\r\n drawingLeft;\r\n\r\n ctx.save();\r\n if (currentDirection !== this.direction) {\r\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\r\n ctx.direction = isLtr ? 'ltr' : 'rtl';\r\n ctx.textAlign = isLtr ? LEFT : RIGHT;\r\n }\r\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\r\n if (shortCut) {\r\n // render all the line in one pass without checking\r\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\r\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\r\n ctx.restore();\r\n return;\r\n }\r\n for (let i = 0, len = line.length - 1; i <= len; i++) {\r\n timeToRender = i === len || this.charSpacing || path;\r\n charsToRender += line[i];\r\n charBox = this.__charBounds[lineIndex][i] as Required<GraphemeBBox>;\r\n if (boxWidth === 0) {\r\n left += sign * (charBox.kernedWidth - charBox.width);\r\n boxWidth += charBox.width;\r\n } else {\r\n boxWidth += charBox.kernedWidth;\r\n }\r\n if (isJustify && !timeToRender) {\r\n if (this._reSpaceAndTab.test(line[i])) {\r\n timeToRender = true;\r\n }\r\n }\r\n if (!timeToRender) {\r\n // if we have charSpacing, we render char by char\r\n actualStyle =\r\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\r\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\r\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\r\n }\r\n if (timeToRender) {\r\n if (path) {\r\n ctx.save();\r\n ctx.translate(charBox.renderLeft, charBox.renderTop);\r\n ctx.rotate(charBox.angle);\r\n this._renderChar(\r\n method,\r\n ctx,\r\n lineIndex,\r\n i,\r\n charsToRender,\r\n -boxWidth / 2,\r\n 0,\r\n );\r\n ctx.restore();\r\n } else {\r\n drawingLeft = left;\r\n this._renderChar(\r\n method,\r\n ctx,\r\n lineIndex,\r\n i,\r\n charsToRender,\r\n drawingLeft,\r\n top,\r\n );\r\n }\r\n charsToRender = '';\r\n actualStyle = nextStyle;\r\n left += sign * boxWidth;\r\n boxWidth = 0;\r\n }\r\n }\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * This function try to patch the missing gradientTransform on canvas gradients.\r\n * transforming a context to transform the gradient, is going to transform the stroke too.\r\n * we want to transform the gradient but not the stroke operation, so we create\r\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\r\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\r\n * is limited.\r\n * @private\r\n * @param {TFiller} filler a fabric gradient instance\r\n * @return {CanvasPattern} a pattern to use as fill/stroke style\r\n */\r\n _applyPatternGradientTransformText(filler: TFiller) {\r\n // TODO: verify compatibility with strokeUniform\r\n const width = this.width + this.strokeWidth,\r\n height = this.height + this.strokeWidth,\r\n pCanvas = createCanvasElementFor({\r\n width,\r\n height,\r\n }),\r\n pCtx = pCanvas.getContext('2d')!;\r\n pCanvas.width = width;\r\n pCanvas.height = height;\r\n pCtx.beginPath();\r\n pCtx.moveTo(0, 0);\r\n pCtx.lineTo(width, 0);\r\n pCtx.lineTo(width, height);\r\n pCtx.lineTo(0, height);\r\n pCtx.closePath();\r\n pCtx.translate(width / 2, height / 2);\r\n pCtx.fillStyle = filler.toLive(pCtx)!;\r\n this._applyPatternGradientTransform(pCtx, filler);\r\n pCtx.fill();\r\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\r\n }\r\n\r\n handleFiller<T extends 'fill' | 'stroke'>(\r\n ctx: CanvasRenderingContext2D,\r\n property: `${T}Style`,\r\n filler: TFiller | string,\r\n ): { offsetX: number; offsetY: number } {\r\n let offsetX: number, offsetY: number;\r\n if (isFiller(filler)) {\r\n if (\r\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\r\n (filler as Gradient<'linear'>).gradientTransform ||\r\n (filler as Pattern).patternTransform\r\n ) {\r\n // need to transform gradient in a pattern.\r\n // this is a slow process. If you are hitting this codepath, and the object\r\n // is not using caching, you should consider switching it on.\r\n // we need a canvas as big as the current object caching canvas.\r\n offsetX = -this.width / 2;\r\n offsetY = -this.height / 2;\r\n ctx.translate(offsetX, offsetY);\r\n ctx[property] = this._applyPatternGradientTransformText(filler);\r\n return { offsetX, offsetY };\r\n } else {\r\n // is a simple gradient or pattern\r\n ctx[property] = filler.toLive(ctx)!;\r\n return this._applyPatternGradientTransform(ctx, filler);\r\n }\r\n } else {\r\n // is a color\r\n ctx[property] = filler;\r\n }\r\n return { offsetX: 0, offsetY: 0 };\r\n }\r\n\r\n /**\r\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\r\n * need to be sent in as defined\r\n * @param {CanvasRenderingContext2D} ctx\r\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\r\n * @returns\r\n */\r\n _setStrokeStyles(\r\n ctx: CanvasRenderingContext2D,\r\n {\r\n stroke,\r\n strokeWidth,\r\n }: Pick<CompleteTextStyleDeclaration, 'stroke' | 'strokeWidth'>,\r\n ) {\r\n ctx.lineWidth = strokeWidth;\r\n ctx.lineCap = this.strokeLineCap;\r\n ctx.lineDashOffset = this.strokeDashOffset;\r\n ctx.lineJoin = this.strokeLineJoin;\r\n ctx.miterLimit = this.strokeMiterLimit;\r\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\r\n }\r\n\r\n /**\r\n * This function prepare the canvas for a ill style, and fill\r\n * need to be sent in as defined\r\n * @param {CanvasRenderingContext2D} ctx\r\n * @param {CompleteTextStyleDeclaration} style with ill defined\r\n * @returns\r\n */\r\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick<this, 'fill'>) {\r\n return this.handleFiller(ctx, 'fillStyle', fill!);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {String} method\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {Number} lineIndex\r\n * @param {Number} charIndex\r\n * @param {String} _char\r\n * @param {Number} left Left coordinate\r\n * @param {Number} top Top coordinate\r\n * @param {Number} lineHeight Height of the line\r\n */\r\n _renderChar(\r\n method: 'fillText' | 'strokeText',\r\n ctx: CanvasRenderingContext2D,\r\n lineIndex: number,\r\n charIndex: number,\r\n _char: string,\r\n left: number,\r\n top: number,\r\n ) {\r\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\r\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\r\n shouldFill = method === 'fillText' && fullDecl.fill,\r\n shouldStroke =\r\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\r\n\r\n if (!shouldStroke && !shouldFill) {\r\n return;\r\n }\r\n ctx.save();\r\n\r\n ctx.font = this._getFontDeclaration(fullDecl);\r\n\r\n if (decl.textBackgroundColor) {\r\n this._removeShadow(ctx);\r\n }\r\n if (decl.deltaY) {\r\n top += decl.deltaY;\r\n }\r\n\r\n if (shouldFill) {\r\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\r\n ctx.fillText(\r\n _char,\r\n left - fillOffsets.offsetX,\r\n top - fillOffsets.offsetY,\r\n );\r\n }\r\n\r\n if (shouldStroke) {\r\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\r\n ctx.strokeText(\r\n _char,\r\n left - strokeOffsets.offsetX,\r\n top - strokeOffsets.offsetY,\r\n );\r\n }\r\n\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * Turns the character into a 'superior figure' (i.e. 'superscript')\r\n * @param {Number} start selection start\r\n * @param {Number} end selection end\r\n */\r\n setSuperscript(start: number, end: number) {\r\n this._setScript(start, end, this.superscript);\r\n }\r\n\r\n /**\r\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\r\n * @param {Number} start selection start\r\n * @param {Number} end selection end\r\n */\r\n setSubscript(start: number, end: number) {\r\n this._setScript(start, end, this.subscript);\r\n }\r\n\r\n /**\r\n * Applies 'schema' at given position\r\n * @private\r\n * @param {Number} start selection start\r\n * @param {Number} end selection end\r\n * @param {Number} schema\r\n */\r\n protected _setScript(\r\n start: number,\r\n end: number,\r\n schema: {\r\n size: number;\r\n baseline: number;\r\n },\r\n ) {\r\n const loc = this.get2DCursorLocation(start, true),\r\n fontSize = this.getValueOfPropertyAt(\r\n loc.lineIndex,\r\n loc.charIndex,\r\n 'fontSize',\r\n ),\r\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\r\n style = {\r\n fontSize: fontSize * schema.size,\r\n deltaY: dy + fontSize * schema.baseline,\r\n };\r\n this.setSelectionStyles(style, start, end);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Number} lineIndex index text line\r\n * @return {Number} Line left offset\r\n */\r\n _getLineLeftOffset(lineIndex: number): number {\r\n const lineWidth = this.getLineWidth(lineIndex),\r\n lineDiff = this.width - lineWidth,\r\n textAlign = this.textAlign,\r\n direction = this.direction,\r\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\r\n let leftOffset = 0;\r\n if (\r\n textAlign === JUSTIFY ||\r\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\r\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\r\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping)\r\n ) {\r\n return 0;\r\n }\r\n if (textAlign === CENTER) {\r\n leftOffset = lineDiff / 2;\r\n }\r\n if (textAlign === RIGHT) {\r\n leftOffset = lineDiff;\r\n }\r\n if (textAlign === JUSTIFY_CENTER) {\r\n leftOffset = lineDiff / 2;\r\n }\r\n if (textAlign === JUSTIFY_RIGHT) {\r\n leftOffset = lineDiff;\r\n }\r\n if (direction === 'rtl') {\r\n if (\r\n textAlign === RIGHT ||\r\n textAlign === JUSTIFY ||\r\n textAlign === JUSTIFY_RIGHT\r\n ) {\r\n leftOffset = 0;\r\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\r\n leftOffset = -lineDiff;\r\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\r\n leftOffset = -lineDiff / 2;\r\n }\r\n }\r\n return leftOffset;\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _clearCache() {\r\n this._forceClearCache = false;\r\n this.__lineWidths = [];\r\n this.__lineHeights = [];\r\n this.__charBounds = [];\r\n }\r\n\r\n /**\r\n * Measure a single line given its index. Used to calculate the initial\r\n * text bounding box. The values are calculated and stored in __lineWidths cache.\r\n * @private\r\n * @param {Number} lineIndex line number\r\n * @return {Number} Line width\r\n */\r\n getLineWidth(lineIndex: number): number {\r\n if (this.__lineWidths[lineIndex] !== undefined) {\r\n return this.__lineWidths[lineIndex];\r\n }\r\n\r\n const { width } = this.measureLine(lineIndex);\r\n this.__lineWidths[lineIndex] = width;\r\n return width;\r\n }\r\n\r\n _getWidthOfCharSpacing() {\r\n if (this.charSpacing !== 0) {\r\n return (this.fontSize * this.charSpacing) / 1000;\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Retrieves the value of property at given character position\r\n * @param {Number} lineIndex the line number\r\n * @param {Number} charIndex the character number\r\n * @param {String} property the property name\r\n * @returns the value of 'property'\r\n */\r\n getValueOfPropertyAt<T extends StylePropertiesType>(\r\n lineIndex: number,\r\n charIndex: number,\r\n property: T,\r\n ): this[T] {\r\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\r\n return (charStyle[property] ?? this[property]) as this[T];\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderTextDecoration(\r\n ctx: CanvasRenderingContext2D,\r\n type: 'underline' | 'linethrough' | 'overline',\r\n ) {\r\n if (!this[type] && !this.styleHas(type)) {\r\n return;\r\n }\r\n let topOffset = this._getTopOffset();\r\n const leftOffset = this._getLeftOffset(),\r\n path = this.path,\r\n charSpacing = this._getWidthOfCharSpacing(),\r\n offsetAligner =\r\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\r\n offsetY = this.offsets[type];\r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n const heightOfLine = this.getHeightOfLine(i);\r\n if (!this[type] && !this.styleHas(type, i)) {\r\n topOffset += heightOfLine;\r\n continue;\r\n }\r\n const line = this._textLines[i];\r\n const maxHeight = heightOfLine / this.lineHeight;\r\n const lineLeftOffset = this._getLineLeftOffset(i);\r\n let boxStart = 0;\r\n let boxWidth = 0;\r\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\r\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\r\n let lastTickness = this.getValueOfPropertyAt(\r\n i,\r\n 0,\r\n TEXT_DECORATION_THICKNESS,\r\n );\r\n let currentDecoration = lastDecoration;\r\n let currentFill = lastFill;\r\n let currentTickness = lastTickness;\r\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\r\n let size = this.getHeightOfChar(i, 0);\r\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\r\n for (let j = 0, jlen = line.length; j < jlen; j++) {\r\n const charBox = this.__charBounds[i][j] as Required<GraphemeBBox>;\r\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\r\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\r\n currentTickness = this.getValueOfPropertyAt(\r\n i,\r\n j,\r\n TEXT_DECORATION_THICKNESS,\r\n );\r\n const currentSize = this.getHeightOfChar(i, j);\r\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\r\n if (path && currentDecoration && currentFill) {\r\n const finalTickness = (this.fontSize * currentTickness) / 1000;\r\n ctx.save();\r\n // bug? verify lastFill is a valid fill here.\r\n ctx.fillStyle = lastFill as string;\r\n ctx.translate(charBox.renderLeft, charBox.renderTop);\r\n ctx.rotate(charBox.angle);\r\n ctx.fillRect(\r\n -charBox.kernedWidth / 2,\r\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\r\n charBox.kernedWidth,\r\n finalTickness,\r\n );\r\n ctx.restore();\r\n } else if (\r\n (currentDecoration !== lastDecoration ||\r\n currentFill !== lastFill ||\r\n currentSize !== size ||\r\n currentTickness !== lastTickness ||\r\n currentDy !== dy) &&\r\n boxWidth > 0\r\n ) {\r\n const finalTickness = (this.fontSize * lastTickness) / 1000;\r\n let drawStart = leftOffset + lineLeftOffset + boxStart;\r\n if (this.direction === 'rtl') {\r\n drawStart = this.width - drawStart - boxWidth;\r\n }\r\n if (lastDecoration && lastFill && lastTickness) {\r\n // bug? verify lastFill is a valid fill here.\r\n ctx.fillStyle = lastFill as string;\r\n ctx.fillRect(\r\n drawStart,\r\n top + offsetY * size + dy - offsetAligner * finalTickness,\r\n boxWidth,\r\n finalTickness,\r\n );\r\n }\r\n boxStart = charBox.left;\r\n boxWidth = charBox.width;\r\n lastDecoration = currentDecoration;\r\n lastTickness = currentTickness;\r\n lastFill = currentFill;\r\n size = currentSize;\r\n dy = currentDy;\r\n } else {\r\n boxWidth += charBox.kernedWidth;\r\n }\r\n }\r\n let drawStart = leftOffset + lineLeftOffset + boxStart;\r\n if (this.direction === 'rtl') {\r\n drawStart = this.width - drawStart - boxWidth;\r\n }\r\n ctx.fillStyle = currentFill as string;\r\n const finalTickness = (this.fontSize * currentTickness) / 1000;\r\n currentDecoration &&\r\n currentFill &&\r\n currentTickness &&\r\n ctx.fillRect(\r\n drawStart,\r\n top + offsetY * size + dy - offsetAligner * finalTickness,\r\n boxWidth - charSpacing,\r\n finalTickness,\r\n );\r\n topOffset += heightOfLine;\r\n }\r\n // if there is text background color no\r\n // other shadows should be casted\r\n this._removeShadow(ctx);\r\n }\r\n\r\n /**\r\n * return font declaration string for canvas context\r\n * @param {Object} [styleObject] object\r\n * @returns {String} font declaration formatted for canvas context.\r\n */\r\n _getFontDeclaration(\r\n {\r\n fontFamily = this.fontFamily,\r\n fontStyle = this.fontStyle,\r\n fontWeight = this.fontWeight,\r\n fontSize = this.fontSize,\r\n }: Partial<\r\n Pick<\r\n TextStyleDeclaration,\r\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\r\n >\r\n > = {},\r\n forMeasuring?: boolean,\r\n ): string {\r\n const parsedFontFamily =\r\n fontFamily.includes(\"'\") ||\r\n fontFamily.includes('\"') ||\r\n fontFamily.includes(',') ||\r\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\r\n ? fontFamily\r\n : `\"${fontFamily}\"`;\r\n return [\r\n fontStyle,\r\n fontWeight,\r\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\r\n parsedFontFamily,\r\n ].join(' ');\r\n }\r\n\r\n /**\r\n * Renders text instance on a specified context\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n render(ctx: CanvasRenderingContext2D) {\r\n if (!this.visible) {\r\n return;\r\n }\r\n if (\r\n this.canvas &&\r\n this.canvas.skipOffscreen &&\r\n !this.group &&\r\n !this.isOnScreen()\r\n ) {\r\n return;\r\n }\r\n if (this._forceClearCache) {\r\n this.initDimensions();\r\n }\r\n super.render(ctx);\r\n }\r\n\r\n /**\r\n * Override this method to customize grapheme splitting\r\n * @todo the util `graphemeSplit` needs to be injectable in some way.\r\n * is more comfortable to inject the correct util rather than having to override text\r\n * in the middle of the prototype chain\r\n * @param {string} value\r\n * @returns {string[]} array of graphemes\r\n */\r\n graphemeSplit(value: string): string[] {\r\n return graphemeSplit(value);\r\n }\r\n\r\n /**\r\n * Returns the text as an array of lines.\r\n * @param {String} text text to split\r\n * @returns Lines in the text\r\n */\r\n _splitTextIntoLines(text: string): TextLinesInfo {\r\n const lines = text.split(this._reNewline),\r\n newLines = new Array<string[]>(lines.length),\r\n newLine = ['\\n'];\r\n let newText: string[] = [];\r\n for (let i = 0; i < lines.length; i++) {\r\n newLines[i] = this.graphemeSplit(lines[i]);\r\n newText = newText.concat(newLines[i], newLine);\r\n }\r\n newText.pop();\r\n return {\r\n _unwrappedLines: newLines,\r\n lines: lines,\r\n graphemeText: newText,\r\n graphemeLines: newLines,\r\n };\r\n }\r\n\r\n /**\r\n * Returns object representation of an instance\r\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\r\n * @return {Object} Object representation of an instance\r\n */\r\n toObject<\r\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\r\n K extends keyof T = never,\r\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\r\n return {\r\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\r\n styles: stylesToArray(this.styles, this.text),\r\n ...(this.path ? { path: this.path.toObject() } : {}),\r\n };\r\n }\r\n\r\n set(key: string | any, value?: any) {\r\n const { textLayoutProperties } = this.constructor as typeof FabricText;\r\n super.set(key, value);\r\n let needsDims = false;\r\n let isAddingPath = false;\r\n if (typeof key === 'object') {\r\n for (const _key in key) {\r\n if (_key === 'path') {\r\n this.setPathInfo();\r\n }\r\n needsDims = needsDims || textLayoutProperties.includes(_key);\r\n isAddingPath = isAddingPath || _key === 'path';\r\n }\r\n } else {\r\n needsDims = textLayoutProperties.includes(key);\r\n isAddingPath = key === 'path';\r\n }\r\n if (isAddingPath) {\r\n this.setPathInfo();\r\n }\r\n if (needsDims && this.initialized) {\r\n // Clear browser lines when layout-affecting properties change\r\n clearBrowserLines(this);\r\n this.initDimensions();\r\n this.setCoords();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns complexity of an instance\r\n * @return {Number} complexity\r\n */\r\n complexity(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * List of generic font families\r\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\r\n */\r\n static genericFonts = [\r\n 'serif',\r\n 'sans-serif',\r\n 'monospace',\r\n 'cursive',\r\n 'fantasy',\r\n 'system-ui',\r\n 'ui-serif',\r\n 'ui-sans-serif',\r\n 'ui-monospace',\r\n 'ui-rounded',\r\n 'math',\r\n 'emoji',\r\n 'fangsong',\r\n ];\r\n\r\n /* _FROM_SVG_START_ */\r\n\r\n /**\r\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\r\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\r\n */\r\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\r\n 'x',\r\n 'y',\r\n 'dx',\r\n 'dy',\r\n 'font-family',\r\n 'font-style',\r\n 'font-weight',\r\n 'font-size',\r\n 'letter-spacing',\r\n 'text-decoration',\r\n 'text-anchor',\r\n );\r\n\r\n /**\r\n * Returns FabricText instance from an SVG element (<b>not yet implemented</b>)\r\n * @param {HTMLElement} element Element to parse\r\n * @param {Object} [options] Options object\r\n */\r\n static async fromElement(\r\n element: HTMLElement | SVGElement,\r\n options?: Abortable,\r\n cssRules?: CSSRules,\r\n ) {\r\n const parsedAttributes = parseAttributes(\r\n element,\r\n FabricText.ATTRIBUTE_NAMES,\r\n cssRules,\r\n );\r\n\r\n const {\r\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\r\n textDecoration = '',\r\n dx = 0,\r\n dy = 0,\r\n top = 0,\r\n left = 0,\r\n fontSize = DEFAULT_SVG_FONT_SIZE,\r\n strokeWidth = 1,\r\n ...restOfOptions\r\n } = { ...options, ...parsedAttributes };\r\n\r\n const textContent = (element.textContent || '')\r\n .replace(/^\\s+|\\s+$|\\n+/g, '')\r\n .replace(/\\s+/g, ' ');\r\n\r\n // this code here is probably the usual issue for SVG center find\r\n // this can later looked at again and probably removed.\r\n\r\n const text = new this(textContent, {\r\n left: left + dx,\r\n top: top + dy,\r\n underline: textDecoration.includes('underline'),\r\n overline: textDecoration.includes('overline'),\r\n linethrough: textDecoration.includes('line-through'),\r\n // we initialize this as 0\r\n strokeWidth: 0,\r\n fontSize,\r\n ...restOfOptions,\r\n }),\r\n textHeightScaleFactor = text.getScaledHeight() / text.height,\r\n lineHeightDiff =\r\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\r\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\r\n textHeight = text.getScaledHeight() + scaledDiff;\r\n\r\n let offX = 0;\r\n /*\r\n Adjust positioning:\r\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\r\n fabric output by default at top, left.\r\n */\r\n if (textAnchor === CENTER) {\r\n offX = text.getScaledWidth() / 2;\r\n }\r\n if (textAnchor === RIGHT) {\r\n offX = text.getScaledWidth();\r\n }\r\n text.set({\r\n left: text.left - offX,\r\n top:\r\n text.top -\r\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\r\n text.lineHeight,\r\n strokeWidth,\r\n });\r\n return text;\r\n }\r\n\r\n /* _FROM_SVG_END_ */\r\n\r\n /**\r\n * Returns FabricText instance from an object representation\r\n * @param {Object} object plain js Object to create an instance from\r\n * @returns {Promise<FabricText>}\r\n */\r\n static fromObject<\r\n T extends TOptions<SerializedTextProps>,\r\n S extends FabricText,\r\n >(object: T) {\r\n return this._fromObject<S>(\r\n {\r\n ...object,\r\n styles: stylesFromArray(object.styles || {}, object.text),\r\n },\r\n {\r\n extraParam: 'text',\r\n },\r\n );\r\n }\r\n}\r\n\r\napplyMixins(FabricText, [TextSVGExportMixin]);\r\nclassRegistry.setClass(FabricText);\r\nclassRegistry.setSVGClass(FabricText);\r\n"],"names":["measuringContext","getMeasuringContext","canvas","createCanvasElementFor","width","height","getContext","FabricText","StyledText","getDefaults","ownDefaults","constructor","text","options","_defineProperty","Object","assign","setOptions","styles","initialized","path","setPathInfo","initDimensions","setCoords","segmentsInfo","getPathSegmentsInfo","_splitText","browserLines","getBrowserLines","useOverlayEditing","_splitTextFromBrowserLines","newLines","_splitTextIntoLines","textLines","lines","_textLines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","unwrappedLines","browserLine","push","lineGraphemes","graphemeSplit","concat","length","result","enableAdvancedLayout","initDimensionsAdvanced","_clearCache","dirty","calcTextWidth","cursorWidth","MIN_TEXT_WIDTH","calcTextHeight","textAlign","includes","JUSTIFY","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","line","charBound","spaces","i","len","isEndOfWrapping","getLineWidth","match","_reSpacesAndTabs","j","__charBounds","_reSpaceAndTab","test","kernedWidth","left","_layoutTextAdvanced","_getAdvancedLayoutOptions","layoutText","wrap","align","_mapTextAlignToAlign","ellipsis","fontSize","lineHeight","letterSpacing","charSpacing","direction","fontFamily","fontStyle","fontWeight","verticalAlign","CENTER","RIGHT","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","layout","totalWidth","totalHeight","_convertLayoutToLegacyFormat","map","graphemes","bounds","bound","top","y","deltaY","lineIndex","missingNewlineOffset","_lineIndex","get2DCursorLocation","selectionStart","skipWrapping","charIndex","toString","complexity","_getCacheCanvasDimensions","dims","zoomX","zoomY","_render","ctx","isNotVisible","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderText","__overlayEditor","paintFirst","STROKE","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","pathAlign","TOP","BOTTOM","font","_getFontDeclaration","maxWidth","_renderTextLine","method","_renderChars","textBackgroundColor","styleHas","originalFill","fillStyle","leftOffset","_getLeftOffset","lineTopOffset","_getTopOffset","heightOfLine","getHeightOfLine","jlen","lineLeftOffset","_getLineLeftOffset","boxWidth","boxStart","drawStart","currentColor","lastColor","getValueOfPropertyAt","charBox","save","translate","renderLeft","renderTop","rotate","angle","fillRect","_fontSizeFraction","restore","_removeShadow","_measureChar","_char","previousChar","prevCharStyle","fontCache","cache","getFontCache","fontDeclaration","couple","stylesAreEqual","fontMultiplier","CACHE_FONT_SIZE","coupleWidth","previousWidth","undefined","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","reverse","pathSide","llength","lineBounds","Array","grapheme","_getGraphemeBox","positionInPath","totalPathLength","LEFT","pathStartOffset","_setGraphemeOnPath","numOfSpaces","centerPosition","info","getPointOnPath","x","pathOffset","Math","PI","skipLeft","style","getCompleteStyleDeclaration","prevStyle","box","previousBox","__lineHeights","maxHeight","max","_fontSizeMult","_renderTextCommon","lineHeights","fill","FILL","stroke","strokeWidth","isEmptyStyles","shadow","affectStroke","_setLineDash","strokeDashArray","beginPath","closePath","isJustify","shortCut","isLtr","sign","currentDirection","actualStyle","nextStyle","charsToRender","timeToRender","drawingLeft","setAttribute","_renderChar","join","hasStyleChanged","_applyPatternGradientTransformText","filler","pCanvas","pCtx","moveTo","lineTo","toLive","_applyPatternGradientTransform","createPattern","handleFiller","property","offsetX","offsetY","isFiller","gradientUnits","gradientTransform","patternTransform","_setStrokeStyles","_ref","lineWidth","lineCap","strokeLineCap","lineDashOffset","strokeDashOffset","lineJoin","strokeLineJoin","miterLimit","strokeMiterLimit","_setFillStyles","_ref2","decl","_getStyleDeclaration","fullDecl","shouldFill","shouldStroke","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","start","end","_setScript","superscript","setSubscript","subscript","schema","loc","dy","size","baseline","setSelectionStyles","lineDiff","_forceClearCache","__lineWidths","_charStyle$property","type","topOffset","offsetAligner","offsets","lastDecoration","lastFill","lastTickness","TEXT_DECORATION_THICKNESS","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","arguments","parsedFontFamily","genericFonts","toLowerCase","render","visible","skipOffscreen","group","isOnScreen","value","split","_reNewline","newLine","newText","pop","toObject","propertiesToInclude","additionalProps","stylesToArray","set","key","textLayoutProperties","needsDims","isAddingPath","_key","clearBrowserLines","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","textAnchor","textDecoration","dx","DEFAULT_SVG_FONT_SIZE","restOfOptions","textContent","replace","underline","overline","linethrough","textHeightScaleFactor","getScaledHeight","lineHeightDiff","scaledDiff","textHeight","offX","getScaledWidth","fromObject","object","_fromObject","stylesFromArray","extraParam","cacheProperties","textDefaultValues","SHARED_ATTRIBUTES","applyMixins","TextSVGExportMixin","classRegistry","setClass","setSVGClass"],"mappings":"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"}
1
+ {"version":3,"file":"Text.mjs","sources":["../../../../src/shapes/Text/Text.ts"],"sourcesContent":["import { cache } from '../../cache';\r\nimport { DEFAULT_SVG_FONT_SIZE, FILL, STROKE } from '../../constants';\r\nimport type { ObjectEvents } from '../../EventTypeDefs';\r\nimport type {\r\n CompleteTextStyleDeclaration,\r\n TextStyle,\r\n TextStyleDeclaration,\r\n} from './StyledText';\r\nimport { StyledText } from './StyledText';\r\nimport { SHARED_ATTRIBUTES } from '../../parser/attributes';\r\nimport { parseAttributes } from '../../parser/parseAttributes';\r\nimport type {\r\n Abortable,\r\n TCacheCanvasDimensions,\r\n TClassProperties,\r\n TFiller,\r\n TOptions,\r\n} from '../../typedefs';\r\nimport { classRegistry } from '../../ClassRegistry';\r\nimport { graphemeSplit } from '../../util/lang_string';\r\nimport { createCanvasElementFor } from '../../util/misc/dom';\r\nimport { layoutText, type LayoutResult, type TextLayoutOptions } from '../../text/layout';\r\nimport { measureGrapheme, measureGraphemeWithKerning } from '../../text/measure';\r\nimport { applyEllipsis } from '../../text/ellipsis';\r\nimport { segmentGraphemes } from '../../text/unicode';\r\nimport type { TextStyleArray } from '../../util/misc/textStyles';\r\nimport {\r\n hasStyleChanged,\r\n stylesFromArray,\r\n stylesToArray,\r\n} from '../../util/misc/textStyles';\r\nimport { getPathSegmentsInfo, getPointOnPath } from '../../util/path';\r\nimport { cacheProperties } from '../Object/FabricObject';\r\nimport type { Path } from '../Path';\r\nimport { TextSVGExportMixin } from './TextSVGExportMixin';\r\nimport { applyMixins } from '../../util/applyMixins';\r\nimport type { FabricObjectProps, SerializedObjectProps } from '../Object/types';\r\nimport type { StylePropertiesType } from './constants';\r\nimport {\r\n additionalProps,\r\n textDefaultValues,\r\n textLayoutProperties,\r\n JUSTIFY,\r\n JUSTIFY_CENTER,\r\n JUSTIFY_LEFT,\r\n JUSTIFY_RIGHT,\r\n TEXT_DECORATION_THICKNESS,\r\n} from './constants';\r\nimport { CENTER, LEFT, RIGHT, TOP, BOTTOM } from '../../constants';\r\nimport { isFiller } from '../../util/typeAssertions';\r\nimport type { Gradient } from '../../gradient/Gradient';\r\nimport type { Pattern } from '../../Pattern';\r\nimport type { CSSRules } from '../../parser/typedefs';\r\nimport { getBrowserLines, clearBrowserLines } from '../../text/browserLines';\r\nimport type { BrowserLine } from '../../text/browserLines';\r\n\r\nlet measuringContext: CanvasRenderingContext2D | null;\r\n\r\n/**\r\n * Return a context for measurement of text string.\r\n * if created it gets stored for reuse\r\n */\r\nfunction getMeasuringContext() {\r\n if (!measuringContext) {\r\n const canvas = createCanvasElementFor({\r\n width: 0,\r\n height: 0,\r\n });\r\n measuringContext = canvas.getContext('2d');\r\n }\r\n return measuringContext;\r\n}\r\n\r\nexport type TPathSide = 'left' | 'right';\r\n\r\nexport type TPathAlign = 'baseline' | 'center' | 'ascender' | 'descender';\r\n\r\nexport type TextLinesInfo = {\r\n lines: string[];\r\n graphemeLines: string[][];\r\n graphemeText: string[];\r\n _unwrappedLines: string[][];\r\n};\r\n\r\n/**\r\n * Measure and return the info of a single grapheme.\r\n * needs the the info of previous graphemes already filled\r\n * Override to customize measuring\r\n */\r\nexport type GraphemeBBox = {\r\n width: number;\r\n height: number;\r\n kernedWidth: number;\r\n left: number;\r\n deltaY: number;\r\n renderLeft?: number;\r\n renderTop?: number;\r\n angle?: number;\r\n};\r\n\r\n// @TODO this is not complete\r\ninterface UniqueTextProps {\r\n charSpacing: number;\r\n lineHeight: number;\r\n fontSize: number;\r\n fontWeight: string | number;\r\n fontFamily: string;\r\n fontStyle: string;\r\n pathSide: TPathSide;\r\n pathAlign: TPathAlign;\r\n underline: boolean;\r\n overline: boolean;\r\n linethrough: boolean;\r\n textAlign: string;\r\n direction: CanvasDirection;\r\n path?: Path;\r\n textDecorationThickness: number;\r\n wrap: 'word' | 'char' | 'none';\r\n ellipsis: boolean | string;\r\n letterSpacing: number;\r\n enableAdvancedLayout: boolean;\r\n verticalAlign: 'top' | 'middle' | 'bottom';\r\n useOverlayEditing: boolean;\r\n}\r\n\r\nexport interface SerializedTextProps\r\n extends SerializedObjectProps,\r\n UniqueTextProps {\r\n styles: TextStyleArray | TextStyle;\r\n}\r\n\r\nexport interface TextProps extends FabricObjectProps, UniqueTextProps {\r\n styles: TextStyle;\r\n}\r\n\r\n/**\r\n * Text class\r\n * @see {@link http://fabricjs.com/fabric-intro-part-2#text}\r\n */\r\nexport class FabricText<\r\n Props extends TOptions<TextProps> = Partial<TextProps>,\r\n SProps extends SerializedTextProps = SerializedTextProps,\r\n EventSpec extends ObjectEvents = ObjectEvents,\r\n >\r\n extends StyledText<Props, SProps, EventSpec>\r\n implements UniqueTextProps\r\n{\r\n /**\r\n * Properties that requires a text layout recalculation when changed\r\n * @type string[]\r\n * @protected\r\n */\r\n static textLayoutProperties: string[] = textLayoutProperties;\r\n\r\n /**\r\n * @private\r\n */\r\n declare _reNewline: RegExp;\r\n\r\n /**\r\n * Use this regular expression to filter for whitespaces that is not a new line.\r\n * Mostly used when text is 'justify' aligned.\r\n * @private\r\n */\r\n declare _reSpacesAndTabs: RegExp;\r\n\r\n /**\r\n * Use this regular expression to filter for whitespace that is not a new line.\r\n * Mostly used when text is 'justify' aligned.\r\n * @private\r\n */\r\n declare _reSpaceAndTab: RegExp;\r\n\r\n /**\r\n * Use this regular expression to filter consecutive groups of non spaces.\r\n * Mostly used when text is 'justify' aligned.\r\n * @private\r\n */\r\n declare _reWords: RegExp;\r\n\r\n declare text: string;\r\n\r\n /**\r\n * Font size (in pixels)\r\n * @type Number\r\n */\r\n declare fontSize: number;\r\n\r\n /**\r\n * Font weight (e.g. bold, normal, 400, 600, 800)\r\n * @type {(Number|String)}\r\n */\r\n declare fontWeight: string | number;\r\n\r\n /**\r\n * Font family\r\n * @type String\r\n */\r\n declare fontFamily: string;\r\n\r\n /**\r\n * Text decoration underline.\r\n * @type Boolean\r\n */\r\n declare underline: boolean;\r\n\r\n /**\r\n * Text decoration overline.\r\n * @type Boolean\r\n */\r\n declare overline: boolean;\r\n\r\n /**\r\n * Text decoration linethrough.\r\n * @type Boolean\r\n */\r\n declare linethrough: boolean;\r\n\r\n /**\r\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\r\n * \"justify-left\", \"justify-center\" or \"justify-right\".\r\n * @type String\r\n */\r\n declare textAlign: string;\r\n\r\n /**\r\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\r\n * @type String\r\n */\r\n declare fontStyle: string;\r\n\r\n /**\r\n * Line height\r\n * @type Number\r\n */\r\n declare lineHeight: number;\r\n\r\n /**\r\n * Superscript schema object (minimum overlap)\r\n */\r\n declare superscript: {\r\n /**\r\n * fontSize factor\r\n * @default 0.6\r\n */\r\n size: number;\r\n /**\r\n * baseline-shift factor (upwards)\r\n * @default -0.35\r\n */\r\n baseline: number;\r\n };\r\n\r\n /**\r\n * Subscript schema object (minimum overlap)\r\n */\r\n declare subscript: {\r\n /**\r\n * fontSize factor\r\n * @default 0.6\r\n */\r\n size: number;\r\n /**\r\n * baseline-shift factor (downwards)\r\n * @default 0.11\r\n */\r\n baseline: number;\r\n };\r\n\r\n /**\r\n * Background color of text lines\r\n * @type String\r\n */\r\n declare textBackgroundColor: string;\r\n\r\n declare styles: TextStyle;\r\n\r\n /**\r\n * Path that the text should follow.\r\n * since 4.6.0 the path will be drawn automatically.\r\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\r\n * if you want it to be hidden, assign visible = false to the path.\r\n * This feature is in BETA, and SVG import/export is not yet supported.\r\n * @type Path\r\n * @example\r\n * const textPath = new Text('Text on a path', {\r\n * top: 150,\r\n * left: 150,\r\n * textAlign: 'center',\r\n * charSpacing: -50,\r\n * path: new Path('M 0 0 C 50 -100 150 -100 200 0', {\r\n * strokeWidth: 1,\r\n * visible: false\r\n * }),\r\n * pathSide: 'left',\r\n * pathStartOffset: 0\r\n * });\r\n */\r\n declare path?: Path;\r\n\r\n /**\r\n * Text wrapping mode\r\n * @type string\r\n * @default 'word'\r\n */\r\n declare wrap: 'word' | 'char' | 'none';\r\n\r\n /**\r\n * Ellipsis truncation\r\n * @type boolean | string\r\n * @default false\r\n */\r\n declare ellipsis: boolean | string;\r\n\r\n /**\r\n * Letter spacing in pixels (Konva-style)\r\n * @type number\r\n * @default 0\r\n */\r\n declare letterSpacing: number;\r\n\r\n /**\r\n * Enable advanced text layout engine\r\n * @type boolean\r\n * @default false\r\n */\r\n declare enableAdvancedLayout: boolean;\r\n\r\n /**\r\n * Vertical text alignment\r\n * @type string\r\n * @default 'top'\r\n */\r\n declare verticalAlign: 'top' | 'middle' | 'bottom';\r\n\r\n /**\r\n * Use overlay editor for inline text editing instead of hidden textarea.\r\n * @default false\r\n */\r\n declare useOverlayEditing: boolean;\r\n\r\n /**\r\n * The text decoration tickness for underline, overline and strikethrough\r\n * The tickness is expressed in thousandths of fontSize ( em ).\r\n * The original value was 1/15 that translates to 66.6667 thousandths.\r\n * The choice of unit of measure is to align with charSpacing.\r\n * You can slim the tickness without issues, while large underline or overline may end up\r\n * outside the bounding box of the text. In order to fix that a bigger refactor of the code\r\n * is needed and is out of scope for now. If you need such large overline on the first line\r\n * of text or large underline on the last line of text, consider disabling caching as a\r\n * workaround\r\n * @default 66.667\r\n */\r\n declare textDecorationThickness: number;\r\n\r\n /**\r\n * Offset amount for text path starting position\r\n * Only used when text has a path\r\n */\r\n declare pathStartOffset: number;\r\n\r\n /**\r\n * Which side of the path the text should be drawn on.\r\n * Only used when text has a path\r\n * @type {TPathSide} 'left|right'\r\n */\r\n declare pathSide: TPathSide;\r\n\r\n /**\r\n * How text is aligned to the path. This property determines\r\n * the perpendicular position of each character relative to the path.\r\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\r\n * This feature is in BETA, and its behavior may change\r\n * @type TPathAlign\r\n */\r\n declare pathAlign: TPathAlign;\r\n\r\n /**\r\n * @private\r\n */\r\n declare _fontSizeFraction: number;\r\n\r\n /**\r\n * @private\r\n */\r\n declare offsets: { underline: number; linethrough: number; overline: number };\r\n\r\n /**\r\n * Text Line proportion to font Size (in pixels)\r\n * @type Number\r\n */\r\n declare _fontSizeMult: number;\r\n\r\n /**\r\n * additional space between characters\r\n * expressed in thousands of em unit\r\n * @type Number\r\n */\r\n declare charSpacing: number;\r\n\r\n /**\r\n * Baseline shift, styles only, keep at 0 for the main text object\r\n * @type {Number}\r\n */\r\n declare deltaY: number;\r\n\r\n /**\r\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\r\n * determine the direction of the text.\r\n * This has to be set manually together with textAlign and originX for proper\r\n * experience.\r\n * some interesting link for the future\r\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\r\n * @since 4.5.0\r\n * @type {CanvasDirection} 'ltr|rtl'\r\n */\r\n declare direction: CanvasDirection;\r\n\r\n /**\r\n * contains characters bounding boxes\r\n * This variable is considered to be protected.\r\n * But for how mixins are implemented right now, we can't leave it private\r\n * @protected\r\n */\r\n __charBounds: GraphemeBBox[][] = [];\r\n\r\n /**\r\n * use this size when measuring text. To avoid IE11 rounding errors\r\n * @type {Number}\r\n * @readonly\r\n * @private\r\n */\r\n declare CACHE_FONT_SIZE: number;\r\n\r\n /**\r\n * contains the min text width to avoid getting 0\r\n * @type {Number}\r\n */\r\n declare MIN_TEXT_WIDTH: number;\r\n\r\n /**\r\n * contains the the text of the object, divided in lines as they are displayed\r\n * on screen. Wrapping will divide the text independently of line breaks\r\n * @type {string[]}\r\n */\r\n declare textLines: string[];\r\n\r\n /**\r\n * same as textlines, but each line is an array of graphemes as split by splitByGrapheme\r\n * @type {string[]}\r\n */\r\n declare _textLines: string[][];\r\n\r\n declare _unwrappedTextLines: string[][];\r\n declare _text: string[];\r\n declare cursorWidth: number;\r\n declare __lineHeights: number[];\r\n declare __lineWidths: number[];\r\n declare initialized?: true;\r\n\r\n static cacheProperties = [...cacheProperties, ...additionalProps];\r\n\r\n static ownDefaults = textDefaultValues;\r\n\r\n static type = 'Text';\r\n\r\n static getDefaults(): Record<string, any> {\r\n return { ...super.getDefaults(), ...FabricText.ownDefaults };\r\n }\r\n\r\n constructor(text: string, options?: Props) {\r\n super();\r\n Object.assign(this, FabricText.ownDefaults);\r\n this.setOptions(options);\r\n if (!this.styles) {\r\n this.styles = {};\r\n }\r\n this.text = text;\r\n this.initialized = true;\r\n if (this.path) {\r\n this.setPathInfo();\r\n }\r\n this.initDimensions();\r\n this.setCoords();\r\n }\r\n\r\n /**\r\n * If text has a path, it will add the extra information needed\r\n * for path and text calculations\r\n */\r\n setPathInfo() {\r\n const path = this.path;\r\n if (path) {\r\n path.segmentsInfo = getPathSegmentsInfo(path.path);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * Divides text into lines of text and lines of graphemes.\r\n * Uses browser lines when available for pixel-perfect consistency.\r\n */\r\n _splitText(): TextLinesInfo {\r\n // Check if we have valid browser lines and should use them\r\n const browserLines = getBrowserLines(this);\r\n if (browserLines && this.useOverlayEditing) {\r\n return this._splitTextFromBrowserLines(browserLines);\r\n }\r\n \r\n const newLines = this._splitTextIntoLines(this.text);\r\n this.textLines = newLines.lines;\r\n this._textLines = newLines.graphemeLines;\r\n this._unwrappedTextLines = newLines._unwrappedLines;\r\n this._text = newLines.graphemeText;\r\n return newLines;\r\n }\r\n\r\n /**\r\n * Create TextLinesInfo from browser-extracted lines\r\n * @private\r\n */\r\n _splitTextFromBrowserLines(browserLines: BrowserLine[]): TextLinesInfo {\r\n const lines: string[] = [];\r\n const graphemeLines: string[][] = [];\r\n const unwrappedLines: string[][] = [];\r\n let graphemeText: string[] = [];\r\n\r\n for (const browserLine of browserLines) {\r\n lines.push(browserLine.text);\r\n const lineGraphemes = this.graphemeSplit(browserLine.text);\r\n graphemeLines.push(lineGraphemes);\r\n unwrappedLines.push(lineGraphemes);\r\n graphemeText = graphemeText.concat(lineGraphemes);\r\n \r\n // Add newline separator between lines (except for the last line)\r\n if (browserLine !== browserLines[browserLines.length - 1]) {\r\n graphemeText.push('\\n');\r\n }\r\n }\r\n\r\n const result: TextLinesInfo = {\r\n lines,\r\n graphemeLines,\r\n graphemeText,\r\n _unwrappedLines: unwrappedLines,\r\n };\r\n\r\n // Update instance properties\r\n this.textLines = result.lines;\r\n this._textLines = result.graphemeLines;\r\n this._unwrappedTextLines = result._unwrappedLines;\r\n this._text = result.graphemeText;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Initialize or update text dimensions.\r\n * Updates this.width and this.height with the proper values.\r\n * Does not return dimensions.\r\n */\r\n initDimensions(): void {\r\n // Check if font is ready for accurate measurements\r\n // Only block initialization if it's a critical font loading situation\r\n const fontReady = this._isFontReady();\r\n if (!fontReady && !this.initialized) {\r\n // Only schedule font loading on first initialization\r\n this._scheduleInitAfterFontLoad();\r\n // Continue with fallback measurements for now\r\n }\r\n \r\n // Use advanced layout if enabled\r\n if (this.enableAdvancedLayout && !this.path) {\r\n return this.initDimensionsAdvanced();\r\n }\r\n \r\n this._splitText();\r\n this._clearCache();\r\n this.dirty = true;\r\n if (this.path) {\r\n this.width = this.path.width;\r\n this.height = this.path.height;\r\n } else {\r\n this.width =\r\n this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\r\n this.height = this.calcTextHeight();\r\n }\r\n if (this.textAlign.includes(JUSTIFY)) {\r\n // once text is measured we need to make space fatter to make justified text.\r\n // Ensure __charBounds exists before calling enlargeSpaces\r\n if (this.__charBounds && this.__charBounds.length > 0) {\r\n this.enlargeSpaces();\r\n } else {\r\n console.warn('⚠️ __charBounds not ready for justify alignment, deferring enlargeSpaces');\r\n // Defer the justify calculation until the next frame\r\n setTimeout(() => {\r\n if (this.__charBounds && this.__charBounds.length > 0 && this.enlargeSpaces) {\r\n console.log('🔧 Applying deferred justify alignment');\r\n this.enlargeSpaces();\r\n this.canvas?.requestRenderAll();\r\n }\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Enlarge space boxes and shift the others\r\n */\r\n enlargeSpaces() {\r\n let diffSpace,\r\n currentLineWidth,\r\n numberOfSpaces,\r\n accumulatedSpace,\r\n line,\r\n charBound,\r\n spaces;\r\n const isRtl = this.direction === 'rtl';\r\n \r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n if (\r\n !this.textAlign.includes('justify') &&\r\n (i === len - 1 || this.isEndOfWrapping(i))\r\n ) {\r\n continue;\r\n }\r\n accumulatedSpace = 0;\r\n line = this._textLines[i];\r\n currentLineWidth = this.getLineWidth(i);\r\n if (\r\n currentLineWidth < this.width &&\r\n (spaces = this.textLines[i].match(this._reSpacesAndTabs))\r\n ) {\r\n numberOfSpaces = spaces.length;\r\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\r\n \r\n console.log(`🔧 EnlargeSpaces Line ${i}:`);\r\n console.log(` Current width: ${currentLineWidth}, Target: ${this.width}`);\r\n console.log(` Spaces: ${numberOfSpaces}, diffSpace: ${diffSpace.toFixed(2)}`);\r\n \r\n if (isRtl) {\r\n // For RTL text, we need to redistribute spaces while maintaining correct visual order\r\n // The key insight is that RTL text is stored in logical order but displayed in visual order\r\n // We need to adjust bounds to account for the visual positioning\r\n \r\n // First, collect all space positions\r\n const spaceIndices = [];\r\n for (let j = 0; j < line.length; j++) {\r\n if (this._reSpaceAndTab.test(line[j])) {\r\n spaceIndices.push(j);\r\n }\r\n }\r\n \r\n // Calculate total expansion\r\n const totalExpansion = diffSpace * numberOfSpaces;\r\n \r\n // For RTL, we need to work backwards through the visual positions\r\n // but still update logical positions correctly\r\n let spaceCount = 0;\r\n for (let j = 0; j <= line.length; j++) {\r\n charBound = this.__charBounds[i][j];\r\n if (charBound) {\r\n if (this._reSpaceAndTab.test(line[j])) {\r\n charBound.width += diffSpace;\r\n charBound.kernedWidth += diffSpace;\r\n spaceCount++;\r\n }\r\n \r\n // For RTL, shift all characters to the right by the total expansion\r\n // minus the expansion that comes after this character\r\n const remainingSpaces = numberOfSpaces - spaceCount;\r\n const shiftAmount = remainingSpaces * diffSpace;\r\n charBound.left += shiftAmount;\r\n }\r\n }\r\n } else {\r\n // LTR processing (original logic)\r\n for (let j = 0; j <= line.length; j++) {\r\n charBound = this.__charBounds[i][j];\r\n if (charBound) {\r\n if (this._reSpaceAndTab.test(line[j])) {\r\n charBound.width += diffSpace;\r\n charBound.kernedWidth += diffSpace;\r\n charBound.left += accumulatedSpace;\r\n accumulatedSpace += diffSpace;\r\n } else {\r\n charBound.left += accumulatedSpace;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Advanced layout using new text engine (Konva-compatible)\r\n * @private\r\n */\r\n _layoutTextAdvanced(): LayoutResult {\r\n const options = this._getAdvancedLayoutOptions();\r\n return layoutText(options);\r\n }\r\n\r\n /**\r\n * Get advanced layout options from current text properties\r\n * @private\r\n */\r\n _getAdvancedLayoutOptions(): TextLayoutOptions {\r\n return {\r\n text: this.text,\r\n width: this.width,\r\n height: this.height,\r\n wrap: this.wrap || 'word',\r\n align: this._mapTextAlignToAlign(this.textAlign),\r\n ellipsis: this.ellipsis || false,\r\n fontSize: this.fontSize,\r\n lineHeight: this.lineHeight,\r\n letterSpacing: this.letterSpacing || 0,\r\n charSpacing: this.charSpacing,\r\n direction: this.direction === 'inherit' ? 'ltr' : this.direction,\r\n fontFamily: this.fontFamily,\r\n fontStyle: this.fontStyle,\r\n fontWeight: this.fontWeight,\r\n verticalAlign: this.verticalAlign || 'top',\r\n };\r\n }\r\n\r\n /**\r\n * Map Fabric textAlign to Konva align format\r\n * @private\r\n */\r\n _mapTextAlignToAlign(textAlign: string): 'left' | 'center' | 'right' | 'justify' {\r\n switch (textAlign) {\r\n case 'center':\r\n case CENTER:\r\n return 'center';\r\n case 'right':\r\n case RIGHT:\r\n return 'right';\r\n case 'justify':\r\n case JUSTIFY:\r\n case JUSTIFY_LEFT:\r\n case JUSTIFY_RIGHT:\r\n case JUSTIFY_CENTER:\r\n return 'justify';\r\n default:\r\n return 'left';\r\n }\r\n }\r\n\r\n /**\r\n * Enhanced initDimensions that uses advanced layout when enabled\r\n */\r\n initDimensionsAdvanced(): void {\r\n if (!this.enableAdvancedLayout) {\r\n return this.initDimensions();\r\n }\r\n\r\n const layout = this._layoutTextAdvanced();\r\n \r\n // Update dimensions from layout\r\n this.width = layout.totalWidth || this.MIN_TEXT_WIDTH;\r\n this.height = layout.totalHeight;\r\n \r\n // Convert layout to legacy format for compatibility\r\n this._convertLayoutToLegacyFormat(layout);\r\n \r\n // Ensure justify alignment is properly applied for compatibility with legacy rendering\r\n if (this.textAlign.includes(JUSTIFY)) {\r\n // Force enlarge spaces after advanced layout calculation\r\n setTimeout(() => {\r\n if (this.enlargeSpaces) {\r\n this.enlargeSpaces();\r\n this.canvas?.renderAll();\r\n }\r\n }, 0);\r\n }\r\n \r\n this.dirty = true;\r\n }\r\n\r\n /**\r\n * Convert new layout format to legacy _textLines and __charBounds format\r\n * @private\r\n */\r\n _convertLayoutToLegacyFormat(layout: LayoutResult): void {\r\n this._textLines = layout.lines.map(line => line.graphemes);\r\n (this as any).textLines = layout.lines.map(line => line.text);\r\n \r\n // Convert bounds to legacy format\r\n this.__charBounds = layout.lines.map(line => \r\n line.bounds.map(bound => ({\r\n left: bound.left,\r\n top: bound.y,\r\n width: bound.width,\r\n height: bound.height,\r\n kernedWidth: bound.kernedWidth,\r\n deltaY: bound.deltaY || 0,\r\n }))\r\n );\r\n \r\n // Update grapheme info for compatibility\r\n if (layout.lines.length > 0) {\r\n (this as any)._unwrappedTextLines = layout.lines.map(line => line.graphemes);\r\n }\r\n }\r\n\r\n /**\r\n * Detect if the text line is ended with an hard break\r\n * text and itext do not have wrapping, return false\r\n * @return {Boolean}\r\n */\r\n isEndOfWrapping(lineIndex: number): boolean {\r\n return lineIndex === this._textLines.length - 1;\r\n }\r\n\r\n /**\r\n * Detect if a line has a linebreak and so we need to account for it when moving\r\n * and counting style.\r\n * It return always 1 for text and Itext. Textbox has its own implementation\r\n * @return Number\r\n */\r\n missingNewlineOffset(lineIndex: number, skipWrapping?: boolean): 0 | 1;\r\n missingNewlineOffset(_lineIndex: number): 1 {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Returns 2d representation (lineIndex and charIndex) of cursor\r\n * @param {Number} selectionStart\r\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\r\n */\r\n get2DCursorLocation(selectionStart: number, skipWrapping?: boolean) {\r\n const lines = skipWrapping ? this._unwrappedTextLines : this._textLines;\r\n let i: number;\r\n for (i = 0; i < lines.length; i++) {\r\n if (selectionStart <= lines[i].length) {\r\n return {\r\n lineIndex: i,\r\n charIndex: selectionStart,\r\n };\r\n }\r\n selectionStart -=\r\n lines[i].length + this.missingNewlineOffset(i, skipWrapping);\r\n }\r\n return {\r\n lineIndex: i - 1,\r\n charIndex:\r\n lines[i - 1].length < selectionStart\r\n ? lines[i - 1].length\r\n : selectionStart,\r\n };\r\n }\r\n\r\n /**\r\n * Returns string representation of an instance\r\n * @return {String} String representation of text object\r\n */\r\n toString(): string {\r\n return `#<Text (${this.complexity()}): { \"text\": \"${\r\n this.text\r\n }\", \"fontFamily\": \"${this.fontFamily}\" }>`;\r\n }\r\n\r\n /**\r\n * Return the dimension and the zoom level needed to create a cache canvas\r\n * big enough to host the object to be cached.\r\n * @private\r\n * @param {Object} dim.x width of object to be cached\r\n * @param {Object} dim.y height of object to be cached\r\n * @return {Object}.width width of canvas\r\n * @return {Object}.height height of canvas\r\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\r\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\r\n */\r\n _getCacheCanvasDimensions(): TCacheCanvasDimensions {\r\n const dims = super._getCacheCanvasDimensions();\r\n const fontSize = this.fontSize;\r\n dims.width += fontSize * dims.zoomX;\r\n dims.height += fontSize * dims.zoomY;\r\n return dims;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _render(ctx: CanvasRenderingContext2D) {\r\n const path = this.path;\r\n path && !path.isNotVisible() && path._render(ctx);\r\n this._setTextStyles(ctx);\r\n this._renderTextLinesBackground(ctx);\r\n this._renderTextDecoration(ctx, 'underline');\r\n this._renderText(ctx);\r\n this._renderTextDecoration(ctx, 'overline');\r\n this._renderTextDecoration(ctx, 'linethrough');\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderText(ctx: CanvasRenderingContext2D) {\r\n // Skip text rendering if in overlay editing mode\r\n if ((this as any).__overlayEditor) {\r\n return;\r\n }\r\n if (this.paintFirst === STROKE) {\r\n this._renderTextStroke(ctx);\r\n this._renderTextFill(ctx);\r\n } else {\r\n this._renderTextFill(ctx);\r\n this._renderTextStroke(ctx);\r\n }\r\n }\r\n\r\n /**\r\n * Set the font parameter of the context with the object properties or with charStyle\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {Object} [charStyle] object with font style properties\r\n * @param {String} [charStyle.fontFamily] Font Family\r\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\r\n * @param {String} [charStyle.fontWeight] Font weight\r\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\r\n */\r\n _setTextStyles(\r\n ctx: CanvasRenderingContext2D,\r\n charStyle?: any,\r\n forMeasuring?: boolean,\r\n ) {\r\n ctx.textBaseline = 'alphabetic';\r\n if (this.path) {\r\n switch (this.pathAlign) {\r\n case CENTER:\r\n ctx.textBaseline = 'middle';\r\n break;\r\n case 'ascender':\r\n ctx.textBaseline = TOP;\r\n break;\r\n case 'descender':\r\n ctx.textBaseline = BOTTOM;\r\n break;\r\n }\r\n }\r\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\r\n }\r\n\r\n /**\r\n * calculate and return the text Width measuring each line.\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @return {Number} Maximum width of Text object\r\n */\r\n calcTextWidth(): number {\r\n let maxWidth = this.getLineWidth(0);\r\n\r\n for (let i = 1, len = this._textLines.length; i < len; i++) {\r\n const currentLineWidth = this.getLineWidth(i);\r\n if (currentLineWidth > maxWidth) {\r\n maxWidth = currentLineWidth;\r\n }\r\n }\r\n return maxWidth;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {String} line Text to render\r\n * @param {Number} left Left position of text\r\n * @param {Number} top Top position of text\r\n * @param {Number} lineIndex Index of a line in a text\r\n */\r\n _renderTextLine(\r\n method: 'fillText' | 'strokeText',\r\n ctx: CanvasRenderingContext2D,\r\n line: string[],\r\n left: number,\r\n top: number,\r\n lineIndex: number,\r\n ) {\r\n this._renderChars(method, ctx, line, left, top, lineIndex);\r\n }\r\n\r\n /**\r\n * Renders the text background for lines, taking care of style\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderTextLinesBackground(ctx: CanvasRenderingContext2D) {\r\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\r\n return;\r\n }\r\n const originalFill = ctx.fillStyle,\r\n leftOffset = this._getLeftOffset();\r\n let lineTopOffset = this._getTopOffset();\r\n\r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n const heightOfLine = this.getHeightOfLine(i);\r\n if (\r\n !this.textBackgroundColor &&\r\n !this.styleHas('textBackgroundColor', i)\r\n ) {\r\n lineTopOffset += heightOfLine;\r\n continue;\r\n }\r\n const jlen = this._textLines[i].length;\r\n const lineLeftOffset = this._getLineLeftOffset(i);\r\n let boxWidth = 0;\r\n let boxStart = 0;\r\n let drawStart;\r\n let currentColor;\r\n let lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\r\n for (let j = 0; j < jlen; j++) {\r\n // at this point charbox are either standard or full with pathInfo if there is a path.\r\n const charBox = this.__charBounds[i][j] as Required<GraphemeBBox>;\r\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\r\n if (this.path) {\r\n ctx.save();\r\n ctx.translate(charBox.renderLeft, charBox.renderTop);\r\n ctx.rotate(charBox.angle);\r\n ctx.fillStyle = currentColor;\r\n currentColor &&\r\n ctx.fillRect(\r\n -charBox.width / 2,\r\n (-heightOfLine / this.lineHeight) * (1 - this._fontSizeFraction),\r\n charBox.width,\r\n heightOfLine / this.lineHeight,\r\n );\r\n ctx.restore();\r\n } else if (currentColor !== lastColor) {\r\n drawStart = leftOffset + lineLeftOffset + boxStart;\r\n if (this.direction === 'rtl') {\r\n drawStart = this.width - drawStart - boxWidth;\r\n }\r\n ctx.fillStyle = lastColor;\r\n lastColor &&\r\n ctx.fillRect(\r\n drawStart,\r\n lineTopOffset,\r\n boxWidth,\r\n heightOfLine / this.lineHeight,\r\n );\r\n boxStart = charBox.left;\r\n boxWidth = charBox.width;\r\n lastColor = currentColor;\r\n } else {\r\n boxWidth += charBox.kernedWidth;\r\n }\r\n }\r\n if (currentColor && !this.path) {\r\n drawStart = leftOffset + lineLeftOffset + boxStart;\r\n if (this.direction === 'rtl') {\r\n drawStart = this.width - drawStart - boxWidth;\r\n }\r\n ctx.fillStyle = currentColor;\r\n ctx.fillRect(\r\n drawStart,\r\n lineTopOffset,\r\n boxWidth,\r\n heightOfLine / this.lineHeight,\r\n );\r\n }\r\n lineTopOffset += heightOfLine;\r\n }\r\n ctx.fillStyle = originalFill;\r\n // if there is text background color no\r\n // other shadows should be casted\r\n this._removeShadow(ctx);\r\n }\r\n\r\n /**\r\n * measure and return the width of a single character.\r\n * possibly overridden to accommodate different measure logic or\r\n * to hook some external lib for character measurement\r\n * @private\r\n * @param {String} _char, char to be measured\r\n * @param {Object} charStyle style of char to be measured\r\n * @param {String} [previousChar] previous char\r\n * @param {Object} [prevCharStyle] style of previous char\r\n */\r\n _measureChar(\r\n _char: string,\r\n charStyle: CompleteTextStyleDeclaration,\r\n previousChar: string | undefined,\r\n prevCharStyle: CompleteTextStyleDeclaration | Record<string, never>,\r\n ) {\r\n const fontCache = cache.getFontCache(charStyle),\r\n fontDeclaration = this._getFontDeclaration(charStyle),\r\n couple = previousChar + _char,\r\n stylesAreEqual =\r\n previousChar &&\r\n fontDeclaration === this._getFontDeclaration(prevCharStyle),\r\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE;\r\n let width: number | undefined,\r\n coupleWidth: number | undefined,\r\n previousWidth: number | undefined,\r\n kernedWidth: number | undefined;\r\n\r\n if (previousChar && fontCache[previousChar] !== undefined) {\r\n previousWidth = fontCache[previousChar];\r\n }\r\n if (fontCache[_char] !== undefined) {\r\n kernedWidth = width = fontCache[_char];\r\n }\r\n if (stylesAreEqual && fontCache[couple] !== undefined) {\r\n coupleWidth = fontCache[couple];\r\n kernedWidth = coupleWidth - previousWidth!;\r\n }\r\n if (\r\n width === undefined ||\r\n previousWidth === undefined ||\r\n coupleWidth === undefined\r\n ) {\r\n const ctx = getMeasuringContext()!;\r\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\r\n this._setTextStyles(ctx, charStyle, true);\r\n if (width === undefined) {\r\n kernedWidth = width = ctx.measureText(_char).width;\r\n fontCache[_char] = width;\r\n }\r\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\r\n previousWidth = ctx.measureText(previousChar).width;\r\n fontCache[previousChar] = previousWidth;\r\n }\r\n if (stylesAreEqual && coupleWidth === undefined) {\r\n // we can measure the kerning couple and subtract the width of the previous character\r\n coupleWidth = ctx.measureText(couple).width;\r\n fontCache[couple] = coupleWidth;\r\n // safe to use the non-null since if undefined we defined it before.\r\n kernedWidth = coupleWidth - previousWidth!;\r\n }\r\n }\r\n return {\r\n width: width * fontMultiplier,\r\n kernedWidth: kernedWidth! * fontMultiplier,\r\n };\r\n }\r\n\r\n /**\r\n * Computes height of character at given position\r\n * @param {Number} line the line index number\r\n * @param {Number} _char the character index number\r\n * @return {Number} fontSize of the character\r\n */\r\n getHeightOfChar(line: number, _char: number): number {\r\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\r\n }\r\n\r\n /**\r\n * measure a text line measuring all characters.\r\n * @param {Number} lineIndex line number\r\n */\r\n measureLine(lineIndex: number) {\r\n const lineInfo = this._measureLine(lineIndex);\r\n if (this.charSpacing !== 0) {\r\n lineInfo.width -= this._getWidthOfCharSpacing();\r\n }\r\n if (lineInfo.width < 0) {\r\n lineInfo.width = 0;\r\n }\r\n return lineInfo;\r\n }\r\n\r\n /**\r\n * measure every grapheme of a line, populating __charBounds\r\n * @param {Number} lineIndex\r\n * @return {Object} object.width total width of characters\r\n * @return {Object} object.numOfSpaces length of chars that match this._reSpacesAndTabs\r\n */\r\n _measureLine(lineIndex: number) {\r\n let width = 0,\r\n prevGrapheme: string | undefined,\r\n graphemeInfo: GraphemeBBox | undefined;\r\n\r\n const reverse = this.pathSide === RIGHT,\r\n path = this.path,\r\n line = this._textLines[lineIndex],\r\n llength = line.length,\r\n lineBounds = new Array<GraphemeBBox>(llength);\r\n\r\n this.__charBounds[lineIndex] = lineBounds;\r\n for (let i = 0; i < llength; i++) {\r\n const grapheme = line[i];\r\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\r\n lineBounds[i] = graphemeInfo;\r\n width += graphemeInfo.kernedWidth;\r\n prevGrapheme = grapheme;\r\n }\r\n // this latest bound box represent the last character of the line\r\n // to simplify cursor handling in interactive mode.\r\n lineBounds[llength] = {\r\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\r\n width: 0,\r\n kernedWidth: 0,\r\n height: this.fontSize,\r\n deltaY: 0,\r\n } as GraphemeBBox;\r\n if (path && path.segmentsInfo) {\r\n let positionInPath = 0;\r\n const totalPathLength =\r\n path.segmentsInfo[path.segmentsInfo.length - 1].length;\r\n switch (this.textAlign) {\r\n case LEFT:\r\n positionInPath = reverse ? totalPathLength - width : 0;\r\n break;\r\n case CENTER:\r\n positionInPath = (totalPathLength - width) / 2;\r\n break;\r\n case RIGHT:\r\n positionInPath = reverse ? 0 : totalPathLength - width;\r\n break;\r\n //todo - add support for justify\r\n }\r\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\r\n for (\r\n let i = reverse ? llength - 1 : 0;\r\n reverse ? i >= 0 : i < llength;\r\n reverse ? i-- : i++\r\n ) {\r\n graphemeInfo = lineBounds[i];\r\n if (positionInPath > totalPathLength) {\r\n positionInPath %= totalPathLength;\r\n } else if (positionInPath < 0) {\r\n positionInPath += totalPathLength;\r\n }\r\n // it would probably much faster to send all the grapheme position for a line\r\n // and calculate path position/angle at once.\r\n this._setGraphemeOnPath(positionInPath, graphemeInfo);\r\n positionInPath += graphemeInfo.kernedWidth;\r\n }\r\n }\r\n return { width: width, numOfSpaces: 0 };\r\n }\r\n\r\n /**\r\n * Calculate the angle and the left,top position of the char that follow a path.\r\n * It appends it to graphemeInfo to be reused later at rendering\r\n * @private\r\n * @param {Number} positionInPath to be measured\r\n * @param {GraphemeBBox} graphemeInfo current grapheme box information\r\n * @param {Object} startingPoint position of the point\r\n */\r\n _setGraphemeOnPath(positionInPath: number, graphemeInfo: GraphemeBBox) {\r\n const centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\r\n path = this.path!;\r\n\r\n // we are at currentPositionOnPath. we want to know what point on the path is.\r\n const info = getPointOnPath(path.path, centerPosition, path.segmentsInfo)!;\r\n graphemeInfo.renderLeft = info.x - path.pathOffset.x;\r\n graphemeInfo.renderTop = info.y - path.pathOffset.y;\r\n graphemeInfo.angle = info.angle + (this.pathSide === RIGHT ? Math.PI : 0);\r\n }\r\n\r\n /**\r\n *\r\n * @param {String} grapheme to be measured\r\n * @param {Number} lineIndex index of the line where the char is\r\n * @param {Number} charIndex position in the line\r\n * @param {String} [prevGrapheme] character preceding the one to be measured\r\n * @returns {GraphemeBBox} grapheme bbox\r\n */\r\n _getGraphemeBox(\r\n grapheme: string,\r\n lineIndex: number,\r\n charIndex: number,\r\n prevGrapheme?: string,\r\n skipLeft?: boolean,\r\n ): GraphemeBBox {\r\n const style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\r\n prevStyle = prevGrapheme\r\n ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1)\r\n : {},\r\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle);\r\n let kernedWidth = info.kernedWidth,\r\n width = info.width,\r\n charSpacing;\r\n\r\n if (this.charSpacing !== 0) {\r\n charSpacing = this._getWidthOfCharSpacing();\r\n width += charSpacing;\r\n kernedWidth += charSpacing;\r\n }\r\n\r\n const box: GraphemeBBox = {\r\n width,\r\n left: 0,\r\n height: style.fontSize,\r\n kernedWidth,\r\n deltaY: style.deltaY,\r\n };\r\n if (charIndex > 0 && !skipLeft) {\r\n const previousBox = this.__charBounds[lineIndex][charIndex - 1];\r\n box.left =\r\n previousBox.left + previousBox.width + info.kernedWidth - info.width;\r\n }\r\n return box;\r\n }\r\n\r\n /**\r\n * Calculate height of line at 'lineIndex'\r\n * @param {Number} lineIndex index of line to calculate\r\n * @return {Number}\r\n */\r\n getHeightOfLine(lineIndex: number): number {\r\n if (this.__lineHeights[lineIndex]) {\r\n return this.__lineHeights[lineIndex];\r\n }\r\n\r\n // char 0 is measured before the line cycle because it needs to char\r\n // emptylines\r\n let maxHeight = this.getHeightOfChar(lineIndex, 0);\r\n for (let i = 1, len = this._textLines[lineIndex].length; i < len; i++) {\r\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\r\n }\r\n\r\n return (this.__lineHeights[lineIndex] =\r\n maxHeight * this.lineHeight * this._fontSizeMult);\r\n }\r\n\r\n /**\r\n * Calculate text box height\r\n */\r\n calcTextHeight() {\r\n let lineHeight,\r\n height = 0;\r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n lineHeight = this.getHeightOfLine(i);\r\n height += i === len - 1 ? lineHeight / this.lineHeight : lineHeight;\r\n }\r\n return height;\r\n }\r\n\r\n /**\r\n * @private\r\n * @return {Number} Left offset\r\n */\r\n _getLeftOffset(): number {\r\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\r\n }\r\n\r\n /**\r\n * @private\r\n * @return {Number} Top offset\r\n */\r\n _getTopOffset(): number {\r\n return -this.height / 2;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\r\n */\r\n _renderTextCommon(\r\n ctx: CanvasRenderingContext2D,\r\n method: 'fillText' | 'strokeText',\r\n ) {\r\n ctx.save();\r\n let lineHeights = 0;\r\n const left = this._getLeftOffset(),\r\n top = this._getTopOffset();\r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n const heightOfLine = this.getHeightOfLine(i),\r\n maxHeight = heightOfLine / this.lineHeight,\r\n leftOffset = this._getLineLeftOffset(i);\r\n this._renderTextLine(\r\n method,\r\n ctx,\r\n this._textLines[i],\r\n left + leftOffset,\r\n top + lineHeights + maxHeight,\r\n i,\r\n );\r\n lineHeights += heightOfLine;\r\n }\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderTextFill(ctx: CanvasRenderingContext2D) {\r\n if (!this.fill && !this.styleHas(FILL)) {\r\n return;\r\n }\r\n\r\n this._renderTextCommon(ctx, 'fillText');\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderTextStroke(ctx: CanvasRenderingContext2D) {\r\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\r\n return;\r\n }\r\n\r\n if (this.shadow && !this.shadow.affectStroke) {\r\n this._removeShadow(ctx);\r\n }\r\n\r\n ctx.save();\r\n this._setLineDash(ctx, this.strokeDashArray);\r\n ctx.beginPath();\r\n this._renderTextCommon(ctx, 'strokeText');\r\n ctx.closePath();\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {String} method fillText or strokeText.\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {Array} line Content of the line, splitted in an array by grapheme\r\n * @param {Number} left\r\n * @param {Number} top\r\n * @param {Number} lineIndex\r\n */\r\n _renderChars(\r\n method: 'fillText' | 'strokeText',\r\n ctx: CanvasRenderingContext2D,\r\n line: Array<any>,\r\n left: number,\r\n top: number,\r\n lineIndex: number,\r\n ) {\r\n const lineHeight = this.getHeightOfLine(lineIndex),\r\n isJustify = this.textAlign.includes(JUSTIFY),\r\n path = this.path,\r\n shortCut =\r\n !isJustify &&\r\n this.charSpacing === 0 &&\r\n this.isEmptyStyles(lineIndex) &&\r\n !path,\r\n isLtr = this.direction === 'ltr',\r\n sign = this.direction === 'ltr' ? 1 : -1,\r\n // this was changed in the PR #7674\r\n // currentDirection = ctx.canvas.getAttribute('dir');\r\n currentDirection = ctx.direction;\r\n\r\n let actualStyle,\r\n nextStyle,\r\n charsToRender = '',\r\n charBox,\r\n boxWidth = 0,\r\n timeToRender,\r\n drawingLeft;\r\n\r\n ctx.save();\r\n if (currentDirection !== this.direction) {\r\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\r\n ctx.direction = isLtr ? 'ltr' : 'rtl';\r\n \r\n // For justify alignments, we need to set the correct canvas text alignment\r\n // This is crucial for RTL text to render in the correct order\r\n if (isJustify) {\r\n // Justify uses LEFT alignment as a base, letting the character positioning handle justification\r\n ctx.textAlign = LEFT;\r\n } else {\r\n ctx.textAlign = isLtr ? LEFT : RIGHT;\r\n }\r\n }\r\n top -= (lineHeight * this._fontSizeFraction) / this.lineHeight;\r\n if (shortCut) {\r\n // render all the line in one pass without checking\r\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\r\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top);\r\n ctx.restore();\r\n return;\r\n }\r\n for (let i = 0, len = line.length - 1; i <= len; i++) {\r\n timeToRender = i === len || this.charSpacing || path;\r\n charsToRender += line[i];\r\n charBox = this.__charBounds[lineIndex][i] as Required<GraphemeBBox>;\r\n if (boxWidth === 0) {\r\n left += sign * (charBox.kernedWidth - charBox.width);\r\n boxWidth += charBox.width;\r\n } else {\r\n boxWidth += charBox.kernedWidth;\r\n }\r\n if (isJustify && !timeToRender) {\r\n if (this._reSpaceAndTab.test(line[i])) {\r\n timeToRender = true;\r\n }\r\n }\r\n if (!timeToRender) {\r\n // if we have charSpacing, we render char by char\r\n actualStyle =\r\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\r\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\r\n timeToRender = hasStyleChanged(actualStyle, nextStyle, false);\r\n }\r\n if (timeToRender) {\r\n if (path) {\r\n ctx.save();\r\n ctx.translate(charBox.renderLeft, charBox.renderTop);\r\n ctx.rotate(charBox.angle);\r\n this._renderChar(\r\n method,\r\n ctx,\r\n lineIndex,\r\n i,\r\n charsToRender,\r\n -boxWidth / 2,\r\n 0,\r\n );\r\n ctx.restore();\r\n } else {\r\n drawingLeft = left;\r\n this._renderChar(\r\n method,\r\n ctx,\r\n lineIndex,\r\n i,\r\n charsToRender,\r\n drawingLeft,\r\n top,\r\n );\r\n }\r\n charsToRender = '';\r\n actualStyle = nextStyle;\r\n left += sign * boxWidth;\r\n boxWidth = 0;\r\n }\r\n }\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * This function try to patch the missing gradientTransform on canvas gradients.\r\n * transforming a context to transform the gradient, is going to transform the stroke too.\r\n * we want to transform the gradient but not the stroke operation, so we create\r\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\r\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\r\n * is limited.\r\n * @private\r\n * @param {TFiller} filler a fabric gradient instance\r\n * @return {CanvasPattern} a pattern to use as fill/stroke style\r\n */\r\n _applyPatternGradientTransformText(filler: TFiller) {\r\n // TODO: verify compatibility with strokeUniform\r\n const width = this.width + this.strokeWidth,\r\n height = this.height + this.strokeWidth,\r\n pCanvas = createCanvasElementFor({\r\n width,\r\n height,\r\n }),\r\n pCtx = pCanvas.getContext('2d')!;\r\n pCanvas.width = width;\r\n pCanvas.height = height;\r\n pCtx.beginPath();\r\n pCtx.moveTo(0, 0);\r\n pCtx.lineTo(width, 0);\r\n pCtx.lineTo(width, height);\r\n pCtx.lineTo(0, height);\r\n pCtx.closePath();\r\n pCtx.translate(width / 2, height / 2);\r\n pCtx.fillStyle = filler.toLive(pCtx)!;\r\n this._applyPatternGradientTransform(pCtx, filler);\r\n pCtx.fill();\r\n return pCtx.createPattern(pCanvas, 'no-repeat')!;\r\n }\r\n\r\n handleFiller<T extends 'fill' | 'stroke'>(\r\n ctx: CanvasRenderingContext2D,\r\n property: `${T}Style`,\r\n filler: TFiller | string,\r\n ): { offsetX: number; offsetY: number } {\r\n let offsetX: number, offsetY: number;\r\n if (isFiller(filler)) {\r\n if (\r\n (filler as Gradient<'linear'>).gradientUnits === 'percentage' ||\r\n (filler as Gradient<'linear'>).gradientTransform ||\r\n (filler as Pattern).patternTransform\r\n ) {\r\n // need to transform gradient in a pattern.\r\n // this is a slow process. If you are hitting this codepath, and the object\r\n // is not using caching, you should consider switching it on.\r\n // we need a canvas as big as the current object caching canvas.\r\n offsetX = -this.width / 2;\r\n offsetY = -this.height / 2;\r\n ctx.translate(offsetX, offsetY);\r\n ctx[property] = this._applyPatternGradientTransformText(filler);\r\n return { offsetX, offsetY };\r\n } else {\r\n // is a simple gradient or pattern\r\n ctx[property] = filler.toLive(ctx)!;\r\n return this._applyPatternGradientTransform(ctx, filler);\r\n }\r\n } else {\r\n // is a color\r\n ctx[property] = filler;\r\n }\r\n return { offsetX: 0, offsetY: 0 };\r\n }\r\n\r\n /**\r\n * This function prepare the canvas for a stroke style, and stroke and strokeWidth\r\n * need to be sent in as defined\r\n * @param {CanvasRenderingContext2D} ctx\r\n * @param {CompleteTextStyleDeclaration} style with stroke and strokeWidth defined\r\n * @returns\r\n */\r\n _setStrokeStyles(\r\n ctx: CanvasRenderingContext2D,\r\n {\r\n stroke,\r\n strokeWidth,\r\n }: Pick<CompleteTextStyleDeclaration, 'stroke' | 'strokeWidth'>,\r\n ) {\r\n ctx.lineWidth = strokeWidth;\r\n ctx.lineCap = this.strokeLineCap;\r\n ctx.lineDashOffset = this.strokeDashOffset;\r\n ctx.lineJoin = this.strokeLineJoin;\r\n ctx.miterLimit = this.strokeMiterLimit;\r\n return this.handleFiller(ctx, 'strokeStyle', stroke!);\r\n }\r\n\r\n /**\r\n * This function prepare the canvas for a ill style, and fill\r\n * need to be sent in as defined\r\n * @param {CanvasRenderingContext2D} ctx\r\n * @param {CompleteTextStyleDeclaration} style with ill defined\r\n * @returns\r\n */\r\n _setFillStyles(ctx: CanvasRenderingContext2D, { fill }: Pick<this, 'fill'>) {\r\n return this.handleFiller(ctx, 'fillStyle', fill!);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {String} method\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n * @param {Number} lineIndex\r\n * @param {Number} charIndex\r\n * @param {String} _char\r\n * @param {Number} left Left coordinate\r\n * @param {Number} top Top coordinate\r\n * @param {Number} lineHeight Height of the line\r\n */\r\n _renderChar(\r\n method: 'fillText' | 'strokeText',\r\n ctx: CanvasRenderingContext2D,\r\n lineIndex: number,\r\n charIndex: number,\r\n _char: string,\r\n left: number,\r\n top: number,\r\n ) {\r\n const decl = this._getStyleDeclaration(lineIndex, charIndex),\r\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\r\n shouldFill = method === 'fillText' && fullDecl.fill,\r\n shouldStroke =\r\n method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\r\n\r\n if (!shouldStroke && !shouldFill) {\r\n return;\r\n }\r\n ctx.save();\r\n\r\n ctx.font = this._getFontDeclaration(fullDecl);\r\n\r\n if (decl.textBackgroundColor) {\r\n this._removeShadow(ctx);\r\n }\r\n if (decl.deltaY) {\r\n top += decl.deltaY;\r\n }\r\n\r\n if (shouldFill) {\r\n const fillOffsets = this._setFillStyles(ctx, fullDecl);\r\n ctx.fillText(\r\n _char,\r\n left - fillOffsets.offsetX,\r\n top - fillOffsets.offsetY,\r\n );\r\n }\r\n\r\n if (shouldStroke) {\r\n const strokeOffsets = this._setStrokeStyles(ctx, fullDecl);\r\n ctx.strokeText(\r\n _char,\r\n left - strokeOffsets.offsetX,\r\n top - strokeOffsets.offsetY,\r\n );\r\n }\r\n\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * Turns the character into a 'superior figure' (i.e. 'superscript')\r\n * @param {Number} start selection start\r\n * @param {Number} end selection end\r\n */\r\n setSuperscript(start: number, end: number) {\r\n this._setScript(start, end, this.superscript);\r\n }\r\n\r\n /**\r\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\r\n * @param {Number} start selection start\r\n * @param {Number} end selection end\r\n */\r\n setSubscript(start: number, end: number) {\r\n this._setScript(start, end, this.subscript);\r\n }\r\n\r\n /**\r\n * Applies 'schema' at given position\r\n * @private\r\n * @param {Number} start selection start\r\n * @param {Number} end selection end\r\n * @param {Number} schema\r\n */\r\n protected _setScript(\r\n start: number,\r\n end: number,\r\n schema: {\r\n size: number;\r\n baseline: number;\r\n },\r\n ) {\r\n const loc = this.get2DCursorLocation(start, true),\r\n fontSize = this.getValueOfPropertyAt(\r\n loc.lineIndex,\r\n loc.charIndex,\r\n 'fontSize',\r\n ),\r\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\r\n style = {\r\n fontSize: fontSize * schema.size,\r\n deltaY: dy + fontSize * schema.baseline,\r\n };\r\n this.setSelectionStyles(style, start, end);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Number} lineIndex index text line\r\n * @return {Number} Line left offset\r\n */\r\n _getLineLeftOffset(lineIndex: number): number {\r\n const lineWidth = this.getLineWidth(lineIndex),\r\n lineDiff = this.width - lineWidth,\r\n textAlign = this.textAlign,\r\n direction = this.direction,\r\n isEndOfWrapping = this.isEndOfWrapping(lineIndex);\r\n let leftOffset = 0;\r\n \r\n // Handle justify alignments (excluding last lines and wrapped line ends)\r\n const isJustifyLine = \r\n textAlign === JUSTIFY ||\r\n (textAlign === JUSTIFY_CENTER && !isEndOfWrapping) ||\r\n (textAlign === JUSTIFY_RIGHT && !isEndOfWrapping) ||\r\n (textAlign === JUSTIFY_LEFT && !isEndOfWrapping);\r\n \r\n if (isJustifyLine) {\r\n // Justify lines should start at the left edge for LTR and right edge for RTL\r\n // The space distribution is handled by enlargeSpaces()\r\n if (direction === 'rtl') {\r\n // For RTL justify, we need to account for the line being right-aligned\r\n return 0;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n \r\n // Handle non-justify alignments\r\n if (textAlign === CENTER) {\r\n leftOffset = lineDiff / 2;\r\n }\r\n if (textAlign === RIGHT) {\r\n leftOffset = lineDiff;\r\n }\r\n if (textAlign === JUSTIFY_CENTER) {\r\n leftOffset = lineDiff / 2;\r\n }\r\n if (textAlign === JUSTIFY_RIGHT) {\r\n leftOffset = lineDiff;\r\n }\r\n \r\n // Apply RTL adjustments for non-justify alignments\r\n if (direction === 'rtl') {\r\n if (\r\n textAlign === RIGHT ||\r\n textAlign === JUSTIFY ||\r\n textAlign === JUSTIFY_RIGHT\r\n ) {\r\n leftOffset = 0;\r\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\r\n leftOffset = -lineDiff;\r\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\r\n leftOffset = -lineDiff / 2;\r\n }\r\n }\r\n return leftOffset;\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _clearCache() {\r\n this._forceClearCache = false;\r\n this.__lineWidths = [];\r\n this.__lineHeights = [];\r\n this.__charBounds = [];\r\n }\r\n\r\n /**\r\n * Measure a single line given its index. Used to calculate the initial\r\n * text bounding box. The values are calculated and stored in __lineWidths cache.\r\n * @private\r\n * @param {Number} lineIndex line number\r\n * @return {Number} Line width\r\n */\r\n getLineWidth(lineIndex: number): number {\r\n if (this.__lineWidths[lineIndex] !== undefined) {\r\n return this.__lineWidths[lineIndex];\r\n }\r\n\r\n const { width } = this.measureLine(lineIndex);\r\n this.__lineWidths[lineIndex] = width;\r\n return width;\r\n }\r\n\r\n _getWidthOfCharSpacing() {\r\n if (this.charSpacing !== 0) {\r\n return (this.fontSize * this.charSpacing) / 1000;\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Retrieves the value of property at given character position\r\n * @param {Number} lineIndex the line number\r\n * @param {Number} charIndex the character number\r\n * @param {String} property the property name\r\n * @returns the value of 'property'\r\n */\r\n getValueOfPropertyAt<T extends StylePropertiesType>(\r\n lineIndex: number,\r\n charIndex: number,\r\n property: T,\r\n ): this[T] {\r\n const charStyle = this._getStyleDeclaration(lineIndex, charIndex);\r\n return (charStyle[property] ?? this[property]) as this[T];\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n _renderTextDecoration(\r\n ctx: CanvasRenderingContext2D,\r\n type: 'underline' | 'linethrough' | 'overline',\r\n ) {\r\n if (!this[type] && !this.styleHas(type)) {\r\n return;\r\n }\r\n let topOffset = this._getTopOffset();\r\n const leftOffset = this._getLeftOffset(),\r\n path = this.path,\r\n charSpacing = this._getWidthOfCharSpacing(),\r\n offsetAligner =\r\n type === 'linethrough' ? 0.5 : type === 'overline' ? 1 : 0,\r\n offsetY = this.offsets[type];\r\n for (let i = 0, len = this._textLines.length; i < len; i++) {\r\n const heightOfLine = this.getHeightOfLine(i);\r\n if (!this[type] && !this.styleHas(type, i)) {\r\n topOffset += heightOfLine;\r\n continue;\r\n }\r\n const line = this._textLines[i];\r\n const maxHeight = heightOfLine / this.lineHeight;\r\n const lineLeftOffset = this._getLineLeftOffset(i);\r\n let boxStart = 0;\r\n let boxWidth = 0;\r\n let lastDecoration = this.getValueOfPropertyAt(i, 0, type);\r\n let lastFill = this.getValueOfPropertyAt(i, 0, FILL);\r\n let lastTickness = this.getValueOfPropertyAt(\r\n i,\r\n 0,\r\n TEXT_DECORATION_THICKNESS,\r\n );\r\n let currentDecoration = lastDecoration;\r\n let currentFill = lastFill;\r\n let currentTickness = lastTickness;\r\n const top = topOffset + maxHeight * (1 - this._fontSizeFraction);\r\n let size = this.getHeightOfChar(i, 0);\r\n let dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\r\n for (let j = 0, jlen = line.length; j < jlen; j++) {\r\n const charBox = this.__charBounds[i][j] as Required<GraphemeBBox>;\r\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\r\n currentFill = this.getValueOfPropertyAt(i, j, FILL);\r\n currentTickness = this.getValueOfPropertyAt(\r\n i,\r\n j,\r\n TEXT_DECORATION_THICKNESS,\r\n );\r\n const currentSize = this.getHeightOfChar(i, j);\r\n const currentDy = this.getValueOfPropertyAt(i, j, 'deltaY');\r\n if (path && currentDecoration && currentFill) {\r\n const finalTickness = (this.fontSize * currentTickness) / 1000;\r\n ctx.save();\r\n // bug? verify lastFill is a valid fill here.\r\n ctx.fillStyle = lastFill as string;\r\n ctx.translate(charBox.renderLeft, charBox.renderTop);\r\n ctx.rotate(charBox.angle);\r\n ctx.fillRect(\r\n -charBox.kernedWidth / 2,\r\n offsetY * currentSize + currentDy - offsetAligner * finalTickness,\r\n charBox.kernedWidth,\r\n finalTickness,\r\n );\r\n ctx.restore();\r\n } else if (\r\n (currentDecoration !== lastDecoration ||\r\n currentFill !== lastFill ||\r\n currentSize !== size ||\r\n currentTickness !== lastTickness ||\r\n currentDy !== dy) &&\r\n boxWidth > 0\r\n ) {\r\n const finalTickness = (this.fontSize * lastTickness) / 1000;\r\n let drawStart = leftOffset + lineLeftOffset + boxStart;\r\n if (this.direction === 'rtl') {\r\n drawStart = this.width - drawStart - boxWidth;\r\n }\r\n if (lastDecoration && lastFill && lastTickness) {\r\n // bug? verify lastFill is a valid fill here.\r\n ctx.fillStyle = lastFill as string;\r\n ctx.fillRect(\r\n drawStart,\r\n top + offsetY * size + dy - offsetAligner * finalTickness,\r\n boxWidth,\r\n finalTickness,\r\n );\r\n }\r\n boxStart = charBox.left;\r\n boxWidth = charBox.width;\r\n lastDecoration = currentDecoration;\r\n lastTickness = currentTickness;\r\n lastFill = currentFill;\r\n size = currentSize;\r\n dy = currentDy;\r\n } else {\r\n boxWidth += charBox.kernedWidth;\r\n }\r\n }\r\n let drawStart = leftOffset + lineLeftOffset + boxStart;\r\n if (this.direction === 'rtl') {\r\n drawStart = this.width - drawStart - boxWidth;\r\n }\r\n ctx.fillStyle = currentFill as string;\r\n const finalTickness = (this.fontSize * currentTickness) / 1000;\r\n currentDecoration &&\r\n currentFill &&\r\n currentTickness &&\r\n ctx.fillRect(\r\n drawStart,\r\n top + offsetY * size + dy - offsetAligner * finalTickness,\r\n boxWidth - charSpacing,\r\n finalTickness,\r\n );\r\n topOffset += heightOfLine;\r\n }\r\n // if there is text background color no\r\n // other shadows should be casted\r\n this._removeShadow(ctx);\r\n }\r\n\r\n /**\r\n * return font declaration string for canvas context\r\n * @param {Object} [styleObject] object\r\n * @returns {String} font declaration formatted for canvas context.\r\n */\r\n _getFontDeclaration(\r\n {\r\n fontFamily = this.fontFamily,\r\n fontStyle = this.fontStyle,\r\n fontWeight = this.fontWeight,\r\n fontSize = this.fontSize,\r\n }: Partial<\r\n Pick<\r\n TextStyleDeclaration,\r\n 'fontFamily' | 'fontStyle' | 'fontWeight' | 'fontSize'\r\n >\r\n > = {},\r\n forMeasuring?: boolean,\r\n ): string {\r\n let parsedFontFamily =\r\n fontFamily.includes(\"'\") ||\r\n fontFamily.includes('\"') ||\r\n fontFamily.includes(',') ||\r\n FabricText.genericFonts.includes(fontFamily.toLowerCase())\r\n ? fontFamily\r\n : `\"${fontFamily}\"`;\r\n \r\n // For fonts like STV that don't support English/Latin characters,\r\n // add fallback fonts for consistent rendering of unsupported characters\r\n // Only add fallbacks during actual rendering, not for measurements\r\n if (!forMeasuring && // Only during rendering, not measuring\r\n !fontFamily.includes(',') && // Don't add fallbacks if already has them\r\n (fontFamily.toLowerCase().includes('stv') || \r\n fontFamily.toLowerCase().includes('arabic') ||\r\n fontFamily.toLowerCase().includes('naskh') ||\r\n fontFamily.toLowerCase().includes('kufi'))) {\r\n // Add fallback fonts for unsupported characters (spaces, punctuation, etc.)\r\n parsedFontFamily = `${parsedFontFamily}, \"Arial Unicode MS\", Arial, sans-serif`;\r\n }\r\n \r\n return [\r\n fontStyle,\r\n fontWeight,\r\n `${forMeasuring ? this.CACHE_FONT_SIZE : fontSize}px`,\r\n parsedFontFamily,\r\n ].join(' ');\r\n }\r\n\r\n /**\r\n * Renders text instance on a specified context\r\n * @param {CanvasRenderingContext2D} ctx Context to render on\r\n */\r\n render(ctx: CanvasRenderingContext2D) {\r\n if (!this.visible) {\r\n return;\r\n }\r\n if (\r\n this.canvas &&\r\n this.canvas.skipOffscreen &&\r\n !this.group &&\r\n !this.isOnScreen()\r\n ) {\r\n return;\r\n }\r\n if (this._forceClearCache) {\r\n this.initDimensions();\r\n }\r\n super.render(ctx);\r\n }\r\n\r\n /**\r\n * Override this method to customize grapheme splitting\r\n * @todo the util `graphemeSplit` needs to be injectable in some way.\r\n * is more comfortable to inject the correct util rather than having to override text\r\n * in the middle of the prototype chain\r\n * @param {string} value\r\n * @returns {string[]} array of graphemes\r\n */\r\n graphemeSplit(value: string): string[] {\r\n return graphemeSplit(value);\r\n }\r\n\r\n /**\r\n * Returns the text as an array of lines.\r\n * @param {String} text text to split\r\n * @returns Lines in the text\r\n */\r\n _splitTextIntoLines(text: string): TextLinesInfo {\r\n const lines = text.split(this._reNewline),\r\n newLines = new Array<string[]>(lines.length),\r\n newLine = ['\\n'];\r\n let newText: string[] = [];\r\n for (let i = 0; i < lines.length; i++) {\r\n // Use BiDi-aware grapheme splitting for RTL text\r\n if (this.direction === 'rtl' || this._containsArabicText(lines[i])) {\r\n newLines[i] = segmentGraphemes(lines[i]);\r\n console.log(`🔤 BiDi-aware split line ${i}: \"${lines[i]}\" -> [${newLines[i].join(', ')}]`);\r\n } else {\r\n newLines[i] = this.graphemeSplit(lines[i]);\r\n }\r\n newText = newText.concat(newLines[i], newLine);\r\n }\r\n newText.pop();\r\n return {\r\n _unwrappedLines: newLines,\r\n lines: lines,\r\n graphemeText: newText,\r\n graphemeLines: newLines,\r\n };\r\n }\r\n \r\n /**\r\n * Check if text contains Arabic characters\r\n * @private\r\n */\r\n _containsArabicText(text: string): boolean {\r\n return /[\\u0600-\\u06FF\\u0750-\\u077F\\uFB50-\\uFDFF\\uFE70-\\uFEFF]/.test(text);\r\n }\r\n\r\n /**\r\n * Returns object representation of an instance\r\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\r\n * @return {Object} Object representation of an instance\r\n */\r\n toObject<\r\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\r\n K extends keyof T = never,\r\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\r\n return {\r\n ...super.toObject([...additionalProps, ...propertiesToInclude] as K[]),\r\n styles: stylesToArray(this.styles, this.text),\r\n ...(this.path ? { path: this.path.toObject() } : {}),\r\n };\r\n }\r\n\r\n set(key: string | any, value?: any) {\r\n const { textLayoutProperties } = this.constructor as typeof FabricText;\r\n super.set(key, value);\r\n let needsDims = false;\r\n let isAddingPath = false;\r\n if (typeof key === 'object') {\r\n for (const _key in key) {\r\n if (_key === 'path') {\r\n this.setPathInfo();\r\n }\r\n needsDims = needsDims || textLayoutProperties.includes(_key);\r\n isAddingPath = isAddingPath || _key === 'path';\r\n }\r\n } else {\r\n needsDims = textLayoutProperties.includes(key);\r\n isAddingPath = key === 'path';\r\n }\r\n if (isAddingPath) {\r\n this.setPathInfo();\r\n }\r\n if (needsDims && this.initialized) {\r\n // Clear browser lines when layout-affecting properties change\r\n clearBrowserLines(this);\r\n this.initDimensions();\r\n this.setCoords();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns complexity of an instance\r\n * @return {Number} complexity\r\n */\r\n complexity(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * List of generic font families\r\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#generic-name\r\n */\r\n static genericFonts = [\r\n 'serif',\r\n 'sans-serif',\r\n 'monospace',\r\n 'cursive',\r\n 'fantasy',\r\n 'system-ui',\r\n 'ui-serif',\r\n 'ui-sans-serif',\r\n 'ui-monospace',\r\n 'ui-rounded',\r\n 'math',\r\n 'emoji',\r\n 'fangsong',\r\n ];\r\n\r\n /* _FROM_SVG_START_ */\r\n\r\n /**\r\n * List of attribute names to account for when parsing SVG element (used by {@link FabricText.fromElement})\r\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\r\n */\r\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(\r\n 'x',\r\n 'y',\r\n 'dx',\r\n 'dy',\r\n 'font-family',\r\n 'font-style',\r\n 'font-weight',\r\n 'font-size',\r\n 'letter-spacing',\r\n 'text-decoration',\r\n 'text-anchor',\r\n );\r\n\r\n /**\r\n * Returns FabricText instance from an SVG element (<b>not yet implemented</b>)\r\n * @param {HTMLElement} element Element to parse\r\n * @param {Object} [options] Options object\r\n */\r\n static async fromElement(\r\n element: HTMLElement | SVGElement,\r\n options?: Abortable,\r\n cssRules?: CSSRules,\r\n ) {\r\n const parsedAttributes = parseAttributes(\r\n element,\r\n FabricText.ATTRIBUTE_NAMES,\r\n cssRules,\r\n );\r\n\r\n const {\r\n textAnchor = LEFT as typeof LEFT | typeof CENTER | typeof RIGHT,\r\n textDecoration = '',\r\n dx = 0,\r\n dy = 0,\r\n top = 0,\r\n left = 0,\r\n fontSize = DEFAULT_SVG_FONT_SIZE,\r\n strokeWidth = 1,\r\n ...restOfOptions\r\n } = { ...options, ...parsedAttributes };\r\n\r\n const textContent = (element.textContent || '')\r\n .replace(/^\\s+|\\s+$|\\n+/g, '')\r\n .replace(/\\s+/g, ' ');\r\n\r\n // this code here is probably the usual issue for SVG center find\r\n // this can later looked at again and probably removed.\r\n\r\n const text = new this(textContent, {\r\n left: left + dx,\r\n top: top + dy,\r\n underline: textDecoration.includes('underline'),\r\n overline: textDecoration.includes('overline'),\r\n linethrough: textDecoration.includes('line-through'),\r\n // we initialize this as 0\r\n strokeWidth: 0,\r\n fontSize,\r\n ...restOfOptions,\r\n }),\r\n textHeightScaleFactor = text.getScaledHeight() / text.height,\r\n lineHeightDiff =\r\n (text.height + text.strokeWidth) * text.lineHeight - text.height,\r\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\r\n textHeight = text.getScaledHeight() + scaledDiff;\r\n\r\n let offX = 0;\r\n /*\r\n Adjust positioning:\r\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\r\n fabric output by default at top, left.\r\n */\r\n if (textAnchor === CENTER) {\r\n offX = text.getScaledWidth() / 2;\r\n }\r\n if (textAnchor === RIGHT) {\r\n offX = text.getScaledWidth();\r\n }\r\n text.set({\r\n left: text.left - offX,\r\n top:\r\n text.top -\r\n (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) /\r\n text.lineHeight,\r\n strokeWidth,\r\n });\r\n return text;\r\n }\r\n\r\n /* _FROM_SVG_END_ */\r\n\r\n /**\r\n * Check if the font is ready for accurate measurements\r\n * @private\r\n */\r\n _isFontReady(): boolean {\r\n if (typeof document === 'undefined' || !('fonts' in document)) {\r\n return true; // Assume ready in non-browser environments\r\n }\r\n \r\n try {\r\n return document.fonts.check(`${this.fontSize}px ${this.fontFamily}`);\r\n } catch (e) {\r\n return true; // Fallback to assuming ready if check fails\r\n }\r\n }\r\n\r\n /**\r\n * Schedule re-initialization after font loads\r\n * @private\r\n */\r\n _scheduleInitAfterFontLoad(): void {\r\n if (typeof document === 'undefined' || !('fonts' in document)) {\r\n return;\r\n }\r\n \r\n // Only schedule if not already waiting\r\n if ((this as any)._fontLoadScheduled) {\r\n return;\r\n }\r\n (this as any)._fontLoadScheduled = true;\r\n \r\n const fontSpec = `${this.fontSize}px ${this.fontFamily}`;\r\n document.fonts.load(fontSpec).then(() => {\r\n (this as any)._fontLoadScheduled = false;\r\n // Re-initialize dimensions with proper font metrics\r\n this.initDimensions();\r\n \r\n // Extra step for justify alignment after font loading\r\n if (this.textAlign && this.textAlign.includes(JUSTIFY)) {\r\n setTimeout(() => {\r\n if (this.enlargeSpaces) {\r\n this.enlargeSpaces();\r\n }\r\n this.canvas?.requestRenderAll();\r\n }, 10);\r\n } else {\r\n this.canvas?.requestRenderAll();\r\n }\r\n }).catch(() => {\r\n (this as any)._fontLoadScheduled = false;\r\n });\r\n }\r\n\r\n /**\r\n * Force complete text re-initialization (useful after JSON loading)\r\n */\r\n forceTextReinitialization(): void {\r\n console.log('🔄 Force reinitializing text object');\r\n \r\n // Clear all caches\r\n this._clearCache();\r\n this.dirty = true;\r\n \r\n // Force text splitting to rebuild internal structures\r\n this._splitText();\r\n \r\n // Re-initialize dimensions\r\n this.initDimensions();\r\n \r\n // Special handling for justify alignment\r\n if (this.textAlign && this.textAlign.includes(JUSTIFY)) {\r\n // Ensure justify is applied after dimensions are set\r\n setTimeout(() => {\r\n if (this.__charBounds && this.__charBounds.length > 0 && this.enlargeSpaces) {\r\n this.enlargeSpaces();\r\n this.canvas?.requestRenderAll();\r\n }\r\n }, 10);\r\n }\r\n }\r\n\r\n /**\r\n * Returns FabricText instance from an object representation\r\n * @param {Object} object plain js Object to create an instance from\r\n * @returns {Promise<FabricText>}\r\n */\r\n static fromObject<\r\n T extends TOptions<SerializedTextProps>,\r\n S extends FabricText,\r\n >(object: T) {\r\n return this._fromObject<S>(\r\n {\r\n ...object,\r\n styles: stylesFromArray(object.styles || {}, object.text),\r\n },\r\n {\r\n extraParam: 'text',\r\n },\r\n ).then((textObject: S) => {\r\n // Ensure text object is properly initialized after JSON deserialization\r\n // This is critical for justify alignment and other text layout features\r\n textObject.initialized = true;\r\n \r\n // Force reinitialization to ensure proper layout\r\n if (textObject._clearCache) {\r\n textObject._clearCache();\r\n }\r\n textObject.dirty = true;\r\n \r\n // Check if we need to wait for font loading (especially for custom fonts like STV)\r\n const fontSpec = `${textObject.fontSize}px ${textObject.fontFamily}`;\r\n \r\n // For custom fonts, ensure they're loaded before initializing dimensions\r\n if (typeof document !== 'undefined' && 'fonts' in document && textObject.fontFamily !== 'Arial' && textObject.fontFamily !== 'Times New Roman') {\r\n return document.fonts.load(fontSpec).then(() => {\r\n console.log(`🔤 Font loaded for JSON object: ${fontSpec}`);\r\n // Ensure initialized flag is set again (in case constructor reset it)\r\n textObject.initialized = true;\r\n \r\n // Special handling for STV fonts which have measurement issues\r\n const isStvFont = textObject.fontFamily?.toLowerCase().includes('stv');\r\n if (isStvFont) {\r\n console.log(`🔤 STV font detected, using enhanced reinitialization`);\r\n \r\n // Clear all cached state that might interfere with browser wrapping\r\n (textObject as any)._browserWrapCache = null;\r\n (textObject as any)._lastDimensionState = null;\r\n (textObject as any)._browserWrapInitialized = false;\r\n console.log(`🔤 STV font: Cleared all cached states for fresh initialization`);\r\n \r\n // Force browser wrapping flag for STV fonts\r\n (textObject as any)._usingBrowserWrapping = true;\r\n console.log(`🔤 STV font: Forcing browser wrapping flag during JSON load`);\r\n \r\n // Multiple initialization attempts for STV fonts\r\n const reinitWithDelay = (attempt: number) => {\r\n if ((textObject as any).forceTextReinitialization) {\r\n (textObject as any).forceTextReinitialization();\r\n } else {\r\n textObject.initDimensions();\r\n }\r\n \r\n // Check if width is still problematic after initialization\r\n if (textObject.width < 50 && attempt < 3) {\r\n console.log(`🔤 STV font width still ${textObject.width}px, retrying in ${100 * attempt}ms (attempt ${attempt + 1}/3)`);\r\n setTimeout(() => reinitWithDelay(attempt + 1), 100 * attempt);\r\n }\r\n };\r\n reinitWithDelay(0);\r\n } else {\r\n // Use specialized reinitialization for Textbox objects\r\n if ((textObject as any).forceTextReinitialization) {\r\n console.log(`🔤 Using Textbox specialized reinitialization`);\r\n (textObject as any).forceTextReinitialization();\r\n } else {\r\n // Reinitialize dimensions with proper font metrics\r\n textObject.initDimensions();\r\n }\r\n }\r\n return textObject;\r\n }).catch(() => {\r\n console.warn(`⚠️ Font loading failed for ${fontSpec}, proceeding with fallback`);\r\n // Ensure initialized flag is set again\r\n textObject.initialized = true;\r\n \r\n // Still initialize dimensions even if font loading fails\r\n if ((textObject as any).forceTextReinitialization) {\r\n (textObject as any).forceTextReinitialization();\r\n } else {\r\n textObject.initDimensions();\r\n }\r\n return textObject;\r\n });\r\n } else {\r\n // Standard fonts - ensure initialized and use appropriate method\r\n textObject.initialized = true;\r\n \r\n if ((textObject as any).forceTextReinitialization) {\r\n console.log(`🔤 Using Textbox specialized reinitialization for standard font`);\r\n (textObject as any).forceTextReinitialization();\r\n } else {\r\n textObject.initDimensions();\r\n }\r\n return textObject;\r\n }\r\n });\r\n }\r\n}\r\n\r\napplyMixins(FabricText, [TextSVGExportMixin]);\r\nclassRegistry.setClass(FabricText);\r\nclassRegistry.setSVGClass(FabricText);\r\n"],"names":["measuringContext","getMeasuringContext","canvas","createCanvasElementFor","width","height","getContext","FabricText","StyledText","getDefaults","ownDefaults","constructor","text","options","_defineProperty","Object","assign","setOptions","styles","initialized","path","setPathInfo","initDimensions","setCoords","segmentsInfo","getPathSegmentsInfo","_splitText","browserLines","getBrowserLines","useOverlayEditing","_splitTextFromBrowserLines","newLines","_splitTextIntoLines","textLines","lines","_textLines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","unwrappedLines","browserLine","push","lineGraphemes","graphemeSplit","concat","length","result","fontReady","_isFontReady","_scheduleInitAfterFontLoad","enableAdvancedLayout","initDimensionsAdvanced","_clearCache","dirty","calcTextWidth","cursorWidth","MIN_TEXT_WIDTH","calcTextHeight","textAlign","includes","JUSTIFY","__charBounds","enlargeSpaces","console","warn","setTimeout","_this$canvas","log","requestRenderAll","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","line","charBound","spaces","isRtl","direction","i","len","isEndOfWrapping","getLineWidth","match","_reSpacesAndTabs","toFixed","j","_reSpaceAndTab","test","spaceCount","kernedWidth","remainingSpaces","shiftAmount","left","_layoutTextAdvanced","_getAdvancedLayoutOptions","layoutText","wrap","align","_mapTextAlignToAlign","ellipsis","fontSize","lineHeight","letterSpacing","charSpacing","fontFamily","fontStyle","fontWeight","verticalAlign","CENTER","RIGHT","JUSTIFY_LEFT","JUSTIFY_RIGHT","JUSTIFY_CENTER","layout","totalWidth","totalHeight","_convertLayoutToLegacyFormat","_this$canvas2","renderAll","map","graphemes","bounds","bound","top","y","deltaY","lineIndex","missingNewlineOffset","_lineIndex","get2DCursorLocation","selectionStart","skipWrapping","charIndex","toString","complexity","_getCacheCanvasDimensions","dims","zoomX","zoomY","_render","ctx","isNotVisible","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderText","__overlayEditor","paintFirst","STROKE","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","pathAlign","TOP","BOTTOM","font","_getFontDeclaration","maxWidth","_renderTextLine","method","_renderChars","textBackgroundColor","styleHas","originalFill","fillStyle","leftOffset","_getLeftOffset","lineTopOffset","_getTopOffset","heightOfLine","getHeightOfLine","jlen","lineLeftOffset","_getLineLeftOffset","boxWidth","boxStart","drawStart","currentColor","lastColor","getValueOfPropertyAt","charBox","save","translate","renderLeft","renderTop","rotate","angle","fillRect","_fontSizeFraction","restore","_removeShadow","_measureChar","_char","previousChar","prevCharStyle","fontCache","cache","getFontCache","fontDeclaration","couple","stylesAreEqual","fontMultiplier","CACHE_FONT_SIZE","coupleWidth","previousWidth","undefined","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","prevGrapheme","graphemeInfo","reverse","pathSide","llength","lineBounds","Array","grapheme","_getGraphemeBox","positionInPath","totalPathLength","LEFT","pathStartOffset","_setGraphemeOnPath","numOfSpaces","centerPosition","info","getPointOnPath","x","pathOffset","Math","PI","skipLeft","style","getCompleteStyleDeclaration","prevStyle","box","previousBox","__lineHeights","maxHeight","max","_fontSizeMult","_renderTextCommon","lineHeights","fill","FILL","stroke","strokeWidth","isEmptyStyles","shadow","affectStroke","_setLineDash","strokeDashArray","beginPath","closePath","isJustify","shortCut","isLtr","sign","currentDirection","actualStyle","nextStyle","charsToRender","timeToRender","drawingLeft","setAttribute","_renderChar","join","hasStyleChanged","_applyPatternGradientTransformText","filler","pCanvas","pCtx","moveTo","lineTo","toLive","_applyPatternGradientTransform","createPattern","handleFiller","property","offsetX","offsetY","isFiller","gradientUnits","gradientTransform","patternTransform","_setStrokeStyles","_ref","lineWidth","lineCap","strokeLineCap","lineDashOffset","strokeDashOffset","lineJoin","strokeLineJoin","miterLimit","strokeMiterLimit","_setFillStyles","_ref2","decl","_getStyleDeclaration","fullDecl","shouldFill","shouldStroke","fillOffsets","fillText","strokeOffsets","strokeText","setSuperscript","start","end","_setScript","superscript","setSubscript","subscript","schema","loc","dy","size","baseline","setSelectionStyles","lineDiff","isJustifyLine","_forceClearCache","__lineWidths","_charStyle$property","type","topOffset","offsetAligner","offsets","lastDecoration","lastFill","lastTickness","TEXT_DECORATION_THICKNESS","currentDecoration","currentFill","currentTickness","currentSize","currentDy","finalTickness","arguments","parsedFontFamily","genericFonts","toLowerCase","render","visible","skipOffscreen","group","isOnScreen","value","split","_reNewline","newLine","newText","_containsArabicText","segmentGraphemes","pop","toObject","propertiesToInclude","additionalProps","stylesToArray","set","key","textLayoutProperties","needsDims","isAddingPath","_key","clearBrowserLines","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","textAnchor","textDecoration","dx","DEFAULT_SVG_FONT_SIZE","restOfOptions","textContent","replace","underline","overline","linethrough","textHeightScaleFactor","getScaledHeight","lineHeightDiff","scaledDiff","textHeight","offX","getScaledWidth","document","fonts","check","e","_fontLoadScheduled","fontSpec","load","then","_this$canvas3","_this$canvas4","catch","forceTextReinitialization","_this$canvas5","fromObject","object","_fromObject","stylesFromArray","extraParam","textObject","_textObject$fontFamil","isStvFont","_browserWrapCache","_lastDimensionState","_browserWrapInitialized","_usingBrowserWrapping","reinitWithDelay","attempt","cacheProperties","textDefaultValues","SHARED_ATTRIBUTES","applyMixins","TextSVGExportMixin","classRegistry","setClass","setSVGClass"],"mappings":"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"}