~ubuntu-branches/ubuntu/saucy/digikam/saucy

« back to all changes in this revision

Viewing changes to imageplugins/enhance/sharpentool.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Christian Mangold
  • Date: 2010-04-09 21:30:01 UTC
  • mfrom: (1.2.28 upstream)
  • Revision ID: james.westby@ubuntu.com-20100409213001-4bfyibrd359rn7o3
Tags: 2:1.2.0-0ubuntu1
* New upstream release (LP: #560576)
* Remove all patches, fixed upstream
  - Remove quilt build-depend

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* ============================================================
 
2
 *
 
3
 * This file is a part of digiKam project
 
4
 * http://www.digikam.org
 
5
 *
 
6
 * Date        : 2004-07-09
 
7
 * Description : a tool to sharp an image
 
8
 *
 
9
 * Copyright (C) 2004-2010 by Gilles Caulier <caulier dot gilles at gmail dot com>
 
10
 *
 
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)
 
15
 * any later version.
 
16
 *
 
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.
 
21
 *
 
22
 * ============================================================ */
 
23
 
 
24
#include "sharpentool.moc"
 
25
 
 
26
// C++ includes
 
27
 
 
28
#include <cmath>
 
29
 
 
30
// Qt includes
 
31
 
 
32
#include <QGridLayout>
 
33
#include <QLabel>
 
34
 
 
35
// KDE includes
 
36
 
 
37
#include <kaboutdata.h>
 
38
#include <kapplication.h>
 
39
#include <kconfig.h>
 
40
#include <kcursor.h>
 
41
#include <kfiledialog.h>
 
42
#include <kglobal.h>
 
43
#include <kglobalsettings.h>
 
44
#include <klocale.h>
 
45
 
 
46
// Local includes
 
47
 
 
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"
 
55
 
 
56
namespace DigikamEnhanceImagePlugin
 
57
{
 
58
 
 
59
class SharpenToolPriv
 
60
{
 
61
 
 
62
public:
 
63
 
 
64
    SharpenToolPriv() :
 
65
        configGroupName("sharpen Tool"),
 
66
        sharpSettings(0),
 
67
        previewWidget(0),
 
68
        gboxSettings(0)
 
69
        {}
 
70
 
 
71
    const QString       configGroupName;
 
72
 
 
73
    SharpSettings*      sharpSettings;
 
74
    ImageRegionWidget*  previewWidget;
 
75
    EditorToolSettings* gboxSettings;
 
76
};
 
77
 
 
78
SharpenTool::SharpenTool(QObject* parent)
 
79
           : EditorToolThreaded(parent),
 
80
             d(new SharpenToolPriv)
 
81
{
 
82
    setObjectName("sharpen");
 
83
    setToolName(i18n("Sharpen"));
 
84
    setToolIcon(SmallIcon("sharpenimage"));
 
85
    setToolHelp("blursharpentool.anchor");
 
86
 
 
87
    // -------------------------------------------------------------
 
88
 
 
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);
 
96
 
 
97
    d->previewWidget = new ImageRegionWidget;
 
98
 
 
99
    d->sharpSettings = new SharpSettings(d->gboxSettings->plainPage());
 
100
    setToolSettings(d->gboxSettings);
 
101
    setToolView(d->previewWidget);
 
102
    setPreviewModeMask(PreviewToolBar::AllPreviewModes);
 
103
 
 
104
    connect(d->sharpSettings, SIGNAL(signalSettingsChanged()),
 
105
            this, SLOT(slotSettingsChanged()));
 
106
 
 
107
    init();
 
108
}
 
109
 
 
110
SharpenTool::~SharpenTool()
 
111
{
 
112
    delete d;
 
113
}
 
114
 
 
115
void SharpenTool::slotSettingsChanged()
 
116
{
 
117
    switch (d->sharpSettings->settings().method)
 
118
    {
 
119
        case SharpContainer::SimpleSharp:
 
120
        {
 
121
            d->gboxSettings->enableButton(EditorToolSettings::Load, false);
 
122
            d->gboxSettings->enableButton(EditorToolSettings::SaveAs, false);
 
123
        }
 
124
        case SharpContainer::UnsharpMask:
 
125
        {
 
126
            d->gboxSettings->enableButton(EditorToolSettings::Load, false);
 
127
            d->gboxSettings->enableButton(EditorToolSettings::SaveAs, false);
 
128
        }
 
129
        case SharpContainer::Refocus:
 
130
        {
 
131
            break;
 
132
        }
 
133
    }
 
134
}
 
135
 
 
136
void SharpenTool::readSettings()
 
137
{
 
138
    KSharedConfig::Ptr config = KGlobal::config();
 
139
    KConfigGroup group        = config->group(d->configGroupName);
 
140
    d->sharpSettings->readSettings(group);
 
141
}
 
142
 
 
143
void SharpenTool::writeSettings()
 
144
{
 
145
    KSharedConfig::Ptr config = KGlobal::config();
 
146
    KConfigGroup group        = config->group(d->configGroupName);
 
147
    d->sharpSettings->writeSettings(group);
 
148
    group.sync();
 
149
}
 
