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