@kgdiff/renderer 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +53 -2
- package/dist/atlas.d.ts +55 -0
- package/dist/atlas.d.ts.map +1 -0
- package/dist/atlas.js +132 -0
- package/dist/atlas.js.map +1 -0
- package/dist/camera.d.ts +116 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +368 -0
- package/dist/camera.js.map +1 -0
- package/dist/color.d.ts +12 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +51 -0
- package/dist/color.js.map +1 -0
- package/dist/ctx.d.ts +57 -0
- package/dist/ctx.d.ts.map +1 -0
- package/dist/ctx.js +28 -0
- package/dist/ctx.js.map +1 -0
- package/dist/draw/background.d.ts +33 -0
- package/dist/draw/background.d.ts.map +1 -0
- package/dist/draw/background.js +105 -0
- package/dist/draw/background.js.map +1 -0
- package/dist/draw/badges.d.ts +26 -0
- package/dist/draw/badges.d.ts.map +1 -0
- package/dist/draw/badges.js +82 -0
- package/dist/draw/badges.js.map +1 -0
- package/dist/draw/collapsed.d.ts +15 -0
- package/dist/draw/collapsed.d.ts.map +1 -0
- package/dist/draw/collapsed.js +67 -0
- package/dist/draw/collapsed.js.map +1 -0
- package/dist/draw/edges.d.ts +14 -0
- package/dist/draw/edges.d.ts.map +1 -0
- package/dist/draw/edges.js +115 -0
- package/dist/draw/edges.js.map +1 -0
- package/dist/draw/glyphs.d.ts +31 -0
- package/dist/draw/glyphs.d.ts.map +1 -0
- package/dist/draw/glyphs.js +114 -0
- package/dist/draw/glyphs.js.map +1 -0
- package/dist/draw/halos.d.ts +19 -0
- package/dist/draw/halos.d.ts.map +1 -0
- package/dist/draw/halos.js +91 -0
- package/dist/draw/halos.js.map +1 -0
- package/dist/draw/labels.d.ts +55 -0
- package/dist/draw/labels.d.ts.map +1 -0
- package/dist/draw/labels.js +300 -0
- package/dist/draw/labels.js.map +1 -0
- package/dist/draw/link.d.ts +25 -0
- package/dist/draw/link.d.ts.map +1 -0
- package/dist/draw/link.js +122 -0
- package/dist/draw/link.js.map +1 -0
- package/dist/draw/nodes.d.ts +13 -0
- package/dist/draw/nodes.d.ts.map +1 -0
- package/dist/draw/nodes.js +165 -0
- package/dist/draw/nodes.js.map +1 -0
- package/dist/draw/shapes.d.ts +7 -0
- package/dist/draw/shapes.d.ts.map +1 -0
- package/dist/draw/shapes.js +26 -0
- package/dist/draw/shapes.js.map +1 -0
- package/dist/draw/view.d.ts +36 -0
- package/dist/draw/view.d.ts.map +1 -0
- package/dist/draw/view.js +16 -0
- package/dist/draw/view.js.map +1 -0
- package/dist/frame-cache.d.ts +103 -0
- package/dist/frame-cache.d.ts.map +1 -0
- package/dist/frame-cache.js +349 -0
- package/dist/frame-cache.js.map +1 -0
- package/dist/index.d.ts +162 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +81 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +329 -0
- package/dist/input.js.map +1 -0
- package/dist/labels.d.ts +103 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +203 -0
- package/dist/labels.js.map +1 -0
- package/dist/math.d.ts +33 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +138 -0
- package/dist/math.js.map +1 -0
- package/dist/minimap.d.ts +56 -0
- package/dist/minimap.d.ts.map +1 -0
- package/dist/minimap.js +501 -0
- package/dist/minimap.js.map +1 -0
- package/dist/paint-stats.d.ts +17 -0
- package/dist/paint-stats.d.ts.map +1 -0
- package/dist/paint-stats.js +23 -0
- package/dist/paint-stats.js.map +1 -0
- package/dist/paint.d.ts +64 -0
- package/dist/paint.d.ts.map +1 -0
- package/dist/paint.js +197 -0
- package/dist/paint.js.map +1 -0
- package/dist/pick.d.ts +26 -0
- package/dist/pick.d.ts.map +1 -0
- package/dist/pick.js +125 -0
- package/dist/pick.js.map +1 -0
- package/dist/renderer.d.ts +28 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +470 -0
- package/dist/renderer.js.map +1 -0
- package/dist/smooth-zoom.d.ts +21 -0
- package/dist/smooth-zoom.d.ts.map +1 -0
- package/dist/smooth-zoom.js +52 -0
- package/dist/smooth-zoom.js.map +1 -0
- package/dist/spatial.d.ts +26 -0
- package/dist/spatial.d.ts.map +1 -0
- package/dist/spatial.js +103 -0
- package/dist/spatial.js.map +1 -0
- package/dist/text.d.ts +36 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +123 -0
- package/dist/text.js.map +1 -0
- package/package.json +47 -3
- package/src/atlas.ts +171 -0
- package/src/camera.ts +482 -0
- package/src/color.ts +58 -0
- package/src/ctx.ts +102 -0
- package/src/draw/background.ts +139 -0
- package/src/draw/badges.ts +93 -0
- package/src/draw/collapsed.ts +86 -0
- package/src/draw/edges.ts +135 -0
- package/src/draw/glyphs.ts +168 -0
- package/src/draw/halos.ts +101 -0
- package/src/draw/labels.ts +399 -0
- package/src/draw/link.ts +157 -0
- package/src/draw/nodes.ts +184 -0
- package/src/draw/shapes.ts +36 -0
- package/src/draw/view.ts +37 -0
- package/src/frame-cache.ts +382 -0
- package/src/index.ts +161 -0
- package/src/input.ts +370 -0
- package/src/labels.ts +269 -0
- package/src/math.ts +185 -0
- package/src/minimap.ts +545 -0
- package/src/paint-stats.ts +38 -0
- package/src/paint.ts +235 -0
- package/src/pick.ts +173 -0
- package/src/renderer.ts +539 -0
- package/src/smooth-zoom.ts +65 -0
- package/src/spatial.ts +94 -0
- package/src/text.ts +130 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { clamp } from './math.js';
|
|
2
|
+
import { PointGrid } from './spatial.js';
|
|
3
|
+
const MAX_COLORS = 2047;
|
|
4
|
+
const MAX_DASHES = 63;
|
|
5
|
+
/** Interns style values to small integer ids for bucket keys. */
|
|
6
|
+
export class Interner {
|
|
7
|
+
colors = new Map();
|
|
8
|
+
dashIds = new WeakMap();
|
|
9
|
+
dashKeys = new Map();
|
|
10
|
+
/** Called before a build: start over when the id space is exhausted (animated rgba strings). */
|
|
11
|
+
maintain() {
|
|
12
|
+
if (this.colors.size > MAX_COLORS - 64)
|
|
13
|
+
this.colors.clear();
|
|
14
|
+
if (this.dashKeys.size > MAX_DASHES - 8) {
|
|
15
|
+
this.dashKeys.clear();
|
|
16
|
+
this.dashIds = new WeakMap();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** 0 is reserved for null. */
|
|
20
|
+
color(c) {
|
|
21
|
+
if (c === null)
|
|
22
|
+
return 0;
|
|
23
|
+
let id = this.colors.get(c);
|
|
24
|
+
if (id === undefined) {
|
|
25
|
+
id = this.colors.size + 1;
|
|
26
|
+
this.colors.set(c, id);
|
|
27
|
+
}
|
|
28
|
+
return Math.min(id, MAX_COLORS);
|
|
29
|
+
}
|
|
30
|
+
/** 0 is reserved for solid (null / empty). */
|
|
31
|
+
dash(d) {
|
|
32
|
+
if (d === null || d.length === 0)
|
|
33
|
+
return 0;
|
|
34
|
+
let id = this.dashIds.get(d);
|
|
35
|
+
if (id === undefined) {
|
|
36
|
+
const key = d.join(',');
|
|
37
|
+
id = this.dashKeys.get(key);
|
|
38
|
+
if (id === undefined) {
|
|
39
|
+
id = this.dashKeys.size + 1;
|
|
40
|
+
this.dashKeys.set(key, id);
|
|
41
|
+
}
|
|
42
|
+
this.dashIds.set(d, id);
|
|
43
|
+
}
|
|
44
|
+
return Math.min(id, MAX_DASHES);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Alpha is quantized to 1/64 for bucketing (invisible differences, far fewer buckets). */
|
|
48
|
+
export function quantizeAlpha(a) {
|
|
49
|
+
return Number.isFinite(a) ? Math.round(clamp(a, 0, 1) * 64) : 0;
|
|
50
|
+
}
|
|
51
|
+
function quantizeZ(z) {
|
|
52
|
+
return zLevel(z) + 512;
|
|
53
|
+
}
|
|
54
|
+
/** The integer draw level a `z` value is bucketed into (non-finite → 0). */
|
|
55
|
+
export function zLevel(z) {
|
|
56
|
+
return Number.isFinite(z) ? clamp(Math.round(z), -512, 511) : 0;
|
|
57
|
+
}
|
|
58
|
+
function quantizeWidth(w) {
|
|
59
|
+
return Number.isFinite(w) ? Math.round(clamp(w, 0, 15.75) * 4) : 0;
|
|
60
|
+
}
|
|
61
|
+
/** Dash offset reduced to one period of the pattern, in half pixels. */
|
|
62
|
+
function quantizeOffset(offset, dash) {
|
|
63
|
+
if (dash === null || dash.length === 0 || !Number.isFinite(offset))
|
|
64
|
+
return 0;
|
|
65
|
+
let period = 0;
|
|
66
|
+
for (const d of dash)
|
|
67
|
+
period += d;
|
|
68
|
+
if (dash.length % 2 === 1)
|
|
69
|
+
period *= 2;
|
|
70
|
+
if (!(period > 0))
|
|
71
|
+
return 0;
|
|
72
|
+
const o = ((offset % period) + period) % period;
|
|
73
|
+
return clamp(Math.round(o * 2), 0, 511);
|
|
74
|
+
}
|
|
75
|
+
function bySeq(a, b) {
|
|
76
|
+
return a.z - b.z || a.seq - b.seq;
|
|
77
|
+
}
|
|
78
|
+
export class FrameCache {
|
|
79
|
+
frame = null;
|
|
80
|
+
version = -1;
|
|
81
|
+
/** Sorted by z, then first appearance. */
|
|
82
|
+
edgeBuckets = [];
|
|
83
|
+
nodeBuckets = [];
|
|
84
|
+
/** Nodes with a ring or an active pulse, sorted by (z, index). */
|
|
85
|
+
decor = [];
|
|
86
|
+
halos = [];
|
|
87
|
+
badges = [];
|
|
88
|
+
glyphArcs = [];
|
|
89
|
+
pivots = [];
|
|
90
|
+
/** Largest visible node radius (world). */
|
|
91
|
+
maxR = 0;
|
|
92
|
+
/** Visible node / edge counts. */
|
|
93
|
+
nodeCount = 0;
|
|
94
|
+
edgeCount = 0;
|
|
95
|
+
/**
|
|
96
|
+
* Collapsed pills shown by the last paint of this frame (1) or hidden by label collision (0).
|
|
97
|
+
* Valid while `pillsVersion === version`; picking ignores hidden pills.
|
|
98
|
+
*/
|
|
99
|
+
pillShown = new Uint8Array(0);
|
|
100
|
+
pillsVersion = -1;
|
|
101
|
+
edgeMap = new Map();
|
|
102
|
+
nodeMap = new Map();
|
|
103
|
+
edgePool = [];
|
|
104
|
+
nodePool = [];
|
|
105
|
+
gridVersion = -1;
|
|
106
|
+
grid = new PointGrid();
|
|
107
|
+
xs = new Float64Array(0);
|
|
108
|
+
ys = new Float64Array(0);
|
|
109
|
+
rs = new Float64Array(0);
|
|
110
|
+
ids = new Int32Array(0);
|
|
111
|
+
boundsVersion = -1;
|
|
112
|
+
boundsValue = null;
|
|
113
|
+
/** Rebuild when `frame` or `version` changed. */
|
|
114
|
+
sync(frame, version, interner) {
|
|
115
|
+
if (frame === this.frame && version === this.version)
|
|
116
|
+
return;
|
|
117
|
+
this.frame = frame;
|
|
118
|
+
this.version = version;
|
|
119
|
+
this.build(frame, interner);
|
|
120
|
+
}
|
|
121
|
+
build(frame, interner) {
|
|
122
|
+
interner.maintain();
|
|
123
|
+
this.edgeMap.clear();
|
|
124
|
+
this.nodeMap.clear();
|
|
125
|
+
this.edgeBuckets.length = 0;
|
|
126
|
+
this.nodeBuckets.length = 0;
|
|
127
|
+
this.decor.length = 0;
|
|
128
|
+
this.halos.length = 0;
|
|
129
|
+
this.badges.length = 0;
|
|
130
|
+
this.glyphArcs.length = 0;
|
|
131
|
+
this.pivots.length = 0;
|
|
132
|
+
this.maxR = 0;
|
|
133
|
+
this.nodeCount = 0;
|
|
134
|
+
this.edgeCount = 0;
|
|
135
|
+
const edges = frame.edges;
|
|
136
|
+
for (let i = 0; i < edges.length; i++) {
|
|
137
|
+
const e = edges[i];
|
|
138
|
+
if (!e.visible)
|
|
139
|
+
continue;
|
|
140
|
+
const aq = quantizeAlpha(e.alpha);
|
|
141
|
+
if (aq === 0 || !(e.width > 0))
|
|
142
|
+
continue;
|
|
143
|
+
if (!Number.isFinite(e.x1 + e.y1 + e.x2 + e.y2))
|
|
144
|
+
continue;
|
|
145
|
+
const zq = quantizeZ(e.z);
|
|
146
|
+
const wq = quantizeWidth(e.width);
|
|
147
|
+
const dash = e.dash !== null && e.dash.length > 0 ? e.dash : null;
|
|
148
|
+
const oq = quantizeOffset(e.dashOffset, dash);
|
|
149
|
+
const key = ((((zq * 2048 + interner.color(e.color)) * 64 + wq) * 64 + interner.dash(dash)) * 512 +
|
|
150
|
+
oq) *
|
|
151
|
+
65 +
|
|
152
|
+
aq;
|
|
153
|
+
let b = this.edgeMap.get(key);
|
|
154
|
+
if (!b) {
|
|
155
|
+
b = this.edgePool[this.edgeBuckets.length];
|
|
156
|
+
if (!b) {
|
|
157
|
+
b = {
|
|
158
|
+
key: 0,
|
|
159
|
+
seq: 0,
|
|
160
|
+
z: 0,
|
|
161
|
+
color: '',
|
|
162
|
+
width: 0,
|
|
163
|
+
dash: null,
|
|
164
|
+
dashOffset: 0,
|
|
165
|
+
alpha: 0,
|
|
166
|
+
members: [],
|
|
167
|
+
};
|
|
168
|
+
this.edgePool.push(b);
|
|
169
|
+
}
|
|
170
|
+
b.key = key;
|
|
171
|
+
b.seq = this.edgeBuckets.length;
|
|
172
|
+
b.z = zq - 512;
|
|
173
|
+
b.color = e.color;
|
|
174
|
+
b.width = wq / 4;
|
|
175
|
+
b.dash = dash;
|
|
176
|
+
b.dashOffset = oq / 2;
|
|
177
|
+
b.alpha = aq / 64;
|
|
178
|
+
b.members.length = 0;
|
|
179
|
+
this.edgeMap.set(key, b);
|
|
180
|
+
this.edgeBuckets.push(b);
|
|
181
|
+
}
|
|
182
|
+
b.members.push(i);
|
|
183
|
+
this.edgeCount++;
|
|
184
|
+
}
|
|
185
|
+
this.edgeBuckets.sort(bySeq);
|
|
186
|
+
const nodes = frame.nodes;
|
|
187
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
188
|
+
const n = nodes[i];
|
|
189
|
+
if (!n.visible)
|
|
190
|
+
continue;
|
|
191
|
+
const aq = quantizeAlpha(n.alpha);
|
|
192
|
+
if (aq === 0 || !Number.isFinite(n.x + n.y + n.r) || n.r < 0)
|
|
193
|
+
continue;
|
|
194
|
+
const zq = quantizeZ(n.z);
|
|
195
|
+
const stroke = n.stroke !== null && n.strokeWidth > 0 ? n.stroke : null;
|
|
196
|
+
const dash = stroke !== null && n.dash !== null && n.dash.length > 0 ? n.dash : null;
|
|
197
|
+
const key = ((((zq * 2048 + interner.color(n.fill)) * 2048 + interner.color(stroke)) * 64 +
|
|
198
|
+
(stroke ? quantizeWidth(n.strokeWidth) : 0)) *
|
|
199
|
+
64 +
|
|
200
|
+
interner.dash(dash)) *
|
|
201
|
+
65 +
|
|
202
|
+
aq;
|
|
203
|
+
let b = this.nodeMap.get(key);
|
|
204
|
+
if (!b) {
|
|
205
|
+
b = this.nodePool[this.nodeBuckets.length];
|
|
206
|
+
if (!b) {
|
|
207
|
+
b = {
|
|
208
|
+
key: 0,
|
|
209
|
+
seq: 0,
|
|
210
|
+
z: 0,
|
|
211
|
+
fill: null,
|
|
212
|
+
stroke: null,
|
|
213
|
+
strokeWidth: 0,
|
|
214
|
+
dash: null,
|
|
215
|
+
alpha: 0,
|
|
216
|
+
members: [],
|
|
217
|
+
};
|
|
218
|
+
this.nodePool.push(b);
|
|
219
|
+
}
|
|
220
|
+
b.key = key;
|
|
221
|
+
b.seq = this.nodeBuckets.length;
|
|
222
|
+
b.z = zq - 512;
|
|
223
|
+
b.fill = n.fill;
|
|
224
|
+
b.stroke = stroke;
|
|
225
|
+
b.strokeWidth = stroke ? quantizeWidth(n.strokeWidth) / 4 : 0;
|
|
226
|
+
b.dash = dash;
|
|
227
|
+
b.alpha = aq / 64;
|
|
228
|
+
b.members.length = 0;
|
|
229
|
+
this.nodeMap.set(key, b);
|
|
230
|
+
this.nodeBuckets.push(b);
|
|
231
|
+
}
|
|
232
|
+
b.members.push(i);
|
|
233
|
+
this.nodeCount++;
|
|
234
|
+
if (n.r > this.maxR)
|
|
235
|
+
this.maxR = n.r;
|
|
236
|
+
if (n.ring !== null || (n.pulse > 0 && n.pulse < 1))
|
|
237
|
+
this.decor.push(i);
|
|
238
|
+
if (n.halo !== null && n.halo.alpha > 0)
|
|
239
|
+
this.halos.push(i);
|
|
240
|
+
if (n.badge !== null && n.badge.text.length > 0)
|
|
241
|
+
this.badges.push(i);
|
|
242
|
+
}
|
|
243
|
+
this.nodeBuckets.sort(bySeq);
|
|
244
|
+
if (this.decor.length > 1) {
|
|
245
|
+
this.decor.sort((a, b) => quantizeZ(nodes[a].z) - quantizeZ(nodes[b].z) || a - b);
|
|
246
|
+
}
|
|
247
|
+
const glyphs = frame.glyphs;
|
|
248
|
+
for (let i = 0; i < glyphs.length; i++) {
|
|
249
|
+
const g = glyphs[i];
|
|
250
|
+
if (quantizeAlpha(g.alpha) === 0 || !Number.isFinite(g.x1 + g.y1 + g.x2 + g.y2))
|
|
251
|
+
continue;
|
|
252
|
+
if (g.kind === 'pivot')
|
|
253
|
+
this.pivots.push(i);
|
|
254
|
+
else
|
|
255
|
+
this.glyphArcs.push(i);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/** Whether collapsed pill `i` may be picked (shown by the last paint, or not yet placed). */
|
|
259
|
+
pillPickable(i) {
|
|
260
|
+
return this.pillsVersion !== this.version || this.pillShown[i] === 1;
|
|
261
|
+
}
|
|
262
|
+
/** Spatial index over visible node centres (built on first use after a frame change). */
|
|
263
|
+
nodeGrid() {
|
|
264
|
+
const frame = this.frame;
|
|
265
|
+
if (this.gridVersion === this.version || !frame)
|
|
266
|
+
return this.grid;
|
|
267
|
+
this.gridVersion = this.version;
|
|
268
|
+
const n = this.nodeCount;
|
|
269
|
+
if (this.xs.length < n) {
|
|
270
|
+
const cap = Math.max(n, this.xs.length * 2);
|
|
271
|
+
this.xs = new Float64Array(cap);
|
|
272
|
+
this.ys = new Float64Array(cap);
|
|
273
|
+
this.rs = new Float64Array(cap);
|
|
274
|
+
this.ids = new Int32Array(cap);
|
|
275
|
+
}
|
|
276
|
+
let j = 0;
|
|
277
|
+
for (const b of this.nodeBuckets) {
|
|
278
|
+
for (const i of b.members) {
|
|
279
|
+
const node = frame.nodes[i];
|
|
280
|
+
this.xs[j] = node.x;
|
|
281
|
+
this.ys[j] = node.y;
|
|
282
|
+
this.rs[j] = node.r;
|
|
283
|
+
this.ids[j] = i;
|
|
284
|
+
j++;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
this.grid.build(this.xs, this.ys, this.rs, this.ids, j);
|
|
288
|
+
return this.grid;
|
|
289
|
+
}
|
|
290
|
+
/** Bounds of every visible node (with its radius), collapsed pill and glyph; null if empty. */
|
|
291
|
+
contentBounds() {
|
|
292
|
+
const frame = this.frame;
|
|
293
|
+
if (!frame)
|
|
294
|
+
return null;
|
|
295
|
+
if (this.boundsVersion === this.version)
|
|
296
|
+
return this.boundsValue;
|
|
297
|
+
this.boundsVersion = this.version;
|
|
298
|
+
let x0 = Number.POSITIVE_INFINITY;
|
|
299
|
+
let y0 = Number.POSITIVE_INFINITY;
|
|
300
|
+
let x1 = Number.NEGATIVE_INFINITY;
|
|
301
|
+
let y1 = Number.NEGATIVE_INFINITY;
|
|
302
|
+
for (const b of this.nodeBuckets) {
|
|
303
|
+
for (const i of b.members) {
|
|
304
|
+
const n = frame.nodes[i];
|
|
305
|
+
if (n.x - n.r < x0)
|
|
306
|
+
x0 = n.x - n.r;
|
|
307
|
+
if (n.y - n.r < y0)
|
|
308
|
+
y0 = n.y - n.r;
|
|
309
|
+
if (n.x + n.r > x1)
|
|
310
|
+
x1 = n.x + n.r;
|
|
311
|
+
if (n.y + n.r > y1)
|
|
312
|
+
y1 = n.y + n.r;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
for (const g of frame.collapsed) {
|
|
316
|
+
if (!Number.isFinite(g.x + g.y))
|
|
317
|
+
continue;
|
|
318
|
+
x0 = Math.min(x0, g.x);
|
|
319
|
+
y0 = Math.min(y0, g.y);
|
|
320
|
+
x1 = Math.max(x1, g.x);
|
|
321
|
+
y1 = Math.max(y1, g.y);
|
|
322
|
+
}
|
|
323
|
+
for (const i of this.glyphArcs) {
|
|
324
|
+
const g = frame.glyphs[i];
|
|
325
|
+
x0 = Math.min(x0, g.x1, g.x2);
|
|
326
|
+
y0 = Math.min(y0, g.y1, g.y2);
|
|
327
|
+
x1 = Math.max(x1, g.x1, g.x2);
|
|
328
|
+
y1 = Math.max(y1, g.y1, g.y2);
|
|
329
|
+
}
|
|
330
|
+
this.boundsValue = x0 <= x1 ? { x: x0, y: y0, width: x1 - x0, height: y1 - y0 } : null;
|
|
331
|
+
return this.boundsValue;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** Union of two optional rectangles. */
|
|
335
|
+
export function unionBounds(a, b) {
|
|
336
|
+
if (!a)
|
|
337
|
+
return b;
|
|
338
|
+
if (!b)
|
|
339
|
+
return a;
|
|
340
|
+
const x = Math.min(a.x, b.x);
|
|
341
|
+
const y = Math.min(a.y, b.y);
|
|
342
|
+
return {
|
|
343
|
+
x,
|
|
344
|
+
y,
|
|
345
|
+
width: Math.max(a.x + a.width, b.x + b.width) - x,
|
|
346
|
+
height: Math.max(a.y + a.height, b.y + b.height) - y,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=frame-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-cache.js","sourceRoot":"","sources":["../src/frame-cache.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @kgdiff/renderer: high-DPI Canvas 2D renderer for kgdiff scenes.
|
|
3
|
+
*
|
|
4
|
+
* The renderer draws `FrameVisuals` (from @kgdiff/scene) and owns everything
|
|
5
|
+
* pixel-related: camera, culling, level of detail, label placement, hit
|
|
6
|
+
* testing, swipe clipping and the minimap. It knows nothing about diffs.
|
|
7
|
+
*
|
|
8
|
+
* Quality bars: docs/visual-language.md §Rendering and docs/architecture.md §Budgets.
|
|
9
|
+
*
|
|
10
|
+
* Primitive semantics follow @kgdiff/scene's types: nested alphas (label, ring, halo, badge)
|
|
11
|
+
* multiply with their owner's; the curve convention is shared by edges and glyphs; arrowheads
|
|
12
|
+
* follow `EdgeVisual.arrowMinZoom`; glyph kinds this version does not know draw as plain lines.
|
|
13
|
+
*/
|
|
14
|
+
import type { Point, Rect } from '@kgdiff/core';
|
|
15
|
+
import type { CollapsedGroup, FrameVisuals, Theme } from '@kgdiff/scene';
|
|
16
|
+
/** World center + zoom. screen = (world − (x, y)) · k + viewportCenter. */
|
|
17
|
+
export interface CameraState {
|
|
18
|
+
readonly x: number;
|
|
19
|
+
readonly y: number;
|
|
20
|
+
readonly k: number;
|
|
21
|
+
}
|
|
22
|
+
export interface CameraTransitionOptions {
|
|
23
|
+
/** Extra space around the bounds, px. Default 48. */
|
|
24
|
+
readonly padding?: number | {
|
|
25
|
+
top: number;
|
|
26
|
+
right: number;
|
|
27
|
+
bottom: number;
|
|
28
|
+
left: number;
|
|
29
|
+
};
|
|
30
|
+
/** Default true (false when reduced motion). */
|
|
31
|
+
readonly animate?: boolean;
|
|
32
|
+
/** Override the computed duration (ms). */
|
|
33
|
+
readonly duration?: number;
|
|
34
|
+
/** Never zoom in beyond this. Default 2.5. */
|
|
35
|
+
readonly maxZoom?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface Camera {
|
|
38
|
+
get(): CameraState;
|
|
39
|
+
/** Jump (cancels any running transition). */
|
|
40
|
+
set(state: CameraState): void;
|
|
41
|
+
/** Smooth zoom-and-pan (van Wijk–Nuij) so `bounds` fills the viewport. Resolves when done or cancelled. */
|
|
42
|
+
flyTo(bounds: Rect, options?: CameraTransitionOptions): Promise<void>;
|
|
43
|
+
/** Fit the given bounds (or the frame's content bounds). */
|
|
44
|
+
fit(bounds?: Rect, options?: CameraTransitionOptions): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Multiply the zoom by `factor`, keeping the world point under `around` fixed (screen px,
|
|
47
|
+
* canvas-relative; default the viewport centre). Animated unless `animate: false` or
|
|
48
|
+
* reduced motion; repeated calls compound the target.
|
|
49
|
+
*/
|
|
50
|
+
zoomBy(factor: number, around?: Point, options?: {
|
|
51
|
+
readonly animate?: boolean;
|
|
52
|
+
}): void;
|
|
53
|
+
/** Move the content by (dx, dy) screen px (positive dx moves it right). Cancels motions. */
|
|
54
|
+
panBy(dx: number, dy: number): void;
|
|
55
|
+
worldToScreen(p: Point): Point;
|
|
56
|
+
screenToWorld(p: Point): Point;
|
|
57
|
+
/** The part of the world currently visible. */
|
|
58
|
+
viewport(): Rect;
|
|
59
|
+
}
|
|
60
|
+
export interface PickResult {
|
|
61
|
+
readonly type: 'node' | 'edge' | 'collapsed';
|
|
62
|
+
/** Node / edge index into the scene, or collapsed-group index. */
|
|
63
|
+
readonly index: number;
|
|
64
|
+
}
|
|
65
|
+
/** Swipe comparison: `before` drawn left of `split`, `after` right of it. */
|
|
66
|
+
export interface SplitFrame {
|
|
67
|
+
/** Divider position as a fraction of the viewport width, [0, 1]. */
|
|
68
|
+
readonly split: number;
|
|
69
|
+
readonly before: FrameVisuals;
|
|
70
|
+
readonly after: FrameVisuals;
|
|
71
|
+
}
|
|
72
|
+
export interface RendererEvents {
|
|
73
|
+
hover: PickResult | null;
|
|
74
|
+
click: {
|
|
75
|
+
readonly pick: PickResult | null;
|
|
76
|
+
readonly world: Point;
|
|
77
|
+
readonly event: PointerEvent | MouseEvent;
|
|
78
|
+
};
|
|
79
|
+
dblclick: {
|
|
80
|
+
readonly pick: PickResult | null;
|
|
81
|
+
readonly world: Point;
|
|
82
|
+
readonly event: MouseEvent;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* The camera moved (at most once per frame, and when the viewport is resized). `source` is
|
|
86
|
+
* 'user' when any change in that frame came from input (drag, wheel, pinch, inertia, minimap)
|
|
87
|
+
* and 'program' for API calls (`set`, `flyTo`, `fit`, `zoomBy`, `panBy`) and resizes.
|
|
88
|
+
*/
|
|
89
|
+
camera: CameraState & {
|
|
90
|
+
readonly source: 'user' | 'program';
|
|
91
|
+
};
|
|
92
|
+
/** Fired after each drawn frame with its draw time. */
|
|
93
|
+
frame: {
|
|
94
|
+
readonly ms: number;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export interface RendererOptions {
|
|
98
|
+
readonly theme: Theme;
|
|
99
|
+
/** Default `window.devicePixelRatio`, capped at 3. */
|
|
100
|
+
readonly pixelRatio?: number;
|
|
101
|
+
/** Default 0.05. */
|
|
102
|
+
readonly minZoom?: number;
|
|
103
|
+
/** Default 6. */
|
|
104
|
+
readonly maxZoom?: number;
|
|
105
|
+
/** Pan / zoom / pick with pointer, wheel and touch. Default true. */
|
|
106
|
+
readonly interactive?: boolean;
|
|
107
|
+
/** Draw the dot grid. Default true. */
|
|
108
|
+
readonly grid?: boolean;
|
|
109
|
+
/** Insets (px) the camera keeps clear when fitting, e.g. for floating UI. */
|
|
110
|
+
readonly safeArea?: {
|
|
111
|
+
top: number;
|
|
112
|
+
right: number;
|
|
113
|
+
bottom: number;
|
|
114
|
+
left: number;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export interface Renderer {
|
|
118
|
+
readonly canvas: HTMLCanvasElement;
|
|
119
|
+
readonly camera: Camera;
|
|
120
|
+
/** What to draw. Cheap: only marks the frame dirty; drawing happens on the next animation frame. */
|
|
121
|
+
setFrame(frame: FrameVisuals | SplitFrame): void;
|
|
122
|
+
setTheme(theme: Theme): void;
|
|
123
|
+
setSafeArea(area: {
|
|
124
|
+
top: number;
|
|
125
|
+
right: number;
|
|
126
|
+
bottom: number;
|
|
127
|
+
left: number;
|
|
128
|
+
}): void;
|
|
129
|
+
/** Topmost element under a screen point (px, relative to the canvas). */
|
|
130
|
+
pick(x: number, y: number): PickResult | null;
|
|
131
|
+
on<K extends keyof RendererEvents>(type: K, listener: (event: RendererEvents[K]) => void): () => void;
|
|
132
|
+
/** Re-measure the container (called automatically through ResizeObserver). */
|
|
133
|
+
resize(): void;
|
|
134
|
+
requestRender(): void;
|
|
135
|
+
/** PNG snapshot of the current view at the given scale (default pixelRatio). */
|
|
136
|
+
toDataURL(scale?: number): string;
|
|
137
|
+
destroy(): void;
|
|
138
|
+
}
|
|
139
|
+
export interface MinimapOptions {
|
|
140
|
+
/** px, default 184 × 128. */
|
|
141
|
+
readonly width?: number;
|
|
142
|
+
readonly height?: number;
|
|
143
|
+
}
|
|
144
|
+
export interface Minimap {
|
|
145
|
+
readonly canvas: HTMLCanvasElement;
|
|
146
|
+
/** Redraw marks (call when the frame or theme changes; viewport tracking is automatic). */
|
|
147
|
+
update(frame: FrameVisuals, collapsed?: readonly CollapsedGroup[]): void;
|
|
148
|
+
destroy(): void;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Create a renderer that fills `container` (which should be position: relative).
|
|
152
|
+
*
|
|
153
|
+
* The first frame with content is fitted automatically unless the camera was moved before.
|
|
154
|
+
* Throws `KgdiffError('invalid-input')` for an invalid container or zoom / pixel-ratio options.
|
|
155
|
+
*/
|
|
156
|
+
export declare function createRenderer(container: HTMLElement, options: RendererOptions): Renderer;
|
|
157
|
+
/**
|
|
158
|
+
* A minimap bound to `renderer`: change marks, viewport rectangle, click / drag to navigate.
|
|
159
|
+
* Call `update` when the frame changes; viewport and theme changes are tracked automatically.
|
|
160
|
+
*/
|
|
161
|
+
export declare function createMinimap(container: HTMLElement, renderer: Renderer, options?: MinimapOptions): Minimap;
|
|
162
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createMinimapImpl } from './minimap.js';
|
|
2
|
+
import { createRendererImpl } from './renderer.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create a renderer that fills `container` (which should be position: relative).
|
|
5
|
+
*
|
|
6
|
+
* The first frame with content is fitted automatically unless the camera was moved before.
|
|
7
|
+
* Throws `KgdiffError('invalid-input')` for an invalid container or zoom / pixel-ratio options.
|
|
8
|
+
*/
|
|
9
|
+
export function createRenderer(container, options) {
|
|
10
|
+
return createRendererImpl(container, options);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A minimap bound to `renderer`: change marks, viewport rectangle, click / drag to navigate.
|
|
14
|
+
* Call `update` when the frame changes; viewport and theme changes are tracked automatically.
|
|
15
|
+
*/
|
|
16
|
+
export function createMinimap(container, renderer, options) {
|
|
17
|
+
return createMinimapImpl(container, renderer, options);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AA4HnD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAsB,EAAE,OAAwB;IAC7E,OAAO,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAsB,EACtB,QAAkB,EAClB,OAAwB;IAExB,OAAO,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC"}
|
package/dist/input.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pointer, wheel, touch and Safari gesture handling.
|
|
3
|
+
*
|
|
4
|
+
* - Drag (mouse / pen / one finger) pans with inertia; a press that moves less than
|
|
5
|
+
* `DRAG_THRESHOLD` px is a click.
|
|
6
|
+
* - Two pointers pinch-zoom around their centroid and pan with it.
|
|
7
|
+
* - Wheel: ctrl/meta + wheel or trackpad pinch → zoom at the cursor; two-finger trackpad
|
|
8
|
+
* scroll → pan; mouse wheel notches → smooth zoom at the cursor.
|
|
9
|
+
*/
|
|
10
|
+
import type { CameraController } from './camera.js';
|
|
11
|
+
/** A press that moves less than this (px) is a click, not a drag. */
|
|
12
|
+
export declare const DRAG_THRESHOLD = 4;
|
|
13
|
+
/** Wheel events closer than this (ms) belong to one gesture and keep its classification. */
|
|
14
|
+
export declare const WHEEL_GESTURE_GAP = 160;
|
|
15
|
+
/** Minimum release speed (px/ms) that starts an inertial glide. */
|
|
16
|
+
export declare const GLIDE_START_SPEED = 0.1;
|
|
17
|
+
/** Release speeds are capped (px/ms) so a jittery flick cannot fling the graph away. */
|
|
18
|
+
export declare const GLIDE_MAX_SPEED = 6;
|
|
19
|
+
export type WheelIntent = 'pinch' | 'notch' | 'pan';
|
|
20
|
+
export interface WheelLike {
|
|
21
|
+
readonly deltaX: number;
|
|
22
|
+
readonly deltaY: number;
|
|
23
|
+
readonly deltaMode: number;
|
|
24
|
+
readonly ctrlKey: boolean;
|
|
25
|
+
readonly metaKey: boolean;
|
|
26
|
+
/** Non-standard (Blink / WebKit); trackpads report exactly −3 × deltaY. */
|
|
27
|
+
readonly wheelDeltaY?: number | undefined;
|
|
28
|
+
}
|
|
29
|
+
export interface WheelMemory {
|
|
30
|
+
last: number;
|
|
31
|
+
intent: WheelIntent | null;
|
|
32
|
+
}
|
|
33
|
+
export declare function createWheelMemory(): WheelMemory;
|
|
34
|
+
/** Whether a vertical pixel delta looks like a discrete mouse-wheel notch. */
|
|
35
|
+
export declare function isNotchDelta(deltaY: number): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Classify a wheel event. Events of one gesture keep the first event's intent, because a
|
|
38
|
+
* fast trackpad flick can produce large integer deltas that look like a mouse notch.
|
|
39
|
+
*/
|
|
40
|
+
export declare function classifyWheel(e: WheelLike, memory: WheelMemory, now: number): WheelIntent;
|
|
41
|
+
/** Wheel deltas in css px (line and page modes converted). */
|
|
42
|
+
export declare function wheelPixels(e: WheelLike, pageHeight: number): {
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Zoom factor for a vertical wheel delta (px). Pinch deltas follow the native pinch scale
|
|
48
|
+
* (`exp(−dy / 100)`); notches zoom ≈ 1.33× per 100 px notch, macOS steps ≈ 1.1× each.
|
|
49
|
+
*/
|
|
50
|
+
export declare function wheelZoomFactor(intent: 'pinch' | 'notch', deltaY: number): number;
|
|
51
|
+
/** Release velocity from the last ~100 ms of pointer samples (ring buffer, allocation-free). */
|
|
52
|
+
export declare class VelocityTracker {
|
|
53
|
+
private readonly t;
|
|
54
|
+
private readonly x;
|
|
55
|
+
private readonly y;
|
|
56
|
+
private n;
|
|
57
|
+
private head;
|
|
58
|
+
reset(): void;
|
|
59
|
+
add(t: number, x: number, y: number): void;
|
|
60
|
+
/** px/ms; zero when the pointer rested for more than 50 ms before `now`. */
|
|
61
|
+
velocity(now: number, window?: number): {
|
|
62
|
+
x: number;
|
|
63
|
+
y: number;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export interface InputHost {
|
|
67
|
+
readonly camera: CameraController;
|
|
68
|
+
/** Pointer moved over the canvas with no button pressed (css px, canvas-relative). */
|
|
69
|
+
hover(x: number, y: number): void;
|
|
70
|
+
/** Pointer left the canvas. */
|
|
71
|
+
leave(): void;
|
|
72
|
+
click(x: number, y: number, event: PointerEvent): void;
|
|
73
|
+
dblclick(x: number, y: number, event: MouseEvent): void;
|
|
74
|
+
/** A drag started / ended (cursor feedback). */
|
|
75
|
+
dragging(active: boolean): void;
|
|
76
|
+
/** Monotonic clock (ms). */
|
|
77
|
+
now(): number;
|
|
78
|
+
}
|
|
79
|
+
/** Wire input listeners on `el`; returns a function that removes all of them. */
|
|
80
|
+
export declare function attachInput(el: HTMLElement, host: InputHost): () => void;
|
|
81
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
|