changeset 665:ab9fefdaa103

Make scale drawing in log scale a bit less dumb
author Chris Cannam
date Tue, 16 Jul 2013 13:38:53 +0100
parents 62330d542e1d
children 12e6efc8cdc0
files layer/NoteLayer.cpp layer/TimeValueLayer.cpp
diffstat 2 files changed, 24 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/layer/NoteLayer.cpp	Tue Jul 16 13:22:31 2013 +0100
+++ b/layer/NoteLayer.cpp	Tue Jul 16 13:38:53 2013 +0100
@@ -38,6 +38,8 @@
 #include <cmath>
 #include <utility>
 
+//#define DEBUG_NOTE_LAYER 1
+
 NoteLayer::NoteLayer() :
     SingleColourLayer(),
     m_model(0),
@@ -615,13 +617,17 @@
                 max = Pitch::getFrequencyForPitch(lrintf(max + 1));
             }
 
+#ifdef DEBUG_NOTE_LAYER
             std::cerr << "NoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << std::endl;
+#endif
 
         } else if (log) {
 
             LogRange::mapRange(min, max);
 
+#ifdef DEBUG_NOTE_LAYER
             std::cerr << "NoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << std::endl;
+#endif
 
         }
 
@@ -655,21 +661,29 @@
 
     getScaleExtents(v, min, max, logarithmic);
 
-//    std::cerr << "NoteLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << std::endl;
+#ifdef DEBUG_NOTE_LAYER
+    std::cerr << "NoteLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << std::endl;
+#endif
 
     if (shouldConvertMIDIToHz()) {
         val = Pitch::getFrequencyForPitch(lrintf(val),
                                           lrintf((val - lrintf(val)) * 100));
-//        std::cerr << "shouldConvertMIDIToHz true, val now = " << val << std::endl;
+#ifdef DEBUG_NOTE_LAYER
+        std::cerr << "shouldConvertMIDIToHz true, val now = " << val << std::endl;
+#endif
     }
 
     if (logarithmic) {
         val = LogRange::map(val);
-//        std::cerr << "logarithmic true, val now = " << val << std::endl;
+#ifdef DEBUG_NOTE_LAYER
+        std::cerr << "logarithmic true, val now = " << val << std::endl;
+#endif
     }
 
     int y = int(h - ((val - min) * h) / (max - min)) - 1;
-//    std::cerr << "y = " << y << std::endl;
+#ifdef DEBUG_NOTE_LAYER
+    std::cerr << "y = " << y << std::endl;
+#endif
     return y;
 }
 
--- a/layer/TimeValueLayer.cpp	Tue Jul 16 13:22:31 2013 +0100
+++ b/layer/TimeValueLayer.cpp	Tue Jul 16 13:38:53 2013 +0100
@@ -1263,7 +1263,7 @@
         if (prec < 0) dp = -prec;
         round = powf(10.f, prec);
 #ifdef DEBUG_TIME_VALUE_LAYER
-        std::cerr << "inc = " << inc << ", round = " << round << std::endl;
+        std::cerr << "inc = " << inc << ", round = " << round << ", dp = " << dp << std::endl;
 #endif
     }
 
@@ -1303,7 +1303,11 @@
         }
 
         if (logarithmic) {
-            sprintf(buffer, "%.*g", dp < 2 ? 2 : dp, LogRange::unmap(dispval));
+            double dv = LogRange::unmap(dispval);
+            int digits = trunc(log10f(dv));
+            int sf = dp + (digits > 0 ? digits : 0);
+            if (sf < 2) sf = 2;
+            sprintf(buffer, "%.*g", sf, dv);
         } else {
             sprintf(buffer, "%.*f", dp, dispval);
         }