docs: function(callback) {
  		
  		if(!this.ifLoad) {
  			this.history.push('add to stack task: bmpToData');
  			this.stack(this.bmpToData, callback);
  			return;
  		} 
  		
  		this.history.push('bmp decode');
  		
  		var fileSize, headerLength, i, magic, offset, b, data, g, r, w, x, y, _ref;
  		this.pos = 0;
  		this.bpp = 24;
  		
  		magic = ((function() {
  			var _results;
  			_results = [];
  			for (i = 0; i < 2; i++) {
  				_results.push(String.fromCharCode(this.data[this.pos++]));
  			}
  			return _results;
  		}).call(this)).join('');
  		
  		if (magic !== 'BM') {
  			throw 'Invalid BMP file.';
  		}
  		
  		fileSize = this._readUInt32Bmp();
  		this.pos += 4;
  		offset = this._readUInt32Bmp();
  		headerLength = this._readUInt32Bmp();
  		this.width = this._readUInt32Bmp();
  		this.height = this._readUInt32Bmp();
  		this.colorPlaneCount = this._readUInt16Bmp();
  		this.bitsPerPixel = this._readUInt16Bmp();
  		this.compressionMethod = this._readUInt32Bmp();
  		this.rawSize = this._readUInt32Bmp();
  		this.hResolution = this._readUInt32Bmp();
  		this.vResolution = this._readUInt32Bmp();
  		this.paletteColors = this._readUInt32Bmp();
  		this.importantColors = this._readUInt32Bmp();
  
  
  		var Ndata = [];
  
  		for(y = this.height; y > 0; y--) {
  			i = 4 * y * this.width;
  			
  			for (var x = 0; x < this.width; x++) {
  				
  				b = this.data[this.pos++];
  				g = this.data[this.pos++];
  				r = this.data[this.pos++];
  				
  				Ndata[i++] = r;
  				Ndata[i++] = g;
  				Ndata[i++] = b;
  				Ndata[i++] = 255;
  			}
  			
  			if(this.width%2) {
  				this.pos++;
  			}
  			
  			if(this.width%4) {
  				this.pos++;
  				this.pos++;
  			}
  		}
  	
  		for(var i=0, null_elems=0; i < Ndata.length; i ++) {
  			if(Ndata[i] != null) {
  				break;
  			}
  			null_elems++;
  		}
  		
  		Ndata.splice(0, this.width*4);
  		
  		this.data = Ndata;
  		callback.call(this);
  		
  		return;
  	}