@oh-just-another/renderer-core 0.60.0 → 0.61.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 (154) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/caches/edge-cache-bitmap.d.ts.map +1 -0
  4. package/dist/caches/edge-cache-bitmap.js.map +1 -0
  5. package/dist/caches/edge-cache.d.ts.map +1 -0
  6. package/dist/caches/edge-cache.js.map +1 -0
  7. package/dist/caches/layer-cache-composite.d.ts.map +1 -0
  8. package/dist/caches/layer-cache-composite.js.map +1 -0
  9. package/dist/caches/lru-cache.d.ts.map +1 -0
  10. package/dist/caches/lru-cache.js.map +1 -0
  11. package/dist/caches/shape-cache-bitmap.d.ts.map +1 -0
  12. package/dist/caches/shape-cache-bitmap.js.map +1 -0
  13. package/dist/caches/shape-cache.d.ts.map +1 -0
  14. package/dist/caches/shape-cache.js.map +1 -0
  15. package/dist/caches/tile-renderer.d.ts.map +1 -0
  16. package/dist/caches/tile-renderer.js.map +1 -0
  17. package/dist/constants.d.ts +95 -9
  18. package/dist/constants.d.ts.map +1 -1
  19. package/dist/constants.js +98 -11
  20. package/dist/constants.js.map +1 -1
  21. package/dist/index.d.ts +40 -37
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +24 -21
  24. package/dist/index.js.map +1 -1
  25. package/dist/raster/animation-adapter.d.ts.map +1 -0
  26. package/dist/raster/animation-adapter.js.map +1 -0
  27. package/dist/raster/image-source-guard.d.ts +2 -0
  28. package/dist/raster/image-source-guard.d.ts.map +1 -0
  29. package/dist/raster/image-source-guard.js +44 -0
  30. package/dist/raster/image-source-guard.js.map +1 -0
  31. package/dist/raster/js-rasterizer.d.ts.map +1 -0
  32. package/dist/raster/js-rasterizer.js.map +1 -0
  33. package/dist/raster/rasterizer.d.ts.map +1 -0
  34. package/dist/raster/rasterizer.js.map +1 -0
  35. package/dist/raster/wasm-bytes.d.ts.map +1 -0
  36. package/dist/raster/wasm-bytes.js.map +1 -0
  37. package/dist/rendering/built-in-renderers.d.ts +85 -0
  38. package/dist/rendering/built-in-renderers.d.ts.map +1 -0
  39. package/dist/rendering/built-in-renderers.js +1087 -0
  40. package/dist/rendering/built-in-renderers.js.map +1 -0
  41. package/dist/{edge-renderer.d.ts → rendering/edge-renderer.d.ts} +3 -3
  42. package/dist/rendering/edge-renderer.d.ts.map +1 -0
  43. package/dist/{edge-renderer.js → rendering/edge-renderer.js} +4 -4
  44. package/dist/rendering/edge-renderer.js.map +1 -0
  45. package/dist/{grid-renderer.d.ts → rendering/grid-renderer.d.ts} +1 -1
  46. package/dist/rendering/grid-renderer.d.ts.map +1 -0
  47. package/dist/{grid-renderer.js → rendering/grid-renderer.js} +1 -1
  48. package/dist/rendering/grid-renderer.js.map +1 -0
  49. package/dist/rendering/lod.d.ts +26 -0
  50. package/dist/rendering/lod.d.ts.map +1 -0
  51. package/dist/rendering/lod.js +5 -0
  52. package/dist/rendering/lod.js.map +1 -0
  53. package/dist/{scene-renderer.d.ts → rendering/scene-renderer.d.ts} +21 -21
  54. package/dist/rendering/scene-renderer.d.ts.map +1 -0
  55. package/dist/{scene-renderer.js → rendering/scene-renderer.js} +26 -9
  56. package/dist/rendering/scene-renderer.js.map +1 -0
  57. package/dist/{shape-renderer.d.ts → rendering/shape-renderer.d.ts} +32 -2
  58. package/dist/rendering/shape-renderer.d.ts.map +1 -0
  59. package/dist/rendering/shape-renderer.js.map +1 -0
  60. package/dist/targets/dim-target.d.ts.map +1 -0
  61. package/dist/targets/dim-target.js.map +1 -0
  62. package/dist/targets/layers.d.ts.map +1 -0
  63. package/dist/targets/layers.js.map +1 -0
  64. package/dist/{render-target.d.ts → targets/render-target.d.ts} +8 -0
  65. package/dist/targets/render-target.d.ts.map +1 -0
  66. package/dist/targets/render-target.js.map +1 -0
  67. package/dist/{text-editing.d.ts → text/text-editing.d.ts} +22 -1
  68. package/dist/text/text-editing.d.ts.map +1 -0
  69. package/dist/{text-editing.js → text/text-editing.js} +53 -12
  70. package/dist/text/text-editing.js.map +1 -0
  71. package/dist/{text-layout.d.ts → text/text-layout.d.ts} +1 -1
  72. package/dist/text/text-layout.d.ts.map +1 -0
  73. package/dist/text/text-layout.js.map +1 -0
  74. package/dist/{text-shaper.d.ts → text/text-shaper.d.ts} +9 -1
  75. package/dist/text/text-shaper.d.ts.map +1 -0
  76. package/dist/text/text-shaper.js +32 -0
  77. package/dist/text/text-shaper.js.map +1 -0
  78. package/package.json +3 -3
  79. package/dist/animation-adapter.d.ts.map +0 -1
  80. package/dist/animation-adapter.js.map +0 -1
  81. package/dist/built-in-renderers.d.ts +0 -25
  82. package/dist/built-in-renderers.d.ts.map +0 -1
  83. package/dist/built-in-renderers.js +0 -601
  84. package/dist/built-in-renderers.js.map +0 -1
  85. package/dist/dim-target.d.ts.map +0 -1
  86. package/dist/dim-target.js.map +0 -1
  87. package/dist/edge-cache-bitmap.d.ts.map +0 -1
  88. package/dist/edge-cache-bitmap.js.map +0 -1
  89. package/dist/edge-cache.d.ts.map +0 -1
  90. package/dist/edge-cache.js.map +0 -1
  91. package/dist/edge-renderer.d.ts.map +0 -1
  92. package/dist/edge-renderer.js.map +0 -1
  93. package/dist/grid-renderer.d.ts.map +0 -1
  94. package/dist/grid-renderer.js.map +0 -1
  95. package/dist/js-rasterizer.d.ts.map +0 -1
  96. package/dist/js-rasterizer.js.map +0 -1
  97. package/dist/layer-cache-composite.d.ts.map +0 -1
  98. package/dist/layer-cache-composite.js.map +0 -1
  99. package/dist/layers.d.ts.map +0 -1
  100. package/dist/layers.js.map +0 -1
  101. package/dist/lru-cache.d.ts.map +0 -1
  102. package/dist/lru-cache.js.map +0 -1
  103. package/dist/rasterizer.d.ts.map +0 -1
  104. package/dist/rasterizer.js.map +0 -1
  105. package/dist/render-target.d.ts.map +0 -1
  106. package/dist/render-target.js.map +0 -1
  107. package/dist/scene-renderer.d.ts.map +0 -1
  108. package/dist/scene-renderer.js.map +0 -1
  109. package/dist/shape-cache-bitmap.d.ts.map +0 -1
  110. package/dist/shape-cache-bitmap.js.map +0 -1
  111. package/dist/shape-cache.d.ts.map +0 -1
  112. package/dist/shape-cache.js.map +0 -1
  113. package/dist/shape-renderer.d.ts.map +0 -1
  114. package/dist/shape-renderer.js.map +0 -1
  115. package/dist/text-editing.d.ts.map +0 -1
  116. package/dist/text-editing.js.map +0 -1
  117. package/dist/text-layout.d.ts.map +0 -1
  118. package/dist/text-layout.js.map +0 -1
  119. package/dist/text-shaper.d.ts.map +0 -1
  120. package/dist/text-shaper.js +0 -16
  121. package/dist/text-shaper.js.map +0 -1
  122. package/dist/tile-renderer.d.ts.map +0 -1
  123. package/dist/tile-renderer.js.map +0 -1
  124. package/dist/wasm-bytes.d.ts.map +0 -1
  125. package/dist/wasm-bytes.js.map +0 -1
  126. /package/dist/{edge-cache-bitmap.d.ts → caches/edge-cache-bitmap.d.ts} +0 -0
  127. /package/dist/{edge-cache-bitmap.js → caches/edge-cache-bitmap.js} +0 -0
  128. /package/dist/{edge-cache.d.ts → caches/edge-cache.d.ts} +0 -0
  129. /package/dist/{edge-cache.js → caches/edge-cache.js} +0 -0
  130. /package/dist/{layer-cache-composite.d.ts → caches/layer-cache-composite.d.ts} +0 -0
  131. /package/dist/{layer-cache-composite.js → caches/layer-cache-composite.js} +0 -0
  132. /package/dist/{lru-cache.d.ts → caches/lru-cache.d.ts} +0 -0
  133. /package/dist/{lru-cache.js → caches/lru-cache.js} +0 -0
  134. /package/dist/{shape-cache-bitmap.d.ts → caches/shape-cache-bitmap.d.ts} +0 -0
  135. /package/dist/{shape-cache-bitmap.js → caches/shape-cache-bitmap.js} +0 -0
  136. /package/dist/{shape-cache.d.ts → caches/shape-cache.d.ts} +0 -0
  137. /package/dist/{shape-cache.js → caches/shape-cache.js} +0 -0
  138. /package/dist/{tile-renderer.d.ts → caches/tile-renderer.d.ts} +0 -0
  139. /package/dist/{tile-renderer.js → caches/tile-renderer.js} +0 -0
  140. /package/dist/{animation-adapter.d.ts → raster/animation-adapter.d.ts} +0 -0
  141. /package/dist/{animation-adapter.js → raster/animation-adapter.js} +0 -0
  142. /package/dist/{js-rasterizer.d.ts → raster/js-rasterizer.d.ts} +0 -0
  143. /package/dist/{js-rasterizer.js → raster/js-rasterizer.js} +0 -0
  144. /package/dist/{rasterizer.d.ts → raster/rasterizer.d.ts} +0 -0
  145. /package/dist/{rasterizer.js → raster/rasterizer.js} +0 -0
  146. /package/dist/{wasm-bytes.d.ts → raster/wasm-bytes.d.ts} +0 -0
  147. /package/dist/{wasm-bytes.js → raster/wasm-bytes.js} +0 -0
  148. /package/dist/{shape-renderer.js → rendering/shape-renderer.js} +0 -0
  149. /package/dist/{dim-target.d.ts → targets/dim-target.d.ts} +0 -0
  150. /package/dist/{dim-target.js → targets/dim-target.js} +0 -0
  151. /package/dist/{layers.d.ts → targets/layers.d.ts} +0 -0
  152. /package/dist/{layers.js → targets/layers.js} +0 -0
  153. /package/dist/{render-target.js → targets/render-target.js} +0 -0
  154. /package/dist/{text-layout.js → text/text-layout.js} +0 -0
