comparison layer/ColourMapper.cpp @ 0:fc9323a41f5a

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