@lightningjs/renderer 0.7.1 → 0.7.2

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 (47) hide show
  1. package/dist/exports/main-api.d.ts +1 -0
  2. package/dist/src/core/CoreShaderManager.d.ts +13 -6
  3. package/dist/src/core/CoreShaderManager.js +6 -6
  4. package/dist/src/core/CoreShaderManager.js.map +1 -1
  5. package/dist/src/core/lib/WebGlContextWrapper.d.ts +9 -0
  6. package/dist/src/core/lib/WebGlContextWrapper.js +12 -0
  7. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  8. package/dist/src/core/lib/textureCompression.d.ts +16 -0
  9. package/dist/src/core/lib/textureCompression.js +129 -0
  10. package/dist/src/core/lib/textureCompression.js.map +1 -0
  11. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +12 -0
  12. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  13. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +4 -0
  14. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +11 -0
  15. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  16. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -1
  17. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +10 -1
  18. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  19. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +21 -7
  20. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  21. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  22. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +2 -1
  23. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  24. package/dist/src/core/textures/ImageTexture.js +5 -0
  25. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  26. package/dist/src/core/textures/Texture.d.ts +28 -1
  27. package/dist/src/core/textures/Texture.js.map +1 -1
  28. package/dist/src/main-api/Inspector.d.ts +15 -0
  29. package/dist/src/main-api/Inspector.js +216 -0
  30. package/dist/src/main-api/Inspector.js.map +1 -0
  31. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  32. package/exports/main-api.ts +9 -0
  33. package/package.json +1 -1
  34. package/src/core/CoreShaderManager.ts +39 -6
  35. package/src/core/lib/WebGlContextWrapper.ts +27 -0
  36. package/src/core/lib/textureCompression.ts +152 -0
  37. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +20 -0
  38. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +15 -1
  39. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +12 -4
  40. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +4 -1
  41. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +14 -1
  42. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +42 -8
  43. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -2
  44. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +2 -1
  45. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +4 -1
  46. package/src/core/textures/ImageTexture.ts +9 -0
  47. package/src/core/textures/Texture.ts +33 -1
