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:
@@ -660,7 +660,7 @@ void ControlSpotPanel::on_button_delete()
|
||||
nbSpotChanged_ = true;
|
||||
selSpotChanged_ = true;
|
||||
eventType = SpotDeletion;
|
||||
SpotRow* const delSpotRow = getSpot(selIndex);
|
||||
std::unique_ptr<SpotRow> const delSpotRow = getSpot(selIndex);
|
||||
listener->panelChanged(EvLocallabSpotDeleted, delSpotRow->name);
|
||||
}
|
||||
|
||||
@@ -682,7 +682,7 @@ void ControlSpotPanel::on_button_duplicate()
|
||||
nbSpotChanged_ = true;
|
||||
selSpotChanged_ = true;
|
||||
eventType = SpotDuplication;
|
||||
SpotRow* const duplSpotRow = getSpot(selIndex);
|
||||
std::unique_ptr<SpotRow> const duplSpotRow = getSpot(selIndex);
|
||||
listener->panelChanged(EvLocallabSpotCreated, M("TP_LOCALLAB_EV_DUPL") + " "
|
||||
+ duplSpotRow->name);
|
||||
}
|
||||
@@ -779,7 +779,7 @@ bool ControlSpotPanel::on_button_visibility(GdkEventButton* event)
|
||||
|
||||
// Raise event
|
||||
visibilityChanged_ = true;
|
||||
SpotRow* const spotRow = getSpot(getSelectedSpot());
|
||||
std::unique_ptr<SpotRow> const spotRow = getSpot(getSelectedSpot());
|
||||
|
||||
if (row[spots_.isvisible]) {
|
||||
listener->panelChanged(EvLocallabSpotVisibility, M("TP_LOCALLAB_EV_VIS") + " (" + spotRow->name + ")");
|
||||
@@ -896,7 +896,7 @@ void ControlSpotPanel::controlspotChanged()
|
||||
|
||||
selSpotChanged_ = true;
|
||||
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
|
||||
if (maskPrevActive || preview_->get_active()) {
|
||||
@@ -2535,13 +2535,16 @@ int ControlSpotPanel::getEventType()
|
||||
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);
|
||||
|
||||
MyMutex::MyLock lock(mTreeview);
|
||||
|
||||
SpotRow* r = new SpotRow();
|
||||
std::unique_ptr<SpotRow> r(new SpotRow());
|
||||
|
||||
int i = -1;
|
||||
|
||||
@@ -2676,58 +2679,58 @@ void ControlSpotPanel::resetDeltaEPreview()
|
||||
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);
|
||||
|
||||
disableParamlistener(true);
|
||||
Gtk::TreeModel::Row row = *(treemodel_->append());
|
||||
row[spots_.mouseover] = false;
|
||||
row[spots_.name] = newSpot->name;
|
||||
row[spots_.isvisible] = newSpot->isvisible;
|
||||
row[spots_.name] = newSpot.name;
|
||||
row[spots_.isvisible] = newSpot.isvisible;
|
||||
row[spots_.curveid] = 0; // No associated curve
|
||||
row[spots_.prevMethod] = newSpot->prevMethod;
|
||||
row[spots_.shape] = newSpot->shape;
|
||||
row[spots_.spotMethod] = newSpot->spotMethod;
|
||||
row[spots_.sensiexclu] = newSpot->sensiexclu;
|
||||
row[spots_.structexclu] = newSpot->structexclu;
|
||||
row[spots_.shapeMethod] = newSpot->shapeMethod;
|
||||
row[spots_.locX] = newSpot->locX;
|
||||
row[spots_.locXL] = newSpot->locXL;
|
||||
row[spots_.locY] = newSpot->locY;
|
||||
row[spots_.locYT] = newSpot->locYT;
|
||||
row[spots_.centerX] = newSpot->centerX;
|
||||
row[spots_.centerY] = newSpot->centerY;
|
||||
row[spots_.circrad] = newSpot->circrad;
|
||||
row[spots_.qualityMethod] = newSpot->qualityMethod;
|
||||
row[spots_.transit] = newSpot->transit;
|
||||
row[spots_.transitweak] = newSpot->transitweak;
|
||||
row[spots_.transitgrad] = newSpot->transitgrad;
|
||||
row[spots_.feather] = newSpot->feather;
|
||||
row[spots_.struc] = newSpot->struc;
|
||||
row[spots_.thresh] = newSpot->thresh;
|
||||
row[spots_.iter] = newSpot->iter;
|
||||
row[spots_.balan] = newSpot->balan;
|
||||
row[spots_.balanh] = newSpot->balanh;
|
||||
row[spots_.colorde] = newSpot->colorde;
|
||||
row[spots_.colorscope] = newSpot->colorscope;
|
||||
row[spots_.avoidrad] = newSpot->avoidrad;
|
||||
row[spots_.hishow] = newSpot->hishow;
|
||||
row[spots_.activ] = newSpot->activ;
|
||||
row[spots_.blwh] = newSpot->blwh;
|
||||
row[spots_.recurs] = newSpot->recurs;
|
||||
row[spots_.laplac] = newSpot->laplac;
|
||||
row[spots_.deltae] = newSpot->deltae;
|
||||
row[spots_.scopemask] = newSpot->scopemask;
|
||||
row[spots_.denoichmask] = newSpot->denoichmask;
|
||||
row[spots_.shortc] = newSpot->shortc;
|
||||
row[spots_.lumask] = newSpot->lumask;
|
||||
//row[spots_.savrest] = newSpot->savrest;
|
||||
row[spots_.complexMethod] = newSpot->complexMethod;
|
||||
row[spots_.wavMethod] = newSpot->wavMethod;
|
||||
row[spots_.avoidgamutMethod] = newSpot->avoidgamutMethod;
|
||||
row[spots_.prevMethod] = newSpot.prevMethod;
|
||||
row[spots_.shape] = newSpot.shape;
|
||||
row[spots_.spotMethod] = newSpot.spotMethod;
|
||||
row[spots_.sensiexclu] = newSpot.sensiexclu;
|
||||
row[spots_.structexclu] = newSpot.structexclu;
|
||||
row[spots_.shapeMethod] = newSpot.shapeMethod;
|
||||
row[spots_.locX] = newSpot.locX;
|
||||
row[spots_.locXL] = newSpot.locXL;
|
||||
row[spots_.locY] = newSpot.locY;
|
||||
row[spots_.locYT] = newSpot.locYT;
|
||||
row[spots_.centerX] = newSpot.centerX;
|
||||
row[spots_.centerY] = newSpot.centerY;
|
||||
row[spots_.circrad] = newSpot.circrad;
|
||||
row[spots_.qualityMethod] = newSpot.qualityMethod;
|
||||
row[spots_.transit] = newSpot.transit;
|
||||
row[spots_.transitweak] = newSpot.transitweak;
|
||||
row[spots_.transitgrad] = newSpot.transitgrad;
|
||||
row[spots_.feather] = newSpot.feather;
|
||||
row[spots_.struc] = newSpot.struc;
|
||||
row[spots_.thresh] = newSpot.thresh;
|
||||
row[spots_.iter] = newSpot.iter;
|
||||
row[spots_.balan] = newSpot.balan;
|
||||
row[spots_.balanh] = newSpot.balanh;
|
||||
row[spots_.colorde] = newSpot.colorde;
|
||||
row[spots_.colorscope] = newSpot.colorscope;
|
||||
row[spots_.avoidrad] = newSpot.avoidrad;
|
||||
row[spots_.hishow] = newSpot.hishow;
|
||||
row[spots_.activ] = newSpot.activ;
|
||||
row[spots_.blwh] = newSpot.blwh;
|
||||
row[spots_.recurs] = newSpot.recurs;
|
||||
row[spots_.laplac] = newSpot.laplac;
|
||||
row[spots_.deltae] = newSpot.deltae;
|
||||
row[spots_.scopemask] = newSpot.scopemask;
|
||||
row[spots_.denoichmask] = newSpot.denoichmask;
|
||||
row[spots_.shortc] = newSpot.shortc;
|
||||
row[spots_.lumask] = newSpot.lumask;
|
||||
//row[spots_.savrest] = newSpot.savrest;
|
||||
row[spots_.complexMethod] = newSpot.complexMethod;
|
||||
row[spots_.wavMethod] = newSpot.wavMethod;
|
||||
row[spots_.avoidgamutMethod] = newSpot.avoidgamutMethod;
|
||||
updateParamVisibility();
|
||||
disableParamlistener(false);
|
||||
|
||||
|
Reference in New Issue
Block a user