annotate layer/ColourScale.h @ 1107:6d720fe1c8cc spectrogram-minor-refactor

Remove almost all of the "old" paint logic from Colour3DPlotLayer
author Chris Cannam
date Thu, 14 Jul 2016 17:12:08 +0100
parents ea5ae9dd10ba
children 4e7ed3252d80
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@1105 21 enum class ColourScaleType {
Chris@1105 22 Linear,
Chris@1105 23 Meter,
Chris@1105 24 Log,
Chris@1105 25 Phase,
Chris@1105 26 PlusMinusOne,
Chris@1105 27 Absolute
Chris@1105 28 };
Chris@1105 29
Chris@1068 30 /**
Chris@1068 31 * Map values within a range onto a set of colours, with a given
Chris@1068 32 * distribution (linear, log etc) and optional colourmap rotation.
Chris@1068 33 */
Chris@1068 34 class ColourScale
Chris@1068 35 {
Chris@1068 36 public:
Chris@1070 37 struct Parameters {
Chris@1105 38 Parameters() : colourMap(0), scale(ColourScaleType::Linear),
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@1105 46 ColourScaleType 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@1105 79 ColourScaleType 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