@poe-platform/safe-bash 0.1.763 → 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 +268 -153
- package/dist/image-ast/index.js +268 -153
- package/dist/pdf-ast/index.js +270 -153
- package/dist/safe-bash/chunks/{chunk-CRQDMBQA.js → chunk-FSH7QRIC.js} +10 -1
- package/dist/safe-bash/command-chunks/{chunk-4XHONGIU.js → chunk-B7YLGJRF.js} +2 -2
- package/dist/safe-bash/command-chunks/{chunk-S3G2B4OX.js → chunk-G3IIEU2N.js} +271 -153
- package/dist/safe-bash/command-chunks/{chunk-S5EX6UP5.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 +32 -12
- package/dist/safe-bash/shell/runtime.js +43 -11
- package/dist/safe-bash-command-ffmpeg/index.js +5649 -5565
- 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 +268 -153
- package/dist/safe-bash-command-pdfinfo/index.js +268 -153
- package/dist/safe-bash-command-pdftk/index.js +268 -153
- package/dist/safe-bash-command-pdftoppm/index.js +268 -153
- package/dist/safe-bash-command-pdftotext/index.js +268 -153
- package/dist/safe-bash-command-qpdf/index.js +268 -153
- 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 +265 -150
- package/dist/safe-bash-command-wkhtmltopdf/index.js +269 -153
- 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 +14 -0
|
@@ -28,8 +28,8 @@ import {
|
|
|
28
28
|
thresholdImage,
|
|
29
29
|
tintImage,
|
|
30
30
|
trimImage
|
|
31
|
-
} from "../safe-bash/command-chunks/chunk-
|
|
32
|
-
import "../safe-bash/command-chunks/chunk-
|
|
31
|
+
} from "../safe-bash/command-chunks/chunk-RDPJGIQF.js";
|
|
32
|
+
import "../safe-bash/command-chunks/chunk-G3IIEU2N.js";
|
|
33
33
|
import {
|
|
34
34
|
init_buffer
|
|
35
35
|
} from "../safe-bash/command-chunks/chunk-HX3SHTCE.js";
|
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
createPandocCommand,
|
|
3
3
|
createPandocCommands,
|
|
4
4
|
pandocCommands
|
|
5
|
-
} from "../safe-bash/command-chunks/chunk-
|
|
5
|
+
} from "../safe-bash/command-chunks/chunk-B7YLGJRF.js";
|
|
6
6
|
import "../safe-bash/command-chunks/chunk-MKQVQMXO.js";
|
|
7
7
|
import "../safe-bash/command-chunks/chunk-RDV7UCYZ.js";
|
|
8
|
-
import "../safe-bash/command-chunks/chunk-
|
|
9
|
-
import "../safe-bash/command-chunks/chunk-
|
|
8
|
+
import "../safe-bash/command-chunks/chunk-RDPJGIQF.js";
|
|
9
|
+
import "../safe-bash/command-chunks/chunk-G3IIEU2N.js";
|
|
10
10
|
import "../safe-bash/command-chunks/chunk-Y2KHC6TZ.js";
|
|
11
11
|
import "../safe-bash/command-chunks/chunk-YGYOVXTO.js";
|
|
12
12
|
import "../safe-bash/command-chunks/chunk-I5GLTNVH.js";
|
|
@@ -21,11 +21,11 @@ import {
|
|
|
21
21
|
readDocument,
|
|
22
22
|
resolveConversionArgs,
|
|
23
23
|
writeDocument
|
|
24
|
-
} from "../safe-bash/command-chunks/chunk-
|
|
24
|
+
} from "../safe-bash/command-chunks/chunk-B7YLGJRF.js";
|
|
25
25
|
import "../safe-bash/command-chunks/chunk-MKQVQMXO.js";
|
|
26
26
|
import "../safe-bash/command-chunks/chunk-RDV7UCYZ.js";
|
|
27
|
-
import "../safe-bash/command-chunks/chunk-
|
|
28
|
-
import "../safe-bash/command-chunks/chunk-
|
|
27
|
+
import "../safe-bash/command-chunks/chunk-RDPJGIQF.js";
|
|
28
|
+
import "../safe-bash/command-chunks/chunk-G3IIEU2N.js";
|
|
29
29
|
import {
|
|
30
30
|
createLuaFilterCapability
|
|
31
31
|
} from "../safe-bash/command-chunks/chunk-Y2KHC6TZ.js";
|
|
@@ -39170,6 +39170,184 @@ function downscaleImage(image, widthScale, heightScale) {
|
|
|
39170
39170
|
}
|
|
39171
39171
|
return image;
|
|
39172
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
|
+
}
|
|
39173
39351
|
function encodePng(bitmap) {
|
|
39174
39352
|
return encodeRgbaToPng(bitmap.width, bitmap.height, bitmap.data);
|
|
39175
39353
|
}
|
|
@@ -40018,111 +40196,60 @@ function blendPixel(rgba, width, height, px, py, color, alpha, blendMode, clipMa
|
|
|
40018
40196
|
rgba[idx + 2] = Math.round((effB * a + cbB * dstA * (1 - a)) / outA * 255);
|
|
40019
40197
|
rgba[idx + 3] = Math.round(outA * 255);
|
|
40020
40198
|
}
|
|
40021
|
-
function
|
|
40022
|
-
const
|
|
40023
|
-
|
|
40024
|
-
|
|
40025
|
-
const lenSq = dx * dx + dy * dy;
|
|
40026
|
-
const segLen = Math.sqrt(lenSq);
|
|
40027
|
-
const pad = lineCap === 2 ? halfW + 2 : halfW + 1;
|
|
40028
|
-
const minX = Math.max(0, Math.floor(Math.min(x0, x1) - pad));
|
|
40029
|
-
const maxX = Math.min(width - 1, Math.ceil(Math.max(x0, x1) + pad));
|
|
40030
|
-
const minY = Math.max(0, Math.floor(Math.min(y0, y1) - pad));
|
|
40031
|
-
const maxY = Math.min(height - 1, Math.ceil(Math.max(y0, y1) + pad));
|
|
40032
|
-
for (let py = minY; py <= maxY; py++) {
|
|
40033
|
-
for (let px = minX; px <= maxX; px++) {
|
|
40034
|
-
const cx = px + 0.5;
|
|
40035
|
-
const cy = py + 0.5;
|
|
40036
|
-
if (segLen > 1e-6 && (lineCap === 0 || lineCap === 2)) {
|
|
40037
|
-
const ux = dx / segLen;
|
|
40038
|
-
const uy = dy / segLen;
|
|
40039
|
-
const along = (cx - x0) * ux + (cy - y0) * uy;
|
|
40040
|
-
const perp = Math.abs(-(cx - x0) * uy + (cy - y0) * ux);
|
|
40041
|
-
const minAlong = lineCap === 2 ? -halfW : 0;
|
|
40042
|
-
const maxAlong = lineCap === 2 ? segLen + halfW : segLen;
|
|
40043
|
-
const overAlong = along < minAlong ? minAlong - along : along > maxAlong ? along - maxAlong : 0;
|
|
40044
|
-
const dist2 = overAlong > 0 ? Math.max(perp, halfW + overAlong) : perp;
|
|
40045
|
-
if (dist2 <= halfW + 0.75) {
|
|
40046
|
-
const cov = antialias ? Math.max(0, Math.min(1, halfW + 0.5 - dist2)) : dist2 <= halfW + 0.25 ? 1 : 0;
|
|
40047
|
-
blendPixel(rgba, width, height, px, py, color, cov * alpha, blendMode, clipMask);
|
|
40048
|
-
}
|
|
40049
|
-
continue;
|
|
40050
|
-
}
|
|
40051
|
-
let t = lenSq > 1e-6 ? ((cx - x0) * dx + (cy - y0) * dy) / lenSq : 0;
|
|
40052
|
-
t = Math.max(0, Math.min(1, t));
|
|
40053
|
-
const projX = x0 + t * dx;
|
|
40054
|
-
const projY = y0 + t * dy;
|
|
40055
|
-
const dist = Math.hypot(cx - projX, cy - projY);
|
|
40056
|
-
if (dist <= halfW + 0.75) {
|
|
40057
|
-
const cov = antialias ? Math.max(0, Math.min(1, halfW + 0.5 - dist)) : dist <= halfW + 0.25 ? 1 : 0;
|
|
40058
|
-
blendPixel(rgba, width, height, px, py, color, cov * alpha, blendMode, clipMask);
|
|
40059
|
-
}
|
|
40060
|
-
}
|
|
40061
|
-
}
|
|
40062
|
-
}
|
|
40063
|
-
function segmentsToScreenEdges(segments, pageHeight, scale, closeSubpaths = false) {
|
|
40064
|
-
const edges = [];
|
|
40065
|
-
let curX = 0;
|
|
40066
|
-
let curY = 0;
|
|
40067
|
-
let startX = 0;
|
|
40068
|
-
let startY = 0;
|
|
40069
|
-
let hasOpenSubpath = false;
|
|
40199
|
+
function segmentsToScreenPaths(segments, pageHeight, scale) {
|
|
40200
|
+
const paths = [];
|
|
40201
|
+
let points = [];
|
|
40202
|
+
let current = [0, 0];
|
|
40070
40203
|
const toScreen = (x, y) => [x * scale, (pageHeight - y) * scale];
|
|
40071
|
-
for (const
|
|
40072
|
-
if (
|
|
40073
|
-
if (
|
|
40074
|
-
|
|
40075
|
-
|
|
40076
|
-
|
|
40077
|
-
|
|
40078
|
-
|
|
40079
|
-
|
|
40080
|
-
} else if (
|
|
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
|
-
|
|
40111
|
-
|
|
40112
|
-
|
|
40113
|
-
const [
|
|
40114
|
-
|
|
40115
|
-
|
|
40116
|
-
|
|
40117
|
-
|
|
40118
|
-
|
|
40119
|
-
{ x0: rx0, y0: ry1, x1: rx0, y1: ry0 }
|
|
40120
|
-
);
|
|
40121
|
-
hasOpenSubpath = false;
|
|
40204
|
+
for (const segment of segments) {
|
|
40205
|
+
if (segment.kind === "move") {
|
|
40206
|
+
if (points.length) paths.push({ points, closed: false });
|
|
40207
|
+
current = toScreen(segment.x, segment.y);
|
|
40208
|
+
points = [current];
|
|
40209
|
+
} else if (segment.kind === "line") {
|
|
40210
|
+
if (!points.length) points = [current];
|
|
40211
|
+
current = toScreen(segment.x, segment.y);
|
|
40212
|
+
points.push(current);
|
|
40213
|
+
} else if (segment.kind === "cubic") {
|
|
40214
|
+
if (!points.length) points = [current];
|
|
40215
|
+
const a = toScreen(segment.x1, segment.y1), b = toScreen(segment.x2, segment.y2);
|
|
40216
|
+
const end = toScreen(segment.x, segment.y);
|
|
40217
|
+
const curve = flattenCubic(current[0], current[1], a[0], a[1], b[0], b[1], end[0], end[1]);
|
|
40218
|
+
for (let i = 1; i < curve.length; i++) points.push(curve[i]);
|
|
40219
|
+
current = end;
|
|
40220
|
+
} else if (segment.kind === "close") {
|
|
40221
|
+
if (points.length) {
|
|
40222
|
+
paths.push({ points, closed: true });
|
|
40223
|
+
current = points[0];
|
|
40224
|
+
points = [];
|
|
40225
|
+
}
|
|
40226
|
+
} else if (segment.kind === "rect") {
|
|
40227
|
+
if (points.length) paths.push({ points, closed: false });
|
|
40228
|
+
const first = toScreen(segment.x, segment.y);
|
|
40229
|
+
paths.push({ points: [
|
|
40230
|
+
first,
|
|
40231
|
+
toScreen(segment.x + segment.width, segment.y),
|
|
40232
|
+
toScreen(segment.x + segment.width, segment.y + segment.height),
|
|
40233
|
+
toScreen(segment.x, segment.y + segment.height)
|
|
40234
|
+
], closed: true });
|
|
40235
|
+
current = first;
|
|
40236
|
+
points = [];
|
|
40237
|
+
}
|
|
40238
|
+
}
|
|
40239
|
+
if (points.length) paths.push({ points, closed: false });
|
|
40240
|
+
return paths;
|
|
40241
|
+
}
|
|
40242
|
+
function pathsToEdges(paths, closeSubpaths = false) {
|
|
40243
|
+
const edges = [];
|
|
40244
|
+
for (const { points, closed } of paths) {
|
|
40245
|
+
for (let i = 1; i < points.length; i++) {
|
|
40246
|
+
const a = points[i - 1], b = points[i];
|
|
40247
|
+
edges.push({ x0: a[0], y0: a[1], x1: b[0], y1: b[1] });
|
|
40248
|
+
}
|
|
40249
|
+
if ((closed || closeSubpaths) && points.length > 1) {
|
|
40250
|
+
const a = points[points.length - 1], b = points[0];
|
|
40251
|
+
edges.push({ x0: a[0], y0: a[1], x1: b[0], y1: b[1] });
|
|
40122
40252
|
}
|
|
40123
|
-
}
|
|
40124
|
-
if (closeSubpaths && hasOpenSubpath && (curX !== startX || curY !== startY)) {
|
|
40125
|
-
edges.push({ x0: curX, y0: curY, x1: startX, y1: startY });
|
|
40126
40253
|
}
|
|
40127
40254
|
return edges;
|
|
40128
40255
|
}
|
|
@@ -40309,7 +40436,7 @@ function renderDisplayListToBitmap(displayList, options = {}) {
|
|
|
40309
40436
|
for (const clip of clips) {
|
|
40310
40437
|
const { segments, fillRule } = "segments" in clip ? clip : { segments: clip, fillRule: "nonzero" };
|
|
40311
40438
|
const layer = new Uint8Array(width * height * 4);
|
|
40312
|
-
fillEdgesScanline4x4(layer, width, height,
|
|
40439
|
+
fillEdgesScanline4x4(layer, width, height, pathsToEdges(segmentsToScreenPaths(segments, displayList.height, scale), true), { r: 1, g: 1, b: 1 }, 1, fillRule);
|
|
40313
40440
|
for (let i = 3; i < layer.length; i += 4) clipMask[i] = Math.round(clipMask[i] * layer[i] / 255);
|
|
40314
40441
|
}
|
|
40315
40442
|
cachedClips = clips;
|
|
@@ -40356,62 +40483,38 @@ function renderDisplayListToBitmap(displayList, options = {}) {
|
|
|
40356
40483
|
if (operation.kind === "path") {
|
|
40357
40484
|
const path = operation.value;
|
|
40358
40485
|
if (path.fillColor) {
|
|
40359
|
-
const edges =
|
|
40486
|
+
const edges = pathsToEdges(segmentsToScreenPaths(path.segments, displayList.height, scale), true);
|
|
40360
40487
|
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;
|
|
40361
40488
|
fillEdgesScanline4x4(rgba, width, height, edges, path.fillColor, path.fillAlpha ?? 1, path.fillRule ?? "nonzero", clipScreen, original.kind === "glyph" ? aaTxt : aaVec, path.blendMode, clipMask);
|
|
40362
40489
|
}
|
|
40363
40490
|
if (path.strokeColor) {
|
|
40364
|
-
const edges = segmentsToScreenEdges(path.segments, displayList.height, scale, false);
|
|
40365
40491
|
const rawSw = path.strokeWidth * scale;
|
|
40366
40492
|
const sw = Math.max(1, rawSw);
|
|
40367
40493
|
const strokeAlpha = options.thinLineMode === "shape" && rawSw < 1 ? (path.strokeAlpha ?? 1) * Math.max(0.25, rawSw) : path.strokeAlpha ?? 1;
|
|
40368
|
-
const
|
|
40369
|
-
|
|
40370
|
-
|
|
40371
|
-
|
|
40372
|
-
|
|
40373
|
-
|
|
40374
|
-
|
|
40375
|
-
|
|
40376
|
-
|
|
40377
|
-
|
|
40378
|
-
|
|
40379
|
-
|
|
40380
|
-
|
|
40381
|
-
|
|
40382
|
-
|
|
40383
|
-
|
|
40384
|
-
|
|
40385
|
-
|
|
40386
|
-
|
|
40387
|
-
|
|
40388
|
-
|
|
40389
|
-
|
|
40390
|
-
|
|
40391
|
-
|
|
40392
|
-
const t1 = (pos + step) / edgeLen;
|
|
40393
|
-
drawAntiAliasedSegment(
|
|
40394
|
-
rgba,
|
|
40395
|
-
width,
|
|
40396
|
-
height,
|
|
40397
|
-
e.x0 + dx * t0,
|
|
40398
|
-
e.y0 + dy * t0,
|
|
40399
|
-
e.x0 + dx * t1,
|
|
40400
|
-
e.y0 + dy * t1,
|
|
40401
|
-
sw,
|
|
40402
|
-
path.strokeColor,
|
|
40403
|
-
strokeAlpha,
|
|
40404
|
-
path.lineCap ?? 0,
|
|
40405
|
-
original.kind === "glyph" ? aaTxt : aaVec,
|
|
40406
|
-
path.blendMode,
|
|
40407
|
-
clipMask
|
|
40408
|
-
);
|
|
40409
|
-
}
|
|
40410
|
-
pos += step;
|
|
40411
|
-
dashDist = (dashDist + step) % dashCycle;
|
|
40412
|
-
}
|
|
40413
|
-
}
|
|
40414
|
-
}
|
|
40494
|
+
const contours = strokeOutlines(
|
|
40495
|
+
segmentsToScreenPaths(path.segments, displayList.height, scale),
|
|
40496
|
+
sw,
|
|
40497
|
+
path.lineCap ?? 0,
|
|
40498
|
+
path.lineJoin ?? 0,
|
|
40499
|
+
path.miterLimit ?? 10,
|
|
40500
|
+
path.dashArray?.map((value) => Math.max(0, value * scale)),
|
|
40501
|
+
(path.dashPhase ?? 0) * scale
|
|
40502
|
+
);
|
|
40503
|
+
const edges = pathsToEdges(contours.map((points) => ({ points, closed: true })));
|
|
40504
|
+
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;
|
|
40505
|
+
fillEdgesScanline4x4(
|
|
40506
|
+
rgba,
|
|
40507
|
+
width,
|
|
40508
|
+
height,
|
|
40509
|
+
edges,
|
|
40510
|
+
path.strokeColor,
|
|
40511
|
+
strokeAlpha,
|
|
40512
|
+
"nonzero",
|
|
40513
|
+
clipScreen,
|
|
40514
|
+
original.kind === "glyph" ? aaTxt : aaVec,
|
|
40515
|
+
path.blendMode,
|
|
40516
|
+
clipMask
|
|
40517
|
+
);
|
|
40415
40518
|
}
|
|
40416
40519
|
} else if (operation.kind === "image") {
|
|
40417
40520
|
const img = operation.value;
|
|
@@ -41508,3 +41611,15 @@ export {
|
|
|
41508
41611
|
* Copyright 2012 Mozilla Foundation. Licensed under Apache-2.0.
|
|
41509
41612
|
* See THIRD_PARTY_NOTICES.md for the source revision and adaptations.
|
|
41510
41613
|
*/
|
|
41614
|
+
/*!
|
|
41615
|
+
* Anti-Grain Geometry - Version 2.3
|
|
41616
|
+
* Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
|
41617
|
+
*
|
|
41618
|
+
* Permission to copy, use, modify, sell and distribute this software
|
|
41619
|
+
* is granted provided this copyright notice appears in all copies.
|
|
41620
|
+
* This software is provided "as is" without express or implied
|
|
41621
|
+
* warranty, and with no claim as to its suitability for any purpose.
|
|
41622
|
+
*
|
|
41623
|
+
* Adapted from PDFium agg_math_stroke.h and agg_vcgen_stroke.cpp.
|
|
41624
|
+
* See THIRD_PARTY_NOTICES.md for the source revision and adaptations.
|
|
41625
|
+
*/
|