Bug 12496 fixed: zoom_rect could lead to a crash in log scale 62/13262/2
Calixte DENIZET [Thu, 28 Nov 2013 13:32:32 +0000 (14:32 +0100)]
* fix zoom_box values in log scale when zoom and/or translation is made with the mouse

Change-Id: I4487728a3ef084cd9b2ca6333bfd50751d9a3d89

scilab/CHANGES_5.5.X
scilab/modules/graphic_objects/src/java/org/scilab/modules/graphic_objects/axes/Axes.java
scilab/modules/graphics/tests/nonreg_tests/bug_12496.dia.ref [new file with mode: 0644]
scilab/modules/graphics/tests/nonreg_tests/bug_12496.tst [new file with mode: 0644]
scilab/modules/renderer/src/java/org/scilab/modules/renderer/JoGLView/interaction/DragZoomRotateInteraction.java
scilab/modules/renderer/src/java/org/scilab/modules/renderer/JoGLView/interaction/ZoomRubberBox.java
scilab/modules/renderer/src/java/org/scilab/modules/renderer/JoGLView/util/ScaleUtils.java

index 3df7c91..54037e8 100644 (file)
@@ -143,6 +143,8 @@ Scilab Bug Fixes
 
 * Bug #12492 fixed - Exported EPS files were invalid when dash patterns were too long.
 
+* Bug #12496 fixed - zoom_rect could lead to a crash in log scale.
+
 * Bug #12673 fixed - Ticks were drawn outside of axes area.
 
 * Bug #12682 fixed - Key events were disabled after zooming.
