45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// http://atlc.sourceforge.net/bmp.html
 | 
						|
// Any better format documentation?
 | 
						|
 | 
						|
var fs = require('fs');
 | 
						|
var Pixmap = require('./pixmap').Pixmap;
 | 
						|
var Buffer = require('buffer').Buffer;
 | 
						|
require('../../lib/unpackbuffer').addUnpack(Buffer);
 | 
						|
 | 
						|
var reversed = new Buffer(256);
 | 
						|
for (var i=0; i < 256; ++i)
 | 
						|
{
 | 
						|
    var res = 0;
 | 
						|
    for (b = 0; b < 8; ++b)
 | 
						|
    {
 | 
						|
        res += ((i & (1 << b) ) >> b) << (7-b);
 | 
						|
    }
 | 
						|
    reversed[i] = res;
 | 
						|
}
 | 
						|
 | 
						|
module.exports.decodeBuffer = function(buffer)
 | 
						|
{
 | 
						|
    var h = buffer.unpack('CCLxxxxLLLLSSLLLL');
 | 
						|
    var header = {};
 | 
						|
    header.filesize = h[2];
 | 
						|
    header.data_offset = h[3];
 | 
						|
    header.header_size = h[4];
 | 
						|
    header.width = h[5];
 | 
						|
    header.height = h[6];
 | 
						|
    header.num_planes = h[7];
 | 
						|
    header.bpp = h[8];
 | 
						|
    header.compression = h[9];
 | 
						|
    header.data_size = h[10];
 | 
						|
    header.hresolution = h[11]; // pixels per METER!
 | 
						|
    header.vresolution = h[12];
 | 
						|
    // skipped: num colors, num important colors, palette
 | 
						|
    var data = buffer.slice(header.data_offset, header.data_offset+header.data_size);
 | 
						|
    // TODO: decode compressed bitmap
 | 
						|
    //console.log(header);
 | 
						|
 | 
						|
    // mirror bits & invert
 | 
						|
    for (var i=0; i < data.length; ++i)
 | 
						|
        data[i] = 255 - reversed[data[i]];
 | 
						|
 | 
						|
    return new Pixmap(header.bpp, header.width, header.height, data);
 | 
						|
} |