UNPKG

@visactor/vrender-kits

Version:

```typescript import { xxx } from '@visactor/vrender-kits'; ```

1,630 lines (1,624 loc) 797 kB
import { CustomPath2D, injectable, inject, DefaultCanvasArcRender, ARC_NUMBER_TYPE, drawArcPath, DefaultCanvasAreaRender, drawAreaSegments, DefaultCanvasCircleRender, CIRCLE_NUMBER_TYPE, DefaultCanvasLineRender, LINE_NUMBER_TYPE, DefaultCanvasPathRender, PATH_NUMBER_TYPE, DefaultCanvasRectRender, RECT_NUMBER_TYPE, DefaultCanvasSymbolRender, SYMBOL_NUMBER_TYPE, ContainerModule, GraphicRender, graphicCreator, Group, clock, application, WILDCARD, DefaultFillStyle, DefaultStrokeStyle, DefaultTextStyle, matrixAllocate, transformMat4, createColor, getScaledStroke, createConicalGradient, BaseCanvas, CanvasFactory, Context2dFactory, ContributionProvider, named, DrawContribution, PickItemInterceptor, PickServiceInterceptor, DefaultPickService, canvasAllocate, GROUP_NUMBER_TYPE, bindContributionProvider, PickerService, WindowHandlerContribution, BaseWindowHandlerContribution, BaseEnvContribution, Generator, EnvContribution, container, VGlobal, EmptyContext2d, ArcRender, AreaRender, AREA_NUMBER_TYPE, CircleRender, GLYPH_NUMBER_TYPE, GlyphRender, IMAGE_NUMBER_TYPE, LineRender, PolygonRender, POLYGON_NUMBER_TYPE, PathRender, RectRender, SymbolRender, TEXT_NUMBER_TYPE, rafBasedSto, vglobal, RafBasedSTO, BaseRender, mat4Allocate, TextRender, textLayoutOffsetY, textDrawOffsetX, RichTextRender, RICHTEXT_NUMBER_TYPE, ImageRender, Rect3DRender, RECT3D_NUMBER_TYPE, Arc3dRender, ARC3D_NUMBER_TYPE, Pyramid3dRender, PYRAMID3D_NUMBER_TYPE, Image as Image$1, ResourceLoader, ImageRenderContribution, DefaultCanvasImageRender, getTheme, DefaultRectRenderContribution, BaseRenderContributionTime, isBrowserEnv, registerArcGraphic, arcModule, registerArc3dGraphic, registerDirectionalLight, registerOrthoCamera, arc3dModule, registerAreaGraphic, areaModule, registerCircleGraphic, circleModule, registerGlyphGraphic, glyphModule, registerGroupGraphic, registerImageGraphic, imageModule, registerLineGraphic, lineModule, registerPathGraphic, pathModule, registerPolygonGraphic, polygonModule, registerPyramid3dGraphic, pyramid3dModule, registerRectGraphic, rectModule, registerRect3dGraphic, rect3dModule, registerRichtextGraphic, richtextModule, registerShadowRootGraphic, registerSymbolGraphic, symbolModule, registerTextGraphic, textModule, StarRender, STAR_NUMBER_TYPE, registerStarGraphic, starModule, registerWrapTextGraphic, NOWORK_ANIMATE_ATTR, Rect } from '@visactor/vrender-core'; import { isString, isArray, EventEmitter, Matrix, Logger, getContextFont, pi2, pi, AABBBounds, isValidNumber, isNumber, isFunction } from '@visactor/vutils'; /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __rest(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; } function __decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; } function __param(paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); }; } function __metadata(metadataKey, metadataValue) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); } function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; function t(t, e, s) { if (t && t.length) { const [n, o] = e, a = Math.PI / 180 * s, h = Math.cos(a), r = Math.sin(a); for (const e of t) { const [t, s] = e; e[0] = (t - n) * h - (s - o) * r + n, e[1] = (t - n) * r + (s - o) * h + o; } } } function e(t, e) { return t[0] === e[0] && t[1] === e[1]; } function s(s, n, o, a = 1) { const h = o, r = Math.max(n, .1), i = s[0] && s[0][0] && "number" == typeof s[0][0] ? [s] : s, c = [0, 0]; if (h) for (const e of i) t(e, c, h); const l = function (t, s, n) { const o = []; for (const s of t) { const t = [...s]; e(t[0], t[t.length - 1]) || t.push([t[0][0], t[0][1]]), t.length > 2 && o.push(t); } const a = []; s = Math.max(s, .1); const h = []; for (const t of o) for (let e = 0; e < t.length - 1; e++) { const s = t[e], n = t[e + 1]; if (s[1] !== n[1]) { const t = Math.min(s[1], n[1]); h.push({ ymin: t, ymax: Math.max(s[1], n[1]), x: t === s[1] ? s[0] : n[0], islope: (n[0] - s[0]) / (n[1] - s[1]) }); } } if (h.sort((t, e) => t.ymin < e.ymin ? -1 : t.ymin > e.ymin ? 1 : t.x < e.x ? -1 : t.x > e.x ? 1 : t.ymax === e.ymax ? 0 : (t.ymax - e.ymax) / Math.abs(t.ymax - e.ymax)), !h.length) return a; let r = [], i = h[0].ymin, c = 0; for (; r.length || h.length;) { if (h.length) { let t = -1; for (let e = 0; e < h.length && !(h[e].ymin > i); e++) t = e; h.splice(0, t + 1).forEach(t => { r.push({ s: i, edge: t }); }); } if (r = r.filter(t => !(t.edge.ymax <= i)), r.sort((t, e) => t.edge.x === e.edge.x ? 0 : (t.edge.x - e.edge.x) / Math.abs(t.edge.x - e.edge.x)), (1 !== n || c % s == 0) && r.length > 1) for (let t = 0; t < r.length; t += 2) { const e = t + 1; if (e >= r.length) break; const s = r[t].edge, n = r[e].edge; a.push([[Math.round(s.x), i], [Math.round(n.x), i]]); } i += n, r.forEach(t => { t.edge.x = t.edge.x + n * t.edge.islope; }), c++; } return a; }(i, r, a); if (h) { for (const e of i) t(e, c, -h); !function (e, s, n) { const o = []; e.forEach(t => o.push(...t)), t(o, s, n); }(l, c, -h); } return l; } function n(t, e) { var n; const o = e.hachureAngle + 90; let a = e.hachureGap; a < 0 && (a = 4 * e.strokeWidth), a = Math.round(Math.max(a, .1)); let h = 1; return e.roughness >= 1 && ((null === (n = e.randomizer) || void 0 === n ? void 0 : n.next()) || Math.random()) > .7 && (h = a), s(t, a, o, h || 1); } class o { constructor(t) { this.helper = t; } fillPolygons(t, e) { return this._fillPolygons(t, e); } _fillPolygons(t, e) { const s = n(t, e); return { type: "fillSketch", ops: this.renderLines(s, e) }; } renderLines(t, e) { const s = []; for (const n of t) s.push(...this.helper.doubleLineOps(n[0][0], n[0][1], n[1][0], n[1][1], e)); return s; } } function a(t) { const e = t[0], s = t[1]; return Math.sqrt(Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2)); } class h extends o { fillPolygons(t, e) { let s = e.hachureGap; s < 0 && (s = 4 * e.strokeWidth), s = Math.max(s, .1); const o = n(t, Object.assign({}, e, { hachureGap: s })), h = Math.PI / 180 * e.hachureAngle, r = [], i = .5 * s * Math.cos(h), c = .5 * s * Math.sin(h); for (const [t, e] of o) a([t, e]) && r.push([[t[0] - i, t[1] + c], [...e]], [[t[0] + i, t[1] - c], [...e]]); return { type: "fillSketch", ops: this.renderLines(r, e) }; } } class r extends o { fillPolygons(t, e) { const s = this._fillPolygons(t, e), n = Object.assign({}, e, { hachureAngle: e.hachureAngle + 90 }), o = this._fillPolygons(t, n); return s.ops = s.ops.concat(o.ops), s; } } class i { constructor(t) { this.helper = t; } fillPolygons(t, e) { const s = n(t, e = Object.assign({}, e, { hachureAngle: 0 })); return this.dotsOnLines(s, e); } dotsOnLines(t, e) { const s = []; let n = e.hachureGap; n < 0 && (n = 4 * e.strokeWidth), n = Math.max(n, .1); let o = e.fillWeight; o < 0 && (o = e.strokeWidth / 2); const h = n / 4; for (const r of t) { const t = a(r), i = t / n, c = Math.ceil(i) - 1, l = t - c * n, u = (r[0][0] + r[1][0]) / 2 - n / 4, p = Math.min(r[0][1], r[1][1]); for (let t = 0; t < c; t++) { const a = p + l + t * n, r = u - h + 2 * Math.random() * h, i = a - h + 2 * Math.random() * h, c = this.helper.ellipse(r, i, o, o, e); s.push(...c.ops); } } return { type: "fillSketch", ops: s }; } } class c { constructor(t) { this.helper = t; } fillPolygons(t, e) { const s = n(t, e); return { type: "fillSketch", ops: this.dashedLine(s, e) }; } dashedLine(t, e) { const s = e.dashOffset < 0 ? e.hachureGap < 0 ? 4 * e.strokeWidth : e.hachureGap : e.dashOffset, n = e.dashGap < 0 ? e.hachureGap < 0 ? 4 * e.strokeWidth : e.hachureGap : e.dashGap, o = []; return t.forEach(t => { const h = a(t), r = Math.floor(h / (s + n)), i = (h + n - r * (s + n)) / 2; let c = t[0], l = t[1]; c[0] > l[0] && (c = t[1], l = t[0]); const u = Math.atan((l[1] - c[1]) / (l[0] - c[0])); for (let t = 0; t < r; t++) { const a = t * (s + n), h = a + s, r = [c[0] + a * Math.cos(u) + i * Math.cos(u), c[1] + a * Math.sin(u) + i * Math.sin(u)], l = [c[0] + h * Math.cos(u) + i * Math.cos(u), c[1] + h * Math.sin(u) + i * Math.sin(u)]; o.push(...this.helper.doubleLineOps(r[0], r[1], l[0], l[1], e)); } }), o; } } class l { constructor(t) { this.helper = t; } fillPolygons(t, e) { const s = e.hachureGap < 0 ? 4 * e.strokeWidth : e.hachureGap, o = e.zigzagOffset < 0 ? s : e.zigzagOffset, a = n(t, e = Object.assign({}, e, { hachureGap: s + o })); return { type: "fillSketch", ops: this.zigzagLines(a, o, e) }; } zigzagLines(t, e, s) { const n = []; return t.forEach(t => { const o = a(t), h = Math.round(o / (2 * e)); let r = t[0], i = t[1]; r[0] > i[0] && (r = t[1], i = t[0]); const c = Math.atan((i[1] - r[1]) / (i[0] - r[0])); for (let t = 0; t < h; t++) { const o = 2 * t * e, a = 2 * (t + 1) * e, h = Math.sqrt(2 * Math.pow(e, 2)), i = [r[0] + o * Math.cos(c), r[1] + o * Math.sin(c)], l = [r[0] + a * Math.cos(c), r[1] + a * Math.sin(c)], u = [i[0] + h * Math.cos(c + Math.PI / 4), i[1] + h * Math.sin(c + Math.PI / 4)]; n.push(...this.helper.doubleLineOps(i[0], i[1], u[0], u[1], s), ...this.helper.doubleLineOps(u[0], u[1], l[0], l[1], s)); } }), n; } } const u = {}; class p { constructor(t) { this.seed = t; } next() { return this.seed ? (2 ** 31 - 1 & (this.seed = Math.imul(48271, this.seed))) / 2 ** 31 : Math.random(); } } const f = 0, d = 1, g = 2, M = { A: 7, a: 7, C: 6, c: 6, H: 1, h: 1, L: 2, l: 2, M: 2, m: 2, Q: 4, q: 4, S: 4, s: 4, T: 2, t: 2, V: 1, v: 1, Z: 0, z: 0 }; function k(t, e) { return t.type === e; } function b(t) { const e = [], s = function (t) { const e = new Array(); for (; "" !== t;) if (t.match(/^([ \t\r\n,]+)/)) t = t.substr(RegExp.$1.length);else if (t.match(/^([aAcChHlLmMqQsStTvVzZ])/)) e[e.length] = { type: f, text: RegExp.$1 }, t = t.substr(RegExp.$1.length);else { if (!t.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/)) return []; e[e.length] = { type: d, text: `${parseFloat(RegExp.$1)}` }, t = t.substr(RegExp.$1.length); } return e[e.length] = { type: g, text: "" }, e; }(t); let n = "BOD", o = 0, a = s[o]; for (; !k(a, g);) { let h = 0; const r = []; if ("BOD" === n) { if ("M" !== a.text && "m" !== a.text) return b("M0,0" + t); o++, h = M[a.text], n = a.text; } else k(a, d) ? h = M[n] : (o++, h = M[a.text], n = a.text); if (!(o + h < s.length)) throw new Error("Path data ended short"); for (let t = o; t < o + h; t++) { const e = s[t]; if (!k(e, d)) throw new Error("Param not a number: " + n + "," + e.text); r[r.length] = +e.text; } if ("number" != typeof M[n]) throw new Error("Bad segment: " + n); { const t = { key: n, data: r }; e.push(t), o += h, a = s[o], "M" === n && (n = "L"), "m" === n && (n = "l"); } } return e; } function y(t) { let e = 0, s = 0, n = 0, o = 0; const a = []; for (const { key: h, data: r } of t) switch (h) { case "M": a.push({ key: "M", data: [...r] }), [e, s] = r, [n, o] = r; break; case "m": e += r[0], s += r[1], a.push({ key: "M", data: [e, s] }), n = e, o = s; break; case "L": a.push({ key: "L", data: [...r] }), [e, s] = r; break; case "l": e += r[0], s += r[1], a.push({ key: "L", data: [e, s] }); break; case "C": a.push({ key: "C", data: [...r] }), e = r[4], s = r[5]; break; case "c": { const t = r.map((t, n) => n % 2 ? t + s : t + e); a.push({ key: "C", data: t }), e = t[4], s = t[5]; break; } case "Q": a.push({ key: "Q", data: [...r] }), e = r[2], s = r[3]; break; case "q": { const t = r.map((t, n) => n % 2 ? t + s : t + e); a.push({ key: "Q", data: t }), e = t[2], s = t[3]; break; } case "A": a.push({ key: "A", data: [...r] }), e = r[5], s = r[6]; break; case "a": e += r[5], s += r[6], a.push({ key: "A", data: [r[0], r[1], r[2], r[3], r[4], e, s] }); break; case "H": a.push({ key: "H", data: [...r] }), e = r[0]; break; case "h": e += r[0], a.push({ key: "H", data: [e] }); break; case "V": a.push({ key: "V", data: [...r] }), s = r[0]; break; case "v": s += r[0], a.push({ key: "V", data: [s] }); break; case "S": a.push({ key: "S", data: [...r] }), e = r[2], s = r[3]; break; case "s": { const t = r.map((t, n) => n % 2 ? t + s : t + e); a.push({ key: "S", data: t }), e = t[2], s = t[3]; break; } case "T": a.push({ key: "T", data: [...r] }), e = r[0], s = r[1]; break; case "t": e += r[0], s += r[1], a.push({ key: "T", data: [e, s] }); break; case "Z": case "z": a.push({ key: "Z", data: [] }), e = n, s = o; } return a; } function m$2(t) { const e = []; let s = "", n = 0, o = 0, a = 0, h = 0, r = 0, i = 0; for (const { key: c, data: l } of t) { switch (c) { case "M": e.push({ key: "M", data: [...l] }), [n, o] = l, [a, h] = l; break; case "C": e.push({ key: "C", data: [...l] }), n = l[4], o = l[5], r = l[2], i = l[3]; break; case "L": e.push({ key: "L", data: [...l] }), [n, o] = l; break; case "H": n = l[0], e.push({ key: "L", data: [n, o] }); break; case "V": o = l[0], e.push({ key: "L", data: [n, o] }); break; case "S": { let t = 0, a = 0; "C" === s || "S" === s ? (t = n + (n - r), a = o + (o - i)) : (t = n, a = o), e.push({ key: "C", data: [t, a, ...l] }), r = l[0], i = l[1], n = l[2], o = l[3]; break; } case "T": { const [t, a] = l; let h = 0, c = 0; "Q" === s || "T" === s ? (h = n + (n - r), c = o + (o - i)) : (h = n, c = o); const u = n + 2 * (h - n) / 3, p = o + 2 * (c - o) / 3, f = t + 2 * (h - t) / 3, d = a + 2 * (c - a) / 3; e.push({ key: "C", data: [u, p, f, d, t, a] }), r = h, i = c, n = t, o = a; break; } case "Q": { const [t, s, a, h] = l, c = n + 2 * (t - n) / 3, u = o + 2 * (s - o) / 3, p = a + 2 * (t - a) / 3, f = h + 2 * (s - h) / 3; e.push({ key: "C", data: [c, u, p, f, a, h] }), r = t, i = s, n = a, o = h; break; } case "A": { const t = Math.abs(l[0]), s = Math.abs(l[1]), a = l[2], h = l[3], r = l[4], i = l[5], c = l[6]; if (0 === t || 0 === s) e.push({ key: "C", data: [n, o, i, c, i, c] }), n = i, o = c;else if (n !== i || o !== c) { x(n, o, i, c, t, s, a, h, r).forEach(function (t) { e.push({ key: "C", data: t }); }), n = i, o = c; } break; } case "Z": e.push({ key: "Z", data: [] }), n = a, o = h; } s = c; } return e; } function w(t, e, s) { return [t * Math.cos(s) - e * Math.sin(s), t * Math.sin(s) + e * Math.cos(s)]; } function x(t, e, s, n, o, a, h, r, i, c) { const l = (u = h, Math.PI * u / 180); var u; let p = [], f = 0, d = 0, g = 0, M = 0; if (c) [f, d, g, M] = c;else { [t, e] = w(t, e, -l), [s, n] = w(s, n, -l); const h = (t - s) / 2, c = (e - n) / 2; let u = h * h / (o * o) + c * c / (a * a); u > 1 && (u = Math.sqrt(u), o *= u, a *= u); const p = o * o, k = a * a, b = p * k - p * c * c - k * h * h, y = p * c * c + k * h * h, m = (r === i ? -1 : 1) * Math.sqrt(Math.abs(b / y)); g = m * o * c / a + (t + s) / 2, M = m * -a * h / o + (e + n) / 2, f = Math.asin(parseFloat(((e - M) / a).toFixed(9))), d = Math.asin(parseFloat(((n - M) / a).toFixed(9))), t < g && (f = Math.PI - f), s < g && (d = Math.PI - d), f < 0 && (f = 2 * Math.PI + f), d < 0 && (d = 2 * Math.PI + d), i && f > d && (f -= 2 * Math.PI), !i && d > f && (d -= 2 * Math.PI); } let k = d - f; if (Math.abs(k) > 120 * Math.PI / 180) { const t = d, e = s, r = n; d = i && d > f ? f + 120 * Math.PI / 180 * 1 : f + 120 * Math.PI / 180 * -1, p = x(s = g + o * Math.cos(d), n = M + a * Math.sin(d), e, r, o, a, h, 0, i, [d, t, g, M]); } k = d - f; const b = Math.cos(f), y = Math.sin(f), m = Math.cos(d), P = Math.sin(d), v = Math.tan(k / 4), S = 4 / 3 * o * v, O = 4 / 3 * a * v, L = [t, e], T = [t + S * y, e - O * b], D = [s + S * P, n - O * m], A = [s, n]; if (T[0] = 2 * L[0] - T[0], T[1] = 2 * L[1] - T[1], c) return [T, D, A].concat(p); { p = [T, D, A].concat(p); const t = []; for (let e = 0; e < p.length; e += 3) { const s = w(p[e][0], p[e][1], l), n = w(p[e + 1][0], p[e + 1][1], l), o = w(p[e + 2][0], p[e + 2][1], l); t.push([s[0], s[1], n[0], n[1], o[0], o[1]]); } return t; } } const P = { randOffset: function (t, e) { return G(t, e); }, randOffsetWithRange: function (t, e, s) { return E(t, e, s); }, ellipse: function (t, e, s, n, o) { const a = T(s, n, o); return D(t, e, o, a).opset; }, doubleLineOps: function (t, e, s, n, o) { return $(t, e, s, n, o, !0); } }; function v(t, e, s, n, o) { return { type: "path", ops: $(t, e, s, n, o) }; } function S(t, e, s) { const n = (t || []).length; if (n > 2) { const o = []; for (let e = 0; e < n - 1; e++) o.push(...$(t[e][0], t[e][1], t[e + 1][0], t[e + 1][1], s)); return e && o.push(...$(t[n - 1][0], t[n - 1][1], t[0][0], t[0][1], s)), { type: "path", ops: o }; } return 2 === n ? v(t[0][0], t[0][1], t[1][0], t[1][1], s) : { type: "path", ops: [] }; } function O(t, e, s, n, o) { return function (t, e) { return S(t, !0, e); }([[t, e], [t + s, e], [t + s, e + n], [t, e + n]], o); } function L(t, e) { if (t.length) { const s = "number" == typeof t[0][0] ? [t] : t, n = j(s[0], 1 * (1 + .2 * e.roughness), e), o = e.disableMultiStroke ? [] : j(s[0], 1.5 * (1 + .22 * e.roughness), z(e)); for (let t = 1; t < s.length; t++) { const a = s[t]; if (a.length) { const t = j(a, 1 * (1 + .2 * e.roughness), e), s = e.disableMultiStroke ? [] : j(a, 1.5 * (1 + .22 * e.roughness), z(e)); for (const e of t) "move" !== e.op && n.push(e); for (const t of s) "move" !== t.op && o.push(t); } } return { type: "path", ops: n.concat(o) }; } return { type: "path", ops: [] }; } function T(t, e, s) { const n = Math.sqrt(2 * Math.PI * Math.sqrt((Math.pow(t / 2, 2) + Math.pow(e / 2, 2)) / 2)), o = Math.ceil(Math.max(s.curveStepCount, s.curveStepCount / Math.sqrt(200) * n)), a = 2 * Math.PI / o; let h = Math.abs(t / 2), r = Math.abs(e / 2); const i = 1 - s.curveFitting; return h += G(h * i, s), r += G(r * i, s), { increment: a, rx: h, ry: r }; } function D(t, e, s, n) { const [o, a] = F(n.increment, t, e, n.rx, n.ry, 1, n.increment * E(.1, E(.4, 1, s), s), s); let h = q(o, null, s); if (!s.disableMultiStroke && 0 !== s.roughness) { const [o] = F(n.increment, t, e, n.rx, n.ry, 1.5, 0, s), a = q(o, null, s); h = h.concat(a); } return { estimatedPoints: a, opset: { type: "path", ops: h } }; } function A(t, e, s, n, o, a, h, r, i) { const c = t, l = e; let u = Math.abs(s / 2), p = Math.abs(n / 2); u += G(.01 * u, i), p += G(.01 * p, i); let f = o, d = a; for (; f < 0;) f += 2 * Math.PI, d += 2 * Math.PI; d - f > 2 * Math.PI && (f = 0, d = 2 * Math.PI); const g = 2 * Math.PI / i.curveStepCount, M = Math.min(g / 2, (d - f) / 2), k = V(M, c, l, u, p, f, d, 1, i); if (!i.disableMultiStroke) { const t = V(M, c, l, u, p, f, d, 1.5, i); k.push(...t); } return h && (r ? k.push(...$(c, l, c + u * Math.cos(f), l + p * Math.sin(f), i), ...$(c, l, c + u * Math.cos(d), l + p * Math.sin(d), i)) : k.push({ op: "lineTo", data: [c, l] }, { op: "lineTo", data: [c + u * Math.cos(f), l + p * Math.sin(f)] })), { type: "path", ops: k }; } function _(t, e) { const s = m$2(y(b(t))), n = []; let o = [0, 0], a = [0, 0]; for (const { key: t, data: h } of s) switch (t) { case "M": a = [h[0], h[1]], o = [h[0], h[1]]; break; case "L": n.push(...$(a[0], a[1], h[0], h[1], e)), a = [h[0], h[1]]; break; case "C": { const [t, s, o, r, i, c] = h; n.push(...Z(t, s, o, r, i, c, a, e)), a = [i, c]; break; } case "Z": n.push(...$(a[0], a[1], o[0], o[1], e)), a = [o[0], o[1]]; } return { type: "path", ops: n }; } function I(t, e) { const s = []; for (const n of t) if (n.length) { const t = e.maxRandomnessOffset || 0, o = n.length; if (o > 2) { s.push({ op: "move", data: [n[0][0] + G(t, e), n[0][1] + G(t, e)] }); for (let a = 1; a < o; a++) s.push({ op: "lineTo", data: [n[a][0] + G(t, e), n[a][1] + G(t, e)] }); } } return { type: "fillPath", ops: s }; } function C(t, e) { return function (t, e) { let s = t.fillStyle || "hachure"; if (!u[s]) switch (s) { case "zigzag": u[s] || (u[s] = new h(e)); break; case "cross-hatch": u[s] || (u[s] = new r(e)); break; case "dots": u[s] || (u[s] = new i(e)); break; case "dashed": u[s] || (u[s] = new c(e)); break; case "zigzag-line": u[s] || (u[s] = new l(e)); break; default: s = "hachure", u[s] || (u[s] = new o(e)); } return u[s]; }(e, P).fillPolygons(t, e); } function z(t) { const e = Object.assign({}, t); return e.randomizer = void 0, t.seed && (e.seed = t.seed + 1), e; } function W(t) { return t.randomizer || (t.randomizer = new p(t.seed || 0)), t.randomizer.next(); } function E(t, e, s, n = 1) { return s.roughness * n * (W(s) * (e - t) + t); } function G(t, e, s = 1) { return E(-t, t, e, s); } function $(t, e, s, n, o, a = !1) { const h = a ? o.disableMultiStrokeFill : o.disableMultiStroke, r = R(t, e, s, n, o, !0, !1); if (h) return r; const i = R(t, e, s, n, o, !0, !0); return r.concat(i); } function R(t, e, s, n, o, a, h) { const r = Math.pow(t - s, 2) + Math.pow(e - n, 2), i = Math.sqrt(r); let c = 1; c = i < 200 ? 1 : i > 500 ? .4 : -.0016668 * i + 1.233334; let l = o.maxRandomnessOffset || 0; l * l * 100 > r && (l = i / 10); const u = l / 2, p = .2 + .2 * W(o); let f = o.bowing * o.maxRandomnessOffset * (n - e) / 200, d = o.bowing * o.maxRandomnessOffset * (t - s) / 200; f = G(f, o, c), d = G(d, o, c); const g = [], M = () => G(u, o, c), k = () => G(l, o, c), b = o.preserveVertices; return a && (h ? g.push({ op: "move", data: [t + (b ? 0 : M()), e + (b ? 0 : M())] }) : g.push({ op: "move", data: [t + (b ? 0 : G(l, o, c)), e + (b ? 0 : G(l, o, c))] })), h ? g.push({ op: "bcurveTo", data: [f + t + (s - t) * p + M(), d + e + (n - e) * p + M(), f + t + 2 * (s - t) * p + M(), d + e + 2 * (n - e) * p + M(), s + (b ? 0 : M()), n + (b ? 0 : M())] }) : g.push({ op: "bcurveTo", data: [f + t + (s - t) * p + k(), d + e + (n - e) * p + k(), f + t + 2 * (s - t) * p + k(), d + e + 2 * (n - e) * p + k(), s + (b ? 0 : k()), n + (b ? 0 : k())] }), g; } function j(t, e, s) { if (!t.length) return []; const n = []; n.push([t[0][0] + G(e, s), t[0][1] + G(e, s)]), n.push([t[0][0] + G(e, s), t[0][1] + G(e, s)]); for (let o = 1; o < t.length; o++) n.push([t[o][0] + G(e, s), t[o][1] + G(e, s)]), o === t.length - 1 && n.push([t[o][0] + G(e, s), t[o][1] + G(e, s)]); return q(n, null, s); } function q(t, e, s) { const n = t.length, o = []; if (n > 3) { const a = [], h = 1 - s.curveTightness; o.push({ op: "move", data: [t[1][0], t[1][1]] }); for (let e = 1; e + 2 < n; e++) { const s = t[e]; a[0] = [s[0], s[1]], a[1] = [s[0] + (h * t[e + 1][0] - h * t[e - 1][0]) / 6, s[1] + (h * t[e + 1][1] - h * t[e - 1][1]) / 6], a[2] = [t[e + 1][0] + (h * t[e][0] - h * t[e + 2][0]) / 6, t[e + 1][1] + (h * t[e][1] - h * t[e + 2][1]) / 6], a[3] = [t[e + 1][0], t[e + 1][1]], o.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) { const t = s.maxRandomnessOffset; o.push({ op: "lineTo", data: [e[0] + G(t, s), e[1] + G(t, s)] }); } } else 3 === n ? (o.push({ op: "move", data: [t[1][0], t[1][1]] }), o.push({ op: "bcurveTo", data: [t[1][0], t[1][1], t[2][0], t[2][1], t[2][0], t[2][1]] })) : 2 === n && o.push(...R(t[0][0], t[0][1], t[1][0], t[1][1], s, !0, !0)); return o; } function F(t, e, s, n, o, a, h, r) { const i = [], c = []; if (0 === r.roughness) { t /= 4, c.push([e + n * Math.cos(-t), s + o * Math.sin(-t)]); for (let a = 0; a <= 2 * Math.PI; a += t) { const t = [e + n * Math.cos(a), s + o * Math.sin(a)]; i.push(t), c.push(t); } c.push([e + n * Math.cos(0), s + o * Math.sin(0)]), c.push([e + n * Math.cos(t), s + o * Math.sin(t)]); } else { const l = G(.5, r) - Math.PI / 2; c.push([G(a, r) + e + .9 * n * Math.cos(l - t), G(a, r) + s + .9 * o * Math.sin(l - t)]); const u = 2 * Math.PI + l - .01; for (let h = l; h < u; h += t) { const t = [G(a, r) + e + n * Math.cos(h), G(a, r) + s + o * Math.sin(h)]; i.push(t), c.push(t); } c.push([G(a, r) + e + n * Math.cos(l + 2 * Math.PI + .5 * h), G(a, r) + s + o * Math.sin(l + 2 * Math.PI + .5 * h)]), c.push([G(a, r) + e + .98 * n * Math.cos(l + h), G(a, r) + s + .98 * o * Math.sin(l + h)]), c.push([G(a, r) + e + .9 * n * Math.cos(l + .5 * h), G(a, r) + s + .9 * o * Math.sin(l + .5 * h)]); } return [c, i]; } function V(t, e, s, n, o, a, h, r, i) { const c = a + G(.1, i), l = []; l.push([G(r, i) + e + .9 * n * Math.cos(c - t), G(r, i) + s + .9 * o * Math.sin(c - t)]); for (let a = c; a <= h; a += t) l.push([G(r, i) + e + n * Math.cos(a), G(r, i) + s + o * Math.sin(a)]); return l.push([e + n * Math.cos(h), s + o * Math.sin(h)]), l.push([e + n * Math.cos(h), s + o * Math.sin(h)]), q(l, null, i); } function Z(t, e, s, n, o, a, h, r) { const i = [], c = [r.maxRandomnessOffset || 1, (r.maxRandomnessOffset || 1) + .3]; let l = [0, 0]; const u = r.disableMultiStroke ? 1 : 2, p = r.preserveVertices; for (let f = 0; f < u; f++) 0 === f ? i.push({ op: "move", data: [h[0], h[1]] }) : i.push({ op: "move", data: [h[0] + (p ? 0 : G(c[0], r)), h[1] + (p ? 0 : G(c[0], r))] }), l = p ? [o, a] : [o + G(c[f], r), a + G(c[f], r)], i.push({ op: "bcurveTo", data: [t + G(c[f], r), e + G(c[f], r), s + G(c[f], r), n + G(c[f], r), l[0], l[1]] }); return i; } function Q(t) { return [...t]; } function H(t, e = 0) { const s = t.length; if (s < 3) throw new Error("A curve must have at least three points."); const n = []; if (3 === s) n.push(Q(t[0]), Q(t[1]), Q(t[2]), Q(t[2]));else { const s = []; s.push(t[0], t[0]); for (let e = 1; e < t.length; e++) s.push(t[e]), e === t.length - 1 && s.push(t[e]); const o = [], a = 1 - e; n.push(Q(s[0])); for (let t = 1; t + 2 < s.length; t++) { const e = s[t]; o[0] = [e[0], e[1]], o[1] = [e[0] + (a * s[t + 1][0] - a * s[t - 1][0]) / 6, e[1] + (a * s[t + 1][1] - a * s[t - 1][1]) / 6], o[2] = [s[t + 1][0] + (a * s[t][0] - a * s[t + 2][0]) / 6, s[t + 1][1] + (a * s[t][1] - a * s[t + 2][1]) / 6], o[3] = [s[t + 1][0], s[t + 1][1]], n.push(o[1], o[2], o[3]); } } return n; } function N(t, e) { return Math.pow(t[0] - e[0], 2) + Math.pow(t[1] - e[1], 2); } function B(t, e, s) { const n = N(e, s); if (0 === n) return N(t, e); let o = ((t[0] - e[0]) * (s[0] - e[0]) + (t[1] - e[1]) * (s[1] - e[1])) / n; return o = Math.max(0, Math.min(1, o)), N(t, J(e, s, o)); } function J(t, e, s) { return [t[0] + (e[0] - t[0]) * s, t[1] + (e[1] - t[1]) * s]; } function K(t, e, s, n) { const o = n || []; if (function (t, e) { const s = t[e + 0], n = t[e + 1], o = t[e + 2], a = t[e + 3]; let h = 3 * n[0] - 2 * s[0] - a[0]; h *= h; let r = 3 * n[1] - 2 * s[1] - a[1]; r *= r; let i = 3 * o[0] - 2 * a[0] - s[0]; i *= i; let c = 3 * o[1] - 2 * a[1] - s[1]; return c *= c, h < i && (h = i), r < c && (r = c), h + r; }(t, e) < s) { const s = t[e + 0]; if (o.length) { (a = o[o.length - 1], h = s, Math.sqrt(N(a, h))) > 1 && o.push(s); } else o.push(s); o.push(t[e + 3]); } else { const n = .5, a = t[e + 0], h = t[e + 1], r = t[e + 2], i = t[e + 3], c = J(a, h, n), l = J(h, r, n), u = J(r, i, n), p = J(c, l, n), f = J(l, u, n), d = J(p, f, n); K([a, c, p, d], 0, s, o), K([d, f, u, i], 0, s, o); } var a, h; return o; } function U(t, e) { return X(t, 0, t.length, e); } function X(t, e, s, n, o) { const a = o || [], h = t[e], r = t[s - 1]; let i = 0, c = 1; for (let n = e + 1; n < s - 1; ++n) { const e = B(t[n], h, r); e > i && (i = e, c = n); } return Math.sqrt(i) > n ? (X(t, e, c + 1, n, a), X(t, c, s, n, a)) : (a.length || a.push(h), a.push(r)), a; } function Y(t, e = .15, s) { const n = [], o = (t.length - 1) / 3; for (let s = 0; s < o; s++) { K(t, 3 * s, e, n); } return s && s > 0 ? X(n, 0, n.length, s) : n; } const tt$1 = "none"; class et { constructor(t) { this.defaultOptions = { maxRandomnessOffset: 2, roughness: 1, bowing: 1, stroke: "#000", strokeWidth: 1, curveTightness: 0, curveFitting: .95, curveStepCount: 9, fillStyle: "hachure", fillWeight: -1, hachureAngle: -41, hachureGap: -1, dashOffset: -1, dashGap: -1, zigzagOffset: -1, seed: 0, disableMultiStroke: !1, disableMultiStrokeFill: !1, preserveVertices: !1, fillShapeRoughnessGain: .8 }, this.config = t || {}, this.config.options && (this.defaultOptions = this._o(this.config.options)); } static newSeed() { return Math.floor(Math.random() * 2 ** 31); } _o(t) { return t ? Object.assign({}, this.defaultOptions, t) : this.defaultOptions; } _d(t, e, s) { return { shape: t, sets: e || [], options: s || this.defaultOptions }; } line(t, e, s, n, o) { const a = this._o(o); return this._d("line", [v(t, e, s, n, a)], a); } rectangle(t, e, s, n, o) { const a = this._o(o), h = [], r = O(t, e, s, n, a); if (a.fill) { const o = [[t, e], [t + s, e], [t + s, e + n], [t, e + n]]; "solid" === a.fillStyle ? h.push(I([o], a)) : h.push(C([o], a)); } return a.stroke !== tt$1 && h.push(r), this._d("rectangle", h, a); } ellipse(t, e, s, n, o) { const a = this._o(o), h = [], r = T(s, n, a), i = D(t, e, a, r); if (a.fill) if ("solid" === a.fillStyle) { const s = D(t, e, a, r).opset; s.type = "fillPath", h.push(s); } else h.push(C([i.estimatedPoints], a)); return a.stroke !== tt$1 && h.push(i.opset), this._d("ellipse", h, a); } circle(t, e, s, n) { const o = this.ellipse(t, e, s, s, n); return o.shape = "circle", o; } linearPath(t, e) { const s = this._o(e); return this._d("linearPath", [S(t, !1, s)], s); } arc(t, e, s, n, o, a, h = !1, r) { const i = this._o(r), c = [], l = A(t, e, s, n, o, a, h, !0, i); if (h && i.fill) if ("solid" === i.fillStyle) { const h = Object.assign({}, i); h.disableMultiStroke = !0; const r = A(t, e, s, n, o, a, !0, !1, h); r.type = "fillPath", c.push(r); } else c.push(function (t, e, s, n, o, a, h) { const r = t, i = e; let c = Math.abs(s / 2), l = Math.abs(n / 2); c += G(.01 * c, h), l += G(.01 * l, h); let u = o, p = a; for (; u < 0;) u += 2 * Math.PI, p += 2 * Math.PI; p - u > 2 * Math.PI && (u = 0, p = 2 * Math.PI); const f = (p - u) / h.curveStepCount, d = []; for (let t = u; t <= p; t += f) d.push([r + c * Math.cos(t), i + l * Math.sin(t)]); return d.push([r + c * Math.cos(p), i + l * Math.sin(p)]), d.push([r, i]), C([d], h); }(t, e, s, n, o, a, i)); return i.stroke !== tt$1 && c.push(l), this._d("arc", c, i); } curve(t, e) { const s = this._o(e), n = [], o = L(t, s); if (s.fill && s.fill !== tt$1) if ("solid" === s.fillStyle) { const e = L(t, Object.assign(Object.assign({}, s), { disableMultiStroke: !0, roughness: s.roughness ? s.roughness + s.fillShapeRoughnessGain : 0 })); n.push({ type: "fillPath", ops: this._mergedShape(e.ops) }); } else { const e = [], o = t; if (o.length) { const t = "number" == typeof o[0][0] ? [o] : o; for (const n of t) n.length < 3 ? e.push(...n) : 3 === n.length ? e.push(...Y(H([n[0], n[0], n[1], n[2]]), 10, (1 + s.roughness) / 2)) : e.push(...Y(H(n), 10, (1 + s.roughness) / 2)); } e.length && n.push(C([e], s)); } return s.stroke !== tt$1 && n.push(o), this._d("curve", n, s); } polygon(t, e) { const s = this._o(e), n = [], o = S(t, !0, s); return s.fill && ("solid" === s.fillStyle ? n.push(I([t], s)) : n.push(C([t], s))), s.stroke !== tt$1 && n.push(o), this._d("polygon", n, s); } path(t, e) { const s = this._o(e), n = []; if (!t) return this._d("path", n, s); t = (t || "").replace(/\n/g, " ").replace(/(-\s)/g, "-").replace("/(ss)/g", " "); const o = s.fill && "transparent" !== s.fill && s.fill !== tt$1, a = s.stroke !== tt$1, h = !!(s.simplification && s.simplification < 1), r = function (t, e, s) { const n = m$2(y(b(t))), o = []; let a = [], h = [0, 0], r = []; const i = () => { r.length >= 4 && a.push(...Y(r, e)), r = []; }, c = () => { i(), a.length && (o.push(a), a = []); }; for (const { key: t, data: e } of n) switch (t) { case "M": c(), h = [e[0], e[1]], a.push(h); break; case "L": i(), a.push([e[0], e[1]]); break; case "C": if (!r.length) { const t = a.length ? a[a.length - 1] : h; r.push([t[0], t[1]]); } r.push([e[0], e[1]]), r.push([e[2], e[3]]), r.push([e[4], e[5]]); break; case "Z": i(), a.push([h[0], h[1]]); } if (c(), !s) return o; const l = []; for (const t of o) { const e = U(t, s); e.length && l.push(e); } return l; }(t, 1, h ? 4 - 4 * (s.simplification || 1) : (1 + s.roughness) / 2), i = _(t, s); if (o) if ("solid" === s.fillStyle) { if (1 === r.length) { const e = _(t, Object.assign(Object.assign({}, s), { disableMultiStroke: !0, roughness: s.roughness ? s.roughness + s.fillShapeRoughnessGain : 0 })); n.push({ type: "fillPath", ops: this._mergedShape(e.ops) }); } else n.push(I(r, s)); } else n.push(C(r, s)); return a && (h ? r.forEach(t => { n.push(S(t, !1, s)); }) : n.push(i)), this._d("path", n, s); } opsToPath(t, e) { let s = ""; for (const n of t.ops) { const t = "number" == typeof e && e >= 0 ? n.data.map(t => +t.toFixed(e)) : n.data; switch (n.op) { case "move": s += `M${t[0]} ${t[1]} `; break; case "bcurveTo": s += `C${t[0]} ${t[1]}, ${t[2]} ${t[3]}, ${t[4]} ${t[5]} `; break; case "lineTo": s += `L${t[0]} ${t[1]} `; } } return s.trim(); } toPaths(t) { const e = t.sets || [], s = t.options || this.defaultOptions, n = []; for (const t of e) { let e = null; switch (t.type) { case "path": e = { d: this.opsToPath(t), stroke: s.stroke, strokeWidth: s.strokeWidth, fill: tt$1 }; break; case "fillPath": e = { d: this.opsToPath(t), stroke: tt$1, strokeWidth: 0, fill: s.fill || tt$1 }; break; case "fillSketch": e = this.fillSketch(t, s); } e && n.push(e); } return n; } fillSketch(t, e) { let s = e.fillWeight; return s < 0 && (s = e.strokeWidth / 2), { d: this.opsToPath(t), stroke: e.fill || tt$1, strokeWidth: s, fill: tt$1 }; } _mergedShape(t) { return t.filter((t, e) => 0 === e || "move" !== t.op); } } class st { constructor(t, e) { this.canvas = t, this.ctx = this.canvas.getContext("2d"), this.gen = new et(e); } draw(t) { const e = t.sets || [], s = t.options || this.getDefaultOptions(), n = this.ctx, o = t.options.fixedDecimalPlaceDigits; for (const a of e) switch (a.type) { case "path": n.save(), n.strokeStyle = "none" === s.stroke ? "transparent" : s.stroke, n.lineWidth = s.strokeWidth, s.strokeLineDash && n.setLineDash(s.strokeLineDash), s.strokeLineDashOffset && (n.lineDashOffset = s.strokeLineDashOffset), this._drawToContext(n, a, o), n.restore(); break; case "fillPath": { n.save(), n.fillStyle = s.fill || ""; const e = "curve" === t.shape || "polygon" === t.shape || "path" === t.shape ? "evenodd" : "nonzero"; this._drawToContext(n, a, o, e), n.restore(); break; } case "fillSketch": this.fillSketch(n, a, s); } } fillSketch(t, e, s) { let n = s.fillWeight; n < 0 && (n = s.strokeWidth / 2), t.save(), s.fillLineDash && t.setLineDash(s.fillLineDash), s.fillLineDashOffset && (t.lineDashOffset = s.fillLineDashOffset), t.strokeStyle = s.fill || "", t.lineWidth = n, this._drawToContext(t, e, s.fixedDecimalPlaceDigits), t.restore(); } _drawToContext(t, e, s, n = "nonzero") { t.beginPath(); for (const n of e.ops) { const e = "number" == typeof s && s >= 0 ? n.data.map(t => +t.toFixed(s)) : n.data; switch (n.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 "lineTo": t.lineTo(e[0], e[1]); } } "fillPath" === e.type ? t.fill(n) : t.stroke(); } get generator() { return this.gen; } getDefaultOptions() { return this.gen.defaultOptions; } line(t, e, s, n, o) { const a = this.gen.line(t, e, s, n, o); return this.draw(a), a; } rectangle(t, e, s, n, o) { const a = this.gen.rectangle(t, e, s, n, o); return this.draw(a), a; } ellipse(t, e, s, n, o) { const a = this.gen.ellipse(t, e, s, n, o); return this.draw(a), a; } circle(t, e, s, n) { const o = this.gen.circle(t, e, s, n); return this.draw(o), o; } linearPath(t, e) { const s = this.gen.linearPath(t, e); return this.draw(s), s; } polygon(t, e) { const s = this.gen.polygon(t, e); return this.draw(s), s; } arc(t, e, s, n, o, a, h = !1, r) { const i = this.gen.arc(t, e, s, n, o, a, h, r); return this.draw(i), i; } curve(t, e) { const s = this.gen.curve(t, e); return this.draw(s), s; } path(t, e) { const s = this.gen.path(t, e); return this.draw(s), s; } } const nt = "http://www.w3.org/2000/svg"; class ot { constructor(t, e) { this.svg = t, this.gen = new et(e); } draw(t) { const e = t.sets || [], s = t.options || this.getDefaultOptions(), n = this.svg.ownerDocument || window.document, o = n.createElementNS(nt, "g"), a = t.options.fixedDecimalPlaceDigits; for (const h of e) { let e = null; switch (h.type) { case "path": e = n.createElementNS(nt, "path"), e.setAttribute("d", this.opsToPath(h, a)), e.setAttribute("stroke", s.stroke), e.setAttribute("stroke-width", s.strokeWidth + ""), e.setAttribute("fill", "none"), s.strokeLineDash && e.setAttribute("stroke-dasharray", s.strokeLineDash.join(" ").trim()), s.strokeLineDashOffset && e.setAttribute("stroke-dashoffset", `${s.strokeLineDashOffset}`); break; case "fillPath": e = n.createElementNS(nt, "path"), e.setAttribute("d", this.opsToPath(h, a)), e.setAttribute("stroke", "none"), e.setAttribute("stroke-width", "0"), e.setAttribute("fill", s.fill || ""), "curve" !== t.shape && "polygon" !== t.shape || e.setAttribute("fill-rule", "evenodd"); break; case "fillSketch": e = this.fillSketch(n, h, s); } e && o.appendChild(e); } return o; } fillSketch(t, e, s) { let n = s.fillWeight; n < 0 && (n = s.strokeWidth / 2); const o = t.createElementNS(nt, "path"); return o.setAttribute("d", this.opsToPath(e, s.fixedDecimalPlaceDigits)), o.setAttribute("stroke", s.fill || ""), o.setAttribute("stroke-width", n + ""), o.setAttribute("fill", "none"), s.fillLineDash && o.setAttribute("stroke-dasharray", s.fillLineDash.join(" ").trim()), s.fillLineDashOffset && o.setAttribute("stroke-dashoffset", `${s.fillLineDashOffset}`), o; } get generator() { return this.gen; } getDefaultOptions() { return this.gen.defaultOptions; } opsToPath(t, e) { return this.gen.opsToPath(t, e); } line(t, e, s, n, o) { const a = this.gen.line(t, e, s, n, o); return this.draw(a); } rectangle(t, e, s, n, o) { const a = this.gen.rectangle(t, e, s, n, o); return this.draw(a); } ellipse(t, e, s, n, o) { const a = this.gen.ellipse(t, e, s, n, o); return this.draw(a); } circle(t, e, s, n) { const o = this.gen.circle(t, e, s, n); return this.draw(o); } linearPath(t, e) { const s = this.gen.linearPath(t, e); return this.draw(s); } polygon(t, e) { const s = this.gen.polygon(t, e); return this.draw(s); } arc(t, e, s, n, o, a, h = !1, r) { const i = this.gen.arc(t, e, s, n, o, a, h, r); return this.draw(i); } curve(t, e) { const s = this.gen.curve(t, e); return this.draw(s); } path(t, e) { const s = this.gen.path(t, e); return this.draw(s); } } var at = { canvas: (t, e) => new st(t, e), svg: (t, e) => new ot(t, e), generator: t => new et(t), newSeed: () => et.newSeed() }; const defaultRouthThemeSpec = { maxRandomnessOffset: 3, roughness: 1.6, bowing: 1, curveFitting: 0.95, curveTightness: undefined, curveStepCount: 9, fillStyle: 'cross-hatch', fillWeight: undefined, hachureAngle: 60, hachureGap: 6, simplification: 0, dashOffset: undefined, dashGap: undefined, zigzagOffset: undefined, seed: 3, fillLineDash: undefined, fillLineDashOffset: undefined, disableMultiStroke: false, disableMultiStrokeFill: true, preserveVertices: true, fixedDecimalPlaceDigits: undefined }; class RoughContext2d { constructor(originContext, customPath) { this.originContext = originContext; this.customPath = customPath; } reset(setTransform = true) { return this.originContext.reset(setTransform); } beginPath() { this.originContext.beginPath(); this.customPath.beginPath(); } moveTo(x, y, z) { this.originContext.moveTo(x, y, z); this.customPath.moveTo(x, y); } lineTo(x, y, z) { this.originContext.lineTo(x, y, z); this.customPath.lineTo(x, y); } bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, z) { this.originContext.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, z); this.customPath.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); } quadraticCurveTo(cpx, cpy, x, y, z) { this.originContext.quadraticCurveTo(cpx, cpy, x, y, z); this.customPath.quadraticCurveTo(cpx, cpy, x, y); } arc(x, y, radius, startAngle, endAngle, anticlockwise, z) { this.originContext.arc(x, y, radius, startAngle, endAngle, anticlockwise, z); this.customPath.arc(x, y, radius, startAngle, endAngle, anticlockwise); } arcTo(x1, y1, x2, y2, radius) { this.originContext.arcTo(x1, y1, x2, y2, radius); this.customPath.arcTo(x1, y1, x2, y2, radius); } ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) { this.originContext.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise); this.customPath.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise); } rect(x, y, w, h,