From a1c17025084ffe5543b2ec1df3225402e48a79f3 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 20:25:10 -0800 Subject: [PATCH] Assemble and use dataArray for ImageData, make hot-loop faster --- .../src/KittyGraphicsAddon.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 30e321a4..a386163c 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -414,22 +414,23 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { } // Convert to RGBA ImageData - const imageData = new ImageData(width, height); - const data = imageData.data; + // TODO: Get this checked by Daniel. + const pixelCount = width * height; + const data = new Uint8ClampedArray(pixelCount * BYTES_PER_PIXEL_RGBA); + const isRgba = format === KittyFormat.RGBA; - for (let i = 0; i < width * height; i++) { - const srcOffset = i * bytesPerPixel; - const dstOffset = i * BYTES_PER_PIXEL_RGBA; - - data[dstOffset] = bytes[srcOffset]; // R + let srcOffset = 0; + let dstOffset = 0; + for (let i = 0; i < pixelCount; i++) { + data[dstOffset ] = bytes[srcOffset ]; // R data[dstOffset + 1] = bytes[srcOffset + 1]; // G data[dstOffset + 2] = bytes[srcOffset + 2]; // B - data[dstOffset + 3] = format === KittyFormat.RGBA - ? bytes[srcOffset + 3] // A from source - : ALPHA_OPAQUE; // Fully opaque for RGB + data[dstOffset + 3] = isRgba ? bytes[srcOffset + 3] : ALPHA_OPAQUE; + srcOffset += bytesPerPixel; + dstOffset += BYTES_PER_PIXEL_RGBA; } - return createImageBitmap(imageData); + return createImageBitmap(new ImageData(data, width, height)); } /**