{"record":{"id":"656daa8486358c9c","repo":"BabylonJS/Babylon.js","slug":"createimagebitmapfromsource-is-not-implemented","errorCode":null,"errorMessage":"createImageBitmapFromSource is not implemented","messagePattern":"createImageBitmapFromSource is not implemented","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/dev/core/src/Engines/abstractEngine.pure.ts","lineNumber":2612,"sourceCode":"        return this._lockstepMaxSteps;\r\n    }\r\n\r\n    /**\r\n     * Returns the time in ms between steps when using deterministic lock step.\r\n     * @returns time step in (ms)\r\n     */\r\n    public getTimeStep(): number {\r\n        return this._timeStep * 1000;\r\n    }\r\n\r\n    /**\r\n     * Engine abstraction for loading and creating an image bitmap from a given source string.\r\n     * @param imageSource source to load the image from.\r\n     * @param options An object that sets options for the image's extraction.\r\n     */\r\n    // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n    public _createImageBitmapFromSource(imageSource: string, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n        throw new Error(\"createImageBitmapFromSource is not implemented\");\r\n    }\r\n\r\n    /**\r\n     * Engine abstraction for createImageBitmap\r\n     * @param image source for image\r\n     * @param options An object that sets options for the image's extraction.\r\n     * @returns ImageBitmap\r\n     */\r\n    // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n    public createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap> {\r\n        return createImageBitmap(image, options);\r\n    }\r\n\r\n    /**\r\n     * Resize an image and returns the image data as an uint8array\r\n     * @param image image to resize\r\n     * @param bufferWidth destination buffer width\r\n     * @param bufferHeight destination buffer height\r","sourceCodeStart":2594,"sourceCodeEnd":2630,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/core/src/Engines/abstractEngine.pure.ts#L2594-L2630","documentation":"AbstractEngine._createImageBitmapFromSource is an engine abstraction; the pure/base class intentionally throws 'not implemented' and only concrete engines (WebGL/WebGPU with proper host environment) override it. Hitting this means the code path ran on an engine that has no image-bitmap support, typically a headless/pure engine instance.","triggerScenarios":"Calling engine._createImageBitmapFromSource (directly or via loaders like KTX2/texture loading that use ImageBitmap) on an engine built without DOM/ImageBitmap support (e.g. NullEngine or a pure environment).","commonSituations":"Running Babylon in Node.js/worker without createImageBitmap polyfill; using NullEngine for tests while code path assumes a real engine; partial engine builds where the platform-specific layer was tree-shaken.","solutions":["Run against a real engine (WebGL or WebGPU) in a browser supporting createImageBitmap","Provide an override/polyfill: monkey-patch engine._createImageBitmapFromSource to load via Image + decode and createImageBitmap","In Node, polyfill global createImageBitmap (e.g. via canvas/cimg) before engine use","Check engine._badOS/_features flags and choose a loader path not requiring ImageBitmap (options.imageBitmap false where supported)"],"exampleFix":"// before\nconst bmp = await engine._createImageBitmapFromSource(url); // throws on pure engine\n// after\nif (typeof engine._createImageBitmapFromSource !== 'function' || engine instanceof NullEngine) {\n  const img = new Image(); img.src = url; await img.decode();\n  const bmp = await createImageBitmap(img, options);\n} else {\n  const bmp = await engine._createImageBitmapFromSource(url, options);\n}","handlingStrategy":"fallback","validationCode":"if (typeof createImageBitmap !== 'function' || engine instanceof NullEngine) {\n  // use Image + decode fallback instead of engine._createImageBitmapFromSource\n}","typeGuard":"function supportsImageBitmap(engine: AbstractEngine): boolean {\n  return typeof createImageBitmap === 'function' && !(engine as any).constructor.name.includes('Null');\n}","tryCatchPattern":"try {\n  bitmap = await engine._createImageBitmapFromSource(src, opts);\n} catch (e) {\n  if (e instanceof Error && e.message.includes('createImageBitmapFromSource is not implemented')) {\n    const img = new Image(); img.src = src; await img.decode();\n    bitmap = await createImageBitmap(img, opts);\n  } else throw e;\n}","preventionTips":["Use a concrete engine when loading image-based assets","Polyfill createImageBitmap in Node/worker environments","Avoid NullEngine for texture-loading code paths; reserve it for pure logic tests","Check engine capabilities (engine._features) before calling abstractions directly"],"tags":["abstract-method","imagebitmap","engine","headless"],"backgroundTag":"method-not-implemented","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}