occt-wasm 5.4.1 → 5.5.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/dist/font5x7.d.ts +16 -0
- package/dist/font5x7.d.ts.map +1 -0
- package/dist/font5x7.js +65 -0
- package/dist/font5x7.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/occt-wasm.js +1 -1
- package/dist/occt-wasm.wasm +0 -0
- package/dist/png.d.ts +41 -0
- package/dist/png.d.ts.map +1 -0
- package/dist/png.js +400 -0
- package/dist/png.js.map +1 -0
- package/dist/svg.d.ts +9 -47
- package/dist/svg.d.ts.map +1 -1
- package/dist/svg.js +20 -216
- package/dist/svg.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -1
- package/dist/views.d.ts +152 -0
- package/dist/views.d.ts.map +1 -0
- package/dist/views.js +256 -0
- package/dist/views.js.map +1 -0
- package/package.json +1 -1
package/dist/occt-wasm.wasm
CHANGED
|
Binary file
|
package/dist/png.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multiview PNG rendering for OCCT shapes.
|
|
3
|
+
*
|
|
4
|
+
* The same drawing as `svg.ts` -- hidden-line removal per view, one shared
|
|
5
|
+
* scale, a per-view gnomon and labels -- rasterised here instead of written as
|
|
6
|
+
* vector markup. Both take their geometry and layout from `views.ts`, so a PNG
|
|
7
|
+
* and an SVG of the same shape show the same picture.
|
|
8
|
+
*
|
|
9
|
+
* Everything is done here: an antialiased line rasteriser, a small bitmap font
|
|
10
|
+
* for the labels, and a PNG encoder over the platform's CompressionStream.
|
|
11
|
+
* That keeps the renderer free of native modules and of a font file,
|
|
12
|
+
* which matters because callers embed this in single-file binaries. The cost
|
|
13
|
+
* is that text is a fixed 5x7 bitmap face rather than the caller's font.
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import type { ShapeHandle } from "./types.js";
|
|
18
|
+
import type { MultiviewOptions, ViewKernel, ViewName, ViewOptions } from "./views.js";
|
|
19
|
+
/** The subset of the kernel API the PNG renderer depends on. */
|
|
20
|
+
export type PngKernel = ViewKernel;
|
|
21
|
+
export interface PngViewOptions extends ViewOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Supersampling factor (default 2). The scene is rasterised this many
|
|
24
|
+
* times larger and box-filtered down, which is what keeps a 1 px line
|
|
25
|
+
* legible. 1 disables it; above 3 the file grows for no visible gain.
|
|
26
|
+
* The output size is `width` x `height` either way.
|
|
27
|
+
*/
|
|
28
|
+
supersample?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface MultiviewPngOptions extends MultiviewOptions, PngViewOptions {
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Render a single named view of `shape` to PNG bytes.
|
|
34
|
+
*/
|
|
35
|
+
export declare function renderShapePNG(kernel: PngKernel, shape: ShapeHandle, view?: ViewName, options?: PngViewOptions): Promise<Uint8Array>;
|
|
36
|
+
/**
|
|
37
|
+
* Render a multiview grid (default Front / Top / Right / Iso) of `shape` to
|
|
38
|
+
* PNG bytes. Same layout as {@link renderMultiviewSVG}.
|
|
39
|
+
*/
|
|
40
|
+
export declare function renderMultiviewPNG(kernel: PngKernel, shape: ShapeHandle, options?: MultiviewPngOptions): Promise<Uint8Array>;
|
|
41
|
+
//# sourceMappingURL=png.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../src/png.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAc9C,OAAO,KAAK,EACR,gBAAgB,EAKhB,UAAU,EACV,QAAQ,EACR,WAAW,EACd,MAAM,YAAY,CAAC;AAGpB,gEAAgE;AAChE,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC;AAEnC,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB,EAAE,cAAc;CAAG;AAiZhF;;GAEG;AACH,wBAAsB,cAAc,CAChC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,QAAkB,EACxB,OAAO,GAAE,cAAmB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAUrB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,UAAU,CAAC,CA8BrB"}
|
package/dist/png.js
ADDED
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multiview PNG rendering for OCCT shapes.
|
|
3
|
+
*
|
|
4
|
+
* The same drawing as `svg.ts` -- hidden-line removal per view, one shared
|
|
5
|
+
* scale, a per-view gnomon and labels -- rasterised here instead of written as
|
|
6
|
+
* vector markup. Both take their geometry and layout from `views.ts`, so a PNG
|
|
7
|
+
* and an SVG of the same shape show the same picture.
|
|
8
|
+
*
|
|
9
|
+
* Everything is done here: an antialiased line rasteriser, a small bitmap font
|
|
10
|
+
* for the labels, and a PNG encoder over the platform's CompressionStream.
|
|
11
|
+
* That keeps the renderer free of native modules and of a font file,
|
|
12
|
+
* which matters because callers embed this in single-file binaries. The cost
|
|
13
|
+
* is that text is a fixed 5x7 bitmap face rather than the caller's font.
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import { basisFor, collectEdges, deflectionFor, dimensionsText, extentOf, gnomonArms, gridLayout, resolved, singleLayout, toPixels, VIEW_LABEL, } from "./views.js";
|
|
18
|
+
import { FONT_5X7, GLYPH_H, GLYPH_W } from "./font5x7.js";
|
|
19
|
+
/** Parse a colour option: `#rgb`, `#rrggbb` or `rgb(r, g, b)`. The SVG
|
|
20
|
+
* renderer passes the string through to the document, where any CSS colour
|
|
21
|
+
* works; the rasteriser cannot honour every CSS form, so anything else is
|
|
22
|
+
* an error rather than a silent change of colour. */
|
|
23
|
+
function parseColor(css) {
|
|
24
|
+
const c = css.trim();
|
|
25
|
+
const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c);
|
|
26
|
+
if (hex) {
|
|
27
|
+
const h = hex[1];
|
|
28
|
+
const pair = (i) => (h.length === 3 ? h[i] + h[i] : h.slice(2 * i, 2 * i + 2));
|
|
29
|
+
return { r: parseInt(pair(0), 16), g: parseInt(pair(1), 16), b: parseInt(pair(2), 16) };
|
|
30
|
+
}
|
|
31
|
+
const rgb = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/i.exec(c);
|
|
32
|
+
if (rgb) {
|
|
33
|
+
const [r, g, b] = [rgb[1], rgb[2], rgb[3]].map(Number);
|
|
34
|
+
if (r <= 255 && g <= 255 && b <= 255)
|
|
35
|
+
return { r, g, b };
|
|
36
|
+
}
|
|
37
|
+
throw new TypeError(`unsupported colour "${css}" for PNG: use #rgb, #rrggbb or rgb(r, g, b)`);
|
|
38
|
+
}
|
|
39
|
+
/** An RGB canvas with alpha-blended drawing. No alpha channel is kept: the
|
|
40
|
+
* output is opaque, so blending happens against what is already there. */
|
|
41
|
+
class Canvas {
|
|
42
|
+
w;
|
|
43
|
+
h;
|
|
44
|
+
px; // RGB, row-major
|
|
45
|
+
constructor(w, h, bg) {
|
|
46
|
+
this.w = w;
|
|
47
|
+
this.h = h;
|
|
48
|
+
this.px = new Uint8Array(w * h * 3);
|
|
49
|
+
for (let i = 0; i < this.px.length; i += 3) {
|
|
50
|
+
this.px[i] = bg.r;
|
|
51
|
+
this.px[i + 1] = bg.g;
|
|
52
|
+
this.px[i + 2] = bg.b;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
blend(x, y, c, a) {
|
|
56
|
+
if (a <= 0 || x < 0 || y < 0 || x >= this.w || y >= this.h)
|
|
57
|
+
return;
|
|
58
|
+
const i = (y * this.w + x) * 3;
|
|
59
|
+
const k = a > 1 ? 1 : a;
|
|
60
|
+
this.px[i] = this.px[i] + (c.r - this.px[i]) * k;
|
|
61
|
+
this.px[i + 1] = this.px[i + 1] + (c.g - this.px[i + 1]) * k;
|
|
62
|
+
this.px[i + 2] = this.px[i + 2] + (c.b - this.px[i + 2]) * k;
|
|
63
|
+
}
|
|
64
|
+
fillRect(x0, y0, x1, y1, c) {
|
|
65
|
+
const xa = Math.max(0, Math.round(x0));
|
|
66
|
+
const ya = Math.max(0, Math.round(y0));
|
|
67
|
+
const xb = Math.min(this.w, Math.round(x1));
|
|
68
|
+
const yb = Math.min(this.h, Math.round(y1));
|
|
69
|
+
for (let y = ya; y < yb; y++) {
|
|
70
|
+
for (let x = xa; x < xb; x++)
|
|
71
|
+
this.blend(x, y, c, 1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Antialiased thick line, drawn as a distance field over the segment's
|
|
76
|
+
* bounding box. Wu's algorithm only does hairlines; strokeWidth here is a
|
|
77
|
+
* caller-visible option, and a box of a few hundred pixels is cheap.
|
|
78
|
+
*/
|
|
79
|
+
line(x0, y0, x1, y1, c, width) {
|
|
80
|
+
// Like SVG's stroke-width: 0 (or less) draws nothing. A positive width
|
|
81
|
+
// below a tenth of a device pixel is kept at that, so it still shows.
|
|
82
|
+
if (!(width > 0))
|
|
83
|
+
return;
|
|
84
|
+
const half = Math.max(width, 0.1) / 2;
|
|
85
|
+
const dx = x1 - x0;
|
|
86
|
+
const dy = y1 - y0;
|
|
87
|
+
const len2 = dx * dx + dy * dy;
|
|
88
|
+
const pad = half + 1;
|
|
89
|
+
const xa = Math.max(0, Math.floor(Math.min(x0, x1) - pad));
|
|
90
|
+
const xb = Math.min(this.w - 1, Math.ceil(Math.max(x0, x1) + pad));
|
|
91
|
+
const ya = Math.max(0, Math.floor(Math.min(y0, y1) - pad));
|
|
92
|
+
const yb = Math.min(this.h - 1, Math.ceil(Math.max(y0, y1) + pad));
|
|
93
|
+
for (let y = ya; y <= yb; y++) {
|
|
94
|
+
for (let x = xa; x <= xb; x++) {
|
|
95
|
+
// Distance from the pixel centre to the segment.
|
|
96
|
+
const px = x + 0.5 - x0;
|
|
97
|
+
const py = y + 0.5 - y0;
|
|
98
|
+
let t = len2 > 0 ? (px * dx + py * dy) / len2 : 0;
|
|
99
|
+
t = t < 0 ? 0 : t > 1 ? 1 : t;
|
|
100
|
+
const ex = px - t * dx;
|
|
101
|
+
const ey = py - t * dy;
|
|
102
|
+
const d = Math.hypot(ex, ey);
|
|
103
|
+
// One pixel of feather: fully inside up to half - 0.5, out at
|
|
104
|
+
// half + 0.5.
|
|
105
|
+
const a = half + 0.5 - d;
|
|
106
|
+
if (a > 0)
|
|
107
|
+
this.blend(x, y, c, a > 1 ? 1 : a);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Draw text with the built-in 5x7 face. `size` is the cell height in px;
|
|
112
|
+
* the glyphs are nearest-neighbour scaled, which stays crisp at integer
|
|
113
|
+
* multiples and is acceptable in between. */
|
|
114
|
+
text(s, x, y, size, c, anchor = "start") {
|
|
115
|
+
const px = Math.max(1, Math.round(size / GLYPH_H));
|
|
116
|
+
const advance = (GLYPH_W + 1) * px;
|
|
117
|
+
const totalW = s.length * advance;
|
|
118
|
+
let cx = anchor === "middle" ? x - totalW / 2 : x;
|
|
119
|
+
const top = y - (GLYPH_H * px) / 2;
|
|
120
|
+
for (const ch of s) {
|
|
121
|
+
const glyph = FONT_5X7[ch];
|
|
122
|
+
if (glyph) {
|
|
123
|
+
for (let row = 0; row < GLYPH_H; row++) {
|
|
124
|
+
const bits = glyph[row];
|
|
125
|
+
for (let col = 0; col < GLYPH_W; col++) {
|
|
126
|
+
if (!(bits & (1 << (GLYPH_W - 1 - col))))
|
|
127
|
+
continue;
|
|
128
|
+
this.fillRect(cx + col * px, top + row * px, cx + (col + 1) * px, top + (row + 1) * px, c);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
cx += advance;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Box-filter down by an integer factor. */
|
|
136
|
+
downsample(factor) {
|
|
137
|
+
if (factor <= 1)
|
|
138
|
+
return this;
|
|
139
|
+
const w = Math.floor(this.w / factor);
|
|
140
|
+
const h = Math.floor(this.h / factor);
|
|
141
|
+
const out = new Canvas(w, h, { r: 0, g: 0, b: 0 });
|
|
142
|
+
const n = factor * factor;
|
|
143
|
+
for (let y = 0; y < h; y++) {
|
|
144
|
+
for (let x = 0; x < w; x++) {
|
|
145
|
+
let r = 0;
|
|
146
|
+
let g = 0;
|
|
147
|
+
let b = 0;
|
|
148
|
+
for (let sy = 0; sy < factor; sy++) {
|
|
149
|
+
const row = (y * factor + sy) * this.w;
|
|
150
|
+
for (let sx = 0; sx < factor; sx++) {
|
|
151
|
+
const i = (row + x * factor + sx) * 3;
|
|
152
|
+
r += this.px[i];
|
|
153
|
+
g += this.px[i + 1];
|
|
154
|
+
b += this.px[i + 2];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const o = (y * w + x) * 3;
|
|
158
|
+
out.px[o] = r / n;
|
|
159
|
+
out.px[o + 1] = g / n;
|
|
160
|
+
out.px[o + 2] = b / n;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// --- drawing ----------------------------------------------------------------
|
|
167
|
+
/** Walk a pixel polyline, emitting the on-segments of a 3-2 dash pattern. */
|
|
168
|
+
function dashed(canvas, pts, c, width, on, off) {
|
|
169
|
+
let phase = 0;
|
|
170
|
+
for (let i = 0; i + 3 < pts.length; i += 2) {
|
|
171
|
+
const x0 = pts[i];
|
|
172
|
+
const y0 = pts[i + 1];
|
|
173
|
+
const x1 = pts[i + 2];
|
|
174
|
+
const y1 = pts[i + 3];
|
|
175
|
+
const len = Math.hypot(x1 - x0, y1 - y0);
|
|
176
|
+
if (len === 0)
|
|
177
|
+
continue;
|
|
178
|
+
let travelled = 0;
|
|
179
|
+
while (travelled < len) {
|
|
180
|
+
const inOn = phase < on;
|
|
181
|
+
const remain = inOn ? on - phase : on + off - phase;
|
|
182
|
+
const step = Math.min(remain, len - travelled);
|
|
183
|
+
if (inOn) {
|
|
184
|
+
const ta = travelled / len;
|
|
185
|
+
const tb = (travelled + step) / len;
|
|
186
|
+
canvas.line(x0 + (x1 - x0) * ta, y0 + (y1 - y0) * ta, x0 + (x1 - x0) * tb, y0 + (y1 - y0) * tb, c, width);
|
|
187
|
+
}
|
|
188
|
+
travelled += step;
|
|
189
|
+
phase = (phase + step) % (on + off);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function strokePolylines(canvas, lines, t, ox, oy, s, c, width, dash) {
|
|
194
|
+
for (const line of lines) {
|
|
195
|
+
const px = toPixels(line, t);
|
|
196
|
+
for (let i = 0; i < px.length; i += 2) {
|
|
197
|
+
px[i] = (px[i] + ox) * s;
|
|
198
|
+
px[i + 1] = (px[i + 1] + oy) * s;
|
|
199
|
+
}
|
|
200
|
+
if (dash)
|
|
201
|
+
dashed(canvas, px, c, width * s, 3 * s, 2 * s);
|
|
202
|
+
else {
|
|
203
|
+
for (let i = 0; i + 3 < px.length; i += 2) {
|
|
204
|
+
canvas.line(px[i], px[i + 1], px[i + 2], px[i + 3], c, width * s);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function drawPanel(canvas, edges, basis, t, o, label, ox, oy, s) {
|
|
210
|
+
const border = parseColor("#e0e0e0");
|
|
211
|
+
canvas.fillRect(ox * s, oy * s, (ox + t.panelW) * s, (oy + t.panelH) * s, parseColor(o.background));
|
|
212
|
+
// Panel border: one pixel per side, inside the panel, as SVG's
|
|
213
|
+
// <rect x="0.5" y="0.5" width="w-1" height="h-1"> draws it. A stroke
|
|
214
|
+
// centred on the edge would put half of it outside the canvas, leaving
|
|
215
|
+
// the outer frame fainter than the seams between panels.
|
|
216
|
+
const i = s / 2;
|
|
217
|
+
const x0 = ox * s + i;
|
|
218
|
+
const y0 = oy * s + i;
|
|
219
|
+
const x1 = (ox + t.panelW) * s - i;
|
|
220
|
+
const y1 = (oy + t.panelH) * s - i;
|
|
221
|
+
canvas.line(x0, y0, x1, y0, border, s);
|
|
222
|
+
canvas.line(x0, y1, x1, y1, border, s);
|
|
223
|
+
canvas.line(x0, y0, x0, y1, border, s);
|
|
224
|
+
canvas.line(x1, y0, x1, y1, border, s);
|
|
225
|
+
if (o.showHidden && edges.hidden.length > 0) {
|
|
226
|
+
strokePolylines(canvas, edges.hidden, t, ox, oy, s, parseColor(o.hiddenColor), o.strokeWidth, true);
|
|
227
|
+
}
|
|
228
|
+
if (edges.visible.length > 0) {
|
|
229
|
+
strokePolylines(canvas, edges.visible, t, ox, oy, s, parseColor(o.visibleColor), o.strokeWidth, false);
|
|
230
|
+
}
|
|
231
|
+
if (o.showGnomon) {
|
|
232
|
+
for (const arm of gnomonArms(basis, t)) {
|
|
233
|
+
const c = parseColor(arm.color);
|
|
234
|
+
canvas.line((arm.x0 + ox) * s, (arm.y0 + oy) * s, (arm.x1 + ox) * s, (arm.y1 + oy) * s, c, 1.5 * s);
|
|
235
|
+
canvas.text(arm.label, (arm.lx + ox) * s, (arm.ly + oy) * s, 9 * s, c, "middle");
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (label !== null) {
|
|
239
|
+
// SVG puts the baseline at pad + 4; the bitmap face centres on its
|
|
240
|
+
// cell, so sit the cell where that baseline would be.
|
|
241
|
+
canvas.text(label, (t.pad + ox) * s, (t.pad + oy) * s, 11 * s, parseColor("#333"));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// --- PNG encoding -----------------------------------------------------------
|
|
245
|
+
const CRC_TABLE = (() => {
|
|
246
|
+
const t = new Uint32Array(256);
|
|
247
|
+
for (let n = 0; n < 256; n++) {
|
|
248
|
+
let c = n;
|
|
249
|
+
for (let k = 0; k < 8; k++)
|
|
250
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
251
|
+
t[n] = c >>> 0;
|
|
252
|
+
}
|
|
253
|
+
return t;
|
|
254
|
+
})();
|
|
255
|
+
function crc32(bytes) {
|
|
256
|
+
let c = 0xffffffff;
|
|
257
|
+
for (let i = 0; i < bytes.length; i++)
|
|
258
|
+
c = CRC_TABLE[(c ^ bytes[i]) & 0xff] ^ (c >>> 8);
|
|
259
|
+
return (c ^ 0xffffffff) >>> 0;
|
|
260
|
+
}
|
|
261
|
+
function chunk(type, data) {
|
|
262
|
+
const out = new Uint8Array(12 + data.length);
|
|
263
|
+
const dv = new DataView(out.buffer);
|
|
264
|
+
dv.setUint32(0, data.length);
|
|
265
|
+
for (let i = 0; i < 4; i++)
|
|
266
|
+
out[4 + i] = type.charCodeAt(i);
|
|
267
|
+
out.set(data, 8);
|
|
268
|
+
dv.setUint32(8 + data.length, crc32(out.subarray(4, 8 + data.length)));
|
|
269
|
+
return out;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Deflate through the platform's CompressionStream. "deflate" there means the
|
|
273
|
+
* zlib wrapper of RFC 1950, which is exactly what a PNG IDAT holds; Node 18+,
|
|
274
|
+
* Bun, Deno and browsers all provide it, so the renderer needs no zlib import
|
|
275
|
+
* and stays usable outside Node.
|
|
276
|
+
*/
|
|
277
|
+
async function deflate(raw) {
|
|
278
|
+
const CS = globalThis.CompressionStream;
|
|
279
|
+
if (typeof CS !== "function") {
|
|
280
|
+
throw new Error("PNG export needs CompressionStream (Node 18+, Bun, Deno or a browser)");
|
|
281
|
+
}
|
|
282
|
+
const cs = new CS("deflate");
|
|
283
|
+
const writer = cs.writable.getWriter();
|
|
284
|
+
void writer.write(raw);
|
|
285
|
+
void writer.close();
|
|
286
|
+
const parts = [];
|
|
287
|
+
const reader = cs.readable.getReader();
|
|
288
|
+
for (;;) {
|
|
289
|
+
const { done, value } = await reader.read();
|
|
290
|
+
if (done)
|
|
291
|
+
break;
|
|
292
|
+
if (value)
|
|
293
|
+
parts.push(value);
|
|
294
|
+
}
|
|
295
|
+
const total = parts.reduce((n, p) => n + p.length, 0);
|
|
296
|
+
const out = new Uint8Array(total);
|
|
297
|
+
let at = 0;
|
|
298
|
+
for (const p of parts) {
|
|
299
|
+
out.set(p, at);
|
|
300
|
+
at += p.length;
|
|
301
|
+
}
|
|
302
|
+
return out;
|
|
303
|
+
}
|
|
304
|
+
/** True when every pixel has r = g = b. */
|
|
305
|
+
function isGrey(px) {
|
|
306
|
+
for (let i = 0; i < px.length; i += 3) {
|
|
307
|
+
if (px[i] !== px[i + 1] || px[i] !== px[i + 2])
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
312
|
+
/** Encode an RGB canvas as a PNG: 8-bit greyscale when every pixel is grey
|
|
313
|
+
* (a line drawing without the coloured gnomon), else 8-bit truecolour. */
|
|
314
|
+
async function encodePng(canvas) {
|
|
315
|
+
// Filter type 0 (None) on every row: the drawings are mostly flat colour,
|
|
316
|
+
// so deflate does the work and the encoder stays short.
|
|
317
|
+
const grey = isGrey(canvas.px);
|
|
318
|
+
const channels = grey ? 1 : 3;
|
|
319
|
+
const stride = canvas.w * channels;
|
|
320
|
+
const raw = new Uint8Array((stride + 1) * canvas.h);
|
|
321
|
+
for (let y = 0; y < canvas.h; y++) {
|
|
322
|
+
const row = y * (stride + 1);
|
|
323
|
+
raw[row] = 0;
|
|
324
|
+
if (grey) {
|
|
325
|
+
const src = y * canvas.w * 3;
|
|
326
|
+
for (let x = 0; x < canvas.w; x++)
|
|
327
|
+
raw[row + 1 + x] = canvas.px[src + x * 3];
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
raw.set(canvas.px.subarray(y * stride, (y + 1) * stride), row + 1);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const ihdr = new Uint8Array(13);
|
|
334
|
+
const dv = new DataView(ihdr.buffer);
|
|
335
|
+
dv.setUint32(0, canvas.w);
|
|
336
|
+
dv.setUint32(4, canvas.h);
|
|
337
|
+
ihdr[8] = 8; // bit depth
|
|
338
|
+
ihdr[9] = grey ? 0 : 2; // colour type: greyscale / truecolour
|
|
339
|
+
const idat = await deflate(raw);
|
|
340
|
+
const parts = [
|
|
341
|
+
new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]),
|
|
342
|
+
chunk("IHDR", ihdr),
|
|
343
|
+
chunk("IDAT", idat),
|
|
344
|
+
chunk("IEND", new Uint8Array(0)),
|
|
345
|
+
];
|
|
346
|
+
const total = parts.reduce((n, p) => n + p.length, 0);
|
|
347
|
+
const out = new Uint8Array(total);
|
|
348
|
+
let at = 0;
|
|
349
|
+
for (const p of parts) {
|
|
350
|
+
out.set(p, at);
|
|
351
|
+
at += p.length;
|
|
352
|
+
}
|
|
353
|
+
return out;
|
|
354
|
+
}
|
|
355
|
+
// --- public API -------------------------------------------------------------
|
|
356
|
+
function superScale(options) {
|
|
357
|
+
const s = options.supersample ?? 2;
|
|
358
|
+
return Math.max(1, Math.min(4, Math.round(s)));
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Render a single named view of `shape` to PNG bytes.
|
|
362
|
+
*/
|
|
363
|
+
export async function renderShapePNG(kernel, shape, view = "front", options = {}) {
|
|
364
|
+
const o = resolved(options);
|
|
365
|
+
const s = superScale(options);
|
|
366
|
+
const basis = basisFor(view);
|
|
367
|
+
const deflection = deflectionFor(kernel, shape, options);
|
|
368
|
+
const edges = collectEdges(kernel, shape, basis, deflection);
|
|
369
|
+
const t = singleLayout(extentOf([edges]), o);
|
|
370
|
+
const canvas = new Canvas(o.width * s, o.height * s, parseColor(o.background));
|
|
371
|
+
drawPanel(canvas, edges, basis, t, o, null, 0, 0, s);
|
|
372
|
+
return encodePng(canvas.downsample(s));
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Render a multiview grid (default Front / Top / Right / Iso) of `shape` to
|
|
376
|
+
* PNG bytes. Same layout as {@link renderMultiviewSVG}.
|
|
377
|
+
*/
|
|
378
|
+
export async function renderMultiviewPNG(kernel, shape, options = {}) {
|
|
379
|
+
const o = resolved(options);
|
|
380
|
+
const s = superScale(options);
|
|
381
|
+
const views = options.views ?? ["front", "top", "right", "iso"];
|
|
382
|
+
const columns = options.columns ?? 2;
|
|
383
|
+
const showLabels = options.showLabels ?? true;
|
|
384
|
+
const showDimensions = options.showDimensions ?? true;
|
|
385
|
+
const deflection = deflectionFor(kernel, shape, options);
|
|
386
|
+
const bases = views.map(basisFor);
|
|
387
|
+
const edges = bases.map((b) => collectEdges(kernel, shape, b, deflection));
|
|
388
|
+
const layout = gridLayout(edges.map((e) => extentOf([e])), o, columns, showDimensions);
|
|
389
|
+
const canvas = new Canvas(layout.totalW * s, layout.totalH * s, parseColor(o.background));
|
|
390
|
+
for (let i = 0; i < views.length; i++) {
|
|
391
|
+
const { px, py, t } = layout.panels[i];
|
|
392
|
+
drawPanel(canvas, edges[i], bases[i], t, o, showLabels ? VIEW_LABEL[views[i]] : null, px, py, s);
|
|
393
|
+
}
|
|
394
|
+
if (showDimensions) {
|
|
395
|
+
const dims = dimensionsText(kernel, shape, (n) => Math.round(n * 100) / 100);
|
|
396
|
+
canvas.text(dims, (layout.totalW / 2) * s, (layout.rows * o.height + 11) * s, 11 * s, parseColor("#444"), "middle");
|
|
397
|
+
}
|
|
398
|
+
return encodePng(canvas.downsample(s));
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=png.js.map
|
package/dist/png.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"png.js","sourceRoot":"","sources":["../src/png.ts"],"names":[],"mappings":"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"}
|
package/dist/svg.d.ts
CHANGED
|
@@ -10,58 +10,20 @@
|
|
|
10
10
|
* and an overall bounding-box annotation — a layout aimed at letting an
|
|
11
11
|
* automated agent reason about geometry it cannot otherwise see.
|
|
12
12
|
*
|
|
13
|
+
* The projection and layout live in `views.ts`, shared with the PNG renderer
|
|
14
|
+
* so the two outputs cannot drift apart.
|
|
15
|
+
*
|
|
13
16
|
* @module
|
|
14
17
|
*/
|
|
15
|
-
import type {
|
|
18
|
+
import type { ShapeHandle } from "./types.js";
|
|
19
|
+
import type { MultiviewOptions, ViewKernel, ViewName, ViewOptions } from "./views.js";
|
|
16
20
|
/** The subset of the kernel API the SVG renderer depends on. */
|
|
17
|
-
export
|
|
18
|
-
|
|
19
|
-
projectEdges(shape: ShapeHandle, viewOrigin: Vec3, viewDirection: Vec3, xAxis?: Vec3): ProjectionData;
|
|
20
|
-
wireframe(shape: ShapeHandle, deflection?: number): {
|
|
21
|
-
points: Float32Array;
|
|
22
|
-
edgeGroups: Int32Array;
|
|
23
|
-
};
|
|
24
|
-
release(shape: ShapeHandle): void;
|
|
25
|
-
}
|
|
26
|
-
/** A named orthographic or isometric viewpoint. */
|
|
27
|
-
export type ViewName = "front" | "back" | "top" | "bottom" | "left" | "right" | "iso";
|
|
21
|
+
export type SvgKernel = ViewKernel;
|
|
22
|
+
export type { ViewName };
|
|
28
23
|
/** Options shared by single-view and multiview rendering. */
|
|
29
|
-
export
|
|
30
|
-
/** Panel width in px (default 240). */
|
|
31
|
-
width?: number;
|
|
32
|
-
/** Panel height in px (default 240). */
|
|
33
|
-
height?: number;
|
|
34
|
-
/** Inner padding in px (default 14). */
|
|
35
|
-
padding?: number;
|
|
36
|
-
/**
|
|
37
|
-
* Wireframe sampling deflection in model units. Defaults to ~0.2% of the
|
|
38
|
-
* bounding-box diagonal so output is scale-independent.
|
|
39
|
-
*/
|
|
40
|
-
deflection?: number;
|
|
41
|
-
/** Draw hidden (occluded) edges dashed (default true). */
|
|
42
|
-
showHidden?: boolean;
|
|
43
|
-
/** Draw a small XYZ axis gnomon in each panel (default true). */
|
|
44
|
-
showGnomon?: boolean;
|
|
45
|
-
/** Stroke width for visible edges in px (default 1). */
|
|
46
|
-
strokeWidth?: number;
|
|
47
|
-
/** Panel background fill (default "#ffffff"). */
|
|
48
|
-
background?: string;
|
|
49
|
-
/** Visible-edge stroke color (default "#111111"). */
|
|
50
|
-
visibleColor?: string;
|
|
51
|
-
/** Hidden-edge stroke color (default "#9aa0a6"). */
|
|
52
|
-
hiddenColor?: string;
|
|
53
|
-
}
|
|
24
|
+
export type SvgViewOptions = ViewOptions;
|
|
54
25
|
/** Options for the multiview grid. */
|
|
55
|
-
export
|
|
56
|
-
/** Views to render, in order (default front, top, right, iso). */
|
|
57
|
-
views?: ViewName[];
|
|
58
|
-
/** Panels per row (default 2). */
|
|
59
|
-
columns?: number;
|
|
60
|
-
/** Draw the per-view name label (default true). */
|
|
61
|
-
showLabels?: boolean;
|
|
62
|
-
/** Annotate overall X×Y×Z size in a footer (default true). */
|
|
63
|
-
showDimensions?: boolean;
|
|
64
|
-
}
|
|
26
|
+
export type MultiviewSvgOptions = MultiviewOptions;
|
|
65
27
|
/**
|
|
66
28
|
* Render a single named view of `shape` to a standalone SVG string.
|
|
67
29
|
*/
|
package/dist/svg.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAc9C,OAAO,KAAK,EACR,gBAAgB,EAKhB,UAAU,EACV,QAAQ,EACR,WAAW,EACd,MAAM,YAAY,CAAC;AAEpB,gEAAgE;AAChE,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC;AACnC,YAAY,EAAE,QAAQ,EAAE,CAAC;AACzB,6DAA6D;AAC7D,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC;AACzC,sCAAsC;AACtC,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AA0DnD;;GAEG;AACH,wBAAgB,cAAc,CAC1B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,QAAkB,EACxB,OAAO,GAAE,cAAmB,GAC7B,MAAM,CAWR;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,mBAAwB,GAClC,MAAM,CAiCR"}
|