~ubuntu-branches/ubuntu/trusty/digikam/trusty

« back to all changes in this revision

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

  • Committer: Package Import Robot
  • Author(s): Rohan Garg
  • Date: 2012-11-26 18:24:20 UTC
  • mfrom: (1.9.1) (3.1.23 experimental)
  • Revision ID: package-import@ubuntu.com-20121126182420-qoy6z0nx4ai0wzcl
Tags: 4:3.0.0~beta3-0ubuntu1
* New upstream release
  - Add build-deps :  libhupnp-dev, libqtgstreamer-dev, libmagickcore-dev
* Merge from debian, remaining changes:
  - Make sure libqt4-opengl-dev, libgl1-mesa-dev and libglu1-mesa-dev only
    install on i386,amd64 and powerpc
  - Depend on libtiff-dev instead of libtiff4-dev
  - Drop digikam breaks/replaces kipi-plugins-common since we're past the
    LTS release now
  - digikam to recommend mplayerthumbs | ffmpegthumbs. We currently only
    have latter in the archives, even though former is also supposed to
    be part of kdemultimedia. (LP: #890059)
  - kipi-plugins to recommend www-browser rather than konqueror directly
    since 2.8 no direct usage of konqueror is present in the flickr
    plugin anymore (LP: #1011211)
  - Keep kubuntu_mysqld_executable_name.diff
  - Don't install libkipi translations
  - Keep deps on libcv-dev, libcvaux-dev
  - Keep split packaging of libraries
  - Replace icons from KDE 3 time in debian/xpm.d/*.xpm with the new
    versions (LP: #658047)
* Update debian/not-installed

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
 * Description : a digiKam image editor plugin to inpaint
8
8
 *               a photograph
9
9
 *
10
 
 * Copyright (C) 2005-2010 by Gilles Caulier <caulier dot gilles at gmail dot com>
 
10
 * Copyright (C) 2005-2012 by Gilles Caulier <caulier dot gilles at gmail dot com>
11
11
 *
12
12
 * This program is free software; you can redistribute it
13
13
 * and/or modify it under the terms of the GNU General
56
56
#include <kiconloader.h>
57
57
#include <klocale.h>
58
58
#include <kmessagebox.h>
59
 
#include <kpassivepopup.h>
60
59
#include <kstandarddirs.h>
61
60
#include <ktabwidget.h>
62
61
#include <ktoolinvocation.h>
73
72
namespace DigikamEnhanceImagePlugin
74
73
{
75
74
 
76
 
class InPaintingTool::InPaintingToolPriv
 
75
class InPaintingTool::Private
77
76
{
78
 
public:
79
 
 
80
 
    InPaintingToolPriv() :
 
77
 
 
78
public:
 
79
 
 
80
    enum InPaintingFilteringPreset
 
81
    {
 
82
        NoPreset = 0,
 
83
        RemoveSmallArtefact,
 
84
        RemoveMediumArtefact,
 
85
        RemoveLargeArtefact
 
86
    };
 
87
 
 
88
public:
 
89
 
 
90
    Private() :
81
91
        isComputed(false),
82
92
        mainTab(0),
83
93
        inpaintingTypeCB(0),
122
132
 
123
133
    EditorToolSettings*     gboxSettings;
124
134
};
125
 
const QString InPaintingTool::InPaintingToolPriv::configGroupName("inpainting Tool");
126
 
const QString InPaintingTool::InPaintingToolPriv::configFastApproxEntry("FastApprox");
127
 
const QString InPaintingTool::InPaintingToolPriv::configInterpolationEntry("Interpolation");
128
 
const QString InPaintingTool::InPaintingToolPriv::configAmplitudeEntry("Amplitude");
129
 
const QString InPaintingTool::InPaintingToolPriv::configSharpnessEntry("Sharpness");
130
 
const QString InPaintingTool::InPaintingToolPriv::configAnisotropyEntry("Anisotropy");
131
 
const QString InPaintingTool::InPaintingToolPriv::configAlphaEntry("Alpha");
132
 
const QString InPaintingTool::InPaintingToolPriv::configSigmaEntry("Sigma");
133
 
const QString InPaintingTool::InPaintingToolPriv::configGaussPrecEntry("GaussPrec");
134
 
const QString InPaintingTool::InPaintingToolPriv::configDlEntry("Dl");
135
 
const QString InPaintingTool::InPaintingToolPriv::configDaEntry("Da");
136
 
const QString InPaintingTool::InPaintingToolPriv::configIterationEntry("Iteration");
137
 
const QString InPaintingTool::InPaintingToolPriv::configTileEntry("Tile");
138
 
const QString InPaintingTool::InPaintingToolPriv::configBTileEntry("BTile");
139
 
const QString InPaintingTool::InPaintingToolPriv::configPresetEntry("Preset");
 
135
 
 
136
const QString InPaintingTool::Private::configGroupName("inpainting Tool");
 
137
const QString InPaintingTool::Private::configFastApproxEntry("FastApprox");
 
138
const QString InPaintingTool::Private::configInterpolationEntry("Interpolation");
 
139
const QString InPaintingTool::Private::configAmplitudeEntry("Amplitude");
 
140
const QString InPaintingTool::Private::configSharpnessEntry("Sharpness");
 
141
const QString InPaintingTool::Private::configAnisotropyEntry("Anisotropy");
 
142
const QString InPaintingTool::Private::configAlphaEntry("Alpha");
 
143
const QString InPaintingTool::Private::configSigmaEntry("Sigma");
 
144
const QString InPaintingTool::Private::configGaussPrecEntry("GaussPrec");
 
145
const QString InPaintingTool::Private::configDlEntry("Dl");
 
146
const QString InPaintingTool::Private::configDaEntry("Da");
 
147
const QString InPaintingTool::Private::configIterationEntry("Iteration");
 
148
const QString InPaintingTool::Private::configTileEntry("Tile");
 
149
const QString InPaintingTool::Private::configBTileEntry("BTile");
 
150
const QString InPaintingTool::Private::configPresetEntry("Preset");
140
151
 
141
152
// --------------------------------------------------------
142
153
 
143
 
InPaintingTool::InPaintingTool(QObject* parent)
 
154
InPaintingTool::InPaintingTool(QObject* const parent)
144
155
    : EditorToolThreaded(parent),
145
 
      d(new InPaintingToolPriv)
 
156
      d(new Private)
146
157
{
147
158
    setObjectName("inpainting");
148
159
    setToolName(i18n("In-painting"));
212
223
 
213
224
    // -------------------------------------------------------------
214
225
 
215
 
    d->previewWidget = new ImageGuideWidget(0, false, ImageGuideWidget::HVGuideMode, Qt::red, 1, false, true);
 
226
    d->previewWidget = new ImageGuideWidget(0, false, ImageGuideWidget::HVGuideMode, Qt::red, 1, false, ImageIface::ImageSelection);
216
227
    d->previewWidget->setWhatsThis(i18n("The image selection preview with in-painting applied "
217
228
                                        "is shown here."));
218
229
 
219
230
    setToolSettings(d->gboxSettings);
220
231
    setToolView(d->previewWidget);
221
232
    setPreviewModeMask(PreviewToolBar::UnSplitPreviewModes);
222
 
    init();
223
233
 
224
234
    // -------------------------------------------------------------
225
235
 
234
244
    GreycstorationContainer defaults;
235
245
    defaults.setInpaintingDefaultSettings();
236
246
    d->settingsWidget->setDefaultSettings(defaults);
 
247
    init();
237
248
}
238
249
 
239
250
InPaintingTool::~InPaintingTool()
265
276
    prm.btile      = group.readEntry(d->configBTileEntry,         defaults.btile);
266
277
    d->settingsWidget->setSettings(prm);
267
278
 
268
 
    int p = group.readEntry(d->configPresetEntry, (int)NoPreset);
 
279
    int p = group.readEntry(d->configPresetEntry, (int)Private::NoPreset);
269
280
    d->inpaintingTypeCB->setCurrentIndex(p);
270
281
 
271
 
    if (p == NoPreset)
 
282
    if (p == Private::NoPreset)
272
283
    {
273
284
        d->settingsWidget->setEnabled(true);
274
285
    }
304
315
 
305
316
void InPaintingTool::slotResetValues(int i)
306
317
{
307
 
    if (i == NoPreset)
 
318
    if (i == Private::NoPreset)
308
319
    {
309
320
        d->settingsWidget->setEnabled(true);
310
321
    }
323
334
 
324
335
    switch (d->inpaintingTypeCB->currentIndex())
325
336
    {
326
 
        case RemoveSmallArtefact:
 
337
        case Private::RemoveSmallArtefact:
327
338
            // We use default settings here.
328
339
            break;
329
340
 
330
 
        case RemoveMediumArtefact:
 
341
        case Private::RemoveMediumArtefact:
331
342
        {
332
343
            settings.amplitude = 50.0;
333
344
            settings.nbIter    = 50;
334
345
            break;
335
346
        }
336
347
 
337
 
        case RemoveLargeArtefact:
 
348
        case Private::RemoveLargeArtefact:
338
349
        {
339
350
            settings.amplitude = 100.0;
340
351
            settings.nbIter    = 100;
350
361
    KToolInvocation::invokeBrowser(url);
351
362
}
352
363
 
353
 
void InPaintingTool::prepareEffect()
 
364
void InPaintingTool::preparePreview()
354
365
{
355
 
    ImageIface iface(0, 0);
356
 
    QScopedArrayPointer<uchar> data(iface.getOriginalImage());
357
 
    d->originalImage = DImg(iface.originalWidth(), iface.originalHeight(),
358
 
                            iface.originalSixteenBit(), iface.originalHasAlpha(), data.data());
 
366
    ImageIface iface;
 
367
    d->originalImage = iface.original()->copy();
359
368
 
360
369
    // Selected area from the image and mask creation:
361
370
    //
368
377
    // (image_size_x + 2*amplitude , image_size_y + 2*amplitude)
369
378
 
370
379
 
371
 
    QRect selectionRect = QRect(iface.selectedXOrg(), iface.selectedYOrg(),
372
 
                                iface.selectedWidth(), iface.selectedHeight());
 
380
    QRect selectionRect = iface.selectionRect();
373
381
 
374
 
    QPixmap inPaintingMask(iface.originalWidth(), iface.originalHeight());
 
382
    QPixmap inPaintingMask(iface.originalSize());
375
383
    inPaintingMask.fill(Qt::black);
376
384
    QPainter p(&inPaintingMask);
377
385
    p.fillRect(selectionRect, QBrush(Qt::white));
379
387
 
380
388
    GreycstorationContainer settings = d->settingsWidget->settings();
381
389
 
382
 
    int x1 = (int)(selectionRect.left()   - 2 * settings.amplitude);
383
 
    int y1 = (int)(selectionRect.top()    - 2 * settings.amplitude);
384
 
    int x2 = (int)(selectionRect.right()  + 2 * settings.amplitude);
385
 
    int y2 = (int)(selectionRect.bottom() + 2 * settings.amplitude);
 
390
    int x1      = (int)(selectionRect.left()   - 2 * settings.amplitude);
 
391
    int y1      = (int)(selectionRect.top()    - 2 * settings.amplitude);
 
392
    int x2      = (int)(selectionRect.right()  + 2 * settings.amplitude);
 
393
    int y2      = (int)(selectionRect.bottom() + 2 * settings.amplitude);
386
394
    d->maskRect = QRect(x1, y1, x2 - x1, y2 - y1);
387
395
 
388
396
    // Mask area normalization.
398
406
        d->maskRect.setTop(0);
399
407
    }
400
408
 
401
 
    if (d->maskRect.right()  > iface.originalWidth())
 
409
    if (d->maskRect.right()  > iface.originalSize().width())
402
410
    {
403
 
        d->maskRect.setRight(iface.originalWidth());
 
411
        d->maskRect.setRight(iface.originalSize().width());
404
412
    }
405
413
 
406
 
    if (d->maskRect.bottom() > iface.originalHeight())
 
414
    if (d->maskRect.bottom() > iface.originalSize().height())
407
415
    {
408
 
        d->maskRect.setBottom(iface.originalHeight());
 
416
        d->maskRect.setBottom(iface.originalSize().height());
409
417
    }
410
418
 
411
419
    d->maskImage = inPaintingMask.toImage().copy(d->maskRect);
422
430
{
423
431
    if (!d->isComputed)
424
432
    {
425
 
        prepareEffect();
 
433
        preparePreview();
426
434
    }
427
435
    else
428
436
    {
430
438
    }
431
439
}
432
440
 
433
 
void InPaintingTool::putPreviewData()
 
441
void InPaintingTool::setPreviewImage()
434
442
{
435
443
    ImageIface* iface                = d->previewWidget->imageIface();
436
444
    GreycstorationContainer settings = d->settingsWidget->settings();
437
445
 
438
446
    d->cropImage = filter()->getTargetImage();
439
447
    QRect cropSel((int)(2 * settings.amplitude), (int)(2 * settings.amplitude),
440
 
                  iface->selectedWidth(), iface->selectedHeight());
441
 
    DImg imDest = d->cropImage.copy(cropSel);
 
448
                  iface->selectionRect().width(), iface->selectionRect().height());
 
449
    DImg imDest  = d->cropImage.copy(cropSel);
442
450
 
443
 
    iface->putPreviewImage((imDest.smoothScale(iface->previewWidth(),
444
 
                                               iface->previewHeight())).bits());
 
451
    iface->setPreview(imDest.smoothScale(iface->previewSize()));
445
452
    d->previewWidget->updatePreview();
446
 
    d->isComputed = true;
 
453
    d->isComputed       = true;
447
454
    d->lastFilterAction = filter()->filterAction();
448
455
}
449
456
 
450
 
void InPaintingTool::putFinalData()
 
457
void InPaintingTool::setFinalImage()
451
458
{
452
 
    ImageIface iface(0, 0);
 
459
    ImageIface iface;
453
460
 
454
461
    // Note: if d->isComputed, filter() will be deleted but results stored
455
462
 
460
467
 
461
468
    d->originalImage.bitBltImage(&d->cropImage, d->maskRect.left(), d->maskRect.top());
462
469
 
463
 
    iface.putOriginalImage(i18n("In-Painting"),
 
470
    iface.setOriginal(i18n("In-Painting"),
464
471
                           filter() ? filter()->filterAction() : d->lastFilterAction,
465
 
                           d->originalImage.bits());
 
472
                           d->originalImage);
466
473
}
467
474
 
468
475
void InPaintingTool::slotLoadSettings()
496
503
 
497
504
    file.close();
498
505
    d->inpaintingTypeCB->blockSignals(true);
499
 
    d->inpaintingTypeCB->setCurrentIndex(NoPreset);
 
506
    d->inpaintingTypeCB->setCurrentIndex(Private::NoPreset);
500
507
    d->inpaintingTypeCB->blockSignals(false);
501
508
    d->settingsWidget->setEnabled(true);
502
509
}