@itwin/core-backend 5.1.0-dev.31 → 5.1.0-dev.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/BackendHubAccess.js.map +1 -1
  3. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  4. package/lib/cjs/BisCoreSchema.js.map +1 -1
  5. package/lib/cjs/BlobContainerService.js.map +1 -1
  6. package/lib/cjs/BriefcaseManager.js.map +1 -1
  7. package/lib/cjs/CatalogDb.js.map +1 -1
  8. package/lib/cjs/Category.js.map +1 -1
  9. package/lib/cjs/ChangeSummaryManager.js +2 -2
  10. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  11. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  12. package/lib/cjs/ChangesetECAdaptor.js +242 -242
  13. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  14. package/lib/cjs/ChannelControl.js.map +1 -1
  15. package/lib/cjs/CheckpointManager.js.map +1 -1
  16. package/lib/cjs/ClassRegistry.js +5 -5
  17. package/lib/cjs/ClassRegistry.js.map +1 -1
  18. package/lib/cjs/CloudSqlite.js.map +1 -1
  19. package/lib/cjs/CodeService.js.map +1 -1
  20. package/lib/cjs/CodeSpecs.js.map +1 -1
  21. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  22. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  23. package/lib/cjs/DevTools.js.map +1 -1
  24. package/lib/cjs/DisplayStyle.js.map +1 -1
  25. package/lib/cjs/ECDb.js.map +1 -1
  26. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  27. package/lib/cjs/ECSqlStatement.js.map +1 -1
  28. package/lib/cjs/Element.js.map +1 -1
  29. package/lib/cjs/ElementAspect.js.map +1 -1
  30. package/lib/cjs/ElementGraphics.js.map +1 -1
  31. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  32. package/lib/cjs/Entity.js.map +1 -1
  33. package/lib/cjs/EntityReferences.js.map +1 -1
  34. package/lib/cjs/ExportGraphics.js.map +1 -1
  35. package/lib/cjs/ExternalSource.js.map +1 -1
  36. package/lib/cjs/FontFile.js.map +1 -1
  37. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  38. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  39. package/lib/cjs/GeometrySummary.js +47 -47
  40. package/lib/cjs/GeometrySummary.js.map +1 -1
  41. package/lib/cjs/IModelDb.js +8 -8
  42. package/lib/cjs/IModelDb.js.map +1 -1
  43. package/lib/cjs/IModelDbFonts.js.map +1 -1
  44. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  45. package/lib/cjs/IModelHost.js.map +1 -1
  46. package/lib/cjs/IModelJsFs.js.map +1 -1
  47. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  48. package/lib/cjs/IpcHost.js.map +1 -1
  49. package/lib/cjs/LineStyle.js.map +1 -1
  50. package/lib/cjs/LocalHub.js +1 -1
  51. package/lib/cjs/LocalHub.js.map +1 -1
  52. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  53. package/lib/cjs/LockControl.js.map +1 -1
  54. package/lib/cjs/Material.js.map +1 -1
  55. package/lib/cjs/Model.js.map +1 -1
  56. package/lib/cjs/NativeAppStorage.js.map +1 -1
  57. package/lib/cjs/NativeHost.js.map +1 -1
  58. package/lib/cjs/NavigationRelationship.js.map +1 -1
  59. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  60. package/lib/cjs/PropertyStore.js.map +1 -1
  61. package/lib/cjs/Relationship.js.map +1 -1
  62. package/lib/cjs/RpcBackend.js.map +1 -1
  63. package/lib/cjs/SQLiteDb.js.map +1 -1
  64. package/lib/cjs/Schema.js.map +1 -1
  65. package/lib/cjs/SchemaSync.js.map +1 -1
  66. package/lib/cjs/SchemaUtils.js.map +1 -1
  67. package/lib/cjs/SheetIndex.js.map +1 -1
  68. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  69. package/lib/cjs/SqliteStatement.js.map +1 -1
  70. package/lib/cjs/Texture.js.map +1 -1
  71. package/lib/cjs/TileStorage.js.map +1 -1
  72. package/lib/cjs/TxnManager.js.map +1 -1
  73. package/lib/cjs/ViewDefinition.js.map +1 -1
  74. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  75. package/lib/cjs/ViewStore.js.map +1 -1
  76. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  77. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  78. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  79. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  80. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  81. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  82. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  83. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  84. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  85. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  86. package/lib/cjs/core-backend.js.map +1 -1
  87. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  88. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  89. package/lib/cjs/domains/GenericElements.js.map +1 -1
  90. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  91. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  92. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  93. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  94. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  95. package/lib/cjs/internal/HubMock.js.map +1 -1
  96. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  97. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  98. package/lib/cjs/internal/NoLocks.js.map +1 -1
  99. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  100. package/lib/cjs/internal/Symbols.js.map +1 -1
  101. package/lib/cjs/internal/cross-package.js.map +1 -1
  102. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  103. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  104. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  105. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  106. package/lib/cjs/rpc/multipart.js.map +1 -1
  107. package/lib/cjs/rpc/tracing.js.map +1 -1
  108. package/lib/cjs/rpc/web/logging.js.map +1 -1
  109. package/lib/cjs/rpc/web/request.js.map +1 -1
  110. package/lib/cjs/rpc/web/response.js.map +1 -1
  111. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  112. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  113. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  114. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  115. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  116. package/lib/cjs/workspace/Settings.js.map +1 -1
  117. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  118. package/lib/cjs/workspace/Workspace.js.map +1 -1
  119. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  120. package/lib/esm/BackendHubAccess.js.map +1 -1
  121. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  122. package/lib/esm/BisCoreSchema.js.map +1 -1
  123. package/lib/esm/BlobContainerService.js.map +1 -1
  124. package/lib/esm/BriefcaseManager.js.map +1 -1
  125. package/lib/esm/CatalogDb.js.map +1 -1
  126. package/lib/esm/Category.js.map +1 -1
  127. package/lib/esm/ChangeSummaryManager.js +2 -2
  128. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  129. package/lib/esm/ChangedElementsDb.js.map +1 -1
  130. package/lib/esm/ChangesetECAdaptor.js +242 -242
  131. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  132. package/lib/esm/ChannelControl.js.map +1 -1
  133. package/lib/esm/CheckpointManager.js.map +1 -1
  134. package/lib/esm/ClassRegistry.js +5 -5
  135. package/lib/esm/ClassRegistry.js.map +1 -1
  136. package/lib/esm/CloudSqlite.js.map +1 -1
  137. package/lib/esm/CodeService.js.map +1 -1
  138. package/lib/esm/CodeSpecs.js.map +1 -1
  139. package/lib/esm/ConcurrentQuery.js.map +1 -1
  140. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  141. package/lib/esm/DevTools.js.map +1 -1
  142. package/lib/esm/DisplayStyle.js.map +1 -1
  143. package/lib/esm/ECDb.js.map +1 -1
  144. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  145. package/lib/esm/ECSqlStatement.js.map +1 -1
  146. package/lib/esm/Element.js.map +1 -1
  147. package/lib/esm/ElementAspect.js.map +1 -1
  148. package/lib/esm/ElementGraphics.js.map +1 -1
  149. package/lib/esm/ElementTreeWalker.js.map +1 -1
  150. package/lib/esm/Entity.js.map +1 -1
  151. package/lib/esm/EntityReferences.js.map +1 -1
  152. package/lib/esm/ExportGraphics.js.map +1 -1
  153. package/lib/esm/ExternalSource.js.map +1 -1
  154. package/lib/esm/FontFile.js.map +1 -1
  155. package/lib/esm/GeoCoordConfig.js.map +1 -1
  156. package/lib/esm/GeographicCRSServices.js.map +1 -1
  157. package/lib/esm/GeometrySummary.js +47 -47
  158. package/lib/esm/GeometrySummary.js.map +1 -1
  159. package/lib/esm/IModelDb.js +8 -8
  160. package/lib/esm/IModelDb.js.map +1 -1
  161. package/lib/esm/IModelDbFonts.js.map +1 -1
  162. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  163. package/lib/esm/IModelHost.js.map +1 -1
  164. package/lib/esm/IModelJsFs.js.map +1 -1
  165. package/lib/esm/ImageSourceConversion.js.map +1 -1
  166. package/lib/esm/IpcHost.js.map +1 -1
  167. package/lib/esm/LineStyle.js.map +1 -1
  168. package/lib/esm/LocalHub.js +1 -1
  169. package/lib/esm/LocalHub.js.map +1 -1
  170. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  171. package/lib/esm/LockControl.js.map +1 -1
  172. package/lib/esm/Material.js.map +1 -1
  173. package/lib/esm/Model.js.map +1 -1
  174. package/lib/esm/NativeAppStorage.js.map +1 -1
  175. package/lib/esm/NativeHost.js.map +1 -1
  176. package/lib/esm/NavigationRelationship.js.map +1 -1
  177. package/lib/esm/PromiseMemoizer.js.map +1 -1
  178. package/lib/esm/PropertyStore.js.map +1 -1
  179. package/lib/esm/Relationship.js.map +1 -1
  180. package/lib/esm/RpcBackend.js.map +1 -1
  181. package/lib/esm/SQLiteDb.js.map +1 -1
  182. package/lib/esm/Schema.js.map +1 -1
  183. package/lib/esm/SchemaSync.js.map +1 -1
  184. package/lib/esm/SchemaUtils.js.map +1 -1
  185. package/lib/esm/SheetIndex.js.map +1 -1
  186. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  187. package/lib/esm/SqliteStatement.js.map +1 -1
  188. package/lib/esm/Texture.js.map +1 -1
  189. package/lib/esm/TileStorage.js.map +1 -1
  190. package/lib/esm/TxnManager.js.map +1 -1
  191. package/lib/esm/ViewDefinition.js.map +1 -1
  192. package/lib/esm/ViewStateHydrator.js.map +1 -1
  193. package/lib/esm/ViewStore.js.map +1 -1
  194. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  195. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  196. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  197. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  198. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  199. package/lib/esm/core-backend.js.map +1 -1
  200. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  201. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  202. package/lib/esm/domains/GenericElements.js.map +1 -1
  203. package/lib/esm/domains/GenericSchema.js.map +1 -1
  204. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  205. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  206. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  207. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  208. package/lib/esm/internal/HubMock.js.map +1 -1
  209. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  210. package/lib/esm/internal/NativePlatform.js.map +1 -1
  211. package/lib/esm/internal/NoLocks.js.map +1 -1
  212. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  213. package/lib/esm/internal/Symbols.js.map +1 -1
  214. package/lib/esm/internal/cross-package.js.map +1 -1
  215. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  216. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  217. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  218. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  219. package/lib/esm/rpc/multipart.js.map +1 -1
  220. package/lib/esm/rpc/tracing.js.map +1 -1
  221. package/lib/esm/rpc/web/logging.js.map +1 -1
  222. package/lib/esm/rpc/web/request.js.map +1 -1
  223. package/lib/esm/rpc/web/response.js.map +1 -1
  224. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  225. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  226. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  227. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  228. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  229. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  230. package/lib/esm/test/AttachDb.test.js +11 -11
  231. package/lib/esm/test/AttachDb.test.js.map +1 -1
  232. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  233. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  234. package/lib/esm/test/IModelHost.test.js.map +1 -1
  235. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  236. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  237. package/lib/esm/test/IpcHost.test.js.map +1 -1
  238. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  239. package/lib/esm/test/PrintElementTree.js.map +1 -1
  240. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  241. package/lib/esm/test/RevisionUtility.js.map +1 -1
  242. package/lib/esm/test/SchemaUtils.test.js +25 -25
  243. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  244. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  245. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  246. package/lib/esm/test/TestUtils.js.map +1 -1
  247. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  248. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  249. package/lib/esm/test/categories/Category.test.js.map +1 -1
  250. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  251. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  252. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  253. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  254. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  255. package/lib/esm/test/ecdb/ECDb.test.js +57 -57
  256. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  257. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  258. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  259. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  260. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  261. package/lib/esm/test/ecdb/ECSqlQuery.test.js +7 -7
  262. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  263. package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
  264. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  265. package/lib/esm/test/ecdb/ECSqlStatement.test.js +292 -292
  266. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  267. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  268. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  269. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  270. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  271. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  272. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  273. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  274. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  275. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  276. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  277. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  278. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  279. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  280. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  281. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  282. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  283. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  284. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  285. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  286. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  287. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  288. package/lib/esm/test/imageData.js.map +1 -1
  289. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  290. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  291. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  292. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  293. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  294. package/lib/esm/test/index.js.map +1 -1
  295. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  296. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  297. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  298. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  299. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  300. package/lib/esm/test/rpc/response.test.js.map +1 -1
  301. package/lib/esm/test/schema/ClassRegistry.test.js +71 -71
  302. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  303. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  304. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  305. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  306. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  307. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  308. package/lib/esm/test/standalone/ChangesetReader.test.js +28 -28
  309. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  310. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  311. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  312. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  313. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  314. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  315. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  316. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  317. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  318. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  319. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  320. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  321. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  322. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  323. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  324. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  325. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  326. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  327. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  328. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  329. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  330. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  331. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  332. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  333. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  334. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  335. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  336. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  337. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  338. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  339. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  340. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  341. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  342. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  343. package/lib/esm/workspace/Settings.js.map +1 -1
  344. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  345. package/lib/esm/workspace/Workspace.js.map +1 -1
  346. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  347. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"FrameGeometry.js","sourceRoot":"","sources":["../../../src/annotations/FrameGeometry.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\n\r\nimport { BackgroundFill, ColorDef, ElementGeometry, FillDisplay, GeometryParams, TextAnnotationFrameShape, TextFrameStyleProps } from \"@itwin/core-common\";\r\nimport { Angle, AngleSweep, Arc3d, LineString3d, Loop, Path, Point3d, Range2d, Transform, Vector2d } from \"@itwin/core-geometry\";\r\n\r\n/**\r\n * Based on the frame style, this method will construct and append [[GeometryParams]] (for line style) and a [[Loop]] (for the frame shape) to the builder.\r\n * @param builder that will be appended to in place\r\n * @param category to which the frame belongs, used for the [[GeometryParams]].\r\n * @param frame\r\n * @param range to enclose with the frame\r\n * @param transform that transform the range to world coordinates\r\n * @returns `true` if any geometry was appended to the builder\r\n* @beta\r\n */\r\nexport function appendFrameToBuilder(builder: ElementGeometry.Builder, frame: TextFrameStyleProps, range: Range2d, transform: Transform, geomParams: GeometryParams): boolean {\r\n if (undefined === frame.shape || frame.shape === \"none\") {\r\n return false;\r\n }\r\n\r\n const params = geomParams.clone();\r\n\r\n if (frame.fill === undefined) {\r\n params.fillDisplay = FillDisplay.Never;\r\n } else if (frame.fill === \"background\") {\r\n params.backgroundFill = BackgroundFill.Solid;\r\n params.fillDisplay = FillDisplay.Blanking;\r\n } else if (frame.fill !== \"subcategory\") {\r\n params.fillColor = ColorDef.fromJSON(frame.fill);\r\n params.lineColor = params.fillColor;\r\n params.fillDisplay = FillDisplay.Blanking;\r\n }\r\n\r\n if (frame.border !== \"subcategory\") {\r\n params.lineColor = ColorDef.fromJSON(frame.border);\r\n params.weight = frame.borderWeight;\r\n }\r\n\r\n const frameGeometry = computeFrame({ frame: frame.shape, range, transform });\r\n if (!builder.appendGeometryParamsChange(params) || !builder.appendGeometryQuery(frameGeometry)) {\r\n return false;\r\n }\r\n\r\n // The tile generator does not produce an outline for shapes with blanking fill. We must add the outline separately.\r\n if (params.fillDisplay === FillDisplay.Blanking) {\r\n const outlineParams = params.clone();\r\n outlineParams.fillDisplay = FillDisplay.Never;\r\n if (!builder.appendGeometryParamsChange(outlineParams) || !builder.appendGeometryQuery(frameGeometry)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Arguments for the [[computeFrame]] method.\r\n * @beta\r\n */\r\nexport interface ComputeFrameArgs {\r\n /** Frame shape to be calculated */\r\n frame: Exclude<TextAnnotationFrameShape, \"none\">;\r\n /** Range to be enclosed */\r\n range: Range2d;\r\n /** Transform that translates and rotates the range to world coordinates */\r\n transform: Transform;\r\n}\r\n\r\n/**\r\n * Computes the frame geometry based on the provided frame shape and range.\r\n * @returns a [Loop]($geometry) or [Path]($geometry) (if it's just a line) that represents the frame geometry\r\n * @beta\r\n */\r\nexport function computeFrame(args: ComputeFrameArgs): Loop | Path {\r\n switch (args.frame) {\r\n case \"line\": return computeLine(args.range, args.transform);\r\n case \"rectangle\": return computeRectangle(args.range, args.transform);\r\n case \"circle\": return computeCircle(args.range, args.transform);\r\n case \"equilateralTriangle\": return computeTriangle(args.range, args.transform);\r\n case \"diamond\": return computeDiamond(args.range, args.transform);\r\n case \"square\": return computeSquare(args.range, args.transform);\r\n case \"pentagon\": return computePolygon(5, args.range, args.transform, 90);\r\n case \"hexagon\": return computePolygon(6, args.range, args.transform);\r\n case \"octagon\": return computePolygon(8, args.range, args.transform, 180 / 8); // or pi/8 in radians\r\n case \"capsule\": return computeCapsule(args.range, args.transform);\r\n case \"roundedRectangle\": return computeRoundedRectangle(args.range, args.transform);\r\n default: return computeRectangle(args.range, args.transform);\r\n }\r\n}\r\n\r\n/**\r\n * Arguments for the [[computeIntervalPoints]] method.\r\n * @beta\r\n */\r\nexport interface ComputeIntervalPointsArgs extends ComputeFrameArgs {\r\n /** A factor applied to divide each straight edge. A value of 1 will place a single point on each vertex. */\r\n lineIntervalFactor?: number;\r\n /** A factor applied to divide each straight edge. A value of 1 will place a single point on each vertex. */\r\n arcIntervalFactor?: number;\r\n}\r\n\r\n/**\r\n * Computes points along the edges of the frame geometry based on the provided frame shape, range, and interval factors.\r\n * These can be used for snapping or attaching leaders.\r\n * @returns an array of [[Point3d]] that represent the points along the edges of the frame geometry. Returns `undefined` if the loop created by `computeFrame` is empty.\r\n * @beta\r\n */\r\nexport function computeIntervalPoints({ frame, range, transform, lineIntervalFactor = 0.5, arcIntervalFactor = 0.25 }: ComputeIntervalPointsArgs): Point3d[] | undefined {\r\n const points: Point3d[] = [];\r\n const curves = computeFrame({ frame, range, transform }).collectCurvePrimitives(undefined, false, true);\r\n\r\n curves.forEach((curve) => {\r\n const end = curve instanceof Arc3d ? arcIntervalFactor : lineIntervalFactor;\r\n for (let interval = 0; interval <= 1; interval += end) {\r\n points.push(curve.fractionToPoint(interval));\r\n }\r\n });\r\n return points;\r\n}\r\n\r\n/** Line - currently just adds an underline. Once we have leaders, this method may change. */\r\nconst computeLine = (range: Range2d, transform: Transform): Path => {\r\n const points = [Point3d.create(range.low.x, range.low.y), Point3d.create(range.high.x, range.low.y)];\r\n const frame = LineString3d.createPoints(points);\r\n\r\n return Path.create(frame.cloneTransformed(transform));\r\n}\r\n\r\n/** Rectangle - simplest frame */\r\nconst computeRectangle = (range: Range2d, transform: Transform): Loop => {\r\n const points = range.corners3d(true);\r\n const frame = LineString3d.createPoints(points);\r\n\r\n return Loop.create(frame.cloneTransformed(transform));\r\n}\r\n\r\n/** Rounded Rectangle: each corner will be turned into an arc with the radius of the arc being the @param radiusFactor * the height (yLength) of the range */\r\nconst computeRoundedRectangle = (range: Range2d, transform: Transform, radiusFactor: number = 0.25): Loop => {\r\n const radius = range.yLength() * radiusFactor * Math.sqrt(2);\r\n // We're going to circumscribe the range with our rounded edges. The corners of the range will fall on 45 degree angles.\r\n const radiusOffsetFactor = range.yLength() * radiusFactor;\r\n\r\n // These values are the origins of the circles\r\n const inLeft = range.low.x + radiusOffsetFactor;\r\n const inRight = range.high.x - radiusOffsetFactor;\r\n const inBottom = range.low.y + radiusOffsetFactor;\r\n const inTop = range.high.y - radiusOffsetFactor\r\n\r\n // These values exist on the circles\r\n const exLeft = inLeft - radius;\r\n const exRight = inRight + radius;\r\n const exBottom = inBottom - radius;\r\n const exTop = inTop + radius;\r\n\r\n const q1 = AngleSweep.createStartEndDegrees(0, 90);\r\n const q2 = AngleSweep.createStartEndDegrees(90, 180);\r\n const q3 = AngleSweep.createStartEndDegrees(180, 270);\r\n const q4 = AngleSweep.createStartEndDegrees(270, 360);\r\n\r\n\r\n const curves = [\r\n LineString3d.create([Point3d.create(inLeft, exTop), Point3d.create(inRight, exTop)]), // top\r\n Arc3d.createXY(Point3d.create(inLeft, inTop), radius, q2), // top left\r\n LineString3d.create([Point3d.create(exLeft, inBottom), Point3d.create(exLeft, inTop)]), // left\r\n Arc3d.createXY(Point3d.create(inLeft, inBottom), radius, q3), // bottom left\r\n LineString3d.create([Point3d.create(inLeft, exBottom), Point3d.create(inRight, exBottom)]), // bottom\r\n Arc3d.createXY(Point3d.create(inRight, inBottom), radius, q4), // bottom right\r\n LineString3d.create([Point3d.create(exRight, inBottom), Point3d.create(exRight, inTop)]), // right\r\n Arc3d.createXY(Point3d.create(inRight, inTop), radius, q1), // top right\r\n ];\r\n\r\n return Loop.createArray(curves.map((curve) => curve.cloneTransformed(transform)))\r\n}\r\n\r\n\r\n/** Circle */\r\nconst computeCircle = (range: Range2d, transform: Transform): Loop => {\r\n const radius = range.low.distance(range.high) / 2;\r\n const frame = Arc3d.createXY(Point3d.createFrom(range.center), radius);\r\n return Loop.create(frame.cloneTransformed(transform));\r\n}\r\n\r\n/** Equilateral Triangle */\r\nconst computeTriangle = (range: Range2d, transform: Transform): Loop => {\r\n\r\n const xLength = range.xLength();\r\n const yLength = range.yLength();\r\n const center = range.center;\r\n const points: Point3d[] = [];\r\n\r\n const magnitude = (xLength > yLength) ? (xLength * Math.sqrt(3) + yLength) / 2 : (yLength * Math.sqrt(3) + xLength) / 2;\r\n\r\n const v1 = Vector2d.create(0, magnitude);\r\n const vectors = [\r\n v1, // top\r\n v1.rotateXY(Angle.createDegrees(120)), // left\r\n v1.rotateXY(Angle.createDegrees(240)), // right\r\n v1 // top\r\n ];\r\n\r\n vectors.forEach((v) => {\r\n points.push(Point3d.create(center.x + v.x, center.y + v.y));\r\n });\r\n\r\n const frame = LineString3d.createPoints(points);\r\n\r\n return Loop.create(frame.cloneTransformed(transform));\r\n}\r\n\r\n/** Diamond (square rotated 45 degrees) */\r\nconst computeDiamond = (range: Range2d, transform: Transform): Loop => {\r\n const offset = (range.xLength() + range.yLength()) / 2;\r\n const center = range.center;\r\n\r\n const points = [\r\n Point3d.createFrom({ x: center.x, y: center.y + offset }), // top\r\n Point3d.createFrom({ x: center.x + offset, y: center.y }), // right\r\n Point3d.createFrom({ x: center.x, y: center.y - offset }), // bottom\r\n Point3d.createFrom({ x: center.x - offset, y: center.y }), // left\r\n Point3d.createFrom({ x: center.x, y: center.y + offset }), // top\r\n ];\r\n\r\n const frame = LineString3d.createPoints(points);\r\n\r\n return Loop.create(frame.cloneTransformed(transform));\r\n}\r\n\r\n/** Square */\r\nconst computeSquare = (range: Range2d, transform: Transform): Loop => {\r\n\r\n // Extend range\r\n const xLength = range.xLength() / 2;\r\n const yLength = range.yLength() / 2;\r\n const center = range.center;\r\n if (xLength > yLength) {\r\n range.extendPoint({ x: center.x, y: center.y + xLength });\r\n range.extendPoint({ x: center.x, y: center.y - xLength });\r\n } else {\r\n range.extendPoint({ x: center.x + yLength, y: center.y });\r\n range.extendPoint({ x: center.x - yLength, y: center.y });\r\n }\r\n\r\n const points = range.corners3d(true);\r\n const frame = LineString3d.createPoints(points);\r\n\r\n return Loop.create(frame.cloneTransformed(transform));\r\n}\r\n\r\n/** Capsule (or pill shape) */\r\nconst computeCapsule = (range: Range2d, transform: Transform): Loop => {\r\n const height = range.yLength();\r\n const radius = height * (Math.sqrt(2) / 2);\r\n\r\n // We're going to circumscribe the range with our rounded edges. The corners of the range will fall on 45 degree angles.\r\n const radiusOffsetFactor = height / 2;\r\n\r\n // These values are the origins of the circles\r\n const inLeft = range.low.x + radiusOffsetFactor;\r\n const inRight = range.high.x - radiusOffsetFactor;\r\n const inBottom = range.low.y + radiusOffsetFactor;\r\n const inTop = range.high.y - radiusOffsetFactor\r\n\r\n // These values exist on the circles\r\n const exBottom = inBottom - radius;\r\n const exTop = inTop + radius;\r\n\r\n const leftHalfCircle = AngleSweep.createStartEndDegrees(90, 270);\r\n const rightHalfCircle = AngleSweep.createStartEndDegrees(-90, 90);\r\n\r\n const curves = [\r\n LineString3d.create([Point3d.create(inLeft, exTop), Point3d.create(inRight, exTop)]), // top\r\n Arc3d.createXY(Point3d.create(inLeft, range.center.y), radius, leftHalfCircle), // left\r\n LineString3d.create([Point3d.create(inLeft, exBottom), Point3d.create(inRight, exBottom)]), // bottom\r\n Arc3d.createXY(Point3d.create(inRight, range.center.y), radius, rightHalfCircle), // right\r\n ];\r\n\r\n return Loop.createArray(curves.map((curve) => curve.cloneTransformed(transform)));\r\n}\r\n\r\n/** Regular polygon with n sides: note, this a generic method that can be used to create any polygon, but the frame will not be as tightly encapsulating. */\r\nconst computePolygon = (n: number, range: Range2d, transform: Transform, angleOffset: number = 0): Loop => {\r\n // These are math terms: cspell:ignore inradius circumradius\r\n if (n < 3) throw new Error(\"A polygon must have at least 3 sides.\");\r\n\r\n // We're assuming the polygon is a regular polygon with `n` sides.\r\n // The center of the polygon is the center of the range.\r\n const center = range.center;\r\n // The inradius is the distance from the center to the midpoint of each side of the polygon. On our range, this coincides with the distance from the center to one of its corners.\r\n const inradius = range.low.distance(range.high) / 2;\r\n // The circumradius is the distance from the center to each vertex of the polygon.\r\n const circumradius = inradius / Math.cos(Math.PI / n);\r\n\r\n // The exterior angles add up to 360 degrees.\r\n const angleIncrement = 360 / n;\r\n const vertices: Point3d[] = [];\r\n\r\n // Add a point for each vertex\r\n for (let i = 0; i < n; i++) {\r\n const angle = Angle.createDegrees(i * angleIncrement + angleOffset);\r\n const vector = Vector2d.createPolar(circumradius, angle);\r\n vertices.push(Point3d.create(center.x + vector.x, center.y + vector.y));\r\n }\r\n\r\n // Close the polygon\r\n vertices.push(vertices[0]);\r\n\r\n // Finally compute the loop!\r\n const frame = LineString3d.createPoints(vertices);\r\n return Loop.create(frame.cloneTransformed(transform));\r\n};"]}
