diff layer/HorizontalFrequencyScale.cpp @ 1281:fc9d9f1103fa horizontal-scale

Provide linear horizontal scale in spectrum as well as log; fix bin positioning and colour scale property box updating; ensure proper background colour and visibility of peak lines
author Chris Cannam
date Thu, 03 May 2018 15:15:15 +0100
parents
children f2525e6cbdf1
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/layer/HorizontalFrequencyScale.cpp	Thu May 03 15:15:15 2018 +0100
@@ -0,0 +1,77 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    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
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "HorizontalFrequencyScale.h"
+#include "HorizontalScaleProvider.h"
+#include "LayerGeometryProvider.h"
+
+#include "base/ScaleTickIntervals.h"
+
+#include <QPainter>
+
+#include <cmath>
+
+int
+HorizontalFrequencyScale::getHeight(LayerGeometryProvider *,
+                                    QPainter &paint)
+{
+    return paint.fontMetrics().height() + 10;
+}
+
+void
+HorizontalFrequencyScale::paintScale(LayerGeometryProvider *v,
+                                     const HorizontalScaleProvider *p,
+                                     QPainter &paint,
+                                     QRect r,
+                                     bool logarithmic)
+{
+    int x0 = r.x(), y0 = r.y(), x1 = r.x() + r.width(), y1 = r.y() + r.height();
+
+    paint.drawLine(x0, y0, x1, y0);
+
+    double f0 = p->getFrequencyForX(v, x0 ? x0 : 1);
+    double f1 = p->getFrequencyForX(v, x1);
+
+    int n = 20;
+
+    auto ticks =
+        logarithmic ?
+        ScaleTickIntervals::logarithmic({ f0, f1, n }) :
+        ScaleTickIntervals::linear({ f0, f1, n });
+
+    n = int(ticks.size());
+
+    int marginx = -1;
+
+    for (int i = 0; i < n; ++i) {
+        
+        double val = ticks[i].value;
+        QString label = QString::fromStdString(ticks[i].label);
+        int tw = paint.fontMetrics().width(label);
+        
+        int x = int(round(p->getXForFrequency(v, val)));
+
+        if (x < marginx) continue;
+        
+        //!!! todo: pixel scaling (here & elsewhere in these classes)
+        
+        paint.drawLine(x, y0, x, y1);
+
+        paint.drawText(x + 5, y0 + paint.fontMetrics().ascent() + 5, label);
+
+        marginx = x + tw + 10;
+    }
+}
+