rtistree 0.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.
Files changed (181) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +99 -0
  4. package/THIRD_PARTY_NOTICES.md +25 -0
  5. package/dist/art-direction.d.ts +77 -0
  6. package/dist/art-direction.js +186 -0
  7. package/dist/art-direction.js.map +1 -0
  8. package/dist/artifacts.d.ts +24 -0
  9. package/dist/artifacts.js +49 -0
  10. package/dist/artifacts.js.map +1 -0
  11. package/dist/assets.d.ts +16 -0
  12. package/dist/assets.js +96 -0
  13. package/dist/assets.js.map +1 -0
  14. package/dist/benchmark.d.ts +76 -0
  15. package/dist/benchmark.js +118 -0
  16. package/dist/benchmark.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +300 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/commands.d.ts +5315 -0
  21. package/dist/commands.js +591 -0
  22. package/dist/commands.js.map +1 -0
  23. package/dist/components.d.ts +20 -0
  24. package/dist/components.js +98 -0
  25. package/dist/components.js.map +1 -0
  26. package/dist/construction.d.ts +53 -0
  27. package/dist/construction.js +80 -0
  28. package/dist/construction.js.map +1 -0
  29. package/dist/critique.d.ts +44 -0
  30. package/dist/critique.js +45 -0
  31. package/dist/critique.js.map +1 -0
  32. package/dist/detail.d.ts +5 -0
  33. package/dist/detail.js +52 -0
  34. package/dist/detail.js.map +1 -0
  35. package/dist/document.d.ts +64 -0
  36. package/dist/document.js +56 -0
  37. package/dist/document.js.map +1 -0
  38. package/dist/export.d.ts +405 -0
  39. package/dist/export.js +344 -0
  40. package/dist/export.js.map +1 -0
  41. package/dist/font-inspection.d.ts +8 -0
  42. package/dist/font-inspection.js +34 -0
  43. package/dist/font-inspection.js.map +1 -0
  44. package/dist/graphics.d.ts +9 -0
  45. package/dist/graphics.js +72 -0
  46. package/dist/graphics.js.map +1 -0
  47. package/dist/history-storage.d.ts +10 -0
  48. package/dist/history-storage.js +59 -0
  49. package/dist/history-storage.js.map +1 -0
  50. package/dist/index.d.ts +27 -0
  51. package/dist/index.js +28 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/layout.d.ts +18 -0
  54. package/dist/layout.js +155 -0
  55. package/dist/layout.js.map +1 -0
  56. package/dist/loader.d.ts +9 -0
  57. package/dist/loader.js +108 -0
  58. package/dist/loader.js.map +1 -0
  59. package/dist/mcp.d.ts +4 -0
  60. package/dist/mcp.js +223 -0
  61. package/dist/mcp.js.map +1 -0
  62. package/dist/merge.d.ts +6 -0
  63. package/dist/merge.js +49 -0
  64. package/dist/merge.js.map +1 -0
  65. package/dist/native.d.ts +3 -0
  66. package/dist/native.js +6 -0
  67. package/dist/native.js.map +1 -0
  68. package/dist/paint.d.ts +9 -0
  69. package/dist/paint.js +331 -0
  70. package/dist/paint.js.map +1 -0
  71. package/dist/path-edit.d.ts +20 -0
  72. package/dist/path-edit.js +30 -0
  73. package/dist/path-edit.js.map +1 -0
  74. package/dist/pdf-output.d.ts +21 -0
  75. package/dist/pdf-output.js +297 -0
  76. package/dist/pdf-output.js.map +1 -0
  77. package/dist/pipeline.d.ts +39 -0
  78. package/dist/pipeline.js +227 -0
  79. package/dist/pipeline.js.map +1 -0
  80. package/dist/print-scene.d.ts +490 -0
  81. package/dist/print-scene.js +55 -0
  82. package/dist/print-scene.js.map +1 -0
  83. package/dist/production-workflow.d.ts +251 -0
  84. package/dist/production-workflow.js +335 -0
  85. package/dist/production-workflow.js.map +1 -0
  86. package/dist/program-worker.d.ts +1 -0
  87. package/dist/program-worker.js +31 -0
  88. package/dist/program-worker.js.map +1 -0
  89. package/dist/program.d.ts +85 -0
  90. package/dist/program.js +246 -0
  91. package/dist/program.js.map +1 -0
  92. package/dist/project-config.d.ts +91 -0
  93. package/dist/project-config.js +187 -0
  94. package/dist/project-config.js.map +1 -0
  95. package/dist/project.d.ts +897 -0
  96. package/dist/project.js +347 -0
  97. package/dist/project.js.map +1 -0
  98. package/dist/raster-edit.d.ts +61 -0
  99. package/dist/raster-edit.js +91 -0
  100. package/dist/raster-edit.js.map +1 -0
  101. package/dist/raster-studio.d.ts +84 -0
  102. package/dist/raster-studio.js +236 -0
  103. package/dist/raster-studio.js.map +1 -0
  104. package/dist/render.d.ts +79 -0
  105. package/dist/render.js +437 -0
  106. package/dist/render.js.map +1 -0
  107. package/dist/rich-text.d.ts +10 -0
  108. package/dist/rich-text.js +56 -0
  109. package/dist/rich-text.js.map +1 -0
  110. package/dist/schema.d.ts +1912 -0
  111. package/dist/schema.js +571 -0
  112. package/dist/schema.js.map +1 -0
  113. package/dist/spatial.d.ts +10 -0
  114. package/dist/spatial.js +29 -0
  115. package/dist/spatial.js.map +1 -0
  116. package/dist/studio-reference.d.ts +153 -0
  117. package/dist/studio-reference.js +39 -0
  118. package/dist/studio-reference.js.map +1 -0
  119. package/dist/svg.d.ts +5 -0
  120. package/dist/svg.js +315 -0
  121. package/dist/svg.js.map +1 -0
  122. package/dist/techniques.d.ts +74 -0
  123. package/dist/techniques.js +164 -0
  124. package/dist/techniques.js.map +1 -0
  125. package/dist/verify.d.ts +36 -0
  126. package/dist/verify.js +277 -0
  127. package/dist/verify.js.map +1 -0
  128. package/dist/viewport.d.ts +3 -0
  129. package/dist/viewport.js +71 -0
  130. package/dist/viewport.js.map +1 -0
  131. package/dist/workflow.d.ts +53 -0
  132. package/dist/workflow.js +66 -0
  133. package/dist/workflow.js.map +1 -0
  134. package/docs/agent-art-workflow.md +201 -0
  135. package/docs/agent-setup.md +83 -0
  136. package/docs/atelier.md +117 -0
  137. package/docs/cli-reference.md +61 -0
  138. package/docs/decisions/001-runtime-and-renderer.md +35 -0
  139. package/docs/decisions/002-composable-scenes-and-history.md +28 -0
  140. package/docs/decisions/003-editing-refinement-and-agent-validation.md +45 -0
  141. package/docs/decisions/004-print-production-and-projects.md +19 -0
  142. package/docs/decisions/005-programmable-digital-art.md +15 -0
  143. package/docs/decisions/006-staged-2d-art-production.md +13 -0
  144. package/docs/decisions/007-foundation-first-art-direction.md +13 -0
  145. package/docs/decisions/008-agent-onboarding-and-trial-lessons.md +48 -0
  146. package/docs/engine-overview.md +174 -0
  147. package/docs/evolution.md +179 -0
  148. package/docs/getting-started.md +107 -0
  149. package/docs/next-milestone.md +61 -0
  150. package/docs/previews/a3-production.json +36 -0
  151. package/docs/previews/benchmark.json +42 -0
  152. package/docs/previews/landscape.png +0 -0
  153. package/docs/previews/performance.json +24 -0
  154. package/docs/previews/poster.png +0 -0
  155. package/docs/production.md +107 -0
  156. package/docs/releasing.md +60 -0
  157. package/docs/scene-format.md +126 -0
  158. package/docs/studio.md +108 -0
  159. package/examples/hello/README.md +14 -0
  160. package/examples/hello/refine.json +10 -0
  161. package/examples/hello/render.mjs +9 -0
  162. package/examples/hello/scene.json +19 -0
  163. package/licenses/DM-Serif-Display-OFL.txt +93 -0
  164. package/licenses/Inter-OFL.txt +93 -0
  165. package/package.json +84 -0
  166. package/schemas/authoring.schema.json +2177 -0
  167. package/schemas/brief.schema.json +57 -0
  168. package/schemas/command.schema.json +3154 -0
  169. package/schemas/construction.schema.json +159 -0
  170. package/schemas/critique.schema.json +101 -0
  171. package/schemas/document.schema.json +41 -0
  172. package/schemas/export.schema.json +89 -0
  173. package/schemas/fragment.schema.json +1861 -0
  174. package/schemas/patch.schema.json +3177 -0
  175. package/schemas/pipeline.schema.json +205 -0
  176. package/schemas/production.schema.json +452 -0
  177. package/schemas/program.schema.json +152 -0
  178. package/schemas/project.schema.json +115 -0
  179. package/schemas/raster-read.schema.json +42 -0
  180. package/schemas/raster-write.schema.json +75 -0
  181. package/schemas/scene.schema.json +2014 -0
