1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : a plugin to enhance image with local contrasts (as human eye does).
9
* Copyright (C) 2009 by Julien Pontabry <julien dot pontabry at gmail dot com>
10
* Copyright (C) 2009-2010 by Gilles Caulier <caulier dot gilles at gmail dot com>
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)
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.
23
* ============================================================ */
25
#include "localcontrasttool.moc"
31
#include <QGridLayout>
35
#include <QTextStream>
39
#include <kapplication.h>
41
#include <kfiledialog.h>
43
#include <kglobalsettings.h>
44
#include <kiconloader.h>
46
#include <kmessagebox.h>
47
#include <kstandarddirs.h>
48
#include <ktabwidget.h>
53
#include "editortoolsettings.h"
54
#include "imageiface.h"
55
#include "histogramwidget.h"
56
#include "imageregionwidget.h"
57
#include "localcontrastfilter.h"
58
#include "localcontrastsettings.h"
59
#include "localcontrastcontainer.h"
61
namespace DigikamEnhanceImagePlugin
64
class LocalContrastTool::LocalContrastToolPriv
68
LocalContrastToolPriv() :
69
destinationPreviewData(0),
75
static const QString configGroupName;
76
static const QString configHistogramChannelEntry;
77
static const QString configHistogramScaleEntry;
79
uchar* destinationPreviewData;
81
LocalContrastSettings* settingsView;
82
ImageRegionWidget* previewWidget;
83
EditorToolSettings* gboxSettings;
85
const QString LocalContrastTool::LocalContrastToolPriv::configGroupName("localcontrast Tool");
86
const QString LocalContrastTool::LocalContrastToolPriv::configHistogramChannelEntry("Histogram Channel");
87
const QString LocalContrastTool::LocalContrastToolPriv::configHistogramScaleEntry("Histogram Scale");
89
// --------------------------------------------------------
91
LocalContrastTool::LocalContrastTool(QObject* parent)
92
: EditorToolThreaded(parent),
93
d(new LocalContrastToolPriv)
95
setObjectName("localcontrast");
96
setToolName(i18n("Local Contrast"));
97
setToolIcon(SmallIcon("tonemap"));
99
d->previewWidget = new ImageRegionWidget;
100
setToolView(d->previewWidget);
101
setPreviewModeMask(PreviewToolBar::AllPreviewModes);
103
// -------------------------------------------------------------
105
d->gboxSettings = new EditorToolSettings;
106
d->gboxSettings->setTools(EditorToolSettings::Histogram);
107
d->gboxSettings->setButtons(EditorToolSettings::Default|
108
EditorToolSettings::Ok|
109
EditorToolSettings::Cancel|
110
EditorToolSettings::Load|
111
EditorToolSettings::SaveAs|
112
EditorToolSettings::Try);
114
// -------------------------------------------------------------
116
d->settingsView = new LocalContrastSettings(d->gboxSettings->plainPage());
117
setToolSettings(d->gboxSettings);
120
// -------------------------------------------------------------
122
connect(d->previewWidget, SIGNAL(signalResized()),
123
this, SLOT(slotEffect()));
126
LocalContrastTool::~LocalContrastTool()
128
if (d->destinationPreviewData)
130
delete [] d->destinationPreviewData;
136
void LocalContrastTool::readSettings()
138
KSharedConfig::Ptr config = KGlobal::config();
139
KConfigGroup group = config->group(d->configGroupName);
141
d->gboxSettings->histogramBox()->setChannel((ChannelType)group.readEntry(d->configHistogramChannelEntry, (int)LuminosityChannel));
142
d->gboxSettings->histogramBox()->setScale((HistogramScale)group.readEntry(d->configHistogramScaleEntry, (int)LogScaleHistogram));
143
d->settingsView->readSettings(group);
146
void LocalContrastTool::writeSettings()
148
KSharedConfig::Ptr config = KGlobal::config();
149
KConfigGroup group = config->group(d->configGroupName);
151
group.writeEntry(d->configHistogramChannelEntry, (int)d->gboxSettings->histogramBox()->channel());
152
group.writeEntry(d->configHistogramScaleEntry, (int)d->gboxSettings->histogramBox()->scale());
153
d->settingsView->writeSettings(group);
157
void LocalContrastTool::slotResetSettings()
159
d->settingsView->resetToDefault();
162
void LocalContrastTool::prepareEffect()
164
DImg image = d->previewWidget->getOriginalRegionImage(true);
165
setFilter(new LocalContrastFilter(&image, this, d->settingsView->settings()));
168
void LocalContrastTool::prepareFinal()
170
ImageIface iface(0, 0);
171
setFilter(new LocalContrastFilter(iface.getOriginalImg(), this, d->settingsView->settings()));
174
void LocalContrastTool::putPreviewData()
176
DImg preview = filter()->getTargetImage();
177
d->previewWidget->setPreviewImage(preview);
181
if (d->destinationPreviewData)
183
delete [] d->destinationPreviewData;
186
d->destinationPreviewData = preview.copyBits();
187
d->gboxSettings->histogramBox()->histogram()->updateData(d->destinationPreviewData,
188
preview.width(), preview.height(), preview.sixteenBit(),
192
void LocalContrastTool::putFinalData()
194
ImageIface iface(0, 0);
195
iface.putOriginalImage(i18n("Local Contrast"), filter()->getTargetImage().bits());
198
void LocalContrastTool::slotLoadSettings()
200
d->settingsView->loadSettings();
201
d->gboxSettings->histogramBox()->histogram()->reset();
205
void LocalContrastTool::slotSaveAsSettings()
207
d->settingsView->saveAsSettings();
210
} // namespace DigikamEnhanceImagePlugin