@oh-just-another/renderer-core 0.57.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 +15 -0
- package/LICENSE +21 -0
- package/README.md +40 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/animation-adapter.d.ts +91 -0
- package/dist/animation-adapter.d.ts.map +1 -0
- package/dist/animation-adapter.js +90 -0
- package/dist/animation-adapter.js.map +1 -0
- package/dist/built-in-renderers.d.ts +6 -0
- package/dist/built-in-renderers.d.ts.map +1 -0
- package/dist/built-in-renderers.js +517 -0
- package/dist/built-in-renderers.js.map +1 -0
- package/dist/constants.d.ts +97 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +115 -0
- package/dist/constants.js.map +1 -0
- package/dist/edge-cache-bitmap.d.ts +34 -0
- package/dist/edge-cache-bitmap.d.ts.map +1 -0
- package/dist/edge-cache-bitmap.js +42 -0
- package/dist/edge-cache-bitmap.js.map +1 -0
- package/dist/edge-cache.d.ts +32 -0
- package/dist/edge-cache.d.ts.map +1 -0
- package/dist/edge-cache.js +90 -0
- package/dist/edge-cache.js.map +1 -0
- package/dist/edge-renderer.d.ts +73 -0
- package/dist/edge-renderer.d.ts.map +1 -0
- package/dist/edge-renderer.js +554 -0
- package/dist/edge-renderer.js.map +1 -0
- package/dist/grid-renderer.d.ts +55 -0
- package/dist/grid-renderer.d.ts.map +1 -0
- package/dist/grid-renderer.js +173 -0
- package/dist/grid-renderer.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/js-rasterizer.d.ts +8 -0
- package/dist/js-rasterizer.d.ts.map +1 -0
- package/dist/js-rasterizer.js +86 -0
- package/dist/js-rasterizer.js.map +1 -0
- package/dist/layer-cache-composite.d.ts +39 -0
- package/dist/layer-cache-composite.d.ts.map +1 -0
- package/dist/layer-cache-composite.js +47 -0
- package/dist/layer-cache-composite.js.map +1 -0
- package/dist/layers.d.ts +14 -0
- package/dist/layers.d.ts.map +1 -0
- package/dist/layers.js +2 -0
- package/dist/layers.js.map +1 -0
- package/dist/rasterizer.d.ts +27 -0
- package/dist/rasterizer.d.ts.map +1 -0
- package/dist/rasterizer.js +10 -0
- package/dist/rasterizer.js.map +1 -0
- package/dist/render-target.d.ts +94 -0
- package/dist/render-target.d.ts.map +1 -0
- package/dist/render-target.js +2 -0
- package/dist/render-target.js.map +1 -0
- package/dist/scene-renderer.d.ts +126 -0
- package/dist/scene-renderer.d.ts.map +1 -0
- package/dist/scene-renderer.js +149 -0
- package/dist/scene-renderer.js.map +1 -0
- package/dist/shape-cache-bitmap.d.ts +42 -0
- package/dist/shape-cache-bitmap.d.ts.map +1 -0
- package/dist/shape-cache-bitmap.js +61 -0
- package/dist/shape-cache-bitmap.js.map +1 -0
- package/dist/shape-cache.d.ts +40 -0
- package/dist/shape-cache.d.ts.map +1 -0
- package/dist/shape-cache.js +67 -0
- package/dist/shape-cache.js.map +1 -0
- package/dist/shape-renderer.d.ts +36 -0
- package/dist/shape-renderer.d.ts.map +1 -0
- package/dist/shape-renderer.js +15 -0
- package/dist/shape-renderer.js.map +1 -0
- package/dist/text-editing.d.ts +81 -0
- package/dist/text-editing.d.ts.map +1 -0
- package/dist/text-editing.js +191 -0
- package/dist/text-editing.js.map +1 -0
- package/dist/text-layout.d.ts +44 -0
- package/dist/text-layout.d.ts.map +1 -0
- package/dist/text-layout.js +57 -0
- package/dist/text-layout.js.map +1 -0
- package/dist/text-shaper.d.ts +53 -0
- package/dist/text-shaper.d.ts.map +1 -0
- package/dist/text-shaper.js +19 -0
- package/dist/text-shaper.js.map +1 -0
- package/dist/tile-renderer.d.ts +126 -0
- package/dist/tile-renderer.d.ts.map +1 -0
- package/dist/tile-renderer.js +192 -0
- package/dist/tile-renderer.js.map +1 -0
- package/dist/worker-render.d.ts +54 -0
- package/dist/worker-render.d.ts.map +1 -0
- package/dist/worker-render.js +8 -0
- package/dist/worker-render.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { getScreenToWorld, getWorldToScreen } from "@oh-just-another/scene";
|
|
2
|
+
import { matrix } from "@oh-just-another/math";
|
|
3
|
+
import { GRID_DOT_FADE_FROM_PX, GRID_DOT_FADE_FULL_PX, GRID_DOT_FILL, GRID_DOT_RADIUS_PX, GRID_LEVEL_RUNGS, GRID_LEVEL_SUBDIV, GRID_LINE_COLOR, GRID_LINE_FADE_FROM_PX, GRID_LINE_FADE_FULL_PX, GRID_LINE_WIDTH_PX, GRID_MIN_SCREEN_SPACING_PX, } from "./constants.js";
|
|
4
|
+
/**
|
|
5
|
+
* Compute the dynamic, self-similar grid ladder for a given zoom. The
|
|
6
|
+
* rungs are anchored to the current zoom — the finest rung is the
|
|
7
|
+
* smallest `gridSize · SUBDIV^k` (k ∈ ℤ, possibly negative → finer than
|
|
8
|
+
* `gridSize`) whose on-screen spacing is at least `fadeFromPx` — so as
|
|
9
|
+
* the zoom changes the whole ladder slides and a new rung always fades
|
|
10
|
+
* in. Each rung's opacity ramps from `fadeFromPx` (0) to `fadeFullPx`
|
|
11
|
+
* (1) of on-screen spacing. Pure / allocation-light; exported for tests.
|
|
12
|
+
*/
|
|
13
|
+
export const computeGridRungs = (gridSize, zoom, fadeFromPx, fadeFullPx, subdiv = GRID_LEVEL_SUBDIV, rungs = GRID_LEVEL_RUNGS) => {
|
|
14
|
+
const out = [];
|
|
15
|
+
if (gridSize <= 0 || zoom <= 0)
|
|
16
|
+
return out;
|
|
17
|
+
// Screen spacing of the base (k = 0) lattice, then the smallest k whose
|
|
18
|
+
// spacing clears the fade-in floor.
|
|
19
|
+
const baseScreen = gridSize * zoom;
|
|
20
|
+
const kMin = Math.ceil(Math.log(fadeFromPx / baseScreen) / Math.log(subdiv));
|
|
21
|
+
for (let i = 0; i < rungs; i++) {
|
|
22
|
+
const k = kMin + i;
|
|
23
|
+
const step = gridSize * subdiv ** k;
|
|
24
|
+
const screenSpacing = step * zoom;
|
|
25
|
+
const opacity = Math.max(0, Math.min(1, (screenSpacing - fadeFromPx) / (fadeFullPx - fadeFromPx)));
|
|
26
|
+
if (opacity <= 0)
|
|
27
|
+
continue;
|
|
28
|
+
out.push({ step, opacity });
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Self-similar background grid. By default it paints a DYNAMIC ladder
|
|
34
|
+
* (see {@link computeGridRungs}): a handful of zoom-anchored rungs, each
|
|
35
|
+
* `GRID_LEVEL_SUBDIV`× the previous, so new lines / dots fade in at every
|
|
36
|
+
* zoom — there's no fixed finest rung to bottom out on. Pass
|
|
37
|
+
* `options.levels` for the fixed-ladder behaviour.
|
|
38
|
+
*
|
|
39
|
+
* Designed for a dedicated background layer (`target.clear()` ed before
|
|
40
|
+
* painting unless `skipClear` is set). The fill / stroke colour is one
|
|
41
|
+
* constant — opacity carries the level distinction.
|
|
42
|
+
*/
|
|
43
|
+
export const renderGrid = (scene, target, options = {}) => {
|
|
44
|
+
if (!options.skipClear)
|
|
45
|
+
target.clear();
|
|
46
|
+
const gridSize = scene.viewport.gridSize;
|
|
47
|
+
if (!gridSize || gridSize <= 0)
|
|
48
|
+
return;
|
|
49
|
+
const style = scene.viewport.gridStyle ?? "lines";
|
|
50
|
+
const isDots = style === "dots";
|
|
51
|
+
// Lines and dots default to different colours. Explicit options.color
|
|
52
|
+
// still wins so hosts can fully re-skin either style.
|
|
53
|
+
const color = options.color ?? (isDots ? GRID_DOT_FILL : GRID_LINE_COLOR);
|
|
54
|
+
const zoom = scene.viewport.zoom;
|
|
55
|
+
const { width, height } = target.size;
|
|
56
|
+
if (width <= 0 || height <= 0)
|
|
57
|
+
return;
|
|
58
|
+
// Project the screen rect into world coords (axis-aligned AABB).
|
|
59
|
+
const viewportWorld = computeViewportWorldRect(scene, width, height);
|
|
60
|
+
if (!viewportWorld)
|
|
61
|
+
return;
|
|
62
|
+
const draw = (step) => {
|
|
63
|
+
if (isDots)
|
|
64
|
+
drawDotLevel(target, viewportWorld, step, color, zoom);
|
|
65
|
+
else
|
|
66
|
+
drawLineLevel(target, viewportWorld, step, color, zoom);
|
|
67
|
+
};
|
|
68
|
+
target.save();
|
|
69
|
+
target.setTransform(getWorldToScreen(scene.viewport));
|
|
70
|
+
target.setDashArray(null);
|
|
71
|
+
if (options.levels) {
|
|
72
|
+
// Fixed-ladder path: opacity keyed off absolute zoom.
|
|
73
|
+
for (const level of options.levels) {
|
|
74
|
+
const opacity = levelOpacity(zoom, level);
|
|
75
|
+
if (opacity <= 0)
|
|
76
|
+
continue;
|
|
77
|
+
const step = level.step * gridSize;
|
|
78
|
+
if (step * zoom < GRID_MIN_SCREEN_SPACING_PX)
|
|
79
|
+
continue;
|
|
80
|
+
target.setOpacity(opacity);
|
|
81
|
+
draw(step);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Default dynamic (infinite) ladder.
|
|
86
|
+
const fadeFrom = isDots ? GRID_DOT_FADE_FROM_PX : GRID_LINE_FADE_FROM_PX;
|
|
87
|
+
const fadeFull = isDots ? GRID_DOT_FADE_FULL_PX : GRID_LINE_FADE_FULL_PX;
|
|
88
|
+
for (const rung of computeGridRungs(gridSize, zoom, fadeFrom, fadeFull)) {
|
|
89
|
+
target.setOpacity(rung.opacity);
|
|
90
|
+
draw(rung.step);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
target.setOpacity(1);
|
|
94
|
+
target.restore();
|
|
95
|
+
};
|
|
96
|
+
// --- Level rendering --------------------------------------------------------
|
|
97
|
+
const drawLineLevel = (target, viewport, step, color, zoom) => {
|
|
98
|
+
const { minX, maxX, minY, maxY } = snappedExtents(viewport, step);
|
|
99
|
+
const lineWidth = GRID_LINE_WIDTH_PX / zoom;
|
|
100
|
+
target.setStroke(color);
|
|
101
|
+
target.setStrokeWidth(lineWidth);
|
|
102
|
+
target.beginPath();
|
|
103
|
+
for (let x = minX; x <= maxX; x += step) {
|
|
104
|
+
target.moveTo(x, minY);
|
|
105
|
+
target.lineTo(x, maxY);
|
|
106
|
+
}
|
|
107
|
+
for (let y = minY; y <= maxY; y += step) {
|
|
108
|
+
target.moveTo(minX, y);
|
|
109
|
+
target.lineTo(maxX, y);
|
|
110
|
+
}
|
|
111
|
+
target.stroke();
|
|
112
|
+
};
|
|
113
|
+
const drawDotLevel = (target, viewport, step, color, zoom) => {
|
|
114
|
+
const { minX, maxX, minY, maxY } = snappedExtents(viewport, step);
|
|
115
|
+
target.setStroke(null);
|
|
116
|
+
target.setFill(color);
|
|
117
|
+
const r = GRID_DOT_RADIUS_PX / zoom;
|
|
118
|
+
const d = r * 2;
|
|
119
|
+
for (let x = minX; x <= maxX; x += step) {
|
|
120
|
+
for (let y = minY; y <= maxY; y += step) {
|
|
121
|
+
target.beginPath();
|
|
122
|
+
target.rect(x - r, y - r, d, d);
|
|
123
|
+
target.fill();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
// --- Helpers ----------------------------------------------------------------
|
|
128
|
+
const snappedExtents = (viewport, step) => ({
|
|
129
|
+
minX: Math.floor(viewport.x / step) * step - step,
|
|
130
|
+
maxX: Math.ceil((viewport.x + viewport.width) / step) * step + step,
|
|
131
|
+
minY: Math.floor(viewport.y / step) * step - step,
|
|
132
|
+
maxY: Math.ceil((viewport.y + viewport.height) / step) * step + step,
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* Linear-fade opacity for one rung.
|
|
136
|
+
* z ≥ mid → 1
|
|
137
|
+
* min ≤ z < mid → (z − min) / (mid − min)
|
|
138
|
+
* z < min → 0
|
|
139
|
+
*/
|
|
140
|
+
const levelOpacity = (z, level) => {
|
|
141
|
+
if (z >= level.mid)
|
|
142
|
+
return 1;
|
|
143
|
+
if (z <= level.min)
|
|
144
|
+
return 0;
|
|
145
|
+
return (z - level.min) / (level.mid - level.min);
|
|
146
|
+
};
|
|
147
|
+
const computeViewportWorldRect = (scene, width, height) => {
|
|
148
|
+
const s2w = getScreenToWorld(scene.viewport);
|
|
149
|
+
const corners = [
|
|
150
|
+
matrix.applyToPoint(s2w, { x: 0, y: 0 }),
|
|
151
|
+
matrix.applyToPoint(s2w, { x: width, y: 0 }),
|
|
152
|
+
matrix.applyToPoint(s2w, { x: width, y: height }),
|
|
153
|
+
matrix.applyToPoint(s2w, { x: 0, y: height }),
|
|
154
|
+
];
|
|
155
|
+
let minX = Infinity;
|
|
156
|
+
let maxX = -Infinity;
|
|
157
|
+
let minY = Infinity;
|
|
158
|
+
let maxY = -Infinity;
|
|
159
|
+
for (const p of corners) {
|
|
160
|
+
if (p.x < minX)
|
|
161
|
+
minX = p.x;
|
|
162
|
+
if (p.x > maxX)
|
|
163
|
+
maxX = p.x;
|
|
164
|
+
if (p.y < minY)
|
|
165
|
+
minY = p.y;
|
|
166
|
+
if (p.y > maxY)
|
|
167
|
+
maxY = p.y;
|
|
168
|
+
}
|
|
169
|
+
if (!Number.isFinite(minX))
|
|
170
|
+
return null;
|
|
171
|
+
return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
|
|
172
|
+
};
|
|
173
|
+
//# sourceMappingURL=grid-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid-renderer.js","sourceRoot":"","sources":["../src/grid-renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type { RenderTarget, LineCap, LineJoin, TextAlign, TextBaseline, FillRule, FontStyleOptions, DrawPoint, } from "./render-target.js";
|
|
2
|
+
export type { ElementRenderer } from "./shape-renderer.js";
|
|
3
|
+
export type { LayerName } from "./layers.js";
|
|
4
|
+
export type { RenderSceneOptions, LodOptions } from "./scene-renderer.js";
|
|
5
|
+
export type { RenderLinksOptions } from "./edge-renderer.js";
|
|
6
|
+
export type { RenderGridOptions, GridLevel, GridRung } from "./grid-renderer.js";
|
|
7
|
+
export { registerElementRenderer, getElementRenderer, hasElementRenderer } from "./shape-renderer.js";
|
|
8
|
+
export { LAYER_ORDER } from "./layers.js";
|
|
9
|
+
export { renderScene } from "./scene-renderer.js";
|
|
10
|
+
export { renderLinks, strokeRoundedPolyline } from "./edge-renderer.js";
|
|
11
|
+
export { renderGrid, computeGridRungs } from "./grid-renderer.js";
|
|
12
|
+
export { installBuiltinRenderers } from "./built-in-renderers.js";
|
|
13
|
+
export type { WrapOptions, WrappedLine } from "./text-layout.js";
|
|
14
|
+
export { wrapText } from "./text-layout.js";
|
|
15
|
+
export type { LaidOutLine, EditableTextLayout, MeasureText, LayoutTextOptions, CaretGeometry, SelectionRect, } from "./text-editing.js";
|
|
16
|
+
export { layoutText, caretGeometry, pointToCaretIndex, selectionRects, DEFAULT_LINE_HEIGHT_FACTOR, } from "./text-editing.js";
|
|
17
|
+
export { ElementCache, sharedBoundsCache, cachedWorldBounds } from "./shape-cache.js";
|
|
18
|
+
export type { ElementBitmapCache } from "./shape-cache-bitmap.js";
|
|
19
|
+
export { InMemoryElementBitmapCache, zoomBucket } from "./shape-cache-bitmap.js";
|
|
20
|
+
export type { LinkBitmapCache } from "./edge-cache-bitmap.js";
|
|
21
|
+
export { InMemoryLinkBitmapCache } from "./edge-cache-bitmap.js";
|
|
22
|
+
export type { LayerCompositeCache } from "./layer-cache-composite.js";
|
|
23
|
+
export { InMemoryLayerCompositeCache } from "./layer-cache-composite.js";
|
|
24
|
+
export type { AnimatedSourceAdapter } from "./animation-adapter.js";
|
|
25
|
+
export { registerAnimationAdapter, unregisterAnimationAdapter, getAnimationAdapter, listAnimationKinds, resolveImageSource, setAnimationClock, resetAnimationClock, onAnimationContentReady, notifyAnimationContentReady, } from "./animation-adapter.js";
|
|
26
|
+
export type { TextShaper, ShaperFont, ShapedGlyph } from "./text-shaper.js";
|
|
27
|
+
export { setActiveTextShaper, getActiveTextShaper } from "./text-shaper.js";
|
|
28
|
+
export type { Rasterizer } from "./rasterizer.js";
|
|
29
|
+
export { setActiveRasterizer, getActiveRasterizer } from "./rasterizer.js";
|
|
30
|
+
export { jsRasterizer } from "./js-rasterizer.js";
|
|
31
|
+
export type { WorkerRenderMessage, WorkerRenderResponse, } from "./worker-render.js";
|
|
32
|
+
export { WORKER_AUTO_THRESHOLD } from "./worker-render.js";
|
|
33
|
+
export type { TileKey, TileCache, TileCacheEntry } from "./tile-renderer.js";
|
|
34
|
+
export { TILE_SIZE, MAX_TILE_CACHE_BYTES, LOD_THRESHOLD, InMemoryTileCache, } from "./tile-renderer.js";
|
|
35
|
+
export { LinkBoundsCache, computeLinkWorldBounds, sharedLinkBoundsCache, } from "./edge-cache.js";
|
|
36
|
+
export { DEFAULT_LOD, DEFAULT_PLACEHOLDER_FILL, VIEWPORT_CULL_PADDING_RATIO, LINK_CORNER_RADIUS, GRID_LINE_COLOR, GRID_DOT_FILL, GRID_LINE_WIDTH_PX, GRID_DOT_RADIUS_PX, GRID_MIN_SCREEN_SPACING_PX, GRID_LEVEL_SUBDIV, GRID_LEVEL_RUNGS, GRID_LINE_FADE_FROM_PX, GRID_LINE_FADE_FULL_PX, GRID_DOT_FADE_FROM_PX, GRID_DOT_FADE_FULL_PX, } from "./constants.js";
|
|
37
|
+
//# 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,24 @@
|
|
|
1
|
+
export { registerElementRenderer, getElementRenderer, hasElementRenderer } from "./shape-renderer.js";
|
|
2
|
+
export { LAYER_ORDER } from "./layers.js";
|
|
3
|
+
export { renderScene } from "./scene-renderer.js";
|
|
4
|
+
export { renderLinks, strokeRoundedPolyline } from "./edge-renderer.js";
|
|
5
|
+
export { renderGrid, computeGridRungs } from "./grid-renderer.js";
|
|
6
|
+
// Backend-agnostic shape renderers for the built-in `BuiltinElement` types.
|
|
7
|
+
// `installBuiltinRenderers()` registers them via `registerElementRenderer` and
|
|
8
|
+
// is safe to call multiple times.
|
|
9
|
+
export { installBuiltinRenderers } from "./built-in-renderers.js";
|
|
10
|
+
export { wrapText } from "./text-layout.js";
|
|
11
|
+
export { layoutText, caretGeometry, pointToCaretIndex, selectionRects, DEFAULT_LINE_HEIGHT_FACTOR, } from "./text-editing.js";
|
|
12
|
+
export { ElementCache, sharedBoundsCache, cachedWorldBounds } from "./shape-cache.js";
|
|
13
|
+
export { InMemoryElementBitmapCache, zoomBucket } from "./shape-cache-bitmap.js";
|
|
14
|
+
export { InMemoryLinkBitmapCache } from "./edge-cache-bitmap.js";
|
|
15
|
+
export { InMemoryLayerCompositeCache } from "./layer-cache-composite.js";
|
|
16
|
+
export { registerAnimationAdapter, unregisterAnimationAdapter, getAnimationAdapter, listAnimationKinds, resolveImageSource, setAnimationClock, resetAnimationClock, onAnimationContentReady, notifyAnimationContentReady, } from "./animation-adapter.js";
|
|
17
|
+
export { setActiveTextShaper, getActiveTextShaper } from "./text-shaper.js";
|
|
18
|
+
export { setActiveRasterizer, getActiveRasterizer } from "./rasterizer.js";
|
|
19
|
+
export { jsRasterizer } from "./js-rasterizer.js";
|
|
20
|
+
export { WORKER_AUTO_THRESHOLD } from "./worker-render.js";
|
|
21
|
+
export { TILE_SIZE, MAX_TILE_CACHE_BYTES, LOD_THRESHOLD, InMemoryTileCache, } from "./tile-renderer.js";
|
|
22
|
+
export { LinkBoundsCache, computeLinkWorldBounds, sharedLinkBoundsCache, } from "./edge-cache.js";
|
|
23
|
+
export { DEFAULT_LOD, DEFAULT_PLACEHOLDER_FILL, VIEWPORT_CULL_PADDING_RATIO, LINK_CORNER_RADIUS, GRID_LINE_COLOR, GRID_DOT_FILL, GRID_LINE_WIDTH_PX, GRID_DOT_RADIUS_PX, GRID_MIN_SCREEN_SPACING_PX, GRID_LEVEL_SUBDIV, GRID_LEVEL_RUNGS, GRID_LINE_FADE_FROM_PX, GRID_LINE_FADE_FULL_PX, GRID_DOT_FADE_FROM_PX, GRID_DOT_FADE_FULL_PX, } from "./constants.js";
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAElE,4EAA4E;AAC5E,+EAA+E;AAC/E,kCAAkC;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAS5C,OAAO,EACL,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEtF,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAIzE,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,aAAa,EACb,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,EACX,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Rasterizer } from "./rasterizer.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reference JS implementation of the `Rasterizer` interface. Path
|
|
4
|
+
* flattening delegates to the `@math/bezier` adaptive flattener;
|
|
5
|
+
* stroke-to-fill builds a mitre-joined offset polygon.
|
|
6
|
+
*/
|
|
7
|
+
export declare const jsRasterizer: Rasterizer;
|
|
8
|
+
//# sourceMappingURL=js-rasterizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-rasterizer.d.ts","sourceRoot":"","sources":["../src/js-rasterizer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAOlD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,UA8E1B,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { bezier } from "@oh-just-another/math";
|
|
2
|
+
const req = (v) => {
|
|
3
|
+
if (v === undefined)
|
|
4
|
+
throw new Error("packages/renderer-core: index out of range");
|
|
5
|
+
return v;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Reference JS implementation of the `Rasterizer` interface. Path
|
|
9
|
+
* flattening delegates to the `@math/bezier` adaptive flattener;
|
|
10
|
+
* stroke-to-fill builds a mitre-joined offset polygon.
|
|
11
|
+
*/
|
|
12
|
+
export const jsRasterizer = {
|
|
13
|
+
flatten(commands, tolerance) {
|
|
14
|
+
// Smaller tolerance → more samples. Pick a sample count proportional
|
|
15
|
+
// to the rough chord length divided by tolerance, bounded so
|
|
16
|
+
// degenerate inputs don't explode.
|
|
17
|
+
const sampleCount = (chordLen) => Math.min(128, Math.max(8, Math.ceil(chordLen / Math.max(0.1, tolerance))));
|
|
18
|
+
const out = [];
|
|
19
|
+
let pen = { x: 0, y: 0 };
|
|
20
|
+
for (const cmd of commands) {
|
|
21
|
+
switch (cmd.kind) {
|
|
22
|
+
case "M":
|
|
23
|
+
pen = cmd.to;
|
|
24
|
+
out.push(pen);
|
|
25
|
+
break;
|
|
26
|
+
case "L":
|
|
27
|
+
pen = cmd.to;
|
|
28
|
+
out.push(pen);
|
|
29
|
+
break;
|
|
30
|
+
case "Q": {
|
|
31
|
+
const chord = Math.hypot(cmd.to.x - pen.x, cmd.to.y - pen.y);
|
|
32
|
+
const samples = bezier.flattenQuadratic(pen, cmd.control, cmd.to, sampleCount(chord));
|
|
33
|
+
for (let i = 1; i < samples.length; i++)
|
|
34
|
+
out.push(req(samples[i]));
|
|
35
|
+
pen = cmd.to;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case "C": {
|
|
39
|
+
const chord = Math.hypot(cmd.to.x - pen.x, cmd.to.y - pen.y);
|
|
40
|
+
const samples = bezier.flattenCubic(pen, cmd.control1, cmd.control2, cmd.to, sampleCount(chord));
|
|
41
|
+
for (let i = 1; i < samples.length; i++)
|
|
42
|
+
out.push(req(samples[i]));
|
|
43
|
+
pen = cmd.to;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case "Z":
|
|
47
|
+
// Close — connect back to the first point if it exists.
|
|
48
|
+
if (out.length > 0) {
|
|
49
|
+
const first = req(out[0]);
|
|
50
|
+
out.push(first);
|
|
51
|
+
pen = first;
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
},
|
|
58
|
+
strokeToFill(polyline, width, options) {
|
|
59
|
+
if (polyline.length < 2)
|
|
60
|
+
return polyline;
|
|
61
|
+
const half = width / 2;
|
|
62
|
+
const cap = options?.cap ?? "butt";
|
|
63
|
+
void options?.join; // mitre-only in this reference implementation
|
|
64
|
+
const left = [];
|
|
65
|
+
const right = [];
|
|
66
|
+
for (let i = 0; i < polyline.length; i++) {
|
|
67
|
+
const prev = req(polyline[Math.max(0, i - 1)]);
|
|
68
|
+
const next = req(polyline[Math.min(polyline.length - 1, i + 1)]);
|
|
69
|
+
const cur = req(polyline[i]);
|
|
70
|
+
const dx = next.x - prev.x;
|
|
71
|
+
const dy = next.y - prev.y;
|
|
72
|
+
const len = Math.hypot(dx, dy) || 1;
|
|
73
|
+
const nx = -dy / len;
|
|
74
|
+
const ny = dx / len;
|
|
75
|
+
left.push({ x: cur.x + nx * half, y: cur.y + ny * half });
|
|
76
|
+
right.push({ x: cur.x - nx * half, y: cur.y - ny * half });
|
|
77
|
+
}
|
|
78
|
+
// Round / square caps would extend the line ends here; butt =
|
|
79
|
+
// just the side offsets.
|
|
80
|
+
if (cap === "round" || cap === "square") {
|
|
81
|
+
// No-op: non-butt endcaps need extra verts; not generated here.
|
|
82
|
+
}
|
|
83
|
+
return [...left, ...right.reverse(), req(left[0])];
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=js-rasterizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-rasterizer.js","sourceRoot":"","sources":["../src/js-rasterizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { LayerId } from "@oh-just-another/types";
|
|
2
|
+
/**
|
|
3
|
+
* Per-layer composite cache. Caches the rasterised `LayerId @ zoomBucket`
|
|
4
|
+
* composite so renderScene can replay unchanged layers via a single
|
|
5
|
+
* `drawImage` instead of walking every shape on every frame.
|
|
6
|
+
*
|
|
7
|
+
* Invalidation: the editor's patch pipeline knows which layers had any
|
|
8
|
+
* shape/edge change this frame; it passes that set down to renderScene
|
|
9
|
+
* which calls `invalidateLayer(id)` for each. The
|
|
10
|
+
* `LayerCompositeCache.get` then misses for those layers and the
|
|
11
|
+
* renderer falls back to the per-shape walk + optionally caches the
|
|
12
|
+
* result via the host's `compositeLayerBitmap` callback.
|
|
13
|
+
*
|
|
14
|
+
* `Map<LayerId @ zoomBucket → bitmap>` shape mirrors the per-shape /
|
|
15
|
+
* per-edge caches; LRU by insertion order with a count cap.
|
|
16
|
+
*/
|
|
17
|
+
export interface LayerCompositeCache<V = unknown> {
|
|
18
|
+
get(layerId: LayerId, zoomBucket: number): V | undefined;
|
|
19
|
+
set(layerId: LayerId, zoomBucket: number, value: V): void;
|
|
20
|
+
invalidateLayer(layerId: LayerId): void;
|
|
21
|
+
clear(): void;
|
|
22
|
+
readonly size: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class InMemoryLayerCompositeCache<V> implements LayerCompositeCache<V> {
|
|
25
|
+
private readonly entries;
|
|
26
|
+
private readonly cap;
|
|
27
|
+
constructor(cap?: number);
|
|
28
|
+
get size(): number;
|
|
29
|
+
get(layerId: LayerId, zoomBucket: number): V | undefined;
|
|
30
|
+
set(layerId: LayerId, zoomBucket: number, value: V): void;
|
|
31
|
+
/**
|
|
32
|
+
* Drop every cached bucket for a layer (across all zoom buckets).
|
|
33
|
+
* A single shape mutation invalidates the whole layer composite;
|
|
34
|
+
* partial-invalidation would need region tracking inside the bitmap.
|
|
35
|
+
*/
|
|
36
|
+
invalidateLayer(layerId: LayerId): void;
|
|
37
|
+
clear(): void;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=layer-cache-composite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-cache-composite.d.ts","sourceRoot":"","sources":["../src/layer-cache-composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACzD,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1D,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAID,qBAAa,2BAA2B,CAAC,CAAC,CAAE,YAAW,mBAAmB,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,GAAG,SAAK;IAIpB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IASxD,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAUzD;;;;OAIG;IACH,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOvC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const keyFor = (layerId, zoomBucket) => `${layerId}@${zoomBucket}`;
|
|
2
|
+
export class InMemoryLayerCompositeCache {
|
|
3
|
+
entries = new Map();
|
|
4
|
+
cap;
|
|
5
|
+
constructor(cap = 32) {
|
|
6
|
+
this.cap = cap;
|
|
7
|
+
}
|
|
8
|
+
get size() {
|
|
9
|
+
return this.entries.size;
|
|
10
|
+
}
|
|
11
|
+
get(layerId, zoomBucket) {
|
|
12
|
+
const key = keyFor(layerId, zoomBucket);
|
|
13
|
+
const v = this.entries.get(key);
|
|
14
|
+
if (v === undefined)
|
|
15
|
+
return undefined;
|
|
16
|
+
this.entries.delete(key);
|
|
17
|
+
this.entries.set(key, v);
|
|
18
|
+
return v;
|
|
19
|
+
}
|
|
20
|
+
set(layerId, zoomBucket, value) {
|
|
21
|
+
const key = keyFor(layerId, zoomBucket);
|
|
22
|
+
if (this.entries.has(key))
|
|
23
|
+
this.entries.delete(key);
|
|
24
|
+
this.entries.set(key, value);
|
|
25
|
+
if (this.entries.size > this.cap) {
|
|
26
|
+
const oldest = this.entries.keys().next().value;
|
|
27
|
+
if (oldest !== undefined)
|
|
28
|
+
this.entries.delete(oldest);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Drop every cached bucket for a layer (across all zoom buckets).
|
|
33
|
+
* A single shape mutation invalidates the whole layer composite;
|
|
34
|
+
* partial-invalidation would need region tracking inside the bitmap.
|
|
35
|
+
*/
|
|
36
|
+
invalidateLayer(layerId) {
|
|
37
|
+
const prefix = `${layerId}@`;
|
|
38
|
+
for (const key of [...this.entries.keys()]) {
|
|
39
|
+
if (key.startsWith(prefix))
|
|
40
|
+
this.entries.delete(key);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
clear() {
|
|
44
|
+
this.entries.clear();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=layer-cache-composite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-cache-composite.js","sourceRoot":"","sources":["../src/layer-cache-composite.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAE,UAAkB,EAAU,EAAE,CAAC,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC;AAE5F,MAAM,OAAO,2BAA2B;IACrB,OAAO,GAAG,IAAI,GAAG,EAAa,CAAC;IAC/B,GAAG,CAAS;IAE7B,YAAY,GAAG,GAAG,EAAE;QAClB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,OAAgB,EAAE,UAAkB;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG,CAAC,OAAgB,EAAE,UAAkB,EAAE,KAAQ;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,OAAgB;QAC9B,MAAM,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
package/dist/layers.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logical layers the renderer composites in this order (bottom to top).
|
|
3
|
+
*
|
|
4
|
+
* `background` is for static content that changes rarely — grid, watermarks,
|
|
5
|
+
* imported images. `main` carries every shape/edge in the scene. `overlay` is
|
|
6
|
+
* for transient UI — selection handles, drag previews, snap guides.
|
|
7
|
+
*
|
|
8
|
+
* Backends that support multiple draw surfaces (e.g. `renderer-canvas` with
|
|
9
|
+
* stacked `<canvas>` elements) map each `LayerName` to its own surface so the
|
|
10
|
+
* frequently-changing overlay does not invalidate the static main.
|
|
11
|
+
*/
|
|
12
|
+
export type LayerName = "background" | "main" | "overlay";
|
|
13
|
+
export declare const LAYER_ORDER: readonly LayerName[];
|
|
14
|
+
//# sourceMappingURL=layers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../src/layers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAAsC,CAAC"}
|
package/dist/layers.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layers.js","sourceRoot":"","sources":["../src/layers.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Vec2 } from "@oh-just-another/types";
|
|
2
|
+
import type { PathCommand } from "@oh-just-another/scene";
|
|
3
|
+
export declare const setActiveRasterizer: (r: Rasterizer | null) => void;
|
|
4
|
+
export declare const getActiveRasterizer: () => Rasterizer | null;
|
|
5
|
+
/**
|
|
6
|
+
* 2D rasterisation helpers. Lets a host swap the pure-TS bezier flatten /
|
|
7
|
+
* stroke-to-fill / gradient ops for a WASM implementation when batch
|
|
8
|
+
* processing dominates (handwriting demos, dense edge meshes). Default uses
|
|
9
|
+
* the JS path in `@oh-just-another/math/bezier`.
|
|
10
|
+
*/
|
|
11
|
+
export interface Rasterizer {
|
|
12
|
+
/**
|
|
13
|
+
* Flatten a path's bezier segments into a polyline at the given
|
|
14
|
+
* tolerance (max distance between approximation and curve in
|
|
15
|
+
* world pixels). Output points are in world coords.
|
|
16
|
+
*/
|
|
17
|
+
flatten(commands: readonly PathCommand[], tolerance: number): readonly Vec2[];
|
|
18
|
+
/**
|
|
19
|
+
* Convert a stroked polyline into the outline of the stroke
|
|
20
|
+
* (so a backend without native stroke can fill it as a polygon).
|
|
21
|
+
*/
|
|
22
|
+
strokeToFill(polyline: readonly Vec2[], width: number, options?: {
|
|
23
|
+
readonly cap?: "butt" | "round" | "square";
|
|
24
|
+
readonly join?: "miter" | "round" | "bevel";
|
|
25
|
+
}): readonly Vec2[];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=rasterizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rasterizer.d.ts","sourceRoot":"","sources":["../src/rasterizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAS1D,eAAO,MAAM,mBAAmB,GAC9B,GAAG,UAAU,GAAG,IAAI,KACnB,IAEF,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,UAAU,GAAG,IAClC,CAAC;AAGnB;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,IAAI,EAAE,CAAC;IAE9E;;;OAGG;IACH,YAAY,CACV,QAAQ,EAAE,SAAS,IAAI,EAAE,EACzB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;KAC7C,GACA,SAAS,IAAI,EAAE,CAAC;CACpB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Process-global active rasterizer. Mirrors `setActiveTextShaper` —
|
|
2
|
+
// Editor installs once on mount; backend code (WebGL2Target's curve
|
|
3
|
+
// flattening) reads at draw time. `null` falls back to the backend's
|
|
4
|
+
// built-in JS sampler.
|
|
5
|
+
let activeRasterizer = null;
|
|
6
|
+
export const setActiveRasterizer = (r) => {
|
|
7
|
+
activeRasterizer = r;
|
|
8
|
+
};
|
|
9
|
+
export const getActiveRasterizer = () => activeRasterizer;
|
|
10
|
+
//# sourceMappingURL=rasterizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rasterizer.js","sourceRoot":"","sources":["../src/rasterizer.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,oEAAoE;AACpE,qEAAqE;AACrE,uBAAuB;AAEvB,IAAI,gBAAgB,GAAsB,IAAI,CAAC;AAE/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,CAAoB,EACd,EAAE;IACR,gBAAgB,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAsB,EAAE,CACzD,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { Bounds, Color, Transform, Vec2 } from "@oh-just-another/types";
|
|
2
|
+
export type LineCap = "butt" | "round" | "square";
|
|
3
|
+
export type LineJoin = "miter" | "round" | "bevel";
|
|
4
|
+
export type TextAlign = "left" | "center" | "right";
|
|
5
|
+
export type TextBaseline = "top" | "middle" | "bottom";
|
|
6
|
+
export type FillRule = "nonzero" | "evenodd";
|
|
7
|
+
/**
|
|
8
|
+
* Optional bold / italic for {@link RenderTarget.setFont}. Omitted →
|
|
9
|
+
* normal weight & upright. Backends realise these differently: Canvas2D
|
|
10
|
+
* folds them into the `ctx.font` shorthand; WebGL2 selects the matching
|
|
11
|
+
* MSDF atlas font (faux-shear / weight where a variant is unavailable).
|
|
12
|
+
*/
|
|
13
|
+
export interface FontStyleOptions {
|
|
14
|
+
readonly weight?: "normal" | "bold";
|
|
15
|
+
readonly style?: "normal" | "italic";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Backend-agnostic drawing surface. Both `renderer-canvas` (Canvas2D) and
|
|
19
|
+
* `renderer-svg` (SVG string-builder) implement this interface. Keeping the
|
|
20
|
+
* surface low-level lets shape renderers stay backend-agnostic without losing
|
|
21
|
+
* fidelity — the methods map 1:1 to native Canvas2D primitives.
|
|
22
|
+
*/
|
|
23
|
+
export interface RenderTarget {
|
|
24
|
+
setFill(color: Color | null): void;
|
|
25
|
+
setStroke(color: Color | null): void;
|
|
26
|
+
setStrokeWidth(width: number): void;
|
|
27
|
+
setOpacity(alpha: number): void;
|
|
28
|
+
setLineCap(cap: LineCap): void;
|
|
29
|
+
setLineJoin(join: LineJoin): void;
|
|
30
|
+
setDashArray(dash: readonly number[] | null): void;
|
|
31
|
+
setFont(fontFamily: string, fontSize: number, options?: FontStyleOptions): void;
|
|
32
|
+
setTextAlign(align: TextAlign): void;
|
|
33
|
+
setTextBaseline(baseline: TextBaseline): void;
|
|
34
|
+
save(): void;
|
|
35
|
+
restore(): void;
|
|
36
|
+
translate(dx: number, dy: number): void;
|
|
37
|
+
rotate(radians: number): void;
|
|
38
|
+
scale(sx: number, sy: number): void;
|
|
39
|
+
setTransform(t: Transform): void;
|
|
40
|
+
resetTransform(): void;
|
|
41
|
+
beginPath(): void;
|
|
42
|
+
closePath(): void;
|
|
43
|
+
moveTo(x: number, y: number): void;
|
|
44
|
+
lineTo(x: number, y: number): void;
|
|
45
|
+
quadraticCurveTo(cx: number, cy: number, x: number, y: number): void;
|
|
46
|
+
bezierCurveTo(c1x: number, c1y: number, c2x: number, c2y: number, x: number, y: number): void;
|
|
47
|
+
rect(x: number, y: number, width: number, height: number): void;
|
|
48
|
+
ellipse(cx: number, cy: number, rx: number, ry: number): void;
|
|
49
|
+
fill(rule?: FillRule): void;
|
|
50
|
+
stroke(): void;
|
|
51
|
+
fillText(text: string, x: number, y: number, maxWidth?: number): void;
|
|
52
|
+
measureText(text: string): {
|
|
53
|
+
width: number;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Draw an image. The accepted `image` type depends on the backend:
|
|
57
|
+
* Canvas2D expects a `CanvasImageSource`; SVG accepts a URL string;
|
|
58
|
+
* Node-side targets can accept any backend-specific image handle.
|
|
59
|
+
* The kernel does not load images — it just hands the source through.
|
|
60
|
+
*
|
|
61
|
+
* `dynamic` signals an animated source (GIF `<img>`, `<video>`)
|
|
62
|
+
* whose pixels change between frames. Backends that cache an
|
|
63
|
+
* uploaded copy (WebGL2 textures) MUST re-upload the current frame
|
|
64
|
+
* when `dynamic` is true; backends that read the source live every
|
|
65
|
+
* draw (Canvas2D) ignore it. Default `false` — static image.
|
|
66
|
+
*/
|
|
67
|
+
drawImage(image: unknown, dx: number, dy: number, dw: number, dh: number, dynamic?: boolean): void;
|
|
68
|
+
/** Erase a region. Without bounds, erases everything. */
|
|
69
|
+
clear(bounds?: Bounds): void;
|
|
70
|
+
/** Current intrinsic surface size in CSS pixels (pre-DPR). */
|
|
71
|
+
readonly size: {
|
|
72
|
+
readonly width: number;
|
|
73
|
+
readonly height: number;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Mark a screen-space rectangle as dirty for the *current* frame.
|
|
77
|
+
* Optional hook — backends that don't need per-pass dirty tracking
|
|
78
|
+
* can implement it as a no-op. Renderers call this after a draw
|
|
79
|
+
* operation that paints outside the shape's intrinsic bbox (anti-
|
|
80
|
+
* aliased stroke fuzz, drop shadows, oversized arrowheads) so the
|
|
81
|
+
* host's next `clear()` can cover the actual painted area, not
|
|
82
|
+
* just the geometric bbox.
|
|
83
|
+
*
|
|
84
|
+
* The bounds are in *screen pixels* (post-projection), matching
|
|
85
|
+
* `clear(bounds)`.
|
|
86
|
+
*/
|
|
87
|
+
markDirty?(bounds: Bounds): void;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Convenience type for code that produces low-level draw calls without doing
|
|
91
|
+
* any transform math itself.
|
|
92
|
+
*/
|
|
93
|
+
export type DrawPoint = Vec2;
|
|
94
|
+
//# sourceMappingURL=render-target.d.ts.map
|