annotate layer/ColourScale.h @ 1072:76b50b48e1e4 spectrogram-minor-refactor

Comments
author Chris Cannam
date Mon, 27 Jun 2016 16:01:42 +0100
parents 65b183494331
children 7ebfb61b1701
rev   line source
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@1071 75
Chris@1068 76 /**
Chris@1068 77 * Return a pixel number (in the range 0-255 inclusive)
Chris@1068 78 * corresponding to the given value. The pixel 0 is used only for
Chris@1068 79 * values below the threshold supplied in the constructor. All
Chris@1068 80 * other values are mapped onto the range 1-255.
Chris@1068 81 */
Chris@1068 82 int getPixel(double value);
Chris@1068 83
Chris@1068 84 /**
Chris@1068 85 * Return the colour for the given pixel number (which must be in
Chris@1068 86 * the range 0-255). The pixel 0 is always the background
Chris@1068 87 * colour. Other pixels are mapped taking into account the given
Chris@1068 88 * colourmap rotation (which is also a value in the range 0-255).
Chris@1068 89 */
Chris@1068 90 QColor getColourForPixel(int pixel, int rotation);
Chris@1068 91
Chris@1068 92 /**
Chris@1068 93 * Return the colour corresponding to the given value. This is
Chris@1068 94 * equivalent to getColourForPixel(getPixel(value), rotation).
Chris@1068 95 */
Chris@1068 96 QColor getColour(double value, int rotation) {
Chris@1068 97 return getColourForPixel(getPixel(value), rotation);
Chris@1068 98 }
Chris@1068 99
Chris@1068 100 private:
Chris@1070 101 Parameters m_params;
Chris@1068 102 ColourMapper m_mapper;
Chris@1068 103 double m_mappedMin;
Chris@1068 104 double m_mappedMax;
Chris@1068 105 static int m_maxPixel;
Chris@1068 106 };
Chris@1068 107
Chris@1068 108 #endif