From 16c2253bbbbded41cfe8fc20a1e3d655cb04908c Mon Sep 17 00:00:00 2001 From: zefie Date: Mon, 27 Apr 2026 13:21:10 -0400 Subject: [PATCH] fix up ALP --- .../ServiceVault/SharedROMCache/minisrv.gif | Bin 5740 -> 5473 bytes .../SharedROMCache/splash_minisrv.gif | Bin 10881 -> 12118 bytes .../includes/classes/WTVImage.js | 80 +++++++++++++++--- zefie_wtvp_minisrv/wtv_img_converter.js | 5 ++ 4 files changed, 74 insertions(+), 11 deletions(-) diff --git a/zefie_wtvp_minisrv/includes/ServiceVault/SharedROMCache/minisrv.gif b/zefie_wtvp_minisrv/includes/ServiceVault/SharedROMCache/minisrv.gif index 11aecf4ec7f8f0727a0ed9f9e95f2be13d0f1d5a..605357e5876d93e72f51c0f66df0c7c802a0c98d 100644 GIT binary patch literal 5473 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 literal 5740 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 diff --git a/zefie_wtvp_minisrv/includes/ServiceVault/SharedROMCache/splash_minisrv.gif b/zefie_wtvp_minisrv/includes/ServiceVault/SharedROMCache/splash_minisrv.gif index 748b41f2b5122b3945b226ca7b47369df0e1bcd4..b405195b405b0ebf1b5a205bb82242fd1cf8552c 100644 GIT binary patch literal 12118 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 diff --git a/zefie_wtvp_minisrv/includes/classes/WTVImage.js b/zefie_wtvp_minisrv/includes/classes/WTVImage.js index 97d0e758..bbfad625 100644 --- a/zefie_wtvp_minisrv/includes/classes/WTVImage.js +++ b/zefie_wtvp_minisrv/includes/classes/WTVImage.js @@ -377,12 +377,56 @@ class WTVImage { buildArtemisAlphaTable(type, alphaTable) { if (type !== 'ALP') return Buffer.from(alphaTable); - // Drop the phantom transparent index 0, then trim trailing opaque values - // since ALP app payloads are typically truncated like ALF. - const table = alphaTable.slice(1); - let trimEnd = table.length - 1; - while (trimEnd >= 0 && table[trimEnd] === 0xFF) trimEnd--; - return Buffer.from(table.slice(0, trimEnd + 1)); + // Drop the phantom transparent index 0. + // ALP output should preserve the full remaining alpha table so WebTV + // does not default missing ALP entries to transparent. + return Buffer.from(alphaTable.slice(1)); + } + + isSimplePaletteTransparency(alphaTable) { + let transparentIndex = -1; + for (let i = 0; i < alphaTable.length; i++) { + const a = alphaTable[i]; + if (a !== 0 && a !== 0xFF) return false; + if (a === 0) { + if (transparentIndex !== -1) return false; + transparentIndex = i; + } + } + return transparentIndex >= 0; + } + + encodePalettePNGAsStandardGIF(pngInfo) { + const { palette, indices, width, height, colors, alphaTable } = pngInfo; + const transparentIdx = alphaTable.findIndex((a) => a === 0); + if (transparentIdx < 0) throw new Error('No transparent palette entry found'); + + const finalIndices = Buffer.from(indices); + const finalPalette = Buffer.from(palette); + const minCodeSize = Math.max(2, Math.ceil(Math.log2(colors))); + const lzwEncoded = this.lzwEncode(finalIndices, minCodeSize); + const lzwBlocks = this.wrapSubBlocks(lzwEncoded); + + const imgDesc = Buffer.alloc(10); + imgDesc[0] = 0x2C; + imgDesc.writeUInt16LE(0, 1); + imgDesc.writeUInt16LE(0, 3); + imgDesc.writeUInt16LE(width, 5); + imgDesc.writeUInt16LE(height, 7); + imgDesc[9] = 0x00; + + const gceBlock = this.buildGCE(transparentIdx, true); + const gifHeader = this.buildGIFHeader(width, height, colors, 0); + + return Buffer.concat([ + gifHeader, + finalPalette, + gceBlock, + imgDesc, + Buffer.from([minCodeSize]), + lzwBlocks, + Buffer.from([0x3B]) + ]); } // --------------------------------------------------------------------------- @@ -970,7 +1014,7 @@ class WTVImage { * @param {string|Buffer} input - file path or raw PNG Buffer * @param {object} [opts] * @param {number} [opts.colors=256] - palette size for full-color quantization - * @param {'ALP'|'ALF'} [opts.type='ALF'] - Artemis variant + * @param {'ALP'|'ALF'} [opts.type='ALP'] - Artemis variant * @param {number} [opts.jpegQuality=85] - JPEG quality (0-100) when no alpha * @param {number} [opts.maxWidth] - maximum width to scale to before encoding * @param {number} [opts.maxHeight] - maximum height to scale to before encoding @@ -980,16 +1024,25 @@ class WTVImage { let pngBuf = Buffer.isBuffer(input) ? input : require('fs').readFileSync(input); const maxWidth = Number(opts.maxWidth) > 0 ? Number(opts.maxWidth) : null; const maxHeight = Number(opts.maxHeight) > 0 ? Number(opts.maxHeight) : null; - if (maxWidth || maxHeight) { + const originalIsPalettePNG = this.isPalettePNG(pngBuf); + const inputMeta = await sharp(pngBuf).metadata(); + const willResize = (maxWidth && inputMeta.width > maxWidth) || (maxHeight && inputMeta.height > maxHeight); + if (willResize) { const resizeOpts = { fit: 'inside', withoutEnlargement: true }; if (maxWidth) resizeOpts.width = maxWidth; if (maxHeight) resizeOpts.height = maxHeight; + const outputPngOpts = Object.assign({}, pngopts); + if (originalIsPalettePNG && outputPngOpts.palette) { + // Avoid an extra palette quantization step on an already-indexed PNG. + outputPngOpts.palette = false; + delete outputPngOpts.colors; + } pngBuf = await sharp(pngBuf) .resize(resizeOpts) - .png(pngopts) + .png(outputPngOpts) .toBuffer(); } - const meta = await sharp(pngBuf).metadata(); + const meta = willResize ? await sharp(pngBuf).metadata() : inputMeta; let usesAlpha = false; if (meta.hasAlpha) { @@ -1018,7 +1071,12 @@ class WTVImage { // Palette/indexed PNGs should preserve palette + tRNS alpha exactly by default. // If resizing was applied, the palette is no longer preserved and we must // re-quantize the image before producing an Artemis GIF. - const forceRequantize = opts.forceRequantizePalette || maxWidth || maxHeight; + const forceRequantize = opts.forceRequantizePalette || willResize; + const pngInfo = this.extractPalettePNG(pngBuf); + if (!forceRequantize && this.isSimplePaletteTransparency(pngInfo.alphaTable)) { + const data = this.encodePalettePNGAsStandardGIF(pngInfo); + return { data, mime: 'image/gif' }; + } const data = forceRequantize ? await this.encodeArtemisGIF(pngBuf, opts) : await this.paletteImageToArtemisGIF(pngBuf, opts); diff --git a/zefie_wtvp_minisrv/wtv_img_converter.js b/zefie_wtvp_minisrv/wtv_img_converter.js index 7e861c0d..03a649c0 100644 --- a/zefie_wtvp_minisrv/wtv_img_converter.js +++ b/zefie_wtvp_minisrv/wtv_img_converter.js @@ -117,6 +117,11 @@ async function cmdConvert(inputFile, outputFile, opts) { jpegQuality: opts.quality || 85, maxWidth: opts.maxWidth, maxHeight: opts.maxHeight + }, { + "quality": 80, + "compressionLevel": 9, + "palette": true, + "effort": 10 }); const ext = mime === 'image/gif' ? '.gif' : '.jpg';