Implemented TIFF LZW compression

This commit is contained in:
sashavasko
2010-05-10 17:51:05 -06:00
parent 114215e366
commit 7d846c4d26
40 changed files with 123 additions and 38 deletions

View File

@@ -679,3 +679,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -681,3 +681,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -680,3 +680,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -465,6 +465,7 @@ SAVEDLG_PUTTOQUEUE;Vložit soubor do fronty
SAVEDLG_SAVEIMMEDIATELY;Okamžitě uložit
SAVEDLG_SAVESPP;Uschovat s obrazem i parametry zpracování
SAVEDLG_TIFFFILTER;Soubory TIFF
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
TOOLBAR_TOOLTIP_CROP;Označení výřezu (shortcut key: C)
TOOLBAR_TOOLTIP_HAND;Nástroj ruka (shortcut key: N)
TOOLBAR_TOOLTIP_STRAIGHTEN;Vyznačení roviny (shortcut key: S)

View File

@@ -680,3 +680,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -471,6 +471,7 @@ SAVEDLG_PUTTOQUEUETAIL;Ans Ende der Warteschlange für Verarbeitung legen
SAVEDLG_SAVEIMMEDIATELY;Sofort Speichern
SAVEDLG_SAVESPP;Speichere die Prozessparameter mit dem Bild
SAVEDLG_TIFFFILTER;TIFF-Datei
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
TOOLBAR_TOOLTIP_CROP;Auswahl des Ausschnitts (Taste C)
TOOLBAR_TOOLTIP_HAND;Hand-Werkzeug (Taste N)
TOOLBAR_TOOLTIP_STRAIGHTEN;Auswahl einer Leitlinie (Taste S)

View File

@@ -682,3 +682,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -684,3 +684,4 @@ NAVIGATOR_S_VALUE;S = %1
NAVIGATOR_V_VALUE;V = %1
NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -686,3 +686,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -680,3 +680,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -679,3 +679,4 @@ NAVIGATOR_XY_NA;x = n/d, y = n/d
FILEBROWSER_SHOWEXIFINFO;Montrer les infos EXIF
TP_RESIZE_DOWNSCALEB;Diminuer (Meilleur)
TP_RESIZE_DOWNSCALEF;Diminuer (Plus rapide)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -678,3 +678,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -680,3 +680,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -683,3 +683,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -680,3 +680,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -680,3 +680,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -680,3 +680,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -681,3 +681,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -680,3 +680,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -466,6 +466,7 @@ SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue
SAVEDLG_SAVEIMMEDIATELY;Save immediately
SAVEDLG_SAVESPP;Zapisz parametry przetwarzania wraz z obrazem
SAVEDLG_TIFFFILTER;Pliki TIFF
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
TOOLBAR_TOOLTIP_CROP;Kadruj (shortcut key: C)
TOOLBAR_TOOLTIP_HAND;Przesuń (shortcut key: N)
TOOLBAR_TOOLTIP_STRAIGHTEN;Wyprostuj obraz (shortcut key: S)

View File

@@ -685,3 +685,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -680,3 +680,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -683,3 +683,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -681,3 +681,4 @@ NAVIGATOR_XY_NA;x = n/a, y = n/a
FILEBROWSER_SHOWEXIFINFO;Show EXIF info
TP_RESIZE_DOWNSCALEB;Downscale (Better)
TP_RESIZE_DOWNSCALEF;Downscale (Faster)
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF

View File

@@ -461,6 +461,7 @@ SAVEDLG_PUTTOQUEUETAIL;Laita käsittelyjonon viimeiseksi
SAVEDLG_SAVEIMMEDIATELY;Tallenna heti
SAVEDLG_SAVESPP;Tallenna kuvankäsittelytiedot kuvan mukana
SAVEDLG_TIFFFILTER;TIFF tiedostot
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
TOOLBAR_TOOLTIP_CROP;Valitse rajattava alue (pikanäppäin: C)
TOOLBAR_TOOLTIP_HAND;Kuvan siirtotyökalu (pikanäppäin: N)
TOOLBAR_TOOLTIP_STRAIGHTEN;Valitse suora linja (pikanäppäin: S)

View File

