package mb;
public class ProgressiveBlocksMandComp extends MandComp {
	
	private double dx, dy;
	
	public void run(int myDrawCount) {
		dx = (xmax - xmin)/imageWidth;
		dy = (ymax - ymin)/imageHeight;
		int[] rgb = new int[imageHeight];
		for (int block = 128; block > 1; block /= 2)
			for (int col = block/2; col-block/2 < imageWidth; col += block) {
				if (!running || drawCount != myDrawCount)
					return;
				computeBlockColumn(col,block,rgb);
				synchronized(this) {
					if (!running || drawCount != myDrawCount)
						return;
					for (int i = col-block/2; i < col+block/2 && i < imageWidth; i++)
						raster.setPixels(i,0,1,imageHeight,rgb);
					owner.newData(col-block/2,0,block,imageHeight);
				}
				Thread.yield();
			}
		for (int i = 0; i < imageWidth; i++) {
			if (!running || drawCount != myDrawCount)
				return;
			computeColumn(i,rgb);
			synchronized(this) {
				if (!running || drawCount != myDrawCount)
					return;
				raster.setPixels(i,0,1,imageHeight,rgb);
				owner.newData(i,0,1,imageHeight);
			}
			Thread.yield();
		}	
	}
	
	private void computeBlockColumn(int column, int blockSize, int[] data) {
		double x = xmin + dx*column;
		for (int row = blockSize/2; row-blockSize/2 < imageHeight; row += blockSize) {
			double y = ymax - row*dy;
			int iter = countIterations(x,y);
			int color = getIndexFor(iter);
			for (int i = row-blockSize/2; i < row+blockSize/2 && i < imageHeight; i++)
				data[i] = color;
		}
	}
	
	private void computeColumn(int columnNumber, int[] data){
		double x = xmin + dx*columnNumber;
		for (int i = 0; i < imageHeight; i++) {
			double y = ymax - dy*i;
			int iter = countIterations(x,y);
			data[i] = getIndexFor(iter);
		}
	}
	
}
