@poe-platform/safe-bash 0.1.762 → 0.1.764
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/image-ast/index.browser.js +454 -208
- package/dist/image-ast/index.js +454 -208
- package/dist/pdf-ast/ast.d.ts +23 -0
- package/dist/pdf-ast/index.js +543 -244
- package/dist/safe-bash/chunks/{chunk-CRQDMBQA.js → chunk-FSH7QRIC.js} +10 -1
- package/dist/safe-bash/command-chunks/{chunk-D4GXXV65.js → chunk-B7YLGJRF.js} +2 -2
- package/dist/safe-bash/command-chunks/{chunk-P3Q2QSCA.js → chunk-G3IIEU2N.js} +457 -208
- package/dist/safe-bash/command-chunks/{chunk-F7MJRXQ2.js → chunk-RDPJGIQF.js} +1 -1
- package/dist/safe-bash/commands/python/index.browser.js +1 -1
- package/dist/safe-bash/commands/python/llm-module.js +3 -1
- package/dist/safe-bash/commands/python/shell-module.js +7 -0
- package/dist/safe-bash/core.browser.js +33 -13
- package/dist/safe-bash/shell/runtime.js +44 -12
- package/dist/safe-bash-checksum-engine/index.d.ts +1 -1
- package/dist/safe-bash-checksum-engine/index.js +5 -1
- package/dist/safe-bash-command-ffmpeg/index.js +7476 -7338
- package/dist/safe-bash-command-gh/index.js +174 -105
- package/dist/safe-bash-command-imagemagick/index.js +2 -2
- package/dist/safe-bash-command-pandoc/command.js +3 -3
- package/dist/safe-bash-command-pandoc/index.js +3 -3
- package/dist/safe-bash-command-pdfimages/index.js +454 -208
- package/dist/safe-bash-command-pdfinfo/index.js +541 -244
- package/dist/safe-bash-command-pdftk/index.js +454 -208
- package/dist/safe-bash-command-pdftoppm/index.js +541 -244
- package/dist/safe-bash-command-pdftotext/index.js +454 -208
- package/dist/safe-bash-command-qpdf/index.js +454 -208
- package/dist/safe-bash-command-sips/index.js +2 -2
- package/dist/safe-bash-command-soffice/index.js +1 -1
- package/dist/safe-bash-command-ssconvert/index.js +514 -208
- package/dist/safe-bash-command-wkhtmltopdf/index.js +455 -208
- package/dist/safe-playwright-cloudflare/browser-snapshot-labels.d.ts +14 -0
- package/dist/safe-playwright-cloudflare/browser-snapshot-labels.js +62 -0
- package/dist/safe-playwright-cloudflare/browser-snapshot-scheduler.js +8 -1
- package/package.json +2 -2
- package/third-party/pdf-ast/THIRD_PARTY_NOTICES.md +27 -0
|
@@ -35913,14 +35913,18 @@ function evaluateContentStreamToDisplayList(params) {
|
|
|
35913
35913
|
const paths = [];
|
|
35914
35914
|
const images = [];
|
|
35915
35915
|
const operations = [];
|
|
35916
|
+
let capturedOperations;
|
|
35917
|
+
let insideSoftMask = false;
|
|
35916
35918
|
const emit = (operation) => {
|
|
35917
|
-
const { clipPaths, clipImages } = curState();
|
|
35918
|
-
if (clipPaths || clipImages) operation = { ...operation, value: {
|
|
35919
|
+
const { clipPaths, clipImages, softMask } = curState();
|
|
35920
|
+
if (clipPaths || clipImages || softMask) operation = { ...operation, value: {
|
|
35919
35921
|
...operation.value,
|
|
35920
35922
|
...clipPaths ? { clipPaths } : {},
|
|
35921
|
-
...clipImages ? { clipImages } : {}
|
|
35923
|
+
...clipImages ? { clipImages } : {},
|
|
35924
|
+
...softMask ? { softMask } : {}
|
|
35922
35925
|
} };
|
|
35923
|
-
operations.push(operation);
|
|
35926
|
+
(capturedOperations ?? operations).push(operation);
|
|
35927
|
+
if (insideSoftMask) return;
|
|
35924
35928
|
switch (operation.kind) {
|
|
35925
35929
|
case "path":
|
|
35926
35930
|
paths.push(operation.value);
|
|
@@ -36026,7 +36030,7 @@ function evaluateContentStreamToDisplayList(params) {
|
|
|
36026
36030
|
);
|
|
36027
36031
|
return { r: kClamp(r), g: kClamp(g), b: kClamp(b) };
|
|
36028
36032
|
};
|
|
36029
|
-
const applyStateOperator = (st, operator, ops, activeResources) => {
|
|
36033
|
+
const applyStateOperator = (st, operator, ops, activeResources, activeFonts, depth) => {
|
|
36030
36034
|
const num = (i, fb = 0) => ops[i]?.kind === "number" ? ops[i].value : fb;
|
|
36031
36035
|
if (operator === "cm") {
|
|
36032
36036
|
const m = [num(0, 1), num(1, 0), num(2, 0), num(3, 1), num(4, 0), num(5, 0)];
|
|
@@ -36109,6 +36113,46 @@ function evaluateContentStreamToDisplayList(params) {
|
|
|
36109
36113
|
const extDict = params.cosDoc.resolveDict(dictGet(activeResources, "ExtGState"));
|
|
36110
36114
|
const gsDict = extDict ? params.cosDoc.resolveDict(dictGet(extDict, ops[0].decoded)) : void 0;
|
|
36111
36115
|
if (gsDict) {
|
|
36116
|
+
const mask = params.cosDoc.resolve(dictGet(gsDict, "SMask"));
|
|
36117
|
+
if (mask?.kind === "name" && mask.decoded === "None") {
|
|
36118
|
+
st.softMask = void 0;
|
|
36119
|
+
} else if (mask?.kind === "dict") {
|
|
36120
|
+
const subtype = params.cosDoc.resolve(dictGet(mask, "S"));
|
|
36121
|
+
const form = params.cosDoc.resolve(dictGet(mask, "G"));
|
|
36122
|
+
if (form?.kind === "stream" && subtype?.kind === "name" && (subtype.decoded === "Alpha" || subtype.decoded === "Luminosity")) {
|
|
36123
|
+
if (depth >= 8) throw new PdfError("E_LIMIT", "Soft-mask nesting exceeds the form depth limit");
|
|
36124
|
+
const parentOperations = capturedOperations;
|
|
36125
|
+
const parentInsideSoftMask = insideSoftMask;
|
|
36126
|
+
const savedTextState = { pendingTextClip, hasTextClip, activeTm, activeTlm };
|
|
36127
|
+
const captured = [];
|
|
36128
|
+
capturedOperations = captured;
|
|
36129
|
+
insideSoftMask = true;
|
|
36130
|
+
const maskState = { ...st, softMask: void 0, fillAlpha: 1, strokeAlpha: 1, blendMode: "Normal" };
|
|
36131
|
+
delete maskState.clipPaths;
|
|
36132
|
+
delete maskState.clipImages;
|
|
36133
|
+
delete maskState.clipRect;
|
|
36134
|
+
stateStack.push(maskState);
|
|
36135
|
+
try {
|
|
36136
|
+
paintForm(form, activeResources, activeFonts, depth, void 0, void 0, true);
|
|
36137
|
+
} finally {
|
|
36138
|
+
stateStack.pop();
|
|
36139
|
+
capturedOperations = parentOperations;
|
|
36140
|
+
insideSoftMask = parentInsideSoftMask;
|
|
36141
|
+
({ pendingTextClip, hasTextClip, activeTm, activeTlm } = savedTextState);
|
|
36142
|
+
}
|
|
36143
|
+
const group = params.cosDoc.resolveDict(dictGet(form.dict, "Group"));
|
|
36144
|
+
const colorSpace = group ? dictGet(group, "CS") : void 0;
|
|
36145
|
+
const bc = params.cosDoc.resolveArray(dictGet(mask, "BC"));
|
|
36146
|
+
const components = bc?.items.map((item) => {
|
|
36147
|
+
const value = params.cosDoc.resolve(item);
|
|
36148
|
+
return value?.kind === "number" ? value.value : 0;
|
|
36149
|
+
});
|
|
36150
|
+
const [r, g, b] = components ? convertColorSpaceComponentsToRgb(params.cosDoc, colorSpace, "DeviceRGB", components, activeResources) : [0, 0, 0];
|
|
36151
|
+
const transfer = params.cosDoc.resolve(dictGet(mask, "TR"));
|
|
36152
|
+
const transferMap = transfer?.kind === "dict" || transfer?.kind === "stream" ? Uint8Array.from({ length: 256 }, (_, i) => Math.floor(kClamp(Math.fround(evalShadingFunctionToComponents(params.cosDoc, transfer, Math.fround(i / 255))[0] ?? 0)) * 255)) : void 0;
|
|
36153
|
+
st.softMask = { subtype: subtype.decoded, operations: captured, backdrop: { r, g, b }, transferMap };
|
|
36154
|
+
}
|
|
36155
|
+
}
|
|
36112
36156
|
const bmNode = params.cosDoc.resolve(dictGet(gsDict, "BM"));
|
|
36113
36157
|
if (bmNode?.kind === "name") {
|
|
36114
36158
|
st.blendMode = bmNode.decoded === "Compatible" ? "Normal" : bmNode.decoded;
|
|
@@ -36195,6 +36239,84 @@ function evaluateContentStreamToDisplayList(params) {
|
|
|
36195
36239
|
] }], void 0, void 0, resources, activeFonts, depth);
|
|
36196
36240
|
stateStack.pop();
|
|
36197
36241
|
};
|
|
36242
|
+
const paintForm = (form, activeResources, activeFonts, depth, mcid, actualText, maskGroup = false) => {
|
|
36243
|
+
const st = curState();
|
|
36244
|
+
const group = params.cosDoc.resolveDict(dictGet(form.dict, "Group"));
|
|
36245
|
+
const groupType = group ? params.cosDoc.resolve(dictGet(group, "S")) : void 0;
|
|
36246
|
+
const isolated = group ? params.cosDoc.resolve(dictGet(group, "I")) : void 0;
|
|
36247
|
+
const isolate = !maskGroup && groupType?.kind === "name" && groupType.decoded === "Transparency" && isolated?.kind === "boolean" && isolated.value;
|
|
36248
|
+
const formStreamBytes = params.cosDoc.decodeStream(form);
|
|
36249
|
+
const formNodes = parseContentStream(formStreamBytes);
|
|
36250
|
+
const formResDict = params.cosDoc.resolveDict(dictGet(form.dict, "Resources")) ?? activeResources;
|
|
36251
|
+
const formFonts = new Map(activeFonts);
|
|
36252
|
+
for (const [k, v] of resolvePageFonts(params.cosDoc, formResDict).entries()) {
|
|
36253
|
+
formFonts.set(k, v);
|
|
36254
|
+
}
|
|
36255
|
+
let nextCtm = [...st.ctm];
|
|
36256
|
+
const matArr = params.cosDoc.resolveArray(dictGet(form.dict, "Matrix"));
|
|
36257
|
+
if (matArr && matArr.items.length >= 6) {
|
|
36258
|
+
const mn = (idx, fb = 0) => {
|
|
36259
|
+
const resolved = params.cosDoc.resolve(matArr.items[idx]);
|
|
36260
|
+
return resolved?.kind === "number" ? resolved.value : fb;
|
|
36261
|
+
};
|
|
36262
|
+
const formMat = [mn(0, 1), mn(1, 0), mn(2, 0), mn(3, 1), mn(4, 0), mn(5, 0)];
|
|
36263
|
+
nextCtm = multiplyMatrices(formMat, nextCtm);
|
|
36264
|
+
}
|
|
36265
|
+
let nextClip = !isolate && st.clipRect ? [...st.clipRect] : void 0;
|
|
36266
|
+
let nextClipPaths = isolate ? void 0 : st.clipPaths;
|
|
36267
|
+
const bboxArr = params.cosDoc.resolveArray(dictGet(form.dict, "BBox"));
|
|
36268
|
+
if (bboxArr && bboxArr.items.length >= 4) {
|
|
36269
|
+
const bn = (idx, fb = 0) => {
|
|
36270
|
+
const resolved = params.cosDoc.resolve(bboxArr.items[idx]);
|
|
36271
|
+
return resolved?.kind === "number" ? resolved.value : fb;
|
|
36272
|
+
};
|
|
36273
|
+
const bx0 = bn(0, 0), by0 = bn(1, 0), bx1 = bn(2, 0), by1 = bn(3, 0);
|
|
36274
|
+
const pts = [
|
|
36275
|
+
transformPoint(nextCtm, bx0, by0),
|
|
36276
|
+
transformPoint(nextCtm, bx1, by0),
|
|
36277
|
+
transformPoint(nextCtm, bx1, by1),
|
|
36278
|
+
transformPoint(nextCtm, bx0, by1)
|
|
36279
|
+
];
|
|
36280
|
+
nextClipPaths = [...nextClipPaths ?? [], [
|
|
36281
|
+
...pts.map(([x, y], index) => ({ kind: index === 0 ? "move" : "line", x, y })),
|
|
36282
|
+
{ kind: "close" }
|
|
36283
|
+
]];
|
|
36284
|
+
const fMinX = Math.min(...pts.map((p) => p[0]));
|
|
36285
|
+
const fMinY = Math.min(...pts.map((p) => p[1]));
|
|
36286
|
+
const fMaxX = Math.max(...pts.map((p) => p[0]));
|
|
36287
|
+
const fMaxY = Math.max(...pts.map((p) => p[1]));
|
|
36288
|
+
if (fMaxX > fMinX && fMaxY > fMinY) {
|
|
36289
|
+
nextClip = nextClip ? [
|
|
36290
|
+
Math.max(nextClip[0], fMinX),
|
|
36291
|
+
Math.max(nextClip[1], fMinY),
|
|
36292
|
+
Math.min(nextClip[2], fMaxX),
|
|
36293
|
+
Math.min(nextClip[3], fMaxY)
|
|
36294
|
+
] : [fMinX, fMinY, fMaxX, fMaxY];
|
|
36295
|
+
}
|
|
36296
|
+
}
|
|
36297
|
+
const parentOperations = capturedOperations;
|
|
36298
|
+
const children = [];
|
|
36299
|
+
const nextState = { ...st, ctm: nextCtm };
|
|
36300
|
+
if (isolate) {
|
|
36301
|
+
capturedOperations = children;
|
|
36302
|
+
nextState.fillAlpha = nextState.strokeAlpha = 1;
|
|
36303
|
+
nextState.blendMode = "Normal";
|
|
36304
|
+
nextState.softMask = void 0;
|
|
36305
|
+
delete nextState.clipImages;
|
|
36306
|
+
delete nextState.clipPaths;
|
|
36307
|
+
delete nextState.clipRect;
|
|
36308
|
+
}
|
|
36309
|
+
if (nextClip) nextState.clipRect = nextClip;
|
|
36310
|
+
if (nextClipPaths) nextState.clipPaths = nextClipPaths;
|
|
36311
|
+
stateStack.push(nextState);
|
|
36312
|
+
try {
|
|
36313
|
+
walkNodes(formNodes, mcid, actualText, formResDict, formFonts, depth + 1);
|
|
36314
|
+
} finally {
|
|
36315
|
+
stateStack.pop();
|
|
36316
|
+
capturedOperations = parentOperations;
|
|
36317
|
+
}
|
|
36318
|
+
if (isolate) emit({ kind: "group", value: { operations: children, alpha: st.fillAlpha, blendMode: st.blendMode, clipRect: st.clipRect } });
|
|
36319
|
+
};
|
|
36198
36320
|
const walkNodes = (nodes, mcid, actualText, activeResources = params.resourcesDict, activeFonts = fonts, depth = 0) => {
|
|
36199
36321
|
for (const node of nodes) {
|
|
36200
36322
|
switch (node.kind) {
|
|
@@ -36239,7 +36361,7 @@ function evaluateContentStreamToDisplayList(params) {
|
|
|
36239
36361
|
break;
|
|
36240
36362
|
}
|
|
36241
36363
|
case "state-op": {
|
|
36242
|
-
applyStateOperator(curState(), node.operator, node.operands, activeResources);
|
|
36364
|
+
applyStateOperator(curState(), node.operator, node.operands, activeResources, activeFonts, depth);
|
|
36243
36365
|
break;
|
|
36244
36366
|
}
|
|
36245
36367
|
case "path-op": {
|
|
@@ -36525,53 +36647,7 @@ function evaluateContentStreamToDisplayList(params) {
|
|
|
36525
36647
|
...st.clipRect ? { clipRect: [...st.clipRect] } : {}
|
|
36526
36648
|
}, patternMask, activeResources, activeFonts, depth);
|
|
36527
36649
|
} else if (sub === "Form" && depth < 8) {
|
|
36528
|
-
|
|
36529
|
-
const formNodes = parseContentStream(formStreamBytes);
|
|
36530
|
-
const formResDict = params.cosDoc.resolveDict(dictGet(xobjNode.dict, "Resources")) ?? activeResources;
|
|
36531
|
-
const formFonts = new Map(activeFonts);
|
|
36532
|
-
for (const [k, v] of resolvePageFonts(params.cosDoc, formResDict).entries()) {
|
|
36533
|
-
formFonts.set(k, v);
|
|
36534
|
-
}
|
|
36535
|
-
let nextCtm = [...st.ctm];
|
|
36536
|
-
const matArr = params.cosDoc.resolveArray(dictGet(xobjNode.dict, "Matrix"));
|
|
36537
|
-
if (matArr && matArr.items.length >= 6) {
|
|
36538
|
-
const mn = (idx, fb = 0) => {
|
|
36539
|
-
const resolved = params.cosDoc.resolve(matArr.items[idx]);
|
|
36540
|
-
return resolved?.kind === "number" ? resolved.value : fb;
|
|
36541
|
-
};
|
|
36542
|
-
const formMat = [mn(0, 1), mn(1, 0), mn(2, 0), mn(3, 1), mn(4, 0), mn(5, 0)];
|
|
36543
|
-
nextCtm = multiplyMatrices(formMat, nextCtm);
|
|
36544
|
-
}
|
|
36545
|
-
let nextClip = st.clipRect ? [...st.clipRect] : void 0;
|
|
36546
|
-
const bboxArr = params.cosDoc.resolveArray(dictGet(xobjNode.dict, "BBox"));
|
|
36547
|
-
if (bboxArr && bboxArr.items.length >= 4) {
|
|
36548
|
-
const bn = (idx, fb = 0) => {
|
|
36549
|
-
const resolved = params.cosDoc.resolve(bboxArr.items[idx]);
|
|
36550
|
-
return resolved?.kind === "number" ? resolved.value : fb;
|
|
36551
|
-
};
|
|
36552
|
-
const bx0 = bn(0, 0), by0 = bn(1, 0), bx1 = bn(2, 0), by1 = bn(3, 0);
|
|
36553
|
-
const pts = [
|
|
36554
|
-
transformPoint(nextCtm, bx0, by0),
|
|
36555
|
-
transformPoint(nextCtm, bx1, by0),
|
|
36556
|
-
transformPoint(nextCtm, bx0, by1),
|
|
36557
|
-
transformPoint(nextCtm, bx1, by1)
|
|
36558
|
-
];
|
|
36559
|
-
const fMinX = Math.min(...pts.map((p) => p[0]));
|
|
36560
|
-
const fMinY = Math.min(...pts.map((p) => p[1]));
|
|
36561
|
-
const fMaxX = Math.max(...pts.map((p) => p[0]));
|
|
36562
|
-
const fMaxY = Math.max(...pts.map((p) => p[1]));
|
|
36563
|
-
if (fMaxX > fMinX && fMaxY > fMinY) {
|
|
36564
|
-
nextClip = nextClip ? [
|
|
36565
|
-
Math.max(nextClip[0], fMinX),
|
|
36566
|
-
Math.max(nextClip[1], fMinY),
|
|
36567
|
-
Math.min(nextClip[2], fMaxX),
|
|
36568
|
-
Math.min(nextClip[3], fMaxY)
|
|
36569
|
-
] : [fMinX, fMinY, fMaxX, fMaxY];
|
|
36570
|
-
}
|
|
36571
|
-
}
|
|
36572
|
-
stateStack.push({ ...st, ctm: nextCtm, ...nextClip ? { clipRect: nextClip } : {} });
|
|
36573
|
-
walkNodes(formNodes, mcid, actualText, formResDict, formFonts, depth + 1);
|
|
36574
|
-
if (stateStack.length > 1) stateStack.pop();
|
|
36650
|
+
paintForm(xobjNode, activeResources, activeFonts, depth, mcid, actualText);
|
|
36575
36651
|
}
|
|
36576
36652
|
}
|
|
36577
36653
|
}
|
|
@@ -36790,7 +36866,7 @@ function evaluateContentStreamToDisplayList(params) {
|
|
|
36790
36866
|
st.textRenderMode = cmd.mode;
|
|
36791
36867
|
break;
|
|
36792
36868
|
case "state-op":
|
|
36793
|
-
applyStateOperator(st, cmd.operator, cmd.operands, activeResources);
|
|
36869
|
+
applyStateOperator(st, cmd.operator, cmd.operands, activeResources, activeFonts, depth);
|
|
36794
36870
|
break;
|
|
36795
36871
|
case "show-text":
|
|
36796
36872
|
emitTokenBytes(cmd.token.bytes);
|
|
@@ -39094,6 +39170,184 @@ function downscaleImage(image, widthScale, heightScale) {
|
|
|
39094
39170
|
}
|
|
39095
39171
|
return image;
|
|
39096
39172
|
}
|
|
39173
|
+
var MAX_STROKE_VERTICES = 1e6;
|
|
39174
|
+
function dashSubpath(path, pattern, phase) {
|
|
39175
|
+
const cycle = pattern.reduce((sum, value) => sum + value, 0);
|
|
39176
|
+
if (!(cycle > 0)) return [path];
|
|
39177
|
+
let offset = (phase % cycle + cycle) % cycle, index = 0;
|
|
39178
|
+
while (offset > 0) {
|
|
39179
|
+
if (offset < pattern[index]) break;
|
|
39180
|
+
offset -= pattern[index];
|
|
39181
|
+
index = (index + 1) % pattern.length;
|
|
39182
|
+
}
|
|
39183
|
+
let remaining = pattern[index] - offset;
|
|
39184
|
+
const points = path.closed ? [...path.points, path.points[0]] : path.points;
|
|
39185
|
+
const result = [];
|
|
39186
|
+
let current = [];
|
|
39187
|
+
let steps = 0;
|
|
39188
|
+
const flush = () => {
|
|
39189
|
+
if (current.length) result.push({ points: current, closed: false });
|
|
39190
|
+
current = [];
|
|
39191
|
+
};
|
|
39192
|
+
const advance = (point) => {
|
|
39193
|
+
while (remaining <= 0) {
|
|
39194
|
+
if (++steps > MAX_STROKE_VERTICES) throw new PdfError("E_LIMIT", "Stroke dash expansion exceeds the vertex limit");
|
|
39195
|
+
if (index % 2 === 0) {
|
|
39196
|
+
if (pattern[index] === 0) result.push({ points: [point, point], closed: false });
|
|
39197
|
+
flush();
|
|
39198
|
+
}
|
|
39199
|
+
index = (index + 1) % pattern.length;
|
|
39200
|
+
remaining = pattern[index];
|
|
39201
|
+
}
|
|
39202
|
+
};
|
|
39203
|
+
for (let i = 1; i < points.length; i++) {
|
|
39204
|
+
const start = points[i - 1], end = points[i];
|
|
39205
|
+
const dx = end[0] - start[0], dy = end[1] - start[1];
|
|
39206
|
+
const length = Math.hypot(dx, dy);
|
|
39207
|
+
if (!Number.isFinite(length) || length / cycle * pattern.length > MAX_STROKE_VERTICES) {
|
|
39208
|
+
throw new PdfError("E_LIMIT", "Stroke dash expansion exceeds the vertex limit");
|
|
39209
|
+
}
|
|
39210
|
+
let distance = 0;
|
|
39211
|
+
while (distance < length) {
|
|
39212
|
+
const point = [start[0] + dx * distance / length, start[1] + dy * distance / length];
|
|
39213
|
+
advance(point);
|
|
39214
|
+
const step = Math.min(remaining, length - distance);
|
|
39215
|
+
if (distance + step === distance || ++steps > MAX_STROKE_VERTICES) throw new PdfError("E_LIMIT", "Stroke dash expansion exceeds the vertex limit");
|
|
39216
|
+
distance += step;
|
|
39217
|
+
remaining -= step;
|
|
39218
|
+
if (index % 2 === 0) {
|
|
39219
|
+
if (!current.length) current.push(point);
|
|
39220
|
+
current.push([start[0] + dx * distance / length, start[1] + dy * distance / length]);
|
|
39221
|
+
}
|
|
39222
|
+
}
|
|
39223
|
+
}
|
|
39224
|
+
flush();
|
|
39225
|
+
if (path.closed && result.length) {
|
|
39226
|
+
const first = result[0], last = result[result.length - 1];
|
|
39227
|
+
const start = path.points[0];
|
|
39228
|
+
const firstPoint = first.points[0], lastPoint = last.points[last.points.length - 1];
|
|
39229
|
+
if (firstPoint[0] === start[0] && firstPoint[1] === start[1] && lastPoint[0] === start[0] && lastPoint[1] === start[1]) {
|
|
39230
|
+
if (first === last) result[0] = { points: first.points, closed: true };
|
|
39231
|
+
else {
|
|
39232
|
+
result[0] = { points: [...last.points, ...first.points.slice(1)], closed: false };
|
|
39233
|
+
result.pop();
|
|
39234
|
+
}
|
|
39235
|
+
}
|
|
39236
|
+
}
|
|
39237
|
+
return result;
|
|
39238
|
+
}
|
|
39239
|
+
function strokeOutlines(paths, width, cap, join, miterLimit, dashArray = [], dashPhase = 0) {
|
|
39240
|
+
const half = width / 2;
|
|
39241
|
+
const contours = [];
|
|
39242
|
+
const pattern = dashArray.length % 2 ? [...dashArray, ...dashArray] : dashArray;
|
|
39243
|
+
let count = 0;
|
|
39244
|
+
let contour = [];
|
|
39245
|
+
const add = (x, y) => {
|
|
39246
|
+
if (++count > MAX_STROKE_VERTICES) throw new PdfError("E_LIMIT", "Stroke outline exceeds the vertex limit");
|
|
39247
|
+
contour.push([x, y]);
|
|
39248
|
+
};
|
|
39249
|
+
const arc = (point, dx1, dy1, dx2, dy2) => {
|
|
39250
|
+
let a1 = Math.atan2(dy1, dx1), a2 = Math.atan2(dy2, dx2);
|
|
39251
|
+
const ccw = a1 - a2 > 0 && a1 - a2 < Math.PI;
|
|
39252
|
+
const step = Math.acos(half / (half + 0.125)) * 2;
|
|
39253
|
+
add(point[0] + dx1, point[1] + dy1);
|
|
39254
|
+
if (step > 0) {
|
|
39255
|
+
if (!ccw) {
|
|
39256
|
+
if (a1 > a2) a2 += 2 * Math.PI;
|
|
39257
|
+
a2 -= step / 4;
|
|
39258
|
+
if ((a2 - a1) / step > MAX_STROKE_VERTICES - count) throw new PdfError("E_LIMIT", "Stroke arc exceeds the vertex limit");
|
|
39259
|
+
for (a1 += step; a1 < a2; a1 += step) add(point[0] + half * Math.cos(a1), point[1] + half * Math.sin(a1));
|
|
39260
|
+
} else {
|
|
39261
|
+
if (a1 < a2) a2 -= 2 * Math.PI;
|
|
39262
|
+
a2 += step / 4;
|
|
39263
|
+
if ((a1 - a2) / step > MAX_STROKE_VERTICES - count) throw new PdfError("E_LIMIT", "Stroke arc exceeds the vertex limit");
|
|
39264
|
+
for (a1 -= step; a1 > a2; a1 -= step) add(point[0] + half * Math.cos(a1), point[1] + half * Math.sin(a1));
|
|
39265
|
+
}
|
|
39266
|
+
}
|
|
39267
|
+
add(point[0] + dx2, point[1] + dy2);
|
|
39268
|
+
};
|
|
39269
|
+
const addCap = (point, next) => {
|
|
39270
|
+
const length = Math.hypot(next[0] - point[0], next[1] - point[1]);
|
|
39271
|
+
const dx = half * (next[1] - point[1]) / length;
|
|
39272
|
+
const dy = half * (next[0] - point[0]) / length;
|
|
39273
|
+
if (cap !== 1) {
|
|
39274
|
+
const sx = cap === 2 ? dy : 0, sy = cap === 2 ? dx : 0;
|
|
39275
|
+
add(point[0] - dx - sx, point[1] + dy - sy);
|
|
39276
|
+
add(point[0] + dx - sx, point[1] - dy - sy);
|
|
39277
|
+
} else {
|
|
39278
|
+
const angle = Math.atan2(dy, -dx);
|
|
39279
|
+
const step = Math.max(1e-3, Math.acos(half / (half + 0.125)) * 2);
|
|
39280
|
+
add(point[0] - dx, point[1] + dy);
|
|
39281
|
+
for (let a = angle + step; a < angle + Math.PI - step / 4; a += step) add(point[0] + half * Math.cos(a), point[1] + half * Math.sin(a));
|
|
39282
|
+
add(point[0] + dx, point[1] - dy);
|
|
39283
|
+
}
|
|
39284
|
+
};
|
|
39285
|
+
const addJoin = (prev, point, next) => {
|
|
39286
|
+
const len1 = Math.hypot(point[0] - prev[0], point[1] - prev[1]);
|
|
39287
|
+
const len2 = Math.hypot(next[0] - point[0], next[1] - point[1]);
|
|
39288
|
+
const dx1 = half * (point[1] - prev[1]) / len1, dy1 = half * (point[0] - prev[0]) / len1;
|
|
39289
|
+
const dx2 = half * (next[1] - point[1]) / len2, dy2 = half * (next[0] - point[0]) / len2;
|
|
39290
|
+
const inner = (next[0] - point[0]) * (point[1] - prev[1]) - (next[1] - point[1]) * (point[0] - prev[0]) > 0;
|
|
39291
|
+
if (!inner && join === 1) {
|
|
39292
|
+
arc(point, dx1, -dy1, dx2, -dy2);
|
|
39293
|
+
return;
|
|
39294
|
+
}
|
|
39295
|
+
if (inner || join === 0) {
|
|
39296
|
+
const ax = prev[0] + dx1, ay = prev[1] - dy1;
|
|
39297
|
+
const bx = point[0] + dx1, by = point[1] - dy1;
|
|
39298
|
+
const cx = point[0] + dx2, cy = point[1] - dy2;
|
|
39299
|
+
const dx = next[0] + dx2, dy = next[1] - dy2;
|
|
39300
|
+
const den = (bx - ax) * (dy - cy) - (by - ay) * (dx - cx);
|
|
39301
|
+
if (Math.abs(den) >= 1e-30) {
|
|
39302
|
+
const t = ((ay - cy) * (dx - cx) - (ax - cx) * (dy - cy)) / den;
|
|
39303
|
+
const x = ax + (bx - ax) * t, y = ay + (by - ay) * t;
|
|
39304
|
+
if (Math.hypot(x - point[0], y - point[1]) <= half * (inner ? 1.01 : miterLimit)) {
|
|
39305
|
+
add(x, y);
|
|
39306
|
+
return;
|
|
39307
|
+
}
|
|
39308
|
+
} else if ((bx - prev[0]) * dy1 - (prev[1] - by) * dx1 < 0 !== (bx - next[0]) * dy1 - (next[1] - by) * dx1 < 0) {
|
|
39309
|
+
add(bx, by);
|
|
39310
|
+
return;
|
|
39311
|
+
}
|
|
39312
|
+
}
|
|
39313
|
+
add(point[0] + dx1, point[1] - dy1);
|
|
39314
|
+
add(point[0] + dx2, point[1] - dy2);
|
|
39315
|
+
};
|
|
39316
|
+
for (const path of paths) {
|
|
39317
|
+
for (const subpath of pattern.length ? dashSubpath(path, pattern, dashPhase) : [path]) {
|
|
39318
|
+
const points = [];
|
|
39319
|
+
for (const point of subpath.points) {
|
|
39320
|
+
const prev = points[points.length - 1];
|
|
39321
|
+
if (!prev || Math.hypot(prev[0] - point[0], prev[1] - point[1]) > 1e-14) points.push(point);
|
|
39322
|
+
}
|
|
39323
|
+
let closed = subpath.closed;
|
|
39324
|
+
if (closed && points.length > 1 && Math.hypot(points[0][0] - points[points.length - 1][0], points[0][1] - points[points.length - 1][1]) <= 1e-14) points.pop();
|
|
39325
|
+
if (points.length < 3) closed = false;
|
|
39326
|
+
if (points.length === 1 && subpath.points.length > 1 && cap === 1) {
|
|
39327
|
+
contour = [];
|
|
39328
|
+
const [x, y] = points[0];
|
|
39329
|
+
addCap([x, y], [x + 1, y]);
|
|
39330
|
+
addCap([x, y], [x - 1, y]);
|
|
39331
|
+
contours.push(contour);
|
|
39332
|
+
} else if (points.length >= 2) {
|
|
39333
|
+
contour = [];
|
|
39334
|
+
if (!closed) addCap(points[0], points[1]);
|
|
39335
|
+
for (let i = closed ? 0 : 1; i < points.length - (closed ? 0 : 1); i++) {
|
|
39336
|
+
addJoin(points[(i + points.length - 1) % points.length], points[i], points[(i + 1) % points.length]);
|
|
39337
|
+
}
|
|
39338
|
+
if (closed) {
|
|
39339
|
+
contours.push(contour);
|
|
39340
|
+
contour = [];
|
|
39341
|
+
} else addCap(points[points.length - 1], points[points.length - 2]);
|
|
39342
|
+
for (let i = points.length - (closed ? 1 : 2); i >= (closed ? 0 : 1); i--) {
|
|
39343
|
+
addJoin(points[(i + 1) % points.length], points[i], points[(i + points.length - 1) % points.length]);
|
|
39344
|
+
}
|
|
39345
|
+
contours.push(contour);
|
|
39346
|
+
}
|
|
39347
|
+
}
|
|
39348
|
+
}
|
|
39349
|
+
return contours;
|
|
39350
|
+
}
|
|
39097
39351
|
function encodePng(bitmap) {
|
|
39098
39352
|
return encodeRgbaToPng(bitmap.width, bitmap.height, bitmap.data);
|
|
39099
39353
|
}
|
|
@@ -40015,111 +40269,60 @@ function blendPixel(rgba, width, height, px, py, color, alpha, blendMode, clipMa
|
|
|
40015
40269
|
rgba[idx + 2] = Math.round((effB * a + cbB * dstA * (1 - a)) / outA * 255);
|
|
40016
40270
|
rgba[idx + 3] = Math.round(outA * 255);
|
|
40017
40271
|
}
|
|
40018
|
-
function
|
|
40019
|
-
const
|
|
40020
|
-
|
|
40021
|
-
|
|
40022
|
-
const lenSq = dx * dx + dy * dy;
|
|
40023
|
-
const segLen = Math.sqrt(lenSq);
|
|
40024
|
-
const pad = lineCap === 2 ? halfW + 2 : halfW + 1;
|
|
40025
|
-
const minX = Math.max(0, Math.floor(Math.min(x0, x1) - pad));
|
|
40026
|
-
const maxX = Math.min(width - 1, Math.ceil(Math.max(x0, x1) + pad));
|
|
40027
|
-
const minY = Math.max(0, Math.floor(Math.min(y0, y1) - pad));
|
|
40028
|
-
const maxY = Math.min(height - 1, Math.ceil(Math.max(y0, y1) + pad));
|
|
40029
|
-
for (let py = minY; py <= maxY; py++) {
|
|
40030
|
-
for (let px = minX; px <= maxX; px++) {
|
|
40031
|
-
const cx = px + 0.5;
|
|
40032
|
-
const cy = py + 0.5;
|
|
40033
|
-
if (segLen > 1e-6 && (lineCap === 0 || lineCap === 2)) {
|
|
40034
|
-
const ux = dx / segLen;
|
|
40035
|
-
const uy = dy / segLen;
|
|
40036
|
-
const along = (cx - x0) * ux + (cy - y0) * uy;
|
|
40037
|
-
const perp = Math.abs(-(cx - x0) * uy + (cy - y0) * ux);
|
|
40038
|
-
const minAlong = lineCap === 2 ? -halfW : 0;
|
|
40039
|
-
const maxAlong = lineCap === 2 ? segLen + halfW : segLen;
|
|
40040
|
-
const overAlong = along < minAlong ? minAlong - along : along > maxAlong ? along - maxAlong : 0;
|
|
40041
|
-
const dist2 = overAlong > 0 ? Math.max(perp, halfW + overAlong) : perp;
|
|
40042
|
-
if (dist2 <= halfW + 0.75) {
|
|
40043
|
-
const cov = antialias ? Math.max(0, Math.min(1, halfW + 0.5 - dist2)) : dist2 <= halfW + 0.25 ? 1 : 0;
|
|
40044
|
-
blendPixel(rgba, width, height, px, py, color, cov * alpha, blendMode, clipMask);
|
|
40045
|
-
}
|
|
40046
|
-
continue;
|
|
40047
|
-
}
|
|
40048
|
-
let t = lenSq > 1e-6 ? ((cx - x0) * dx + (cy - y0) * dy) / lenSq : 0;
|
|
40049
|
-
t = Math.max(0, Math.min(1, t));
|
|
40050
|
-
const projX = x0 + t * dx;
|
|
40051
|
-
const projY = y0 + t * dy;
|
|
40052
|
-
const dist = Math.hypot(cx - projX, cy - projY);
|
|
40053
|
-
if (dist <= halfW + 0.75) {
|
|
40054
|
-
const cov = antialias ? Math.max(0, Math.min(1, halfW + 0.5 - dist)) : dist <= halfW + 0.25 ? 1 : 0;
|
|
40055
|
-
blendPixel(rgba, width, height, px, py, color, cov * alpha, blendMode, clipMask);
|
|
40056
|
-
}
|
|
40057
|
-
}
|
|
40058
|
-
}
|
|
40059
|
-
}
|
|
40060
|
-
function segmentsToScreenEdges(segments, pageHeight, scale, closeSubpaths = false) {
|
|
40061
|
-
const edges = [];
|
|
40062
|
-
let curX = 0;
|
|
40063
|
-
let curY = 0;
|
|
40064
|
-
let startX = 0;
|
|
40065
|
-
let startY = 0;
|
|
40066
|
-
let hasOpenSubpath = false;
|
|
40272
|
+
function segmentsToScreenPaths(segments, pageHeight, scale) {
|
|
40273
|
+
const paths = [];
|
|
40274
|
+
let points = [];
|
|
40275
|
+
let current = [0, 0];
|
|
40067
40276
|
const toScreen = (x, y) => [x * scale, (pageHeight - y) * scale];
|
|
40068
|
-
for (const
|
|
40069
|
-
if (
|
|
40070
|
-
if (
|
|
40071
|
-
|
|
40072
|
-
|
|
40073
|
-
|
|
40074
|
-
|
|
40075
|
-
|
|
40076
|
-
|
|
40077
|
-
} else if (
|
|
40078
|
-
|
|
40079
|
-
|
|
40080
|
-
|
|
40081
|
-
|
|
40082
|
-
|
|
40083
|
-
|
|
40084
|
-
|
|
40085
|
-
|
|
40086
|
-
|
|
40087
|
-
|
|
40088
|
-
|
|
40089
|
-
|
|
40090
|
-
|
|
40091
|
-
|
|
40092
|
-
|
|
40093
|
-
|
|
40094
|
-
|
|
40095
|
-
|
|
40096
|
-
|
|
40097
|
-
|
|
40098
|
-
|
|
40099
|
-
|
|
40100
|
-
|
|
40101
|
-
|
|
40102
|
-
|
|
40103
|
-
|
|
40104
|
-
|
|
40105
|
-
|
|
40106
|
-
|
|
40107
|
-
|
|
40108
|
-
|
|
40109
|
-
|
|
40110
|
-
const [
|
|
40111
|
-
|
|
40112
|
-
|
|
40113
|
-
|
|
40114
|
-
|
|
40115
|
-
|
|
40116
|
-
{ x0: rx0, y0: ry1, x1: rx0, y1: ry0 }
|
|
40117
|
-
);
|
|
40118
|
-
hasOpenSubpath = false;
|
|
40277
|
+
for (const segment of segments) {
|
|
40278
|
+
if (segment.kind === "move") {
|
|
40279
|
+
if (points.length) paths.push({ points, closed: false });
|
|
40280
|
+
current = toScreen(segment.x, segment.y);
|
|
40281
|
+
points = [current];
|
|
40282
|
+
} else if (segment.kind === "line") {
|
|
40283
|
+
if (!points.length) points = [current];
|
|
40284
|
+
current = toScreen(segment.x, segment.y);
|
|
40285
|
+
points.push(current);
|
|
40286
|
+
} else if (segment.kind === "cubic") {
|
|
40287
|
+
if (!points.length) points = [current];
|
|
40288
|
+
const a = toScreen(segment.x1, segment.y1), b = toScreen(segment.x2, segment.y2);
|
|
40289
|
+
const end = toScreen(segment.x, segment.y);
|
|
40290
|
+
const curve = flattenCubic(current[0], current[1], a[0], a[1], b[0], b[1], end[0], end[1]);
|
|
40291
|
+
for (let i = 1; i < curve.length; i++) points.push(curve[i]);
|
|
40292
|
+
current = end;
|
|
40293
|
+
} else if (segment.kind === "close") {
|
|
40294
|
+
if (points.length) {
|
|
40295
|
+
paths.push({ points, closed: true });
|
|
40296
|
+
current = points[0];
|
|
40297
|
+
points = [];
|
|
40298
|
+
}
|
|
40299
|
+
} else if (segment.kind === "rect") {
|
|
40300
|
+
if (points.length) paths.push({ points, closed: false });
|
|
40301
|
+
const first = toScreen(segment.x, segment.y);
|
|
40302
|
+
paths.push({ points: [
|
|
40303
|
+
first,
|
|
40304
|
+
toScreen(segment.x + segment.width, segment.y),
|
|
40305
|
+
toScreen(segment.x + segment.width, segment.y + segment.height),
|
|
40306
|
+
toScreen(segment.x, segment.y + segment.height)
|
|
40307
|
+
], closed: true });
|
|
40308
|
+
current = first;
|
|
40309
|
+
points = [];
|
|
40310
|
+
}
|
|
40311
|
+
}
|
|
40312
|
+
if (points.length) paths.push({ points, closed: false });
|
|
40313
|
+
return paths;
|
|
40314
|
+
}
|
|
40315
|
+
function pathsToEdges(paths, closeSubpaths = false) {
|
|
40316
|
+
const edges = [];
|
|
40317
|
+
for (const { points, closed } of paths) {
|
|
40318
|
+
for (let i = 1; i < points.length; i++) {
|
|
40319
|
+
const a = points[i - 1], b = points[i];
|
|
40320
|
+
edges.push({ x0: a[0], y0: a[1], x1: b[0], y1: b[1] });
|
|
40321
|
+
}
|
|
40322
|
+
if ((closed || closeSubpaths) && points.length > 1) {
|
|
40323
|
+
const a = points[points.length - 1], b = points[0];
|
|
40324
|
+
edges.push({ x0: a[0], y0: a[1], x1: b[0], y1: b[1] });
|
|
40119
40325
|
}
|
|
40120
|
-
}
|
|
40121
|
-
if (closeSubpaths && hasOpenSubpath && (curX !== startX || curY !== startY)) {
|
|
40122
|
-
edges.push({ x0: curX, y0: curY, x1: startX, y1: startY });
|
|
40123
40326
|
}
|
|
40124
40327
|
return edges;
|
|
40125
40328
|
}
|
|
@@ -40230,6 +40433,30 @@ function paintOperations(displayList) {
|
|
|
40230
40433
|
...displayList.glyphs.map((value) => ({ kind: "glyph", value }))
|
|
40231
40434
|
];
|
|
40232
40435
|
}
|
|
40436
|
+
function renderSoftMask(mask, displayList, scale) {
|
|
40437
|
+
const bitmap = renderDisplayListToBitmap({
|
|
40438
|
+
...displayList,
|
|
40439
|
+
rotation: 0,
|
|
40440
|
+
glyphs: [],
|
|
40441
|
+
paths: [],
|
|
40442
|
+
images: [],
|
|
40443
|
+
operations: mask.operations
|
|
40444
|
+
}, { scale, transparent: true });
|
|
40445
|
+
const { data } = bitmap;
|
|
40446
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
40447
|
+
let value = data[i + 3];
|
|
40448
|
+
if (mask.subtype === "Luminosity") {
|
|
40449
|
+
const alpha = value / 255;
|
|
40450
|
+
const r = Math.round(data[i] * alpha + mask.backdrop.r * 255 * (1 - alpha));
|
|
40451
|
+
const g = Math.round(data[i + 1] * alpha + mask.backdrop.g * 255 * (1 - alpha));
|
|
40452
|
+
const b = Math.round(data[i + 2] * alpha + mask.backdrop.b * 255 * (1 - alpha));
|
|
40453
|
+
value = Math.round(pdfLum(r, g, b));
|
|
40454
|
+
}
|
|
40455
|
+
data[i] = data[i + 1] = data[i + 2] = 0;
|
|
40456
|
+
data[i + 3] = mask.transferMap?.[value] ?? value;
|
|
40457
|
+
}
|
|
40458
|
+
return bitmap;
|
|
40459
|
+
}
|
|
40233
40460
|
function renderDisplayListToBitmap(displayList, options = {}) {
|
|
40234
40461
|
const baseScale = options.scale ?? (options.dpi ? options.dpi / 72 : 1.5);
|
|
40235
40462
|
const scaleX = options.dpiX !== void 0 ? options.dpiX / 72 : baseScale;
|
|
@@ -40253,10 +40480,28 @@ function renderDisplayListToBitmap(displayList, options = {}) {
|
|
|
40253
40480
|
const aaTxt = options.antialiasText !== false;
|
|
40254
40481
|
let cachedClips;
|
|
40255
40482
|
let cachedClipMask;
|
|
40483
|
+
let cachedSoftMask;
|
|
40484
|
+
let cachedSoftMaskPixels;
|
|
40256
40485
|
const imageClipMasks = /* @__PURE__ */ new Map();
|
|
40257
40486
|
for (const original of paintOperations(displayList)) {
|
|
40258
40487
|
if (original.kind === "glyph" && (original.value.renderMode === 3 || !original.value.outline && !original.value.unicode.trim())) continue;
|
|
40259
|
-
|
|
40488
|
+
let operation = original.kind === "glyph" ? { kind: "path", value: glyphPaint(original.value) } : original;
|
|
40489
|
+
if (operation.kind === "group") {
|
|
40490
|
+
const group = operation.value;
|
|
40491
|
+
const bitmap = renderDisplayListToBitmap({ ...displayList, rotation: 0, operations: group.operations }, { ...options, scale, dpiX: void 0, dpiY: void 0, cropRect: void 0, transparent: true });
|
|
40492
|
+
for (let i = 3; i < bitmap.data.length; i += 4) bitmap.data[i] = Math.round(bitmap.data[i] * group.alpha);
|
|
40493
|
+
operation = { kind: "image", value: {
|
|
40494
|
+
name: "TransparencyGroup",
|
|
40495
|
+
width: bitmap.width,
|
|
40496
|
+
height: bitmap.height,
|
|
40497
|
+
decodedRgba: bitmap.data,
|
|
40498
|
+
matrix: [bitmap.width / scale, 0, 0, bitmap.height / scale, 0, displayList.height - bitmap.height / scale],
|
|
40499
|
+
colorSpace: "DeviceRGB",
|
|
40500
|
+
bitsPerComponent: 8,
|
|
40501
|
+
blendMode: group.blendMode,
|
|
40502
|
+
clipRect: group.clipRect
|
|
40503
|
+
} };
|
|
40504
|
+
}
|
|
40260
40505
|
const clips = original.value.clipPaths;
|
|
40261
40506
|
let clipMask = clips && clips === cachedClips ? cachedClipMask : void 0;
|
|
40262
40507
|
if (clips && !clipMask) {
|
|
@@ -40264,12 +40509,25 @@ function renderDisplayListToBitmap(displayList, options = {}) {
|
|
|
40264
40509
|
for (const clip of clips) {
|
|
40265
40510
|
const { segments, fillRule } = "segments" in clip ? clip : { segments: clip, fillRule: "nonzero" };
|
|
40266
40511
|
const layer = new Uint8Array(width * height * 4);
|
|
40267
|
-
fillEdgesScanline4x4(layer, width, height,
|
|
40512
|
+
fillEdgesScanline4x4(layer, width, height, pathsToEdges(segmentsToScreenPaths(segments, displayList.height, scale), true), { r: 1, g: 1, b: 1 }, 1, fillRule);
|
|
40268
40513
|
for (let i = 3; i < layer.length; i += 4) clipMask[i] = Math.round(clipMask[i] * layer[i] / 255);
|
|
40269
40514
|
}
|
|
40270
40515
|
cachedClips = clips;
|
|
40271
40516
|
cachedClipMask = clipMask;
|
|
40272
40517
|
}
|
|
40518
|
+
const softMask = original.value.softMask;
|
|
40519
|
+
if (softMask) {
|
|
40520
|
+
if (softMask !== cachedSoftMask) {
|
|
40521
|
+
cachedSoftMaskPixels = renderSoftMask(softMask, displayList, scale).data;
|
|
40522
|
+
cachedSoftMask = softMask;
|
|
40523
|
+
}
|
|
40524
|
+
if (clipMask) {
|
|
40525
|
+
clipMask = clipMask.slice();
|
|
40526
|
+
for (let i = 3; i < clipMask.length; i += 4) clipMask[i] = Math.round(clipMask[i] * cachedSoftMaskPixels[i] / 255);
|
|
40527
|
+
} else {
|
|
40528
|
+
clipMask = cachedSoftMaskPixels;
|
|
40529
|
+
}
|
|
40530
|
+
}
|
|
40273
40531
|
const imageClips = original.value.clipImages;
|
|
40274
40532
|
if (imageClips) {
|
|
40275
40533
|
let imageMask = imageClipMasks.get(imageClips);
|
|
@@ -40298,62 +40556,38 @@ function renderDisplayListToBitmap(displayList, options = {}) {
|
|
|
40298
40556
|
if (operation.kind === "path") {
|
|
40299
40557
|
const path = operation.value;
|
|
40300
40558
|
if (path.fillColor) {
|
|
40301
|
-
const edges =
|
|
40559
|
+
const edges = pathsToEdges(segmentsToScreenPaths(path.segments, displayList.height, scale), true);
|
|
40302
40560
|
const clipScreen = path.clipRect ? [path.clipRect[0] * scale, (displayList.height - path.clipRect[3]) * scale, path.clipRect[2] * scale, (displayList.height - path.clipRect[1]) * scale] : void 0;
|
|
40303
40561
|
fillEdgesScanline4x4(rgba, width, height, edges, path.fillColor, path.fillAlpha ?? 1, path.fillRule ?? "nonzero", clipScreen, original.kind === "glyph" ? aaTxt : aaVec, path.blendMode, clipMask);
|
|
40304
40562
|
}
|
|
40305
40563
|
if (path.strokeColor) {
|
|
40306
|
-
const edges = segmentsToScreenEdges(path.segments, displayList.height, scale, false);
|
|
40307
40564
|
const rawSw = path.strokeWidth * scale;
|
|
40308
40565
|
const sw = Math.max(1, rawSw);
|
|
40309
40566
|
const strokeAlpha = options.thinLineMode === "shape" && rawSw < 1 ? (path.strokeAlpha ?? 1) * Math.max(0.25, rawSw) : path.strokeAlpha ?? 1;
|
|
40310
|
-
const
|
|
40311
|
-
|
|
40312
|
-
|
|
40313
|
-
|
|
40314
|
-
|
|
40315
|
-
|
|
40316
|
-
|
|
40317
|
-
|
|
40318
|
-
|
|
40319
|
-
|
|
40320
|
-
|
|
40321
|
-
|
|
40322
|
-
|
|
40323
|
-
|
|
40324
|
-
|
|
40325
|
-
|
|
40326
|
-
|
|
40327
|
-
|
|
40328
|
-
|
|
40329
|
-
|
|
40330
|
-
|
|
40331
|
-
|
|
40332
|
-
|
|
40333
|
-
|
|
40334
|
-
const t1 = (pos + step) / edgeLen;
|
|
40335
|
-
drawAntiAliasedSegment(
|
|
40336
|
-
rgba,
|
|
40337
|
-
width,
|
|
40338
|
-
height,
|
|
40339
|
-
e.x0 + dx * t0,
|
|
40340
|
-
e.y0 + dy * t0,
|
|
40341
|
-
e.x0 + dx * t1,
|
|
40342
|
-
e.y0 + dy * t1,
|
|
40343
|
-
sw,
|
|
40344
|
-
path.strokeColor,
|
|
40345
|
-
strokeAlpha,
|
|
40346
|
-
path.lineCap ?? 0,
|
|
40347
|
-
original.kind === "glyph" ? aaTxt : aaVec,
|
|
40348
|
-
path.blendMode,
|
|
40349
|
-
clipMask
|
|
40350
|
-
);
|
|
40351
|
-
}
|
|
40352
|
-
pos += step;
|
|
40353
|
-
dashDist = (dashDist + step) % dashCycle;
|
|
40354
|
-
}
|
|
40355
|
-
}
|
|
40356
|
-
}
|
|
40567
|
+
const contours = strokeOutlines(
|
|
40568
|
+
segmentsToScreenPaths(path.segments, displayList.height, scale),
|
|
40569
|
+
sw,
|
|
40570
|
+
path.lineCap ?? 0,
|
|
40571
|
+
path.lineJoin ?? 0,
|
|
40572
|
+
path.miterLimit ?? 10,
|
|
40573
|
+
path.dashArray?.map((value) => Math.max(0, value * scale)),
|
|
40574
|
+
(path.dashPhase ?? 0) * scale
|
|
40575
|
+
);
|
|
40576
|
+
const edges = pathsToEdges(contours.map((points) => ({ points, closed: true })));
|
|
40577
|
+
const clipScreen = path.clipRect ? [path.clipRect[0] * scale, (displayList.height - path.clipRect[3]) * scale, path.clipRect[2] * scale, (displayList.height - path.clipRect[1]) * scale] : void 0;
|
|
40578
|
+
fillEdgesScanline4x4(
|
|
40579
|
+
rgba,
|
|
40580
|
+
width,
|
|
40581
|
+
height,
|
|
40582
|
+
edges,
|
|
40583
|
+
path.strokeColor,
|
|
40584
|
+
strokeAlpha,
|
|
40585
|
+
"nonzero",
|
|
40586
|
+
clipScreen,
|
|
40587
|
+
original.kind === "glyph" ? aaTxt : aaVec,
|
|
40588
|
+
path.blendMode,
|
|
40589
|
+
clipMask
|
|
40590
|
+
);
|
|
40357
40591
|
}
|
|
40358
40592
|
} else if (operation.kind === "image") {
|
|
40359
40593
|
const img = operation.value;
|
|
@@ -42474,3 +42708,15 @@ export {
|
|
|
42474
42708
|
* Copyright 2012 Mozilla Foundation. Licensed under Apache-2.0.
|
|
42475
42709
|
* See THIRD_PARTY_NOTICES.md for the source revision and adaptations.
|
|
42476
42710
|
*/
|
|
42711
|
+
/*!
|
|
42712
|
+
* Anti-Grain Geometry - Version 2.3
|
|
42713
|
+
* Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
|
42714
|
+
*
|
|
42715
|
+
* Permission to copy, use, modify, sell and distribute this software
|
|
42716
|
+
* is granted provided this copyright notice appears in all copies.
|
|
42717
|
+
* This software is provided "as is" without express or implied
|
|
42718
|
+
* warranty, and with no claim as to its suitability for any purpose.
|
|
42719
|
+
*
|
|
42720
|
+
* Adapted from PDFium agg_math_stroke.h and agg_vcgen_stroke.cpp.
|
|
42721
|
+
* See THIRD_PARTY_NOTICES.md for the source revision and adaptations.
|
|
42722
|
+
*/
|