@react-x11/components 0.4.0 → 0.6.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/README.md +143 -8
- package/dist/charts/components.d.ts +3 -1
- package/dist/charts/components.d.ts.map +1 -1
- package/dist/charts/components.js +8 -4
- package/dist/charts/components.js.map +1 -1
- package/dist/charts/node.d.ts +13 -6
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +75 -24
- package/dist/charts/node.js.map +1 -1
- package/dist/charts/render.d.ts +4 -0
- package/dist/charts/render.d.ts.map +1 -1
- package/dist/charts/render.js +11 -6
- package/dist/charts/render.js.map +1 -1
- package/dist/code-editor/node.d.ts +47 -16
- package/dist/code-editor/node.d.ts.map +1 -1
- package/dist/code-editor/node.js +121 -51
- package/dist/code-editor/node.js.map +1 -1
- package/dist/flow/draw.d.ts +19 -1
- package/dist/flow/draw.d.ts.map +1 -1
- package/dist/flow/draw.js +64 -35
- package/dist/flow/draw.js.map +1 -1
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +24 -8
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/model.d.ts +4 -2
- package/dist/flow/model.d.ts.map +1 -1
- package/dist/flow/model.js +4 -2
- package/dist/flow/model.js.map +1 -1
- package/dist/flow/node.d.ts +40 -9
- package/dist/flow/node.d.ts.map +1 -1
- package/dist/flow/node.js +142 -53
- package/dist/flow/node.js.map +1 -1
- package/dist/flow/types.d.ts +46 -21
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/formula/index.d.ts +4 -2
- package/dist/formula/index.d.ts.map +1 -1
- package/dist/formula/index.js.map +1 -1
- package/dist/formula/node.d.ts +5 -1
- package/dist/formula/node.d.ts.map +1 -1
- package/dist/formula/node.js +19 -3
- package/dist/formula/node.js.map +1 -1
- package/dist/html/controls.d.ts +4 -1
- package/dist/html/controls.d.ts.map +1 -1
- package/dist/html/controls.js.map +1 -1
- package/dist/html/css/cascade.d.ts +11 -5
- package/dist/html/css/cascade.d.ts.map +1 -1
- package/dist/html/css/cascade.js +18 -8
- package/dist/html/css/cascade.js.map +1 -1
- package/dist/html/css/parse.d.ts +15 -10
- package/dist/html/css/parse.d.ts.map +1 -1
- package/dist/html/css/parse.js +41 -16
- package/dist/html/css/parse.js.map +1 -1
- package/dist/html/css/style.d.ts +3 -0
- package/dist/html/css/style.d.ts.map +1 -1
- package/dist/html/css/style.js +3 -1
- package/dist/html/css/style.js.map +1 -1
- package/dist/html/css/values.d.ts +14 -1
- package/dist/html/css/values.d.ts.map +1 -1
- package/dist/html/css/values.js +11 -8
- package/dist/html/css/values.js.map +1 -1
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +1 -0
- package/dist/html/index.js.map +1 -1
- package/dist/html/layout/boxes.d.ts +12 -5
- package/dist/html/layout/boxes.d.ts.map +1 -1
- package/dist/html/layout/boxes.js +7 -4
- package/dist/html/layout/boxes.js.map +1 -1
- package/dist/html/layout/inline.d.ts.map +1 -1
- package/dist/html/layout/inline.js +22 -1
- package/dist/html/layout/inline.js.map +1 -1
- package/dist/html/node.d.ts +22 -8
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +97 -15
- package/dist/html/node.js.map +1 -1
- package/dist/html/paint.d.ts +3 -0
- package/dist/html/paint.d.ts.map +1 -1
- package/dist/html/paint.js +2 -2
- package/dist/html/paint.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/dist/maps/clip.d.ts +43 -0
- package/dist/maps/clip.d.ts.map +1 -0
- package/dist/maps/clip.js +171 -0
- package/dist/maps/clip.js.map +1 -0
- package/dist/maps/gzip.d.ts +15 -0
- package/dist/maps/gzip.d.ts.map +1 -0
- package/dist/maps/gzip.js +56 -0
- package/dist/maps/gzip.js.map +1 -0
- package/dist/maps/index.d.ts +55 -0
- package/dist/maps/index.d.ts.map +1 -0
- package/dist/maps/index.js +141 -0
- package/dist/maps/index.js.map +1 -0
- package/dist/maps/labels.d.ts +123 -0
- package/dist/maps/labels.d.ts.map +1 -0
- package/dist/maps/labels.js +323 -0
- package/dist/maps/labels.js.map +1 -0
- package/dist/maps/mvt.d.ts +244 -0
- package/dist/maps/mvt.d.ts.map +1 -0
- package/dist/maps/mvt.js +820 -0
- package/dist/maps/mvt.js.map +1 -0
- package/dist/maps/node.d.ts +278 -0
- package/dist/maps/node.d.ts.map +1 -0
- package/dist/maps/node.js +1459 -0
- package/dist/maps/node.js.map +1 -0
- package/dist/maps/overlay.d.ts +157 -0
- package/dist/maps/overlay.d.ts.map +1 -0
- package/dist/maps/overlay.js +472 -0
- package/dist/maps/overlay.js.map +1 -0
- package/dist/maps/paint.d.ts +226 -0
- package/dist/maps/paint.d.ts.map +1 -0
- package/dist/maps/paint.js +705 -0
- package/dist/maps/paint.js.map +1 -0
- package/dist/maps/proj.d.ts +281 -0
- package/dist/maps/proj.d.ts.map +1 -0
- package/dist/maps/proj.js +451 -0
- package/dist/maps/proj.js.map +1 -0
- package/dist/maps/sources.d.ts +256 -0
- package/dist/maps/sources.d.ts.map +1 -0
- package/dist/maps/sources.js +210 -0
- package/dist/maps/sources.js.map +1 -0
- package/dist/maps/style.d.ts +141 -0
- package/dist/maps/style.d.ts.map +1 -0
- package/dist/maps/style.js +147 -0
- package/dist/maps/style.js.map +1 -0
- package/dist/maps/styles.d.ts +82 -0
- package/dist/maps/styles.d.ts.map +1 -0
- package/dist/maps/styles.js +898 -0
- package/dist/maps/styles.js.map +1 -0
- package/dist/maps/tiles.d.ts +283 -0
- package/dist/maps/tiles.d.ts.map +1 -0
- package/dist/maps/tiles.js +469 -0
- package/dist/maps/tiles.js.map +1 -0
- package/dist/maps/types.d.ts +244 -0
- package/dist/maps/types.d.ts.map +1 -0
- package/dist/maps/types.js +2 -0
- package/dist/maps/types.js.map +1 -0
- package/dist/markdown/ast.d.ts +80 -6
- package/dist/markdown/ast.d.ts.map +1 -1
- package/dist/markdown/ast.js +13 -4
- package/dist/markdown/ast.js.map +1 -1
- package/dist/markdown/expressions.d.ts +27 -0
- package/dist/markdown/expressions.d.ts.map +1 -0
- package/dist/markdown/expressions.js +203 -0
- package/dist/markdown/expressions.js.map +1 -0
- package/dist/markdown/index.d.ts +61 -2
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +101 -2
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/parse.d.ts +1 -1
- package/dist/markdown/parse.d.ts.map +1 -1
- package/dist/markdown/parse.js +163 -15
- package/dist/markdown/parse.js.map +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/markdown/spans.js +4 -0
- package/dist/markdown/spans.js.map +1 -1
- package/dist/markdown/tags.d.ts +35 -0
- package/dist/markdown/tags.d.ts.map +1 -0
- package/dist/markdown/tags.js +213 -0
- package/dist/markdown/tags.js.map +1 -0
- package/dist/reorder/hx.d.ts +18 -0
- package/dist/reorder/hx.d.ts.map +1 -0
- package/dist/reorder/hx.js +10 -0
- package/dist/reorder/hx.js.map +1 -0
- package/dist/reorder/index.d.ts +314 -0
- package/dist/reorder/index.d.ts.map +1 -0
- package/dist/reorder/index.js +1539 -0
- package/dist/reorder/index.js.map +1 -0
- package/dist/reorder/model.d.ts +107 -0
- package/dist/reorder/model.d.ts.map +1 -0
- package/dist/reorder/model.js +162 -0
- package/dist/reorder/model.js.map +1 -0
- package/dist/richtext/node.d.ts +15 -5
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +40 -11
- package/dist/richtext/node.js.map +1 -1
- package/dist/richtext/runs.d.ts +35 -13
- package/dist/richtext/runs.d.ts.map +1 -1
- package/dist/richtext/runs.js +83 -27
- package/dist/richtext/runs.js.map +1 -1
- package/dist/tabs/index.d.ts +17 -0
- package/dist/tabs/index.d.ts.map +1 -1
- package/dist/tabs/index.js +849 -186
- package/dist/tabs/index.js.map +1 -1
- package/dist/terminal/vt/fonts.d.ts +45 -15
- package/dist/terminal/vt/fonts.d.ts.map +1 -1
- package/dist/terminal/vt/fonts.js +89 -19
- package/dist/terminal/vt/fonts.js.map +1 -1
- package/dist/terminal/vt/node.d.ts +42 -0
- package/dist/terminal/vt/node.d.ts.map +1 -1
- package/dist/terminal/vt/node.js +95 -11
- package/dist/terminal/vt/node.js.map +1 -1
- package/dist/terminal/vt/renderer.d.ts.map +1 -1
- package/dist/terminal/vt/renderer.js +13 -3
- package/dist/terminal/vt/renderer.js.map +1 -1
- package/package.json +14 -3
- package/src/charts/components.ts +14 -7
- package/src/charts/node.ts +81 -26
- package/src/charts/render.ts +16 -6
- package/src/code-editor/node.ts +147 -53
- package/src/flow/draw.ts +104 -35
- package/src/flow/index.ts +33 -13
- package/src/flow/model.ts +4 -2
- package/src/flow/node.ts +158 -59
- package/src/flow/types.ts +46 -21
- package/src/formula/index.ts +4 -2
- package/src/formula/node.ts +24 -5
- package/src/html/controls.ts +4 -1
- package/src/html/css/cascade.ts +18 -7
- package/src/html/css/parse.ts +46 -21
- package/src/html/css/style.ts +6 -1
- package/src/html/css/values.ts +25 -9
- package/src/html/index.ts +1 -0
- package/src/html/layout/boxes.ts +19 -9
- package/src/html/layout/inline.ts +23 -1
- package/src/html/node.ts +110 -17
- package/src/html/paint.ts +17 -2
- package/src/index.ts +102 -0
- package/src/maps/clip.ts +184 -0
- package/src/maps/gzip.ts +66 -0
- package/src/maps/index.ts +316 -0
- package/src/maps/labels.ts +442 -0
- package/src/maps/mvt.ts +857 -0
- package/src/maps/node.ts +1819 -0
- package/src/maps/overlay.ts +639 -0
- package/src/maps/paint.ts +978 -0
- package/src/maps/proj.ts +641 -0
- package/src/maps/sources.ts +425 -0
- package/src/maps/style.ts +309 -0
- package/src/maps/styles.ts +1040 -0
- package/src/maps/tiles.ts +676 -0
- package/src/maps/types.ts +260 -0
- package/src/markdown/ast.ts +85 -9
- package/src/markdown/expressions.ts +223 -0
- package/src/markdown/index.ts +190 -5
- package/src/markdown/parse.ts +230 -15
- package/src/markdown/spans.ts +4 -0
- package/src/markdown/tags.ts +240 -0
- package/src/reorder/hx.ts +31 -0
- package/src/reorder/index.ts +2223 -0
- package/src/reorder/model.ts +232 -0
- package/src/richtext/node.ts +49 -14
- package/src/richtext/runs.ts +115 -30
- package/src/tabs/index.ts +1040 -204
- package/src/terminal/vt/fonts.ts +128 -36
- package/src/terminal/vt/node.ts +105 -12
- package/src/terminal/vt/renderer.ts +13 -3
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
// What the application puts on the map: markers, and the lines, areas and
|
|
2
|
+
// circles that carry a route, a traffic segment, a transit shape or a
|
|
3
|
+
// GeoJSON layer.
|
|
4
|
+
//
|
|
5
|
+
// All of it is drawn **into the frame**, not into a tile surface, for the
|
|
6
|
+
// reason the labels are: it is application state that changes on its own
|
|
7
|
+
// clock, and baking it into a tile would mean re-rasterizing a tile every
|
|
8
|
+
// time a vehicle moved. It rides the pan blit like everything else on the
|
|
9
|
+
// map, because it is anchored to geography.
|
|
10
|
+
//
|
|
11
|
+
// The vocabulary is deliberately small and deliberately geometric — a line
|
|
12
|
+
// is a line whether it came from a routing engine, a GTFS shape or a
|
|
13
|
+
// traffic feed — with the format adapters ({@link decodePolyline},
|
|
14
|
+
// {@link geoJsonOverlays}) kept as pure functions beside it rather than as
|
|
15
|
+
// props of the map. `docs/prd-maps.md` surveys what the real feeds look
|
|
16
|
+
// like and why this is the shape they all reduce to.
|
|
17
|
+
import { clipOf, clipRing, clipSegment } from './clip.js';
|
|
18
|
+
import { projectLngLat } from './proj.js';
|
|
19
|
+
function byZ(items) {
|
|
20
|
+
// A stable sort — the language guarantees it — so items with no `zIndex`
|
|
21
|
+
// keep the order the application listed them in.
|
|
22
|
+
return [...items].sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Draw the overlays.
|
|
26
|
+
*
|
|
27
|
+
* Under the markers, because a marker is a thing the user aims at and an
|
|
28
|
+
* overlay is context for it.
|
|
29
|
+
*/
|
|
30
|
+
export function drawOverlays(ctx, overlays, transform, pane, scale, palette) {
|
|
31
|
+
const clip = clipOf(pane, scale);
|
|
32
|
+
for (const overlay of byZ(overlays)) {
|
|
33
|
+
const opacity = overlay.opacity ?? 1;
|
|
34
|
+
if (opacity <= 0)
|
|
35
|
+
continue;
|
|
36
|
+
ctx.save();
|
|
37
|
+
if (ctx.globalAlpha !== undefined && opacity < 1)
|
|
38
|
+
ctx.globalAlpha = opacity;
|
|
39
|
+
if (overlay.kind === 'line') {
|
|
40
|
+
const points = projectPath(overlay.path, transform, pane, scale);
|
|
41
|
+
const width = (overlay.width ?? 3) * scale;
|
|
42
|
+
if (overlay.casing !== undefined) {
|
|
43
|
+
ctx.strokeStyle = overlay.casing;
|
|
44
|
+
ctx.lineWidth = Math.max(width + 2 * scale, (overlay.casingWidth ?? 0) * scale);
|
|
45
|
+
ctx.lineCap = overlay.cap ?? 'round';
|
|
46
|
+
ctx.lineJoin = overlay.join ?? 'round';
|
|
47
|
+
strokeClipped(ctx, points, clip);
|
|
48
|
+
}
|
|
49
|
+
ctx.strokeStyle = overlay.color ?? palette.accent;
|
|
50
|
+
ctx.lineWidth = width;
|
|
51
|
+
ctx.lineCap = overlay.cap ?? 'round';
|
|
52
|
+
ctx.lineJoin = overlay.join ?? 'round';
|
|
53
|
+
if (overlay.dash && ctx.setLineDash) {
|
|
54
|
+
ctx.setLineDash(overlay.dash.map((d) => d * scale));
|
|
55
|
+
}
|
|
56
|
+
strokeClipped(ctx, points, clip);
|
|
57
|
+
if (overlay.dash && ctx.setLineDash)
|
|
58
|
+
ctx.setLineDash([]);
|
|
59
|
+
}
|
|
60
|
+
else if (overlay.kind === 'polygon') {
|
|
61
|
+
ctx.beginPath();
|
|
62
|
+
let any = false;
|
|
63
|
+
for (const ring of overlay.rings) {
|
|
64
|
+
const clipped = clipRing(projectPath(ring, transform, pane, scale), clip);
|
|
65
|
+
if (appendRing(ctx, clipped))
|
|
66
|
+
any = true;
|
|
67
|
+
}
|
|
68
|
+
if (any) {
|
|
69
|
+
ctx.fillStyle = overlay.fill ?? palette.accent;
|
|
70
|
+
ctx.fill();
|
|
71
|
+
if (overlay.outline !== undefined) {
|
|
72
|
+
ctx.strokeStyle = overlay.outline;
|
|
73
|
+
ctx.lineWidth = (overlay.outlineWidth ?? 1) * scale;
|
|
74
|
+
ctx.stroke();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// A circle in ground metres is an ellipse on a Mercator map, and at
|
|
80
|
+
// the sizes an application draws one it is close enough to a circle
|
|
81
|
+
// that the difference is under a pixel — except near the poles, where
|
|
82
|
+
// it is not. So the radius is computed from the *projection* rather
|
|
83
|
+
// than from a metres-per-pixel constant: one degree of latitude
|
|
84
|
+
// either side of the centre, projected, is exactly the scale factor
|
|
85
|
+
// this circle should be drawn at.
|
|
86
|
+
const centre = projectLngLat(transform, overlay.center);
|
|
87
|
+
const north = projectLngLat(transform, {
|
|
88
|
+
lon: overlay.center.lon,
|
|
89
|
+
lat: Math.min(85, overlay.center.lat + 0.01),
|
|
90
|
+
});
|
|
91
|
+
const metresPerDegree = 111_319.9;
|
|
92
|
+
const pixelsPerMetre = Math.abs(centre.y - north.y) / (0.01 * metresPerDegree);
|
|
93
|
+
const radius = overlay.radiusMetres * pixelsPerMetre * scale;
|
|
94
|
+
const cx = (pane.x + centre.x) * scale;
|
|
95
|
+
const cy = (pane.y + centre.y) * scale;
|
|
96
|
+
const outside = cx + radius < clip.minX ||
|
|
97
|
+
cx - radius > clip.maxX ||
|
|
98
|
+
cy + radius < clip.minY ||
|
|
99
|
+
cy - radius > clip.maxY;
|
|
100
|
+
if (radius > 0.5 && !outside) {
|
|
101
|
+
ctx.fillStyle = overlay.fill ?? palette.accent;
|
|
102
|
+
if (radius <= MAX_ARC_RADIUS) {
|
|
103
|
+
ctx.beginPath();
|
|
104
|
+
ctx.moveTo(cx + radius, cy);
|
|
105
|
+
ctx.arc(cx, cy, radius, 0, Math.PI * 2);
|
|
106
|
+
ctx.fill();
|
|
107
|
+
if (overlay.outline !== undefined) {
|
|
108
|
+
ctx.strokeStyle = overlay.outline;
|
|
109
|
+
ctx.lineWidth = (overlay.outlineWidth ?? 1) * scale;
|
|
110
|
+
ctx.stroke();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Past the arc's safe range the circle becomes a ring and is
|
|
115
|
+
// clipped like any other polygon. The segment count keeps the
|
|
116
|
+
// sagitta under half a pixel, and for a circle this large the
|
|
117
|
+
// visible arc is very nearly straight anyway.
|
|
118
|
+
ctx.beginPath();
|
|
119
|
+
if (appendRing(ctx, clipRing(circleRing(cx, cy, radius), clip))) {
|
|
120
|
+
ctx.fill();
|
|
121
|
+
if (overlay.outline !== undefined) {
|
|
122
|
+
ctx.strokeStyle = overlay.outline;
|
|
123
|
+
ctx.lineWidth = (overlay.outlineWidth ?? 1) * scale;
|
|
124
|
+
ctx.stroke();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
ctx.restore();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Everything below this line exists because **an overlay's coordinates are
|
|
135
|
+
* unbounded and the renderer's are not.**
|
|
136
|
+
*
|
|
137
|
+
* A route is geography, so its far end stays where it is when the camera
|
|
138
|
+
* zooms in on one corner of it. World pixels are `512 · 2^zoom`, which at
|
|
139
|
+
* zoom 20 is 134 million, so a vertex a fraction of a degree outside the
|
|
140
|
+
* pane is already tens of thousands of pixels away — and ntk hands a
|
|
141
|
+
* stroke's geometry to XRender as 16.16 fixed point, which overflows a
|
|
142
|
+
* signed 32-bit word at 32,768. The symptom is a `RangeError` out of
|
|
143
|
+
* `x11/lib/ext/render.js` a few zoom steps in, from inside `paint`, which
|
|
144
|
+
* is not a place an application can catch it.
|
|
145
|
+
*
|
|
146
|
+
* So geometry is clipped to the viewport before it reaches the context.
|
|
147
|
+
* That is the fix; the fact that it also stops the renderer rasterizing
|
|
148
|
+
* megametres of off-screen line is a bonus rather than the reason.
|
|
149
|
+
*/
|
|
150
|
+
/** A path projected into target pixels, as a flat `[x0, y0, x1, y1, …]`. */
|
|
151
|
+
function projectPath(path, transform, pane, scale) {
|
|
152
|
+
const out = [];
|
|
153
|
+
for (const position of path) {
|
|
154
|
+
const point = projectLngLat(transform, position);
|
|
155
|
+
out.push((pane.x + point.x) * scale, (pane.y + point.y) * scale);
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Stroke a projected path, clipped.
|
|
161
|
+
*
|
|
162
|
+
* A polyline that leaves and re-enters the window becomes several subpaths,
|
|
163
|
+
* which is why this cannot be a `ctx.clip()` and a single path: the clip
|
|
164
|
+
* would keep the coordinates, and the coordinates are the problem.
|
|
165
|
+
*/
|
|
166
|
+
function strokeClipped(ctx, points, clip) {
|
|
167
|
+
if (points.length < 4)
|
|
168
|
+
return;
|
|
169
|
+
ctx.beginPath();
|
|
170
|
+
let open = false;
|
|
171
|
+
let drew = false;
|
|
172
|
+
for (let i = 0; i + 3 < points.length; i += 2) {
|
|
173
|
+
const piece = clipSegment(points[i], points[i + 1], points[i + 2], points[i + 3], clip);
|
|
174
|
+
if (!piece) {
|
|
175
|
+
open = false;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const [x0, y0, x1, y1] = piece;
|
|
179
|
+
// A new subpath unless this segment continues exactly where the last
|
|
180
|
+
// one ended — which is the whole-segment-visible case, and the one that
|
|
181
|
+
// has to keep its joins.
|
|
182
|
+
if (!open) {
|
|
183
|
+
ctx.moveTo(x0, y0);
|
|
184
|
+
open = true;
|
|
185
|
+
}
|
|
186
|
+
ctx.lineTo(x1, y1);
|
|
187
|
+
drew = true;
|
|
188
|
+
// The segment was cut short at the far end, so the next one does not
|
|
189
|
+
// continue from here.
|
|
190
|
+
if (x1 !== points[i + 2] || y1 !== points[i + 3])
|
|
191
|
+
open = false;
|
|
192
|
+
}
|
|
193
|
+
if (drew)
|
|
194
|
+
ctx.stroke();
|
|
195
|
+
}
|
|
196
|
+
function appendRing(ctx, ring) {
|
|
197
|
+
if (ring.length < 6)
|
|
198
|
+
return false;
|
|
199
|
+
ctx.moveTo(ring[0], ring[1]);
|
|
200
|
+
for (let i = 2; i < ring.length; i += 2)
|
|
201
|
+
ctx.lineTo(ring[i], ring[i + 1]);
|
|
202
|
+
ctx.closePath();
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
/** Where a marker's ink lands, in pane-local logical pixels. Shared by the
|
|
206
|
+
* drawing and the hit test, so the two cannot disagree — the bug that
|
|
207
|
+
* makes a marker unclickable a few pixels from where it looks. */
|
|
208
|
+
export function markerRect(marker, transform) {
|
|
209
|
+
const point = projectLngLat(transform, marker.position);
|
|
210
|
+
const size = marker.size ?? 14;
|
|
211
|
+
if ((marker.shape ?? 'pin') === 'circle') {
|
|
212
|
+
return {
|
|
213
|
+
x: point.x - size / 2,
|
|
214
|
+
y: point.y - size / 2,
|
|
215
|
+
width: size,
|
|
216
|
+
height: size,
|
|
217
|
+
tipX: point.x,
|
|
218
|
+
tipY: point.y,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// A pin *stands on* its position: the point is the tip, and the head is
|
|
222
|
+
// above it. Getting this the other way round puts every marker half its
|
|
223
|
+
// own height north of where it belongs, which on a city map is a street.
|
|
224
|
+
const height = size * 1.4;
|
|
225
|
+
return {
|
|
226
|
+
x: point.x - size / 2,
|
|
227
|
+
y: point.y - height,
|
|
228
|
+
width: size,
|
|
229
|
+
height,
|
|
230
|
+
tipX: point.x,
|
|
231
|
+
tipY: point.y,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/** Draw the markers, lowest `zIndex` first. */
|
|
235
|
+
export function drawMarkers(ctx, markers, transform, pane, scale, palette) {
|
|
236
|
+
let drawn = 0;
|
|
237
|
+
for (const marker of byZ(markers)) {
|
|
238
|
+
const rect = markerRect(marker, transform);
|
|
239
|
+
if (rect.x + rect.width < 0 ||
|
|
240
|
+
rect.y + rect.height < 0 ||
|
|
241
|
+
rect.x > pane.width ||
|
|
242
|
+
rect.y > pane.height) {
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
const size = marker.size ?? 14;
|
|
246
|
+
const fill = marker.color ?? palette.accent;
|
|
247
|
+
const ring = marker.outline ?? palette.background;
|
|
248
|
+
const x = (pane.x + rect.tipX) * scale;
|
|
249
|
+
const y = (pane.y + rect.tipY) * scale;
|
|
250
|
+
const r = (size / 2) * scale;
|
|
251
|
+
ctx.save();
|
|
252
|
+
ctx.lineWidth = Math.max(1, (marker.selected ? 2.5 : 1.5) * scale);
|
|
253
|
+
ctx.strokeStyle = marker.selected ? palette.text : ring;
|
|
254
|
+
ctx.fillStyle = fill;
|
|
255
|
+
if ((marker.shape ?? 'pin') === 'circle') {
|
|
256
|
+
ctx.beginPath();
|
|
257
|
+
ctx.moveTo(x + r, y);
|
|
258
|
+
ctx.arc(x, y, r, 0, Math.PI * 2);
|
|
259
|
+
ctx.fill();
|
|
260
|
+
ctx.stroke();
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// A teardrop: a circle for the head and two lines down to the tip.
|
|
264
|
+
// The tangent angle is where the straight sides meet the circle, so
|
|
265
|
+
// the outline is smooth rather than two lines crossing an arc.
|
|
266
|
+
const cy = y - size * 1.4 * scale + r;
|
|
267
|
+
const d = y - cy;
|
|
268
|
+
const angle = Math.asin(Math.min(1, r / d));
|
|
269
|
+
ctx.beginPath();
|
|
270
|
+
ctx.arc(x, cy, r, Math.PI / 2 + angle, Math.PI / 2 - angle);
|
|
271
|
+
ctx.lineTo(x, y);
|
|
272
|
+
ctx.closePath();
|
|
273
|
+
ctx.fill();
|
|
274
|
+
ctx.stroke();
|
|
275
|
+
}
|
|
276
|
+
ctx.restore();
|
|
277
|
+
drawn++;
|
|
278
|
+
}
|
|
279
|
+
return drawn;
|
|
280
|
+
}
|
|
281
|
+
/** The marker under a pane-local logical point, topmost first, or null. */
|
|
282
|
+
export function markerAt(markers, transform, x, y, slop = 2) {
|
|
283
|
+
const ordered = byZ(markers);
|
|
284
|
+
for (let i = ordered.length - 1; i >= 0; i--) {
|
|
285
|
+
const marker = ordered[i];
|
|
286
|
+
if (marker.interactive === false)
|
|
287
|
+
continue;
|
|
288
|
+
const rect = markerRect(marker, transform);
|
|
289
|
+
if (x >= rect.x - slop &&
|
|
290
|
+
x <= rect.x + rect.width + slop &&
|
|
291
|
+
y >= rect.y - slop &&
|
|
292
|
+
y <= rect.y + rect.height + slop) {
|
|
293
|
+
return marker;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Decode Google's Encoded Polyline Algorithm Format.
|
|
300
|
+
*
|
|
301
|
+
* Here because it is what every routing engine on the open web answers
|
|
302
|
+
* with — Google Directions, OSRM, Valhalla, GraphHopper, Mapbox Directions
|
|
303
|
+
* — so a route arrives as one of these strings far more often than as
|
|
304
|
+
* GeoJSON. `precision` is 5 for Google and OSRM's default, 6 for Valhalla
|
|
305
|
+
* and OSRM's `polyline6`; passing the wrong one puts the route in the
|
|
306
|
+
* Atlantic, which is the standard way to discover this.
|
|
307
|
+
*/
|
|
308
|
+
export function decodePolyline(encoded, precision = 5) {
|
|
309
|
+
const factor = Math.pow(10, precision);
|
|
310
|
+
const out = [];
|
|
311
|
+
let index = 0;
|
|
312
|
+
let lat = 0;
|
|
313
|
+
let lon = 0;
|
|
314
|
+
while (index < encoded.length) {
|
|
315
|
+
let result = 0;
|
|
316
|
+
let shift = 0;
|
|
317
|
+
let byte;
|
|
318
|
+
do {
|
|
319
|
+
byte = encoded.charCodeAt(index++) - 63;
|
|
320
|
+
result |= (byte & 0x1f) << shift;
|
|
321
|
+
shift += 5;
|
|
322
|
+
} while (byte >= 0x20 && index < encoded.length);
|
|
323
|
+
lat += result & 1 ? ~(result >> 1) : result >> 1;
|
|
324
|
+
result = 0;
|
|
325
|
+
shift = 0;
|
|
326
|
+
do {
|
|
327
|
+
byte = encoded.charCodeAt(index++) - 63;
|
|
328
|
+
result |= (byte & 0x1f) << shift;
|
|
329
|
+
shift += 5;
|
|
330
|
+
} while (byte >= 0x20 && index < encoded.length);
|
|
331
|
+
lon += result & 1 ? ~(result >> 1) : result >> 1;
|
|
332
|
+
out.push({ lat: lat / factor, lon: lon / factor });
|
|
333
|
+
}
|
|
334
|
+
return out;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* GeoJSON to overlays.
|
|
338
|
+
*
|
|
339
|
+
* Points become markers and everything else becomes an overlay, which is
|
|
340
|
+
* the split the drawing makes. `style` is asked once per feature so an
|
|
341
|
+
* application can colour by a property — a traffic feed's congestion, a
|
|
342
|
+
* transit feed's route colour — without this function growing an
|
|
343
|
+
* expression language.
|
|
344
|
+
*
|
|
345
|
+
* Coordinates are `[lon, lat]`, which is GeoJSON's order and the opposite
|
|
346
|
+
* of how most people say it.
|
|
347
|
+
*/
|
|
348
|
+
export function geoJsonOverlays(geojson, style) {
|
|
349
|
+
const overlays = [];
|
|
350
|
+
const markers = [];
|
|
351
|
+
let counter = 0;
|
|
352
|
+
const positions = (value) => Array.isArray(value)
|
|
353
|
+
? value
|
|
354
|
+
.filter((pair) => Array.isArray(pair) &&
|
|
355
|
+
typeof pair[0] === 'number' &&
|
|
356
|
+
typeof pair[1] === 'number')
|
|
357
|
+
.map(([lon, lat]) => ({ lon, lat }))
|
|
358
|
+
: [];
|
|
359
|
+
const walk = (node, owner) => {
|
|
360
|
+
const id = String(owner.id ?? `geojson-${counter++}`);
|
|
361
|
+
const extra = style?.(owner) ?? {};
|
|
362
|
+
switch (node.type) {
|
|
363
|
+
case 'FeatureCollection':
|
|
364
|
+
for (const feature of node.features ?? [])
|
|
365
|
+
walk(feature, feature);
|
|
366
|
+
return;
|
|
367
|
+
case 'Feature':
|
|
368
|
+
if (node.geometry)
|
|
369
|
+
walk(node.geometry, node);
|
|
370
|
+
return;
|
|
371
|
+
case 'GeometryCollection':
|
|
372
|
+
for (const geometry of node.geometries ?? [])
|
|
373
|
+
walk(geometry, owner);
|
|
374
|
+
return;
|
|
375
|
+
case 'Point': {
|
|
376
|
+
const [point] = positions([node.coordinates]);
|
|
377
|
+
if (point)
|
|
378
|
+
markers.push({ id, position: point, data: owner.properties });
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
case 'MultiPoint':
|
|
382
|
+
for (const point of positions(node.coordinates)) {
|
|
383
|
+
markers.push({
|
|
384
|
+
id: `${id}-${counter++}`,
|
|
385
|
+
position: point,
|
|
386
|
+
data: owner.properties,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
return;
|
|
390
|
+
case 'LineString': {
|
|
391
|
+
const path = positions(node.coordinates);
|
|
392
|
+
if (path.length >= 2) {
|
|
393
|
+
overlays.push({
|
|
394
|
+
kind: 'line',
|
|
395
|
+
id,
|
|
396
|
+
path,
|
|
397
|
+
data: owner.properties,
|
|
398
|
+
...extra,
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
case 'MultiLineString':
|
|
404
|
+
for (const part of node.coordinates ?? []) {
|
|
405
|
+
const path = positions(part);
|
|
406
|
+
if (path.length >= 2) {
|
|
407
|
+
overlays.push({
|
|
408
|
+
kind: 'line',
|
|
409
|
+
id: `${id}-${counter++}`,
|
|
410
|
+
path,
|
|
411
|
+
data: owner.properties,
|
|
412
|
+
...extra,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return;
|
|
417
|
+
case 'Polygon': {
|
|
418
|
+
const rings = (node.coordinates ?? []).map(positions);
|
|
419
|
+
if (rings.length > 0) {
|
|
420
|
+
overlays.push({
|
|
421
|
+
kind: 'polygon',
|
|
422
|
+
id,
|
|
423
|
+
rings,
|
|
424
|
+
data: owner.properties,
|
|
425
|
+
...extra,
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
case 'MultiPolygon':
|
|
431
|
+
for (const polygon of node.coordinates ?? []) {
|
|
432
|
+
const rings = (polygon ?? []).map(positions);
|
|
433
|
+
if (rings.length > 0) {
|
|
434
|
+
overlays.push({
|
|
435
|
+
kind: 'polygon',
|
|
436
|
+
id: `${id}-${counter++}`,
|
|
437
|
+
rings,
|
|
438
|
+
data: owner.properties,
|
|
439
|
+
...extra,
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
return;
|
|
444
|
+
default:
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
walk(geojson, geojson);
|
|
449
|
+
return { overlays, markers };
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Beyond this radius in target pixels a circle is drawn as a clipped ring
|
|
453
|
+
* rather than an arc.
|
|
454
|
+
*
|
|
455
|
+
* The bound is the renderer's rather than the geometry's: ntk hands a
|
|
456
|
+
* stroke's geometry to XRender in 16.16 fixed point, which overflows a
|
|
457
|
+
* signed 32-bit word at 32,768, so an arc whose control geometry reaches
|
|
458
|
+
* that far is a `RangeError` from inside `paint`. Comfortably under it.
|
|
459
|
+
*/
|
|
460
|
+
const MAX_ARC_RADIUS = 8192;
|
|
461
|
+
/** A circle as a ring, with the sagitta held under half a pixel. */
|
|
462
|
+
function circleRing(cx, cy, radius) {
|
|
463
|
+
const step = 2 * Math.acos(Math.max(-1, 1 - 0.5 / radius));
|
|
464
|
+
const segments = Math.min(4096, Math.max(24, Math.ceil((Math.PI * 2) / step)));
|
|
465
|
+
const out = [];
|
|
466
|
+
for (let i = 0; i < segments; i++) {
|
|
467
|
+
const angle = (i / segments) * Math.PI * 2;
|
|
468
|
+
out.push(cx + Math.cos(angle) * radius, cy + Math.sin(angle) * radius);
|
|
469
|
+
}
|
|
470
|
+
return out;
|
|
471
|
+
}
|
|
472
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/maps/overlay.ts"],"names":[],"mappings":"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"}
|