@utsp/render 0.11.0-nightly.20251213152020.671c815 → 0.11.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.
@@ -0,0 +1,907 @@
1
+ import { IRenderer, ScalingMode, RGBColor, RenderState } from '@utsp/types';
2
+ export { IRenderer, RenderState, ScalingMode } from '@utsp/types';
3
+
4
+ /**
5
+ * Atlas Utilities
6
+ *
7
+ * Shared utilities for block-based font atlas calculations.
8
+ * Used by both TerminalGL (WebGL) and ImageFontAtlas (Canvas2D).
9
+ */
10
+ /**
11
+ * Number of 256-char blocks in an atlas
12
+ * - 1 block = 16×16 grid = 256 chars (8-bit)
13
+ * - 4 blocks = 32×32 grid = 1024 chars (10-bit)
14
+ * - 16 blocks = 64×64 grid = 4096 chars (12-bit)
15
+ */
16
+ type AtlasBlocks = 1 | 4 | 16;
17
+ /**
18
+ * Get the number of columns in the atlas grid
19
+ * @param blocks - Number of 256-char blocks (1, 4, or 16)
20
+ * @returns Number of character columns (16, 32, or 64)
21
+ */
22
+ declare function getAtlasColumns(blocks: AtlasBlocks): number;
23
+ /**
24
+ * Get the maximum valid charCode for a given atlas size
25
+ * @param blocks - Number of 256-char blocks (1, 4, or 16)
26
+ * @returns Maximum charCode (255, 1023, or 4095)
27
+ */
28
+ declare function getMaxCharCode(blocks: AtlasBlocks): number;
29
+ /**
30
+ * Get character grid position in a block-based atlas
31
+ *
32
+ * Atlas layout for multi-block fonts:
33
+ * - Each block contains 256 chars in a 16×16 grid
34
+ * - Blocks are arranged in a square:
35
+ * - 1 block: 1×1 (16×16 chars total)
36
+ * - 4 blocks: 2×2 (32×32 chars total)
37
+ * - 16 blocks: 4×4 (64×64 chars total)
38
+ *
39
+ * CharCode mapping:
40
+ * charCode 0-255 → Block 0 (top-left)
41
+ * charCode 256-511 → Block 1 (top-right for 4+ blocks)
42
+ * charCode 512-767 → Block 2 (bottom-left for 4 blocks)
43
+ * etc.
44
+ *
45
+ * @param charCode - Character code (0 to maxCharCode)
46
+ * @param blocks - Number of 256-char blocks (1, 4, or 16)
47
+ * @returns Grid position { col, row } in the atlas
48
+ */
49
+ declare function getCharGridPosition(charCode: number, blocks: AtlasBlocks): {
50
+ col: number;
51
+ row: number;
52
+ };
53
+
54
+ /**
55
+ * Représente une cellule du terminal
56
+ */
57
+ interface TerminalCell {
58
+ /** Le caractère à afficher */
59
+ char: string;
60
+ /** Couleur du caractère (format CSS) */
61
+ fgColor: string;
62
+ /** Couleur de fond de la cellule (format CSS) */
63
+ bgColor: string;
64
+ }
65
+ /**
66
+ * Données brutes pour définir le terminal en une fois
67
+ */
68
+ interface TerminalData {
69
+ /** Largeur en cellules */
70
+ width: number;
71
+ /** Hauteur en cellules */
72
+ height: number;
73
+ /** Tableau de cellules (longueur = width * height) */
74
+ cells: Array<{
75
+ /** Code du caractère ou le caractère lui-même */
76
+ char: string;
77
+ /** Couleur du texte (format CSS) */
78
+ fgColor: string;
79
+ /** Couleur de fond (format CSS) */
80
+ bgColor: string;
81
+ }>;
82
+ }
83
+ /**
84
+ * Police bitmap matricielle
85
+ * Map qui associe un code de caractère (charCode) à une représentation bitmap 8x8
86
+ * Chaque Uint8Array contient 8 octets, un par ligne de pixels
87
+ */
88
+ type BitmapFont$1 = Map<number, Uint8Array>;
89
+ /**
90
+ * Type de police à utiliser
91
+ */
92
+ type FontType = {
93
+ type: 'web';
94
+ fontFamily: string;
95
+ fontSize: number;
96
+ } | {
97
+ type: 'bitmap';
98
+ font: BitmapFont$1;
99
+ charWidth: number;
100
+ charHeight: number;
101
+ };
102
+ /**
103
+ * Options pour la configuration du terminal
104
+ */
105
+ interface RenderOptions {
106
+ /** Largeur d'une cellule en pixels (défaut: 10) - ignoré en mode fixedGrid */
107
+ cellWidth?: number;
108
+ /** Hauteur d'une cellule en pixels (défaut: 14) - ignoré en mode fixedGrid */
109
+ cellHeight?: number;
110
+ /** Taille de la police en pixels (défaut: 12) */
111
+ fontSize?: number;
112
+ /** Famille de police (défaut: "monospace") */
113
+ fontFamily?: string;
114
+ /** Couleur de texte par défaut (défaut: "#ffffff") */
115
+ defaultFgColor?: string;
116
+ /** Couleur de fond par défaut (défaut: "#000000") */
117
+ defaultBgColor?: string;
118
+ /** Couleur de fond du canvas lui-même (défaut: transparent). Si null ou undefined, le canvas sera transparent */
119
+ canvasBgColor?: string | null;
120
+ /** Afficher une grille de débogage (défaut: false) */
121
+ showDebugGrid?: boolean;
122
+ /** Couleur de la grille de débogage (défaut: "rgba(255, 0, 0, 0.3)") */
123
+ debugGridColor?: string;
124
+ /** Classes CSS additionnelles pour le canvas */
125
+ className?: string;
126
+ /** Style inline pour le canvas */
127
+ style?: Partial<CSSStyleDeclaration>;
128
+ /** Nombre de colonnes fixe (active le mode fixedGrid) */
129
+ fixedCols?: number;
130
+ /** Nombre de lignes fixe (active le mode fixedGrid) */
131
+ fixedRows?: number;
132
+ /** Ratio largeur/hauteur de cellule pour mode fixedGrid (défaut: 10/14 ≈ 0.714) */
133
+ cellAspectRatio?: number;
134
+ /**
135
+ * Scaling mode for pixel-perfect rendering (default: ScalingMode.None)
136
+ *
137
+ * Controls how the canvas is scaled to fit the container:
138
+ * - ScalingMode.None: Scales cells to fill space, may have sub-pixel artifacts
139
+ * - ScalingMode.Eighth: Snaps to 0.125 increments (1.0, 1.125, 1.25...)
140
+ * - ScalingMode.Quarter: Snaps to 0.25 increments (1.0, 1.25, 1.5...)
141
+ * - ScalingMode.Half: Snaps to 0.5 increments (1.0, 1.5, 2.0...)
142
+ * - ScalingMode.Integer: Integer scaling only (1x, 2x, 3x...), crispest pixels
143
+ *
144
+ * Note: For ImageFont mode, this uses native glyph sizes + CSS transform scaling.
145
+ */
146
+ scalingMode?: ScalingMode;
147
+ }
148
+ /**
149
+ * UTSP Render - Gère une grille de caractères avec couleurs
150
+ * Similaire à un terminal mais avec contrôle total de chaque cellule
151
+ *
152
+ * Implements IRenderer interface for compatibility with TerminalGL and dependency injection.
153
+ */
154
+ declare class Terminal2D implements IRenderer {
155
+ private containerDiv;
156
+ private canvas;
157
+ private ctx;
158
+ private parentElement;
159
+ private cells;
160
+ private cols;
161
+ private rows;
162
+ private fontSize;
163
+ private fontFamily;
164
+ private defaultFgColor;
165
+ private defaultBgColor;
166
+ private canvasBgColor;
167
+ private cellWidth;
168
+ private cellHeight;
169
+ private offsetX;
170
+ private offsetY;
171
+ private fontType;
172
+ private bitmapFont?;
173
+ private bitmapAtlas?;
174
+ private imageAtlas?;
175
+ private bitmapCharWidth;
176
+ private bitmapCharHeight;
177
+ private showDebugGrid;
178
+ private debugGridColor;
179
+ private gridOverlay?;
180
+ private fixedGridMode;
181
+ private fixedCols?;
182
+ private fixedRows?;
183
+ private cellAspectRatio;
184
+ private resizeObserver?;
185
+ private imageDataBuffer?;
186
+ private useImageDataRendering;
187
+ private paletteCache?;
188
+ private scalingMode;
189
+ private currentScale;
190
+ /**
191
+ * Crée une instance de UTSPRender
192
+ * @param parentDiv - L'élément HTML parent dans lequel créer le canvas
193
+ * @param options - Options de configuration du terminal
194
+ */
195
+ constructor(parentDiv: HTMLElement, options?: RenderOptions);
196
+ /**
197
+ * Calcule le nombre de colonnes et de lignes en fonction de la taille du parent
198
+ * et centre le terminal dans le canvas
199
+ *
200
+ * 🎯 PIXEL-PERFECT APPROACH (like TerminalGL):
201
+ * 1. Cell dimensions are ALWAYS integers (native font size)
202
+ * 2. Canvas renders at native resolution (cols * cellWidth)
203
+ * 3. CSS transform: scale() handles visual upscaling
204
+ * 4. Flexbox handles centering
205
+ */
206
+ private calculateGridSize;
207
+ /**
208
+ * Crée une grille vide avec les valeurs par défaut
209
+ */
210
+ private createEmptyGrid;
211
+ /**
212
+ * Active le redimensionnement automatique
213
+ * Recalcule le nombre de colonnes/lignes quand le parent change de taille
214
+ */
215
+ private enableAutoResize;
216
+ /**
217
+ * Définit le contenu d'une cellule
218
+ * @param col - Colonne (0-indexed)
219
+ * @param row - Ligne (0-indexed)
220
+ * @param char - Caractère à afficher
221
+ * @param fgColor - Couleur du texte (optionnel, utilise la valeur par défaut si non fourni)
222
+ * @param bgColor - Couleur de fond (optionnel, utilise la valeur par défaut si non fourni)
223
+ */
224
+ setCell(col: number, row: number, char: string, fgColor?: string, bgColor?: string): void;
225
+ /**
226
+ * Récupère le contenu d'une cellule
227
+ * @param col - Colonne (0-indexed)
228
+ * @param row - Ligne (0-indexed)
229
+ */
230
+ getCell(col: number, row: number): TerminalCell | null;
231
+ /**
232
+ * Écrit une chaîne de caractères à partir d'une position
233
+ * @param col - Colonne de départ
234
+ * @param row - Ligne
235
+ * @param text - Texte à écrire
236
+ * @param fgColor - Couleur du texte (optionnel)
237
+ * @param bgColor - Couleur de fond (optionnel)
238
+ */
239
+ write(col: number, row: number, text: string, fgColor?: string, bgColor?: string): void;
240
+ /**
241
+ * Remplit une zone rectangulaire
242
+ * @param startCol - Colonne de départ
243
+ * @param startRow - Ligne de départ
244
+ * @param width - Largeur en cellules
245
+ * @param height - Hauteur en cellules
246
+ * @param char - Caractère de remplissage
247
+ * @param fgColor - Couleur du texte (optionnel)
248
+ * @param bgColor - Couleur de fond (optionnel)
249
+ */
250
+ fillRect(startCol: number, startRow: number, width: number, height: number, char?: string, fgColor?: string, bgColor?: string): void;
251
+ /**
252
+ * Efface tout le terminal (remplit avec des espaces)
253
+ */
254
+ clear(): void;
255
+ /**
256
+ * Définit tout le contenu du terminal à partir d'un tableau de données
257
+ * Le tableau doit contenir width * height éléments
258
+ * Les cellules sont lues ligne par ligne (row-major order)
259
+ *
260
+ * @param data - Données du terminal avec dimensions et cellules
261
+ * @throws Error si le tableau n'a pas la bonne taille
262
+ *
263
+ * @example
264
+ * terminal.setFromArray({
265
+ * width: 3,
266
+ * height: 2,
267
+ * cells: [
268
+ * { char: 'A', fgColor: '#ff0000', bgColor: '#000000' }, // (0,0)
269
+ * { char: 'B', fgColor: '#00ff00', bgColor: '#000000' }, // (1,0)
270
+ * { char: 'C', fgColor: '#0000ff', bgColor: '#000000' }, // (2,0)
271
+ * { char: 'D', fgColor: '#ffff00', bgColor: '#000000' }, // (0,1)
272
+ * { char: 'E', fgColor: '#ff00ff', bgColor: '#000000' }, // (1,1)
273
+ * { char: 'F', fgColor: '#00ffff', bgColor: '#000000' }, // (2,1)
274
+ * ]
275
+ * });
276
+ */
277
+ setFromArray(data: TerminalData): void;
278
+ /**
279
+ * Rend la grille sur le canvas
280
+ */
281
+ render(): void;
282
+ /**
283
+ * Rendu ultra-rapide avec ImageData (bitmap)
284
+ * ~10-20× plus rapide que fillRect en boucle
285
+ * Fonctionne avec scaling : buffer natif 8×8 puis drawImage() pour upscale
286
+ */
287
+ private renderWithImageData;
288
+ /**
289
+ * Parse une couleur CSS en composantes RGBA
290
+ */
291
+ private parseColorToRGB;
292
+ /**
293
+ * Rendu classique avec fillRect/fillText (compatible scaling, web fonts, etc.)
294
+ */
295
+ private renderClassic;
296
+ /**
297
+ * Dessine un caractère en utilisant une police bitmap
298
+ */
299
+ private drawBitmapChar;
300
+ /**
301
+ * Dessine une grille de débogage pour visualiser les cellules
302
+ */
303
+ private drawDebugGrid;
304
+ /**
305
+ * Obtient le canvas HTML
306
+ */
307
+ getCanvas(): HTMLCanvasElement;
308
+ /**
309
+ * Obtient le contexte 2D
310
+ */
311
+ getContext(): CanvasRenderingContext2D;
312
+ /**
313
+ * Obtient les dimensions de la grille
314
+ */
315
+ getDimensions(): {
316
+ cols: number;
317
+ rows: number;
318
+ };
319
+ /**
320
+ * Obtient les dimensions des cellules
321
+ */
322
+ getCellDimensions(): {
323
+ cellWidth: number;
324
+ cellHeight: number;
325
+ };
326
+ /**
327
+ * Obtient la largeur d'une cellule
328
+ */
329
+ getCellWidth(): number;
330
+ /**
331
+ * Obtient la hauteur d'une cellule
332
+ */
333
+ getCellHeight(): number;
334
+ /**
335
+ * Get current scaling factor (for pixel-perfect modes)
336
+ * Returns 1 if scalingMode is None or not using ImageFont
337
+ */
338
+ getCurrentScale(): number;
339
+ /**
340
+ * Get scaling mode
341
+ */
342
+ getScalingMode(): ScalingMode;
343
+ /**
344
+ * Obtient les décalages de centrage du terminal
345
+ */
346
+ getOffsets(): {
347
+ offsetX: number;
348
+ offsetY: number;
349
+ };
350
+ /**
351
+ * Active ou désactive la grille de débogage
352
+ * @param show - true pour afficher la grille, false pour la masquer
353
+ */
354
+ setDebugGrid(show: boolean): void;
355
+ /**
356
+ * Change la couleur de fond du canvas
357
+ * @param color - Couleur CSS (ex: "#000000", "rgba(0,0,0,0.5)") ou null pour transparent
358
+ */
359
+ setCanvasBackgroundColor(color: string | null): void;
360
+ /**
361
+ * Obtient la couleur de fond actuelle du canvas
362
+ * @returns La couleur de fond ou null si transparent
363
+ */
364
+ getCanvasBackgroundColor(): string | null;
365
+ /**
366
+ * Active le mode grille fixe avec le nombre de colonnes/lignes spécifié
367
+ * Les cellules s'adapteront en taille pour maintenir les dimensions demandées
368
+ * @param cols - Nombre de colonnes fixe
369
+ * @param rows - Nombre de lignes fixe
370
+ * @param aspectRatio - Ratio largeur/hauteur de cellule (optionnel, défaut: 10/14)
371
+ */
372
+ setFixedGrid(cols: number, rows: number, aspectRatio?: number): void;
373
+ /**
374
+ * Désactive le mode grille fixe et revient au mode adaptatif
375
+ * @param cellWidth - Largeur de cellule en pixels (optionnel)
376
+ * @param cellHeight - Hauteur de cellule en pixels (optionnel)
377
+ */
378
+ setAdaptiveGrid(cellWidth?: number, cellHeight?: number): void;
379
+ /**
380
+ * Vérifie si le terminal est en mode grille fixe
381
+ */
382
+ isFixedGridMode(): boolean;
383
+ /**
384
+ * Définit la couleur de la grille de débogage
385
+ * @param color - Couleur CSS (ex: "rgba(255, 0, 0, 0.3)" ou "#ff0000")
386
+ */
387
+ setDebugGridColor(color: string): void;
388
+ /**
389
+ * Vérifie si la grille de débogage est activée
390
+ */
391
+ isDebugGridEnabled(): boolean;
392
+ /**
393
+ * Active ou désactive le rendu optimisé avec ImageData
394
+ * Uniquement disponible pour les polices bitmap à taille native (pas de scaling)
395
+ * Environ 10-20× plus rapide que le rendu classique, idéal pour les benchmarks
396
+ *
397
+ * @param enable - true pour activer, false pour désactiver
398
+ */
399
+ setImageDataRendering(enable: boolean): void;
400
+ /**
401
+ * Vérifie si le rendu ImageData est activé
402
+ */
403
+ isImageDataRenderingEnabled(): boolean;
404
+ /**
405
+ * Configure une police web (CSS)
406
+ * @param fontFamily - Nom de la police CSS (ex: "Courier New", "monospace")
407
+ * @param fontSize - Taille de la police en pixels (optionnel, garde la taille actuelle si non spécifié)
408
+ */
409
+ setWebFont(fontFamily: string, fontSize?: number): void;
410
+ /**
411
+ * Configure une police bitmap matricielle
412
+ * @param font - Map contenant les définitions bitmap des caractères (charCode -> Uint8Array)
413
+ * @param charWidth - Largeur du glyphe en pixels (bitmap source)
414
+ * @param charHeight - Hauteur du glyphe en pixels (bitmap source)
415
+ * @param cellWidth - Largeur de la cellule de rendu en pixels
416
+ * @param cellHeight - Hauteur de la cellule de rendu en pixels
417
+ */
418
+ setBitmapFont(font: BitmapFont$1, charWidth: number, charHeight: number, cellWidth: number, cellHeight: number): void;
419
+ /**
420
+ * Configure une police image (atlas PNG)
421
+ * @param imageData - Données PNG brutes
422
+ * @param glyphWidth - Largeur du glyphe en pixels
423
+ * @param glyphHeight - Hauteur du glyphe en pixels
424
+ * @param cellWidth - Largeur de la cellule en pixels
425
+ * @param cellHeight - Hauteur de la cellule en pixels
426
+ * @param atlasBlocks - Nombre de blocs de 256 caractères (1, 4, ou 16)
427
+ */
428
+ setImageFont(imageData: Uint8Array, glyphWidth: number, glyphHeight: number, cellWidth: number, cellHeight: number, atlasBlocks: AtlasBlocks): Promise<void>;
429
+ /**
430
+ * Retourne le type de police actuellement utilisé
431
+ */
432
+ getFontType(): 'web' | 'bitmap' | 'image';
433
+ /**
434
+ * Retourne la police bitmap actuelle (si applicable)
435
+ */
436
+ getBitmapFont(): BitmapFont$1 | undefined;
437
+ /**
438
+ * Retourne les dimensions de caractère bitmap (si applicable)
439
+ */
440
+ getBitmapCharDimensions(): {
441
+ width: number;
442
+ height: number;
443
+ } | null;
444
+ /**
445
+ * Set color palette (IRenderer contract).
446
+ * Called by ClientRuntime when Core palette changes.
447
+ *
448
+ * @param palette - Array of 256 RGBA colors
449
+ */
450
+ setPalette(palette: RGBColor[]): void;
451
+ /**
452
+ * Render display data (IRenderer contract).
453
+ * Converts RenderState from Core to cell-based rendering.
454
+ *
455
+ * @param display - Display data with palette indices
456
+ */
457
+ renderDisplayData(display: RenderState): void;
458
+ /**
459
+ * Check if renderer is ready to render (IRenderer contract).
460
+ * Canvas 2D is always ready immediately (no async initialization).
461
+ *
462
+ * @returns Always true for Canvas 2D
463
+ */
464
+ isReady(): boolean;
465
+ /**
466
+ * Get width in columns (IRenderer contract).
467
+ */
468
+ getCols(): number;
469
+ /**
470
+ * Get height in rows (IRenderer contract).
471
+ */
472
+ getRows(): number;
473
+ /**
474
+ * Resize renderer dimensions (IRenderer contract).
475
+ *
476
+ * @param cols - New width in columns
477
+ * @param rows - New height in rows
478
+ */
479
+ resize(cols: number, rows: number): void;
480
+ /**
481
+ * Détruit le terminal et nettoie les ressources
482
+ */
483
+ destroy(): void;
484
+ }
485
+
486
+ /**
487
+ * Police bitmap matricielle
488
+ * Map qui associe un code de caractère (charCode) à une représentation bitmap
489
+ */
490
+ type BitmapFont = Map<number, Uint8Array>;
491
+ /**
492
+ * Atlas à une résolution spécifique
493
+ */
494
+ interface AtlasResolution {
495
+ canvas: HTMLCanvasElement;
496
+ ctx: CanvasRenderingContext2D;
497
+ scale: number;
498
+ charWidth: number;
499
+ charHeight: number;
500
+ }
501
+ /**
502
+ * Classe pour générer et gérer un atlas de police bitmap multi-résolution
503
+ * Convertit une police matricielle (bits) en plusieurs textures canvas à différentes échelles
504
+ * pour un rendu ultra-rapide avec qualité optimale quelque soit le zoom
505
+ *
506
+ * Utilise un cache LRU de glyphes colorés pour éviter la re-colorisation
507
+ */
508
+ declare class BitmapFontAtlas {
509
+ private atlases;
510
+ private charMap;
511
+ private baseCharWidth;
512
+ private baseCharHeight;
513
+ private baseCellWidth;
514
+ private baseCellHeight;
515
+ private atlasColumns;
516
+ private font;
517
+ private readonly SCALES;
518
+ private colorCache;
519
+ private readonly MAX_CACHE_SIZE;
520
+ /**
521
+ * Construit un atlas de police bitmap multi-résolution
522
+ * @param font La police bitmap source
523
+ * @param charWidth Largeur de base d'un caractère en pixels (taille du glyphe dans l'atlas)
524
+ * @param charHeight Hauteur de base d'un caractère en pixels (taille du glyphe dans l'atlas)
525
+ * @param cellWidth Largeur de base d'une cellule en pixels (peut être > charWidth pour l'espacement)
526
+ * @param cellHeight Hauteur de base d'une cellule en pixels (peut être > charHeight pour l'espacement)
527
+ */
528
+ constructor(font: BitmapFont, charWidth: number, charHeight: number, cellWidth?: number, cellHeight?: number); /**
529
+ * Génère les 4 atlas à différentes résolutions (1x, 2x, 4x, 8x)
530
+ * Très rapide: ~4-8ms pour 256 caractères × 4 résolutions
531
+ */
532
+ private generateAtlases;
533
+ /**
534
+ * Récupère ou crée un atlas pour une échelle donnée
535
+ */
536
+ private getOrCreateAtlas;
537
+ /**
538
+ * Rend un caractère bitmap dans un atlas à une résolution donnée
539
+ * Utilise fillRect pour un rendu ultra-rapide
540
+ */
541
+ private renderBitmapToAtlas;
542
+ /**
543
+ * Dessine un caractère en utilisant le cache de glyphes colorés
544
+ * Ultra-rapide: 1 seul drawImage() par caractère
545
+ * Utilise ImageData pour coloriser + Canvas cache pour éviter la re-colorisation
546
+ *
547
+ * @param ctx - Contexte de destination
548
+ * @param charCode - Code du caractère à dessiner
549
+ * @param x - Position X de destination (coin de la cellule)
550
+ * @param y - Position Y de destination (coin de la cellule)
551
+ * @param width - Largeur de la cellule de destination
552
+ * @param height - Hauteur de la cellule de destination
553
+ * @param color - Couleur du caractère (format CSS)
554
+ */
555
+ drawChar(ctx: CanvasRenderingContext2D, charCode: number, x: number, y: number, width: number, height: number, color: string): void;
556
+ /**
557
+ * Crée un glyphe colorisé à partir de l'atlas blanc
558
+ * Utilise ImageData pour une colorisation ultra-rapide
559
+ */
560
+ private createColoredGlyph;
561
+ /**
562
+ * Convertit une couleur hex en RGB
563
+ */
564
+ private hexToRgb;
565
+ /**
566
+ * Élimine les entrées les moins récemment utilisées du cache (LRU)
567
+ */
568
+ private evictLRU;
569
+ /**
570
+ * Retourne le canvas d'atlas pour une résolution donnée (pour débogage/visualisation)
571
+ * Par défaut retourne l'atlas 1x
572
+ */
573
+ getAtlasCanvas(scale?: number): HTMLCanvasElement | undefined;
574
+ /**
575
+ * Retourne tous les atlas disponibles
576
+ */
577
+ getAllAtlases(): Map<number, AtlasResolution>;
578
+ /**
579
+ * Retourne les dimensions de base d'un caractère
580
+ */
581
+ getCharDimensions(): {
582
+ width: number;
583
+ height: number;
584
+ };
585
+ /**
586
+ * Retourne le nombre de caractères dans l'atlas
587
+ */
588
+ getCharCount(): number;
589
+ /**
590
+ * Vérifie si un caractère existe dans l'atlas
591
+ */
592
+ hasChar(charCode: number): boolean;
593
+ /**
594
+ * Retourne les dimensions d'un atlas à une résolution donnée
595
+ */
596
+ getAtlasDimensions(scale?: number): {
597
+ width: number;
598
+ height: number;
599
+ } | undefined;
600
+ /**
601
+ * Exporte un atlas en Data URL (pour débogage)
602
+ * Permet de visualiser l'atlas ou de le sauvegarder
603
+ */
604
+ toDataURL(scale?: number, type?: string): string | undefined;
605
+ /**
606
+ * Retourne les statistiques du cache de glyphes colorés
607
+ */
608
+ getCacheStats(): {
609
+ size: number;
610
+ maxSize: number;
611
+ hitRate?: number;
612
+ };
613
+ /**
614
+ * Vide le cache de glyphes colorés
615
+ */
616
+ clearCache(): void;
617
+ /**
618
+ * Libère les ressources
619
+ */
620
+ destroy(): void;
621
+ }
622
+
623
+ /**
624
+ * ImageFontAtlas - Atlas for PNG-based fonts with multi-block support
625
+ *
626
+ * Supports 1, 4, or 16 blocks of 256 characters each:
627
+ * - 1 block = 16×16 grid = 256 chars (8-bit)
628
+ * - 4 blocks = 32×32 grid = 1024 chars (10-bit)
629
+ * - 16 blocks = 64×64 grid = 4096 chars (12-bit)
630
+ */
631
+
632
+ /**
633
+ * Configuration for ImageFontAtlas
634
+ */
635
+ interface ImageFontAtlasConfig {
636
+ glyphWidth: number;
637
+ glyphHeight: number;
638
+ cellWidth?: number;
639
+ cellHeight?: number;
640
+ atlasBlocks: AtlasBlocks;
641
+ }
642
+ /**
643
+ * ImageFontAtlas class
644
+ * Manages a PNG-based font atlas with support for extended character sets
645
+ */
646
+ declare class ImageFontAtlas {
647
+ private atlasCanvas;
648
+ private atlasCtx;
649
+ private atlasImage;
650
+ private readonly glyphWidth;
651
+ private readonly glyphHeight;
652
+ private readonly cellWidth;
653
+ private readonly cellHeight;
654
+ private readonly atlasBlocks;
655
+ private readonly atlasColumns;
656
+ private readonly maxCharCode;
657
+ private isLoaded;
658
+ private colorCache;
659
+ private readonly MAX_CACHE_SIZE;
660
+ constructor(config: ImageFontAtlasConfig);
661
+ /**
662
+ * Load atlas from PNG binary data
663
+ * @param pngData PNG image as Uint8Array
664
+ * @returns Promise that resolves when atlas is loaded
665
+ */
666
+ loadFromPNG(pngData: Uint8Array): Promise<void>;
667
+ /**
668
+ * Check if atlas is loaded and ready
669
+ */
670
+ isReady(): boolean;
671
+ /**
672
+ * Get glyph position in atlas
673
+ * @param charCode Character code (0 to maxCharCode)
674
+ * @returns Position { x, y } or null if out of range
675
+ */
676
+ getGlyphPosition(charCode: number): {
677
+ x: number;
678
+ y: number;
679
+ } | null;
680
+ /**
681
+ * Get UV coordinates for a character (block-based layout)
682
+ * @param charCode Character code
683
+ * @returns UV coordinates { u1, v1, u2, v2 } or null if invalid
684
+ */
685
+ getCharUV(charCode: number): {
686
+ u1: number;
687
+ v1: number;
688
+ u2: number;
689
+ v2: number;
690
+ } | null;
691
+ /**
692
+ * Draw a character to a canvas context
693
+ * @param ctx Destination context
694
+ * @param charCode Character to draw
695
+ * @param x Destination X
696
+ * @param y Destination Y
697
+ * @param width Destination width
698
+ * @param height Destination height
699
+ * @param color Color for the glyph (CSS color string)
700
+ */
701
+ drawChar(ctx: CanvasRenderingContext2D, charCode: number, x: number, y: number, width: number, height: number, color: string): void;
702
+ /**
703
+ * Create a colored glyph from the atlas
704
+ */
705
+ private createColoredGlyph;
706
+ /**
707
+ * Parse CSS color to RGB
708
+ */
709
+ private parseColor;
710
+ /**
711
+ * Evict least recently used cache entry
712
+ */
713
+ private evictLRU;
714
+ /**
715
+ * Get the atlas canvas (for WebGL texture upload)
716
+ */
717
+ getAtlasCanvas(): HTMLCanvasElement | null;
718
+ /**
719
+ * Get the atlas image (for WebGL texture upload)
720
+ */
721
+ getAtlasImage(): HTMLImageElement | null;
722
+ /**
723
+ * Get atlas configuration
724
+ */
725
+ getConfig(): ImageFontAtlasConfig;
726
+ /**
727
+ * Get glyph dimensions
728
+ */
729
+ getGlyphDimensions(): {
730
+ width: number;
731
+ height: number;
732
+ };
733
+ /**
734
+ * Get cell dimensions
735
+ */
736
+ getCellDimensions(): {
737
+ width: number;
738
+ height: number;
739
+ };
740
+ /**
741
+ * Get atlas dimensions
742
+ */
743
+ getAtlasDimensions(): {
744
+ width: number;
745
+ height: number;
746
+ };
747
+ /**
748
+ * Get number of atlas columns
749
+ */
750
+ getAtlasColumns(): number;
751
+ /**
752
+ * Get maximum supported character code
753
+ */
754
+ getMaxCharCode(): number;
755
+ /**
756
+ * Check if a character code is valid
757
+ */
758
+ isValidCharCode(charCode: number): boolean;
759
+ /**
760
+ * Clear the color cache
761
+ */
762
+ clearCache(): void;
763
+ /**
764
+ * Get cache statistics
765
+ */
766
+ getCacheStats(): {
767
+ size: number;
768
+ maxSize: number;
769
+ };
770
+ /**
771
+ * Destroy and release resources
772
+ */
773
+ destroy(): void;
774
+ }
775
+
776
+ /**
777
+ * 🔲 GridOverlay - Classe réutilisable pour gérer le canvas de grille de débogage
778
+ *
779
+ * Gère un canvas 2D superposé qui affiche une grille de cellules.
780
+ * Au lieu de simples lignes, dessine un cadre fin à l'intérieur de chaque cellule
781
+ * pour une meilleure visualisation.
782
+ *
783
+ * @example
784
+ * ```typescript
785
+ * const grid = new GridOverlay(containerElement);
786
+ * grid.setDimensions(80, 24, 10, 16);
787
+ * grid.render();
788
+ * ```
789
+ */
790
+ declare class GridOverlay {
791
+ private canvas;
792
+ private ctx;
793
+ private container;
794
+ private cols;
795
+ private rows;
796
+ private cellWidth;
797
+ private cellHeight;
798
+ private offsetX;
799
+ private offsetY;
800
+ private strokeColor;
801
+ private lineWidth;
802
+ /**
803
+ * Crée une nouvelle overlay de grille
804
+ * @param container - Élément parent qui contiendra le canvas
805
+ * @param options - Options de configuration
806
+ */
807
+ constructor(container: HTMLElement, options?: {
808
+ strokeColor?: string;
809
+ lineWidth?: number;
810
+ zIndex?: number;
811
+ });
812
+ /**
813
+ * Configure les dimensions de la grille
814
+ * @param cols - Nombre de colonnes
815
+ * @param rows - Nombre de lignes
816
+ * @param cellWidth - Largeur d'une cellule en pixels
817
+ * @param cellHeight - Hauteur d'une cellule en pixels
818
+ * @param offsetX - Décalage horizontal (optionnel)
819
+ * @param offsetY - Décalage vertical (optionnel)
820
+ */
821
+ setDimensions(cols: number, rows: number, cellWidth: number, cellHeight: number, offsetX?: number, offsetY?: number): void;
822
+ /**
823
+ * Configure la taille physique du canvas
824
+ * Le canvas doit avoir la MÊME approche que le canvas principal WebGL :
825
+ * - Résolution physique = dimensions de base (SANS DPR)
826
+ * - Taille CSS = dimensions de base
827
+ * - Le scaling visuel est fait via transform: scale()
828
+ *
829
+ * @param baseWidth - Largeur de base en pixels
830
+ * @param baseHeight - Hauteur de base en pixels
831
+ */
832
+ setCanvasSize(baseWidth: number, baseHeight: number): void;
833
+ /**
834
+ * Configure les options visuelles
835
+ * @param options - Options de rendu
836
+ */
837
+ setStyle(options: {
838
+ strokeColor?: string;
839
+ lineWidth?: number;
840
+ }): void;
841
+ /**
842
+ * Configure la transformation et le positionnement du canvas de grille
843
+ * pour qu'il corresponde exactement au canvas principal (pixel-perfect scaling)
844
+ *
845
+ * APPROCHE SIMPLE : On ne fait PAS de transform: scale().
846
+ * On définit le canvas à la taille finale (scalée) directement,
847
+ * et on le positionne exactement où est le canvas principal.
848
+ *
849
+ * Le dessin de la grille doit alors être fait à l'échelle scalée.
850
+ *
851
+ * @param scale - Facteur de scale (même valeur que le canvas principal)
852
+ * @param baseWidth - Largeur de base du canvas (avant scale)
853
+ * @param baseHeight - Hauteur de base du canvas (avant scale)
854
+ * @param mainCanvasRect - Le getBoundingClientRect() du canvas principal
855
+ * @param containerRect - Le getBoundingClientRect() du container
856
+ */
857
+ setTransform(_scale: number, _baseWidth: number, _baseHeight: number, mainCanvasRect: DOMRect, containerRect: DOMRect): void;
858
+ /**
859
+ * Dessine la grille avec des lignes fines continues
860
+ * Les lignes sont dessinées aux bords exacts des cellules.
861
+ */
862
+ render(): void;
863
+ /**
864
+ * Met à jour et redessine la grille avec de nouvelles dimensions
865
+ * Méthode pratique qui combine setDimensions, setCanvasSize et render
866
+ *
867
+ * @param cols - Nombre de colonnes
868
+ * @param rows - Nombre de lignes
869
+ * @param cellWidth - Largeur d'une cellule
870
+ * @param cellHeight - Hauteur d'une cellule
871
+ * @param displayWidth - Largeur d'affichage du canvas
872
+ * @param displayHeight - Hauteur d'affichage du canvas
873
+ * @param offsetX - Décalage horizontal (optionnel)
874
+ * @param offsetY - Décalage vertical (optionnel)
875
+ */
876
+ update(cols: number, rows: number, cellWidth: number, cellHeight: number, displayWidth: number, displayHeight: number, offsetX?: number, offsetY?: number): void;
877
+ /**
878
+ * Affiche ou cache la grille
879
+ * @param visible - true pour afficher, false pour cacher
880
+ */
881
+ setVisible(visible: boolean): void;
882
+ /**
883
+ * Supprime le canvas de grille du DOM
884
+ */
885
+ destroy(): void;
886
+ /**
887
+ * Retourne le canvas HTML
888
+ */
889
+ getCanvas(): HTMLCanvasElement;
890
+ }
891
+
892
+ /**
893
+ * Default color palette (VGA colors + extended)
894
+ * Maps palette index to CSS color string
895
+ */
896
+ declare const DEFAULT_PALETTE: readonly string[];
897
+ /**
898
+ * Convert a color palette index to CSS color string
899
+ */
900
+ declare function paletteIndexToColor(index: number, palette?: readonly string[]): string;
901
+ /**
902
+ * Convert CSS color string to palette index (finds closest match)
903
+ */
904
+ declare function colorToPaletteIndex(color: string, palette?: readonly string[]): number;
905
+
906
+ export { BitmapFontAtlas, DEFAULT_PALETTE, GridOverlay, ImageFontAtlas, Terminal2D, colorToPaletteIndex, getAtlasColumns, getCharGridPosition, getMaxCharCode, paletteIndexToColor };
907
+ export type { AtlasBlocks, BitmapFont$1 as BitmapFont, FontType, ImageFontAtlasConfig, RenderOptions, TerminalCell, TerminalData };