annotate layer/ColourMapper.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006-2007 Chris Cannam and QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "ColourMapper.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include <iostream>
lbajardsilogic@0 19
lbajardsilogic@0 20 #include <cmath>
lbajardsilogic@0 21
lbajardsilogic@0 22 ColourMapper::ColourMapper(int map, float min, float max) :
lbajardsilogic@0 23 QObject(),
lbajardsilogic@0 24 m_map(map),
lbajardsilogic@0 25 m_min(min),
lbajardsilogic@0 26 m_max(max)
lbajardsilogic@0 27 {
lbajardsilogic@0 28 if (m_min == m_max) {
lbajardsilogic@0 29 std::cerr << "WARNING: ColourMapper: min == max (== " << m_min
lbajardsilogic@0 30 << "), adjusting" << std::endl;
lbajardsilogic@0 31 m_max = m_min + 1;
lbajardsilogic@0 32 }
lbajardsilogic@0 33 }
lbajardsilogic@0 34
lbajardsilogic@0 35 ColourMapper::~ColourMapper()
lbajardsilogic@0 36 {
lbajardsilogic@0 37 }
lbajardsilogic@0 38
lbajardsilogic@0 39 int
lbajardsilogic@0 40 ColourMapper::getColourMapCount()
lbajardsilogic@0 41 {
lbajardsilogic@0 42 return 10;
lbajardsilogic@0 43 }
lbajardsilogic@0 44
lbajardsilogic@0 45 QString
lbajardsilogic@0 46 ColourMapper::getColourMapName(int n)
lbajardsilogic@0 47 {
lbajardsilogic@0 48 if (n >= getColourMapCount()) return tr("<unknown>");
lbajardsilogic@0 49 StandardMap map = (StandardMap)n;
lbajardsilogic@0 50
lbajardsilogic@0 51 switch (map) {
lbajardsilogic@0 52 case DefaultColours: return tr("Default");
lbajardsilogic@0 53 case WhiteOnBlack: return tr("White on Black");
lbajardsilogic@0 54 case BlackOnWhite: return tr("Black on White");
lbajardsilogic@0 55 case RedOnBlue: return tr("Red on Blue");
lbajardsilogic@0 56 case YellowOnBlack: return tr("Yellow on Black");
lbajardsilogic@0 57 case BlueOnBlack: return tr("Blue on Black");
lbajardsilogic@0 58 case Sunset: return tr("Sunset");
lbajardsilogic@0 59 case FruitSalad: return tr("Fruit Salad");
lbajardsilogic@0 60 case Banded: return tr("Banded");
lbajardsilogic@0 61 case Highlight: return tr("Highlight");
lbajardsilogic@0 62 }
lbajardsilogic@0 63
lbajardsilogic@0 64 return tr("<unknown>");
lbajardsilogic@0 65 }
lbajardsilogic@0 66
lbajardsilogic@0 67 QColor
lbajardsilogic@0 68 ColourMapper::map(float value) const
lbajardsilogic@0 69 {
lbajardsilogic@0 70 float norm = (value - m_min) / (m_max - m_min);
lbajardsilogic@0 71 if (norm < 0.f) norm = 0.f;
lbajardsilogic@0 72 if (norm > 1.f) norm = 1.f;
lbajardsilogic@0 73
lbajardsilogic@0 74 float h = 0.f, s = 0.f, v = 0.f, r = 0.f, g = 0.f, b = 0.f;
lbajardsilogic@0 75 bool hsv = true;
lbajardsilogic@0 76
lbajardsilogic@0 77 // float red = 0.f, green = 0.3333f;
lbajardsilogic@0 78 float blue = 0.6666f, pieslice = 0.3333f;
lbajardsilogic@0 79
lbajardsilogic@0 80 if (m_map >= getColourMapCount()) return Qt::black;
lbajardsilogic@0 81 StandardMap map = (StandardMap)m_map;
lbajardsilogic@0 82
lbajardsilogic@0 83 switch (map) {
lbajardsilogic@0 84
lbajardsilogic@0 85 case DefaultColours:
lbajardsilogic@0 86 h = blue - norm * 2.f * pieslice;
lbajardsilogic@0 87 s = 0.5f + norm/2.f;
lbajardsilogic@0 88 v = norm;
lbajardsilogic@0 89 break;
lbajardsilogic@0 90
lbajardsilogic@0 91 case WhiteOnBlack:
lbajardsilogic@0 92 r = g = b = norm;
lbajardsilogic@0 93 hsv = false;
lbajardsilogic@0 94 break;
lbajardsilogic@0 95
lbajardsilogic@0 96 case BlackOnWhite:
lbajardsilogic@0 97 r = g = b = 1.f - norm;
lbajardsilogic@0 98 hsv = false;
lbajardsilogic@0 99 break;
lbajardsilogic@0 100
lbajardsilogic@0 101 case RedOnBlue:
lbajardsilogic@0 102 h = blue - pieslice/4.f + norm * (pieslice + pieslice/4.f);
lbajardsilogic@0 103 s = 1.f;
lbajardsilogic@0 104 v = norm;
lbajardsilogic@0 105 break;
lbajardsilogic@0 106
lbajardsilogic@0 107 case YellowOnBlack:
lbajardsilogic@0 108 h = 0.15f;
lbajardsilogic@0 109 s = 1.f;
lbajardsilogic@0 110 v = norm;
lbajardsilogic@0 111 break;
lbajardsilogic@0 112
lbajardsilogic@0 113 case BlueOnBlack:
lbajardsilogic@0 114 h = blue;
lbajardsilogic@0 115 s = 1.f;
lbajardsilogic@0 116 v = norm * 2.f;
lbajardsilogic@0 117 if (v > 1.f) {
lbajardsilogic@0 118 v = 1.f;
lbajardsilogic@0 119 s = 1.f - (sqrtf(norm) - 0.707f) * 3.413f;
lbajardsilogic@0 120 if (s < 0.f) s = 0.f;
lbajardsilogic@0 121 if (s > 1.f) s = 1.f;
lbajardsilogic@0 122 }
lbajardsilogic@0 123 break;
lbajardsilogic@0 124
lbajardsilogic@0 125 case Sunset:
lbajardsilogic@0 126 r = (norm - 0.24f) * 2.38f;
lbajardsilogic@0 127 if (r > 1.f) r = 1.f;
lbajardsilogic@0 128 if (r < 0.f) r = 0.f;
lbajardsilogic@0 129 g = (norm - 0.64f) * 2.777f;
lbajardsilogic@0 130 if (g > 1.f) g = 1.f;
lbajardsilogic@0 131 if (g < 0.f) g = 0.f;
lbajardsilogic@0 132 b = (3.6f * norm);
lbajardsilogic@0 133 if (norm > 0.277f) b = 2.f - b;
lbajardsilogic@0 134 if (b > 1.f) b = 1.f;
lbajardsilogic@0 135 if (b < 0.f) b = 0.f;
lbajardsilogic@0 136 hsv = false;
lbajardsilogic@0 137 break;
lbajardsilogic@0 138
lbajardsilogic@0 139 case FruitSalad:
lbajardsilogic@0 140 h = blue + (pieslice/6.f) - norm;
lbajardsilogic@0 141 if (h < 0.f) h += 1.f;
lbajardsilogic@0 142 s = 1.f;
lbajardsilogic@0 143 v = 1.f;
lbajardsilogic@0 144 break;
lbajardsilogic@0 145
lbajardsilogic@0 146 case Banded:
lbajardsilogic@0 147 if (norm < 0.125) return Qt::darkGreen;
lbajardsilogic@0 148 else if (norm < 0.25) return Qt::green;
lbajardsilogic@0 149 else if (norm < 0.375) return Qt::darkBlue;
lbajardsilogic@0 150 else if (norm < 0.5) return Qt::blue;
lbajardsilogic@0 151 else if (norm < 0.625) return Qt::darkYellow;
lbajardsilogic@0 152 else if (norm < 0.75) return Qt::yellow;
lbajardsilogic@0 153 else if (norm < 0.875) return Qt::darkRed;
lbajardsilogic@0 154 else return Qt::red;
lbajardsilogic@0 155 break;
lbajardsilogic@0 156
lbajardsilogic@0 157 case Highlight:
lbajardsilogic@0 158 if (norm > 0.99) return Qt::white;
lbajardsilogic@0 159 else return Qt::darkBlue;
lbajardsilogic@0 160 }
lbajardsilogic@0 161
lbajardsilogic@0 162 if (hsv) {
lbajardsilogic@0 163 return QColor::fromHsvF(h, s, v);
lbajardsilogic@0 164 } else {
lbajardsilogic@0 165 return QColor::fromRgbF(r, g, b);
lbajardsilogic@0 166 }
lbajardsilogic@0 167 }
lbajardsilogic@0 168
lbajardsilogic@0 169 QColor
lbajardsilogic@0 170 ColourMapper::getContrastingColour() const
lbajardsilogic@0 171 {
lbajardsilogic@0 172 if (m_map >= getColourMapCount()) return Qt::white;
lbajardsilogic@0 173 StandardMap map = (StandardMap)m_map;
lbajardsilogic@0 174
lbajardsilogic@0 175 switch (map) {
lbajardsilogic@0 176
lbajardsilogic@0 177 case DefaultColours:
lbajardsilogic@0 178 return QColor(255, 150, 50);
lbajardsilogic@0 179
lbajardsilogic@0 180 case WhiteOnBlack:
lbajardsilogic@0 181 return Qt::red;
lbajardsilogic@0 182
lbajardsilogic@0 183 case BlackOnWhite:
lbajardsilogic@0 184 return Qt::darkGreen;
lbajardsilogic@0 185
lbajardsilogic@0 186 case RedOnBlue:
lbajardsilogic@0 187 return Qt::green;
lbajardsilogic@0 188
lbajardsilogic@0 189 case YellowOnBlack:
lbajardsilogic@0 190 return QColor::fromHsv(240, 255, 255);
lbajardsilogic@0 191
lbajardsilogic@0 192 case BlueOnBlack:
lbajardsilogic@0 193 return Qt::red;
lbajardsilogic@0 194
lbajardsilogic@0 195 case Sunset:
lbajardsilogic@0 196 return Qt::white;
lbajardsilogic@0 197
lbajardsilogic@0 198 case FruitSalad:
lbajardsilogic@0 199 return Qt::white;
lbajardsilogic@0 200
lbajardsilogic@0 201 case Banded:
lbajardsilogic@0 202 return Qt::cyan;
lbajardsilogic@0 203
lbajardsilogic@0 204 case Highlight:
lbajardsilogic@0 205 return Qt::red;
lbajardsilogic@0 206 }
lbajardsilogic@0 207
lbajardsilogic@0 208 return Qt::white;
lbajardsilogic@0 209 }
lbajardsilogic@0 210
lbajardsilogic@0 211