@itwin/core-backend 4.8.0-dev.4 → 4.8.0-dev.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,23 @@
1
1
  # Change Log - @itwin/core-backend
2
2
 
3
- This log was last generated on Sat, 08 Jun 2024 00:53:21 GMT and should not be manually modified.
3
+ This log was last generated on Thu, 13 Jun 2024 22:48:58 GMT and should not be manually modified.
4
+
5
+ ## 4.7.1
6
+ Thu, 13 Jun 2024 22:47:31 GMT
7
+
8
+ _Version update only_
9
+
10
+ ## 4.7.0
11
+ Wed, 12 Jun 2024 18:02:16 GMT
12
+
13
+ ### Updates
14
+
15
+ - schemaUpgrade() now push change to schema sync
16
+ - Remove @alpha BackendLoggerCategory.Editing
17
+ - Added getAvailableCoordinateReferenceSystems.
18
+ - Brotli compression enabled for RPC requests.
19
+ - Increase restrictions on native app storage name.
20
+ - Added computeTextBlockExtents
4
21
 
5
22
  ## 4.6.2
6
23
  Sat, 08 Jun 2024 00:50:25 GMT
@@ -1 +1 @@
1
- {"version":3,"file":"Material.d.ts","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Material.d.ts","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":"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"}
@@ -173,6 +173,11 @@ class RenderMaterialElement extends Element_1.DefinitionElement {
173
173
  if (typeof mapName !== "string")
174
174
  continue;
175
175
  const sourceMap = sourceProps.jsonProperties.materialAssets.renderMaterial.Map[mapName];
176
+ // sourceMap could be null/undefined, keep it the same in targetProps
177
+ if (!sourceMap) {
178
+ targetProps.jsonProperties.materialAssets.renderMaterial.Map[mapName] = sourceMap;
179
+ continue;
180
+ }
176
181
  if (!core_bentley_1.Id64.isValid(sourceMap.TextureId) || sourceMap.TextureId === undefined)
177
182
  continue;
178
183
  targetProps.jsonProperties.materialAssets.renderMaterial.Map[mapName].TextureId = context.findTargetElementId(sourceMap.TextureId ?? core_bentley_1.Id64.invalid);
@@ -1 +1 @@
1
- {"version":3,"file":"Material.js","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\n\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n BisCodeSpec, Code, CodeScopeProps, CodeSpec, DefinitionElementProps, ElementProps, NormalMapProps, RenderMaterialAssetMapsProps, RenderMaterialProps, RgbFactorProps, TextureMapProps,\r\n} from \"@itwin/core-common\";\r\nimport { DefinitionElement } from \"./Element\";\r\nimport { IModelDb } from \"./IModelDb\";\r\nimport { IModelElementCloneContext } from \"./IModelElementCloneContext\";\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\n/** A PhysicalMaterial defines the matter that makes up physical elements.\r\n * @note See [[RenderMaterialElement]] for the DefinitionElement used to define rendering characteristics.\r\n * @public\r\n */\r\nexport abstract class PhysicalMaterial extends DefinitionElement {\r\n /** @internal */\r\n public static override get className(): string { return \"PhysicalMaterial\"; }\r\n /** Create a Code for a PhysicalMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\r\n * @param iModel The IModelDb\r\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\r\n * @param name The name (codeValue) of the PhysicalMaterial\r\n */\r\n public static createCode(iModel: IModelDb, definitionModelId: CodeScopeProps, name: string): Code {\r\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.physicalMaterial);\r\n return new Code({ spec: codeSpec.id, scope: definitionModelId, value: name });\r\n }\r\n /** Create a PhysicalMaterial\r\n * @param iModelDb The IModelDb\r\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\r\n * @param name The name (codeValue) of the PhysicalMaterial\r\n * @returns The newly constructed PhysicalMaterial\r\n * @throws [[IModelError]] if there is a problem creating the PhysicalMaterial\r\n */\r\n public static create<T extends PhysicalMaterial>(iModelDb: IModelDb, definitionModelId: CodeScopeProps, name: string): T {\r\n const elementProps: DefinitionElementProps = {\r\n classFullName: this.classFullName,\r\n model: definitionModelId,\r\n code: this.createCode(iModelDb, definitionModelId, name),\r\n };\r\n return iModelDb.elements.createElement(elementProps);\r\n }\r\n}\r\n\r\n/** Defines a rendering material.\r\n * @note See [[PhysicalMaterial]] for the DefinitionElement used to define the matter that makes up physical elements.\r\n * @public\r\n */\r\nexport class RenderMaterialElement extends DefinitionElement {\r\n /** @internal */\r\n public static override get className(): string { return \"RenderMaterial\"; }\r\n\r\n /** The name of a palette that can be used to categorize multiple materials. */\r\n public paletteName: string;\r\n /** An optional description of the material. */\r\n public description?: string;\r\n /** @internal */\r\n constructor(props: RenderMaterialProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.paletteName = props.paletteName;\r\n this.description = props.description;\r\n }\r\n\r\n public override toJSON(): RenderMaterialProps {\r\n const val = super.toJSON() as RenderMaterialProps;\r\n val.paletteName = this.paletteName;\r\n val.description = this.description;\r\n return val;\r\n }\r\n /** Create a Code for a RenderMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\r\n * @param iModel The IModelDb\r\n * @param scopeModelId The Id of the DefinitionModel that contains the RenderMaterial and provides the scope for its name.\r\n * @param name The RenderMaterial name\r\n */\r\n public static createCode(iModel: IModelDb, scopeModelId: CodeScopeProps, name: string): Code {\r\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.renderMaterial);\r\n return 0 === name.length ? Code.createEmpty() : new Code({ spec: codeSpec.id, scope: scopeModelId, value: name });\r\n }\r\n /**\r\n * Create a RenderMaterial with given parameters.\r\n * @param iModelDb The iModel\r\n * @param definitionModelId The [[DefinitionModel]]\r\n * @param materialName The name/CodeValue of the RenderMaterial\r\n * @param params Parameters object which describes how to construct the RenderMaterial\r\n * @returns The newly constructed RenderMaterial element.\r\n * @throws [[IModelError]] if unable to create the element.\r\n */\r\n public static create(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): RenderMaterialElement {\r\n let maps: RenderMaterialAssetMapsProps | undefined;\r\n const pbr_normal = params.normalMap?.scale;\r\n if (params.patternMap || params.normalMap) {\r\n // If both normal and pattern map are present, their texture mapping modes, angles, scales, etc are expected to match.\r\n type TexMap = Omit<TextureMapProps, \"TextureId\">;\r\n function choose<K extends keyof TexMap>(obj: TexMap, key: K): void {\r\n const pat = params.patternMap;\r\n if (pat && undefined !== pat[key])\r\n obj[key] = pat[key];\r\n else if (params.normalMap && undefined !== params.normalMap[key])\r\n obj[key] = params.normalMap[key];\r\n }\r\n\r\n const baseProps: TexMap = {};\r\n choose(baseProps, \"pattern_angle\");\r\n choose(baseProps, \"pattern_u_flip\");\r\n choose(baseProps, \"pattern_flip\");\r\n choose(baseProps, \"pattern_scale\");\r\n choose(baseProps, \"pattern_offset\");\r\n choose(baseProps, \"pattern_scalemode\");\r\n choose(baseProps, \"pattern_mapping\");\r\n choose(baseProps, \"pattern_weight\");\r\n choose(baseProps, \"pattern_useconstantlod\");\r\n choose(baseProps, \"pattern_constantlod_repetitions\");\r\n choose(baseProps, \"pattern_constantlod_offset\");\r\n choose(baseProps, \"pattern_constantlod_mindistanceclamp\");\r\n choose(baseProps, \"pattern_constantlod_maxdistanceclamp\");\r\n\r\n maps = {};\r\n if (params.patternMap)\r\n maps.Pattern = { ...params.patternMap, ...baseProps };\r\n\r\n if (params.normalMap) {\r\n maps.Normal = {\r\n ...params.normalMap,\r\n ...baseProps,\r\n };\r\n\r\n delete (maps.Normal as any).scale;\r\n }\r\n }\r\n\r\n // const map = undefined !== params.patternMap ? { Pattern: params.patternMap } : undefined;\r\n const renderMaterialProps: RenderMaterialProps = {\r\n classFullName: this.classFullName,\r\n code: this.createCode(iModelDb, definitionModelId, materialName),\r\n paletteName: params.paletteName,\r\n description: params.description,\r\n jsonProperties: {\r\n materialAssets: {\r\n renderMaterial: {\r\n HasBaseColor: params.color !== undefined,\r\n color: params.color,\r\n HasSpecularColor: params.specularColor !== undefined,\r\n specular_color: params.specularColor,\r\n HasFinish: params.finish !== undefined,\r\n finish: params.finish,\r\n HasTransmit: params.transmit !== undefined,\r\n transmit: params.transmit,\r\n HasDiffuse: params.diffuse !== undefined,\r\n diffuse: params.diffuse,\r\n HasSpecular: params.specular !== undefined,\r\n specular: params.specular,\r\n HasReflect: params.reflect !== undefined,\r\n reflect: params.reflect,\r\n HasReflectColor: params.reflectColor !== undefined,\r\n reflect_color: params.reflectColor,\r\n Map: maps,\r\n pbr_normal,\r\n },\r\n },\r\n },\r\n model: definitionModelId,\r\n isPrivate: false,\r\n };\r\n\r\n return new RenderMaterialElement(renderMaterialProps, iModelDb);\r\n }\r\n\r\n /**\r\n * Insert a new RenderMaterial into a model.\r\n * @param iModelDb Insert into this iModel\r\n * @param definitionModelId Insert the new Texture into this DefinitionModel\r\n * @param materialName The name/CodeValue of the RenderMaterial\r\n * @param params Parameters object which describes how to construct the RenderMaterial\r\n * @returns The Id of the newly inserted RenderMaterial element.\r\n * @throws [[IModelError]] if unable to insert the element.\r\n */\r\n public static insert(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): Id64String {\r\n const renderMaterial = this.create(iModelDb, definitionModelId, materialName, params);\r\n return iModelDb.elements.insertElement(renderMaterial.toJSON());\r\n }\r\n\r\n /** @internal */\r\n protected static override onCloned(context: IModelElementCloneContext, sourceProps: ElementProps, targetProps: ElementProps) {\r\n super.onCloned(context, sourceProps, targetProps);\r\n for (const mapName in sourceProps.jsonProperties?.materialAssets?.renderMaterial?.Map ?? {}) {\r\n if (typeof mapName !== \"string\")\r\n continue;\r\n const sourceMap = sourceProps.jsonProperties.materialAssets.renderMaterial.Map[mapName];\r\n if (!Id64.isValid(sourceMap.TextureId) || sourceMap.TextureId === undefined)\r\n continue;\r\n targetProps.jsonProperties.materialAssets.renderMaterial.Map[mapName].TextureId = context.findTargetElementId(sourceMap.TextureId ?? Id64.invalid);\r\n }\r\n }\r\n}\r\n\r\n/** @public */\r\nexport namespace RenderMaterialElement { // eslint-disable-line no-redeclare\r\n /** Parameters used to construct a [[RenderMaterial]].\r\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\r\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\r\n * @deprecated in 3.6 because it is not useful to use a `class` - just use [[RenderMaterialElementParams]] directly instead.\r\n */\r\n export class Params {\r\n /** A required palette name that categorizes this RenderMaterial */\r\n public paletteName: string;\r\n /** An optional description of this RenderMaterial */\r\n public description?: string;\r\n /** If defined, the color to use for surface fill or diffuse illumination, overriding the surface's own color. */\r\n public color?: RgbFactorProps;\r\n /** The color to use for specular illumination. Default: black. */\r\n public specularColor?: RgbFactorProps;\r\n /** The specular exponent describing the surface's shininess, in the range 0 through 128.\r\n * Default: 0.\r\n */\r\n public finish?: number;\r\n /** A transparency to be applied to the surface, ranging from 0 (fully opaque) to 1 (fully transparent).\r\n * The surface's own transparency will be multiplied by `(1 - transmit)`. permitting the material to increase but not decrease the surface transparency.\r\n * Default: 13.5.\r\n */\r\n public transmit?: number;\r\n /** The surface's diffuse reflectivity from 0.0 to 1.0. Default: 0.6. */\r\n public diffuse?: number;\r\n /** The surface's specular reflectivity from 0.0 to 1.0. Default: 0.0. */\r\n public specular?: number;\r\n /** Currently unused. */\r\n public reflect?: number;\r\n /** Currently unused. */\r\n public reflectColor?: number[];\r\n /** Specifies a texture image to map onto the surface, replacing or mixing with the surface's own color and transparency.\r\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\r\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\r\n */\r\n public patternMap?: TextureMapProps;\r\n /** Specifies a [normal map](https://en.wikipedia.org/wiki/Normal_mapping) to apply to the surface to simulate more surface detail than is present in the\r\n * surface's geometry.\r\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\r\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\r\n */\r\n public normalMap?: NormalMapProps & {\r\n /** A factor by which to multiply the components of the normal vectors read from the texture.\r\n * Default: 1.\r\n */\r\n scale?: number;\r\n };\r\n\r\n /** Construct a new RenderMaterial.Params object with the specified paletteName. Alter the public members on that object to specify settings. */\r\n public constructor(paletteName: string) {\r\n this.paletteName = paletteName;\r\n }\r\n }\r\n}\r\n\r\n/** Parameters used to create a [[RenderMaterial]] element.\r\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\r\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\r\n * @public\r\n */\r\nexport interface RenderMaterialElementParams extends RenderMaterialElement.Params { // eslint-disable-line deprecation/deprecation, @typescript-eslint/no-empty-interface\r\n}\r\n"]}
1
+ {"version":3,"file":"Material.js","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\n\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n BisCodeSpec, Code, CodeScopeProps, CodeSpec, DefinitionElementProps, ElementProps, NormalMapProps, RenderMaterialAssetMapsProps, RenderMaterialProps, RgbFactorProps, TextureMapProps,\r\n} from \"@itwin/core-common\";\r\nimport { DefinitionElement } from \"./Element\";\r\nimport { IModelDb } from \"./IModelDb\";\r\nimport { IModelElementCloneContext } from \"./IModelElementCloneContext\";\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\n/** A PhysicalMaterial defines the matter that makes up physical elements.\r\n * @note See [[RenderMaterialElement]] for the DefinitionElement used to define rendering characteristics.\r\n * @public\r\n */\r\nexport abstract class PhysicalMaterial extends DefinitionElement {\r\n /** @internal */\r\n public static override get className(): string { return \"PhysicalMaterial\"; }\r\n /** Create a Code for a PhysicalMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\r\n * @param iModel The IModelDb\r\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\r\n * @param name The name (codeValue) of the PhysicalMaterial\r\n */\r\n public static createCode(iModel: IModelDb, definitionModelId: CodeScopeProps, name: string): Code {\r\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.physicalMaterial);\r\n return new Code({ spec: codeSpec.id, scope: definitionModelId, value: name });\r\n }\r\n /** Create a PhysicalMaterial\r\n * @param iModelDb The IModelDb\r\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\r\n * @param name The name (codeValue) of the PhysicalMaterial\r\n * @returns The newly constructed PhysicalMaterial\r\n * @throws [[IModelError]] if there is a problem creating the PhysicalMaterial\r\n */\r\n public static create<T extends PhysicalMaterial>(iModelDb: IModelDb, definitionModelId: CodeScopeProps, name: string): T {\r\n const elementProps: DefinitionElementProps = {\r\n classFullName: this.classFullName,\r\n model: definitionModelId,\r\n code: this.createCode(iModelDb, definitionModelId, name),\r\n };\r\n return iModelDb.elements.createElement(elementProps);\r\n }\r\n}\r\n\r\n/** Defines a rendering material.\r\n * @note See [[PhysicalMaterial]] for the DefinitionElement used to define the matter that makes up physical elements.\r\n * @public\r\n */\r\nexport class RenderMaterialElement extends DefinitionElement {\r\n /** @internal */\r\n public static override get className(): string { return \"RenderMaterial\"; }\r\n\r\n /** The name of a palette that can be used to categorize multiple materials. */\r\n public paletteName: string;\r\n /** An optional description of the material. */\r\n public description?: string;\r\n /** @internal */\r\n constructor(props: RenderMaterialProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.paletteName = props.paletteName;\r\n this.description = props.description;\r\n }\r\n\r\n public override toJSON(): RenderMaterialProps {\r\n const val = super.toJSON() as RenderMaterialProps;\r\n val.paletteName = this.paletteName;\r\n val.description = this.description;\r\n return val;\r\n }\r\n /** Create a Code for a RenderMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\r\n * @param iModel The IModelDb\r\n * @param scopeModelId The Id of the DefinitionModel that contains the RenderMaterial and provides the scope for its name.\r\n * @param name The RenderMaterial name\r\n */\r\n public static createCode(iModel: IModelDb, scopeModelId: CodeScopeProps, name: string): Code {\r\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.renderMaterial);\r\n return 0 === name.length ? Code.createEmpty() : new Code({ spec: codeSpec.id, scope: scopeModelId, value: name });\r\n }\r\n /**\r\n * Create a RenderMaterial with given parameters.\r\n * @param iModelDb The iModel\r\n * @param definitionModelId The [[DefinitionModel]]\r\n * @param materialName The name/CodeValue of the RenderMaterial\r\n * @param params Parameters object which describes how to construct the RenderMaterial\r\n * @returns The newly constructed RenderMaterial element.\r\n * @throws [[IModelError]] if unable to create the element.\r\n */\r\n public static create(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): RenderMaterialElement {\r\n let maps: RenderMaterialAssetMapsProps | undefined;\r\n const pbr_normal = params.normalMap?.scale;\r\n if (params.patternMap || params.normalMap) {\r\n // If both normal and pattern map are present, their texture mapping modes, angles, scales, etc are expected to match.\r\n type TexMap = Omit<TextureMapProps, \"TextureId\">;\r\n function choose<K extends keyof TexMap>(obj: TexMap, key: K): void {\r\n const pat = params.patternMap;\r\n if (pat && undefined !== pat[key])\r\n obj[key] = pat[key];\r\n else if (params.normalMap && undefined !== params.normalMap[key])\r\n obj[key] = params.normalMap[key];\r\n }\r\n\r\n const baseProps: TexMap = {};\r\n choose(baseProps, \"pattern_angle\");\r\n choose(baseProps, \"pattern_u_flip\");\r\n choose(baseProps, \"pattern_flip\");\r\n choose(baseProps, \"pattern_scale\");\r\n choose(baseProps, \"pattern_offset\");\r\n choose(baseProps, \"pattern_scalemode\");\r\n choose(baseProps, \"pattern_mapping\");\r\n choose(baseProps, \"pattern_weight\");\r\n choose(baseProps, \"pattern_useconstantlod\");\r\n choose(baseProps, \"pattern_constantlod_repetitions\");\r\n choose(baseProps, \"pattern_constantlod_offset\");\r\n choose(baseProps, \"pattern_constantlod_mindistanceclamp\");\r\n choose(baseProps, \"pattern_constantlod_maxdistanceclamp\");\r\n\r\n maps = {};\r\n if (params.patternMap)\r\n maps.Pattern = { ...params.patternMap, ...baseProps };\r\n\r\n if (params.normalMap) {\r\n maps.Normal = {\r\n ...params.normalMap,\r\n ...baseProps,\r\n };\r\n\r\n delete (maps.Normal as any).scale;\r\n }\r\n }\r\n\r\n // const map = undefined !== params.patternMap ? { Pattern: params.patternMap } : undefined;\r\n const renderMaterialProps: RenderMaterialProps = {\r\n classFullName: this.classFullName,\r\n code: this.createCode(iModelDb, definitionModelId, materialName),\r\n paletteName: params.paletteName,\r\n description: params.description,\r\n jsonProperties: {\r\n materialAssets: {\r\n renderMaterial: {\r\n HasBaseColor: params.color !== undefined,\r\n color: params.color,\r\n HasSpecularColor: params.specularColor !== undefined,\r\n specular_color: params.specularColor,\r\n HasFinish: params.finish !== undefined,\r\n finish: params.finish,\r\n HasTransmit: params.transmit !== undefined,\r\n transmit: params.transmit,\r\n HasDiffuse: params.diffuse !== undefined,\r\n diffuse: params.diffuse,\r\n HasSpecular: params.specular !== undefined,\r\n specular: params.specular,\r\n HasReflect: params.reflect !== undefined,\r\n reflect: params.reflect,\r\n HasReflectColor: params.reflectColor !== undefined,\r\n reflect_color: params.reflectColor,\r\n Map: maps,\r\n pbr_normal,\r\n },\r\n },\r\n },\r\n model: definitionModelId,\r\n isPrivate: false,\r\n };\r\n\r\n return new RenderMaterialElement(renderMaterialProps, iModelDb);\r\n }\r\n\r\n /**\r\n * Insert a new RenderMaterial into a model.\r\n * @param iModelDb Insert into this iModel\r\n * @param definitionModelId Insert the new Texture into this DefinitionModel\r\n * @param materialName The name/CodeValue of the RenderMaterial\r\n * @param params Parameters object which describes how to construct the RenderMaterial\r\n * @returns The Id of the newly inserted RenderMaterial element.\r\n * @throws [[IModelError]] if unable to insert the element.\r\n */\r\n public static insert(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): Id64String {\r\n const renderMaterial = this.create(iModelDb, definitionModelId, materialName, params);\r\n return iModelDb.elements.insertElement(renderMaterial.toJSON());\r\n }\r\n\r\n /** @internal */\r\n protected static override onCloned(context: IModelElementCloneContext, sourceProps: ElementProps, targetProps: ElementProps) {\r\n super.onCloned(context, sourceProps, targetProps);\r\n for (const mapName in sourceProps.jsonProperties?.materialAssets?.renderMaterial?.Map ?? {}) {\r\n if (typeof mapName !== \"string\")\r\n continue;\r\n const sourceMap = sourceProps.jsonProperties.materialAssets.renderMaterial.Map[mapName];\r\n // sourceMap could be null/undefined, keep it the same in targetProps\r\n if (!sourceMap) {\r\n targetProps.jsonProperties.materialAssets.renderMaterial.Map[mapName] = sourceMap;\r\n continue;\r\n }\r\n if (!Id64.isValid(sourceMap.TextureId) || sourceMap.TextureId === undefined)\r\n continue;\r\n targetProps.jsonProperties.materialAssets.renderMaterial.Map[mapName].TextureId = context.findTargetElementId(sourceMap.TextureId ?? Id64.invalid);\r\n }\r\n }\r\n}\r\n\r\n/** @public */\r\nexport namespace RenderMaterialElement { // eslint-disable-line no-redeclare\r\n /** Parameters used to construct a [[RenderMaterial]].\r\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\r\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\r\n * @deprecated in 3.6 because it is not useful to use a `class` - just use [[RenderMaterialElementParams]] directly instead.\r\n */\r\n export class Params {\r\n /** A required palette name that categorizes this RenderMaterial */\r\n public paletteName: string;\r\n /** An optional description of this RenderMaterial */\r\n public description?: string;\r\n /** If defined, the color to use for surface fill or diffuse illumination, overriding the surface's own color. */\r\n public color?: RgbFactorProps;\r\n /** The color to use for specular illumination. Default: black. */\r\n public specularColor?: RgbFactorProps;\r\n /** The specular exponent describing the surface's shininess, in the range 0 through 128.\r\n * Default: 0.\r\n */\r\n public finish?: number;\r\n /** A transparency to be applied to the surface, ranging from 0 (fully opaque) to 1 (fully transparent).\r\n * The surface's own transparency will be multiplied by `(1 - transmit)`. permitting the material to increase but not decrease the surface transparency.\r\n * Default: 13.5.\r\n */\r\n public transmit?: number;\r\n /** The surface's diffuse reflectivity from 0.0 to 1.0. Default: 0.6. */\r\n public diffuse?: number;\r\n /** The surface's specular reflectivity from 0.0 to 1.0. Default: 0.0. */\r\n public specular?: number;\r\n /** Currently unused. */\r\n public reflect?: number;\r\n /** Currently unused. */\r\n public reflectColor?: number[];\r\n /** Specifies a texture image to map onto the surface, replacing or mixing with the surface's own color and transparency.\r\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\r\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\r\n */\r\n public patternMap?: TextureMapProps;\r\n /** Specifies a [normal map](https://en.wikipedia.org/wiki/Normal_mapping) to apply to the surface to simulate more surface detail than is present in the\r\n * surface's geometry.\r\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\r\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\r\n */\r\n public normalMap?: NormalMapProps & {\r\n /** A factor by which to multiply the components of the normal vectors read from the texture.\r\n * Default: 1.\r\n */\r\n scale?: number;\r\n };\r\n\r\n /** Construct a new RenderMaterial.Params object with the specified paletteName. Alter the public members on that object to specify settings. */\r\n public constructor(paletteName: string) {\r\n this.paletteName = paletteName;\r\n }\r\n }\r\n}\r\n\r\n/** Parameters used to create a [[RenderMaterial]] element.\r\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\r\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\r\n * @public\r\n */\r\nexport interface RenderMaterialElementParams extends RenderMaterialElement.Params { // eslint-disable-line deprecation/deprecation, @typescript-eslint/no-empty-interface\r\n}\r\n"]}
@@ -23,7 +23,7 @@ export interface ProduceTextAnnotationGeometryArgs {
23
23
  /** @internal chiefly for tests */
24
24
  findFontId?: FindFontId;
25
25
  }
