159 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			159 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", { value: true });
							 | 
						||
| 
								 | 
							
								exports.exportImage = void 0;
							 | 
						||
| 
								 | 
							
								const child_process = require("child_process");
							 | 
						||
| 
								 | 
							
								const fs = require("fs-extra");
							 | 
						||
| 
								 | 
							
								const path = require("path");
							 | 
						||
| 
								 | 
							
								const log = require("./log");
							 | 
						||
| 
								 | 
							
								function getWidthAndHeight(kha, exe, from, to, options, format, prealpha) {
							 | 
						||
| 
								 | 
							
								    return new Promise((resolve, reject) => {
							 | 
						||
| 
								 | 
							
								        let params = ['from=' + from, 'to=' + to, 'format=' + format, 'donothing'];
							 | 
						||
| 
								 | 
							
								        if (options.scale !== undefined && options.scale !== 1) {
							 | 
						||
| 
								 | 
							
								            params.push('scale=' + options.scale);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        let process = child_process.spawn(exe, params);
							 | 
						||
| 
								 | 
							
								        let output = '';
							 | 
						||
| 
								 | 
							
								        process.stdout.on('data', (data) => {
							 | 
						||
| 
								 | 
							
								            output += data.toString();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        process.stderr.on('data', (data) => {
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        process.on('close', (code) => {
							 | 
						||
| 
								 | 
							
								            if (code !== 0) {
							 | 
						||
| 
								 | 
							
								                log.error('kraffiti process exited with code ' + code + ' when trying to get size of ' + path.parse(from).name);
							 | 
						||
| 
								 | 
							
								                resolve({ w: 0, h: 0 });
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            const lines = output.split('\n');
							 | 
						||
| 
								 | 
							
								            for (let line of lines) {
							 | 
						||
| 
								 | 
							
								                if (line.startsWith('#')) {
							 | 
						||
| 
								 | 
							
								                    let numbers = line.substring(1).split('x');
							 | 
						||
| 
								 | 
							
								                    resolve({ w: parseInt(numbers[0]), h: parseInt(numbers[1]) });
							 | 
						||
| 
								 | 
							
								                    return;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            resolve({ w: 0, h: 0 });
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								function convertImage(from, temp, to, kha, exe, params, options, cache) {
							 | 
						||
| 
								 | 
							
								    return new Promise((resolve, reject) => {
							 | 
						||
| 
								 | 
							
								        let process = child_process.spawn(exe, params);
							 | 
						||
| 
								 | 
							
								        let output = '';
							 | 
						||
| 
								 | 
							
								        process.stdout.on('data', (data) => {
							 | 
						||
| 
								 | 
							
								            output += data.toString();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        process.stderr.on('data', (data) => {
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        process.on('close', (code) => {
							 | 
						||
| 
								 | 
							
								            if (code !== 0) {
							 | 
						||
| 
								 | 
							
								                log.error('kraffiti process exited with code ' + code + ' when trying to convert ' + path.parse(from).name);
							 | 
						||
| 
								 | 
							
								                resolve();
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            fs.renameSync(temp, to);
							 | 
						||
| 
								 | 
							
								            const lines = output.split('\n');
							 | 
						||
| 
								 | 
							
								            for (let line of lines) {
							 | 
						||
| 
								 | 
							
								                if (line.startsWith('#')) {
							 | 
						||
| 
								 | 
							
								                    let numbers = line.substring(1).split('x');
							 | 
						||
| 
								 | 
							
								                    cache[to] = {};
							 | 
						||
| 
								 | 
							
								                    cache[to].original_width = options.original_width = parseInt(numbers[0]);
							 | 
						||
| 
								 | 
							
								                    cache[to].original_height = options.original_height = parseInt(numbers[1]);
							 | 
						||
| 
								 | 
							
								                    resolve();
							 | 
						||
| 
								 | 
							
								                    return;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            resolve();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								async function exportImage(kha, exe, from, to, options, format, prealpha, poweroftwo, cache) {
							 | 
						||
| 
								 | 
							
								    if (format === undefined) {
							 | 
						||
| 
								 | 
							
								        if (from.toString().endsWith('.png'))
							 | 
						||
| 
								 | 
							
								            format = 'png';
							 | 
						||
| 
								 | 
							
								        else if (from.toString().endsWith('.hdr'))
							 | 
						||
| 
								 | 
							
								            format = 'hdr';
							 | 
						||
| 
								 | 
							
								        else
							 | 
						||
| 
								 | 
							
								            format = 'jpg';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (format === 'jpg' && (options.scale === undefined || options.scale === 1) && options.background === undefined) {
							 | 
						||
| 
								 | 
							
								        to = to + '.jpg';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else if (format === 'pvr') {
							 | 
						||
| 
								 | 
							
								        to = to + '.pvr';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else if (format === 'ASTC') {
							 | 
						||
| 
								 | 
							
								        to = to + '.astc.k';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else if (format === 'DXT5') {
							 | 
						||
| 
								 | 
							
								        to = to + '.dxt5.k';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else if (format === 'hdr') {
							 | 
						||
| 
								 | 
							
								        to = to + '.hdr';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else if (format === 'lz4') {
							 | 
						||
| 
								 | 
							
								        to += '.k';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								        format = 'png';
							 | 
						||
| 
								 | 
							
								        if (prealpha)
							 | 
						||
| 
								 | 
							
								            to = to + '.kng';
							 | 
						||
| 
								 | 
							
								        else
							 | 
						||
| 
								 | 
							
								            to = to + '.png';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    let temp = to + '.temp';
							 | 
						||
| 
								 | 
							
								    let outputformat = format;
							 | 
						||
| 
								 | 
							
								    if (format === 'png' && prealpha) {
							 | 
						||
| 
								 | 
							
								        outputformat = 'kng';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (format === 'lz4') {
							 | 
						||
| 
								 | 
							
								        outputformat = 'k';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (format === 'ASTC') {
							 | 
						||
| 
								 | 
							
								        outputformat = 'astc.k';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (format === 'DXT5') {
							 | 
						||
| 
								 | 
							
								        outputformat = 'dxt5.k';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (fs.existsSync(to) && fs.statSync(to).mtime.getTime() > fs.statSync(from.toString()).mtime.getTime()) {
							 | 
						||
| 
								 | 
							
								        if (cache[to] !== undefined) {
							 | 
						||
| 
								 | 
							
								            const cachedOptions = cache[to];
							 | 
						||
| 
								 | 
							
								            options.original_width = cachedOptions.original_width;
							 | 
						||
| 
								 | 
							
								            options.original_height = cachedOptions.original_height;
							 | 
						||
| 
								 | 
							
								            return outputformat;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        let wh = await getWidthAndHeight(kha, exe, from, to, options, format, prealpha);
							 | 
						||
| 
								 | 
							
								        cache[to] = {};
							 | 
						||
| 
								 | 
							
								        cache[to].original_width = options.original_width = wh.w;
							 | 
						||
| 
								 | 
							
								        cache[to].original_height = options.original_height = wh.h;
							 | 
						||
| 
								 | 
							
								        return outputformat;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    fs.ensureDirSync(path.dirname(to));
							 | 
						||
| 
								 | 
							
								    if (format === 'jpg' || format === 'hdr') {
							 | 
						||
| 
								 | 
							
								        fs.copySync(from, temp, { overwrite: true });
							 | 
						||
| 
								 | 
							
								        fs.renameSync(temp, to);
							 | 
						||
| 
								 | 
							
								        let wh = await getWidthAndHeight(kha, exe, from, to, options, format, prealpha);
							 | 
						||
| 
								 | 
							
								        options.original_width = wh.w;
							 | 
						||
| 
								 | 
							
								        options.original_height = wh.h;
							 | 
						||
| 
								 | 
							
								        return outputformat;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    let params = ['from=' + from, 'to=' + temp, 'format=' + format];
							 | 
						||
| 
								 | 
							
								    if (!poweroftwo) {
							 | 
						||
| 
								 | 
							
								        params.push('filter=nearest');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (prealpha)
							 | 
						||
| 
								 | 
							
								        params.push('prealpha');
							 | 
						||
| 
								 | 
							
								    if (options.scale !== undefined && options.scale !== 1) {
							 | 
						||
| 
								 | 
							
								        params.push('scale=' + options.scale);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (options.background !== undefined) {
							 | 
						||
| 
								 | 
							
								        params.push('transparent=' + ((options.background.red << 24) | (options.background.green << 16) | (options.background.blue << 8) | 0xff).toString(16));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (poweroftwo) {
							 | 
						||
| 
								 | 
							
								        params.push('poweroftwo');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    await convertImage(from, temp, to, kha, exe, params, options, cache);
							 | 
						||
| 
								 | 
							
								    return outputformat;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								exports.exportImage = exportImage;
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=ImageTool.js.map
							 |