Mercurial > hg > svgui
diff layer/LogColourScale.cpp @ 699:1a1448f7beb2
Pull out colour scale drawing as well
author | Chris Cannam |
---|---|
date | Wed, 04 Dec 2013 13:11:23 +0000 |
parents | |
children | 1d526ba11a24 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layer/LogColourScale.cpp Wed Dec 04 13:11:23 2013 +0000 @@ -0,0 +1,99 @@ +/* -*- 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-2013 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 "LogColourScale.h" +#include "ColourScaleLayer.h" + +#include "base/LogRange.h" + +#include <QPainter> + +#include <cmath> + +#include "view/View.h" + +int +LogColourScale::getWidth(View *v, + QPainter &paint) +{ + return paint.fontMetrics().width("-000.00") + 15; +} + +void +LogColourScale::paintVertical(View *v, + const ColourScaleLayer *layer, + QPainter &paint, + int x0, + float minlog, + float maxlog) +{ + int h = v->height(); + + int n = 10; + + float val = minlog; + float inc = (maxlog - val) / n; + + char buffer[40]; + + int w = getWidth(v, paint) + x0; + + int boxx = 5, boxy = 5; + if (layer->getScaleUnits() != "") { + boxy += paint.fontMetrics().height(); + } + int boxw = 10, boxh = h - boxy - 5; + + int tx = 5 + boxx + boxw; + paint.drawRect(boxx, boxy, boxw, boxh); + + paint.save(); + for (int y = 0; y < boxh; ++y) { + float val = ((boxh - y) * (maxlog - minlog)) / boxh + minlog; + paint.setPen(layer->getColourForValue(v, LogRange::unmap(val))); + paint.drawLine(boxx + 1, y + boxy + 1, boxx + boxw, y + boxy + 1); + } + paint.restore(); + + int dp = 0; + if (inc > 0) { + int prec = trunc(log10f(inc)); + prec -= 1; + if (prec < 0) dp = -prec; + } + + for (int i = 0; i < n; ++i) { + + int y, ty; + + y = boxy + int(boxh - ((val - minlog) * boxh) / (maxlog - minlog)); + + ty = y - paint.fontMetrics().height() + + paint.fontMetrics().ascent() + 2; + + double dv = LogRange::unmap(val); + int digits = trunc(log10f(dv)); + int sf = dp + (digits > 0 ? digits : 0); + if (sf < 2) sf = 2; + sprintf(buffer, "%.*g", sf, dv); + + QString label = QString(buffer); + + paint.drawLine(boxx + boxw - boxw/3, y, boxx + boxw, y); + paint.drawText(tx, ty, label); + + val += inc; + } +}