@mlightcad/cad-simple-viewer 1.5.9 → 1.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/dist/cad-simple-viewer.js +8345 -7349
  2. package/dist/cad-simple-viewer.umd.cjs +37 -37
  3. package/dist/mtext-renderer-worker.js +2896 -2767
  4. package/lib/app/AcApDocManager.d.ts +17 -8
  5. package/lib/app/AcApDocManager.d.ts.map +1 -1
  6. package/lib/app/AcApDocManager.js +50 -13
  7. package/lib/app/AcApDocManager.js.map +1 -1
  8. package/lib/app/AcApFontLoader.d.ts +49 -26
  9. package/lib/app/AcApFontLoader.d.ts.map +1 -1
  10. package/lib/app/AcApFontLoader.js +245 -48
  11. package/lib/app/AcApFontLoader.js.map +1 -1
  12. package/lib/app/AcApOpenFileProfiler.d.ts +70 -17
  13. package/lib/app/AcApOpenFileProfiler.d.ts.map +1 -1
  14. package/lib/app/AcApOpenFileProfiler.js +96 -46
  15. package/lib/app/AcApOpenFileProfiler.js.map +1 -1
  16. package/lib/app/AcApOpenFileProgressController.d.ts +22 -5
  17. package/lib/app/AcApOpenFileProgressController.d.ts.map +1 -1
  18. package/lib/app/AcApOpenFileProgressController.js +76 -31
  19. package/lib/app/AcApOpenFileProgressController.js.map +1 -1
  20. package/lib/app/AcApProgress.d.ts +6 -0
  21. package/lib/app/AcApProgress.d.ts.map +1 -1
  22. package/lib/app/AcApProgress.js +11 -0
  23. package/lib/app/AcApProgress.js.map +1 -1
  24. package/lib/app/AcDbOpenDatabaseOptions.d.ts +15 -12
  25. package/lib/app/AcDbOpenDatabaseOptions.d.ts.map +1 -1
  26. package/lib/app/index.d.ts +1 -0
  27. package/lib/app/index.d.ts.map +1 -1
  28. package/lib/app/index.js +1 -0
  29. package/lib/app/index.js.map +1 -1
  30. package/lib/editor/view/AcEdSpatialQueryResult.d.ts +10 -0
  31. package/lib/editor/view/AcEdSpatialQueryResult.d.ts.map +1 -1
  32. package/lib/editor/view/AcEdSpatialQueryResult.js +36 -0
  33. package/lib/editor/view/AcEdSpatialQueryResult.js.map +1 -1
  34. package/lib/i18n/cs/command.d.ts +3 -0
  35. package/lib/i18n/cs/command.d.ts.map +1 -1
  36. package/lib/i18n/cs/command.js +3 -0
  37. package/lib/i18n/cs/command.js.map +1 -1
  38. package/lib/i18n/cs/main.d.ts +1 -0
  39. package/lib/i18n/cs/main.d.ts.map +1 -1
  40. package/lib/i18n/cs/main.js +1 -0
  41. package/lib/i18n/cs/main.js.map +1 -1
  42. package/lib/i18n/en/command.d.ts +3 -0
  43. package/lib/i18n/en/command.d.ts.map +1 -1
  44. package/lib/i18n/en/command.js +3 -0
  45. package/lib/i18n/en/command.js.map +1 -1
  46. package/lib/i18n/en/main.d.ts +1 -0
  47. package/lib/i18n/en/main.d.ts.map +1 -1
  48. package/lib/i18n/en/main.js +1 -0
  49. package/lib/i18n/en/main.js.map +1 -1
  50. package/lib/i18n/tr/command.d.ts +3 -0
  51. package/lib/i18n/tr/command.d.ts.map +1 -1
  52. package/lib/i18n/tr/command.js +3 -0
  53. package/lib/i18n/tr/command.js.map +1 -1
  54. package/lib/i18n/tr/main.d.ts +1 -0
  55. package/lib/i18n/tr/main.d.ts.map +1 -1
  56. package/lib/i18n/tr/main.js +1 -0
  57. package/lib/i18n/tr/main.js.map +1 -1
  58. package/lib/i18n/zh/command.d.ts +3 -0
  59. package/lib/i18n/zh/command.d.ts.map +1 -1
  60. package/lib/i18n/zh/command.js +3 -0
  61. package/lib/i18n/zh/command.js.map +1 -1
  62. package/lib/i18n/zh/main.d.ts +1 -0
  63. package/lib/i18n/zh/main.d.ts.map +1 -1
  64. package/lib/i18n/zh/main.js +1 -0
  65. package/lib/i18n/zh/main.js.map +1 -1
  66. package/lib/spatialIndex/AcTrHierarchicalSpatialIndex.d.ts.map +1 -1
  67. package/lib/spatialIndex/AcTrHierarchicalSpatialIndex.js +2 -2
  68. package/lib/spatialIndex/AcTrHierarchicalSpatialIndex.js.map +1 -1
  69. package/lib/spatialIndex/AcTrLinearSpatialIndex.d.ts +6 -1
  70. package/lib/spatialIndex/AcTrLinearSpatialIndex.d.ts.map +1 -1
  71. package/lib/spatialIndex/AcTrLinearSpatialIndex.js +68 -11
  72. package/lib/spatialIndex/AcTrLinearSpatialIndex.js.map +1 -1
  73. package/lib/spatialIndex/AcTrRBushSpatialIndex.d.ts.map +1 -1
  74. package/lib/spatialIndex/AcTrRBushSpatialIndex.js +58 -12
  75. package/lib/spatialIndex/AcTrRBushSpatialIndex.js.map +1 -1
  76. package/lib/view/AcTrDirectBatch.d.ts +18 -0
  77. package/lib/view/AcTrDirectBatch.d.ts.map +1 -0
  78. package/lib/view/AcTrDirectBatch.js +113 -0
  79. package/lib/view/AcTrDirectBatch.js.map +1 -0
  80. package/lib/view/AcTrLayer.d.ts +7 -1
  81. package/lib/view/AcTrLayer.d.ts.map +1 -1
  82. package/lib/view/AcTrLayer.js +29 -0
  83. package/lib/view/AcTrLayer.js.map +1 -1
  84. package/lib/view/AcTrLayout.d.ts +11 -1
  85. package/lib/view/AcTrLayout.d.ts.map +1 -1
  86. package/lib/view/AcTrLayout.js +43 -0
  87. package/lib/view/AcTrLayout.js.map +1 -1
  88. package/lib/view/AcTrProgressiveOpenFitController.d.ts +10 -6
  89. package/lib/view/AcTrProgressiveOpenFitController.d.ts.map +1 -1
  90. package/lib/view/AcTrProgressiveOpenFitController.js +35 -76
  91. package/lib/view/AcTrProgressiveOpenFitController.js.map +1 -1
  92. package/lib/view/AcTrScene.d.ts +7 -1
  93. package/lib/view/AcTrScene.d.ts.map +1 -1
  94. package/lib/view/AcTrScene.js +18 -0
  95. package/lib/view/AcTrScene.js.map +1 -1
  96. package/lib/view/AcTrView2d.d.ts +87 -12
  97. package/lib/view/AcTrView2d.d.ts.map +1 -1
  98. package/lib/view/AcTrView2d.js +501 -166
  99. package/lib/view/AcTrView2d.js.map +1 -1
  100. package/lib/view/index.d.ts +1 -0
  101. package/lib/view/index.d.ts.map +1 -1
  102. package/lib/view/index.js +1 -0
  103. package/lib/view/index.js.map +1 -1
  104. package/package.json +7 -7
