65 lines
1.7 KiB
JavaScript
65 lines
1.7 KiB
JavaScript
"use strict";
|
|
|
|
var zlib = require('zlib');
|
|
|
|
var crc32 = require('./crc32buffer');
|
|
|
|
var PNG_HEAD = new Buffer([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
var PNG_IHDR = new Buffer([0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0]);
|
|
var PNG_IDAT = new Buffer([0, 0, 0, 0, 73, 68, 65, 84]);
|
|
var PNG_IEND = new Buffer([0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130]);
|
|
|
|
function png(bitmap, stream) {
|
|
stream.push(PNG_HEAD);
|
|
|
|
var IHDR = Buffer.concat([PNG_IHDR]);
|
|
IHDR.writeUInt32BE(bitmap.size, 8);
|
|
IHDR.writeUInt32BE(bitmap.size, 12);
|
|
IHDR.writeUInt32BE(crc32(IHDR.slice(4, -4)), 21);
|
|
stream.push(IHDR);
|
|
|
|
var IDAT = Buffer.concat([
|
|
PNG_IDAT,
|
|
zlib.deflateSync(bitmap.data, { level: 9 }),
|
|
new Buffer(4)
|
|
]);
|
|
IDAT.writeUInt32BE(IDAT.length - 12, 0);
|
|
IDAT.writeUInt32BE(crc32(IDAT.slice(4, -4)), IDAT.length - 4);
|
|
stream.push(IDAT);
|
|
|
|
stream.push(PNG_IEND);
|
|
stream.push(null);
|
|
}
|
|
|
|
function bitmap(matrix, size, margin) {
|
|
var N = matrix.length;
|
|
var X = (N + 2 * margin) * size;
|
|
var data = new Buffer((X + 1) * X);
|
|
data.fill(255);
|
|
for (var i = 0; i < X; i++) {
|
|
data[i * (X + 1)] = 0;
|
|
}
|
|
|
|
for (var i = 0; i < N; i++) {
|
|
for (var j = 0; j < N; j++) {
|
|
if (matrix[i][j]) {
|
|
var offset = ((margin + i) * (X + 1) + (margin + j)) * size + 1;
|
|
data.fill(0, offset, offset + size);
|
|
for (var c = 1; c < size; c++) {
|
|
data.copy(data, offset + c * (X + 1), offset, offset + size);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
data: data,
|
|
size: X
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
bitmap: bitmap,
|
|
png: png
|
|
}
|