@itwin/core-backend 5.3.0-dev.2 → 5.3.0-dev.4

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 (45) hide show
  1. package/lib/cjs/IModelDb.js +1 -1
  2. package/lib/cjs/IModelDb.js.map +1 -1
  3. package/lib/cjs/annotations/FrameGeometry.js +6 -6
  4. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  5. package/lib/cjs/annotations/LeaderGeometry.js +4 -4
  6. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  7. package/lib/cjs/annotations/TextAnnotationElement.d.ts +101 -20
  8. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  9. package/lib/cjs/annotations/TextAnnotationElement.js +202 -64
  10. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  11. package/lib/cjs/annotations/TextBlockGeometry.js +3 -3
  12. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  13. package/lib/cjs/annotations/TextBlockLayout.d.ts +2 -2
  14. package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
  15. package/lib/cjs/annotations/TextBlockLayout.js +52 -25
  16. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  17. package/lib/esm/IModelDb.js +1 -1
  18. package/lib/esm/IModelDb.js.map +1 -1
  19. package/lib/esm/annotations/FrameGeometry.js +6 -6
  20. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  21. package/lib/esm/annotations/LeaderGeometry.js +4 -4
  22. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  23. package/lib/esm/annotations/TextAnnotationElement.d.ts +101 -20
  24. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  25. package/lib/esm/annotations/TextAnnotationElement.js +201 -63
  26. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  27. package/lib/esm/annotations/TextBlockGeometry.js +3 -3
  28. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  29. package/lib/esm/annotations/TextBlockLayout.d.ts +2 -2
  30. package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
  31. package/lib/esm/annotations/TextBlockLayout.js +52 -25
  32. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  33. package/lib/esm/test/AnnotationTestUtils.js +1 -1
  34. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  35. package/lib/esm/test/annotations/Fields.test.js +2 -2
  36. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  37. package/lib/esm/test/annotations/FrameGeometry.test.js +4 -4
  38. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  39. package/lib/esm/test/annotations/LeaderGeometry.test.js +8 -8
  40. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  41. package/lib/esm/test/annotations/TextAnnotation.test.js +130 -35
  42. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  43. package/lib/esm/test/annotations/TextBlock.test.js +218 -151
  44. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  45. package/package.json +14 -14
@@ -16,11 +16,11 @@ function setColor(color, context) {
16
16
  }
