jfjoch_viewer: Improve HDR mode
All checks were successful
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 12m22s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m4s
Build Packages / Generate python client (push) Successful in 13s
Build Packages / build:rpm (rocky8) (push) Successful in 14m15s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m21s
Build Packages / Create release (push) Has been skipped
Build Packages / build:rpm (ubuntu2204) (push) Successful in 14m15s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 14m27s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m5s
Build Packages / Build documentation (push) Successful in 52s
Build Packages / build:rpm (rocky9) (push) Successful in 15m1s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 9m14s
Build Packages / build:rpm (ubuntu2204_nocuda) (pull_request) Successful in 13m5s
Build Packages / build:rpm (ubuntu2404_nocuda) (pull_request) Successful in 12m35s
Build Packages / build:rpm (rocky8_nocuda) (pull_request) Successful in 13m24s
Build Packages / Generate python client (pull_request) Successful in 11s
Build Packages / build:rpm (rocky8) (pull_request) Successful in 12m58s
Build Packages / build:rpm (rocky8_sls9) (pull_request) Successful in 13m8s
Build Packages / Create release (pull_request) Has been skipped
Build Packages / build:rpm (rocky9_nocuda) (pull_request) Successful in 14m12s
Build Packages / Build documentation (pull_request) Successful in 41s
Build Packages / build:rpm (rocky9) (pull_request) Successful in 10m40s
Build Packages / build:rpm (ubuntu2404) (pull_request) Successful in 7m23s
Build Packages / build:rpm (ubuntu2204) (pull_request) Successful in 8m0s
Build Packages / Unit tests (push) Successful in 1h0m8s
Build Packages / Unit tests (pull_request) Successful in 50m6s

This commit is contained in:
2026-01-31 23:35:40 +01:00
parent a523969a9f
commit 9aaa70c5b6
5 changed files with 44 additions and 7 deletions

View File

@@ -159,6 +159,9 @@ JFJochViewerWindow::JFJochViewerWindow(QWidget *parent, bool dbus, const QString
connect(toolBarDisplay, &JFJochViewerToolbarDisplay::setAutoForeground, viewer,
&JFJochDiffractionImage::setAutoForeground);
connect(toolBarDisplay, &JFJochViewerToolbarDisplay::setHDRMode, viewer,
&JFJochImage::setHDRMode);
connect(toolBarDisplay, &JFJochViewerToolbarDisplay::colorMapChanged, viewer,
&JFJochDiffractionImage::setColorMap);

View File

@@ -600,7 +600,9 @@ void JFJochImage::GeneratePixmap() {
const auto &lut_data = color_scale.LUTData();
const int64_t lutSize = lut_data.size();
const float lutScale = static_cast<float>(lutSize - 1);
const float invRange = (maxv > minv) ? (1.0f / (maxv - minv)) * lutScale : 0.0f;
const float range = maxv - minv;
const float invRange = (range > 0) ? (lutScale / range) : 0.0f;
const float invRangeLog = (range > 0) ? (lutScale / std::log1p(range)) : 0.0f;
rgb gap_color = color_scale.Apply(ColorScaleSpecial::Gap);
for (int y = 0; y < H; ++y) {
@@ -619,7 +621,22 @@ void JFJochImage::GeneratePixmap() {
c = std::signbit(fp) ? bad_color : sat_color;
}
} else {
auto idx = static_cast<int>((fp - minv) * invRange + 0.5f);
float f;
const float fp_minv = fp - minv;
if (hdr_mode) {
if (fp_minv <= 0.0f)
f = 0.0f;
else if (fp_minv >= range)
f = lutSize;
else
f = std::log1p(fp_minv) * invRangeLog;
} else
f = fp_minv * invRange;
if (f < 0.0f) f = 0.0f;
auto idx = static_cast<int>(f + 0.5f);
if (idx <= 0) idx = 0;
else if (idx >= lutSize) idx = lutSize - 1;
c = lut_data[idx];
@@ -849,3 +866,9 @@ void JFJochImage::adjustForeground(bool input) {
}
void JFJochImage::beforeOverlayCleared() {}
void JFJochImage::setHDRMode(bool input) {
hdr_mode = input;
GeneratePixmap();
Redraw();
}

View File

@@ -36,6 +36,7 @@ protected:
bool auto_bg = false;
bool auto_fg = false;
bool hdr_mode = false;
double scale_factor = 1.0;
@@ -108,6 +109,7 @@ public slots:
void fitToView();
void adjustForeground(bool input);
void setHDRMode(bool input);
public:
explicit JFJochImage(QWidget *parent = nullptr);
};

View File

@@ -21,6 +21,11 @@ JFJochViewerToolbarDisplay::JFJochViewerToolbarDisplay(QWidget *parent)
auto_foreground_button->setChecked(false);
addWidget(auto_foreground_button);
hdr_mode_button = new QPushButton("HDR");
hdr_mode_button->setCheckable(true);
hdr_mode_button->setChecked(false);
addWidget(hdr_mode_button);
addWidget(new QLabel("&nbsp;&nbsp;<b>Color map</b>&nbsp;&nbsp;"));
// Initialize QComboBox with the options
@@ -41,7 +46,7 @@ JFJochViewerToolbarDisplay::JFJochViewerToolbarDisplay(QWidget *parent)
connect(color_map_select, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &JFJochViewerToolbarDisplay::colorComboBoxSet);
connect(auto_foreground_button, &QPushButton::clicked, this, &JFJochViewerToolbarDisplay::autoForegroundButtonPressed);
connect(hdr_mode_button, &QPushButton::clicked, this, &JFJochViewerToolbarDisplay::HDRModeButtonPressed);
auto *stretch = new QWidget(this);
stretch->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
addWidget(stretch);
@@ -60,7 +65,6 @@ void JFJochViewerToolbarDisplay::colorComboBoxSet(int val) {
emit colorMapChanged(val);
}
void JFJochViewerToolbarDisplay::autoForegroundButtonPressed() {
emit setAutoForeground(auto_foreground_button->isChecked());
}
@@ -70,15 +74,18 @@ void JFJochViewerToolbarDisplay::updateAutoForeground(bool val) {
auto_foreground_button->setChecked(val);
}
void JFJochViewerToolbarDisplay::HDRModeButtonPressed() {
emit setHDRMode(hdr_mode_button->isChecked());
}
void JFJochViewerToolbarDisplay::imageLoaded(std::shared_ptr<const JFJochReaderImage> image) {
if (image) {
auto valid = image->ValidMinMax();
if (valid.has_value())
if (valid.has_value() && valid->second > 1)
foreground_slider->setMax(valid->second);
else
foreground_slider->setMax(MAX_SLIDER_NO_IMAGE);
} else {
foreground_slider->setMax(MAX_SLIDER_NO_IMAGE);
}
}

View File

@@ -17,7 +17,7 @@ class JFJochViewerToolbarDisplay : public QToolBar {
SliderPlusBox *foreground_slider;
QPushButton *auto_foreground_button;
QPushButton *hdr_mode_button;
QComboBox *color_map_select;
public:
JFJochViewerToolbarDisplay(QWidget *parent = nullptr);
@@ -26,6 +26,7 @@ signals:
void setForeground(float val);
void colorMapChanged(int val);
void setAutoForeground(bool val);
void setHDRMode(bool val);
public slots:
void updateForeground(float val);
@@ -35,6 +36,7 @@ private slots:
void foregroundSet(double val);
void colorComboBoxSet(int val);
void autoForegroundButtonPressed();
void HDRModeButtonPressed();
};