@@ -1,3 +1,14 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
1
12
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
13
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
14
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -34,41 +45,94 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
34
45
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
46
  }
36
47
  };
48
+ var __values = (this && this.__values) || function(o) {
49
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
50
+ if (m) return m.call(o);
51
+ if (o && typeof o.length === "number") return {
52
+ next: function () {
53
+ if (o && i >= o.length) o = void 0;
54
+ return { value: o && o[i++], done: !o };
55
+ }
56
+ };
57
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
58
+ };
59
+ var __read = (this && this.__read) || function (o, n) {
60
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
61
+ if (!m) return o;
62
+ var i = m.call(o), r, ar = [], e;
63
+ try {
64
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
65
+ }
66
+ catch (error) { e = { error: error }; }
67
+ finally {
68
+ try {
69
+ if (r && !r.done && (m = i["return"])) m.call(i);
70
+ }
71
+ finally { if (e) throw e.error; }
72
+ }
73
+ return ar;
74
+ };
75
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
76
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
77
+ if (ar || !(i in from)) {
78
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
79
+ ar[i] = from[i];
80
+ }
81
+ }
82
+ return to.concat(ar || Array.prototype.slice.call(from));
83
+ };
37
84
  import { AcDbOpenDatabaseError } from '@mlightcad/data-model';
