@mlightcad/data-model 1.10.7 → 1.11.1

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 (226) hide show
  1. package/README.md +1 -1
  2. package/dist/data-model.cjs +12 -12
  3. package/lib/acis/AcDbAcisDecode.d.ts +3 -3
  4. package/lib/acis/AcDbAcisDecode.js +8 -8
  5. package/lib/acis/AcDbAcisEntities.d.ts +2 -2
  6. package/lib/acis/AcDbAcisEntities.js +2 -2
  7. package/lib/acis/AcDbAcisGeometry.d.ts +5 -5
  8. package/lib/acis/AcDbAcisGeometry.js +5 -5
  9. package/lib/acis/AcDbAcisSab.d.ts +1 -1
  10. package/lib/acis/AcDbAcisSab.js +1 -1
  11. package/lib/acis/AcDbAcisSatWireframe.d.ts +1 -1
  12. package/lib/acis/AcDbAcisSatWireframe.js +3 -3
  13. package/lib/acis/AcDbAcisWireframe.js +8 -8
  14. package/lib/acis/index.d.ts +6 -6
  15. package/lib/acis/index.d.ts.map +1 -1
  16. package/lib/acis/index.js +6 -6
  17. package/lib/acis/index.js.map +1 -1
  18. package/lib/base/AcDbHostApplicationServices.d.ts +1 -1
  19. package/lib/base/AcDbHostApplicationServices.js +3 -3
  20. package/lib/base/AcDbObject.d.ts +1 -1
  21. package/lib/base/AcDbObject.d.ts.map +1 -1
  22. package/lib/base/AcDbObject.js +9 -6
  23. package/lib/base/AcDbObject.js.map +1 -1
  24. package/lib/base/index.d.ts +2 -2
  25. package/lib/base/index.js +2 -2
  26. package/lib/converter/AcDbRegenerator.d.ts.map +1 -1
  27. package/lib/converter/AcDbRegenerator.js +40 -4
  28. package/lib/converter/AcDbRegenerator.js.map +1 -1
  29. package/lib/converter/index.d.ts +1 -1
  30. package/lib/converter/index.d.ts.map +1 -1
  31. package/lib/converter/index.js +1 -1
  32. package/lib/converter/index.js.map +1 -1
  33. package/lib/converter/worker/AcDbWorkerManager.d.ts +1 -1
  34. package/lib/converter/worker/AcDbWorkerManager.d.ts.map +1 -1
  35. package/lib/converter/worker/AcDbWorkerManager.js +1 -1
  36. package/lib/converter/worker/AcDbWorkerManager.js.map +1 -1
  37. package/lib/converter/worker/index.d.ts +1 -1
  38. package/lib/converter/worker/index.d.ts.map +1 -1
  39. package/lib/converter/worker/index.js +1 -1
  40. package/lib/converter/worker/index.js.map +1 -1
  41. package/lib/database/AcDbBlockTableRecord.d.ts +12 -7
  42. package/lib/database/AcDbBlockTableRecord.d.ts.map +1 -1
  43. package/lib/database/AcDbBlockTableRecord.js +15 -9
  44. package/lib/database/AcDbBlockTableRecord.js.map +1 -1
  45. package/lib/database/AcDbDatabase.d.ts +49 -0
  46. package/lib/database/AcDbDatabase.d.ts.map +1 -1
  47. package/lib/database/AcDbDatabase.js +304 -27
  48. package/lib/database/AcDbDatabase.js.map +1 -1
  49. package/lib/database/AcDbLayerTableRecord.d.ts +1 -1
  50. package/lib/database/AcDbLayerTableRecord.d.ts.map +1 -1
  51. package/lib/database/AcDbLayerTableRecord.js +3 -3
  52. package/lib/database/AcDbLayerTableRecord.js.map +1 -1
  53. package/lib/database/index.d.ts +1 -1
  54. package/lib/database/index.d.ts.map +1 -1
  55. package/lib/database/index.js +1 -1
  56. package/lib/database/index.js.map +1 -1
  57. package/lib/database/transaction/AcDbChangeApplier.d.ts +4 -4
  58. package/lib/database/transaction/AcDbChangeApplier.d.ts.map +1 -1
  59. package/lib/database/transaction/AcDbChangeApplier.js +6 -6
  60. package/lib/database/transaction/AcDbChangeApplier.js.map +1 -1
  61. package/lib/database/transaction/AcDbChangeRecorder.d.ts.map +1 -1
  62. package/lib/database/transaction/AcDbChangeRecorder.js +2 -2
  63. package/lib/database/transaction/AcDbChangeRecorder.js.map +1 -1
  64. package/lib/database/transaction/AcDbDatabaseChange.d.ts +1 -1
  65. package/lib/database/transaction/AcDbDatabaseChange.d.ts.map +1 -1
  66. package/lib/database/transaction/AcDbDatabaseChange.js +1 -1
  67. package/lib/database/transaction/AcDbDatabaseChange.js.map +1 -1
  68. package/lib/database/transaction/AcDbDatabaseTransactionManager.js +7 -7
  69. package/lib/database/transaction/AcDbDatabaseTransactionManager.js.map +1 -1
  70. package/lib/database/transaction/index.d.ts +2 -2
  71. package/lib/database/transaction/index.d.ts.map +1 -1
  72. package/lib/database/transaction/index.js +2 -2
  73. package/lib/database/transaction/index.js.map +1 -1
  74. package/lib/entity/AcDb3dSolid.js +3 -3
  75. package/lib/entity/AcDbArc.d.ts.map +1 -1
  76. package/lib/entity/AcDbArc.js +7 -7
  77. package/lib/entity/AcDbArc.js.map +1 -1
  78. package/lib/entity/AcDbBlockReference.d.ts +6 -0
  79. package/lib/entity/AcDbBlockReference.d.ts.map +1 -1
  80. package/lib/entity/AcDbBlockReference.js +12 -0
  81. package/lib/entity/AcDbBlockReference.js.map +1 -1
  82. package/lib/entity/AcDbCircle.d.ts.map +1 -1
  83. package/lib/entity/AcDbCircle.js +3 -3
  84. package/lib/entity/AcDbCircle.js.map +1 -1
  85. package/lib/entity/AcDbEllipse.d.ts.map +1 -1
  86. package/lib/entity/AcDbEllipse.js +3 -3
  87. package/lib/entity/AcDbEllipse.js.map +1 -1
  88. package/lib/entity/AcDbFace.js +2 -2
  89. package/lib/entity/AcDbFrame.d.ts +15 -0
  90. package/lib/entity/AcDbFrame.d.ts.map +1 -0
  91. package/lib/entity/AcDbFrame.js +36 -0
  92. package/lib/entity/AcDbFrame.js.map +1 -0
  93. package/lib/entity/AcDbLeader.js +2 -2
  94. package/lib/entity/AcDbLeader.js.map +1 -1
  95. package/lib/entity/AcDbOle2Frame.d.ts +390 -0
  96. package/lib/entity/AcDbOle2Frame.d.ts.map +1 -0
  97. package/lib/entity/AcDbOle2Frame.js +717 -0
  98. package/lib/entity/AcDbOle2Frame.js.map +1 -0
  99. package/lib/entity/AcDbOleFrame.d.ts +112 -0
  100. package/lib/entity/AcDbOleFrame.d.ts.map +1 -0
  101. package/lib/entity/AcDbOleFrame.js +198 -0
  102. package/lib/entity/AcDbOleFrame.js.map +1 -0
  103. package/lib/entity/AcDbPolyFaceMesh.js +2 -2
  104. package/lib/entity/AcDbPolyFaceMesh.js.map +1 -1
  105. package/lib/entity/AcDbPolygonMesh.js +2 -2
  106. package/lib/entity/AcDbPolygonMesh.js.map +1 -1
  107. package/lib/entity/AcDbPolyline.d.ts +2 -2
  108. package/lib/entity/AcDbPolyline.d.ts.map +1 -1
  109. package/lib/entity/AcDbPolyline.js +4 -4
  110. package/lib/entity/AcDbPolyline.js.map +1 -1
  111. package/lib/entity/AcDbProxyEntity.d.ts.map +1 -1
  112. package/lib/entity/AcDbProxyEntity.js +3 -3
  113. package/lib/entity/AcDbProxyEntity.js.map +1 -1
  114. package/lib/entity/AcDbRasterImage.d.ts +1 -1
  115. package/lib/entity/AcDbRasterImage.d.ts.map +1 -1
  116. package/lib/entity/AcDbRasterImage.js +4 -4
  117. package/lib/entity/AcDbRasterImage.js.map +1 -1
  118. package/lib/entity/AcDbRay.d.ts.map +1 -1
  119. package/lib/entity/AcDbRay.js +2 -2
  120. package/lib/entity/AcDbRay.js.map +1 -1
  121. package/lib/entity/AcDbSpline.d.ts.map +1 -1
  122. package/lib/entity/AcDbSpline.js +4 -4
  123. package/lib/entity/AcDbSpline.js.map +1 -1
  124. package/lib/entity/AcDbTrace.js +2 -2
  125. package/lib/entity/AcDbTrace.js.map +1 -1
  126. package/lib/entity/AcDbXline.d.ts.map +1 -1
  127. package/lib/entity/AcDbXline.js +2 -2
  128. package/lib/entity/AcDbXline.js.map +1 -1
  129. package/lib/entity/index.d.ts +5 -1
  130. package/lib/entity/index.d.ts.map +1 -1
  131. package/lib/entity/index.js +4 -1
  132. package/lib/entity/index.js.map +1 -1
  133. package/lib/index.d.ts +11 -9
  134. package/lib/index.d.ts.map +1 -1
  135. package/lib/index.js +8 -7
  136. package/lib/index.js.map +1 -1
  137. package/lib/ly/AcLyBoolExpr.d.ts +28 -0
  138. package/lib/ly/AcLyBoolExpr.d.ts.map +1 -0
  139. package/lib/ly/AcLyBoolExpr.js +36 -0
  140. package/lib/ly/AcLyBoolExpr.js.map +1 -0
  141. package/lib/ly/AcLyLayerFilter.d.ts +289 -0
  142. package/lib/ly/AcLyLayerFilter.d.ts.map +1 -0
  143. package/lib/ly/AcLyLayerFilter.js +509 -0
  144. package/lib/ly/AcLyLayerFilter.js.map +1 -0
  145. package/lib/ly/AcLyLayerFilterIO.d.ts +155 -0
  146. package/lib/ly/AcLyLayerFilterIO.d.ts.map +1 -0
  147. package/lib/ly/AcLyLayerFilterIO.js +517 -0
  148. package/lib/ly/AcLyLayerFilterIO.js.map +1 -0
  149. package/lib/ly/AcLyLayerFilterTree.d.ts +71 -0
  150. package/lib/ly/AcLyLayerFilterTree.d.ts.map +1 -0
  151. package/lib/ly/AcLyLayerFilterTree.js +95 -0
  152. package/lib/ly/AcLyLayerFilterTree.js.map +1 -0
  153. package/lib/ly/AcLyLayerGroup.d.ts +107 -0
  154. package/lib/ly/AcLyLayerGroup.d.ts.map +1 -0
  155. package/lib/ly/AcLyLayerGroup.js +158 -0
  156. package/lib/ly/AcLyLayerGroup.js.map +1 -0
  157. package/lib/ly/index.d.ts +8 -0
  158. package/lib/ly/index.d.ts.map +1 -0
  159. package/lib/ly/index.js +6 -0
  160. package/lib/ly/index.js.map +1 -0
  161. package/lib/misc/AcDbCodePage.d.ts +1 -1
  162. package/lib/misc/AcDbCodePage.d.ts.map +1 -1
  163. package/lib/misc/AcDbCodePage.js +1 -1
  164. package/lib/misc/AcDbCodePage.js.map +1 -1
  165. package/lib/misc/AcDbFormatter.d.ts.map +1 -1
  166. package/lib/misc/AcDbFormatter.js +3 -3
  167. package/lib/misc/AcDbFormatter.js.map +1 -1
  168. package/lib/misc/AcDbMLeaderStyleColorCodec.d.ts +2 -2
  169. package/lib/misc/AcDbMLeaderStyleColorCodec.d.ts.map +1 -1
  170. package/lib/misc/AcDbMLeaderStyleColorCodec.js +2 -2
  171. package/lib/misc/AcDbMLeaderStyleColorCodec.js.map +1 -1
  172. package/lib/misc/AcDbOleImageExtractor.d.ts +21 -0
  173. package/lib/misc/AcDbOleImageExtractor.d.ts.map +1 -0
  174. package/lib/misc/AcDbOleImageExtractor.js +659 -0
  175. package/lib/misc/AcDbOleImageExtractor.js.map +1 -0
  176. package/lib/misc/AcDbPreviewIcon.d.ts +13 -0
  177. package/lib/misc/AcDbPreviewIcon.d.ts.map +1 -0
  178. package/lib/misc/AcDbPreviewIcon.js +69 -0
  179. package/lib/misc/AcDbPreviewIcon.js.map +1 -0
  180. package/lib/misc/AcDbUnitsValue.d.ts +6 -6
  181. package/lib/misc/AcDbUnitsValue.d.ts.map +1 -1
  182. package/lib/misc/AcDbUnitsValue.js +6 -6
  183. package/lib/misc/AcDbUnitsValue.js.map +1 -1
  184. package/lib/misc/acdbDrawImageFrame.d.ts +17 -0
  185. package/lib/misc/acdbDrawImageFrame.d.ts.map +1 -0
  186. package/lib/misc/acdbDrawImageFrame.js +44 -0
  187. package/lib/misc/acdbDrawImageFrame.js.map +1 -0
  188. package/lib/misc/index.d.ts +8 -7
  189. package/lib/misc/index.d.ts.map +1 -1
  190. package/lib/misc/index.js +8 -7
  191. package/lib/misc/index.js.map +1 -1
  192. package/lib/misc/proxyGraphic/AcDbProxyGraphic.d.ts +1 -1
  193. package/lib/misc/proxyGraphic/AcDbProxyGraphic.d.ts.map +1 -1
  194. package/lib/misc/proxyGraphic/AcDbProxyGraphic.js +9 -9
  195. package/lib/misc/proxyGraphic/AcDbProxyGraphic.js.map +1 -1
  196. package/lib/misc/proxyGraphic/AcDbProxyGraphicBinaryStream.d.ts +2 -2
  197. package/lib/misc/proxyGraphic/AcDbProxyGraphicBinaryStream.d.ts.map +1 -1
  198. package/lib/misc/proxyGraphic/AcDbProxyGraphicBinaryStream.js +2 -2
  199. package/lib/misc/proxyGraphic/AcDbProxyGraphicBinaryStream.js.map +1 -1
  200. package/lib/misc/proxyGraphic/index.d.ts +2 -2
  201. package/lib/misc/proxyGraphic/index.d.ts.map +1 -1
  202. package/lib/misc/proxyGraphic/index.js +2 -2
  203. package/lib/misc/proxyGraphic/index.js.map +1 -1
  204. package/lib/object/AcDbFilter.d.ts +51 -0
  205. package/lib/object/AcDbFilter.d.ts.map +1 -0
  206. package/lib/object/AcDbFilter.js +63 -0
  207. package/lib/object/AcDbFilter.js.map +1 -0
  208. package/lib/object/AcDbIndex.d.ts +144 -0
  209. package/lib/object/AcDbIndex.d.ts.map +1 -0
  210. package/lib/object/AcDbIndex.js +146 -0
  211. package/lib/object/AcDbIndex.js.map +1 -0
  212. package/lib/object/AcDbLayerFilter.d.ts +144 -0
  213. package/lib/object/AcDbLayerFilter.d.ts.map +1 -0
  214. package/lib/object/AcDbLayerFilter.js +250 -0
  215. package/lib/object/AcDbLayerFilter.js.map +1 -0
  216. package/lib/object/AcDbLayerIndex.d.ts +165 -0
  217. package/lib/object/AcDbLayerIndex.d.ts.map +1 -0
  218. package/lib/object/AcDbLayerIndex.js +295 -0
  219. package/lib/object/AcDbLayerIndex.js.map +1 -0
  220. package/lib/object/AcDbMLeaderStyle.js +4 -4
  221. package/lib/object/AcDbMLeaderStyle.js.map +1 -1
  222. package/lib/object/index.d.ts +6 -0
  223. package/lib/object/index.d.ts.map +1 -1
  224. package/lib/object/index.js +4 -0
  225. package/lib/object/index.js.map +1 -1
  226. package/package.json +4 -4
