add patch by prefiks pointed out in http://home.kairo.at/blog/2008-08/kairo_at_mandel...
authorRobert Kaiser <kairo@kairo.at>
Tue, 2 Sep 2008 18:45:51 +0000 (20:45 +0200)
committerRobert Kaiser <kairo@kairo.at>
Tue, 2 Sep 2008 18:45:51 +0000 (20:45 +0200)
xulapp/chrome/mandelbrot/content/mandelbrot.js

index 5ab02a7..aab0f02 100644 (file)
@@ -50,19 +50,23 @@ function Startup() {
 
 function drawImage() {
   let canvas = document.getElementById("mbrotImage");
-  if (canvas.getContext) {
-    let context = canvas.getContext("2d");
+  let context = canvas.getContext("2d");
 
-    document.getElementById("statusLabel").value =
-        document.getElementById("mbrotBundle").getString("statusDrawing");
+  document.getElementById("statusLabel").value =
+      document.getElementById("mbrotBundle").getString("statusDrawing");
+
+  let iterMax = gPref.getIntPref("mandelbrot.iteration_max");
+  let algorithm = gPref.getCharPref("mandelbrot.use_algorithm");
 
-    // example:
-    // context.fillStyle = "rgb(200,0,0)";
-    // context.fillRect (10, 10, 55, 50); // x, y, width, height
-    //
-    // context.fillStyle = "rgba(0, 0, 200, 0.5)";
-    // context.fillRect (30, 30, 55, 50);
+  context.fillStyle = "rgb(255, 255, 255)";
+  context.fillRect(0, 0, canvas.width, canvas.height);
 
+  gStartTime = new Date();
+
+  drawLine(0, canvas, context, iterMax, algorithm);
+}
+
+function drawLine(line, canvas, context, iterMax, algorithm) {
     let Cr_min = -2.0;
     let Cr_max = 1.0;
     let Cr_scale = Cr_max - Cr_min;
@@ -71,20 +75,19 @@ function drawImage() {
     let Ci_max = 1.5;
     let Ci_scale = Ci_max - Ci_min;
 
-    let iterMax = gPref.getIntPref("mandelbrot.iteration_max");
-    let algorithm = gPref.getCharPref("mandelbrot.use_algorithm");
-
-    gStartTime = new Date();
-
-    for (let img_x = 0; img_x < canvas.width; img_x++) {
-      for (let img_y = 0; img_y < canvas.height; img_y++) {
+    let pixels = [];
+    for (var img_y = line; img_y < canvas.height && img_y < line+8; img_y++)
+      for (let img_x = 0; img_x < canvas.width; img_x++) {
         let C = new complex(Cr_min + (img_x / canvas.width) * Cr_scale,
                             Ci_min + (img_y / canvas.height) * Ci_scale);
-        window.setTimeout(drawPoint, 0, context, img_x, img_y, C, iterMax, algorithm);
+        pixels.push.apply(pixels, drawPoint(context, img_x, img_y, C, iterMax, algorithm));
       }
-    }
-    window.setTimeout(EndCalc, 0);
-  }
+    context.putImageData({width: canvas.width, height: pixels.length/4/canvas.width, data: pixels}, 0, line);
+
+    if (img_y < canvas.height)
+      setTimeout(drawLine, 0, img_y, canvas, context, iterMax, algorithm);
+    else
+      EndCalc();
 }
 
 function EndCalc() {
@@ -97,14 +100,16 @@ function EndCalc() {
 function complex(aReal, aImag) {
   this.r = aReal;
   this.i = aImag;
-  this.square = function() {
+}
+complex.prototype = {
+  square: function() {
     return new complex(this.r * this.r - this.i * this.i,
                        2 * this.r * this.i);
-  }
-  this.dist = function() {
+  },
+  dist: function() {
     return Math.sqrt(this.r * this.r + this.i * this.i);
-  }
-  this.add = function(aComplex) {
+  },
+  add: function(aComplex) {
     return new complex(this.r + aComplex.r, this.i + aComplex.i);
   }
 }
@@ -141,9 +146,9 @@ function getColor(aIterValue, aIterMax) {
 
   // fallback to simple b/w if for some reason we don't have a palette
   if (aIterValue == aIterMax)
-    return "rgb(0,0,0)";
+    return [0, 0, 0, 255];
   else
-    return "rgb(255,255,255)";
+    return [255, 255, 255, 255];
 }
 
 function getColorPalette(palName) {
@@ -151,53 +156,53 @@ function getColorPalette(palName) {
   switch (palName) {
     case 'bw':
       for (let i = 0; i < 1024; i++) {
-        palette[i] = 'rgb(255,255,255)';
+        palette[i] = [255, 255, 255, 255];
       }
-      palette[1024] = 'rgb(0,0,0)';
+      palette[1024] = [0, 0, 0, 255];
       break;
     case 'kairo':
       // outer areas
       for (let i = 0; i < 32; i++) {
         let cc1 = Math.floor(i * 127 / 31);
         let cc2 = 170 - Math.floor(i * 43 / 31);
-        palette[i] = 'rgb(' + cc1 + ',' + cc2 + ',' + cc1 + ')';
+        palette[i] = [cc1, cc2, cc1, 255];
       }
       // inner areas
       for (let i = 0; i < 51; i++) {
         let cc = Math.floor(i * 170 / 50);
-        palette[32 + i] = 'rgb(' + cc + ',0,' + (170 + cc) + ')';
+        palette[32 + i] = [cc, 0, (170-cc), 255];
       }
       // corona
       for (let i = 0; i < 101; i++) {
         let cc = Math.floor(i * 200 / 100);
-        palette[83 + i] = 'rgb(255,' + cc + ',0)';
+        palette[83 + i] = [255, cc, 0, 255];
       }
       // inner corona
       for (let i = 0; i < 201; i++) {
         let cc1 = 255 - Math.floor(i * 85 / 200);
         let cc2 = 200 - Math.floor(i * 30 / 200);
         let cc3 = Math.floor(i * 170 / 200);
-        palette[184 + i] = 'rgb(' + cc1 + ',' + cc2 + ',' + cc3 + ')';
+        palette[184 + i] = [cc1, cc2, cc3, 255];
       }
       for (let i = 0; i < 301; i++) {
         let cc1 = 170 - Math.floor(i * 43 / 300);
         let cc2 = 170 + Math.floor(i * 85 / 300);
-        palette[385 + i] = 'rgb(' + cc1 + ',' + cc1 + ',' + cc2 + ')';
+        palette[385 + i] = [cc1, cc1, cc2, 255];
       }
       for (let i = 0; i < 338; i++) {
         let cc = 127 + Math.floor(i * 128 / 337);
-        palette[686 + i] = 'rgb(' + cc + ',' + cc + ',255)';
+        palette[686 + i] = [cc, cc, 255, 255];
       }
-      palette[1024] = 'rgb(0,0,0)';
+      palette[1024] = [0, 0, 0, 255];
       break;
     case 'rainbow-linear1':
       for (let i = 0; i < 256; i++) {
-        palette[i] = 'rgb(' + i + ',0,0)';
-        palette[256 + i] = 'rgb(255,' + i + ',0)';
-        palette[512 + i] = 'rgb(' + (255 - i) + ',255,' + i + ')';
-        palette[768 + i] = 'rgb(' + i + ',' + (255 - i) + ',255)';
+        palette[i] = [i, 0, 0, 255];
+        palette[256 + i] = [255, i, 0, 255];
+        palette[512 + i] = [255 - i, 255, i, 255];
+        palette[768 + i] = [i, 255-i, 255, 255];
       }
-      palette[1024] = 'rgb(0,0,0)';
+      palette[1024] = [0, 0, 0, 255];
       break;
   }
 /*
@@ -272,8 +277,7 @@ function drawPoint(context, img_x, img_y, C, iterMax, algorithm) {
       itVal = mandelbrotValueNumeric(C, iterMax);
       break;
   }
-  context.fillStyle = getColor(itVal, iterMax);
-  context.fillRect (img_x, img_y, 1, 1); // x, y, width, height
+  return getColor(itVal, iterMax);
 }
 
 /***** pure UI functions *****/