bad-apple/encoder/index.js
2021-12-26 13:10:55 +07:00

76 lines
2.1 KiB
JavaScript

const fs = require("fs");
const omg = require("omggif");
const { execSync } = require('child_process');
execSync("rm -rf data_compress")
// load gif
const gif_raw = fs.readFileSync("../assets/out.gif");
const gif_data = new omg.GifReader(gif_raw);
const num_pixel = gif_data.width * gif_data.height;
const num_frames = gif_data.numFrames();
const pallete = [];
var maxLength = 0;
var pallete_name;
var buffer = new Uint8Array(num_pixel * 4)
var prevFrame = new Uint8Array(num_pixel * 4)
var buffer_formatted = new Uint16Array(num_pixel);
for (let i=0; i<num_frames; i++) {
// for (let i=0; i<2; i++) {
gif_data.decodeAndBlitFrameRGBA(i, buffer);
let i3 = 0
for (let i2=4; i2<buffer.length; i2 += 4) {
// remove transparent
if (buffer[i2-1] != 0) {
prevFrame[i2-1] = buffer[i2-1]
prevFrame[i2-2] = buffer[i2-2]
prevFrame[i2-3] = buffer[i2-3]
prevFrame[i2-4] = buffer[i2-4]
}
// pallete_name = `${prevFrame[i2-4]},${prevFrame[i2-3]},${prevFrame[i2-2]},${prevFrame[i2-1]}`
// quick check if there is a non opaque pallete
// if (buffer[i2-1] != 255 && buffer[i2-1] != 0) {
// // throw some error maybe? idk
// console.log(pallete_name)
// }
// add pallte if not exist
// if (pallete.indexOf(pallete_name) == -1) pallete.push(pallete_name);
buffer_formatted[i3] = rgb8(prevFrame[i2-4], prevFrame[i2-3], prevFrame[i2-2])
i3++
}
// console.log(count1, count2)
// // Write temp frame
const temp = fs.openSync('temp', "w");
fs.writeSync(temp, Buffer.from(buffer_formatted.buffer));
fs.closeSync(temp);
// // compress temp frame
execSync("./cpp/lzss temp")
const temp_new = fs.readFileSync("temp");
maxLength = Math.max(temp_new.length, maxLength);
fs.appendFileSync("data_compress", temp_new);
console.log(`Convert frames ${i+1} of ${num_frames}`);
}
// console.log(buffer_final)
// console.log(pallete)
console.log("Num pallete:", pallete.length)
console.log(maxLength);
function rgb8(r,g,b) {
return (((r)>>3)|(((g)>>3)<<5)|(((b)>>3)<<10))
}