@@ -1,9 +1,12 @@
1
1
  import { req } from "@oh-just-another/types";
2
+ import { LIST_INDENT_EM } from "../constants.js";
2
3
  /** Default multiplier from font size to line height (matches `drawText`). */
3
4
  export const DEFAULT_LINE_HEIGHT_FACTOR = 1.2;
4
- const wrapParagraph = (para, base, maxWidth, measure, out) => {
5
+ const wrapParagraph = (para, base, maxWidth, measure, out, paraIndex, indentX) => {
6
+ const lineBase = { indentX, para: paraIndex };
7
+ const first = () => out.length === 0 || req(out[out.length - 1]).para !== paraIndex;
5
8
  if (para === "") {
6
- out.push({ text: "", start: base, end: base, width: 0 });
9
+ out.push({ text: "", start: base, end: base, width: 0, ...lineBase, paraFirst: first() });
7
10
  return;
8
11
  }
9
12
  // Word spans (non-whitespace runs) with offsets relative to `para`.
@@ -14,7 +17,14 @@ const wrapParagraph = (para, base, maxWidth, measure, out) => {
14
17
  words.push({ s: m.index, e: m.index + m[0].length });
15
18
  if (words.length === 0) {
16
19
  // Whitespace-only paragraph — keep it as one line so offsets survive.
17
- out.push({ text: para, start: base, end: base + para.length, width: measure(para) });
20
+ out.push({
21
+ text: para,
22
+ start: base,
23
+ end: base + para.length,
24
+ width: measure(para),
25
+ ...lineBase,
26
+ paraFirst: first(),
27
+ });
18
28
  return;
19
29
  }
20
30
  // `white-space: pre-wrap` + `overflow-wrap: break-word` (standard):
@@ -28,7 +38,14 @@ const wrapParagraph = (para, base, maxWidth, measure, out) => {
28
38
  let lineStart = 0;
29
39
  const push = (start, end) => {
30
40
  const text = para.slice(start, end);
31
- out.push({ text, start: base + start, end: base + end, width: measure(text) });
41
+ out.push({
42
+ text,
43
+ start: base + start,
44
+ end: base + end,
45
+ width: measure(text),
46
+ ...lineBase,
47
+ paraFirst: first(),
48
+ });
32
49
  };
33
50
  let i = 0;
34
51
  while (i < words.length) {
@@ -71,23 +88,40 @@ export const layoutText = (text, measure, options) => {
71
88
  const lineHeight = options.fontSize * (options.lineHeightFactor ?? DEFAULT_LINE_HEIGHT_FACTOR);
72
89
  const lines = [];
73
90
  let paraStart = 0;
91
+ let paraIndex = 0;
74
92
  for (let i = 0; i <= text.length; i++) {
75
93
  if (i === text.length || text[i] === "\n") {
76
94
  const para = text.slice(paraStart, i);
95
+ const attrs = options.paragraphs?.[paraIndex];
96
+ const levels = (attrs?.indent ?? 0) + (attrs?.list !== undefined ? 1 : 0);
97
+ const indentX = levels * LIST_INDENT_EM * options.fontSize;
77
98
  if (options.maxWidth === undefined) {
78
- lines.push({ text: para, start: paraStart, end: i, width: measure(para) });
99
+ lines.push({
100
+ text: para,
101
+ start: paraStart,
102
+ end: i,
103
+ width: measure(para),
104
+ indentX,
105
+ para: paraIndex,
106
+ paraFirst: true,
107
+ });
79
108
  }
80
109
  else {
81
- wrapParagraph(para, paraStart, options.maxWidth, measure, lines);
110
+ // Keep at least one em of budget so a huge indent can't wedge the
111
+ // wrapper into zero-width lines.
112
+ const budget = Math.max(options.fontSize, options.maxWidth - indentX);
113
+ wrapParagraph(para, paraStart, budget, measure, lines, paraIndex, indentX);
82
114
  }
83
115
  paraStart = i + 1;
116
+ paraIndex++;
84
117
  }
85
118
  }
86
- if (lines.length === 0)
87
- lines.push({ text: "", start: 0, end: 0, width: 0 });
119
+ if (lines.length === 0) {
120
+ lines.push({ text: "", start: 0, end: 0, width: 0, indentX: 0, para: 0, paraFirst: true });
121
+ }
88
122
  let widest = 0;
89
123
  for (const l of lines)
90
- widest = Math.max(widest, l.width);
124
+ widest = Math.max(widest, l.width + l.indentX);
91
125
  const blockWidth = options.maxWidth ?? widest;
92
126
  return { lines, lineHeight, blockWidth };
93
127
  };
@@ -99,6 +133,13 @@ const lineLeftX = (lineWidth, blockWidth, align) => {
99
133
  return blockWidth - lineWidth;
100
134
  return 0;
101
135
  };
136
+ /**
137
+ * Left edge of a laid-out line INCLUDING its list indent: alignment is
138
+ * computed within the space remaining after the indent, then shifted by
139
+ * it. The single source of glyph-left-x for the renderer, caret,
140
+ * click-to-caret and selection rects — keep them in lockstep.
141
+ */
142
+ export const lineLeft = (line, blockWidth, align) => lineLeftX(line.width, blockWidth - line.indentX, align) + line.indentX;
102
143
  /** Index of the line a caret offset falls on (handles boundaries). */
103
144
  const lineIndexForCaret = (layout, caret) => {
104
145
  const { lines } = layout;
@@ -122,7 +163,7 @@ export const caretGeometry = (layout, caret, measure, fontSize, align) => {
122
163
  const line = req(layout.lines[i]);
123
164
  const col = Math.max(0, Math.min(caret, line.end) - line.start);
124
165
  const prefixWidth = col === 0 ? 0 : measure(line.text.slice(0, col));
125
- const left = lineLeftX(line.width, layout.blockWidth, align);
166
+ const left = lineLeft(line, layout.blockWidth, align);
126
167
  return { x: left + prefixWidth, y: i * layout.lineHeight, height: fontSize, line: i };
127
168
  };
128
169
  /**
@@ -133,7 +174,7 @@ export const pointToCaretIndex = (layout, point, measure, align) => {
133
174
  const { lines, lineHeight } = layout;
134
175
  const i = Math.max(0, Math.min(lines.length - 1, Math.floor(point.y / lineHeight)));
135
176
  const line = req(lines[i]);
136
- const left = lineLeftX(line.width, layout.blockWidth, align);
177
+ const left = lineLeft(line, layout.blockWidth, align);
137
178
  // Walk columns, picking the boundary whose x is closest to point.x.
138
179
  let best = 0;
139
180
  let bestDist = Math.abs(left - point.x);
@@ -169,7 +210,7 @@ export const selectionRects = (layout, from, to, measure, align) => {
169
210
  if (!(hi > line.end && lo <= line.end))
170
211
  continue;
171
212
  }
172
- const left = lineLeftX(line.width, layout.blockWidth, align);
213
+ const left = lineLeft(line, layout.blockWidth, align);
173
214
  const xa = left + (a === line.start ? 0 : measure(line.text.slice(0, a - line.start)));
174
215
  const xb = left + (b === line.start ? 0 : measure(line.text.slice(0, b - line.start)));
175
216
  // A line whose break is inside the selection gets a small trailing
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-editing.js","sourceRoot":"","sources":["../../src/text/text-editing.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { RenderTarget } from "./render-target.js";
1
+ import type { RenderTarget } from "../targets/render-target.js";
2
2
  import type { TextShaper } from "./text-shaper.js";
3
3
  export interface WrapOptions {
4
4
  /** Max width in CSS pixels. */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-layout.d.ts","sourceRoot":"","sources":["../../src/text/text-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,GACnB,MAAM,MAAM,EACZ,QAAQ,YAAY,EACpB,SAAS,WAAW,KACnB;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAiDvE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-layout.js","sourceRoot":"","sources":["../../src/text/text-layout.ts"],"names":[],"mappings":"AAiCA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAY,EACZ,MAAoB,EACpB,OAAoB,EACqD,EAAE;IAC3E,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAAC;IAEzD,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,YAAY,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM;QACpB,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK;QACxF,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE/C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QACD,IAAI,OAAO,GAAG,SAAS,CAAC;QACxB,IAAI,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YACjC,MAAM,SAAS,GAAG,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAClB,OAAO,GAAG,SAAS,CAAC;gBACpB,YAAY,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;gBACjD,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG,gBAAgB,CAAC;IACvD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AACpC,CAAC,CAAC"}
@@ -43,8 +43,16 @@ export interface ShapedGlyph {
43
43
  * Install a process-global text shaper. Subsequent `getActiveTextShaper()`
44
44
  * calls (used by the built-in `drawText` renderer) return it; passing `null`
45
45
  * reverts to the Canvas2D `target.measureText` path. Idempotent — last write
46
- * wins.
46
+ * wins. Registered listeners are notified so backends can react at the
47
+ * moment the shaper arrives (e.g. warm up a glyph atlas) instead of on
48
+ * the next frame that happens to draw text.
47
49
  */
48
50
  export declare const setActiveTextShaper: (shaper: TextShaper | null) => void;
51
+ /**
52
+ * Subscribe to active-shaper changes. Returns an unsubscribe function.
53
+ * The listener is NOT called for the current value — read it via
54
+ * `getActiveTextShaper()` first when needed.
55
+ */
56
+ export declare const onTextShaperChange: (listener: (shaper: TextShaper | null) => void) => (() => void);
49
57
  export declare const getActiveTextShaper: () => TextShaper | null;
50
58
  //# sourceMappingURL=text-shaper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-shaper.d.ts","sourceRoot":"","sources":["../../src/text/text-shaper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAE3D;;;OAGG;IACH,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,SAAS,WAAW,EAAE,CAAC;CAChE;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,UAAU,GAAG,IAAI,KAAG,IAG/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAK7F,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,UAAU,GAAG,IAAoB,CAAC"}
@@ -0,0 +1,32 @@
1
+ // Process-global active shaper. The built-in text renderer's signature is
2
+ // `(shape, target)` with no extra arg, so rather than thread a shaper
3
+ // through every renderer it consults this module-level registry at call
4
+ // time.
5
+ let activeShaper = null;
6
+ const shaperListeners = new Set();
7
+ /**
8
+ * Install a process-global text shaper. Subsequent `getActiveTextShaper()`
9
+ * calls (used by the built-in `drawText` renderer) return it; passing `null`
10
+ * reverts to the Canvas2D `target.measureText` path. Idempotent — last write
11
+ * wins. Registered listeners are notified so backends can react at the
12
+ * moment the shaper arrives (e.g. warm up a glyph atlas) instead of on
13
+ * the next frame that happens to draw text.
14
+ */
15
+ export const setActiveTextShaper = (shaper) => {
16
+ activeShaper = shaper;
17
+ for (const listener of shaperListeners)
18
+ listener(shaper);
19
+ };
20
+ /**
21
+ * Subscribe to active-shaper changes. Returns an unsubscribe function.
22
+ * The listener is NOT called for the current value — read it via
23
+ * `getActiveTextShaper()` first when needed.
24
+ */
25
+ export const onTextShaperChange = (listener) => {
26
+ shaperListeners.add(listener);
27
+ return () => {
28
+ shaperListeners.delete(listener);
29
+ };
30
+ };
31
+ export const getActiveTextShaper = () => activeShaper;
32
+ //# sourceMappingURL=text-shaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-shaper.js","sourceRoot":"","sources":["../../src/text/text-shaper.ts"],"names":[],"mappings":"AA2CA,0EAA0E;AAC1E,sEAAsE;AACtE,wEAAwE;AACxE,QAAQ;AAER,IAAI,YAAY,GAAsB,IAAI,CAAC;AAC3C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAuC,CAAC;AAEvE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAyB,EAAQ,EAAE;IACrE,YAAY,GAAG,MAAM,CAAC;IACtB,KAAK,MAAM,QAAQ,IAAI,eAAe;QAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAA6C,EAAgB,EAAE;IAChG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,OAAO,GAAG,EAAE;QACV,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAsB,EAAE,CAAC,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-just-another/renderer-core",
3
- "version": "0.60.0",
3
+ "version": "0.61.0",
4
4
  "description": "Backend-agnostic rendering abstraction: a RenderTarget surface, an element-renderer registry, and a Scene walker.",
5
5
  "license": "MIT",
6
6
  "author": "Rustam Garifulin <rustam@n69.in>",
@@ -41,8 +41,8 @@
41
41
  "dependencies": {
42
42
  "@oh-just-another/types": "0.57.0",
43
43
  "@oh-just-another/math": "0.58.0",
44
- "@oh-just-another/scene": "0.61.0",
45
- "@oh-just-another/tokens": "0.57.0"
44
+ "@oh-just-another/scene": "0.62.0",
45
+ "@oh-just-another/tokens": "0.58.1"
46
46
  },
47
47
  "scripts": {
48
48
  "build": "tsc -b tsconfig.build.json",
@@ -1 +0,0 @@
1
- {"version":3,"file":"animation-adapter.d.ts","sourceRoot":"","sources":["../src/animation-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,qBAAqB,CAAC,IAAI,GAAG,OAAO;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACrD;;;;OAIG;IACH,eAAe,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;CACtC;AAID,eAAO,MAAM,wBAAwB,GAAI,CAAC,EAAE,SAAS,qBAAqB,CAAC,CAAC,CAAC,KAAG,IAE/E,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,KAAG,IAEzD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,qBAAqB,GAAG,SACvD,CAAC;AAErB,eAAO,MAAM,kBAAkB,QAAO,SAAS,MAAM,EAA0B,CAAC;AAgBhF,eAAO,MAAM,uBAAuB,GAAI,IAAI,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAGnE,CAAC;AAEF,eAAO,MAAM,2BAA2B,QAAO,IAQ9C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,KAAK,MAAM,CAAC;AAK1E;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,cAAc,KAAG,IAEzD,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,QAAO,IAEtC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO;IACL,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC,EACD,cAAa,MAA8B,KAC1C,OASF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"animation-adapter.js","sourceRoot":"","sources":["../src/animation-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA0BH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiC,CAAC;AAE1D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAI,OAAiC,EAAQ,EAAE;IACrF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,IAAY,EAAQ,EAAE;IAC/D,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAqC,EAAE,CACrF,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAErB,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAsB,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAEhF;;;;;;;;;;;GAWG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAc,CAAC;AAE/C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EAAc,EAAgB,EAAE;IACtE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,OAAO,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAS,EAAE;IACpD,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,EAAE,EAAE,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAwBF,IAAI,cAAc,GAAmB,GAAG,EAAE,CACxC,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAqB,EAAQ,EAAE;IAC/D,cAAc,GAAG,KAAK,CAAC;AACzB,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAS,EAAE;IAC5C,cAAc,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAKC,EACD,cAAsB,cAAc,CAAC,KAAK,CAAC,EAClC,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,GAAG,CAAC;IACnB,CAAC;AACH,CAAC,CAAC"}
@@ -1,25 +0,0 @@
1
- import type { RenderTarget } from "./render-target.js";
2
- /**
3
- * Build a rounded-rect path via the standard "4 corners with
4
- * quadratic Bezier arcs" pattern — same shape every backend
5
- * understands without a special `roundRect()` API:
6
- *
7
- * ┌───arc───┐
8
- * │ │
9
- * arc arc
10
- * │ │
11
- * └───arc───┘
12
- *
13
- * Quadratic control points sit at each corner of the rect; the
14
- * curve goes from `r` units along one side to `r` units along the
15
- * adjacent side.
16
- *
17
- * Radius `r` is pre-clamped by `getCornerRadius` to half the
18
- * smaller side, so no overlap-handling is needed here.
19
- */
20
- export declare const buildRoundedRectPath: (target: RenderTarget, x: number, y: number, w: number, h: number, r: number) => void;
21
- /**
22
- * Registers renderers for every `BuiltinElement` type.
23
- */
24
- export declare const installBuiltinRenderers: () => void;
25
- //# sourceMappingURL=built-in-renderers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"built-in-renderers.d.ts","sourceRoot":"","sources":["../src/built-in-renderers.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAkGvD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,YAAY,EACpB,GAAG,MAAM,EACT,GAAG,MAAM,EACT,GAAG,MAAM,EACT,GAAG,MAAM,EACT,GAAG,MAAM,KACR,IAWF,CAAC;AA2VF;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAO,IAkB1C,CAAC"}