summaryrefslogtreecommitdiffstats
path: root/kipi-plugins/metadataedit/exifadjust.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kipi-plugins/metadataedit/exifadjust.cpp')
-rw-r--r--kipi-plugins/metadataedit/exifadjust.cpp369
1 files changed, 369 insertions, 0 deletions
diff --git a/kipi-plugins/metadataedit/exifadjust.cpp b/kipi-plugins/metadataedit/exifadjust.cpp
new file mode 100644
index 0000000..f80320a
--- /dev/null
+++ b/kipi-plugins/metadataedit/exifadjust.cpp
@@ -0,0 +1,369 @@
+/* ============================================================
+ *
+ * This file is a part of kipi-plugins project
+ * http://www.kipi-plugins.org
+ *
+ * Date : 2006-10-18
+ * Description : EXIF adjustments settings page.
+ *
+ * Copyright (C) 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * 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.
+ *
+ * ============================================================ */
+
+// C++ includes.
+
+#include <cmath>
+
+// QT includes.
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qwhatsthis.h>
+#include <qcombobox.h>
+
+// KDE includes.
+
+#include <klocale.h>
+#include <kdialog.h>
+#include <knuminput.h>
+
+// LibKExiv2 includes.
+
+#include <libkexiv2/kexiv2.h>
+
+// Local includes.
+
+#include "metadatacheckbox.h"
+#include "exifadjust.h"
+#include "exifadjust.moc"
+
+namespace KIPIMetadataEditPlugin
+{
+
+class EXIFAdjustPriv
+{
+public:
+
+ EXIFAdjustPriv()
+ {
+ brightnessCheck = 0;
+ gainControlCheck = 0;
+ contrastCheck = 0;
+ saturationCheck = 0;
+ sharpnessCheck = 0;
+ customRenderedCheck = 0;
+ brightnessEdit = 0;
+ gainControlCB = 0;
+ contrastCB = 0;
+ saturationCB = 0;
+ sharpnessCB = 0;
+ customRenderedCB = 0;
+ }
+
+ QCheckBox *brightnessCheck;
+
+ QComboBox *gainControlCB;
+ QComboBox *contrastCB;
+ QComboBox *saturationCB;
+ QComboBox *sharpnessCB;
+ QComboBox *customRenderedCB;
+
+ KDoubleSpinBox *brightnessEdit;
+
+ MetadataCheckBox *gainControlCheck;
+ MetadataCheckBox *contrastCheck;
+ MetadataCheckBox *saturationCheck;
+ MetadataCheckBox *sharpnessCheck;
+ MetadataCheckBox *customRenderedCheck;
+};
+
+EXIFAdjust::EXIFAdjust(QWidget* parent)
+ : QWidget(parent)
+{
+ d = new EXIFAdjustPriv;
+
+ QGridLayout* grid = new QGridLayout(parent, 6, 2, KDialog::spacingHint());
+
+ // --------------------------------------------------------
+
+ d->brightnessCheck = new QCheckBox(i18n("Brightness (APEX):"), parent);
+ d->brightnessEdit = new KDoubleSpinBox(-99.99, 99.99, 0.1, 0.0, 2, parent);
+ grid->addMultiCellWidget(d->brightnessCheck, 0, 0, 0, 0);
+ grid->addMultiCellWidget(d->brightnessEdit, 0, 0, 2, 2);
+ QWhatsThis::add(d->brightnessEdit, i18n("<p>Set here the brightness adjustment value in APEX unit "
+ "used by camera to take the picture."));
+
+ // --------------------------------------------------------
+
+ d->gainControlCheck = new MetadataCheckBox(i18n("Gain Control:"), parent);
+ d->gainControlCB = new QComboBox(false, parent);
+ d->gainControlCB->insertItem(i18n("None"), 0);
+ d->gainControlCB->insertItem(i18n("Low gain up"), 1);
+ d->gainControlCB->insertItem(i18n("High gain up"), 2);
+ d->gainControlCB->insertItem(i18n("Low gain down"), 3);
+ d->gainControlCB->insertItem(i18n("High gain down"), 4);
+ grid->addMultiCellWidget(d->gainControlCheck, 1, 1, 0, 0);
+ grid->addMultiCellWidget(d->gainControlCB, 1, 1, 2, 2);
+ QWhatsThis::add(d->gainControlCB, i18n("<p>Set here the degree of overall image gain adjustment "
+ "used by camera to take the picture."));
+
+ // --------------------------------------------------------
+
+ d->contrastCheck = new MetadataCheckBox(i18n("Contrast:"), parent);
+ d->contrastCB = new QComboBox(false, parent);
+ d->contrastCB->insertItem(i18n("Normal"), 0);
+ d->contrastCB->insertItem(i18n("Soft"), 1);
+ d->contrastCB->insertItem(i18n("Hard"), 2);
+ grid->addMultiCellWidget(d->contrastCheck, 2, 2, 0, 0);
+ grid->addMultiCellWidget(d->contrastCB, 2, 2, 2, 2);
+ QWhatsThis::add(d->contrastCB, i18n("<p>Set here the direction of contrast processing "
+ "applied by the camera to take the picture."));
+
+ // --------------------------------------------------------
+
+ d->saturationCheck = new MetadataCheckBox(i18n("Saturation:"), parent);
+ d->saturationCB = new QComboBox(false, parent);
+ d->saturationCB->insertItem(i18n("Normal"), 0);
+ d->saturationCB->insertItem(i18n("Low"), 1);
+ d->saturationCB->insertItem(i18n("High"), 2);
+ grid->addMultiCellWidget(d->saturationCheck, 3, 3, 0, 0);
+ grid->addMultiCellWidget(d->saturationCB, 3, 3, 2, 2);
+ QWhatsThis::add(d->saturationCB, i18n("<p>Set here the direction of saturation processing "
+ "applied by the camera to take the picture."));
+
+ // --------------------------------------------------------
+
+ d->sharpnessCheck = new MetadataCheckBox(i18n("Sharpness:"), parent);
+ d->sharpnessCB = new QComboBox(false, parent);
+ d->sharpnessCB->insertItem(i18n("Normal"), 0);
+ d->sharpnessCB->insertItem(i18n("Soft"), 1);
+ d->sharpnessCB->insertItem(i18n("Hard"), 2);
+ grid->addMultiCellWidget(d->sharpnessCheck, 4, 4, 0, 0);
+ grid->addMultiCellWidget(d->sharpnessCB, 4, 4, 2, 2);
+ QWhatsThis::add(d->sharpnessCB, i18n("<p>Set here the direction of sharpness processing "
+ "applied by the camera to take the picture."));
+
+ // --------------------------------------------------------
+
+ d->customRenderedCheck = new MetadataCheckBox(i18n("Custom rendered:"), parent);
+ d->customRenderedCB = new QComboBox(false, parent);
+ d->customRenderedCB->insertItem(i18n("Normal process"), 0);
+ d->customRenderedCB->insertItem(i18n("Custom process"), 1);
+ grid->addMultiCellWidget(d->customRenderedCheck, 5, 5, 0, 0);
+ grid->addMultiCellWidget(d->customRenderedCB, 5, 5, 2, 2);
+ QWhatsThis::add(d->customRenderedCB, i18n("<p>Set here the use of special processing on "
+ "image data, such as rendering geared to output."));
+
+ grid->setColStretch(1, 10);
+ grid->setRowStretch(6, 10);
+
+ // --------------------------------------------------------
+
+ connect(d->brightnessCheck, SIGNAL(toggled(bool)),
+ d->brightnessEdit, SLOT(setEnabled(bool)));
+
+ connect(d->gainControlCheck, SIGNAL(toggled(bool)),
+ d->gainControlCB, SLOT(setEnabled(bool)));
+
+ connect(d->contrastCheck, SIGNAL(toggled(bool)),
+ d->contrastCB, SLOT(setEnabled(bool)));
+
+ connect(d->saturationCheck, SIGNAL(toggled(bool)),
+ d->saturationCB, SLOT(setEnabled(bool)));
+
+ connect(d->sharpnessCheck, SIGNAL(toggled(bool)),
+ d->sharpnessCB, SLOT(setEnabled(bool)));
+
+ connect(d->customRenderedCheck, SIGNAL(toggled(bool)),
+ d->customRenderedCB, SLOT(setEnabled(bool)));
+
+ // --------------------------------------------------------
+
+ connect(d->brightnessCheck, SIGNAL(toggled(bool)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->gainControlCheck, SIGNAL(toggled(bool)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->contrastCheck, SIGNAL(toggled(bool)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->saturationCheck, SIGNAL(toggled(bool)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->sharpnessCheck, SIGNAL(toggled(bool)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->customRenderedCheck, SIGNAL(toggled(bool)),
+ this, SIGNAL(signalModified()));
+
+ // --------------------------------------------------------
+
+ connect(d->gainControlCB, SIGNAL(activated(int)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->contrastCB, SIGNAL(activated(int)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->saturationCB, SIGNAL(activated(int)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->sharpnessCB, SIGNAL(activated(int)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->customRenderedCB, SIGNAL(activated(int)),
+ this, SIGNAL(signalModified()));
+
+ connect(d->brightnessEdit, SIGNAL(valueChanged(double)),
+ this, SIGNAL(signalModified()));
+}
+
+EXIFAdjust::~EXIFAdjust()
+{
+ delete d;
+}
+
+void EXIFAdjust::readMetadata(QByteArray& exifData)
+{
+ blockSignals(true);
+ KExiv2Iface::KExiv2 exiv2Iface;
+ exiv2Iface.setExif(exifData);
+ long int num=1, den=1;
+ long val=0;
+
+ d->brightnessEdit->setValue(0.0);
+ d->brightnessCheck->setChecked(false);
+ if (exiv2Iface.getExifTagRational("Exif.Photo.BrightnessValue", num, den))
+ {
+ d->brightnessEdit->setValue((double)(num) / (double)(den));
+ d->brightnessCheck->setChecked(true);
+ }
+ d->brightnessEdit->setEnabled(d->brightnessCheck->isChecked());
+
+ d->gainControlCB->setCurrentItem(0);
+ d->gainControlCheck->setChecked(false);
+ if (exiv2Iface.getExifTagLong("Exif.Photo.GainControl", val))
+ {
+ if (val >= 0 && val <= 4)
+ {
+ d->gainControlCB->setCurrentItem(val);
+ d->gainControlCheck->setChecked(true);
+ }
+ else
+ d->gainControlCheck->setValid(false);
+ }
+ d->gainControlCB->setEnabled(d->gainControlCheck->isChecked());
+
+ d->contrastCB->setCurrentItem(0);
+ d->contrastCheck->setChecked(false);
+ if (exiv2Iface.getExifTagLong("Exif.Photo.Contrast", val))
+ {
+ if (val >= 0 && val <= 2)
+ {
+ d->contrastCB->setCurrentItem(val);
+ d->contrastCheck->setChecked(true);
+ }
+ else
+ d->contrastCheck->setValid(false);
+ }
+ d->contrastCB->setEnabled(d->contrastCheck->isChecked());
+
+ d->saturationCB->setCurrentItem(0);
+ d->saturationCheck->setChecked(false);
+ if (exiv2Iface.getExifTagLong("Exif.Photo.Saturation", val))
+ {
+ if (val >= 0 && val <= 2)
+ {
+ d->saturationCB->setCurrentItem(val);
+ d->saturationCheck->setChecked(true);
+ }
+ else
+ d->saturationCheck->setValid(false);
+ }
+ d->saturationCB->setEnabled(d->saturationCheck->isChecked());
+
+ d->sharpnessCB->setCurrentItem(0);
+ d->sharpnessCheck->setChecked(false);
+ if (exiv2Iface.getExifTagLong("Exif.Photo.Sharpness", val))
+ {
+ if (val >= 0 && val <= 2)
+ {
+ d->sharpnessCB->setCurrentItem(val);
+ d->sharpnessCheck->setChecked(true);
+ }
+ else
+ d->sharpnessCheck->setValid(false);
+ }
+ d->sharpnessCB->setEnabled(d->sharpnessCheck->isChecked());
+
+ d->customRenderedCB->setCurrentItem(0);
+ d->customRenderedCheck->setChecked(false);
+ if (exiv2Iface.getExifTagLong("Exif.Photo.CustomRendered", val))
+ {
+ if (val >= 0 && val <= 1)
+ {
+ d->customRenderedCB->setCurrentItem(val);
+ d->customRenderedCheck->setChecked(true);
+ }
+ else
+ d->customRenderedCheck->setValid(false);
+ }
+ d->customRenderedCB->setEnabled(d->customRenderedCheck->isChecked());
+
+ blockSignals(false);
+}
+
+void EXIFAdjust::applyMetadata(QByteArray& exifData)
+{
+ KExiv2Iface::KExiv2 exiv2Iface;
+ exiv2Iface.setExif(exifData);
+ long int num=1, den=1;
+
+ if (d->brightnessCheck->isChecked())
+ {
+ exiv2Iface.convertToRational(d->brightnessEdit->value(), &num, &den, 1);
+ exiv2Iface.setExifTagRational("Exif.Photo.BrightnessValue", num, den);
+ }
+ else
+ exiv2Iface.removeExifTag("Exif.Photo.BrightnessValue");
+
+ if (d->gainControlCheck->isChecked())
+ exiv2Iface.setExifTagLong("Exif.Photo.GainControl", d->gainControlCB->currentItem());
+ else if (d->gainControlCheck->isValid())
+ exiv2Iface.removeExifTag("Exif.Photo.GainControl");
+
+ if (d->contrastCheck->isChecked())
+ exiv2Iface.setExifTagLong("Exif.Photo.Contrast", d->contrastCB->currentItem());
+ else if (d->contrastCheck->isValid())
+ exiv2Iface.removeExifTag("Exif.Photo.Contrast");
+
+ if (d->saturationCheck->isChecked())
+ exiv2Iface.setExifTagLong("Exif.Photo.Saturation", d->saturationCB->currentItem());
+ else if (d->saturationCheck->isValid())
+ exiv2Iface.removeExifTag("Exif.Photo.Saturation");
+
+ if (d->sharpnessCheck->isChecked())
+ exiv2Iface.setExifTagLong("Exif.Photo.Sharpness", d->sharpnessCB->currentItem());
+ else if (d->sharpnessCheck->isValid())
+ exiv2Iface.removeExifTag("Exif.Photo.Sharpness");
+
+ if (d->customRenderedCheck->isChecked())
+ exiv2Iface.setExifTagLong("Exif.Photo.CustomRendered", d->customRenderedCB->currentItem());
+ else if (d->customRenderedCheck->isValid())
+ exiv2Iface.removeExifTag("Exif.Photo.CustomRendered");
+
+ exifData = exiv2Iface.getExif();
+}
+
+} // namespace KIPIMetadataEditPlugin
+