1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : Black and White conversion tool.
9
* Copyright (C) 2004-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
10
* Copyright (C) 2006-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 "bwsepiatool.moc"
29
#include <QGridLayout>
33
#include <kapplication.h>
35
#include <kconfiggroup.h>
36
#include <kglobalsettings.h>
37
#include <kiconloader.h>
42
#include <libkdcraw/rnuminput.h>
46
#include "colorgradientwidget.h"
47
#include "editortoolsettings.h"
48
#include "histogramwidget.h"
49
#include "histogrambox.h"
50
#include "imageiface.h"
51
#include "imageregionwidget.h"
52
#include "bwsepiafilter.h"
53
#include "bwsepiasettings.h"
55
using namespace KDcrawIface;
57
namespace DigikamColorImagePlugin
60
class BWSepiaTool::BWSepiaToolPriv
66
destinationPreviewData(0),
72
static const QString configGroupName;
73
static const QString configHistogramChannelEntry;
74
static const QString configHistogramScaleEntry;
76
uchar* destinationPreviewData;
78
BWSepiaSettings* bwsepiaSettings;
80
ImageRegionWidget* previewWidget;
82
EditorToolSettings* gboxSettings;
84
const QString BWSepiaTool::BWSepiaToolPriv::configGroupName("convertbw Tool");
85
const QString BWSepiaTool::BWSepiaToolPriv::configHistogramChannelEntry("Histogram Channel");
86
const QString BWSepiaTool::BWSepiaToolPriv::configHistogramScaleEntry("Histogram Scale");
88
// -----------------------------------------------------------------------------------
90
BWSepiaTool::BWSepiaTool(QObject* parent)
91
: EditorToolThreaded(parent), d(new BWSepiaToolPriv)
93
setObjectName("convertbw");
94
setToolName(i18n("Black and White"));
95
setToolIcon(SmallIcon("bwtonal"));
96
setToolHelp("blackandwhitetool.anchor");
98
// -------------------------------------------------------------
100
d->previewWidget = new ImageRegionWidget;
101
setToolView(d->previewWidget);
102
setPreviewModeMask(PreviewToolBar::AllPreviewModes);
104
// -------------------------------------------------------------
106
d->gboxSettings = new EditorToolSettings;
107
d->gboxSettings->setTools(EditorToolSettings::Histogram);
108
d->gboxSettings->setButtons(EditorToolSettings::Default|
109
EditorToolSettings::Ok|
110
EditorToolSettings::Cancel|
111
EditorToolSettings::Load|
112
EditorToolSettings::SaveAs);
114
ImageIface iface(0, 0);
115
d->bwsepiaSettings = new BWSepiaSettings(d->gboxSettings->plainPage(), iface.getOriginalImg());
117
setToolSettings(d->gboxSettings);
120
// -------------------------------------------------------------
122
connect(d->bwsepiaSettings, SIGNAL(signalSettingsChanged()),
123
this, SLOT(slotTimer()));
125
connect(d->previewWidget, SIGNAL(signalResized()),
126
this, SLOT(slotEffect()));
131
BWSepiaTool::~BWSepiaTool()
133
if (d->destinationPreviewData)
135
delete [] d->destinationPreviewData;
141
void BWSepiaTool::slotInit()
143
EditorToolThreaded::slotInit();
144
d->bwsepiaSettings->startPreviewFilters();
147
void BWSepiaTool::readSettings()
149
KSharedConfig::Ptr config = KGlobal::config();
150
KConfigGroup group = config->group(d->configGroupName);
153
// we need to call the set methods here, otherwise the curve will not be updated correctly
154
d->gboxSettings->histogramBox()->setChannel((ChannelType)group.readEntry(d->configHistogramChannelEntry,
155
(int)LuminosityChannel));
156
d->gboxSettings->histogramBox()->setScale((HistogramScale)group.readEntry(d->configHistogramScaleEntry,
157
(int)LogScaleHistogram));
159
d->bwsepiaSettings->readSettings(group);
163
void BWSepiaTool::writeSettings()
165
KSharedConfig::Ptr config = KGlobal::config();
166
KConfigGroup group = config->group(d->configGroupName);
168
group.writeEntry(d->configHistogramChannelEntry, (int)d->gboxSettings->histogramBox()->channel());
169
group.writeEntry(d->configHistogramScaleEntry, (int)d->gboxSettings->histogramBox()->scale());
171
d->bwsepiaSettings->writeSettings(group);
176
void BWSepiaTool::slotResetSettings()
178
d->bwsepiaSettings->resetToDefault();
179
d->gboxSettings->histogramBox()->histogram()->reset();
183
void BWSepiaTool::prepareEffect()
185
BWSepiaContainer settings = d->bwsepiaSettings->settings();
187
d->gboxSettings->histogramBox()->histogram()->stopHistogramComputation();
189
DImg preview = d->previewWidget->getOriginalRegionImage(true);
190
setFilter(new BWSepiaFilter(&preview, this, settings));
193
void BWSepiaTool::putPreviewData()
195
DImg preview = filter()->getTargetImage();
196
d->previewWidget->setPreviewImage(preview);
200
if (d->destinationPreviewData)
202
delete [] d->destinationPreviewData;
205
d->destinationPreviewData = preview.copyBits();
206
d->gboxSettings->histogramBox()->histogram()->updateData(d->destinationPreviewData,
207
preview.width(), preview.height(), preview.sixteenBit(),
211
void BWSepiaTool::prepareFinal()
213
BWSepiaContainer settings = d->bwsepiaSettings->settings();
215
ImageIface iface(0, 0);
216
setFilter(new BWSepiaFilter(iface.getOriginalImg(), this, settings));
219
void BWSepiaTool::putFinalData()
221
ImageIface iface(0, 0);
222
iface.putOriginalImage(i18n("Convert to Black and White"), filter()->filterAction(), filter()->getTargetImage().bits());
225
void BWSepiaTool::slotLoadSettings()
227
d->bwsepiaSettings->loadSettings();
228
d->gboxSettings->histogramBox()->histogram()->reset();
232
void BWSepiaTool::slotSaveAsSettings()
234
d->bwsepiaSettings->saveAsSettings();
237
void BWSepiaTool::slotScaleChanged()
239
d->bwsepiaSettings->setScaleType(d->gboxSettings->histogramBox()->scale());
242
} // namespace DigikamColorImagePlugin