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);
 | |
| } |