1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : a tool to sharp an image
9
* Copyright (C) 2004-2010 by Gilles Caulier <caulier dot gilles at gmail dot com>
11
* This program is free software; you can redistribute it
12
* and/or modify it under the terms of the GNU General
13
* Public License as published by the Free Software Foundation;
14
* either version 2, or (at your option)
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU General Public License for more details.
22
* ============================================================ */
24
#include "sharpentool.moc"
32
#include <QGridLayout>
37
#include <kaboutdata.h>
38
#include <kapplication.h>
41
#include <kfiledialog.h>
43
#include <kglobalsettings.h>
48
#include "sharpsettings.h"
49
#include "refocusfilter.h"
50
#include "sharpenfilter.h"
51
#include "unsharpmaskfilter.h"
52
#include "editortoolsettings.h"
53
#include "imageiface.h"
54
#include "imageregionwidget.h"
56
namespace DigikamEnhanceImagePlugin
65
configGroupName("sharpen Tool"),
71
const QString configGroupName;
73
SharpSettings* sharpSettings;
74
ImageRegionWidget* previewWidget;
75
EditorToolSettings* gboxSettings;
78
SharpenTool::SharpenTool(QObject* parent)
79
: EditorToolThreaded(parent),
80
d(new SharpenToolPriv)
82
setObjectName("sharpen");
83
setToolName(i18n("Sharpen"));
84
setToolIcon(SmallIcon("sharpenimage"));
85
setToolHelp("blursharpentool.anchor");
87
// -------------------------------------------------------------
89
d->gboxSettings = new EditorToolSettings;
90
d->gboxSettings->setButtons(EditorToolSettings::Default|
91
EditorToolSettings::Ok|
92
EditorToolSettings::Cancel|
93
EditorToolSettings::Load|
94
EditorToolSettings::SaveAs|
95
EditorToolSettings::Try);
97
d->previewWidget = new ImageRegionWidget;
99
d->sharpSettings = new SharpSettings(d->gboxSettings->plainPage());
100
setToolSettings(d->gboxSettings);
101
setToolView(d->previewWidget);
102
setPreviewModeMask(PreviewToolBar::AllPreviewModes);
104
connect(d->sharpSettings, SIGNAL(signalSettingsChanged()),
105
this, SLOT(slotSettingsChanged()));
110
SharpenTool::~SharpenTool()
115
void SharpenTool::slotSettingsChanged()
117
switch (d->sharpSettings->settings().method)
119
case SharpContainer::SimpleSharp:
121
d->gboxSettings->enableButton(EditorToolSettings::Load, false);
122
d->gboxSettings->enableButton(EditorToolSettings::SaveAs, false);
124
case SharpContainer::UnsharpMask:
126
d->gboxSettings->enableButton(EditorToolSettings::Load, false);
127
d->gboxSettings->enableButton(EditorToolSettings::SaveAs, false);
129
case SharpContainer::Refocus:
136
void SharpenTool::readSettings()
138
KSharedConfig::Ptr config = KGlobal::config();
139
KConfigGroup group = config->group(d->configGroupName);
140
d->sharpSettings->readSettings(group);
143
void SharpenTool::writeSettings()
145
KSharedConfig::Ptr config = KGlobal::config();
146
KConfigGroup group = config->group(d->configGroupName);
147
d->sharpSettings->writeSettings(group);
151
void SharpenTool::slotResetSettings()
153
d->sharpSettings->resetToDefault();
156
void SharpenTool::prepareEffect()
158
toolView()->setEnabled(false);
159
toolSettings()->setEnabled(false);
160
SharpContainer settings = d->sharpSettings->settings();
162
switch (settings.method)
164
case SharpContainer::SimpleSharp:
166
DImg img = d->previewWidget->getOriginalRegionImage();
167
double radius = settings.ssRadius/10.0;
170
if (radius < 1.0) sigma = radius;
171
else sigma = sqrt(radius);
173
setFilter(new SharpenFilter(&img, this, radius, sigma));
177
case SharpContainer::UnsharpMask:
179
DImg img = d->previewWidget->getOriginalRegionImage();
180
int r = (int)settings.umRadius;
181
double a = settings.umAmount;
182
double th = settings.umThreshold;
184
setFilter(new UnsharpMaskFilter(&img, this, r, a, th));
188
case SharpContainer::Refocus:
190
DImg img = d->previewWidget->getOriginalRegionImage();
191
double r = settings.rfRadius;
192
double c = settings.rfCorrelation;
193
double n = settings.rfNoise;
194
double g = settings.rfGauss;
195
int ms = settings.rfMatrix;
197
setFilter(new RefocusFilter(&img, this, ms, r, g, c, n));
203
void SharpenTool::putPreviewData()
205
DImg preview = filter()->getTargetImage();
206
d->previewWidget->setPreviewImage(preview);
209
void SharpenTool::prepareFinal()
211
ImageIface iface(0, 0);
212
toolView()->setEnabled(false);
213
toolSettings()->setEnabled(false);
214
SharpContainer settings = d->sharpSettings->settings();
216
switch (settings.method)
218
case SharpContainer::SimpleSharp:
220
double radius = settings.ssRadius/10.0;
223
if (radius < 1.0) sigma = radius;
224
else sigma = sqrt(radius);
226
setFilter(new SharpenFilter(iface.getOriginalImg(), this, radius, sigma));
230
case SharpContainer::UnsharpMask:
232
int r = (int)settings.umRadius;
233
double a = settings.umAmount;
234
double th = settings.umThreshold;
236
setFilter(new UnsharpMaskFilter(iface.getOriginalImg(), this, r, a, th));
240
case SharpContainer::Refocus:
242
double r = settings.rfRadius;
243
double c = settings.rfCorrelation;
244
double n = settings.rfNoise;
245
double g = settings.rfGauss;
246
int ms = settings.rfMatrix;
248
setFilter(new RefocusFilter(iface.getOriginalImg(), this, ms, r, g, c, n));
254
void SharpenTool::putFinalData()
256
ImageIface iface(0, 0);
257
SharpContainer settings = d->sharpSettings->settings();
259
switch (settings.method)
261
case SharpContainer::SimpleSharp:
263
iface.putOriginalImage(i18n("Sharpen"), filter()->getTargetImage().bits());
267
case SharpContainer::UnsharpMask:
269
iface.putOriginalImage(i18n("Unsharp Mask"), filter()->getTargetImage().bits());
273
case SharpContainer::Refocus:
275
iface.putOriginalImage(i18n("Refocus"), filter()->getTargetImage().bits());
281
void SharpenTool::renderingFinished()
283
kapp->restoreOverrideCursor();
284
toolView()->setEnabled(true);
285
toolSettings()->setEnabled(true);
286
slotSettingsChanged();
289
void SharpenTool::slotLoadSettings()
291
d->sharpSettings->loadSettings();
294
void SharpenTool::slotSaveAsSettings()
296
d->sharpSettings->saveAsSettings();
299
} // namespace DigikamEnhanceImagePlugin