diff --git a/src/core/renderers/canvas/CanvasCoreRenderer.ts b/src/core/renderers/canvas/CanvasCoreRenderer.ts index d5bb799f..b97fd70d 100644 --- a/src/core/renderers/canvas/CanvasCoreRenderer.ts +++ b/src/core/renderers/canvas/CanvasCoreRenderer.ts @@ -78,7 +78,6 @@ export class CanvasCoreRenderer extends CoreRenderer { } reset(): void { - // eslint-disable-next-line no-self-assign this.canvas.width = this.canvas.width; // quick reset canvas const ctx = this.context; @@ -191,7 +190,12 @@ export class CanvasCoreRenderer extends CoreRenderer { height, ); } else { - ctx.drawImage(image, tx, ty, width, height); + try { + ctx.drawImage(image, tx, ty, width, height); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (error) { + // noop + } } ctx.globalAlpha = 1; } else if (hasGradient) { diff --git a/src/core/renderers/webgl/WebGlCoreCtxTexture.ts b/src/core/renderers/webgl/WebGlCoreCtxTexture.ts index 7308894e..4f5c8155 100644 --- a/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +++ b/src/core/renderers/webgl/WebGlCoreCtxTexture.ts @@ -140,32 +140,31 @@ export class WebGlCoreCtxTexture extends CoreContextTexture { assertTruthy(this._nativeCtxTexture); glw.activeTexture(0); + const tdata = textureData.data; // If textureData is null, the texture is empty (0, 0) and we don't need to // upload any data to the GPU. if ( - (typeof ImageBitmap !== 'undefined' && - textureData.data instanceof ImageBitmap) || - textureData.data instanceof ImageData || + (typeof ImageBitmap !== 'undefined' && tdata instanceof ImageBitmap) || + tdata instanceof ImageData || // not using typeof HTMLImageElement due to web worker - isHTMLImageElement(textureData.data) + isHTMLImageElement(tdata) ) { - const data = textureData.data; - width = data.width; - height = data.height; + width = tdata.width; + height = tdata.height; glw.bindTexture(this._nativeCtxTexture); glw.pixelStorei( glw.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !!textureData.premultiplyAlpha, ); - glw.texImage2D(0, glw.RGBA, glw.RGBA, glw.UNSIGNED_BYTE, data); + glw.texImage2D(0, glw.RGBA, glw.RGBA, glw.UNSIGNED_BYTE, tdata); this.setTextureMemUse(width * height * 4); // generate mipmaps for power-of-2 textures or in WebGL2RenderingContext if (glw.isWebGl2() || (isPowerOfTwo(width) && isPowerOfTwo(height))) { glw.generateMipmap(); } - } else if (textureData.data === null) { + } else if (tdata === null) { width = 0; height = 0; // Reset to a 1x1 transparent texture @@ -182,14 +181,8 @@ export class WebGlCoreCtxTexture extends CoreContextTexture { TRANSPARENT_TEXTURE_DATA, ); this.setTextureMemUse(TRANSPARENT_TEXTURE_DATA.byteLength); - } else if ('mipmaps' in textureData.data && textureData.data.mipmaps) { - const { - mipmaps, - width = 0, - height = 0, - type, - glInternalFormat, - } = textureData.data; + } else if ('mipmaps' in tdata && tdata.mipmaps) { + const { mipmaps, width = 0, height = 0, type, glInternalFormat } = tdata; const view = type === 'ktx' ? new DataView(mipmaps[0] ?? new ArrayBuffer(0)) @@ -204,7 +197,7 @@ export class WebGlCoreCtxTexture extends CoreContextTexture { glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR); this.setTextureMemUse(view.byteLength); - } else if (textureData.data && textureData.data instanceof Uint8Array) { + } else if (tdata && tdata instanceof Uint8Array) { // Color Texture width = 1; height = 1; @@ -223,7 +216,7 @@ export class WebGlCoreCtxTexture extends CoreContextTexture { 0, glw.RGBA, glw.UNSIGNED_BYTE, - textureData.data, + tdata, ); this.setTextureMemUse(width * height * 4); diff --git a/src/core/renderers/webgl/internal/RendererUtils.ts b/src/core/renderers/webgl/internal/RendererUtils.ts index 41dabcce..b74a656c 100644 --- a/src/core/renderers/webgl/internal/RendererUtils.ts +++ b/src/core/renderers/webgl/internal/RendererUtils.ts @@ -141,9 +141,11 @@ export function createIndexBuffer(glw: WebGlContextWrapper, size: number) { export function isHTMLImageElement(obj: unknown): obj is HTMLImageElement { return ( obj !== null && - typeof obj === 'object' && - obj.constructor && - obj.constructor.name === 'HTMLImageElement' + ((typeof obj === 'object' && + obj.constructor && + obj.constructor.name === 'HTMLImageElement') || + (typeof HTMLImageElement !== 'undefined' && + obj instanceof HTMLImageElement)) ); } diff --git a/src/core/text-rendering/renderers/CanvasTextRenderer.ts b/src/core/text-rendering/renderers/CanvasTextRenderer.ts index 6b0a14fa..086ae97c 100644 --- a/src/core/text-rendering/renderers/CanvasTextRenderer.ts +++ b/src/core/text-rendering/renderers/CanvasTextRenderer.ts @@ -26,8 +26,7 @@ import { getNormalizedRgbaComponents, getNormalizedAlphaComponent, } from '../../lib/utils.js'; -import type { ImageTexture } from '../../textures/ImageTexture.js'; -import { TrFontManager, type FontFamilyMap } from '../TrFontManager.js'; +import { type FontFamilyMap } from '../TrFontManager.js'; import type { TrFontFace } from '../font-face-types/TrFontFace.js'; import { WebTrFontFace } from '../font-face-types/WebTrFontFace.js'; import { @@ -47,7 +46,7 @@ const resolvedGlobal = typeof self === 'undefined' ? globalThis : self; /** * Global font set regardless of if run in the main thread or a web worker */ -const globalFontSet = ((resolvedGlobal.document as any)?.fonts || +const globalFontSet: FontFaceSet = (resolvedGlobal.document?.fonts || (resolvedGlobal as any).fonts) as FontFaceSet; declare module './TextRenderer.js' { @@ -99,7 +98,7 @@ export class CanvasTextRenderer extends TextRenderer { } else { this.canvas = document.createElement('canvas'); } - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + let context = this.canvas.getContext('2d', { willReadFrequently: true, }) as OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D | null; diff --git a/src/core/textures/ImageTexture.ts b/src/core/textures/ImageTexture.ts index 488fd059..afc5c9e7 100644 --- a/src/core/textures/ImageTexture.ts +++ b/src/core/textures/ImageTexture.ts @@ -134,9 +134,6 @@ export class ImageTexture extends Texture { async loadImageFallback(src: string, hasAlpha: boolean) { const img = new Image(); - if (!(src.startsWith('data:'))) { - img.crossOrigin = 'Anonymous'; - } if (!src.startsWith('data:')) { img.crossOrigin = 'Anonymous';