package/dist/render.js ADDED
@@ -0,0 +1,437 @@
1
+ import { richLayout } from './rich-text.js';
2
+ import { imagePlacement, perspectiveImage } from './graphics.js';
3
+ import { viewportScene } from './viewport.js';
4
+ import { renderDetail } from './detail.js';
5
+ import { createRequire } from 'node:module';
6
+ import { createCanvas, Path2D } from './native.js';
7
+ import { canonical, loadAssets, registerFonts, registerProjectFonts, sceneHash, sha256, } from './assets.js';
8
+ import { flattenResolved, resolveLayout } from './layout.js';
9
+ import { applyRasterOperation, maskCanvas, rgba, seededRandom } from './paint.js';
10
+ import { coordinateMatrix } from './spatial.js';
11
+ import { layerMasks, parseScene } from './schema.js';
12
+ export const RENDERER_VERSION = '0.4.0';
13
+ const require = createRequire(import.meta.url);
14
+ const canvasVersion = require('@napi-rs/canvas/package.json').version;
15
+ export function fontStyle(layer, aliases = {}) {
16
+ const s = layer.style;
17
+ if (aliases[s.font])
18
+ return `${s.size}px "${aliases[s.font]}"`;
19
+ return `${s.size}px "Rtistree-${s.font === 'display' ? 'display' : s.weight === 'bold' ? 'inter-bold' : 'inter'}"`;
20
+ }
21
+ export function layoutText(ctx, layer, width, height, aliases = {}) {
22
+ ctx.font = fontStyle(layer, aliases);
23
+ ctx.letterSpacing = `${layer.style.tracking ?? 0}px`;
24
+ ctx.fontKerning = layer.style.kerning === false ? 'none' : 'normal';
25
+ if (layer.runs) {
26
+ const spans = richLayout(ctx, layer, width, (l) => fontStyle(l, aliases)), measured = Math.max(0, ...spans.map((line) => line.reduce((a, b) => a + b.width, 0))), total = spans.length * layer.style.size * layer.style.line_height;
27
+ return {
28
+ layer: layer.id,
29
+ lines: spans.map((l) => l.map((s) => s.text).join('')),
30
+ width: measured,
31
+ height: total,
32
+ available: [width, height],
33
+ overflow: measured > width + 0.5 || total > height + 0.5,
34
+ spans,
35
+ };
36
+ }
37
+ const lines = [];
38
+ for (const paragraph of layer.content.split('\n')) {
39
+ let line = '';
40
+ for (const word of paragraph.split(/\s+/)) {
41
+ const next = line ? `${line} ${word}` : word;
42
+ if (line && ctx.measureText(next).width > width) {
43
+ lines.push(line);
44
+ line = word;
45
+ }
46
+ else
47
+ line = next;
48
+ }
49
+ lines.push(line);
50
+ }
51
+ const measured = Math.max(0, ...lines.map((line) => ctx.measureText(line).width)), total = lines.length * layer.style.size * layer.style.line_height;
52
+ return {
53
+ layer: layer.id,
54
+ lines,
55
+ width: measured,
56
+ height: total,
57
+ available: [width, height],
58
+ overflow: measured > width + 0.5 || total > height + 0.5,
59
+ };
60
+ }
61
+ export class SkiaRenderer {
62
+ maxCacheBytes;
63
+ surfaces = new Map();
64
+ cacheBytes = 0;
65
+ constructor(maxCacheBytes = 128 * 1024 * 1024) {
66
+ this.maxCacheBytes = maxCacheBytes;
67
+ }
68
+ clearCache() {
69
+ this.surfaces.clear();
70
+ this.cacheBytes = 0;
71
+ }
72
+ remember(key, canvas, text) {
73
+ const bytes = canvas.width * canvas.height * 4;
74
+ if (bytes > this.maxCacheBytes)
75
+ return;
76
+ if (this.surfaces.has(key))
77
+ return;
78
+ while (this.cacheBytes + bytes > this.maxCacheBytes && this.surfaces.size) {
79
+ const oldest = this.surfaces.keys().next().value;
80
+ this.cacheBytes -= this.surfaces.get(oldest).bytes;
81
+ this.surfaces.delete(oldest);
82
+ }
83
+ this.surfaces.set(key, { canvas, text, bytes });
84
+ this.cacheBytes += bytes;
85
+ }
86
+ async render(input, root, options = {}) {
87
+ if (options.region && !options.canvasTransform && options.regionMode !== 'full') {
88
+ const original = parseScene(input), [x, y, w, h] = options.region;
89
+ if (!options.region.every(Number.isInteger) ||
90
+ x < 0 ||
91
+ y < 0 ||
92
+ w <= 0 ||
93
+ h <= 0 ||
94
+ x + w > original.canvas.width ||
95
+ y + h > original.canvas.height)
96
+ throw new Error('Render region must be an integer rectangle inside the canvas');
97
+ const viewport = viewportScene(original, options.region);
98
+ if (viewport) {
99
+ const r = await this.render(viewport, root, { ...options, region: undefined });
100
+ return {
101
+ ...r,
102
+ statistics: { ...r.statistics, viewport_pixels: w * h },
103
+ evidence: {
104
+ ...r.evidence,
105
+ scene: { version: 1, hash: sceneHash(original) },
106
+ render: { ...r.evidence.render, region: options.region },
107
+ },
108
+ };
109
+ }
110
+ }
111
+ const scene = parseScene(input), bundledFonts = await registerFonts(), customFonts = await registerProjectFonts(scene, root), fonts = { ...bundledFonts, ...customFonts.hashes }, assets = await loadAssets(scene, root);
112
+ const { width, height } = scene.canvas, nodes = resolveLayout(scene), all = flattenResolved(nodes), index = new Map(all.map((n) => [n.layer.id, n]));
113
+ const retained = new Set(all.flatMap((n) => layerMasks(n.layer).flatMap((m) => (m?.type === 'semantic-object' ? [m.target] : []))));
114
+ const depth = (nodes) => Math.max(0, ...nodes.map((n) => 1 + depth(n.children)));
115
+ if (width *
116
+ height *
117
+ (options.cache === false ? depth(nodes) + retained.size + 5 : all.length + 6) >
118
+ 160 * 1024 * 1024)
119
+ throw new Error('Scene exceeds the CPU surface budget; reduce canvas size or layer count');
120
+ const coordinates = (v, n) => v.space === 'layer'
121
+ ? coordinateMatrix(v, n)
122
+ : (options.canvasTransform ?? coordinateMatrix(v, n));
123
+ const printableMask = (mask) => options.canvasTransform
124
+ ? {
125
+ ...mask,
126
+ space: mask.type === 'semantic-object' ? mask.space : 'layer',
127
+ ...(mask.type === 'combine' ? { masks: mask.masks.map(printableMask) } : {}),
128
+ }
129
+ : mask;
130
+ const operation = (op) => options.canvasTransform
131
+ ? { ...op, space: 'layer', ...(op.mask ? { mask: printableMask(op.mask) } : {}) }
132
+ : op;
133
+ const statistics = { rasterized_layers: 0, cached_layers: 0, cache_bytes: 0 };
134
+ const keys = new Map();
135
+ const keyFor = (node) => {
136
+ const existing = keys.get(node.layer.id);
137
+ if (existing)
138
+ return existing;
139
+ const { children, ...layer } = node.layer;
140
+ const masks = layerMasks(layer).flatMap((mask) => mask.type === 'semantic-object' ? [keyFor(index.get(mask.target))] : []);
141
+ const key = sha256(canonical({
142
+ canvasTransform: options.canvasTransform,
143
+ width,
144
+ height,
145
+ layer,
146
+ matrix: node.matrix,
147
+ bounds: node.bounds,
148
+ children: node.children.map(keyFor),
149
+ masks,
150
+ assets: assets.hashes,
151
+ fonts,
152
+ exclude: options.excludeLayers ?? [],
153
+ }));
154
+ keys.set(layer.id, key);
155
+ return key;
156
+ };
157
+ const cache = new Map(), text = [];
158
+ const fresh = () => createCanvas(width, height);
159
+ const lookup = (id) => {
160
+ if (id.startsWith('asset:')) {
161
+ const im = assets.images.get(id.slice(6));
162
+ if (!im)
163
+ throw new Error('Unknown mask asset');
164
+ const c = createCanvas(im.width, im.height);
165
+ c.getContext('2d').drawImage(im, 0, 0);
166
+ return c;
167
+ }
168
+ const n = index.get(id);
169
+ if (!n)
170
+ throw new Error(`Unknown layer: ${id}`);
171
+ return renderNode(n);
172
+ };
173
+ const compose = (target, children) => {
174
+ const ctx = target.getContext('2d');
175
+ for (const child of [...children].sort((a, b) => a.layer.z - b.layer.z)) {
176
+ if (!child.layer.visible)
177
+ continue;
178
+ if (child.layer.type === 'adjustment') {
179
+ const modified = fresh();
180
+ modified.getContext('2d').drawImage(target, 0, 0);
181
+ for (const op of child.layer.operations)
182
+ applyRasterOperation(modified, operation(op), lookup, coordinates(op, child), op.mask ? coordinates(op.mask, child) : undefined);
183
+ const before = ctx.getImageData(0, 0, width, height), after = modified.getContext('2d').getImageData(0, 0, width, height);
184
+ const mask = child.layer.mask
185
+ ? maskCanvas(printableMask(child.layer.mask), width, height, lookup, coordinates(child.layer.mask, child))
186
+ .getContext('2d')
187
+ .getImageData(0, 0, width, height).data
188
+ : undefined;
189
+ for (let i = 0; i < before.data.length; i += 4) {
190
+ const amount = (child.layer.opacity * (mask?.[i + 3] ?? 255)) / 255;
191
+ const oldA = before.data[i + 3] / 255, newA = after.data[i + 3] / 255, alpha = oldA * (1 - amount) + newA * amount;
192
+ for (let c = 0; c < 3; c++)
193
+ before.data[i + c] = alpha
194
+ ? (before.data[i + c] * oldA * (1 - amount) + after.data[i + c] * newA * amount) /
195
+ alpha
196
+ : 0;
197
+ before.data[i + 3] = alpha * 255;
198
+ }
199
+ ctx.putImageData(before, 0, 0);
200
+ }
201
+ else {
202
+ ctx.globalCompositeOperation =
203
+ child.layer.blend_mode === 'normal' ? 'source-over' : child.layer.blend_mode;
204
+ const surface = renderNode(child);
205
+ ctx.drawImage(surface, 0, 0);
206
+ if (options.cache === false && !retained.has(child.layer.id)) {
207
+ cache.delete(child.layer.id);
208
+ surface.width = 1;
209
+ surface.height = 1;
210
+ }
211
+ }
212
+ }
213
+ ctx.globalCompositeOperation = 'source-over';
214
+ };
215
+ const renderNode = (node) => {
216
+ const hit = cache.get(node.layer.id);
217
+ if (hit)
218
+ return hit;
219
+ const key = keyFor(node), saved = options.cache === false ? undefined : this.surfaces.get(key);
220
+ if (saved) {
221
+ statistics.cached_layers++;
222
+ this.surfaces.delete(key);
223
+ this.surfaces.set(key, saved);
224
+ text.push(...saved.text);
225
+ cache.set(node.layer.id, saved.canvas);
226
+ return saved.canvas;
227
+ }
228
+ statistics.rasterized_layers++;
229
+ const textStart = text.length;
230
+ const layer = node.layer;
231
+ let canvas = fresh();
232
+ let ctx = canvas.getContext('2d');
233
+ if (!layer.visible || options.excludeLayers?.includes(layer.id)) {
234
+ cache.set(layer.id, canvas);
235
+ return canvas;
236
+ }
237
+ const w = node.bounds[2], h = node.bounds[3];
238
+ ctx.save();
239
+ ctx.setTransform(...node.matrix);
240
+ if (layer.type === 'vector') {
241
+ const shape = layer.shape;
242
+ ctx.fillStyle = shape.fill;
243
+ ctx.beginPath();
244
+ let path;
245
+ if (shape.type === 'rectangle')
246
+ ctx.roundRect(0, 0, w, h, Math.min(shape.radius, w / 2, h / 2));
247
+ if (shape.type === 'ellipse')
248
+ ctx.ellipse(w / 2, h / 2, w / 2, h / 2, 0, 0, Math.PI * 2);
249
+ if (shape.type === 'path')
250
+ path = new Path2D(shape.d);
251
+ if (path)
252
+ ctx.fill(path);
253
+ else
254
+ ctx.fill();
255
+ if (shape.stroke) {
256
+ ctx.strokeStyle = shape.stroke;
257
+ ctx.lineWidth = shape.stroke_width;
258
+ ctx.lineCap = shape.line_cap ?? 'butt';
259
+ ctx.lineJoin = shape.line_join ?? 'miter';
260
+ ctx.setLineDash(shape.dash ?? []);
261
+ ctx.lineDashOffset = shape.dash_offset ?? 0;
262
+ if (path)
263
+ ctx.stroke(path);
264
+ else
265
+ ctx.stroke();
266
+ }
267
+ }
268
+ if (layer.type === 'text') {
269
+ const diagnostic = layoutText(ctx, layer, w, h, customFonts.aliases);
270
+ text.push(diagnostic);
271
+ ctx.beginPath();
272
+ ctx.rect(0, 0, w, h);
273
+ ctx.clip();
274
+ ctx.fillStyle = layer.style.colour;
275
+ ctx.textBaseline = 'top';
276
+ ctx.textAlign = layer.style.align;
277
+ const x = layer.style.align === 'center' ? w / 2 : layer.style.align === 'right' ? w : 0;
278
+ if (diagnostic.spans) {
279
+ ctx.textAlign = 'left';
280
+ diagnostic.spans.forEach((line, i) => line.forEach((span) => {
281
+ ctx.font = fontStyle({ ...layer, style: { ...layer.style, weight: span.weight } }, customFonts.aliases);
282
+ ctx.fillStyle = span.colour;
283
+ ctx.fillText(span.text, span.x, i * layer.style.size * layer.style.line_height);
284
+ }));
285
+ }
286
+ else
287
+ diagnostic.lines.forEach((line, i) => ctx.fillText(line, x, i * layer.style.size * layer.style.line_height));
288
+ }
289
+ if (layer.type === 'asset' ||
290
+ layer.type === 'generated-asset' ||
291
+ (layer.type === 'raster' && layer.source)) {
292
+ const image = assets.images.get(layer.source);
293
+ ctx.beginPath();
294
+ ctx.rect(0, 0, w, h);
295
+ ctx.clip();
296
+ const placement = imagePlacement(layer, image.width, image.height, w, h);
297
+ if (layer.perspective) {
298
+ const local = createCanvas(Math.ceil(w), Math.ceil(h));
299
+ local.getContext('2d').drawImage(image, ...placement.crop, ...placement.destination);
300
+ ctx.drawImage(perspectiveImage(local, layer.perspective), 0, 0, w, h);
301
+ }
302
+ else
303
+ ctx.drawImage(image, ...placement.crop, ...placement.destination);
304
+ }
305
+ if (layer.type === 'procedural') {
306
+ const generator = layer.generator;
307
+ if (generator.type === 'solid')
308
+ ctx.fillStyle = generator.colour;
309
+ if (generator.type === 'gradient') {
310
+ const a = (generator.angle * Math.PI) / 180, dx = Math.cos(a), dy = Math.sin(a), span = Math.abs(w * dx) + Math.abs(h * dy);
311
+ const gradient = ctx.createLinearGradient(w / 2 - (dx * span) / 2, h / 2 - (dy * span) / 2, w / 2 + (dx * span) / 2, h / 2 + (dy * span) / 2);
312
+ gradient.addColorStop(0, generator.from);
313
+ gradient.addColorStop(1, generator.to);
314
+ ctx.fillStyle = gradient;
315
+ }
316
+ if (generator.type === 'noise') {
317
+ const noise = createCanvas(Math.ceil(w), Math.ceil(h)), nc = noise.getContext('2d'), data = nc.createImageData(noise.width, noise.height), random = seededRandom(generator.seed), colour = rgba(generator.colour);
318
+ for (let i = 0; i < data.data.length; i += 4) {
319
+ const n = (random() * 2 - 1) * generator.amount * 255;
320
+ for (let c = 0; c < 3; c++)
321
+ data.data[i + c] = colour[c] + n;
322
+ data.data[i + 3] = colour[3];
323
+ }
324
+ nc.putImageData(data, 0, 0);
325
+ ctx.drawImage(noise, 0, 0, w, h);
326
+ }
327
+ else
328
+ ctx.fillRect(0, 0, w, h);
329
+ }
330
+ ctx.restore();
331
+ if (layer.type === 'group')
332
+ compose(canvas, node.children);
333
+ // Effects precede scoped edits so blur cannot leak an edit beyond its scope.
334
+ for (const effect of layer.effects) {
335
+ const next = fresh(), c = next.getContext('2d');
336
+ c.filter = `blur(${effect.radius}px)`;
337
+ c.drawImage(canvas, 0, 0);
338
+ canvas = next;
339
+ }
340
+ ctx = canvas.getContext('2d');
341
+ for (const tile of layer.tiles) {
342
+ const tw = tile.pixels[0].length, th = tile.pixels.length, tc = createCanvas(tw, th), t = tc.getContext('2d'), data = t.createImageData(tw, th);
343
+ tile.pixels.forEach((row, y) => [...row].forEach((key, x) => data.data.set(rgba(tile.palette[key]), 4 * (y * tw + x))));
344
+ t.putImageData(data, 0, 0);
345
+ ctx.save();
346
+ if (tile.space === 'layer' || options.canvasTransform)
347
+ ctx.setTransform(...coordinates(tile, node));
348
+ ctx.imageSmoothingEnabled = false;
349
+ ctx.drawImage(tc, ...tile.bounds);
350
+ ctx.restore();
351
+ }
352
+ for (const op of layer.operations)
353
+ applyRasterOperation(canvas, operation(op), lookup, coordinates(op, node), op.mask ? coordinates(op.mask, node) : undefined);
354
+ for (const region of layer.regions ?? [])
355
+ renderDetail(canvas, region, node, lookup, assets.images, options.canvasTransform);
356
+ if (layer.mask) {
357
+ ctx.globalCompositeOperation = 'destination-in';
358
+ ctx.drawImage(maskCanvas(printableMask(layer.mask), width, height, lookup, coordinates(layer.mask, node)), 0, 0);
359
+ ctx.globalCompositeOperation = 'source-over';
360
+ }
361
+ if (layer.opacity !== 1) {
362
+ const next = fresh(), c = next.getContext('2d');
363
+ c.globalAlpha = layer.opacity;
364
+ c.drawImage(canvas, 0, 0);
365
+ canvas = next;
366
+ }
367
+ cache.set(layer.id, canvas);
368
+ if (options.cache !== false)
369
+ this.remember(key, canvas, text.slice(textStart));
370
+ return canvas;
371
+ };
372
+ let output = fresh();
373
+ if (options.layer)
374
+ output = lookup(options.layer);
375
+ else {
376
+ const ctx = output.getContext('2d');
377
+ ctx.fillStyle = scene.canvas.background;
378
+ ctx.fillRect(0, 0, width, height);
379
+ compose(output, nodes);
380
+ }
381
+ if (options.region) {
382
+ const [x, y, w, h] = options.region;
383
+ if (!options.region.every(Number.isInteger) ||
384
+ x < 0 ||
385
+ y < 0 ||
386
+ w <= 0 ||
387
+ h <= 0 ||
388
+ x + w > width ||
389
+ y + h > height)
390
+ throw new Error('Render region must be an integer rectangle inside the canvas');
391
+ const crop = createCanvas(w, h);
392
+ crop.getContext('2d').putImageData(output.getContext('2d').getImageData(x, y, w, h), 0, 0);
393
+ output = crop;
394
+ }
395
+ const quality = options.quality ?? 'final';
396
+ if (quality === 'draft') {
397
+ const draft = createCanvas(Math.max(1, Math.ceil(output.width / 2)), Math.max(1, Math.ceil(output.height / 2)));
398
+ draft.getContext('2d').drawImage(output, 0, 0, draft.width, draft.height);
399
+ output = draft;
400
+ }
401
+ const png = await output.encode('png');
402
+ return {
403
+ png,
404
+ pixels: output.getContext('2d').getImageData(0, 0, output.width, output.height).data,
405
+ width: output.width,
406
+ height: output.height,
407
+ text,
408
+ statistics: { ...statistics, cache_bytes: this.cacheBytes },
409
+ evidence: {
410
+ renderer: {
411
+ name: 'rtistree-skia',
412
+ version: RENDERER_VERSION,
413
+ backend: `@napi-rs/canvas@${canvasVersion}`,
414
+ node: process.version,
415
+ platform: process.platform,
416
+ arch: process.arch,
417
+ },
418
+ scene: { version: 1, hash: sceneHash(scene) },
419
+ assets: assets.hashes,
420
+ fonts,
421
+ render: {
422
+ width: output.width,
423
+ height: output.height,
424
+ colour_space: 'srgb',
425
+ quality,
426
+ region: options.region,
427
+ layer: options.layer,
428
+ png_hash: sha256(png),
429
+ ...(options.canvasTransform ? { canvas_transform: options.canvasTransform } : {}),
430
+ ...(options.excludeLayers?.length ? { excluded_layers: options.excludeLayers } : {}),
431
+ },
432
+ },
433
+ };
434
+ }
435
+ }
436
+ export const defaultRenderer = new SkiaRenderer();
437
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { SKRSContext2D } from './native.js';
2
+ import type { Layer } from './schema.js';
3
+ export interface TextSpan {
4
+ text: string;
5
+ x: number;
6
+ width: number;
7
+ colour: string;
8
+ weight: 'regular' | 'bold';
9
+ }
10
+ export declare function richLayout(ctx: SKRSContext2D, layer: Layer, width: number, font: (layer: Layer) => string): TextSpan[][];
@@ -0,0 +1,56 @@
1
+ export function richLayout(ctx, layer, width, font) {
2
+ const s = layer.style, runs = layer.runs;
3
+ const slices = [];
4
+ let cursor = 0;
5
+ for (const run of runs) {
6
+ slices.push({ start: cursor, end: cursor + run.text.length, run });
7
+ cursor += run.text.length;
8
+ }
9
+ const spans = (start, end) => slices
10
+ .filter((r) => r.start < end && r.end > start)
11
+ .map((r) => {
12
+ const text = layer.content.slice(Math.max(start, r.start), Math.min(end, r.end)), weight = r.run.weight ?? s.weight;
13
+ ctx.font = font({ ...layer, style: { ...s, weight } });
14
+ return {
15
+ text,
16
+ x: 0,
17
+ width: ctx.measureText(text).width,
18
+ colour: r.run.colour ?? s.colour,
19
+ weight,
20
+ };
21
+ });
22
+ const lines = [[]];
23
+ let used = 0, pending = [];
24
+ for (const match of layer.content.matchAll(/\n|[^\S\n]+|[^\s]+/g)) {
25
+ if (match[0] === '\n') {
26
+ lines.push([]);
27
+ used = 0;
28
+ pending = [];
29
+ continue;
30
+ }
31
+ const parts = spans(match.index, match.index + match[0].length);
32
+ if (/^\s+$/.test(match[0])) {
33
+ pending = parts;
34
+ continue;
35
+ }
36
+ const sum = (items) => items.reduce((a, b) => a + b.width, 0), pw = used ? sum(pending) : 0;
37
+ if (used && used + pw + sum(parts) > width) {
38
+ lines.push([]);
39
+ used = 0;
40
+ pending = [];
41
+ }
42
+ for (const part of [...(used ? pending : []), ...parts]) {
43
+ part.x = used;
44
+ lines.at(-1).push(part);
45
+ used += part.width;
46
+ }
47
+ pending = [];
48
+ }
49
+ for (const line of lines) {
50
+ const length = line.reduce((a, b) => a + b.width, 0), offset = s.align === 'center' ? (width - length) / 2 : s.align === 'right' ? width - length : 0;
51
+ for (const span of line)
52
+ span.x += offset;
53
+ }
54
+ return lines;
55
+ }
56
+ //# sourceMappingURL=rich-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-text.js","sourceRoot":"","sources":["../src/rich-text.ts"],"names":[],"mappings":"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"}