@@ -461,6 +461,7 @@ SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue
SAVEDLG_SAVEIMMEDIATELY;Save immediately
SAVEDLG_SAVESPP;Spara behandlingsparametrarna med bilderna
SAVEDLG_TIFFFILTER;TIFF-filer
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
TOOLBAR_TOOLTIP_CROP;Välj beskärningsområde (shortcut key: C)
TOOLBAR_TOOLTIP_HAND;Handverktyg (shortcut key: N)
TOOLBAR_TOOLTIP_STRAIGHTEN;Räta ut (shortcut key: S)

View File

@@ -461,6 +461,7 @@ SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue
SAVEDLG_SAVEIMMEDIATELY;Save immediately
SAVEDLG_SAVESPP;İşeme değişkenlerini görüntü ile birlikte kaydet
SAVEDLG_TIFFFILTER;TIFF dosyaları
SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
TOOLBAR_TOOLTIP_CROP;Seçimi kırp (shorcut key: C)
TOOLBAR_TOOLTIP_HAND;El aracı (shortcut key: N)
TOOLBAR_TOOLTIP_STRAIGHTEN;Düz çizgi seçimi (shortcut key: S)

View File

@@ -61,7 +61,7 @@ namespace rtengine {
* @param fname is the name of the file
* @param bps can be 8 or 16 depending on the bits per pixels the output file will have
@return the error code, 0 if none */
virtual int saveAsTIFF (Glib::ustring fname, int bps = -1)=0;
virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false)=0;
/** Sets the progress listener if you want to follow the progress of the image saving operations (optional).
* @param pl is the pointer to the class implementing the ProgressListener interface */
virtual void setSaveProgressListener (ProgressListener* pl)=0;

View File

@@ -75,7 +75,7 @@ class Image16 : public ImageIO, public IImage16 {
virtual int saveToFile (Glib::ustring fname) { return save (fname); }
virtual int saveAsPNG (Glib::ustring fname, int compression = -1, int bps = -1) { return savePNG (fname, compression, bps); }
virtual int saveAsJPEG (Glib::ustring fname, int quality = 100) { return saveJPEG (fname, quality); }
virtual int saveAsTIFF (Glib::ustring fname, int bps = -1) { return saveTIFF (fname, bps); }
virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false) { return saveTIFF (fname, bps, uncompressed); }
virtual void setSaveProgressListener (ProgressListener* pl) { return setProgressListener (pl); }
virtual void free () { delete this; }
virtual unsigned short** getRPlane () { return r; }

View File

@@ -61,7 +61,7 @@ class Image8 : public ImageIO, public IImage8 {
virtual int saveToFile (Glib::ustring fname) { return save (fname); }
virtual int saveAsPNG (Glib::ustring fname, int compression = -1, int bps = -1) { return savePNG (fname, compression, bps); }
virtual int saveAsJPEG (Glib::ustring fname, int quality = 100) { return saveJPEG (fname, quality); }
virtual int saveAsTIFF (Glib::ustring fname, int bps = -1) { return saveTIFF (fname, bps); }
virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false) { return saveTIFF (fname, bps, uncompressed); }
virtual void setSaveProgressListener (ProgressListener* pl) { setProgressListener (pl); }
virtual void free () { delete this; }
virtual const unsigned char* getData () { return data; }

View File