@@ -0,0 +1,659 @@
1
+ /**
2
+ * Extracts a renderable image {@link Blob} from AutoCAD OLE frame binary
3
+ * payloads (OLE2FRAME / OLEFRAME).
4
+ *
5
+ * AutoCAD stores OLE 2 items as a short geometry header followed by an OLE
6
+ * Compound File Binary (CFB) document. Embedded pictures (for example
7
+ * "Paintbrush Picture") typically expose either:
8
+ * - a `CONTENTS` stream containing a full BMP / PNG / JPEG file, or
9
+ * - a `\2OlePres###` presentation stream with a CF_DIB / CF_BITMAP payload
10
+ *
11
+ * This extractor prefers CFB streams when present, then falls back to scanning
12
+ * the raw buffer for common image signatures and packed DIBs.
13
+ */
14
+ var __values = (this && this.__values) || function(o) {
15
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
16
+ if (m) return m.call(o);
17
+ if (o && typeof o.length === "number") return {
18
+ next: function () {
19
+ if (o && i >= o.length) o = void 0;
20
+ return { value: o && o[i++], done: !o };
21
+ }
22
+ };
23
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
24
+ };
25
+ var CFB_SIGNATURE = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];
26
+ /** Standard clipboard format identifiers used in OLE presentation streams. */
27
+ var CF_BITMAP = 2;
28
+ var CF_DIB = 8;
29
+ var DIRECTORY_ENTRY_SIZE = 128;
30
+ var MAX_STREAM_BYTES = 64 * 1024 * 1024;
31
+ /**
32
+ * Attempts to extract an image blob from OLE binary data.
33
+ *
34
+ * @param data - Raw OLE payload from {@link AcDbOleFrame.getOleObject}.
35
+ * @returns A browser-decodable image blob, or `undefined` when no image is found.
36
+ */
37
+ export function acdbExtractOleImageBlob(data) {
38
+ if (!(data === null || data === void 0 ? void 0 : data.length)) {
39
+ return undefined;
40
+ }
41
+ var fromCfb = extractImageFromCfb(data);
42
+ if (fromCfb) {
43
+ return fromCfb;
44
+ }
45
+ return extractImageFromRawBytes(data);
46
+ }
47
+ /**
48
+ * Locates an embedded CFB document inside `data` and tries to pull an image
49
+ * from preferred streams (`CONTENTS`, `Ole10Native`, OlePres, …), then from
50
+ * every remaining stream as a last resort.
51
+ *
52
+ * @param data - Full OLE payload that may contain a CFB compound file.
53
+ * @returns An image blob when one is found, otherwise `undefined`.
54
+ */
55
+ function extractImageFromCfb(data) {
56
+ var e_1, _a, e_2, _b, e_3, _c;
57
+ var cfbOffset = findSignature(data, CFB_SIGNATURE);
58
+ if (cfbOffset < 0) {
59
+ return undefined;
60
+ }
61
+ var cfb = data.subarray(cfbOffset);
62
+ var file;
63
+ try {
64
+ file = openCfb(cfb);
65
+ }
66
+ catch (_d) {
67
+ return undefined;
68
+ }
69
+ var preferredNames = [
70
+ 'CONTENTS',
71
+ 'Package',
72
+ 'Ole10Native',
73
+ '\x01Ole10Native'
74
+ ];
75
+ try {
76
+ for (var preferredNames_1 = __values(preferredNames), preferredNames_1_1 = preferredNames_1.next(); !preferredNames_1_1.done; preferredNames_1_1 = preferredNames_1.next()) {
77
+ var name_1 = preferredNames_1_1.value;
78
+ var stream = file.readStream(name_1);
79
+ if (!(stream === null || stream === void 0 ? void 0 : stream.length))
80
+ continue;
81
+ var blob = extractImageFromRawBytes(stream);
82
+ if (blob)
83
+ return blob;
84
+ }
85
+ }
86
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
87
+ finally {
88
+ try {
89
+ if (preferredNames_1_1 && !preferredNames_1_1.done && (_a = preferredNames_1.return)) _a.call(preferredNames_1);
90
+ }
91
+ finally { if (e_1) throw e_1.error; }
92
+ }
93
+ try {
94
+ for (var _e = __values(file.entries()), _f = _e.next(); !_f.done; _f = _e.next()) {
95
+ var entry = _f.value;
96
+ if (entry.type !== 'stream')
97
+ continue;
98
+ if (!/olepres/i.test(entry.name) && !entry.name.includes('OlePres')) {
99
+ continue;
100
+ }
101
+ var stream = file.readStream(entry.name);
102
+ if (!(stream === null || stream === void 0 ? void 0 : stream.length))
103
+ continue;
104
+ var fromPres = extractImageFromOlePresentation(stream);
105
+ if (fromPres)
106
+ return fromPres;
107
+ var fromRaw = extractImageFromRawBytes(stream);
108
+ if (fromRaw)
109
+ return fromRaw;
110
+ }
111
+ }
112
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
113
+ finally {
114
+ try {
115
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
116
+ }
117
+ finally { if (e_2) throw e_2.error; }
118
+ }
119
+ try {
120
+ // Last resort: scan every stream for embedded image bytes.
121
+ for (var _g = __values(file.entries()), _h = _g.next(); !_h.done; _h = _g.next()) {
122
+ var entry = _h.value;
123
+ if (entry.type !== 'stream')
124
+ continue;
125
+ var stream = file.readStream(entry.name);
126
+ if (!(stream === null || stream === void 0 ? void 0 : stream.length))
127
+ continue;
128
+ var blob = extractImageFromRawBytes(stream);
129
+ if (blob)
130
+ return blob;
131
+ }
132
+ }
133
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
134
+ finally {
135
+ try {
136
+ if (_h && !_h.done && (_c = _g.return)) _c.call(_g);
137
+ }
138
+ finally { if (e_3) throw e_3.error; }
139
+ }
140
+ return undefined;
141
+ }
142
+ /**
143
+ * Parses an OLE presentation stream (`\2OlePres000`, …) and extracts a DIB /
144
+ * bitmap when the clipboard format is CF_DIB or CF_BITMAP.
145
+ *
146
+ * @param stream - Bytes of a `\2OlePres###` (or similarly named) stream.
147
+ * @returns A BMP image blob for CF_DIB / CF_BITMAP payloads, or `undefined`.
148
+ *
149
+ * @see https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-oleds/78ab0f5c-ad1b-41b4-bb5e-1eea2cd13a6c
150
+ */
151
+ function extractImageFromOlePresentation(stream) {
152
+ if (stream.length < 28) {
153
+ return undefined;
154
+ }
155
+ var view = new DataView(stream.buffer, stream.byteOffset, stream.byteLength);
156
+ var offset = 0;
157
+ var markerOrLength = view.getUint32(offset, true);
158
+ offset += 4;
159
+ var clipboardFormat = 0;
160
+ if (markerOrLength === 0xffffffff) {
161
+ clipboardFormat = view.getUint32(offset, true);
162
+ offset += 4;
163
+ }
164
+ else if (markerOrLength === 0xfffffffe) {
165
+ // Unicode clipboard format name — skip string and try raw scan later.
166
+ return undefined;
167
+ }
168
+ else if (markerOrLength > 0 && markerOrLength < 0xffff) {
169
+ // ANSI clipboard format name
170
+ offset += markerOrLength;
171
+ }
172
+ else {
173
+ return undefined;
174
+ }
175
+ // TargetDevice.Size
176
+ if (offset + 4 > stream.length)
177
+ return undefined;
178
+ var targetDeviceSize = view.getUint32(offset, true);
179
+ offset += 4;
180
+ if (targetDeviceSize > 4) {
181
+ offset += targetDeviceSize - 4;
182
+ }
183
+ // Aspect, lindex, advf, reserved1, width, height
184
+ offset += 4 * 6;
185
+ if (offset + 4 > stream.length)
186
+ return undefined;
187
+ var dataSize = view.getUint32(offset, true);
188
+ offset += 4;
189
+ if (dataSize <= 0 || offset + dataSize > stream.length) {
190
+ return undefined;
191
+ }
192
+ var presentationData = stream.subarray(offset, offset + dataSize);
193
+ if (clipboardFormat === CF_DIB) {
194
+ return dibToBmpBlob(presentationData);
195
+ }
196
+ if (clipboardFormat === CF_BITMAP) {
197
+ return extractImageFromRawBytes(presentationData);
198
+ }
199
+ return extractImageFromRawBytes(presentationData);
200
+ }
201
+ /**
202
+ * Scans a byte buffer for common image file signatures (BMP, PNG, JPEG, GIF)
203
+ * and packed DIB structures.
204
+ *
205
+ * @param data - Arbitrary bytes that may contain an embedded image.
206
+ * @returns The first recognized image blob, or `undefined` if none is found.
207
+ */
208
+ function extractImageFromRawBytes(data) {
209
+ var bmp = findBmpBlob(data);
210
+ if (bmp)
211
+ return bmp;
212
+ var png = findPngBlob(data);
213
+ if (png)
214
+ return png;
215
+ var jpeg = findJpegBlob(data);
216
+ if (jpeg)
217
+ return jpeg;
218
+ var gif = findGifBlob(data);
219
+ if (gif)
220
+ return gif;
221
+ var dib = findPackedDibBlob(data);
222
+ if (dib)
223
+ return dib;
224
+ return undefined;
225
+ }
226
+ /**
227
+ * Finds a Windows BMP file (`BM` magic) inside `data` and returns it as a blob.
228
+ *
229
+ * @param data - Buffer to search for a BITMAPFILEHEADER.
230
+ * @returns An `image/bmp` blob when a valid BMP is found, otherwise `undefined`.
231
+ */
232
+ function findBmpBlob(data) {
233
+ for (var i = 0; i < data.length - 14; i++) {
234
+ if (data[i] !== 0x42 || data[i + 1] !== 0x4d)
235
+ continue;
236
+ var view = new DataView(data.buffer, data.byteOffset + i, data.length - i);
237
+ var fileSize = view.getUint32(2, true);
238
+ if (fileSize < 14 || fileSize > data.length - i)
239
+ continue;
240
+ var dibOffset = view.getUint32(10, true);
241
+ if (dibOffset < 14 || dibOffset >= fileSize)
242
+ continue;
243
+ return new Blob([data.subarray(i, i + fileSize)], { type: 'image/bmp' });
244
+ }
245
+ return undefined;
246
+ }
247
+ /**
248
+ * Finds a PNG file inside `data`, preferably bounded by an `IEND` chunk.
249
+ *
250
+ * @param data - Buffer to search for a PNG signature.
251
+ * @returns An `image/png` blob when found, otherwise `undefined`.
252
+ */
253
+ function findPngBlob(data) {
254
+ var sig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
255
+ var start = findSignature(data, sig);
256
+ if (start < 0)
257
+ return undefined;
258
+ // Scan for IEND chunk to bound the PNG.
259
+ for (var i = start + 8; i + 12 <= data.length; i++) {
260
+ if (data[i + 4] === 0x49 &&
261
+ data[i + 5] === 0x45 &&
262
+ data[i + 6] === 0x4e &&
263
+ data[i + 7] === 0x44) {
264
+ var end = i + 12;
265
+ return new Blob([data.subarray(start, end)], { type: 'image/png' });
266
+ }
267
+ }
268
+ return new Blob([data.subarray(start)], { type: 'image/png' });
269
+ }
270
+ /**
271
+ * Finds a JPEG file inside `data` by locating SOI (`FF D8 FF`) and EOI
272
+ * (`FF D9`) markers.
273
+ *
274
+ * @param data - Buffer to search for JPEG markers.
275
+ * @returns An `image/jpeg` blob when a complete JPEG is found, otherwise
276
+ * `undefined`.
277
+ */
278
+ function findJpegBlob(data) {
279
+ var start = findSignature(data, [0xff, 0xd8, 0xff]);
280
+ if (start < 0)
281
+ return undefined;
282
+ for (var i = start + 3; i + 1 < data.length; i++) {
283
+ if (data[i] === 0xff && data[i + 1] === 0xd9) {
284
+ return new Blob([data.subarray(start, i + 2)], { type: 'image/jpeg' });
285
+ }
286
+ }
287
+ return undefined;
288
+ }
289
+ /**
290
+ * Finds a GIF87a / GIF89a file inside `data`, preferably bounded by a trailer
291
+ * byte (`0x3B`).
292
+ *
293
+ * @param data - Buffer to search for a GIF signature.
294
+ * @returns An `image/gif` blob when found, otherwise `undefined`.
295
+ */
296
+ function findGifBlob(data) {
297
+ var start87 = findSignature(data, [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]);
298
+ var start89 = findSignature(data, [0x47, 0x49, 0x46, 0x38, 0x39, 0x61]);
299
+ var start = start87 >= 0 ? start87 : start89;
300
+ if (start < 0)
301
+ return undefined;
302
+ for (var i = start + 6; i < data.length; i++) {
303
+ if (data[i] === 0x3b) {
304
+ return new Blob([data.subarray(start, i + 1)], { type: 'image/gif' });
305
+ }
306
+ }
307
+ return new Blob([data.subarray(start)], { type: 'image/gif' });
308
+ }
309
+ /**
310
+ * Locates a packed DIB (BITMAPINFOHEADER with `biSize === 40`) and wraps it as
311
+ * a BMP file by prepending a BITMAPFILEHEADER.
312
+ *
313
+ * @param data - Buffer that may contain a packed device-independent bitmap.
314
+ * @returns An `image/bmp` blob when a plausible DIB is found, otherwise
315
+ * `undefined`.
316
+ */
317
+ function findPackedDibBlob(data) {
318
+ for (var i = 0; i + 40 <= data.length; i++) {
319
+ var view = new DataView(data.buffer, data.byteOffset + i, data.length - i);
320
+ var biSize = view.getUint32(0, true);
321
+ if (biSize !== 40)
322
+ continue;
323
+ var width = view.getInt32(4, true);
324
+ var height = view.getInt32(8, true);
325
+ var planes = view.getUint16(12, true);
326
+ var bitCount = view.getUint16(14, true);
327
+ var compression = view.getUint32(16, true);
328
+ var sizeImage = view.getUint32(20, true);
329
+ var clrUsed = view.getUint32(32, true);
330
+ if (width <= 0 || width > 65536)
331
+ continue;
332
+ if (height === 0 || Math.abs(height) > 65536)
333
+ continue;
334
+ if (planes !== 1)
335
+ continue;
336
+ if (![1, 4, 8, 16, 24, 32].includes(bitCount))
337
+ continue;
338
+ // BI_RGB / BI_BITFIELDS only
339
+ if (compression !== 0 && compression !== 3)
340
+ continue;
341
+ var pixelOffset = getPackedDibPixelOffset(biSize, bitCount, compression, clrUsed);
342
+ var absHeight = Math.abs(height);
343
+ var rowSize = ((width * bitCount + 31) >> 5) << 2;
344
+ var expectedPixels = sizeImage > 0 ? sizeImage : rowSize * absHeight;
345
+ var totalSize = pixelOffset + expectedPixels;
346
+ if (totalSize <= 40 || i + totalSize > data.length)
347
+ continue;
348
+ return dibToBmpBlob(data.subarray(i, i + totalSize));
349
+ }
350
+ return undefined;
351
+ }
352
+ /**
353
+ * Computes the byte offset from the start of a packed BITMAPINFOHEADER DIB to
354
+ * the first pixel byte, accounting for color tables and BI_BITFIELDS masks.
355
+ *
356
+ * @param biSize - Size of the bitmap info header (typically 40).
357
+ * @param bitCount - Bits per pixel.
358
+ * @param compression - Compression type (`0` = BI_RGB, `3` = BI_BITFIELDS).
359
+ * @param clrUsed - Number of color-table entries, or `0` for the default.
360
+ * @returns Offset in bytes from the DIB start to pixel data.
361
+ */
362
+ function getPackedDibPixelOffset(biSize, bitCount, compression, clrUsed) {
363
+ var extra = 0;
364
+ if (bitCount > 8 && compression === 3) {
365
+ extra += 12;
366
+ }
367
+ if (clrUsed > 0) {
368
+ extra += clrUsed * 4;
369
+ }
370
+ else if (bitCount <= 8) {
371
+ extra += (1 << bitCount) * 4;
372
+ }
373
+ return biSize + extra;
374
+ }
375
+ /**
376
+ * Wraps packed DIB bytes as a Windows BMP by prepending a 14-byte
377
+ * BITMAPFILEHEADER.
378
+ *
379
+ * @param dib - Packed DIB starting with BITMAPINFOHEADER / BITMAPCOREHEADER.
380
+ * @returns An `image/bmp` blob, or `undefined` when the header is invalid.
381
+ */
382
+ function dibToBmpBlob(dib) {
383
+ if (dib.length < 40)
384
+ return undefined;
385
+ var view = new DataView(dib.buffer, dib.byteOffset, dib.byteLength);
386
+ var biSize = view.getUint32(0, true);
387
+ if (biSize !== 40 && biSize !== 12)
388
+ return undefined;
389
+ var fileSize = 14 + dib.length;
390
+ var header = new Uint8Array(14);
391
+ var headerView = new DataView(header.buffer);
392
+ header[0] = 0x42; // 'B'
393
+ header[1] = 0x4d; // 'M'
394
+ headerView.setUint32(2, fileSize, true);
395
+ headerView.setUint32(10, 14 + getPixelDataOffsetFromDib(dib), true);
396
+ var combined = new Uint8Array(fileSize);
397
+ combined.set(header, 0);
398
+ combined.set(dib, 14);
399
+ return new Blob([combined], { type: 'image/bmp' });
400
+ }
401
+ /**
402
+ * Returns the offset from the start of a DIB to its pixel array, for use as
403
+ * `bfOffBits` after a 14-byte BITMAPFILEHEADER is prepended.
404
+ *
405
+ * @param dib - Packed DIB starting with BITMAPINFOHEADER or BITMAPCOREHEADER.
406
+ * @returns Pixel-data offset relative to the DIB start (not including the
407
+ * file header).
408
+ */
409
+ function getPixelDataOffsetFromDib(dib) {
410
+ var view = new DataView(dib.buffer, dib.byteOffset, dib.byteLength);
411
+ var biSize = view.getUint32(0, true);
412
+ if (biSize === 12) {
413
+ var bitCount_1 = view.getUint16(10, true);
414
+ var colors = bitCount_1 <= 8 ? 1 << bitCount_1 : 0;
415
+ return biSize + colors * 3;
416
+ }
417
+ var bitCount = view.getUint16(14, true);
418
+ var compression = view.getUint32(16, true);
419
+ var clrUsed = view.getUint32(32, true);
420
+ return getPackedDibPixelOffset(biSize, bitCount, compression, clrUsed);
421
+ }
422
+ /**
423
+ * Searches `data` for the first occurrence of `signature`.
424
+ *
425
+ * @param data - Buffer to search.
426
+ * @param signature - Byte sequence to locate.
427
+ * @returns Index of the first match, or `-1` if not found.
428
+ */
429
+ function findSignature(data, signature) {
430
+ outer: for (var i = 0; i <= data.length - signature.length; i++) {
431
+ for (var j = 0; j < signature.length; j++) {
432
+ if (data[i + j] !== signature[j])
433
+ continue outer;
434
+ }
435
+ return i;
436
+ }
437
+ return -1;
438
+ }
439
+ /**
440
+ * Opens a Compound File Binary (OLE2) document and exposes directory entries
441
+ * plus named stream reads.
442
+ *
443
+ * @param data - Bytes starting at a valid CFB signature.
444
+ * @returns A lightweight CFB reader for stream extraction.
445
+ * @throws If the buffer is too small, not a CFB, or has an unsupported sector
446
+ * size.
447
+ */
448
+ function openCfb(data) {
449
+ if (data.length < 512) {
450
+ throw new Error('CFB too small');
451
+ }
452
+ for (var i = 0; i < CFB_SIGNATURE.length; i++) {
453
+ if (data[i] !== CFB_SIGNATURE[i]) {
454
+ throw new Error('Not a CFB document');
455
+ }
456
+ }
457
+ var view = new DataView(data.buffer, data.byteOffset, data.byteLength);
458
+ var sectorShift = view.getUint16(30, true);
459
+ var sectorSize = 1 << sectorShift;
460
+ if (sectorSize !== 512 && sectorSize !== 4096) {
461
+ throw new Error('Unsupported CFB sector size');
462
+ }
463
+ var fatCount = view.getUint32(44, true);
464
+ var firstDirSector = view.getUint32(48, true);
465
+ var miniStreamCutoff = view.getUint32(56, true);
466
+ var firstMiniFatSector = view.getUint32(60, true);
467
+ var miniFatCount = view.getUint32(64, true);
468
+ var firstDifatSector = view.getUint32(68, true);
469
+ var difatCount = view.getUint32(72, true);
470
+ var difat = [];
471
+ for (var i = 0; i < 109; i++) {
472
+ var sector = view.getUint32(76 + i * 4, true);
473
+ if (sector <= 0xfffffffa) {
474
+ difat.push(sector);
475
+ }
476
+ }
477
+ var difatSector = firstDifatSector;
478
+ for (var n = 0; n < difatCount && difatSector <= 0xfffffffa; n++) {
479
+ var offset = (difatSector + 1) * sectorSize;
480
+ if (offset + sectorSize > data.length)
481
+ break;
482
+ var entriesPerSector = sectorSize / 4 - 1;
483
+ for (var i = 0; i < entriesPerSector; i++) {
484
+ var sector = view.getUint32(offset + i * 4, true);
485
+ if (sector <= 0xfffffffa) {
486
+ difat.push(sector);
487
+ }
488
+ }
489
+ difatSector = view.getUint32(offset + entriesPerSector * 4, true);
490
+ }
491
+ var fat = [];
492
+ for (var i = 0; i < Math.min(fatCount, difat.length); i++) {
493
+ var fatSector = difat[i];
494
+ var offset = (fatSector + 1) * sectorSize;
495
+ if (offset + sectorSize > data.length)
496
+ break;
497
+ var entries_1 = sectorSize / 4;
498
+ for (var j = 0; j < entries_1; j++) {
499
+ fat.push(view.getUint32(offset + j * 4, true));
500
+ }
501
+ }
502
+ var directorySectors = followFatChain(fat, firstDirSector, 4096);
503
+ var directoryBytes = readSectorChain(data, directorySectors, sectorSize);
504
+ var entries = [];
505
+ var entryCount = Math.floor(directoryBytes.length / DIRECTORY_ENTRY_SIZE);
506
+ for (var i = 0; i < entryCount; i++) {
507
+ var entryOffset = i * DIRECTORY_ENTRY_SIZE;
508
+ var entryView = new DataView(directoryBytes.buffer, directoryBytes.byteOffset + entryOffset, DIRECTORY_ENTRY_SIZE);
509
+ var nameLength = entryView.getUint16(64, true);
510
+ if (nameLength < 2 || nameLength > 64)
511
+ continue;
512
+ var charCount = Math.floor((nameLength - 2) / 2);
513
+ var name_2 = '';
514
+ for (var c = 0; c < charCount; c++) {
515
+ name_2 += String.fromCharCode(entryView.getUint16(c * 2, true));
516
+ }
517
+ var objectType = entryView.getUint8(66);
518
+ var startSector = entryView.getUint32(116, true);
519
+ var sizeLow = entryView.getUint32(120, true);
520
+ var sizeHigh = entryView.getUint32(124, true);
521
+ var size = sizeHigh === 0 ? sizeLow : sizeLow + sizeHigh * 0x100000000;
522
+ var type = 'unknown';
523
+ if (objectType === 5)
524
+ type = 'root';
525
+ else if (objectType === 1)
526
+ type = 'storage';
527
+ else if (objectType === 2)
528
+ type = 'stream';
529
+ entries.push({ name: name_2, type: type, size: size, startSector: startSector });
530
+ }
531
+ var root = entries.find(function (e) { return e.type === 'root'; });
532
+ var miniFat = [];
533
+ if (miniFatCount > 0 && firstMiniFatSector <= 0xfffffffa) {
534
+ var miniFatSectors = followFatChain(fat, firstMiniFatSector, miniFatCount);
535
+ var miniFatBytes = readSectorChain(data, miniFatSectors, sectorSize);
536
+ var miniView = new DataView(miniFatBytes.buffer, miniFatBytes.byteOffset, miniFatBytes.byteLength);
537
+ for (var i = 0; i + 4 <= miniFatBytes.length; i += 4) {
538
+ miniFat.push(miniView.getUint32(i, true));
539
+ }
540
+ }
541
+ var miniStream;
542
+ if (root && root.size > 0) {
543
+ var miniStreamSectors = followFatChain(fat, root.startSector, 65536);
544
+ miniStream = readSectorChain(data, miniStreamSectors, sectorSize).subarray(0, root.size);
545
+ }
546
+ var readStream = function (name) {
547
+ var e_4, _a;
548
+ var entry = entries.find(function (e) {
549
+ return e.type === 'stream' &&
550
+ (e.name === name || e.name.toLowerCase() === name.toLowerCase());
551
+ });
552
+ if (!entry || entry.size <= 0 || entry.size > MAX_STREAM_BYTES) {
553
+ return undefined;
554
+ }
555
+ if (entry.size < miniStreamCutoff && miniStream && miniFat.length > 0) {
556
+ var miniSectorSize = 64;
557
+ var sectors_2 = followChain(miniFat, entry.startSector, 65536);
558
+ var out = new Uint8Array(entry.size);
559
+ var written = 0;
560
+ try {
561
+ for (var sectors_1 = __values(sectors_2), sectors_1_1 = sectors_1.next(); !sectors_1_1.done; sectors_1_1 = sectors_1.next()) {
562
+ var sector = sectors_1_1.value;
563
+ if (written >= entry.size)
564
+ break;
565
+ var start = sector * miniSectorSize;
566
+ var end = Math.min(start + miniSectorSize, miniStream.length);
567
+ if (start >= miniStream.length)
568
+ break;
569
+ var chunk = miniStream.subarray(start, end);
570
+ out.set(chunk.subarray(0, Math.min(chunk.length, entry.size - written)), written);
571
+ written += chunk.length;
572
+ }
573
+ }
574
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
575
+ finally {
576
+ try {
577
+ if (sectors_1_1 && !sectors_1_1.done && (_a = sectors_1.return)) _a.call(sectors_1);
578
+ }
579
+ finally { if (e_4) throw e_4.error; }
580
+ }
581
+ return out.subarray(0, Math.min(written, entry.size));
582
+ }
583
+ var sectors = followFatChain(fat, entry.startSector, 65536);
584
+ return readSectorChain(data, sectors, sectorSize).subarray(0, entry.size);
585
+ };
586
+ return {
587
+ entries: function () { return entries; },
588
+ readStream: readStream
589
+ };
590
+ }
591
+ /**
592
+ * Walks the CFB File Allocation Table starting at `start` and returns the
593
+ * sector chain.
594
+ *
595
+ * @param fat - FAT sector index table.
596
+ * @param start - First sector index in the chain.
597
+ * @param maxSectors - Safety cap on chain length.
598
+ * @returns Ordered list of sector indices.
599
+ */
600
+ function followFatChain(fat, start, maxSectors) {
601
+ return followChain(fat, start, maxSectors);
602
+ }
603
+ /**
604
+ * Walks a sector-chain table (FAT or MiniFAT) until an end-of-chain marker,
605
+ * a cycle, or `maxSectors` is reached.
606
+ *
607
+ * @param table - Sector chain table (FAT or MiniFAT).
608
+ * @param start - First sector index.
609
+ * @param maxSectors - Maximum number of sectors to follow.
610
+ * @returns Ordered list of sector indices visited.
611
+ */
612
+ function followChain(table, start, maxSectors) {
613
+ var sectors = [];
614
+ var sector = start;
615
+ var seen = new Set();
616
+ while (sector <= 0xfffffffa && sectors.length < maxSectors) {
617
+ if (seen.has(sector))
618
+ break;
619
+ seen.add(sector);
620
+ sectors.push(sector);
621
+ if (sector >= table.length)
622
+ break;
623
+ sector = table[sector];
624
+ }
625
+ return sectors;
626
+ }
627
+ /**
628
+ * Reads and concatenates CFB sectors into a single contiguous buffer.
629
+ *
630
+ * @param data - Full CFB document bytes.
631
+ * @param sectors - Sector indices to read (0-based within the file body).
632
+ * @param sectorSize - Bytes per sector (512 or 4096).
633
+ * @returns Concatenated sector data (may be truncated if past EOF).
634
+ */
635
+ function readSectorChain(data, sectors, sectorSize) {
636
+ var e_5, _a;
637
+ var out = new Uint8Array(sectors.length * sectorSize);
638
+ var offset = 0;
639
+ try {
640
+ for (var sectors_3 = __values(sectors), sectors_3_1 = sectors_3.next(); !sectors_3_1.done; sectors_3_1 = sectors_3.next()) {
641
+ var sector = sectors_3_1.value;
642
+ var start = (sector + 1) * sectorSize;
643
+ var end = Math.min(start + sectorSize, data.length);
644
+ if (start >= data.length)
645
+ break;
646
+ out.set(data.subarray(start, end), offset);
647
+ offset += sectorSize;
648
+ }
649
+ }
650
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
651
+ finally {
652
+ try {
653
+ if (sectors_3_1 && !sectors_3_1.done && (_a = sectors_3.return)) _a.call(sectors_3);
654
+ }
655
+ finally { if (e_5) throw e_5.error; }
656
+ }
657
+ return out;
658
+ }
659
+ //# sourceMappingURL=AcDbOleImageExtractor.js.map