@codexo/exojs 0.6.7 → 0.6.9

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 (31) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +0 -36
  3. package/dist/esm/index.d.ts +0 -1
  4. package/dist/esm/index.js +2 -1
  5. package/dist/esm/index.js.map +1 -1
  6. package/dist/esm/rendering/index.d.ts +3 -0
  7. package/dist/esm/rendering/text/DynamicGlyphAtlas.d.ts +33 -0
  8. package/dist/esm/rendering/text/DynamicGlyphAtlas.js +140 -0
  9. package/dist/esm/rendering/text/DynamicGlyphAtlas.js.map +1 -0
  10. package/dist/esm/rendering/text/Text.d.ts +21 -17
  11. package/dist/esm/rendering/text/Text.js +93 -93
  12. package/dist/esm/rendering/text/Text.js.map +1 -1
  13. package/dist/esm/rendering/text/TextLayout.d.ts +13 -0
  14. package/dist/esm/rendering/text/TextLayout.js +63 -0
  15. package/dist/esm/rendering/text/TextLayout.js.map +1 -0
  16. package/dist/esm/rendering/text/TextStyle.d.ts +26 -3
  17. package/dist/esm/rendering/text/TextStyle.js +45 -0
  18. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  19. package/dist/esm/rendering/text/atlas-singleton.d.ts +7 -0
  20. package/dist/esm/rendering/text/atlas-singleton.js +17 -0
  21. package/dist/esm/rendering/text/atlas-singleton.js.map +1 -0
  22. package/dist/esm/rendering/text/types.d.ts +45 -0
  23. package/dist/esm/rendering/utils.js +1 -14
  24. package/dist/esm/rendering/utils.js.map +1 -1
  25. package/dist/exo.esm.js +344 -573
  26. package/dist/exo.esm.js.map +1 -1
  27. package/package.json +1 -9
  28. package/dist/esm/physics/RapierPhysicsWorld.d.ts +0 -136
  29. package/dist/esm/physics/RapierPhysicsWorld.js +0 -475
  30. package/dist/esm/physics/RapierPhysicsWorld.js.map +0 -1
  31. package/dist/esm/physics/index.d.ts +0 -1
@@ -1,29 +1,84 @@
1
- import { Sprite } from '../sprite/Sprite.js';
2
- import { Texture } from '../texture/Texture.js';
1
+ import { Container } from '../Container.js';
2
+ import { Mesh } from '../mesh/Mesh.js';
3
+ import { getDefaultGlyphAtlas } from './atlas-singleton.js';
4
+ import { layoutText } from './TextLayout.js';
3
5
  import { TextStyle } from './TextStyle.js';
4
- import { Rectangle } from '../../math/Rectangle.js';
5
- import { determineFontHeight } from '../utils.js';
6
6
 
