@webex/ladon-ts 4.0.0 → 4.2.1

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.
@@ -1,52 +1,62 @@
1
- import { PipelineConfig } from './config';
2
- declare global {
3
- interface ImportMeta {
4
- url: string;
5
- }
6
- }
7
- export interface MaskResult {
8
- data: Float32Array;
9
- warm: boolean;
10
- }
11
- export interface MaskGenerator {
12
- getMask(input: Uint8ClampedArray): Promise<MaskResult>;
13
- load(): Promise<void>;
14
- isLoaded(): boolean;
15
- postRender(input: Uint8ClampedArray): Promise<void>;
16
- destroy(): void;
17
- }
18
- export declare class LocalGenerator implements MaskGenerator {
19
- readonly config: PipelineConfig;
20
- private last_mask;
21
- private mask_model?;
22
- private last_mask_generation;
23
- constructor(config: PipelineConfig);
24
- private preprocess;
25
- getMask(input: Uint8ClampedArray): Promise<MaskResult>;
26
- load(): Promise<void>;
27
- isLoaded(): boolean;
28
- postRender(_: Uint8ClampedArray): Promise<void>;
29
- destroy(): void;
30
- }
31
- export declare class NullGenerator implements MaskGenerator {
32
- readonly config: PipelineConfig;
33
- private last_mask;
34
- constructor(config: PipelineConfig);
35
- getMask(_: Uint8ClampedArray): Promise<MaskResult>;
36
- load(): Promise<void>;
37
- isLoaded(): boolean;
38
- postRender(_: Uint8ClampedArray): Promise<void>;
39
- destroy(): void;
40
- }
41
- export declare class WorkerGenerator implements MaskGenerator {
42
- readonly config: PipelineConfig;
43
- private last_mask;
44
- private worker?;
45
- private new_mask;
46
- constructor(config: PipelineConfig);
47
- getMask(_: Uint8ClampedArray): Promise<MaskResult>;
48
- load(): Promise<void>;
49
- isLoaded(): boolean;
50
- postRender(input: Uint8ClampedArray): Promise<void>;
51
- destroy(): void;
52
- }
1
+ import { PipelineConfig } from './config';
2
+ declare global {
3
+ interface ImportMeta {
4
+ url: string;
5
+ }
6
+ }
7
+ export interface MaskResult {
8
+ data: Float32Array;
9
+ warm: boolean;
10
+ }
11
+ export interface MaskGenerator {
12
+ getMask(input: Uint8ClampedArray): Promise<MaskResult>;
13
+ load(): Promise<void>;
14
+ isLoaded(): boolean;
15
+ postRender(input: Uint8ClampedArray): Promise<void>;
16
+ destroy(): void;
17
+ }
18
+ export declare class LocalGenerator implements MaskGenerator {
19
+ readonly config: PipelineConfig;
20
+ private last_mask;
21
+ private mask_model?;
22
+ private last_mask_generation;
23
+ private output?;
24
+ constructor(config: PipelineConfig);
25
+ /**
26
+ * This method preprocesses an input Uint8ClampedArray to a Float32Array
27
+ * while maintaining memory efficiency by reusing a class-scoped output buffer.
28
+ * If the model rank is 4 (e.g., newer tiny model), it sets an alpha channel value.
29
+ *
30
+ * @param {Uint8ClampedArray} input - The input data to be preprocessed
31
+ * @param {Float32Array} alpha - The alpha channel data
32
+ * @returns {Float32Array} - The processed data
33
+ */
34
+ private preprocess;
35
+ getMask(input: Uint8ClampedArray): Promise<MaskResult>;
36
+ load(): Promise<void>;
37
+ isLoaded(): boolean;
38
+ postRender(_: Uint8ClampedArray): Promise<void>;
39
+ destroy(): void;
40
+ }
41
+ export declare class NullGenerator implements MaskGenerator {
42
+ readonly config: PipelineConfig;
43
+ private last_mask;
44
+ constructor(config: PipelineConfig);
45
+ getMask(_: Uint8ClampedArray): Promise<MaskResult>;
46
+ load(): Promise<void>;
47
+ isLoaded(): boolean;
48
+ postRender(_: Uint8ClampedArray): Promise<void>;
49
+ destroy(): void;
50
+ }
51
+ export declare class WorkerGenerator implements MaskGenerator {
52
+ readonly config: PipelineConfig;
53
+ private last_mask;
54
+ private worker?;
55
+ private new_mask;
56
+ constructor(config: PipelineConfig);
57
+ getMask(_: Uint8ClampedArray): Promise<MaskResult>;
58
+ load(): Promise<void>;
59
+ isLoaded(): boolean;
60
+ postRender(input: Uint8ClampedArray): Promise<void>;
61
+ destroy(): void;
62
+ }
@@ -1,202 +1,233 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import * as ort from 'onnxruntime-web';
11
- import { toAbsoluteURI } from './util';
12
- export class LocalGenerator {
13
- constructor(config) {
14
- this.config = config;
15
- this.last_mask_generation = 0;
16
- this.last_mask = new ort.Tensor('float32', new Float32Array(this.config.input.height * this.config.input.width), [1, 1, this.config.input.height, this.config.input.width]);
17
- }
18
- preprocess(input) {
19
- const output = new Float32Array(this.config.input.width * this.config.input.height * 3);
20
- for (let channel = 0; channel < 3; channel++) {
21
- for (let pixel = 0; pixel < input.length / 4; pixel++) {
22
- output[pixel +
23
- channel *
24
- this.config.input.width *
25
- this.config.input.height] = input[pixel * 4 + channel];
26
- }
27
- }
28
- return output;
29
- }
30
- getMask(input) {
31
- return __awaiter(this, void 0, void 0, function* () {
32
- if (!this.mask_model) {
33
- throw new Error('[ladon-ts] - mask model not loaded.');
34
- }
35
- const mask_generation_timeout = Date.now() - this.last_mask_generation >
36
- this.config.mask.generation_interval_ms;
37
- if (!mask_generation_timeout) {
38
- return {
39
- data: this.last_mask.data,
40
- warm: false,
41
- };
42
- }
43
- this.last_mask_generation = Date.now();
44
- const image_tns = new ort.Tensor('float32', this.preprocess(input), [
45
- 1,
46
- 3,
47
- this.config.input.height,
48
- this.config.input.width,
49
- ]);
50
- const feeds = {
51
- input_image: image_tns,
52
- prev_mask: this.last_mask,
53
- };
54
- const results = yield this.mask_model.run(feeds);
55
- this.last_mask = results['output_mask'];
56
- return {
57
- data: this.last_mask.data,
58
- warm: true,
59
- };
60
- });
61
- }
62
- load() {
63
- return __awaiter(this, void 0, void 0, function* () {
64
- if (this.config.wasm_uri) {
65
- ort.env.wasm.wasmPaths = toAbsoluteURI(this.config.wasm_uri, this.config.base_url);
66
- }
67
- ort.env.wasm.numThreads = 1;
68
- let model_url;
69
- if (typeof this.config.mask.model_url_resolver === 'string') {
70
- model_url = this.config.mask.model_url_resolver;
71
- }
72
- else {
73
- model_url = yield this.config.mask.model_url_resolver(this.config.mask.model_uri);
74
- }
75
- this.mask_model = yield ort.InferenceSession.create(model_url, {
76
- executionProviders: ['wasm'],
77
- });
78
- });
79
- }
80
- isLoaded() {
81
- return !!this.mask_model;
82
- }
83
- /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
84
- postRender(_) {
85
- return __awaiter(this, void 0, void 0, function* () {
86
- // empty for local generator
87
- });
88
- }
89
- destroy() {
90
- // empty for local generator
91
- }
92
- }
93
- export class NullGenerator {
94
- constructor(config) {
95
- this.config = config;
96
- this.last_mask = new Float32Array(this.config.input.height * this.config.input.width);
97
- }
98
- /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
99
- getMask(_) {
100
- return __awaiter(this, void 0, void 0, function* () {
101
- return {
102
- data: this.last_mask,
103
- warm: false,
104
- };
105
- });
106
- }
107
- load() {
108
- return __awaiter(this, void 0, void 0, function* () {
109
- // empty for null generator
110
- });
111
- }
112
- isLoaded() {
113
- return true;
114
- }
115
- /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
116
- postRender(_) {
117
- return __awaiter(this, void 0, void 0, function* () {
118
- // empty for null generator
119
- });
120
- }
121
- destroy() {
122
- // empty for null generator
123
- }
124
- }
125
- export class WorkerGenerator {
126
- constructor(config) {
127
- this.config = config;
128
- this.new_mask = true;
129
- this.last_mask = new Float32Array(this.config.input.height * this.config.input.width);
130
- }
131
- /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
132
- getMask(_) {
133
- return __awaiter(this, void 0, void 0, function* () {
134
- const toReturn = {
135
- data: this.last_mask,
136
- warm: this.new_mask,
137
- };
138
- this.new_mask = false;
139
- return toReturn;
140
- });
141
- }
142
- load() {
143
- return __awaiter(this, void 0, void 0, function* () {
144
- const cross_origin_script_url = toAbsoluteURI(this.config.mask.worker_uri, this.config.base_url);
145
- const content = yield (yield fetch(cross_origin_script_url, { cache: 'force-cache' })).text();
146
- const worker_url = URL.createObjectURL(new Blob([content], { type: 'text/javascript' }));
147
- this.worker = new Worker(worker_url, { type: 'module' });
148
- let model_url;
149
- if (typeof this.config.mask.model_url_resolver === 'string') {
150
- model_url = this.config.mask.model_url_resolver;
151
- }
152
- else {
153
- model_url = yield this.config.mask.model_url_resolver(this.config.mask.model_uri);
154
- }
155
- const worker_config = {
156
- base_url: this.config.base_url,
157
- input: this.config.input,
158
- mask: Object.assign(Object.assign({}, this.config.mask), { model_url_resolver: model_url }),
159
- wasm_uri: this.config.wasm_uri,
160
- render: { type: 'passthrough' },
161
- };
162
- this.worker.postMessage(worker_config);
163
- let resolution_cb;
164
- /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
165
- const result = new Promise((resolve, _) => {
166
- resolution_cb = resolve;
167
- });
168
- this.worker.onmessage = (event) => {
169
- if (event.data.mask) {
170
- this.last_mask = event.data.mask;
171
- this.new_mask = true;
172
- }
173
- else {
174
- URL.revokeObjectURL(worker_url);
175
- if (resolution_cb) {
176
- resolution_cb();
177
- }
178
- }
179
- };
180
- return result;
181
- });
182
- }
183
- isLoaded() {
184
- return !!this.worker;
185
- }
186
- postRender(input) {
187
- return __awaiter(this, void 0, void 0, function* () {
188
- // claim ownership of the input tensor's buffer and forward to worker
189
- if (!this.worker) {
190
- throw new Error('[ladon-ts] - worker is not defined.');
191
- }
192
- this.worker.postMessage({
193
- image: input,
194
- }, [input.buffer]);
195
- });
196
- }
197
- destroy() {
198
- var _a;
199
- (_a = this.worker) === null || _a === void 0 ? void 0 : _a.terminate();
200
- }
201
- }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQztBQUd2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBcUJ2QyxNQUFNLE9BQU8sY0FBYztJQUt2QixZQUE0QixNQUFzQjtRQUF0QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUYxQyx5QkFBb0IsR0FBRyxDQUFDLENBQUM7UUFHN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQzNCLFNBQVMsRUFDVCxJQUFJLFlBQVksQ0FDWixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUNyRCxFQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQzVELENBQUM7SUFDTixDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQXdCO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDekQsQ0FBQztRQUVGLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDMUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxF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
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import * as ort from 'onnxruntime-web';
11
+ import { getModelUrl, toAbsoluteURI } from './util';
12
+ export class LocalGenerator {
13
+ constructor(config) {
14
+ this.config = config;
15
+ this.last_mask_generation = 0;
16
+ this.last_mask = new ort.Tensor('float32', new Float32Array(this.config.input.height * this.config.input.width), [1, 1, this.config.input.height, this.config.input.width]);
17
+ }
18
+ /**
19
+ * This method preprocesses an input Uint8ClampedArray to a Float32Array
20
+ * while maintaining memory efficiency by reusing a class-scoped output buffer.
21
+ * If the model rank is 4 (e.g., newer tiny model), it sets an alpha channel value.
22
+ *
23
+ * @param {Uint8ClampedArray} input - The input data to be preprocessed
24
+ * @param {Float32Array} alpha - The alpha channel data
25
+ * @returns {Float32Array} - The processed data
26
+ */
27
+ preprocess(input, alpha) {
28
+ const { model_rank, input_size, output_size } = this.config.mask;
29
+ const { height, width } = input_size;
30
+ const numImagePixels = height * width;
31
+ if (!this.output) {
32
+ this.output = new Float32Array(numImagePixels * model_rank);
33
+ }
34
+ // In-place modification of class-scoped output buffer
35
+ const channelFlipOffset = model_rank === 4 ? 2 : 0;
36
+ const numInputPixels = input.length / 4;
37
+ // Loop over all color channels in the image
38
+ for (let channel = 0; channel < 3; channel++) {
39
+ // For each pixel in the input image...
40
+ for (let pixel = 0; pixel < numInputPixels; pixel++) {
41
+ // ...copy the color channel value from input to output, potentially
42
+ // potentially flipping the color channel order for the tiny.
43
+ this.output[pixel + channel * numImagePixels] =
44
+ input[pixel * 4 + Math.abs(channelFlipOffset - channel)];
45
+ }
46
+ }
47
+ // If the model_rank is 4, an additional alpha channel needs to be set
48
+ if (model_rank === 4) {
49
+ // Scaling factors for width and height based on the ratio of output to input sizes
50
+ const widthScale = output_size.width / width;
51
+ const heightScale = output_size.height / height;
52
+ // Iterate over each pixel in the width of the input image
53
+ for (let x = 0; x < width; x++) {
54
+ const nearestNeighborX = Math.floor(x * widthScale);
55
+ // Iterate over each pixel in the height of the input image
56
+ for (let y = 0; y < height; y++) {
57
+ const nearestNeighborY = Math.floor(y * heightScale);
58
+ const maskIdx = nearestNeighborX + nearestNeighborY * output_size.width;
59
+ const outputIdx = x + y * width + 3 * numImagePixels;
60
+ // Normalize the alpha value to range between 0 and 1, and scale it to the range of 0-255
61
+ const normalizedValue = Math.min(Math.max(alpha[maskIdx], 0), 1) * 255;
62
+ // Assign the normalized value to the output at the computed index
63
+ this.output[outputIdx] = normalizedValue;
64
+ }
65
+ }
66
+ }
67
+ return this.output;
68
+ }
69
+ getMask(input) {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ if (!this.mask_model) {
72
+ throw new Error('[ladon-ts] - mask model not loaded.');
73
+ }
74
+ const mask_generation_timeout = Date.now() - this.last_mask_generation > this.config.mask.generation_interval_ms;
75
+ if (!mask_generation_timeout) {
76
+ return {
77
+ data: this.last_mask.data,
78
+ warm: false,
79
+ };
80
+ }
81
+ this.last_mask_generation = Date.now();
82
+ const image_tns = new ort.Tensor('float32', this.preprocess(input, this.last_mask.data), [
83
+ 1,
84
+ this.config.mask.model_rank,
85
+ this.config.mask.input_size.height,
86
+ this.config.mask.input_size.width,
87
+ ]);
88
+ if (this.config.mask.model_rank === 4) {
89
+ // This feed uses the new model input params for the tiny model.
90
+ const results = yield this.mask_model.run({
91
+ input: image_tns,
92
+ });
93
+ this.last_mask = results.segmentation;
94
+ }
95
+ else {
96
+ const results = yield this.mask_model.run({
97
+ input_image: image_tns,
98
+ prev_mask: this.last_mask,
99
+ });
100
+ this.last_mask = results.output_mask;
101
+ }
102
+ return {
103
+ data: this.last_mask.data,
104
+ warm: true,
105
+ };
106
+ });
107
+ }
108
+ load() {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ if (this.config.wasm_uri) {
111
+ ort.env.wasm.wasmPaths = toAbsoluteURI(this.config.wasm_uri, this.config.base_url);
112
+ }
113
+ ort.env.wasm.numThreads = 1;
114
+ const modelUrl = yield getModelUrl(this.config);
115
+ this.mask_model = yield ort.InferenceSession.create(modelUrl, {
116
+ executionProviders: ['wasm'],
117
+ });
118
+ });
119
+ }
120
+ isLoaded() {
121
+ return !!this.mask_model;
122
+ }
123
+ /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
124
+ postRender(_) {
125
+ return __awaiter(this, void 0, void 0, function* () {
126
+ // empty for local generator
127
+ });
128
+ }
129
+ destroy() {
130
+ // empty for local generator
131
+ }
132
+ }
133
+ export class NullGenerator {
134
+ constructor(config) {
135
+ this.config = config;
136
+ this.last_mask = new Float32Array(this.config.input.height * this.config.input.width);
137
+ }
138
+ /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
139
+ getMask(_) {
140
+ return __awaiter(this, void 0, void 0, function* () {
141
+ return {
142
+ data: this.last_mask,
143
+ warm: false,
144
+ };
145
+ });
146
+ }
147
+ load() {
148
+ return __awaiter(this, void 0, void 0, function* () {
149
+ // empty for null generator
150
+ });
151
+ }
152
+ isLoaded() {
153
+ return true;
154
+ }
155
+ /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
156
+ postRender(_) {
157
+ return __awaiter(this, void 0, void 0, function* () {
158
+ // empty for null generator
159
+ });
160
+ }
161
+ destroy() {
162
+ // empty for null generator
163
+ }
164
+ }
165
+ export class WorkerGenerator {
166
+ constructor(config) {
167
+ this.config = config;
168
+ this.new_mask = true;
169
+ this.last_mask = new Float32Array(this.config.input.height * this.config.input.width);
170
+ }
171
+ /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
172
+ getMask(_) {
173
+ return __awaiter(this, void 0, void 0, function* () {
174
+ const toReturn = {
175
+ data: this.last_mask,
176
+ warm: this.new_mask,
177
+ };
178
+ this.new_mask = false;
179
+ return toReturn;
180
+ });
181
+ }
182
+ load() {
183
+ return __awaiter(this, void 0, void 0, function* () {
184
+ const workerUrl = String(new URL('./worker/segmentation.js', import.meta.url));
185
+ this.worker = new Worker(workerUrl, { type: 'module' });
186
+ const modelUrl = yield getModelUrl(this.config);
187
+ const worker_config = {
188
+ base_url: this.config.base_url,
189
+ input: this.config.input,
190
+ mask: Object.assign(Object.assign({}, this.config.mask), { model_url_resolver: modelUrl }),
191
+ wasm_uri: this.config.wasm_uri,
192
+ render: { type: 'passthrough' },
193
+ };
194
+ this.worker.postMessage(worker_config);
195
+ let resolution_cb;
196
+ const result = new Promise((resolve) => {
197
+ resolution_cb = resolve;
198
+ });
199
+ this.worker.onmessage = (event) => {
200
+ if (event.data.mask) {
201
+ this.last_mask = event.data.mask;
202
+ this.new_mask = true;
203
+ }
204
+ else {
205
+ URL.revokeObjectURL(workerUrl);
206
+ if (resolution_cb) {
207
+ resolution_cb();
208
+ }
209
+ }
210
+ };
211
+ return result;
212
+ });
213
+ }
214
+ isLoaded() {
215
+ return !!this.worker;
216
+ }
217
+ postRender(input) {
218
+ return __awaiter(this, void 0, void 0, function* () {
219
+ // claim ownership of the input tensor's buffer and forward to worker
220
+ if (!this.worker) {
221
+ throw new Error('[ladon-ts] - worker is not defined.');
222
+ }
223
+ this.worker.postMessage({
224
+ image: input,
225
+ }, [input.buffer]);
226
+ });
227
+ }
228
+ destroy() {
229
+ var _a;
230
+ (_a = this.worker) === null || _a === void 0 ? void 0 : _a.terminate();
231
+ }
232
+ }
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQztBQUd2QyxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQXFCcEQsTUFBTSxPQUFPLGNBQWM7SUFNdkIsWUFBNEIsTUFBc0I7UUFBdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFIMUMseUJBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBSTdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUMzQixTQUFTLEVBQ1QsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUNwRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUM1RCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssVUFBVSxDQUFDLEtBQXdCLEVBQUUsS0FBbUI7UUFDNUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDakUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUV0QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsY0FB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
@@ -1,21 +1,21 @@
1
- import { PipelineConfig } from './config';
2
- export interface IPipeline {
3
- onFrame(): Promise<void>;
4
- isLoaded(): boolean;
5
- load(): Promise<void>;
6
- destroy(): void;
7
- }
8
- export declare class Pipeline implements IPipeline {
9
- private input_canvas;
10
- private output_canvas;
11
- readonly config: PipelineConfig;
12
- private generator?;
13
- private renderer?;
14
- private loaded;
15
- private input_ctx;
16
- constructor(input_canvas: HTMLCanvasElement, output_canvas: HTMLCanvasElement, config: PipelineConfig);
17
- onFrame(): Promise<void>;
18
- isLoaded(): boolean;
19
- load(): Promise<void>;
20
- destroy(): void;
21
- }
1
+ import { PipelineConfig } from './config';
2
+ export interface IPipeline {
3
+ onFrame(): Promise<void>;
4
+ isLoaded(): boolean;
5
+ load(): Promise<void>;
6
+ destroy(): void;
7
+ }
8
+ export declare class Pipeline implements IPipeline {
9
+ private input_canvas;
10
+ private output_canvas;
11
+ readonly config: PipelineConfig;
12
+ private generator?;
13
+ private renderer?;
14
+ private loaded;
15
+ private input_ctx;
16
+ constructor(input_canvas: HTMLCanvasElement, output_canvas: HTMLCanvasElement, config: PipelineConfig);
17
+ onFrame(): Promise<void>;
18
+ isLoaded(): boolean;
19
+ load(): Promise<void>;
20
+ destroy(): void;
21
+ }