Jony/assets/backdrop/backdrop5.js
2023-06-30 16:39:08 +08:00

1263 lines
52 KiB
JavaScript
Executable File

(function () {
var t = (function () {
"use strict";
function t() {
return { LEFT: 0, RIGHT: 1, INTERSECTS: 2, AHEAD: 3, BEHIND: 4, SEPARATE: 5, UNDEFINED: 6 };
}
var e = Math.tan,
s = Math.pow,
i = Math.cos,
h = Math.sin,
a = Math.PI,
n = Math.sqrt,
l = Math.max,
r = Math.min,
o = Math.abs,
c = Number.MAX_VALUE;
class p {
constructor(e, s, i, h) {
(this.RoughSegmentRelationConst = t()),
(this.px1 = e),
(this.py1 = s),
(this.px2 = i),
(this.py2 = h),
(this.xi = c),
(this.yi = c),
(this.a = h - s),
(this.b = e - i),
(this.c = i * s - e * h),
(this._undefined = 0 == this.a && 0 == this.b && 0 == this.c);
}
isUndefined() {
return this._undefined;
}
compare(t) {
if (this.isUndefined() || t.isUndefined()) return this.RoughSegmentRelationConst.UNDEFINED;
var e = c,
s = c,
i = 0,
h = 0,
a = this.a,
n = this.b,
p = this.c;
return (
1e-5 < o(n) && ((e = -a / n), (i = -p / n)),
1e-5 < o(t.b) && ((s = -t.a / t.b), (h = -t.c / t.b)),
e == c
? s == c
? -p / a == -t.c / t.a
? this.py1 >= r(t.py1, t.py2) && this.py1 <= l(t.py1, t.py2)
? ((this.xi = this.px1), (this.yi = this.py1), this.RoughSegmentRelationConst.INTERSECTS)
: this.py2 >= r(t.py1, t.py2) && this.py2 <= l(t.py1, t.py2)
? ((this.xi = this.px2), (this.yi = this.py2), this.RoughSegmentRelationConst.INTERSECTS)
: this.RoughSegmentRelationConst.SEPARATE
: this.RoughSegmentRelationConst.SEPARATE
: ((this.xi = this.px1),
(this.yi = s * this.xi + h),
-1e-5 > (this.py1 - this.yi) * (this.yi - this.py2) || -1e-5 > (t.py1 - this.yi) * (this.yi - t.py2)
? this.RoughSegmentRelationConst.SEPARATE
: 1e-5 > o(t.a) && -1e-5 > (t.px1 - this.xi) * (this.xi - t.px2)
? this.RoughSegmentRelationConst.SEPARATE
: this.RoughSegmentRelationConst.INTERSECTS)
: s == c
? ((this.xi = t.px1),
(this.yi = e * this.xi + i),
-1e-5 > (t.py1 - this.yi) * (this.yi - t.py2) || -1e-5 > (this.py1 - this.yi) * (this.yi - this.py2)
? this.RoughSegmentRelationConst.SEPARATE
: 1e-5 > o(a) && -1e-5 > (this.px1 - this.xi) * (this.xi - this.px2)
? this.RoughSegmentRelationConst.SEPARATE
: this.RoughSegmentRelationConst.INTERSECTS)
: e == s
? i == h
? this.px1 >= r(t.px1, t.px2) && this.px1 <= l(t.py1, t.py2)
? ((this.xi = this.px1), (this.yi = this.py1), this.RoughSegmentRelationConst.INTERSECTS)
: this.px2 >= r(t.px1, t.px2) && this.px2 <= l(t.px1, t.px2)
? ((this.xi = this.px2), (this.yi = this.py2), this.RoughSegmentRelationConst.INTERSECTS)
: this.RoughSegmentRelationConst.SEPARATE
: this.RoughSegmentRelationConst.SEPARATE
: ((this.xi = (h - i) / (e - s)),
(this.yi = e * this.xi + i),
-1e-5 > (this.px1 - this.xi) * (this.xi - this.px2) || -1e-5 > (t.px1 - this.xi) * (this.xi - t.px2) ? this.RoughSegmentRelationConst.SEPARATE : this.RoughSegmentRelationConst.INTERSECTS)
);
}
getLength() {
return this._getLength(this.px1, this.py1, this.px2, this.py2);
}
_getLength(t, e, s, i) {
var h = s - t,
a = i - e;
return n(h * h + a * a);
}
}
class f {
constructor(t, e, s, i, h, a, n, l) {
(this.top = t),
(this.bottom = e),
(this.left = s),
(this.right = i),
(this.gap = h),
(this.sinAngle = a),
(this.tanAngle = l),
1e-4 > o(a)
? (this.pos = s + h)
: 0.9999 < o(a)
? (this.pos = t + h)
: ((this.deltaX = (e - t) * o(l)), (this.pos = s - o(this.deltaX)), (this.hGap = o(h / n)), (this.sLeft = new p(s, e, s, t)), (this.sRight = new p(i, e, i, t)));
}
getNextLine() {
if (1e-4 > o(this.sinAngle)) {
if (this.pos < this.right) {
let t = [this.pos, this.top, this.pos, this.bottom];
return (this.pos += this.gap), t;
}
} else if (0.9999 < o(this.sinAngle)) {
if (this.pos < this.bottom) {
let t = [this.left, this.pos, this.right, this.pos];
return (this.pos += this.gap), t;
}
} else {
let e = this.pos - this.deltaX / 2,
s = this.pos + this.deltaX / 2,
i = this.bottom,
h = this.top;
if (this.pos < this.right + this.deltaX) {
for (; (e < this.left && s < this.left) || (e > this.right && s > this.right); )
if (((this.pos += this.hGap), (e = this.pos - this.deltaX / 2), (s = this.pos + this.deltaX / 2), this.pos > this.right + this.deltaX)) return null;
let a = new p(e, i, s, h);
a.compare(this.sLeft) == t().INTERSECTS && ((e = a.xi), (i = a.yi)),
a.compare(this.sRight) == t().INTERSECTS && ((s = a.xi), (h = a.yi)),
0 < this.tanAngle && ((e = this.right - (e - this.left)), (s = this.right - (s - this.left)));
let n = [e, i, s, h];
return (this.pos += this.hGap), n;
}
}
return null;
}
}
class u {
constructor(t, e) {
(this.type = t), (this.text = e);
}
isType(t) {
return this.type === t;
}
}
class g {
constructor(t) {
(this.PARAMS = {
A: ["rx", "ry", "x-axis-rotation", "large-arc-flag", "sweep-flag", "x", "y"],
a: ["rx", "ry", "x-axis-rotation", "large-arc-flag", "sweep-flag", "x", "y"],
C: ["x1", "y1", "x2", "y2", "x", "y"],
c: ["x1", "y1", "x2", "y2", "x", "y"],
H: ["x"],
h: ["x"],
L: ["x", "y"],
l: ["x", "y"],
M: ["x", "y"],
m: ["x", "y"],
Q: ["x1", "y1", "x", "y"],
q: ["x1", "y1", "x", "y"],
S: ["x2", "y2", "x", "y"],
s: ["x2", "y2", "x", "y"],
T: ["x", "y"],
t: ["x", "y"],
V: ["y"],
v: ["y"],
Z: [],
z: [],
}),
(this.COMMAND = 0),
(this.NUMBER = 1),
(this.EOD = 2),
(this.segments = []),
(this.d = t || ""),
this.parseData(t),
this.processPoints();
}
loadFromSegments(t) {
(this.segments = t), this.processPoints();
}
processPoints() {
let t = null,
e = [0, 0];
for (let s, i = 0; i < this.segments.length; i++) {
switch (((s = this.segments[i]), s.key)) {
case "M":
case "L":
case "T":
s.point = [s.data[0], s.data[1]];
break;
case "m":
case "l":
case "t":
s.point = [s.data[0] + e[0], s.data[1] + e[1]];
break;
case "H":
s.point = [s.data[0], e[1]];
break;
case "h":
s.point = [s.data[0] + e[0], e[1]];
break;
case "V":
s.point = [e[0], s.data[0]];
break;
case "v":
s.point = [e[0], s.data[0] + e[1]];
break;
case "z":
case "Z":
t && (s.point = [t[0], t[1]]);
break;
case "C":
s.point = [s.data[4], s.data[5]];
break;
case "c":
s.point = [s.data[4] + e[0], s.data[5] + e[1]];
break;
case "S":
s.point = [s.data[2], s.data[3]];
break;
case "s":
s.point = [s.data[2] + e[0], s.data[3] + e[1]];
break;
case "Q":
s.point = [s.data[2], s.data[3]];
break;
case "q":
s.point = [s.data[2] + e[0], s.data[3] + e[1]];
break;
case "A":
s.point = [s.data[5], s.data[6]];
break;
case "a":
s.point = [s.data[5] + e[0], s.data[6] + e[1]];
}
("m" === s.key || "M" === s.key) && (t = null), s.point && ((e = s.point), !t && (t = s.point)), ("z" === s.key || "Z" === s.key) && (t = null);
}
}
get closed() {
if (void 0 === this._closed) {
this._closed = !1;
for (let t of this.segments) "z" === t.key.toLowerCase() && (this._closed = !0);
}
return this._closed;
}
parseData(t) {
var e = this.tokenize(t),
s = 0,
i = e[s],
h = "BOD";
for (this.segments = []; !i.isType(this.EOD); ) {
var a,
n = [];
if ("BOD" != h) i.isType(this.NUMBER) ? (a = this.PARAMS[h].length) : (s++, (a = this.PARAMS[i.text].length), (h = i.text));
else {
if ("M" != i.text && "m" != i.text) return this.parseData("M0,0" + t);
s++, (a = this.PARAMS[i.text].length), (h = i.text);
}
if (s + a < e.length) {
for (var l, r = s; r < s + a; r++) {
if (((l = e[r]), !l.isType(this.NUMBER))) return void console.error("Parameter type is not a number: " + h + "," + l.text);
n[n.length] = l.text;
}
var o;
if (!this.PARAMS[h]) return void console.error("Unsupported segment type: " + h);
(o = { key: h, data: n }), this.segments.push(o), (s += a), (i = e[s]), "M" == h && (h = "L"), "m" == h && (h = "l");
} else console.error("Path data ended before all parameters were found");
}
}
tokenize(t) {
for (var e = []; "" != t; )
if (t.match(/^([ \t\r\n,]+)/)) t = t.substr(RegExp.$1.length);
else if (t.match(/^([aAcChHlLmMqQsStTvVzZ])/)) (e[e.length] = new u(this.COMMAND, RegExp.$1)), (t = t.substr(RegExp.$1.length));
else {
if (!t.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/)) return console.error("Unrecognized segment command: " + t), null;
(e[e.length] = new u(this.NUMBER, parseFloat(RegExp.$1))), (t = t.substr(RegExp.$1.length));
}
return (e[e.length] = new u(this.EOD, null)), e;
}
}
class d {
constructor(t) {
(this.d = t), (this.parsed = new g(t)), (this._position = [0, 0]), (this.bezierReflectionPoint = null), (this.quadReflectionPoint = null), (this._first = null);
}
get segments() {
return this.parsed.segments;
}
get closed() {
return this.parsed.closed;
}
get linearPoints() {
if (!this._linearPoints) {
const t = [];
let e = [];
for (let s of this.parsed.segments) {
let i = s.key.toLowerCase();
(("m" === i || "z" === i) && (e.length && (t.push(e), (e = [])), "z" === i)) || (s.point && e.push(s.point));
}
e.length && (t.push(e), (e = [])), (this._linearPoints = t);
}
return this._linearPoints;
}
get first() {
return this._first;
}
set first(t) {
this._first = t;
}
setPosition(t, e) {
(this._position = [t, e]), this._first || (this._first = [t, e]);
}
get position() {
return this._position;
}
get x() {
return this._position[0];
}
get y() {
return this._position[1];
}
}
class _ {
constructor(t, e, s, l, r, c) {
const p = a / 180;
if (((this._segIndex = 0), (this._numSegs = 0), t[0] == e[0] && t[1] == e[1])) return;
(this._rx = o(s[0])), (this._ry = o(s[1])), (this._sinPhi = h(l * p)), (this._cosPhi = i(l * p));
var f,
u = (this._cosPhi * (t[0] - e[0])) / 2 + (this._sinPhi * (t[1] - e[1])) / 2,
g = (-this._sinPhi * (t[0] - e[0])) / 2 + (this._cosPhi * (t[1] - e[1])) / 2,
d = this._rx * this._rx * this._ry * this._ry - this._rx * this._rx * g * g - this._ry * this._ry * u * u;
if (0 > d) {
let t = n(1 - d / (this._rx * this._rx * this._ry * this._ry));
(this._rx = t), (this._ry = t), (f = 0);
} else f = (r == c ? -1 : 1) * n(d / (this._rx * this._rx * g * g + this._ry * this._ry * u * u));
let _ = (f * this._rx * g) / this._ry,
y = (-f * this._ry * u) / this._rx;
(this._C = [0, 0]),
(this._C[0] = this._cosPhi * _ - this._sinPhi * y + (t[0] + e[0]) / 2),
(this._C[1] = this._sinPhi * _ + this._cosPhi * y + (t[1] + e[1]) / 2),
(this._theta = this.calculateVectorAngle(1, 0, (u - _) / this._rx, (g - y) / this._ry));
let x = this.calculateVectorAngle((u - _) / this._rx, (g - y) / this._ry, (-u - _) / this._rx, (-g - y) / this._ry);
!c && 0 < x ? (x -= 2 * a) : c && 0 > x && (x += 2 * a),
(this._numSegs = Math.ceil(o(x / (a / 2)))),
(this._delta = x / this._numSegs),
(this._T = ((8 / 3) * h(this._delta / 4) * h(this._delta / 4)) / h(this._delta / 2)),
(this._from = t);
}
getNextSegment() {
var t, e, s;
if (this._segIndex == this._numSegs) return null;
let a = i(this._theta),
n = h(this._theta),
l = this._theta + this._delta,
r = i(l),
o = h(l);
return (
(s = [this._cosPhi * this._rx * r - this._sinPhi * this._ry * o + this._C[0], this._sinPhi * this._rx * r + this._cosPhi * this._ry * o + this._C[1]]),
(t = [this._from[0] + this._T * (-this._cosPhi * this._rx * n - this._sinPhi * this._ry * a), this._from[1] + this._T * (-this._sinPhi * this._rx * n + this._cosPhi * this._ry * a)]),
(e = [s[0] + this._T * (this._cosPhi * this._rx * o + this._sinPhi * this._ry * r), s[1] + this._T * (this._sinPhi * this._rx * o - this._cosPhi * this._ry * r)]),
(this._theta = l),
(this._from = [s[0], s[1]]),
this._segIndex++,
{ cp1: t, cp2: e, to: s }
);
}
calculateVectorAngle(t, e, s, i) {
var h = Math.atan2;
let n = h(e, t),
l = h(i, s);
return l >= n ? l - n : 2 * a - (n - l);
}
}
class y {
constructor(t, e) {
(this.sets = t), (this.closed = e);
}
fit(t) {
let e = [];
for (const s of this.sets) {
let i = s.length,
h = Math.floor(t * i);
if (5 > h) {
if (5 >= i) continue;
h = 5;
}
e.push(this.reduce(s, h));
}
let s = "";
for (const t of e) {
for (let e, i = 0; i < t.length; i++) (e = t[i]), (s += 0 === i ? "M" + e[0] + "," + e[1] : "L" + e[0] + "," + e[1]);
this.closed && (s += "z ");
}
return s;
}
distance(t, e) {
return n(s(t[0] - e[0], 2) + s(t[1] - e[1], 2));
}
reduce(t, e) {
if (t.length <= e) return t;
let s = t.slice(0);
for (; s.length > e; ) {
let t = -1,
e = -1;
for (let i = 1; i < s.length - 1; i++) {
let h = this.distance(s[i - 1], s[i]),
a = this.distance(s[i], s[i + 1]),
l = this.distance(s[i - 1], s[i + 1]),
r = (h + a + l) / 2,
o = n(r * (r - h) * (r - a) * (r - l));
(0 > t || o < t) && ((t = o), (e = i));
}
if (!(0 < e)) break;
s.splice(e, 1);
}
return s;
}
}
class x {
line(t, e, s, i, h) {
let a = this._doubleLine(t, e, s, i, h);
return { type: "path", ops: a };
}
linearPath(t, e, s) {
const i = (t || []).length;
if (2 < i) {
let h = [];
for (let e = 0; e < i - 1; e++) h = h.concat(this._doubleLine(t[e][0], t[e][1], t[e + 1][0], t[e + 1][1], s));
return e && (h = h.concat(this._doubleLine(t[i - 1][0], t[i - 1][1], t[0][0], t[0][1], s))), { type: "path", ops: h };
}
return 2 === i ? this.line(t[0][0], t[0][1], t[1][0], t[1][1], s) : void 0;
}
polygon(t, e) {
return this.linearPath(t, !0, e);
}
rectangle(t, e, s, i, h) {
return this.polygon(
[
[t, e],
[t + s, e],
[t + s, e + i],
[t, e + i],
],
h
);
}
curve(t, e) {
let s = this._curveWithOffset(t, 1 * (1 + 0.2 * e.roughness), e),
i = this._curveWithOffset(t, 1.5 * (1 + 0.22 * e.roughness), e);
return { type: "path", ops: s.concat(i) };
}
ellipse(t, e, s, i, h) {
const n = (2 * a) / h.curveStepCount;
let l = o(s / 2),
r = o(i / 2);
(l += this._getOffset(0.05 * -l, 0.05 * l, h)), (r += this._getOffset(0.05 * -r, 0.05 * r, h));
let c = this._ellipse(n, t, e, l, r, 1, n * this._getOffset(0.1, this._getOffset(0.4, 1, h), h), h),
p = this._ellipse(n, t, e, l, r, 1.5, 0, h);
return { type: "path", ops: c.concat(p) };
}
arc(t, e, s, n, l, c, p, f, u) {
let g = t,
d = e,
_ = o(s / 2),
y = o(n / 2);
(_ += this._getOffset(0.01 * -_, 0.01 * _, u)), (y += this._getOffset(0.01 * -y, 0.01 * y, u));
let x = l,
b = c;
for (; 0 > x; ) (x += 2 * a), (b += 2 * a);
b - x > 2 * a && ((x = 0), (b = 2 * a));
let m = (2 * a) / u.curveStepCount,
w = r(m / 2, (b - x) / 2),
O = this._arc(w, g, d, _, y, x, b, 1, u),
S = this._arc(w, g, d, _, y, x, b, 1.5, u),
v = O.concat(S);
return (
p &&
(f
? ((v = v.concat(this._doubleLine(g, d, g + _ * i(x), d + y * h(x), u))), (v = v.concat(this._doubleLine(g, d, g + _ * i(b), d + y * h(b), u))))
: (v.push({ op: "lineTo", data: [g, d] }), v.push({ op: "lineTo", data: [g + _ * i(x), d + y * h(x)] }))),
{ type: "path", ops: v }
);
}
hachureFillArc(t, e, s, n, l, r, c) {
let p = t,
f = e,
u = o(s / 2),
g = o(n / 2);
(u += this._getOffset(0.01 * -u, 0.01 * u, c)), (g += this._getOffset(0.01 * -g, 0.01 * g, c));
let d = l,
_ = r;
for (; 0 > d; ) (d += 2 * a), (_ += 2 * a);
_ - d > 2 * a && ((d = 0), (_ = 2 * a));
let y = (_ - d) / c.curveStepCount,
x = [],
b = [];
for (let t = d; t <= _; t += y) x.push(p + u * i(t)), b.push(f + g * h(t));
return x.push(p + u * i(_)), b.push(f + g * h(_)), x.push(p), b.push(f), this.hachureFillShape(x, b, c);
}
solidFillShape(t, e, s) {
let i = [];
if (t && e && t.length && e.length && t.length === e.length) {
let a = s.maxRandomnessOffset || 0;
const n = t.length;
if (2 < n) {
i.push({ op: "move", data: [t[0] + this._getOffset(-a, a, s), e[0] + this._getOffset(-a, a, s)] });
for (var h = 1; h < n; h++) i.push({ op: "lineTo", data: [t[h] + this._getOffset(-a, a, s), e[h] + this._getOffset(-a, a, s)] });
}
}
return { type: "fillPath", ops: i };
}
hachureFillShape(t, s, n) {
let o = [];
if (t && s && t.length && s.length) {
let c = t[0],
p = t[0],
u = s[0],
g = s[0];
for (let e = 1; e < t.length; e++) (c = r(c, t[e])), (p = l(p, t[e])), (u = r(u, s[e])), (g = l(g, s[e]));
const d = n.hachureAngle;
let _ = n.hachureGap;
0 > _ && (_ = 4 * n.strokeWidth), (_ = l(_, 0.1));
const y = (d % 180) * (a / 180),
x = i(y),
b = h(y),
m = e(y),
w = new f(u - 1, g + 1, c - 1, p + 1, _, b, x, m);
for (let e; null != (e = w.getNextLine()); ) {
let i = this._getIntersectingLines(e, t, s);
for (let t = 0; t < i.length; t++)
if (t < i.length - 1) {
let e = i[t],
s = i[t + 1];
o = o.concat(this._doubleLine(e[0], e[1], s[0], s[1], n));
}
}
}
return { type: "fillSketch", ops: o };
}
hachureFillEllipse(t, s, i, h, l) {
let r = [],
c = o(i / 2),
p = o(h / 2);
(c += this._getOffset(0.05 * -c, 0.05 * c, l)), (p += this._getOffset(0.05 * -p, 0.05 * p, l));
let f = l.hachureAngle,
u = l.hachureGap;
0 >= u && (u = 4 * l.strokeWidth);
let g = l.fillWeight;
0 > g && (g = l.strokeWidth / 2);
let d = e((f % 180) * (a / 180)),
_ = p / c,
y = n(_ * d * _ * d + 1),
x = (_ * d) / y,
b = 1 / y,
m = u / ((c * p) / n(p * b * (p * b) + c * x * (c * x)) / c),
w = n(c * c - (t - c + m) * (t - c + m));
for (var O = t - c + m; O < t + c; O += m) {
w = n(c * c - (t - O) * (t - O));
let e = this._affine(O, s - w, t, s, x, b, _),
i = this._affine(O, s + w, t, s, x, b, _);
r = r.concat(this._doubleLine(e[0], e[1], i[0], i[1], l));
}
return { type: "fillSketch", ops: r };
}
svgPath(t, e) {
t = (t || "").replace(/\n/g, " ").replace(/(-)/g, " -").replace(/(-\s)/g, "-").replace("/(ss)/g", " ");
let s = new d(t);
if (e.simplification) {
let t = new y(s.linearPoints, s.closed),
i = t.fit(e.simplification);
s = new d(i);
}
let i = [],
h = s.segments || [];
for (let t = 0; t < h.length; t++) {
let a = h[t],
n = 0 < t ? h[t - 1] : null,
l = this._processSegment(s, a, n, e);
l && l.length && (i = i.concat(l));
}
return { type: "path", ops: i };
}
_bezierTo(t, e, s, i, h, a, n, l) {
let r = [],
o = [l.maxRandomnessOffset || 1, (l.maxRandomnessOffset || 1) + 0.5],
c = null;
for (let p = 0; 2 > p; p++)
0 === p ? r.push({ op: "move", data: [n.x, n.y] }) : r.push({ op: "move", data: [n.x + this._getOffset(-o[0], o[0], l), n.y + this._getOffset(-o[0], o[0], l)] }),
(c = [h + this._getOffset(-o[p], o[p], l), a + this._getOffset(-o[p], o[p], l)]),
r.push({ op: "bcurveTo", data: [t + this._getOffset(-o[p], o[p], l), e + this._getOffset(-o[p], o[p], l), s + this._getOffset(-o[p], o[p], l), i + this._getOffset(-o[p], o[p], l), c[0], c[1]] });
return n.setPosition(c[0], c[1]), r;
}
_processSegment(t, e, s, i) {
let h = [];
switch (e.key) {
case "M":
case "m": {
let s = "m" === e.key;
if (2 <= e.data.length) {
let a = +e.data[0],
n = +e.data[1];
s && ((a += t.x), (n += t.y));
let l = 1 * (i.maxRandomnessOffset || 0);
(a += this._getOffset(-l, l, i)), (n += this._getOffset(-l, l, i)), t.setPosition(a, n), h.push({ op: "move", data: [a, n] });
}
break;
}
case "L":
case "l": {
let s = "l" === e.key;
if (2 <= e.data.length) {
let a = +e.data[0],
n = +e.data[1];
s && ((a += t.x), (n += t.y)), (h = h.concat(this._doubleLine(t.x, t.y, a, n, i))), t.setPosition(a, n);
}
break;
}
case "H":
case "h": {
const s = "h" === e.key;
if (e.data.length) {
let a = +e.data[0];
s && (a += t.x), (h = h.concat(this._doubleLine(t.x, t.y, a, t.y, i))), t.setPosition(a, t.y);
}
break;
}
case "V":
case "v": {
const s = "v" === e.key;
if (e.data.length) {
let a = +e.data[0];
s && (a += t.y), (h = h.concat(this._doubleLine(t.x, t.y, t.x, a, i))), t.setPosition(t.x, a);
}
break;
}
case "Z":
case "z":
t.first && ((h = h.concat(this._doubleLine(t.x, t.y, t.first[0], t.first[1], i))), t.setPosition(t.first[0], t.first[1]), (t.first = null));
break;
case "C":
case "c": {
const s = "c" === e.key;
if (6 <= e.data.length) {
let a = +e.data[0],
n = +e.data[1],
l = +e.data[2],
r = +e.data[3],
o = +e.data[4],
c = +e.data[5];
s && ((a += t.x), (l += t.x), (o += t.x), (n += t.y), (r += t.y), (c += t.y));
let p = this._bezierTo(a, n, l, r, o, c, t, i);
(h = h.concat(p)), (t.bezierReflectionPoint = [o + (o - l), c + (c - r)]);
}
break;
}
case "S":
case "s": {
const n = "s" === e.key;
if (4 <= e.data.length) {
let l = +e.data[0],
r = +e.data[1],
o = +e.data[2],
c = +e.data[3];
n && ((l += t.x), (o += t.x), (r += t.y), (c += t.y));
let p = l,
f = r,
u = s ? s.key : "";
var a = null;
("c" == u || "C" == u || "s" == u || "S" == u) && (a = t.bezierReflectionPoint), a && ((p = a[0]), (f = a[1]));
let g = this._bezierTo(p, f, l, r, o, c, t, i);
(h = h.concat(g)), (t.bezierReflectionPoint = [o + (o - l), c + (c - r)]);
}
break;
}
case "Q":
case "q": {
const s = "q" === e.key;
if (4 <= e.data.length) {
let a = +e.data[0],
n = +e.data[1],
l = +e.data[2],
r = +e.data[3];
s && ((a += t.x), (l += t.x), (n += t.y), (r += t.y));
let o = 1 * (1 + 0.2 * i.roughness),
c = 1.5 * (1 + 0.22 * i.roughness);
h.push({ op: "move", data: [t.x + this._getOffset(-o, o, i), t.y + this._getOffset(-o, o, i)] });
let p = [l + this._getOffset(-o, o, i), r + this._getOffset(-o, o, i)];
h.push({ op: "qcurveTo", data: [a + this._getOffset(-o, o, i), n + this._getOffset(-o, o, i), p[0], p[1]] }),
h.push({ op: "move", data: [t.x + this._getOffset(-c, c, i), t.y + this._getOffset(-c, c, i)] }),
(p = [l + this._getOffset(-c, c, i), r + this._getOffset(-c, c, i)]),
h.push({ op: "qcurveTo", data: [a + this._getOffset(-c, c, i), n + this._getOffset(-c, c, i), p[0], p[1]] }),
t.setPosition(p[0], p[1]),
(t.quadReflectionPoint = [l + (l - a), r + (r - n)]);
}
break;
}
case "T":
case "t": {
const n = "t" === e.key;
if (2 <= e.data.length) {
let l = +e.data[0],
r = +e.data[1];
n && ((l += t.x), (r += t.y));
let o = l,
c = r,
p = s ? s.key : "";
(a = null), ("q" == p || "Q" == p || "t" == p || "T" == p) && (a = t.quadReflectionPoint), a && ((o = a[0]), (c = a[1]));
let f = 1 * (1 + 0.2 * i.roughness),
u = 1.5 * (1 + 0.22 * i.roughness);
h.push({ op: "move", data: [t.x + this._getOffset(-f, f, i), t.y + this._getOffset(-f, f, i)] });
let g = [l + this._getOffset(-f, f, i), r + this._getOffset(-f, f, i)];
h.push({ op: "qcurveTo", data: [o + this._getOffset(-f, f, i), c + this._getOffset(-f, f, i), g[0], g[1]] }),
h.push({ op: "move", data: [t.x + this._getOffset(-u, u, i), t.y + this._getOffset(-u, u, i)] }),
(g = [l + this._getOffset(-u, u, i), r + this._getOffset(-u, u, i)]),
h.push({ op: "qcurveTo", data: [o + this._getOffset(-u, u, i), c + this._getOffset(-u, u, i), g[0], g[1]] }),
t.setPosition(g[0], g[1]),
(t.quadReflectionPoint = [l + (l - o), r + (r - c)]);
}
break;
}
case "A":
case "a": {
const s = "a" === e.key;
if (7 <= e.data.length) {
let a = +e.data[0],
n = +e.data[1],
l = +e.data[2],
r = +e.data[3],
o = +e.data[4],
c = +e.data[5],
p = +e.data[6];
if ((s && ((c += t.x), (p += t.y)), c == t.x && p == t.y)) break;
if (0 == a || 0 == n) (h = h.concat(this._doubleLine(t.x, t.y, c, p, i))), t.setPosition(c, p);
else {
i.maxRandomnessOffset;
for (let e = 0; 1 > e; e++) {
let e = new _([t.x, t.y], [c, p], [a, n], l, !!r, !!o),
s = e.getNextSegment();
for (; s; ) {
let a = this._bezierTo(s.cp1[0], s.cp1[1], s.cp2[0], s.cp2[1], s.to[0], s.to[1], t, i);
(h = h.concat(a)), (s = e.getNextSegment());
}
}
}
}
break;
}
}
return h;
}
_getOffset(t, e, s) {
return s.roughness * (Math.random() * (e - t) + t);
}
_affine(t, e, s, i, h, a, n) {
return [-s * a - i * h + s + a * t + h * e, n * (s * h - i * a) + i + -n * h * t + n * a * e];
}
_doubleLine(t, e, s, i, h) {
const a = this._line(t, e, s, i, h, !0, !1),
n = this._line(t, e, s, i, h, !0, !0);
return a.concat(n);
}
_line(t, e, i, h, a, l, r) {
const o = s(t - i, 2) + s(e - h, 2);
let c = a.maxRandomnessOffset || 0;
c * c * 100 > o && (c = n(o) / 10);
const p = c / 2,
f = 0.2 + 0.2 * Math.random();
let u = (a.bowing * a.maxRandomnessOffset * (h - e)) / 200,
g = (a.bowing * a.maxRandomnessOffset * (t - i)) / 200;
(u = this._getOffset(-u, u, a)), (g = this._getOffset(-g, g, a));
let d = [];
return (
l && (r ? d.push({ op: "move", data: [t + this._getOffset(-p, p, a), e + this._getOffset(-p, p, a)] }) : d.push({ op: "move", data: [t + this._getOffset(-c, c, a), e + this._getOffset(-c, c, a)] })),
r
? d.push({
op: "bcurveTo",
data: [
u + t + (i - t) * f + this._getOffset(-p, p, a),
g + e + (h - e) * f + this._getOffset(-p, p, a),
u + t + 2 * (i - t) * f + this._getOffset(-p, p, a),
g + e + 2 * (h - e) * f + this._getOffset(-p, p, a),
i + this._getOffset(-p, p, a),
h + this._getOffset(-p, p, a),
],
})
: d.push({
op: "bcurveTo",
data: [
u + t + (i - t) * f + this._getOffset(-c, c, a),
g + e + (h - e) * f + this._getOffset(-c, c, a),
u + t + 2 * (i - t) * f + this._getOffset(-c, c, a),
g + e + 2 * (h - e) * f + this._getOffset(-c, c, a),
i + this._getOffset(-c, c, a),
h + this._getOffset(-c, c, a),
],
}),
d
);
}
_curve(t, e, s) {
const i = t.length;
let h = [];
if (3 < i) {
const a = [],
n = 1 - s.curveTightness;
h.push({ op: "move", data: [t[1][0], t[1][1]] });
for (let e = 1; e + 2 < i; e++) {
const s = t[e];
(a[0] = [s[0], s[1]]),
(a[1] = [s[0] + (n * t[e + 1][0] - n * t[e - 1][0]) / 6, s[1] + (n * t[e + 1][1] - n * t[e - 1][1]) / 6]),
(a[2] = [t[e + 1][0] + (n * t[e][0] - n * t[e + 2][0]) / 6, t[e + 1][1] + (n * t[e][1] - n * t[e + 2][1]) / 6]),
(a[3] = [t[e + 1][0], t[e + 1][1]]),
h.push({ op: "bcurveTo", data: [a[1][0], a[1][1], a[2][0], a[2][1], a[3][0], a[3][1]] });
}
if (e && 2 === e.length) {
let t = s.maxRandomnessOffset;
h.push({ ops: "lineTo", data: [e[0] + this._getOffset(-t, t, s), e[1] + +this._getOffset(-t, t, s)] });
}
} else
3 === i
? (h.push({ op: "move", data: [t[1][0], t[1][1]] }), h.push({ op: "bcurveTo", data: [t[1][0], t[1][1], t[2][0], t[2][1], t[2][0], t[2][1]] }))
: 2 === i && (h = h.concat(this._doubleLine(t[0][0], t[0][1], t[1][0], t[1][1], s)));
return h;
}
_ellipse(t, e, s, n, l, r, o, c) {
const p = this._getOffset(-0.5, 0.5, c) - a / 2,
f = [];
f.push([this._getOffset(-r, r, c) + e + 0.9 * n * i(p - t), this._getOffset(-r, r, c) + s + 0.9 * l * h(p - t)]);
for (let o = p; o < 2 * a + p - 0.01; o += t) f.push([this._getOffset(-r, r, c) + e + n * i(o), this._getOffset(-r, r, c) + s + l * h(o)]);
return (
f.push([this._getOffset(-r, r, c) + e + n * i(p + 2 * a + 0.5 * o), this._getOffset(-r, r, c) + s + l * h(p + 2 * a + 0.5 * o)]),
f.push([this._getOffset(-r, r, c) + e + 0.98 * n * i(p + o), this._getOffset(-r, r, c) + s + 0.98 * l * h(p + o)]),
f.push([this._getOffset(-r, r, c) + e + 0.9 * n * i(p + 0.5 * o), this._getOffset(-r, r, c) + s + 0.9 * l * h(p + 0.5 * o)]),
this._curve(f, null, c)
);
}
_curveWithOffset(t, e, s) {
const i = [
[t[0][0] + this._getOffset(-e, e, s), t[0][1] + this._getOffset(-e, e, s)],
[t[0][0] + this._getOffset(-e, e, s), t[0][1] + this._getOffset(-e, e, s)],
];
for (let h = 1; h < t.length; h++)
i.push([t[h][0] + this._getOffset(-e, e, s), t[h][1] + this._getOffset(-e, e, s)]), h === t.length - 1 && i.push([t[h][0] + this._getOffset(-e, e, s), t[h][1] + this._getOffset(-e, e, s)]);
return this._curve(i, null, s);
}
_arc(t, e, s, a, n, l, r, o, c) {
const p = l + this._getOffset(-0.1, 0.1, c),
f = [];
f.push([this._getOffset(-o, o, c) + e + 0.9 * a * i(p - t), this._getOffset(-o, o, c) + s + 0.9 * n * h(p - t)]);
for (let l = p; l <= r; l += t) f.push([this._getOffset(-o, o, c) + e + a * i(l), this._getOffset(-o, o, c) + s + n * h(l)]);
return f.push([e + a * i(r), s + n * h(r)]), f.push([e + a * i(r), s + n * h(r)]), this._curve(f, null, c);
}
_getIntersectingLines(e, s, i) {
let h = [];
for (var a = new p(e[0], e[1], e[2], e[3]), n = 0; n < s.length; n++) {
let e = new p(s[n], i[n], s[(n + 1) % s.length], i[(n + 1) % s.length]);
a.compare(e) == t().INTERSECTS && h.push([a.xi, a.yi]);
}
return h;
}
}
self._roughScript = self.document && self.document.currentScript && self.document.currentScript.src;
class b {
constructor(t, e) {
(this.config = t || {}),
(this.canvas = e),
(this.defaultOptions = {
maxRandomnessOffset: 2,
roughness: 1,
bowing: 1,
stroke: "#000",
strokeWidth: 1,
curveTightness: 0,
curveStepCount: 9,
fill: null,
fillStyle: "hachure",
fillWeight: -1,
hachureAngle: -41,
hachureGap: -1,
}),
this.config.options && (this.defaultOptions = this._options(this.config.options));
}
_options(t) {
return t ? Object.assign({}, this.defaultOptions, t) : this.defaultOptions;
}
_drawable(t, e, s) {
return { shape: t, sets: e || [], options: s || this.defaultOptions };
}
get lib() {
if (!this._renderer)
if (self && self.workly && this.config.async && !this.config.noWorker) {
Function.prototype.toString;
const t = this.config.worklyURL || "https://fastly.jsdelivr.net/gh/pshihn/workly/dist/workly.min.js",
e = this.config.roughURL || self._roughScript;
if (e && t) {
let s = `importScripts('${t}','${e}');\nworkly.expose(self.rough.createRenderer());`,
i = URL.createObjectURL(new Blob([s]));
this._renderer = workly.proxy(i);
} else this._renderer = new x();
} else this._renderer = new x();
return this._renderer;
}
line(t, e, s, i, h) {
const a = this._options(h);
return this._drawable("line", [this.lib.line(t, e, s, i, a)], a);
}
rectangle(t, e, s, i, h) {
const a = this._options(h),
n = [];
if (a.fill) {
const h = [t, t + s, t + s, t],
l = [e, e, e + i, e + i];
"solid" === a.fillStyle ? n.push(this.lib.solidFillShape(h, l, a)) : n.push(this.lib.hachureFillShape(h, l, a));
}
return n.push(this.lib.rectangle(t, e, s, i, a)), this._drawable("rectangle", n, a);
}
ellipse(t, e, s, i, h) {
const a = this._options(h),
n = [];
if (a.fill)
if ("solid" === a.fillStyle) {
const h = this.lib.ellipse(t, e, s, i, a);
(h.type = "fillPath"), n.push(h);
} else n.push(this.lib.hachureFillEllipse(t, e, s, i, a));
return n.push(this.lib.ellipse(t, e, s, i, a)), this._drawable("ellipse", n, a);
}
circle(t, e, s, i) {
let h = this.ellipse(t, e, s, s, i);
return (h.shape = "circle"), h;
}
linearPath(t, e) {
const s = this._options(e);
return this._drawable("linearPath", [this.lib.linearPath(t, !1, s)], s);
}
polygon(t, e) {
const s = this._options(e),
i = [];
if (s.fill) {
let e = [],
h = [];
for (let s of t) e.push(s[0]), h.push(s[1]);
"solid" === s.fillStyle ? i.push(this.lib.solidFillShape(e, h, s)) : i.push(this.lib.hachureFillShape(e, h, s));
}
return i.push(this.lib.linearPath(t, !0, s)), this._drawable("polygon", i, s);
}
arc(t, e, s, i, h, a, n, l) {
const r = this._options(l),
o = [];
if (n && r.fill)
if ("solid" === r.fillStyle) {
let n = this.lib.arc(t, e, s, i, h, a, !0, !1, r);
(n.type = "fillPath"), o.push(n);
} else o.push(this.lib.hachureFillArc(t, e, s, i, h, a, r));
return o.push(this.lib.arc(t, e, s, i, h, a, n, !0, r)), this._drawable("arc", o, r);
}
curve(t, e) {
const s = this._options(e);
return this._drawable("curve", [this.lib.curve(t, s)], s);
}
path(t, e) {
const s = this._options(e),
i = [];
if (!t) return this._drawable("path", i, s);
if (s.fill)
if ("solid" === s.fillStyle) i.push({ type: "path2Dfill", path: t });
else {
const e = this._computePathSize(t);
let h = [0, e[0], e[0], 0],
a = [0, 0, e[1], e[1]],
n = this.lib.hachureFillShape(h, a, s);
(n.type = "path2Dpattern"), (n.size = e), (n.path = t), i.push(n);
}
return i.push(this.lib.svgPath(t, s)), this._drawable("path", i, s);
}
_computePathSize(t) {
let e = [0, 0];
if (self.document)
try {
const s = "http://www.w3.org/2000/svg";
let i = self.document.createElementNS(s, "svg");
i.setAttribute("width", "0"), i.setAttribute("height", "0");
let h = self.document.createElementNS(s, "path");
h.setAttribute("d", t), i.appendChild(h), self.document.body.appendChild(i);
let a = h.getBBox();
a && ((e[0] = a.width || 0), (e[1] = a.height || 0)), self.document.body.removeChild(i);
} catch (t) {}
return e[0] * e[1] || (e = [this.canvas.width || 100, this.canvas.height || 100]), (e[0] = r(4 * e[0], this.canvas.width)), (e[1] = r(4 * e[1], this.canvas.height)), e;
}
}
class m extends b {
async line(t, e, s, i, h) {
const a = this._options(h);
return this._drawable("line", [await this.lib.line(t, e, s, i, a)], a);
}
async rectangle(t, e, s, i, h) {
const a = this._options(h),
n = [];
if (a.fill) {
const h = [t, t + s, t + s, t],
l = [e, e, e + i, e + i];
"solid" === a.fillStyle ? n.push(await this.lib.solidFillShape(h, l, a)) : n.push(await this.lib.hachureFillShape(h, l, a));
}
return n.push(await this.lib.rectangle(t, e, s, i, a)), this._drawable("rectangle", n, a);
}
async ellipse(t, e, s, i, h) {
const a = this._options(h),
n = [];
if (a.fill)
if ("solid" === a.fillStyle) {
const h = await this.lib.ellipse(t, e, s, i, a);
(h.type = "fillPath"), n.push(h);
} else n.push(await this.lib.hachureFillEllipse(t, e, s, i, a));
return n.push(await this.lib.ellipse(t, e, s, i, a)), this._drawable("ellipse", n, a);
}
async circle(t, e, s, i) {
let h = await this.ellipse(t, e, s, s, i);
return (h.shape = "circle"), h;
}
async linearPath(t, e) {
const s = this._options(e);
return this._drawable("linearPath", [await this.lib.linearPath(t, !1, s)], s);
}
async polygon(t, e) {
const s = this._options(e),
i = [];
if (s.fill) {
let e = [],
h = [];
for (let s of t) e.push(s[0]), h.push(s[1]);
"solid" === s.fillStyle ? i.push(await this.lib.solidFillShape(e, h, s)) : i.push(await this.lib.hachureFillShape(e, h, s));
}
return i.push(await this.lib.linearPath(t, !0, s)), this._drawable("polygon", i, s);
}
async arc(t, e, s, i, h, a, n, l) {
const r = this._options(l),
o = [];
if (n && r.fill)
if ("solid" === r.fillStyle) {
let n = await this.lib.arc(t, e, s, i, h, a, !0, !1, r);
(n.type = "fillPath"), o.push(n);
} else o.push(await this.lib.hachureFillArc(t, e, s, i, h, a, r));
return o.push(await this.lib.arc(t, e, s, i, h, a, n, !0, r)), this._drawable("arc", o, r);
}
async curve(t, e) {
const s = this._options(e);
return this._drawable("curve", [await this.lib.curve(t, s)], s);
}
async path(t, e) {
const s = this._options(e),
i = [];
if (!t) return this._drawable("path", i, s);
if (s.fill)
if ("solid" === s.fillStyle) i.push({ type: "path2Dfill", path: t });
else {
const e = this._computePathSize(t);
let h = [0, e[0], e[0], 0],
a = [0, 0, e[1], e[1]],
n = await this.lib.hachureFillShape(h, a, s);
(n.type = "path2Dpattern"), (n.size = e), (n.path = t), i.push(n);
}
return i.push(await this.lib.svgPath(t, s)), this._drawable("path", i, s);
}
}
class w {
constructor(t, e) {
(this.canvas = t), (this.ctx = this.canvas.getContext("2d")), this._init(e);
}
_init(t) {
this.gen = new b(t, this.canvas);
}
get generator() {
return this.gen;
}
static createRenderer() {
return new x();
}
line(t, e, s, i, h) {
let a = this.gen.line(t, e, s, i, h);
return this.draw(a), a;
}
rectangle(t, e, s, i, h) {
let a = this.gen.rectangle(t, e, s, i, h);
return this.draw(a), a;
}
ellipse(t, e, s, i, h) {
let a = this.gen.ellipse(t, e, s, i, h);
return this.draw(a), a;
}
circle(t, e, s, i) {
let h = this.gen.circle(t, e, s, i);
return this.draw(h), h;
}
linearPath(t, e) {
let s = this.gen.linearPath(t, e);
return this.draw(s), s;
}
polygon(t, e) {
let s = this.gen.polygon(t, e);
return this.draw(s), s;
}
arc(t, e, s, i, h, a, n, l) {
let r = this.gen.arc(t, e, s, i, h, a, n, l);
return this.draw(r), r;
}
curve(t, e) {
let s = this.gen.curve(t, e);
return this.draw(s), s;
}
path(t, e) {
let s = this.gen.path(t, e);
return this.draw(s), s;
}
draw(t) {
let e = t.sets || [],
s = t.options || this.gen.defaultOptions,
i = this.ctx;
for (let t of e)
switch (t.type) {
case "path":
i.save(), (i.strokeStyle = s.stroke), (i.lineWidth = s.strokeWidth), this._drawToContext(i, t), i.restore();
break;
case "fillPath":
i.save(), (i.fillStyle = s.fill), this._drawToContext(i, t, s), i.restore();
break;
case "fillSketch":
this._fillSketch(i, t, s);
break;
case "path2Dfill": {
this.ctx.save(), (this.ctx.fillStyle = s.fill);
let e = new Path2D(t.path);
this.ctx.fill(e), this.ctx.restore();
break;
}
case "path2Dpattern": {
let e = t.size,
i = document.createElement("canvas");
(i.width = e[0]), (i.height = e[1]), this._fillSketch(i.getContext("2d"), t, s), this.ctx.save(), (this.ctx.fillStyle = this.ctx.createPattern(i, "repeat"));
let h = new Path2D(t.path);
this.ctx.fill(h), this.ctx.restore();
break;
}
}
}
_fillSketch(t, e, s) {
let i = s.fillWeight;
0 > i && (i = s.strokeWidth / 2), t.save(), (t.strokeStyle = s.fill), (t.lineWidth = i), this._drawToContext(t, e), t.restore();
}
_drawToContext(t, e) {
t.beginPath();
for (let s of e.ops) {
const e = s.data;
switch (s.op) {
case "move":
t.moveTo(e[0], e[1]);
break;
case "bcurveTo":
t.bezierCurveTo(e[0], e[1], e[2], e[3], e[4], e[5]);
break;
case "qcurveTo":
t.quadraticCurveTo(e[0], e[1], e[2], e[3]);
break;
case "lineTo":
t.lineTo(e[0], e[1]);
}
}
"fillPath" === e.type ? t.fill() : t.stroke();
}
}
class O extends w {
_init(t) {
this.gen = new m(t, this.canvas);
}
async line(t, e, s, i, h) {
let a = await this.gen.line(t, e, s, i, h);
return this.draw(a), a;
}
async rectangle(t, e, s, i, h) {
let a = await this.gen.rectangle(t, e, s, i, h);
return this.draw(a), a;
}
async ellipse(t, e, s, i, h) {
let a = await this.gen.ellipse(t, e, s, i, h);
return this.draw(a), a;
}
async circle(t, e, s, i) {
let h = await this.gen.circle(t, e, s, i);
return this.draw(h), h;
}
async linearPath(t, e) {
let s = await this.gen.linearPath(t, e);
return this.draw(s), s;
}
async polygon(t, e) {
let s = await this.gen.polygon(t, e);
return this.draw(s), s;
}
async arc(t, e, s, i, h, a, n, l) {
let r = await this.gen.arc(t, e, s, i, h, a, n, l);
return this.draw(r), r;
}
async curve(t, e) {
let s = await this.gen.curve(t, e);
return this.draw(s), s;
}
async path(t, e) {
let s = await this.gen.path(t, e);
return this.draw(s), s;
}
}
var S = { canvas: (t, e) => (e && e.async ? new O(t, e) : new w(t, e)), createRenderer: () => w.createRenderer(), generator: (t, e) => (t && t.async ? new m(t, e) : new b(t, e)) };
return S;
})(),
e = function (t) {
for (var e = arguments.length, s = Array(e > 1 ? e - 1 : 0), i = 1; i < e; i++) s[i - 1] = arguments[i];
return Object.assign.apply(Object, [{}, t].concat(s));
},
s = function (t) {
var e = t.h,
s = t.s,
i = t.l,
h = t.a;
return "hsla(" + e + "," + s + "%," + i + "%," + h + ")";
},
i = e.bind(null, { h: 0, s: 100, l: 100, a: 1 }),
h = e.bind(null, { x: 0, y: 0 }),
a = e.bind(null, { pos: h(), vel: h(), angle: 0, speed: 0, radius: 0, rotation: 0, color: i() }),
n = [i({ h: 20, s: 100, l: 50 }), i({ h: 200, l: 50 }), i({ h: 300, l: 50 }), i({ h: 100, l: 40 })],
l = function e(i) {
i.animation && i.animation(e.bind(null, i));
var h = i.ctx,
a = h.canvas,
n = t.canvas(a);
h.clearRect(0, 0, a.width, a.height),
i.particles.map(function (t, e) {
(t.pos.y -= t.speed),
(t.pos.x = e % 2 ? t.pos.x + 0.2 * Math.sin(t.angle) : t.pos.x - 0.2 * Math.cos(t.angle)),
(t.angle += 0.01),
n.circle(t.pos.x, t.pos.y, t.radius, { fill: s(t.color), roughness: 1.5 * Math.random(), hachureGap: t.hachureGap, hachureAngle: t.hachureAngle }),
n.line(t.pos.x, t.pos.y + 1.2 * t.radius, t.pos.x, t.pos.y + t.radius / 2, { bowing: 3 * Math.random() }),
t.pos.y + 3 * t.radius < 0 && ((t.pos.y = a.height + 3 * t.radius), (t.pos.x = Math.random() * (a.width - t.radius)));
});
},
r = { animation: requestAnimationFrame.bind(null), ctx: document.createElement("canvas").getContext("2d"), title: "Brian Douglas", rotation: 0, particles: [] };
!(function (t) {
var e = t.ctx.canvas;
e.setAttribute("style", "pointer-events:none;position:fixed;z-index:-510;left:0;top:0;right:0;bottom:0;"), (e.width = window.innerWidth), (e.height = window.innerHeight), document.body.appendChild(e);
for (var s = 50; s--; )
t.particles.push(
a({
pos: { x: Math.random() * e.width, y: Math.random() * e.height },
speed: Math.random() + 0.2,
radius: 60 * Math.random() + 20,
color: n[Math.floor(Math.random() * n.length)],
hachureAngle: 90 * Math.random(),
hachureGap: 8 * Math.random() + 1,
})
);
l(t);
})(r),
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||
window.addEventListener("resize", function () {
(r.ctx.canvas.width = window.innerWidth), (r.ctx.canvas.height = window.innerHeight);
});
})();