Mercurial > hg > easaier-soundaccess
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 |