38
85
  import { AcTrFontLoader } from '@mlightcad/three-renderer';
39
86
  import { eventBus } from '../editor';
87
+ var lastFontLoadStats = null;
88
+ /** Returns timing from the most recent {@link AcApFontLoader.load} call. */
89
+ export function getLastFontLoadStats() {
90
+ return lastFontLoadStats ? __assign({}, lastFontLoadStats) : null;
91
+ }
92
+ function isMeshFontInfo(info) {
93
+ var _a, _b;
94
+ var type = String((_a = info.type) !== null && _a !== void 0 ? _a : '').toLowerCase();
95
+ if (type === 'mesh' || type === 'ttf' || type === 'otf' || type === 'woff') {
96
+ return true;
97
+ }
98
+ var file = String((_b = info.file) !== null && _b !== void 0 ? _b : '').toLowerCase();
99
+ return (file.endsWith('.ttf') ||
100
+ file.endsWith('.otf') ||
101
+ file.endsWith('.woff') ||
102
+ file.endsWith('.woff2'));
103
+ }
40
104
  /**
41
- * Font loader implementation for CAD text rendering.
105
+ * Viewer-side font loader for explicit loads (default fonts, missing-font UI).
42
106
  *
43
- * This class implements the {@link AcDbFontLoader} interface and provides functionality to:
44
- * - Fetch available font metadata from a CDN
45
- * - Load required fonts for CAD text rendering
46
- * - Handle font loading errors and emit appropriate events
47
- * - Manage font availability checking
107
+ * Drawing open no longer collects or awaits fonts in data-model. Text entities
108
+ * load faces on demand via {@link FontManager.lazyFontLoading}. This class is
109
+ * still used for {@link AcApDocManager.loadFonts} /
110
+ * {@link AcApDocManager.loadDefaultFonts}.
48
111
  *
49
- * The font loader works with a Three.js renderer to load fonts that are used
50
- * for rendering CAD text entities like MText and Text.
112
+ * Mesh/TTF/WOFF fonts (e.g. `simsun.woff`) are expensive to re-parse from
113
+ * IndexedDB. When {@link deferMeshFonts} is true and a load mixes SHX with
114
+ * mesh fonts, SHX is awaited first and mesh continues in the background.
115
+ * Mesh-only loads always await so callers like
116
+ * {@link AcApFontUtil.ensureDrawingFontLoaded} see a ready face.
51
117
  *
52
118
  * @example
53
119
  * ```typescript
54
- * const renderer = new AcTrRenderer();
55
- * const fontLoader = new AcApFontLoader(renderer);
56
- *
57
- * // Load specific fonts
120
+ * const fontLoader = new AcApFontLoader();
58
121
  * await fontLoader.load(['Arial', 'SimSun']);
59
- *
60
- * // Get all available fonts
61
- * const fonts = await fontLoader.getAvaiableFonts();
62
- * console.log('Available fonts:', fonts);
63
122
  * ```
64
123
  */
