// Antialiased line drawing. 
// By David Turover, 2 November 2008.
//
// Requires prior loading of:
//    * buff.js for bufTable
//    * point.js for point type
//    * bres.js for bresenham()



function drawAALine(myBuf, bresOrigin, bresTarget){
	var aaSizeFactor = 4;

	// Increase line length for antialiasing 
	bresOrigin.x *= aaSizeFactor; 
	bresOrigin.y *= aaSizeFactor; 
	bresTarget.x *= aaSizeFactor; 
	bresTarget.y *= aaSizeFactor; 

	// Draw a line.
	var resultArray = bresenham(bresOrigin, bresTarget);

	// Reset origin/target points,since they were taken as pointers 
	bresOrigin.x /= aaSizeFactor; 
	bresOrigin.y /= aaSizeFactor; 
	bresTarget.x /= aaSizeFactor; 
	bresTarget.y /= aaSizeFactor; 

	// Continue with function
	var partialIntensity = 1.0 / aaSizeFactor;

	var intensityMatrix = new Object(); // Will be a hash of hashes.

	var x = 0;	// First index to intensityMatrix
	var y = 0;	// Second index to intensityMatrix
	var intensity = 0.0;

	// Create a hash-of-hash of intensity values. 
	// This way we won't have to iterate over every point in a 2-d array,
	// only the ones that have been changed.
	var l = resultArray.length;
	for(var i=0; i < l; i++){
		x = parseInt(resultArray[i].x / aaSizeFactor);
		y = parseInt(resultArray[i].y / aaSizeFactor);
		if(!intensityMatrix.hasOwnProperty(x)){
			intensityMatrix[x] = new Object();
		}
		if(!intensityMatrix[x].hasOwnProperty(y)){
			intensityMatrix[x][y] = 0; // initialize so not NaN
		}
		
		intensityMatrix[x][y] += partialIntensity; 
	}

	var max_intensity = partialIntensity * (2 * aaSizeFactor - 1);
	var toBlack = 255 / max_intensity;

	// Go through the initialized intensityMatrix items 
	// Note to newbies: for..in is a hash-access method. 
	for(i in intensityMatrix){
		for(j in intensityMatrix[i]){
			
			var v = intensityMatrix[i][j];
			if(v){
				/*if(v > 1.0){
					// TODO: Report error. 
					//debug("At " + i + "," + j + ", intensity " + v + ">1.0");
					//v = max_intensity;
				}*/
				// Draw, presuming a white background.
				myBuf.setPixel(i,j,
					colorString(255, parseInt(255-toBlack*v),
					parseInt(255-toBlack*v))
				);
			}
		}
	}
}


function drawStraightLine(myBuf, bresOrigin, bresTarget){
	// Draw a non-anti-aliased Bresenham line.
	var xdiff = parseInt(bresOrigin.x / 2);
	bresOrigin.x -= xdiff;
	bresTarget.x -= xdiff;
	var resultArray = bresenham(bresOrigin, bresTarget);
	var l = resultArray.length;
	for(var i=0; i < l; i++){
		var x = parseInt(resultArray[i].x);
		var y = parseInt(resultArray[i].y);
		myBuf.setPixel(x,y, 255, 0, 0);
	}
}
