minerva-design 1.13.2 → 1.14.0
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/CHANGELOG.md +10 -0
- package/custom-elements.json +194 -12
- package/dist/angular/fesm2022/minerva-angular.mjs +20 -0
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +10 -1
- package/dist/charts/canvas.d.cts +1 -0
- package/dist/charts/canvas.d.ts +1 -0
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +152 -128
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -1
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +475 -405
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.js +263 -248
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/dom.cjs +1 -1
- package/dist/charts/engine/dom.cjs.map +1 -1
- package/dist/charts/engine/dom.d.cts +34 -0
- package/dist/charts/engine/dom.d.ts +34 -0
- package/dist/charts/engine/dom.js +62 -51
- package/dist/charts/engine/dom.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +1 -1
- package/dist/charts/engine/graph/chart.cjs.map +1 -1
- package/dist/charts/engine/graph/chart.js +835 -821
- package/dist/charts/engine/graph/chart.js.map +1 -1
- package/dist/charts/engine/graph/dom.cjs +1 -1
- package/dist/charts/engine/graph/dom.cjs.map +1 -1
- package/dist/charts/engine/graph/dom.js +44 -51
- package/dist/charts/engine/graph/dom.js.map +1 -1
- package/dist/charts/engine/hover-rect.cjs +2 -0
- package/dist/charts/engine/hover-rect.cjs.map +1 -0
- package/dist/charts/engine/hover-rect.d.cts +10 -0
- package/dist/charts/engine/hover-rect.d.ts +10 -0
- package/dist/charts/engine/hover-rect.js +47 -0
- package/dist/charts/engine/hover-rect.js.map +1 -0
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.js +8 -8
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.js +191 -191
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/depth.cjs +1 -1
- package/dist/charts/engine/orderbook/depth.cjs.map +1 -1
- package/dist/charts/engine/orderbook/depth.js +63 -63
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.js +155 -155
- package/dist/charts/engine/orderbook/host.cjs +1 -1
- package/dist/charts/engine/orderbook/host.cjs.map +1 -1
- package/dist/charts/engine/orderbook/host.js +87 -75
- package/dist/charts/engine/orderbook/host.js.map +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
- package/dist/charts/engine/orderbook/ladder.js +41 -41
- package/dist/charts/engine/orderbook/tape.cjs +1 -1
- package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
- package/dist/charts/engine/orderbook/tape.js +31 -31
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.js +15 -15
- package/dist/charts/engine/renderers/vector-gpu.cjs +24 -0
- package/dist/charts/engine/renderers/vector-gpu.cjs.map +1 -0
- package/dist/charts/engine/renderers/vector-gpu.d.cts +22 -0
- package/dist/charts/engine/renderers/vector-gpu.d.ts +22 -0
- package/dist/charts/engine/renderers/vector-gpu.js +301 -0
- package/dist/charts/engine/renderers/vector-gpu.js.map +1 -0
- package/dist/charts/engine/renderers/vector.cjs +2 -0
- package/dist/charts/engine/renderers/vector.cjs.map +1 -0
- package/dist/charts/engine/renderers/vector.d.cts +140 -0
- package/dist/charts/engine/renderers/vector.d.ts +140 -0
- package/dist/charts/engine/renderers/vector.js +568 -0
- package/dist/charts/engine/renderers/vector.js.map +1 -0
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +43 -3
- package/dist/charts/engine/scene.d.ts +43 -3
- package/dist/charts/engine/scene.js +411 -338
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/bullet.cjs +1 -1
- package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
- package/dist/charts/engine/shapes/bullet.js +36 -36
- package/dist/charts/engine/shapes/calendar.cjs +1 -1
- package/dist/charts/engine/shapes/calendar.cjs.map +1 -1
- package/dist/charts/engine/shapes/calendar.js +53 -53
- package/dist/charts/engine/shapes/chart.cjs +1 -1
- package/dist/charts/engine/shapes/chart.cjs.map +1 -1
- package/dist/charts/engine/shapes/chart.d.cts +3 -2
- package/dist/charts/engine/shapes/chart.d.ts +3 -2
- package/dist/charts/engine/shapes/chart.js +192 -162
- package/dist/charts/engine/shapes/chart.js.map +1 -1
- package/dist/charts/engine/shapes/draw.cjs +1 -1
- package/dist/charts/engine/shapes/draw.cjs.map +1 -1
- package/dist/charts/engine/shapes/draw.js +87 -86
- package/dist/charts/engine/shapes/draw.js.map +1 -1
- package/dist/charts/engine/shapes/layout.cjs +2 -2
- package/dist/charts/engine/shapes/layout.cjs.map +1 -1
- package/dist/charts/engine/shapes/layout.d.cts +8 -7
- package/dist/charts/engine/shapes/layout.d.ts +8 -7
- package/dist/charts/engine/shapes/layout.js +262 -166
- package/dist/charts/engine/shapes/layout.js.map +1 -1
- package/dist/charts/engine/shapes/types.d.cts +13 -1
- package/dist/charts/engine/shapes/types.d.ts +13 -1
- package/dist/charts/engine/three-d/chart.cjs +1 -1
- package/dist/charts/engine/three-d/chart.cjs.map +1 -1
- package/dist/charts/engine/three-d/chart.js +266 -257
- package/dist/charts/engine/three-d/chart.js.map +1 -1
- package/dist/charts/engine/three-d/dom.cjs +1 -1
- package/dist/charts/engine/three-d/dom.cjs.map +1 -1
- package/dist/charts/engine/three-d/dom.js +28 -35
- package/dist/charts/engine/three-d/dom.js.map +1 -1
- package/dist/charts/engine/three-d/geometry.cjs +1 -1
- package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
- package/dist/charts/engine/three-d/geometry.js +70 -70
- package/dist/charts/engine/three-d/overlay.cjs +1 -1
- package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
- package/dist/charts/engine/three-d/overlay.js +15 -15
- package/dist/charts/engine/tooltip.cjs +2 -0
- package/dist/charts/engine/tooltip.cjs.map +1 -0
- package/dist/charts/engine/tooltip.d.cts +94 -0
- package/dist/charts/engine/tooltip.d.ts +94 -0
- package/dist/charts/engine/tooltip.js +242 -0
- package/dist/charts/engine/tooltip.js.map +1 -0
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.js +135 -135
- package/dist/charts/react/shapes.cjs +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +10 -1
- package/dist/charts/react/shapes.d.ts +10 -1
- package/dist/charts/react/shapes.js +24 -19
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/canvas.cjs +1 -1
- package/dist/native/charts/src/canvas.js +8 -7
- package/dist/native/charts/src/engine/canvas.cjs +1 -1
- package/dist/native/charts/src/engine/canvas.js +2 -0
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +102 -87
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/hover-rect.cjs +2 -0
- package/dist/native/charts/src/engine/hover-rect.cjs.map +1 -0
- package/dist/native/charts/src/engine/hover-rect.js +47 -0
- package/dist/native/charts/src/engine/hover-rect.js.map +1 -0
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +318 -245
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.js +81 -80
- package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
- package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.js +239 -143
- package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
- package/dist/native/charts/src/engine/tooltip.cjs +2 -0
- package/dist/native/charts/src/engine/tooltip.cjs.map +1 -0
- package/dist/native/charts/src/engine/tooltip.js +164 -0
- package/dist/native/charts/src/engine/tooltip.js.map +1 -0
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +210 -187
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/source/components/Chart/scene.tsx +55 -2
- package/dist/taro/index.js +2026 -1626
- package/dist/uni/charts-canvas.js +1 -0
- package/dist/vue/components/Chart/BulletChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/CalendarHeatmap.vue.d.ts +2 -0
- package/dist/vue/components/Chart/ChordChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/DonutChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/FunnelChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/GaugeChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/PieChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/RadarChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/RadialBarChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/SankeyChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/SunburstChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TreemapChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/props.d.ts +2 -0
- package/dist/vue/components/Chart/props.js +1 -0
- package/dist/vue/components/Chart/props.js.map +1 -1
- package/dist/vue/components/Chart/shape.d.ts +2 -1
- package/dist/vue/components/Chart/shape.js +2 -0
- package/dist/vue/components/Chart/shape.js.map +1 -1
- package/dist/vue/components/Chart/types.d.ts +2 -0
- package/dist/weapp/charts/canvas.js +2576 -1969
- package/dist/weapp/charts/core.js +1 -0
- package/dist/web-components/components/chart/shape-chart.d.ts +9 -7
- package/dist/web-components/components/chart/shape-chart.js +3 -0
- package/dist/web-components/components/chart/shape-chart.js.map +1 -1
- package/dist/web-components/components/chart/shapes-extended.d.ts +6 -6
- package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ChartRendererKind, ChartRendererPreference } from '../types.js';
|
|
2
|
+
import { VectorBatch } from './vector.js';
|
|
3
|
+
export interface VectorRenderer {
|
|
4
|
+
readonly kind: Exclude<ChartRendererKind, "canvas2d">;
|
|
5
|
+
readonly canvas: HTMLCanvasElement;
|
|
6
|
+
/** Drawing buffer size in device pixels */
|
|
7
|
+
resize(width: number, height: number): void;
|
|
8
|
+
render(batch: VectorBatch): void;
|
|
9
|
+
destroy(): void;
|
|
10
|
+
}
|
|
11
|
+
export declare const createWebGpuVectorRenderer: (canvas: HTMLCanvasElement, onLost: () => void,
|
|
12
|
+
/** Refuses fallback (software) adapters */
|
|
13
|
+
requireHardware?: boolean) => Promise<VectorRenderer | null>;
|
|
14
|
+
/** WebGL2 or WebGL (1): the same GLSL ES 1.0 program works on both */
|
|
15
|
+
export declare const createGlVectorRenderer: (kind: "webgl2" | "webgl", canvas: HTMLCanvasElement, onLost: () => void, requireHardware?: boolean) => VectorRenderer | null;
|
|
16
|
+
/**
|
|
17
|
+
* Creates the first vector backend that works for `requested` (same order
|
|
18
|
+
* and rules as the data layer: `auto` skips software GPUs). `null` means
|
|
19
|
+
* Canvas2D: either requested, reached by the fallback chain, or nothing else
|
|
20
|
+
* works.
|
|
21
|
+
*/
|
|
22
|
+
export declare const createVectorRenderer: (requested: ChartRendererPreference | undefined, makeCanvas: () => HTMLCanvasElement, onLost: (kind: ChartRendererKind) => void, exclude?: ReadonlySet<ChartRendererKind>) => Promise<VectorRenderer | null>;
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { resolveRendererPreference as e } from "../defaults.js";
|
|
2
|
+
import { isSoftwareRenderer as t } from "./gl.js";
|
|
3
|
+
import { claimGlSlot as n } from "./gl-budget.js";
|
|
4
|
+
import { rendererCandidates as r } from "./detect.js";
|
|
5
|
+
//#region src/engine/renderers/vector-gpu.ts
|
|
6
|
+
var i = 16, a = 1, o = 15, s = 4, c = "\nstruct U { size: vec4f };\n@group(0) @binding(0) var<uniform> u: U;\nstruct O { @builtin(position) pos: vec4f, @location(0) color: vec4f };\n@vertex fn vs(@location(0) p: vec2f, @location(1) c: vec4f) -> O {\n var o: O;\n o.pos = vec4f(p.x / u.size.x * 2.0 - 1.0, 1.0 - p.y / u.size.y * 2.0, 0.0, 1.0);\n o.color = c;\n return o;\n}\n@fragment fn fs(i: O) -> @location(0) vec4f { return i.color; }\n", l = "\nattribute vec2 a_pos;\nattribute vec4 a_color;\nuniform vec2 u_size;\nvarying vec4 v_color;\nvoid main() {\n gl_Position = vec4(a_pos.x / u_size.x * 2.0 - 1.0, 1.0 - a_pos.y / u_size.y * 2.0, 0.0, 1.0);\n v_color = a_color;\n}", u = "\nprecision mediump float;\nvarying vec4 v_color;\nvoid main() { gl_FragColor = v_color; }", d = null, f = () => {
|
|
7
|
+
if (d) return d;
|
|
8
|
+
let e = typeof navigator > "u" ? void 0 : navigator.gpu;
|
|
9
|
+
if (!e) return Promise.resolve(null);
|
|
10
|
+
let t = (async () => {
|
|
11
|
+
let n = await e.requestAdapter();
|
|
12
|
+
if (!n) return null;
|
|
13
|
+
let r = n, i = await n.requestDevice(), a = {
|
|
14
|
+
device: i,
|
|
15
|
+
fallback: !!(r.info?.isFallbackAdapter || r.isFallbackAdapter),
|
|
16
|
+
lost: /* @__PURE__ */ new Set()
|
|
17
|
+
};
|
|
18
|
+
return i.lost.then(() => {
|
|
19
|
+
d === t && (d = null);
|
|
20
|
+
for (let e of [...a.lost]) e();
|
|
21
|
+
}), a;
|
|
22
|
+
})().catch(() => null);
|
|
23
|
+
return d = t, t.then((e) => {
|
|
24
|
+
!e && d === t && (d = null);
|
|
25
|
+
}), t;
|
|
26
|
+
}, p = /* @__PURE__ */ new WeakMap(), m = (e, t) => {
|
|
27
|
+
let n = p.get(e);
|
|
28
|
+
n || (n = /* @__PURE__ */ new Map(), p.set(e, n));
|
|
29
|
+
let r = n.get(t);
|
|
30
|
+
if (r) return r;
|
|
31
|
+
let i = e.createBindGroupLayout({ entries: [{
|
|
32
|
+
binding: 0,
|
|
33
|
+
visibility: a,
|
|
34
|
+
buffer: { type: "uniform" }
|
|
35
|
+
}] }), l = e.createPipelineLayout({ bindGroupLayouts: [i] }), u = e.createShaderModule({ code: c }), d = {
|
|
36
|
+
color: {
|
|
37
|
+
srcFactor: "one",
|
|
38
|
+
dstFactor: "one-minus-src-alpha",
|
|
39
|
+
operation: "add"
|
|
40
|
+
},
|
|
41
|
+
alpha: {
|
|
42
|
+
srcFactor: "one",
|
|
43
|
+
dstFactor: "one-minus-src-alpha",
|
|
44
|
+
operation: "add"
|
|
45
|
+
}
|
|
46
|
+
}, f = (n, r, i = r) => e.createRenderPipeline({
|
|
47
|
+
layout: l,
|
|
48
|
+
vertex: {
|
|
49
|
+
module: u,
|
|
50
|
+
entryPoint: "vs",
|
|
51
|
+
buffers: [{
|
|
52
|
+
arrayStride: 12,
|
|
53
|
+
attributes: [{
|
|
54
|
+
shaderLocation: 0,
|
|
55
|
+
offset: 0,
|
|
56
|
+
format: "float32x2"
|
|
57
|
+
}, {
|
|
58
|
+
shaderLocation: 1,
|
|
59
|
+
offset: 8,
|
|
60
|
+
format: "unorm8x4"
|
|
61
|
+
}]
|
|
62
|
+
}]
|
|
63
|
+
},
|
|
64
|
+
fragment: {
|
|
65
|
+
module: u,
|
|
66
|
+
entryPoint: "fs",
|
|
67
|
+
targets: [{
|
|
68
|
+
format: t,
|
|
69
|
+
blend: d,
|
|
70
|
+
writeMask: n
|
|
71
|
+
}]
|
|
72
|
+
},
|
|
73
|
+
primitive: {
|
|
74
|
+
topology: "triangle-list",
|
|
75
|
+
cullMode: "none"
|
|
76
|
+
},
|
|
77
|
+
depthStencil: {
|
|
78
|
+
format: "stencil8",
|
|
79
|
+
stencilFront: r,
|
|
80
|
+
stencilBack: i
|
|
81
|
+
},
|
|
82
|
+
multisample: { count: s }
|
|
83
|
+
}), m = {
|
|
84
|
+
layout: i,
|
|
85
|
+
pipelines: {
|
|
86
|
+
direct: f(o, {
|
|
87
|
+
compare: "always",
|
|
88
|
+
passOp: "keep"
|
|
89
|
+
}),
|
|
90
|
+
nonzero: f(0, {
|
|
91
|
+
compare: "always",
|
|
92
|
+
passOp: "increment-wrap"
|
|
93
|
+
}, {
|
|
94
|
+
compare: "always",
|
|
95
|
+
passOp: "decrement-wrap"
|
|
96
|
+
}),
|
|
97
|
+
once: f(0, {
|
|
98
|
+
compare: "always",
|
|
99
|
+
passOp: "replace"
|
|
100
|
+
}),
|
|
101
|
+
cover: f(o, {
|
|
102
|
+
compare: "not-equal",
|
|
103
|
+
passOp: "zero",
|
|
104
|
+
failOp: "keep"
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
return n.set(t, m), m;
|
|
109
|
+
}, h = async (e, t, n = !1) => {
|
|
110
|
+
let r = navigator.gpu;
|
|
111
|
+
if (!r) return null;
|
|
112
|
+
let a = await f();
|
|
113
|
+
if (!a || n && a.fallback) return null;
|
|
114
|
+
let { device: o } = a, c = e.getContext("webgpu");
|
|
115
|
+
if (!c) return null;
|
|
116
|
+
let l = r.getPreferredCanvasFormat();
|
|
117
|
+
c.configure({
|
|
118
|
+
device: o,
|
|
119
|
+
format: l,
|
|
120
|
+
alphaMode: "premultiplied"
|
|
121
|
+
});
|
|
122
|
+
let { layout: u, pipelines: d } = m(o, l), p = !1, h = () => {
|
|
123
|
+
p || t();
|
|
124
|
+
};
|
|
125
|
+
a.lost.add(h);
|
|
126
|
+
let g = o.createBuffer({
|
|
127
|
+
size: 16,
|
|
128
|
+
usage: 72
|
|
129
|
+
}), _ = o.createBindGroup({
|
|
130
|
+
layout: u,
|
|
131
|
+
entries: [{
|
|
132
|
+
binding: 0,
|
|
133
|
+
resource: { buffer: g }
|
|
134
|
+
}]
|
|
135
|
+
}), v = null, y = null, b = () => {
|
|
136
|
+
let t = Math.max(1, e.width), n = Math.max(1, e.height);
|
|
137
|
+
return y && y.width === t && y.height === n ? y : (y?.color.destroy(), y?.stencil.destroy(), y = {
|
|
138
|
+
width: t,
|
|
139
|
+
height: n,
|
|
140
|
+
color: o.createTexture({
|
|
141
|
+
size: [t, n],
|
|
142
|
+
format: l,
|
|
143
|
+
sampleCount: s,
|
|
144
|
+
usage: i
|
|
145
|
+
}),
|
|
146
|
+
stencil: o.createTexture({
|
|
147
|
+
size: [t, n],
|
|
148
|
+
format: "stencil8",
|
|
149
|
+
sampleCount: s,
|
|
150
|
+
usage: i
|
|
151
|
+
})
|
|
152
|
+
}, y);
|
|
153
|
+
};
|
|
154
|
+
return {
|
|
155
|
+
kind: "webgpu",
|
|
156
|
+
canvas: e,
|
|
157
|
+
resize(t, n) {
|
|
158
|
+
let r = Math.max(1, Math.round(t)), i = Math.max(1, Math.round(n));
|
|
159
|
+
e.width !== r && (e.width = r), e.height !== i && (e.height = i);
|
|
160
|
+
},
|
|
161
|
+
render(e) {
|
|
162
|
+
if (p) return;
|
|
163
|
+
let t = b(), n = e.count * 12;
|
|
164
|
+
if (n > 0 && (!v || v.size < n)) {
|
|
165
|
+
v?.destroy();
|
|
166
|
+
let e = 4096;
|
|
167
|
+
for (; e < n;) e *= 2;
|
|
168
|
+
v = o.createBuffer({
|
|
169
|
+
size: e,
|
|
170
|
+
usage: 40
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
v && n > 0 && o.queue.writeBuffer(v, 0, e.data, 0, n), o.queue.writeBuffer(g, 0, new Float32Array([
|
|
174
|
+
t.width,
|
|
175
|
+
t.height,
|
|
176
|
+
0,
|
|
177
|
+
0
|
|
178
|
+
]));
|
|
179
|
+
let r = o.createCommandEncoder(), i = r.beginRenderPass({
|
|
180
|
+
colorAttachments: [{
|
|
181
|
+
view: t.color.createView(),
|
|
182
|
+
resolveTarget: c.getCurrentTexture().createView(),
|
|
183
|
+
clearValue: {
|
|
184
|
+
r: 0,
|
|
185
|
+
g: 0,
|
|
186
|
+
b: 0,
|
|
187
|
+
a: 0
|
|
188
|
+
},
|
|
189
|
+
loadOp: "clear",
|
|
190
|
+
storeOp: "discard"
|
|
191
|
+
}],
|
|
192
|
+
depthStencilAttachment: {
|
|
193
|
+
view: t.stencil.createView(),
|
|
194
|
+
stencilClearValue: 0,
|
|
195
|
+
stencilLoadOp: "clear",
|
|
196
|
+
stencilStoreOp: "discard"
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
if (v && n > 0) {
|
|
200
|
+
i.setBindGroup(0, _), i.setVertexBuffer(0, v);
|
|
201
|
+
for (let t of e.draws) {
|
|
202
|
+
if (t.mode === "direct") {
|
|
203
|
+
i.setPipeline(d.direct), i.draw(t.count, 1, t.first);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
i.setPipeline(d[t.mode]), i.setStencilReference(1), i.draw(t.count, 1, t.first), i.setPipeline(d.cover), i.setStencilReference(0), i.draw(t.count, 1, t.first);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
i.end(), o.queue.submit([r.finish()]);
|
|
210
|
+
},
|
|
211
|
+
destroy() {
|
|
212
|
+
p || (p = !0, a.lost.delete(h), v?.destroy(), g.destroy(), y?.color.destroy(), y?.stencil.destroy(), c.unconfigure());
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
}, g = (e, r, i, a = !1) => {
|
|
216
|
+
let o = {
|
|
217
|
+
alpha: !0,
|
|
218
|
+
premultipliedAlpha: !0,
|
|
219
|
+
antialias: !0,
|
|
220
|
+
depth: !1,
|
|
221
|
+
stencil: !0,
|
|
222
|
+
preserveDrawingBuffer: !1,
|
|
223
|
+
failIfMajorPerformanceCaveat: a
|
|
224
|
+
}, s = r.getContext(e, o);
|
|
225
|
+
if (!s) return null;
|
|
226
|
+
if (a && t(s) || !(s.getContextAttributes()?.stencil ?? !1)) return s.getExtension("WEBGL_lose_context")?.loseContext(), null;
|
|
227
|
+
let c = () => {
|
|
228
|
+
let e = (e, t) => {
|
|
229
|
+
let n = s.createShader(e);
|
|
230
|
+
return n ? (s.shaderSource(n, t), s.compileShader(n), s.getShaderParameter(n, s.COMPILE_STATUS) ? n : (s.deleteShader(n), null)) : null;
|
|
231
|
+
}, t = e(s.VERTEX_SHADER, l), n = e(s.FRAGMENT_SHADER, u), r = s.createProgram(), i = s.createBuffer();
|
|
232
|
+
return !t || !n || !r || !i || (s.attachShader(r, t), s.attachShader(r, n), s.bindAttribLocation(r, 0, "a_pos"), s.bindAttribLocation(r, 1, "a_color"), s.linkProgram(r), s.deleteShader(t), s.deleteShader(n), !s.getProgramParameter(r, s.LINK_STATUS)) ? null : {
|
|
233
|
+
program: r,
|
|
234
|
+
size: s.getUniformLocation(r, "u_size"),
|
|
235
|
+
buffer: i
|
|
236
|
+
};
|
|
237
|
+
}, d = c();
|
|
238
|
+
if (!d) return s.getExtension("WEBGL_lose_context")?.loseContext(), null;
|
|
239
|
+
let f = !1, p = !1, m = null, h = 0, g = (e) => {
|
|
240
|
+
let t = d;
|
|
241
|
+
if (!t) return;
|
|
242
|
+
let n = r.width, i = r.height;
|
|
243
|
+
if (s.viewport(0, 0, n, i), s.disable(s.STENCIL_TEST), s.colorMask(!0, !0, !0, !0), s.stencilMask(255), s.clearColor(0, 0, 0, 0), s.clearStencil(0), s.clear(s.COLOR_BUFFER_BIT | s.STENCIL_BUFFER_BIT), e.count <= 0) return;
|
|
244
|
+
s.useProgram(t.program), s.uniform2f(t.size, n, i), s.bindBuffer(s.ARRAY_BUFFER, t.buffer);
|
|
245
|
+
let a = e.count * 12;
|
|
246
|
+
a > h && (h = Math.max(a, h * 2, 4096), s.bufferData(s.ARRAY_BUFFER, h, s.DYNAMIC_DRAW)), s.bufferSubData(s.ARRAY_BUFFER, 0, new Uint8Array(e.data, 0, a)), s.enableVertexAttribArray(0), s.enableVertexAttribArray(1), s.vertexAttribPointer(0, 2, s.FLOAT, !1, 12, 0), s.vertexAttribPointer(1, 4, s.UNSIGNED_BYTE, !0, 12, 8), s.enable(s.BLEND), s.blendFunc(s.ONE, s.ONE_MINUS_SRC_ALPHA);
|
|
247
|
+
for (let t of e.draws) {
|
|
248
|
+
if (t.mode === "direct") {
|
|
249
|
+
s.disable(s.STENCIL_TEST), s.colorMask(!0, !0, !0, !0), s.drawArrays(s.TRIANGLES, t.first, t.count);
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
s.enable(s.STENCIL_TEST), s.colorMask(!1, !1, !1, !1), t.mode === "nonzero" ? (s.stencilFunc(s.ALWAYS, 0, 255), s.stencilOpSeparate(s.FRONT, s.KEEP, s.KEEP, s.INCR_WRAP), s.stencilOpSeparate(s.BACK, s.KEEP, s.KEEP, s.DECR_WRAP)) : (s.stencilFunc(s.ALWAYS, 1, 255), s.stencilOp(s.KEEP, s.KEEP, s.REPLACE)), s.drawArrays(s.TRIANGLES, t.first, t.count), s.colorMask(!0, !0, !0, !0), s.stencilFunc(s.NOTEQUAL, 0, 255), s.stencilOp(s.KEEP, s.KEEP, s.ZERO), s.drawArrays(s.TRIANGLES, t.first, t.count);
|
|
253
|
+
}
|
|
254
|
+
s.disable(s.STENCIL_TEST);
|
|
255
|
+
}, _ = n(r, s, {
|
|
256
|
+
suspend: () => {
|
|
257
|
+
d = null, h = 0;
|
|
258
|
+
},
|
|
259
|
+
restore: () => {
|
|
260
|
+
d = c(), h = 0, d ? m && g(m) : (f = !0, i());
|
|
261
|
+
},
|
|
262
|
+
lost: () => {
|
|
263
|
+
f = !0, p || i();
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
return {
|
|
267
|
+
kind: e,
|
|
268
|
+
canvas: r,
|
|
269
|
+
resize(e, t) {
|
|
270
|
+
let n = Math.max(1, Math.round(e)), i = Math.max(1, Math.round(t));
|
|
271
|
+
r.width !== n && (r.width = n), r.height !== i && (r.height = i);
|
|
272
|
+
},
|
|
273
|
+
render(e) {
|
|
274
|
+
p || f || (m = {
|
|
275
|
+
data: e.data.slice(0, e.count * 12),
|
|
276
|
+
count: e.count,
|
|
277
|
+
draws: e.draws
|
|
278
|
+
}, _.use() && g(m));
|
|
279
|
+
},
|
|
280
|
+
destroy() {
|
|
281
|
+
p || (p = !0, _.release(), d && (s.deleteBuffer(d.buffer), s.deleteProgram(d.program)), d = null, m = null);
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
}, _ = async (t, n, i, a = /* @__PURE__ */ new Set()) => {
|
|
285
|
+
let o = e(t);
|
|
286
|
+
for (let e of r(o, a)) {
|
|
287
|
+
if (e === "canvas2d") return null;
|
|
288
|
+
let t = o === "auto" || o !== e, r;
|
|
289
|
+
try {
|
|
290
|
+
r = e === "webgpu" ? await h(n(), () => i(e), t) : g(e, n(), () => i(e), t);
|
|
291
|
+
} catch {
|
|
292
|
+
r = null;
|
|
293
|
+
}
|
|
294
|
+
if (r) return r;
|
|
295
|
+
}
|
|
296
|
+
return null;
|
|
297
|
+
};
|
|
298
|
+
//#endregion
|
|
299
|
+
export { g as createGlVectorRenderer, _ as createVectorRenderer, h as createWebGpuVectorRenderer };
|
|
300
|
+
|
|
301
|
+
//# sourceMappingURL=vector-gpu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-gpu.js","names":["TEXTURE_RENDER_ATTACHMENT","STAGE_VERTEX","COLOR_ALL","SAMPLES","WGSL","GLSL_VERTEX","GLSL_FRAGMENT","shared","sharedDevice","gpu","promise","adapter","info","device","entry","listener","pipelineCache","createPipelines","byFormat","cached","format","layout","pipelineLayout","module","blend","make","front","back","createWebGpuVectorRenderer","requireHardware","context","canvas","destroyed","lost","onLost","uniform","bindGroup","vertex","targets","ensureTargets","width","height","w","h","bytes","batch","size","encoder","pass","draw","pipelines","createGlVectorRenderer","attributes","gl","kind","isSoftwareRenderer","compile","shader","s","type","source","vs","fs","program","buffer","last","capacity","p","d","slot","claimGlSlot","createVectorRenderer","preference","resolveRendererPreference","requested","rendererCandidates","exclude","renderer","makeCanvas"],"sources":["../../../../../charts/src/engine/renderers/vector-gpu.ts"],"sourcesContent":["// GPU backends of the vector layer (shape charts): WebGPU, then WebGL2 /\n// WebGL. Both draw a VectorBatch with 4x MSAA and an 8-bit stencil (see the\n// draw modes in vector.ts). Canvas2D needs no backend: the host draws the\n// scene directly.\n\nimport { resolveRendererPreference } from \"../defaults\";\nimport type { ChartRendererKind, ChartRendererPreference } from \"../types\";\nimport { rendererCandidates } from \"./detect\";\nimport { isSoftwareRenderer } from \"./gl\";\nimport { claimGlSlot } from \"./gl-budget\";\nimport { VECTOR_STRIDE, type VectorBatch } from \"./vector\";\n\nexport interface VectorRenderer {\n readonly kind: Exclude<ChartRendererKind, \"canvas2d\">;\n readonly canvas: HTMLCanvasElement;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(batch: VectorBatch): void;\n destroy(): void;\n}\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst TEXTURE_RENDER_ATTACHMENT = 0x10;\nconst STAGE_VERTEX = 0x1;\nconst COLOR_ALL = 0xf;\nconst SAMPLES = 4;\n\nconst WGSL = /* wgsl */ `\nstruct U { size: vec4f };\n@group(0) @binding(0) var<uniform> u: U;\nstruct O { @builtin(position) pos: vec4f, @location(0) color: vec4f };\n@vertex fn vs(@location(0) p: vec2f, @location(1) c: vec4f) -> O {\n var o: O;\n o.pos = vec4f(p.x / u.size.x * 2.0 - 1.0, 1.0 - p.y / u.size.y * 2.0, 0.0, 1.0);\n o.color = c;\n return o;\n}\n@fragment fn fs(i: O) -> @location(0) vec4f { return i.color; }\n`;\n\nconst GLSL_VERTEX = `\nattribute vec2 a_pos;\nattribute vec4 a_color;\nuniform vec2 u_size;\nvarying vec4 v_color;\nvoid main() {\n gl_Position = vec4(a_pos.x / u_size.x * 2.0 - 1.0, 1.0 - a_pos.y / u_size.y * 2.0, 0.0, 1.0);\n v_color = a_color;\n}`;\n\nconst GLSL_FRAGMENT = `\nprecision mediump float;\nvarying vec4 v_color;\nvoid main() { gl_FragColor = v_color; }`;\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\ninterface SharedDevice {\n device: GPUDevice;\n /** Software (fallback) adapter */\n fallback: boolean;\n /** Called when the device is lost */\n lost: Set<() => void>;\n}\n\nlet shared: Promise<SharedDevice | null> | null = null;\n\n/**\n * One device for every shape chart of the page (a dashboard has dozens of\n * small charts); recreated after a loss.\n */\nconst sharedDevice = (): Promise<SharedDevice | null> => {\n if (shared) return shared;\n const gpu =\n typeof navigator === \"undefined\"\n ? undefined\n : (navigator as GpuNavigator).gpu;\n if (!gpu) return Promise.resolve(null);\n const promise = (async (): Promise<SharedDevice | null> => {\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const info = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n const device = await adapter.requestDevice();\n const entry: SharedDevice = {\n device,\n fallback: !!(info.info?.isFallbackAdapter || info.isFallbackAdapter),\n lost: new Set(),\n };\n void device.lost.then(() => {\n if (shared === promise) shared = null;\n for (const listener of [...entry.lost]) listener();\n });\n return entry;\n })().catch(() => null);\n shared = promise;\n void promise.then((entry) => {\n if (!entry && shared === promise) shared = null;\n });\n return promise;\n};\n\nconst pipelineCache = new WeakMap<\n GPUDevice,\n Map<string, { layout: GPUBindGroupLayout; pipelines: VectorPipelines }>\n>();\n\ninterface VectorPipelines {\n direct: GPURenderPipeline;\n nonzero: GPURenderPipeline;\n once: GPURenderPipeline;\n cover: GPURenderPipeline;\n}\n\nconst createPipelines = (device: GPUDevice, format: GPUTextureFormat) => {\n let byFormat = pipelineCache.get(device);\n if (!byFormat) {\n byFormat = new Map();\n pipelineCache.set(device, byFormat);\n }\n const cached = byFormat.get(format);\n if (cached) return cached;\n const layout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: STAGE_VERTEX, buffer: { type: \"uniform\" } },\n ],\n });\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [layout],\n });\n const module = device.createShaderModule({ code: WGSL });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const make = (\n writeMask: number,\n front: GPUStencilFaceState,\n back: GPUStencilFaceState = front,\n ) =>\n device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs\",\n buffers: [\n {\n arrayStride: VECTOR_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"unorm8x4\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend, writeMask }],\n },\n primitive: { topology: \"triangle-list\", cullMode: \"none\" },\n depthStencil: {\n format: \"stencil8\",\n stencilFront: front,\n stencilBack: back,\n },\n multisample: { count: SAMPLES },\n });\n const pipelines: VectorPipelines = {\n direct: make(COLOR_ALL, { compare: \"always\", passOp: \"keep\" }),\n // winding numbers: front faces count up, back faces down\n nonzero: make(\n 0,\n { compare: \"always\", passOp: \"increment-wrap\" },\n { compare: \"always\", passOp: \"decrement-wrap\" },\n ),\n once: make(0, { compare: \"always\", passOp: \"replace\" }),\n // colors the covered samples once and clears them for the next path\n cover: make(COLOR_ALL, {\n compare: \"not-equal\",\n passOp: \"zero\",\n failOp: \"keep\",\n }),\n };\n const entry = { layout, pipelines };\n byFormat.set(format, entry);\n return entry;\n};\n\nexport const createWebGpuVectorRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: () => void,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<VectorRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const entry = await sharedDevice();\n if (!entry || (requireHardware && entry.fallback)) return null;\n const { device } = entry;\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) return null;\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n const { layout, pipelines } = createPipelines(device, format);\n\n let destroyed = false;\n const lost = () => {\n if (!destroyed) onLost();\n };\n entry.lost.add(lost);\n\n const uniform = device.createBuffer({\n size: 16,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n const bindGroup = device.createBindGroup({\n layout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n });\n let vertex: GPUBuffer | null = null;\n let targets: {\n width: number;\n height: number;\n color: GPUTexture;\n stencil: GPUTexture;\n } | null = null;\n\n const ensureTargets = () => {\n const width = Math.max(1, canvas.width);\n const height = Math.max(1, canvas.height);\n if (targets && targets.width === width && targets.height === height)\n return targets;\n targets?.color.destroy();\n targets?.stencil.destroy();\n targets = {\n width,\n height,\n color: device.createTexture({\n size: [width, height],\n format,\n sampleCount: SAMPLES,\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n stencil: device.createTexture({\n size: [width, height],\n format: \"stencil8\",\n sampleCount: SAMPLES,\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n };\n return targets;\n };\n\n return {\n kind: \"webgpu\",\n canvas,\n resize(width, height) {\n const w = Math.max(1, Math.round(width));\n const h = Math.max(1, Math.round(height));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n },\n render(batch) {\n if (destroyed) return;\n const t = ensureTargets();\n const bytes = batch.count * VECTOR_STRIDE;\n if (bytes > 0 && (!vertex || vertex.size < bytes)) {\n vertex?.destroy();\n let size = 4096;\n while (size < bytes) size *= 2;\n vertex = device.createBuffer({\n size,\n usage: BUFFER_VERTEX | BUFFER_COPY_DST,\n });\n }\n if (vertex && bytes > 0)\n device.queue.writeBuffer(vertex, 0, batch.data, 0, bytes);\n device.queue.writeBuffer(\n uniform,\n 0,\n new Float32Array([t.width, t.height, 0, 0]),\n );\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: t.color.createView(),\n resolveTarget: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: t.stencil.createView(),\n stencilClearValue: 0,\n stencilLoadOp: \"clear\",\n stencilStoreOp: \"discard\",\n },\n });\n if (vertex && bytes > 0) {\n pass.setBindGroup(0, bindGroup);\n pass.setVertexBuffer(0, vertex);\n for (const draw of batch.draws) {\n if (draw.mode === \"direct\") {\n pass.setPipeline(pipelines.direct);\n pass.draw(draw.count, 1, draw.first);\n continue;\n }\n pass.setPipeline(pipelines[draw.mode]);\n pass.setStencilReference(1);\n pass.draw(draw.count, 1, draw.first);\n pass.setPipeline(pipelines.cover);\n pass.setStencilReference(0);\n pass.draw(draw.count, 1, draw.first);\n }\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n entry.lost.delete(lost);\n vertex?.destroy();\n uniform.destroy();\n targets?.color.destroy();\n targets?.stencil.destroy();\n context.unconfigure();\n },\n };\n};\n\n/** WebGL2 or WebGL (1): the same GLSL ES 1.0 program works on both */\nexport const createGlVectorRenderer = (\n kind: \"webgl2\" | \"webgl\",\n canvas: HTMLCanvasElement,\n onLost: () => void,\n requireHardware = false,\n): VectorRenderer | null => {\n const attributes: WebGLContextAttributes = {\n alpha: true,\n premultipliedAlpha: true,\n antialias: true,\n depth: false,\n stencil: true,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n };\n const gl = canvas.getContext(kind, attributes) as\n WebGLRenderingContext | WebGL2RenderingContext | null;\n if (!gl) return null;\n if (\n (requireHardware && isSoftwareRenderer(gl)) ||\n !(gl.getContextAttributes()?.stencil ?? false)\n ) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n interface Program {\n program: WebGLProgram;\n size: WebGLUniformLocation | null;\n buffer: WebGLBuffer;\n }\n const compile = (): Program | null => {\n const shader = (type: number, source: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, source);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, GLSL_VERTEX);\n const fs = shader(gl.FRAGMENT_SHADER, GLSL_FRAGMENT);\n const program = gl.createProgram();\n const buffer = gl.createBuffer();\n if (!vs || !fs || !program || !buffer) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.bindAttribLocation(program, 0, \"a_pos\");\n gl.bindAttribLocation(program, 1, \"a_color\");\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) return null;\n return {\n program,\n size: gl.getUniformLocation(program, \"u_size\"),\n buffer,\n };\n };\n let program = compile();\n if (!program) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n let lost = false;\n let destroyed = false;\n let last: VectorBatch | null = null;\n let capacity = 0;\n\n const draw = (batch: VectorBatch) => {\n const p = program;\n if (!p) return;\n const w = canvas.width;\n const h = canvas.height;\n gl.viewport(0, 0, w, h);\n gl.disable(gl.STENCIL_TEST);\n gl.colorMask(true, true, true, true);\n gl.stencilMask(0xff);\n gl.clearColor(0, 0, 0, 0);\n gl.clearStencil(0);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n if (batch.count <= 0) return;\n gl.useProgram(p.program);\n gl.uniform2f(p.size, w, h);\n gl.bindBuffer(gl.ARRAY_BUFFER, p.buffer);\n const bytes = batch.count * VECTOR_STRIDE;\n if (bytes > capacity) {\n capacity = Math.max(bytes, capacity * 2, 4096);\n gl.bufferData(gl.ARRAY_BUFFER, capacity, gl.DYNAMIC_DRAW);\n }\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Uint8Array(batch.data, 0, bytes));\n gl.enableVertexAttribArray(0);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, VECTOR_STRIDE, 0);\n gl.vertexAttribPointer(1, 4, gl.UNSIGNED_BYTE, true, VECTOR_STRIDE, 8);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n for (const d of batch.draws) {\n if (d.mode === \"direct\") {\n gl.disable(gl.STENCIL_TEST);\n gl.colorMask(true, true, true, true);\n gl.drawArrays(gl.TRIANGLES, d.first, d.count);\n continue;\n }\n gl.enable(gl.STENCIL_TEST);\n gl.colorMask(false, false, false, false);\n if (d.mode === \"nonzero\") {\n gl.stencilFunc(gl.ALWAYS, 0, 0xff);\n gl.stencilOpSeparate(gl.FRONT, gl.KEEP, gl.KEEP, gl.INCR_WRAP);\n gl.stencilOpSeparate(gl.BACK, gl.KEEP, gl.KEEP, gl.DECR_WRAP);\n } else {\n gl.stencilFunc(gl.ALWAYS, 1, 0xff);\n gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);\n }\n gl.drawArrays(gl.TRIANGLES, d.first, d.count);\n gl.colorMask(true, true, true, true);\n gl.stencilFunc(gl.NOTEQUAL, 0, 0xff);\n gl.stencilOp(gl.KEEP, gl.KEEP, gl.ZERO);\n gl.drawArrays(gl.TRIANGLES, d.first, d.count);\n }\n gl.disable(gl.STENCIL_TEST);\n };\n\n // past the page-wide context budget the context may be suspended while\n // off-screen; it comes back with a fresh program and the last frame\n const slot = claimGlSlot(canvas, gl, {\n suspend: () => {\n program = null;\n capacity = 0;\n },\n restore: () => {\n program = compile();\n capacity = 0;\n if (!program) {\n lost = true;\n onLost();\n } else if (last) draw(last);\n },\n lost: () => {\n lost = true;\n if (!destroyed) onLost();\n },\n });\n\n return {\n kind,\n canvas,\n resize(width, height) {\n const w = Math.max(1, Math.round(width));\n const h = Math.max(1, Math.round(height));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n },\n render(batch) {\n if (destroyed || lost) return;\n // keep a copy: a restored context redraws it\n last = {\n data: batch.data.slice(0, batch.count * VECTOR_STRIDE),\n count: batch.count,\n draws: batch.draws,\n };\n if (!slot.use()) return;\n draw(last);\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n slot.release();\n if (program) {\n gl.deleteBuffer(program.buffer);\n gl.deleteProgram(program.program);\n }\n program = null;\n last = null;\n },\n };\n};\n\n/**\n * Creates the first vector backend that works for `requested` (same order\n * and rules as the data layer: `auto` skips software GPUs). `null` means\n * Canvas2D: either requested, reached by the fallback chain, or nothing else\n * works.\n */\nexport const createVectorRenderer = async (\n requested: ChartRendererPreference | undefined,\n makeCanvas: () => HTMLCanvasElement,\n onLost: (kind: ChartRendererKind) => void,\n exclude: ReadonlySet<ChartRendererKind> = new Set(),\n): Promise<VectorRenderer | null> => {\n const preference = resolveRendererPreference(requested);\n for (const kind of rendererCandidates(preference, exclude)) {\n if (kind === \"canvas2d\") return null;\n const requireHardware = preference === \"auto\" || preference !== kind;\n let renderer: VectorRenderer | null;\n try {\n renderer =\n kind === \"webgpu\"\n ? await createWebGpuVectorRenderer(\n makeCanvas(),\n () => onLost(kind),\n requireHardware,\n )\n : createGlVectorRenderer(\n kind,\n makeCanvas(),\n () => onLost(kind),\n requireHardware,\n );\n } catch {\n renderer = null;\n }\n if (renderer) return renderer;\n }\n return null;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../color.cjs");var t=.1,n=5,r=new Map,i=t=>{let n=r.get(t);return n||(n=e.resolveColor(t,null,[0,0,0,1]),r.size>512&&r.clear(),r.set(t,n)),n},a=(e,t)=>[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]],o=e=>{let t=e[0]*e[3]-e[1]*e[2]||1e-12;return[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[3]*e[4])/t,(e[1]*e[4]-e[0]*e[5])/t]},s=e=>{let t=e.length>>1;if(t<3)return!1;let n=0,r=0;for(let i=0;i<t;i++){let a=(i+t-1)%t,o=(i+1)%t,s=e[i*2]-e[a*2],c=e[i*2+1]-e[a*2+1],l=e[o*2]-e[i*2],u=e[o*2+1]-e[i*2+1],d=s*u-c*l;if(Math.abs(d)>1e-9){let e=d>0?1:-1;if(n&&e!==n)return!1;n=e}r+=Math.atan2(d,s*l+c*u)}return Math.abs(Math.abs(r)-Math.PI*2)<.01},c=(e,t)=>{let n=[];for(let t=0;t<e.length;t+=2){let r=n.length;r&&Math.abs(n[r-2]-e[t])<.001&&Math.abs(n[r-1]-e[t+1])<.001||n.push(e[t],e[t+1])}return t&&n.length>=4&&Math.abs(n[0]-n[n.length-2])<.001&&Math.abs(n[1]-n[n.length-1])<.001&&(n.length-=2),n},l=(e,t,n=0)=>{let r=t.reduce((e,t)=>e+t,0);if(!(r>0)||e.length<4)return[e.slice()];let i=[],a=0,o=t[0],s=(n%r+r)%r;for(;s>0;)s>=o?(s-=o,a=(a+1)%t.length,o=t[a]):(o-=s,s=0);let c=a%2==0?[e[0],e[1]]:null;for(let n=2;n<e.length;n+=2){let r=e[n-2],s=e[n-1],l=e[n],u=e[n+1],d=Math.hypot(l-r,u-s);for(;d>0;){let e=Math.min(o,d),n=e/d,f=r+(l-r)*n,p=s+(u-s)*n;c&&c.push(f,p),d-=e,o-=e,r=f,s=p,o<=1e-9&&(c?(c.length>=4&&i.push(c),c=null):c=[f,p],a=(a+1)%t.length,o=t[a])}}return c&&c.length>=4&&i.push(c),i},u=class{constructor(){this.buffer=new ArrayBuffer(12288),this.f32=new Float32Array(this.buffer),this.u32=new Uint32Array(this.buffer),this.count=0}reserve(e){let t=(this.count+e)*12;if(t<=this.buffer.byteLength)return;let n=this.buffer.byteLength;for(;n<t;)n*=2;let r=new ArrayBuffer(n);new Uint8Array(r).set(new Uint8Array(this.buffer,0,this.count*12)),this.buffer=r,this.f32=new Float32Array(r),this.u32=new Uint32Array(r)}push(e,t,n){this.reserve(1);let r=this.count*3;this.f32[r]=e,this.f32[r+1]=t,this.u32[r+2]=n,this.count++}},d=(e,t)=>{let n=Math.max(0,Math.min(1,e[3]*t)),r=e=>Math.round(Math.max(0,Math.min(1,e))*n*255)&255;return(r(e[0])|r(e[1])<<8|r(e[2])<<16|(Math.round(n*255)&255)<<24)>>>0},f=e=>({matrix:e,fillStyle:`#000`,strokeStyle:`#000`,lineWidth:1,lineCap:`butt`,lineJoin:`miter`,miterLimit:10,globalAlpha:1,shadowColor:`rgba(0, 0, 0, 0)`,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,dash:[],lineDashOffset:0,font:`10px sans-serif`,textAlign:`start`,textBaseline:`alphabetic`}),p=class{constructor(e=null,t=1){this.vertices=new u,this.draws=[],this.stack=[],this.subpaths=[],this.cx=0,this.cy=0,this.hasPoint=!1,this.text=e,this.state=f([t,0,0,t,0,0])}reset(e,t){this.text=e,this.vertices.count=0,this.draws=[],this.stack=[],this.subpaths=[],this.hasPoint=!1,this.state=f([t,0,0,t,0,0])}finish(){return{data:this.vertices.buffer,count:this.vertices.count,draws:this.draws.slice()}}get fillStyle(){return this.state.fillStyle}set fillStyle(e){this.state.fillStyle=e}get strokeStyle(){return this.state.strokeStyle}set strokeStyle(e){this.state.strokeStyle=e}get lineWidth(){return this.state.lineWidth}set lineWidth(e){Number.isFinite(e)&&e>0&&(this.state.lineWidth=e)}get lineCap(){return this.state.lineCap}set lineCap(e){this.state.lineCap=e}get lineJoin(){return this.state.lineJoin}set lineJoin(e){this.state.lineJoin=e}get miterLimit(){return this.state.miterLimit}set miterLimit(e){Number.isFinite(e)&&e>0&&(this.state.miterLimit=e)}get globalAlpha(){return this.state.globalAlpha}set globalAlpha(e){Number.isFinite(e)&&e>=0&&e<=1&&(this.state.globalAlpha=e)}get shadowColor(){return this.state.shadowColor}set shadowColor(e){this.state.shadowColor=e}get shadowBlur(){return this.state.shadowBlur}set shadowBlur(e){Number.isFinite(e)&&e>=0&&(this.state.shadowBlur=e)}get shadowOffsetX(){return this.state.shadowOffsetX}set shadowOffsetX(e){Number.isFinite(e)&&(this.state.shadowOffsetX=e)}get shadowOffsetY(){return this.state.shadowOffsetY}set shadowOffsetY(e){Number.isFinite(e)&&(this.state.shadowOffsetY=e)}get lineDashOffset(){return this.state.lineDashOffset}set lineDashOffset(e){Number.isFinite(e)&&(this.state.lineDashOffset=e)}get font(){return this.state.font}set font(e){this.state.font=e}get textAlign(){return this.state.textAlign}set textAlign(e){this.state.textAlign=e}get textBaseline(){return this.state.textBaseline}set textBaseline(e){this.state.textBaseline=e}setLineDash(e){e.some(e=>!Number.isFinite(e)||e<0)||(this.state.dash=e.length%2?[...e,...e]:[...e])}getLineDash(){return[...this.state.dash]}save(){this.stack.push({...this.state,matrix:[...this.state.matrix],dash:[...this.state.dash]})}restore(){let e=this.stack.pop();e&&(this.state=e)}translate(e,t){this.state.matrix=a(this.state.matrix,[1,0,0,1,e,t])}scale(e,t){this.state.matrix=a(this.state.matrix,[e,0,0,t,0,0])}rotate(e){let t=Math.cos(e),n=Math.sin(e);this.state.matrix=a(this.state.matrix,[t,n,-n,t,0,0])}transform(e,t,n,r,i,o){this.state.matrix=a(this.state.matrix,[e,t,n,r,i,o])}createLinearGradient(e,t,n,r){let a={x0:e,y0:t,x1:n,y1:r,stops:[],addColorStop(e,t){let n=Math.max(0,Math.min(1,e));a.stops.push({offset:n,color:i(t)}),a.stops.sort((e,t)=>e.offset-t.offset)}};return a}unit(){let e=this.state.matrix;return Math.sqrt(Math.abs(e[0]*e[3]-e[1]*e[2]))||1}current(){let e=this.subpaths[this.subpaths.length-1];return e||(e={points:[],closed:!1},this.subpaths.push(e)),e}add(e,t){let n=this.state.matrix;this.current().points.push(n[0]*e+n[2]*t+n[4],n[1]*e+n[3]*t+n[5]),this.cx=e,this.cy=t,this.hasPoint=!0}beginPath(){this.subpaths=[],this.hasPoint=!1}moveTo(e,t){this.subpaths.push({points:[],closed:!1}),this.add(e,t)}lineTo(e,t){this.hasPoint?this.add(e,t):this.moveTo(e,t)}closePath(){let e=this.subpaths[this.subpaths.length-1];if(!e||e.points.length<2)return;e.closed=!0;let t=o(this.state.matrix),n=e.points[0],r=e.points[1];this.subpaths.push({points:[n,r],closed:!1}),this.cx=t[0]*n+t[2]*r+t[4],this.cy=t[1]*n+t[3]*r+t[5]}rect(e,t,n,r){this.moveTo(e,t),this.add(e+n,t),this.add(e+n,t+r),this.add(e,t+r),this.closePath()}arcPoints(e,n,r,i,a){let o=r*this.unit(),s=o>t?Math.max(.01,Math.min(Math.PI/8,2*Math.acos(1-t/o))):Math.PI/2,c=Math.max(1,Math.ceil(Math.abs(a)/s));for(let t=1;t<=c;t++){let o=i+a*t/c;this.add(e+r*Math.cos(o),n+r*Math.sin(o))}}arc(e,t,n,r,i,a=!1){if(!(n>=0))return;let o=Math.PI*2,s;!a&&i-r>=o?s=o:a&&r-i>=o?s=-o:(s=(i-r)%o,!a&&s<0&&(s+=o),a&&s>0&&(s-=o));let c=e+n*Math.cos(r),l=t+n*Math.sin(r);this.hasPoint?this.lineTo(c,l):this.moveTo(c,l),s!==0&&this.arcPoints(e,t,n,r,s)}arcTo(e,t,n,r,i){this.hasPoint||this.moveTo(e,t);let a=this.cx,o=this.cy,s=a-e,c=o-t,l=n-e,u=r-t,d=Math.hypot(s,c),f=Math.hypot(l,u),p=s*u-c*l;if(i<=0||d<1e-9||f<1e-9||Math.abs(p)<1e-9){this.lineTo(e,t);return}let m=Math.max(-1,Math.min(1,(s*l+c*u)/(d*f))),h=Math.acos(m)/2,g=i/Math.tan(h),_=e+s/d*g,v=t+c/d*g,y=e+l/f*g,b=t+u/f*g,x=s/d+l/f,S=c/d+u/f,C=Math.hypot(x,S),w=i/Math.sin(h),T=e+x/C*w,E=t+S/C*w;this.lineTo(_,v);let D=Math.atan2(v-E,_-T),O=Math.atan2(b-E,y-T)-D;O>Math.PI&&(O-=Math.PI*2),O<-Math.PI&&(O+=Math.PI*2),this.arcPoints(T,E,i,D,O)}quadraticCurveTo(e,n,r,i){this.hasPoint||this.moveTo(e,n);let a=this.cx,o=this.cy,s=Math.hypot(a-2*e+r,o-2*n+i)*this.unit(),c=Math.max(1,Math.min(128,Math.ceil(Math.sqrt(s/(8*t)))));for(let t=1;t<=c;t++){let s=t/c,l=1-s;this.add(l*l*a+2*l*s*e+s*s*r,l*l*o+2*l*s*n+s*s*i)}}bezierCurveTo(e,n,r,i,a,o){this.hasPoint||this.moveTo(e,n);let s=this.cx,c=this.cy,l=Math.max(Math.hypot(s-2*e+r,c-2*n+i),Math.hypot(e-2*r+a,n-2*i+o))*this.unit(),u=Math.max(1,Math.min(160,Math.ceil(Math.sqrt(.75*l/t))));for(let t=1;t<=u;t++){let l=t/u,d=1-l;this.add(d*d*d*s+3*d*d*l*e+3*d*l*l*r+l*l*l*a,d*d*d*c+3*d*d*l*n+3*d*l*l*i+l*l*l*o)}}shader(e,t){if(typeof e==`string`){let n=i(e);if(n[3]*t<=.001)return null;let r=d(n,t);return()=>r}let n=e;if(!n.stops.length)return null;if(n.stops.length===1){let e=d(n.stops[0].color,t);return()=>e}let r=o(this.state.matrix),a=n.x1-n.x0,s=n.y1-n.y0,c=a*a+s*s,l=n.stops;return(e,i)=>{let o=r[0]*e+r[2]*i+r[4],u=r[1]*e+r[3]*i+r[5],f=c>0?((o-n.x0)*a+(u-n.y0)*s)/c:0,p=0;for(;p<l.length-1&&l[p+1].offset<f;)p++;let m=l[p],h=l[Math.min(p+1,l.length-1)],g=h.offset-m.offset,_=g>0?Math.max(0,Math.min(1,(f-m.offset)/g)):f<m.offset?0:1;return d([m.color[0]+(h.color[0]-m.color[0])*_,m.color[1]+(h.color[1]-m.color[1])*_,m.color[2]+(h.color[2]-m.color[2])*_,m.color[3]+(h.color[3]-m.color[3])*_],t)}}emit(e,t){let n=this.vertices.count-t;if(n<=0)return;let r=this.draws[this.draws.length-1];e===`direct`&&r?.mode===`direct`&&r.first+r.count===t?r.count+=n:this.draws.push({mode:e,first:t,count:n})}triangle(e,t,n,r,i,a,o,s=0,c=0){let l=this.vertices;l.reserve(3),l.push(t+s,n+c,e(t,n)),l.push(r+s,i+c,e(r,i)),l.push(a+s,o+c,e(a,o))}polygons(){let e=[];for(let t of this.subpaths){let n=c(t.points,!0);n.length>=6&&e.push(n)}return e}fillPolygons(e,t,n=0,r=0){if(!e.length)return;let i=e.length===1&&s(e[0]),a=this.vertices.count;for(let i of e)for(let e=2;e+3<i.length;e+=2)this.triangle(t,i[0],i[1],i[e],i[e+1],i[e+2],i[e+3],n,r);this.emit(i?`direct`:`nonzero`,a)}shadow(e,t){let r=this.state,a=i(r.shadowColor),o=a[3]*r.globalAlpha;if(o<=.002||!r.shadowBlur&&!r.shadowOffsetX&&!r.shadowOffsetY)return;let s=r.shadowOffsetX,c=r.shadowOffsetY,l=r.shadowBlur,u=l>0?o*.35:o,f=d([a[0],a[1],a[2],1],u);if(t&&this.fillPolygons(e,()=>f,s,c),l<=0)return;let p=1-(1-o*.65)**(1/n),m=(()=>{let e=d([a[0],a[1],a[2],1],p);return()=>e})();for(let r=1;r<=n;r++){let i=l*r/n,a=this.vertices.count;for(let n of e)this.strokePolyline(n,t,i,m,`round`,`round`,s,c);this.emit(`once`,a)}}fill(){let e=this.shader(this.state.fillStyle,this.state.globalAlpha),t=this.polygons();t.length&&(this.shadow(t,!0),e&&this.fillPolygons(t,e))}fillRect(e,t,n,r){let i=this.subpaths,a=this.hasPoint,[o,s]=[this.cx,this.cy];this.subpaths=[],this.rect(e,t,n,r),this.fill(),this.subpaths=i,this.hasPoint=a,this.cx=o,this.cy=s}stroke(){let e=this.state,t=e.lineWidth*this.unit(),n=e.globalAlpha;t<1&&(n*=t,t=1);let r=this.shader(e.strokeStyle,n);if(!r)return;let i=e.dash.map(e=>e*this.unit()),a=this.vertices.count;for(let n of this.subpaths){let a=c(n.points,n.closed);if(!(a.length<2)){if(a.length===2){n.points.length>=4&&e.lineCap===`round`&&this.disc(r,a[0],a[1],t/2);continue}if(i.length&&i.some(e=>e>0)){let o=n.closed?[...a,a[0],a[1]]:a;for(let n of l(o,i,e.lineDashOffset*this.unit()))this.strokePolyline(n,!1,t/2,r,e.lineCap,e.lineJoin)}else this.strokePolyline(a,n.closed,t/2,r,e.lineCap,e.lineJoin)}}this.emit(`once`,a)}disc(e,t,n,r,i=0,a=0){let o=Math.max(8,Math.min(64,Math.ceil(r*1.5))),s=t+r,c=n;for(let l=1;l<=o;l++){let u=l/o*Math.PI*2,d=t+r*Math.cos(u),f=n+r*Math.sin(u);this.triangle(e,t,n,s,c,d,f,i,a),s=d,c=f}}strokePolyline(e,n,r,i,a,o,s=0,c=0){let l=e.length>>1;if(l<2)return;let u=n?l:l-1,d=t=>{let n=(t+1)%l,r=e[n*2]-e[t*2],i=e[n*2+1]-e[t*2+1],a=Math.hypot(r,i)||1;return[-i/a,r/a,r/a,i/a]};for(let t=0;t<u;t++){let o=(t+1)%l,f=e[t*2],p=e[t*2+1],m=e[o*2],h=e[o*2+1],[g,_,v,y]=d(t);!n&&a===`square`&&(t===0&&(f-=v*r,p-=y*r),t===u-1&&(m+=v*r,h+=y*r));let b=g*r,x=_*r;this.triangle(i,f+b,p+x,m+b,h+x,m-b,h-x,s,c),this.triangle(i,f+b,p+x,m-b,h-x,f-b,p-x,s,c)}let f=+!n,p=n?l:l-1;for(let n=f;n<p;n++){let[a,u,f,p]=d((n+l-1)%l),[m,h,g,_]=d(n),v=e[n*2],y=e[n*2+1],b=f*_-p*g,x=f*g+p*_;if(Math.abs(b)<1e-6&&x>0)continue;let S=b>0?-1:1,C=v+a*r*S,w=y+u*r*S,T=v+m*r*S,E=y+h*r*S;if(o===`round`&&Math.atan2(Math.abs(b),x)*r>.5){let e=Math.atan2(w-y,C-v),n=Math.atan2(E-y,T-v)-e;n>Math.PI&&(n-=Math.PI*2),n<-Math.PI&&(n+=Math.PI*2);let a=Math.max(1,Math.ceil(Math.abs(n)/Math.max(.05,2*Math.acos(Math.max(0,1-t/r))))),o=C,l=w;for(let t=1;t<=a;t++){let u=e+n*t/a,d=v+r*Math.cos(u),f=y+r*Math.sin(u);this.triangle(i,v,y,o,l,d,f,s,c),o=d,l=f}}else if(o===`miter`){let e=a+m,t=u+h,n=Math.hypot(e,t),o=n/2;if(n>1e-6&&1/o<=this.state.miterLimit){let a=r/o*S,l=v+e/n*a,u=y+t/n*a;this.triangle(i,v,y,C,w,l,u,s,c),this.triangle(i,v,y,l,u,T,E,s,c)}else this.triangle(i,v,y,C,w,T,E,s,c)}else this.triangle(i,v,y,C,w,T,E,s,c)}!n&&a===`round`&&(this.disc(i,e[0],e[1],r,s,c),this.disc(i,e[(l-1)*2],e[(l-1)*2+1],r,s,c))}syncText(){let e=this.text;if(!e)return null;let t=this.state,n=t.matrix;return e.setTransform(n[0],n[1],n[2],n[3],n[4],n[5]),e.globalAlpha=t.globalAlpha,e.font=t.font,e.textAlign=t.textAlign,e.textBaseline=t.textBaseline,e.lineWidth=t.lineWidth,e.lineJoin=t.lineJoin,e}textPaint(e){if(typeof e==`string`)return e;let t=this.text;if(!t)return`#000`;let n=t.createLinearGradient(e.x0,e.y0,e.x1,e.y1);for(let t of e.stops){let[e,r,i,a]=t.color;n.addColorStop(t.offset,`rgba(${Math.round(e*255)}, ${Math.round(r*255)}, ${Math.round(i*255)}, ${a})`)}return n}fillText(e,t,n,r){let i=this.syncText();i&&(i.fillStyle=this.textPaint(this.state.fillStyle),r===void 0?i.fillText(e,t,n):i.fillText(e,t,n,r))}strokeText(e,t,n,r){let i=this.syncText();i&&(i.strokeStyle=this.textPaint(this.state.strokeStyle),r===void 0?i.strokeText(e,t,n):i.strokeText(e,t,n,r))}measureText(e){let t=this.text;return t?(t.font=this.state.font,t.measureText(e)):{width:e.length*6}}};exports.VectorRecorder=p,exports.dashPolyline=l,exports.isConvex=s,exports.packPremultiplied=d,exports.vectorColor=i;
|
|
2
|
+
//# sourceMappingURL=vector.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector.cjs","names":["resolveColor","require_color","TOLERANCE","SHADOW_LAYERS","colorCache","vectorColor","c","value","multiply","m","n","invert","det","isConvex","p","sign","turn","b","ux","uy","vx","vy","cross","s","dedupe","out","i","closed","dashPolyline","total","dash","d","k","left","skip","offset","current","x0","y0","x1","y1","len","step","t","x","y","Vertices","need","more","size","next","color","packPremultiplied","a","alpha","ch","v","DEFAULT_STATE","VectorRecorder","text","pixelRatio","angle","e","f","gradient","o","sp","w","h","rd","sweep","a0","r","TAU","anticlockwise","a1","sx","sy","x2","y2","lu","lv","cos","half","dist","t1x","t1y","t2x","t2y","bx","by","bl","ox","oy","qx","qy","dd","c1x","c1y","c2x","c2y","paint","packed","g","inv","dx","dy","len2","stops","span","count","first","last","mode","ax","ay","shade","cx","cy","polygons","convex","blur","solid","layer","saved","point","width","line","piece","px","py","segs","normal","j","l","nx","ny","tx","ty","cap","hw","from","to","n0x","n0y","t0x","t0y","n1x","n1y","dot","side","join","steps","mx","my","ml","cosHalf","tipx","tipy","stop","gg","maxWidth"],"sources":["../../../../../charts/src/engine/renderers/vector.ts"],"sourcesContent":["// Vector layer of the shape charts on the GPU: a recorder with the subset of\n// the CanvasRenderingContext2D API that drawShapeScene uses. Fills and\n// strokes are flattened and tessellated into triangles (device pixels,\n// premultiplied colors) for the WebGPU / WebGL backends; text goes to a 2D\n// overlay canvas drawn above the geometry.\n//\n// Any path is drawn exactly like Canvas2D does it, without a polygon\n// triangulator: convex fills are plain fans; other fills write their fans\n// to the stencil (nonzero winding) and are then covered where the stencil is\n// set; strokes are covered once per sample so overlapping joins never blend\n// twice.\n\nimport { resolveColor, type Rgba } from \"../color\";\n\n/** Bytes per vertex: x f32, y f32 (device px), premultiplied rgba unorm8x4 */\nexport const VECTOR_STRIDE = 12;\n\n/**\n * - `direct`: triangles drawn as they are\n * - `nonzero`: a fill with the nonzero rule (stencil fans, then cover)\n * - `once`: overlapping triangles (strokes) colored once per sample\n */\nexport type VectorMode = \"direct\" | \"nonzero\" | \"once\";\n\nexport interface VectorDraw {\n mode: VectorMode;\n /** First vertex */\n first: number;\n /** Vertex count (a multiple of 3) */\n count: number;\n}\n\nexport interface VectorBatch {\n /** `count` vertices of VECTOR_STRIDE bytes */\n data: ArrayBuffer;\n count: number;\n draws: VectorDraw[];\n}\n\ntype Matrix = [number, number, number, number, number, number];\n\ninterface Gradient {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n stops: { offset: number; color: Rgba }[];\n addColorStop(offset: number, color: string): void;\n}\n\ntype Paint = string | Gradient;\n\ninterface State {\n matrix: Matrix;\n fillStyle: Paint;\n strokeStyle: Paint;\n lineWidth: number;\n lineCap: CanvasLineCap;\n lineJoin: CanvasLineJoin;\n miterLimit: number;\n globalAlpha: number;\n shadowColor: string;\n shadowBlur: number;\n shadowOffsetX: number;\n shadowOffsetY: number;\n dash: number[];\n lineDashOffset: number;\n font: string;\n textAlign: CanvasTextAlign;\n textBaseline: CanvasTextBaseline;\n}\n\ninterface Subpath {\n /** Device px, interleaved x, y */\n points: number[];\n closed: boolean;\n}\n\n/** Flattening tolerance, device px */\nconst TOLERANCE = 0.1;\n/** Layers of the approximated shadow blur */\nconst SHADOW_LAYERS = 5;\n\nconst colorCache = new Map<string, Rgba>();\n\n/** Straight RGBA of a CSS color (any syntax the browser knows) */\nexport const vectorColor = (value: string): Rgba => {\n let c = colorCache.get(value);\n if (!c) {\n c = resolveColor(value, null, [0, 0, 0, 1]);\n if (colorCache.size > 512) colorCache.clear();\n colorCache.set(value, c);\n }\n return c;\n};\n\nconst multiply = (m: Matrix, n: Matrix): Matrix => [\n m[0] * n[0] + m[2] * n[1],\n m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3],\n m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4],\n m[1] * n[4] + m[3] * n[5] + m[5],\n];\n\nconst invert = (m: Matrix): Matrix => {\n const det = m[0] * m[3] - m[1] * m[2] || 1e-12;\n return [\n m[3] / det,\n -m[1] / det,\n -m[2] / det,\n m[0] / det,\n (m[2] * m[5] - m[3] * m[4]) / det,\n (m[1] * m[4] - m[0] * m[5]) / det,\n ];\n};\n\n/** Turns of a closed polygon are all on the same side and add up to one turn */\nexport const isConvex = (p: readonly number[]): boolean => {\n const n = p.length >> 1;\n if (n < 3) return false;\n let sign = 0;\n let turn = 0;\n for (let i = 0; i < n; i++) {\n const a = (i + n - 1) % n;\n const b = (i + 1) % n;\n const ux = p[i * 2] - p[a * 2];\n const uy = p[i * 2 + 1] - p[a * 2 + 1];\n const vx = p[b * 2] - p[i * 2];\n const vy = p[b * 2 + 1] - p[i * 2 + 1];\n const cross = ux * vy - uy * vx;\n if (Math.abs(cross) > 1e-9) {\n const s = cross > 0 ? 1 : -1;\n if (sign && s !== sign) return false;\n sign = s;\n }\n turn += Math.atan2(cross, ux * vx + uy * vy);\n }\n return Math.abs(Math.abs(turn) - Math.PI * 2) < 0.01;\n};\n\n/** Removes repeated points (and the closing point equal to the first one) */\nconst dedupe = (p: readonly number[], closed: boolean): number[] => {\n const out: number[] = [];\n for (let i = 0; i < p.length; i += 2) {\n const n = out.length;\n if (\n n &&\n Math.abs(out[n - 2] - p[i]) < 1e-3 &&\n Math.abs(out[n - 1] - p[i + 1]) < 1e-3\n )\n continue;\n out.push(p[i], p[i + 1]);\n }\n if (\n closed &&\n out.length >= 4 &&\n Math.abs(out[0] - out[out.length - 2]) < 1e-3 &&\n Math.abs(out[1] - out[out.length - 1]) < 1e-3\n )\n out.length -= 2;\n return out;\n};\n\n/** Splits a polyline along a dash pattern (device px) */\nexport const dashPolyline = (\n p: readonly number[],\n dash: readonly number[],\n offset = 0,\n): number[][] => {\n const total = dash.reduce((s, d) => s + d, 0);\n if (!(total > 0) || p.length < 4) return [p.slice()];\n const out: number[][] = [];\n let k = 0;\n let left = dash[0];\n let skip = ((offset % total) + total) % total;\n while (skip > 0) {\n if (skip >= left) {\n skip -= left;\n k = (k + 1) % dash.length;\n left = dash[k];\n } else {\n left -= skip;\n skip = 0;\n }\n }\n let current: number[] | null = k % 2 === 0 ? [p[0], p[1]] : null;\n for (let i = 2; i < p.length; i += 2) {\n let x0 = p[i - 2];\n let y0 = p[i - 1];\n const x1 = p[i];\n const y1 = p[i + 1];\n let len = Math.hypot(x1 - x0, y1 - y0);\n while (len > 0) {\n const step = Math.min(left, len);\n const t = step / len;\n const x = x0 + (x1 - x0) * t;\n const y = y0 + (y1 - y0) * t;\n if (current) current.push(x, y);\n len -= step;\n left -= step;\n x0 = x;\n y0 = y;\n if (left <= 1e-9) {\n if (current) {\n if (current.length >= 4) out.push(current);\n current = null;\n } else current = [x, y];\n k = (k + 1) % dash.length;\n left = dash[k];\n }\n }\n }\n if (current && current.length >= 4) out.push(current);\n return out;\n};\n\n/** Growable vertex store */\nclass Vertices {\n buffer = new ArrayBuffer(VECTOR_STRIDE * 1024);\n f32 = new Float32Array(this.buffer);\n u32 = new Uint32Array(this.buffer);\n count = 0;\n\n reserve(more: number) {\n const need = (this.count + more) * VECTOR_STRIDE;\n if (need <= this.buffer.byteLength) return;\n let size = this.buffer.byteLength;\n while (size < need) size *= 2;\n const next = new ArrayBuffer(size);\n new Uint8Array(next).set(\n new Uint8Array(this.buffer, 0, this.count * VECTOR_STRIDE),\n );\n this.buffer = next;\n this.f32 = new Float32Array(next);\n this.u32 = new Uint32Array(next);\n }\n\n push(x: number, y: number, color: number) {\n this.reserve(1);\n const i = this.count * 3;\n this.f32[i] = x;\n this.f32[i + 1] = y;\n this.u32[i + 2] = color;\n this.count++;\n }\n}\n\n/** Premultiplied rgba packed for unorm8x4 (little endian: r in the low byte) */\nexport const packPremultiplied = (c: Rgba, alpha: number): number => {\n const a = Math.max(0, Math.min(1, c[3] * alpha));\n const ch = (v: number) =>\n Math.round(Math.max(0, Math.min(1, v)) * a * 255) & 0xff;\n return (\n (ch(c[0]) |\n (ch(c[1]) << 8) |\n (ch(c[2]) << 16) |\n ((Math.round(a * 255) & 0xff) << 24)) >>>\n 0\n );\n};\n\n/** Colors a device-space vertex */\ntype Shader = (x: number, y: number) => number;\n\nconst DEFAULT_STATE = (matrix: Matrix): State => ({\n matrix,\n fillStyle: \"#000\",\n strokeStyle: \"#000\",\n lineWidth: 1,\n lineCap: \"butt\",\n lineJoin: \"miter\",\n miterLimit: 10,\n globalAlpha: 1,\n shadowColor: \"rgba(0, 0, 0, 0)\",\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n dash: [],\n lineDashOffset: 0,\n font: \"10px sans-serif\",\n textAlign: \"start\",\n textBaseline: \"alphabetic\",\n});\n\n/**\n * Records path drawing as GPU triangles. Pass it to drawing code written for\n * CanvasRenderingContext2D (`recorder as unknown as CanvasRenderingContext2D`);\n * text calls are forwarded to `text` with the same transform and style.\n */\nexport class VectorRecorder {\n private vertices = new Vertices();\n private draws: VectorDraw[] = [];\n private state: State;\n private stack: State[] = [];\n private subpaths: Subpath[] = [];\n /** Current point, user space */\n private cx = 0;\n private cy = 0;\n private hasPoint = false;\n private text: CanvasRenderingContext2D | null;\n\n constructor(text: CanvasRenderingContext2D | null = null, pixelRatio = 1) {\n this.text = text;\n this.state = DEFAULT_STATE([pixelRatio, 0, 0, pixelRatio, 0, 0]);\n }\n\n /** Starts a new frame (keeps the buffers) */\n reset(text: CanvasRenderingContext2D | null, pixelRatio: number) {\n this.text = text;\n this.vertices.count = 0;\n this.draws = [];\n this.stack = [];\n this.subpaths = [];\n this.hasPoint = false;\n this.state = DEFAULT_STATE([pixelRatio, 0, 0, pixelRatio, 0, 0]);\n }\n\n /** Geometry recorded since the last reset */\n finish(): VectorBatch {\n return {\n data: this.vertices.buffer,\n count: this.vertices.count,\n draws: this.draws.slice(),\n };\n }\n\n // ------------------------------------------------------------ state\n\n get fillStyle(): Paint {\n return this.state.fillStyle;\n }\n set fillStyle(v: Paint) {\n this.state.fillStyle = v;\n }\n get strokeStyle(): Paint {\n return this.state.strokeStyle;\n }\n set strokeStyle(v: Paint) {\n this.state.strokeStyle = v;\n }\n get lineWidth() {\n return this.state.lineWidth;\n }\n set lineWidth(v: number) {\n if (Number.isFinite(v) && v > 0) this.state.lineWidth = v;\n }\n get lineCap() {\n return this.state.lineCap;\n }\n set lineCap(v: CanvasLineCap) {\n this.state.lineCap = v;\n }\n get lineJoin() {\n return this.state.lineJoin;\n }\n set lineJoin(v: CanvasLineJoin) {\n this.state.lineJoin = v;\n }\n get miterLimit() {\n return this.state.miterLimit;\n }\n set miterLimit(v: number) {\n if (Number.isFinite(v) && v > 0) this.state.miterLimit = v;\n }\n get globalAlpha() {\n return this.state.globalAlpha;\n }\n set globalAlpha(v: number) {\n if (Number.isFinite(v) && v >= 0 && v <= 1) this.state.globalAlpha = v;\n }\n get shadowColor() {\n return this.state.shadowColor;\n }\n set shadowColor(v: string) {\n this.state.shadowColor = v;\n }\n get shadowBlur() {\n return this.state.shadowBlur;\n }\n set shadowBlur(v: number) {\n if (Number.isFinite(v) && v >= 0) this.state.shadowBlur = v;\n }\n get shadowOffsetX() {\n return this.state.shadowOffsetX;\n }\n set shadowOffsetX(v: number) {\n if (Number.isFinite(v)) this.state.shadowOffsetX = v;\n }\n get shadowOffsetY() {\n return this.state.shadowOffsetY;\n }\n set shadowOffsetY(v: number) {\n if (Number.isFinite(v)) this.state.shadowOffsetY = v;\n }\n get lineDashOffset() {\n return this.state.lineDashOffset;\n }\n set lineDashOffset(v: number) {\n if (Number.isFinite(v)) this.state.lineDashOffset = v;\n }\n get font() {\n return this.state.font;\n }\n set font(v: string) {\n this.state.font = v;\n }\n get textAlign() {\n return this.state.textAlign;\n }\n set textAlign(v: CanvasTextAlign) {\n this.state.textAlign = v;\n }\n get textBaseline() {\n return this.state.textBaseline;\n }\n set textBaseline(v: CanvasTextBaseline) {\n this.state.textBaseline = v;\n }\n\n setLineDash(dash: number[]) {\n if (dash.some((d) => !Number.isFinite(d) || d < 0)) return;\n this.state.dash = dash.length % 2 ? [...dash, ...dash] : [...dash];\n }\n\n getLineDash() {\n return [...this.state.dash];\n }\n\n save() {\n this.stack.push({\n ...this.state,\n matrix: [...this.state.matrix],\n dash: [...this.state.dash],\n });\n }\n\n restore() {\n const s = this.stack.pop();\n if (s) this.state = s;\n }\n\n translate(x: number, y: number) {\n this.state.matrix = multiply(this.state.matrix, [1, 0, 0, 1, x, y]);\n }\n\n scale(x: number, y: number) {\n this.state.matrix = multiply(this.state.matrix, [x, 0, 0, y, 0, 0]);\n }\n\n rotate(angle: number) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n this.state.matrix = multiply(this.state.matrix, [c, s, -s, c, 0, 0]);\n }\n\n transform(a: number, b: number, c: number, d: number, e: number, f: number) {\n this.state.matrix = multiply(this.state.matrix, [a, b, c, d, e, f]);\n }\n\n createLinearGradient(x0: number, y0: number, x1: number, y1: number) {\n const gradient: Gradient = {\n x0,\n y0,\n x1,\n y1,\n stops: [],\n addColorStop(offset: number, color: string) {\n const o = Math.max(0, Math.min(1, offset));\n gradient.stops.push({ offset: o, color: vectorColor(color) });\n gradient.stops.sort((a, b) => a.offset - b.offset);\n },\n };\n return gradient as unknown as CanvasGradient;\n }\n\n // ------------------------------------------------------------- paths\n\n /** Device-space length of one user unit (uniform scales) */\n private unit() {\n const m = this.state.matrix;\n return Math.sqrt(Math.abs(m[0] * m[3] - m[1] * m[2])) || 1;\n }\n\n private current(): Subpath {\n let sp = this.subpaths[this.subpaths.length - 1];\n if (!sp) {\n sp = { points: [], closed: false };\n this.subpaths.push(sp);\n }\n return sp;\n }\n\n /** Adds a user-space point to the current subpath */\n private add(x: number, y: number) {\n const m = this.state.matrix;\n this.current().points.push(\n m[0] * x + m[2] * y + m[4],\n m[1] * x + m[3] * y + m[5],\n );\n this.cx = x;\n this.cy = y;\n this.hasPoint = true;\n }\n\n beginPath() {\n this.subpaths = [];\n this.hasPoint = false;\n }\n\n moveTo(x: number, y: number) {\n this.subpaths.push({ points: [], closed: false });\n this.add(x, y);\n }\n\n lineTo(x: number, y: number) {\n if (!this.hasPoint) this.moveTo(x, y);\n else this.add(x, y);\n }\n\n closePath() {\n const sp = this.subpaths[this.subpaths.length - 1];\n if (!sp || sp.points.length < 2) return;\n sp.closed = true;\n // the next segment starts a new subpath at the first point\n const m = invert(this.state.matrix);\n const x = sp.points[0];\n const y = sp.points[1];\n this.subpaths.push({ points: [x, y], closed: false });\n this.cx = m[0] * x + m[2] * y + m[4];\n this.cy = m[1] * x + m[3] * y + m[5];\n }\n\n rect(x: number, y: number, w: number, h: number) {\n this.moveTo(x, y);\n this.add(x + w, y);\n this.add(x + w, y + h);\n this.add(x, y + h);\n this.closePath();\n }\n\n /** Points along a circle from `a0`, `sweep` radians (signed) */\n private arcPoints(\n x: number,\n y: number,\n r: number,\n a0: number,\n sweep: number,\n ) {\n const rd = r * this.unit();\n const step =\n rd > TOLERANCE\n ? Math.max(\n 0.01,\n Math.min(Math.PI / 8, 2 * Math.acos(1 - TOLERANCE / rd)),\n )\n : Math.PI / 2;\n const n = Math.max(1, Math.ceil(Math.abs(sweep) / step));\n for (let i = 1; i <= n; i++) {\n const a = a0 + (sweep * i) / n;\n this.add(x + r * Math.cos(a), y + r * Math.sin(a));\n }\n }\n\n arc(\n x: number,\n y: number,\n r: number,\n a0: number,\n a1: number,\n anticlockwise = false,\n ) {\n if (!(r >= 0)) return;\n const TAU = Math.PI * 2;\n let sweep: number;\n if (!anticlockwise && a1 - a0 >= TAU) sweep = TAU;\n else if (anticlockwise && a0 - a1 >= TAU) sweep = -TAU;\n else {\n sweep = (a1 - a0) % TAU;\n if (!anticlockwise && sweep < 0) sweep += TAU;\n if (anticlockwise && sweep > 0) sweep -= TAU;\n }\n const sx = x + r * Math.cos(a0);\n const sy = y + r * Math.sin(a0);\n if (this.hasPoint) this.lineTo(sx, sy);\n else this.moveTo(sx, sy);\n if (sweep !== 0) this.arcPoints(x, y, r, a0, sweep);\n }\n\n arcTo(x1: number, y1: number, x2: number, y2: number, r: number) {\n if (!this.hasPoint) this.moveTo(x1, y1);\n const x0 = this.cx;\n const y0 = this.cy;\n const ux = x0 - x1;\n const uy = y0 - y1;\n const vx = x2 - x1;\n const vy = y2 - y1;\n const lu = Math.hypot(ux, uy);\n const lv = Math.hypot(vx, vy);\n const cross = ux * vy - uy * vx;\n if (r <= 0 || lu < 1e-9 || lv < 1e-9 || Math.abs(cross) < 1e-9) {\n this.lineTo(x1, y1);\n return;\n }\n const cos = Math.max(-1, Math.min(1, (ux * vx + uy * vy) / (lu * lv)));\n const half = Math.acos(cos) / 2;\n const dist = r / Math.tan(half);\n const t1x = x1 + (ux / lu) * dist;\n const t1y = y1 + (uy / lu) * dist;\n const t2x = x1 + (vx / lv) * dist;\n const t2y = y1 + (vy / lv) * dist;\n const bx = ux / lu + vx / lv;\n const by = uy / lu + vy / lv;\n const bl = Math.hypot(bx, by);\n const d = r / Math.sin(half);\n const ox = x1 + (bx / bl) * d;\n const oy = y1 + (by / bl) * d;\n this.lineTo(t1x, t1y);\n const a0 = Math.atan2(t1y - oy, t1x - ox);\n const a1 = Math.atan2(t2y - oy, t2x - ox);\n let sweep = a1 - a0;\n if (sweep > Math.PI) sweep -= Math.PI * 2;\n if (sweep < -Math.PI) sweep += Math.PI * 2;\n this.arcPoints(ox, oy, r, a0, sweep);\n }\n\n quadraticCurveTo(qx: number, qy: number, x: number, y: number) {\n if (!this.hasPoint) this.moveTo(qx, qy);\n const x0 = this.cx;\n const y0 = this.cy;\n const dd = Math.hypot(x0 - 2 * qx + x, y0 - 2 * qy + y) * this.unit();\n const n = Math.max(\n 1,\n Math.min(128, Math.ceil(Math.sqrt(dd / (8 * TOLERANCE)))),\n );\n for (let i = 1; i <= n; i++) {\n const t = i / n;\n const s = 1 - t;\n this.add(\n s * s * x0 + 2 * s * t * qx + t * t * x,\n s * s * y0 + 2 * s * t * qy + t * t * y,\n );\n }\n }\n\n bezierCurveTo(\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x: number,\n y: number,\n ) {\n if (!this.hasPoint) this.moveTo(c1x, c1y);\n const x0 = this.cx;\n const y0 = this.cy;\n const dd =\n Math.max(\n Math.hypot(x0 - 2 * c1x + c2x, y0 - 2 * c1y + c2y),\n Math.hypot(c1x - 2 * c2x + x, c1y - 2 * c2y + y),\n ) * this.unit();\n const n = Math.max(\n 1,\n Math.min(160, Math.ceil(Math.sqrt((0.75 * dd) / TOLERANCE))),\n );\n for (let i = 1; i <= n; i++) {\n const t = i / n;\n const s = 1 - t;\n this.add(\n s * s * s * x0 +\n 3 * s * s * t * c1x +\n 3 * s * t * t * c2x +\n t * t * t * x,\n s * s * s * y0 +\n 3 * s * s * t * c1y +\n 3 * s * t * t * c2y +\n t * t * t * y,\n );\n }\n }\n\n // ----------------------------------------------------------- painting\n\n /** Vertex colors of a paint at the current alpha */\n private shader(paint: Paint, alpha: number): Shader | null {\n if (typeof paint === \"string\") {\n const c = vectorColor(paint);\n if (c[3] * alpha <= 0.001) return null;\n const packed = packPremultiplied(c, alpha);\n return () => packed;\n }\n const g = paint;\n if (!g.stops.length) return null;\n if (g.stops.length === 1) {\n const packed = packPremultiplied(g.stops[0].color, alpha);\n return () => packed;\n }\n const inv = invert(this.state.matrix);\n const dx = g.x1 - g.x0;\n const dy = g.y1 - g.y0;\n const len2 = dx * dx + dy * dy;\n const stops = g.stops;\n return (x, y) => {\n const ux = inv[0] * x + inv[2] * y + inv[4];\n const uy = inv[1] * x + inv[3] * y + inv[5];\n const t = len2 > 0 ? ((ux - g.x0) * dx + (uy - g.y0) * dy) / len2 : 0;\n let k = 0;\n while (k < stops.length - 1 && stops[k + 1].offset < t) k++;\n const a = stops[k];\n const b = stops[Math.min(k + 1, stops.length - 1)];\n const span = b.offset - a.offset;\n const f =\n span > 0\n ? Math.max(0, Math.min(1, (t - a.offset) / span))\n : t < a.offset\n ? 0\n : 1;\n const c: Rgba = [\n a.color[0] + (b.color[0] - a.color[0]) * f,\n a.color[1] + (b.color[1] - a.color[1]) * f,\n a.color[2] + (b.color[2] - a.color[2]) * f,\n a.color[3] + (b.color[3] - a.color[3]) * f,\n ];\n return packPremultiplied(c, alpha);\n };\n }\n\n private emit(mode: VectorMode, first: number) {\n const count = this.vertices.count - first;\n if (count <= 0) return;\n const last = this.draws[this.draws.length - 1];\n // consecutive plain triangles share one draw\n if (\n mode === \"direct\" &&\n last?.mode === \"direct\" &&\n last.first + last.count === first\n )\n last.count += count;\n else this.draws.push({ mode, first, count });\n }\n\n private triangle(\n shade: Shader,\n ax: number,\n ay: number,\n bx: number,\n by: number,\n cx: number,\n cy: number,\n dx = 0,\n dy = 0,\n ) {\n const v = this.vertices;\n v.reserve(3);\n v.push(ax + dx, ay + dy, shade(ax, ay));\n v.push(bx + dx, by + dy, shade(bx, by));\n v.push(cx + dx, cy + dy, shade(cx, cy));\n }\n\n /** Closed polygons of the current path */\n private polygons(): number[][] {\n const out: number[][] = [];\n for (const sp of this.subpaths) {\n const p = dedupe(sp.points, true);\n if (p.length >= 6) out.push(p);\n }\n return out;\n }\n\n private fillPolygons(\n polygons: readonly number[][],\n shade: Shader,\n dx = 0,\n dy = 0,\n ) {\n if (!polygons.length) return;\n const convex = polygons.length === 1 && isConvex(polygons[0]);\n const first = this.vertices.count;\n for (const p of polygons) {\n for (let i = 2; i + 3 < p.length; i += 2)\n this.triangle(\n shade,\n p[0],\n p[1],\n p[i],\n p[i + 1],\n p[i + 2],\n p[i + 3],\n dx,\n dy,\n );\n }\n this.emit(convex ? \"direct\" : \"nonzero\", first);\n }\n\n /** Approximated drop shadow: the shape plus soft rings fading outwards */\n private shadow(polygons: readonly number[][], closed: boolean) {\n const s = this.state;\n const color = vectorColor(s.shadowColor);\n const alpha = color[3] * s.globalAlpha;\n if (\n alpha <= 0.002 ||\n (!s.shadowBlur && !s.shadowOffsetX && !s.shadowOffsetY)\n )\n return;\n const dx = s.shadowOffsetX;\n const dy = s.shadowOffsetY;\n const blur = s.shadowBlur;\n const solid = blur > 0 ? alpha * 0.35 : alpha;\n const packed = packPremultiplied([color[0], color[1], color[2], 1], solid);\n if (closed) this.fillPolygons(polygons, () => packed, dx, dy);\n if (blur <= 0) return;\n // every ring covers the shape edge out to blur * k / N: the sum fades\n // from `alpha` at the edge to 0 at `blur`\n const layer = 1 - Math.pow(1 - alpha * 0.65, 1 / SHADOW_LAYERS);\n const shade = (() => {\n const c = packPremultiplied([color[0], color[1], color[2], 1], layer);\n return () => c;\n })();\n for (let k = 1; k <= SHADOW_LAYERS; k++) {\n const half = (blur * k) / SHADOW_LAYERS;\n const first = this.vertices.count;\n for (const p of polygons)\n this.strokePolyline(p, closed, half, shade, \"round\", \"round\", dx, dy);\n this.emit(\"once\", first);\n }\n }\n\n fill() {\n const shade = this.shader(this.state.fillStyle, this.state.globalAlpha);\n const polygons = this.polygons();\n if (!polygons.length) return;\n this.shadow(polygons, true);\n if (shade) this.fillPolygons(polygons, shade);\n }\n\n fillRect(x: number, y: number, w: number, h: number) {\n const saved = this.subpaths;\n const point = this.hasPoint;\n const [cx, cy] = [this.cx, this.cy];\n this.subpaths = [];\n this.rect(x, y, w, h);\n this.fill();\n this.subpaths = saved;\n this.hasPoint = point;\n this.cx = cx;\n this.cy = cy;\n }\n\n stroke() {\n const s = this.state;\n let width = s.lineWidth * this.unit();\n let alpha = s.globalAlpha;\n // hairlines: a 1px line with the coverage of the thinner one\n if (width < 1) {\n alpha *= width;\n width = 1;\n }\n const shade = this.shader(s.strokeStyle, alpha);\n if (!shade) return;\n const dash = s.dash.map((d) => d * this.unit());\n const first = this.vertices.count;\n for (const sp of this.subpaths) {\n const p = dedupe(sp.points, sp.closed);\n if (p.length < 2) continue;\n if (p.length === 2) {\n // a zero-length segment (not a lone moveTo): round caps show a dot\n if (sp.points.length >= 4 && s.lineCap === \"round\")\n this.disc(shade, p[0], p[1], width / 2);\n continue;\n }\n if (dash.length && dash.some((d) => d > 0)) {\n const line = sp.closed ? [...p, p[0], p[1]] : p;\n for (const piece of dashPolyline(\n line,\n dash,\n s.lineDashOffset * this.unit(),\n ))\n this.strokePolyline(\n piece,\n false,\n width / 2,\n shade,\n s.lineCap,\n s.lineJoin,\n );\n } else\n this.strokePolyline(\n p,\n sp.closed,\n width / 2,\n shade,\n s.lineCap,\n s.lineJoin,\n );\n }\n this.emit(\"once\", first);\n }\n\n private disc(shade: Shader, x: number, y: number, r: number, dx = 0, dy = 0) {\n const n = Math.max(8, Math.min(64, Math.ceil(r * 1.5)));\n let px = x + r;\n let py = y;\n for (let i = 1; i <= n; i++) {\n const a = (i / n) * Math.PI * 2;\n const qx = x + r * Math.cos(a);\n const qy = y + r * Math.sin(a);\n this.triangle(shade, x, y, px, py, qx, qy, dx, dy);\n px = qx;\n py = qy;\n }\n }\n\n /** Quads along the segments, joins at the vertices, caps at the ends */\n private strokePolyline(\n p: readonly number[],\n closed: boolean,\n hw: number,\n shade: Shader,\n cap: CanvasLineCap,\n join: CanvasLineJoin,\n dx = 0,\n dy = 0,\n ) {\n const n = p.length >> 1;\n if (n < 2) return;\n const segs = closed ? n : n - 1;\n const normal = (i: number): [number, number, number, number] => {\n const j = (i + 1) % n;\n const vx = p[j * 2] - p[i * 2];\n const vy = p[j * 2 + 1] - p[i * 2 + 1];\n const l = Math.hypot(vx, vy) || 1;\n return [-vy / l, vx / l, vx / l, vy / l];\n };\n for (let i = 0; i < segs; i++) {\n const j = (i + 1) % n;\n let ax = p[i * 2];\n let ay = p[i * 2 + 1];\n let bx = p[j * 2];\n let by = p[j * 2 + 1];\n const [nx, ny, tx, ty] = normal(i);\n if (!closed && cap === \"square\") {\n if (i === 0) {\n ax -= tx * hw;\n ay -= ty * hw;\n }\n if (i === segs - 1) {\n bx += tx * hw;\n by += ty * hw;\n }\n }\n const ox = nx * hw;\n const oy = ny * hw;\n this.triangle(\n shade,\n ax + ox,\n ay + oy,\n bx + ox,\n by + oy,\n bx - ox,\n by - oy,\n dx,\n dy,\n );\n this.triangle(\n shade,\n ax + ox,\n ay + oy,\n bx - ox,\n by - oy,\n ax - ox,\n ay - oy,\n dx,\n dy,\n );\n }\n // joins\n const from = closed ? 0 : 1;\n const to = closed ? n : n - 1;\n for (let i = from; i < to; i++) {\n const prev = (i + n - 1) % n;\n const [n0x, n0y, t0x, t0y] = normal(prev);\n const [n1x, n1y, t1x, t1y] = normal(i);\n const x = p[i * 2];\n const y = p[i * 2 + 1];\n const cross = t0x * t1y - t0y * t1x;\n const dot = t0x * t1x + t0y * t1y;\n if (Math.abs(cross) < 1e-6 && dot > 0) continue;\n // outer side: away from the turn\n const side = cross > 0 ? -1 : 1;\n const ax = x + n0x * hw * side;\n const ay = y + n0y * hw * side;\n const bx = x + n1x * hw * side;\n const by = y + n1y * hw * side;\n const angle = Math.atan2(Math.abs(cross), dot);\n if (join === \"round\" && angle * hw > 0.5) {\n const a0 = Math.atan2(ay - y, ax - x);\n let sweep = Math.atan2(by - y, bx - x) - a0;\n if (sweep > Math.PI) sweep -= Math.PI * 2;\n if (sweep < -Math.PI) sweep += Math.PI * 2;\n const steps = Math.max(\n 1,\n Math.ceil(\n Math.abs(sweep) /\n Math.max(0.05, 2 * Math.acos(Math.max(0, 1 - TOLERANCE / hw))),\n ),\n );\n let px = ax;\n let py = ay;\n for (let k = 1; k <= steps; k++) {\n const a = a0 + (sweep * k) / steps;\n const qx = x + hw * Math.cos(a);\n const qy = y + hw * Math.sin(a);\n this.triangle(shade, x, y, px, py, qx, qy, dx, dy);\n px = qx;\n py = qy;\n }\n } else if (join === \"miter\") {\n const mx = n0x + n1x;\n const my = n0y + n1y;\n const ml = Math.hypot(mx, my);\n const cosHalf = ml / 2;\n if (ml > 1e-6 && 1 / cosHalf <= this.state.miterLimit) {\n const k = (hw / cosHalf) * side;\n const tipx = x + (mx / ml) * k;\n const tipy = y + (my / ml) * k;\n this.triangle(shade, x, y, ax, ay, tipx, tipy, dx, dy);\n this.triangle(shade, x, y, tipx, tipy, bx, by, dx, dy);\n } else this.triangle(shade, x, y, ax, ay, bx, by, dx, dy);\n } else this.triangle(shade, x, y, ax, ay, bx, by, dx, dy);\n }\n if (!closed && cap === \"round\") {\n this.disc(shade, p[0], p[1], hw, dx, dy);\n this.disc(shade, p[(n - 1) * 2], p[(n - 1) * 2 + 1], hw, dx, dy);\n }\n }\n\n // --------------------------------------------------------------- text\n\n private syncText(): CanvasRenderingContext2D | null {\n const t = this.text;\n if (!t) return null;\n const s = this.state;\n const m = s.matrix;\n t.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n t.globalAlpha = s.globalAlpha;\n t.font = s.font;\n t.textAlign = s.textAlign;\n t.textBaseline = s.textBaseline;\n t.lineWidth = s.lineWidth;\n t.lineJoin = s.lineJoin;\n return t;\n }\n\n private textPaint(paint: Paint): string | CanvasGradient {\n if (typeof paint === \"string\") return paint;\n const t = this.text;\n if (!t) return \"#000\";\n const g = t.createLinearGradient(paint.x0, paint.y0, paint.x1, paint.y1);\n for (const stop of paint.stops) {\n const [r, gg, b, a] = stop.color;\n g.addColorStop(\n stop.offset,\n `rgba(${Math.round(r * 255)}, ${Math.round(gg * 255)}, ${Math.round(b * 255)}, ${a})`,\n );\n }\n return g;\n }\n\n fillText(text: string, x: number, y: number, maxWidth?: number) {\n const t = this.syncText();\n if (!t) return;\n t.fillStyle = this.textPaint(this.state.fillStyle);\n if (maxWidth === undefined) t.fillText(text, x, y);\n else t.fillText(text, x, y, maxWidth);\n }\n\n strokeText(text: string, x: number, y: number, maxWidth?: number) {\n const t = this.syncText();\n if (!t) return;\n t.strokeStyle = this.textPaint(this.state.strokeStyle);\n if (maxWidth === undefined) t.strokeText(text, x, y);\n else t.strokeText(text, x, y, maxWidth);\n }\n\n measureText(text: string): TextMetrics {\n const t = this.text;\n if (t) {\n t.font = this.state.font;\n return t.measureText(text);\n }\n return { width: text.length * 6 } as TextMetrics;\n }\n}\n"],"mappings":"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"}
|