Fix issues found by AddressSanitizer

Fix memcpy overlap in TIFF reader.
Fix memory leaks of SpotRows in control spot panel.
Fix memory leaks of SpotRows in locallab.
Fix memory leak of Glib::ThreadPool in file browser entry.
Fix memory leak of Glib::ThreadPool in thumbnail image updater.
This commit is contained in:
Lawrence Lee 2023-11-11 16:56:34 -08:00
parent f93c3ddf94
commit c5bb1f093e
No known key found for this signature in database
GPG Key ID: 048FF2B76A63895F
6 changed files with 259 additions and 250 deletions

View File

@ -791,7 +791,7 @@ int ImageIO::loadTIFF (const Glib::ustring &fname)
if (samplesperpixel > 3) { if (samplesperpixel > 3) {
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
memcpy(linebuffer.get() + i * 3 * bitspersample / 8, linebuffer.get() + i * samplesperpixel * bitspersample / 8, 3 * bitspersample / 8); memmove(linebuffer.get() + i * 3 * bitspersample / 8, linebuffer.get() + i * samplesperpixel * bitspersample / 8, 3 * bitspersample / 8);
} }
} }
else if (samplesperpixel == 1) { else if (samplesperpixel == 1) {

View File

@ -660,7 +660,7 @@ void ControlSpotPanel::on_button_delete()
nbSpotChanged_ = true; nbSpotChanged_ = true;
selSpotChanged_ = true; selSpotChanged_ = true;
eventType = SpotDeletion; eventType = SpotDeletion;
SpotRow* const delSpotRow = getSpot(selIndex); std::unique_ptr<SpotRow> const delSpotRow = getSpot(selIndex);
listener->panelChanged(EvLocallabSpotDeleted, delSpotRow->name); listener->panelChanged(EvLocallabSpotDeleted, delSpotRow->name);
} }
@ -682,7 +682,7 @@ void ControlSpotPanel::on_button_duplicate()
nbSpotChanged_ = true; nbSpotChanged_ = true;
selSpotChanged_ = true; selSpotChanged_ = true;
eventType = SpotDuplication; eventType = SpotDuplication;
SpotRow* const duplSpotRow = getSpot(selIndex); std::unique_ptr<SpotRow> const duplSpotRow = getSpot(selIndex);
listener->panelChanged(EvLocallabSpotCreated, M("TP_LOCALLAB_EV_DUPL") + " " listener->panelChanged(EvLocallabSpotCreated, M("TP_LOCALLAB_EV_DUPL") + " "
+ duplSpotRow->name); + duplSpotRow->name);
} }
@ -779,7 +779,7 @@ bool ControlSpotPanel::on_button_visibility(GdkEventButton* event)
// Raise event // Raise event
visibilityChanged_ = true; visibilityChanged_ = true;
SpotRow* const spotRow = getSpot(getSelectedSpot()); std::unique_ptr<SpotRow> const spotRow = getSpot(getSelectedSpot());
if (row[spots_.isvisible]) { if (row[spots_.isvisible]) {
listener->panelChanged(EvLocallabSpotVisibility, M("TP_LOCALLAB_EV_VIS") + " (" + spotRow->name + ")"); listener->panelChanged(EvLocallabSpotVisibility, M("TP_LOCALLAB_EV_VIS") + " (" + spotRow->name + ")");
@ -896,7 +896,7 @@ void ControlSpotPanel::controlspotChanged()
selSpotChanged_ = true; selSpotChanged_ = true;
eventType = SpotSelection; eventType = SpotSelection;
SpotRow* const spotRow = getSpot(selIndex); std::unique_ptr<SpotRow> const spotRow = getSpot(selIndex);
// Image area shall be regenerated if mask or deltaE preview was active when switching spot // Image area shall be regenerated if mask or deltaE preview was active when switching spot
if (maskPrevActive || preview_->get_active()) { if (maskPrevActive || preview_->get_active()) {
@ -2535,13 +2535,16 @@ int ControlSpotPanel::getEventType()
return tmp; return tmp;
} }
ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int index) std::unique_ptr<ControlSpotPanel::SpotRow> ControlSpotPanel::getSpot(const int index)
{ {
// TODO: Return an std::optional<ControlSpotPanel::SpotRow> after upgrading
// to C++17.
// printf("getSpot: %d\n", index); // printf("getSpot: %d\n", index);
MyMutex::MyLock lock(mTreeview); MyMutex::MyLock lock(mTreeview);
SpotRow* r = new SpotRow(); std::unique_ptr<SpotRow> r(new SpotRow());
int i = -1; int i = -1;
@ -2676,58 +2679,58 @@ void ControlSpotPanel::resetDeltaEPreview()
previewConn_.block(false); previewConn_.block(false);
} }
void ControlSpotPanel::addControlSpot(SpotRow* newSpot) void ControlSpotPanel::addControlSpot(const SpotRow &newSpot)
{ {
// printf("addControlSpot: %d\n", newSpot->name); // printf("addControlSpot: %d\n", newSpot.name);
MyMutex::MyLock lock(mTreeview); MyMutex::MyLock lock(mTreeview);
disableParamlistener(true); disableParamlistener(true);
Gtk::TreeModel::Row row = *(treemodel_->append()); Gtk::TreeModel::Row row = *(treemodel_->append());
row[spots_.mouseover] = false; row[spots_.mouseover] = false;
row[spots_.name] = newSpot->name; row[spots_.name] = newSpot.name;
row[spots_.isvisible] = newSpot->isvisible; row[spots_.isvisible] = newSpot.isvisible;
row[spots_.curveid] = 0; // No associated curve row[spots_.curveid] = 0; // No associated curve
row[spots_.prevMethod] = newSpot->prevMethod; row[spots_.prevMethod] = newSpot.prevMethod;
row[spots_.shape] = newSpot->shape; row[spots_.shape] = newSpot.shape;
row[spots_.spotMethod] = newSpot->spotMethod; row[spots_.spotMethod] = newSpot.spotMethod;
row[spots_.sensiexclu] = newSpot->sensiexclu; row[spots_.sensiexclu] = newSpot.sensiexclu;
row[spots_.structexclu] = newSpot->structexclu; row[spots_.structexclu] = newSpot.structexclu;
row[spots_.shapeMethod] = newSpot->shapeMethod; row[spots_.shapeMethod] = newSpot.shapeMethod;
row[spots_.locX] = newSpot->locX; row[spots_.locX] = newSpot.locX;
row[spots_.locXL] = newSpot->locXL; row[spots_.locXL] = newSpot.locXL;
row[spots_.locY] = newSpot->locY; row[spots_.locY] = newSpot.locY;
row[spots_.locYT] = newSpot->locYT; row[spots_.locYT] = newSpot.locYT;
row[spots_.centerX] = newSpot->centerX; row[spots_.centerX] = newSpot.centerX;
row[spots_.centerY] = newSpot->centerY; row[spots_.centerY] = newSpot.centerY;
row[spots_.circrad] = newSpot->circrad; row[spots_.circrad] = newSpot.circrad;
row[spots_.qualityMethod] = newSpot->qualityMethod; row[spots_.qualityMethod] = newSpot.qualityMethod;
row[spots_.transit] = newSpot->transit; row[spots_.transit] = newSpot.transit;
row[spots_.transitweak] = newSpot->transitweak; row[spots_.transitweak] = newSpot.transitweak;
row[spots_.transitgrad] = newSpot->transitgrad; row[spots_.transitgrad] = newSpot.transitgrad;
row[spots_.feather] = newSpot->feather; row[spots_.feather] = newSpot.feather;
row[spots_.struc] = newSpot->struc; row[spots_.struc] = newSpot.struc;
row[spots_.thresh] = newSpot->thresh; row[spots_.thresh] = newSpot.thresh;
row[spots_.iter] = newSpot->iter; row[spots_.iter] = newSpot.iter;
row[spots_.balan] = newSpot->balan; row[spots_.balan] = newSpot.balan;
row[spots_.balanh] = newSpot->balanh; row[spots_.balanh] = newSpot.balanh;
row[spots_.colorde] = newSpot->colorde; row[spots_.colorde] = newSpot.colorde;
row[spots_.colorscope] = newSpot->colorscope; row[spots_.colorscope] = newSpot.colorscope;
row[spots_.avoidrad] = newSpot->avoidrad; row[spots_.avoidrad] = newSpot.avoidrad;
row[spots_.hishow] = newSpot->hishow; row[spots_.hishow] = newSpot.hishow;
row[spots_.activ] = newSpot->activ; row[spots_.activ] = newSpot.activ;
row[spots_.blwh] = newSpot->blwh; row[spots_.blwh] = newSpot.blwh;
row[spots_.recurs] = newSpot->recurs; row[spots_.recurs] = newSpot.recurs;
row[spots_.laplac] = newSpot->laplac; row[spots_.laplac] = newSpot.laplac;
row[spots_.deltae] = newSpot->deltae; row[spots_.deltae] = newSpot.deltae;
row[spots_.scopemask] = newSpot->scopemask; row[spots_.scopemask] = newSpot.scopemask;
row[spots_.denoichmask] = newSpot->denoichmask; row[spots_.denoichmask] = newSpot.denoichmask;
row[spots_.shortc] = newSpot->shortc; row[spots_.shortc] = newSpot.shortc;
row[spots_.lumask] = newSpot->lumask; row[spots_.lumask] = newSpot.lumask;
//row[spots_.savrest] = newSpot->savrest; //row[spots_.savrest] = newSpot.savrest;
row[spots_.complexMethod] = newSpot->complexMethod; row[spots_.complexMethod] = newSpot.complexMethod;
row[spots_.wavMethod] = newSpot->wavMethod; row[spots_.wavMethod] = newSpot.wavMethod;
row[spots_.avoidgamutMethod] = newSpot->avoidgamutMethod; row[spots_.avoidgamutMethod] = newSpot.avoidgamutMethod;
updateParamVisibility(); updateParamVisibility();
disableParamlistener(false); disableParamlistener(false);

View File

@ -21,6 +21,8 @@
#ifndef _CONTROLSPOTPANEL_H_ #ifndef _CONTROLSPOTPANEL_H_
#define _CONTROLSPOTPANEL_H_ #define _CONTROLSPOTPANEL_H_
#include <memory>
#include "../rtengine/coord.h" #include "../rtengine/coord.h"
#include "editcallbacks.h" #include "editcallbacks.h"
#include "threadutils.h" #include "threadutils.h"
@ -141,7 +143,7 @@ public:
* @param index The spot index to get params * @param index The spot index to get params
* @return A SpotRow structure containing params of associated spot * @return A SpotRow structure containing params of associated spot
*/ */
SpotRow* getSpot(const int index); std::unique_ptr<SpotRow> getSpot(const int index);
/** /**
* Getter of spots number * Getter of spots number
* *
@ -187,7 +189,7 @@ public:
* *
* @param newSpot A SpotRow structure containing new spot params * @param newSpot A SpotRow structure containing new spot params
*/ */
void addControlSpot(SpotRow* newSpot); void addControlSpot(const SpotRow &newSpot);
// Control spot delete function // Control spot delete function
/** /**

View File

@ -241,113 +241,113 @@ void Locallab::read(const rtengine::procparams::ProcParams* pp, const ParamsEdit
// TODO Manage it with read function in controlspotpanel.cc // TODO Manage it with read function in controlspotpanel.cc
// Add existent spots based on pp // Add existent spots based on pp
ControlSpotPanel::SpotRow* const r = new ControlSpotPanel::SpotRow(); ControlSpotPanel::SpotRow r;
for (int i = 0; i < (int)pp->locallab.spots.size(); i++) { for (int i = 0; i < (int)pp->locallab.spots.size(); i++) {
r->name = pp->locallab.spots.at(i).name; r.name = pp->locallab.spots.at(i).name;
r->isvisible = pp->locallab.spots.at(i).isvisible; r.isvisible = pp->locallab.spots.at(i).isvisible;
if (pp->locallab.spots.at(i).shape == "ELI") { if (pp->locallab.spots.at(i).shape == "ELI") {
r->shape = 0; r.shape = 0;
} else { } else {
r->shape = 1; r.shape = 1;
} }
if (pp->locallab.spots.at(i).prevMethod == "hide") { if (pp->locallab.spots.at(i).prevMethod == "hide") {
r->prevMethod = 0; r.prevMethod = 0;
} else { } else {
r->prevMethod = 1; r.prevMethod = 1;
} }
if (pp->locallab.spots.at(i).spotMethod == "norm") { if (pp->locallab.spots.at(i).spotMethod == "norm") {
r->spotMethod = 0; r.spotMethod = 0;
} else if(pp->locallab.spots.at(i).spotMethod == "exc"){ } else if(pp->locallab.spots.at(i).spotMethod == "exc"){
r->spotMethod = 1; r.spotMethod = 1;
} else if (pp->locallab.spots.at(i).spotMethod == "full"){ } else if (pp->locallab.spots.at(i).spotMethod == "full"){
r->spotMethod = 2; r.spotMethod = 2;
} }
r->sensiexclu = pp->locallab.spots.at(i).sensiexclu; r.sensiexclu = pp->locallab.spots.at(i).sensiexclu;
r->structexclu = pp->locallab.spots.at(i).structexclu; r.structexclu = pp->locallab.spots.at(i).structexclu;
if (pp->locallab.spots.at(i).shapeMethod == "IND") { if (pp->locallab.spots.at(i).shapeMethod == "IND") {
r->shapeMethod = 0; r.shapeMethod = 0;
} else if (pp->locallab.spots.at(i).shapeMethod == "SYM") { } else if (pp->locallab.spots.at(i).shapeMethod == "SYM") {
r->shapeMethod = 1; r.shapeMethod = 1;
} else if (pp->locallab.spots.at(i).shapeMethod == "INDSL") { } else if (pp->locallab.spots.at(i).shapeMethod == "INDSL") {
r->shapeMethod = 2; r.shapeMethod = 2;
} else { } else {
r->shapeMethod = 3; r.shapeMethod = 3;
} }
if (pp->locallab.spots.at(i).avoidgamutMethod == "NONE") { if (pp->locallab.spots.at(i).avoidgamutMethod == "NONE") {
r->avoidgamutMethod = 0; r.avoidgamutMethod = 0;
} else if (pp->locallab.spots.at(i).avoidgamutMethod == "LAB") { } else if (pp->locallab.spots.at(i).avoidgamutMethod == "LAB") {
r->avoidgamutMethod = 1; r.avoidgamutMethod = 1;
} else if (pp->locallab.spots.at(i).avoidgamutMethod == "XYZ") { } else if (pp->locallab.spots.at(i).avoidgamutMethod == "XYZ") {
r->avoidgamutMethod= 2; r.avoidgamutMethod= 2;
} else if (pp->locallab.spots.at(i).avoidgamutMethod == "XYZREL") { } else if (pp->locallab.spots.at(i).avoidgamutMethod == "XYZREL") {
r->avoidgamutMethod= 3; r.avoidgamutMethod= 3;
} else if (pp->locallab.spots.at(i).avoidgamutMethod == "MUNS") { } else if (pp->locallab.spots.at(i).avoidgamutMethod == "MUNS") {
r->avoidgamutMethod= 4; r.avoidgamutMethod= 4;
} }
r->locX = pp->locallab.spots.at(i).loc.at(0); r.locX = pp->locallab.spots.at(i).loc.at(0);
r->locXL = pp->locallab.spots.at(i).loc.at(1); r.locXL = pp->locallab.spots.at(i).loc.at(1);
r->locY = pp->locallab.spots.at(i).loc.at(2); r.locY = pp->locallab.spots.at(i).loc.at(2);
r->locYT = pp->locallab.spots.at(i).loc.at(3); r.locYT = pp->locallab.spots.at(i).loc.at(3);
r->centerX = pp->locallab.spots.at(i).centerX; r.centerX = pp->locallab.spots.at(i).centerX;
r->centerY = pp->locallab.spots.at(i).centerY; r.centerY = pp->locallab.spots.at(i).centerY;
r->circrad = pp->locallab.spots.at(i).circrad; r.circrad = pp->locallab.spots.at(i).circrad;
if (pp->locallab.spots.at(i).qualityMethod == "enh") { if (pp->locallab.spots.at(i).qualityMethod == "enh") {
r->qualityMethod = 0; r.qualityMethod = 0;
} else { } else {
r->qualityMethod = 1; r.qualityMethod = 1;
} }
r->transit = pp->locallab.spots.at(i).transit; r.transit = pp->locallab.spots.at(i).transit;
r->transitweak = pp->locallab.spots.at(i).transitweak; r.transitweak = pp->locallab.spots.at(i).transitweak;
r->transitgrad = pp->locallab.spots.at(i).transitgrad; r.transitgrad = pp->locallab.spots.at(i).transitgrad;
r->feather = pp->locallab.spots.at(i).feather; r.feather = pp->locallab.spots.at(i).feather;
r->struc = pp->locallab.spots.at(i).struc; r.struc = pp->locallab.spots.at(i).struc;
r->thresh = pp->locallab.spots.at(i).thresh; r.thresh = pp->locallab.spots.at(i).thresh;
r->iter = pp->locallab.spots.at(i).iter; r.iter = pp->locallab.spots.at(i).iter;
r->balan = pp->locallab.spots.at(i).balan; r.balan = pp->locallab.spots.at(i).balan;
r->balanh = pp->locallab.spots.at(i).balanh; r.balanh = pp->locallab.spots.at(i).balanh;
r->colorde = pp->locallab.spots.at(i).colorde; r.colorde = pp->locallab.spots.at(i).colorde;
r->colorscope = pp->locallab.spots.at(i).colorscope; r.colorscope = pp->locallab.spots.at(i).colorscope;
r->avoidrad = pp->locallab.spots.at(i).avoidrad; r.avoidrad = pp->locallab.spots.at(i).avoidrad;
r->hishow = pp->locallab.spots.at(i).hishow; r.hishow = pp->locallab.spots.at(i).hishow;
r->activ = pp->locallab.spots.at(i).activ; r.activ = pp->locallab.spots.at(i).activ;
r->blwh = pp->locallab.spots.at(i).blwh; r.blwh = pp->locallab.spots.at(i).blwh;
r->recurs = pp->locallab.spots.at(i).recurs; r.recurs = pp->locallab.spots.at(i).recurs;
r->laplac = true; //pp->locallab.spots.at(i).laplac; r.laplac = true; //pp->locallab.spots.at(i).laplac;
r->deltae = pp->locallab.spots.at(i).deltae; r.deltae = pp->locallab.spots.at(i).deltae;
r->scopemask = pp->locallab.spots.at(i).scopemask; r.scopemask = pp->locallab.spots.at(i).scopemask;
r->denoichmask = pp->locallab.spots.at(i).denoichmask; r.denoichmask = pp->locallab.spots.at(i).denoichmask;
r->shortc = pp->locallab.spots.at(i).shortc; r.shortc = pp->locallab.spots.at(i).shortc;
r->lumask = pp->locallab.spots.at(i).lumask; r.lumask = pp->locallab.spots.at(i).lumask;
//r->savrest = pp->locallab.spots.at(i).savrest; //r.savrest = pp->locallab.spots.at(i).savrest;
if (pp->locallab.spots.at(i).complexMethod == "sim") { if (pp->locallab.spots.at(i).complexMethod == "sim") {
r->complexMethod = 0; r.complexMethod = 0;
} else if (pp->locallab.spots.at(i).complexMethod == "mod") { } else if (pp->locallab.spots.at(i).complexMethod == "mod") {
r->complexMethod = 1; r.complexMethod = 1;
} else if (pp->locallab.spots.at(i).complexMethod == "all") { } else if (pp->locallab.spots.at(i).complexMethod == "all") {
r->complexMethod = 2; r.complexMethod = 2;
} }
if (pp->locallab.spots.at(i).wavMethod == "D2") { if (pp->locallab.spots.at(i).wavMethod == "D2") {
r->wavMethod = 0; r.wavMethod = 0;
} else if (pp->locallab.spots.at(i).wavMethod == "D4") { } else if (pp->locallab.spots.at(i).wavMethod == "D4") {
r->wavMethod = 1; r.wavMethod = 1;
} else if (pp->locallab.spots.at(i).wavMethod == "D6") { } else if (pp->locallab.spots.at(i).wavMethod == "D6") {
r->wavMethod = 2; r.wavMethod = 2;
} else if (pp->locallab.spots.at(i).wavMethod == "D10") { } else if (pp->locallab.spots.at(i).wavMethod == "D10") {
r->wavMethod = 3; r.wavMethod = 3;
} else if (pp->locallab.spots.at(i).wavMethod == "D14") { } else if (pp->locallab.spots.at(i).wavMethod == "D14") {
r->wavMethod = 4; r.wavMethod = 4;
} }
expsettings->addControlSpot(r); expsettings->addControlSpot(r);
@ -401,7 +401,6 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
const int spotPanelEvent = expsettings->getEventType(); const int spotPanelEvent = expsettings->getEventType();
int spotIndex; int spotIndex;
ControlSpotPanel::SpotRow* r;
rtengine::procparams::LocallabParams::LocallabSpot* newSpot; rtengine::procparams::LocallabParams::LocallabSpot* newSpot;
int imW, imH; // Size of image int imW, imH; // Size of image
@ -412,57 +411,57 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
int toolNb; int toolNb;
switch (spotPanelEvent) { switch (spotPanelEvent) {
case (ControlSpotPanel::SpotCreation): // Spot creation event case (ControlSpotPanel::SpotCreation): { // Spot creation event
// Spot creation (default initialization) // Spot creation (default initialization)
newSpot = new LocallabParams::LocallabSpot(); newSpot = new LocallabParams::LocallabSpot();
r = new ControlSpotPanel::SpotRow(); ControlSpotPanel::SpotRow r;
r->name = newSpot->name = M("TP_LOCALLAB_SPOTNAME"); r.name = newSpot->name = M("TP_LOCALLAB_SPOTNAME");
r->isvisible = newSpot->isvisible; r.isvisible = newSpot->isvisible;
if (newSpot->shape == "ELI") { if (newSpot->shape == "ELI") {
r->shape = 0; r.shape = 0;
} else { } else {
r->shape = 1; r.shape = 1;
} }
if (newSpot->prevMethod == "hide") { if (newSpot->prevMethod == "hide") {
r->prevMethod = 0; r.prevMethod = 0;
} else { } else {
r->prevMethod = 1; r.prevMethod = 1;
} }
if (newSpot->spotMethod == "norm") { if (newSpot->spotMethod == "norm") {
r->spotMethod = 0; r.spotMethod = 0;
} else if(newSpot->spotMethod == "exc") { } else if(newSpot->spotMethod == "exc") {
r->spotMethod = 1; r.spotMethod = 1;
} else if(newSpot->spotMethod == "full") { } else if(newSpot->spotMethod == "full") {
r->spotMethod = 2; r.spotMethod = 2;
} }
r->sensiexclu = newSpot->sensiexclu; r.sensiexclu = newSpot->sensiexclu;
r->structexclu = newSpot->structexclu; r.structexclu = newSpot->structexclu;
if (newSpot->shapeMethod == "IND") { if (newSpot->shapeMethod == "IND") {
r->shapeMethod = 0; r.shapeMethod = 0;
} else if (newSpot->shapeMethod == "SYM") { } else if (newSpot->shapeMethod == "SYM") {
r->shapeMethod = 1; r.shapeMethod = 1;
} else if (newSpot->shapeMethod == "INDSL") { } else if (newSpot->shapeMethod == "INDSL") {
r->shapeMethod = 2; r.shapeMethod = 2;
} else { } else {
r->shapeMethod = 3; r.shapeMethod = 3;
} }
if (newSpot->avoidgamutMethod == "NONE") { if (newSpot->avoidgamutMethod == "NONE") {
r->avoidgamutMethod = 0; r.avoidgamutMethod = 0;
} else if (newSpot->avoidgamutMethod == "LAB") { } else if (newSpot->avoidgamutMethod == "LAB") {
r->avoidgamutMethod = 1; r.avoidgamutMethod = 1;
} else if (newSpot->avoidgamutMethod == "XYZ") { } else if (newSpot->avoidgamutMethod == "XYZ") {
r->avoidgamutMethod = 2; r.avoidgamutMethod = 2;
} else if (newSpot->avoidgamutMethod == "XYZREL") { } else if (newSpot->avoidgamutMethod == "XYZREL") {
r->avoidgamutMethod = 3; r.avoidgamutMethod = 3;
} else if (newSpot->avoidgamutMethod == "MUNS") { } else if (newSpot->avoidgamutMethod == "MUNS") {
r->avoidgamutMethod = 4; r.avoidgamutMethod = 4;
} }
// Calculate spot size and center position according to preview area // Calculate spot size and center position according to preview area
@ -483,63 +482,63 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
} }
} }
r->locX = newSpot->loc.at(0); r.locX = newSpot->loc.at(0);
r->locXL = newSpot->loc.at(1); r.locXL = newSpot->loc.at(1);
r->locY = newSpot->loc.at(2); r.locY = newSpot->loc.at(2);
r->locYT = newSpot->loc.at(3); r.locYT = newSpot->loc.at(3);
r->centerX = newSpot->centerX; r.centerX = newSpot->centerX;
r->centerY = newSpot->centerY; r.centerY = newSpot->centerY;
r->circrad = newSpot->circrad; r.circrad = newSpot->circrad;
if (newSpot->qualityMethod == "enh") { if (newSpot->qualityMethod == "enh") {
r->qualityMethod = 0; r.qualityMethod = 0;
} else { } else {
r->qualityMethod = 1; r.qualityMethod = 1;
} }
r->transit = newSpot->transit; r.transit = newSpot->transit;
r->transitweak = newSpot->transitweak; r.transitweak = newSpot->transitweak;
r->transitgrad = newSpot->transitgrad; r.transitgrad = newSpot->transitgrad;
r->feather = newSpot->feather; r.feather = newSpot->feather;
r->struc = newSpot->struc; r.struc = newSpot->struc;
r->thresh = newSpot->thresh; r.thresh = newSpot->thresh;
r->iter = newSpot->iter; r.iter = newSpot->iter;
r->balan = newSpot->balan; r.balan = newSpot->balan;
r->balanh = newSpot->balanh; r.balanh = newSpot->balanh;
r->colorde = newSpot->colorde; r.colorde = newSpot->colorde;
r->colorscope = newSpot->colorscope; r.colorscope = newSpot->colorscope;
r->avoidrad = newSpot->avoidrad; r.avoidrad = newSpot->avoidrad;
r->hishow = newSpot->hishow; r.hishow = newSpot->hishow;
r->activ = newSpot->activ; r.activ = newSpot->activ;
r->blwh = newSpot->blwh; r.blwh = newSpot->blwh;
r->recurs = newSpot->recurs; r.recurs = newSpot->recurs;
r->laplac = newSpot->laplac; r.laplac = newSpot->laplac;
r->deltae = newSpot->deltae; r.deltae = newSpot->deltae;
r->scopemask = newSpot->scopemask; r.scopemask = newSpot->scopemask;
r->denoichmask = newSpot->denoichmask; r.denoichmask = newSpot->denoichmask;
r->shortc = newSpot->shortc; r.shortc = newSpot->shortc;
r->lumask = newSpot->lumask; r.lumask = newSpot->lumask;
//r->savrest = newSpot->savrest; //r.savrest = newSpot->savrest;
if (newSpot->complexMethod == "sim") { if (newSpot->complexMethod == "sim") {
r->complexMethod = 0; r.complexMethod = 0;
} else if (newSpot->complexMethod == "mod") { } else if (newSpot->complexMethod == "mod") {
r->complexMethod = 1; r.complexMethod = 1;
} else if (newSpot->complexMethod == "all") { } else if (newSpot->complexMethod == "all") {
r->complexMethod = 2; r.complexMethod = 2;
} }
if (newSpot->wavMethod == "D2") { if (newSpot->wavMethod == "D2") {
r->wavMethod = 0; r.wavMethod = 0;
} else if (newSpot->wavMethod == "D4") { } else if (newSpot->wavMethod == "D4") {
r->wavMethod = 1; r.wavMethod = 1;
} else if (newSpot->wavMethod == "D6") { } else if (newSpot->wavMethod == "D6") {
r->wavMethod = 2; r.wavMethod = 2;
} else if (newSpot->wavMethod == "D10") { } else if (newSpot->wavMethod == "D10") {
r->wavMethod = 3; r.wavMethod = 3;
} else if (newSpot->wavMethod == "D14") { } else if (newSpot->wavMethod == "D14") {
r->wavMethod = 4; r.wavMethod = 4;
} }
expsettings->addControlSpot(r); expsettings->addControlSpot(r);
@ -584,6 +583,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
// Note: No need to manage pedited as batch mode is deactivated for Locallab // Note: No need to manage pedited as batch mode is deactivated for Locallab
break; break;
}
case (ControlSpotPanel::SpotDeletion): // Spot deletion event case (ControlSpotPanel::SpotDeletion): // Spot deletion event
// Get deleted spot index in ProcParams and update it // Get deleted spot index in ProcParams and update it
@ -724,7 +724,7 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
break; break;
case (ControlSpotPanel::SpotDuplication): // Spot duplication event case (ControlSpotPanel::SpotDuplication): { // Spot duplication event
newSpot = nullptr; newSpot = nullptr;
spotIndex = expsettings->getSelectedSpot(); spotIndex = expsettings->getSelectedSpot();
@ -740,53 +740,53 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
} }
// Spot creation (initialization at currently selected spot) // Spot creation (initialization at currently selected spot)
r = new ControlSpotPanel::SpotRow(); ControlSpotPanel::SpotRow r;
r->name = newSpot->name = newSpot->name + " - " + M("TP_LOCALLAB_DUPLSPOTNAME"); r.name = newSpot->name = newSpot->name + " - " + M("TP_LOCALLAB_DUPLSPOTNAME");
r->isvisible = newSpot->isvisible; r.isvisible = newSpot->isvisible;
if (newSpot->shape == "ELI") { if (newSpot->shape == "ELI") {
r->shape = 0; r.shape = 0;
} else { } else {
r->shape = 1; r.shape = 1;
} }
if (newSpot->prevMethod == "hide") { if (newSpot->prevMethod == "hide") {
r->prevMethod = 0; r.prevMethod = 0;
} else { } else {
r->prevMethod = 1; r.prevMethod = 1;
} }
if (newSpot->spotMethod == "norm") { if (newSpot->spotMethod == "norm") {
r->spotMethod = 0; r.spotMethod = 0;
} else if (newSpot->spotMethod == "exc") { } else if (newSpot->spotMethod == "exc") {
r->spotMethod = 1; r.spotMethod = 1;
} else if (newSpot->spotMethod == "full") { } else if (newSpot->spotMethod == "full") {
r->spotMethod = 2; r.spotMethod = 2;
} }
r->sensiexclu = newSpot->sensiexclu; r.sensiexclu = newSpot->sensiexclu;
r->structexclu = newSpot->structexclu; r.structexclu = newSpot->structexclu;
if (newSpot->shapeMethod == "IND") { if (newSpot->shapeMethod == "IND") {
r->shapeMethod = 0; r.shapeMethod = 0;
} else if (newSpot->shapeMethod == "SYM") { } else if (newSpot->shapeMethod == "SYM") {
r->shapeMethod = 1; r.shapeMethod = 1;
} else if (newSpot->shapeMethod == "INDSL") { } else if (newSpot->shapeMethod == "INDSL") {
r->shapeMethod = 2; r.shapeMethod = 2;
} else { } else {
r->shapeMethod = 3; r.shapeMethod = 3;
} }
//printf("n0=%f n1=%f n2=%f n3=%f\n", (double) newSpot->loc.at(0), (double) newSpot->loc.at(1), (double) newSpot->loc.at(2), (double) newSpot->loc.at(3)); //printf("n0=%f n1=%f n2=%f n3=%f\n", (double) newSpot->loc.at(0), (double) newSpot->loc.at(1), (double) newSpot->loc.at(2), (double) newSpot->loc.at(3));
if (newSpot->avoidgamutMethod == "NONE") { if (newSpot->avoidgamutMethod == "NONE") {
r->avoidgamutMethod = 0; r.avoidgamutMethod = 0;
} else if (newSpot->avoidgamutMethod == "LAB") { } else if (newSpot->avoidgamutMethod == "LAB") {
r->avoidgamutMethod = 1; r.avoidgamutMethod = 1;
} else if (newSpot->avoidgamutMethod== "XYZ") { } else if (newSpot->avoidgamutMethod== "XYZ") {
r->avoidgamutMethod = 2; r.avoidgamutMethod = 2;
} else if (newSpot->avoidgamutMethod== "XYZREL") { } else if (newSpot->avoidgamutMethod== "XYZREL") {
r->avoidgamutMethod = 3; r.avoidgamutMethod = 3;
} else if (newSpot->avoidgamutMethod== "MUNS") { } else if (newSpot->avoidgamutMethod== "MUNS") {
r->avoidgamutMethod = 4; r.avoidgamutMethod = 4;
} }
//printf("n0=%f n1=%f n2=%f n3=%f\n", (double) newSpot->loc.at(0), (double) newSpot->loc.at(1), (double) newSpot->loc.at(2), (double) newSpot->loc.at(3)); //printf("n0=%f n1=%f n2=%f n3=%f\n", (double) newSpot->loc.at(0), (double) newSpot->loc.at(1), (double) newSpot->loc.at(2), (double) newSpot->loc.at(3));
@ -810,70 +810,70 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
} }
} }
if(r->spotMethod != 2) { if(r.spotMethod != 2) {
r->locX = newSpot->loc.at(0); r.locX = newSpot->loc.at(0);
r->locXL = newSpot->loc.at(1); r.locXL = newSpot->loc.at(1);
r->locY = newSpot->loc.at(2); r.locY = newSpot->loc.at(2);
r->locYT = newSpot->loc.at(3); r.locYT = newSpot->loc.at(3);
} else { } else {
r->locX = 3000.; r.locX = 3000.;
r->locXL = 3000.; r.locXL = 3000.;
r->locY = 3000.; r.locY = 3000.;
r->locYT = 3000.; r.locYT = 3000.;
} }
r->centerX = newSpot->centerX; r.centerX = newSpot->centerX;
r->centerY = newSpot->centerY; r.centerY = newSpot->centerY;
r->circrad = newSpot->circrad; r.circrad = newSpot->circrad;
if (newSpot->qualityMethod == "enh") { if (newSpot->qualityMethod == "enh") {
r->qualityMethod = 0; r.qualityMethod = 0;
} else { } else {
r->qualityMethod = 1; r.qualityMethod = 1;
} }
r->transit = newSpot->transit; r.transit = newSpot->transit;
r->transitweak = newSpot->transitweak; r.transitweak = newSpot->transitweak;
r->transitgrad = newSpot->transitgrad; r.transitgrad = newSpot->transitgrad;
r->feather = newSpot->feather; r.feather = newSpot->feather;
r->struc = newSpot->struc; r.struc = newSpot->struc;
r->thresh = newSpot->thresh; r.thresh = newSpot->thresh;
r->iter = newSpot->iter; r.iter = newSpot->iter;
r->balan = newSpot->balan; r.balan = newSpot->balan;
r->balanh = newSpot->balanh; r.balanh = newSpot->balanh;
r->colorde = newSpot->colorde; r.colorde = newSpot->colorde;
r->colorscope = newSpot->colorscope; r.colorscope = newSpot->colorscope;
r->avoidrad = newSpot->avoidrad; r.avoidrad = newSpot->avoidrad;
r->activ = newSpot->activ; r.activ = newSpot->activ;
r->blwh = newSpot->blwh; r.blwh = newSpot->blwh;
r->recurs = newSpot->recurs; r.recurs = newSpot->recurs;
r->laplac = newSpot->laplac; r.laplac = newSpot->laplac;
r->deltae = newSpot->deltae; r.deltae = newSpot->deltae;
r->scopemask = newSpot->scopemask; r.scopemask = newSpot->scopemask;
r->denoichmask = newSpot->denoichmask; r.denoichmask = newSpot->denoichmask;
r->shortc = newSpot->shortc; r.shortc = newSpot->shortc;
r->lumask = newSpot->lumask; r.lumask = newSpot->lumask;
//r->savrest = newSpot->savrest; //r.savrest = newSpot->savrest;
if (newSpot->complexMethod == "sim") { if (newSpot->complexMethod == "sim") {
r->complexMethod = 0; r.complexMethod = 0;
} else if (newSpot->complexMethod == "mod") { } else if (newSpot->complexMethod == "mod") {
r->complexMethod = 1; r.complexMethod = 1;
} else if (newSpot->complexMethod == "all") { } else if (newSpot->complexMethod == "all") {
r->complexMethod = 2; r.complexMethod = 2;
} }
if (newSpot->wavMethod == "D2") { if (newSpot->wavMethod == "D2") {
r->wavMethod = 0; r.wavMethod = 0;
} else if (newSpot->wavMethod == "D4") { } else if (newSpot->wavMethod == "D4") {
r->wavMethod = 1; r.wavMethod = 1;
} else if (newSpot->wavMethod == "D6") { } else if (newSpot->wavMethod == "D6") {
r->wavMethod = 2; r.wavMethod = 2;
} else if (newSpot->wavMethod == "D10") { } else if (newSpot->wavMethod == "D10") {
r->wavMethod = 3; r.wavMethod = 3;
} else if (newSpot->wavMethod == "D14") { } else if (newSpot->wavMethod == "D14") {
r->wavMethod = 4; r.wavMethod = 4;
} }
expsettings->addControlSpot(r); expsettings->addControlSpot(r);
@ -915,9 +915,10 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
// Note: No need to manage pedited as batch mode is deactivated for Locallab // Note: No need to manage pedited as batch mode is deactivated for Locallab
break; break;
}
case (ControlSpotPanel::SpotAllVisibilityChanged): // Event when updating visibility of all spots case (ControlSpotPanel::SpotAllVisibilityChanged): { // Event when updating visibility of all spots
r = expsettings->getSpot(expsettings->getSelectedSpot()); const auto r = expsettings->getSpot(expsettings->getSelectedSpot());
// ProcParams update // ProcParams update
for (size_t i = 0; i < pp->locallab.spots.size(); i++) { for (size_t i = 0; i < pp->locallab.spots.size(); i++) {
@ -927,10 +928,11 @@ void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited
// Note: No need to manage pedited as batch mode is deactivated for Locallab // Note: No need to manage pedited as batch mode is deactivated for Locallab
break; break;
}
default: // Spot or locallab GUI updated default: // Spot or locallab GUI updated
if (pp->locallab.spots.size() > 0) { if (pp->locallab.spots.size() > 0) {
r = expsettings->getSpot(expsettings->getSelectedSpot()); const auto r = expsettings->getSpot(expsettings->getSelectedSpot());
// ProcParams update // ProcParams update
if (pp->locallab.selspot < (int)pp->locallab.spots.size()) { if (pp->locallab.selspot < (int)pp->locallab.spots.size()) {

View File

@ -17,6 +17,7 @@
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>. * along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <memory>
#include <set> #include <set>
#include "cachemanager.h" #include "cachemanager.h"
#include "filebrowserentry.h" #include "filebrowserentry.h"
@ -81,10 +82,10 @@ public:
int threadCount = 2; int threadCount = 2;
#endif #endif
threadPool_ = new Glib::ThreadPool(threadCount, 0); threadPool_.reset(new Glib::ThreadPool(threadCount, 0));
} }
Glib::ThreadPool* threadPool_; std::unique_ptr<Glib::ThreadPool> threadPool_;
MyMutex mutex_; MyMutex mutex_;
JobSet jobs_; JobSet jobs_;
gint nConcurrentThreads; gint nConcurrentThreads;

View File

@ -18,6 +18,7 @@
*/ */
#include <atomic> #include <atomic>
#include <memory>
#include <set> #include <set>
#include <gtkmm.h> #include <gtkmm.h>
@ -83,10 +84,10 @@ public:
threadCount = omp_get_num_procs(); threadCount = omp_get_num_procs();
#endif #endif
threadPool_ = new Glib::ThreadPool(threadCount, 0); threadPool_.reset(new Glib::ThreadPool(threadCount, 0));
} }
Glib::ThreadPool* threadPool_; std::unique_ptr<Glib::ThreadPool> threadPool_;
// Need to be a std::mutex because used in a std::condition_variable object... // Need to be a std::mutex because used in a std::condition_variable object...
// This is the only exceptions along with GThreadMutex (guiutils.cc), MyMutex is used everywhere else // This is the only exceptions along with GThreadMutex (guiutils.cc), MyMutex is used everywhere else