From 88aa63c69e79d55464bd852afa1a8e0128561b1e Mon Sep 17 00:00:00 2001 From: Haoyu Xu Date: Sat, 12 Aug 2023 12:56:54 +0800 Subject: [PATCH] feat(aklive2d): added a logic to handle images that does not require alpha composite --- libs/alpha_composite.js | 4 ++++ libs/assets_processor.js | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/libs/alpha_composite.js b/libs/alpha_composite.js index 74577a0..c0914c8 100644 --- a/libs/alpha_composite.js +++ b/libs/alpha_composite.js @@ -28,4 +28,8 @@ export default class AlphaComposite { return await sharp(newImage).rotate(rotate).toBuffer() } + async toBuffer(filename, extractedDir) { + return await sharp(path.join(extractedDir, filename)).toBuffer() + } + } \ No newline at end of file diff --git a/libs/assets_processor.js b/libs/assets_processor.js index f9152e8..979d7f8 100644 --- a/libs/assets_processor.js +++ b/libs/assets_processor.js @@ -1,6 +1,6 @@ /* eslint-disable no-undef */ import path from 'path' -import { read, write, readSync } from './file.js' +import { read, write, readSync, exists, copy } from './file.js' import AlphaComposite from './alpha_composite.js' export default class AssetsProcessor { @@ -19,8 +19,13 @@ export default class AssetsProcessor { async process(extractedDir) { const fallback_name = __config.operators[this.#operatorName].fallback_name const fallbackFilename = `${fallback_name}.png` - const fallbackBuffer = await this.#alphaCompositer.process(fallbackFilename, `${path.parse(fallbackFilename).name}[alpha].png`, extractedDir) - await write(fallbackBuffer, path.join(this.#operatorSourceFolder, this.#operatorName, fallbackFilename)) + const alphaCompositeFilename = `${path.parse(fallbackFilename).name}[alpha].png` + if (exists(path.join(extractedDir, alphaCompositeFilename))) { + const fallbackBuffer = await this.#alphaCompositer.process(fallbackFilename, alphaCompositeFilename, extractedDir) + await write(fallbackBuffer, path.join(this.#operatorSourceFolder, this.#operatorName, fallbackFilename)) + } else { + await copy(path.join(extractedDir, fallbackFilename), path.join(this.#operatorSourceFolder, this.#operatorName, fallbackFilename)) + } // generate portrait const portraitDir = path.join(this.#shareFolder, "portraits") @@ -51,7 +56,13 @@ export default class AssetsProcessor { const dimensions = atlas.match(new RegExp(/^size:(.*),(.*)/gm))[0].replace('size: ', '').split(',') const matches = atlas.match(new RegExp(/(.*).png/g)) for (const item of matches) { - const buffer = await this.#alphaCompositer.process(item, `${path.parse(item).name}[alpha].png`, extractedDir) + let buffer; + const alphaCompositeFilename = `${path.parse(item).name}[alpha].png` + if (exists(path.join(extractedDir, alphaCompositeFilename))) { + buffer = await this.#alphaCompositer.process(item, alphaCompositeFilename, extractedDir) + } else { + buffer = await this.#alphaCompositer.toBuffer(item, extractedDir) + } assetsJson[`./assets/${item}`] = BASE64_PNG_PREFIX + buffer.toString('base64') } assetsJson[`./assets/${skelFilename.replace('#', '%23')}`] = BASE64_BINARY_PREFIX + skel.toString('base64')