7
7
* Description : a digiKam image editor plugin to inpaint
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>
12
12
* This program is free software; you can redistribute it
13
13
* and/or modify it under the terms of the GNU General
123
133
EditorToolSettings* gboxSettings;
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");
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");
141
152
// --------------------------------------------------------
143
InPaintingTool::InPaintingTool(QObject* parent)
154
InPaintingTool::InPaintingTool(QObject* const parent)
144
155
: EditorToolThreaded(parent),
145
d(new InPaintingToolPriv)
147
158
setObjectName("inpainting");
148
159
setToolName(i18n("In-painting"));
213
224
// -------------------------------------------------------------
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."));
219
230
setToolSettings(d->gboxSettings);
220
231
setToolView(d->previewWidget);
221
232
setPreviewModeMask(PreviewToolBar::UnSplitPreviewModes);
224
234
// -------------------------------------------------------------
265
276
prm.btile = group.readEntry(d->configBTileEntry, defaults.btile);
266
277
d->settingsWidget->setSettings(prm);
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);
282
if (p == Private::NoPreset)
273
284
d->settingsWidget->setEnabled(true);
324
335
switch (d->inpaintingTypeCB->currentIndex())
326
case RemoveSmallArtefact:
337
case Private::RemoveSmallArtefact:
327
338
// We use default settings here.
330
case RemoveMediumArtefact:
341
case Private::RemoveMediumArtefact:
332
343
settings.amplitude = 50.0;
333
344
settings.nbIter = 50;
337
case RemoveLargeArtefact:
348
case Private::RemoveLargeArtefact:
339
350
settings.amplitude = 100.0;
340
351
settings.nbIter = 100;
350
361
KToolInvocation::invokeBrowser(url);
353
void InPaintingTool::prepareEffect()
364
void InPaintingTool::preparePreview()
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());
367
d->originalImage = iface.original()->copy();
360
369
// Selected area from the image and mask creation:
368
377
// (image_size_x + 2*amplitude , image_size_y + 2*amplitude)
371
QRect selectionRect = QRect(iface.selectedXOrg(), iface.selectedYOrg(),
372
iface.selectedWidth(), iface.selectedHeight());
380
QRect selectionRect = iface.selectionRect();
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));
380
388
GreycstorationContainer settings = d->settingsWidget->settings();
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);
388
396
// Mask area normalization.
398
406
d->maskRect.setTop(0);
401
if (d->maskRect.right() > iface.originalWidth())
409
if (d->maskRect.right() > iface.originalSize().width())
403
d->maskRect.setRight(iface.originalWidth());
411
d->maskRect.setRight(iface.originalSize().width());
406
if (d->maskRect.bottom() > iface.originalHeight())
414
if (d->maskRect.bottom() > iface.originalSize().height())
408
d->maskRect.setBottom(iface.originalHeight());
416
d->maskRect.setBottom(iface.originalSize().height());
411
419
d->maskImage = inPaintingMask.toImage().copy(d->maskRect);
433
void InPaintingTool::putPreviewData()
441
void InPaintingTool::setPreviewImage()
435
443
ImageIface* iface = d->previewWidget->imageIface();
436
444
GreycstorationContainer settings = d->settingsWidget->settings();
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);
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();
450
void InPaintingTool::putFinalData()
457
void InPaintingTool::setFinalImage()
452
ImageIface iface(0, 0);
454
461
// Note: if d->isComputed, filter() will be deleted but results stored
461
468
d->originalImage.bitBltImage(&d->cropImage, d->maskRect.left(), d->maskRect.top());
463
iface.putOriginalImage(i18n("In-Painting"),
470
iface.setOriginal(i18n("In-Painting"),
464
471
filter() ? filter()->filterAction() : d->lastFilterAction,
465
d->originalImage.bits());
468
475
void InPaintingTool::slotLoadSettings()