diff --git a/core/dplugins/editor/enhance/hotpixels/hotpixelstool.cpp b/core/dplugins/editor/enhance/hotpixels/hotpixelstool.cpp index 6bce451047..524fbf73d8 100644 --- a/core/dplugins/editor/enhance/hotpixels/hotpixelstool.cpp +++ b/core/dplugins/editor/enhance/hotpixels/hotpixelstool.cpp @@ -1,301 +1,311 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2005-03-27 * Description : a digiKam image tool for fixing dots produced by * hot/stuck/dead pixels from a CCD. * * Copyright (C) 2005-2020 by Gilles Caulier * Copyright (C) 2005-2006 by Unai Garro * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #include "hotpixelstool.h" // Qt includes #include #include #include #include #include #include #include #include // KDE includes #include #include #include "kconfiggroup.h" // Local includes #include "blackframelistview.h" #include "dcombobox.h" #include "daboutdata.h" #include "dimg.h" #include "dimgfiltermanager.h" #include "editortooliface.h" #include "editortoolsettings.h" #include "hotpixelfixer.h" #include "imagedialog.h" #include "imageiface.h" #include "imageregionwidget.h" namespace DigikamEditorHotPixelsToolPlugin { class Q_DECL_HIDDEN HotPixelsTool::Private { public: explicit Private() : blackFrameButton(nullptr), progressBar(nullptr), filterMethodCombo(nullptr), blackFrameListView(nullptr), previewWidget(nullptr), gboxSettings(nullptr) { } static const QString configGroupName; static const QString configLastBlackFrameFileEntry; static const QString configFilterMethodEntry; QPushButton* blackFrameButton; QProgressBar* progressBar; QList hotPixelsList; QUrl blackFrameURL; DComboBox* filterMethodCombo; BlackFrameListView* blackFrameListView; ImageRegionWidget* previewWidget; EditorToolSettings* gboxSettings; }; const QString HotPixelsTool::Private::configGroupName(QLatin1String("hotpixels Tool")); const QString HotPixelsTool::Private::configLastBlackFrameFileEntry(QLatin1String("Last Black Frame File")); const QString HotPixelsTool::Private::configFilterMethodEntry(QLatin1String("Filter Method")); // -------------------------------------------------------- HotPixelsTool::HotPixelsTool(QObject* const parent) : EditorToolThreaded(parent), d(new Private) { setObjectName(QLatin1String("hotpixels")); setToolName(i18n("Hot Pixels")); setToolIcon(QIcon::fromTheme(QLatin1String("hotpixels"))); // ------------------------------------------------------------- d->gboxSettings = new EditorToolSettings(nullptr); d->gboxSettings->setButtons(EditorToolSettings::Default| EditorToolSettings::Ok| EditorToolSettings::Cancel| EditorToolSettings::Try); QGridLayout* const grid = new QGridLayout(d->gboxSettings->plainPage()); QLabel* const filterMethodLabel = new QLabel(i18n("Filter:"), d->gboxSettings->plainPage()); d->filterMethodCombo = new DComboBox(d->gboxSettings->plainPage()); d->filterMethodCombo->addItem(i18nc("average filter mode", "Average")); d->filterMethodCombo->addItem(i18nc("linear filter mode", "Linear")); d->filterMethodCombo->addItem(i18nc("quadratic filter mode", "Quadratic")); d->filterMethodCombo->addItem(i18nc("cubic filter mode", "Cubic")); d->filterMethodCombo->setDefaultIndex(HotPixelFixer::QUADRATIC_INTERPOLATION); d->blackFrameButton = new QPushButton(i18n("Black Frame..."), d->gboxSettings->plainPage()); d->blackFrameButton->setIcon(QIcon::fromTheme(QLatin1String("document-open"))); d->blackFrameButton->setWhatsThis(i18n("Use this button to add a new black frame file which will " "be used by the hot pixels removal filter.") ); d->blackFrameListView = new BlackFrameListView(d->gboxSettings->plainPage()); // ------------------------------------------------------------- const int spacing = d->gboxSettings->spacingHint(); grid->addWidget(filterMethodLabel, 0, 0, 1, 1); grid->addWidget(d->filterMethodCombo, 0, 1, 1, 1); grid->addWidget(d->blackFrameButton, 0, 2, 1, 1); grid->addWidget(d->blackFrameListView, 1, 0, 2, 3); grid->setRowStretch(3, 10); grid->setContentsMargins(spacing, spacing, spacing, spacing); grid->setSpacing(spacing); // ------------------------------------------------------------- d->previewWidget = new ImageRegionWidget; setToolSettings(d->gboxSettings); setToolView(d->previewWidget); setPreviewModeMask(PreviewToolBar::AllPreviewModes); // ------------------------------------------------------------- connect(d->filterMethodCombo, SIGNAL(activated(int)), this, SLOT(slotPreview())); connect(d->blackFrameButton, SIGNAL(clicked()), this, SLOT(slotAddBlackFrame())); connect(d->blackFrameListView, SIGNAL(signalBlackFrameSelected(QList,QUrl)), this, SLOT(slotBlackFrame(QList,QUrl))); } HotPixelsTool::~HotPixelsTool() { delete d; } void HotPixelsTool::registerFilter() { DImgFilterManager::instance()->addGenerator(new BasicDImgFilterGenerator()); } +#ifndef __clang_analyzer__ +// NOTE: disable false positive report from scan build about "item" instance creation + void HotPixelsTool::readSettings() { KSharedConfig::Ptr config = KSharedConfig::openConfig(); KConfigGroup group = config->group(d->configGroupName); d->blackFrameURL = QUrl::fromLocalFile(group.readEntry(d->configLastBlackFrameFileEntry, QString())); d->filterMethodCombo->setCurrentIndex(group.readEntry(d->configFilterMethodEntry, d->filterMethodCombo->defaultIndex())); if (d->blackFrameURL.isValid()) { EditorToolIface::editorToolIface()->setToolStartProgress(i18n("Loading: ")); QPointer item = new BlackFrameListViewItem(d->blackFrameListView, d->blackFrameURL); connect(item, SIGNAL(signalLoadingProgress(float)), this, SLOT(slotLoadingProgress(float))); connect(item, SIGNAL(signalLoadingComplete()), this, SLOT(slotLoadingComplete())); } } +#endif + void HotPixelsTool::writeSettings() { KSharedConfig::Ptr config = KSharedConfig::openConfig(); KConfigGroup group = config->group(d->configGroupName); group.writeEntry(d->configLastBlackFrameFileEntry, d->blackFrameURL.url()); group.writeEntry(d->configFilterMethodEntry, d->filterMethodCombo->currentIndex()); group.sync(); } void HotPixelsTool::slotLoadingProgress(float v) { EditorToolIface::editorToolIface()->setToolProgress((int)(v*100)); } void HotPixelsTool::slotLoadingComplete() { EditorToolIface::editorToolIface()->setToolStopProgress(); } void HotPixelsTool::slotResetSettings() { d->filterMethodCombo->blockSignals(true); d->filterMethodCombo->slotReset(); d->filterMethodCombo->blockSignals(false); } +#ifndef __clang_analyzer__ +// NOTE: disable false positive report from scan build about "item" instance creation + void HotPixelsTool::slotAddBlackFrame() { QUrl url = ImageDialog::getImageURL(qApp->activeWindow(), d->blackFrameURL, i18n("Select Black Frame Image")); if (!url.isEmpty()) { // Load the selected file and insert into the list. - d->blackFrameURL = url; + d->blackFrameURL = url; d->blackFrameListView->clear(); QPointer item = new BlackFrameListViewItem(d->blackFrameListView, d->blackFrameURL); connect(item, SIGNAL(signalLoadingProgress(float)), this, SLOT(slotLoadingProgress(float))); connect(item, SIGNAL(signalLoadingComplete()), this, SLOT(slotLoadingComplete())); } } +#endif + void HotPixelsTool::preparePreview() { DImg image = d->previewWidget->getOriginalRegionImage(); int interpolationMethod = d->filterMethodCombo->currentIndex(); QList hotPixelsRegion; QRect area = d->previewWidget->getOriginalImageRegionToRender(); for (QList::const_iterator it = d->hotPixelsList.constBegin() ; it != d->hotPixelsList.constEnd() ; ++it) { HotPixel hp = (*it); if (area.contains( hp.rect )) { hp.rect.moveTopLeft(QPoint( hp.rect.x()-area.x(), hp.rect.y()-area.y() )); hotPixelsRegion.append(hp); } } setFilter(dynamic_cast(new HotPixelFixer(&image, this, hotPixelsRegion, interpolationMethod))); } void HotPixelsTool::prepareFinal() { int interpolationMethod = d->filterMethodCombo->currentIndex(); ImageIface iface; setFilter(dynamic_cast(new HotPixelFixer(iface.original(), this, d->hotPixelsList, interpolationMethod))); } void HotPixelsTool::setPreviewImage() { d->previewWidget->setPreviewImage(filter()->getTargetImage()); } void HotPixelsTool::setFinalImage() { ImageIface iface; iface.setOriginal(i18n("Hot Pixels Correction"), filter()->filterAction(), filter()->getTargetImage()); } void HotPixelsTool::slotBlackFrame(const QList& hpList, const QUrl& blackFrameURL) { d->blackFrameURL = blackFrameURL; d->hotPixelsList = hpList; QPolygon pointList(d->hotPixelsList.size()); QList ::const_iterator it; int i = 0; for (it = d->hotPixelsList.constBegin() ; it != d->hotPixelsList.constEnd() ; ++it, ++i) { pointList.setPoint(i, (*it).rect.center()); } d->previewWidget->setHighLightPoints(pointList); slotPreview(); } } // namespace DigikamEditorHotPixelsToolPlugin