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

« back to all changes in this revision

Viewing changes to core/imageplugins/enhance/restorationtool.cpp

  • Committer: Package Import Robot
  • Author(s): Felix Geyer, Rohan Garg, Philip Muškovac, Felix Geyer
  • Date: 2011-09-23 18:18:55 UTC
  • mfrom: (1.2.36 upstream)
  • Revision ID: package-import@ubuntu.com-20110923181855-ifs67wxkugshev9k
Tags: 2:2.1.1-0ubuntu1
[ Rohan Garg ]
* New upstream release (LP: #834190)
  - debian/control
    + Build with libqtwebkit-dev
 - debian/kipi-plugins-common
    + Install libkvkontakte required by kipi-plugins
 - debian/digikam
    + Install panoramagui

[ Philip Muškovac ]
* New upstream release
  - debian/control:
    + Add libcv-dev, libcvaux-dev, libhighgui-dev, libboost-graph1.46-dev,
      libksane-dev, libxml2-dev, libxslt-dev, libqt4-opengl-dev, libqjson-dev,
      libgpod-dev and libqca2-dev to build-deps
    + Add packages for kipi-plugins, libmediawiki, libkface, libkgeomap and
      libkvkontakte
  - debian/rules:
    + Don't build with gphoto2 since it doesn't build with it.
  - Add kubuntu_fix_test_linking.diff to fix linking of the dngconverter test
  - update install files
  - update kubuntu_01_mysqld_executable_name.diff for new cmake layout
    and rename to kubuntu_mysqld_executable_name.diff
* Fix typo in digikam-data description (LP: #804894)
* Fix Vcs links

[ Felix Geyer ]
* Move library data files to the new packages libkface-data, libkgeomap-data
  and libkvkontakte-data.
* Override version of the embedded library packages to 1.0~digikam<version>.
* Exclude the library packages from digikam-dbg to prevent file conflicts in
  the future.
* Call dh_install with --list-missing.

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        : 2005-03-26
 
7
 * Description : a digiKam image editor plugin to restore
 
8
 *               a photograph
 
9
 *
 
10
 * Copyright (C) 2005-2010 by Gilles Caulier <caulier dot gilles at gmail dot com>
 
11
 *
 
12
 * This program is free software; you can redistribute it
 
13
 * and/or modify it under the terms of the GNU General
 
14
 * Public License as published by the Free Software Foundation;
 
15
 * either version 2, or (at your option)
 
16
 * any later version.
 
17
 *
 
18
 * This program is distributed in the hope that it will be useful,
 
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
21
 * GNU General Public License for more details.
 
22
 *
 
23
 * ============================================================ */
 
24
 
 
25
#include "restorationtool.moc"
 
26
 
 
27
// Qt includes
 
28
 
 
29
#include <QFile>
 
30
#include <QGridLayout>
 
31
#include <QImage>
 
32
#include <QLabel>
 
33
#include <QPixmap>
 
34
 
 
35
// KDE includes
 
36
 
 
37
#include <kapplication.h>
 
38
#include <kcombobox.h>
 
39
#include <kfiledialog.h>
 
40
#include <kglobal.h>
 
41
#include <kglobalsettings.h>
 
42
#include <kiconloader.h>
 
43
#include <klocale.h>
 
44
#include <kmessagebox.h>
 
45
#include <kstandarddirs.h>
 
46
#include <ktabwidget.h>
 
47
#include <ktoolinvocation.h>
 
48
#include <kurllabel.h>
 
49
 
 
50
// Local includes
 
51
 
 
52
#include "editortoolsettings.h"
 
53
#include "greycstorationfilter.h"
 
54
#include "greycstorationsettings.h"
 
55
#include "imageiface.h"
 
56
#include "imageregionwidget.h"
 
57
 
 
58
namespace DigikamEnhanceImagePlugin
 
59
{
 
60
 
 
61
class RestorationTool::RestorationToolPriv
 
62
{
 
63
public:
 
64
 
 
65
    RestorationToolPriv() :
 
66
        mainTab(0),
 
67
        restorationTypeCB(0),
 
68
        settingsWidget(0),
 
69
        previewWidget(0),
 
70
        gboxSettings(0)
 
71
    {}
 
72
 
 
73
    static const QString    configGroupName;
 
74
    static const QString    configPresetEntry;
 
75
    static const QString    configFastApproxEntry;
 
76
    static const QString    configInterpolationEntry;
 
77
    static const QString    configAmplitudeEntry;
 
78
    static const QString    configSharpnessEntry;
 
79
    static const QString    configAnisotropyEntry;
 
80
    static const QString    configAlphaEntry;
 
81
    static const QString    configSigmaEntry;
 
82
    static const QString    configGaussPrecEntry;
 
83
    static const QString    configDlEntry;
 
84
    static const QString    configDaEntry;
 
85
    static const QString    configIterationEntry;
 
86
    static const QString    configTileEntry;
 
87
    static const QString    configBTileEntry;
 
88
 
 
89
    KTabWidget*             mainTab;
 
90
 
 
91
    KComboBox*              restorationTypeCB;
 
92
 
 
93
    GreycstorationSettings* settingsWidget;
 
94
    ImageRegionWidget*      previewWidget;
 
95
    EditorToolSettings*     gboxSettings;
 
96
};
 
97
const QString RestorationTool::RestorationToolPriv::configGroupName("restoration Tool");
 
98
const QString RestorationTool::RestorationToolPriv::configPresetEntry("Preset");
 
99
const QString RestorationTool::RestorationToolPriv::configFastApproxEntry("FastApprox");
 
100
const QString RestorationTool::RestorationToolPriv::configInterpolationEntry("Interpolation");
 
101
const QString RestorationTool::RestorationToolPriv::configAmplitudeEntry("Amplitude");
 
102
const QString RestorationTool::RestorationToolPriv::configSharpnessEntry("Sharpness");
 
103
const QString RestorationTool::RestorationToolPriv::configAnisotropyEntry("Anisotropy");
 
104
const QString RestorationTool::RestorationToolPriv::configAlphaEntry("Alpha");
 
105
const QString RestorationTool::RestorationToolPriv::configSigmaEntry("Sigma");
 
106
const QString RestorationTool::RestorationToolPriv::configGaussPrecEntry("GaussPrec");
 
107
const QString RestorationTool::RestorationToolPriv::configDlEntry("Dl");
 
108
const QString RestorationTool::RestorationToolPriv::configDaEntry("Da");
 
109
const QString RestorationTool::RestorationToolPriv::configIterationEntry("Iteration");
 
110
const QString RestorationTool::RestorationToolPriv::configTileEntry("Tile");
 
111
const QString RestorationTool::RestorationToolPriv::configBTileEntry("BTile");
 
112
 
 
113
// --------------------------------------------------------
 
114
 
 
115
RestorationTool::RestorationTool(QObject* parent)
 
116
    : EditorToolThreaded(parent),
 
117
      d(new RestorationToolPriv)
 
118
{
 
119
    setObjectName("restoration");
 
120
    setToolName(i18n("Restoration"));
 
121
    setToolIcon(SmallIcon("restoration"));
 
122
 
 
123
    // -------------------------------------------------------------
 
124
 
 
125
    d->gboxSettings = new EditorToolSettings;
 
126
    d->gboxSettings->setButtons(EditorToolSettings::Default|
 
127
                                EditorToolSettings::Ok|
 
128
                                EditorToolSettings::Cancel|
 
129
                                EditorToolSettings::Load|
 
130
                                EditorToolSettings::SaveAs|
 
131
                                EditorToolSettings::Try);
 
132
 
 
133
    QGridLayout* gridSettings = new QGridLayout(d->gboxSettings->plainPage());
 
134
    d->mainTab = new KTabWidget( d->gboxSettings->plainPage() );
 
135
 
 
136
    QWidget* firstPage = new QWidget( d->mainTab );
 
137
    QGridLayout* grid  = new QGridLayout(firstPage);
 
138
    d->mainTab->addTab( firstPage, i18n("Preset") );
 
139
 
 
140
    KUrlLabel* cimgLogoLabel = new KUrlLabel(firstPage);
 
141
    cimgLogoLabel->setText(QString());
 
142
    cimgLogoLabel->setUrl("http://cimg.sourceforge.net");
 
143
    cimgLogoLabel->setPixmap(QPixmap(KStandardDirs::locate("data", "digikam/data/logo-cimg.png")));
 
144
    cimgLogoLabel->setToolTip( i18n("Visit CImg library website"));
 
145
 
 
146
    QLabel* typeLabel   = new QLabel(i18n("Filtering type:"), firstPage);
 
147
    typeLabel->setAlignment ( Qt::AlignRight | Qt::AlignVCenter);
 
148
    d->restorationTypeCB = new KComboBox(firstPage);
 
149
    d->restorationTypeCB->addItem( i18nc("no restoration preset", "None") );
 
150
    d->restorationTypeCB->addItem( i18n("Reduce Uniform Noise") );
 
151
    d->restorationTypeCB->addItem( i18n("Reduce JPEG Artifacts") );
 
152
    d->restorationTypeCB->addItem( i18n("Reduce Texturing") );
 
153
    d->restorationTypeCB->setWhatsThis(i18n("<p>Select the filter preset to use for photograph restoration here:</p>"
 
154
                                            "<p><b>None</b>: Most common values. Puts settings to default.<br/>"
 
155
                                            "<b>Reduce Uniform Noise</b>: reduce small image artifacts such as sensor noise.<br/>"
 
156
                                            "<b>Reduce JPEG Artifacts</b>: reduce large image artifacts, such as a JPEG compression mosaic.<br/>"
 
157
                                            "<b>Reduce Texturing</b>: reduce image artifacts, such as paper texture, or Moire patterns "
 
158
                                            "on scanned images.</p>"));
 
159
 
 
160
    grid->addWidget(cimgLogoLabel,        0, 1, 1, 1);
 
161
    grid->addWidget(typeLabel,            1, 0, 1, 1);
 
162
    grid->addWidget(d->restorationTypeCB, 1, 1, 1, 1);
 
163
    grid->setRowStretch(1, 10);
 
164
    grid->setMargin(d->gboxSettings->spacingHint());
 
165
    grid->setSpacing(0);
 
166
 
 
167
    // -------------------------------------------------------------
 
168
 
 
169
    d->settingsWidget = new GreycstorationSettings( d->mainTab );
 
170
    gridSettings->addWidget(d->mainTab,                               0, 1, 1, 1);
 
171
    gridSettings->addWidget(new QLabel(d->gboxSettings->plainPage()), 1, 1, 1, 1);
 
172
    gridSettings->setMargin(d->gboxSettings->spacingHint());
 
173
    gridSettings->setSpacing(d->gboxSettings->spacingHint());
 
174
    gridSettings->setRowStretch(2, 10);
 
175
 
 
176
    // -------------------------------------------------------------
 
177
 
 
178
    d->previewWidget = new ImageRegionWidget;
 
179
 
 
180
    setToolSettings(d->gboxSettings);
 
181
    setToolView(d->previewWidget);
 
182
    setPreviewModeMask(PreviewToolBar::AllPreviewModes);
 
183
    init();
 
184
 
 
185
    // -------------------------------------------------------------
 
186
 
 
187
    connect(cimgLogoLabel, SIGNAL(leftClickedUrl(QString)),
 
188
            this, SLOT(processCImgUrl(QString)));
 
189
 
 
190
    connect(d->restorationTypeCB, SIGNAL(activated(int)),
 
191
            this, SLOT(slotResetValues(int)));
 
192
 
 
193
    // -------------------------------------------------------------
 
194
 
 
195
    GreycstorationContainer defaults;
 
196
    defaults.setRestorationDefaultSettings();
 
197
    d->settingsWidget->setDefaultSettings(defaults);
 
198
}
 
199
 
 
200
RestorationTool::~RestorationTool()
 
201
{
 
202
    delete d;
 
203
}
 
204
 
 
205
void RestorationTool::readSettings()
 
206
{
 
207
    KSharedConfig::Ptr config = KGlobal::config();
 
208
    KConfigGroup group        = config->group(d->configGroupName);
 
209
 
 
210
    GreycstorationContainer prm;
 
211
    GreycstorationContainer defaults;
 
212
    defaults.setRestorationDefaultSettings();
 
213
 
 
214
    prm.fastApprox = group.readEntry(d->configFastApproxEntry,    defaults.fastApprox);
 
215
    prm.interp     = group.readEntry(d->configInterpolationEntry, defaults.interp);
 
216
    prm.amplitude  = group.readEntry(d->configAmplitudeEntry,     (double)defaults.amplitude);
 
217
    prm.sharpness  = group.readEntry(d->configSharpnessEntry,     (double)defaults.sharpness);
 
218
    prm.anisotropy = group.readEntry(d->configAnisotropyEntry,    (double)defaults.anisotropy);
 
219
    prm.alpha      = group.readEntry(d->configAlphaEntry,         (double)defaults.alpha);
 
220
    prm.sigma      = group.readEntry(d->configSigmaEntry,         (double)defaults.sigma);
 
221
    prm.gaussPrec  = group.readEntry(d->configGaussPrecEntry,     (double)defaults.gaussPrec);
 
222
    prm.dl         = group.readEntry(d->configDlEntry,            (double)defaults.dl);
 
223
    prm.da         = group.readEntry(d->configDaEntry,            (double)defaults.da);
 
224
    prm.nbIter     = group.readEntry(d->configIterationEntry,     defaults.nbIter);
 
225
    prm.tile       = group.readEntry(d->configTileEntry,          defaults.tile);
 
226
    prm.btile      = group.readEntry(d->configBTileEntry,         defaults.btile);
 
227
    d->settingsWidget->setSettings(prm);
 
228
 
 
229
    int p = group.readEntry(d->configPresetEntry, (int)NoPreset);
 
230
    d->restorationTypeCB->setCurrentIndex(p);
 
231
 
 
232
    if (p == NoPreset)
 
233
    {
 
234
        d->settingsWidget->setEnabled(true);
 
235
    }
 
236
    else
 
237
    {
 
238
        d->settingsWidget->setEnabled(false);
 
239
    }
 
240
}
 
241
 
 
242
void RestorationTool::writeSettings()
 
243
{
 
244
    GreycstorationContainer prm = d->settingsWidget->settings();
 
245
    KSharedConfig::Ptr config   = KGlobal::config();
 
246
    KConfigGroup group          = config->group(d->configGroupName);
 
247
 
 
248
    group.writeEntry(d->configPresetEntry,        d->restorationTypeCB->currentIndex());
 
249
    group.writeEntry(d->configFastApproxEntry,    prm.fastApprox);
 
250
    group.writeEntry(d->configInterpolationEntry, prm.interp);
 
251
    group.writeEntry(d->configAmplitudeEntry,     (double)prm.amplitude);
 
252
    group.writeEntry(d->configSharpnessEntry,     (double)prm.sharpness);
 
253
    group.writeEntry(d->configAnisotropyEntry,    (double)prm.anisotropy);
 
254
    group.writeEntry(d->configAlphaEntry,         (double)prm.alpha);
 
255
    group.writeEntry(d->configSigmaEntry,         (double)prm.sigma);
 
256
    group.writeEntry(d->configGaussPrecEntry,     (double)prm.gaussPrec);
 
257
    group.writeEntry(d->configDlEntry,            (double)prm.dl);
 
258
    group.writeEntry(d->configDaEntry,            (double)prm.da);
 
259
    group.writeEntry(d->configIterationEntry,     prm.nbIter);
 
260
    group.writeEntry(d->configTileEntry,          prm.tile);
 
261
    group.writeEntry(d->configBTileEntry,         prm.btile);
 
262
    group.sync();
 
263
}
 
264
 
 
265
void RestorationTool::slotResetValues(int i)
 
266
{
 
267
    if (i == NoPreset)
 
268
    {
 
269
        d->settingsWidget->setEnabled(true);
 
270
    }
 
271
    else
 
272
    {
 
273
        d->settingsWidget->setEnabled(false);
 
274
    }
 
275
 
 
276
    slotResetSettings();
 
277
}
 
278
 
 
279
void RestorationTool::slotResetSettings()
 
280
{
 
281
    GreycstorationContainer settings;
 
282
    settings.setRestorationDefaultSettings();
 
283
 
 
284
    switch (d->restorationTypeCB->currentIndex())
 
285
    {
 
286
        case ReduceUniformNoise:
 
287
        {
 
288
            settings.amplitude = 40.0;
 
289
            break;
 
290
        }
 
291
 
 
292
        case ReduceJPEGArtefacts:
 
293
        {
 
294
            settings.sharpness = 0.3F;
 
295
            settings.sigma     = 1.0;
 
296
            settings.amplitude = 100.0;
 
297
            settings.nbIter    = 2;
 
298
            break;
 
299
        }
 
300
 
 
301
        case ReduceTexturing:
 
302
        {
 
303
            settings.sharpness = 0.5F;
 
304
            settings.sigma     = 1.5;
 
305
            settings.amplitude = 100.0;
 
306
            settings.nbIter    = 2;
 
307
            break;
 
308
        }
 
309
    }
 
310
 
 
311
    d->settingsWidget->setSettings(settings);
 
312
}
 
313
 
 
314
void RestorationTool::processCImgUrl(const QString& url)
 
315
{
 
316
    KToolInvocation::invokeBrowser(url);
 
317
}
 
318
 
 
319
void RestorationTool::prepareEffect()
 
320
{
 
321
    DImg previewImage = d->previewWidget->getOriginalRegionImage();
 
322
 
 
323
    setFilter(new GreycstorationFilter(&previewImage,
 
324
                                       d->settingsWidget->settings(), GreycstorationFilter::Restore,
 
325
                                       0, 0, QImage(), this));
 
326
}
 
327
 
 
328
void RestorationTool::prepareFinal()
 
329
{
 
330
    ImageIface iface(0, 0);
 
331
    uchar* data = iface.getOriginalImage();
 
332
    DImg originalImage(iface.originalWidth(), iface.originalHeight(),
 
333
                       iface.originalSixteenBit(), iface.originalHasAlpha(), data);
 
334
 
 
335
    setFilter(new GreycstorationFilter(&originalImage,
 
336
                                       d->settingsWidget->settings(), GreycstorationFilter::Restore,
 
337
                                       0, 0, QImage(), this));
 
338
 
 
339
    delete [] data;
 
340
}
 
341
 
 
342
void RestorationTool::putPreviewData()
 
343
{
 
344
    DImg imDest = filter()->getTargetImage();
 
345
    d->previewWidget->setPreviewImage(imDest);
 
346
}
 
347
 
 
348
void RestorationTool::putFinalData()
 
349
{
 
350
    ImageIface iface(0, 0);
 
351
    iface.putOriginalImage(i18n("Restoration"), filter()->filterAction(), filter()->getTargetImage().bits());
 
352
}
 
353
 
 
354
void RestorationTool::slotLoadSettings()
 
355
{
 
356
    KUrl loadRestorationFile = KFileDialog::getOpenUrl(KGlobalSettings::documentPath(),
 
357
                               QString( "*" ), kapp->activeWindow(),
 
358
                               QString( i18n("Photograph Restoration Settings File to Load")) );
 
359
 
 
360
    if ( loadRestorationFile.isEmpty() )
 
361
    {
 
362
        return;
 
363
    }
 
364
 
 
365
    QFile file(loadRestorationFile.toLocalFile());
 
366
 
 
367
    if ( file.open(QIODevice::ReadOnly) )
 
368
    {
 
369
        if (!d->settingsWidget->loadSettings(file, QString("# Photograph Restoration Configuration File V2")))
 
370
        {
 
371
            KMessageBox::error(kapp->activeWindow(),
 
372
                               i18n("\"%1\" is not a Photograph Restoration settings text file.",
 
373
                                    loadRestorationFile.fileName()));
 
374
            file.close();
 
375
            return;
 
376
        }
 
377
 
 
378
        slotEffect();
 
379
    }
 
380
    else
 
381
    {
 
382
        KMessageBox::error(kapp->activeWindow(), i18n("Cannot load settings from the Photograph Restoration text file."));
 
383
    }
 
384
 
 
385
    file.close();
 
386
    d->restorationTypeCB->blockSignals(true);
 
387
    d->restorationTypeCB->setCurrentIndex((int)NoPreset);
 
388
    d->restorationTypeCB->blockSignals(false);
 
389
    d->settingsWidget->setEnabled(true);
 
390
}
 
391
 
 
392
void RestorationTool::slotSaveAsSettings()
 
393
{
 
394
    KUrl saveRestorationFile = KFileDialog::getSaveUrl(KGlobalSettings::documentPath(),
 
395
                               QString( "*" ), kapp->activeWindow(),
 
396
                               QString( i18n("Photograph Restoration Settings File to Save")) );
 
397
 
 
398
    if ( saveRestorationFile.isEmpty() )
 
399
    {
 
400
        return;
 
401
    }
 
402
 
 
403
    QFile file(saveRestorationFile.toLocalFile());
 
404
 
 
405
    if ( file.open(QIODevice::WriteOnly) )
 
406
    {
 
407
        d->settingsWidget->saveSettings(file, QString("# Photograph Restoration Configuration File V2"));
 
408
    }
 
409
    else
 
410
    {
 
411
        KMessageBox::error(kapp->activeWindow(), i18n("Cannot save settings to the Photograph Restoration text file."));
 
412
    }
 
413
 
 
414
    file.close();
 
415
}
 
416
 
 
417
}  // namespace DigikamEnhanceImagePlugin