v1.0.0-rc.40
This commit is contained in:
+56
-8
@@ -1,6 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
||||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
#include <cmath>
|
||||
#include "ColorScale.h"
|
||||
#include "JFJochException.h"
|
||||
|
||||
@@ -13,8 +14,6 @@ void ColorScale::Select(ColorScaleEnum val) {
|
||||
}
|
||||
|
||||
rgb ColorScale::Apply(float input, const std::vector<rgb> &map) {
|
||||
input = std::clamp(input, 0.0f, 1.0f);
|
||||
|
||||
size_t num_colors = map.size();
|
||||
if (num_colors < 2) {
|
||||
throw std::invalid_argument("Colormap must have at least two colors.");
|
||||
@@ -35,7 +34,7 @@ rgb ColorScale::Apply(float input, const std::vector<rgb> &map) {
|
||||
};
|
||||
}
|
||||
|
||||
rgb ColorScale::Apply(ColorScaleSpecial input) {
|
||||
rgb ColorScale::Apply(ColorScaleSpecial input) const {
|
||||
switch (input) {
|
||||
case ColorScaleSpecial::Gap:
|
||||
return gap;
|
||||
@@ -44,18 +43,67 @@ rgb ColorScale::Apply(ColorScaleSpecial input) {
|
||||
return bad;
|
||||
}
|
||||
}
|
||||
rgb ColorScale::Apply(float input) const {
|
||||
|
||||
rgb ColorScale::Apply(float input, float min, float max) const {
|
||||
// Assume min and max is finite
|
||||
|
||||
if (!std::isfinite(input))
|
||||
return gap;
|
||||
|
||||
float f;
|
||||
if (input <= min)
|
||||
f = 0.0f;
|
||||
else if (input >= max)
|
||||
f = 1.0f;
|
||||
else
|
||||
f = (input - min) / (max - min);
|
||||
|
||||
switch (current) {
|
||||
case ColorScaleEnum::Viridis:
|
||||
return Apply(input, viridis_colormap);
|
||||
return Apply(f, viridis_colormap);
|
||||
case ColorScaleEnum::Heat:
|
||||
return Apply(input, heat_colormap);
|
||||
return Apply(f, heat_colormap);
|
||||
case ColorScaleEnum::Indigo:
|
||||
return Apply(input, white_to_indigo_colormap);
|
||||
return Apply(f, white_to_indigo_colormap);
|
||||
case ColorScaleEnum::BW:
|
||||
return Apply(input, white_to_black_colormap);
|
||||
return Apply(f, white_to_black_colormap);
|
||||
default:
|
||||
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
|
||||
"Color scale unknown");
|
||||
}
|
||||
}
|
||||
|
||||
ColorScale &ColorScale::Gap(rgb input) {
|
||||
gap = input;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ColorScale &ColorScale::BadPixel(rgb input) {
|
||||
bad = input;
|
||||
return *this;
|
||||
}
|
||||
|
||||
rgb rainbowColor(float t) {
|
||||
// Ensure t is in [0,1]
|
||||
t = std::max(0.0f, std::min(1.0f, t));
|
||||
|
||||
// Convert to hue (0 to 6)
|
||||
float hue = t * 6.0f;
|
||||
|
||||
int phase = static_cast<int>(hue);
|
||||
float fract = hue - phase;
|
||||
|
||||
uint8_t p = static_cast<uint8_t>(255 * (1.0f - fract));
|
||||
uint8_t q = static_cast<uint8_t>(255 * fract);
|
||||
uint8_t full = 255;
|
||||
|
||||
switch (phase) {
|
||||
case 0: return {full, q, 0}; // Red to Yellow
|
||||
case 1: return {p, full, 0}; // Yellow to Green
|
||||
case 2: return {0, full, q}; // Green to Cyan
|
||||
case 3: return {0, p, full}; // Cyan to Blue
|
||||
case 4: return {q, 0, full}; // Blue to Magenta
|
||||
case 5: return {full, 0, p}; // Magenta to Red
|
||||
default: return {full, 0, 0}; // Fallback (red)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user