From 7d846c4d2660d075d9cbad76a99b5677622ddbe5 Mon Sep 17 00:00:00 2001 From: sashavasko Date: Mon, 10 May 2010 17:51:05 -0600 Subject: [PATCH] Implemented TIFF LZW compression --- rtdata/languages/Catala | 1 + rtdata/languages/Chinese (Simplified) | 1 + rtdata/languages/Chinese (Traditional) | 1 + rtdata/languages/Czech | 1 + rtdata/languages/Dansk | 1 + rtdata/languages/Deutsch | 1 + rtdata/languages/English (UK) | 1 + rtdata/languages/English (US) | 1 + rtdata/languages/Espanol | 1 + rtdata/languages/Euskara | 1 + rtdata/languages/Francais | 1 + rtdata/languages/Greek | 1 + rtdata/languages/Hebrew | 1 + rtdata/languages/Italian | 1 + rtdata/languages/Japanese | 1 + rtdata/languages/Latvian | 1 + rtdata/languages/Magyar | 1 + rtdata/languages/Nederlands | 1 + rtdata/languages/Norsk BM | 1 + rtdata/languages/Polish | 1 + rtdata/languages/Polish (Latin Characters) | 1 + rtdata/languages/Portugues (Brasil) | 1 + rtdata/languages/Russian | 1 + rtdata/languages/Slovak | 1 + rtdata/languages/Suomi | 1 + rtdata/languages/Swedish | 1 + rtdata/languages/Turkish | 1 + rtengine/iimage.h | 2 +- rtengine/image16.h | 2 +- rtengine/image8.h | 2 +- rtengine/imageio.cc | 59 ++++++++++++++++++---- rtengine/imageio.h | 2 +- rtexif/rtexif.cc | 4 +- rtexif/rtexif.h | 4 +- rtgui/batchqueuepanel.cc | 13 +++-- rtgui/batchqueuepanel.h | 1 + rtgui/editorpanel.cc | 34 +++++++------ rtgui/options.cc | 2 + rtgui/saveformatpanel.cc | 8 +++ rtgui/saveformatpanel.h | 1 + 40 files changed, 123 insertions(+), 38 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index b4e2164c8..e384f5863 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -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 diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 773f90427..9e2063666 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -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 diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 7882aeb7c..362916f0a 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -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 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 78d3fa00f..5b5fe76fa 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -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) diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 24498edf1..d0e3faafa 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -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 diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index fa0e36edc..b2a583ab3 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -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) diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 94a8e7792..bd946a975 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -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 diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index d556bee01..1c5d0ecdc 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -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 diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 55d4c7a78..481714b04 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -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 diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index afb0e1316..5b871dc2b 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -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 diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 7e4339506..0b3481b0a 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -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 diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index c5c2983fd..e9c26b650 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -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 diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 3ea07f42f..1b6785b4f 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -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 diff --git a/rtdata/languages/Italian b/rtdata/languages/Italian index 90c1287e7..0a4c577dc 100644 --- a/rtdata/languages/Italian +++ b/rtdata/languages/Italian @@ -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 diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index e2e61bcfd..c7f8119d3 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -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 diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index f868c6d56..05205fb46 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -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 diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 1aef65acf..83e7dff91 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -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 diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 183d234db..89e16b1b0 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -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 diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 2f25dd318..e7bdeda53 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -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 diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index a86a44e60..5074544a1 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -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) diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index cee3dc3d7..e33b18e69 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -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 diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 8e8da978b..6d3d31f40 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -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 diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 91965d2ff..a43ecc530 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -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 diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index 27d3f3b25..fe6e57683 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -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 diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index be40061b6..9282b25c1 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -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) diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 4c6747702..8b3018e7a 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -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) diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index b9e3c0430..76f3b0a98 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -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) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 5fbfb4b06..792149a63 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -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; diff --git a/rtengine/image16.h b/rtengine/image16.h index d4e9e9188..8a778215b 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -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; } diff --git a/rtengine/image8.h b/rtengine/image8.h index 422169fe1..629cc8f0b 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -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; } diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index a3f513057..6185cc053 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -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); diff --git a/rtengine/imageio.h b/rtengine/imageio.h index e3d1bc58c..8095dcc02 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -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; } diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index dbb716342..5d3bcdf81 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -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; igetID()==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++) diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 7b85119cf..7280a6c67 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -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); diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index ac9925127..ef0761ebe 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -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 (); } diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 22bd0c6be..b38b15989 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -71,6 +71,7 @@ class BatchQueuePanel : public Gtk::VBox, void stopBatchProc (); void saveOptions (); + void pathFolderChanged (); void formatChanged (); }; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 962d95638..c94ac2be5 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -553,7 +553,7 @@ int EditorPanel::saveImage (rtengine::IImage16* img, Glib::ustring& fname, SaveF ProgressConnector *ld = new ProgressConnector(); 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 *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 *ld = new ProgressConnector(); 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(" Error during image processing\n"); - 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(" Error during image processing\n"); + 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); } diff --git a/rtgui/options.cc b/rtgui/options.cc index 0af737b70..5f25b88b6 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -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); diff --git a/rtgui/saveformatpanel.cc b/rtgui/saveformatpanel.cc index 6e820191b..9372be349 100644 --- a/rtgui/saveformatpanel.cc +++ b/rtgui/saveformatpanel.cc @@ -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; diff --git a/rtgui/saveformatpanel.h b/rtgui/saveformatpanel.h index ec5e302ff..50f1473c1 100644 --- a/rtgui/saveformatpanel.h +++ b/rtgui/saveformatpanel.h @@ -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;