declare compat with Gecko 12 versions
[mandelbrot.git] / content / mandelbrot.js
index c1f3e5461d33a834be720e733ca6fca82032dd25..279d3ae26f2a656438ab4b561f85bb3310f9d128 100644 (file)
@@ -43,6 +43,7 @@ var gColorPalette = [];
 var gStartTime = 0;
 var gMbrotBundle;
 var gCurrentImageData;
+var gLastImageData;
 
 function Startup() {
   gMbrotBundle = document.getElementById("mbrotBundle");
@@ -193,6 +194,10 @@ function drawImage() {
 
   document.getElementById("statusLabel").value = gMbrotBundle.getString("statusDrawing");
 
+  if (gCurrentImageData) {
+    gLastImageData = gCurrentImageData;
+  }
+
   let Cr_vals = getAdjustPref("last_image.Cr_*");
   let Cr_min = Cr_vals.Cr_min;
   let Cr_max = Cr_vals.Cr_max;
@@ -204,6 +209,10 @@ function drawImage() {
   let iterMax = getAdjustPref("iteration_max");
   let algorithm = getAdjustPref("use_algorithm");
 
+  let currentPalette = getAdjustPref("color_palette");
+  if (!gColorPalette || !gColorPalette.length)
+    gColorPalette = getColorPalette(currentPalette);
+
   let iWidth = getAdjustPref("image.width");
   let iHeight = getAdjustPref("image.height");
 
@@ -458,27 +467,45 @@ function drawPoint(context, img_x, img_y, C, iterMax, algorithm) {
 
 var zoomstart;
 var imgBackup;
+var zoomTouchID;
 
 let imgEvHandler = {
   handleEvent: function(aEvent) {
     let canvas = document.getElementById("mbrotImage");
     let context = canvas.getContext("2d");
+    let touchEvent = aEvent.type.indexOf('touch') != -1;
+
+    // Bail out if this is neither a touch nor left-click.
+    if (!touchEvent && aEvent.button != 0)
+      return;
+
+    // Bail out if the started touch can't be found.
+    if (touchEvent && zoomstart &&
+        !aEvent.changedTouches.identifiedTouch(zoomTouchID))
+      return;
+
+    let coordObj = touchEvent ?
+                   aEvent.changedTouches.identifiedTouch(zoomTouchID) :
+                   aEvent;
+
     switch (aEvent.type) {
       case 'mousedown':
       case 'touchstart':
-        if (aEvent.button == 0) {
-          // left button - start dragzoom
-          zoomstart = {x: aEvent.clientX - canvas.offsetLeft,
-                       y: aEvent.clientY - canvas.offsetTop};
-          imgBackup = context.getImageData(0, 0, canvas.width, canvas.height);
+        if (touchEvent) {
+          zoomTouchID = aEvent.changedTouches.item(0).identifier;
+          coordObj = aEvent.changedTouches.identifiedTouch(zoomTouchID);
         }
+        // left button - start dragzoom
+        zoomstart = {x: coordObj.clientX - canvas.offsetLeft,
+                     y: coordObj.clientY - canvas.offsetTop};
+        imgBackup = context.getImageData(0, 0, canvas.width, canvas.height);
         break;
       case 'mouseup':
       case 'touchend':
-        if (aEvent.button == 0 && zoomstart) {
+        if (zoomstart) {
           context.putImageData(imgBackup, 0, 0);
-          let zoomend = {x: aEvent.clientX - canvas.offsetLeft,
-                        y: aEvent.clientY - canvas.offsetTop};
+          let zoomend = {x: coordObj.clientX - canvas.offsetLeft,
+                         y: coordObj.clientY - canvas.offsetTop};
 
           // make sure zoomend is bigger than zoomstart
           if ((zoomend.x == zoomstart.x) || (zoomend.y == zoomstart.y)) {
@@ -507,12 +534,12 @@ let imgEvHandler = {
         break;
       case 'mousemove':
       case 'touchmove':
-        if (aEvent.button == 0 && zoomstart) {
+        if (zoomstart) {
           context.putImageData(imgBackup, 0, 0);
           context.strokeStyle = "rgb(255,255,31)";
           context.strokeRect(zoomstart.x, zoomstart.y,
-                             aEvent.clientX - canvas.offsetLeft - zoomstart.x,
-                             aEvent.clientY - canvas.offsetTop - zoomstart.y);
+                             coordObj.clientX - canvas.offsetLeft - zoomstart.x,
+                             coordObj.clientY - canvas.offsetTop - zoomstart.y);
         }
       break;
     }
@@ -538,18 +565,11 @@ function saveImage() {
   }
 }
 
-function exitMandelbrot() {
-  var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
-                          .getService(Components.interfaces.nsIXULAppInfo);
-  if (appInfo.ID == "mandelbrot@kairo.at")
-    quitApp(false);
-  else
-    window.close();
-}
-
 function updateBookmarkMenu(aParent) {
   document.getElementById("bookmarkSave").disabled =
-    (!document.getElementById("drawButton").hidden || (gStartTime > 0));
+      (!document.getElementById("drawButton").hidden || (gStartTime > 0));
+
+  document.getElementById("bookmarkBack").disabled = !gLastImageData;
 
   while (aParent.hasChildNodes() &&
          aParent.lastChild.id != "bookmarkSeparator")
@@ -586,6 +606,16 @@ function updateBookmarkMenu(aParent) {
   na.setAttribute("disabled", "true");
 }
 
+function goBack() {
+  if (gLastImageData) {
+    Services.prefs.setIntPref("mandelbrot.iteration_max",
+                              gLastImageData.iterMax);
+    // use gLastImageData.iWidth, gLastImageData.iHeight ???
+    adjustCoordsAndDraw(gLastImageData.C_min, gLastImageData.C_max);
+    gLastImageData = undefined;
+  }
+}
+
 function callBookmark(evtarget) {
   if (evtarget.id == "bookmarkSave" || evtarget.id == "bookmarkSeparator")
     return;