annotate layer/LogNumericalScale.cpp @ 1386:fc3d89f88690 spectrogramparam

Use log-frequency rather than log-bin for calculating x coord in spectrum. This has the advantage that frequency positions don't move when we change the window size or oversampling ratio, but it does give us an unhelpfully large amount of space for very low frequencies - to be considered
author Chris Cannam
date Mon, 12 Nov 2018 11:34:34 +0000
parents fc9d9f1103fa
children f2525e6cbdf1
rev   line source
Chris@696 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@696 2
Chris@696 3 /*
Chris@696 4 Sonic Visualiser
Chris@696 5 An audio file viewer and annotation editor.
Chris@696 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1281 7 This file copyright 2006-2018 Chris Cannam and QMUL.
Chris@696 8
Chris@696 9 This program is free software; you can redistribute it and/or
Chris@696 10 modify it under the terms of the GNU General Public License as
Chris@696 11 published by the Free Software Foundation; either version 2 of the
Chris@696 12 License, or (at your option) any later version. See the file
Chris@696 13 COPYING included with this distribution for more information.
Chris@696 14 */
Chris@696 15
Chris@696 16 #include "LogNumericalScale.h"
Chris@696 17 #include "VerticalScaleLayer.h"
Chris@1276 18 #include "LayerGeometryProvider.h"
Chris@696 19
Chris@696 20 #include "base/LogRange.h"
Chris@1276 21 #include "base/ScaleTickIntervals.h"
Chris@696 22
Chris@696 23 #include <QPainter>
Chris@696 24
Chris@696 25 #include <cmath>
Chris@696 26
Chris@696 27 int
Chris@918 28 LogNumericalScale::getWidth(LayerGeometryProvider *,
Chris@1281 29 QPainter &paint)
Chris@696 30 {
Chris@1281 31 return paint.fontMetrics().width("-000.00") + 10;
Chris@696 32 }
Chris@696 33
Chris@696 34 void
Chris@918 35 LogNumericalScale::paintVertical(LayerGeometryProvider *v,
Chris@1266 36 const VerticalScaleLayer *layer,
Chris@1266 37 QPainter &paint,
Chris@1266 38 int x0,
Chris@1266 39 double minlog,
Chris@1266 40 double maxlog)
Chris@696 41 {
Chris@1260 42 int n = 10;
Chris@1260 43 auto ticks = ScaleTickIntervals::logarithmicAlready({ minlog, maxlog, n });
Chris@1260 44 n = int(ticks.size());
Chris@1260 45
Chris@696 46 int w = getWidth(v, paint) + x0;
Chris@696 47
Chris@696 48 int prevy = -1;
Chris@696 49
Chris@696 50 for (int i = 0; i < n; ++i) {
Chris@696 51
Chris@1266 52 int y, ty;
Chris@696 53 bool drawText = true;
Chris@696 54
Chris@1266 55 if (i == n-1 &&
Chris@1266 56 v->getPaintHeight() < paint.fontMetrics().height() * (n*2)) {
Chris@1266 57 if (layer->getScaleUnits() != "") drawText = false;
Chris@1266 58 }
Chris@696 59
Chris@1260 60 double val = ticks[i].value;
Chris@1260 61 QString label = QString::fromStdString(ticks[i].label);
Chris@696 62
Chris@1266 63 y = layer->getYForValue(v, val);
Chris@696 64
Chris@1266 65 ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2;
Chris@1266 66
Chris@1266 67 if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) {
Chris@1266 68 continue;
Chris@696 69 }
Chris@696 70
Chris@1266 71 paint.drawLine(w - 5, y, w, y);
Chris@696 72
Chris@696 73 if (drawText) {
Chris@1266 74 paint.drawText(w - paint.fontMetrics().width(label) - 6,
Chris@1266 75 ty, label);
Chris@696 76 }
Chris@696 77
Chris@696 78 prevy = y;
Chris@696 79 }
Chris@696 80 }
Chris@1276 81