@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.
- package/dist/exports/main-api.d.ts +1 -0
- package/dist/src/core/CoreShaderManager.d.ts +13 -6
- package/dist/src/core/CoreShaderManager.js +6 -6
- package/dist/src/core/CoreShaderManager.js.map +1 -1
- package/dist/src/core/lib/WebGlContextWrapper.d.ts +9 -0
- package/dist/src/core/lib/WebGlContextWrapper.js +12 -0
- package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
- package/dist/src/core/lib/textureCompression.d.ts +16 -0
- package/dist/src/core/lib/textureCompression.js +129 -0
- package/dist/src/core/lib/textureCompression.js.map +1 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +12 -0
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +4 -0
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +11 -0
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +10 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +21 -7
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +2 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
- package/dist/src/core/textures/ImageTexture.js +5 -0
- package/dist/src/core/textures/ImageTexture.js.map +1 -1
- package/dist/src/core/textures/Texture.d.ts +28 -1
- package/dist/src/core/textures/Texture.js.map +1 -1
- package/dist/src/main-api/Inspector.d.ts +15 -0
- package/dist/src/main-api/Inspector.js +216 -0
- package/dist/src/main-api/Inspector.js.map +1 -0
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/exports/main-api.ts +9 -0
- package/package.json +1 -1
- package/src/core/CoreShaderManager.ts +39 -6
- package/src/core/lib/WebGlContextWrapper.ts +27 -0
- package/src/core/lib/textureCompression.ts +152 -0
- package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +20 -0
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +15 -1
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +12 -4
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +4 -1
- package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +14 -1
- package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +42 -8
- package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -2
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +2 -1
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +4 -1
- package/src/core/textures/ImageTexture.ts +9 -0
- 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(
|
|
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:
|
|
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
|
-
|
|
353
|
-
this._settings.textBaseline
|
|
354
|
-
|
|
355
|
-
lineHeight
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
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
|
-
?
|
|
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.
|
|
@@ -160,7 +160,8 @@ export function layoutText(
|
|
|
160
160
|
(maxLines === 0 || curLineIndex + 1 < maxLines) &&
|
|
161
161
|
(contain !== 'both' ||
|
|
162
162
|
scrollable ||
|
|
163
|
-
curY + vertexLineHeight +
|
|
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(
|
|
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
|
*
|