Improving compiler.
This commit is contained in:
7
scripts/common.js
Normal file
7
scripts/common.js
Normal file
@@ -0,0 +1,7 @@
|
||||
const TILE_WIDTH = 8;
|
||||
const TILE_HEIGHT = 8;
|
||||
|
||||
module.exports = {
|
||||
TILE_WIDTH,
|
||||
TILE_HEIGHT
|
||||
}
|
88
scripts/gb2png.js
Normal file
88
scripts/gb2png.js
Normal file
@@ -0,0 +1,88 @@
|
||||
const PNG = require('pngjs').PNG;
|
||||
const fs = require('fs');
|
||||
const {
|
||||
TILE_WIDTH,
|
||||
TILE_HEIGHT
|
||||
} = require('./common');
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
const gb2png = (DATA, fileOut) => {
|
||||
// Begin
|
||||
const PIXELS = DATA.length / 2 * TILE_WIDTH;
|
||||
const DATA_WIDTH = TILE_WIDTH;
|
||||
const DATA_HEIGHT = PIXELS / DATA_WIDTH;
|
||||
|
||||
// Create output image
|
||||
const imageData = new PNG({
|
||||
width: DATA_WIDTH,
|
||||
height: DATA_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 = {
|
||||
gb2png
|
||||
};
|
@@ -1,104 +0,0 @@
|
||||
// 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;
|
@@ -1,25 +1,29 @@
|
||||
const PNG = require('pngjs').PNG;
|
||||
const fs = require('fs');
|
||||
const { arrayToString } = require('./util');
|
||||
const {
|
||||
TILE_WIDTH,
|
||||
TILE_HEIGHT
|
||||
} = require('./common');
|
||||
|
||||
const convert = (fileIn, fileOut) => {
|
||||
const TILE_WIDTH = 8;
|
||||
const TILE_HEIGHT = 8;
|
||||
|
||||
const getPixelValue = (pixel) => {
|
||||
if(pixel.g === 188) return 0;
|
||||
if(pixel.g === 172) return 1;
|
||||
if(pixel.g === 98) return 2;
|
||||
if(pixel.g === 56) return 3;
|
||||
throw new Error();
|
||||
}
|
||||
|
||||
const png2gb = (fileIn, fileOut, name) => {
|
||||
|
||||
const data = fs.readFileSync(fileIn);
|
||||
const png = PNG.sync.read(data);
|
||||
|
||||
const getPixelValue = (pixel) => {
|
||||
if(pixel.r === 15) return 3;
|
||||
if(pixel.r === 48) return 2;
|
||||
if(pixel.r === 0) return 1;
|
||||
if(pixel.r === 155) return 0;
|
||||
throw new Error();
|
||||
}
|
||||
|
||||
// Convert PNG pixels into 0x00-0x03
|
||||
const pixels = [];
|
||||
for(let x = 0; x < png.width; x++) {
|
||||
for(let y = 0; y < png.height; y++) {
|
||||
for(let y = 0; y < png.height; y++) {
|
||||
for(let x = 0; x < png.width; x++) {
|
||||
const id = x + (y * png.width);
|
||||
const idx = id << 2;
|
||||
const r = png.data[idx];
|
||||
@@ -39,11 +43,11 @@ const convert = (fileIn, fileOut) => {
|
||||
const tileX = i % columns;
|
||||
const tileY = Math.floor(i / columns) % rows;
|
||||
|
||||
for(let x = 0; x < TILE_WIDTH; x++) {
|
||||
for(let y = 0; y < TILE_HEIGHT; y++) {
|
||||
const px = (tileY * TILE_WIDTH) + x;// NO idea why I need to flipX/Y.
|
||||
const py = (tileX * TILE_HEIGHT) + y;// and too lazy to figure out why.
|
||||
const pi = px + (py * png.width);
|
||||
for(let y = 0; y < TILE_HEIGHT; y++) {
|
||||
for(let x = 0; x < TILE_WIDTH; x++) {
|
||||
const px = (tileX * TILE_WIDTH) + x;
|
||||
const py = (tileY * TILE_HEIGHT) + y;
|
||||
const pi = (py * png.width) + px;
|
||||
rearranged[n++] = pixels[pi];
|
||||
}
|
||||
}
|
||||
@@ -62,28 +66,20 @@ const convert = (fileIn, fileOut) => {
|
||||
bits.push(lowBits, highBits);
|
||||
}
|
||||
|
||||
const b = bits.map(n => {
|
||||
return '0x' + (n.toString(16).padStart(2, '0').toUpperCase());
|
||||
});
|
||||
let str = '';
|
||||
for(let i = 0; i < b.length; i += 16) {
|
||||
str += ' ';
|
||||
for(let x = i; x < Math.min(i+16, b.length); x++) {
|
||||
str += b[x];
|
||||
str += ',';
|
||||
}
|
||||
str += '\n';
|
||||
}
|
||||
|
||||
let out = '';
|
||||
out += `#include "../libs.h"\n\n`
|
||||
out += `#define IMAGE_WIDTH ${png.width}\n`;
|
||||
out += `#define IMAGE_HEIGHT ${png.height}\n`;
|
||||
out += `#define IMAGE_TILES ${columns * rows}\n`;
|
||||
out += `\nconst uint8_t IMAGE[] = {\n${str}};`;
|
||||
out += `#include "libs.h"\n\n`
|
||||
out += `#define ${name}_IMAGE_WIDTH ${png.width}\n`;
|
||||
out += `#define ${name}_IMAGE_HEIGHT ${png.height}\n`;
|
||||
out += `#define ${name}_IMAGE_COLUMNS ${png.width / TILE_WIDTH}\n`;
|
||||
out += `#define ${name}_IMAGE_ROWS ${png.height / TILE_HEIGHT}\n`;
|
||||
out += `#define ${name}_IMAGE_TILES ${columns * rows}\n`;
|
||||
out += `\nconst uint8_t ${name}_IMAGE[] = {\n${arrayToSTring(bits)}};`;
|
||||
|
||||
fs.writeFileSync(fileOut, out);
|
||||
require('./../gb2png/')(bits, `${fileOut}.png`);
|
||||
}
|
||||
|
||||
convert('images/font.png', 'out.c');
|
||||
module.exports = {
|
||||
png2gb
|
||||
}
|
||||
|
||||
// convert('images/sm.png', 'out.c', 'PENNY');
|
29
scripts/string2gb.js
Normal file
29
scripts/string2gb.js
Normal file
@@ -0,0 +1,29 @@
|
||||
const fs = require('fs');
|
||||
const { arrayToString } = require('./util');
|
||||
|
||||
const FONT_CHARACTER_FIRST = 33;
|
||||
const FONT_DATA_POSITION = 4;
|
||||
|
||||
const getCodeFrom = l => {
|
||||
const cc = l.charCodeAt(0)
|
||||
if(l == '\n' || l == ' ') return cc;
|
||||
return cc - FONT_CHARACTER_FIRST + FONT_DATA_POSITION
|
||||
}
|
||||
|
||||
const string2gb = (string, name) => {
|
||||
const letters = [];
|
||||
for(let i = 0; i < string.length; i++) {
|
||||
letters.push(getCodeFrom(string[i]));
|
||||
}
|
||||
|
||||
out = '#include "libs.h"\n\n';
|
||||
out += `#define STR_${name}_LENGTH ${string.length}\n`;
|
||||
out += `extern const uint8_t STR_${name}_DATA[];\n\n\n`
|
||||
out += `const uint8_t STR_${name}_DATA[] = {\n` + arrayToString(letters) + `\n};`;
|
||||
|
||||
fs.writeFileSync('out.c', out);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
string2gb
|
||||
};
|
21
scripts/util.js
Normal file
21
scripts/util.js
Normal file
@@ -0,0 +1,21 @@
|
||||
const arrayToString = arr => {
|
||||
const b = arr.map(n => {
|
||||
return '0x' + (n.toString(16).padStart(2, '0').toUpperCase());
|
||||
});
|
||||
|
||||
let str = '';
|
||||
for(let i = 0; i < b.length; i += 16) {
|
||||
str += ' ';
|
||||
for(let x = i; x < Math.min(i+16, b.length); x++) {
|
||||
str += b[x];
|
||||
str += ',';
|
||||
}
|
||||
str += '\n';
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
arrayToString
|
||||
}
|
Reference in New Issue
Block a user