diff layer/LogNumericalScale.cpp @ 1324:13d9b422f7fe zoom

Merge from default branch
author Chris Cannam
date Mon, 17 Sep 2018 13:51:31 +0100
parents fc9d9f1103fa
children f2525e6cbdf1
line wrap: on
line diff
--- a/layer/LogNumericalScale.cpp	Mon Dec 12 15:18:52 2016 +0000
+++ b/layer/LogNumericalScale.cpp	Mon Sep 17 13:51:31 2018 +0100
@@ -4,7 +4,7 @@
     Sonic Visualiser
     An audio file viewer and annotation editor.
     Centre for Digital Music, Queen Mary, University of London.
-    This file copyright 2006-2013 Chris Cannam and QMUL.
+    This file copyright 2006-2018 Chris Cannam and QMUL.
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -15,108 +15,67 @@
 
 #include "LogNumericalScale.h"
 #include "VerticalScaleLayer.h"
+#include "LayerGeometryProvider.h"
 
 #include "base/LogRange.h"
+#include "base/ScaleTickIntervals.h"
 
 #include <QPainter>
 
 #include <cmath>
 
-#include "LayerGeometryProvider.h"
-
-//#define DEBUG_TIME_VALUE_LAYER 1
-
 int
 LogNumericalScale::getWidth(LayerGeometryProvider *,
-			    QPainter &paint)
+                            QPainter &paint)
 {
     return paint.fontMetrics().width("-000.00") + 10;
 }
 
 void
 LogNumericalScale::paintVertical(LayerGeometryProvider *v,
-				 const VerticalScaleLayer *layer,
-				 QPainter &paint,
-				 int x0,
-				 double minlog,
-				 double maxlog)
+                                 const VerticalScaleLayer *layer,
+                                 QPainter &paint,
+                                 int x0,
+                                 double minlog,
+                                 double maxlog)
 {
+    int n = 10;
+    auto ticks = ScaleTickIntervals::logarithmicAlready({ minlog, maxlog, n });
+    n = int(ticks.size());
+
     int w = getWidth(v, paint) + x0;
 
-    int n = 10;
-
-    double val = minlog;
-    double inc = (maxlog - val) / n; // even increments of log scale
-
-    // smallest increment as displayed
-    double minDispInc = LogRange::unmap(minlog + inc) - LogRange::unmap(minlog);
-
-#ifdef DEBUG_TIME_VALUE_LAYER
-    cerr << "min = " << minlog << ", max = " << maxlog << ", inc = " << inc << ", minDispInc = " << minDispInc << endl;
-#endif
-
-    const int buflen = 40;
-    char buffer[buflen];
-
-    double round = 1.f;
-    int dp = 0;
-
-    if (minDispInc > 0) {
-        int prec = int(trunc(log10(minDispInc)));
-        if (prec < 0) dp = -prec;
-        round = pow(10.0, prec);
-        if (dp > 4) dp = 4;
-#ifdef DEBUG_TIME_VALUE_LAYER
-        cerr << "round = " << round << ", prec = " << prec << ", dp = " << dp << endl;
-#endif
-    }
-
     int prevy = -1;
                 
     for (int i = 0; i < n; ++i) {
 
-	int y, ty;
+        int y, ty;
         bool drawText = true;
 
-	if (i == n-1 &&
-	    v->getPaintHeight() < paint.fontMetrics().height() * (n*2)) {
-	    if (layer->getScaleUnits() != "") drawText = false;
-	}
-
-        double dispval = LogRange::unmap(val);
-	dispval = floor(dispval / round) * round;
-
-#ifdef DEBUG_TIME_VALUE_LAYER
-	cerr << "val = " << val << ", dispval = " << dispval << endl;
-#endif
-
-	y = layer->getYForValue(v, dispval);
-
-	ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2;
-	
-	if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) {
-	    val += inc;
-	    continue;
+        if (i == n-1 &&
+            v->getPaintHeight() < paint.fontMetrics().height() * (n*2)) {
+            if (layer->getScaleUnits() != "") drawText = false;
         }
 
-	int digits = int(trunc(log10(dispval)));
-	int sf = dp + (digits > 0 ? digits : 0);
-	if (sf < 4) sf = 4;
-#ifdef DEBUG_TIME_VALUE_LAYER
-        cerr << "sf = " << sf << endl;
-#endif
-	snprintf(buffer, buflen, "%.*g", sf, dispval);
+        double val = ticks[i].value;
+        QString label = QString::fromStdString(ticks[i].label);
 
-	QString label = QString(buffer);
+        y = layer->getYForValue(v, val);
 
-	paint.drawLine(w - 5, y, w, y);
+        ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2;
+        
+        if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) {
+            continue;
+        }
+
+        paint.drawLine(w - 5, y, w, y);
 
         if (drawText) {
-	    paint.drawText(w - paint.fontMetrics().width(label) - 6,
-			   ty, label);
+            paint.drawText(w - paint.fontMetrics().width(label) - 6,
+                           ty, label);
         }
 
         prevy = y;
-	val += inc;
     }
 }
+