@mlightcad/libredwg-converter 3.15.12 → 3.15.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/libredwg-parser-worker.js +9 -9
- package/lib/AcDbLibreDwgConverterUtil.d.ts +1 -1
- package/lib/AcDbLibreDwgConverterUtil.d.ts.map +1 -1
- package/lib/AcDbLibreDwgConverterUtil.js +6 -1
- package/lib/AcDbLibreDwgConverterUtil.js.map +1 -1
- package/lib/AcDbLibreDwgMainThreadConverter.d.ts +18 -0
- package/lib/AcDbLibreDwgMainThreadConverter.d.ts.map +1 -0
- package/lib/AcDbLibreDwgMainThreadConverter.js +102 -0
- package/lib/AcDbLibreDwgMainThreadConverter.js.map +1 -0
- package/lib/AcDbLibreDwgParserWorker.js +2 -2
- package/lib/AcDbLibreDwgParserWorker.js.map +1 -1
- package/lib/extractDwgThumbnailImage.d.ts +24 -0
- package/lib/extractDwgThumbnailImage.d.ts.map +1 -0
- package/lib/extractDwgThumbnailImage.js +157 -0
- package/lib/extractDwgThumbnailImage.js.map +1 -0
- package/lib/node.d.ts +2 -0
- package/lib/node.d.ts.map +1 -0
- package/lib/node.js +2 -0
- package/lib/node.js.map +1 -0
- package/package.json +12 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcDbLibreDwgConverterUtil.d.ts","sourceRoot":"","sources":["../src/AcDbLibreDwgConverterUtil.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AcDbLibreDwgConverterUtil.d.ts","sourceRoot":"","sources":["../src/AcDbLibreDwgConverterUtil.ts"],"names":[],"mappings":"AAIA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;;;;;GAyBxD"}
|
|
@@ -35,9 +35,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
37
|
import { Dwg_File_Type, LibreDwg } from '@mlightcad/libredwg-web';
|
|
38
|
+
import { acdbEnsureDwgThumbnailImage } from './extractDwgThumbnailImage';
|
|
38
39
|
export function parseDwg(data) {
|
|
39
40
|
return __awaiter(this, void 0, void 0, function () {
|
|
40
|
-
var libredwg, dwgDataPtr, result;
|
|
41
|
+
var libredwg, dwgDataPtr, result, fileBytes;
|
|
41
42
|
return __generator(this, function (_a) {
|
|
42
43
|
switch (_a.label) {
|
|
43
44
|
case 0: return [4 /*yield*/, LibreDwg.create()];
|
|
@@ -52,6 +53,10 @@ export function parseDwg(data) {
|
|
|
52
53
|
}
|
|
53
54
|
result = libredwg.convertEx(dwgDataPtr);
|
|
54
55
|
libredwg.dwg_free(dwgDataPtr);
|
|
56
|
+
fileBytes = typeof data === 'string' ? undefined : new Uint8Array(data);
|
|
57
|
+
if (fileBytes) {
|
|
58
|
+
acdbEnsureDwgThumbnailImage(result.database, fileBytes);
|
|
59
|
+
}
|
|
55
60
|
return [2 /*return*/, result];
|
|
56
61
|
}
|
|
57
62
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcDbLibreDwgConverterUtil.js","sourceRoot":"","sources":["../src/AcDbLibreDwgConverterUtil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEjE,MAAM,UAAgB,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"AcDbLibreDwgConverterUtil.js","sourceRoot":"","sources":["../src/AcDbLibreDwgConverterUtil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAExE,MAAM,UAAgB,QAAQ,CAAC,IAA0B;;;;;wBAItC,qBAAM,QAAQ,CAAC,MAAM,EAAE,EAAA;;oBAAlC,QAAQ,GAAG,SAAuB;oBACxC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;wBACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;oBAC5C,CAAC;oBAEK,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;oBAClE,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;wBACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;oBAC7C,CAAC;oBACK,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;oBAC7C,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;oBAIvB,SAAS,GACb,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;oBAC7D,IAAI,SAAS,EAAE,CAAC;wBACd,2BAA2B,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;oBACzD,CAAC;oBAED,sBAAO,MAAM,EAAA;;;;CACd"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AcDbDatabaseConverterConfig, AcDbParsingTaskResult } from '@mlightcad/data-model';
|
|
2
|
+
import type { DwgDatabase } from '@mlightcad/libredwg-web';
|
|
3
|
+
import { AcDbLibreDwgConverter } from './AcDbLibreDwgConverter';
|
|
4
|
+
/**
|
|
5
|
+
* LibreDWG converter that parses on the current thread (no Web Worker).
|
|
6
|
+
*
|
|
7
|
+
* Intended for Node and other environments without a reliable worker + WASM
|
|
8
|
+
* loader. Shares {@link parseDwg} with the browser worker, including the
|
|
9
|
+
* classic `previewAddress` thumbnail fallback.
|
|
10
|
+
*
|
|
11
|
+
* Import from `@mlightcad/libredwg-converter/node` so the browser UMD bundle
|
|
12
|
+
* stays free of LibreDWG WASM.
|
|
13
|
+
*/
|
|
14
|
+
export declare class AcDbLibreDwgMainThreadConverter extends AcDbLibreDwgConverter {
|
|
15
|
+
constructor(config?: AcDbDatabaseConverterConfig);
|
|
16
|
+
protected parse(data: ArrayBuffer): Promise<AcDbParsingTaskResult<DwgDatabase>>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=AcDbLibreDwgMainThreadConverter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcDbLibreDwgMainThreadConverter.d.ts","sourceRoot":"","sources":["../src/AcDbLibreDwgMainThreadConverter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,qBAAqB,EACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAG/D;;;;;;;;;GASG;AACH,qBAAa,+BAAgC,SAAQ,qBAAqB;gBAC5D,MAAM,GAAE,2BAAgC;cAK3B,KAAK,CAC5B,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;CAO/C"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
var __extends = (this && this.__extends) || (function () {
|
|
2
|
+
var extendStatics = function (d, b) {
|
|
3
|
+
extendStatics = Object.setPrototypeOf ||
|
|
4
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
+
return extendStatics(d, b);
|
|
7
|
+
};
|
|
8
|
+
return function (d, b) {
|
|
9
|
+
if (typeof b !== "function" && b !== null)
|
|
10
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
+
extendStatics(d, b);
|
|
12
|
+
function __() { this.constructor = d; }
|
|
13
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
+
};
|
|
15
|
+
})();
|
|
16
|
+
var __assign = (this && this.__assign) || function () {
|
|
17
|
+
__assign = Object.assign || function(t) {
|
|
18
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
19
|
+
s = arguments[i];
|
|
20
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
21
|
+
t[p] = s[p];
|
|
22
|
+
}
|
|
23
|
+
return t;
|
|
24
|
+
};
|
|
25
|
+
return __assign.apply(this, arguments);
|
|
26
|
+
};
|
|
27
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
28
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
29
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
30
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
31
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
32
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
33
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
37
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
38
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
39
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
40
|
+
function step(op) {
|
|
41
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
42
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
43
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
44
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
45
|
+
switch (op[0]) {
|
|
46
|
+
case 0: case 1: t = op; break;
|
|
47
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
48
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
49
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
50
|
+
default:
|
|
51
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
52
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
53
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
54
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
55
|
+
if (t[2]) _.ops.pop();
|
|
56
|
+
_.trys.pop(); continue;
|
|
57
|
+
}
|
|
58
|
+
op = body.call(thisArg, _);
|
|
59
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
60
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
import { AcDbLibreDwgConverter } from './AcDbLibreDwgConverter';
|
|
64
|
+
import { parseDwg } from './AcDbLibreDwgConverterUtil';
|
|
65
|
+
/**
|
|
66
|
+
* LibreDWG converter that parses on the current thread (no Web Worker).
|
|
67
|
+
*
|
|
68
|
+
* Intended for Node and other environments without a reliable worker + WASM
|
|
69
|
+
* loader. Shares {@link parseDwg} with the browser worker, including the
|
|
70
|
+
* classic `previewAddress` thumbnail fallback.
|
|
71
|
+
*
|
|
72
|
+
* Import from `@mlightcad/libredwg-converter/node` so the browser UMD bundle
|
|
73
|
+
* stays free of LibreDWG WASM.
|
|
74
|
+
*/
|
|
75
|
+
var AcDbLibreDwgMainThreadConverter = /** @class */ (function (_super) {
|
|
76
|
+
__extends(AcDbLibreDwgMainThreadConverter, _super);
|
|
77
|
+
function AcDbLibreDwgMainThreadConverter(config) {
|
|
78
|
+
if (config === void 0) { config = {}; }
|
|
79
|
+
var _this = _super.call(this, __assign(__assign({}, config), { useWorker: false })) || this;
|
|
80
|
+
_this.config.useWorker = false;
|
|
81
|
+
return _this;
|
|
82
|
+
}
|
|
83
|
+
AcDbLibreDwgMainThreadConverter.prototype.parse = function (data) {
|
|
84
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
85
|
+
var parsed;
|
|
86
|
+
return __generator(this, function (_a) {
|
|
87
|
+
switch (_a.label) {
|
|
88
|
+
case 0: return [4 /*yield*/, parseDwg(data)];
|
|
89
|
+
case 1:
|
|
90
|
+
parsed = _a.sent();
|
|
91
|
+
return [2 /*return*/, {
|
|
92
|
+
model: parsed.database,
|
|
93
|
+
data: parsed.stats
|
|
94
|
+
}];
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
return AcDbLibreDwgMainThreadConverter;
|
|
100
|
+
}(AcDbLibreDwgConverter));
|
|
101
|
+
export { AcDbLibreDwgMainThreadConverter };
|
|
102
|
+
//# sourceMappingURL=AcDbLibreDwgMainThreadConverter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcDbLibreDwgMainThreadConverter.js","sourceRoot":"","sources":["../src/AcDbLibreDwgMainThreadConverter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAEtD;;;;;;;;;GASG;AACH;IAAqD,mDAAqB;IACxE,yCAAY,MAAwC;QAAxC,uBAAA,EAAA,WAAwC;QAClD,YAAA,MAAK,kCAAM,MAAM,KAAE,SAAS,EAAE,KAAK,IAAG,SAAA;QACtC,KAAI,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAA;;IAC/B,CAAC;IAEwB,+CAAK,GAA9B,UACE,IAAiB;;;;;4BAEF,qBAAM,QAAQ,CAAC,IAAI,CAAC,EAAA;;wBAA7B,MAAM,GAAG,SAAoB;wBACnC,sBAAO;gCACL,KAAK,EAAE,MAAM,CAAC,QAAQ;gCACtB,IAAI,EAAE,MAAM,CAAC,KAAK;6BACnB,EAAA;;;;KACF;IACH,sCAAC;AAAD,CAAC,AAfD,CAAqD,qBAAqB,GAezE"}
|
|
@@ -60,12 +60,12 @@ var AcDbDwgParserWorker = /** @class */ (function (_super) {
|
|
|
60
60
|
function AcDbDwgParserWorker() {
|
|
61
61
|
return _super !== null && _super.apply(this, arguments) || this;
|
|
62
62
|
}
|
|
63
|
-
AcDbDwgParserWorker.prototype.executeTask = function (
|
|
63
|
+
AcDbDwgParserWorker.prototype.executeTask = function (data) {
|
|
64
64
|
return __awaiter(this, void 0, void 0, function () {
|
|
65
65
|
var result;
|
|
66
66
|
return __generator(this, function (_a) {
|
|
67
67
|
switch (_a.label) {
|
|
68
|
-
case 0: return [4 /*yield*/, parseDwg(
|
|
68
|
+
case 0: return [4 /*yield*/, parseDwg(data)];
|
|
69
69
|
case 1:
|
|
70
70
|
result = _a.sent();
|
|
71
71
|
return [2 /*return*/, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcDbLibreDwgParserWorker.js","sourceRoot":"","sources":["../src/AcDbLibreDwgParserWorker.ts"],"names":[],"mappings":"AAAA,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjC,OAAO,EAAE,cAAc,EAAyB,MAAM,uBAAuB,CAAA;AAG7E,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACtD;;GAEG;AACH;IAAkC,uCAGjC;IAHD;;IAWA,CAAC;IAPiB,yCAAW,GAA3B,UAA4B,
|
|
1
|
+
{"version":3,"file":"AcDbLibreDwgParserWorker.js","sourceRoot":"","sources":["../src/AcDbLibreDwgParserWorker.ts"],"names":[],"mappings":"AAAA,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjC,OAAO,EAAE,cAAc,EAAyB,MAAM,uBAAuB,CAAA;AAG7E,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACtD;;GAEG;AACH;IAAkC,uCAGjC;IAHD;;IAWA,CAAC;IAPiB,yCAAW,GAA3B,UAA4B,IAAiB;;;;;4BAC5B,qBAAM,QAAQ,CAAC,IAAI,CAAC,EAAA;;wBAA7B,MAAM,GAAG,SAAoB;wBACnC,sBAAO;gCACL,KAAK,EAAE,MAAM,CAAC,QAAQ;gCACtB,IAAI,EAAE,MAAM,CAAC,KAAK;6BACnB,EAAA;;;;KACF;IACH,0BAAC;AAAD,CAAC,AAXD,CAAkC,cAAc,GAW/C;AAED,wBAAwB;AACxB,IAAI,mBAAmB,EAAE,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { DwgDatabase } from '@mlightcad/libredwg-web';
|
|
2
|
+
/**
|
|
3
|
+
* Extracts a drawing-level BMP/PNG thumbnail from raw DWG bytes.
|
|
4
|
+
*
|
|
5
|
+
* LibreDWG's `dwg_bmp` misses some files (notably AC1021 drawings that still
|
|
6
|
+
* store the classic header `previewAddress` image). This helper reads that
|
|
7
|
+
* layout so {@link DwgDatabase.thumbnailImage} can be filled when LibreDWG
|
|
8
|
+
* leaves it empty.
|
|
9
|
+
*
|
|
10
|
+
* Preview payloads are usually headerless DIBs (`biSize === 40`), not full BMP
|
|
11
|
+
* files — callers should run them through `acdbThumbnailImageToDataUrl` / a BMP
|
|
12
|
+
* decoder that accepts DIBs.
|
|
13
|
+
*
|
|
14
|
+
* When both BMP (code 2) and PNG (code 6) entries exist, PNG is preferred.
|
|
15
|
+
*
|
|
16
|
+
* @returns Thumbnail bytes (bmp/png entry), or `undefined` when none exist.
|
|
17
|
+
*/
|
|
18
|
+
export declare function acdbExtractDwgThumbnailImage(fileBytes: Uint8Array): Uint8Array | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Ensures {@link DwgDatabase.thumbnailImage} is populated when LibreDWG's
|
|
21
|
+
* `dwg_bmp` / `convert` left it empty but the DWG file still embeds a preview.
|
|
22
|
+
*/
|
|
23
|
+
export declare function acdbEnsureDwgThumbnailImage(model: DwgDatabase, fileBytes: Uint8Array): void;
|
|
24
|
+
//# sourceMappingURL=extractDwgThumbnailImage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractDwgThumbnailImage.d.ts","sourceRoot":"","sources":["../src/extractDwgThumbnailImage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAU1D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,UAAU,GACpB,UAAU,GAAG,SAAS,CAuBxB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,UAAU,GACpB,IAAI,CAMN"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
var __values = (this && this.__values) || function(o) {
|
|
2
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
3
|
+
if (m) return m.call(o);
|
|
4
|
+
if (o && typeof o.length === "number") return {
|
|
5
|
+
next: function () {
|
|
6
|
+
if (o && i >= o.length) o = void 0;
|
|
7
|
+
return { value: o && o[i++], done: !o };
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Preview section start sentinel (Open Design Spec / AutoCAD DWG).
|
|
14
|
+
*/
|
|
15
|
+
var PREVIEW_START_SENTINEL = new Uint8Array([
|
|
16
|
+
0x1f, 0x25, 0x6d, 0x07, 0xd4, 0x36, 0x28, 0x28, 0x9d, 0x57, 0xca, 0x3f, 0x9d,
|
|
17
|
+
0x44, 0x10, 0x2b
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* Extracts a drawing-level BMP/PNG thumbnail from raw DWG bytes.
|
|
21
|
+
*
|
|
22
|
+
* LibreDWG's `dwg_bmp` misses some files (notably AC1021 drawings that still
|
|
23
|
+
* store the classic header `previewAddress` image). This helper reads that
|
|
24
|
+
* layout so {@link DwgDatabase.thumbnailImage} can be filled when LibreDWG
|
|
25
|
+
* leaves it empty.
|
|
26
|
+
*
|
|
27
|
+
* Preview payloads are usually headerless DIBs (`biSize === 40`), not full BMP
|
|
28
|
+
* files — callers should run them through `acdbThumbnailImageToDataUrl` / a BMP
|
|
29
|
+
* decoder that accepts DIBs.
|
|
30
|
+
*
|
|
31
|
+
* When both BMP (code 2) and PNG (code 6) entries exist, PNG is preferred.
|
|
32
|
+
*
|
|
33
|
+
* @returns Thumbnail bytes (bmp/png entry), or `undefined` when none exist.
|
|
34
|
+
*/
|
|
35
|
+
export function acdbExtractDwgThumbnailImage(fileBytes) {
|
|
36
|
+
if (fileBytes.length < 0x11)
|
|
37
|
+
return undefined;
|
|
38
|
+
var previewAddress = new DataView(fileBytes.buffer, fileBytes.byteOffset, fileBytes.byteLength).getUint32(0x0d, true);
|
|
39
|
+
var fromAddress = tryParsePreviewAt(fileBytes, previewAddress);
|
|
40
|
+
if (fromAddress)
|
|
41
|
+
return fromAddress;
|
|
42
|
+
// Some writers leave previewAddress stale; fall back to a sentinel scan near
|
|
43
|
+
// the start of the file (preview blocks are typically early).
|
|
44
|
+
var scanLimit = Math.min(fileBytes.length, 1024 * 1024);
|
|
45
|
+
for (var i = 0; i + PREVIEW_START_SENTINEL.length <= scanLimit; i++) {
|
|
46
|
+
if (!bytesEqualAt(fileBytes, i, PREVIEW_START_SENTINEL))
|
|
47
|
+
continue;
|
|
48
|
+
if (i === previewAddress)
|
|
49
|
+
continue;
|
|
50
|
+
var fromScan = tryParsePreviewAt(fileBytes, i);
|
|
51
|
+
if (fromScan)
|
|
52
|
+
return fromScan;
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Ensures {@link DwgDatabase.thumbnailImage} is populated when LibreDWG's
|
|
58
|
+
* `dwg_bmp` / `convert` left it empty but the DWG file still embeds a preview.
|
|
59
|
+
*/
|
|
60
|
+
export function acdbEnsureDwgThumbnailImage(model, fileBytes) {
|
|
61
|
+
var _a;
|
|
62
|
+
if ((_a = model.thumbnailImage) === null || _a === void 0 ? void 0 : _a.length)
|
|
63
|
+
return;
|
|
64
|
+
var extracted = acdbExtractDwgThumbnailImage(fileBytes);
|
|
65
|
+
if (extracted === null || extracted === void 0 ? void 0 : extracted.length) {
|
|
66
|
+
model.thumbnailImage = extracted;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function tryParsePreviewAt(fileBytes, offset) {
|
|
70
|
+
if (offset <= 0 || offset >= fileBytes.length)
|
|
71
|
+
return undefined;
|
|
72
|
+
if (!bytesEqualAt(fileBytes, offset, PREVIEW_START_SENTINEL))
|
|
73
|
+
return undefined;
|
|
74
|
+
var pos = offset + PREVIEW_START_SENTINEL.length;
|
|
75
|
+
if (pos + 5 > fileBytes.length)
|
|
76
|
+
return undefined;
|
|
77
|
+
var view = new DataView(fileBytes.buffer, fileBytes.byteOffset, fileBytes.byteLength);
|
|
78
|
+
// overallSize is recorded but not required to locate entries — truncated
|
|
79
|
+
// writers sometimes disagree with the real byte length.
|
|
80
|
+
view.getInt32(pos, true);
|
|
81
|
+
pos += 4;
|
|
82
|
+
var imageCount = fileBytes[pos];
|
|
83
|
+
pos += 1;
|
|
84
|
+
if (imageCount <= 0 || imageCount > 16)
|
|
85
|
+
return undefined;
|
|
86
|
+
var descriptors = [];
|
|
87
|
+
for (var i = 0; i < imageCount; i++) {
|
|
88
|
+
if (pos + 9 > fileBytes.length)
|
|
89
|
+
return undefined;
|
|
90
|
+
var code = fileBytes[pos];
|
|
91
|
+
pos += 1;
|
|
92
|
+
// Absolute file offset historically; some writers stream payloads
|
|
93
|
+
// sequentially after the descriptor table instead.
|
|
94
|
+
var start = view.getInt32(pos, true);
|
|
95
|
+
pos += 4;
|
|
96
|
+
var size = view.getInt32(pos, true);
|
|
97
|
+
pos += 4;
|
|
98
|
+
descriptors.push({ code: code, start: start, size: size });
|
|
99
|
+
}
|
|
100
|
+
var payloadStart = pos;
|
|
101
|
+
// Prefer absolute file offsets from the descriptor table (classic ODA layout).
|
|
102
|
+
var fromAbsolute = pickBmpOrPng(fileBytes, descriptors, 'absolute');
|
|
103
|
+
if (fromAbsolute)
|
|
104
|
+
return fromAbsolute;
|
|
105
|
+
// Some writers leave start offsets unset and stream payloads right after the
|
|
106
|
+
// descriptor table; walk them in order as a fallback.
|
|
107
|
+
return pickBmpOrPng(fileBytes, descriptors, 'sequential', payloadStart);
|
|
108
|
+
}
|
|
109
|
+
function pickBmpOrPng(fileBytes, descriptors, mode, sequentialPos) {
|
|
110
|
+
var e_1, _a;
|
|
111
|
+
if (sequentialPos === void 0) { sequentialPos = 0; }
|
|
112
|
+
var bmp;
|
|
113
|
+
var pos = sequentialPos;
|
|
114
|
+
try {
|
|
115
|
+
for (var descriptors_1 = __values(descriptors), descriptors_1_1 = descriptors_1.next(); !descriptors_1_1.done; descriptors_1_1 = descriptors_1.next()) {
|
|
116
|
+
var descriptor = descriptors_1_1.value;
|
|
117
|
+
var start = mode === 'absolute' ? descriptor.start : pos;
|
|
118
|
+
if (mode === 'sequential')
|
|
119
|
+
pos += Math.max(0, descriptor.size);
|
|
120
|
+
// code 1 = header descriptor, 2 = BMP/DIB, 3 = WMF, 6 = PNG
|
|
121
|
+
if (descriptor.code !== 2 && descriptor.code !== 6)
|
|
122
|
+
continue;
|
|
123
|
+
var data = sliceAt(fileBytes, start, descriptor.size);
|
|
124
|
+
if (!(data === null || data === void 0 ? void 0 : data.length))
|
|
125
|
+
continue;
|
|
126
|
+
if (descriptor.code === 6)
|
|
127
|
+
return data.slice();
|
|
128
|
+
if (!bmp)
|
|
129
|
+
bmp = data.slice();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
133
|
+
finally {
|
|
134
|
+
try {
|
|
135
|
+
if (descriptors_1_1 && !descriptors_1_1.done && (_a = descriptors_1.return)) _a.call(descriptors_1);
|
|
136
|
+
}
|
|
137
|
+
finally { if (e_1) throw e_1.error; }
|
|
138
|
+
}
|
|
139
|
+
return bmp;
|
|
140
|
+
}
|
|
141
|
+
function sliceAt(fileBytes, start, size) {
|
|
142
|
+
if (start < 0 || size <= 0)
|
|
143
|
+
return undefined;
|
|
144
|
+
if (start + size > fileBytes.length)
|
|
145
|
+
return undefined;
|
|
146
|
+
return fileBytes.subarray(start, start + size);
|
|
147
|
+
}
|
|
148
|
+
function bytesEqualAt(haystack, offset, needle) {
|
|
149
|
+
if (offset + needle.length > haystack.length)
|
|
150
|
+
return false;
|
|
151
|
+
for (var i = 0; i < needle.length; i++) {
|
|
152
|
+
if (haystack[offset + i] !== needle[i])
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=extractDwgThumbnailImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractDwgThumbnailImage.js","sourceRoot":"","sources":["../src/extractDwgThumbnailImage.ts"],"names":[],"mappings":"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"}
|
package/lib/node.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAA"}
|
package/lib/node.js
ADDED
package/lib/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mlightcad/libredwg-converter",
|
|
3
|
-
"version": "3.15.
|
|
3
|
+
"version": "3.15.13",
|
|
4
4
|
"license": "GPL-3.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -31,19 +31,25 @@
|
|
|
31
31
|
"module": "./lib/index.js",
|
|
32
32
|
"types": "./lib/index.d.ts",
|
|
33
33
|
"exports": {
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
".": {
|
|
35
|
+
"types": "./lib/index.d.ts",
|
|
36
|
+
"import": "./lib/index.js",
|
|
37
|
+
"require": "./dist/libredwg-converter.umd.cjs"
|
|
38
|
+
},
|
|
39
|
+
"./node": {
|
|
40
|
+
"types": "./lib/node.d.ts",
|
|
41
|
+
"import": "./lib/node.js"
|
|
42
|
+
}
|
|
37
43
|
},
|
|
38
44
|
"dependencies": {
|
|
39
45
|
"@mlightcad/libredwg-web": "^0.8.1"
|
|
40
46
|
},
|
|
41
47
|
"devDependencies": {
|
|
42
48
|
"vite": "^6.4.3",
|
|
43
|
-
"@mlightcad/data-model": "1.15.
|
|
49
|
+
"@mlightcad/data-model": "1.15.13"
|
|
44
50
|
},
|
|
45
51
|
"peerDependencies": {
|
|
46
|
-
"@mlightcad/data-model": "1.15.
|
|
52
|
+
"@mlightcad/data-model": "1.15.13"
|
|
47
53
|
},
|
|
48
54
|
"scripts": {
|
|
49
55
|
"analyze": "pnpm run analyze:lib && pnpm run analyze:worker",
|