annotate layer/LinearNumericalScale.cpp @ 855:57efeb75880d

Simplify some logic where loop was used with an unconditional "break" that meant it could only happen once (from coverity scan)
author Chris Cannam
date Wed, 03 Sep 2014 12:05:45 +0100
parents 1d526ba11a24
children 3ca3b8fbbcee
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@696 7 This file copyright 2006-2013 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 "LinearNumericalScale.h"
Chris@696 17 #include "VerticalScaleLayer.h"
Chris@696 18
Chris@696 19 #include <QPainter>
Chris@696 20
Chris@696 21 #include <cmath>
Chris@696 22
Chris@696 23 #include "view/View.h"
Chris@696 24
Chris@696 25 int
Chris@805 26 LinearNumericalScale::getWidth(View *,
Chris@696 27 QPainter &paint)
Chris@696 28 {
Chris@699 29 return paint.fontMetrics().width("-000.00") + 10;
Chris@696 30 }
Chris@696 31
Chris@696 32 void
Chris@696 33 LinearNumericalScale::paintVertical(View *v,
Chris@696 34 const VerticalScaleLayer *layer,
Chris@696 35 QPainter &paint,
Chris@696 36 int x0,
Chris@696 37 float minf,
Chris@696 38 float maxf)
Chris@696 39 {
Chris@696 40 int n = 10;
Chris@696 41
Chris@696 42 float val = minf;
Chris@696 43 float inc = (maxf - val) / n;
Chris@696 44
Chris@696 45 char buffer[40];
Chris@696 46
Chris@696 47 int w = getWidth(v, paint) + x0;
Chris@696 48
Chris@696 49 float round = 1.f;
Chris@696 50 int dp = 0;
Chris@696 51 if (inc > 0) {
Chris@696 52 int prec = trunc(log10f(inc));
Chris@696 53 prec -= 1;
Chris@696 54 if (prec < 0) dp = -prec;
Chris@696 55 round = powf(10.f, prec);
Chris@696 56 #ifdef DEBUG_TIME_VALUE_LAYER
Chris@696 57 cerr << "inc = " << inc << ", round = " << round << ", dp = " << dp << endl;
Chris@696 58 #endif
Chris@696 59 }
Chris@696 60
Chris@696 61 int prevy = -1;
Chris@696 62
Chris@696 63 for (int i = 0; i < n; ++i) {
Chris@696 64
Chris@696 65 int y, ty;
Chris@696 66 bool drawText = true;
Chris@696 67
Chris@696 68 float dispval = val;
Chris@696 69
Chris@696 70 if (i == n-1 &&
Chris@696 71 v->height() < paint.fontMetrics().height() * (n*2)) {
Chris@696 72 if (layer->getScaleUnits() != "") drawText = false;
Chris@696 73 }
Chris@696 74 dispval = lrintf(val / round) * round;
Chris@696 75
Chris@696 76 #ifdef DEBUG_TIME_VALUE_LAYER
Chris@696 77 cerr << "val = " << val << ", dispval = " << dispval << endl;
Chris@696 78 #endif
Chris@696 79
Chris@696 80 y = layer->getYForValue(v, dispval);
Chris@696 81
Chris@696 82 ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2;
Chris@696 83
Chris@696 84 if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) {
Chris@696 85 val += inc;
Chris@696 86 continue;
Chris@696 87 }
Chris@696 88
Chris@696 89 sprintf(buffer, "%.*f", dp, dispval);
Chris@696 90
Chris@696 91 QString label = QString(buffer);
Chris@696 92
Chris@696 93 paint.drawLine(w - 5, y, w, y);
Chris@696 94
Chris@696 95 if (drawText) {
Chris@699 96 paint.drawText(w - paint.fontMetrics().width(label) - 6,
Chris@696 97 ty, label);
Chris@696 98 }
Chris@696 99
Chris@696 100 prevy = y;
Chris@696 101 val += inc;
Chris@696 102 }
Chris@696 103 }