Fix control line edit crash when undoing history

When perspective control line editing is active and the history entry is
changed such that edit mode is automatically disabled, there is a crash.
The history change triggers a processing parameters update and disables
editing. When editing is disabled, the perspective tool also tries to
update the processing parameters, causing a double mutex lock attempt.

This commit avoids updating parameters from the perspective tool and
uses the tweak operator (introduced with the spot removal tool) to achieve
the same effect.

Closes #6251.
This commit is contained in:
Lawrence Lee 2021-05-22 15:50:35 -07:00
parent 99f2a87819
commit 36f1300a6b
5 changed files with 14 additions and 16 deletions

View File

@ -35,5 +35,4 @@ public:
virtual void autoCropRequested () = 0; virtual void autoCropRequested () = 0;
virtual double autoDistorRequested () = 0; virtual double autoDistorRequested () = 0;
virtual void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector<rtengine::ControlLine> *lines = nullptr) = 0; virtual void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector<rtengine::ControlLine> *lines = nullptr) = 0;
virtual void updateTransformPreviewRequested (rtengine::ProcEvent event, bool render_perspective) = 0;
}; };

View File

@ -543,6 +543,11 @@ void PerspCorrection::applyControlLines(void)
adjusterChanged(camera_pitch, pitch); adjusterChanged(camera_pitch, pitch);
} }
void PerspCorrection::tweakParams(rtengine::procparams::ProcParams &pparams)
{
pparams.perspective.render = render;
}
void PerspCorrection::autoCorrectionPressed(Gtk::Button* b) void PerspCorrection::autoCorrectionPressed(Gtk::Button* b)
{ {
if (!lens_geom_listener) { if (!lens_geom_listener) {
@ -754,8 +759,9 @@ void PerspCorrection::linesEditButtonPressed(void)
lines->setActive(true); lines->setActive(true);
lines->setDrawMode(true); lines->setDrawMode(true);
render = false; render = false;
if (lens_geom_listener) { if (listener) {
lens_geom_listener->updateTransformPreviewRequested(EvPerspRender, false); listener->setTweakOperator(this);
listener->refreshPreview(EvPerspRender);
} }
lines_button_apply->set_sensitive(true); lines_button_apply->set_sensitive(true);
lines_button_erase->set_sensitive(true); lines_button_erase->set_sensitive(true);
@ -768,8 +774,9 @@ void PerspCorrection::linesEditButtonPressed(void)
lines_button_apply->set_sensitive(false); lines_button_apply->set_sensitive(false);
lines_button_erase->set_sensitive(false); lines_button_erase->set_sensitive(false);
render = true; render = true;
if (lens_geom_listener) { if (listener) {
lens_geom_listener->updateTransformPreviewRequested(EvPerspRender, true); listener->unsetTweakOperator(this);
listener->refreshPreview(EvPerspRender);
} }
lines->setDrawMode(false); lines->setDrawMode(false);
lines->setActive(false); lines->setActive(false);

View File

@ -24,6 +24,7 @@
#include "controllines.h" #include "controllines.h"
#include "lensgeomlistener.h" #include "lensgeomlistener.h"
#include "toolpanel.h" #include "toolpanel.h"
#include "../rtengine/tweakoperator.h"
class PerspCorrectionPanelListener class PerspCorrectionPanelListener
{ {
@ -34,6 +35,7 @@ public:
}; };
class PerspCorrection final : class PerspCorrection final :
public rtengine::TweakOperator,
public ToolParamBlock, public ToolParamBlock,
public AdjusterListener, public AdjusterListener,
public FoldableToolPanel public FoldableToolPanel
@ -91,6 +93,7 @@ protected:
const rtengine::FramesMetaData* metadata; const rtengine::FramesMetaData* metadata;
void applyControlLines (void); void applyControlLines (void);
void tweakParams(rtengine::procparams::ProcParams &pparams) override;
void setCamBasedEventsActive (bool active = true); void setCamBasedEventsActive (bool active = true);
void setFocalLengthValue (const rtengine::procparams::ProcParams* pparams, const rtengine::FramesMetaData* metadata); void setFocalLengthValue (const rtengine::procparams::ProcParams* pparams, const rtengine::FramesMetaData* metadata);

View File

@ -1037,16 +1037,6 @@ double ToolPanelCoordinator::autoDistorRequested()
return rtengine::ImProcFunctions::getAutoDistor(ipc->getInitialImage()->getFileName(), 400); return rtengine::ImProcFunctions::getAutoDistor(ipc->getInitialImage()->getFileName(), 400);
} }
void ToolPanelCoordinator::updateTransformPreviewRequested(rtengine::ProcEvent event, bool render_perspective)
{
if (!ipc) {
return;
}
ipc->beginUpdateParams()->perspective.render = render_perspective;
ipc->endUpdateParams(event);
}
void ToolPanelCoordinator::spotWBRequested(int size) void ToolPanelCoordinator::spotWBRequested(int size)
{ {

View File

@ -321,7 +321,6 @@ public:
void autoCropRequested () override; void autoCropRequested () override;
void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector<rtengine::ControlLine> *lines = nullptr) override; void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector<rtengine::ControlLine> *lines = nullptr) override;
double autoDistorRequested () override; double autoDistorRequested () override;
void updateTransformPreviewRequested (rtengine::ProcEvent event, bool render_perspective) override;
// spotwblistener interface // spotwblistener interface
void spotWBRequested (int size) override; void spotWBRequested (int size) override;