@@ -585,7 +585,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality) {
return IMIO_SUCCESS;
}
int ImageIO::saveTIFF (Glib::ustring fname, int bps) {
int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) {
int width = getW ();
int height = getH ();
@@ -595,15 +595,15 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps) {
int lineWidth = width*3*bps/8;
unsigned char* linebuffer = new unsigned char[lineWidth];
if (exifRoot) {
// TODO the following needs to be looked into - do we really need two ways to write a Tiff file ?
if (exifRoot && uncompressed) {
FILE *file = g_fopen (fname.c_str (), "wb");
if (!file)
return IMIO_CANNOTREADFILE;
if (pl) {
pl->setProgressStr ("Saving TIFF file...");
pl->setProgressStr ("Saving TIFF file ...");
pl->setProgress (0.0);
}
@@ -639,21 +639,58 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps) {
fclose (file);
}
else {
// little hack to get libTiff to use proper byte order (see TIFFClienOpen()):
const char *mode = !exifRoot ? "w" : (exifRoot->getOrder()==rtexif::INTEL ? "wl":"wb");
#ifdef WIN32
wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (fname.c_str(), -1, NULL, NULL, NULL);
TIFF* out = TIFFOpenW (wfilename, "w");
TIFF* out = TIFFOpenW (wfilename, mode);
g_free (wfilename);
#else
TIFF* out = TIFFOpen(fname.c_str(), "w");
TIFF* out = TIFFOpen(fname.c_str(), mode);
#endif
if (!out)
return IMIO_CANNOTREADFILE;
if (pl) {
pl->setProgressStr ("Saving TIFF file...");
pl->setProgressStr ("Saving TIFF file ...");
pl->setProgress (0.0);
}
if (exifRoot){
rtexif::Tag *tag = exifRoot->getTag (TIFFTAG_EXIFIFD);
if (tag && tag->isDirectory()){
rtexif::TagDirectory *exif = tag->getDirectory();
if (exif) {
int exif_size = exif->calculateSize();
unsigned char *buffer = new unsigned char[exif_size+8];
// TIFFOpen writes out the header and sets file pointer at position 8
exif->write (8, buffer);
write (TIFFFileno (out), buffer+8, exif_size);
delete buffer;
// let libtiff know that scanlines or any other following stuff should go
// at a different offset:
TIFFSetWriteOffset (out, exif_size+8);
TIFFSetField (out, TIFFTAG_EXIFIFD, 8);
}
}
//TODO Even though we are saving EXIF IFD - MakerNote still comes out screwy.
if ((tag = exifRoot->getTag (TIFFTAG_MODEL)) != NULL)
TIFFSetField (out, TIFFTAG_MODEL, tag->getValue());
if ((tag = exifRoot->getTag (TIFFTAG_MAKE)) != NULL)
TIFFSetField (out, TIFFTAG_MAKE, tag->getValue());
if ((tag = exifRoot->getTag (TIFFTAG_DATETIME)) != NULL)
TIFFSetField (out, TIFFTAG_DATETIME, tag->getValue());
if ((tag = exifRoot->getTag (TIFFTAG_ARTIST)) != NULL)
TIFFSetField (out, TIFFTAG_ARTIST, tag->getValue());
if ((tag = exifRoot->getTag (TIFFTAG_COPYRIGHT)) != NULL)
TIFFSetField (out, TIFFTAG_COPYRIGHT, tag->getValue());
}
TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee 3");
TIFFSetField (out, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField (out, TIFFTAG_IMAGELENGTH, height);
TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
@@ -662,8 +699,10 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps) {
TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_LZW);
if (!uncompressed)
TIFFSetField (out, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
if (profileData)
TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData);

View File

@@ -73,7 +73,7 @@ class ImageIO {
int savePNG (Glib::ustring fname, int compression = -1, int bps = -1);
int saveJPEG (Glib::ustring fname, int quality = 100);
int saveTIFF (Glib::ustring fname, int bps = -1);
int saveTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false);
cmsHPROFILE getEmbeddedProfile () { return embProfile; }
void getEmbeddedProfileData (int& length, unsigned char*& pdata) { length = loadedProfileLength; pdata = (unsigned char*)loadedProfileData; }

View File

@@ -167,7 +167,7 @@ void TagDirectory::replaceTag (Tag* tag) {
tags.push_back (tag);
}
Tag* TagDirectory::getTag (int ID) {
Tag* TagDirectory::getTag (int ID) const {
for (int i=0; i<tags.size(); i++)
if (tags[i]->getID()==ID)
@@ -175,7 +175,7 @@ Tag* TagDirectory::getTag (int ID) {
return NULL;
}
Tag* TagDirectory::getTag (const char* name) {
Tag* TagDirectory::getTag (const char* name) const {
if (attribs) {
for (int i=0; attribs[i].ignore!=-1; i++)

View File

@@ -74,8 +74,8 @@ class TagDirectory {
const TagAttrib* getAttrib (int id);
const TagAttrib* getAttrib (const char* name);
const TagAttrib* getAttribTable() { return attribs; }
Tag* getTag (const char* name);
Tag* getTag (int ID);
Tag* getTag (const char* name) const;
Tag* getTag (int ID) const;
void addTag (Tag* a);
void addTagFront (Tag* a);
void replaceTag (Tag* a);

View File

@@ -84,7 +84,7 @@ BatchQueuePanel::BatchQueuePanel () {
// setup signal handlers
outdirTemplate->signal_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions));
outdirFolder->signal_current_folder_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions));
outdirFolder->signal_current_folder_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::pathFolderChanged));
useTemplate->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions));
useFolder->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions));
saveFormatPanel->setListener (this);
@@ -229,14 +229,19 @@ bool BatchQueuePanel::canStartNext () {
void BatchQueuePanel::saveOptions () {
options.saveFormat = saveFormatPanel->getFormat ();
options.savePathTemplate = outdirTemplate->get_text();
options.savePathFolder = outdirFolder->get_filename();
options.saveUsePathTemplate = useTemplate->get_active();
options.procQueueEnabled = autoStart->get_active ();
}
// We only want to save the following when it changes, \
// since these settings are shared with editorpanel :
void BatchQueuePanel::pathFolderChanged () {
options.savePathFolder = outdirFolder->get_filename();
}
void BatchQueuePanel::formatChanged () {
saveOptions ();
options.saveFormat = saveFormatPanel->getFormat ();
}

View File

@@ -71,6 +71,7 @@ class BatchQueuePanel : public Gtk::VBox,
void stopBatchProc ();
void saveOptions ();
void pathFolderChanged ();
void formatChanged ();
};