65
124
  var AcApFontLoader = /** @class */ (function () {
66
125
  /**
67
126
  * Creates a new font loader instance.
68
- *
69
- * @param renderer - The Three.js renderer that will use the loaded fonts
70
127
  */
71
128
  function AcApFontLoader() {
129
+ /**
130
+ * When true (default), mixed SHX+mesh {@link load} calls await only SHX;
131
+ * mesh fonts continue in the background. Mesh-only loads still await.
132
+ */
133
+ this.deferMeshFonts = true;
134
+ /** Serialize overlapping loads (init defaults vs UI loads) to avoid double-parse. */
135
+ this._loadChain = Promise.resolve();
72
136
  this._loader = new AcTrFontLoader();
73
137
  }
74
138
  Object.defineProperty(AcApFontLoader.prototype, "baseUrl", {
@@ -86,7 +150,7 @@ var AcApFontLoader = /** @class */ (function () {
86
150
  });
87
151
  Object.defineProperty(AcApFontLoader.prototype, "avaiableFonts", {
88
152
  /**
89
- * Avaiable fonts to load.
153
+ * Available fonts already fetched into the underlying loader cache.
90
154
  */
91
155
  get: function () {
92
156
  return this._loader.avaiableFonts;
@@ -95,7 +159,7 @@ var AcApFontLoader = /** @class */ (function () {
95
159
  configurable: true
96
160
  });
97
161
  /**
98
- * @inheritdoc
162
+ * Fetches available font metadata from the font repository.
99
163
  */
100
164
  AcApFontLoader.prototype.getAvaiableFonts = function () {
101
165
  return __awaiter(this, void 0, void 0, function () {
@@ -108,52 +172,185 @@ var AcApFontLoader = /** @class */ (function () {
108
172
  });
109
173
  };
110
174
  /**
111
- * @inheritdoc
175
+ * Loads the given font names. With {@link deferMeshFonts}, mixed SHX+mesh
176
+ * loads await SHX first; mesh-only loads always await.
112
177
  */
113
178
  AcApFontLoader.prototype.load = function (fontNames) {
114
179
  return __awaiter(this, void 0, void 0, function () {
115
- var loadStatus, error_1, fontsNotFound, fontsNotLoaded;
180
+ var run, result;
181
+ var _this = this;
116
182
  return __generator(this, function (_a) {
117
- switch (_a.label) {
183
+ run = function () { return _this.loadInternal(fontNames); };
184
+ result = this._loadChain.then(run, run);
185
+ this._loadChain = result.then(function () { return undefined; }, function () { return undefined; });
186
+ return [2 /*return*/, result];
187
+ });
188
+ });
189
+ };
190
+ AcApFontLoader.prototype.loadInternal = function (fontNames) {
191
+ return __awaiter(this, void 0, void 0, function () {
192
+ var totalStartedAt, loadStatus, criticalFonts, deferredFonts, metaMs, criticalLoadMs, deferredLoadMs, metaStartedAt, available, byName, available_1, available_1_1, info, _a, _b, name_1, fontNames_1, fontNames_1_1, raw, key, info, shouldDeferMesh, criticalStartedAt, _c, deferredStartedAt, deferredStatus, stats_1, deferredStartedAt_1, error_1;
193
+ var e_1, _d, e_2, _e, e_3, _f;
194
+ var _this = this;
195
+ return __generator(this, function (_g) {
196
+ switch (_g.label) {
118
197
  case 0:
119
- _a.trys.push([0, 2, , 3]);
120
- return [4 /*yield*/, this._loader.load(fontNames)];
198
+ totalStartedAt = performance.now();
199
+ loadStatus = [];
200
+ criticalFonts = [];
201
+ deferredFonts = [];
202
+ metaMs = 0;
203
+ criticalLoadMs = 0;
204
+ deferredLoadMs = 0;
205
+ _g.label = 1;
121
206
  case 1:
122
- loadStatus = _a.sent();
123
- return [3 /*break*/, 3];
207
+ _g.trys.push([1, 9, , 10]);
208
+ metaStartedAt = performance.now();
209
+ return [4 /*yield*/, this._loader.getAvailableFonts()];
124
210
  case 2:
125
- error_1 = _a.sent();
126
- throw new AcDbOpenDatabaseError(error_1 instanceof Error ? error_1.message : String(error_1), 'font_load_failed', { stage: 'FONT', cause: error_1 });
127
- case 3:
128
- fontsNotFound = [];
129
- fontsNotLoaded = [];
130
- loadStatus.forEach(function (item) {
131
- if (item.status === 'NotFound') {
132
- fontsNotFound.push(item.fontName);
211
+ available = _g.sent();
212
+ metaMs = performance.now() - metaStartedAt;
213
+ byName = new Map();
214
+ try {
215
+ for (available_1 = __values(available), available_1_1 = available_1.next(); !available_1_1.done; available_1_1 = available_1.next()) {
216
+ info = available_1_1.value;
217
+ try {
218
+ for (_a = (e_2 = void 0, __values(info.name)), _b = _a.next(); !_b.done; _b = _a.next()) {
219
+ name_1 = _b.value;
220
+ byName.set(name_1.toLowerCase(), info);
221
+ }
222
+ }
223
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
224
+ finally {
225
+ try {
226
+ if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
227
+ }
228
+ finally { if (e_2) throw e_2.error; }
229
+ }
133
230
  }
134
- else if (item.status === 'FailedToLoad') {
135
- fontsNotLoaded.push({
136
- fontName: item.fontName,
137
- url: item.url
138
- });
231
+ }
232
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
233
+ finally {
234
+ try {
235
+ if (available_1_1 && !available_1_1.done && (_d = available_1.return)) _d.call(available_1);
139
236
  }
140
- });
141
- if (fontsNotFound.length > 0) {
142
- eventBus.emit('fonts-not-found', {
143
- fonts: fontsNotFound
144
- });
237
+ finally { if (e_1) throw e_1.error; }
238
+ }
239
+ try {
240
+ for (fontNames_1 = __values(fontNames), fontNames_1_1 = fontNames_1.next(); !fontNames_1_1.done; fontNames_1_1 = fontNames_1.next()) {
241
+ raw = fontNames_1_1.value;
242
+ key = raw.toLowerCase();
243
+ info = byName.get(key);
244
+ if (this.deferMeshFonts && info && isMeshFontInfo(info)) {
245
+ deferredFonts.push(raw);
246
+ }
247
+ else {
248
+ criticalFonts.push(raw);
249
+ }
250
+ }
251
+ }
252
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
253
+ finally {
254
+ try {
255
+ if (fontNames_1_1 && !fontNames_1_1.done && (_f = fontNames_1.return)) _f.call(fontNames_1);
256
+ }
257
+ finally { if (e_3) throw e_3.error; }
145
258
  }
146
- if (fontsNotLoaded.length > 0) {
147
- eventBus.emit('fonts-not-loaded', {
148
- fonts: fontsNotLoaded
259
+ shouldDeferMesh = this.deferMeshFonts &&
260
+ deferredFonts.length > 0 &&
261
+ criticalFonts.length > 0;
262
+ criticalStartedAt = performance.now();
263
+ if (!(criticalFonts.length > 0)) return [3 /*break*/, 4];
264
+ return [4 /*yield*/, this._loader.load(criticalFonts)];
265
+ case 3:
266
+ _c = _g.sent();
267
+ return [3 /*break*/, 5];
268
+ case 4:
269
+ _c = [];
270
+ _g.label = 5;
271
+ case 5:
272
+ loadStatus = _c;
273
+ criticalLoadMs = performance.now() - criticalStartedAt;
274
+ if (!(deferredFonts.length > 0 && !shouldDeferMesh)) return [3 /*break*/, 7];
275
+ deferredStartedAt = performance.now();
276
+ return [4 /*yield*/, this._loader.load(deferredFonts)];
277
+ case 6:
278
+ deferredStatus = _g.sent();
279
+ deferredLoadMs = performance.now() - deferredStartedAt;
280
+ loadStatus = __spreadArray(__spreadArray([], __read(loadStatus), false), __read(deferredStatus), false);
281
+ return [3 /*break*/, 8];
282
+ case 7:
283
+ if (shouldDeferMesh) {
284
+ // Still in flight when load() resolves; null until the callback fills it in.
285
+ deferredLoadMs = null;
286
+ }
287
+ _g.label = 8;
288
+ case 8:
289
+ stats_1 = {
290
+ fontCount: fontNames.length,
291
+ criticalFonts: __spreadArray([], __read(criticalFonts), false),
292
+ deferredFonts: __spreadArray([], __read(deferredFonts), false),
293
+ metaMs: metaMs,
294
+ criticalLoadMs: criticalLoadMs,
295
+ deferredLoadMs: deferredLoadMs,
296
+ deferred: shouldDeferMesh,
297
+ totalMs: performance.now() - totalStartedAt
298
+ };
299
+ lastFontLoadStats = stats_1;
300
+ if (shouldDeferMesh && deferredFonts.length > 0) {
301
+ deferredStartedAt_1 = performance.now();
302
+ void this._loader.load(deferredFonts).then(function (status) {
303
+ if (lastFontLoadStats === stats_1) {
304
+ stats_1.deferredLoadMs = performance.now() - deferredStartedAt_1;
305
+ }
306
+ _this.emitPartialFailures(status);
307
+ }, function (error) {
308
+ if (lastFontLoadStats === stats_1) {
309
+ stats_1.deferredLoadMs = performance.now() - deferredStartedAt_1;
310
+ }
311
+ logDeferredFontError(error);
149
312
  });
150
313
  }
314
+ return [3 /*break*/, 10];
315
+ case 9:
316
+ error_1 = _g.sent();
317
+ throw new AcDbOpenDatabaseError(error_1 instanceof Error ? error_1.message : String(error_1), 'font_load_failed', { cause: error_1 });
318
+ case 10:
319
+ this.emitPartialFailures(loadStatus);
151
320
  return [2 /*return*/];
152
321
  }
153
322
  });
154
323
  });
155
324
  };
325
+ AcApFontLoader.prototype.emitPartialFailures = function (loadStatus) {
326
+ var fontsNotFound = [];
327
+ var fontsNotLoaded = [];
328
+ loadStatus.forEach(function (item) {
329
+ if (item.status === 'NotFound') {
330
+ fontsNotFound.push(item.fontName);
331
+ }
332
+ else if (item.status === 'FailedToLoad') {
333
+ fontsNotLoaded.push({
334
+ fontName: item.fontName,
335
+ url: item.url
336
+ });
337
+ }
338
+ });
339
+ if (fontsNotFound.length > 0) {
340
+ eventBus.emit('fonts-not-found', {
341
+ fonts: fontsNotFound
342
+ });
343
+ }
344
+ if (fontsNotLoaded.length > 0) {
345
+ eventBus.emit('fonts-not-loaded', {
346
+ fonts: fontsNotLoaded
347
+ });
348
+ }
349
+ };
156
350
  return AcApFontLoader;
157
351
  }());
158
352
  export { AcApFontLoader };
353
+ function logDeferredFontError(error) {
354
+ console.warn('[AcApFontLoader] Deferred mesh font load failed; text may use SHX fallbacks.', error);
355
+ }
159
356
  //# sourceMappingURL=AcApFontLoader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AcApFontLoader.js","sourceRoot":"","sources":["../../src/app/AcApFontLoader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAGL,qBAAqB,EACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,OAAO,EAAyB,QAAQ,EAAE,MAAM,WAAW,CAAA;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH;IAIE;;;;OAIG;IACH;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,EAAE,CAAA;IACrC,CAAC;IAKD,sBAAI,mCAAO;QAHX;;WAEG;aACH;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;QAC7B,CAAC;aACD,UAAY,KAAa;YACvB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAA;QAC9B,CAAC;;;OAHA;IAQD,sBAAI,yCAAa;QAHjB;;WAEG;aACH;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAA;QACnC,CAAC;;;OAAA;IAED;;OAEG;IACG,yCAAgB,GAAtB;;;;4BACS,qBAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAA;4BAA7C,sBAAO,SAAsC,EAAA;;;;KAC9C;IAED;;OAEG;IACG,6BAAI,GAAV,UAAW,SAAmB;;;;;;;wBAGb,qBAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAA;;wBAA/C,UAAU,GAAG,SAAkC,CAAA;;;;wBAE/C,MAAM,IAAI,qBAAqB,CAC7B,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAK,CAAC,EACtD,kBAAkB,EAClB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAK,EAAE,CAChC,CAAA;;wBAEG,aAAa,GAAa,EAAE,CAAA;wBAC5B,cAAc,GAA4B,EAAE,CAAA;wBAClD,UAAU,CAAC,OAAO,CAAC,UAAA,IAAI;4BACrB,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gCAC/B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;4BACnC,CAAC;iCAAM,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;gCAC1C,cAAc,CAAC,IAAI,CAAC;oCAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oCACvB,GAAG,EAAE,IAAI,CAAC,GAAG;iCACd,CAAC,CAAA;4BACJ,CAAC;wBACH,CAAC,CAAC,CAAA;wBACF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC7B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE;gCAC/B,KAAK,EAAE,aAAa;6BACrB,CAAC,CAAA;wBACJ,CAAC;wBACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC9B,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE;gCAChC,KAAK,EAAE,cAAc;6BACtB,CAAC,CAAA;wBACJ,CAAC;;;;;KACF;IACH,qBAAC;AAAD,CAAC,AA1ED,IA0EC"}
1
+ {"version":3,"file":"AcApFontLoader.js","sourceRoot":"","sources":["../../src/app/AcApFontLoader.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,70 @@
1
1
  import { AcDbDatabase } from '@mlightcad/data-model';
2
2
  import type { AcTrView2d } from '../view/AcTrView2d';
3
3
  /**
4
- * Session open-file profiler gated by the {@link AcDbSystemVariables.OPENPROF}
5
- * system variable.
4
+ * Snapshot of the most recent document-open profile for palette / console use.
5
+ */
6
+ export interface AcApOpenFileProfileSnapshot {
7
+ collectedAt: number;
8
+ fileName?: string;
9
+ totalMs: number;
10
+ readMs: number;
11
+ convertMs: number;
12
+ parseMs: number;
13
+ entityMs: number;
14
+ stages: {
15
+ name: string;
16
+ durationMs: number;
17
+ }[];
18
+ cache: {
19
+ hits: number;
20
+ misses: number;
21
+ hitMs: number;
22
+ cloneMs: number;
23
+ missBuildMs: number;
24
+ missCompactMs: number;
25
+ setCloneMs: number;
26
+ applyMs: number;
27
+ topLevel: {
28
+ hits: number;
29
+ misses: number;
30
+ hitMs: number;
31
+ cloneMs: number;
32
+ missBuildMs: number;
33
+ missCompactMs: number;
34
+ setCloneMs: number;
35
+ applyMs: number;
36
+ };
37
+ };
38
+ slowBlocks: {
39
+ blockName: string;
40
+ buildMs: number;
41
+ compactMs: number;
42
+ }[];
43
+ progressive?: {
44
+ enabled: boolean;
45
+ paintCount: number;
46
+ yieldCount: number;
47
+ };
48
+ }
49
+ /**
50
+ * Session open-file profiler.
6
51
  *
7
- * When enabled, records PARSE/FONT/ENTITY (and other `openProgress` sub-stages),
8
- * wall-clock read vs scene convert time, and {@link AcDbRenderingCache} hit/miss
9
- * counters, then prints a console summary once the view finishes converting
10
- * entities (`isProcessingEntities === false`).
52
+ * Always records PARSE/ENTITY (and other `openProgress` sub-stages),
53
+ * wall-clock read vs scene convert time, and {@link AcDbRenderingCache}
54
+ * hit/miss counters for the last open. Console output remains gated by the
55
+ * {@link AcDbSystemVariables.OPENPROF} system variable.
11
56
  *
12
57
  * Stage durations use **active-stage wall time**: from the first event of a
13
- * sub-stage until the first event of a different sub-stage. This matches the
14
- * UI overlay (e.g. font download that continues after a converter emits
15
- * `FONT`/`END` prematurely) better than START→END alone.
58
+ * sub-stage until the first event of a different sub-stage.
59
+ *
60
+ * Drawing fonts are loaded on demand during text draw, not during `db.read`.
61
+ * Explicit {@link AcApFontLoader} loads still contribute via
62
+ * {@link getLastFontLoadStats} in the console report.
16
63
  */
17
64
  export declare class AcApOpenFileProfiler {
65
+ private static _lastSnapshot;
18
66
  private _active;
67
+ private _printToConsole;
19
68
  private _t0;
20
69
  private _readEndMs;
21
70
  private _stages;
@@ -25,34 +74,38 @@ export declare class AcApOpenFileProfiler {
25
74
  private _database?;
26
75
  private _finishScheduled;
27
76
  /**
28
- * Returns whether OPENPROF is currently enabled for `database`.
77
+ * Returns the most recent completed open-file profile, if any.
78
+ */
79
+ static getLastSnapshot(): AcApOpenFileProfileSnapshot | null;
80
+ /**
81
+ * Returns whether OPENPROF console logging is enabled for `database`.
29
82
  */
30
83
  static isEnabled(database: AcDbDatabase): boolean;
31
84
  /**
32
- * Starts a profiling session if OPENPROF is on.
85
+ * Starts a profiling session for the next document open.
33
86
  *
34
- * Call from document-open start (before `db.read` / URI open). Safe to call
35
- * when profiling is off it becomes a no-op.
87
+ * Call from document-open start (before `db.read` / URI open). Always
88
+ * collects a snapshot; console printing follows OPENPROF.
36
89
  *
37
90
  * @param database - Database that will emit `openProgress` for this open.
38
91
  */
39
92
  begin(database: AcDbDatabase): void;
40
93
  /**
41
- * Marks the end of `db.read` / document open await and schedules the console
42
- * report once the view has finished converting entities.
94
+ * Marks the end of `db.read` / document open await and schedules the report
95
+ * once the view has finished converting entities.
43
96
  *
44
97
  * @param view - Active 2d view whose entity convert queue is drained.
45
98
  */
46
99
  markReadCompleteAndScheduleReport(view: AcTrView2d): void;
47
100
  /**
48
- * Aborts an in-flight session without printing (e.g. document replaced).
101
+ * Aborts an in-flight session without publishing (e.g. document replaced).
49
102
  */
50
103
  cancel(): void;
51
104
  private onProgress;
52
105
  private closeActiveStage;
53
106
  private scheduleReport;
54
107
  private waitForIdle;
55
- private printReport;
108
+ private publishReport;
56
109
  private detachProgressListener;
57
110
  }
58
111
  //# sourceMappingURL=AcApOpenFileProfiler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AcApOpenFileProfiler.d.ts","sourceRoot":"","sources":["../../src/app/AcApOpenFileProfiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAMb,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAMpD;;;;;;;;;;;;;GAaG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,GAAG,CAAI;IACf,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,qBAAqB,CAAI;IACjC,OAAO,CAAC,iBAAiB,CAAC,CAAwC;IAClE,OAAO,CAAC,SAAS,CAAC,CAAc;IAChC,OAAO,CAAC,gBAAgB,CAAQ;IAEhC;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAajD;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAwBnC;;;;;OAKG;IACH,iCAAiC,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAQzD;;OAEG;IACH,MAAM,IAAI,IAAI;IAYd,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,cAAc;YAmBR,WAAW;IAkBzB,OAAO,CAAC,WAAW;IAkFnB,OAAO,CAAC,sBAAsB;CAQ/B"}
1
+ {"version":3,"file":"AcApOpenFileProfiler.d.ts","sourceRoot":"","sources":["../../src/app/AcApOpenFileProfiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAMb,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAOpD;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC9C,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,MAAM,CAAA;QACnB,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAA;YACZ,MAAM,EAAE,MAAM,CAAA;YACd,KAAK,EAAE,MAAM,CAAA;YACb,OAAO,EAAE,MAAM,CAAA;YACf,WAAW,EAAE,MAAM,CAAA;YACnB,aAAa,EAAE,MAAM,CAAA;YACrB,UAAU,EAAE,MAAM,CAAA;YAClB,OAAO,EAAE,MAAM,CAAA;SAChB,CAAA;KACF,CAAA;IACD,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;KAClB,EAAE,CAAA;IACH,WAAW,CAAC,EAAE;QACZ,OAAO,EAAE,OAAO,CAAA;QAChB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,aAAa,CAA2C;IAEvE,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,GAAG,CAAI;IACf,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,qBAAqB,CAAI;IACjC,OAAO,CAAC,iBAAiB,CAAC,CAAwC;IAClE,OAAO,CAAC,SAAS,CAAC,CAAc;IAChC,OAAO,CAAC,gBAAgB,CAAQ;IAEhC;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,2BAA2B,GAAG,IAAI;IAI5D;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAajD;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAsBnC;;;;;OAKG;IACH,iCAAiC,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAQzD;;OAEG;IACH,MAAM,IAAI,IAAI;IAad,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,cAAc;YAmBR,WAAW;IAkBzB,OAAO,CAAC,aAAa;IAwIrB,OAAO,CAAC,sBAAsB;CAQ/B"}