Two rendering glitch fixes for time series charts 87/3287/1
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Thu, 26 Sep 2019 20:24:12 +0000 (23:24 +0300)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Thu, 26 Sep 2019 20:25:12 +0000 (23:25 +0300)
1. Grid values were not rendered properly when the [yMin,yMax] interval
   gets too small (under 1e-6). The calculations in
   GridSpacing.makeGridSpacing contain a capping logic for parameter
   viewboxSize which doesn't necessarily have to be there (IMHO). The
   problem is essentially that auto-scaling the Y-axis allows zooming to
   any small value interval, but the vertical ruler rendering just
   doesn't work properly in those cases.

2. GridUtil.calcLabelWidth calculated the rendered Y-value labels
   differently from the rendering logic in GridUtil.paintVerticalRuler
   and GridUtil.paintVerticalSlaveRuler, i.e. in a more inprecise manner
   which results in the y-axis reserved width not following properly
   what is rendered.

gitlab #392

Change-Id: I30998d9336e50606956a78ad547ee437e0439f1a

bundles/org.simantics.g2d/src/org/simantics/g2d/utils/GridSpacing.java
bundles/org.simantics.g2d/src/org/simantics/g2d/utils/GridUtil.java

index 3702bc4b1a5a2923b1ca55291b1bfb81792d04af..a692b09ea44a66246fcead734584a7d93dca335b 100644 (file)
@@ -79,7 +79,8 @@ public final class GridSpacing implements Serializable {
                double minPixels)
     {
         if (controlWidth==0) controlWidth = 1;
-        if (Math.abs(viewboxSize) < GRID_MIN_USER_SIZE) viewboxSize = GRID_MIN_USER_SIZE * Math.signum(viewboxSize);
+        // This prevents clients from getting the proper GridSpacing information.
+        //if (Math.abs(viewboxSize) < GRID_MIN_USER_SIZE) viewboxSize = GRID_MIN_USER_SIZE * Math.signum(viewboxSize);
 
         double unitsPerPixel = viewboxSize / Math.max(controlWidth, minPixels);
         double [] gridSpacing = getGridSpacing(unitsPerPixel, minPixels);
@@ -115,4 +116,16 @@ public final class GridSpacing implements Serializable {
         return GridUtils.snapToGrid(pos, segment);
     }
 
+    @Override
+    public String toString() {
+        return String.format("%s [minPixels=%.15f, segment=%.15f, segmentExp=%.15f, pixelsPerUnit=%.15f, unitsPerPixel=%.15f, pixelsPerSegment=%.15f]",
+                getClass().getName(),
+                minPixels,
+                segment,
+                segmentExp,
+                pixelsPerUnit,
+                unitsPerPixel,
+                pixelsPerSegment);
+    }
+
 }
index 8ee6c6a71e9a15a781498c0306ecc48f51e4d951..5114f1a660656771595a6a5375e1465d96c82e78 100644 (file)
@@ -213,8 +213,7 @@ public class GridUtil {
         double x = startY / grid.pixelsPerSegment;
        return (int) Math.ceil( x );
     }
-    
-    
+
     /**
      * Estimate label width, by sampling values from xMin to xMax
      * using given font and format.
@@ -226,22 +225,36 @@ public class GridUtil {
      */
     public static double calcLabelWidth(double xMin, double xMax, Format format, GridSpacing grid)
     { 
-       double width = 0.0;     
-       double canvasDiff = GridUtils.distanceToNextGridCoord(xMin, grid.segment);
-       int c = 0;
-       for (double x=xMin + canvasDiff; x<xMax; x+=grid.segment) {
-               boolean nearZero = (x < 0.000000000001) && (x > -0.000000000001);
-               if (nearZero) x = 0.0;
-               String label = format.format(x);
-               if (label==null || label.equals("")) continue;
-               GlyphVector glyphVector;
-                       glyphVector = RULER_FONT.createGlyphVector(frc, label);
+        double width = 0.0;     
+        double canvasDiff = GridUtils.distanceToNextGridCoord(xMin, grid.segment);
+        int c = 0;
+        double canvasStart = xMin + canvasDiff;
+        for (double x=canvasStart; x<xMax; ) {
+            // This nearZero-logic causes a discrepancy between how the labels
+            // are rendered in paintVerticalRuler() and calculated in this method.
+            // Removing it doesn't seem to be causing any immediate adverse effects.
+            // However, this was introduced ages ago to "fix a glitch" so some kind
+            // of regressions might happen if rmeoved.
+//          boolean nearZero = (x < 0.000000000001) && (x > -0.000000000001);
+//          if (nearZero) x = 0.0;
+
+            String label = format.format(x);
+            if (label==null || label.equals("")) continue;
+            GlyphVector glyphVector;
+            glyphVector = RULER_FONT.createGlyphVector(frc, label);
             double labelWidth = glyphVector.getVisualBounds().getWidth();
+            //System.out.format("calcLabelWidth[%d](%s, %f, %f)%n", c, label, labelWidth, width);
             width = Math.max( width, labelWidth );
-            if (c++ > 100) break;            
-       }
-       return width * 1.05;
+            if (c++ > 100) break;
+
+            // It is floating-point-wise more precise to calculate x like this than
+            // accumulating x += grid.segment.
+            // Also, this is how paintVerticalRuler does it and we want to match that
+            // in order to calculate the label width from the exact same values that
+            // paintVerticalRuler will draw.
+            x = canvasStart + grid.segment * c;
+        }
+        return width * 1.05;
     }
-    
-       
+
 }