
function drawMandelbrot(canvas, width, height, cx, cy, scale, iter, forceSlowPath) {
    var limit = 2.;
    var limitSqr = limit * limit;
    var scaleRatio = scale / size;
    var colours = [[1,0,0],[1,1,0],[0,1,0],[0,1,1],[0,0,1],[1,0,1],[0,0,0]];
    var imageData;
    if (!forceSlowPath&&canvas.getImageData)
       imageData = canvas.getImageData(0, 0, width, height);
    else
       imageData = {width: width, height: height, data: []};
    var size = Math.min(imageData.width, imageData.height);
    var result = imageData.data;
    var idx = 0;
    var sqrt = Math.sqrt;
    var floor = Math.floor;
    var startTime = new Date();
    for (var y = 0; y < size; ++y) {
        var ci = scale * (y / size - 0.5) - cy;
        for (var x = 0; x < size; ++x) {
            var zr = 0.0;
            var zi = 0.0;
            var zrSqr = 0.0;
            var ziSqr = 0.0;
            var cr = scale * (x / size - 0.5) - cx;
            var cl = -1;

            for (var cnt = 0; cnt < iter; ++cnt) {
                var tr = zrSqr - ziSqr + cr;
                var ti = 2*zr*zi + ci;
                zr = tr;
                zi = ti;
                zrSqr = zr * zr;
                ziSqr = zi * zi;
                if ((zrSqr+ziSqr) > limitSqr) {
                    var depth = sqrt(cnt / (iter+1));
                    cl = cnt / (iter+1);
                    break;
                }
            }
            result[idx] = result[idx + 1] = result[idx + 2] = floor(cl * 255);
            result[idx + 3] = 255;
            idx += 4;
        }
    }
    var endCalcTime = new Date();
    if (log) {
        log("Time taken for calc: " + (endCalcTime - startTime) / 1000 + "s");
    }
    setTimeout(function() {
        var startDrawTime = new Date();
		var idx = 0;
        if (!forceSlowPath && canvas.putImageData) {
            canvas.putImageData(imageData, 0, 0);
        } else if (!forceSlowPath && canvas.setFillColor) {
			for (var y = 0; y < size; ++y) {
				for (var x = 0; x < size; ++x) {
					var col = result[idx] / 255;
					canvas.setFillColor(col, col, col, 1);
					idx += 4;
					canvas.fillRect(x, y, 1, 1);
				}
			}
		} else {
			for (var y = 0; y < size; ++y) {
				for (var x = 0; x < size; ++x) {
					var col = result[idx];
					canvas.fillStyle = "rgb("+[col,col,col]+")";
					idx += 4;
					canvas.fillRect(x, y, 1, 1);
				}
			}
		}
        var endTime = new Date();
        if (log) {
            log("Time taken to draw: " + (endTime - startDrawTime) / 1000 + "s");
        }
    });
}

