Skip to content

Commit c18be65

Browse files
committed
Use Web Worker
1 parent 7afdd2f commit c18be65

File tree

5 files changed

+28
-8
lines changed

5 files changed

+28
-8
lines changed

src/filters/applyFilter.js

+16-6
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,30 @@
1-
import * as filters from './filters';
1+
const worker = new Worker('./worker.js');
2+
worker.addEventListener('error', console.error);
23

34
/** @param {string} filterName */
45
/** @param {Blob} blob */
56
const filter = async (filterName, blob) => {
6-
if (!filters[filterName]) {
7-
return blob;
8-
}
9-
107
const imageBitmap = await createImageBitmap(blob);
118
const canvas = document.createElement('canvas');
129

1310
Object.assign(canvas, {
1411
width: imageBitmap.width,
1512
height: imageBitmap.height,
1613
});
17-
await filters[filterName](canvas, imageBitmap);
14+
15+
const offscreen = canvas.transferControlToOffscreen();
16+
const waitPromise = new Promise((resolve) =>
17+
worker.addEventListener('message', (ev) => resolve(ev.data), { once: true }),
18+
);
19+
worker.postMessage({ filterName, imageBitmap, canvas: offscreen }, [offscreen]);
20+
21+
const { status, error } = await waitPromise;
22+
if (error) {
23+
throw new Error(err);
24+
}
25+
if (status === 'not_found') {
26+
return blob;
27+
}
1828

1929
const filtered = new Promise((resolve) => canvas.toBlob(resolve, 'image/jpeg'));
2030
return filtered;

src/filters/purejs/grayScale.js

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ function grayScale(canvas, imageBitmap) {
1919
}
2020

2121
ctx.putImageData(imageData, 0, 0);
22+
23+
return ctx;
2224
}
2325

2426
export default grayScale;

src/filters/wasm/posterize.js

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ function posterize(canvas, imageBitmap) {
2424
if (error) {
2525
throw error;
2626
}
27+
28+
return ctx;
2729
}
2830

2931
export default posterize;

src/filters/worker.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@ import * as filters from './filters.js';
22

33
self.addEventListener('message', async ({ data: { filterName, canvas, imageBitmap } }) => {
44
try {
5-
await filters[filterName](canvas, imageBitmap);
5+
if (!filters[filterName]) {
6+
return self.postMessage({ status: 'not_found' });
7+
}
8+
const ctx = await filters[filterName](canvas, imageBitmap);
9+
ctx.commit();
10+
return self.postMessage({ status: 'ok' });
611
} catch (err) {
712
console.error(err);
813
return self.postMessage({ error: err.message });
914
}
10-
return self.postMessage({ success: true });
1115
});

src/helpers/makeWebGLRenderFromShaderTexts.js

+2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ const makeWebGLRenderFromShaderTexts = (shaders) => async (canvas, imageBitmap)
7676

7777
/** 三角形を描画する */
7878
gl.drawArrays(gl.TRIANGLES, 0, 6);
79+
80+
return gl;
7981
};
8082

8183
export default makeWebGLRenderFromShaderTexts;

0 commit comments

Comments
 (0)