| Chris@1068 | 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */ | 
| Chris@1068 | 2 | 
| Chris@1068 | 3 /* | 
| Chris@1068 | 4     Sonic Visualiser | 
| Chris@1068 | 5     An audio file viewer and annotation editor. | 
| Chris@1068 | 6     Centre for Digital Music, Queen Mary, University of London. | 
| Chris@1068 | 7     This file copyright 2006-2016 Chris Cannam and QMUL. | 
| Chris@1068 | 8 | 
| Chris@1068 | 9     This program is free software; you can redistribute it and/or | 
| Chris@1068 | 10     modify it under the terms of the GNU General Public License as | 
| Chris@1068 | 11     published by the Free Software Foundation; either version 2 of the | 
| Chris@1068 | 12     License, or (at your option) any later version.  See the file | 
| Chris@1068 | 13     COPYING included with this distribution for more information. | 
| Chris@1068 | 14 */ | 
| Chris@1068 | 15 | 
| Chris@1068 | 16 #ifndef COLOUR_SCALE_H | 
| Chris@1068 | 17 #define COLOUR_SCALE_H | 
| Chris@1068 | 18 | 
| Chris@1068 | 19 #include "ColourMapper.h" | 
| Chris@1068 | 20 | 
| Chris@1068 | 21 /** | 
| Chris@1068 | 22  * Map values within a range onto a set of colours, with a given | 
| Chris@1068 | 23  * distribution (linear, log etc) and optional colourmap rotation. | 
| Chris@1068 | 24  */ | 
| Chris@1068 | 25 class ColourScale | 
| Chris@1068 | 26 { | 
| Chris@1068 | 27 public: | 
| Chris@1068 | 28     enum Scale { | 
| Chris@1068 | 29 	LinearColourScale, | 
| Chris@1068 | 30 	MeterColourScale, | 
| Chris@1068 | 31 	LogColourScale, | 
| Chris@1068 | 32 	PhaseColourScale, | 
| Chris@1068 | 33         PlusMinusOneScale, | 
| Chris@1068 | 34         AbsoluteScale | 
| Chris@1068 | 35     }; | 
| Chris@1068 | 36 | 
| Chris@1070 | 37     struct Parameters { | 
| Chris@1070 | 38 	Parameters() : colourMap(0), scale(LinearColourScale), | 
| Chris@1070 | 39 		       minValue(0.0), maxValue(1.0), | 
| Chris@1070 | 40 		       threshold(0.0), gain(1.0) { } | 
| Chris@1070 | 41 | 
| Chris@1070 | 42 	/** A colour map index as used by ColourMapper */ | 
| Chris@1070 | 43 	int colourMap; | 
| Chris@1070 | 44 | 
| Chris@1070 | 45 	/** Distribution for the scale */ | 
| Chris@1070 | 46 	Scale scale; | 
| Chris@1070 | 47 | 
| Chris@1070 | 48 	/** Minimum value in source range */ | 
| Chris@1070 | 49 	double minValue; | 
| Chris@1070 | 50 | 
| Chris@1070 | 51 	/** Maximum value in source range. Must be > minValue */ | 
| Chris@1070 | 52 	double maxValue; | 
| Chris@1070 | 53 | 
| Chris@1070 | 54 	/** Threshold below which every value is mapped to background | 
| Chris@1070 | 55 	    pixel 0 */ | 
| Chris@1070 | 56 	double threshold; | 
| Chris@1070 | 57 | 
| Chris@1070 | 58 	/** Gain to apply before clamping and mapping */ | 
| Chris@1070 | 59 	double gain; | 
| Chris@1070 | 60     }; | 
| Chris@1070 | 61 | 
| Chris@1068 | 62     /** | 
| Chris@1070 | 63      * Create a ColourScale with the given parameters. | 
| Chris@1068 | 64      * | 
| Chris@1068 | 65      * Note that some parameters may be ignored for some scale | 
| Chris@1068 | 66      * distribution settings. For example, min and max are ignored for | 
| Chris@1068 | 67      * PlusMinusOneScale and PhaseColourScale and threshold and gain | 
| Chris@1068 | 68      * are ignored for PhaseColourScale. | 
| Chris@1068 | 69      */ | 
| Chris@1070 | 70     ColourScale(Parameters parameters); | 
| Chris@1071 | 71     ~ColourScale(); | 
| Chris@1068 | 72 | 
| Chris@1071 | 73     ColourScale(const ColourScale &) = default; | 
| Chris@1071 | 74     ColourScale &operator=(const ColourScale &) = default; | 
| Chris@1079 | 75 | 
| Chris@1079 | 76     /** | 
| Chris@1079 | 77      * Return the general type of scale this is. | 
| Chris@1079 | 78      */ | 
| Chris@1079 | 79     Scale getScale() const; | 
| Chris@1071 | 80 | 
| Chris@1068 | 81     /** | 
| Chris@1068 | 82      * Return a pixel number (in the range 0-255 inclusive) | 
| Chris@1068 | 83      * corresponding to the given value.  The pixel 0 is used only for | 
| Chris@1068 | 84      * values below the threshold supplied in the constructor. All | 
| Chris@1068 | 85      * other values are mapped onto the range 1-255. | 
| Chris@1068 | 86      */ | 
| Chris@1079 | 87     int getPixel(double value) const; | 
| Chris@1068 | 88 | 
| Chris@1068 | 89     /** | 
| Chris@1068 | 90      * Return the colour for the given pixel number (which must be in | 
| Chris@1068 | 91      * the range 0-255). The pixel 0 is always the background | 
| Chris@1068 | 92      * colour. Other pixels are mapped taking into account the given | 
| Chris@1068 | 93      * colourmap rotation (which is also a value in the range 0-255). | 
| Chris@1068 | 94      */ | 
| Chris@1079 | 95     QColor getColourForPixel(int pixel, int rotation) const; | 
| Chris@1068 | 96 | 
| Chris@1068 | 97     /** | 
| Chris@1068 | 98      * Return the colour corresponding to the given value. This is | 
| Chris@1068 | 99      * equivalent to getColourForPixel(getPixel(value), rotation). | 
| Chris@1068 | 100      */ | 
| Chris@1079 | 101     QColor getColour(double value, int rotation) const { | 
| Chris@1068 | 102 	return getColourForPixel(getPixel(value), rotation); | 
| Chris@1068 | 103     } | 
| Chris@1068 | 104 | 
| Chris@1068 | 105 private: | 
| Chris@1070 | 106     Parameters m_params; | 
| Chris@1068 | 107     ColourMapper m_mapper; | 
| Chris@1068 | 108     double m_mappedMin; | 
| Chris@1068 | 109     double m_mappedMax; | 
| Chris@1068 | 110     static int m_maxPixel; | 
| Chris@1068 | 111 }; | 
| Chris@1068 | 112 | 
| Chris@1068 | 113 #endif |