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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial.js","sourceRoot":"","sources":["../src/spatial.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ /** Also available to remote agents which cannot read local documentation files. */
2
+ export declare const studioReference: {
3
+ version: string;
4
+ techniques: {
5
+ version: string;
6
+ presets: {
7
+ oil: {
8
+ bristles: number;
9
+ dryness: number;
10
+ variation: number;
11
+ opacity: number;
12
+ taper: number;
13
+ };
14
+ filbert: {
15
+ bristles: number;
16
+ dryness: number;
17
+ variation: number;
18
+ opacity: number;
19
+ taper: number;
20
+ };
21
+ scumble: {
22
+ bristles: number;
23
+ dryness: number;
24
+ variation: number;
25
+ opacity: number;
26
+ taper: number;
27
+ };
28
+ ink: {
29
+ bristles: number;
30
+ dryness: number;
31
+ variation: number;
32
+ opacity: number;
33
+ taper: number;
34
+ };
35
+ };
36
+ palettes: {
37
+ storm: string[];
38
+ earth: string[];
39
+ ember: string[];
40
+ };
41
+ methods: {
42
+ stroke: string;
43
+ glaze: string;
44
+ mix: string;
45
+ atmosphere: string;
46
+ weave: string;
47
+ };
48
+ guidance: string;
49
+ };
50
+ art_direction: {
51
+ version: string;
52
+ agent_instructions: string;
53
+ purpose: string;
54
+ sequence: {
55
+ step: string;
56
+ deliverable: string;
57
+ stop: string;
58
+ }[];
59
+ subject_checks: {
60
+ articulated_figures: {
61
+ construction: string;
62
+ inspect: string;
63
+ blocking_examples: string[];
64
+ };
65
+ constructed_props: {
66
+ construction: string;
67
+ inspect: string;
68
+ blocking_examples: string[];
69
+ };
70
+ locomotion: {
71
+ construction: string;
72
+ inspect: string;
73
+ functional_checks: string[];
74
+ limitation: string;
75
+ };
76
+ };
77
+ acceptance: {
78
+ technical: string;
79
+ functional: string;
80
+ visual: string;
81
+ reporting: string;
82
+ partial_feedback: string;
83
+ unavailable_observation: string;
84
+ };
85
+ trial_lessons: {
86
+ case: string;
87
+ missed: string;
88
+ correction: string;
89
+ remaining: string;
90
+ }[];
91
+ starter_plan: {
92
+ id: string;
93
+ brief: string;
94
+ stages: ({
95
+ id: string;
96
+ goal: string;
97
+ minimum_alternatives: number;
98
+ require_references: boolean;
99
+ criteria: {
100
+ id: string;
101
+ description: string;
102
+ }[];
103
+ } | {
104
+ minimum_alternatives?: undefined;
105
+ require_references?: undefined;
106
+ id: string;
107
+ goal: string;
108
+ criteria: {
109
+ id: string;
110
+ description: string;
111
+ }[];
112
+ })[];
113
+ };
114
+ review_order: string[];
115
+ calibration: {
116
+ fail: string;
117
+ revise: string;
118
+ ready: string;
119
+ };
120
+ protocol: string;
121
+ instructions: string;
122
+ };
123
+ production: string;
124
+ contract: string;
125
+ execution: string;
126
+ limits: {
127
+ output_megapixels: number;
128
+ inputs: number;
129
+ helper_cumulative_megapixels: number;
130
+ edge: number;
131
+ source_kib: number;
132
+ parameters_kib: number;
133
+ timeout_ms: number[];
134
+ v8_heap_mib: number;
135
+ };
136
+ api: {
137
+ guides: string;
138
+ canvas: string;
139
+ raster: string;
140
+ pixels: string;
141
+ input: string;
142
+ brush: string;
143
+ noise: string;
144
+ coordinates: string;
145
+ sample: string;
146
+ warp: string;
147
+ displace: string;
148
+ blur: string;
149
+ lighting: string;
150
+ };
151
+ example: string;
152
+ edits: string;
153
+ };
@@ -0,0 +1,39 @@
1
+ import { artDirectionGuide } from './art-direction.js';
2
+ import { techniqueCatalog } from './techniques.js';
3
+ /** Also available to remote agents which cannot read local documentation files. */
4
+ export const studioReference = {
5
+ version: 'rtistree-studio/1',
6
+ techniques: techniqueCatalog,
7
+ art_direction: artDirectionGuide,
8
+ production: 'Use buildPipeline for explicit dependency-aware atomic builds. Node inputs reference nodes or registered assets; bindings subscribe to shared parameters. Graphs are pinned in scene metadata. Use production plan/capture/review/compare/select/advance for stage gates, immutable candidates and undoable selection. Ratings must come from viewing images. Native Canvas and raw pixels remain available.',
9
+ contract: 'Synchronous JavaScript body receives art and parameters and returns one Canvas of the declared width/height. Use runProgram with exactly one of code or project-local source. Baked PNGs and recipes are immutable; editing code requires explicit execution. Source/parameters/seed and frozen sRGB PNG inputs are recorded. No image-generation model is involved.',
10
+ execution: 'Only execute trusted code. Worker/VM isolation is not a security sandbox. API does not offer filesystem/network imports. Math.random uses the seeded RNG; Date/performance are absent. Canvas native allocations are not covered by the V8 heap limit.',
11
+ limits: {
12
+ output_megapixels: 16,
13
+ inputs: 16,
14
+ helper_cumulative_megapixels: 32,
15
+ edge: 8192,
16
+ source_kib: 256,
17
+ parameters_kib: 64,
18
+ timeout_ms: [50, 30000],
19
+ v8_heap_mib: 256,
20
+ },
21
+ api: {
22
+ guides: 'art.guides({points:{name:[x,y] | "otherName" | {anchor:"otherName",offset:[dx,dy]}},paths:{name:[{op:"M"|"L",to:pointRef}|{op:"Q",control:pointRef,to:pointRef}|{op:"C",control1:pointRef,control2:pointRef,to:pointRef}|{op:"Z"}]}}) returns {points,paths}. Paths are SVG path strings for art.path. References resolve recursively; cycles and missing points fail. Use joint landmarks and shared handles to edit construction coherently.',
23
+ canvas: 'art.canvas(width=art.width,height=art.height) → Canvas; use canvas.getContext("2d") for paths, transforms, gradients, compositing and text. art.path(svgPathData) returns a native Path2D for fill/stroke/clip. Bundled fonts: Rtistree-inter, Rtistree-inter-bold, Rtistree-display.',
24
+ raster: 'art.raster((x,y)=>[r,g,b,a], width?, height?) → Canvas; integer pixel-centre coordinates, four finite 0–255 channels, straight 8-bit sRGB RGBA.',
25
+ pixels: 'art.pixels(canvas) → {width,height,data:Uint8ClampedArray}. art.put(canvas,pixels) replaces its complete buffer. Semi-transparent samples pass through native premultiplied storage.',
26
+ input: 'art.input(name) → mutable Canvas copy of a frozen input asset named in the request inputs mapping.',
27
+ brush: 'art.brush(canvas,[{x,y,pressure?},...],{radius,colour:"#RRGGBB[AA]",hardness?,opacity?,spacing?,scatter?}) → canvas. Pressure affects radius/alpha; opacity is per dab; spacing is a fraction of radius. Uses current context transform.',
28
+ noise: 'art.noise(x,y,salt=0) → seeded interpolated value noise in 0–1. art.fbm(x,y,octaves=5,salt=0) → normalised octave sum. art.random() → deterministic sequential RNG.',
29
+ coordinates: 'art.polar(x,y,cx=0,cy=0) → {radius,angle}; art.repeat(value,period); art.clamp(value,min=0,max=1); art.mix(a,b,t); art.smoothstep(a,b,value).',
30
+ sample: 'art.sample(pixelSurface,x,y,edge="transparent") → RGBA. Bilinear premultiplied interpolation; edge is transparent, clamp or repeat.',
31
+ warp: 'art.warp(canvas,(x,y)=>[sourceX,sourceY],edge="transparent",width?,height?) → new Canvas. Inverse coordinate mapping supports arbitrary 2D warps and repetition.',
32
+ displace: 'art.displace(canvas,(x,y)=>[dx,dy],amount=1,edge="transparent") → new Canvas, samples source at x+dx*amount,y+dy*amount.',
33
+ blur: 'art.blur(canvas,radius) → new Canvas; radius 0–128, transparent boundary.',
34
+ lighting: 'art.normal(heightFn,x,y,strength=1,step=1) → surface normal from central differences. art.light(normal,[r,g,b,a],{light:[x,y,z]?,ambient?,diffuse?,specular?,shininess?}) → RGBA using Lambert diffuse and Blinn–Phong specular, viewer along +Z. Artistic 2.5D shading, not ray tracing.',
35
+ },
36
+ example: 'return art.raster((x,y) => { const n=art.fbm(x/35,y/35); return [35+n*40,40+n*35,45+n*30,255]; });',
37
+ edits: 'readRasterRegion reads exact canvas-space PNG pixels and a scene hash. writeRasterRegion consumes an exact-size project-local PNG and that expected_hash, with replace/over semantics and canvas/layer coordinates. Layer-space patches capture reference dimensions and follow transforms. Layer effects/masks can change patch appearance; locality guards reject outward leakage.',
38
+ };
39
+ //# sourceMappingURL=studio-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-reference.js","sourceRoot":"","sources":["../src/studio-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,mFAAmF;AACnF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,mBAAmB;IAC5B,UAAU,EAAE,gBAAgB;IAC5B,aAAa,EAAE,iBAAiB;IAChC,UAAU,EACR,8YAA8Y;IAChZ,QAAQ,EACN,sWAAsW;IACxW,SAAS,EACP,wPAAwP;IAC1P,MAAM,EAAE;QACN,iBAAiB,EAAE,EAAE;QACrB,MAAM,EAAE,EAAE;QACV,4BAA4B,EAAE,EAAE;QAChC,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,GAAG;QACf,cAAc,EAAE,EAAE;QAClB,UAAU,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC;QACvB,WAAW,EAAE,GAAG;KACjB;IACD,GAAG,EAAE;QACH,MAAM,EACJ,gbAAgb;QAClb,MAAM,EACJ,uRAAuR;QACzR,MAAM,EACJ,iJAAiJ;QACnJ,MAAM,EACJ,sLAAsL;QACxL,KAAK,EACH,oGAAoG;QACtG,KAAK,EACH,0OAA0O;QAC5O,KAAK,EACH,qKAAqK;QACvK,WAAW,EACT,+IAA+I;QACjJ,MAAM,EACJ,qIAAqI;QACvI,IAAI,EAAE,kKAAkK;QACxK,QAAQ,EACN,0HAA0H;QAC5H,IAAI,EAAE,2EAA2E;QACjF,QAAQ,EACN,2RAA2R;KAC9R;IACD,OAAO,EACL,oGAAoG;IACtG,KAAK,EACH,sXAAsX;CACzX,CAAC"}
package/dist/svg.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { type Scene } from './schema.js';
2
+ import { type Renderer } from './render.js';
3
+ /** Deliberately closed static geometry subset: reject unsupported features rather than dropping them. */
4
+ export declare function importSvg(xml: string, prefix?: string): Scene;
5
+ export declare function exportSvg(scene: Scene, root: string, renderer: Renderer): Promise<Buffer<ArrayBuffer>>;
package/dist/svg.js ADDED
@@ -0,0 +1,315 @@
1
+ import { XMLParser, XMLValidator } from 'fast-xml-parser';
2
+ import { Path2D, createCanvas, SvgExportFlag } from './native.js';
3
+ import { multiply, identity, exportLayers, resolveLayout } from './layout.js';
4
+ import { parseScene } from './schema.js';
5
+ import { shapePath } from './graphics.js';
6
+ import { layoutText, fontStyle } from './render.js';
7
+ import { registerFonts, registerProjectFonts } from './assets.js';
8
+ const escape = (text) => text
9
+ .replaceAll('&', '&amp;')
10
+ .replaceAll('<', '&lt;')
11
+ .replaceAll('>', '&gt;')
12
+ .replaceAll('"', '&quot;');
13
+ function transformation(value) {
14
+ if (!value)
15
+ return [...identity];
16
+ let matrix = [...identity], remaining = value;
17
+ for (const m of value.matchAll(/(matrix|translate|scale|rotate)\s*\(([^)]*)\)/g)) {
18
+ remaining = remaining.replace(m[0], '');
19
+ const v = m[2]
20
+ .trim()
21
+ .split(/[\s,]+/)
22
+ .map(Number);
23
+ if (v.some((n) => !Number.isFinite(n)))
24
+ throw new Error('Invalid SVG transform');
25
+ let next;
26
+ if (m[1] === 'matrix' && v.length === 6)
27
+ next = v;
28
+ else if (m[1] === 'translate' && v.length <= 2)
29
+ next = [1, 0, 0, 1, v[0], v[1] ?? 0];
30
+ else if (m[1] === 'scale' && v.length <= 2)
31
+ next = [v[0], 0, 0, v[1] ?? v[0], 0, 0];
32
+ else if (m[1] === 'rotate' && (v.length === 1 || v.length === 3)) {
33
+ const r = (v[0] * Math.PI) / 180, x = v[1] ?? 0, y = v[2] ?? 0;
34
+ next = multiply(multiply([1, 0, 0, 1, x, y], [Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0]), [1, 0, 0, 1, -x, -y]);
35
+ }
36
+ else
37
+ throw new Error('Unsupported SVG transform');
38
+ matrix = multiply(matrix, next);
39
+ }
40
+ if (remaining.trim())
41
+ throw new Error('Unsupported SVG transform');
42
+ return matrix;
43
+ }
44
+ /** Deliberately closed static geometry subset: reject unsupported features rather than dropping them. */
45
+ export function importSvg(xml, prefix = 'svg') {
46
+ if (xml.length > 8 * 1024 * 1024 || /<!DOCTYPE|<!ENTITY|<script|<foreignObject/i.test(xml))
47
+ throw new Error('Unsupported or unsafe SVG input');
48
+ if (XMLValidator.validate(xml) !== true)
49
+ throw new Error('Invalid SVG XML');
50
+ const tree = new XMLParser({
51
+ ignoreAttributes: false,
52
+ preserveOrder: true,
53
+ parseTagValue: false,
54
+ processEntities: false,
55
+ }).parse(xml);
56
+ const root = tree.find((n) => n.svg);
57
+ if (!root)
58
+ throw new Error('SVG root required');
59
+ const attrs = (node) => Object.fromEntries(Object.entries(node[':@'] ?? {}).map(([k, v]) => [k.slice(2), String(v)]));
60
+ const a = attrs(root), vb = (a.viewBox ?? '').split(/[ ,]+/).map(Number);
61
+ const number = (value, fallback = 0) => {
62
+ if (value === undefined)
63
+ return fallback;
64
+ if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:px)?$/i.test(value))
65
+ throw new Error('SVG subset requires numeric or px lengths');
66
+ return parseFloat(value);
67
+ };
68
+ const width = number(a.width, vb[2]), height = number(a.height, vb[3]);
69
+ if (!width || !height)
70
+ throw new Error('SVG needs width/height or viewBox');
71
+ let count = 0;
72
+ const colour = (v, fallback = '#000000') => {
73
+ if (v === undefined)
74
+ return fallback;
75
+ if (v === 'none')
76
+ return '#00000000';
77
+ if (/^#[0-9a-f]{6}(?:[0-9a-f]{2})?$/i.test(v))
78
+ return v;
79
+ if (/^#[0-9a-f]{3}$/i.test(v))
80
+ return '#' + [...v.slice(1)].map((c) => c + c).join('');
81
+ const names = {
82
+ black: '#000000',
83
+ white: '#ffffff',
84
+ red: '#ff0000',
85
+ green: '#008000',
86
+ blue: '#0000ff',
87
+ transparent: '#00000000',
88
+ };
89
+ if (names[v])
90
+ return names[v];
91
+ throw new Error(`Unsupported SVG colour ${v}`);
92
+ };
93
+ function walk(nodes, inherited = {}) {
94
+ const result = [];
95
+ for (const node of nodes) {
96
+ const tag = Object.keys(node).find((k) => k !== ':@');
97
+ if (tag === '#text' || tag === '#comment' || tag.startsWith('?'))
98
+ continue;
99
+ if (tag === 'title' || tag === 'desc')
100
+ continue;
101
+ const own = attrs(node), at = { ...inherited, ...own };
102
+ if (own.style)
103
+ for (const declaration of own.style.split(';').filter(Boolean)) {
104
+ const [k, v] = declaration.split(':');
105
+ at[k.trim()] = v.trim();
106
+ }
107
+ const allowed = new Set([
108
+ 'id',
109
+ 'fill',
110
+ 'stroke',
111
+ 'stroke-width',
112
+ 'stroke-linecap',
113
+ 'stroke-linejoin',
114
+ 'stroke-dasharray',
115
+ 'stroke-dashoffset',
116
+ 'opacity',
117
+ 'fill-opacity',
118
+ 'stroke-opacity',
119
+ 'transform',
120
+ 'style',
121
+ 'x',
122
+ 'y',
123
+ 'width',
124
+ 'height',
125
+ 'rx',
126
+ 'ry',
127
+ 'cx',
128
+ 'cy',
129
+ 'r',
130
+ 'd',
131
+ 'points',
132
+ 'x1',
133
+ 'x2',
134
+ 'y1',
135
+ 'y2',
136
+ ]);
137
+ for (const key of Object.keys(at))
138
+ if (!allowed.has(key))
139
+ throw new Error(`Unsupported SVG attribute ${key}`);
140
+ const id = `${prefix}${++count}`, opacity = number(own.opacity, 1), affine = transformation(own.transform);
141
+ const styleKeys = [
142
+ 'fill',
143
+ 'stroke',
144
+ 'stroke-width',
145
+ 'stroke-linecap',
146
+ 'stroke-linejoin',
147
+ 'stroke-dasharray',
148
+ 'stroke-dashoffset',
149
+ 'fill-opacity',
150
+ 'stroke-opacity',
151
+ ];
152
+ const next = Object.fromEntries(styleKeys.filter((k) => at[k] !== undefined).map((k) => [k, at[k]]));
153
+ if (tag === 'g') {
154
+ result.push({
155
+ id,
156
+ type: 'group',
157
+ bounds: [0, 0, width, height],
158
+ opacity,
159
+ affine,
160
+ children: walk(node[tag], next),
161
+ });
162
+ continue;
163
+ }
164
+ const p = new Path2D(tag === 'path' ? at.d : undefined);
165
+ if (tag === 'rect') {
166
+ const x = number(at.x), y = number(at.y), w = number(at.width), h = number(at.height);
167
+ p.roundRect(x, y, w, h, Math.min(number(at.rx), w / 2, h / 2));
168
+ }
169
+ else if (tag === 'circle' || tag === 'ellipse') {
170
+ const rx = number(at.r ?? at.rx), ry = number(at.r ?? at.ry);
171
+ p.ellipse(number(at.cx), number(at.cy), rx, ry, 0, 0, Math.PI * 2);
172
+ }
173
+ else if (tag === 'line') {
174
+ p.moveTo(number(at.x1), number(at.y1));
175
+ p.lineTo(number(at.x2), number(at.y2));
176
+ }
177
+ else if (tag === 'polygon' || tag === 'polyline') {
178
+ const points = (at.points ?? '').trim().split(/[ ,]+/).map(Number);
179
+ if (points.length < 4 || points.length % 2 || points.some((v) => !Number.isFinite(v)))
180
+ throw new Error('Invalid SVG points');
181
+ for (let i = 0; i < points.length; i += 2)
182
+ i ? p.lineTo(points[i], points[i + 1]) : p.moveTo(points[i], points[i + 1]);
183
+ if (tag === 'polygon')
184
+ p.closePath();
185
+ }
186
+ else if (tag !== 'path')
187
+ throw new Error(`Unsupported SVG element ${tag}; import static paths or flatten externally`);
188
+ if (at['fill-opacity'] || at['stroke-opacity'])
189
+ throw new Error('Separate SVG fill/stroke opacity is not supported; use group opacity');
190
+ result.push({
191
+ id,
192
+ type: 'vector',
193
+ bounds: [0, 0, width, height],
194
+ opacity,
195
+ affine,
196
+ shape: {
197
+ type: 'path',
198
+ d: p.toSVGString(),
199
+ fill: colour(at.fill),
200
+ stroke: at.stroke ? colour(at.stroke) : undefined,
201
+ stroke_width: number(at['stroke-width'], 1),
202
+ line_cap: at['stroke-linecap'],
203
+ line_join: at['stroke-linejoin'],
204
+ dash: at['stroke-dasharray'] && at['stroke-dasharray'] !== 'none'
205
+ ? at['stroke-dasharray'].split(/[ ,]+/).map(Number)
206
+ : undefined,
207
+ dash_offset: number(at['stroke-dashoffset']),
208
+ },
209
+ });
210
+ }
211
+ return result;
212
+ }
213
+ const layers = walk(root.svg);
214
+ const scene = {
215
+ version: 1,
216
+ canvas: { width: Math.round(width), height: Math.round(height) },
217
+ layers: vb.length === 4
218
+ ? [
219
+ {
220
+ id: `${prefix}Root`,
221
+ type: 'group',
222
+ bounds: [0, 0, width, height],
223
+ affine: [
224
+ width / vb[2],
225
+ 0,
226
+ 0,
227
+ height / vb[3],
228
+ (-vb[0] * width) / vb[2],
229
+ (-vb[1] * height) / vb[3],
230
+ ],
231
+ children: layers,
232
+ },
233
+ ]
234
+ : layers,
235
+ };
236
+ return parseScene(scene);
237
+ }
238
+ export async function exportSvg(scene, root, renderer) {
239
+ await registerFonts();
240
+ const aliases = (await registerProjectFonts(scene, root)).aliases;
241
+ const { width, height } = scene.canvas, parts = [
242
+ `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">`,
243
+ ];
244
+ parts.push(`<rect width="100%" height="100%" fill="${scene.canvas.background.slice(0, 7)}" opacity="${scene.canvas.background.length === 9 ? parseInt(scene.canvas.background.slice(7), 16) / 255 : 1}"/>`);
245
+ // Text becomes exact vector outlines via the native SVG canvas; other complex content is embedded losslessly.
246
+ const requiresComposite = scene.layers.some((l) => l.type === 'adjustment' || l.blend_mode !== 'normal');
247
+ const raster = async (id) => {
248
+ const r = await renderer.render(scene, root, { cache: false, layer: id });
249
+ parts.push(`<image width="${width}" height="${height}" href="data:image/png;base64,${r.png.toString('base64')}"/>`);
250
+ };
251
+ if (requiresComposite)
252
+ await raster();
253
+ else
254
+ for (const n of exportLayers(resolveLayout(scene))) {
255
+ const l = n.layer;
256
+ if (!l.visible)
257
+ continue;
258
+ if (l.type === 'text' &&
259
+ !l.mask &&
260
+ !l.effects.length &&
261
+ !l.operations.length &&
262
+ !l.tiles.length &&
263
+ !l.regions?.length) {
264
+ const canvas = createCanvas(width, height, SvgExportFlag.ConvertTextToPaths), ctx = canvas.getContext('2d');
265
+ ctx.setTransform(...n.matrix);
266
+ ctx.globalAlpha = l.opacity;
267
+ const diagnostic = layoutText(ctx, l, n.bounds[2], n.bounds[3], aliases), s = l.style;
268
+ ctx.beginPath();
269
+ ctx.rect(0, 0, n.bounds[2], n.bounds[3]);
270
+ ctx.clip();
271
+ ctx.textBaseline = 'top';
272
+ ctx.textAlign = 'left';
273
+ if (diagnostic.spans)
274
+ diagnostic.spans.forEach((line, i) => line.forEach((span) => {
275
+ ctx.font = fontStyle({ ...l, style: { ...s, weight: span.weight } }, aliases);
276
+ ctx.fillStyle = span.colour;
277
+ ctx.fillText(span.text, span.x, i * s.size * s.line_height);
278
+ }));
279
+ else {
280
+ ctx.font = fontStyle(l, aliases);
281
+ ctx.fillStyle = s.colour;
282
+ diagnostic.lines.forEach((line, i) => {
283
+ const measure = ctx.measureText(line).width, x = s.align === 'center'
284
+ ? (n.bounds[2] - measure) / 2
285
+ : s.align === 'right'
286
+ ? n.bounds[2] - measure
287
+ : 0;
288
+ ctx.fillText(line, x, i * s.size * s.line_height);
289
+ });
290
+ }
291
+ let svg = canvas.getContent().toString();
292
+ svg = svg
293
+ .replace(/<\?xml[^>]*>/g, '')
294
+ .replaceAll('id="', `id="${l.id}-`)
295
+ .replaceAll('url(#', `url(#${l.id}-`)
296
+ .replaceAll('href="#', `href="#${l.id}-`);
297
+ parts.push(svg);
298
+ continue;
299
+ }
300
+ if (l.type !== 'vector' ||
301
+ l.effects.length ||
302
+ l.mask ||
303
+ l.operations.length ||
304
+ l.tiles.length ||
305
+ l.regions?.length) {
306
+ await raster(l.id);
307
+ continue;
308
+ }
309
+ const s = l.shape, attr = (name, value) => value === undefined ? '' : ` ${name}="${escape(String(value))}"`;
310
+ parts.push(`<path d="${escape(shapePath(l, n.bounds[2], n.bounds[3]).toSVGString())}" transform="matrix(${n.matrix.join(' ')})" opacity="${l.opacity}" fill="${s.fill.slice(0, 7)}" fill-opacity="${s.fill.length === 9 ? parseInt(s.fill.slice(7), 16) / 255 : 1}"${attr('stroke', s.stroke?.slice(0, 7))}${attr('stroke-opacity', s.stroke?.length === 9 ? parseInt(s.stroke.slice(7), 16) / 255 : undefined)}${attr('stroke-width', s.stroke_width)}${attr('stroke-linecap', s.line_cap)}${attr('stroke-linejoin', s.line_join)}${attr('stroke-dasharray', s.dash?.join(' '))}${attr('stroke-dashoffset', s.dash_offset)}/>`);
311
+ }
312
+ parts.push('</svg>');
313
+ return Buffer.from(parts.join('\n'));
314
+ }
315
+ //# sourceMappingURL=svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { Canvas } from './native.js';
2
+ import type { BrushPoint } from './raster-studio.js';
3
+ export declare const TECHNIQUE_VERSION = "rtistree-techniques/1";
4
+ export declare const techniqueCatalog: {
5
+ version: string;
6
+ presets: {
7
+ oil: {
8
+ bristles: number;
9
+ dryness: number;
10
+ variation: number;
11
+ opacity: number;
12
+ taper: number;
13
+ };
14
+ filbert: {
15
+ bristles: number;
16
+ dryness: number;
17
+ variation: number;
18
+ opacity: number;
19
+ taper: number;
20
+ };
21
+ scumble: {
22
+ bristles: number;
23
+ dryness: number;
24
+ variation: number;
25
+ opacity: number;
26
+ taper: number;
27
+ };
28
+ ink: {
29
+ bristles: number;
30
+ dryness: number;
31
+ variation: number;
32
+ opacity: number;
33
+ taper: number;
34
+ };
35
+ };
36
+ palettes: {
37
+ storm: string[];
38
+ earth: string[];
39
+ ember: string[];
40
+ };
41
+ methods: {
42
+ stroke: string;
43
+ glaze: string;
44
+ mix: string;
45
+ atmosphere: string;
46
+ weave: string;
47
+ };
48
+ guidance: string;
49
+ };
50
+ type Preset = keyof typeof techniqueCatalog.presets;
51
+ export interface PaintOptions {
52
+ preset?: Preset;
53
+ size: number;
54
+ colour: string;
55
+ opacity?: number;
56
+ dryness?: number;
57
+ variation?: number;
58
+ bristles?: number;
59
+ taper?: number;
60
+ smoothing?: number;
61
+ }
62
+ declare const mix: (a: string, b: string, t: number) => string;
63
+ export declare function createTechniques(random: () => number): {
64
+ mix: typeof mix;
65
+ atmosphere: typeof mix;
66
+ stroke(canvas: Canvas, points: BrushPoint[], options: PaintOptions): Canvas;
67
+ glaze(canvas: Canvas, colour: string, opacity?: number): Canvas;
68
+ weave(canvas: Canvas, options?: {
69
+ spacing?: number;
70
+ opacity?: number;
71
+ colour?: string;
72
+ }): Canvas;
73
+ };
74
+ export {};