Chris@1068: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@1068: Chris@1068: /* Chris@1068: Sonic Visualiser Chris@1068: An audio file viewer and annotation editor. Chris@1068: Centre for Digital Music, Queen Mary, University of London. Chris@1068: This file copyright 2006-2016 Chris Cannam and QMUL. Chris@1068: Chris@1068: This program is free software; you can redistribute it and/or Chris@1068: modify it under the terms of the GNU General Public License as Chris@1068: published by the Free Software Foundation; either version 2 of the Chris@1068: License, or (at your option) any later version. See the file Chris@1068: COPYING included with this distribution for more information. Chris@1068: */ Chris@1068: Chris@1068: #ifndef COLOUR_SCALE_H Chris@1068: #define COLOUR_SCALE_H Chris@1068: Chris@1068: #include "ColourMapper.h" Chris@1068: Chris@1068: /** Chris@1068: * Map values within a range onto a set of colours, with a given Chris@1068: * distribution (linear, log etc) and optional colourmap rotation. Chris@1068: */ Chris@1068: class ColourScale Chris@1068: { Chris@1068: public: Chris@1068: enum Scale { Chris@1068: LinearColourScale, Chris@1068: MeterColourScale, Chris@1068: LogColourScale, Chris@1068: PhaseColourScale, Chris@1068: PlusMinusOneScale, Chris@1068: AbsoluteScale Chris@1068: }; Chris@1068: Chris@1068: /** Chris@1068: * Create a ColourScale with the given parameters: Chris@1068: * Chris@1068: * @param colourMap A colour map index as used by ColourMapper Chris@1068: * @param scale Distribution for the scale Chris@1068: * @param minValue Minimum value in range Chris@1068: * @param maxValue Maximum value in range. Must be > minValue Chris@1068: * @param threshold Threshold below which every value is mapped to Chris@1068: * background pixel 0 Chris@1068: * @param gain Gain to apply before clamping and mapping, typically 1 Chris@1068: * Chris@1068: * Note that some parameters may be ignored for some scale Chris@1068: * distribution settings. For example, min and max are ignored for Chris@1068: * PlusMinusOneScale and PhaseColourScale and threshold and gain Chris@1068: * are ignored for PhaseColourScale. Chris@1068: */ Chris@1068: ColourScale(int colourMap, Chris@1068: Scale scale, Chris@1068: double minValue, Chris@1068: double maxValue, Chris@1068: double threshold, Chris@1068: double gain); Chris@1068: Chris@1068: /** Chris@1068: * Return a pixel number (in the range 0-255 inclusive) Chris@1068: * corresponding to the given value. The pixel 0 is used only for Chris@1068: * values below the threshold supplied in the constructor. All Chris@1068: * other values are mapped onto the range 1-255. Chris@1068: */ Chris@1068: int getPixel(double value); Chris@1068: Chris@1068: /** Chris@1068: * Return the colour for the given pixel number (which must be in Chris@1068: * the range 0-255). The pixel 0 is always the background Chris@1068: * colour. Other pixels are mapped taking into account the given Chris@1068: * colourmap rotation (which is also a value in the range 0-255). Chris@1068: */ Chris@1068: QColor getColourForPixel(int pixel, int rotation); Chris@1068: Chris@1068: /** Chris@1068: * Return the colour corresponding to the given value. This is Chris@1068: * equivalent to getColourForPixel(getPixel(value), rotation). Chris@1068: */ Chris@1068: QColor getColour(double value, int rotation) { Chris@1068: return getColourForPixel(getPixel(value), rotation); Chris@1068: } Chris@1068: Chris@1068: private: Chris@1068: ColourMapper m_mapper; Chris@1068: Scale m_scale; Chris@1068: double m_min; Chris@1068: double m_max; Chris@1068: double m_mappedMin; Chris@1068: double m_mappedMax; Chris@1068: double m_threshold; Chris@1068: double m_gain; Chris@1068: static int m_maxPixel; Chris@1068: }; Chris@1068: Chris@1068: #endif