ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ecvColorScalesManager.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
9 
10 // Local
11 #include "CVLog.h"
12 #include "ecvSingleton.h"
13 
14 // Qt
15 #include <QSettings>
16 
17 // cloudViewer
18 #include <MeshSamplingTools.h>
19 
20 // System
21 #include <assert.h>
22 
23 // unique instance
25 
26 /*** Persistent settings ***/
27 
28 static const char c_csm_groupName[] = "ccColorScalesManager";
29 static const char c_csm_relative[] = "relative";
30 static const char c_csm_minVal[] = "minVal";
31 static const char c_csm_maxVal[] = "maxVal";
32 static const char c_csm_scaleName[] = "scaleName";
33 static const char c_csm_stepsList[] = "steps";
34 static const char c_csm_stepRelativePos[] = "value";
35 static const char c_csm_stepColor[] = "color";
36 static const char c_csm_customLabels[] = "labels";
37 static const char c_csm_customLabelValue[] = "value";
38 static const char c_csm_customLabelText[] = "text";
39 
40 // matplotlib library colorscale created by St�fan van der Walt and Nathaniel
41 // Smith
42 static const double s_viridis[] = {
43  0.26700401, 0.00487433, 0.32941519, 0.26851048, 0.00960483, 0.33542652,
44  0.26994384, 0.01462494, 0.34137895, 0.27130489, 0.01994186, 0.34726862,
45  0.27259384, 0.02556309, 0.35309303, 0.27380934, 0.03149748, 0.35885256,
46  0.27495242, 0.03775181, 0.36454323, 0.27602238, 0.04416723, 0.37016418,
47  0.2770184, 0.05034437, 0.37571452, 0.27794143, 0.05632444, 0.38119074,
48  0.27879067, 0.06214536, 0.38659204, 0.2795655, 0.06783587, 0.39191723,
49  0.28026658, 0.07341724, 0.39716349, 0.28089358, 0.07890703, 0.40232944,
50  0.28144581, 0.0843197, 0.40741404, 0.28192358, 0.08966622, 0.41241521,
51  0.28232739, 0.09495545, 0.41733086, 0.28265633, 0.10019576, 0.42216032,
52  0.28291049, 0.10539345, 0.42690202, 0.28309095, 0.11055307, 0.43155375,
53  0.28319704, 0.11567966, 0.43611482, 0.28322882, 0.12077701, 0.44058404,
54  0.28318684, 0.12584799, 0.44496, 0.283072, 0.13089477, 0.44924127,
55  0.28288389, 0.13592005, 0.45342734, 0.28262297, 0.14092556, 0.45751726,
56  0.28229037, 0.14591233, 0.46150995, 0.28188676, 0.15088147, 0.46540474,
57  0.28141228, 0.15583425, 0.46920128, 0.28086773, 0.16077132, 0.47289909,
58  0.28025468, 0.16569272, 0.47649762, 0.27957399, 0.17059884, 0.47999675,
59  0.27882618, 0.1754902, 0.48339654, 0.27801236, 0.18036684, 0.48669702,
60  0.27713437, 0.18522836, 0.48989831, 0.27619376, 0.19007447, 0.49300074,
61  0.27519116, 0.1949054, 0.49600488, 0.27412802, 0.19972086, 0.49891131,
62  0.27300596, 0.20452049, 0.50172076, 0.27182812, 0.20930306, 0.50443413,
63  0.27059473, 0.21406899, 0.50705243, 0.26930756, 0.21881782, 0.50957678,
64  0.26796846, 0.22354911, 0.5120084, 0.26657984, 0.2282621, 0.5143487,
65  0.2651445, 0.23295593, 0.5165993, 0.2636632, 0.23763078, 0.51876163,
66  0.26213801, 0.24228619, 0.52083736, 0.26057103, 0.2469217, 0.52282822,
67  0.25896451, 0.25153685, 0.52473609, 0.25732244, 0.2561304, 0.52656332,
68  0.25564519, 0.26070284, 0.52831152, 0.25393498, 0.26525384, 0.52998273,
69  0.25219404, 0.26978306, 0.53157905, 0.25042462, 0.27429024, 0.53310261,
70  0.24862899, 0.27877509, 0.53455561, 0.2468114, 0.28323662, 0.53594093,
71  0.24497208, 0.28767547, 0.53726018, 0.24311324, 0.29209154, 0.53851561,
72  0.24123708, 0.29648471, 0.53970946, 0.23934575, 0.30085494, 0.54084398,
73  0.23744138, 0.30520222, 0.5419214, 0.23552606, 0.30952657, 0.54294396,
74  0.23360277, 0.31382773, 0.54391424, 0.2316735, 0.3181058, 0.54483444,
75  0.22973926, 0.32236127, 0.54570633, 0.22780192, 0.32659432, 0.546532,
76  0.2258633, 0.33080515, 0.54731353, 0.22392515, 0.334994, 0.54805291,
77  0.22198915, 0.33916114, 0.54875211, 0.22005691, 0.34330688, 0.54941304,
78  0.21812995, 0.34743154, 0.55003755, 0.21620971, 0.35153548, 0.55062743,
79  0.21429757, 0.35561907, 0.5511844, 0.21239477, 0.35968273, 0.55171011,
80  0.2105031, 0.36372671, 0.55220646, 0.20862342, 0.36775151, 0.55267486,
81  0.20675628, 0.37175775, 0.55311653, 0.20490257, 0.37574589, 0.55353282,
82  0.20306309, 0.37971644, 0.55392505, 0.20123854, 0.38366989, 0.55429441,
83  0.1994295, 0.38760678, 0.55464205, 0.1976365, 0.39152762, 0.55496905,
84  0.19585993, 0.39543297, 0.55527637, 0.19410009, 0.39932336, 0.55556494,
85  0.19235719, 0.40319934, 0.55583559, 0.19063135, 0.40706148, 0.55608907,
86  0.18892259, 0.41091033, 0.55632606, 0.18723083, 0.41474645, 0.55654717,
87  0.18555593, 0.4185704, 0.55675292, 0.18389763, 0.42238275, 0.55694377,
88  0.18225561, 0.42618405, 0.5571201, 0.18062949, 0.42997486, 0.55728221,
89  0.17901879, 0.43375572, 0.55743035, 0.17742298, 0.4375272, 0.55756466,
90  0.17584148, 0.44128981, 0.55768526, 0.17427363, 0.4450441, 0.55779216,
91  0.17271876, 0.4487906, 0.55788532, 0.17117615, 0.4525298, 0.55796464,
92  0.16964573, 0.45626209, 0.55803034, 0.16812641, 0.45998802, 0.55808199,
93  0.1666171, 0.46370813, 0.55811913, 0.16511703, 0.4674229, 0.55814141,
94  0.16362543, 0.47113278, 0.55814842, 0.16214155, 0.47483821, 0.55813967,
95  0.16066467, 0.47853961, 0.55811466, 0.15919413, 0.4822374, 0.5580728,
96  0.15772933, 0.48593197, 0.55801347, 0.15626973, 0.4896237, 0.557936,
97  0.15481488, 0.49331293, 0.55783967, 0.15336445, 0.49700003, 0.55772371,
98  0.1519182, 0.50068529, 0.55758733, 0.15047605, 0.50436904, 0.55742968,
99  0.14903918, 0.50805136, 0.5572505, 0.14760731, 0.51173263, 0.55704861,
100  0.14618026, 0.51541316, 0.55682271, 0.14475863, 0.51909319, 0.55657181,
101  0.14334327, 0.52277292, 0.55629491, 0.14193527, 0.52645254, 0.55599097,
102  0.14053599, 0.53013219, 0.55565893, 0.13914708, 0.53381201, 0.55529773,
103  0.13777048, 0.53749213, 0.55490625, 0.1364085, 0.54117264, 0.55448339,
104  0.13506561, 0.54485335, 0.55402906, 0.13374299, 0.54853458, 0.55354108,
105  0.13244401, 0.55221637, 0.55301828, 0.13117249, 0.55589872, 0.55245948,
106  0.1299327, 0.55958162, 0.55186354, 0.12872938, 0.56326503, 0.55122927,
107  0.12756771, 0.56694891, 0.55055551, 0.12645338, 0.57063316, 0.5498411,
108  0.12539383, 0.57431754, 0.54908564, 0.12439474, 0.57800205, 0.5482874,
109  0.12346281, 0.58168661, 0.54744498, 0.12260562, 0.58537105, 0.54655722,
110  0.12183122, 0.58905521, 0.54562298, 0.12114807, 0.59273889, 0.54464114,
111  0.12056501, 0.59642187, 0.54361058, 0.12009154, 0.60010387, 0.54253043,
112  0.11973756, 0.60378459, 0.54139999, 0.11951163, 0.60746388, 0.54021751,
113  0.11942341, 0.61114146, 0.53898192, 0.11948255, 0.61481702, 0.53769219,
114  0.11969858, 0.61849025, 0.53634733, 0.12008079, 0.62216081, 0.53494633,
115  0.12063824, 0.62582833, 0.53348834, 0.12137972, 0.62949242, 0.53197275,
116  0.12231244, 0.63315277, 0.53039808, 0.12344358, 0.63680899, 0.52876343,
117  0.12477953, 0.64046069, 0.52706792, 0.12632581, 0.64410744, 0.52531069,
118  0.12808703, 0.64774881, 0.52349092, 0.13006688, 0.65138436, 0.52160791,
119  0.13226797, 0.65501363, 0.51966086, 0.13469183, 0.65863619, 0.5176488,
120  0.13733921, 0.66225157, 0.51557101, 0.14020991, 0.66585927, 0.5134268,
121  0.14330291, 0.66945881, 0.51121549, 0.1466164, 0.67304968, 0.50893644,
122  0.15014782, 0.67663139, 0.5065889, 0.15389405, 0.68020343, 0.50417217,
123  0.15785146, 0.68376525, 0.50168574, 0.16201598, 0.68731632, 0.49912906,
124  0.1663832, 0.69085611, 0.49650163, 0.1709484, 0.69438405, 0.49380294,
125  0.17570671, 0.6978996, 0.49103252, 0.18065314, 0.70140222, 0.48818938,
126  0.18578266, 0.70489133, 0.48527326, 0.19109018, 0.70836635, 0.48228395,
127  0.19657063, 0.71182668, 0.47922108, 0.20221902, 0.71527175, 0.47608431,
128  0.20803045, 0.71870095, 0.4728733, 0.21400015, 0.72211371, 0.46958774,
129  0.22012381, 0.72550945, 0.46622638, 0.2263969, 0.72888753, 0.46278934,
130  0.23281498, 0.73224735, 0.45927675, 0.2393739, 0.73558828, 0.45568838,
131  0.24606968, 0.73890972, 0.45202405, 0.25289851, 0.74221104, 0.44828355,
132  0.25985676, 0.74549162, 0.44446673, 0.26694127, 0.74875084, 0.44057284,
133  0.27414922, 0.75198807, 0.4366009, 0.28147681, 0.75520266, 0.43255207,
134  0.28892102, 0.75839399, 0.42842626, 0.29647899, 0.76156142, 0.42422341,
135  0.30414796, 0.76470433, 0.41994346, 0.31192534, 0.76782207, 0.41558638,
136  0.3198086, 0.77091403, 0.41115215, 0.3277958, 0.77397953, 0.40664011,
137  0.33588539, 0.7770179, 0.40204917, 0.34407411, 0.78002855, 0.39738103,
138  0.35235985, 0.78301086, 0.39263579, 0.36074053, 0.78596419, 0.38781353,
139  0.3692142, 0.78888793, 0.38291438, 0.37777892, 0.79178146, 0.3779385,
140  0.38643282, 0.79464415, 0.37288606, 0.39517408, 0.79747541, 0.36775726,
141  0.40400101, 0.80027461, 0.36255223, 0.4129135, 0.80304099, 0.35726893,
142  0.42190813, 0.80577412, 0.35191009, 0.43098317, 0.80847343, 0.34647607,
143  0.44013691, 0.81113836, 0.3409673, 0.44936763, 0.81376835, 0.33538426,
144  0.45867362, 0.81636288, 0.32972749, 0.46805314, 0.81892143, 0.32399761,
145  0.47750446, 0.82144351, 0.31819529, 0.4870258, 0.82392862, 0.31232133,
146  0.49661536, 0.82637633, 0.30637661, 0.5062713, 0.82878621, 0.30036211,
147  0.51599182, 0.83115784, 0.29427888, 0.52577622, 0.83349064, 0.2881265,
148  0.5356211, 0.83578452, 0.28190832, 0.5455244, 0.83803918, 0.27562602,
149  0.55548397, 0.84025437, 0.26928147, 0.5654976, 0.8424299, 0.26287683,
150  0.57556297, 0.84456561, 0.25641457, 0.58567772, 0.84666139, 0.24989748,
151  0.59583934, 0.84871722, 0.24332878, 0.60604528, 0.8507331, 0.23671214,
152  0.61629283, 0.85270912, 0.23005179, 0.62657923, 0.85464543, 0.22335258,
153  0.63690157, 0.85654226, 0.21662012, 0.64725685, 0.85839991, 0.20986086,
154  0.65764197, 0.86021878, 0.20308229, 0.66805369, 0.86199932, 0.19629307,
155  0.67848868, 0.86374211, 0.18950326, 0.68894351, 0.86544779, 0.18272455,
156  0.69941463, 0.86711711, 0.17597055, 0.70989842, 0.86875092, 0.16925712,
157  0.72039115, 0.87035015, 0.16260273, 0.73088902, 0.87191584, 0.15602894,
158  0.74138803, 0.87344918, 0.14956101, 0.75188414, 0.87495143, 0.14322828,
159  0.76237342, 0.87642392, 0.13706449, 0.77285183, 0.87786808, 0.13110864,
160  0.78331535, 0.87928545, 0.12540538, 0.79375994, 0.88067763, 0.12000532,
161  0.80418159, 0.88204632, 0.11496505, 0.81457634, 0.88339329, 0.11034678,
162  0.82494028, 0.88472036, 0.10621724, 0.83526959, 0.88602943, 0.1026459,
163  0.84556056, 0.88732243, 0.09970219, 0.8558096, 0.88860134, 0.09745186,
164  0.86601325, 0.88986815, 0.09595277, 0.87616824, 0.89112487, 0.09525046,
165  0.88627146, 0.89237353, 0.09537439, 0.89632002, 0.89361614, 0.09633538,
166  0.90631121, 0.89485467, 0.09812496, 0.91624212, 0.89609127, 0.1007168,
167  0.92610579, 0.89732977, 0.10407067, 0.93590444, 0.8985704, 0.10813094,
168  0.94563626, 0.899815, 0.11283773, 0.95529972, 0.90106534, 0.11812832,
169  0.96489353, 0.90232311, 0.12394051, 0.97441665, 0.90358991, 0.13021494,
170  0.98386829, 0.90486726, 0.13689671, 0.99324789, 0.90615657, 0.1439362};
171 
172 struct ColorStep {
173  uint8_t red = 0;
174  uint8_t green = 0;
175  uint8_t blue = 0;
176  double pos = 0.0;
177 };
178 
179 static const ColorStep s_cividis[]{
180  {0, 32, 77, 0.0000000}, {0, 33, 78, 0.0039215},
181  {0, 34, 80, 0.0078430}, {0, 34, 82, 0.0117645},
182  {0, 35, 83, 0.0156865}, {0, 36, 85, 0.0196080},
183  {0, 37, 87, 0.0235295}, {0, 37, 88, 0.0274510},
184  {0, 38, 90, 0.0313725}, {0, 39, 92, 0.0352940},
185  {0, 39, 94, 0.0392155}, {0, 40, 96, 0.0431375},
186  {0, 41, 97, 0.0470590}, {0, 42, 99, 0.0509805},
187  {0, 42, 101, 0.0549020}, {0, 43, 103, 0.0588235},
188  {0, 44, 105, 0.0627450}, {0, 44, 106, 0.0666665},
189  {0, 45, 108, 0.0705880}, {0, 46, 110, 0.0745100},
190  {0, 46, 111, 0.0784315}, {0, 47, 111, 0.0823530},
191  {0, 47, 111, 0.0862745}, {0, 48, 111, 0.0901960},
192  {0, 48, 111, 0.0941175}, {0, 49, 111, 0.0980390},
193  {0, 50, 111, 0.1019610}, {0, 51, 111, 0.1058825},
194  {0, 51, 111, 0.1098040}, {0, 52, 111, 0.1137255},
195  {0, 53, 110, 0.1176470}, {1, 54, 110, 0.1215685},
196  {6, 54, 110, 0.1254900}, {11, 55, 110, 0.1294120},
197  {15, 56, 110, 0.1333335}, {18, 56, 109, 0.1372550},
198  {21, 57, 109, 0.1411765}, {24, 58, 109, 0.1450980},
199  {26, 59, 109, 0.1490195}, {29, 59, 109, 0.1529410},
200  {31, 60, 109, 0.1568625}, {33, 61, 109, 0.1607845},
201  {35, 62, 108, 0.1647060}, {36, 62, 108, 0.1686275},
202  {38, 63, 108, 0.1725490}, {40, 64, 108, 0.1764705},
203  {42, 64, 108, 0.1803920}, {43, 65, 108, 0.1843135},
204  {45, 66, 108, 0.1882355}, {46, 67, 108, 0.1921570},
205  {48, 67, 108, 0.1960785}, {49, 68, 107, 0.2000000},
206  {50, 69, 107, 0.2039215}, {52, 69, 107, 0.2078430},
207  {53, 70, 107, 0.2117645}, {54, 71, 107, 0.2156865},
208  {56, 72, 107, 0.2196080}, {57, 72, 107, 0.2235295},
209  {58, 73, 107, 0.2274510}, {59, 74, 107, 0.2313725},
210  {61, 74, 107, 0.2352940}, {62, 75, 107, 0.2392155},
211  {63, 76, 107, 0.2431375}, {64, 77, 107, 0.2470590},
212  {65, 77, 107, 0.2509805}, {66, 78, 107, 0.2549020},
213  {67, 79, 107, 0.2588235}, {68, 79, 107, 0.2627450},
214  {70, 80, 107, 0.2666665}, {71, 81, 107, 0.2705880},
215  {72, 82, 107, 0.2745100}, {73, 82, 107, 0.2784315},
216  {74, 83, 107, 0.2823530}, {75, 84, 108, 0.2862745},
217  {76, 84, 108, 0.2901960}, {77, 85, 108, 0.2941175},
218  {78, 86, 108, 0.2980390}, {79, 87, 108, 0.3019610},
219  {80, 87, 108, 0.3058825}, {81, 88, 108, 0.3098040},
220  {82, 89, 108, 0.3137255}, {83, 89, 108, 0.3176470},
221  {84, 90, 108, 0.3215685}, {85, 91, 109, 0.3254900},
222  {86, 92, 109, 0.3294120}, {87, 92, 109, 0.3333335},
223  {88, 93, 109, 0.3372550}, {89, 94, 109, 0.3411765},
224  {89, 95, 109, 0.3450980}, {90, 95, 109, 0.3490195},
225  {91, 96, 110, 0.3529410}, {92, 97, 110, 0.3568625},
226  {93, 97, 110, 0.3607845}, {94, 98, 110, 0.3647060},
227  {95, 99, 110, 0.3686275}, {96, 100, 111, 0.3725490},
228  {97, 100, 111, 0.3764705}, {98, 101, 111, 0.3803920},
229  {99, 102, 111, 0.3843135}, {100, 102, 111, 0.3882355},
230  {100, 103, 112, 0.3921570}, {101, 104, 112, 0.3960785},
231  {102, 105, 112, 0.4000000}, {103, 105, 112, 0.4039215},
232  {104, 106, 113, 0.4078430}, {105, 107, 113, 0.4117645},
233  {106, 108, 113, 0.4156865}, {107, 108, 113, 0.4196080},
234  {108, 109, 114, 0.4235295}, {108, 110, 114, 0.4274510},
235  {109, 110, 114, 0.4313725}, {110, 111, 115, 0.4352940},
236  {111, 112, 115, 0.4392155}, {112, 113, 115, 0.4431375},
237  {113, 113, 116, 0.4470590}, {114, 114, 116, 0.4509805},
238  {114, 115, 116, 0.4549020}, {115, 116, 117, 0.4588235},
239  {116, 116, 117, 0.4627450}, {117, 117, 117, 0.4666665},
240  {118, 118, 118, 0.4705880}, {119, 119, 118, 0.4745100},
241  {120, 119, 119, 0.4784315}, {120, 120, 119, 0.4823530},
242  {121, 121, 119, 0.4862745}, {122, 122, 120, 0.4901960},
243  {123, 122, 120, 0.4941175}, {124, 123, 120, 0.4980390},
244  {125, 124, 120, 0.5019610}, {126, 125, 120, 0.5058825},
245  {127, 125, 120, 0.5098040}, {128, 126, 121, 0.5137255},
246  {129, 127, 121, 0.5176470}, {130, 128, 121, 0.5215685},
247  {131, 128, 121, 0.5254900}, {132, 129, 121, 0.5294120},
248  {132, 130, 121, 0.5333335}, {133, 131, 121, 0.5372550},
249  {134, 131, 121, 0.5411765}, {135, 132, 121, 0.5450980},
250  {136, 133, 121, 0.5490195}, {137, 134, 121, 0.5529410},
251  {138, 135, 121, 0.5568625}, {139, 135, 121, 0.5607845},
252  {140, 136, 121, 0.5647060}, {141, 137, 121, 0.5686275},
253  {142, 138, 121, 0.5725490}, {143, 138, 121, 0.5764705},
254  {144, 139, 121, 0.5803920}, {145, 140, 120, 0.5843135},
255  {146, 141, 120, 0.5882355}, {147, 142, 120, 0.5921570},
256  {148, 142, 120, 0.5960785}, {149, 143, 120, 0.6000000},
257  {150, 144, 120, 0.6039215}, {151, 145, 120, 0.6078430},
258  {152, 146, 120, 0.6117645}, {153, 146, 120, 0.6156865},
259  {154, 147, 119, 0.6196080}, {155, 148, 119, 0.6235295},
260  {156, 149, 119, 0.6274510}, {157, 150, 119, 0.6313725},
261  {158, 150, 119, 0.6352940}, {159, 151, 119, 0.6392155},
262  {160, 152, 119, 0.6431375}, {161, 153, 118, 0.6470590},
263  {162, 154, 118, 0.6509805}, {163, 154, 118, 0.6549020},
264  {164, 155, 118, 0.6588235}, {165, 156, 118, 0.6627450},
265  {166, 157, 117, 0.6666665}, {168, 158, 117, 0.6705880},
266  {169, 159, 117, 0.6745100}, {170, 159, 117, 0.6784315},
267  {171, 160, 116, 0.6823530}, {172, 161, 116, 0.6862745},
268  {173, 162, 116, 0.6901960}, {174, 163, 116, 0.6941175},
269  {175, 164, 115, 0.6980390}, {176, 164, 115, 0.7019610},
270  {177, 165, 115, 0.7058825}, {178, 166, 114, 0.7098040},
271  {179, 167, 114, 0.7137255}, {180, 168, 114, 0.7176470},
272  {181, 169, 113, 0.7215685}, {182, 169, 113, 0.7254900},
273  {183, 170, 113, 0.7294120}, {184, 171, 112, 0.7333335},
274  {185, 172, 112, 0.7372550}, {186, 173, 112, 0.7411765},
275  {187, 174, 111, 0.7450980}, {188, 175, 111, 0.7490195},
276  {190, 175, 111, 0.7529410}, {191, 176, 110, 0.7568625},
277  {192, 177, 110, 0.7607845}, {193, 178, 109, 0.7647060},
278  {194, 179, 109, 0.7686275}, {195, 180, 109, 0.7725490},
279  {196, 181, 108, 0.7764705}, {197, 181, 108, 0.7803920},
280  {198, 182, 107, 0.7843135}, {199, 183, 107, 0.7882355},
281  {200, 184, 106, 0.7921570}, {201, 185, 106, 0.7960785},
282  {203, 186, 105, 0.8000000}, {204, 187, 105, 0.8039215},
283  {205, 188, 104, 0.8078430}, {206, 188, 104, 0.8117645},
284  {207, 189, 103, 0.8156865}, {208, 190, 103, 0.8196080},
285  {209, 191, 102, 0.8235295}, {210, 192, 102, 0.8274510},
286  {211, 193, 101, 0.8313725}, {212, 194, 100, 0.8352940},
287  {214, 195, 100, 0.8392155}, {215, 196, 99, 0.8431375},
288  {216, 197, 99, 0.8470590}, {217, 197, 98, 0.8509805},
289  {218, 198, 97, 0.8549020}, {219, 199, 97, 0.8588235},
290  {220, 200, 96, 0.8627450}, {221, 201, 95, 0.8666665},
291  {222, 202, 95, 0.8705880}, {224, 203, 94, 0.8745100},
292  {225, 204, 93, 0.8784315}, {226, 205, 92, 0.8823530},
293  {227, 206, 92, 0.8862745}, {228, 207, 91, 0.8901960},
294  {229, 208, 90, 0.8941175}, {230, 209, 89, 0.8980390},
295  {232, 210, 89, 0.9019610}, {233, 211, 88, 0.9058825},
296  {234, 211, 87, 0.9098040}, {235, 212, 86, 0.9137255},
297  {236, 213, 85, 0.9176470}, {237, 214, 84, 0.9215685},
298  {239, 215, 83, 0.9254900}, {240, 216, 82, 0.9294120},
299  {241, 217, 81, 0.9333335}, {242, 218, 80, 0.9372550},
300  {243, 219, 79, 0.9411765}, {244, 220, 78, 0.9450980},
301  {246, 221, 77, 0.9490195}, {247, 222, 76, 0.9529410},
302  {248, 223, 75, 0.9568625}, {249, 224, 74, 0.9607845},
303  {250, 225, 73, 0.9647060}, {251, 226, 72, 0.9686275},
304  {253, 227, 70, 0.9725490}, {254, 228, 69, 0.9764705},
305  {255, 229, 68, 0.9803920}, {255, 230, 66, 0.9843135},
306  {255, 231, 66, 0.9882355}, {255, 232, 67, 0.9921570},
307  {255, 233, 68, 0.9960785}, {255, 234, 70, 1.0000000}};
308 
310  if (!s_uniqueInstance.instance) {
311  s_uniqueInstance.instance = new ccColorScalesManager();
312  // load custom scales from persistent settings
313  s_uniqueInstance.instance->fromPersistentSettings();
314  }
315 
316  return s_uniqueInstance.instance;
317 }
318 
320  s_uniqueInstance.release();
321 }
322 
324  // Create default scales
325  {
326  addScale(Create(BGYR));
327  addScale(Create(GREY));
328  addScale(Create(BWR));
329  addScale(Create(RY));
330  addScale(Create(RW));
342  }
343 }
344 
346 
348  QSettings settings;
349  settings.beginGroup(c_csm_groupName);
350 
351  QStringList scales = settings.childGroups();
352  CVLog::Print(QString("[ccColorScalesManager] Found %1 custom scale(s) in "
353  "persistent settings")
354  .arg(scales.size()));
355 
356  // read each scale
357  for (int j = 0; j < scales.size(); ++j) {
358  settings.beginGroup(scales[j]);
359 
360  QString name = settings.value(c_csm_scaleName, "unknown").toString();
361  bool relative = settings.value(c_csm_relative, true).toBool();
362 
363  ccColorScale::Shared scale(new ccColorScale(name, scales[j]));
364  if (!relative) {
365  double minVal = settings.value(c_csm_minVal, 0.0).toDouble();
366  double maxVal = settings.value(c_csm_maxVal, 1.0).toDouble();
367  scale->setAbsolute(minVal, maxVal);
368  }
369 
370  try {
371  // steps
372  {
373  int size = settings.beginReadArray(c_csm_stepsList);
374  for (int i = 0; i < size; ++i) {
375  settings.setArrayIndex(i);
376  double relativePos =
377  settings.value(c_csm_stepRelativePos, 0.0)
378  .toDouble();
379  QRgb rgb = static_cast<QRgb>(
380  settings.value(c_csm_stepColor, 0).toInt());
381  QColor color = QColor::fromRgb(rgb);
382  scale->insert(ccColorScaleElement(relativePos, color),
383  false);
384  }
385  settings.endArray();
386  }
387 
388  // custom labels
389  {
390  int size = settings.beginReadArray(c_csm_customLabels);
391  for (int i = 0; i < size; ++i) {
392  settings.setArrayIndex(i);
393  double label = settings.value(c_csm_customLabelValue, 0.0)
394  .toDouble();
395  QString text =
396  settings.value(c_csm_customLabelText, QString())
397  .toString();
398  scale->customLabels().insert({label, text});
399  }
400  settings.endArray();
401  }
402  } catch (const std::bad_alloc&) {
403  CVLog::Warning(QString("[ccColorScalesManager] Failed to load "
404  "scale '%1' (not enough memory)")
405  .arg(scale->getName()));
406  scale.clear();
407  }
408 
409  settings.endGroup();
410 
411  if (scale) {
412  scale->update();
413  addScale(scale);
414  }
415  }
416 
417  settings.endGroup();
418 }
419 
421  QSettings settings;
422  // remove all existing info
423  settings.remove(c_csm_groupName);
424  // create new set
425  settings.beginGroup(c_csm_groupName);
426 
427  // add each scale
428  for (ScalesMap::const_iterator it = m_scales.begin(); it != m_scales.end();
429  ++it) {
430  if (!(*it)->isLocked()) // locked scales are pre-defined ones!
431  {
432  settings.beginGroup((*it)->getUuid());
433 
434  settings.setValue(c_csm_scaleName, (*it)->getName());
435  settings.setValue(c_csm_relative, (*it)->isRelative());
436  if (!(*it)->isRelative()) {
437  double minVal = 0.0;
438  double maxVal = 0.0;
439  (*it)->getAbsoluteBoundaries(minVal, maxVal);
440  settings.setValue(c_csm_minVal, minVal);
441  settings.setValue(c_csm_maxVal, maxVal);
442  }
443 
444  settings.beginWriteArray(c_csm_stepsList);
445  {
446  for (int i = 0; i < (*it)->stepCount(); ++i) {
447  settings.setArrayIndex(i);
448  settings.setValue(c_csm_stepRelativePos,
449  (*it)->step(i).getRelativePos());
450  int rgb = static_cast<int>((*it)->step(i).getColor().rgb());
451  settings.setValue(c_csm_stepColor, rgb);
452  }
453  }
454  settings.endArray();
455 
456  settings.beginWriteArray(c_csm_customLabels);
457  {
458  int i = 0;
459  for (ccColorScale::LabelSet::const_iterator itL =
460  (*it)->customLabels().begin();
461  itL != (*it)->customLabels().end(); ++itL, ++i) {
462  settings.setArrayIndex(i);
463  settings.setValue(c_csm_customLabelValue, itL->value);
464  if (!itL->text.isEmpty()) {
465  settings.setValue(c_csm_customLabelText, itL->text);
466  }
467  }
468  }
469  settings.endArray();
470 
471  settings.endGroup();
472  }
473  }
474 
475  settings.endGroup();
476 }
477 
479  return m_scales.value(UUID, ccColorScale::Shared(nullptr));
480 }
481 
483  if (!scale || scale->getUuid().isEmpty()) {
484  CVLog::Error(QStringLiteral(
485  "[ccColorScalesManager::addScale] Invalid scale/UUID!"));
486  assert(false);
487  return;
488  }
489 
490  m_scales.insert(scale->getUuid(), scale);
491 }
492 
494  ScalesMap::const_iterator it = m_scales.constFind(UUID);
495  if (it != m_scales.constEnd()) {
496  if ((*it)->isLocked()) {
497  CVLog::Warning(QString("[ccColorScalesManager::addScale] Can't "
498  "remove a locked scale (%1)!")
499  .arg(UUID));
500  } else {
501  m_scales.remove(UUID);
502  }
503  }
504 }
505 
507  const QString name = [scaleType]() {
508  switch (scaleType) {
509  case BGYR:
510  return QStringLiteral("Blue>Green>Yellow>Red");
511  case GREY:
512  return QStringLiteral("Grey");
513  case BWR:
514  return QStringLiteral("Blue>White>Red");
515  case RY:
516  return QStringLiteral("Red>Yellow");
517  case RW:
518  return QStringLiteral("Red>White");
519  case ABS_NORM_GREY:
520  return QStringLiteral("Intensity [0-1]");
521  case HSV_360_DEG:
522  return QStringLiteral("HSV angle [0-360]");
523  case VERTEX_QUALITY:
524  return QStringLiteral("Vertex types default colors");
525  case DIP_BRYW:
526  return QStringLiteral("Dip [0-90]");
527  case DIP_DIR_REPEAT:
528  return QStringLiteral("Dip direction (repeat) [0-360]");
529  case VIRIDIS:
530  return QStringLiteral("Viridis");
531  case BROWN_YELLOW:
532  return QStringLiteral("Brown>Yellow");
533  case YELLOW_BROWN:
534  return QStringLiteral("Yellow>Brown");
535  case TOPO_LANDSERF:
536  return QStringLiteral("Topo landserf");
537  case HIGH_CONTRAST:
538  return QStringLiteral("High contrast");
539  case CIVIDIS:
540  return QStringLiteral("Cividis");
541  default:
542  assert(false);
543  break;
544  }
545  return QString();
546  }();
547 
548  if (name.isNull()) {
549  CVLog::Error(QStringLiteral("Unhandled pre-defined scale (%1)")
550  .arg(scaleType));
551  return ccColorScale::Shared(nullptr);
552  }
553 
554  ccColorScale::Shared scale(
555  new ccColorScale(name, QString::number(scaleType)));
556 
557  switch (scaleType) {
558  case BGYR:
559  scale->insert(ccColorScaleElement(0.0, Qt::blue), false);
560  scale->insert(ccColorScaleElement(1.0 / 3.0, Qt::green), false);
561  scale->insert(ccColorScaleElement(2.0 / 3.0, Qt::yellow), false);
562  scale->insert(ccColorScaleElement(1.0, Qt::red), false);
563  break;
564  case GREY:
565  scale->insert(ccColorScaleElement(0.0, Qt::black), false);
566  scale->insert(ccColorScaleElement(1.0, Qt::white), false);
567  break;
568  case BWR:
569  scale->insert(ccColorScaleElement(0.0, Qt::blue), false);
570  scale->insert(ccColorScaleElement(0.5, Qt::white), false);
571  scale->insert(ccColorScaleElement(1.0, Qt::red), false);
572  break;
573  case RY:
574  scale->insert(ccColorScaleElement(0.0, Qt::red), false);
575  scale->insert(ccColorScaleElement(1.0, Qt::yellow), false);
576  break;
577  case RW:
578  scale->insert(ccColorScaleElement(0.0, Qt::red), false);
579  scale->insert(ccColorScaleElement(1.0, Qt::white), false);
580  break;
581  case ABS_NORM_GREY:
582  scale->insert(ccColorScaleElement(0.0, Qt::black), false);
583  scale->insert(ccColorScaleElement(1.0, Qt::white), false);
584  scale->setAbsolute(0.0, 1.0);
585  scale->customLabels().insert(0);
586  scale->customLabels().insert(0.5);
587  scale->customLabels().insert(1.0);
588  break;
589  case HSV_360_DEG:
590  scale->insert(ccColorScaleElement(0.0 / 360.0, Qt::red), false);
591  scale->insert(ccColorScaleElement(60.0 / 360.0, Qt::yellow), false);
592  scale->insert(ccColorScaleElement(120.0 / 360.0, Qt::green), false);
593  scale->insert(ccColorScaleElement(180.0 / 360.0, Qt::cyan), false);
594  scale->insert(ccColorScaleElement(240.0 / 360.0, Qt::blue), false);
595  scale->insert(ccColorScaleElement(300.0 / 360.0, Qt::magenta),
596  false);
597  scale->insert(ccColorScaleElement(360.0 / 360.0, Qt::red), false);
598  scale->setAbsolute(0.0, 360.0);
599  scale->customLabels().insert(0);
600  scale->customLabels().insert(60);
601  scale->customLabels().insert(120);
602  scale->customLabels().insert(180);
603  scale->customLabels().insert(240);
604  scale->customLabels().insert(300);
605  break;
606  case VERTEX_QUALITY:
607  scale->insert(ccColorScaleElement(0.0, Qt::blue), false);
608  scale->insert(ccColorScaleElement(0.5, Qt::green), false);
609  scale->insert(ccColorScaleElement(1.0, Qt::red), false);
614  scale->setAbsolute(
617  scale->customLabels().insert(0);
618  scale->customLabels().insert(0.5);
619  scale->customLabels().insert(1.0);
620  break;
621  case DIP_BRYW:
622  scale->insert(ccColorScaleElement(0.00, qRgb(129, 0, 0)), false);
623  scale->insert(ccColorScaleElement(0.33, qRgb(255, 68, 0)), false);
624  scale->insert(ccColorScaleElement(0.66, qRgb(255, 255, 0)), false);
625  scale->insert(ccColorScaleElement(1.00, qRgb(255, 255, 255)),
626  false);
627  scale->setAbsolute(0, 90.0);
628  scale->customLabels().insert(0);
629  scale->customLabels().insert(30);
630  scale->customLabels().insert(60);
631  scale->customLabels().insert(90);
632  break;
633  case DIP_DIR_REPEAT:
634  scale->insert(ccColorScaleElement(0.0 / 360.0, qRgb(255, 0, 0)),
635  false);
636  scale->insert(ccColorScaleElement(30.0 / 360.0, qRgb(255, 255, 0)),
637  false);
638  scale->insert(ccColorScaleElement(60.0 / 360.0, qRgb(0, 255, 0)),
639  false);
640  scale->insert(ccColorScaleElement(90.0 / 360.0, qRgb(0, 255, 255)),
641  false);
642  scale->insert(ccColorScaleElement(120.0 / 360.0, qRgb(0, 0, 255)),
643  false);
644  scale->insert(ccColorScaleElement(150.0 / 360.0, qRgb(255, 0, 255)),
645  false);
646  scale->insert(ccColorScaleElement(180.0 / 360.0, qRgb(255, 0, 0)),
647  false);
648  scale->insert(ccColorScaleElement(210.0 / 360.0, qRgb(255, 255, 0)),
649  false);
650  scale->insert(ccColorScaleElement(240.0 / 360.0, qRgb(0, 255, 0)),
651  false);
652  scale->insert(ccColorScaleElement(270.0 / 360.0, qRgb(0, 255, 255)),
653  false);
654  scale->insert(ccColorScaleElement(300.0 / 360.0, qRgb(0, 0, 255)),
655  false);
656  scale->insert(ccColorScaleElement(330.0 / 360.0, qRgb(255, 0, 255)),
657  false);
658  scale->insert(ccColorScaleElement(360.0 / 360.0, qRgb(255, 0, 0)),
659  false);
660  scale->setAbsolute(0, 360.0);
661  scale->customLabels().insert(0);
662  scale->customLabels().insert(90);
663  scale->customLabels().insert(180);
664  scale->customLabels().insert(270);
665  break;
666  case VIRIDIS: {
667  const double* _viridis = s_viridis;
668  for (int i = 0; i < 256; ++i, _viridis += 3) {
669  int r = static_cast<int>(_viridis[0] * 255);
670  int g = static_cast<int>(_viridis[1] * 255);
671  int b = static_cast<int>(_viridis[2] * 255);
672  scale->insert(ccColorScaleElement(i / 255.0, qRgb(r, g, b)),
673  false);
674  }
675  break;
676  }
677  case BROWN_YELLOW:
678  scale->insert(ccColorScaleElement(0.0, qRgb(153, 51, 3)), false);
679  scale->insert(ccColorScaleElement(0.25, qRgb(217, 91, 13)), false);
680  scale->insert(ccColorScaleElement(0.5, qRgb(254, 151, 41)), false);
681  scale->insert(ccColorScaleElement(0.75, qRgb(254, 217, 142)),
682  false);
683  scale->insert(ccColorScaleElement(1.0, qRgb(255, 255, 212)), false);
684  break;
685  case YELLOW_BROWN:
686  scale->insert(ccColorScaleElement(0.0, qRgb(255, 255, 212)), false);
687  scale->insert(ccColorScaleElement(0.25, qRgb(254, 217, 142)),
688  false);
689  scale->insert(ccColorScaleElement(0.5, qRgb(254, 151, 41)), false);
690  scale->insert(ccColorScaleElement(0.75, qRgb(217, 91, 13)), false);
691  scale->insert(ccColorScaleElement(1.0, qRgb(153, 51, 3)), false);
692  break;
693  case TOPO_LANDSERF:
694  scale->insert(ccColorScaleElement(0.0, qRgb(109, 158, 93)), false);
695  scale->insert(ccColorScaleElement(0.25, qRgb(255, 255, 127)),
696  false);
697  scale->insert(ccColorScaleElement(0.5, qRgb(194, 108, 54)), false);
698  scale->insert(ccColorScaleElement(0.75, qRgb(85, 63, 50)), false);
699  scale->insert(ccColorScaleElement(1.0, qRgb(255, 255, 255)), false);
700  break;
701  case HIGH_CONTRAST:
702  scale->insert(ccColorScaleElement(0.0, qRgb(170, 255, 255)), false);
703  scale->insert(ccColorScaleElement(0.01, qRgb(158, 158, 158)),
704  false);
705  scale->insert(ccColorScaleElement(0.02, qRgb(0, 0, 127)), false);
706  scale->insert(ccColorScaleElement(0.04, qRgb(0, 255, 0)), false);
707  scale->insert(ccColorScaleElement(0.08, qRgb(0, 85, 0)), false);
708  scale->insert(ccColorScaleElement(0.16, qRgb(255, 255, 0)), false);
709  scale->insert(ccColorScaleElement(0.32, qRgb(255, 0, 0)), false);
710  scale->insert(ccColorScaleElement(0.5, qRgb(135, 0, 0)), false);
711  scale->insert(ccColorScaleElement(1.0, qRgb(232, 232, 232)), false);
712  break;
713  case CIVIDIS: {
714  for (unsigned i = 0; i < 256; ++i) {
715  const ColorStep& step = s_cividis[i];
716  scale->insert(
717  ccColorScaleElement(step.pos, qRgb(step.red, step.green,
718  step.blue)),
719  false);
720  }
721  break;
722  }
723  default:
724  assert(false);
725  break;
726  }
727 
728  // don't forget to update internal representation!
729  scale->update();
730  scale->setLocked(true);
731 
732  return scale;
733 }
int size
std::string name
math::float4 color
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
Definition: CVLog.cpp:133
static bool Print(const char *format,...)
Prints out a formatted message in console.
Definition: CVLog.cpp:113
static bool Error(const char *format,...)
Display an error dialog with formatted message.
Definition: CVLog.cpp:143
Color scale element: one value + one color.
Definition: ecvColorScale.h:22
Color scale.
Definition: ecvColorScale.h:71
QSharedPointer< ccColorScale > Shared
Shared pointer type.
Definition: ecvColorScale.h:74
Color scales manager/container.
ccColorScale::Shared getScale(QString UUID) const
Returns a color scale based on its UUID.
void addScale(ccColorScale::Shared scale)
Adds a new color scale.
static ccColorScale::Shared Create(DEFAULT_SCALES scaleType)
Creates a pre-defined color scale.
DEFAULT_SCALES
Pre-defined color scales (all relative - i.e. expand to actual SF)
void removeScale(QString UUID)
Removes a color scale.
void toPersistentSettings() const
Save custom color scales to persistent settings.
static void ReleaseUniqueInstance()
Releases unique instance.
ccColorScalesManager()
Default constructor.
virtual ~ccColorScalesManager()
Destructor.
static ccColorScalesManager * GetUniqueInstance()
Returns unique instance.
void fromPersistentSettings()
Loads custom color scales from persistent settings.
ScalesMap m_scales
Color scales.
static const char c_csm_stepsList[]
static const char c_csm_customLabelValue[]
static const char c_csm_scaleName[]
static const ColorStep s_cividis[]
static ecvSingleton< ccColorScalesManager > s_uniqueInstance
static const char c_csm_customLabelText[]
static const char c_csm_maxVal[]
static const char c_csm_groupName[]
static const char c_csm_stepRelativePos[]
static const char c_csm_relative[]
static const double s_viridis[]
static const char c_csm_customLabels[]
static const char c_csm_minVal[]
static const char c_csm_stepColor[]
normal_z rgb
constexpr Rgb cyan(0, MAX, MAX)
constexpr Rgb black(0, 0, 0)
constexpr Rgb magenta(MAX, 0, MAX)
constexpr Rgb white(MAX, MAX, MAX)
constexpr Rgb red(MAX, 0, 0)
constexpr Rgb blue(0, 0, MAX)
constexpr Rgb green(0, MAX, 0)
constexpr Rgb yellow(MAX, MAX, 0)
Generic singleton encapsulation structure.
Definition: ecvSingleton.h:12