104 lines
3.0 KiB
JavaScript
104 lines
3.0 KiB
JavaScript
// let DATA = [
|
|
// 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
|
// 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,
|
|
// 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,
|
|
// 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
// ];
|
|
|
|
const TILEMAP = [
|
|
];
|
|
|
|
const TILEMAP_WIDTH = 8;
|
|
|
|
const convertData = (DATA, fileOut) => {
|
|
// Begin
|
|
const PNG = require('pngjs').PNG;
|
|
const fs = require('fs');
|
|
|
|
const PIXELS = DATA.length / 2 * 8;
|
|
const TILE_WIDTH = 8;
|
|
const TILE_HEIGHT = 8;
|
|
const DATA_WIDTH = TILE_WIDTH;
|
|
const DATA_HEIGHT = PIXELS / DATA_WIDTH;
|
|
const TILEMAP_HEIGHT = TILEMAP.length / TILEMAP_WIDTH;
|
|
const TILEMAP_PIXEL_WIDTH = TILEMAP_WIDTH * TILE_WIDTH;
|
|
const TILEMAP_PIXEL_HEIGHT = TILEMAP_HEIGHT * TILE_HEIGHT;
|
|
|
|
const colorPixel = (id) => {
|
|
if(id === undefined) id = 3;
|
|
if(id === 3) return { r: 8, g: 24, b: 32 };
|
|
if(id === 2) return { r: 52, g: 104, b: 86 };
|
|
if(id === 1) return { r: 136, g: 192, b: 112 };
|
|
if(id === 0) return { r: 224, g: 248, b: 208 };
|
|
throw new Error();
|
|
}
|
|
|
|
// Create output image
|
|
const imageData = new PNG({
|
|
width: DATA_WIDTH,
|
|
height: DATA_HEIGHT
|
|
});
|
|
|
|
const tileData = new PNG({
|
|
width: TILEMAP_PIXEL_WIDTH,
|
|
height: TILEMAP_PIXEL_HEIGHT
|
|
});
|
|
|
|
// Convert data into pixels
|
|
const pixelsOut = [];
|
|
for(let i = 0; i < DATA.length; i += 2) {
|
|
const low = DATA[i];
|
|
const high = DATA[i+1];
|
|
|
|
for(let j = 0; j < 8; j++) {
|
|
const mask = 0x80 >> j;
|
|
const pixel = (low & mask ? 1 : 0) + (high & mask ? 2 : 0);
|
|
pixelsOut.push(pixel);
|
|
}
|
|
}
|
|
|
|
// Buffer data output
|
|
for(let y = 0; y < DATA_HEIGHT; y++) {
|
|
for(let x = 0; x < DATA_WIDTH; x++) {
|
|
const id = (DATA_WIDTH * y + x);
|
|
const color = colorPixel(pixelsOut[id]);
|
|
const idx = id << 2;
|
|
|
|
imageData.data[idx] = color.r;
|
|
imageData.data[idx+1] = color.g;
|
|
imageData.data[idx+2] = color.b;
|
|
imageData.data[idx+3] = 0xFF;
|
|
}
|
|
}
|
|
const buffer = PNG.sync.write(imageData, { });
|
|
fs.writeFileSync(fileOut, buffer);
|
|
}
|
|
|
|
// Now work out tile data
|
|
if(TILEMAP.length) {
|
|
for(let i = 0; i < TILEMAP.length; i++) {
|
|
const tileX = i % TILEMAP_WIDTH;
|
|
const tileY = Math.floor(i / TILEMAP_WIDTH);
|
|
const tile = TILEMAP[i];
|
|
|
|
for(let j = 0; j < TILE_WIDTH*TILE_HEIGHT; j++) {
|
|
const outI = (
|
|
(tileX * TILE_WIDTH) + (tileY * TILE_HEIGHT * TILEMAP_PIXEL_WIDTH) +
|
|
((j % TILE_WIDTH) + (Math.floor(j / TILE_WIDTH) * TILEMAP_PIXEL_WIDTH))
|
|
);
|
|
const idx = outI << 2;
|
|
const pixelI = (tile * TILE_WIDTH * TILE_HEIGHT) + j;
|
|
const color = colorPixel(pixelsOut[pixelI]);
|
|
|
|
tileData.data[idx] = color.r;
|
|
tileData.data[idx+1] = color.g;
|
|
tileData.data[idx+2] = color.b;
|
|
tileData.data[idx+3] = 0xFF;
|
|
}
|
|
}
|
|
|
|
const buffer2 = PNG.sync.write(tileData, { });
|
|
fs.writeFileSync('out.png', buffer2);
|
|
}
|
|
|
|
module.exports = convertData; |