7
- const newLinePattern = /(?:\r\n|\r|\n)/;
8
- class Text extends Sprite {
7
+ function buildMesh(placements, style) {
8
+ const n = placements.length;
9
+ const vertices = new Float32Array(n * 4 * 2);
10
+ const uvs = new Float32Array(n * 4 * 2);
11
+ const indices = new Uint16Array(n * 6);
12
+ for (let i = 0; i < n; i++) {
13
+ const p = placements[i];
14
+ const v = i * 8;
15
+ const u = i * 8;
16
+ const idx = i * 6;
17
+ const baseV = i * 4;
18
+ // Vertices: TL, TR, BR, BL
19
+ vertices[v + 0] = p.x;
20
+ vertices[v + 1] = p.y;
21
+ vertices[v + 2] = p.x + p.width;
22
+ vertices[v + 3] = p.y;
23
+ vertices[v + 4] = p.x + p.width;
24
+ vertices[v + 5] = p.y + p.height;
25
+ vertices[v + 6] = p.x;
26
+ vertices[v + 7] = p.y + p.height;
27
+ // UVs: TL, TR, BR, BL
28
+ uvs[u + 0] = p.uvLeft;
29
+ uvs[u + 1] = p.uvTop;
30
+ uvs[u + 2] = p.uvRight;
31
+ uvs[u + 3] = p.uvTop;
32
+ uvs[u + 4] = p.uvRight;
33
+ uvs[u + 5] = p.uvBottom;
34
+ uvs[u + 6] = p.uvLeft;
35
+ uvs[u + 7] = p.uvBottom;
36
+ // Indices: [TL, TR, BR, TL, BR, BL]
37
+ indices[idx + 0] = baseV + 0;
38
+ indices[idx + 1] = baseV + 1;
39
+ indices[idx + 2] = baseV + 2;
40
+ indices[idx + 3] = baseV + 0;
41
+ indices[idx + 4] = baseV + 2;
42
+ indices[idx + 5] = baseV + 3;
43
+ }
44
+ const atlas = getDefaultGlyphAtlas();
45
+ const mesh = new Mesh({
46
+ vertices,
47
+ uvs,
48
+ indices,
49
+ texture: atlas.texture,
50
+ });
51
+ mesh.tint = style.fillColor;
52
+ return mesh;
53
+ }
54
+ /**
55
+ * GPU-accelerated text node that rasterizes individual glyphs into a shared
56
+ * atlas ({@link DynamicGlyphAtlas}) and renders them as a single quad-per-
57
+ * glyph {@link Mesh} (one draw call per Text instance).
58
+ *
59
+ * Glyphs are always rasterized in white and tinted at runtime via
60
+ * `Mesh.tint`; changing `style.fillColor` only updates the mesh tint —
61
+ * no atlas re-rasterization is needed.
62
+ *
63
+ * The internal {@link Mesh} is the sole child of this {@link Container}.
64
+ * All transform properties (position, rotation, scale, origin) are
65
+ * inherited from {@link Container} → {@link RenderNode}.
66
+ */
67
+ class Text extends Container {
9
68
  _text;
10
69
  _style;
11
- _canvas;
12
- _context;
13
- _dirty = true;
14
- constructor(text, style, samplerOptions, canvas = document.createElement('canvas')) {
15
- super(new Texture(canvas, samplerOptions));
70
+ _mesh = null;
71
+ constructor(text, style) {
72
+ super();
16
73
  this._text = text;
17
74
  this._style = (style && style instanceof TextStyle) ? style : new TextStyle(style);
18
- this._canvas = canvas;
19
- this._context = canvas.getContext('2d');
20
- this.updateTexture();
75
+ this._rebuild();
21
76
  }
22
77
  get text() {
23
78
  return this._text;
24
79
  }
25
- set text(text) {
26
- this.setText(text);
80
+ set text(value) {
81
+ this.setText(value);
27
82
  }
28
83
  get style() {
29
84
  return this._style;
@@ -31,98 +86,43 @@ class Text extends Sprite {
31
86
  set style(style) {
32
87
  this.setStyle(style);
33
88
  }
34
- get canvas() {
35
- return this._canvas;
36
- }
37
- set canvas(canvas) {
38
- this.setCanvas(canvas);
39
- }
40
89
  setText(text) {
41
90
  if (this._text !== text) {
42
91
  this._text = text;
43
- this._dirty = true;
92
+ this._rebuild();
44
93
  }
45
94
  return this;
46
95
  }
47
96
  setStyle(style) {
48
97
  this._style = (style instanceof TextStyle) ? style : new TextStyle(style);
49
- this._dirty = true;
98
+ this._rebuild();
50
99
  return this;
51
100
  }
52
- setCanvas(canvas) {
53
- if (this._canvas !== canvas) {
54
- this._canvas = canvas;
55
- this._context = this._getContext(canvas);
56
- this._dirty = true;
57
- this.texture.setSource.call(this.texture, canvas);
58
- this.setTextureFrame(Rectangle.temp.set(0, 0, canvas.width, canvas.height));
101
+ destroy() {
102
+ if (this._mesh !== null) {
103
+ this._mesh.destroy();
104
+ this._mesh = null;
59
105
  }
60
- return this;
106
+ super.destroy();
61
107
  }
62
- updateTexture() {
63
- if (this._style && (this._dirty || this._style.dirty)) {
64
- const canvas = this._canvas, context = this._context, style = this._style.apply(context), text = style.wordWrap ? this.getWordWrappedText() : this._text, lineHeight = determineFontHeight(context.font) + style.strokeThickness, lines = text.split(newLinePattern), lineMetrics = lines.map((line) => context.measureText(line)), maxLineWidth = lineMetrics.reduce((max, measure) => Math.max(max, measure.width), 0), canvasWidth = Math.ceil((maxLineWidth + style.strokeThickness) + (style.padding * 2)), canvasHeight = Math.ceil((lineHeight * lines.length) + (style.padding * 2));
65
- if (canvasWidth !== canvas.width || canvasHeight !== canvas.height) {
66
- canvas.width = canvasWidth;
67
- canvas.height = canvasHeight;
68
- this.setTextureFrame(Rectangle.temp.set(0, 0, canvasWidth, canvasHeight));
69
- }
70
- else {
71
- context.clearRect(0, 0, canvasWidth, canvasHeight);
72
- }
73
- style.apply(context);
74
- for (let i = 0; i < lines.length; i++) {
75
- const metrics = lineMetrics[i], lineWidth = (maxLineWidth - metrics.width), offset = (style.align === 'right') ? lineWidth : lineWidth / 2, padding = style.padding + (style.strokeThickness / 2), lineX = metrics.actualBoundingBoxLeft + (style.align === 'left' ? 0 : offset) + padding, lineY = metrics.actualBoundingBoxAscent + (lineHeight * i) + padding;
76
- if (style.stroke && style.strokeThickness) {
77
- context.strokeText(lines[i], lineX, lineY);
78
- }
79
- if (style.fill) {
80
- context.fillText(lines[i], lineX, lineY);
81
- }
82
- }
83
- this.texture.updateSource();
84
- this._dirty = false;
85
- this._style.dirty = false;
108
+ // -----------------------------------------------------------------------
109
+ _rebuild() {
110
+ // Remove and discard the old mesh (if any).
111
+ if (this._mesh !== null) {
112
+ this.removeChild(this._mesh);
113
+ this._mesh.destroy();
114
+ this._mesh = null;
86
115
  }
87
- return this;
88
- }
89
- getWordWrappedText() {
90
- const context = this._context, wrapWidth = this._style.wordWrapWidth, lines = this._text.split('\n'), spaceWidth = context.measureText(' ').width;
91
- let spaceLeft = wrapWidth, result = '';
92
- for (let y = 0; y < lines.length; y++) {
93
- const words = lines[y].split(' ');
94
- if (y > 0) {
95
- result += '\n';
96
- }
97
- for (let x = 0; x < words.length; x++) {
98
- const word = words[x], wordWidth = context.measureText(word).width, pairWidth = wordWidth + spaceWidth;
99
- if (pairWidth > spaceLeft) {
100
- if (x > 0) {
101
- result += '\n';
102
- }
103
- spaceLeft = wrapWidth;
104
- }
105
- else {
106
- spaceLeft -= pairWidth;
107
- }
108
- result += `${word} `;
109
- }
110
- }
111
- return result;
112
- }
113
- render(backend) {
114
- if (this.visible) {
115
- this.updateTexture();
116
- super.render(backend);
116
+ if (this._text.length === 0) {
117
+ return;
117
118
  }
118
- return this;
119
- }
120
- _getContext(canvas) {
121
- const context = canvas.getContext('2d');
122
- if (context === null) {
123
- throw new Error('Could not create a 2D canvas context.');
119
+ const atlas = getDefaultGlyphAtlas();
120
+ const placements = layoutText(this._text, this._style, atlas);
121
+ if (placements.length === 0) {
122
+ return;
124
123
  }
125
- return context;
124
+ this._mesh = buildMesh(placements, this._style);
125
+ this.addChild(this._mesh);
126
126
  }
127
127
  }
128
128
 
@@ -1 +1 @@
1
- {"version":3,"file":"Text.js","sources":["../../../../../src/rendering/text/Text.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Text.js","sources":["../../../../../src/rendering/text/Text.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { DynamicGlyphAtlas } from './DynamicGlyphAtlas';
2
+ import type { GlyphPlacement } from './types';
3
+ import type { TextStyle } from './TextStyle';
4
+ /**
5
+ * Computes per-glyph quad placements for the given text and style.
6
+ *
7
+ * Handles `\n` line breaks and left/center/right alignment. No word-wrap,
8
+ * no RTL, no ligature shaping — Unicode/diacritics are delegated to the
9
+ * browser's font engine via canvas `fillText`.
10
+ *
11
+ * Returns an empty array for empty text.
12
+ */
13
+ export declare function layoutText(text: string, style: TextStyle, atlas: DynamicGlyphAtlas): ReadonlyArray<GlyphPlacement>;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Computes per-glyph quad placements for the given text and style.
3
+ *
4
+ * Handles `\n` line breaks and left/center/right alignment. No word-wrap,
5
+ * no RTL, no ligature shaping — Unicode/diacritics are delegated to the
6
+ * browser's font engine via canvas `fillText`.
7
+ *
8
+ * Returns an empty array for empty text.
9
+ */
10
+ function layoutText(text, style, atlas) {
11
+ if (text.length === 0) {
12
+ return [];
13
+ }
14
+ const { fontSize, fontFamily, fontWeight, fontStyle, lineHeight, align } = style;
15
+ const computedLineHeight = fontSize * lineHeight;
16
+ const lines = text.split('\n');
17
+ // Pass 1: gather glyph info per line, track line widths
18
+ const linePlacements = [];
19
+ let maxLineWidth = 0;
20
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
21
+ const line = lines[lineIndex];
22
+ const y = lineIndex * computedLineHeight;
23
+ let cursorX = 0;
24
+ const placements = [];
25
+ for (const char of line) {
26
+ const info = atlas.getGlyph(char, fontFamily, fontSize, fontWeight, fontStyle);
27
+ placements.push({ info, x: cursorX, y });
28
+ cursorX += info.advance;
29
+ }
30
+ const lineWidth = cursorX;
31
+ if (lineWidth > maxLineWidth) {
32
+ maxLineWidth = lineWidth;
33
+ }
34
+ linePlacements.push({ placements, width: lineWidth });
35
+ }
36
+ // Pass 2: apply alignment and build final GlyphPlacement array
37
+ const result = [];
38
+ for (const line of linePlacements) {
39
+ let offsetX = 0;
40
+ if (align === 'right') {
41
+ offsetX = maxLineWidth - line.width;
42
+ }
43
+ else if (align === 'center') {
44
+ offsetX = (maxLineWidth - line.width) / 2;
45
+ }
46
+ for (const { info, x, y } of line.placements) {
47
+ result.push({
48
+ x: x + offsetX,
49
+ y,
50
+ width: info.width,
51
+ height: info.height,
52
+ uvLeft: info.uvLeft,
53
+ uvTop: info.uvTop,
54
+ uvRight: info.uvRight,
55
+ uvBottom: info.uvBottom,
56
+ });
57
+ }
58
+ }
59
+ return result;
60
+ }
61
+
62
+ export { layoutText };
63
+ //# sourceMappingURL=TextLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextLayout.js","sources":["../../../../../src/rendering/text/TextLayout.ts"],"sourcesContent":[null],"names":[],"mappings":"AAaA;;;;;;;;AAQG;SACa,UAAU,CACtB,IAAY,EACZ,KAAgB,EAChB,KAAwB,EAAA;AAExB,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACnB,QAAA,OAAO,EAAE;IACb;AAEA,IAAA,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,KAAK;AAChF,IAAA,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;IAG9B,MAAM,cAAc,GAAyB,EAAE;IAC/C,IAAI,YAAY,GAAG,CAAC;AAEpB,IAAA,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;AAC3D,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;AAC7B,QAAA,MAAM,CAAC,GAAG,SAAS,GAAG,kBAAkB;QACxC,IAAI,OAAO,GAAG,CAAC;QACf,MAAM,UAAU,GAAgC,EAAE;AAElD,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;AACrB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC;AAE9E,YAAA,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACxC,YAAA,OAAO,IAAI,IAAI,CAAC,OAAO;QAC3B;QAEA,MAAM,SAAS,GAAG,OAAO;AAEzB,QAAA,IAAI,SAAS,GAAG,YAAY,EAAE;YAC1B,YAAY,GAAG,SAAS;QAC5B;QAEA,cAAc,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACzD;;IAGA,MAAM,MAAM,GAA0B,EAAE;AAExC,IAAA,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE;QAC/B,IAAI,OAAO,GAAG,CAAC;AAEf,QAAA,IAAI,KAAK,KAAK,OAAO,EAAE;AACnB,YAAA,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC,KAAK;QACvC;AAAO,aAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;YAC3B,OAAO,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;QAC7C;AAEA,QAAA,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC;gBACR,CAAC,EAAE,CAAC,GAAG,OAAO;gBACd,CAAC;gBACD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AAC1B,aAAA,CAAC;QACN;IACJ;AAEA,IAAA,OAAO,MAAM;AACjB;;;;"}
@@ -1,12 +1,17 @@
1
+ import { Color } from '@/core/Color';
2
+ import type { TextAlignment } from './types';
1
3
  export type TextStyleColor = string | CanvasGradient | CanvasPattern;
2
4
  export interface TextStyleOptions {
3
- align?: string;
5
+ align?: TextAlignment;
4
6
  fill?: TextStyleColor;
7
+ fillColor?: Color;
8
+ lineHeight?: number;
5
9
  stroke?: TextStyleColor;
6
10
  strokeThickness?: number;
7
11
  fontSize?: number;
8
12
  fontWeight?: string;
9
13
  fontFamily?: string;
14
+ fontStyle?: 'normal' | 'italic';
10
15
  wordWrap?: boolean;
11
16
  wordWrapWidth?: number;
12
17
  baseline?: CanvasTextBaseline;
@@ -17,11 +22,14 @@ export interface TextStyleOptions {
17
22
  export declare class TextStyle {
18
23
  private _align;
19
24
  private _fill;
25
+ private _fillColor;
26
+ private _lineHeight;
20
27
  private _stroke;
21
28
  private _strokeThickness;
22
29
  private _fontSize;
23
30
  private _fontWeight;
24
31
  private _fontFamily;
32
+ private _fontStyle;
25
33
  private _wordWrap;
26
34
  private _wordWrapWidth;
27
35
  private _baseline;
@@ -30,10 +38,23 @@ export declare class TextStyle {
30
38
  private _padding;
31
39
  private _dirty;
32
40
  constructor(options?: TextStyleOptions);
33
- get align(): string;
34
- set align(align: string);
41
+ get align(): TextAlignment;
42
+ set align(align: TextAlignment);
35
43
  get fill(): TextStyleColor;
36
44
  set fill(fill: TextStyleColor);
45
+ /**
46
+ * Runtime fill color applied via `Mesh.tint`. Glyphs are always
47
+ * rasterized white; this color multiplies them at draw time so that
48
+ * changing the color never requires re-rasterizing cached glyphs.
49
+ */
50
+ get fillColor(): Color;
51
+ set fillColor(color: Color);
52
+ /**
53
+ * Line-height multiplier applied to `fontSize` when computing vertical
54
+ * spacing between lines. Defaults to 1.2.
55
+ */
56
+ get lineHeight(): number;
57
+ set lineHeight(lineHeight: number);
37
58
  get stroke(): TextStyleColor;
38
59
  set stroke(stroke: TextStyleColor);
39
60
  get strokeThickness(): number;
@@ -44,6 +65,8 @@ export declare class TextStyle {
44
65
  set fontWeight(fontWeight: string);
45
66
  get fontFamily(): string;
46
67
  set fontFamily(fontFamily: string);
68
+ get fontStyle(): 'normal' | 'italic';
69
+ set fontStyle(fontStyle: 'normal' | 'italic');
47
70
  get wordWrap(): boolean;
48
71
  set wordWrap(wordWrap: boolean);
49
72
  get wordWrapWidth(): number;
@@ -1,11 +1,16 @@
1
+ import { Color } from '../../core/Color.js';
2
+
1
3
  class TextStyle {
2
4
  _align;
3
5
  _fill;
6
+ _fillColor;
7
+ _lineHeight;
4
8
  _stroke;
5
9
  _strokeThickness;
6
10
  _fontSize;
7
11
  _fontWeight;
8
12
  _fontFamily;
13
+ _fontStyle;
9
14
  _wordWrap;
10
15
  _wordWrapWidth;
11
16
  _baseline;
@@ -16,11 +21,14 @@ class TextStyle {
16
21
  constructor(options = {}) {
17
22
  this._align = options.align ?? 'left';
18
23
  this._fill = options.fill ?? 'black';
24
+ this._fillColor = options.fillColor ?? Color.white.clone();
25
+ this._lineHeight = options.lineHeight ?? 1.2;
19
26
  this._stroke = options.stroke ?? 'black';
20
27
  this._strokeThickness = options.strokeThickness ?? 1;
21
28
  this._fontSize = options.fontSize ?? 20;
22
29
  this._fontWeight = options.fontWeight ?? 'bold';
23
30
  this._fontFamily = options.fontFamily ?? 'Arial';
31
+ this._fontStyle = options.fontStyle ?? 'normal';
24
32
  this._wordWrap = options.wordWrap ?? false;
25
33
  this._wordWrapWidth = options.wordWrapWidth ?? 100;
26
34
  this._baseline = options.baseline ?? 'alphabetic';
@@ -46,6 +54,31 @@ class TextStyle {
46
54
  this._dirty = true;
47
55
  }
48
56
  }
57
+ /**
58
+ * Runtime fill color applied via `Mesh.tint`. Glyphs are always
59
+ * rasterized white; this color multiplies them at draw time so that
60
+ * changing the color never requires re-rasterizing cached glyphs.
61
+ */
62
+ get fillColor() {
63
+ return this._fillColor;
64
+ }
65
+ set fillColor(color) {
66
+ this._fillColor = color;
67
+ this._dirty = true;
68
+ }
69
+ /**
70
+ * Line-height multiplier applied to `fontSize` when computing vertical
71
+ * spacing between lines. Defaults to 1.2.
72
+ */
73
+ get lineHeight() {
74
+ return this._lineHeight;
75
+ }
76
+ set lineHeight(lineHeight) {
77
+ if (this._lineHeight !== lineHeight) {
78
+ this._lineHeight = lineHeight;
79
+ this._dirty = true;
80
+ }
81
+ }
49
82
  get stroke() {
50
83
  return this._stroke;
51
84
  }
@@ -91,6 +124,15 @@ class TextStyle {
91
124
  this._dirty = true;
92
125
  }
93
126
  }
127
+ get fontStyle() {
128
+ return this._fontStyle;
129
+ }
130
+ set fontStyle(fontStyle) {
131
+ if (this._fontStyle !== fontStyle) {
132
+ this._fontStyle = fontStyle;
133
+ this._dirty = true;
134
+ }
135
+ }
94
136
  get wordWrap() {
95
137
  return this._wordWrap;
96
138
  }
@@ -168,11 +210,14 @@ class TextStyle {
168
210
  if (style !== this) {
169
211
  this.align = style.align;
170
212
  this.fill = style.fill;
213
+ this._fillColor = style.fillColor.clone();
214
+ this.lineHeight = style.lineHeight;
171
215
  this.stroke = style.stroke;
172
216
  this.strokeThickness = style.strokeThickness;
173
217
  this.fontSize = style.fontSize;
174
218
  this.fontWeight = style.fontWeight;
175
219
  this.fontFamily = style.fontFamily;
220
+ this.fontStyle = style.fontStyle;
176
221
  this.wordWrap = style.wordWrap;
177
222
  this.wordWrapWidth = style.wordWrapWidth;
178
223
  this.baseline = style.baseline;
@@ -1 +1 @@
1
- {"version":3,"file":"TextStyle.js","sources":["../../../../../src/rendering/text/TextStyle.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TextStyle.js","sources":["../../../../../src/rendering/text/TextStyle.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { DynamicGlyphAtlas } from './DynamicGlyphAtlas';
2
+ /**
3
+ * Returns the shared process-wide glyph atlas, creating it lazily on first
4
+ * call. All `Text` instances share this atlas so that identical glyph shapes
5
+ * (same char + family + size + weight + style) are rasterized only once.
6
+ */
7
+ export declare function getDefaultGlyphAtlas(): DynamicGlyphAtlas;
@@ -0,0 +1,17 @@
1
+ import { DynamicGlyphAtlas } from './DynamicGlyphAtlas.js';
2
+
3
+ let _defaultAtlas = null;
4
+ /**
5
+ * Returns the shared process-wide glyph atlas, creating it lazily on first
6
+ * call. All `Text` instances share this atlas so that identical glyph shapes
7
+ * (same char + family + size + weight + style) are rasterized only once.
8
+ */
9
+ function getDefaultGlyphAtlas() {
10
+ if (_defaultAtlas === null) {
11
+ _defaultAtlas = new DynamicGlyphAtlas();
12
+ }
13
+ return _defaultAtlas;
14
+ }
15
+
16
+ export { getDefaultGlyphAtlas };
17
+ //# sourceMappingURL=atlas-singleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atlas-singleton.js","sources":["../../../../../src/rendering/text/atlas-singleton.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA,IAAI,aAAa,GAA6B,IAAI;AAElD;;;;AAIG;SACa,oBAAoB,GAAA;AAChC,IAAA,IAAI,aAAa,KAAK,IAAI,EAAE;AACxB,QAAA,aAAa,GAAG,IAAI,iBAAiB,EAAE;IAC3C;AAEA,IAAA,OAAO,aAAa;AACxB;;;;"}
@@ -0,0 +1,45 @@
1
+ export type TextAlignment = 'left' | 'center' | 'right';
2
+ /**
3
+ * A key that uniquely identifies a glyph in the atlas cache.
4
+ * Format: `${char}:${family}:${size}:${weight}:${style}`
5
+ */
6
+ export type GlyphKey = string;
7
+ /**
8
+ * Cached glyph data stored in the atlas after rasterization.
9
+ */
10
+ export interface GlyphInfo {
11
+ /** Atlas X position (pixels, top-left of padded slot). */
12
+ readonly x: number;
13
+ /** Atlas Y position (pixels, top-left of padded slot). */
14
+ readonly y: number;
15
+ /** Glyph render width in pixels (excluding padding). */
16
+ readonly width: number;
17
+ /** Glyph render height in pixels (excluding padding). */
18
+ readonly height: number;
19
+ /** Horizontal advance in pixels (how far to move the cursor). */
20
+ readonly advance: number;
21
+ /** Distance from baseline to top of glyph in pixels. */
22
+ readonly ascent: number;
23
+ /** UV left edge (0..1, including padding). */
24
+ readonly uvLeft: number;
25
+ /** UV top edge (0..1, including padding). */
26
+ readonly uvTop: number;
27
+ /** UV right edge (0..1, including padding). */
28
+ readonly uvRight: number;
29
+ /** UV bottom edge (0..1, including padding). */
30
+ readonly uvBottom: number;
31
+ }
32
+ /**
33
+ * A single glyph's quad placement in local text space.
34
+ * Origin is the top-left of the first line.
35
+ */
36
+ export interface GlyphPlacement {
37
+ readonly x: number;
38
+ readonly y: number;
39
+ readonly width: number;
40
+ readonly height: number;
41
+ readonly uvLeft: number;
42
+ readonly uvTop: number;
43
+ readonly uvRight: number;
44
+ readonly uvBottom: number;
45
+ }
@@ -21,19 +21,6 @@ const createCanvas = (options = {}) => {
21
21
  context.fillRect(0, 0, newCanvas.width, newCanvas.height);
22
22
  return newCanvas;
23
23
  };
24
- const heightCache = new Map();
25
- const determineFontHeight = (font) => {
26
- if (!heightCache.has(font)) {
27
- const body = document.body;
28
- const dummy = document.createElement('div');
29
- dummy.appendChild(document.createTextNode('M'));
30
- dummy.setAttribute('style', `font: ${font};position:absolute;top:0;left:0`);
31
- body.appendChild(dummy);
32
- heightCache.set(font, dummy.offsetHeight);
33
- body.removeChild(dummy);
34
- }
35
- return heightCache.get(font);
36
- };
37
24
 
38
- export { createCanvas, createQuadIndices, determineFontHeight };
25
+ export { createCanvas, createQuadIndices };
39
26
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/rendering/utils.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAO,MAAM,iBAAiB,GAAG,CAAC,IAAY,KAAiB;IAC3D,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;AACtC,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE;AACtD,QAAA,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;QAChB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;AACxB,QAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;QACpB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;IAC5B;AAEA,IAAA,OAAO,IAAI;AACf;MASa,YAAY,GAAG,CAAC,OAAA,GAA+B,EAAE,KAAuB;IACjF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAEpD,MAAM,SAAS,GAAG,MAAM,IAAI,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAA6B;AAEtE,IAAA,SAAS,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;AAC7B,IAAA,SAAS,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE;AAE/B,IAAA,OAAO,CAAC,SAAS,GAAG,SAAS,IAAI,SAAS;AAC1C,IAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;AAEzD,IAAA,OAAO,SAAS;AACpB;AAEA,MAAM,WAAW,GAAwB,IAAI,GAAG,EAAkB;AAE3D,MAAM,mBAAmB,GAAG,CAAC,IAAY,KAAY;IACxD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACxB,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;QAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QAE3C,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC/C,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAA,MAAA,EAAS,IAAI,CAAA,+BAAA,CAAiC,CAAC;AAE3E,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACvB,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC;AACzC,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAC3B;AAEA,IAAA,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAE;AACjC;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/rendering/utils.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAO,MAAM,iBAAiB,GAAG,CAAC,IAAY,KAAiB;IAC3D,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;AACtC,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE;AACtD,QAAA,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;QAChB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;AACxB,QAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;QACpB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;IAC5B;AAEA,IAAA,OAAO,IAAI;AACf;MASa,YAAY,GAAG,CAAC,OAAA,GAA+B,EAAE,KAAuB;IACjF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAEpD,MAAM,SAAS,GAAG,MAAM,IAAI,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAA6B;AAEtE,IAAA,SAAS,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;AAC7B,IAAA,SAAS,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE;AAE/B,IAAA,OAAO,CAAC,SAAS,GAAG,SAAS,IAAI,SAAS;AAC1C,IAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;AAEzD,IAAA,OAAO,SAAS;AACpB;;;;"}