@idle-screens/schema 3.17.0 → 3.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +76 -26
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -10233,7 +10233,8 @@ var PATTERN_STATIONARY_AREA = 0.4;
|
|
|
10233
10233
|
var PATTERN_MOVING_AREA = 0.25;
|
|
10234
10234
|
var PATTERN_FLICKER_AREA = 0.25;
|
|
10235
10235
|
var PATTERN_MAX_SAMPLE_TIMES = 6;
|
|
10236
|
-
var
|
|
10236
|
+
var LATTICE_SLACK = 1;
|
|
10237
|
+
var LATTICE_JITTER = 0.15;
|
|
10237
10238
|
var PATTERN_MAX_PITCH = 0.15;
|
|
10238
10239
|
var PATTERN_MIN_EXTENT = 2;
|
|
10239
10240
|
var NEIGHBOUR_PITCH = 0.25;
|
|
@@ -10329,6 +10330,35 @@ function stripeExtrema(line) {
|
|
|
10329
10330
|
function similarSpacing(a, b, frac) {
|
|
10330
10331
|
return Math.abs(a - b) <= 1 + frac * Math.min(a, b);
|
|
10331
10332
|
}
|
|
10333
|
+
var latticeTolerance = (p) => LATTICE_SLACK + LATTICE_JITTER * p;
|
|
10334
|
+
function latticeFit(xs, s, e) {
|
|
10335
|
+
const n = e - s + 1;
|
|
10336
|
+
let sk = 0, sx = 0, skk = 0, skx = 0;
|
|
10337
|
+
for (let j = s; j <= e; j++) {
|
|
10338
|
+
const k = j - s, x = xs[j];
|
|
10339
|
+
sk += k;
|
|
10340
|
+
sx += x;
|
|
10341
|
+
skk += k * k;
|
|
10342
|
+
skx += k * x;
|
|
10343
|
+
}
|
|
10344
|
+
const p = (n * skx - sk * sx) / (n * skk - sk * sk), a = (sx - p * sk) / n;
|
|
10345
|
+
let worst = 0, at = s;
|
|
10346
|
+
for (let j = s; j <= e; j++) {
|
|
10347
|
+
const off = Math.abs(xs[j] - a - p * (j - s));
|
|
10348
|
+
if (off > worst) {
|
|
10349
|
+
worst = off;
|
|
10350
|
+
at = j;
|
|
10351
|
+
}
|
|
10352
|
+
if (j > s) {
|
|
10353
|
+
const gap = Math.abs(xs[j] - xs[j - 1] - p);
|
|
10354
|
+
if (gap > worst) {
|
|
10355
|
+
worst = gap;
|
|
10356
|
+
at = j - s <= e - j ? j - 1 : j;
|
|
10357
|
+
}
|
|
10358
|
+
}
|
|
10359
|
+
}
|
|
10360
|
+
return { p, worst, trimStart: at - s < e - at };
|
|
10361
|
+
}
|
|
10332
10362
|
function stripeRuns(ext, line, axis) {
|
|
10333
10363
|
const runs = [];
|
|
10334
10364
|
for (const light of [true, false]) {
|
|
@@ -10336,32 +10366,48 @@ function stripeRuns(ext, line, axis) {
|
|
|
10336
10366
|
ext.forEach((e, i) => {
|
|
10337
10367
|
if (e.light === light) idx.push(i);
|
|
10338
10368
|
});
|
|
10339
|
-
|
|
10340
|
-
const close = (
|
|
10341
|
-
|
|
10342
|
-
|
|
10343
|
-
|
|
10344
|
-
|
|
10345
|
-
|
|
10346
|
-
|
|
10347
|
-
|
|
10348
|
-
|
|
10349
|
-
|
|
10350
|
-
|
|
10351
|
-
|
|
10352
|
-
|
|
10369
|
+
const xs = idx.map((i) => ext[i].x);
|
|
10370
|
+
const close = (s, e) => {
|
|
10371
|
+
while (e - s + 1 >= PATTERN_MIN_PAIRS) {
|
|
10372
|
+
const fit = latticeFit(xs, s, e);
|
|
10373
|
+
if (fit.worst <= latticeTolerance(fit.p)) break;
|
|
10374
|
+
if (fit.trimStart) s++;
|
|
10375
|
+
else e--;
|
|
10376
|
+
}
|
|
10377
|
+
const count = e - s + 1;
|
|
10378
|
+
if (count < PATTERN_MIN_PAIRS) return;
|
|
10379
|
+
const periods = xs.slice(s + 1, e + 1).map((x, k) => x - xs[s + k]).sort((a, b) => a - b);
|
|
10380
|
+
const first = idx[s], last = idx[e];
|
|
10381
|
+
let swing = 0, pairs = 0;
|
|
10382
|
+
for (let k = Math.max(0, first - 1); k < Math.min(ext.length - 1, last + 1); k++) {
|
|
10383
|
+
swing += Math.abs(ext[k + 1].v - ext[k].v);
|
|
10384
|
+
pairs++;
|
|
10385
|
+
}
|
|
10386
|
+
runs.push({ line, axis, from: xs[s], to: xs[e], period: periods[periods.length >> 1], count, light, contrast: pairs ? swing / pairs : 0 });
|
|
10353
10387
|
};
|
|
10354
|
-
|
|
10355
|
-
|
|
10356
|
-
|
|
10357
|
-
|
|
10358
|
-
|
|
10359
|
-
|
|
10360
|
-
|
|
10388
|
+
let start = 0, n = 0, sk = 0, sx = 0, skk = 0, skx = 0;
|
|
10389
|
+
const add = (j) => {
|
|
10390
|
+
const k = j - start, x = xs[j];
|
|
10391
|
+
n++;
|
|
10392
|
+
sk += k;
|
|
10393
|
+
sx += x;
|
|
10394
|
+
skk += k * k;
|
|
10395
|
+
skx += k * x;
|
|
10396
|
+
};
|
|
10397
|
+
for (let j = 0; j < xs.length; j++) {
|
|
10398
|
+
if (n >= 2) {
|
|
10399
|
+
const p = (n * skx - sk * sx) / (n * skk - sk * sk), a = (sx - p * sk) / n;
|
|
10400
|
+
const tol = latticeTolerance(p);
|
|
10401
|
+
if (Math.abs(xs[j] - a - p * (j - start)) > tol || Math.abs(xs[j] - xs[j - 1] - p) > tol) {
|
|
10402
|
+
close(start, j - 1);
|
|
10403
|
+
start = j - 1;
|
|
10404
|
+
n = sk = sx = skk = skx = 0;
|
|
10405
|
+
add(j - 1);
|
|
10361
10406
|
}
|
|
10362
10407
|
}
|
|
10408
|
+
add(j);
|
|
10363
10409
|
}
|
|
10364
|
-
if (
|
|
10410
|
+
if (xs.length) close(start, xs.length - 1);
|
|
10365
10411
|
}
|
|
10366
10412
|
return runs;
|
|
10367
10413
|
}
|
|
@@ -10425,12 +10471,16 @@ function scanRaster(r) {
|
|
|
10425
10471
|
}
|
|
10426
10472
|
}
|
|
10427
10473
|
const median = (xs) => xs.length ? [...xs].sort((a, b) => a - b)[xs.length >> 1] : 0;
|
|
10474
|
+
const medians = /* @__PURE__ */ new Map();
|
|
10428
10475
|
for (const run of flat) {
|
|
10429
|
-
const
|
|
10476
|
+
const root = find(at.get(run));
|
|
10477
|
+
const sp = span.get(root);
|
|
10430
10478
|
if (sp.hi - sp.lo + 1 < PATTERN_MIN_EXTENT * sp.across) continue;
|
|
10479
|
+
let med = medians.get(root);
|
|
10480
|
+
if (!med) medians.set(root, med = { period: median(sp.periods), slant: median(sp.slants) });
|
|
10431
10481
|
const [along, step] = run.axis === "x" ? [r.cellX, r.cellY] : [r.cellY, r.cellX];
|
|
10432
|
-
const slant =
|
|
10433
|
-
run.pitch =
|
|
10482
|
+
const slant = med.slant * along;
|
|
10483
|
+
run.pitch = med.period * along * (step / Math.hypot(slant, step));
|
|
10434
10484
|
if (run.pitch <= PATTERN_MAX_PITCH) kept.push(run);
|
|
10435
10485
|
}
|
|
10436
10486
|
}
|