diff --git a/viewer/image_viewer/JFJochImage.cpp b/viewer/image_viewer/JFJochImage.cpp index 62ef5b1c..f1452e44 100644 --- a/viewer/image_viewer/JFJochImage.cpp +++ b/viewer/image_viewer/JFJochImage.cpp @@ -67,10 +67,20 @@ void JFJochImage::onScroll(int value) { updateOverlay(); } +void JFJochImage::ScheduleRenderImage() { + if (render_pending_) + return; + render_pending_ = true; + QTimer::singleShot(0, this, [this] { + render_pending_ = false; + RenderImage(); + Redraw(); + }); +} + void JFJochImage::changeBackground(float val) { background = val; - RenderImage(); - Redraw(); + ScheduleRenderImage(); } void JFJochImage::changeForeground(float val) { @@ -78,8 +88,7 @@ void JFJochImage::changeForeground(float val) { emit autoForegroundChanged(false); foreground = val; // Regenerate the image - RenderImage(); - Redraw(); + ScheduleRenderImage(); } void JFJochImage::setColorMap(int color_map) { diff --git a/viewer/image_viewer/JFJochImage.h b/viewer/image_viewer/JFJochImage.h index a6f9e3f2..623f8125 100644 --- a/viewer/image_viewer/JFJochImage.h +++ b/viewer/image_viewer/JFJochImage.h @@ -119,6 +119,11 @@ protected: void updateOverlay(); void RenderImage(); + // Re-render once the event queue drains. The foreground slider and the wheel emit far + // faster than a large image can be recoloured, so intermediate values are dropped + // instead of queueing a full recolour per event. + void ScheduleRenderImage(); + bool render_pending_ = false; void Redraw(); void CalcROI();