Skip to content

Commit caeae1c

Browse files
authored
NativeEngine: Support Blob in createImageBitmap (#17411)
This PR adds handling for a Blob object in createImageBitmap. We should probably outright remove the Blob hack from here, but just to quickly & safely unblock [these other changes](BabylonJS/BabylonNative#1565), I hope this is alright.
1 parent 22fc220 commit caeae1c

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

packages/dev/core/src/Engines/Native/nativeInterfaces.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export interface INativeEngine {
8181
bufferLength: number
8282
): Promise<ArrayBuffer>;
8383

84-
createImageBitmap(data: ArrayBufferView | IImage): ImageBitmap;
84+
createImageBitmap(data: ArrayBuffer | IImage): ImageBitmap;
8585
resizeImageBitmap(image: ImageBitmap, bufferWidth: number, bufferHeight: number): Uint8Array;
8686

8787
createFrameBuffer(

packages/dev/core/src/Engines/nativeEngine.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ export class NativeEngine extends Engine {
391391
};
392392
}
393393

394+
// TODO: Remove in next protocol version update
394395
if (typeof Blob === "undefined") {
395396
(window.Blob as any) = function (v: any) {
396397
return v;
@@ -2063,20 +2064,20 @@ export class NativeEngine extends Engine {
20632064
* @returns ImageBitmap
20642065
*/
20652066
public override async createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap> {
2066-
return await new Promise((resolve, reject) => {
2067-
if (Array.isArray(image)) {
2068-
const arr = <Array<ArrayBufferView>>image;
2069-
if (arr.length) {
2070-
const image = this._engine.createImageBitmap(arr[0]);
2071-
if (image) {
2072-
resolve(image);
2073-
return;
2074-
}
2075-
}
2067+
// Back-compat: Because of the previous Blob hack, this could be an array of BlobParts.
2068+
if (Array.isArray(image)) {
2069+
const arr = <Array<ArrayBuffer>>image;
2070+
if (arr.length) {
2071+
return this._engine.createImageBitmap(arr[0]);
20762072
}
2077-
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
2078-
reject(`Unsupported data for createImageBitmap.`);
2079-
});
2073+
}
2074+
2075+
if (image instanceof Blob) {
2076+
const data = await image.arrayBuffer();
2077+
return this._engine.createImageBitmap(data);
2078+
}
2079+
2080+
throw new Error("Unsupported data for createImageBitmap.");
20802081
}
20812082

20822083
/**

0 commit comments

Comments
 (0)