/* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2007-09-13 * Description : Greycstoration settings widgets * * Copyright (C) 2007 by Gilles Caulier * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ // TQt includes. #include #include #include #include #include #include #include #include // KDE includes. #include #include // LibKDcraw includes. #include #include // Local includes. #include "greycstorationwidget.h" #include "greycstorationwidget.moc" using namespace KDcrawIface; namespace Digikam { class GreycstorationWidgetPriv { public: GreycstorationWidgetPriv() { parent = 0; advancedPage = 0; alphaInput = 0; alphaLabel = 0; amplitudeInput = 0; amplitudeLabel = 0; anisotropyInput = 0; anisotropyLabel = 0; btileInput = 0; btileLabel = 0; daInput = 0; daLabel = 0; dlInput = 0; dlLabel = 0; fastApproxCBox = 0; gaussianPrecInput = 0; gaussianPrecLabel = 0; generalPage = 0; interpolationBox = 0; interpolationLabel = 0; iterationInput = 0; iterationLabel = 0; sharpnessInput = 0; sharpnessLabel = 0; sigmaInput = 0; sigmaLabel = 0; tileInput = 0; tileLabel = 0; } TQLabel *alphaLabel; TQLabel *amplitudeLabel; TQLabel *anisotropyLabel; TQLabel *btileLabel; TQLabel *daLabel; TQLabel *dlLabel; TQLabel *gaussianPrecLabel; TQLabel *interpolationLabel; TQLabel *iterationLabel; TQLabel *sharpnessLabel; TQLabel *sigmaLabel; TQLabel *tileLabel; TQWidget *advancedPage; TQWidget *generalPage; TQCheckBox *fastApproxCBox; TQTabWidget *parent; RComboBox *interpolationBox; RDoubleNumInput *alphaInput; RDoubleNumInput *amplitudeInput; RDoubleNumInput *anisotropyInput; RDoubleNumInput *daInput; RDoubleNumInput *dlInput; RDoubleNumInput *gaussianPrecInput; RDoubleNumInput *sharpnessInput; RDoubleNumInput *sigmaInput; RIntNumInput *btileInput; RIntNumInput *iterationInput; RIntNumInput *tileInput; }; GreycstorationWidget::GreycstorationWidget(TQTabWidget *parent) : TQObject(TQT_TQOBJECT(parent)) { d = new GreycstorationWidgetPriv; d->parent = parent; // ------------------------------------------------------------- d->generalPage = new TQWidget( parent ); TQGridLayout* grid1 = new TQGridLayout(d->generalPage, 6, 2, KDialog::spacingHint()); parent->addTab( d->generalPage, i18n("General") ); d->sharpnessLabel = new TQLabel(i18n("Detail preservation:"), d->generalPage); d->sharpnessInput = new RDoubleNumInput(d->generalPage); d->sharpnessInput->setPrecision(2); d->sharpnessInput->setRange(0.01, 1.0, 0.1); TQWhatsThis::add( d->sharpnessInput, i18n("

Preservation of details to set the sharpening level " "of the small features in the target image. " "Higher values leave details sharp.")); grid1->addMultiCellWidget(d->sharpnessLabel, 0, 0, 0, 0); grid1->addMultiCellWidget(d->sharpnessInput, 0, 0, 1, 1); d->anisotropyLabel = new TQLabel(i18n("Anisotropy:"), d->generalPage); d->anisotropyInput = new RDoubleNumInput(d->generalPage); d->anisotropyInput->setPrecision(2); d->anisotropyInput->setRange(0.0, 1.0, 0.1); TQWhatsThis::add( d->anisotropyInput, i18n("

Anisotropic (directional) modifier of the details. " "Keep it small for Gaussian noise.")); grid1->addMultiCellWidget(d->anisotropyLabel, 1, 1, 0, 0); grid1->addMultiCellWidget(d->anisotropyInput, 1, 1, 1, 1); d->amplitudeLabel = new TQLabel(i18n("Smoothing:"), d->generalPage); d->amplitudeInput = new RDoubleNumInput(d->generalPage); d->amplitudeInput->setPrecision(2); d->amplitudeInput->setRange(0.01, 500.0, 0.1); TQWhatsThis::add( d->amplitudeInput, i18n("

Total smoothing power: if the Detail Factor sets the relative " "smoothing and the Anisotropy Factor the direction, " "the Smoothing Factor sets the overall effect.")); grid1->addMultiCellWidget(d->amplitudeLabel, 2, 2, 0, 0); grid1->addMultiCellWidget(d->amplitudeInput, 2, 2, 1, 1); d->sigmaLabel = new TQLabel(i18n("Regularity:"), d->generalPage); d->sigmaInput = new RDoubleNumInput(d->generalPage); d->sigmaInput->setPrecision(2); d->sigmaInput->setRange(0.0, 10.0, 0.1); TQWhatsThis::add( d->sigmaInput, i18n("

This value controls the evenness of smoothing to the image. " "Do not use a high value here, or the " "target image will be completely blurred.")); grid1->addMultiCellWidget(d->sigmaLabel, 3, 3, 0, 0); grid1->addMultiCellWidget(d->sigmaInput, 3, 3, 1, 1); d->iterationLabel = new TQLabel(i18n("Iterations:"), d->generalPage); d->iterationInput = new RIntNumInput(d->generalPage); d->iterationInput->setRange(1, 5000, 1); TQWhatsThis::add( d->iterationInput, i18n("

Sets the number of times the filter is applied to " "the image.")); grid1->addMultiCellWidget(d->iterationLabel, 4, 4, 0, 0); grid1->addMultiCellWidget(d->iterationInput, 4, 4, 1, 1); d->alphaLabel = new TQLabel(i18n("Noise:"), d->generalPage); d->alphaInput = new RDoubleNumInput(d->generalPage); d->alphaInput->setPrecision(2); d->alphaInput->setRange(0.01, 1.0, 0.1); TQWhatsThis::add( d->alphaInput, i18n("

Sets the noise scale.")); grid1->addMultiCellWidget(d->alphaLabel, 5, 5, 0, 0); grid1->addMultiCellWidget(d->alphaInput, 5, 5, 1, 1); grid1->setRowStretch(6, 10); // ------------------------------------------------------------- d->advancedPage = new TQWidget( parent ); TQGridLayout* grid2 = new TQGridLayout(d->advancedPage, 6, 2, KDialog::spacingHint()); parent->addTab( d->advancedPage, i18n("Advanced Settings") ); d->daLabel = new TQLabel(i18n("Angular step:"), d->advancedPage); d->daInput = new RDoubleNumInput(d->advancedPage); d->daInput->setPrecision(2); d->daInput->setRange(0.0, 90.0, 1.0); TQWhatsThis::add( d->daInput, i18n("

Set here the angular integration step (in degrees) " "analogous to anisotropy.")); grid2->addMultiCellWidget(d->daLabel, 0, 0, 0, 0); grid2->addMultiCellWidget(d->daInput, 0, 0, 1, 1); d->dlLabel = new TQLabel(i18n("Integral step:"), d->advancedPage); d->dlInput = new RDoubleNumInput(d->advancedPage); d->dlInput->setPrecision(2); d->dlInput->setRange(0.0, 1.0, 0.1); TQWhatsThis::add( d->dlInput, i18n("

Set here the spatial integral step.")); grid2->addMultiCellWidget(d->dlLabel, 1, 1, 0, 0); grid2->addMultiCellWidget(d->dlInput, 1, 1, 1, 1); d->gaussianPrecLabel = new TQLabel(i18n("Gaussian:"), d->advancedPage); d->gaussianPrecInput = new RDoubleNumInput(d->advancedPage); d->gaussianPrecInput->setPrecision(2); d->gaussianPrecInput->setRange(0.01, 20.0, 0.01); TQWhatsThis::add( d->gaussianPrecInput, i18n("

Set here the precision of the Gaussian function.")); grid2->addMultiCellWidget(d->gaussianPrecLabel, 2, 2, 0, 0); grid2->addMultiCellWidget(d->gaussianPrecInput, 2, 2, 1, 1); d->tileLabel = new TQLabel(i18n("Tile size:"), d->advancedPage); d->tileInput = new RIntNumInput(d->advancedPage); d->tileInput->setRange(0, 2000, 1); TQWhatsThis::add( d->tileInput, i18n("

Sets the tile size.")); grid2->addMultiCellWidget(d->tileLabel, 3, 3, 0, 0); grid2->addMultiCellWidget(d->tileInput, 3, 3, 1, 1); d->btileLabel = new TQLabel(i18n("Tile border:"), d->advancedPage); d->btileInput = new RIntNumInput(d->advancedPage); d->btileInput->setRange(1, 20, 1); TQWhatsThis::add( d->btileInput, i18n("

Sets the size of each tile border.")); grid2->addMultiCellWidget(d->btileLabel, 4, 4, 0, 0); grid2->addMultiCellWidget(d->btileInput, 4, 4, 1, 1); d->interpolationLabel = new TQLabel(i18n("Interpolation:"), d->advancedPage); d->interpolationBox = new RComboBox(d->advancedPage); d->interpolationBox->insertItem( i18n("Nearest Neighbor"), GreycstorationSettings::NearestNeighbor ); d->interpolationBox->insertItem( i18n("Linear"), GreycstorationSettings::Linear ); d->interpolationBox->insertItem( i18n("Runge-Kutta"), GreycstorationSettings::RungeKutta); TQWhatsThis::add( d->interpolationBox, i18n("

Select the right interpolation method for the " "desired image quality.")); grid2->addMultiCellWidget(d->interpolationLabel, 5, 5, 0, 0); grid2->addMultiCellWidget(d->interpolationBox, 5, 5, 1, 1); d->fastApproxCBox = new TQCheckBox(i18n("Fast approximation"), d->advancedPage); TQWhatsThis::add( d->fastApproxCBox, i18n("

Enable fast approximation when rendering images.")); grid2->addMultiCellWidget(d->fastApproxCBox, 6, 6, 0, 1); } GreycstorationWidget::~GreycstorationWidget() { delete d; } void GreycstorationWidget::setEnabled(bool b) { d->generalPage->setEnabled(b); d->advancedPage->setEnabled(b); d->parent->setTabEnabled(d->generalPage, b); d->parent->setTabEnabled(d->advancedPage, b); } void GreycstorationWidget::setSettings(GreycstorationSettings settings) { blockSignals(true); d->alphaInput->setValue(settings.alpha); d->amplitudeInput->setValue(settings.amplitude); d->anisotropyInput->setValue(settings.anisotropy); d->btileInput->setValue(settings.btile); d->daInput->setValue(settings.da); d->dlInput->setValue(settings.dl); d->fastApproxCBox->setChecked(settings.fastApprox); d->gaussianPrecInput->setValue(settings.gaussPrec); d->interpolationBox->setCurrentItem(settings.interp); d->iterationInput->setValue(settings.nbIter); d->sharpnessInput->setValue(settings.sharpness); d->sigmaInput->setValue(settings.sigma); d->tileInput->setValue(settings.tile); blockSignals(false); } void GreycstorationWidget::setDefaultSettings(GreycstorationSettings settings) { blockSignals(true); d->alphaInput->setDefaultValue(settings.alpha); d->amplitudeInput->setDefaultValue(settings.amplitude); d->anisotropyInput->setDefaultValue(settings.anisotropy); d->btileInput->setDefaultValue(settings.btile); d->daInput->setDefaultValue(settings.da); d->dlInput->setDefaultValue(settings.dl); d->fastApproxCBox->setChecked(settings.fastApprox); d->gaussianPrecInput->setDefaultValue(settings.gaussPrec); d->interpolationBox->setDefaultItem(settings.interp); d->iterationInput->setDefaultValue(settings.nbIter); d->sharpnessInput->setDefaultValue(settings.sharpness); d->sigmaInput->setDefaultValue(settings.sigma); d->tileInput->setDefaultValue(settings.tile); blockSignals(false); } GreycstorationSettings GreycstorationWidget::getSettings() { GreycstorationSettings settings; settings.fastApprox = d->fastApproxCBox->isChecked(); settings.interp = d->interpolationBox->currentItem(); settings.amplitude = d->amplitudeInput->value(); settings.sharpness = d->sharpnessInput->value(); settings.anisotropy = d->anisotropyInput->value(); settings.alpha = d->alphaInput->value(); settings.sigma = d->sigmaInput->value(); settings.gaussPrec = d->gaussianPrecInput->value(); settings.dl = d->dlInput->value(); settings.da = d->daInput->value(); settings.nbIter = d->iterationInput->value(); settings.tile = d->tileInput->value(); settings.btile = d->btileInput->value(); return settings; } bool GreycstorationWidget::loadSettings(TQFile& file, const TQString& header) { TQTextStream stream( &file ); if (stream.readLine() != header) return false; blockSignals(true); GreycstorationSettings settings; settings.fastApprox = stream.readLine().toInt(); settings.interp = stream.readLine().toInt(); settings.amplitude = stream.readLine().toDouble(); settings.sharpness = stream.readLine().toDouble(); settings.anisotropy = stream.readLine().toDouble(); settings.alpha = stream.readLine().toDouble(); settings.sigma = stream.readLine().toDouble(); settings.gaussPrec = stream.readLine().toDouble(); settings.dl = stream.readLine().toDouble(); settings.da = stream.readLine().toDouble(); settings.nbIter = stream.readLine().toInt(); settings.tile = stream.readLine().toInt(); settings.btile = stream.readLine().toInt(); setSettings(settings); blockSignals(false); return true; } void GreycstorationWidget::saveSettings(TQFile& file, const TQString& header) { GreycstorationSettings settings = getSettings(); TQTextStream stream( &file ); stream << header << "\n"; stream << settings.fastApprox << "\n"; stream << settings.interp << "\n"; stream << settings.amplitude << "\n"; stream << settings.sharpness << "\n"; stream << settings.anisotropy << "\n"; stream << settings.alpha << "\n"; stream << settings.sigma << "\n"; stream << settings.gaussPrec << "\n"; stream << settings.dl << "\n"; stream << settings.da << "\n"; stream << settings.nbIter << "\n"; stream << settings.tile << "\n"; stream << settings.btile << "\n"; } } // NameSpace Digikam