[Digikam-devel] extragear/graphics/kipi-plugins/dngconverter
Gilles Caulier
caulier.gilles at gmail.com
Thu Oct 2 10:02:09 BST 2008
SVN commit 866900 by cgilles:
kipi-plugins from trunk : DNGConverter: add new option to embed original RAW file as compressed ZIP data as it's described into DNG spec.
CCMAIL: kde-imaging at kde.org
CCMAIL: digikam-devel at kde.org
M +47 -17 dngwriter/dngwriter.cpp
M +3 -0 dngwriter/dngwriter.h
M +1 -0 dngwriter/dngwriterprivate.cpp
M +1 -0 dngwriter/dngwriterprivate.h
M +11 -3 plugin/actionthread.cpp
M +1 -0 plugin/actionthread.h
M +6 -3 plugin/batchdialog.cpp
M +31 -15 plugin/settingswidget.cpp
M +3 -0 plugin/settingswidget.h
--- trunk/extragear/graphics/kipi-plugins/dngconverter/dngwriter/dngwriter.cpp #866899:866900
@@ -52,6 +52,7 @@
// KDE includes.
#include <kdebug.h>
+#include <kzip.h>
// Libkexiv2 includes.
@@ -98,6 +99,16 @@
return d->jpegLossLessCompression;
}
+void DNGWriter::setBackupOriginalRawFile(bool b)
+{
+ d->backupOriginalRawFile = b;
+}
+
+bool DNGWriter::backupOriginalRawFile() const
+{
+ return d->backupOriginalRawFile;
+}
+
void DNGWriter::setPreviewMode(int mode)
{
d->previewMode = mode;
@@ -630,33 +641,51 @@
negative->SetMakerNoteSafety(true);
}
-/* FIXME: embeding original RAW file data do not work yet
+ if (d->backupOriginalRawFile)
{
kDebug( 51000 ) << "DNGWriter: Backup Original RAW file (" << inputInfo.size() << " bytes)" << endl;
- QFile file(inputFile());
- if ( !file.open(QIODevice::ReadOnly) )
+ // Compress Raw file data to Zip archive.
+
+ QTemporaryFile zipFile;
+ if (!zipFile.open())
{
- kDebug( 51000 ) << "DNGWriter: Loading RAW data failed. Aborted..." << endl;
+ kDebug( 51000 ) << "DNGWriter: Cannot open temporary file to write Zip Raw file. Aborted..." << endl;
return -1;
}
- QByteArray orgRawFile;
- orgRawFile.resize(inputInfo.size());
- QDataStream dataStream(&file);
- dataStream.readRawData(orgRawFile.data(), orgRawFile.size());
- file.close();
+ KZip zipArchive(zipFile.fileName());
+ zipArchive.open(QIODevice::WriteOnly);
+ zipArchive.setCompression(KZip::DeflateCompression);
+ zipArchive.addLocalFile(inputFile(), inputFile());
+ zipArchive.close();
- QByteArray zCompressData = qCompress(orgRawFile, 9);
+ // Load Zip Archive in a byte array
+
+ QFileInfo zipFileInfo(zipFile.fileName());
+ QByteArray zipRawFileData;
+ zipRawFileData.resize(zipFileInfo.size());
+ QDataStream dataStream(&zipFile);
+ dataStream.readRawData(zipRawFileData.data(), zipRawFileData.size());
+ kDebug( 51000 ) << "DNGWriter: Zipped RAW file size " << zipRawFileData.size() << " bytes" << endl;
+
+ // Pass byte array to DNG sdk and compute MD5 fingerprint.
+
dng_memory_allocator memalloc(gDefaultDNGMemoryAllocator);
dng_memory_stream stream(memalloc);
- stream.Put(zCompressData.data(), zCompressData.size());
- AutoPtr<dng_memory_block> block(host.Allocate(zCompressData.size()));
+ stream.Put(zipRawFileData.data(), zipRawFileData.size());
+ AutoPtr<dng_memory_block> block(host.Allocate(zipRawFileData.size()));
stream.SetReadPosition(0);
- stream.Get(block->Buffer(), zCompressData.size());
+ stream.Get(block->Buffer(), zipRawFileData.size());
+
+ dng_md5_printer md5;
+ md5.Process(block->Buffer(), block->LogicalSize());
negative->SetOriginalRawFileData(block);
- negative->SetHasOriginalRawFileData(true);
+ negative->SetOriginalRawFileDigest(md5.Result());
+ negative->ValidateOriginalRawFileDigest();
+
+ zipFile.remove();
}
-*/
+
if (d->cancel) return -2;
// -----------------------------------------------------------------------------------------
@@ -681,7 +710,7 @@
dng_preview_list previewList;
- // NOTE: something is wrong with Qt < 4.4.0 to import TIFF data as stream in QImage.
+// NOTE: something is wrong with Qt < 4.4.0 to import TIFF data as stream in QImage.
#if QT_VERSION >= 0x40400
if (d->previewMode != DNGWriter::NONE)
@@ -744,8 +773,9 @@
previewFile.remove();
}
-#endif
+#endif /* QT_VERSION >= 0x40400 */
+
if (d->cancel) return -2;
// -----------------------------------------------------------------------------------------
--- trunk/extragear/graphics/kipi-plugins/dngconverter/dngwriter/dngwriter.h #866899:866900
@@ -58,6 +58,9 @@
void setCompressLossLess(bool b);
bool compressLossLess() const;
+ void setBackupOriginalRawFile(bool b);
+ bool backupOriginalRawFile() const;
+
void setPreviewMode(int mode);
int previewMode() const;
--- trunk/extragear/graphics/kipi-plugins/dngconverter/dngwriter/dngwriterprivate.cpp #866899:866900
@@ -53,6 +53,7 @@
{
cancel = false;
jpegLossLessCompression = true;
+ backupOriginalRawFile = false;
previewMode = DNGWriter::MEDIUM;
}
--- trunk/extragear/graphics/kipi-plugins/dngconverter/dngwriter/dngwriterprivate.h #866899:866900
@@ -74,6 +74,7 @@
bool cancel;
bool jpegLossLessCompression;
+ bool backupOriginalRawFile;
int previewMode;
--- trunk/extragear/graphics/kipi-plugins/dngconverter/plugin/actionthread.cpp #866899:866900
@@ -58,9 +58,10 @@
ActionThreadPriv()
{
- compressLossLess = true;
- running = false;
- previewMode = DNGWriter::MEDIUM;
+ backupOriginalRawFile = false;
+ compressLossLess = true;
+ running = false;
+ previewMode = DNGWriter::MEDIUM;
}
class Task
@@ -71,6 +72,7 @@
Action action;
};
+ bool backupOriginalRawFile;
bool compressLossLess;
bool running;
@@ -102,6 +104,11 @@
delete d;
}
+void ActionThread::setBackupOriginalRawFile(bool b)
+{
+ d->backupOriginalRawFile = b;
+}
+
void ActionThread::setCompressLossLess(bool b)
{
d->compressLossLess = b;
@@ -290,6 +297,7 @@
d->dngProcessor.reset();
d->dngProcessor.setInputFile(t->fileUrl.path());
d->dngProcessor.setOutputFile(destPath);
+ d->dngProcessor.setBackupOriginalRawFile(d->backupOriginalRawFile);
d->dngProcessor.setCompressLossLess(d->compressLossLess);
d->dngProcessor.setPreviewMode(d->previewMode);
int ret = d->dngProcessor.convert();
--- trunk/extragear/graphics/kipi-plugins/dngconverter/plugin/actionthread.h #866899:866900
@@ -50,6 +50,7 @@
ActionThread(QObject *parent);
~ActionThread();
+ void setBackupOriginalRawFile(bool b);
void setCompressLossLess(bool b);
void setPreviewMode(int mode);
--- trunk/extragear/graphics/kipi-plugins/dngconverter/plugin/batchdialog.cpp #866899:866900
@@ -281,6 +281,7 @@
KConfig config("kipirc");
KConfigGroup group = config.group(QString("DNGConverter Settings"));
+ d->settingsBox->setBackupOriginalRawFile(group.readEntry("BackupOriginalRawFile", false));
d->settingsBox->setCompressLossLess(group.readEntry("CompressLossLess", true));
d->settingsBox->setCompressLossLess(group.readEntry("PreviewMode", (int)(DNGWriter::MEDIUM)));
d->settingsBox->setConflictRule(
@@ -296,9 +297,10 @@
KConfig config("kipirc");
KConfigGroup group = config.group(QString("DNGConverter Settings"));
- group.writeEntry("CompressLossLess", d->settingsBox->compressLossLess());
- group.writeEntry("PreviewMode", (int)d->settingsBox->previewMode());
- group.writeEntry("Conflict", (int)d->settingsBox->conflictRule());
+ group.writeEntry("BackupOriginalRawFile", d->settingsBox->backupOriginalRawFile());
+ group.writeEntry("CompressLossLess", d->settingsBox->compressLossLess());
+ group.writeEntry("PreviewMode", (int)d->settingsBox->previewMode());
+ group.writeEntry("Conflict", (int)d->settingsBox->conflictRule());
KConfigGroup group2 = config.group(QString("Batch DNG Converter Dialog"));
saveDialogSize(group2);
@@ -449,6 +451,7 @@
QString file(d->fileList.first());
d->fileList.pop_front();
+ d->thread->setBackupOriginalRawFile(d->settingsBox->backupOriginalRawFile());
d->thread->setCompressLossLess(d->settingsBox->compressLossLess());
d->thread->setPreviewMode(d->settingsBox->previewMode());
d->thread->processRawFile(KUrl(file));
--- trunk/extragear/graphics/kipi-plugins/dngconverter/plugin/settingswidget.cpp #866899:866900
@@ -61,13 +61,14 @@
SettingsWidgetPriv()
{
- conflictLabel = 0;
- conflictButtonGroup = 0;
- overwriteButton = 0;
- promptButton = 0;
- compressLossLess = 0;
- previewModeCB = 0;
- previewModeLabel = 0;
+ conflictLabel = 0;
+ conflictButtonGroup = 0;
+ overwriteButton = 0;
+ promptButton = 0;
+ compressLossLess = 0;
+ previewModeCB = 0;
+ previewModeLabel = 0;
+ backupOriginalRawFile = 0;
}
QLabel *conflictLabel;
@@ -79,6 +80,7 @@
QRadioButton *promptButton;
QCheckBox *compressLossLess;
+ QCheckBox *backupOriginalRawFile;
RComboBox *previewModeCB;
};
@@ -100,6 +102,8 @@
// ------------------------------------------------------------------------
+ d->backupOriginalRawFile = new QCheckBox(i18n("Embed Original File"), this);
+
d->compressLossLess = new QCheckBox(i18n("Lossless Compression"), this);
d->previewModeLabel = new QLabel(i18n("JPEG Preview:"), this);
@@ -128,14 +132,15 @@
vlay->addWidget(d->overwriteButton);
vlay->addWidget(d->promptButton);
- settingsBoxLayout->addWidget(dngLogoLabel, 0, 0, 1, 1);
- settingsBoxLayout->addWidget(d->compressLossLess, 1, 0, 1, 1);
- settingsBoxLayout->addWidget(d->previewModeLabel, 2 ,0, 1, 1);
- settingsBoxLayout->addWidget(d->previewModeCB, 3 ,0 ,1, 1);
- settingsBoxLayout->addWidget(line, 4, 0, 1, 1);
- settingsBoxLayout->addWidget(d->conflictLabel, 5, 0, 1, 1);
- settingsBoxLayout->addWidget(conflictBox, 6, 0, 1, 1);
- settingsBoxLayout->setRowStretch(7, 10);
+ settingsBoxLayout->addWidget(dngLogoLabel, 0, 0, 1, 1);
+ settingsBoxLayout->addWidget(d->backupOriginalRawFile, 1, 0, 1, 1);
+ settingsBoxLayout->addWidget(d->compressLossLess, 2, 0, 1, 1);
+ settingsBoxLayout->addWidget(d->previewModeLabel, 3 ,0, 1, 1);
+ settingsBoxLayout->addWidget(d->previewModeCB, 4 ,0 ,1, 1);
+ settingsBoxLayout->addWidget(line, 5, 0, 1, 1);
+ settingsBoxLayout->addWidget(d->conflictLabel, 6, 0, 1, 1);
+ settingsBoxLayout->addWidget(conflictBox, 7, 0, 1, 1);
+ settingsBoxLayout->setRowStretch(8, 10);
settingsBoxLayout->setMargin(KDialog::spacingHint());
settingsBoxLayout->setSpacing(KDialog::spacingHint());
@@ -157,6 +162,7 @@
{
d->previewModeCB->slotReset();
setCompressLossLess(true);
+ setBackupOriginalRawFile(false);
setConflictRule(OVERWRITE);
}
@@ -180,6 +186,16 @@
return d->compressLossLess->isChecked();
}
+void SettingsWidget::setBackupOriginalRawFile(bool b)
+{
+ d->backupOriginalRawFile->setChecked(b);
+}
+
+bool SettingsWidget::backupOriginalRawFile() const
+{
+ return d->backupOriginalRawFile->isChecked();
+}
+
SettingsWidget::ConflictRule SettingsWidget::conflictRule()
{
return((ConflictRule)(d->conflictButtonGroup->checkedId()));
--- trunk/extragear/graphics/kipi-plugins/dngconverter/plugin/settingswidget.h #866899:866900
@@ -58,6 +58,9 @@
void setPreviewMode(int mode);
int previewMode() const;
+ void setBackupOriginalRawFile(bool b);
+ bool backupOriginalRawFile() const;
+
void setDefaultSettings();
private slots:
More information about the Digikam-devel
mailing list