textmode.js 0.7.1 → 0.8.0-beta.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 (54) hide show
  1. package/dist/textmode.esm.js +2042 -2108
  2. package/dist/textmode.umd.js +16 -16
  3. package/dist/types/Textmode.d.ts +11 -11
  4. package/dist/types/errors/index.d.ts +1 -1
  5. package/dist/types/index.d.ts +11 -3
  6. package/dist/types/rendering/webgl/core/Framebuffer.d.ts +0 -6
  7. package/dist/types/rendering/webgl/core/Renderer.d.ts +7 -6
  8. package/dist/types/rendering/webgl/core/interfaces/IFramebuffer.d.ts +6 -6
  9. package/dist/types/rendering/webgl/core/interfaces/IRenderer.d.ts +3 -3
  10. package/dist/types/rendering/webgl/index.d.ts +2 -2
  11. package/dist/types/rendering/webgl/pipeline/MaterialBatchPipeline.d.ts +1 -1
  12. package/dist/types/textmode/Canvas.d.ts +2 -2
  13. package/dist/types/textmode/Grid.d.ts +32 -3
  14. package/dist/types/textmode/Textmodifier.d.ts +14 -72
  15. package/dist/types/textmode/conversion/ConversionManager.d.ts +73 -0
  16. package/dist/types/textmode/conversion/ConversionRegistry.d.ts +61 -18
  17. package/dist/types/textmode/conversion/index.d.ts +3 -1
  18. package/dist/types/textmode/filters/FilterManager.d.ts +0 -4
  19. package/dist/types/textmode/filters/index.d.ts +1 -1
  20. package/dist/types/textmode/interfaces/ITextmodifier.d.ts +165 -50
  21. package/dist/types/textmode/layers/Layer2DCompositor.d.ts +13 -20
  22. package/dist/types/textmode/layers/LayerManager.d.ts +31 -20
  23. package/dist/types/textmode/layers/TextmodeLayer.d.ts +58 -20
  24. package/dist/types/textmode/layers/interfaces/ILayerManager.d.ts +7 -0
  25. package/dist/types/textmode/layers/interfaces/ITextmodeLayer.d.ts +49 -28
  26. package/dist/types/textmode/layers/types.d.ts +16 -21
  27. package/dist/types/textmode/loadables/ITextmodeSource.d.ts +123 -0
  28. package/dist/types/textmode/loadables/TextmodeImage.d.ts +2 -2
  29. package/dist/types/textmode/loadables/TextmodeSource.d.ts +10 -118
  30. package/dist/types/textmode/loadables/font/CharacterExtractor.d.ts +1 -1
  31. package/dist/types/textmode/loadables/font/TextmodeFont.d.ts +3 -0
  32. package/dist/types/textmode/loadables/font/index.d.ts +2 -2
  33. package/dist/types/textmode/loadables/index.d.ts +0 -2
  34. package/dist/types/textmode/loadables/video/ITextmodeVideo.d.ts +75 -0
  35. package/dist/types/textmode/loadables/video/TextmodeVideo.d.ts +23 -126
  36. package/dist/types/textmode/loading/LoadingPhase.d.ts +26 -0
  37. package/dist/types/textmode/loading/LoadingScreenManager.d.ts +91 -93
  38. package/dist/types/textmode/loading/index.d.ts +3 -2
  39. package/dist/types/textmode/loading/types.d.ts +57 -57
  40. package/dist/types/textmode/managers/MouseManager.d.ts +24 -14
  41. package/dist/types/textmode/managers/TouchManager.d.ts +25 -13
  42. package/dist/types/textmode/mixins/index.d.ts +1 -2
  43. package/dist/types/textmode/mixins/interfaces/IAnimationMixin.d.ts +87 -87
  44. package/dist/types/textmode/mixins/interfaces/IKeyboardMixin.d.ts +128 -128
  45. package/dist/types/textmode/mixins/interfaces/IMouseMixin.d.ts +96 -105
  46. package/dist/types/textmode/mixins/interfaces/IRenderingMixin.d.ts +271 -370
  47. package/dist/types/textmode/mixins/interfaces/ITouchMixin.d.ts +1 -1
  48. package/dist/types/textmode/types.d.ts +2 -6
  49. package/package.json +5 -2
  50. package/dist/types/textmode/layers/filters/index.d.ts +0 -6
  51. package/dist/types/textmode/loadables/video/TextmodeVideoPreloader.d.ts +0 -29
  52. package/dist/types/textmode/loadables/video/types.d.ts +0 -43
  53. package/dist/types/textmode/mixins/FontMixin.d.ts +0 -8
  54. package/dist/types/textmode/mixins/interfaces/IFontMixin.d.ts +0 -46