26
- /** Produce a geometric representation of a text annotation.
26
+ /** Produce a geometric representation of a text annotation, with the annotation's anchor point at the origin.
27
27
  * The result can be supplied to [GeometryStreamBuilder.appendTextBlock]($common).
28
28
  * @see [[TextAnnotation2d.setAnnotation]] and [[TextAnnotation3d.setAnnotation]] to update the annotation, geometry, and placement of an annotation element.
29
29
  * @beta
@@ -1 +1 @@
1
- {"version":3,"file":"TextAnnotationGeometry.d.ts","sourceRoot":"","sources":["../../src/TextAnnotationGeometry.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAY,cAAc,EAAE,sBAAsB,EAA2D,MAAM,oBAAoB,CAAC;AAC/I,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAE,aAAa,EAA+C,MAAM,wBAAwB,CAAC;AAG5I,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA8JtC;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD,yDAAyD;IACzD,UAAU,EAAE,cAAc,CAAC;IAC3B,6DAA6D;IAC7D,MAAM,EAAE,QAAQ,CAAC;IACjB;;OAEG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,0BAA0B,CAAC;IAC9C,kCAAkC;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kCAAkC;IAClC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,iCAAiC,GAAG,sBAAsB,CAW7G"}
1
+ {"version":3,"file":"TextAnnotationGeometry.d.ts","sourceRoot":"","sources":["../../src/TextAnnotationGeometry.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAY,cAAc,EAAE,sBAAsB,EAA2D,MAAM,oBAAoB,CAAC;AAC/I,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAE,aAAa,EAA+C,MAAM,wBAAwB,CAAC;AAG5I,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmKtC;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD,yDAAyD;IACzD,UAAU,EAAE,cAAc,CAAC;IAC3B,6DAA6D;IAC7D,MAAM,EAAE,QAAQ,CAAC;IACjB;;OAEG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,0BAA0B,CAAC;IAC9C,kCAAkC;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kCAAkC;IAClC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,iCAAiC,GAAG,sBAAsB,CAW7G"}
@@ -120,22 +120,26 @@ function produceTextBlockGeometry(layout, documentTransform, debugAnchorPt) {
120
120
  context.entries.push({
121
121
  color: core_common_1.ColorDef.red.toJSON(),
122
122
  });
123
+ const lx = layout.range.low.x - debugAnchorPt.x;
124
+ const ly = layout.range.low.y - debugAnchorPt.y;
125
+ const hx = layout.range.high.x - debugAnchorPt.x;
126
+ const hy = layout.range.high.y - debugAnchorPt.y;
123
127
  context.entries.push({
124
128
  separator: {
125
- startPoint: [layout.range.low.x, debugAnchorPt.y, 0],
126
- endPoint: [layout.range.high.x, debugAnchorPt.y, 0],
129
+ startPoint: [lx, 0, 0],
130
+ endPoint: [hx, 0, 0],
127
131
  },
128
132
  });
129
133
  context.entries.push({
130
134
  separator: {
131
- startPoint: [debugAnchorPt.x, layout.range.low.y, 0],
132
- endPoint: [debugAnchorPt.x, layout.range.high.y, 0],
135
+ startPoint: [0, ly, 0],
136
+ endPoint: [0, hy, 0],
133
137
  },
134
138
  });
135
139
  }
136
140
  return { entries: context.entries };
137
141
  }
138
- /** Produce a geometric representation of a text annotation.
142
+ /** Produce a geometric representation of a text annotation, with the annotation's anchor point at the origin.
139
143
  * The result can be supplied to [GeometryStreamBuilder.appendTextBlock]($common).
140
144
  * @see [[TextAnnotation2d.setAnnotation]] and [[TextAnnotation3d.setAnnotation]] to update the annotation, geometry, and placement of an annotation element.
141
145
  * @beta
@@ -1 +1 @@
1
- {"version":3,"file":"TextAnnotationGeometry.js","sourceRoot":"","sources":["../../src/TextAnnotationGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module ElementGeometry\r\n */\r\n\r\nimport { ColorDef, TextAnnotation, TextBlockGeometryProps, TextBlockGeometryPropsEntry, TextString, TextStyleColor } from \"@itwin/core-common\";\r\nimport { ComputeRangesForTextLayout, FindFontId, FindTextStyle, layoutTextBlock, RunLayout, TextBlockLayout } from \"./TextAnnotationLayout\";\r\nimport { LineSegment3d, Point3d, Range2d, Transform, Vector2d } from \"@itwin/core-geometry\";\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { IModelDb } from \"./IModelDb\";\r\n\r\ninterface GeometryContext {\r\n curColor?: TextStyleColor;\r\n entries: TextBlockGeometryPropsEntry[];\r\n}\r\n\r\nfunction setColor(color: TextStyleColor, context: GeometryContext): void {\r\n if (color !== context.curColor) {\r\n context.curColor = color;\r\n context.entries.push({ color });\r\n }\r\n}\r\n\r\nfunction createTextString(text: string, run: RunLayout, origin?: Point3d): TextString {\r\n assert(text.length > 0);\r\n\r\n const { lineHeight, widthFactor, isBold, isItalic, isUnderlined } = run.style;\r\n\r\n return new TextString({\r\n text,\r\n font: run.fontId,\r\n height: lineHeight,\r\n widthFactor,\r\n bold: isBold,\r\n italic: isItalic,\r\n underline: isUnderlined,\r\n origin,\r\n });\r\n}\r\n\r\nfunction processTextRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\r\n assert(run.source.type === \"text\");\r\n const text = run.source.content.substring(run.charOffset, run.charOffset + run.numChars);\r\n if (text.length === 0) {\r\n return;\r\n }\r\n\r\n const ts = createTextString(text, run);\r\n if (\"none\" !== run.source.baselineShift) {\r\n const isSub = \"subscript\" === run.source.baselineShift;\r\n const offsetFactor = run.style[isSub ? \"subScriptOffsetFactor\" : \"superScriptOffsetFactor\"];\r\n const scale = run.style[isSub ? \"subScriptScale\" : \"superScriptScale\"];\r\n\r\n ts.origin.y += offsetFactor * ts.height;\r\n ts.height *= scale;\r\n }\r\n\r\n ts.transformInPlace(transform);\r\n\r\n setColor(run.style.color, context);\r\n context.entries.push({ text: ts});\r\n}\r\n\r\nfunction createFractionTextString(text: string, run: RunLayout, origin: Point3d, transform: Transform): TextString {\r\n const ts = createTextString(text, run, origin);\r\n assert(undefined !== ts.widthFactor);\r\n\r\n ts.height *= run.style.stackedFractionScale;\r\n\r\n ts.transformInPlace(transform);\r\n\r\n return ts;\r\n}\r\n\r\nfunction processFractionRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\r\n const source = run.source;\r\n assert(source.type === \"fraction\");\r\n\r\n if (source.numerator.length === 0 && source.denominator.length === 0) {\r\n return;\r\n }\r\n\r\n assert(undefined !== run.numeratorRange && undefined !== run.denominatorRange);\r\n\r\n const fontSize = new Vector2d(run.style.lineHeight * run.style.widthFactor, run.style.lineHeight);\r\n fontSize.scale(run.style.stackedFractionScale, fontSize);\r\n\r\n const numeratorOffset = new Point3d(run.numeratorRange.low.x, run.numeratorRange.low.y, 0);\r\n const denominatorOffset = new Point3d(run.denominatorRange.low.x, run.denominatorRange.low.y, 0);\r\n\r\n setColor(run.style.color, context);\r\n\r\n if (source.numerator.length > 0) {\r\n context.entries.push({ text: createFractionTextString(source.numerator, run, numeratorOffset, transform) });\r\n }\r\n\r\n const numeratorRange = Range2d.fromJSON(run.numeratorRange);\r\n const denominatorRange = Range2d.fromJSON(run.denominatorRange);\r\n\r\n let separator: LineSegment3d;\r\n if (run.style.stackedFractionType === \"horizontal\") {\r\n const fractionWidth = Math.max(numeratorRange.xLength(), denominatorRange.xLength());\r\n const y = 1.25 * denominatorRange.yLength();\r\n separator = LineSegment3d.createXYXY(0, y, fractionWidth, y);\r\n } else {\r\n const p0 = new Point3d(denominatorRange.low.x - fontSize.x / 2, denominatorRange.low.y + fontSize.y * (1 / 3), 0);\r\n const p1 = new Point3d(p0.x + fontSize.x, p0.y + fontSize.y * 1.5, 0);\r\n separator = LineSegment3d.createCapture(p0, p1);\r\n }\r\n\r\n separator.tryTransformInPlace(transform);\r\n\r\n context.entries.push({\r\n separator: {\r\n startPoint: separator.point0Ref.toJSON(),\r\n endPoint: separator.point1Ref.toJSON(),\r\n },\r\n });\r\n\r\n if (source.denominator.length > 0) {\r\n context.entries.push({ text: createFractionTextString(source.denominator, run,denominatorOffset, transform) });\r\n }\r\n}\r\n\r\nfunction produceTextBlockGeometry(layout: TextBlockLayout, documentTransform: Transform, debugAnchorPt?: Point3d): TextBlockGeometryProps {\r\n const context: GeometryContext = { entries: [] };\r\n for (const line of layout.lines) {\r\n const lineTrans = Transform.createTranslationXYZ(line.offsetFromDocument.x, line.offsetFromDocument.y, 0);\r\n for (const run of line.runs) {\r\n if (\"linebreak\" === run.source.type) {\r\n continue;\r\n }\r\n\r\n const runTrans = Transform.createTranslationXYZ(run.offsetFromLine.x, run.offsetFromLine.y, 0);\r\n lineTrans.multiplyTransformTransform(runTrans, runTrans);\r\n documentTransform.multiplyTransformTransform(runTrans, runTrans);\r\n if (\"text\" === run.source.type) {\r\n processTextRun(run, runTrans, context);\r\n } else {\r\n processFractionRun(run, runTrans, context);\r\n }\r\n }\r\n }\r\n\r\n if (debugAnchorPt) {\r\n // Draw lines representing the horizontal and vertical ranges, intersecting at the anchor point.\r\n context.entries.push({\r\n color: ColorDef.red.toJSON(),\r\n });\r\n\r\n context.entries.push({\r\n separator: {\r\n startPoint: [layout.range.low.x, debugAnchorPt.y, 0],\r\n endPoint: [layout.range.high.x, debugAnchorPt.y, 0],\r\n },\r\n });\r\n context.entries.push({\r\n separator: {\r\n startPoint: [debugAnchorPt.x, layout.range.low.y, 0],\r\n endPoint: [debugAnchorPt.x, layout.range.high.y, 0],\r\n },\r\n });\r\n }\r\n\r\n return { entries: context.entries };\r\n}\r\n\r\n/** Arguments supplied to [[produceTextAnnotationGeometry]].\r\n * @beta\r\n */\r\nexport interface ProduceTextAnnotationGeometryArgs {\r\n /** The annotation from which to produce the geometry. */\r\n annotation: TextAnnotation;\r\n /** The iModel from which to obtain fonts and text styles. */\r\n iModel: IModelDb;\r\n /** For debugging purposes only, whether to include geometry representing the bounding box and anchor point of the annotation.\r\n * If true, two red lines indicating the horizontal and vertical extents of the bounding box will be included, intersecting at the anchor point.\r\n */\r\n debugAnchorPointAndRange?: boolean;\r\n /** @internal chiefly for tests */\r\n computeTextRange?: ComputeRangesForTextLayout;\r\n /** @internal chiefly for tests */\r\n findTextStyle?: FindTextStyle;\r\n /** @internal chiefly for tests */\r\n findFontId?: FindFontId;\r\n}\r\n\r\n/** Produce a geometric representation of a text annotation.\r\n * The result can be supplied to [GeometryStreamBuilder.appendTextBlock]($common).\r\n * @see [[TextAnnotation2d.setAnnotation]] and [[TextAnnotation3d.setAnnotation]] to update the annotation, geometry, and placement of an annotation element.\r\n * @beta\r\n */\r\nexport function produceTextAnnotationGeometry(args: ProduceTextAnnotationGeometryArgs): TextBlockGeometryProps {\r\n const layout = layoutTextBlock({\r\n ...args,\r\n textBlock: args.annotation.textBlock,\r\n });\r\n\r\n const dimensions = layout.range;\r\n const transform = args.annotation.computeTransform(dimensions);\r\n\r\n const anchorPoint = args.debugAnchorPointAndRange ? args.annotation.computeAnchorPoint(dimensions) : undefined;\r\n return produceTextBlockGeometry(layout, transform, anchorPoint);\r\n}\r\n"]}
1
+ {"version":3,"file":"TextAnnotationGeometry.js","sourceRoot":"","sources":["../../src/TextAnnotationGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module ElementGeometry\r\n */\r\n\r\nimport { ColorDef, TextAnnotation, TextBlockGeometryProps, TextBlockGeometryPropsEntry, TextString, TextStyleColor } from \"@itwin/core-common\";\r\nimport { ComputeRangesForTextLayout, FindFontId, FindTextStyle, layoutTextBlock, RunLayout, TextBlockLayout } from \"./TextAnnotationLayout\";\r\nimport { LineSegment3d, Point3d, Range2d, Transform, Vector2d } from \"@itwin/core-geometry\";\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { IModelDb } from \"./IModelDb\";\r\n\r\ninterface GeometryContext {\r\n curColor?: TextStyleColor;\r\n entries: TextBlockGeometryPropsEntry[];\r\n}\r\n\r\nfunction setColor(color: TextStyleColor, context: GeometryContext): void {\r\n if (color !== context.curColor) {\r\n context.curColor = color;\r\n context.entries.push({ color });\r\n }\r\n}\r\n\r\nfunction createTextString(text: string, run: RunLayout, origin?: Point3d): TextString {\r\n assert(text.length > 0);\r\n\r\n const { lineHeight, widthFactor, isBold, isItalic, isUnderlined } = run.style;\r\n\r\n return new TextString({\r\n text,\r\n font: run.fontId,\r\n height: lineHeight,\r\n widthFactor,\r\n bold: isBold,\r\n italic: isItalic,\r\n underline: isUnderlined,\r\n origin,\r\n });\r\n}\r\n\r\nfunction processTextRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\r\n assert(run.source.type === \"text\");\r\n const text = run.source.content.substring(run.charOffset, run.charOffset + run.numChars);\r\n if (text.length === 0) {\r\n return;\r\n }\r\n\r\n const ts = createTextString(text, run);\r\n if (\"none\" !== run.source.baselineShift) {\r\n const isSub = \"subscript\" === run.source.baselineShift;\r\n const offsetFactor = run.style[isSub ? \"subScriptOffsetFactor\" : \"superScriptOffsetFactor\"];\r\n const scale = run.style[isSub ? \"subScriptScale\" : \"superScriptScale\"];\r\n\r\n ts.origin.y += offsetFactor * ts.height;\r\n ts.height *= scale;\r\n }\r\n\r\n ts.transformInPlace(transform);\r\n\r\n setColor(run.style.color, context);\r\n context.entries.push({ text: ts});\r\n}\r\n\r\nfunction createFractionTextString(text: string, run: RunLayout, origin: Point3d, transform: Transform): TextString {\r\n const ts = createTextString(text, run, origin);\r\n assert(undefined !== ts.widthFactor);\r\n\r\n ts.height *= run.style.stackedFractionScale;\r\n\r\n ts.transformInPlace(transform);\r\n\r\n return ts;\r\n}\r\n\r\nfunction processFractionRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\r\n const source = run.source;\r\n assert(source.type === \"fraction\");\r\n\r\n if (source.numerator.length === 0 && source.denominator.length === 0) {\r\n return;\r\n }\r\n\r\n assert(undefined !== run.numeratorRange && undefined !== run.denominatorRange);\r\n\r\n const fontSize = new Vector2d(run.style.lineHeight * run.style.widthFactor, run.style.lineHeight);\r\n fontSize.scale(run.style.stackedFractionScale, fontSize);\r\n\r\n const numeratorOffset = new Point3d(run.numeratorRange.low.x, run.numeratorRange.low.y, 0);\r\n const denominatorOffset = new Point3d(run.denominatorRange.low.x, run.denominatorRange.low.y, 0);\r\n\r\n setColor(run.style.color, context);\r\n\r\n if (source.numerator.length > 0) {\r\n context.entries.push({ text: createFractionTextString(source.numerator, run, numeratorOffset, transform) });\r\n }\r\n\r\n const numeratorRange = Range2d.fromJSON(run.numeratorRange);\r\n const denominatorRange = Range2d.fromJSON(run.denominatorRange);\r\n\r\n let separator: LineSegment3d;\r\n if (run.style.stackedFractionType === \"horizontal\") {\r\n const fractionWidth = Math.max(numeratorRange.xLength(), denominatorRange.xLength());\r\n const y = 1.25 * denominatorRange.yLength();\r\n separator = LineSegment3d.createXYXY(0, y, fractionWidth, y);\r\n } else {\r\n const p0 = new Point3d(denominatorRange.low.x - fontSize.x / 2, denominatorRange.low.y + fontSize.y * (1 / 3), 0);\r\n const p1 = new Point3d(p0.x + fontSize.x, p0.y + fontSize.y * 1.5, 0);\r\n separator = LineSegment3d.createCapture(p0, p1);\r\n }\r\n\r\n separator.tryTransformInPlace(transform);\r\n\r\n context.entries.push({\r\n separator: {\r\n startPoint: separator.point0Ref.toJSON(),\r\n endPoint: separator.point1Ref.toJSON(),\r\n },\r\n });\r\n\r\n if (source.denominator.length > 0) {\r\n context.entries.push({ text: createFractionTextString(source.denominator, run,denominatorOffset, transform) });\r\n }\r\n}\r\n\r\nfunction produceTextBlockGeometry(layout: TextBlockLayout, documentTransform: Transform, debugAnchorPt?: Point3d): TextBlockGeometryProps {\r\n const context: GeometryContext = { entries: [] };\r\n for (const line of layout.lines) {\r\n const lineTrans = Transform.createTranslationXYZ(line.offsetFromDocument.x, line.offsetFromDocument.y, 0);\r\n for (const run of line.runs) {\r\n if (\"linebreak\" === run.source.type) {\r\n continue;\r\n }\r\n\r\n const runTrans = Transform.createTranslationXYZ(run.offsetFromLine.x, run.offsetFromLine.y, 0);\r\n lineTrans.multiplyTransformTransform(runTrans, runTrans);\r\n documentTransform.multiplyTransformTransform(runTrans, runTrans);\r\n if (\"text\" === run.source.type) {\r\n processTextRun(run, runTrans, context);\r\n } else {\r\n processFractionRun(run, runTrans, context);\r\n }\r\n }\r\n }\r\n\r\n if (debugAnchorPt) {\r\n // Draw lines representing the horizontal and vertical ranges, intersecting at the anchor point.\r\n context.entries.push({\r\n color: ColorDef.red.toJSON(),\r\n });\r\n\r\n const lx = layout.range.low.x - debugAnchorPt.x;\r\n const ly = layout.range.low.y - debugAnchorPt.y;\r\n const hx = layout.range.high.x - debugAnchorPt.x;\r\n const hy = layout.range.high.y - debugAnchorPt.y;\r\n\r\n context.entries.push({\r\n separator: {\r\n startPoint: [lx, 0, 0],\r\n endPoint: [hx, 0, 0],\r\n },\r\n });\r\n context.entries.push({\r\n separator: {\r\n startPoint: [0, ly, 0],\r\n endPoint: [0, hy, 0],\r\n },\r\n });\r\n }\r\n\r\n return { entries: context.entries };\r\n}\r\n\r\n/** Arguments supplied to [[produceTextAnnotationGeometry]].\r\n * @beta\r\n */\r\nexport interface ProduceTextAnnotationGeometryArgs {\r\n /** The annotation from which to produce the geometry. */\r\n annotation: TextAnnotation;\r\n /** The iModel from which to obtain fonts and text styles. */\r\n iModel: IModelDb;\r\n /** For debugging purposes only, whether to include geometry representing the bounding box and anchor point of the annotation.\r\n * If true, two red lines indicating the horizontal and vertical extents of the bounding box will be included, intersecting at the anchor point.\r\n */\r\n debugAnchorPointAndRange?: boolean;\r\n /** @internal chiefly for tests */\r\n computeTextRange?: ComputeRangesForTextLayout;\r\n /** @internal chiefly for tests */\r\n findTextStyle?: FindTextStyle;\r\n /** @internal chiefly for tests */\r\n findFontId?: FindFontId;\r\n}\r\n\r\n/** Produce a geometric representation of a text annotation, with the annotation's anchor point at the origin.\r\n * The result can be supplied to [GeometryStreamBuilder.appendTextBlock]($common).\r\n * @see [[TextAnnotation2d.setAnnotation]] and [[TextAnnotation3d.setAnnotation]] to update the annotation, geometry, and placement of an annotation element.\r\n * @beta\r\n */\r\nexport function produceTextAnnotationGeometry(args: ProduceTextAnnotationGeometryArgs): TextBlockGeometryProps {\r\n const layout = layoutTextBlock({\r\n ...args,\r\n textBlock: args.annotation.textBlock,\r\n });\r\n\r\n const dimensions = layout.range;\r\n const transform = args.annotation.computeTransform(dimensions);\r\n\r\n const anchorPoint = args.debugAnchorPointAndRange ? args.annotation.computeAnchorPoint(dimensions) : undefined;\r\n return produceTextBlockGeometry(layout, transform, anchorPoint);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TextAnnotationLayout.d.ts","sourceRoot":"","sources":["../../src/TextAnnotationLayout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TextAnnotationLayout.d.ts","sourceRoot":"","sources":["../../src/TextAnnotationLayout.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ exports.TextBlockLayout = exports.LineLayout = exports.RunLayout = exports.compu
11
11
  const core_common_1 = require("@itwin/core-common");
12
12
  const core_geometry_1 = require("@itwin/core-geometry");
13
13
  const core_bentley_1 = require("@itwin/core-bentley");
14
+ const LineBreaker = require("linebreak");
14
15
  /**
15
16
  * Lays out the contents of a TextBlock into a series of lines containing runs.
16
17
  * Each paragraph is decomposed into a series of lines.
@@ -147,6 +148,22 @@ class LayoutContext {
147
148
  return { layout, numerator, denominator };
148
149
  }
149
150
  }
151
+ function split(source) {
152
+ if (source.length === 0) {
153
+ return [];
154
+ }
155
+ let index = 0;
156
+ const segments = [];
157
+ const breaker = new LineBreaker(source);
158
+ for (let brk = breaker.nextBreak(); brk; brk = breaker.nextBreak()) {
159
+ segments.push({
160
+ segment: source.slice(index, brk.position),
161
+ index,
162
+ });
163
+ index = brk.position;
164
+ }
165
+ return segments;
166
+ }
150
167
  /** @internal */
151
168
  class RunLayout {
152
169
  constructor(props) {
@@ -215,12 +232,8 @@ class RunLayout {
215
232
  if (!this.canWrap() || this.charOffset > 0) {
216
233
  return [this];
217
234
  }
218
- const segmenter = new global.Intl.Segmenter(undefined, { granularity: "word" });
219
235
  const myText = this.source.content.substring(this.charOffset, this.charOffset + this.numChars);
220
- if (myText.length === 0) {
221
- return [];
222
- }
223
- const segments = Array.from(segmenter.segment(myText));
236
+ const segments = split(myText);
224
237
  if (segments.length <= 1) {
225
238
  return [this];
226
239
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TextAnnotationLayout.js","sourceRoot":"","sources":["../../src/TextAnnotationLayout.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module ElementGeometry\r\n */\r\n\r\nimport { BaselineShift, FontId, FractionRun, LineLayoutResult, Paragraph, Run, RunLayoutResult, TextBlock, TextBlockLayoutResult, TextRun, TextStyleSettings, TextStyleSettingsProps } from \"@itwin/core-common\";\r\nimport { Range2d } from \"@itwin/core-geometry\";\r\nimport { IModelDb } from \"./IModelDb\";\r\nimport { assert, NonFunctionPropertiesOf } from \"@itwin/core-bentley\";\r\n\r\n/** @internal */\r\nexport interface TextLayoutRanges {\r\n layout: Range2d;\r\n justification: Range2d;\r\n}\r\n\r\n/** Arguments to [[ComputeRangesForTextLayout]].\r\n * @internal\r\n */\r\nexport interface ComputeRangesForTextLayoutArgs {\r\n chars: string;\r\n bold: boolean;\r\n italic: boolean;\r\n baselineShift: BaselineShift;\r\n fontId: FontId;\r\n widthFactor: number;\r\n lineHeight: number;\r\n}\r\n\r\n/** A function that uses a font to compute the layout and justification ranges of a string of text.\r\n * @internal\r\n */\r\nexport type ComputeRangesForTextLayout = (args: ComputeRangesForTextLayoutArgs) => TextLayoutRanges;\r\n\r\n/** @internal */\r\nexport type FindFontId = (name: string) => FontId;\r\n\r\n/** @internal */\r\nexport type FindTextStyle = (name: string) => TextStyleSettings;\r\n\r\n/**\r\n * Arguments supplied to [[computeLayoutTextBlockResult]].\r\n * @beta\r\n */\r\nexport interface LayoutTextBlockArgs {\r\n /** The text block whose extents are to be computed. */\r\n textBlock: TextBlock;\r\n /** The iModel from which to obtain fonts and [TextStyle]($common)s when laying out glyphs. */\r\n iModel: IModelDb;\r\n /** @internal chiefly for tests, by default uses IModelJsNative.DgnDb.computeRangesForText. */\r\n computeTextRange?: ComputeRangesForTextLayout;\r\n /** @internal chiefly for tests, by default looks up styles from a workspace. */\r\n findTextStyle?: FindTextStyle;\r\n /** @internal chiefly for tests, by default uses IModelDb.fontMap. */\r\n findFontId?: FindFontId;\r\n}\r\n\r\n/**\r\n * Lays out the contents of a TextBlock into a series of lines containing runs.\r\n * Each paragraph is decomposed into a series of lines.\r\n * Each series of consecutive non-linebreak runs within a paragraph is concatenated into one line.\r\n * If the document specifies a width > 0, individual lines are split to try to avoid exceeding that width.\r\n * Individual TextRuns can be split onto multiple lines at word boundaries if necessary. Individual FractionRuns are never split.\r\n * @see [[computeLayoutTextBlockResult]]\r\n * @internal\r\n */\r\nexport function layoutTextBlock(args: LayoutTextBlockArgs): TextBlockLayout {\r\n const findFontId = args.findFontId ?? ((name) => args.iModel.fontMap.getFont(name)?.id ?? 0);\r\n const computeTextRange = args.computeTextRange ?? ((x) => args.iModel.computeRangesForText(x));\r\n\r\n // ###TODO finding text styles in workspaces.\r\n const findTextStyle = args.findTextStyle ?? (() => TextStyleSettings.fromJSON());\r\n\r\n return new TextBlockLayout(args.textBlock, new LayoutContext(args.textBlock, computeTextRange, findTextStyle, findFontId));\r\n}\r\n\r\n/**\r\n * Gets the result of laying out the the contents of a TextBlock into a series of lines containing runs.\r\n * The visual layout accounts for the [TextStyle]($common)s, fonts, and [TextBlock.width]($common). It applies word-wrapping if needed.\r\n * The layout returned matches the visual layout of the geometry produced by [[produceTextAnnotationGeometry]].\r\n * @beta\r\n */\r\nexport function computeLayoutTextBlockResult(args: LayoutTextBlockArgs): TextBlockLayoutResult {\r\n const layout = layoutTextBlock(args);\r\n return layout.toResult();\r\n}\r\n\r\nfunction scaleRange(range: Range2d, scale: number): void {\r\n range.low.scaleInPlace(scale);\r\n range.high.scaleInPlace(scale);\r\n}\r\n\r\nfunction applyBlockSettings(target: TextStyleSettings, source: TextStyleSettings | TextStyleSettingsProps): TextStyleSettings {\r\n if (source === target) {\r\n return target;\r\n }\r\n\r\n const lineSpacingFactor = source.lineSpacingFactor ?? target.lineSpacingFactor;\r\n const lineHeight = source.lineHeight ?? target.lineHeight;\r\n const widthFactor = source.widthFactor ?? target.widthFactor;\r\n\r\n if (lineSpacingFactor !== target.lineSpacingFactor || lineHeight !== target.lineHeight || widthFactor !== target.widthFactor) {\r\n target = target.clone({ lineSpacingFactor, lineHeight, widthFactor });\r\n }\r\n\r\n return target;\r\n}\r\n\r\nclass LayoutContext {\r\n private readonly _textStyles = new Map<string, TextStyleSettings>();\r\n private readonly _fontIds = new Map<string, FontId>();\r\n public readonly blockSettings: TextStyleSettings;\r\n\r\n public constructor(block: TextBlock, private readonly _computeTextRange: ComputeRangesForTextLayout, private readonly _findTextStyle: FindTextStyle, private readonly _findFontId: FindFontId) {\r\n const settings = this.findTextStyle(block.styleName);\r\n this.blockSettings = applyBlockSettings(settings, block.styleOverrides);\r\n }\r\n\r\n public findFontId(name: string): FontId {\r\n let fontId = this._fontIds.get(name);\r\n if (undefined === fontId) {\r\n this._fontIds.set(name, fontId = this._findFontId(name));\r\n }\r\n\r\n return fontId;\r\n }\r\n\r\n public findTextStyle(name: string): TextStyleSettings {\r\n let style = this._textStyles.get(name);\r\n if (undefined === style) {\r\n this._textStyles.set(name, style = this._findTextStyle(name));\r\n }\r\n\r\n return style;\r\n }\r\n\r\n public createRunSettings(run: Run): TextStyleSettings {\r\n let settings = this.findTextStyle(run.styleName);\r\n if (run.overridesStyle) {\r\n settings = settings.clone(run.styleOverrides);\r\n }\r\n\r\n return applyBlockSettings(settings, this.blockSettings);\r\n }\r\n\r\n public computeRangeForText(chars: string, style: TextStyleSettings, baselineShift: BaselineShift): TextLayoutRanges {\r\n if (chars.length === 0) {\r\n return {\r\n layout: new Range2d(0, 0, 0, style.lineHeight),\r\n justification: new Range2d(),\r\n };\r\n }\r\n\r\n const fontId = this.findFontId(style.fontName);\r\n const { layout, justification } = this._computeTextRange({\r\n chars,\r\n fontId,\r\n baselineShift,\r\n bold: style.isBold,\r\n italic: style.isItalic,\r\n lineHeight: this.blockSettings.lineHeight,\r\n widthFactor: this.blockSettings.widthFactor,\r\n });\r\n\r\n if (\"none\" !== baselineShift) {\r\n const isSub = \"subscript\" === baselineShift;\r\n const scale = isSub ? style.subScriptScale : style.superScriptScale;\r\n const offsetFactor = isSub ? style.subScriptOffsetFactor : style.superScriptOffsetFactor;\r\n const offset = { x: 0, y: style.lineHeight * offsetFactor };\r\n\r\n scaleRange(layout, scale);\r\n layout.cloneTranslated(offset, layout);\r\n\r\n scaleRange(justification, scale);\r\n justification.cloneTranslated(offset, justification);\r\n }\r\n\r\n return { layout, justification };\r\n }\r\n\r\n public computeRangeForTextRun(style: TextStyleSettings, run: TextRun, charOffset: number, numChars: number): TextLayoutRanges {\r\n return this.computeRangeForText(run.content.substring(charOffset, charOffset + numChars), style, run.baselineShift);\r\n }\r\n\r\n public computeRangeForFractionRun(style: TextStyleSettings, source: FractionRun): { layout: Range2d, numerator: Range2d, denominator: Range2d } {\r\n const numerator = this.computeRangeForText(source.numerator, style, \"none\").layout;\r\n scaleRange(numerator, style.stackedFractionScale);\r\n\r\n const denominator = this.computeRangeForText(source.denominator, style, \"none\").layout;\r\n scaleRange(denominator, style.stackedFractionScale);\r\n\r\n const numLen = numerator.xLength();\r\n const denomLen = denominator.xLength();\r\n switch (style.stackedFractionType) {\r\n case \"horizontal\": {\r\n if (numLen > denomLen) {\r\n denominator.cloneTranslated({ x: (numLen - denomLen) / 2, y: 0 }, denominator);\r\n } else {\r\n numerator.cloneTranslated({ x: (denomLen - numLen) / 2, y: 0 }, numerator);\r\n }\r\n\r\n numerator.cloneTranslated({ x: 0, y: 1.5 * denominator.yLength() }, numerator);\r\n break;\r\n }\r\n case \"diagonal\": {\r\n numerator.cloneTranslated({ x: 0, y: denominator.yLength() }, numerator);\r\n denominator.cloneTranslated({ x: numLen, y: 0 }, denominator);\r\n break;\r\n }\r\n }\r\n\r\n const layout = numerator.clone();\r\n layout.extendRange(denominator);\r\n return { layout, numerator, denominator };\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class RunLayout {\r\n public source: Run;\r\n public charOffset: number;\r\n public numChars: number;\r\n public range: Range2d;\r\n public justificationRange?: Range2d;\r\n public denominatorRange?: Range2d;\r\n public numeratorRange?: Range2d;\r\n public offsetFromLine: { x: number, y: number };\r\n public style: TextStyleSettings;\r\n public fontId: FontId;\r\n\r\n private constructor(props: NonFunctionPropertiesOf<RunLayout>) {\r\n this.source = props.source;\r\n this.charOffset = props.charOffset;\r\n this.numChars = props.numChars;\r\n this.range = props.range;\r\n this.justificationRange = props.justificationRange;\r\n this.denominatorRange = props.denominatorRange;\r\n this.numeratorRange = props.numeratorRange;\r\n this.offsetFromLine = props.offsetFromLine;\r\n this.style = props.style;\r\n this.fontId = props.fontId;\r\n }\r\n\r\n public static create(source: Run, context: LayoutContext): RunLayout {\r\n const style = context.createRunSettings(source);\r\n const fontId = context.findFontId(style.fontName);\r\n const charOffset = 0;\r\n const offsetFromLine = { x: 0, y: 0 };\r\n let numChars = 0;\r\n\r\n let range, justificationRange, numeratorRange, denominatorRange;\r\n\r\n switch (source.type) {\r\n case \"text\": {\r\n numChars = source.content.length;\r\n const ranges = context.computeRangeForTextRun(style, source, charOffset, numChars);\r\n range = ranges.layout;\r\n justificationRange = ranges.justification;\r\n break;\r\n }\r\n case \"fraction\": {\r\n numChars = 1;\r\n const ranges = context.computeRangeForFractionRun(style, source);\r\n range = ranges.layout;\r\n numeratorRange = ranges.numerator;\r\n denominatorRange = ranges.denominator;\r\n break;\r\n }\r\n default: {\r\n // We do this so that blank lines space correctly without special casing later.\r\n range = new Range2d(0, 0, 0, style.lineHeight);\r\n break;\r\n }\r\n }\r\n\r\n return new RunLayout({ source, charOffset, numChars, range, justificationRange, denominatorRange, numeratorRange, offsetFromLine, style, fontId });\r\n }\r\n\r\n /** Compute a string representation, primarily for debugging purposes. */\r\n public stringify(): string {\r\n return this.source.type === \"text\" ? this.source.content.substring(this.charOffset, this.charOffset + this.numChars) : this.source.stringify();\r\n }\r\n\r\n public canWrap(): this is { source: TextRun } {\r\n return this.source.type === \"text\";\r\n }\r\n\r\n private cloneForWrap(args: { ranges: TextLayoutRanges, charOffset: number, numChars: number}): RunLayout {\r\n assert(this.canWrap());\r\n\r\n return new RunLayout({\r\n ...this,\r\n charOffset: args.charOffset,\r\n numChars: args.numChars,\r\n range: args.ranges.layout,\r\n justificationRange: args.ranges.justification,\r\n offsetFromLine: { ...this.offsetFromLine },\r\n });\r\n }\r\n\r\n public split(context: LayoutContext): RunLayout[] {\r\n assert(this.charOffset === 0, \"cannot re-split a run\");\r\n if (!this.canWrap() || this.charOffset > 0) {\r\n return [this];\r\n }\r\n\r\n const segmenter = new (global as any).Intl.Segmenter(undefined, { granularity: \"word\" });\r\n const myText = this.source.content.substring(this.charOffset, this.charOffset + this.numChars);\r\n if (myText.length === 0) {\r\n return [];\r\n }\r\n\r\n const segments = Array.from(segmenter.segment(myText));\r\n if (segments.length <= 1) {\r\n return [this];\r\n }\r\n\r\n return segments.map((segment: any) => {\r\n return this.cloneForWrap({\r\n ranges: context.computeRangeForText(segment.segment, this.style, this.source.baselineShift),\r\n charOffset: segment.index,\r\n numChars: segment.segment.length,\r\n });\r\n });\r\n }\r\n\r\n public toResult(paragraph: Paragraph): RunLayoutResult {\r\n const result: RunLayoutResult = {\r\n sourceRunIndex: paragraph.runs.indexOf(this.source),\r\n fontId: this.fontId,\r\n characterOffset: this.charOffset,\r\n characterCount: this.numChars,\r\n range: this.range.toJSON(),\r\n offsetFromLine: this.offsetFromLine,\r\n textStyle: this.style.toJSON(),\r\n };\r\n\r\n if (this.justificationRange) {\r\n result.justificationRange = this.justificationRange.toJSON();\r\n }\r\n\r\n if (this.numeratorRange) {\r\n result.numeratorRange = this.numeratorRange.toJSON();\r\n }\r\n\r\n if (this.denominatorRange) {\r\n result.denominatorRange = this.denominatorRange.toJSON();\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class LineLayout {\r\n public source: Paragraph;\r\n public range = new Range2d(0, 0, 0, 0);\r\n public justificationRange = new Range2d(0, 0, 0, 0);\r\n public offsetFromDocument = { x: 0, y: 0 };\r\n private _runs: RunLayout[] = [];\r\n\r\n public constructor(source: Paragraph) {\r\n this.source = source;\r\n }\r\n\r\n /** Compute a string representation, primarily for debugging purposes. */\r\n public stringify(): string {\r\n const runs = this._runs.map((run) => run.stringify());\r\n return `${runs.join(\"\")}`;\r\n }\r\n\r\n public get runs(): ReadonlyArray<RunLayout> { return this._runs; }\r\n public get isEmpty() { return this._runs.length === 0; }\r\n public get back(): RunLayout {\r\n assert(!this.isEmpty);\r\n return this._runs[this._runs.length - 1];\r\n }\r\n\r\n public append(run: RunLayout): void {\r\n this._runs.push(run);\r\n this.computeRanges();\r\n }\r\n\r\n /** Invoked every time a run is appended,. */\r\n private computeRanges(): void {\r\n this.range.low.setZero();\r\n this.range.high.setZero();\r\n\r\n // Some runs (fractions) are taller than others.\r\n // We want to center each run vertically inside the line.\r\n let lineHeight = 0;\r\n for (const run of this._runs) {\r\n lineHeight = Math.max(lineHeight, run.range.yLength());\r\n }\r\n\r\n for (const run of this._runs) {\r\n const runHeight = run.range.yLength();\r\n const runOffset = { x: this.range.high.x, y: (lineHeight - runHeight) / 2 };\r\n run.offsetFromLine = runOffset;\r\n\r\n const runLayoutRange = run.range.cloneTranslated(runOffset);\r\n this.range.extendRange(runLayoutRange);\r\n\r\n if (\"linebreak\" !== run.source.type) {\r\n const runJustificationRange = run.justificationRange?.cloneTranslated(runOffset);\r\n this.justificationRange.extendRange(runJustificationRange ?? runLayoutRange);\r\n }\r\n }\r\n }\r\n\r\n public toResult(textBlock: TextBlock): LineLayoutResult {\r\n return {\r\n sourceParagraphIndex: textBlock.paragraphs.indexOf(this.source),\r\n runs: this.runs.map((x) => x.toResult(this.source)),\r\n range: this.range.toJSON(),\r\n justificationRange: this.justificationRange.toJSON(),\r\n offsetFromDocument: this.offsetFromDocument,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Describes the layout of a text block as a collection of lines containing runs.\r\n * @internal\r\n */\r\nexport class TextBlockLayout {\r\n public source: TextBlock;\r\n public range = new Range2d();\r\n public lines: LineLayout[] = [];\r\n\r\n public constructor(source: TextBlock, context: LayoutContext) {\r\n this.source = source;\r\n\r\n if (source.width > 0) {\r\n this.range.low.x = 0;\r\n this.range.high.x = source.width;\r\n }\r\n\r\n this.populateLines(context);\r\n this.justifyLines();\r\n }\r\n\r\n public toResult(): TextBlockLayoutResult {\r\n return {\r\n lines: this.lines.map((x) => x.toResult(this.source)),\r\n range: this.range.toJSON(),\r\n };\r\n }\r\n\r\n /** Compute a string representation, primarily for debugging purposes. */\r\n public stringify(): string {\r\n return this.lines.map((line) => line.stringify()).join(\"\\n\");\r\n }\r\n\r\n private get _back(): LineLayout {\r\n assert(this.lines.length > 0);\r\n return this.lines[this.lines.length - 1];\r\n }\r\n\r\n private populateLines(context: LayoutContext): void {\r\n const doc = this.source;\r\n if (doc.paragraphs.length === 0) {\r\n return;\r\n }\r\n\r\n const doWrap = doc.width > 0;\r\n let curLine = new LineLayout(doc.paragraphs[0]);\r\n for (let i = 0; i < doc.paragraphs.length; i++) {\r\n const paragraph = doc.paragraphs[i];\r\n if (i > 0) {\r\n curLine = this.flushLine(context, curLine, paragraph);\r\n }\r\n\r\n let runs = paragraph.runs.map((run) => RunLayout.create(run, context));\r\n if (doWrap) {\r\n runs = runs.map((run) => run.split(context)).flat();\r\n }\r\n\r\n for (const run of runs) {\r\n if (\"linebreak\" === run.source.type) {\r\n curLine.append(run);\r\n curLine = this.flushLine(context, curLine);\r\n continue;\r\n }\r\n\r\n if (!doWrap) {\r\n curLine.append(run);\r\n continue;\r\n }\r\n\r\n const runWidth = run.range.xLength();\r\n const lineWidth = curLine.range.xLength();\r\n if (runWidth + lineWidth <= doc.width) {\r\n curLine.append(run);\r\n continue;\r\n }\r\n\r\n if (curLine.runs.length === 0) {\r\n curLine.append(run);\r\n curLine = this.flushLine(context, curLine);\r\n } else {\r\n curLine = this.flushLine(context, curLine);\r\n curLine.append(run);\r\n }\r\n }\r\n }\r\n\r\n if (curLine.runs.length > 0) {\r\n this.flushLine(context, curLine);\r\n }\r\n }\r\n\r\n private justifyLines(): void {\r\n if (this.lines.length <= 1 || \"left\" === this.source.justification) {\r\n return;\r\n }\r\n\r\n // This is the minimum width of the document's bounding box.\r\n const docWidth = this.source.width;\r\n\r\n let minOffset = Number.MAX_VALUE;\r\n for (const line of this.lines) {\r\n const lineWidth = line.justificationRange.xLength();\r\n\r\n let offset = docWidth - lineWidth;\r\n if (\"center\" === this.source.justification) {\r\n offset = offset / 2;\r\n }\r\n\r\n line.offsetFromDocument.x += offset;\r\n minOffset = Math.min(offset, minOffset);\r\n }\r\n\r\n if (minOffset < 0) {\r\n // Shift left to accomodate lines that exceeded the document's minimum width.\r\n this.range.low.x += minOffset;\r\n this.range.high.x += minOffset;\r\n }\r\n }\r\n\r\n private flushLine(context: LayoutContext, line: LineLayout, nextParagraph?: Paragraph): LineLayout {\r\n nextParagraph = nextParagraph ?? line.source;\r\n\r\n // We want to guarantee that each layout line has at least one run.\r\n if (line.runs.length === 0) {\r\n // If we're empty, there should always be a preceding run, and it should be a line break.\r\n if (this.lines.length === 0 || this._back.runs.length === 0) {\r\n return new LineLayout(nextParagraph);\r\n }\r\n\r\n const prevRun = this._back.back.source;\r\n assert(prevRun.type === \"linebreak\");\r\n if (prevRun.type !== \"linebreak\") {\r\n return new LineLayout(nextParagraph);\r\n }\r\n\r\n line.append(RunLayout.create(prevRun.clone(), context));\r\n }\r\n\r\n // Line origin is its baseline.\r\n const lineOffset = { x: 0, y: -line.range.yLength() };\r\n\r\n // Place it below any existing lines\r\n if (this.lines.length > 0) {\r\n lineOffset.y += this._back.offsetFromDocument.y;\r\n lineOffset.y -= context.blockSettings.lineSpacingFactor * context.blockSettings.lineHeight;\r\n }\r\n\r\n line.offsetFromDocument = lineOffset;\r\n\r\n // Update document range from computed line range and position\r\n this.range.extendRange(line.range.cloneTranslated(lineOffset));\r\n\r\n this.lines.push(line);\r\n return new LineLayout(nextParagraph);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"TextAnnotationLayout.js","sourceRoot":"","sources":["../../src/TextAnnotationLayout.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module ElementGeometry\r\n */\r\n\r\nimport { BaselineShift, FontId, FractionRun, LineLayoutResult, Paragraph, Run, RunLayoutResult, TextBlock, TextBlockLayoutResult, TextRun, TextStyleSettings, TextStyleSettingsProps } from \"@itwin/core-common\";\r\nimport { Range2d } from \"@itwin/core-geometry\";\r\nimport { IModelDb } from \"./IModelDb\";\r\nimport { assert, NonFunctionPropertiesOf } from \"@itwin/core-bentley\";\r\nimport * as LineBreaker from \"linebreak\";\r\n\r\n/** @internal */\r\nexport interface TextLayoutRanges {\r\n layout: Range2d;\r\n justification: Range2d;\r\n}\r\n\r\n/** Arguments to [[ComputeRangesForTextLayout]].\r\n * @internal\r\n */\r\nexport interface ComputeRangesForTextLayoutArgs {\r\n chars: string;\r\n bold: boolean;\r\n italic: boolean;\r\n baselineShift: BaselineShift;\r\n fontId: FontId;\r\n widthFactor: number;\r\n lineHeight: number;\r\n}\r\n\r\n/** A function that uses a font to compute the layout and justification ranges of a string of text.\r\n * @internal\r\n */\r\nexport type ComputeRangesForTextLayout = (args: ComputeRangesForTextLayoutArgs) => TextLayoutRanges;\r\n\r\n/** @internal */\r\nexport type FindFontId = (name: string) => FontId;\r\n\r\n/** @internal */\r\nexport type FindTextStyle = (name: string) => TextStyleSettings;\r\n\r\n/**\r\n * Arguments supplied to [[computeLayoutTextBlockResult]].\r\n * @beta\r\n */\r\nexport interface LayoutTextBlockArgs {\r\n /** The text block whose extents are to be computed. */\r\n textBlock: TextBlock;\r\n /** The iModel from which to obtain fonts and [TextStyle]($common)s when laying out glyphs. */\r\n iModel: IModelDb;\r\n /** @internal chiefly for tests, by default uses IModelJsNative.DgnDb.computeRangesForText. */\r\n computeTextRange?: ComputeRangesForTextLayout;\r\n /** @internal chiefly for tests, by default looks up styles from a workspace. */\r\n findTextStyle?: FindTextStyle;\r\n /** @internal chiefly for tests, by default uses IModelDb.fontMap. */\r\n findFontId?: FindFontId;\r\n}\r\n\r\n/**\r\n * Lays out the contents of a TextBlock into a series of lines containing runs.\r\n * Each paragraph is decomposed into a series of lines.\r\n * Each series of consecutive non-linebreak runs within a paragraph is concatenated into one line.\r\n * If the document specifies a width > 0, individual lines are split to try to avoid exceeding that width.\r\n * Individual TextRuns can be split onto multiple lines at word boundaries if necessary. Individual FractionRuns are never split.\r\n * @see [[computeLayoutTextBlockResult]]\r\n * @internal\r\n */\r\nexport function layoutTextBlock(args: LayoutTextBlockArgs): TextBlockLayout {\r\n const findFontId = args.findFontId ?? ((name) => args.iModel.fontMap.getFont(name)?.id ?? 0);\r\n const computeTextRange = args.computeTextRange ?? ((x) => args.iModel.computeRangesForText(x));\r\n\r\n // ###TODO finding text styles in workspaces.\r\n const findTextStyle = args.findTextStyle ?? (() => TextStyleSettings.fromJSON());\r\n\r\n return new TextBlockLayout(args.textBlock, new LayoutContext(args.textBlock, computeTextRange, findTextStyle, findFontId));\r\n}\r\n\r\n/**\r\n * Gets the result of laying out the the contents of a TextBlock into a series of lines containing runs.\r\n * The visual layout accounts for the [TextStyle]($common)s, fonts, and [TextBlock.width]($common). It applies word-wrapping if needed.\r\n * The layout returned matches the visual layout of the geometry produced by [[produceTextAnnotationGeometry]].\r\n * @beta\r\n */\r\nexport function computeLayoutTextBlockResult(args: LayoutTextBlockArgs): TextBlockLayoutResult {\r\n const layout = layoutTextBlock(args);\r\n return layout.toResult();\r\n}\r\n\r\nfunction scaleRange(range: Range2d, scale: number): void {\r\n range.low.scaleInPlace(scale);\r\n range.high.scaleInPlace(scale);\r\n}\r\n\r\nfunction applyBlockSettings(target: TextStyleSettings, source: TextStyleSettings | TextStyleSettingsProps): TextStyleSettings {\r\n if (source === target) {\r\n return target;\r\n }\r\n\r\n const lineSpacingFactor = source.lineSpacingFactor ?? target.lineSpacingFactor;\r\n const lineHeight = source.lineHeight ?? target.lineHeight;\r\n const widthFactor = source.widthFactor ?? target.widthFactor;\r\n\r\n if (lineSpacingFactor !== target.lineSpacingFactor || lineHeight !== target.lineHeight || widthFactor !== target.widthFactor) {\r\n target = target.clone({ lineSpacingFactor, lineHeight, widthFactor });\r\n }\r\n\r\n return target;\r\n}\r\n\r\nclass LayoutContext {\r\n private readonly _textStyles = new Map<string, TextStyleSettings>();\r\n private readonly _fontIds = new Map<string, FontId>();\r\n public readonly blockSettings: TextStyleSettings;\r\n\r\n public constructor(block: TextBlock, private readonly _computeTextRange: ComputeRangesForTextLayout, private readonly _findTextStyle: FindTextStyle, private readonly _findFontId: FindFontId) {\r\n const settings = this.findTextStyle(block.styleName);\r\n this.blockSettings = applyBlockSettings(settings, block.styleOverrides);\r\n }\r\n\r\n public findFontId(name: string): FontId {\r\n let fontId = this._fontIds.get(name);\r\n if (undefined === fontId) {\r\n this._fontIds.set(name, fontId = this._findFontId(name));\r\n }\r\n\r\n return fontId;\r\n }\r\n\r\n public findTextStyle(name: string): TextStyleSettings {\r\n let style = this._textStyles.get(name);\r\n if (undefined === style) {\r\n this._textStyles.set(name, style = this._findTextStyle(name));\r\n }\r\n\r\n return style;\r\n }\r\n\r\n public createRunSettings(run: Run): TextStyleSettings {\r\n let settings = this.findTextStyle(run.styleName);\r\n if (run.overridesStyle) {\r\n settings = settings.clone(run.styleOverrides);\r\n }\r\n\r\n return applyBlockSettings(settings, this.blockSettings);\r\n }\r\n\r\n public computeRangeForText(chars: string, style: TextStyleSettings, baselineShift: BaselineShift): TextLayoutRanges {\r\n if (chars.length === 0) {\r\n return {\r\n layout: new Range2d(0, 0, 0, style.lineHeight),\r\n justification: new Range2d(),\r\n };\r\n }\r\n\r\n const fontId = this.findFontId(style.fontName);\r\n const { layout, justification } = this._computeTextRange({\r\n chars,\r\n fontId,\r\n baselineShift,\r\n bold: style.isBold,\r\n italic: style.isItalic,\r\n lineHeight: this.blockSettings.lineHeight,\r\n widthFactor: this.blockSettings.widthFactor,\r\n });\r\n\r\n if (\"none\" !== baselineShift) {\r\n const isSub = \"subscript\" === baselineShift;\r\n const scale = isSub ? style.subScriptScale : style.superScriptScale;\r\n const offsetFactor = isSub ? style.subScriptOffsetFactor : style.superScriptOffsetFactor;\r\n const offset = { x: 0, y: style.lineHeight * offsetFactor };\r\n\r\n scaleRange(layout, scale);\r\n layout.cloneTranslated(offset, layout);\r\n\r\n scaleRange(justification, scale);\r\n justification.cloneTranslated(offset, justification);\r\n }\r\n\r\n return { layout, justification };\r\n }\r\n\r\n public computeRangeForTextRun(style: TextStyleSettings, run: TextRun, charOffset: number, numChars: number): TextLayoutRanges {\r\n return this.computeRangeForText(run.content.substring(charOffset, charOffset + numChars), style, run.baselineShift);\r\n }\r\n\r\n public computeRangeForFractionRun(style: TextStyleSettings, source: FractionRun): { layout: Range2d, numerator: Range2d, denominator: Range2d } {\r\n const numerator = this.computeRangeForText(source.numerator, style, \"none\").layout;\r\n scaleRange(numerator, style.stackedFractionScale);\r\n\r\n const denominator = this.computeRangeForText(source.denominator, style, \"none\").layout;\r\n scaleRange(denominator, style.stackedFractionScale);\r\n\r\n const numLen = numerator.xLength();\r\n const denomLen = denominator.xLength();\r\n switch (style.stackedFractionType) {\r\n case \"horizontal\": {\r\n if (numLen > denomLen) {\r\n denominator.cloneTranslated({ x: (numLen - denomLen) / 2, y: 0 }, denominator);\r\n } else {\r\n numerator.cloneTranslated({ x: (denomLen - numLen) / 2, y: 0 }, numerator);\r\n }\r\n\r\n numerator.cloneTranslated({ x: 0, y: 1.5 * denominator.yLength() }, numerator);\r\n break;\r\n }\r\n case \"diagonal\": {\r\n numerator.cloneTranslated({ x: 0, y: denominator.yLength() }, numerator);\r\n denominator.cloneTranslated({ x: numLen, y: 0 }, denominator);\r\n break;\r\n }\r\n }\r\n\r\n const layout = numerator.clone();\r\n layout.extendRange(denominator);\r\n return { layout, numerator, denominator };\r\n }\r\n}\r\n\r\ninterface Segment {\r\n segment: string;\r\n index: number;\r\n}\r\n\r\nfunction split(source: string): Segment[] {\r\n if (source.length === 0) {\r\n return [];\r\n }\r\n\r\n let index = 0;\r\n const segments: Segment[] = [];\r\n const breaker = new LineBreaker(source);\r\n for (let brk = breaker.nextBreak(); brk; brk = breaker.nextBreak()) {\r\n segments.push({\r\n segment: source.slice(index, brk.position),\r\n index,\r\n });\r\n\r\n index = brk.position;\r\n }\r\n\r\n return segments;\r\n}\r\n\r\n/** @internal */\r\nexport class RunLayout {\r\n public source: Run;\r\n public charOffset: number;\r\n public numChars: number;\r\n public range: Range2d;\r\n public justificationRange?: Range2d;\r\n public denominatorRange?: Range2d;\r\n public numeratorRange?: Range2d;\r\n public offsetFromLine: { x: number, y: number };\r\n public style: TextStyleSettings;\r\n public fontId: FontId;\r\n\r\n private constructor(props: NonFunctionPropertiesOf<RunLayout>) {\r\n this.source = props.source;\r\n this.charOffset = props.charOffset;\r\n this.numChars = props.numChars;\r\n this.range = props.range;\r\n this.justificationRange = props.justificationRange;\r\n this.denominatorRange = props.denominatorRange;\r\n this.numeratorRange = props.numeratorRange;\r\n this.offsetFromLine = props.offsetFromLine;\r\n this.style = props.style;\r\n this.fontId = props.fontId;\r\n }\r\n\r\n public static create(source: Run, context: LayoutContext): RunLayout {\r\n const style = context.createRunSettings(source);\r\n const fontId = context.findFontId(style.fontName);\r\n const charOffset = 0;\r\n const offsetFromLine = { x: 0, y: 0 };\r\n let numChars = 0;\r\n\r\n let range, justificationRange, numeratorRange, denominatorRange;\r\n\r\n switch (source.type) {\r\n case \"text\": {\r\n numChars = source.content.length;\r\n const ranges = context.computeRangeForTextRun(style, source, charOffset, numChars);\r\n range = ranges.layout;\r\n justificationRange = ranges.justification;\r\n break;\r\n }\r\n case \"fraction\": {\r\n numChars = 1;\r\n const ranges = context.computeRangeForFractionRun(style, source);\r\n range = ranges.layout;\r\n numeratorRange = ranges.numerator;\r\n denominatorRange = ranges.denominator;\r\n break;\r\n }\r\n default: {\r\n // We do this so that blank lines space correctly without special casing later.\r\n range = new Range2d(0, 0, 0, style.lineHeight);\r\n break;\r\n }\r\n }\r\n\r\n return new RunLayout({ source, charOffset, numChars, range, justificationRange, denominatorRange, numeratorRange, offsetFromLine, style, fontId });\r\n }\r\n\r\n /** Compute a string representation, primarily for debugging purposes. */\r\n public stringify(): string {\r\n return this.source.type === \"text\" ? this.source.content.substring(this.charOffset, this.charOffset + this.numChars) : this.source.stringify();\r\n }\r\n\r\n public canWrap(): this is { source: TextRun } {\r\n return this.source.type === \"text\";\r\n }\r\n\r\n private cloneForWrap(args: { ranges: TextLayoutRanges, charOffset: number, numChars: number}): RunLayout {\r\n assert(this.canWrap());\r\n\r\n return new RunLayout({\r\n ...this,\r\n charOffset: args.charOffset,\r\n numChars: args.numChars,\r\n range: args.ranges.layout,\r\n justificationRange: args.ranges.justification,\r\n offsetFromLine: { ...this.offsetFromLine },\r\n });\r\n }\r\n\r\n public split(context: LayoutContext): RunLayout[] {\r\n assert(this.charOffset === 0, \"cannot re-split a run\");\r\n if (!this.canWrap() || this.charOffset > 0) {\r\n return [this];\r\n }\r\n\r\n const myText = this.source.content.substring(this.charOffset, this.charOffset + this.numChars);\r\n const segments = split(myText);\r\n\r\n if (segments.length <= 1) {\r\n return [this];\r\n }\r\n\r\n return segments.map((segment: any) => {\r\n return this.cloneForWrap({\r\n ranges: context.computeRangeForText(segment.segment, this.style, this.source.baselineShift),\r\n charOffset: segment.index,\r\n numChars: segment.segment.length,\r\n });\r\n });\r\n }\r\n\r\n public toResult(paragraph: Paragraph): RunLayoutResult {\r\n const result: RunLayoutResult = {\r\n sourceRunIndex: paragraph.runs.indexOf(this.source),\r\n fontId: this.fontId,\r\n characterOffset: this.charOffset,\r\n characterCount: this.numChars,\r\n range: this.range.toJSON(),\r\n offsetFromLine: this.offsetFromLine,\r\n textStyle: this.style.toJSON(),\r\n };\r\n\r\n if (this.justificationRange) {\r\n result.justificationRange = this.justificationRange.toJSON();\r\n }\r\n\r\n if (this.numeratorRange) {\r\n result.numeratorRange = this.numeratorRange.toJSON();\r\n }\r\n\r\n if (this.denominatorRange) {\r\n result.denominatorRange = this.denominatorRange.toJSON();\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class LineLayout {\r\n public source: Paragraph;\r\n public range = new Range2d(0, 0, 0, 0);\r\n public justificationRange = new Range2d(0, 0, 0, 0);\r\n public offsetFromDocument = { x: 0, y: 0 };\r\n private _runs: RunLayout[] = [];\r\n\r\n public constructor(source: Paragraph) {\r\n this.source = source;\r\n }\r\n\r\n /** Compute a string representation, primarily for debugging purposes. */\r\n public stringify(): string {\r\n const runs = this._runs.map((run) => run.stringify());\r\n return `${runs.join(\"\")}`;\r\n }\r\n\r\n public get runs(): ReadonlyArray<RunLayout> { return this._runs; }\r\n public get isEmpty() { return this._runs.length === 0; }\r\n public get back(): RunLayout {\r\n assert(!this.isEmpty);\r\n return this._runs[this._runs.length - 1];\r\n }\r\n\r\n public append(run: RunLayout): void {\r\n this._runs.push(run);\r\n this.computeRanges();\r\n }\r\n\r\n /** Invoked every time a run is appended,. */\r\n private computeRanges(): void {\r\n this.range.low.setZero();\r\n this.range.high.setZero();\r\n\r\n // Some runs (fractions) are taller than others.\r\n // We want to center each run vertically inside the line.\r\n let lineHeight = 0;\r\n for (const run of this._runs) {\r\n lineHeight = Math.max(lineHeight, run.range.yLength());\r\n }\r\n\r\n for (const run of this._runs) {\r\n const runHeight = run.range.yLength();\r\n const runOffset = { x: this.range.high.x, y: (lineHeight - runHeight) / 2 };\r\n run.offsetFromLine = runOffset;\r\n\r\n const runLayoutRange = run.range.cloneTranslated(runOffset);\r\n this.range.extendRange(runLayoutRange);\r\n\r\n if (\"linebreak\" !== run.source.type) {\r\n const runJustificationRange = run.justificationRange?.cloneTranslated(runOffset);\r\n this.justificationRange.extendRange(runJustificationRange ?? runLayoutRange);\r\n }\r\n }\r\n }\r\n\r\n public toResult(textBlock: TextBlock): LineLayoutResult {\r\n return {\r\n sourceParagraphIndex: textBlock.paragraphs.indexOf(this.source),\r\n runs: this.runs.map((x) => x.toResult(this.source)),\r\n range: this.range.toJSON(),\r\n justificationRange: this.justificationRange.toJSON(),\r\n offsetFromDocument: this.offsetFromDocument,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Describes the layout of a text block as a collection of lines containing runs.\r\n * @internal\r\n */\r\nexport class TextBlockLayout {\r\n public source: TextBlock;\r\n public range = new Range2d();\r\n public lines: LineLayout[] = [];\r\n\r\n public constructor(source: TextBlock, context: LayoutContext) {\r\n this.source = source;\r\n\r\n if (source.width > 0) {\r\n this.range.low.x = 0;\r\n this.range.high.x = source.width;\r\n }\r\n\r\n this.populateLines(context);\r\n this.justifyLines();\r\n }\r\n\r\n public toResult(): TextBlockLayoutResult {\r\n return {\r\n lines: this.lines.map((x) => x.toResult(this.source)),\r\n range: this.range.toJSON(),\r\n };\r\n }\r\n\r\n /** Compute a string representation, primarily for debugging purposes. */\r\n public stringify(): string {\r\n return this.lines.map((line) => line.stringify()).join(\"\\n\");\r\n }\r\n\r\n private get _back(): LineLayout {\r\n assert(this.lines.length > 0);\r\n return this.lines[this.lines.length - 1];\r\n }\r\n\r\n private populateLines(context: LayoutContext): void {\r\n const doc = this.source;\r\n if (doc.paragraphs.length === 0) {\r\n return;\r\n }\r\n\r\n const doWrap = doc.width > 0;\r\n let curLine = new LineLayout(doc.paragraphs[0]);\r\n for (let i = 0; i < doc.paragraphs.length; i++) {\r\n const paragraph = doc.paragraphs[i];\r\n if (i > 0) {\r\n curLine = this.flushLine(context, curLine, paragraph);\r\n }\r\n\r\n let runs = paragraph.runs.map((run) => RunLayout.create(run, context));\r\n if (doWrap) {\r\n runs = runs.map((run) => run.split(context)).flat();\r\n }\r\n\r\n for (const run of runs) {\r\n if (\"linebreak\" === run.source.type) {\r\n curLine.append(run);\r\n curLine = this.flushLine(context, curLine);\r\n continue;\r\n }\r\n\r\n if (!doWrap) {\r\n curLine.append(run);\r\n continue;\r\n }\r\n\r\n const runWidth = run.range.xLength();\r\n const lineWidth = curLine.range.xLength();\r\n if (runWidth + lineWidth <= doc.width) {\r\n curLine.append(run);\r\n continue;\r\n }\r\n\r\n if (curLine.runs.length === 0) {\r\n curLine.append(run);\r\n curLine = this.flushLine(context, curLine);\r\n } else {\r\n curLine = this.flushLine(context, curLine);\r\n curLine.append(run);\r\n }\r\n }\r\n }\r\n\r\n if (curLine.runs.length > 0) {\r\n this.flushLine(context, curLine);\r\n }\r\n }\r\n\r\n private justifyLines(): void {\r\n if (this.lines.length <= 1 || \"left\" === this.source.justification) {\r\n return;\r\n }\r\n\r\n // This is the minimum width of the document's bounding box.\r\n const docWidth = this.source.width;\r\n\r\n let minOffset = Number.MAX_VALUE;\r\n for (const line of this.lines) {\r\n const lineWidth = line.justificationRange.xLength();\r\n\r\n let offset = docWidth - lineWidth;\r\n if (\"center\" === this.source.justification) {\r\n offset = offset / 2;\r\n }\r\n\r\n line.offsetFromDocument.x += offset;\r\n minOffset = Math.min(offset, minOffset);\r\n }\r\n\r\n if (minOffset < 0) {\r\n // Shift left to accomodate lines that exceeded the document's minimum width.\r\n this.range.low.x += minOffset;\r\n this.range.high.x += minOffset;\r\n }\r\n }\r\n\r\n private flushLine(context: LayoutContext, line: LineLayout, nextParagraph?: Paragraph): LineLayout {\r\n nextParagraph = nextParagraph ?? line.source;\r\n\r\n // We want to guarantee that each layout line has at least one run.\r\n if (line.runs.length === 0) {\r\n // If we're empty, there should always be a preceding run, and it should be a line break.\r\n if (this.lines.length === 0 || this._back.runs.length === 0) {\r\n return new LineLayout(nextParagraph);\r\n }\r\n\r\n const prevRun = this._back.back.source;\r\n assert(prevRun.type === \"linebreak\");\r\n if (prevRun.type !== \"linebreak\") {\r\n return new LineLayout(nextParagraph);\r\n }\r\n\r\n line.append(RunLayout.create(prevRun.clone(), context));\r\n }\r\n\r\n // Line origin is its baseline.\r\n const lineOffset = { x: 0, y: -line.range.yLength() };\r\n\r\n // Place it below any existing lines\r\n if (this.lines.length > 0) {\r\n lineOffset.y += this._back.offsetFromDocument.y;\r\n lineOffset.y -= context.blockSettings.lineSpacingFactor * context.blockSettings.lineHeight;\r\n }\r\n\r\n line.offsetFromDocument = lineOffset;\r\n\r\n // Update document range from computed line range and position\r\n this.range.extendRange(line.range.cloneTranslated(lineOffset));\r\n\r\n this.lines.push(line);\r\n return new LineLayout(nextParagraph);\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-backend",
3
- "version": "4.8.0-dev.4",
3
+ "version": "4.8.0-dev.6",
4
4
  "description": "iTwin.js backend components",
5
5
  "main": "lib/cjs/core-backend.js",
6
6
  "typings": "lib/cjs/core-backend",
@@ -25,9 +25,9 @@
25
25
  "url": "http://www.bentley.com"
26
26
  },
27
27
  "peerDependencies": {
28
- "@itwin/core-bentley": "^4.8.0-dev.4",
29
- "@itwin/core-common": "^4.8.0-dev.4",
30
- "@itwin/core-geometry": "^4.8.0-dev.4",
28
+ "@itwin/core-bentley": "^4.8.0-dev.6",
29
+ "@itwin/core-common": "^4.8.0-dev.6",
30
+ "@itwin/core-geometry": "^4.8.0-dev.6",
31
31
  "@opentelemetry/api": "^1.0.4"
32
32
  },
33
33
  "peerDependenciesMeta": {
@@ -69,16 +69,16 @@
69
69
  "ts-node": "^10.8.2",
70
70
  "typescript": "~5.3.3",
71
71
  "webpack": "^5.76.0",
72
- "@itwin/build-tools": "4.8.0-dev.4",
73
- "@itwin/core-bentley": "4.8.0-dev.4",
74
- "@itwin/core-common": "4.8.0-dev.4",
75
- "@itwin/core-geometry": "4.8.0-dev.4",
76
- "@itwin/core-webpack-tools": "4.8.0-dev.4",
77
- "@itwin/ecsql-common": "4.8.0-dev.4",
78
- "internal-tools": "3.0.0-dev.69"
72
+ "@itwin/ecsql-common": "4.8.0-dev.6",
73
+ "@itwin/core-geometry": "4.8.0-dev.6",
74
+ "@itwin/core-bentley": "4.8.0-dev.6",
75
+ "@itwin/build-tools": "4.8.0-dev.6",
76
+ "@itwin/core-common": "4.8.0-dev.6",
77
+ "internal-tools": "3.0.0-dev.69",
78
+ "@itwin/core-webpack-tools": "4.8.0-dev.6"
79
79
  },
80
80
  "dependencies": {
81
- "@bentley/imodeljs-native": "4.8.0",
81
+ "@bentley/imodeljs-native": "4.8.2",
82
82
  "@itwin/cloud-agnostic-core": "^2.1.0",
83
83
  "@itwin/object-storage-azure": "^2.2.2",
84
84
  "@itwin/object-storage-core": "^2.2.2",
@@ -86,12 +86,13 @@
86
86
  "fs-extra": "^8.1.0",
87
87
  "inversify": "~6.0.1",
88
88
  "json5": "^2.2.3",
89
+ "linebreak": "^1.1.0",
89
90
  "multiparty": "^4.2.1",
90
91
  "reflect-metadata": "^0.1.13",
91
92
  "semver": "^7.3.5",
92
93
  "touch": "^3.1.0",
93
94
  "ws": "^7.5.3",
94
- "@itwin/core-telemetry": "4.8.0-dev.4"
95
+ "@itwin/core-telemetry": "4.8.0-dev.6"
95
96
  },
96
97
  "nyc": {
97
98
  "extends": "./node_modules/@itwin/build-tools/.nycrc"
@@ -100,7 +101,7 @@
100
101
  "build": "npm run -s build:cjs && npm run -s copy:assets && npm run -s copy:test-assets",
101
102
  "build:cjs": "tsc 1>&2 --outDir lib/cjs",
102
103
  "clean": "rimraf lib .rush/temp/package-deps*.json ../../tools/internal/ios/core-test-runner/build ../../tools/internal/lib",
103
- "docs": "betools docs --includes=../../generated-docs/extract --json=../../generated-docs/core/core-backend/file.json --tsIndexFile=./core-backend.ts --onlyJson",
104
+ "docs": "betools docs --includes=../../generated-docs/extract --json=../../generated-docs/core/core-backend/file.json --tsIndexFile=./core-backend.ts --onlyJson --excludeGlob=**/*.d.ts",
104
105
  "copy:assets": "cpx \"./src/assets/**/*\" ./lib/cjs/assets",
105
106
  "copy:config": "internal-tools copy-config",
106
107
  "copy:test-assets": "cpx \"./src/test/assets/**/*\" ./lib/cjs/test/assets",