index e4b1760..9011842 100644 (file)
@@ -1920,7 +1920,7 @@ public class Axes extends GraphicObject {
 
     public Double[] getCorrectedBounds() {
         if (getZoomEnabled()) {
-            Double[] b = getZoomBox();
+            Double[] b = getCorrectZoomBox();
             double[][] factors = getScaleTranslateFactors();
 
             b[0] = b[0] * factors[0][0] + factors[1][0];
@@ -1942,7 +1942,7 @@ public class Axes extends GraphicObject {
      */
     public Double[] getDisplayedBounds() {
         if (getZoomEnabled()) {
-            return getZoomBox();
+            return getCorrectZoomBox();
         } else {
             return getMaximalDisplayedBounds();
         }
@@ -2087,6 +2087,26 @@ public class Axes extends GraphicObject {
         return box.getZoomBox();
     }
 
+    public Double[] getCorrectZoomBox() {
+        Double[] b = getZoomBox();
+        if (getXAxisLogFlag()) {
+            b[0] = Math.log10(b[0]);
+            b[1] = Math.log10(b[1]);
+        }
+
+        if (getYAxisLogFlag()) {
+            b[2] = Math.log10(b[2]);
+            b[3] = Math.log10(b[3]);
+        }
+
+        if (getZAxisLogFlag()) {
+            b[4] = Math.log10(b[4]);
+            b[5] = Math.log10(b[5]);
+        }
+
+        return b;
+    }
+
     /**
      * @param zoomBox the zoom box to set
      */
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_12496.dia.ref b/scilab/modules/graphics/tests/nonreg_tests/bug_12496.dia.ref
new file mode 100644 (file)
index 0000000..e4407c1
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- TEST WITH GRAPHIC -->
+// <-- Non-regression test for bug 12496 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/12496
+//
+// <-- Short Description -->
+// zoom_rect could lead to a crash in log scale
+x=[432462,17893,78004,10269];
+y=[168.75,206.25,187.5,225];
+plot2d(x,y,-2)
+a = gca();
+a.grid = [color("black"),color("black")];
+a.log_flags = "ll";
+a.sub_ticks = [8 0];
+zoom_rect([10000,100,500000,250]);
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_12496.tst b/scilab/modules/graphics/tests/nonreg_tests/bug_12496.tst
new file mode 100644 (file)
index 0000000..2ed3d90
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+
+// <-- Non-regression test for bug 12496 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/12496
+//
+// <-- Short Description -->
+// zoom_rect could lead to a crash in log scale
+
+x=[432462,17893,78004,10269];
+y=[168.75,206.25,187.5,225];
+plot2d(x,y,-2)
+a = gca();
+a.grid = [color("black"),color("black")];
+a.log_flags = "ll";
+a.sub_ticks = [8 0];
+zoom_rect([10000,100,500000,250]);
index 229da22..1d617ae 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2009-2012 - DIGITEO - Pierre Lando
+ * Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
  *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -25,6 +26,7 @@ import org.scilab.modules.graphic_objects.axes.Axes;
 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
 import org.scilab.modules.renderer.JoGLView.DrawerVisitor;
+import org.scilab.modules.renderer.JoGLView.util.ScaleUtils;
 
 /**
  * This class manage figure interaction.
@@ -174,12 +176,33 @@ public class DragZoomRotateInteraction extends FigureInteraction {
                 bounds[4] = (bounds[4] - factors[1][2]) / factors[0][2];
                 bounds[5] = (bounds[5] - factors[1][2]) / factors[0][2];
 
+                boolean[] logFlags = { axes.getXAxisLogFlag(), axes.getYAxisLogFlag(), axes.getZAxisLogFlag()};
+                ScaleUtils.applyInverseLogScaleToBounds(bounds, logFlags);
+
                 GraphicController.getController().setProperty(axes.getIdentifier(), GraphicObjectProperties.__GO_ZOOM_BOX__, bounds);
                 GraphicController.getController().setProperty(axes.getIdentifier(), GraphicObjectProperties.__GO_ZOOM_ENABLED__, zoomed);
+
             }
         }
     }
 
+    private static void applyUnlog(Double[] bounds, Axes axes) {
+        if (axes.getXAxisLogFlag()) {
+            bounds[0] = Math.pow(10, bounds[0]);
+            bounds[1] = Math.pow(10, bounds[1]);
+        }
+
+        if (axes.getYAxisLogFlag()) {
+            bounds[2] = Math.pow(10, bounds[2]);
+            bounds[3] = Math.pow(10, bounds[3]);
+        }
+
+        if (axes.getZAxisLogFlag()) {
+            bounds[4] = Math.pow(10, bounds[4]);
+            bounds[5] = Math.pow(10, bounds[5]);
+        }
+    }
+
     /**
      * This {@see MouseMotionListener} manage rotation and translation on the figure.
      */
@@ -276,8 +299,10 @@ public class DragZoomRotateInteraction extends FigureInteraction {
                         bounds[3] += yDelta * rotatedDY;
                     }
 
-
                     Boolean zoomed = tightZoomBoxToDataBounds(currentAxes, bounds);
+                    boolean[] logFlags = { currentAxes.getXAxisLogFlag(), currentAxes.getYAxisLogFlag(), currentAxes.getZAxisLogFlag()};
+                    ScaleUtils.applyInverseLogScaleToBounds(bounds, logFlags);
+
                     GraphicController.getController().setProperty(currentAxes.getIdentifier(), GraphicObjectProperties.__GO_ZOOM_BOX__, bounds);
                     GraphicController.getController().setProperty(currentAxes.getIdentifier(), GraphicObjectProperties.__GO_ZOOM_ENABLED__, zoomed);
                 }
@@ -296,6 +321,9 @@ public class DragZoomRotateInteraction extends FigureInteraction {
                 bounds[5] += zDelta * dy;
 
                 Boolean zoomed = tightZoomBoxToDataBounds(currentAxes, bounds);
+                boolean[] logFlags = { currentAxes.getXAxisLogFlag(), currentAxes.getYAxisLogFlag(), currentAxes.getZAxisLogFlag()};
+                ScaleUtils.applyInverseLogScaleToBounds(bounds, logFlags);
+
                 GraphicController.getController().setProperty(currentAxes.getIdentifier(), GraphicObjectProperties.__GO_ZOOM_BOX__, bounds);
                 GraphicController.getController().setProperty(currentAxes.getIdentifier(), GraphicObjectProperties.__GO_ZOOM_ENABLED__, zoomed);
             }
index 870b8d2..9a653cc 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2012 - Scilab Enterprises - Bruno JOFRET
+ * Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
  *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -16,6 +17,7 @@ import java.awt.event.MouseEvent;
 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
 import org.scilab.modules.renderer.JoGLView.DrawerVisitor;
+import org.scilab.modules.renderer.JoGLView.util.ScaleUtils;
 
 /**
  * @author Bruno JOFRET
@@ -96,6 +98,9 @@ public class ZoomRubberBox extends RubberBox {
             bounds[4] = (bounds[4] - factors[1][2]) / factors[0][2];
             bounds[5] = (bounds[5] - factors[1][2]) / factors[0][2];
 
+            boolean[] logFlags = { axes.getXAxisLogFlag(), axes.getYAxisLogFlag(), axes.getZAxisLogFlag()};
+            ScaleUtils.applyInverseLogScaleToBounds(bounds, logFlags);
+
             GraphicController.getController().setProperty(axes.getIdentifier(), GraphicObjectProperties.__GO_ZOOM_BOX__, bounds);
             GraphicController.getController().setProperty(axes.getIdentifier(), GraphicObjectProperties.__GO_ZOOM_ENABLED__, zoomed);
             getDrawerVisitor().getCanvas().redraw();
index 0a30e3c..3766781 100644 (file)
@@ -46,8 +46,8 @@ public class ScaleUtils {
     }
 
     /**
-     * Applies logarithmic scaling to a point and returns the result.
-     * @param point the point.
+     * Applies logarithmic scaling to a coords array.
+     * @param coords the coords (a 3-array).
      * @param logFlags the flags indicating whether scaling must be applied for respectively the x,y,z axes (3 elements).
      */
     public static void applyLogScale(double[] coords, boolean[] logFlags) {
@@ -89,8 +89,8 @@ public class ScaleUtils {
     }
 
     /**
-     * Applies inverse logarithmic scaling to a point and returns the result.
-     * @param point the point.
+     * Applies inverse logarithmic scaling to a coords array.
+     * @param coords the coords (a 3-array).
      * @param logFlags the flags indicating whether inverse scaling must be applied for respectively the x,y,z axes (3 elements).
      */
     public static void applyInverseLogScale(double[] coords, boolean[] logFlags) {
@@ -106,4 +106,26 @@ public class ScaleUtils {
             coords[2] = Math.pow(10.0, coords[2]);
         }
     }
+
+    /**
+     * Applies inverse logarithmic scaling to a bounds array.
+     * @param bounds the bounds (a 6-array).
+     * @param logFlags the flags indicating whether inverse scaling must be applied for respectively the x,y,z axes (3 elements).
+     */
+    public static void applyInverseLogScaleToBounds(Double[] bounds, boolean[] logFlags) {
+        if (logFlags[0]) {
+            bounds[0] = Math.pow(10, bounds[0]);
+            bounds[1] = Math.pow(10, bounds[1]);
+        }
+
+        if (logFlags[1]) {
+            bounds[2] = Math.pow(10, bounds[2]);
+            bounds[3] = Math.pow(10, bounds[3]);
+        }
+
+        if (logFlags[2]) {
+            bounds[4] = Math.pow(10, bounds[4]);
+            bounds[5] = Math.pow(10, bounds[5]);
+        }
+    }
 }