emf-converter 4.4.7 → 4.4.9
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/browser.js +230 -102
- package/dist/browser.mjs +230 -102
- package/dist/index.js +234 -106
- package/dist/index.mjs +234 -106
- package/package.json +1 -1
package/dist/browser.mjs
CHANGED
|
@@ -1367,21 +1367,21 @@ var require_decoder = __commonJS({
|
|
|
1367
1367
|
successiveACState = 0;
|
|
1368
1368
|
}
|
|
1369
1369
|
}
|
|
1370
|
-
function decodeMcu(component2,
|
|
1370
|
+
function decodeMcu(component2, decode4, mcu2, row, col) {
|
|
1371
1371
|
var mcuRow = mcu2 / mcusPerLine | 0;
|
|
1372
1372
|
var mcuCol = mcu2 % mcusPerLine;
|
|
1373
1373
|
var blockRow = mcuRow * component2.v + row;
|
|
1374
1374
|
var blockCol = mcuCol * component2.h + col;
|
|
1375
1375
|
if (component2.blocks[blockRow] === void 0 && opts.tolerantDecoding)
|
|
1376
1376
|
return;
|
|
1377
|
-
|
|
1377
|
+
decode4(component2, component2.blocks[blockRow][blockCol]);
|
|
1378
1378
|
}
|
|
1379
|
-
function decodeBlock(component2,
|
|
1379
|
+
function decodeBlock(component2, decode4, mcu2) {
|
|
1380
1380
|
var blockRow = mcu2 / component2.blocksPerLine | 0;
|
|
1381
1381
|
var blockCol = mcu2 % component2.blocksPerLine;
|
|
1382
1382
|
if (component2.blocks[blockRow] === void 0 && opts.tolerantDecoding)
|
|
1383
1383
|
return;
|
|
1384
|
-
|
|
1384
|
+
decode4(component2, component2.blocks[blockRow][blockCol]);
|
|
1385
1385
|
}
|
|
1386
1386
|
var componentsLength = components.length;
|
|
1387
1387
|
var component, i, j, k, n;
|
|
@@ -2102,12 +2102,12 @@ var require_decoder = __commonJS({
|
|
|
2102
2102
|
return constructor;
|
|
2103
2103
|
})();
|
|
2104
2104
|
if (typeof module !== "undefined") {
|
|
2105
|
-
module.exports =
|
|
2105
|
+
module.exports = decode3;
|
|
2106
2106
|
} else if (typeof window !== "undefined") {
|
|
2107
2107
|
window["jpeg-js"] = window["jpeg-js"] || {};
|
|
2108
|
-
window["jpeg-js"].decode =
|
|
2108
|
+
window["jpeg-js"].decode = decode3;
|
|
2109
2109
|
}
|
|
2110
|
-
function
|
|
2110
|
+
function decode3(jpegData, userOpts = {}) {
|
|
2111
2111
|
var defaultOpts = {
|
|
2112
2112
|
// "undefined" means "Choose whether to transform colors based on the image’s color model."
|
|
2113
2113
|
colorTransform: void 0,
|
|
@@ -2159,10 +2159,10 @@ var require_decoder = __commonJS({
|
|
|
2159
2159
|
var require_jpeg_js = __commonJS({
|
|
2160
2160
|
"node_modules/jpeg-js/index.js"(exports, module) {
|
|
2161
2161
|
var encode2 = require_encoder();
|
|
2162
|
-
var
|
|
2162
|
+
var decode3 = require_decoder();
|
|
2163
2163
|
module.exports = {
|
|
2164
2164
|
encode: encode2,
|
|
2165
|
-
decode:
|
|
2165
|
+
decode: decode3
|
|
2166
2166
|
};
|
|
2167
2167
|
}
|
|
2168
2168
|
});
|
|
@@ -4760,8 +4760,8 @@ var require_deflate2 = __commonJS({
|
|
|
4760
4760
|
var Z_DEFAULT_COMPRESSION = -1;
|
|
4761
4761
|
var Z_DEFAULT_STRATEGY = 0;
|
|
4762
4762
|
var Z_DEFLATED = 8;
|
|
4763
|
-
function Deflate(
|
|
4764
|
-
if (!(this instanceof Deflate)) return new Deflate(
|
|
4763
|
+
function Deflate(options2) {
|
|
4764
|
+
if (!(this instanceof Deflate)) return new Deflate(options2);
|
|
4765
4765
|
this.options = utils.assign({
|
|
4766
4766
|
level: Z_DEFAULT_COMPRESSION,
|
|
4767
4767
|
method: Z_DEFLATED,
|
|
@@ -4770,7 +4770,7 @@ var require_deflate2 = __commonJS({
|
|
|
4770
4770
|
memLevel: 8,
|
|
4771
4771
|
strategy: Z_DEFAULT_STRATEGY,
|
|
4772
4772
|
to: ""
|
|
4773
|
-
},
|
|
4773
|
+
}, options2 || {});
|
|
4774
4774
|
var opt = this.options;
|
|
4775
4775
|
if (opt.raw && opt.windowBits > 0) {
|
|
4776
4776
|
opt.windowBits = -opt.windowBits;
|
|
@@ -4878,23 +4878,23 @@ var require_deflate2 = __commonJS({
|
|
|
4878
4878
|
this.err = status;
|
|
4879
4879
|
this.msg = this.strm.msg;
|
|
4880
4880
|
};
|
|
4881
|
-
function deflate(input,
|
|
4882
|
-
var deflator = new Deflate(
|
|
4881
|
+
function deflate(input, options2) {
|
|
4882
|
+
var deflator = new Deflate(options2);
|
|
4883
4883
|
deflator.push(input, true);
|
|
4884
4884
|
if (deflator.err) {
|
|
4885
4885
|
throw deflator.msg || msg[deflator.err];
|
|
4886
4886
|
}
|
|
4887
4887
|
return deflator.result;
|
|
4888
4888
|
}
|
|
4889
|
-
function deflateRaw(input,
|
|
4890
|
-
|
|
4891
|
-
|
|
4892
|
-
return deflate(input,
|
|
4889
|
+
function deflateRaw(input, options2) {
|
|
4890
|
+
options2 = options2 || {};
|
|
4891
|
+
options2.raw = true;
|
|
4892
|
+
return deflate(input, options2);
|
|
4893
4893
|
}
|
|
4894
|
-
function gzip(input,
|
|
4895
|
-
|
|
4896
|
-
|
|
4897
|
-
return deflate(input,
|
|
4894
|
+
function gzip(input, options2) {
|
|
4895
|
+
options2 = options2 || {};
|
|
4896
|
+
options2.gzip = true;
|
|
4897
|
+
return deflate(input, options2);
|
|
4898
4898
|
}
|
|
4899
4899
|
exports.Deflate = Deflate;
|
|
4900
4900
|
exports.deflate = deflate;
|
|
@@ -6757,13 +6757,13 @@ var require_inflate2 = __commonJS({
|
|
|
6757
6757
|
var ZStream = require_zstream();
|
|
6758
6758
|
var GZheader = require_gzheader();
|
|
6759
6759
|
var toString = Object.prototype.toString;
|
|
6760
|
-
function Inflate(
|
|
6761
|
-
if (!(this instanceof Inflate)) return new Inflate(
|
|
6760
|
+
function Inflate(options2) {
|
|
6761
|
+
if (!(this instanceof Inflate)) return new Inflate(options2);
|
|
6762
6762
|
this.options = utils.assign({
|
|
6763
6763
|
chunkSize: 16384,
|
|
6764
6764
|
windowBits: 0,
|
|
6765
6765
|
to: ""
|
|
6766
|
-
},
|
|
6766
|
+
}, options2 || {});
|
|
6767
6767
|
var opt = this.options;
|
|
6768
6768
|
if (opt.raw && opt.windowBits >= 0 && opt.windowBits < 16) {
|
|
6769
6769
|
opt.windowBits = -opt.windowBits;
|
|
@@ -6771,7 +6771,7 @@ var require_inflate2 = __commonJS({
|
|
|
6771
6771
|
opt.windowBits = -15;
|
|
6772
6772
|
}
|
|
6773
6773
|
}
|
|
6774
|
-
if (opt.windowBits >= 0 && opt.windowBits < 16 && !(
|
|
6774
|
+
if (opt.windowBits >= 0 && opt.windowBits < 16 && !(options2 && options2.windowBits)) {
|
|
6775
6775
|
opt.windowBits += 32;
|
|
6776
6776
|
}
|
|
6777
6777
|
if (opt.windowBits > 15 && opt.windowBits < 48) {
|
|
@@ -6899,18 +6899,18 @@ var require_inflate2 = __commonJS({
|
|
|
6899
6899
|
this.err = status;
|
|
6900
6900
|
this.msg = this.strm.msg;
|
|
6901
6901
|
};
|
|
6902
|
-
function inflate(input,
|
|
6903
|
-
var inflator = new Inflate(
|
|
6902
|
+
function inflate(input, options2) {
|
|
6903
|
+
var inflator = new Inflate(options2);
|
|
6904
6904
|
inflator.push(input, true);
|
|
6905
6905
|
if (inflator.err) {
|
|
6906
6906
|
throw inflator.msg || msg[inflator.err];
|
|
6907
6907
|
}
|
|
6908
6908
|
return inflator.result;
|
|
6909
6909
|
}
|
|
6910
|
-
function inflateRaw(input,
|
|
6911
|
-
|
|
6912
|
-
|
|
6913
|
-
return inflate(input,
|
|
6910
|
+
function inflateRaw(input, options2) {
|
|
6911
|
+
options2 = options2 || {};
|
|
6912
|
+
options2.raw = true;
|
|
6913
|
+
return inflate(input, options2);
|
|
6914
6914
|
}
|
|
6915
6915
|
exports.Inflate = Inflate;
|
|
6916
6916
|
exports.inflate = inflate;
|
|
@@ -10043,7 +10043,7 @@ function inflateZlibSync(input) {
|
|
|
10043
10043
|
bitCnt -= n;
|
|
10044
10044
|
return v;
|
|
10045
10045
|
};
|
|
10046
|
-
const
|
|
10046
|
+
const decode3 = (h) => {
|
|
10047
10047
|
let code = 0;
|
|
10048
10048
|
let first = 0;
|
|
10049
10049
|
let index = 0;
|
|
@@ -10101,7 +10101,7 @@ function inflateZlibSync(input) {
|
|
|
10101
10101
|
const clh = buildHuffman(cl, 19);
|
|
10102
10102
|
const lens = new Uint8Array(hlit + hdist);
|
|
10103
10103
|
for (let i = 0; i < hlit + hdist; ) {
|
|
10104
|
-
const sym =
|
|
10104
|
+
const sym = decode3(clh);
|
|
10105
10105
|
if (sym < 16) {
|
|
10106
10106
|
lens[i++] = sym;
|
|
10107
10107
|
} else if (sym === 16) {
|
|
@@ -10121,7 +10121,7 @@ function inflateZlibSync(input) {
|
|
|
10121
10121
|
throw new Error("inflate: invalid block type");
|
|
10122
10122
|
}
|
|
10123
10123
|
for (; ; ) {
|
|
10124
|
-
const sym =
|
|
10124
|
+
const sym = decode3(lit);
|
|
10125
10125
|
if (sym < 256) {
|
|
10126
10126
|
need(1);
|
|
10127
10127
|
out[outLen++] = sym;
|
|
@@ -10130,7 +10130,7 @@ function inflateZlibSync(input) {
|
|
|
10130
10130
|
} else {
|
|
10131
10131
|
const li = sym - 257;
|
|
10132
10132
|
const len = LENGTH_BASE[li] + bits(LENGTH_EXTRA[li]);
|
|
10133
|
-
const di =
|
|
10133
|
+
const di = decode3(dist);
|
|
10134
10134
|
const d = DIST_BASE[di] + bits(DIST_EXTRA[di]);
|
|
10135
10135
|
need(len);
|
|
10136
10136
|
for (let k = 0; k < len; k++) {
|
|
@@ -10310,15 +10310,74 @@ async function decodePng(bytes) {
|
|
|
10310
10310
|
return { width, height, data: out };
|
|
10311
10311
|
}
|
|
10312
10312
|
|
|
10313
|
-
// src/
|
|
10313
|
+
// src/jpeg-decoder.ts
|
|
10314
10314
|
var import_jpeg_js = __toESM(require_jpeg_js());
|
|
10315
|
+
var options = { useTArray: true, formatAsRGBA: true, maxResolutionInMP: 67.108864, maxMemoryUsageInMB: 512 };
|
|
10316
|
+
function decodeJpegPixels(bytes, colorTransform) {
|
|
10317
|
+
let sampling = [];
|
|
10318
|
+
let adobeTransform;
|
|
10319
|
+
let adobeOffset = -1;
|
|
10320
|
+
for (let position = 2; position + 4 <= bytes.length; ) {
|
|
10321
|
+
if (bytes[position] !== 255) break;
|
|
10322
|
+
if (bytes[position + 1] === 255) {
|
|
10323
|
+
position++;
|
|
10324
|
+
continue;
|
|
10325
|
+
}
|
|
10326
|
+
const marker = bytes[position + 1];
|
|
10327
|
+
if (marker === 218 || marker === 217) break;
|
|
10328
|
+
const length = bytes[position + 2] * 256 + bytes[position + 3];
|
|
10329
|
+
if (length < 2 || position + length + 2 > bytes.length) break;
|
|
10330
|
+
const start = position + 4;
|
|
10331
|
+
if ([192, 193, 194].includes(marker) && length >= 8) {
|
|
10332
|
+
const count = bytes[start + 5];
|
|
10333
|
+
if (length >= 8 + 3 * count) sampling = Array.from({ length: count }, (_, i) => ({ id: bytes[start + 6 + i * 3], h: bytes[start + 7 + i * 3] >> 4, v: bytes[start + 7 + i * 3] & 15 }));
|
|
10334
|
+
}
|
|
10335
|
+
if (marker === 238 && length >= 14 && String.fromCharCode(...bytes.subarray(start, start + 5)) === "Adobe") {
|
|
10336
|
+
adobeOffset = start + 11;
|
|
10337
|
+
adobeTransform = bytes[adobeOffset];
|
|
10338
|
+
}
|
|
10339
|
+
position += length + 2;
|
|
10340
|
+
}
|
|
10341
|
+
const transform = colorTransform ?? (adobeTransform !== void 0 ? adobeTransform !== 0 : !sampling.every((component, i) => component.id === [82, 71, 66][i]));
|
|
10342
|
+
if (sampling.length !== 3 || !transform) return (0, import_jpeg_js.decode)(bytes, { ...options, colorTransform: sampling.length === 3 ? transform : colorTransform });
|
|
10343
|
+
const maxH = Math.max(...sampling.map((c) => c.h)), maxV = Math.max(...sampling.map((c) => c.v));
|
|
10344
|
+
if (sampling.some((c) => !c.h || !c.v || maxH % c.h || maxV % c.v)) return (0, import_jpeg_js.decode)(bytes, { ...options, colorTransform });
|
|
10345
|
+
let encoded = bytes;
|
|
10346
|
+
if (adobeTransform) {
|
|
10347
|
+
encoded = bytes.slice();
|
|
10348
|
+
encoded[adobeOffset] = 0;
|
|
10349
|
+
}
|
|
10350
|
+
const raw = (0, import_jpeg_js.decode)(encoded, { ...options, colorTransform: false });
|
|
10351
|
+
const { width, height } = raw;
|
|
10352
|
+
const data = new Uint8Array(raw.data.length);
|
|
10353
|
+
const sample2 = (x, y, channel) => {
|
|
10354
|
+
const sx = maxH / sampling[channel].h, sy = maxV / sampling[channel].v;
|
|
10355
|
+
const px = Math.max(0, Math.min(Math.ceil(width / sx) - 1, (x + 0.5) / sx - 0.5));
|
|
10356
|
+
const py = Math.max(0, Math.min(Math.ceil(height / sy) - 1, (y + 0.5) / sy - 0.5));
|
|
10357
|
+
const ix = Math.floor(px), iy = Math.floor(py), fx = px - ix, fy = py - iy;
|
|
10358
|
+
const at = (xx, yy) => raw.data[(Math.min(height - 1, yy * sy) * width + Math.min(width - 1, xx * sx)) * 4 + channel];
|
|
10359
|
+
return (1 - fy) * ((1 - fx) * at(ix, iy) + fx * at(ix + 1, iy)) + fy * ((1 - fx) * at(ix, iy + 1) + fx * at(ix + 1, iy + 1));
|
|
10360
|
+
};
|
|
10361
|
+
const byte = (value) => Math.max(0, Math.min(255, Math.round(value)));
|
|
10362
|
+
for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) {
|
|
10363
|
+
const luma = sample2(x, y, 0), cb = sample2(x, y, 1) - 128, cr = sample2(x, y, 2) - 128;
|
|
10364
|
+
const offset = (y * width + x) * 4;
|
|
10365
|
+
data[offset] = byte(luma + 1.402 * cr);
|
|
10366
|
+
data[offset + 1] = byte(luma - 0.3441363 * cb - 0.71413636 * cr);
|
|
10367
|
+
data[offset + 2] = byte(luma + 1.772 * cb);
|
|
10368
|
+
data[offset + 3] = 255;
|
|
10369
|
+
}
|
|
10370
|
+
return { ...raw, data };
|
|
10371
|
+
}
|
|
10372
|
+
|
|
10373
|
+
// src/image-codec-fallback.ts
|
|
10315
10374
|
var import_gifuct_js = __toESM(require_lib2());
|
|
10316
10375
|
var UTIF = __toESM(require_UTIF());
|
|
10317
10376
|
|
|
10318
10377
|
// src/tiff-group3.ts
|
|
10319
10378
|
function normalizeGroup3(buffer, page) {
|
|
10320
|
-
const
|
|
10321
|
-
if (!Array.isArray(page.t259) || page.t259[0] !== 3 || (
|
|
10379
|
+
const options2 = Array.isArray(page.t292) ? Number(page.t292[0]) : 0;
|
|
10380
|
+
if (!Array.isArray(page.t259) || page.t259[0] !== 3 || (options2 & 3) !== 0) return buffer;
|
|
10322
10381
|
const offsets = page.t273, lengths = page.t279;
|
|
10323
10382
|
if (!Array.isArray(offsets) || !Array.isArray(lengths) || offsets.length !== lengths.length) return buffer;
|
|
10324
10383
|
const source = new Uint8Array(buffer);
|
|
@@ -10352,16 +10411,50 @@ function normalizeGroup3(buffer, page) {
|
|
|
10352
10411
|
return offset;
|
|
10353
10412
|
});
|
|
10354
10413
|
page.t279 = strips.map((strip) => strip.length);
|
|
10355
|
-
page.t292 = [
|
|
10414
|
+
page.t292 = [options2 | 1];
|
|
10356
10415
|
return normalized.buffer;
|
|
10357
10416
|
}
|
|
10358
10417
|
|
|
10418
|
+
// src/tiff-jpeg.ts
|
|
10419
|
+
function decodeJpegTiff(bytes, page) {
|
|
10420
|
+
const values = (tag2) => Array.isArray(page[tag2]) ? page[tag2].map(Number) : [];
|
|
10421
|
+
const first = (tag2, fallback = 0) => values(tag2)[0] ?? fallback;
|
|
10422
|
+
const photo = first("t262");
|
|
10423
|
+
if (first("t259") !== 7 || photo !== 2 && photo !== 6 || first("t277") !== 3 || first("t284", 1) !== 1 || values("t258").some((v) => v !== 8)) return null;
|
|
10424
|
+
const width = first("t256"), height = first("t257");
|
|
10425
|
+
const tiled = !!page.t322;
|
|
10426
|
+
const blockWidth = tiled ? first("t322") : width;
|
|
10427
|
+
const blockHeight = tiled ? first("t323") : first("t278", height);
|
|
10428
|
+
if (!Number.isInteger(blockWidth) || !Number.isInteger(blockHeight) || blockWidth <= 0 || blockHeight <= 0 || blockWidth > 8192 || blockHeight > 8192) throw new Error("Invalid TIFF JPEG block");
|
|
10429
|
+
const offsets = values(tiled ? "t324" : "t273");
|
|
10430
|
+
const lengths = values(tiled ? "t325" : "t279");
|
|
10431
|
+
const columns = Math.ceil(width / blockWidth), rows = Math.ceil(height / blockHeight);
|
|
10432
|
+
if (offsets.length !== columns * rows || lengths.length !== offsets.length) throw new Error("Invalid TIFF JPEG offsets");
|
|
10433
|
+
const tables = page.t347 instanceof Uint8Array ? page.t347 : new Uint8Array(values("t347"));
|
|
10434
|
+
const tableLength = tables.length >= 2 && tables[tables.length - 2] === 255 && tables[tables.length - 1] === 217 ? tables.length - 2 : tables.length;
|
|
10435
|
+
const result = new Uint8ClampedArray(width * height * 4);
|
|
10436
|
+
for (let block = 0; block < offsets.length; block++) {
|
|
10437
|
+
const offset = offsets[block], length = lengths[block];
|
|
10438
|
+
if (!Number.isInteger(offset) || !Number.isInteger(length) || offset < 0 || length <= 0 || offset + length > bytes.length) throw new Error("Invalid TIFF JPEG data");
|
|
10439
|
+
const skip = tableLength && bytes[offset] === 255 && bytes[offset + 1] === 216 ? 2 : 0;
|
|
10440
|
+
const jpeg = new Uint8Array(tableLength + length - skip);
|
|
10441
|
+
jpeg.set(tables.subarray(0, tableLength));
|
|
10442
|
+
jpeg.set(bytes.subarray(offset + skip, offset + length), tableLength);
|
|
10443
|
+
const decoded = decodeJpegPixels(jpeg, photo === 6);
|
|
10444
|
+
const x = block % columns * blockWidth, y = Math.floor(block / columns) * blockHeight;
|
|
10445
|
+
const copyWidth = Math.min(blockWidth, width - x), copyHeight = Math.min(blockHeight, height - y);
|
|
10446
|
+
if (decoded.width !== blockWidth || decoded.height < copyHeight || decoded.height > blockHeight) throw new Error("Invalid TIFF JPEG dimensions");
|
|
10447
|
+
for (let row = 0; row < copyHeight; row++) result.set(decoded.data.subarray(row * decoded.width * 4, (row * decoded.width + copyWidth) * 4), ((y + row) * width + x) * 4);
|
|
10448
|
+
}
|
|
10449
|
+
return result;
|
|
10450
|
+
}
|
|
10451
|
+
|
|
10359
10452
|
// src/image-codec-fallback.ts
|
|
10360
10453
|
var validSize = (w, h) => Number.isInteger(w) && Number.isInteger(h) && w > 0 && h > 0 && w <= 8192 && h <= 8192;
|
|
10361
10454
|
function decodeImageCodecFallback(bytes) {
|
|
10362
10455
|
try {
|
|
10363
10456
|
if (bytes[0] === 255 && bytes[1] === 216) {
|
|
10364
|
-
const p = (
|
|
10457
|
+
const p = decodeJpegPixels(bytes);
|
|
10365
10458
|
return validSize(p.width, p.height) ? { ...p, data: new Uint8ClampedArray(p.data) } : null;
|
|
10366
10459
|
}
|
|
10367
10460
|
if (bytes.length >= 13 && String.fromCharCode(...bytes.subarray(0, 6)).match(/^GIF8[79]a$/)) {
|
|
@@ -10395,6 +10488,9 @@ function decodeImageCodecFallback(bytes) {
|
|
|
10395
10488
|
const pages = UTIF.decode(buffer);
|
|
10396
10489
|
const page = pages.find((p) => p.t256 && p.t257);
|
|
10397
10490
|
if (!page || !Array.isArray(page.t256) || !Array.isArray(page.t257) || !validSize(Number(page.t256[0]), Number(page.t257[0]))) return null;
|
|
10491
|
+
const jpeg = decodeJpegTiff(new Uint8Array(buffer), page);
|
|
10492
|
+
if (jpeg) return { data: jpeg, width: Number(page.t256[0]), height: Number(page.t257[0]) };
|
|
10493
|
+
if (Array.isArray(page.t259) && page.t259[0] === 32946) page.t259 = [8];
|
|
10398
10494
|
UTIF.decodeImage(normalizeGroup3(buffer, page), page);
|
|
10399
10495
|
const width = page.width, height = page.height;
|
|
10400
10496
|
if (!validSize(width, height)) return null;
|
|
@@ -14312,13 +14408,13 @@ function writeJsx(node, depth, out, rootSpread) {
|
|
|
14312
14408
|
}
|
|
14313
14409
|
out.push(`${pad}</${node.tag}>`);
|
|
14314
14410
|
}
|
|
14315
|
-
function svgTreeToJsx(node,
|
|
14316
|
-
const name =
|
|
14411
|
+
function svgTreeToJsx(node, options2 = {}) {
|
|
14412
|
+
const name = options2.componentName ?? "Metafile";
|
|
14317
14413
|
if (!/^[A-Z][A-Za-z0-9_$]*$/.test(name)) {
|
|
14318
14414
|
throw new TypeError(`svgTreeToJsx: componentName must be a PascalCase identifier, got ${JSON.stringify(name)}`);
|
|
14319
14415
|
}
|
|
14320
|
-
const ts =
|
|
14321
|
-
const spread =
|
|
14416
|
+
const ts = options2.typescript ?? true;
|
|
14417
|
+
const spread = options2.spreadProps ?? true;
|
|
14322
14418
|
const body = [];
|
|
14323
14419
|
writeJsx(node, 2, body, spread);
|
|
14324
14420
|
const params = spread ? ts ? "props: SVGProps<SVGSVGElement>" : "props" : "";
|
|
@@ -15761,11 +15857,11 @@ function mirror(p, n) {
|
|
|
15761
15857
|
}
|
|
15762
15858
|
return p;
|
|
15763
15859
|
}
|
|
15764
|
-
function gdipBlur(src, w, h, radius, vRow = 0, vZeroAbove = false) {
|
|
15860
|
+
function gdipBlur(src, w, h, radius, vRow = 0, vZeroAbove = false, fullVertical = false, edgeWidth = w, edgeHeight = h) {
|
|
15765
15861
|
const k = blurKernel(radius);
|
|
15766
15862
|
const taps = (k.length - 1) / 2;
|
|
15767
|
-
const horizontalIndex =
|
|
15768
|
-
const verticalIndex =
|
|
15863
|
+
const horizontalIndex = taps >= edgeWidth ? (x) => Math.max(0, Math.min(w - 1, x)) : (x) => mirror(x, w);
|
|
15864
|
+
const verticalIndex = taps >= edgeHeight ? (y) => Math.max(0, Math.min(h - 1, y)) : (y) => mirror(y, h);
|
|
15769
15865
|
const out = new Float64Array(w * h * 4);
|
|
15770
15866
|
for (let y = 0; y < h; y++) {
|
|
15771
15867
|
const row = y * w * 4;
|
|
@@ -15791,7 +15887,7 @@ function gdipBlur(src, w, h, radius, vRow = 0, vZeroAbove = false) {
|
|
|
15791
15887
|
}
|
|
15792
15888
|
if (taps > 0 && vRow >= 0 && vRow < h) {
|
|
15793
15889
|
const horizontal = out.slice();
|
|
15794
|
-
const endRow = Math.min(h, vRow +
|
|
15890
|
+
const endRow = fullVertical ? h : Math.min(h, vRow + Math.ceil(h / w));
|
|
15795
15891
|
for (let row = vRow; row < endRow; row++) {
|
|
15796
15892
|
const col = new Float64Array(w * 4);
|
|
15797
15893
|
for (let j = -taps; j <= taps; j++) {
|
|
@@ -15809,14 +15905,46 @@ function gdipBlur(src, w, h, radius, vRow = 0, vZeroAbove = false) {
|
|
|
15809
15905
|
}
|
|
15810
15906
|
return out;
|
|
15811
15907
|
}
|
|
15908
|
+
function blurReduction(radius) {
|
|
15909
|
+
return radius < 20 ? 1 : radius < 40 ? 2 : radius <= 80 ? 4 : radius < 160 ? 8 : 16;
|
|
15910
|
+
}
|
|
15911
|
+
function effectBlur(src, width, height, radius) {
|
|
15912
|
+
const factor = blurReduction(radius);
|
|
15913
|
+
if (factor === 1 || (width < 4 || height < 4) && (width % factor !== 0 || height % factor !== 0)) {
|
|
15914
|
+
return gdipBlur(src, width, height, radius);
|
|
15915
|
+
}
|
|
15916
|
+
const w = Math.ceil(width / factor);
|
|
15917
|
+
const h = Math.ceil(height / factor);
|
|
15918
|
+
const reduced = new Uint8ClampedArray(w * h * 4);
|
|
15919
|
+
for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {
|
|
15920
|
+
const x1 = Math.min(width, (x + 1) * factor), y1 = Math.min(height, (y + 1) * factor);
|
|
15921
|
+
const count = (x1 - x * factor) * (y1 - y * factor);
|
|
15922
|
+
for (let c = 0; c < 4; c++) {
|
|
15923
|
+
let sum = 0;
|
|
15924
|
+
for (let yy = y * factor; yy < y1; yy++) for (let xx = x * factor; xx < x1; xx++) sum += src[(yy * width + xx) * 4 + c];
|
|
15925
|
+
reduced[(y * w + x) * 4 + c] = Math.floor(sum / count);
|
|
15926
|
+
}
|
|
15927
|
+
}
|
|
15928
|
+
const filtered = gdipBlur(reduced, w, h, radius / factor, 0, false, true, Math.floor(width / factor), Math.floor(height / factor));
|
|
15929
|
+
for (let i = 0; i < filtered.length; i++) filtered[i] = Math.round(filtered[i]);
|
|
15930
|
+
const out = new Float64Array(src.length);
|
|
15931
|
+
for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) {
|
|
15932
|
+
const px = clamp((x + 0.5) / factor - 0.5, 0, w - 1), py = clamp((y + 0.5) / factor - 0.5, 0, h - 1);
|
|
15933
|
+
const ix = Math.floor(px), iy = Math.floor(py), fx = px - ix, fy = py - iy;
|
|
15934
|
+
const a = (iy * w + ix) * 4, b = (iy * w + Math.min(w - 1, ix + 1)) * 4;
|
|
15935
|
+
const d = (Math.min(h - 1, iy + 1) * w + ix) * 4, e = (Math.min(h - 1, iy + 1) * w + Math.min(w - 1, ix + 1)) * 4;
|
|
15936
|
+
for (let c = 0; c < 4; c++) out[(y * width + x) * 4 + c] = Math.round((1 - fy) * ((1 - fx) * filtered[a + c] + fx * filtered[b + c]) + fy * ((1 - fx) * filtered[d + c] + fx * filtered[e + c]));
|
|
15937
|
+
}
|
|
15938
|
+
return out;
|
|
15939
|
+
}
|
|
15812
15940
|
function applyBlur(src, w, h, radius) {
|
|
15813
|
-
return Uint8ClampedArray.from(
|
|
15941
|
+
return Uint8ClampedArray.from(effectBlur(src, w, h, radius), Math.round);
|
|
15814
15942
|
}
|
|
15815
15943
|
function sharpenGain(_radius, amount) {
|
|
15816
15944
|
return roundHalfDown(64 * amount / (250 - 2 * amount)) / 64;
|
|
15817
15945
|
}
|
|
15818
15946
|
function applySharpen(src, w, h, radius, amount) {
|
|
15819
|
-
const blurred =
|
|
15947
|
+
const blurred = effectBlur(src, w, h, radius);
|
|
15820
15948
|
const gain = sharpenGain(radius, amount);
|
|
15821
15949
|
const out = new Uint8ClampedArray(src);
|
|
15822
15950
|
for (let i = 0; i < src.length; i += 4) {
|
|
@@ -18638,11 +18766,11 @@ function capFigures(path, closeAll) {
|
|
|
18638
18766
|
}, [1, 0, 0, 1, 0, 0]);
|
|
18639
18767
|
return closeAll ? figures.map((f) => ({ ...f, closed: true })) : figures;
|
|
18640
18768
|
}
|
|
18641
|
-
function customCapGeometry(figures, width, start, end,
|
|
18769
|
+
function customCapGeometry(figures, width, start, end, options2 = {}) {
|
|
18642
18770
|
const out = [];
|
|
18643
18771
|
const capped = [];
|
|
18644
18772
|
const polygons = [];
|
|
18645
|
-
const minFill =
|
|
18773
|
+
const minFill = options2.minFillScale ?? 2;
|
|
18646
18774
|
for (const fig of figures) {
|
|
18647
18775
|
if (fig.closed || !start && !end) {
|
|
18648
18776
|
out.push(fig);
|
|
@@ -18695,7 +18823,7 @@ function customCapGeometry(figures, width, start, end, options = {}) {
|
|
|
18695
18823
|
const pen = {
|
|
18696
18824
|
// GDI+'s widener never makes an outline thinner than one device pixel.
|
|
18697
18825
|
half: Math.max(ws, 1) / 2,
|
|
18698
|
-
join: (
|
|
18826
|
+
join: (options2.widenJoin ?? ((j) => j))(cap.strokeJoin),
|
|
18699
18827
|
miterLimit: 10,
|
|
18700
18828
|
startCap: cap.strokeStartCap,
|
|
18701
18829
|
endCap: cap.strokeEndCap,
|
|
@@ -18705,7 +18833,7 @@ function customCapGeometry(figures, width, start, end, options = {}) {
|
|
|
18705
18833
|
compound: null,
|
|
18706
18834
|
inset: false
|
|
18707
18835
|
};
|
|
18708
|
-
polygons.push(...(
|
|
18836
|
+
polygons.push(...(options2.widen ?? widenFigures)(capFigures(placed, false), pen).map((q) => q.reverse()));
|
|
18709
18837
|
}
|
|
18710
18838
|
};
|
|
18711
18839
|
if (start) {
|
|
@@ -20420,7 +20548,7 @@ var BLEND_MODES = /* @__PURE__ */ new Set([
|
|
|
20420
20548
|
"luminosity"
|
|
20421
20549
|
]);
|
|
20422
20550
|
var SvgContext = class {
|
|
20423
|
-
constructor(width, height,
|
|
20551
|
+
constructor(width, height, options2 = {}) {
|
|
20424
20552
|
this.nextId = 0;
|
|
20425
20553
|
this.stack = [];
|
|
20426
20554
|
/** The current path, in DEVICE space (see `canvas-path.ts`). */
|
|
@@ -20431,9 +20559,9 @@ var SvgContext = class {
|
|
|
20431
20559
|
this.group = null;
|
|
20432
20560
|
this.images = [];
|
|
20433
20561
|
this.canvas = { width, height, svgContext: this };
|
|
20434
|
-
this.shadow =
|
|
20435
|
-
this.imageResampling =
|
|
20436
|
-
this.idPrefix =
|
|
20562
|
+
this.shadow = options2.shadow ?? null;
|
|
20563
|
+
this.imageResampling = options2.imageResampling ?? "renderer";
|
|
20564
|
+
this.idPrefix = options2.idPrefix ?? "emf-";
|
|
20437
20565
|
this.state = {
|
|
20438
20566
|
transform: [...IDENTITY3],
|
|
20439
20567
|
fillStyle: "#000000",
|
|
@@ -21436,7 +21564,7 @@ var SvgContext = class {
|
|
|
21436
21564
|
* Encodes every pending raster payload and returns the finished `<svg>`
|
|
21437
21565
|
* tree. Call once, after replay (and deferred images) are complete.
|
|
21438
21566
|
*/
|
|
21439
|
-
async toTree(
|
|
21567
|
+
async toTree(options2 = {}) {
|
|
21440
21568
|
const cache2 = /* @__PURE__ */ new Map();
|
|
21441
21569
|
for (const img of this.images) {
|
|
21442
21570
|
let url = cache2.get(img.payload);
|
|
@@ -21448,7 +21576,7 @@ var SvgContext = class {
|
|
|
21448
21576
|
}
|
|
21449
21577
|
const { width, height } = this.canvas;
|
|
21450
21578
|
const attrs = { xmlns: "http://www.w3.org/2000/svg" };
|
|
21451
|
-
if (
|
|
21579
|
+
if (options2.includeSize ?? true) {
|
|
21452
21580
|
attrs.width = width;
|
|
21453
21581
|
attrs.height = height;
|
|
21454
21582
|
}
|
|
@@ -32273,12 +32401,12 @@ function drawWithFontEngine(rCtx, offset, dataOff, nChars, offString, viewEnd) {
|
|
|
32273
32401
|
if (!fonts) {
|
|
32274
32402
|
return false;
|
|
32275
32403
|
}
|
|
32276
|
-
const
|
|
32404
|
+
const options2 = view.getUint32(dataOff + 44, true);
|
|
32277
32405
|
const codes = [];
|
|
32278
32406
|
for (let i = 0; i < nChars; i++) {
|
|
32279
32407
|
codes.push(view.getUint16(offset + offString + i * 2, true));
|
|
32280
32408
|
}
|
|
32281
|
-
const pdy = (
|
|
32409
|
+
const pdy = (options2 & ETO_PDY) !== 0;
|
|
32282
32410
|
const raw = readDxArray(view, offset, dataOff, pdy ? nChars * 2 : nChars, viewEnd);
|
|
32283
32411
|
let dx = raw;
|
|
32284
32412
|
let dy = null;
|
|
@@ -32292,10 +32420,10 @@ function drawWithFontEngine(rCtx, offset, dataOff, nChars, offString, viewEnd) {
|
|
|
32292
32420
|
}
|
|
32293
32421
|
const adv = drawGdiTextCall(ctx, fonts, state, {
|
|
32294
32422
|
codes,
|
|
32295
|
-
glyphIndices: (
|
|
32423
|
+
glyphIndices: (options2 & ETO_GLYPH_INDEX) !== 0,
|
|
32296
32424
|
x: view.getInt32(dataOff + 28, true),
|
|
32297
32425
|
y: view.getInt32(dataOff + 32, true),
|
|
32298
|
-
options,
|
|
32426
|
+
options: options2,
|
|
32299
32427
|
rect: {
|
|
32300
32428
|
left: view.getInt32(dataOff + 48, true),
|
|
32301
32429
|
top: view.getInt32(dataOff + 52, true),
|
|
@@ -32437,7 +32565,7 @@ function handleExtTextOutW(rCtx, offset, dataOff, recSize) {
|
|
|
32437
32565
|
}
|
|
32438
32566
|
return true;
|
|
32439
32567
|
}
|
|
32440
|
-
function drawTextCall(rCtx, x, y, codes,
|
|
32568
|
+
function drawTextCall(rCtx, x, y, codes, options2, rect, dx) {
|
|
32441
32569
|
const n = codes.length;
|
|
32442
32570
|
const offString = 76;
|
|
32443
32571
|
const offDx = offString + n * 2 + 3 & -4;
|
|
@@ -32446,7 +32574,7 @@ function drawTextCall(rCtx, x, y, codes, options, rect, dx) {
|
|
|
32446
32574
|
const view = new DataView(new ArrayBuffer(size));
|
|
32447
32575
|
view.setUint32(44, n, true);
|
|
32448
32576
|
view.setUint32(48, offString, true);
|
|
32449
|
-
view.setUint32(52,
|
|
32577
|
+
view.setUint32(52, options2, true);
|
|
32450
32578
|
view.setInt32(36, x, true);
|
|
32451
32579
|
view.setInt32(40, y, true);
|
|
32452
32580
|
view.setInt32(56, rect[0], true);
|
|
@@ -32490,7 +32618,7 @@ function handlePolyText(rCtx, offset, dataOff, recSize, wide) {
|
|
|
32490
32618
|
const e = arrayStart + i * 40;
|
|
32491
32619
|
const x = view.getInt32(e, true), y = view.getInt32(e + 4, true);
|
|
32492
32620
|
const n = view.getUint32(e + 8, true), offString = view.getUint32(e + 12, true);
|
|
32493
|
-
const
|
|
32621
|
+
const options2 = view.getUint32(e + 16, true);
|
|
32494
32622
|
const rect = [view.getInt32(e + 20, true), view.getInt32(e + 24, true), view.getInt32(e + 28, true), view.getInt32(e + 32, true)];
|
|
32495
32623
|
const offDx = view.getUint32(e + 36, true);
|
|
32496
32624
|
const unit = wide ? 2 : 1;
|
|
@@ -32498,13 +32626,13 @@ function handlePolyText(rCtx, offset, dataOff, recSize, wide) {
|
|
|
32498
32626
|
const ansi = wide ? null : readAnsiRecord(view, offset + offString, n, charSet);
|
|
32499
32627
|
const codes = wide ? Array.from({ length: n }, (_, j) => view.getUint16(offset + offString + j * 2, true)) : ansi.codes;
|
|
32500
32628
|
let dx = null;
|
|
32501
|
-
const pdy = (
|
|
32629
|
+
const pdy = (options2 & ETO_PDY) !== 0;
|
|
32502
32630
|
const dxCount = n * (pdy ? 2 : 1);
|
|
32503
32631
|
if (offDx && offDx <= end - offset && dxCount <= Math.floor((end - (offset + offDx)) / 4)) {
|
|
32504
32632
|
dx = Array.from({ length: dxCount }, (_, j) => view.getInt32(offset + offDx + j * 4, true));
|
|
32505
32633
|
if (!wide) dx = collapseAnsiDx(dx, ansi.byteLengths, pdy);
|
|
32506
32634
|
}
|
|
32507
|
-
drawTextCall(rCtx, x, y, codes,
|
|
32635
|
+
drawTextCall(rCtx, x, y, codes, options2, rect, dx);
|
|
32508
32636
|
}
|
|
32509
32637
|
return true;
|
|
32510
32638
|
}
|
|
@@ -32513,13 +32641,13 @@ function handleSmallTextOut(rCtx, offset, dataOff, recSize) {
|
|
|
32513
32641
|
const end = Math.min(view.byteLength, offset + recSize);
|
|
32514
32642
|
if (recSize < 36) return true;
|
|
32515
32643
|
const x = view.getInt32(dataOff, true), y = view.getInt32(dataOff + 4, true);
|
|
32516
|
-
const n = view.getUint32(dataOff + 8, true),
|
|
32517
|
-
const small = (
|
|
32644
|
+
const n = view.getUint32(dataOff + 8, true), options2 = view.getUint32(dataOff + 12, true);
|
|
32645
|
+
const small = (options2 & 512) !== 0, noRect = (options2 & 256) !== 0;
|
|
32518
32646
|
const base = dataOff + 28 + (noRect ? 0 : 16);
|
|
32519
32647
|
if (base > end || n > Math.floor((end - base) / (small ? 1 : 2))) return true;
|
|
32520
32648
|
const rect = noRect ? [0, 0, 0, 0] : [view.getInt32(dataOff + 28, true), view.getInt32(dataOff + 32, true), view.getInt32(dataOff + 36, true), view.getInt32(dataOff + 40, true)];
|
|
32521
32649
|
const codes = small ? Array.from({ length: n }, (_, i) => view.getUint8(base + i)) : Array.from({ length: n }, (_, i) => view.getUint16(base + i * 2, true));
|
|
32522
|
-
drawTextCall(rCtx, x, y, codes,
|
|
32650
|
+
drawTextCall(rCtx, x, y, codes, options2, rect, null);
|
|
32523
32651
|
return true;
|
|
32524
32652
|
}
|
|
32525
32653
|
function handleEmfGdiDrawTextRecord(rCtx, recType, offset, dataOff, recSize) {
|
|
@@ -32533,20 +32661,20 @@ function handleEmfGdiDrawTextRecord(rCtx, recType, offset, dataOff, recSize) {
|
|
|
32533
32661
|
const end = Math.min(view.byteLength, offset + recSize);
|
|
32534
32662
|
if (recSize < 76) return true;
|
|
32535
32663
|
const x = view.getInt32(dataOff + 28, true), y = view.getInt32(dataOff + 32, true);
|
|
32536
|
-
const n = view.getUint32(dataOff + 36, true), strOff = view.getUint32(dataOff + 40, true),
|
|
32664
|
+
const n = view.getUint32(dataOff + 36, true), strOff = view.getUint32(dataOff + 40, true), options2 = view.getUint32(dataOff + 44, true);
|
|
32537
32665
|
if (!strOff || strOff > end - offset) return true;
|
|
32538
32666
|
if (n > end - (offset + strOff)) return true;
|
|
32539
32667
|
const ansi = readAnsiRecord(view, offset + strOff, n, state.fontDetails?.charSet ?? 1);
|
|
32540
32668
|
const rect = [view.getInt32(dataOff + 48, true), view.getInt32(dataOff + 52, true), view.getInt32(dataOff + 56, true), view.getInt32(dataOff + 60, true)];
|
|
32541
32669
|
const offDx = view.getUint32(dataOff + 64, true);
|
|
32542
32670
|
let dx = null;
|
|
32543
|
-
const pdy = (
|
|
32671
|
+
const pdy = (options2 & ETO_PDY) !== 0;
|
|
32544
32672
|
const dxCount = n * (pdy ? 2 : 1);
|
|
32545
32673
|
if (offDx && offDx <= end - offset && dxCount <= Math.floor((end - (offset + offDx)) / 4)) {
|
|
32546
32674
|
dx = Array.from({ length: dxCount }, (_, i) => view.getInt32(offset + offDx + i * 4, true));
|
|
32547
32675
|
dx = collapseAnsiDx(dx, ansi.byteLengths, pdy);
|
|
32548
32676
|
}
|
|
32549
|
-
drawTextCall(rCtx, x, y, ansi.codes,
|
|
32677
|
+
drawTextCall(rCtx, x, y, ansi.codes, options2, rect, dx);
|
|
32550
32678
|
return true;
|
|
32551
32679
|
}
|
|
32552
32680
|
return false;
|
|
@@ -33527,8 +33655,8 @@ function widenBracketPath(rCtx) {
|
|
|
33527
33655
|
if (rCtx.inPath || !rCtx.rasterPath || (state.penStyle & 15) === 5) {
|
|
33528
33656
|
return;
|
|
33529
33657
|
}
|
|
33530
|
-
const
|
|
33531
|
-
const polys = widenPath(rCtx.rasterPath,
|
|
33658
|
+
const options2 = penIsCosmetic(rCtx) ? { width: 16, cap: "round", join: "round", miterLimit: state.miterLimit ?? 10 } : penWidenOptions(rCtx);
|
|
33659
|
+
const polys = widenPath(rCtx.rasterPath, options2);
|
|
33532
33660
|
const path = new GdiRasterPath();
|
|
33533
33661
|
for (const poly of polys) {
|
|
33534
33662
|
if (poly.length < 4) {
|
|
@@ -36309,7 +36437,7 @@ function replayEmfRecords(view, ctx, bounds, canvasW, canvasH, dpiScale = 1, rep
|
|
|
36309
36437
|
}
|
|
36310
36438
|
return allDeferredImages;
|
|
36311
36439
|
}
|
|
36312
|
-
function replayNestedEmf(bytes, ctx, canvasW, canvasH, toCanvas,
|
|
36440
|
+
function replayNestedEmf(bytes, ctx, canvasW, canvasH, toCanvas, options2) {
|
|
36313
36441
|
const view = new DataView(bytes);
|
|
36314
36442
|
const header = parseEmfHeader(view);
|
|
36315
36443
|
if (!header) {
|
|
@@ -36320,11 +36448,11 @@ function replayNestedEmf(bytes, ctx, canvasW, canvasH, toCanvas, options) {
|
|
|
36320
36448
|
const left = -e / a;
|
|
36321
36449
|
const top = -f / d;
|
|
36322
36450
|
const bounds2 = { left, top, right: left + canvasW / a, bottom: top + canvasH / d };
|
|
36323
|
-
return replayEmfRecords(view, ctx, bounds2, canvasW, canvasH, 1,
|
|
36451
|
+
return replayEmfRecords(view, ctx, bounds2, canvasW, canvasH, 1, options2);
|
|
36324
36452
|
}
|
|
36325
36453
|
const bounds = { left: 0, top: 0, right: canvasW, bottom: canvasH };
|
|
36326
36454
|
return replayEmfRecords(view, ctx, bounds, canvasW, canvasH, 1, {
|
|
36327
|
-
...
|
|
36455
|
+
...options2,
|
|
36328
36456
|
plusBaseTransform: toCanvas,
|
|
36329
36457
|
gdiDrawing: false
|
|
36330
36458
|
});
|
|
@@ -37868,8 +37996,8 @@ function wmfExtTextOut(p, dataOff, recEnd) {
|
|
|
37868
37996
|
const y = view.getInt16(dataOff, true);
|
|
37869
37997
|
const x = view.getInt16(dataOff + 2, true);
|
|
37870
37998
|
const n = view.getInt16(dataOff + 4, true);
|
|
37871
|
-
const
|
|
37872
|
-
const hasRect = (
|
|
37999
|
+
const options2 = view.getUint16(dataOff + 6, true);
|
|
38000
|
+
const hasRect = (options2 & (ETO_OPAQUE | ETO_CLIPPED)) !== 0;
|
|
37873
38001
|
const strOff = dataOff + 8 + (hasRect ? 8 : 0);
|
|
37874
38002
|
const rect = hasRect && dataOff + 16 <= recEnd ? [view.getInt16(dataOff + 8, true), view.getInt16(dataOff + 10, true), view.getInt16(dataOff + 12, true), view.getInt16(dataOff + 14, true)] : null;
|
|
37875
38003
|
const count = Math.max(0, n);
|
|
@@ -37889,12 +38017,12 @@ function wmfExtTextOut(p, dataOff, recEnd) {
|
|
|
37889
38017
|
}
|
|
37890
38018
|
}
|
|
37891
38019
|
if (count === 0) {
|
|
37892
|
-
if (rect &&
|
|
37893
|
-
playText(p, { x, y, bytes: [32], options, rect, dx: [0] });
|
|
38020
|
+
if (rect && options2 & ETO_OPAQUE) {
|
|
38021
|
+
playText(p, { x, y, bytes: [32], options: options2, rect, dx: [0] });
|
|
37894
38022
|
}
|
|
37895
38023
|
return;
|
|
37896
38024
|
}
|
|
37897
|
-
playText(p, { x, y, bytes, options, rect, dx });
|
|
38025
|
+
playText(p, { x, y, bytes, options: options2, rect, dx });
|
|
37898
38026
|
}
|
|
37899
38027
|
|
|
37900
38028
|
// src/wmf-replay.ts
|
|
@@ -38364,7 +38492,7 @@ function replayWmfRecords(view, ctx, header, canvasW, canvasH, replayOptions = {
|
|
|
38364
38492
|
|
|
38365
38493
|
// src/emf-converter.ts
|
|
38366
38494
|
var MAX_METAFILE_RECURSION = 3;
|
|
38367
|
-
async function replayMetafile(buffer,
|
|
38495
|
+
async function replayMetafile(buffer, options2, createSurface) {
|
|
38368
38496
|
emfLog(`replayMetafile: input buffer ${buffer.byteLength} bytes`);
|
|
38369
38497
|
if (buffer.byteLength >= 16) {
|
|
38370
38498
|
const hdrBytes = new Uint8Array(buffer, 0, 16);
|
|
@@ -38372,7 +38500,7 @@ async function replayMetafile(buffer, options, createSurface) {
|
|
|
38372
38500
|
`replayMetafile: first 16 bytes: [${Array.from(hdrBytes).map((b) => b.toString(16).padStart(2, "0")).join(" ")}]`
|
|
38373
38501
|
);
|
|
38374
38502
|
}
|
|
38375
|
-
const opts =
|
|
38503
|
+
const opts = options2 ?? {};
|
|
38376
38504
|
const dpiScale = opts.dpiScale ?? DEFAULT_DPI_SCALE;
|
|
38377
38505
|
let view = new DataView(buffer);
|
|
38378
38506
|
let emfHeader = null;
|
|
@@ -38578,12 +38706,12 @@ async function processDeferredImages(ctx, deferredImages, recursionDepth) {
|
|
|
38578
38706
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
38579
38707
|
return complete;
|
|
38580
38708
|
}
|
|
38581
|
-
async function convertMetafileToDataUrl(buffer,
|
|
38709
|
+
async function convertMetafileToDataUrl(buffer, options2, recursionDepth = 0) {
|
|
38582
38710
|
await ensureNodeCanvasModule();
|
|
38583
38711
|
if (recursionDepth > MAX_METAFILE_RECURSION) {
|
|
38584
38712
|
return null;
|
|
38585
38713
|
}
|
|
38586
|
-
const opts = { ...
|
|
38714
|
+
const opts = { ...options2, gdiAntialias: options2?.gdiAntialias ?? false };
|
|
38587
38715
|
let canvas = null;
|
|
38588
38716
|
const result = await replayMetafile(buffer, opts, (w, h) => {
|
|
38589
38717
|
const setup = createCanvas(
|
|
@@ -38652,7 +38780,7 @@ async function resampleExact(bytes, spec, surface) {
|
|
|
38652
38780
|
}
|
|
38653
38781
|
return resampleImage(pixels.data, pixels.width, pixels.height, spec, { w: surface.width, h: surface.height });
|
|
38654
38782
|
}
|
|
38655
|
-
async function processDeferredImagesSvg(svg, deferredImages,
|
|
38783
|
+
async function processDeferredImagesSvg(svg, deferredImages, options2, recursionDepth) {
|
|
38656
38784
|
for (let idx = 0; idx < deferredImages.length; idx++) {
|
|
38657
38785
|
let img = deferredImages[idx];
|
|
38658
38786
|
try {
|
|
@@ -38675,7 +38803,7 @@ async function processDeferredImagesSvg(svg, deferredImages, options, recursionD
|
|
|
38675
38803
|
}
|
|
38676
38804
|
const nested = await convertMetafileToSvgTree(
|
|
38677
38805
|
bytes,
|
|
38678
|
-
{ ...
|
|
38806
|
+
{ ...options2, includeSize: true, idPrefix: void 0 },
|
|
38679
38807
|
recursionDepth + 1
|
|
38680
38808
|
);
|
|
38681
38809
|
if (nested) {
|
|
@@ -38712,7 +38840,7 @@ async function processDeferredImagesSvg(svg, deferredImages, options, recursionD
|
|
|
38712
38840
|
continue;
|
|
38713
38841
|
}
|
|
38714
38842
|
const slot = img.svgSlot ?? svg.reserveSlot();
|
|
38715
|
-
if (img.resample &&
|
|
38843
|
+
if (img.resample && options2.imageResampling === "exact" && !img.isMetafile) {
|
|
38716
38844
|
const block = await resampleExact(bytes, img.resample, svg.canvas);
|
|
38717
38845
|
if (block) {
|
|
38718
38846
|
svg.fillSlot(slot, { kind: "rgba", data: block.rgba, width: block.w, height: block.h }, [1, 0, 0, 1, 0, 0], block.x, block.y, block.w, block.h);
|
|
@@ -38732,16 +38860,16 @@ async function processDeferredImagesSvg(svg, deferredImages, options, recursionD
|
|
|
38732
38860
|
}
|
|
38733
38861
|
}
|
|
38734
38862
|
}
|
|
38735
|
-
async function convertMetafileToSvgTree(buffer,
|
|
38736
|
-
const svg = await replayToSvgContext(buffer,
|
|
38737
|
-
return svg ? svg.toTree({ includeSize:
|
|
38863
|
+
async function convertMetafileToSvgTree(buffer, options2, recursionDepth = 0) {
|
|
38864
|
+
const svg = await replayToSvgContext(buffer, options2, recursionDepth);
|
|
38865
|
+
return svg ? svg.toTree({ includeSize: options2?.includeSize }) : null;
|
|
38738
38866
|
}
|
|
38739
|
-
async function replayToSvgContext(buffer,
|
|
38867
|
+
async function replayToSvgContext(buffer, options2, recursionDepth = 0) {
|
|
38740
38868
|
await ensureNodeCanvasModule();
|
|
38741
38869
|
if (recursionDepth > MAX_METAFILE_RECURSION) {
|
|
38742
38870
|
return null;
|
|
38743
38871
|
}
|
|
38744
|
-
const opts =
|
|
38872
|
+
const opts = options2 ?? {};
|
|
38745
38873
|
const dpiScale = opts.dpiScale ?? DEFAULT_DPI_SCALE;
|
|
38746
38874
|
const idPrefix = opts.idPrefix ?? `emf${++svgDocumentCounter}-`;
|
|
38747
38875
|
let svg = null;
|
|
@@ -38758,12 +38886,12 @@ async function replayToSvgContext(buffer, options, recursionDepth = 0) {
|
|
|
38758
38886
|
await processDeferredImagesSvg(target, result.deferredImages, opts, recursionDepth);
|
|
38759
38887
|
return target;
|
|
38760
38888
|
}
|
|
38761
|
-
async function convertMetafileToSvg(buffer,
|
|
38762
|
-
const tree = await convertMetafileToSvgTree(buffer,
|
|
38889
|
+
async function convertMetafileToSvg(buffer, options2) {
|
|
38890
|
+
const tree = await convertMetafileToSvgTree(buffer, options2);
|
|
38763
38891
|
return tree ? svgTreeToString(tree) : null;
|
|
38764
38892
|
}
|
|
38765
|
-
async function convertMetafileToSvgDataUrl(buffer,
|
|
38766
|
-
const markup = await convertMetafileToSvg(buffer,
|
|
38893
|
+
async function convertMetafileToSvgDataUrl(buffer, options2) {
|
|
38894
|
+
const markup = await convertMetafileToSvg(buffer, options2);
|
|
38767
38895
|
return markup ? svgMarkupToDataUrl(markup) : null;
|
|
38768
38896
|
}
|
|
38769
38897
|
|