// 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;