View File

@@ -553,7 +553,7 @@ int EditorPanel::saveImage (rtengine::IImage16* img, Glib::ustring& fname, SaveF
ProgressConnector<int> *ld = new ProgressConnector<int>();
img->setSaveProgressListener (parent->getProgressListener());
if (sf.format=="tif")
ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits),
ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed),
sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_imageSaved), ld, img, fileName,sf));
else if (sf.format=="png")
ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsPNG), fileName, sf.pngCompression, sf.pngBits),
@@ -605,6 +605,8 @@ void EditorPanel::saveAsPressed () {
SaveFormat sf = saveAsDialog->getFormat ();
if (getExtension (fname)!=sf.format)
fname = fname + "." + sf.format;
options.saveFormat = sf;
if (saveAsDialog->getImmediately ()) {
// check if it exists
@@ -670,26 +672,26 @@ bool EditorPanel::idle_sendToGimp( ProgressConnector<rtengine::IImage16*> *pc){
Glib::ustring fileName = Glib::ustring::compose ("%1.%2", fname, sf.format);
int tries = 1;
while (Glib::file_test (fileName, Glib::FILE_TEST_EXISTS) && tries<1000) {
fileName = Glib::ustring::compose("%1-%2.%3", fname, tries, sf.format);
tries++;
}
if (tries==1000){
img->free ();
return false;
}
int tries = 1;
while (Glib::file_test (fileName, Glib::FILE_TEST_EXISTS) && tries<1000) {
fileName = Glib::ustring::compose("%1-%2.%3", fname, tries, sf.format);
tries++;
}
if (tries==1000){
img->free ();
return false;
}
ProgressConnector<int> *ld = new ProgressConnector<int>();
img->setSaveProgressListener (parent->getProgressListener());
ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits),
ld->startFunc (sigc::bind(sigc::mem_fun(img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed),
sigc::bind(sigc::mem_fun(*this,&EditorPanel::idle_sentToGimp), ld, img, fileName));
}else{
gdk_threads_enter();
Glib::ustring msg_ = Glib::ustring("<b> Error during image processing\n</b>");
Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
msgd.run ();
gdk_threads_leave ();
gdk_threads_enter();
Glib::ustring msg_ = Glib::ustring("<b> Error during image processing\n</b>");
Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
msgd.run ();
gdk_threads_leave ();
saveimgas->set_sensitive(true);
sendtogimp->set_sensitive(true);
}

View File

@@ -184,6 +184,7 @@ if (keyFile.has_group ("Output")) {
if (keyFile.has_key ("Output", "PngCompression")) saveFormat.pngCompression = keyFile.get_integer ("Output", "PngCompression");
if (keyFile.has_key ("Output", "PngBps")) saveFormat.pngBits = keyFile.get_integer ("Output", "PngBps");
if (keyFile.has_key ("Output", "TiffBps")) saveFormat.tiffBits = keyFile.get_integer ("Output", "TiffBps");
if (keyFile.has_key ("Output", "TiffUncompressed")) saveFormat.tiffUncompressed= keyFile.get_boolean ("Output", "TiffUncompressed");
if (keyFile.has_key ("Output", "SaveProcParams")) saveFormat.saveParams = keyFile.get_boolean ("Output", "SaveProcParams");
if (keyFile.has_key ("Output", "Path")) savePathTemplate = keyFile.get_string ("Output", "Path");
if (keyFile.has_key ("Output", "PathTemplate")) savePathTemplate = keyFile.get_string ("Output", "PathTemplate");
@@ -339,6 +340,7 @@ int Options::saveToFile (Glib::ustring fname) {
keyFile.set_integer ("Output", "PngCompression", saveFormat.pngCompression);
keyFile.set_integer ("Output", "PngBps", saveFormat.pngBits);
keyFile.set_integer ("Output", "TiffBps", saveFormat.tiffBits);
keyFile.set_boolean ("Output", "TiffUncompressed", saveFormat.tiffUncompressed);
keyFile.set_boolean ("Output", "SaveProcParams", saveFormat.saveParams);
keyFile.set_string ("Output", "PathTemplate", savePathTemplate);
keyFile.set_string ("Output", "PathFolder", savePathFolder);

View File

@@ -28,6 +28,8 @@ SaveFormatPanel::SaveFormatPanel () : listener (NULL) {
pngcompr = new Adjuster (M("SAVEDLG_PNGCOMPR"), 0, 6, 1, 6);
pngcompr->setAdjusterListener (this);
pngcompr->show ();
tiffuncompressed = Gtk::manage (new Gtk::CheckButton (M("SAVEDLG_TIFFUNCOMPRESSED")));
tiffuncompressed->show();
Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ());
Gtk::Label* flab = Gtk::manage (new Gtk::Label (M("SAVEDLG_FILEFORMAT")+":"));
@@ -80,6 +82,7 @@ void SaveFormatPanel::init (SaveFormat &sf) {
pngcompr->setValue (sf.pngCompression);
jpegqual->setValue (sf.jpegQuality);
savespp->set_active (sf.saveParams);
tiffuncompressed->set_active (sf.tiffUncompressed);
listener = tmp;
}
@@ -99,6 +102,7 @@ SaveFormat SaveFormatPanel::getFormat () {
sf.tiffBits = 8;
sf.pngCompression = (int) pngcompr->getValue ();
sf.jpegQuality = (int) jpegqual->getValue ();
sf.tiffUncompressed = tiffuncompressed->get_active();
sf.saveParams = savespp->get_active ();
return sf;
}
@@ -109,6 +113,8 @@ void SaveFormatPanel::formatChanged () {
removeIfThere (formatopts, jpegqual);
else if (oformat==3 || oformat==4)
removeIfThere (formatopts, pngcompr);
else if (oformat==1 || oformat==2)
removeIfThere (formatopts, tiffuncompressed);
int act = format->get_active_row_number();
if (act<0 || act>4)
@@ -119,6 +125,8 @@ void SaveFormatPanel::formatChanged () {
formatopts->pack_start (*jpegqual, Gtk::PACK_SHRINK,4);
else if (fr=="png")
formatopts->pack_start (*pngcompr, Gtk::PACK_SHRINK,4);
else if (fr=="tif")
formatopts->pack_start (*tiffuncompressed, Gtk::PACK_SHRINK,4);
oformat = act;

View File

@@ -35,6 +35,7 @@ class SaveFormatPanel : public Gtk::VBox, public AdjusterListener {
protected:
Adjuster* jpegqual;
Adjuster* pngcompr;
Gtk::CheckButton* tiffuncompressed;
Gtk::ComboBoxText* format;
Gtk::VBox* formatopts;
int oformat;