@@ -13,17 +13,17 @@ export declare class Textmode {
13
13
  * @param opts Configuration options for the Textmodifier instance
14
14
  * @returns A new Textmodifier instance
15
15
  *
16
- * @example
17
- * ```javascript
18
- * const t = textmode.create({ width: 800, height: 600, fontSize: 16 });
19
- *
20
- * t.draw(() => {
21
- * t.background(0);
22
- * t.char("x");
23
- * t.rotateZ(t.frameCount);
24
- * t.rect(10, 10);
25
- * });
26
- * ```
16
+ * @example
17
+ * ```javascript
18
+ * const t = textmode.create({ width: 800, height: 600, fontSize: 16 });
19
+ *
20
+ * t.draw(() => {
21
+ * t.background(0);
22
+ * t.char("x");
23
+ * t.rotateZ(t.frameCount);
24
+ * t.rect(10, 10);
25
+ * });
26
+ * ```
27
27
  */
28
28
  static create(opts?: TextmodeOptions): Textmodifier;
29
29
  /**
@@ -1,2 +1,2 @@
1
1
  export { TextmodeError } from './Error';
2
- export { TextmodeErrorHandler, errorHandler, TextmodeErrorLevel, type ErrorHandlerOptions, } from './ErrorHandler';
2
+ export { TextmodeErrorHandler, errorHandler, TextmodeErrorLevel, type ErrorHandlerOptions } from './ErrorHandler';
@@ -6,9 +6,17 @@ export { TextmodeCanvas } from './textmode/Canvas';
6
6
  export { TextmodeGrid } from './textmode/Grid';
7
7
  export type { TextmodeOptions } from './textmode/types';
8
8
  export type { TextmodeFramebufferOptions } from './rendering/webgl';
9
- export { registerConversionStrategy, unregisterConversionStrategy, getConversionStrategy, } from './textmode/conversion';
10
- export type { TextmodeConversionStrategy, TextmodeConversionContext, TextmodeConversionMode, } from './textmode/conversion';
11
- export type { TextmodePlugin, TextmodePluginAPI, } from './textmode/managers/PluginManager';
9
+ /**
10
+ * All media conversion related modules and types.
11
+ *
12
+ * Responsible for converting images and videos into textmode-renderable formats,
13
+ * using various conversion strategies, like brightness- or edge-detection-based conversion.
14
+ *
15
+ * `textmode.js` only comes with a built-in `'brightness'`-based conversion strategy,
16
+ * but custom strategies can be registered via {@link TextmodeConversionManager.register}.
17
+ */
18
+ export * as conversion from './textmode/conversion';
19
+ export type { TextmodePlugin, TextmodePluginAPI } from './textmode/managers/PluginManager';
12
20
  /** All filter related modules and types. */
13
21
  export * as filters from './textmode/filters';
14
22
  export { TextmodeErrorLevel } from './errors/ErrorHandler';
@@ -69,13 +69,7 @@ export declare class GLFramebuffer implements IFramebuffer {
69
69
  $update(source: HTMLCanvasElement | HTMLVideoElement): void;
70
70
  resize(width: number, height: number): void;
71
71
  readPixels(attachmentIndex: number): Uint8Array;
72
- /**
73
- * Begin rendering to this framebuffer.
74
- */
75
72
  begin(): void;
76
- /**
77
- * End rendering to this framebuffer and restore previous state.
78
- */
79
73
  end(): void;
80
74
  /**
81
75
  * Get or create the material for rendering this framebuffer.
@@ -1,9 +1,10 @@
1
- import { GLFramebuffer } from "./Framebuffer";
1
+ import { GLFramebuffer } from './Framebuffer';
2
2
  import type { FramebufferOptions } from './Framebuffer';
3
- import { GLShader } from "./Shader";
4
- import { RenderState } from "../state/RenderState";
3
+ import { GLShader } from './Shader';
4
+ import { RenderState } from '../state/RenderState';
5
5
  import type { TextmodeSource } from '../../../textmode/loadables/TextmodeSource';
6
- import type { IRenderer } from "./interfaces/IRenderer";
6
+ import type { TextmodeFont } from '../../../textmode/loadables/font/TextmodeFont';
7
+ import type { IRenderer } from './interfaces/IRenderer';
7
8
  import { MaterialManager } from '../materials/MaterialManager';
8
9
  export declare class GLRenderer implements IRenderer {
9
10
  private _gl;
@@ -45,7 +46,7 @@ export declare class GLRenderer implements IRenderer {
45
46
  $setUniform(name: string, value: any): void;
46
47
  $setUserUniforms(uniforms: Record<string, any>): void;
47
48
  $createFilterShader(fragmentSource: string): GLShader;
48
- $image(source: GLFramebuffer | TextmodeSource, width?: number, height?: number): void;
49
+ $image(source: GLFramebuffer | TextmodeSource, width?: number, height?: number, activeFont?: TextmodeFont): void;
49
50
  $quad(x: number, y: number, width: number, height: number): void;
50
51
  $rect(width: number, height: number): void;
51
52
  $line(x1: number, y1: number, x2: number, y2: number): void;
@@ -68,7 +69,7 @@ export declare class GLRenderer implements IRenderer {
68
69
  $resetViewport(): void;
69
70
  $flushInstances(): void;
70
71
  $dispose(): void;
71
- get context(): WebGLRenderingContext;
72
+ get context(): WebGL2RenderingContext;
72
73
  get state(): RenderState;
73
74
  get materialManager(): MaterialManager;
74
75
  }
@@ -24,11 +24,11 @@ export interface IFramebuffer {
24
24
  *
25
25
  * Useful for binding textures for reading in shaders.
26
26
  *
27
- * Textmode framebuffers allocate 4 attachments by default:
28
- * - 0: Character data encoded in red and green channels
29
- * - 1: Character colors
30
- * - 2: Cell background colors
31
- * - 3: Inversion, horizontal/flip flags, and rotation encoded in red, green, blue, alpha channels
27
+ * Textmode framebuffers allocate 4 attachments by default:
28
+ * - 0: Character data encoded in red and green channels
29
+ * - 1: Character colors
30
+ * - 2: Cell background colors
31
+ * - 3: Inversion, horizontal/flip flags, and rotation encoded in red, green, blue, alpha channels
32
32
  */
33
33
  readonly textures: WebGLTexture[];
34
34
  /**
@@ -59,7 +59,7 @@ export interface IFramebuffer {
59
59
  * 0. Character data and transform info<br/>
60
60
  * 1. Character colors<br/>
61
61
  * 2. Cell background colors<br/>
62
- * @returns A Uint8Array containing the pixel data in RGBA format
62
+ * @returns A Uint8Array containing the pixel data in RGBA format
63
63
  */
64
64
  readPixels(attachmentIndex: number): Uint8Array;
65
65
  /**
@@ -1,6 +1,6 @@
1
- import type { GLFramebuffer, FramebufferOptions } from "../Framebuffer";
2
- import type { GLShader } from "../Shader";
3
- import type { RenderState } from "../../state/RenderState";
1
+ import type { GLFramebuffer, FramebufferOptions } from '../Framebuffer';
2
+ import type { GLShader } from '../Shader';
3
+ import type { RenderState } from '../../state/RenderState';
4
4
  /**
5
5
  * Interface for the core WebGL renderer that manages the WebGL context and provides high-level rendering operations.
6
6
  *
@@ -5,8 +5,8 @@ export * from './utils/ViewportCache';
5
5
  export * from './geometries/immediate/ImmediateQuad';
6
6
  export * from './pipeline';
7
7
  export { GeometryType } from './types/GeometryTypes';
8
- export type { IGeometry as IInstancedGeometry, UnitGeometryData, RectangleParams, LineParams, EllipseParams, ArcParams, TriangleParams, BezierCurveParams, GeometryParams } from './types/GeometryTypes';
9
- export type { RenderContext, } from './types/RenderTypes';
8
+ export type { IGeometry as IInstancedGeometry, UnitGeometryData, RectangleParams, LineParams, EllipseParams, ArcParams, TriangleParams, BezierCurveParams, GeometryParams, } from './types/GeometryTypes';
9
+ export type { RenderContext } from './types/RenderTypes';
10
10
  export type { InstanceData } from './batching/InstanceData';
11
11
  export { PackedInstanceData, InstanceAttributeLayout } from './batching/InstanceData';
12
12
  export { InstanceBatch } from './batching/InstanceBatch';
@@ -53,7 +53,7 @@ export declare class MaterialBatchPipeline {
53
53
  * Render a single batch of commands with the same material and geometry type.
54
54
  * Uses instanced rendering for maximum efficiency.
55
55
  *
56
- * @param batch - Batch to render
56
+ * @param batch - Batch to render
57
57
  */
58
58
  private _renderBatch;
59
59
  /**
@@ -1,5 +1,5 @@
1
- import type { TextmodeOptions } from "./types";
2
- import { type RGBA } from "./utils/cssColor";
1
+ import type { TextmodeOptions } from './types';
2
+ import { type RGBA } from './utils/cssColor';
3
3
  /**
4
4
  * Manages a `HTMLCanvasElement` for textmode rendering.
5
5
  * @ignore
@@ -1,7 +1,5 @@
1
1
  /**
2
- * Manages the grid of a {@link Textmodifier} instance.
3
- *
4
- * Can be accessed via {@link Textmodifier.grid}.
2
+ * Manages the grid of each `TextmodeLayer` instance.
5
3
  */
6
4
  export declare class TextmodeGrid {
7
5
  /** The number of columns in the grid. */
@@ -22,6 +20,12 @@ export declare class TextmodeGrid {
22
20
  private _cellWidth;
23
21
  /** The height of each cell in the grid. */
24
22
  private _cellHeight;
23
+ /** Tracks whether cols/rows were manually overridden. */
24
+ private _manualDimensionsSet;
25
+ /** Hooks to notify listeners when grid dimensions change. */
26
+ private _dimensionChangeListeners;
27
+ /** Updates derived metrics (width/height/offset) from current cols/rows. */
28
+ private _syncDerivedDimensions;
25
29
  /**
26
30
  * Create a new grid instance.
27
31
  * @param canvas The canvas element used to determine the grid dimensions.
@@ -30,6 +34,18 @@ export declare class TextmodeGrid {
30
34
  * @ignore
31
35
  */
32
36
  constructor(canvas: HTMLCanvasElement, cellWidth: number, cellHeight: number);
37
+ /**
38
+ * Register a listener invoked whenever grid dimensions change.
39
+ * @param handler The callback function to invoke on dimension changes.
40
+ * @ignore
41
+ */
42
+ $addOnDimensionsChange(handler: () => void): void;
43
+ /**
44
+ * Remove a previously registered dimensions change listener.
45
+ * @param handler The callback function to remove.
46
+ * @ignore
47
+ */
48
+ $removeOnDimensionsChange(handler: () => void): void;
33
49
  /**
34
50
  * Reset the grid to the default number of columns and rows based on the current canvas dimensions, and the grid cell dimensions.
35
51
  * @ignore
@@ -48,8 +64,12 @@ export declare class TextmodeGrid {
48
64
  get cellHeight(): number;
49
65
  /** Returns the number of columns in the grid. */
50
66
  get cols(): number;
67
+ /** Sets the number of columns and locks grid sizing until `responsive()` is called. */
68
+ set cols(newCols: number);
51
69
  /** Returns the number of rows in the grid. */
52
70
  get rows(): number;
71
+ /** Sets the number of rows and locks grid sizing until `responsive()` is called. */
72
+ set rows(newRows: number);
53
73
  /** Returns the total width of the grid. */
54
74
  get width(): number;
55
75
  /** Returns the total height of the grid. */
@@ -58,4 +78,13 @@ export declare class TextmodeGrid {
58
78
  get offsetX(): number;
59
79
  /** Returns the offset to the outer canvas borders on the y-axis when centering the grid. */
60
80
  get offsetY(): number;
81
+ /**
82
+ * Restores responsive sizing so subsequent `t.resizeCanvas` calls recompute cols/rows.
83
+ */
84
+ responsive(): void;
85
+ /**
86
+ * Dispose the grid and remove all listeners.
87
+ * @ignore
88
+ */
89
+ $dispose(): void;
61
90
  }
@@ -3,16 +3,14 @@ import { TextmodeFont } from './loadables/font';
3
3
  import { TextmodeGrid } from './Grid';
4
4
  import { TextmodeCanvas } from './Canvas';
5
5
  import { TextmodeImage } from './loadables/TextmodeImage';
6
- import type { TextmodeSource } from './loadables/TextmodeSource';
7
6
  import { AnimationController } from './AnimationController';
8
7
  import { MouseManager } from './managers/MouseManager';
9
8
  import { KeyboardManager } from './managers/KeyboardManager';
10
9
  import { TouchManager } from './managers/TouchManager';
11
10
  import type { ITextmodifier } from './interfaces';
12
- import type { GLFramebuffer, GLShader } from '../rendering';
11
+ import type { GLShader } from '../rendering';
13
12
  import type { TextmodeOptions } from './types';
14
13
  import type { IAnimationMixin } from './mixins/interfaces/IAnimationMixin';
15
- import type { IFontMixin } from './mixins/interfaces/IFontMixin';
16
14
  import type { IRenderingMixin } from './mixins/interfaces/IRenderingMixin';
17
15
  import type { IKeyboardMixin } from './mixins/interfaces/IKeyboardMixin';
18
16
  import type { ITouchMixin } from './mixins/interfaces/ITouchMixin';
@@ -22,12 +20,13 @@ import { LayerManager } from './layers/LayerManager';
22
20
  import type { TextmodeLayerManager } from './layers';
23
21
  import { TextmodeFilterManager } from './filters';
24
22
  import type { FilterName, BuiltInFilterName, BuiltInFilterParams } from './filters';
23
+ import { TextmodeConversionManager } from './conversion';
25
24
  declare const Textmodifier_base: {
26
25
  new (): {};
27
26
  };
28
27
  /**
29
28
  * Manages textmode rendering on a [`HTMLCanvasElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement) and provides methods for drawing,
30
- * font management, event handling, and animation control.
29
+ * font management, event handling, layer management, animation control, and more. The heart of the `textmode.js` library.
31
30
  *
32
31
  * If the `Textmodifier` instance is created without a canvas parameter,
33
32
  * it creates a new `HTMLCanvasElement` to draw on using the `textmode.js` drawing API.
@@ -35,21 +34,19 @@ declare const Textmodifier_base: {
35
34
  */
36
35
  export declare class Textmodifier extends Textmodifier_base implements ITextmodifier {
37
36
  _renderer: GLRenderer;
38
- _font: TextmodeFont;
39
37
  _canvas: TextmodeCanvas;
40
- _grid: TextmodeGrid;
41
38
  _animationController: AnimationController;
42
39
  _mouseManager: MouseManager;
43
40
  _touchManager: TouchManager;
44
41
  _keyboardManager: KeyboardManager;
45
42
  _loading: LoadingScreenManager;
46
- _textmodeDrawFramebuffer: GLFramebuffer;
47
43
  _textmodeConversionShader: GLShader;
48
- _textmodeFramebuffer: GLFramebuffer;
49
44
  _presentShader: GLShader;
50
45
  _layerManager: TextmodeLayerManager;
51
- /** @internal */
46
+ _activeFont?: TextmodeFont;
47
+ _activeGrid?: TextmodeGrid;
52
48
  _filterManager: TextmodeFilterManager;
49
+ _conversionManager: TextmodeConversionManager;
53
50
  private _globalFilterQueue;
54
51
  private _preFilterFramebuffer;
55
52
  private _postFilterFramebuffer;
@@ -65,7 +62,6 @@ export declare class Textmodifier extends Textmodifier_base implements ITextmodi
65
62
  private _resizeObserver?;
66
63
  private _isOverlay;
67
64
  private _targetCanvasImage?;
68
- _sources: Set<TextmodeSource>;
69
65
  /**
70
66
  * Create a new Textmodifier instance.
71
67
  * @param opts Configuration options for the Textmodifier instance.
@@ -82,79 +78,25 @@ export declare class Textmodifier extends Textmodifier_base implements ITextmodi
82
78
  resizeCanvas(width: number, height: number): void;
83
79
  destroy(): void;
84
80
  private _performDestroy;
85
- setup(callback: () => void | Promise<void>): void;
81
+ filter<T extends BuiltInFilterName>(name: T, params?: BuiltInFilterParams[T]): void;
82
+ filter(name: FilterName, params?: unknown): void;
83
+ loadFont(fontSource: string): Promise<TextmodeFont>;
84
+ fontSize(size: number): void;
85
+ setup(callback: () => void | Promise<void>): Promise<void>;
86
86
  draw(callback: () => void): void;
87
87
  windowResized(callback: () => void): void;
88
- get grid(): TextmodeGrid;
88
+ get grid(): TextmodeGrid | undefined;
89
89
  get font(): TextmodeFont;
90
90
  get width(): number;
91
91
  get height(): number;
92
92
  get canvas(): HTMLCanvasElement;
93
- get drawFramebuffer(): GLFramebuffer;
94
93
  get isDisposed(): boolean;
95
94
  get overlay(): TextmodeImage | undefined;
96
95
  get loading(): LoadingScreenManager;
97
96
  get layers(): LayerManager;
98
- /**
99
- * Access the filter manager for this Textmodifier instance.
100
- *
101
- * Use this to register custom filters that can be applied both globally
102
- * (via {@link filter}) and on individual layers (via {@link TextmodeLayer.filter}).
103
- * Filters only need to be registered once and are available everywhere.
104
- *
105
- * @example
106
- * ```typescript
107
- * // Register a custom filter once
108
- * await t.filters.register('vignette', vignetteShader, {
109
- * u_intensity: ['intensity', 0.5]
110
- * });
111
- *
112
- * t.draw(() => {
113
- * t.background(0);
114
- * t.char('A');
115
- * t.rect(10, 10);
116
- *
117
- * // Apply filter globally to final output
118
- * t.filter('vignette', { intensity: 0.8 });
119
- *
120
- * // Or apply to a specific layer
121
- * t.layers.base.filter('vignette', 0.5);
122
- * });
123
- * ```
124
- */
125
97
  get filters(): TextmodeFilterManager;
126
- /**
127
- * Apply a filter to the final composited output.
128
- *
129
- * Filters are applied after all layers are composited but before
130
- * the result is presented to the canvas. Multiple filters can be
131
- * queued per frame and will be applied in order.
132
- *
133
- * @param name The name of the filter to apply (built-in or custom)
134
- * @param params Optional parameters for the filter
135
- *
136
- * @example
137
- * ```typescript
138
- * t.draw(() => {
139
- * t.background(0);
140
- * t.charColor(255);
141
- * t.char('A');
142
- * t.rect(10, 10);
143
- *
144
- * // Apply built-in filters
145
- * t.filter('grayscale', 0.5);
146
- * t.filter('invert');
147
- *
148
- * // Chain multiple filters
149
- * t.filter('sepia', { amount: 0.3 });
150
- * t.filter('threshold', 0.5);
151
- * });
152
- * ```
153
- */
154
- filter<T extends BuiltInFilterName>(name: T, params?: BuiltInFilterParams[T]): void;
155
- filter(name: FilterName, params?: unknown): void;
156
- $registerSource(source: TextmodeSource): void;
98
+ get conversions(): TextmodeConversionManager;
157
99
  }
158
- export interface Textmodifier extends IRenderingMixin, IFontMixin, IAnimationMixin, IMouseMixin, ITouchMixin, IKeyboardMixin {
100
+ export interface Textmodifier extends IRenderingMixin, IAnimationMixin, IMouseMixin, ITouchMixin, IKeyboardMixin {
159
101
  }
160
102
  export {};
@@ -0,0 +1,73 @@
1
+ import type { TextmodeConversionMode, TextmodeConversionStrategy } from './ConversionRegistry';
2
+ /**
3
+ * Manages conversion strategy registration and retrieval.
4
+ *
5
+ * This class provides:
6
+ * - A registry for custom and built-in conversion strategies
7
+ * - Instance-scoped conversion strategies per Textmodifier
8
+ *
9
+ * Used for image-to-ASCII conversion modes.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Register a custom conversion strategy
14
+ * t.conversions.register({
15
+ * id: 'custom',
16
+ * createShader: (ctx) => shader,
17
+ * createUniforms: (ctx) => ({ u_image: ctx.source.texture })
18
+ * });
19
+ *
20
+ * // Use the conversion mode on an image
21
+ * img.conversionMode('custom');
22
+ * ```
23
+ */
24
+ export declare class TextmodeConversionManager {
25
+ private readonly _conversionRegistry;
26
+ /**
27
+ * Create a new TextmodeConversionManager.
28
+ * @param renderer The WebGL renderer instance
29
+ * @ignore
30
+ */
31
+ constructor();
32
+ /**
33
+ * Register a custom conversion strategy.
34
+ *
35
+ * @param strategy The conversion strategy to register
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * t.conversions.register({
40
+ * id: 'custom',
41
+ * createShader: (ctx) => shader,
42
+ * createUniforms: (ctx) => ({ u_image: ctx.source.texture })
43
+ * });
44
+ * ```
45
+ */
46
+ register(strategy: TextmodeConversionStrategy): void;
47
+ /**
48
+ * Unregister a conversion strategy by its ID.
49
+ *
50
+ * @param id The conversion strategy ID to unregister
51
+ * @returns true if the strategy was unregistered, false if it wasn't found
52
+ */
53
+ unregister(id: TextmodeConversionMode): boolean;
54
+ /**
55
+ * Check if a conversion strategy with the given ID is registered.
56
+ *
57
+ * @param id The conversion strategy ID to check
58
+ * @returns true if the strategy exists
59
+ */
60
+ has(id: TextmodeConversionMode): boolean;
61
+ /**
62
+ * Get a registered conversion strategy by its ID.
63
+ * @param id The ID of the conversion strategy
64
+ * @returns The conversion strategy, or undefined if not found
65
+ * @ignore
66
+ */
67
+ $get(id: TextmodeConversionMode): TextmodeConversionStrategy | undefined;
68
+ /**
69
+ * Dispose of all resources.
70
+ * @ignore
71
+ */
72
+ $dispose(): void;
73
+ }
@@ -2,11 +2,14 @@ import type { GLShader } from '../../rendering';
2
2
  import type { GLRenderer } from '../../rendering/webgl/core/Renderer';
3
3
  import type { TextmodeFont } from '../loadables/font/TextmodeFont';
4
4
  import type { TextmodeSource } from '../loadables/TextmodeSource';
5
+ /**
6
+ * Built-in conversion mode names provided by textmode.js
7
+ */
8
+ export type BuiltInConversionMode = 'brightness';
5
9
  /**
6
10
  * Type representing the available textmode conversion modes
7
- * @ignore
8
11
  */
9
- export type TextmodeConversionMode = 'brightness' | 'accurate' | (string & {});
12
+ export type TextmodeConversionMode = BuiltInConversionMode | (string & {});
10
13
  /**
11
14
  * Interface for the context provided to conversion strategies
12
15
  * @ignore
@@ -29,21 +32,61 @@ export interface TextmodeConversionStrategy {
29
32
  createUniforms(context: TextmodeConversionContext): Record<string, any>;
30
33
  }
31
34
  /**
32
- * Register a conversion strategy
33
- * @param strategy The conversion strategy to register
34
- * @ignore
35
- */
36
- export declare function registerConversionStrategy(strategy: TextmodeConversionStrategy): void;
37
- /**
38
- * Unregister a conversion strategy by its ID
39
- * @param id The ID of the conversion strategy to unregister
35
+ * Instance-based registry for conversion strategies.
36
+ *
37
+ * Each {@link ConversionManager} instance has its own ConversionRegistry, allowing
38
+ * conversion strategies to be scoped to a specific Textmodifier instance rather than registered globally.
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * // Register a custom conversion strategy
43
+ * t.conversions.register(myCustomStrategy);
44
+ *
45
+ * // Use the conversion mode on an image
46
+ * img.conversionMode('myCustomMode');
47
+ * ```
48
+ *
40
49
  * @ignore
41
50
  */
42
- export declare function unregisterConversionStrategy(id: TextmodeConversionMode): void;
43
- /**
44
- * Get a registered conversion strategy by its ID
45
- * @param id The ID of the conversion strategy
46
- * @returns The conversion strategy, or undefined if not found
47
- * @ignore
48
- */
49
- export declare function getConversionStrategy(id: TextmodeConversionMode): TextmodeConversionStrategy | undefined;
51
+ export declare class ConversionRegistry {
52
+ private readonly _strategies;
53
+ private readonly _shaderCache;
54
+ /**
55
+ * Create a new ConversionRegistry.
56
+ * @param renderer The WebGL renderer instance
57
+ */
58
+ constructor();
59
+ /**
60
+ * Register a conversion strategy.
61
+ * @param strategy The conversion strategy to register
62
+ */
63
+ $register(strategy: TextmodeConversionStrategy): void;
64
+ /**
65
+ * Unregister a conversion strategy by its ID.
66
+ *
67
+ * @param id The conversion strategy ID to unregister
68
+ * @returns true if the strategy was unregistered, false if it wasn't found
69
+ */
70
+ $unregister(id: TextmodeConversionMode): boolean;
71
+ /**
72
+ * Get a conversion strategy by ID.
73
+ * @internal
74
+ */
75
+ $get(id: TextmodeConversionMode): TextmodeConversionStrategy | undefined;
76
+ /**
77
+ * Check if a conversion strategy with the given ID is registered.
78
+ *
79
+ * @param id The conversion strategy ID to check
80
+ * @returns true if the strategy exists
81
+ */
82
+ $has(id: TextmodeConversionMode): boolean;
83
+ /**
84
+ * Dispose all resources.
85
+ * @internal
86
+ */
87
+ $dispose(): void;
88
+ /**
89
+ * Register all built-in conversion strategies.
90
+ */
91
+ private _registerBuiltInStrategies;
92
+ }
@@ -1 +1,3 @@
1
- export * from './ConversionRegistry';
1
+ export type { BuiltInConversionMode, TextmodeConversionMode, TextmodeConversionContext, TextmodeConversionStrategy, } from './ConversionRegistry';
2
+ export { ConversionRegistry } from './ConversionRegistry';
3
+ export { TextmodeConversionManager } from './ConversionManager';
@@ -56,10 +56,6 @@ export declare class TextmodeFilterManager {
56
56
  * await t.filters.register('vignette', './vignette.frag', {
57
57
  * u_intensity: ['intensity', 0.5]
58
58
  * });
59
- *
60
- * // Register with pre-compiled shader
61
- * const shader = await t.createShader(vertSrc, fragSrc);
62
- * await t.filters.register('custom', shader, {});
63
59
  * ```
64
60
  */
65
61
  register(id: FilterName, shader: GLShader | string, uniformDefs?: Record<string, [paramName: string, defaultValue: unknown]>): Promise<void>;
@@ -1,3 +1,3 @@
1
- export type { FilterName, BuiltInFilterName, BuiltInFilterParams, QueuedFilter, FilterContext, TextmodeFilterStrategy } from './types';
1
+ export type { FilterName, BuiltInFilterName, BuiltInFilterParams, QueuedFilter, FilterContext, TextmodeFilterStrategy, } from './types';
2
2
  export { FilterRegistry } from './FilterRegistry';
3
3
  export { TextmodeFilterManager } from './FilterManager';