@@ -39,7 +39,10 @@ export class SdfFontShaper extends FontShaper {
39
39
  private readonly glyphMap: Map<number, SdfFontData['chars'][0]>;
40
40
  private readonly kernings: KerningTable;
41
41
 
42
- constructor(data: SdfFontData, glyphMap: Map<number, SdfFontData['chars'][0]>) {
42
+ constructor(
43
+ data: SdfFontData,
44
+ glyphMap: Map<number, SdfFontData['chars'][0]>,
45
+ ) {
43
46
  super();
44
47
  this.data = data;
45
48
  this.glyphMap = glyphMap;
@@ -326,6 +326,18 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
326
326
  }
327
327
 
328
328
  if (!state.renderInfo) {
329
+ const maxLines = state.props.maxLines;
330
+ const containedMaxLines =
331
+ state.props.contain === 'both'
332
+ ? Math.floor(
333
+ (state.props.height - state.props.offsetY) /
334
+ state.props.lineHeight,
335
+ )
336
+ : 0;
337
+ const calcMaxLines =
338
+ containedMaxLines > 0 && maxLines > 0
339
+ ? Math.min(containedMaxLines, maxLines)
340
+ : Math.max(containedMaxLines, maxLines);
329
341
  state.lightning2TextRenderer.settings = {
330
342
  text: state.props.text,
331
343
  textAlign: state.props.textAlign,
@@ -343,7 +355,7 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
343
355
  state.props.contain === 'none' ? undefined : state.props.width,
344
356
  letterSpacing: state.props.letterSpacing,
345
357
  lineHeight: state.props.lineHeight,
346
- maxLines: state.props.maxLines,
358
+ maxLines: calcMaxLines,
347
359
  textBaseline: state.props.textBaseline,
348
360
  verticalAlign: state.props.verticalAlign,
349
361
  overflowSuffix: state.props.overflowSuffix,
@@ -701,6 +713,7 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
701
713
  */
702
714
  private invalidateLayoutCache(state: CanvasTextRendererState): void {
703
715
  state.renderInfo = undefined;
716
+ state.visibleWindow.valid = false;
704
717
  this.setStatus(state, 'loading');
705
718
  this.scheduleUpdateState(state);
706
719
  }
@@ -125,6 +125,32 @@ export interface RenderInfo {
125
125
  textIndent: number;
126
126
  }
127
127
 
128
+ /**
129
+ * Calculate height for the canvas
130
+ *
131
+ * @param textBaseline
132
+ * @param fontSize
133
+ * @param lineHeight
134
+ * @param numLines
135
+ * @param offsetY
136
+ * @returns
137
+ */
138
+ function calcHeight(
139
+ textBaseline: TextBaseline,
140
+ fontSize: number,
141
+ lineHeight: number,
142
+ numLines: number,
143
+ offsetY: number | null,
144
+ ) {
145
+ const baselineOffset = textBaseline !== 'bottom' ? 0.5 * fontSize : 0;
146
+ return (
147
+ lineHeight * (numLines - 1) +
148
+ baselineOffset +
149
+ Math.max(lineHeight, fontSize) +
150
+ (offsetY || 0)
151
+ );
152
+ }
153
+
128
154
  export class LightningTextTextureRenderer {
129
155
  private _canvas: OffscreenCanvas | HTMLCanvasElement;
130
156
  private _context:
@@ -349,13 +375,13 @@ export class LightningTextTextureRenderer {
349
375
  if (h) {
350
376
  height = h;
351
377
  } else {
352
- const baselineOffset =
353
- this._settings.textBaseline != 'bottom' ? 0.5 * fontSize : 0;
354
- height =
355
- lineHeight * (lines.length - 1) +
356
- baselineOffset +
357
- Math.max(lineHeight, fontSize) +
358
- (offsetY || 0);
378
+ height = calcHeight(
379
+ this._settings.textBaseline,
380
+ fontSize,
381
+ lineHeight,
382
+ lines.length,
383
+ offsetY,
384
+ );
359
385
  }
360
386
 
361
387
  if (offsetY === null) {
@@ -414,7 +440,15 @@ export class LightningTextTextureRenderer {
414
440
  const lines = linesOverride?.lines || renderInfo.lines;
415
441
  const lineWidths = linesOverride?.lineWidths || renderInfo.lineWidths;
416
442
  const height = linesOverride
417
- ? linesOverride.lines.length * renderInfo.lineHeight
443
+ ? calcHeight(
444
+ this._settings.textBaseline,
445
+ renderInfo.fontSize,
446
+ renderInfo.lineHeight,
447
+ linesOverride.lines.length,
448
+ this._settings.offsetY === null
449
+ ? null
450
+ : this._settings.offsetY * precision,
451
+ )
418
452
  : renderInfo.height;
419
453
 
420
454
  // Add extra margin to prevent issue with clipped text when scaling.
@@ -94,8 +94,6 @@ export interface SdfTextRendererState extends TextRendererState {
94
94
 
95
95
  bufferNumQuads: number;
96
96
 
97
- // texCoordBuffer: Float32Array | undefined;
98
-
99
97
  vertexBuffer: Float32Array | undefined;
100
98
 
101
99
  webGlBuffers: BufferCollection | null;
@@ -160,7 +160,8 @@ export function layoutText(
160
160
  (maxLines === 0 || curLineIndex + 1 < maxLines) &&
161
161
  (contain !== 'both' ||
162
162
  scrollable ||
163
- curY + vertexLineHeight + vertexLineHeight <= vertexTruncateHeight);
163
+ curY + vertexLineHeight + trFontFace.maxCharHeight <=
164
+ vertexTruncateHeight);
164
165
  const lineVertexW = nextLineWillFit
165
166
  ? vertexW
166
167
  : vertexW - overflowSuffVertexWidth;
@@ -33,7 +33,10 @@ sdfData.chars.forEach((glyph) => {
33
33
  describe('measureText', () => {
34
34
  it('should measure text width', () => {
35
35
  const PERIOD_WIDTH = 10.332;
36
- const shaper = new SdfFontShaper(sdfData as unknown as SdfFontData, glyphMap);
36
+ const shaper = new SdfFontShaper(
37
+ sdfData as unknown as SdfFontData,
38
+ glyphMap,
39
+ );
37
40
  expect(measureText('', { letterSpacing: 0 }, shaper)).toBe(0);
38
41
  expect(measureText('.', { letterSpacing: 0 }, shaper)).toBe(PERIOD_WIDTH);
39
42
  expect(measureText('..', { letterSpacing: 0 }, shaper)).toBeCloseTo(
@@ -19,6 +19,10 @@
19
19
 
20
20
  import type { CoreTextureManager } from '../CoreTextureManager.js';
21
21
  import { Texture, type TextureData } from './Texture.js';
22
+ import {
23
+ isCompressedTextureContainer,
24
+ loadCompressedTexture,
25
+ } from '../lib/textureCompression.js';
22
26
 
23
27
  /**
24
28
  * Properties of the {@link ImageTexture}
@@ -84,6 +88,11 @@ export class ImageTexture extends Texture {
84
88
  };
85
89
  }
86
90
 
91
+ // Handle compressed textures
92
+ if (isCompressedTextureContainer(src)) {
93
+ return loadCompressedTexture(src);
94
+ }
95
+
87
96
  if (this.txManager.imageWorkerManager.imageWorkersEnabled) {
88
97
  return await this.txManager.imageWorkerManager.getImage(
89
98
  src,
@@ -35,6 +35,38 @@ export type TextureLoadedEventHandler = (
35
35
  dimensions: Readonly<Dimensions>,
36
36
  ) => void;
37
37
 
38
+ /**
39
+ * Represents compressed texture data.
40
+ */
41
+ interface CompressedData {
42
+ /**
43
+ * GLenum spcifying compression format
44
+ */
45
+ glInternalFormat: number;
46
+
47
+ /**
48
+ * All mipmap levels
49
+ */
50
+ mipmaps?: ArrayBuffer[];
51
+
52
+ /**
53
+ * Supported container types ('pvr' or 'ktx').
54
+ */
55
+ type: 'pvr' | 'ktx';
56
+
57
+ /**
58
+ * The width of the compressed texture in pixels. Defaults to 0.
59
+ *
60
+ * @default 0
61
+ */
62
+ width: number;
63
+
64
+ /**
65
+ * The height of the compressed texture in pixels.
66
+ **/
67
+ height: number;
68
+ }
69
+
38
70
  /**
39
71
  * Event handler for when a Texture fails to load
40
72
  */
@@ -47,7 +79,7 @@ export interface TextureData {
47
79
  /**
48
80
  * The texture data
49
81
  */
50
- data: ImageBitmap | ImageData | SubTextureProps | null;
82
+ data: ImageBitmap | ImageData | SubTextureProps | CompressedData | null;
51
83
  /**
52
84
  * Premultiply alpha when uploading texture data to the GPU
53
85
  *