150
 
 
151
void SharpenTool::slotResetSettings()
 
152
{
 
153
    d->sharpSettings->resetToDefault();
 
154
}
 
155
 
 
156
void SharpenTool::prepareEffect()
 
157
{
 
158
    toolView()->setEnabled(false);
 
159
    toolSettings()->setEnabled(false);
 
160
    SharpContainer settings = d->sharpSettings->settings();
 
161
 
 
162
    switch (settings.method)
 
163
    {
 
164
        case SharpContainer::SimpleSharp:
 
165
        {
 
166
            DImg img      = d->previewWidget->getOriginalRegionImage();
 
167
            double radius = settings.ssRadius/10.0;
 
168
            double sigma;
 
169
 
 
170
            if (radius < 1.0) sigma = radius;
 
171
            else sigma = sqrt(radius);
 
172
 
 
173
            setFilter(new SharpenFilter(&img, this, radius, sigma));
 
174
            break;
 
175
        }
 
176
 
 
177
        case SharpContainer::UnsharpMask:
 
178
        {
 
179
            DImg img  = d->previewWidget->getOriginalRegionImage();
 
180
            int    r  = (int)settings.umRadius;
 
181
            double a  = settings.umAmount;
 
182
            double th = settings.umThreshold;
 
183
 
 
184
            setFilter(new UnsharpMaskFilter(&img, this, r, a, th));
 
185
            break;
 
186
        }
 
187
 
 
188
        case SharpContainer::Refocus:
 
189
        {
 
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;
 
196
 
 
197
            setFilter(new RefocusFilter(&img, this, ms, r, g, c, n));
 
198
            break;
 
199
        }
 
200
    }
 
201
}
 
202
 
 
203
void SharpenTool::putPreviewData()
 
204
{
 
205
    DImg preview = filter()->getTargetImage();
 
206
    d->previewWidget->setPreviewImage(preview);
 
207
}
 
208
 
 
209
void SharpenTool::prepareFinal()
 
210
{
 
211
    ImageIface iface(0, 0);
 
212
    toolView()->setEnabled(false);
 
213
    toolSettings()->setEnabled(false);
 
214
    SharpContainer settings = d->sharpSettings->settings();
 
215
 
 
216
    switch (settings.method)
 
217
    {
 
218
        case SharpContainer::SimpleSharp:
 
219
        {
 
220
            double radius = settings.ssRadius/10.0;
 
221
            double sigma;
 
222
 
 
223
            if (radius < 1.0) sigma = radius;
 
224
            else sigma = sqrt(radius);
 
225
 
 
226
            setFilter(new SharpenFilter(iface.getOriginalImg(), this, radius, sigma));
 
227
            break;
 
228
        }
 
229
 
 
230
        case SharpContainer::UnsharpMask:
 
231
        {
 
232
            int    r  = (int)settings.umRadius;
 
233
            double a  = settings.umAmount;
 
234
            double th = settings.umThreshold;
 
235
 
 
236
            setFilter(new UnsharpMaskFilter(iface.getOriginalImg(), this, r, a, th));
 
237
            break;
 
238
        }
 
239
 
 
240
        case SharpContainer::Refocus:
 
241
        {
 
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;
 
247
 
 
248
            setFilter(new RefocusFilter(iface.getOriginalImg(), this, ms, r, g, c, n));
 
249
            break;
 
250
        }
 
251
    }
 
252
}
 
253
 
 
254
void SharpenTool::putFinalData()
 
255
{
 
256
    ImageIface iface(0, 0);
 
257
    SharpContainer settings = d->sharpSettings->settings();
 
258
 
 
259
    switch (settings.method)
 
260
    {
 
261
        case SharpContainer::SimpleSharp:
 
262
        {
 
263
            iface.putOriginalImage(i18n("Sharpen"), filter()->getTargetImage().bits());
 
264
            break;
 
265
        }
 
266
 
 
267
        case SharpContainer::UnsharpMask:
 
268
        {
 
269
            iface.putOriginalImage(i18n("Unsharp Mask"), filter()->getTargetImage().bits());
 
270
            break;
 
271
        }
 
272
 
 
273
        case SharpContainer::Refocus:
 
274
        {
 
275
            iface.putOriginalImage(i18n("Refocus"), filter()->getTargetImage().bits());
 
276
            break;
 
277
        }
 
278
    }
 
279
}
 
280
 
 
281
void SharpenTool::renderingFinished()
 
282
{
 
283
    kapp->restoreOverrideCursor();
 
284
    toolView()->setEnabled(true);
 
285
    toolSettings()->setEnabled(true);
 
286
    slotSettingsChanged();
 
287
}
 
288
 
 
289
void SharpenTool::slotLoadSettings()
 
290
{
 
291
    d->sharpSettings->loadSettings();
 
292
}
 
293
 
 
294
void SharpenTool::slotSaveAsSettings()
 
295
{
 
296
    d->sharpSettings->saveAsSettings();
 
297
}
 
298
 
 
299
}  // namespace DigikamEnhanceImagePlugin