@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 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 PERIOD_RATIO = 4 / 3;
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
- let start = 0;
10340
- const close = (end) => {
10341
- const count = end - start + 1;
10342
- if (count >= PATTERN_MIN_PAIRS) {
10343
- const xs = idx.slice(start, end + 1).map((i) => ext[i].x);
10344
- const periods = xs.slice(1).map((x, k) => x - xs[k]).sort((a, b) => a - b);
10345
- const first = idx[start], last = idx[end];
10346
- let swing = 0, pairs = 0;
10347
- for (let k = Math.max(0, first - 1); k < Math.min(ext.length - 1, last + 1); k++) {
10348
- swing += Math.abs(ext[k + 1].v - ext[k].v);
10349
- pairs++;
10350
- }
10351
- runs.push({ line, axis, from: xs[0], to: xs[xs.length - 1], period: periods[periods.length >> 1], count, light, contrast: pairs ? swing / pairs : 0 });
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
- for (let k = 1; k < idx.length; k++) {
10355
- if (k >= 2) {
10356
- const p0 = ext[idx[k - 1]].x - ext[idx[k - 2]].x;
10357
- const p1 = ext[idx[k]].x - ext[idx[k - 1]].x;
10358
- if (!similarSpacing(p0, p1, PERIOD_RATIO - 1)) {
10359
- close(k - 1);
10360
- start = k - 1;
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 (idx.length) close(idx.length - 1);
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 sp = span.get(find(at.get(run)));
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 = median(sp.slants) * along;
10433
- run.pitch = median(sp.periods) * along * (step / Math.hypot(slant, step));
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
  }