17
17
  function createTextString(text, run, origin) {
18
18
  assert(text.length > 0);
19
- const { lineHeight, widthFactor, isBold, isItalic, isUnderlined } = run.style;
19
+ const { textHeight, widthFactor, isBold, isItalic, isUnderlined } = run.style;
20
20
  return new TextString({
21
21
  text,
22
22
  font: run.fontId,
23
- height: lineHeight,
23
+ height: textHeight,
24
24
  widthFactor,
25
25
  bold: isBold,
26
26
  italic: isItalic,
@@ -71,7 +71,7 @@ function processFractionRun(run, transform, context) {
71
71
  return;
72
72
  }
73
73
  assert(undefined !== run.numeratorRange && undefined !== run.denominatorRange);
74
- const fontSize = new Vector2d(run.style.lineHeight * run.style.widthFactor, run.style.lineHeight);
74
+ const fontSize = new Vector2d(run.style.textHeight * run.style.widthFactor, run.style.textHeight);
75
75
  fontSize.scale(run.style.stackedFractionScale, fontSize);
76
76
  const numeratorOffset = new Point3d(run.numeratorRange.low.x, run.numeratorRange.low.y, 0);
77
77
  const denominatorOffset = new Point3d(run.denominatorRange.low.x, run.denominatorRange.low.y, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"TextBlockGeometry.js","sourceRoot":"","sources":["../../../src/annotations/TextBlockGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ElementGeometry\n */\n\nimport { TextBlockGeometryProps, TextBlockGeometryPropsEntry, TextString, TextStyleColor } from \"@itwin/core-common\";\nimport { RunLayout, TextBlockLayout } from \"./TextBlockLayout\";\nimport { LineSegment3d, Point3d, Range2d, Transform, Vector2d } from \"@itwin/core-geometry\";\nimport { assert } from \"@itwin/core-bentley\";\n\ninterface GeometryContext {\n curColor?: TextStyleColor;\n entries: TextBlockGeometryPropsEntry[];\n}\n\nfunction setColor(color: TextStyleColor, context: GeometryContext): void {\n if (color !== context.curColor) {\n context.curColor = color;\n context.entries.push({ color });\n }\n}\n\nfunction createTextString(text: string, run: RunLayout, origin?: Point3d): TextString {\n assert(text.length > 0);\n\n const { lineHeight, widthFactor, isBold, isItalic, isUnderlined } = run.style;\n\n return new TextString({\n text,\n font: run.fontId,\n height: lineHeight,\n widthFactor,\n bold: isBold,\n italic: isItalic,\n underline: isUnderlined,\n origin,\n });\n}\n\nfunction processTextRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\n assert(run.source.type === \"text\");\n const text = run.source.content.substring(run.charOffset, run.charOffset + run.numChars);\n if (text.length === 0) {\n return;\n }\n\n const ts = createTextString(text, run);\n if (\"none\" !== run.source.baselineShift) {\n const isSub = \"subscript\" === run.source.baselineShift;\n const offsetFactor = run.style[isSub ? \"subScriptOffsetFactor\" : \"superScriptOffsetFactor\"];\n const scale = run.style[isSub ? \"subScriptScale\" : \"superScriptScale\"];\n\n ts.origin.y += offsetFactor * ts.height;\n ts.height *= scale;\n }\n\n ts.transformInPlace(transform);\n\n setColor(run.style.color, context);\n context.entries.push({ text: ts });\n}\n\nfunction processFieldRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\n assert(run.source.type === \"field\");\n const text = run.source.cachedContent.substring(run.charOffset, run.charOffset + run.numChars);\n if (text.length === 0) {\n return;\n }\n\n const ts = createTextString(text, run);\n ts.transformInPlace(transform);\n\n setColor(run.style.color, context);\n context.entries.push({ text: ts });\n}\n\nfunction createFractionTextString(text: string, run: RunLayout, origin: Point3d, transform: Transform): TextString {\n const ts = createTextString(text, run, origin);\n assert(undefined !== ts.widthFactor);\n\n ts.height *= run.style.stackedFractionScale;\n\n ts.transformInPlace(transform);\n\n return ts;\n}\n\nfunction processFractionRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\n const source = run.source;\n assert(source.type === \"fraction\");\n\n if (source.numerator.length === 0 && source.denominator.length === 0) {\n return;\n }\n\n assert(undefined !== run.numeratorRange && undefined !== run.denominatorRange);\n\n const fontSize = new Vector2d(run.style.lineHeight * run.style.widthFactor, run.style.lineHeight);\n fontSize.scale(run.style.stackedFractionScale, fontSize);\n\n const numeratorOffset = new Point3d(run.numeratorRange.low.x, run.numeratorRange.low.y, 0);\n const denominatorOffset = new Point3d(run.denominatorRange.low.x, run.denominatorRange.low.y, 0);\n\n setColor(run.style.color, context);\n\n if (source.numerator.length > 0) {\n context.entries.push({ text: createFractionTextString(source.numerator, run, numeratorOffset, transform) });\n }\n\n const numeratorRange = Range2d.fromJSON(run.numeratorRange);\n const denominatorRange = Range2d.fromJSON(run.denominatorRange);\n\n let separator: LineSegment3d;\n if (run.style.stackedFractionType === \"horizontal\") {\n const fractionWidth = Math.max(numeratorRange.xLength(), denominatorRange.xLength());\n const y = 1.25 * denominatorRange.yLength();\n separator = LineSegment3d.createXYXY(0, y, fractionWidth, y);\n } else {\n const p0 = new Point3d(denominatorRange.low.x - fontSize.x / 2, denominatorRange.low.y + fontSize.y * (1 / 3), 0);\n const p1 = new Point3d(p0.x + fontSize.x, p0.y + fontSize.y * 1.5, 0);\n separator = LineSegment3d.createCapture(p0, p1);\n }\n\n separator.tryTransformInPlace(transform);\n\n context.entries.push({\n separator: {\n startPoint: separator.point0Ref.toJSON(),\n endPoint: separator.point1Ref.toJSON(),\n },\n });\n\n if (source.denominator.length > 0) {\n context.entries.push({ text: createFractionTextString(source.denominator, run, denominatorOffset, transform) });\n }\n}\n\n/**\n * Produces the geometry for a text block in a way that can be interpreted by a [[GeometryStreamBuilder]] or [[ElementBuilder.Geometry]].\n * To build the geometry for a whole [[TextAnnotation]], use [[appendTextAnnotationGeometry]] instead.\n * @param layout of the text block as computed by [[layoutTextBlock]].\n * @param documentTransform that positions the text block in world coordinates.\n * @returns TextBlockGeometryProps.\n * @beta\n */\nexport function produceTextBlockGeometry(layout: TextBlockLayout, documentTransform: Transform): TextBlockGeometryProps {\n const context: GeometryContext = { entries: [] };\n for (const line of layout.lines) {\n const lineTrans = Transform.createTranslationXYZ(line.offsetFromDocument.x, line.offsetFromDocument.y, 0);\n\n // Create geometry for list markers if present\n if (line.marker) {\n const markerTrans = Transform.createTranslationXYZ(line.marker.offsetFromLine.x, line.marker.offsetFromLine.y, 0);\n lineTrans.multiplyTransformTransform(markerTrans, markerTrans);\n documentTransform.multiplyTransformTransform(markerTrans, markerTrans);\n\n processTextRun(line.marker, markerTrans, context);\n }\n\n // Create geometry for runs\n for (const run of line.runs) {\n // Skip runs that are solely whitespace\n if (run.source.isWhitespace) {\n continue;\n }\n\n const runTrans = Transform.createTranslationXYZ(run.offsetFromLine.x, run.offsetFromLine.y, 0);\n lineTrans.multiplyTransformTransform(runTrans, runTrans);\n documentTransform.multiplyTransformTransform(runTrans, runTrans);\n if (\"text\" === run.source.type) {\n processTextRun(run, runTrans, context);\n } else if (\"fraction\" === run.source.type) {\n processFractionRun(run, runTrans, context);\n } else {\n processFieldRun(run, runTrans, context);\n }\n }\n }\n\n return { entries: context.entries };\n}\n"]}
1
+ {"version":3,"file":"TextBlockGeometry.js","sourceRoot":"","sources":["../../../src/annotations/TextBlockGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ElementGeometry\n */\n\nimport { TextBlockGeometryProps, TextBlockGeometryPropsEntry, TextString, TextStyleColor } from \"@itwin/core-common\";\nimport { RunLayout, TextBlockLayout } from \"./TextBlockLayout\";\nimport { LineSegment3d, Point3d, Range2d, Transform, Vector2d } from \"@itwin/core-geometry\";\nimport { assert } from \"@itwin/core-bentley\";\n\ninterface GeometryContext {\n curColor?: TextStyleColor;\n entries: TextBlockGeometryPropsEntry[];\n}\n\nfunction setColor(color: TextStyleColor, context: GeometryContext): void {\n if (color !== context.curColor) {\n context.curColor = color;\n context.entries.push({ color });\n }\n}\n\nfunction createTextString(text: string, run: RunLayout, origin?: Point3d): TextString {\n assert(text.length > 0);\n\n const { textHeight, widthFactor, isBold, isItalic, isUnderlined } = run.style;\n\n return new TextString({\n text,\n font: run.fontId,\n height: textHeight,\n widthFactor,\n bold: isBold,\n italic: isItalic,\n underline: isUnderlined,\n origin,\n });\n}\n\nfunction processTextRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\n assert(run.source.type === \"text\");\n const text = run.source.content.substring(run.charOffset, run.charOffset + run.numChars);\n if (text.length === 0) {\n return;\n }\n\n const ts = createTextString(text, run);\n if (\"none\" !== run.source.baselineShift) {\n const isSub = \"subscript\" === run.source.baselineShift;\n const offsetFactor = run.style[isSub ? \"subScriptOffsetFactor\" : \"superScriptOffsetFactor\"];\n const scale = run.style[isSub ? \"subScriptScale\" : \"superScriptScale\"];\n\n ts.origin.y += offsetFactor * ts.height;\n ts.height *= scale;\n }\n\n ts.transformInPlace(transform);\n\n setColor(run.style.color, context);\n context.entries.push({ text: ts });\n}\n\nfunction processFieldRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\n assert(run.source.type === \"field\");\n const text = run.source.cachedContent.substring(run.charOffset, run.charOffset + run.numChars);\n if (text.length === 0) {\n return;\n }\n\n const ts = createTextString(text, run);\n ts.transformInPlace(transform);\n\n setColor(run.style.color, context);\n context.entries.push({ text: ts });\n}\n\nfunction createFractionTextString(text: string, run: RunLayout, origin: Point3d, transform: Transform): TextString {\n const ts = createTextString(text, run, origin);\n assert(undefined !== ts.widthFactor);\n\n ts.height *= run.style.stackedFractionScale;\n\n ts.transformInPlace(transform);\n\n return ts;\n}\n\nfunction processFractionRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\n const source = run.source;\n assert(source.type === \"fraction\");\n\n if (source.numerator.length === 0 && source.denominator.length === 0) {\n return;\n }\n\n assert(undefined !== run.numeratorRange && undefined !== run.denominatorRange);\n\n const fontSize = new Vector2d(run.style.textHeight * run.style.widthFactor, run.style.textHeight);\n fontSize.scale(run.style.stackedFractionScale, fontSize);\n\n const numeratorOffset = new Point3d(run.numeratorRange.low.x, run.numeratorRange.low.y, 0);\n const denominatorOffset = new Point3d(run.denominatorRange.low.x, run.denominatorRange.low.y, 0);\n\n setColor(run.style.color, context);\n\n if (source.numerator.length > 0) {\n context.entries.push({ text: createFractionTextString(source.numerator, run, numeratorOffset, transform) });\n }\n\n const numeratorRange = Range2d.fromJSON(run.numeratorRange);\n const denominatorRange = Range2d.fromJSON(run.denominatorRange);\n\n let separator: LineSegment3d;\n if (run.style.stackedFractionType === \"horizontal\") {\n const fractionWidth = Math.max(numeratorRange.xLength(), denominatorRange.xLength());\n const y = 1.25 * denominatorRange.yLength();\n separator = LineSegment3d.createXYXY(0, y, fractionWidth, y);\n } else {\n const p0 = new Point3d(denominatorRange.low.x - fontSize.x / 2, denominatorRange.low.y + fontSize.y * (1 / 3), 0);\n const p1 = new Point3d(p0.x + fontSize.x, p0.y + fontSize.y * 1.5, 0);\n separator = LineSegment3d.createCapture(p0, p1);\n }\n\n separator.tryTransformInPlace(transform);\n\n context.entries.push({\n separator: {\n startPoint: separator.point0Ref.toJSON(),\n endPoint: separator.point1Ref.toJSON(),\n },\n });\n\n if (source.denominator.length > 0) {\n context.entries.push({ text: createFractionTextString(source.denominator, run, denominatorOffset, transform) });\n }\n}\n\n/**\n * Produces the geometry for a text block in a way that can be interpreted by a [[GeometryStreamBuilder]] or [[ElementBuilder.Geometry]].\n * To build the geometry for a whole [[TextAnnotation]], use [[appendTextAnnotationGeometry]] instead.\n * @param layout of the text block as computed by [[layoutTextBlock]].\n * @param documentTransform that positions the text block in world coordinates.\n * @returns TextBlockGeometryProps.\n * @beta\n */\nexport function produceTextBlockGeometry(layout: TextBlockLayout, documentTransform: Transform): TextBlockGeometryProps {\n const context: GeometryContext = { entries: [] };\n for (const line of layout.lines) {\n const lineTrans = Transform.createTranslationXYZ(line.offsetFromDocument.x, line.offsetFromDocument.y, 0);\n\n // Create geometry for list markers if present\n if (line.marker) {\n const markerTrans = Transform.createTranslationXYZ(line.marker.offsetFromLine.x, line.marker.offsetFromLine.y, 0);\n lineTrans.multiplyTransformTransform(markerTrans, markerTrans);\n documentTransform.multiplyTransformTransform(markerTrans, markerTrans);\n\n processTextRun(line.marker, markerTrans, context);\n }\n\n // Create geometry for runs\n for (const run of line.runs) {\n // Skip runs that are solely whitespace\n if (run.source.isWhitespace) {\n continue;\n }\n\n const runTrans = Transform.createTranslationXYZ(run.offsetFromLine.x, run.offsetFromLine.y, 0);\n lineTrans.multiplyTransformTransform(runTrans, runTrans);\n documentTransform.multiplyTransformTransform(runTrans, runTrans);\n if (\"text\" === run.source.type) {\n processTextRun(run, runTrans, context);\n } else if (\"fraction\" === run.source.type) {\n processFractionRun(run, runTrans, context);\n } else {\n processFieldRun(run, runTrans, context);\n }\n }\n }\n\n return { entries: context.entries };\n}\n"]}
@@ -20,7 +20,7 @@ export interface ComputeRangesForTextLayoutArgs {
20
20
  baselineShift: BaselineShift;
21
21
  fontId: FontId;
22
22
  widthFactor: number;
23
- lineHeight: number;
23
+ textHeight: number;
24
24
  }
25
25
  /** A function that uses a font to compute the layout and justification ranges of a string of text.
26
26
  * @internal
@@ -130,7 +130,7 @@ declare class LayoutContext {
130
130
  private readonly _findFontId;
131
131
  private readonly _fontIds;
132
132
  constructor(textStyleResolver: TextStyleResolver, _computeTextRange: ComputeRangesForTextLayout, _findFontId: FindFontId);
133
- findFontId(name: string): FontId;
133
+ findFontId(name: string, type?: FontType): FontId;
134
134
  computeRangeForText(chars: string, style: TextStyleSettings, baselineShift: BaselineShift): TextLayoutRanges;
135
135
  computeRangeForTextRun(style: TextStyleSettings, run: TextRun | FieldRun, charOffset: number, numChars: number): TextLayoutRanges;
136
136
  computeRangeForFractionRun(style: TextStyleSettings, source: FractionRun): {
@@ -1 +1 @@
1
- {"version":3,"file":"TextBlockLayout.d.ts","sourceRoot":"","sources":["../../../src/annotations/TextBlockLayout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TextBlockLayout.d.ts","sourceRoot":"","sources":["../../../src/annotations/TextBlockLayout.ts"],"names":[],"mappings":"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"}
@@ -73,7 +73,7 @@ function scaleRange(range, scale) {
73
73
  range.high.scaleInPlace(scale);
74
74
  }
75
75
  /**
76
- * Applies block level settings (lineSpacingFactor, lineHeight, widthFactor, frame, and leader) to a [TextStyleSettings]($common).
76
+ * Applies block level settings (lineSpacingFactor, paragraphSpacingFactor, widthFactor, frame, margins, justification, and leader) to a [TextStyleSettings]($common).
77
77
  * These must be set on the block, as they are meaningless on individual paragraphs/runs.
78
78
  * However, leaders are a special case and can override the block's leader settings.
79
79
  * Setting `isLeader` to `true` makes the [TextBlock]($common) settings not override the leader's settings.
@@ -84,21 +84,27 @@ function applyBlockSettings(target, source, isLeader = false) {
84
84
  return target;
85
85
  }
86
86
  const lineSpacingFactor = source.lineSpacingFactor ?? target.lineSpacingFactor;
87
- const lineHeight = source.lineHeight ?? target.lineHeight;
87
+ const paragraphSpacingFactor = source.paragraphSpacingFactor ?? target.paragraphSpacingFactor;
88
88
  const widthFactor = source.widthFactor ?? target.widthFactor;
89
+ const justification = source.justification ?? target.justification;
89
90
  const frame = source.frame ?? target.frame;
91
+ const margins = source.margins ?? target.margins;
90
92
  const leader = source.leader ?? target.leader;
91
93
  const leaderShouldChange = !isLeader && !target.leaderEquals(leader);
92
94
  if (lineSpacingFactor !== target.lineSpacingFactor ||
93
- lineHeight !== target.lineHeight ||
95
+ paragraphSpacingFactor !== target.paragraphSpacingFactor ||
94
96
  widthFactor !== target.widthFactor ||
97
+ justification !== target.justification ||
95
98
  !target.frameEquals(frame) ||
99
+ !target.marginsEqual(margins) ||
96
100
  leaderShouldChange) {
97
101
  const cloneProps = {
98
102
  lineSpacingFactor,
99
- lineHeight,
103
+ paragraphSpacingFactor,
100
104
  widthFactor,
105
+ justification,
101
106
  frame,
107
+ margins,
102
108
  };
103
109
  if (leaderShouldChange) {
104
110
  cloneProps.leader = leader;
@@ -153,35 +159,35 @@ class LayoutContext {
153
159
  this._computeTextRange = _computeTextRange;
154
160
  this._findFontId = _findFontId;
155
161
  }
156
- findFontId(name) {
162
+ findFontId(name, type) {
157
163
  let fontId = this._fontIds.get(name);
158
164
  if (undefined === fontId) {
159
- this._fontIds.set(name, fontId = this._findFontId(name));
165
+ this._fontIds.set(name, fontId = this._findFontId(name, type));
160
166
  }
161
167
  return fontId;
162
168
  }
163
169
  computeRangeForText(chars, style, baselineShift) {
164
170
  if (chars.length === 0) {
165
171
  return {
166
- layout: new Range2d(0, 0, 0, style.lineHeight),
172
+ layout: new Range2d(0, 0, 0, style.textHeight),
167
173
  justification: new Range2d(),
168
174
  };
169
175
  }
170
- const fontId = this.findFontId(style.fontName);
176
+ const fontId = this.findFontId(style.font.name, style.font.type);
171
177
  const { layout, justification } = this._computeTextRange({
172
178
  chars,
173
179
  fontId,
174
180
  baselineShift,
175
181
  bold: style.isBold,
176
182
  italic: style.isItalic,
177
- lineHeight: this.textStyleResolver.blockSettings.lineHeight,
183
+ textHeight: style.textHeight,
178
184
  widthFactor: this.textStyleResolver.blockSettings.widthFactor,
179
185
  });
180
186
  if ("none" !== baselineShift) {
181
187
  const isSub = "subscript" === baselineShift;
182
188
  const scale = isSub ? style.subScriptScale : style.superScriptScale;
183
189
  const offsetFactor = isSub ? style.subScriptOffsetFactor : style.superScriptOffsetFactor;
184
- const offset = { x: 0, y: style.lineHeight * offsetFactor };
190
+ const offset = { x: 0, y: style.textHeight * offsetFactor };
185
191
  scaleRange(layout, scale);
186
192
  layout.cloneTranslated(offset, layout);
187
193
  scaleRange(justification, scale);
@@ -233,7 +239,7 @@ class LayoutContext {
233
239
  computeRangeForTabRun(style, source, lengthFromLastTab) {
234
240
  const interval = source.styleOverrides.tabInterval ?? style.tabInterval;
235
241
  const tabEndX = interval - lengthFromLastTab % interval;
236
- const range = new Range2d(0, 0, 0, style.lineHeight);
242
+ const range = new Range2d(0, 0, 0, style.textHeight);
237
243
  range.extendXY(tabEndX, range.low.y);
238
244
  return range;
239
245
  }
@@ -290,7 +296,7 @@ export class RunLayout {
290
296
  }
291
297
  static create(source, context, cumulativeOverrides) {
292
298
  const style = context.textStyleResolver.resolveSettings(cumulativeOverrides);
293
- const fontId = context.findFontId(style.fontName);
299
+ const fontId = context.findFontId(style.font.name, style.font.type);
294
300
  const charOffset = 0;
295
301
  const offsetFromLine = { x: 0, y: 0 };
296
302
  let numChars = 0;
@@ -316,7 +322,7 @@ export class RunLayout {
316
322
  default: { // "linebreak" or "tab"
317
323
  // "tab": Tabs rely on the context they are in, so we compute its range later.
318
324
  // lineBreak: We do this so that blank lines space correctly without special casing later.
319
- range = new Range2d(0, 0, 0, style.lineHeight);
325
+ range = new Range2d(0, 0, 0, style.textHeight);
320
326
  break;
321
327
  }
322
328
  }
@@ -429,15 +435,36 @@ export class LineLayout {
429
435
  this.runRange.low.setZero();
430
436
  this.runRange.high.setZero();
431
437
  this.lengthFromLastTab = 0;
432
- // Some runs (fractions) are taller than others.
433
- // We want to center each run vertically inside the line.
434
438
  let lineHeight = 0;
439
+ let tallestNonFractionRun;
435
440
  for (const run of this._runs) {
436
- lineHeight = Math.max(lineHeight, run.range.yLength());
441
+ const runHeight = run.range.yLength();
442
+ lineHeight = Math.max(lineHeight, runHeight);
443
+ if (run.source.type !== "fraction" && (!tallestNonFractionRun || runHeight > tallestNonFractionRun.range.yLength())) {
444
+ tallestNonFractionRun = run;
445
+ }
446
+ }
447
+ // // The baseline for the line is the bottom of the tallest non-fraction run, centered in the line.
448
+ let baseline = 0;
449
+ if (tallestNonFractionRun) {
450
+ baseline = (lineHeight + tallestNonFractionRun.range.yLength()) / 2;
437
451
  }
438
452
  for (const run of this._runs) {
439
453
  const runHeight = run.range.yLength();
440
- const runOffset = { x: this.runRange.high.x, y: (lineHeight - runHeight) / 2 };
454
+ // Vertically align runs: normal text at baseline, fractions visually centered on text or line as appropriate.
455
+ let yOffset = lineHeight - baseline;
456
+ if (run.source.type === "fraction") {
457
+ const denominatorHeight = run.denominatorRange?.yLength() ?? 0;
458
+ if (tallestNonFractionRun && run.style.textHeight <= tallestNonFractionRun.style.textHeight) {
459
+ // Shift fraction to baseline, then down by half the denominator height so it appears centered relative to any non-fraction text of the same height.
460
+ yOffset = (lineHeight - baseline) - denominatorHeight / 2;
461
+ }
462
+ else {
463
+ // If the fraction text height is greater than the largest non-fraction text, just center it in the line.
464
+ yOffset = (lineHeight - runHeight) / 2;
465
+ }
466
+ }
467
+ const runOffset = { x: this.runRange.high.x, y: yOffset };
441
468
  run.offsetFromLine = runOffset;
442
469
  const runLayoutRange = run.range.cloneTranslated(runOffset);
443
470
  this.runRange.extendRange(runLayoutRange);
@@ -498,8 +525,8 @@ export class TextBlockLayout {
498
525
  this.textRange.high.x = source.width;
499
526
  }
500
527
  this.populateLines(context);
501
- this.justifyLines();
502
- this.applyMargins(source.margins);
528
+ this.justifyLines(context);
529
+ this.applyMargins(context.textStyleResolver.blockSettings.margins);
503
530
  }
504
531
  toResult() {
505
532
  return {
@@ -638,7 +665,7 @@ export class TextBlockLayout {
638
665
  }
639
666
  if (curLine.source.type !== "linebreak") {
640
667
  const newLine = new LineLayout(next, cumulativeOverrides, context, depth);
641
- newLine.offsetFromDocument.y -= context.textStyleResolver.blockSettings.paragraphSpacingFactor * context.textStyleResolver.blockSettings.lineHeight;
668
+ newLine.offsetFromDocument.y -= context.textStyleResolver.blockSettings.paragraphSpacingFactor * context.textStyleResolver.blockSettings.textHeight;
642
669
  return newLine;
643
670
  }
644
671
  const run = curLine.source.clone();
@@ -650,7 +677,7 @@ export class TextBlockLayout {
650
677
  // Place it below any existing lines
651
678
  if (this.lines.length > 0) {
652
679
  lineOffset.y += this._back.offsetFromDocument.y;
653
- lineOffset.y -= context.textStyleResolver.blockSettings.lineSpacingFactor * context.textStyleResolver.blockSettings.lineHeight;
680
+ lineOffset.y -= context.textStyleResolver.blockSettings.lineSpacingFactor * context.textStyleResolver.blockSettings.textHeight;
654
681
  }
655
682
  curLine.offsetFromDocument = lineOffset;
656
683
  // Update document range from computed line range and position
@@ -658,14 +685,14 @@ export class TextBlockLayout {
658
685
  this.lines.push(curLine);
659
686
  if (newParagraph) {
660
687
  const newLine = new LineLayout(next, cumulativeOverrides, context, depth);
661
- newLine.offsetFromDocument.y -= context.textStyleResolver.blockSettings.paragraphSpacingFactor * context.textStyleResolver.blockSettings.lineHeight;
688
+ newLine.offsetFromDocument.y -= context.textStyleResolver.blockSettings.paragraphSpacingFactor * context.textStyleResolver.blockSettings.textHeight;
662
689
  return newLine;
663
690
  }
664
691
  return new LineLayout(next, cumulativeOverrides, context, depth);
665
692
  }
666
- justifyLines() {
693
+ justifyLines(context) {
667
694
  // We don't want to justify empty text, or a single line of text whose width is 0. By default text is already left justified.
668
- if (this.lines.length < 1 || (this.lines.length === 1 && this.source.width === 0) || "left" === this.source.justification) {
695
+ if (this.lines.length < 1 || (this.lines.length === 1 && this.source.width === 0) || "left" === context.textStyleResolver.blockSettings.justification) {
669
696
  return;
670
697
  }
671
698
  // This is the minimum width of the document's bounding box.
@@ -674,7 +701,7 @@ export class TextBlockLayout {
674
701
  for (const line of this.lines) {
675
702
  const lineWidth = line.justificationRange.xLength() + line.offsetFromDocument.x;
676
703
  let offset = docWidth - lineWidth;
677
- if ("center" === this.source.justification) {
704
+ if ("center" === context.textStyleResolver.blockSettings.justification) {
678
705
  offset = offset / 2;
679
706
  }
680
707
  line.offsetFromDocument.x += offset;