1
+ {"version":3,"file":"FrameGeometry.js","sourceRoot":"","sources":["../../../src/annotations/FrameGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ElementGeometry\n */\n\n\nimport { BackgroundFill, ColorDef, ElementGeometry, FillDisplay, GeometryParams, TextAnnotationFrameShape, TextFrameStyleProps } from \"@itwin/core-common\";\nimport { Angle, AngleSweep, Arc3d, LineString3d, Loop, Path, Point3d, Range2d, Transform, Vector2d } from \"@itwin/core-geometry\";\n\n/**\n * Based on the frame style, this method will construct and append [[GeometryParams]] (for line style) and a [[Loop]] (for the frame shape) to the builder.\n * @param builder that will be appended to in place\n * @param category to which the frame belongs, used for the [[GeometryParams]].\n * @param frame\n * @param range to enclose with the frame\n * @param transform that transform the range to world coordinates\n * @returns `true` if any geometry was appended to the builder\n* @beta\n */\nexport function appendFrameToBuilder(builder: ElementGeometry.Builder, frame: TextFrameStyleProps, range: Range2d, transform: Transform, geomParams: GeometryParams): boolean {\n if (undefined === frame.shape || frame.shape === \"none\") {\n return false;\n }\n\n const params = geomParams.clone();\n\n if (frame.fill === undefined) {\n params.fillDisplay = FillDisplay.Never;\n } else if (frame.fill === \"background\") {\n params.backgroundFill = BackgroundFill.Solid;\n params.fillDisplay = FillDisplay.Blanking;\n } else if (frame.fill !== \"subcategory\") {\n params.fillColor = ColorDef.fromJSON(frame.fill);\n params.lineColor = params.fillColor;\n params.fillDisplay = FillDisplay.Blanking;\n }\n\n if (frame.border !== \"subcategory\") {\n params.lineColor = ColorDef.fromJSON(frame.border);\n params.weight = frame.borderWeight;\n }\n\n const frameGeometry = computeFrame({ frame: frame.shape, range, transform });\n if (!builder.appendGeometryParamsChange(params) || !builder.appendGeometryQuery(frameGeometry)) {\n return false;\n }\n\n // The tile generator does not produce an outline for shapes with blanking fill. We must add the outline separately.\n if (params.fillDisplay === FillDisplay.Blanking) {\n const outlineParams = params.clone();\n outlineParams.fillDisplay = FillDisplay.Never;\n if (!builder.appendGeometryParamsChange(outlineParams) || !builder.appendGeometryQuery(frameGeometry)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Arguments for the [[computeFrame]] method.\n * @beta\n */\nexport interface ComputeFrameArgs {\n /** Frame shape to be calculated */\n frame: Exclude<TextAnnotationFrameShape, \"none\">;\n /** Range to be enclosed */\n range: Range2d;\n /** Transform that translates and rotates the range to world coordinates */\n transform: Transform;\n}\n\n/**\n * Computes the frame geometry based on the provided frame shape and range.\n * @returns a [Loop]($geometry) or [Path]($geometry) (if it's just a line) that represents the frame geometry\n * @beta\n */\nexport function computeFrame(args: ComputeFrameArgs): Loop | Path {\n switch (args.frame) {\n case \"line\": return computeLine(args.range, args.transform);\n case \"rectangle\": return computeRectangle(args.range, args.transform);\n case \"circle\": return computeCircle(args.range, args.transform);\n case \"equilateralTriangle\": return computeTriangle(args.range, args.transform);\n case \"diamond\": return computeDiamond(args.range, args.transform);\n case \"square\": return computeSquare(args.range, args.transform);\n case \"pentagon\": return computePolygon(5, args.range, args.transform, 90);\n case \"hexagon\": return computePolygon(6, args.range, args.transform);\n case \"octagon\": return computePolygon(8, args.range, args.transform, 180 / 8); // or pi/8 in radians\n case \"capsule\": return computeCapsule(args.range, args.transform);\n case \"roundedRectangle\": return computeRoundedRectangle(args.range, args.transform);\n default: return computeRectangle(args.range, args.transform);\n }\n}\n\n/**\n * Arguments for the [[computeIntervalPoints]] method.\n * @beta\n */\nexport interface ComputeIntervalPointsArgs extends ComputeFrameArgs {\n /** A factor applied to divide each straight edge. A value of 1 will place a single point on each vertex. */\n lineIntervalFactor?: number;\n /** A factor applied to divide each straight edge. A value of 1 will place a single point on each vertex. */\n arcIntervalFactor?: number;\n}\n\n/**\n * Computes points along the edges of the frame geometry based on the provided frame shape, range, and interval factors.\n * These can be used for snapping or attaching leaders.\n * @returns an array of [[Point3d]] that represent the points along the edges of the frame geometry. Returns `undefined` if the loop created by `computeFrame` is empty.\n * @beta\n */\nexport function computeIntervalPoints({ frame, range, transform, lineIntervalFactor = 0.5, arcIntervalFactor = 0.25 }: ComputeIntervalPointsArgs): Point3d[] | undefined {\n const points: Point3d[] = [];\n const curves = computeFrame({ frame, range, transform }).collectCurvePrimitives(undefined, false, true);\n\n curves.forEach((curve) => {\n const end = curve instanceof Arc3d ? arcIntervalFactor : lineIntervalFactor;\n for (let interval = 0; interval <= 1; interval += end) {\n points.push(curve.fractionToPoint(interval));\n }\n });\n return points;\n}\n\n/** Line - currently just adds an underline. Once we have leaders, this method may change. */\nconst computeLine = (range: Range2d, transform: Transform): Path => {\n const points = [Point3d.create(range.low.x, range.low.y), Point3d.create(range.high.x, range.low.y)];\n const frame = LineString3d.createPoints(points);\n\n return Path.create(frame.cloneTransformed(transform));\n}\n\n/** Rectangle - simplest frame */\nconst computeRectangle = (range: Range2d, transform: Transform): Loop => {\n const points = range.corners3d(true);\n const frame = LineString3d.createPoints(points);\n\n return Loop.create(frame.cloneTransformed(transform));\n}\n\n/** Rounded Rectangle: each corner will be turned into an arc with the radius of the arc being the @param radiusFactor * the height (yLength) of the range */\nconst computeRoundedRectangle = (range: Range2d, transform: Transform, radiusFactor: number = 0.25): Loop => {\n const radius = range.yLength() * radiusFactor * Math.sqrt(2);\n // We're going to circumscribe the range with our rounded edges. The corners of the range will fall on 45 degree angles.\n const radiusOffsetFactor = range.yLength() * radiusFactor;\n\n // These values are the origins of the circles\n const inLeft = range.low.x + radiusOffsetFactor;\n const inRight = range.high.x - radiusOffsetFactor;\n const inBottom = range.low.y + radiusOffsetFactor;\n const inTop = range.high.y - radiusOffsetFactor\n\n // These values exist on the circles\n const exLeft = inLeft - radius;\n const exRight = inRight + radius;\n const exBottom = inBottom - radius;\n const exTop = inTop + radius;\n\n const q1 = AngleSweep.createStartEndDegrees(0, 90);\n const q2 = AngleSweep.createStartEndDegrees(90, 180);\n const q3 = AngleSweep.createStartEndDegrees(180, 270);\n const q4 = AngleSweep.createStartEndDegrees(270, 360);\n\n\n const curves = [\n LineString3d.create([Point3d.create(inLeft, exTop), Point3d.create(inRight, exTop)]), // top\n Arc3d.createXY(Point3d.create(inLeft, inTop), radius, q2), // top left\n LineString3d.create([Point3d.create(exLeft, inBottom), Point3d.create(exLeft, inTop)]), // left\n Arc3d.createXY(Point3d.create(inLeft, inBottom), radius, q3), // bottom left\n LineString3d.create([Point3d.create(inLeft, exBottom), Point3d.create(inRight, exBottom)]), // bottom\n Arc3d.createXY(Point3d.create(inRight, inBottom), radius, q4), // bottom right\n LineString3d.create([Point3d.create(exRight, inBottom), Point3d.create(exRight, inTop)]), // right\n Arc3d.createXY(Point3d.create(inRight, inTop), radius, q1), // top right\n ];\n\n return Loop.createArray(curves.map((curve) => curve.cloneTransformed(transform)))\n}\n\n\n/** Circle */\nconst computeCircle = (range: Range2d, transform: Transform): Loop => {\n const radius = range.low.distance(range.high) / 2;\n const frame = Arc3d.createXY(Point3d.createFrom(range.center), radius);\n return Loop.create(frame.cloneTransformed(transform));\n}\n\n/** Equilateral Triangle */\nconst computeTriangle = (range: Range2d, transform: Transform): Loop => {\n\n const xLength = range.xLength();\n const yLength = range.yLength();\n const center = range.center;\n const points: Point3d[] = [];\n\n const magnitude = (xLength > yLength) ? (xLength * Math.sqrt(3) + yLength) / 2 : (yLength * Math.sqrt(3) + xLength) / 2;\n\n const v1 = Vector2d.create(0, magnitude);\n const vectors = [\n v1, // top\n v1.rotateXY(Angle.createDegrees(120)), // left\n v1.rotateXY(Angle.createDegrees(240)), // right\n v1 // top\n ];\n\n vectors.forEach((v) => {\n points.push(Point3d.create(center.x + v.x, center.y + v.y));\n });\n\n const frame = LineString3d.createPoints(points);\n\n return Loop.create(frame.cloneTransformed(transform));\n}\n\n/** Diamond (square rotated 45 degrees) */\nconst computeDiamond = (range: Range2d, transform: Transform): Loop => {\n const offset = (range.xLength() + range.yLength()) / 2;\n const center = range.center;\n\n const points = [\n Point3d.createFrom({ x: center.x, y: center.y + offset }), // top\n Point3d.createFrom({ x: center.x + offset, y: center.y }), // right\n Point3d.createFrom({ x: center.x, y: center.y - offset }), // bottom\n Point3d.createFrom({ x: center.x - offset, y: center.y }), // left\n Point3d.createFrom({ x: center.x, y: center.y + offset }), // top\n ];\n\n const frame = LineString3d.createPoints(points);\n\n return Loop.create(frame.cloneTransformed(transform));\n}\n\n/** Square */\nconst computeSquare = (range: Range2d, transform: Transform): Loop => {\n\n // Extend range\n const xLength = range.xLength() / 2;\n const yLength = range.yLength() / 2;\n const center = range.center;\n if (xLength > yLength) {\n range.extendPoint({ x: center.x, y: center.y + xLength });\n range.extendPoint({ x: center.x, y: center.y - xLength });\n } else {\n range.extendPoint({ x: center.x + yLength, y: center.y });\n range.extendPoint({ x: center.x - yLength, y: center.y });\n }\n\n const points = range.corners3d(true);\n const frame = LineString3d.createPoints(points);\n\n return Loop.create(frame.cloneTransformed(transform));\n}\n\n/** Capsule (or pill shape) */\nconst computeCapsule = (range: Range2d, transform: Transform): Loop => {\n const height = range.yLength();\n const radius = height * (Math.sqrt(2) / 2);\n\n // We're going to circumscribe the range with our rounded edges. The corners of the range will fall on 45 degree angles.\n const radiusOffsetFactor = height / 2;\n\n // These values are the origins of the circles\n const inLeft = range.low.x + radiusOffsetFactor;\n const inRight = range.high.x - radiusOffsetFactor;\n const inBottom = range.low.y + radiusOffsetFactor;\n const inTop = range.high.y - radiusOffsetFactor\n\n // These values exist on the circles\n const exBottom = inBottom - radius;\n const exTop = inTop + radius;\n\n const leftHalfCircle = AngleSweep.createStartEndDegrees(90, 270);\n const rightHalfCircle = AngleSweep.createStartEndDegrees(-90, 90);\n\n const curves = [\n LineString3d.create([Point3d.create(inLeft, exTop), Point3d.create(inRight, exTop)]), // top\n Arc3d.createXY(Point3d.create(inLeft, range.center.y), radius, leftHalfCircle), // left\n LineString3d.create([Point3d.create(inLeft, exBottom), Point3d.create(inRight, exBottom)]), // bottom\n Arc3d.createXY(Point3d.create(inRight, range.center.y), radius, rightHalfCircle), // right\n ];\n\n return Loop.createArray(curves.map((curve) => curve.cloneTransformed(transform)));\n}\n\n/** Regular polygon with n sides: note, this a generic method that can be used to create any polygon, but the frame will not be as tightly encapsulating. */\nconst computePolygon = (n: number, range: Range2d, transform: Transform, angleOffset: number = 0): Loop => {\n // These are math terms: cspell:ignore inradius circumradius\n if (n < 3) throw new Error(\"A polygon must have at least 3 sides.\");\n\n // We're assuming the polygon is a regular polygon with `n` sides.\n // The center of the polygon is the center of the range.\n const center = range.center;\n // The inradius is the distance from the center to the midpoint of each side of the polygon. On our range, this coincides with the distance from the center to one of its corners.\n const inradius = range.low.distance(range.high) / 2;\n // The circumradius is the distance from the center to each vertex of the polygon.\n const circumradius = inradius / Math.cos(Math.PI / n);\n\n // The exterior angles add up to 360 degrees.\n const angleIncrement = 360 / n;\n const vertices: Point3d[] = [];\n\n // Add a point for each vertex\n for (let i = 0; i < n; i++) {\n const angle = Angle.createDegrees(i * angleIncrement + angleOffset);\n const vector = Vector2d.createPolar(circumradius, angle);\n vertices.push(Point3d.create(center.x + vector.x, center.y + vector.y));\n }\n\n // Close the polygon\n vertices.push(vertices[0]);\n\n // Finally compute the loop!\n const frame = LineString3d.createPoints(vertices);\n return Loop.create(frame.cloneTransformed(transform));\n};"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TextAnnotationElement.js","sourceRoot":"","sources":["../../../src/annotations/TextAnnotationElement.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,oDAAsL;AAEtL,wCAAqE;AAErE,uDAAoD;AACpD,qEAAwE;AAExE,SAAS,+BAA+B,CAAC,MAAgB,EAAE,eAA+B,EAAE,eAAoC,EAAE,UAAsB,EAAE,YAAyB;IACjL,MAAM,SAAS,GAAG,4BAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,MAAM,GAAG,IAAA,iCAAe,EAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,6BAAe,CAAC,OAAO,EAAE,CAAC;IAC9C,IAAA,qDAA4B,EAAC,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAA;IAE9E,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAa,gBAAiB,SAAQ,6BAAmB;IACvD,gBAAgB;IACT,MAAM,KAAc,SAAS,KAAa,OAAO,kBAAkB,CAAC,CAAC,CAAC;IAC7E,YAAsB,KAA4B,EAAE,MAAgB,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,CAAC,QAAQ,CAAC,KAA4B,EAAE,MAAgB;QACnE,OAAO,IAAI,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAEe,MAAM;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,KAAK,CAAC,4BAA4B,GAAG,+BAA+B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjJ,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACI,aAAa;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;QAC5C,OAAO,IAAI,CAAC,CAAC,CAAC,4BAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,UAA0B;QAC7C,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;CACF;AA/BD,4CA+BC;AAED;;;;GAIG;AACH,MAAa,gBAAiB,SAAQ,4BAAkB;IACtD,gBAAgB;IACT,MAAM,KAAc,SAAS,KAAa,OAAO,kBAAkB,CAAC,CAAC,CAAC;IAC7E,YAAsB,KAA4B,EAAE,MAAgB,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,CAAC,QAAQ,CAAC,KAA4B,EAAE,MAAgB;QACnE,OAAO,IAAI,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAEe,MAAM;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,KAAK,CAAC,4BAA4B,GAAG,+BAA+B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjJ,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACI,aAAa;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;QAC5C,OAAO,IAAI,CAAC,CAAC,CAAC,4BAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,UAA0B;QAC7C,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;CACF;AA/BD,4CA+BC","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 { ElementGeometry, ElementGeometryBuilderParams, PlacementProps, TextAnnotation, TextAnnotation2dProps, TextAnnotation3dProps, TextAnnotationProps } from \"@itwin/core-common\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { AnnotationElement2d, GraphicalElement3d } from \"../Element\";\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { layoutTextBlock } from \"./TextBlockLayout\";\r\nimport { appendTextAnnotationGeometry } from \"./TextAnnotationGeometry\";\r\n\r\nfunction getElementGeometryBuilderParams(iModel: IModelDb, _placementProps: PlacementProps, annotationProps: TextAnnotationProps, categoryId: Id64String, _subCategory?: Id64String): ElementGeometryBuilderParams {\r\n const textBlock = TextAnnotation.fromJSON(annotationProps).textBlock;\r\n const layout = layoutTextBlock({ iModel, textBlock });\r\n const builder = new ElementGeometry.Builder();\r\n appendTextAnnotationGeometry({ layout, annotationProps, builder, categoryId })\r\n\r\n return { entryArray: builder.entries };\r\n}\r\n\r\n/** An element that displays textual content within a 2d model.\r\n * The text is stored as a [TextAnnotation]($common) from which the element's [geometry]($docs/learning/common/GeometryStream.md) and [Placement]($common) are computed.\r\n * @see [[setAnnotation]] to change the textual content.\r\n * @public @preview\r\n */\r\nexport class TextAnnotation2d extends AnnotationElement2d {\r\n /** @internal */\r\n public static override get className(): string { return \"TextAnnotation2d\"; }\r\n protected constructor(props: TextAnnotation2dProps, iModel: IModelDb) { super(props, iModel); }\r\n\r\n public static fromJSON(props: TextAnnotation2dProps, iModel: IModelDb): TextAnnotation2d {\r\n return new TextAnnotation2d(props, iModel);\r\n }\r\n\r\n public override toJSON(): TextAnnotation2dProps {\r\n const props = super.toJSON();\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(this.iModel, this.placement, this.jsonProperties.annotation, this.category);\r\n\r\n return props;\r\n }\r\n\r\n /** Extract the textual content, if present.\r\n * @see [[setAnnotation]] to change it.\r\n */\r\n public getAnnotation(): TextAnnotation | undefined {\r\n const json = this.jsonProperties.annotation;\r\n return json ? TextAnnotation.fromJSON(json) : undefined;\r\n }\r\n\r\n /** Change the textual content, updating the element's geometry and placement accordingly.\r\n * @see [[getAnnotation]] to extract the current annotation.\r\n * @param annotation The new annotation\r\n */\r\n public setAnnotation(annotation: TextAnnotation) {\r\n this.jsonProperties.annotation = annotation.toJSON();\r\n }\r\n}\r\n\r\n/** An element that displays textual content within a 3d model.\r\n * The text is stored as a [TextAnnotation]($common) from which the element's [geometry]($docs/learning/common/GeometryStream.md) and [Placement]($common) are computed.\r\n * @see [[setAnnotation]] to change the textual content.\r\n * @public @preview\r\n */\r\nexport class TextAnnotation3d extends GraphicalElement3d {\r\n /** @internal */\r\n public static override get className(): string { return \"TextAnnotation3d\"; }\r\n protected constructor(props: TextAnnotation3dProps, iModel: IModelDb) { super(props, iModel); }\r\n\r\n public static fromJSON(props: TextAnnotation3dProps, iModel: IModelDb): TextAnnotation3d {\r\n return new TextAnnotation3d(props, iModel);\r\n }\r\n\r\n public override toJSON(): TextAnnotation3dProps {\r\n const props = super.toJSON();\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(this.iModel, this.placement, this.jsonProperties.annotation, this.category);\r\n\r\n return props;\r\n }\r\n\r\n /** Extract the textual content, if present.\r\n * @see [[setAnnotation]] to change it.\r\n */\r\n public getAnnotation(): TextAnnotation | undefined {\r\n const json = this.jsonProperties.annotation;\r\n return json ? TextAnnotation.fromJSON(json) : undefined;\r\n }\r\n\r\n /** Change the textual content, updating the element's geometry and placement accordingly.\r\n * @see [[getAnnotation]] to extract the current annotation.\r\n * @param annotation The new annotation\r\n */\r\n public setAnnotation(annotation: TextAnnotation) {\r\n this.jsonProperties.annotation = annotation.toJSON();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"TextAnnotationElement.js","sourceRoot":"","sources":["../../../src/annotations/TextAnnotationElement.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Elements\n */\n\nimport { ElementGeometry, ElementGeometryBuilderParams, PlacementProps, TextAnnotation, TextAnnotation2dProps, TextAnnotation3dProps, TextAnnotationProps } from \"@itwin/core-common\";\nimport { IModelDb } from \"../IModelDb\";\nimport { AnnotationElement2d, GraphicalElement3d } from \"../Element\";\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { layoutTextBlock } from \"./TextBlockLayout\";\nimport { appendTextAnnotationGeometry } from \"./TextAnnotationGeometry\";\n\nfunction getElementGeometryBuilderParams(iModel: IModelDb, _placementProps: PlacementProps, annotationProps: TextAnnotationProps, categoryId: Id64String, _subCategory?: Id64String): ElementGeometryBuilderParams {\n const textBlock = TextAnnotation.fromJSON(annotationProps).textBlock;\n const layout = layoutTextBlock({ iModel, textBlock });\n const builder = new ElementGeometry.Builder();\n appendTextAnnotationGeometry({ layout, annotationProps, builder, categoryId })\n\n return { entryArray: builder.entries };\n}\n\n/** An element that displays textual content within a 2d model.\n * The text is stored as a [TextAnnotation]($common) from which the element's [geometry]($docs/learning/common/GeometryStream.md) and [Placement]($common) are computed.\n * @see [[setAnnotation]] to change the textual content.\n * @public @preview\n */\nexport class TextAnnotation2d extends AnnotationElement2d {\n /** @internal */\n public static override get className(): string { return \"TextAnnotation2d\"; }\n protected constructor(props: TextAnnotation2dProps, iModel: IModelDb) { super(props, iModel); }\n\n public static fromJSON(props: TextAnnotation2dProps, iModel: IModelDb): TextAnnotation2d {\n return new TextAnnotation2d(props, iModel);\n }\n\n public override toJSON(): TextAnnotation2dProps {\n const props = super.toJSON();\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(this.iModel, this.placement, this.jsonProperties.annotation, this.category);\n\n return props;\n }\n\n /** Extract the textual content, if present.\n * @see [[setAnnotation]] to change it.\n */\n public getAnnotation(): TextAnnotation | undefined {\n const json = this.jsonProperties.annotation;\n return json ? TextAnnotation.fromJSON(json) : undefined;\n }\n\n /** Change the textual content, updating the element's geometry and placement accordingly.\n * @see [[getAnnotation]] to extract the current annotation.\n * @param annotation The new annotation\n */\n public setAnnotation(annotation: TextAnnotation) {\n this.jsonProperties.annotation = annotation.toJSON();\n }\n}\n\n/** An element that displays textual content within a 3d model.\n * The text is stored as a [TextAnnotation]($common) from which the element's [geometry]($docs/learning/common/GeometryStream.md) and [Placement]($common) are computed.\n * @see [[setAnnotation]] to change the textual content.\n * @public @preview\n */\nexport class TextAnnotation3d extends GraphicalElement3d {\n /** @internal */\n public static override get className(): string { return \"TextAnnotation3d\"; }\n protected constructor(props: TextAnnotation3dProps, iModel: IModelDb) { super(props, iModel); }\n\n public static fromJSON(props: TextAnnotation3dProps, iModel: IModelDb): TextAnnotation3d {\n return new TextAnnotation3d(props, iModel);\n }\n\n public override toJSON(): TextAnnotation3dProps {\n const props = super.toJSON();\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(this.iModel, this.placement, this.jsonProperties.annotation, this.category);\n\n return props;\n }\n\n /** Extract the textual content, if present.\n * @see [[setAnnotation]] to change it.\n */\n public getAnnotation(): TextAnnotation | undefined {\n const json = this.jsonProperties.annotation;\n return json ? TextAnnotation.fromJSON(json) : undefined;\n }\n\n /** Change the textual content, updating the element's geometry and placement accordingly.\n * @see [[getAnnotation]] to extract the current annotation.\n * @param annotation The new annotation\n */\n public setAnnotation(annotation: TextAnnotation) {\n this.jsonProperties.annotation = annotation.toJSON();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TextAnnotationGeometry.js","sourceRoot":"","sources":["../../../src/annotations/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, ElementGeometry, FillDisplay, GeometryParams, TextAnnotation, TextAnnotationProps, TextFrameStyleProps } from \"@itwin/core-common\";\r\nimport { TextBlockLayout } from \"./TextBlockLayout\";\r\nimport { LineString3d, PointString3d, Range2d, Transform } from \"@itwin/core-geometry\";\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { produceTextBlockGeometry } from \"./TextBlockGeometry\";\r\nimport { appendFrameToBuilder, computeIntervalPoints } from \"./FrameGeometry\";\r\n\r\n/**\r\n * Properties required to compute the geometry of a text annotation.\r\n * @beta\r\n * @see [[appendTextAnnotationGeometry]] to append the geometry to an [[ElementGeometry.Builder]].\r\n */\r\nexport interface AppendTextAnnotationGeometryArgs {\r\n /** The annotation to be drawn. Be sure to include a TextBlock with runs or no geometry will be produced. */\r\n annotationProps: TextAnnotationProps;\r\n /** Layout provided by calling [[layoutTextBlock]] */\r\n layout: TextBlockLayout;\r\n /** Builder that will be added to in place */\r\n builder: ElementGeometry.Builder;\r\n /** The category the element will belong to. This will passed into the [[GeometryParams]] */\r\n categoryId: Id64String\r\n /** The optional sub-category the element will belong to. This will passed into the [[GeometryParams]] */\r\n subCategoryId?: Id64String\r\n /** Whether or not to draw geometry for things like the snap points, range, and anchor point */\r\n wantDebugGeometry?: boolean;\r\n}\r\n\r\n/** Constructs the TextBlockGeometry and frame geometry and appends the geometry to the provided builder.\r\n * @returns true if the geometry was successfully appended.\r\n * @beta\r\n */\r\nexport function appendTextAnnotationGeometry(props: AppendTextAnnotationGeometryArgs): boolean {\r\n const annotation = TextAnnotation.fromJSON(props.annotationProps);\r\n const range = Range2d.fromJSON(props.layout.range);\r\n const transform = annotation.computeTransform(range);\r\n let result = true;\r\n\r\n // Construct the TextBlockGeometry\r\n const params = new GeometryParams(props.categoryId, props.subCategoryId);\r\n const entries = produceTextBlockGeometry(props.layout, annotation.computeTransform(props.layout.range));\r\n result = result && props.builder.appendTextBlock(entries, params);\r\n\r\n // Construct the frame geometry\r\n if (annotation.frame && annotation.frame.shape !== \"none\") {\r\n result = result && appendFrameToBuilder(props.builder, annotation.frame, range, transform, params);\r\n }\r\n\r\n // Construct the debug geometry\r\n if (props.wantDebugGeometry) {\r\n result = result && debugAnchorPoint(props.builder, annotation, props.layout, annotation.computeTransform(props.layout.range));\r\n if (annotation.frame) result = result && debugSnapPoints(props.builder, annotation.frame, props.layout.range, annotation.computeTransform(props.layout.range));\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Draws the anchor point and margins of the text annotation.\r\n * The anchor point is the point around which the text rotates and is drawn as a blue x (1m by 1m).\r\n * The margins are drawn as a blue box.\r\n * The text range is drawn as a red box.\r\n */\r\nfunction debugAnchorPoint(builder: ElementGeometry.Builder, annotation: TextAnnotation, layout: TextBlockLayout, transform: Transform): boolean {\r\n const range = Range2d.fromJSON(layout.range);\r\n const debugAnchorPt = transform.multiplyPoint3d(annotation.computeAnchorPoint(range));\r\n\r\n // Make it blue\r\n const blueLineParams = new GeometryParams(Id64.invalid);\r\n blueLineParams.lineColor = ColorDef.blue;\r\n let result = builder.appendGeometryParamsChange(blueLineParams);\r\n\r\n // Draw a blue box to show the element's margin\r\n const marginCorners = range.corners3d(true);\r\n transform.multiplyPoint3dArrayInPlace(marginCorners);\r\n result = result && builder.appendGeometryQuery(LineString3d.create(marginCorners));\r\n\r\n // Draw a blue x to show the anchor point - Rotation occurs around this point. The x will be 1 m by 1 m.\r\n result = result && builder.appendGeometryQuery(LineString3d.create(debugAnchorPt.plusXYZ(-1, -1), debugAnchorPt.plusXYZ(1, 1)));\r\n result = result && builder.appendGeometryQuery(LineString3d.create(debugAnchorPt.plusXYZ(1, -1), debugAnchorPt.plusXYZ(-1, 1)));\r\n\r\n // Draw a red box to show the text range\r\n const redLineParams = new GeometryParams(Id64.invalid);\r\n redLineParams.lineColor = ColorDef.red;\r\n result = result && builder.appendGeometryParamsChange(redLineParams);\r\n\r\n const rangeCorners = layout.textRange.corners3d(true);\r\n transform.multiplyPoint3dArrayInPlace(rangeCorners);\r\n result = result && builder.appendGeometryQuery(LineString3d.create(rangeCorners));\r\n\r\n return result;\r\n}\r\n\r\n/** Draws the interval points defined by calling [[computeIntervalPoints]]. The points are shown as black dots 5x larger than the borderWeight */\r\nfunction debugSnapPoints(builder: ElementGeometry.Builder, frame: TextFrameStyleProps, range: Range2d, transform: Transform): boolean {\r\n if (undefined === frame.shape || frame.shape === \"none\")\r\n return false;\r\n const points = computeIntervalPoints({ frame: frame.shape, range, transform, lineIntervalFactor: 0.5, arcIntervalFactor: 0.25 });\r\n\r\n const params = new GeometryParams(Id64.invalid);\r\n params.lineColor = ColorDef.black;\r\n params.weight = (frame.borderWeight ?? 1) * 5; // We want the dots to be bigger than the frame so we can see them.\r\n params.fillDisplay = FillDisplay.Always;\r\n\r\n const result = builder.appendGeometryParamsChange(params) && builder.appendGeometryQuery(PointString3d.create(points));\r\n return result;\r\n}"]}
1
+ {"version":3,"file":"TextAnnotationGeometry.js","sourceRoot":"","sources":["../../../src/annotations/TextAnnotationGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ElementGeometry\n */\n\nimport { ColorDef, ElementGeometry, FillDisplay, GeometryParams, TextAnnotation, TextAnnotationProps, TextFrameStyleProps } from \"@itwin/core-common\";\nimport { TextBlockLayout } from \"./TextBlockLayout\";\nimport { LineString3d, PointString3d, Range2d, Transform } from \"@itwin/core-geometry\";\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\nimport { produceTextBlockGeometry } from \"./TextBlockGeometry\";\nimport { appendFrameToBuilder, computeIntervalPoints } from \"./FrameGeometry\";\n\n/**\n * Properties required to compute the geometry of a text annotation.\n * @beta\n * @see [[appendTextAnnotationGeometry]] to append the geometry to an [[ElementGeometry.Builder]].\n */\nexport interface AppendTextAnnotationGeometryArgs {\n /** The annotation to be drawn. Be sure to include a TextBlock with runs or no geometry will be produced. */\n annotationProps: TextAnnotationProps;\n /** Layout provided by calling [[layoutTextBlock]] */\n layout: TextBlockLayout;\n /** Builder that will be added to in place */\n builder: ElementGeometry.Builder;\n /** The category the element will belong to. This will passed into the [[GeometryParams]] */\n categoryId: Id64String\n /** The optional sub-category the element will belong to. This will passed into the [[GeometryParams]] */\n subCategoryId?: Id64String\n /** Whether or not to draw geometry for things like the snap points, range, and anchor point */\n wantDebugGeometry?: boolean;\n}\n\n/** Constructs the TextBlockGeometry and frame geometry and appends the geometry to the provided builder.\n * @returns true if the geometry was successfully appended.\n * @beta\n */\nexport function appendTextAnnotationGeometry(props: AppendTextAnnotationGeometryArgs): boolean {\n const annotation = TextAnnotation.fromJSON(props.annotationProps);\n const range = Range2d.fromJSON(props.layout.range);\n const transform = annotation.computeTransform(range);\n let result = true;\n\n // Construct the TextBlockGeometry\n const params = new GeometryParams(props.categoryId, props.subCategoryId);\n const entries = produceTextBlockGeometry(props.layout, annotation.computeTransform(props.layout.range));\n result = result && props.builder.appendTextBlock(entries, params);\n\n // Construct the frame geometry\n if (annotation.frame && annotation.frame.shape !== \"none\") {\n result = result && appendFrameToBuilder(props.builder, annotation.frame, range, transform, params);\n }\n\n // Construct the debug geometry\n if (props.wantDebugGeometry) {\n result = result && debugAnchorPoint(props.builder, annotation, props.layout, annotation.computeTransform(props.layout.range));\n if (annotation.frame) result = result && debugSnapPoints(props.builder, annotation.frame, props.layout.range, annotation.computeTransform(props.layout.range));\n }\n\n return result;\n};\n\n/**\n * Draws the anchor point and margins of the text annotation.\n * The anchor point is the point around which the text rotates and is drawn as a blue x (1m by 1m).\n * The margins are drawn as a blue box.\n * The text range is drawn as a red box.\n */\nfunction debugAnchorPoint(builder: ElementGeometry.Builder, annotation: TextAnnotation, layout: TextBlockLayout, transform: Transform): boolean {\n const range = Range2d.fromJSON(layout.range);\n const debugAnchorPt = transform.multiplyPoint3d(annotation.computeAnchorPoint(range));\n\n // Make it blue\n const blueLineParams = new GeometryParams(Id64.invalid);\n blueLineParams.lineColor = ColorDef.blue;\n let result = builder.appendGeometryParamsChange(blueLineParams);\n\n // Draw a blue box to show the element's margin\n const marginCorners = range.corners3d(true);\n transform.multiplyPoint3dArrayInPlace(marginCorners);\n result = result && builder.appendGeometryQuery(LineString3d.create(marginCorners));\n\n // Draw a blue x to show the anchor point - Rotation occurs around this point. The x will be 1 m by 1 m.\n result = result && builder.appendGeometryQuery(LineString3d.create(debugAnchorPt.plusXYZ(-1, -1), debugAnchorPt.plusXYZ(1, 1)));\n result = result && builder.appendGeometryQuery(LineString3d.create(debugAnchorPt.plusXYZ(1, -1), debugAnchorPt.plusXYZ(-1, 1)));\n\n // Draw a red box to show the text range\n const redLineParams = new GeometryParams(Id64.invalid);\n redLineParams.lineColor = ColorDef.red;\n result = result && builder.appendGeometryParamsChange(redLineParams);\n\n const rangeCorners = layout.textRange.corners3d(true);\n transform.multiplyPoint3dArrayInPlace(rangeCorners);\n result = result && builder.appendGeometryQuery(LineString3d.create(rangeCorners));\n\n return result;\n}\n\n/** Draws the interval points defined by calling [[computeIntervalPoints]]. The points are shown as black dots 5x larger than the borderWeight */\nfunction debugSnapPoints(builder: ElementGeometry.Builder, frame: TextFrameStyleProps, range: Range2d, transform: Transform): boolean {\n if (undefined === frame.shape || frame.shape === \"none\")\n return false;\n const points = computeIntervalPoints({ frame: frame.shape, range, transform, lineIntervalFactor: 0.5, arcIntervalFactor: 0.25 });\n\n const params = new GeometryParams(Id64.invalid);\n params.lineColor = ColorDef.black;\n params.weight = (frame.borderWeight ?? 1) * 5; // We want the dots to be bigger than the frame so we can see them.\n params.fillDisplay = FillDisplay.Always;\n\n const result = builder.appendGeometryParamsChange(params) && builder.appendGeometryQuery(PointString3d.create(points));\n return result;\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TextBlockGeometry.js","sourceRoot":"","sources":["../../../src/annotations/TextBlockGeometry.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 { TextBlockGeometryProps, TextBlockGeometryPropsEntry, TextString, TextStyleColor } from \"@itwin/core-common\";\r\nimport { RunLayout, TextBlockLayout } from \"./TextBlockLayout\";\r\nimport { LineSegment3d, Point3d, Range2d, Transform, Vector2d } from \"@itwin/core-geometry\";\r\nimport { assert } from \"@itwin/core-bentley\";\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\n/**\r\n * Produces the geometry for a text block in a way that can be interpreted by a [[GeometryStreamBuilder]] or [[ElementBuilder.Geometry]].\r\n * To build the geometry for a whole [[TextAnnotation]], use [[appendTextAnnotationGeometry]] instead.\r\n * @param layout of the text block as computed by [[layoutTextBlock]].\r\n * @param documentTransform that positions the text block in world coordinates.\r\n * @returns TextBlockGeometryProps.\r\n * @beta\r\n */\r\nexport function produceTextBlockGeometry(layout: TextBlockLayout, documentTransform: Transform): 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 return { entries: context.entries };\r\n}\r\n"]}
1
+ {"version":3,"file":"TextBlockGeometry.js","sourceRoot":"","sources":["../../../src/annotations/TextBlockGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ElementGeometry\n */\n\nimport { TextBlockGeometryProps, TextBlockGeometryPropsEntry, TextString, TextStyleColor } from \"@itwin/core-common\";\nimport { RunLayout, TextBlockLayout } from \"./TextBlockLayout\";\nimport { LineSegment3d, Point3d, Range2d, Transform, Vector2d } from \"@itwin/core-geometry\";\nimport { assert } from \"@itwin/core-bentley\";\n\ninterface GeometryContext {\n curColor?: TextStyleColor;\n entries: TextBlockGeometryPropsEntry[];\n}\n\nfunction setColor(color: TextStyleColor, context: GeometryContext): void {\n if (color !== context.curColor) {\n context.curColor = color;\n context.entries.push({ color });\n }\n}\n\nfunction createTextString(text: string, run: RunLayout, origin?: Point3d): TextString {\n assert(text.length > 0);\n\n const { lineHeight, widthFactor, isBold, isItalic, isUnderlined } = run.style;\n\n return new TextString({\n text,\n font: run.fontId,\n height: lineHeight,\n widthFactor,\n bold: isBold,\n italic: isItalic,\n underline: isUnderlined,\n origin,\n });\n}\n\nfunction processTextRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\n assert(run.source.type === \"text\");\n const text = run.source.content.substring(run.charOffset, run.charOffset + run.numChars);\n if (text.length === 0) {\n return;\n }\n\n const ts = createTextString(text, run);\n if (\"none\" !== run.source.baselineShift) {\n const isSub = \"subscript\" === run.source.baselineShift;\n const offsetFactor = run.style[isSub ? \"subScriptOffsetFactor\" : \"superScriptOffsetFactor\"];\n const scale = run.style[isSub ? \"subScriptScale\" : \"superScriptScale\"];\n\n ts.origin.y += offsetFactor * ts.height;\n ts.height *= scale;\n }\n\n ts.transformInPlace(transform);\n\n setColor(run.style.color, context);\n context.entries.push({ text: ts });\n}\n\nfunction createFractionTextString(text: string, run: RunLayout, origin: Point3d, transform: Transform): TextString {\n const ts = createTextString(text, run, origin);\n assert(undefined !== ts.widthFactor);\n\n ts.height *= run.style.stackedFractionScale;\n\n ts.transformInPlace(transform);\n\n return ts;\n}\n\nfunction processFractionRun(run: RunLayout, transform: Transform, context: GeometryContext): void {\n const source = run.source;\n assert(source.type === \"fraction\");\n\n if (source.numerator.length === 0 && source.denominator.length === 0) {\n return;\n }\n\n assert(undefined !== run.numeratorRange && undefined !== run.denominatorRange);\n\n const fontSize = new Vector2d(run.style.lineHeight * run.style.widthFactor, run.style.lineHeight);\n fontSize.scale(run.style.stackedFractionScale, fontSize);\n\n const numeratorOffset = new Point3d(run.numeratorRange.low.x, run.numeratorRange.low.y, 0);\n const denominatorOffset = new Point3d(run.denominatorRange.low.x, run.denominatorRange.low.y, 0);\n\n setColor(run.style.color, context);\n\n if (source.numerator.length > 0) {\n context.entries.push({ text: createFractionTextString(source.numerator, run, numeratorOffset, transform) });\n }\n\n const numeratorRange = Range2d.fromJSON(run.numeratorRange);\n const denominatorRange = Range2d.fromJSON(run.denominatorRange);\n\n let separator: LineSegment3d;\n if (run.style.stackedFractionType === \"horizontal\") {\n const fractionWidth = Math.max(numeratorRange.xLength(), denominatorRange.xLength());\n const y = 1.25 * denominatorRange.yLength();\n separator = LineSegment3d.createXYXY(0, y, fractionWidth, y);\n } else {\n const p0 = new Point3d(denominatorRange.low.x - fontSize.x / 2, denominatorRange.low.y + fontSize.y * (1 / 3), 0);\n const p1 = new Point3d(p0.x + fontSize.x, p0.y + fontSize.y * 1.5, 0);\n separator = LineSegment3d.createCapture(p0, p1);\n }\n\n separator.tryTransformInPlace(transform);\n\n context.entries.push({\n separator: {\n startPoint: separator.point0Ref.toJSON(),\n endPoint: separator.point1Ref.toJSON(),\n },\n });\n\n if (source.denominator.length > 0) {\n context.entries.push({ text: createFractionTextString(source.denominator, run, denominatorOffset, transform) });\n }\n}\n\n/**\n * Produces the geometry for a text block in a way that can be interpreted by a [[GeometryStreamBuilder]] or [[ElementBuilder.Geometry]].\n * To build the geometry for a whole [[TextAnnotation]], use [[appendTextAnnotationGeometry]] instead.\n * @param layout of the text block as computed by [[layoutTextBlock]].\n * @param documentTransform that positions the text block in world coordinates.\n * @returns TextBlockGeometryProps.\n * @beta\n */\nexport function produceTextBlockGeometry(layout: TextBlockLayout, documentTransform: Transform): TextBlockGeometryProps {\n const context: GeometryContext = { entries: [] };\n for (const line of layout.lines) {\n const lineTrans = Transform.createTranslationXYZ(line.offsetFromDocument.x, line.offsetFromDocument.y, 0);\n for (const run of line.runs) {\n if (\"linebreak\" === run.source.type) {\n continue;\n }\n\n const runTrans = Transform.createTranslationXYZ(run.offsetFromLine.x, run.offsetFromLine.y, 0);\n lineTrans.multiplyTransformTransform(runTrans, runTrans);\n documentTransform.multiplyTransformTransform(runTrans, runTrans);\n if (\"text\" === run.source.type) {\n processTextRun(run, runTrans, context);\n } else {\n processFractionRun(run, runTrans, context);\n }\n }\n }\n\n return { entries: context.entries };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TextBlockLayout.js","sourceRoot":"","sources":["../../../src/annotations/TextBlockLayout.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, FontType, FractionRun, LineLayoutResult, Paragraph, Run, RunLayoutResult, TextBlock, TextBlockLayoutResult, TextBlockMargins, TextRun, TextStyleSettings, TextStyleSettingsProps } from \"@itwin/core-common\";\r\nimport { Geometry, 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\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/** A function that looks up the font Id corresponding to a [FontFamilyDescriptor]($common).\r\n * If no type is provided, the function can return a font of any type matching `name` (there may be more than one, of different types).\r\n * @internal\r\n */\r\nexport type FindFontId = (name: string, type?: FontType) => 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 * @beta\r\n */\r\nexport function layoutTextBlock(args: LayoutTextBlockArgs): TextBlockLayout {\r\n const findFontId = args.findFontId ?? ((name, type) => args.iModel.fonts.findId({ name, type }) ?? 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 [[appendTextAnnotationGeometry]].\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\n/**\r\n * Arguments supplied to [[computeGraphemeOffsets]].\r\n * @beta\r\n */\r\nexport interface ComputeGraphemeOffsetsArgs extends LayoutTextBlockArgs {\r\n /** The index of the [Paragraph]($common) in the text block that contains the run layout result text. */\r\n paragraphIndex: number;\r\n /** The run layout result for which grapheme ranges will be computed. */\r\n runLayoutResult: RunLayoutResult;\r\n /** An array of starting character indexes for each grapheme. Each entry represents the index of the first character in a grapheme. */\r\n graphemeCharIndexes: number[];\r\n};\r\n\r\n/**\r\n * Computes the range from the start of a [RunLayoutResult]($common) to the trailing edge of each grapheme.\r\n * It is the responsibility of the caller to determine the number and character indexes of the graphemes.\r\n * @returns If the [RunLayoutResult]($common)'s source is a [TextRun]($common), it returns an array containing the range of each grapheme.\r\n * Otherwise, it returns and empty array.\r\n * @beta\r\n */\r\nexport function computeGraphemeOffsets(args: ComputeGraphemeOffsetsArgs): Range2d[] {\r\n const { textBlock, paragraphIndex, runLayoutResult, graphemeCharIndexes, iModel } = args;\r\n const findFontId = args.findFontId ?? ((name, type) => iModel.fonts.findId({ name, type }) ?? 0);\r\n const computeTextRange = args.computeTextRange ?? ((x) => iModel.computeRangesForText(x));\r\n const findTextStyle = args.findTextStyle ?? (() => TextStyleSettings.fromJSON());\r\n const source = textBlock.paragraphs[paragraphIndex].runs[runLayoutResult.sourceRunIndex];\r\n\r\n if (source.type !== \"text\" || runLayoutResult.characterCount === 0) {\r\n return [];\r\n }\r\n\r\n const style = TextStyleSettings.fromJSON(runLayoutResult.textStyle);\r\n\r\n const layoutContext = new LayoutContext(textBlock, computeTextRange, findTextStyle, findFontId);\r\n const graphemeRanges: Range2d[] = [];\r\n\r\n graphemeCharIndexes.forEach((_, index) => {\r\n const nextGraphemeCharIndex = graphemeCharIndexes[index + 1] ?? runLayoutResult.characterCount;\r\n graphemeRanges.push(layoutContext.computeRangeForTextRun(style, source, runLayoutResult.characterOffset, nextGraphemeCharIndex).layout);\r\n });\r\n return graphemeRanges;\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/**\r\n * Represents the layout of a single run (text, fraction, or line break) within a line of text.\r\n * Stores information about the run's position, style, and font within the line.\r\n * Provides utilities for splitting text runs for word wrapping and converting to result objects.\r\n * @beta\r\n */\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/**\r\n * Represents the layout of a single line within a paragraph of a text block.\r\n * Contains a sequence of RunLayout objects, the computed range of the line, and its offset from the document origin.\r\n * Provides utilities for appending runs, computing ranges, and converting to result objects.\r\n * @beta\r\n */\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 * Computes the visual layout of the text block, including word wrapping, justification, and margins.\r\n * Provides access to the computed lines, ranges, and utilities for converting to result objects.\r\n * @beta\r\n */\r\nexport class TextBlockLayout {\r\n public source: TextBlock;\r\n\r\n /** @internal: This is primarily for debugging purposes. This is the range of text geometry */\r\n public textRange = new Range2d();\r\n\r\n /** The range including margins of the [[TextBlock]]. */\r\n public range = new Range2d();\r\n public lines: LineLayout[] = [];\r\n private _context: LayoutContext;\r\n\r\n public constructor(source: TextBlock, context: LayoutContext) {\r\n this._context = context;\r\n this.source = source;\r\n\r\n if (source.width > 0) {\r\n this.textRange.low.x = 0;\r\n this.textRange.high.x = source.width;\r\n }\r\n\r\n this.populateLines(context);\r\n this.justifyLines();\r\n this.applyMargins(source.margins);\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 || Geometry.isAlmostEqualNumber(runWidth + lineWidth, doc.width, Geometry.smallMetricDistance)) {\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 // We don't want to justify empty text, or a single line of text whose width is 0. By default text is already left justified.\r\n if (this.lines.length < 1 || (this.lines.length === 1 && this.source.width === 0) || \"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 accommodate lines that exceeded the document's minimum width.\r\n this.textRange.low.x += minOffset;\r\n this.textRange.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.textRange.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 private applyMargins(margins: TextBlockMargins) {\r\n this.range = this.textRange.clone();\r\n\r\n if (this.range.isNull)\r\n return;\r\n\r\n // Disregard negative margins.\r\n const right = margins.right >= 0 ? margins.right : 0;\r\n const left = margins.left >= 0 ? margins.left : 0;\r\n const top = margins.top >= 0 ? margins.top : 0;\r\n const bottom = margins.bottom >= 0 ? margins.bottom : 0;\r\n\r\n const xHigh = this.textRange.high.x + right;\r\n const yHigh = this.textRange.high.y + top;\r\n const xLow = this.textRange.low.x - left;\r\n const yLow = this.textRange.low.y - bottom;\r\n\r\n this.range.extendXY(xHigh, yHigh);\r\n this.range.extendXY(xLow, yLow);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"TextBlockLayout.js","sourceRoot":"","sources":["../../../src/annotations/TextBlockLayout.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ElementGeometry\n */\n\nimport { BaselineShift, FontId, FontType, FractionRun, LineLayoutResult, Paragraph, Run, RunLayoutResult, TextBlock, TextBlockLayoutResult, TextBlockMargins, TextRun, TextStyleSettings, TextStyleSettingsProps } from \"@itwin/core-common\";\nimport { Geometry, Range2d } from \"@itwin/core-geometry\";\nimport { IModelDb } from \"../IModelDb\";\nimport { assert, NonFunctionPropertiesOf } from \"@itwin/core-bentley\";\nimport * as LineBreaker from \"linebreak\";\n\n\n/** @internal */\nexport interface TextLayoutRanges {\n layout: Range2d;\n justification: Range2d;\n}\n\n/** Arguments to [[ComputeRangesForTextLayout]].\n * @internal\n */\nexport interface ComputeRangesForTextLayoutArgs {\n chars: string;\n bold: boolean;\n italic: boolean;\n baselineShift: BaselineShift;\n fontId: FontId;\n widthFactor: number;\n lineHeight: number;\n}\n\n/** A function that uses a font to compute the layout and justification ranges of a string of text.\n * @internal\n */\nexport type ComputeRangesForTextLayout = (args: ComputeRangesForTextLayoutArgs) => TextLayoutRanges;\n\n/** A function that looks up the font Id corresponding to a [FontFamilyDescriptor]($common).\n * If no type is provided, the function can return a font of any type matching `name` (there may be more than one, of different types).\n * @internal\n */\nexport type FindFontId = (name: string, type?: FontType) => FontId;\n\n/** @internal */\nexport type FindTextStyle = (name: string) => TextStyleSettings;\n\n/**\n * Arguments supplied to [[computeLayoutTextBlockResult]].\n * @beta\n */\nexport interface LayoutTextBlockArgs {\n /** The text block whose extents are to be computed. */\n textBlock: TextBlock;\n /** The iModel from which to obtain fonts and [TextStyle]($common)s when laying out glyphs. */\n iModel: IModelDb;\n /** @internal chiefly for tests, by default uses IModelJsNative.DgnDb.computeRangesForText. */\n computeTextRange?: ComputeRangesForTextLayout;\n /** @internal chiefly for tests, by default looks up styles from a workspace. */\n findTextStyle?: FindTextStyle;\n /** @internal chiefly for tests, by default uses IModelDb.fontMap. */\n findFontId?: FindFontId;\n}\n\n/**\n * Lays out the contents of a TextBlock into a series of lines containing runs.\n * Each paragraph is decomposed into a series of lines.\n * Each series of consecutive non-linebreak runs within a paragraph is concatenated into one line.\n * If the document specifies a width > 0, individual lines are split to try to avoid exceeding that width.\n * Individual TextRuns can be split onto multiple lines at word boundaries if necessary. Individual FractionRuns are never split.\n * @see [[computeLayoutTextBlockResult]]\n * @beta\n */\nexport function layoutTextBlock(args: LayoutTextBlockArgs): TextBlockLayout {\n const findFontId = args.findFontId ?? ((name, type) => args.iModel.fonts.findId({ name, type }) ?? 0);\n const computeTextRange = args.computeTextRange ?? ((x) => args.iModel.computeRangesForText(x));\n\n // ###TODO finding text styles in workspaces.\n const findTextStyle = args.findTextStyle ?? (() => TextStyleSettings.fromJSON());\n\n return new TextBlockLayout(args.textBlock, new LayoutContext(args.textBlock, computeTextRange, findTextStyle, findFontId));\n}\n\n/**\n * Gets the result of laying out the the contents of a TextBlock into a series of lines containing runs.\n * The visual layout accounts for the [TextStyle]($common)s, fonts, and [TextBlock.width]($common). It applies word-wrapping if needed.\n * The layout returned matches the visual layout of the geometry produced by [[appendTextAnnotationGeometry]].\n * @beta\n */\nexport function computeLayoutTextBlockResult(args: LayoutTextBlockArgs): TextBlockLayoutResult {\n const layout = layoutTextBlock(args);\n return layout.toResult();\n}\n\n/**\n * Arguments supplied to [[computeGraphemeOffsets]].\n * @beta\n */\nexport interface ComputeGraphemeOffsetsArgs extends LayoutTextBlockArgs {\n /** The index of the [Paragraph]($common) in the text block that contains the run layout result text. */\n paragraphIndex: number;\n /** The run layout result for which grapheme ranges will be computed. */\n runLayoutResult: RunLayoutResult;\n /** An array of starting character indexes for each grapheme. Each entry represents the index of the first character in a grapheme. */\n graphemeCharIndexes: number[];\n};\n\n/**\n * Computes the range from the start of a [RunLayoutResult]($common) to the trailing edge of each grapheme.\n * It is the responsibility of the caller to determine the number and character indexes of the graphemes.\n * @returns If the [RunLayoutResult]($common)'s source is a [TextRun]($common), it returns an array containing the range of each grapheme.\n * Otherwise, it returns and empty array.\n * @beta\n */\nexport function computeGraphemeOffsets(args: ComputeGraphemeOffsetsArgs): Range2d[] {\n const { textBlock, paragraphIndex, runLayoutResult, graphemeCharIndexes, iModel } = args;\n const findFontId = args.findFontId ?? ((name, type) => iModel.fonts.findId({ name, type }) ?? 0);\n const computeTextRange = args.computeTextRange ?? ((x) => iModel.computeRangesForText(x));\n const findTextStyle = args.findTextStyle ?? (() => TextStyleSettings.fromJSON());\n const source = textBlock.paragraphs[paragraphIndex].runs[runLayoutResult.sourceRunIndex];\n\n if (source.type !== \"text\" || runLayoutResult.characterCount === 0) {\n return [];\n }\n\n const style = TextStyleSettings.fromJSON(runLayoutResult.textStyle);\n\n const layoutContext = new LayoutContext(textBlock, computeTextRange, findTextStyle, findFontId);\n const graphemeRanges: Range2d[] = [];\n\n graphemeCharIndexes.forEach((_, index) => {\n const nextGraphemeCharIndex = graphemeCharIndexes[index + 1] ?? runLayoutResult.characterCount;\n graphemeRanges.push(layoutContext.computeRangeForTextRun(style, source, runLayoutResult.characterOffset, nextGraphemeCharIndex).layout);\n });\n return graphemeRanges;\n}\n\nfunction scaleRange(range: Range2d, scale: number): void {\n range.low.scaleInPlace(scale);\n range.high.scaleInPlace(scale);\n}\n\nfunction applyBlockSettings(target: TextStyleSettings, source: TextStyleSettings | TextStyleSettingsProps): TextStyleSettings {\n if (source === target) {\n return target;\n }\n\n const lineSpacingFactor = source.lineSpacingFactor ?? target.lineSpacingFactor;\n const lineHeight = source.lineHeight ?? target.lineHeight;\n const widthFactor = source.widthFactor ?? target.widthFactor;\n\n if (lineSpacingFactor !== target.lineSpacingFactor || lineHeight !== target.lineHeight || widthFactor !== target.widthFactor) {\n target = target.clone({ lineSpacingFactor, lineHeight, widthFactor });\n }\n\n return target;\n}\n\nclass LayoutContext {\n private readonly _textStyles = new Map<string, TextStyleSettings>();\n private readonly _fontIds = new Map<string, FontId>();\n public readonly blockSettings: TextStyleSettings;\n\n public constructor(block: TextBlock, private readonly _computeTextRange: ComputeRangesForTextLayout, private readonly _findTextStyle: FindTextStyle, private readonly _findFontId: FindFontId) {\n const settings = this.findTextStyle(block.styleName);\n this.blockSettings = applyBlockSettings(settings, block.styleOverrides);\n }\n\n public findFontId(name: string): FontId {\n let fontId = this._fontIds.get(name);\n if (undefined === fontId) {\n this._fontIds.set(name, fontId = this._findFontId(name));\n }\n\n return fontId;\n }\n\n public findTextStyle(name: string): TextStyleSettings {\n let style = this._textStyles.get(name);\n if (undefined === style) {\n this._textStyles.set(name, style = this._findTextStyle(name));\n }\n\n return style;\n }\n\n public createRunSettings(run: Run): TextStyleSettings {\n let settings = this.findTextStyle(run.styleName);\n if (run.overridesStyle) {\n settings = settings.clone(run.styleOverrides);\n }\n\n return applyBlockSettings(settings, this.blockSettings);\n }\n\n public computeRangeForText(chars: string, style: TextStyleSettings, baselineShift: BaselineShift): TextLayoutRanges {\n if (chars.length === 0) {\n return {\n layout: new Range2d(0, 0, 0, style.lineHeight),\n justification: new Range2d(),\n };\n }\n\n const fontId = this.findFontId(style.fontName);\n const { layout, justification } = this._computeTextRange({\n chars,\n fontId,\n baselineShift,\n bold: style.isBold,\n italic: style.isItalic,\n lineHeight: this.blockSettings.lineHeight,\n widthFactor: this.blockSettings.widthFactor,\n });\n\n if (\"none\" !== baselineShift) {\n const isSub = \"subscript\" === baselineShift;\n const scale = isSub ? style.subScriptScale : style.superScriptScale;\n const offsetFactor = isSub ? style.subScriptOffsetFactor : style.superScriptOffsetFactor;\n const offset = { x: 0, y: style.lineHeight * offsetFactor };\n\n scaleRange(layout, scale);\n layout.cloneTranslated(offset, layout);\n\n scaleRange(justification, scale);\n justification.cloneTranslated(offset, justification);\n }\n\n return { layout, justification };\n }\n\n public computeRangeForTextRun(style: TextStyleSettings, run: TextRun, charOffset: number, numChars: number): TextLayoutRanges {\n return this.computeRangeForText(run.content.substring(charOffset, charOffset + numChars), style, run.baselineShift);\n }\n\n public computeRangeForFractionRun(style: TextStyleSettings, source: FractionRun): { layout: Range2d, numerator: Range2d, denominator: Range2d } {\n const numerator = this.computeRangeForText(source.numerator, style, \"none\").layout;\n scaleRange(numerator, style.stackedFractionScale);\n\n const denominator = this.computeRangeForText(source.denominator, style, \"none\").layout;\n scaleRange(denominator, style.stackedFractionScale);\n\n const numLen = numerator.xLength();\n const denomLen = denominator.xLength();\n switch (style.stackedFractionType) {\n case \"horizontal\": {\n if (numLen > denomLen) {\n denominator.cloneTranslated({ x: (numLen - denomLen) / 2, y: 0 }, denominator);\n } else {\n numerator.cloneTranslated({ x: (denomLen - numLen) / 2, y: 0 }, numerator);\n }\n\n numerator.cloneTranslated({ x: 0, y: 1.5 * denominator.yLength() }, numerator);\n break;\n }\n case \"diagonal\": {\n numerator.cloneTranslated({ x: 0, y: denominator.yLength() }, numerator);\n denominator.cloneTranslated({ x: numLen, y: 0 }, denominator);\n break;\n }\n }\n\n const layout = numerator.clone();\n layout.extendRange(denominator);\n return { layout, numerator, denominator };\n }\n}\n\ninterface Segment {\n segment: string;\n index: number;\n}\n\nfunction split(source: string): Segment[] {\n if (source.length === 0) {\n return [];\n }\n\n let index = 0;\n const segments: Segment[] = [];\n const breaker = new LineBreaker(source);\n for (let brk = breaker.nextBreak(); brk; brk = breaker.nextBreak()) {\n segments.push({\n segment: source.slice(index, brk.position),\n index,\n });\n\n index = brk.position;\n }\n\n return segments;\n}\n\n/**\n * Represents the layout of a single run (text, fraction, or line break) within a line of text.\n * Stores information about the run's position, style, and font within the line.\n * Provides utilities for splitting text runs for word wrapping and converting to result objects.\n * @beta\n */\nexport class RunLayout {\n public source: Run;\n public charOffset: number;\n public numChars: number;\n public range: Range2d;\n public justificationRange?: Range2d;\n public denominatorRange?: Range2d;\n public numeratorRange?: Range2d;\n public offsetFromLine: { x: number, y: number };\n public style: TextStyleSettings;\n public fontId: FontId;\n\n private constructor(props: NonFunctionPropertiesOf<RunLayout>) {\n this.source = props.source;\n this.charOffset = props.charOffset;\n this.numChars = props.numChars;\n this.range = props.range;\n this.justificationRange = props.justificationRange;\n this.denominatorRange = props.denominatorRange;\n this.numeratorRange = props.numeratorRange;\n this.offsetFromLine = props.offsetFromLine;\n this.style = props.style;\n this.fontId = props.fontId;\n }\n\n public static create(source: Run, context: LayoutContext): RunLayout {\n const style = context.createRunSettings(source);\n const fontId = context.findFontId(style.fontName);\n const charOffset = 0;\n const offsetFromLine = { x: 0, y: 0 };\n let numChars = 0;\n\n let range, justificationRange, numeratorRange, denominatorRange;\n\n switch (source.type) {\n case \"text\": {\n numChars = source.content.length;\n const ranges = context.computeRangeForTextRun(style, source, charOffset, numChars);\n range = ranges.layout;\n justificationRange = ranges.justification;\n break;\n }\n case \"fraction\": {\n numChars = 1;\n const ranges = context.computeRangeForFractionRun(style, source);\n range = ranges.layout;\n numeratorRange = ranges.numerator;\n denominatorRange = ranges.denominator;\n break;\n }\n default: {\n // We do this so that blank lines space correctly without special casing later.\n range = new Range2d(0, 0, 0, style.lineHeight);\n break;\n }\n }\n\n return new RunLayout({ source, charOffset, numChars, range, justificationRange, denominatorRange, numeratorRange, offsetFromLine, style, fontId });\n }\n\n /** Compute a string representation, primarily for debugging purposes. */\n public stringify(): string {\n return this.source.type === \"text\" ? this.source.content.substring(this.charOffset, this.charOffset + this.numChars) : this.source.stringify();\n }\n\n public canWrap(): this is { source: TextRun } {\n return this.source.type === \"text\";\n }\n\n private cloneForWrap(args: { ranges: TextLayoutRanges, charOffset: number, numChars: number }): RunLayout {\n assert(this.canWrap());\n\n return new RunLayout({\n ...this,\n charOffset: args.charOffset,\n numChars: args.numChars,\n range: args.ranges.layout,\n justificationRange: args.ranges.justification,\n offsetFromLine: { ...this.offsetFromLine },\n });\n }\n\n public split(context: LayoutContext): RunLayout[] {\n assert(this.charOffset === 0, \"cannot re-split a run\");\n if (!this.canWrap() || this.charOffset > 0) {\n return [this];\n }\n\n const myText = this.source.content.substring(this.charOffset, this.charOffset + this.numChars);\n const segments = split(myText);\n\n if (segments.length <= 1) {\n return [this];\n }\n\n return segments.map((segment: any) => {\n return this.cloneForWrap({\n ranges: context.computeRangeForText(segment.segment, this.style, this.source.baselineShift),\n charOffset: segment.index,\n numChars: segment.segment.length,\n });\n });\n }\n\n public toResult(paragraph: Paragraph): RunLayoutResult {\n const result: RunLayoutResult = {\n sourceRunIndex: paragraph.runs.indexOf(this.source),\n fontId: this.fontId,\n characterOffset: this.charOffset,\n characterCount: this.numChars,\n range: this.range.toJSON(),\n offsetFromLine: this.offsetFromLine,\n textStyle: this.style.toJSON(),\n };\n\n if (this.justificationRange) {\n result.justificationRange = this.justificationRange.toJSON();\n }\n\n if (this.numeratorRange) {\n result.numeratorRange = this.numeratorRange.toJSON();\n }\n\n if (this.denominatorRange) {\n result.denominatorRange = this.denominatorRange.toJSON();\n }\n\n return result;\n }\n}\n\n/**\n * Represents the layout of a single line within a paragraph of a text block.\n * Contains a sequence of RunLayout objects, the computed range of the line, and its offset from the document origin.\n * Provides utilities for appending runs, computing ranges, and converting to result objects.\n * @beta\n */\nexport class LineLayout {\n public source: Paragraph;\n public range = new Range2d(0, 0, 0, 0);\n public justificationRange = new Range2d(0, 0, 0, 0);\n public offsetFromDocument = { x: 0, y: 0 };\n private _runs: RunLayout[] = [];\n\n public constructor(source: Paragraph) {\n this.source = source;\n }\n\n /** Compute a string representation, primarily for debugging purposes. */\n public stringify(): string {\n const runs = this._runs.map((run) => run.stringify());\n return `${runs.join(\"\")}`;\n }\n\n public get runs(): ReadonlyArray<RunLayout> { return this._runs; }\n public get isEmpty() { return this._runs.length === 0; }\n public get back(): RunLayout {\n assert(!this.isEmpty);\n return this._runs[this._runs.length - 1];\n }\n\n public append(run: RunLayout): void {\n this._runs.push(run);\n this.computeRanges();\n }\n\n /** Invoked every time a run is appended,. */\n private computeRanges(): void {\n this.range.low.setZero();\n this.range.high.setZero();\n\n // Some runs (fractions) are taller than others.\n // We want to center each run vertically inside the line.\n let lineHeight = 0;\n for (const run of this._runs) {\n lineHeight = Math.max(lineHeight, run.range.yLength());\n }\n\n for (const run of this._runs) {\n const runHeight = run.range.yLength();\n const runOffset = { x: this.range.high.x, y: (lineHeight - runHeight) / 2 };\n run.offsetFromLine = runOffset;\n\n const runLayoutRange = run.range.cloneTranslated(runOffset);\n this.range.extendRange(runLayoutRange);\n\n if (\"linebreak\" !== run.source.type) {\n const runJustificationRange = run.justificationRange?.cloneTranslated(runOffset);\n this.justificationRange.extendRange(runJustificationRange ?? runLayoutRange);\n }\n }\n }\n\n public toResult(textBlock: TextBlock): LineLayoutResult {\n return {\n sourceParagraphIndex: textBlock.paragraphs.indexOf(this.source),\n runs: this.runs.map((x) => x.toResult(this.source)),\n range: this.range.toJSON(),\n justificationRange: this.justificationRange.toJSON(),\n offsetFromDocument: this.offsetFromDocument,\n };\n }\n}\n\n/**\n * Describes the layout of a text block as a collection of lines containing runs.\n * Computes the visual layout of the text block, including word wrapping, justification, and margins.\n * Provides access to the computed lines, ranges, and utilities for converting to result objects.\n * @beta\n */\nexport class TextBlockLayout {\n public source: TextBlock;\n\n /** @internal: This is primarily for debugging purposes. This is the range of text geometry */\n public textRange = new Range2d();\n\n /** The range including margins of the [[TextBlock]]. */\n public range = new Range2d();\n public lines: LineLayout[] = [];\n private _context: LayoutContext;\n\n public constructor(source: TextBlock, context: LayoutContext) {\n this._context = context;\n this.source = source;\n\n if (source.width > 0) {\n this.textRange.low.x = 0;\n this.textRange.high.x = source.width;\n }\n\n this.populateLines(context);\n this.justifyLines();\n this.applyMargins(source.margins);\n }\n\n public toResult(): TextBlockLayoutResult {\n return {\n lines: this.lines.map((x) => x.toResult(this.source)),\n range: this.range.toJSON(),\n };\n }\n\n /** Compute a string representation, primarily for debugging purposes. */\n public stringify(): string {\n return this.lines.map((line) => line.stringify()).join(\"\\n\");\n }\n\n private get _back(): LineLayout {\n assert(this.lines.length > 0);\n return this.lines[this.lines.length - 1];\n }\n\n private populateLines(context: LayoutContext): void {\n const doc = this.source;\n if (doc.paragraphs.length === 0) {\n return;\n }\n\n const doWrap = doc.width > 0;\n let curLine = new LineLayout(doc.paragraphs[0]);\n for (let i = 0; i < doc.paragraphs.length; i++) {\n const paragraph = doc.paragraphs[i];\n if (i > 0) {\n curLine = this.flushLine(context, curLine, paragraph);\n }\n\n let runs = paragraph.runs.map((run) => RunLayout.create(run, context));\n if (doWrap) {\n runs = runs.map((run) => run.split(context)).flat();\n }\n\n for (const run of runs) {\n if (\"linebreak\" === run.source.type) {\n curLine.append(run);\n curLine = this.flushLine(context, curLine);\n continue;\n }\n\n if (!doWrap) {\n curLine.append(run);\n continue;\n }\n\n const runWidth = run.range.xLength();\n const lineWidth = curLine.range.xLength();\n if (runWidth + lineWidth < doc.width || Geometry.isAlmostEqualNumber(runWidth + lineWidth, doc.width, Geometry.smallMetricDistance)) {\n curLine.append(run);\n continue;\n }\n\n if (curLine.runs.length === 0) {\n curLine.append(run);\n curLine = this.flushLine(context, curLine);\n } else {\n curLine = this.flushLine(context, curLine);\n curLine.append(run);\n }\n }\n }\n\n if (curLine.runs.length > 0) {\n this.flushLine(context, curLine);\n }\n }\n\n private justifyLines(): void {\n // We don't want to justify empty text, or a single line of text whose width is 0. By default text is already left justified.\n if (this.lines.length < 1 || (this.lines.length === 1 && this.source.width === 0) || \"left\" === this.source.justification) {\n return;\n }\n\n // This is the minimum width of the document's bounding box.\n const docWidth = this.source.width;\n\n let minOffset = Number.MAX_VALUE;\n for (const line of this.lines) {\n const lineWidth = line.justificationRange.xLength();\n\n let offset = docWidth - lineWidth;\n if (\"center\" === this.source.justification) {\n offset = offset / 2;\n }\n\n line.offsetFromDocument.x += offset;\n minOffset = Math.min(offset, minOffset);\n }\n\n if (minOffset < 0) {\n // Shift left to accommodate lines that exceeded the document's minimum width.\n this.textRange.low.x += minOffset;\n this.textRange.high.x += minOffset;\n }\n }\n\n private flushLine(context: LayoutContext, line: LineLayout, nextParagraph?: Paragraph): LineLayout {\n nextParagraph = nextParagraph ?? line.source;\n\n // We want to guarantee that each layout line has at least one run.\n if (line.runs.length === 0) {\n // If we're empty, there should always be a preceding run, and it should be a line break.\n if (this.lines.length === 0 || this._back.runs.length === 0) {\n return new LineLayout(nextParagraph);\n }\n\n const prevRun = this._back.back.source;\n assert(prevRun.type === \"linebreak\");\n if (prevRun.type !== \"linebreak\") {\n return new LineLayout(nextParagraph);\n }\n\n line.append(RunLayout.create(prevRun.clone(), context));\n }\n\n // Line origin is its baseline.\n const lineOffset = { x: 0, y: -line.range.yLength() };\n\n // Place it below any existing lines\n if (this.lines.length > 0) {\n lineOffset.y += this._back.offsetFromDocument.y;\n lineOffset.y -= context.blockSettings.lineSpacingFactor * context.blockSettings.lineHeight;\n }\n\n line.offsetFromDocument = lineOffset;\n\n // Update document range from computed line range and position\n this.textRange.extendRange(line.range.cloneTranslated(lineOffset));\n\n this.lines.push(line);\n return new LineLayout(nextParagraph);\n }\n\n private applyMargins(margins: TextBlockMargins) {\n this.range = this.textRange.clone();\n\n if (this.range.isNull)\n return;\n\n // Disregard negative margins.\n const right = margins.right >= 0 ? margins.right : 0;\n const left = margins.left >= 0 ? margins.left : 0;\n const top = margins.top >= 0 ? margins.top : 0;\n const bottom = margins.bottom >= 0 ? margins.bottom : 0;\n\n const xHigh = this.textRange.high.x + right;\n const yHigh = this.textRange.high.y + top;\n const xLow = this.textRange.low.x - left;\n const yLow = this.textRange.low.y - bottom;\n\n this.range.extendXY(xHigh, yHigh);\n this.range.extendXY(xLow, yLow);\n }\n}\n"]}