/* * This file is part of RawTherapee. * * Copyright (c) 2004-2010 Gabor Horvath * * RawTherapee 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 3 of the License, or * (at your option) any later version. * * RawTherapee 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. * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ // generated 2004/6/3 19:15:32 CEST by gabor@darkstar.(none) // using glademm V2.5.0 // // newer (non customized) versions of this file go to raw.cc_new // This file is for your program, I won't touch it again! //#include #include #include #include #include #include #include #include #ifndef WIN32 #include #include #include #include #endif #include extern Options options; // stores path to data files Glib::ustring argv0; Glib::ustring argv1; bool simpleEditor; /* Process line command options * Returns * 0 if process in batch has executed * 1 to start GUI (with a dir or file option) * 2 to start GUI because no files found * -1 if there is an error in parameters * -2 if an error occurred during processing */ int processLineParams( int argc, char **argv ); int main(int argc, char **argv) { std::string argv0_; #ifdef WIN32 char exname[512]; GetModuleFileName (NULL, exname, 512); argv0_ = exname; // get the path where the rawtherapee is stored int i; for (i=argv0_.size()-1; (argv0_[i]!='/' && argv0_[i]!='\\') && i>0; i--); if (argv0_[i]=='/' || argv0_[i]=='\\') argv0_ = argv0_.substr(0,i); #else // get the path to data (defined in config.h which is generated by cmake) argv0_ = DATA_SEARCH_PATH; // check if path exists, otherwise revert back to behavior similar to windows try { Glib::Dir dir(DATA_SEARCH_PATH); } catch (Glib::FileError) { argv0_ = argv[0]; int i; for (i=argv0_.size()-1; (argv0_[i]!='/' && argv0_[i]!='\\') && i>0; i--); if (argv0_[i]=='/' || argv0_[i]=='\\') argv0_ = argv0_.substr(0,i); } #endif #ifdef GLIBMM_EXCEPTIONS_ENABLED argv0 = Glib::filename_to_utf8 (argv0_); #else std::auto_ptr error; argv0 = Glib::filename_to_utf8 (argv0_, error); #endif //GLIBMM_EXCEPTIONS_ENABLED Glib::thread_init(); gdk_threads_init(); Gio::init (); Options::load (); if (argc>1){ int ret = processLineParams( argc, argv); if( ret <= 0 ) return ret; } #ifndef _WIN32 // Move the old path to the new one if the new does not exist if (safe_file_test(Glib::build_filename(options.rtdir,"cache"), Glib::FILE_TEST_IS_DIR) && !safe_file_test(options.cacheBaseDir, Glib::FILE_TEST_IS_DIR)) safe_g_rename(Glib::build_filename(options.rtdir,"cache"), options.cacheBaseDir); #endif simpleEditor=false; if( !argv1.empty() ) if( Glib::file_test(argv1, Glib::FILE_TEST_EXISTS) && !Glib::file_test(argv1, Glib::FILE_TEST_IS_DIR)) simpleEditor = true; if (!options.useSystemTheme) { std::vector rcfiles; rcfiles.push_back (argv0+"/themes/"+options.theme); // Set the font face and size Gtk::RC::parse_string (Glib::ustring::compose( "style \"clearlooks-default\" { font_name = \"%1\" }", options.font)); Gtk::RC::set_default_files (rcfiles); } Gtk::Main m(&argc, &argv); RTWindow *rtWindow = new class RTWindow(); gdk_threads_enter (); m.run(*rtWindow); gdk_threads_leave (); delete rtWindow; rtengine::cleanup(); return 0; } int processLineParams( int argc, char **argv ) { std::vector inputFiles; Glib::ustring outputPath; Glib::ustring processingParams; bool isDirectory=false; bool outputDirectory=false; bool overwriteFiles=false; bool sideProcParams=false; bool copyParamsFile=false; bool useDefaultIfAbsent=true; int compression=100; int bits=-1; std::string outputType; unsigned errors=0; for( int iArg=1; iArg names; Glib::RefPtr dir = Gio::File::create_for_path ( argv[iArg] ); safe_build_file_list (dir, names, argv[iArg] ); for(size_t iFile=0; iFile< names.size(); iFile++ ){ if( !safe_file_test( names[iFile] , Glib::FILE_TEST_IS_DIR)){ // skip files without extension and pp3 files Glib::ustring s(names[iFile]); Glib::ustring::size_type ext= s.find_last_of('.'); if( Glib::ustring::npos == ext ) continue; if( ! s.substr(ext).compare( paramFileExtension )) continue; inputFiles.push_back( names[iFile] ); } } }else{ inputFiles.push_back( Glib::filename_to_utf8 (argv[iArg]) ); } } break; case 'h': case '?': default: std::cerr << "Usage:"<< std::endl; std::cerr << Glib::path_get_basename(argv[0]) << " [] : start RT GUI browser inside dir."<< std::endl; std::cerr << Glib::path_get_basename(argv[0]) << " : start GUI editor with file."<< std::endl; std::cerr << Glib::path_get_basename(argv[0]) << " -c | : convert files in batch with default parameters."<< std::endl<< std::endl; std::cerr << "Other options used with -c (that must be last option) "<< std::endl; std::cerr << Glib::path_get_basename(argv[0]) <<" [-o | -O ] [-s | -S | -p ] [-j[1-100]|-t|-n] -Y -c "<< std::endl; std::cerr << " -o | : select output directory."<< std::endl; std::cerr << " -O | : select output dir and copy pp3 file into it"<< std::endl; std::cerr << " -s : select parameters to be pp3 file next to input file (with same name)"<< std::endl; std::cerr << " ex: for IMG001.NEF there should be IMG001.NEF.pp3 in the same dir" << std::endl; std::cerr << " if absent use default" << std::endl; std::cerr << " -S : like -s but skip if pp3 file not found." << std::endl; std::cerr << " -p : specify pp3 file to be used for all conversions."<< std::endl; std::cerr << " -j[compression] : specify output to be jpeg.(default)"<< std::endl; std::cerr << " -t : specify output to be tif."<< std::endl; std::cerr << " -n : specify output to be png."<< std::endl; std::cerr << " -Y : overwrite output if present."<< std::endl; return -1; } }else{ argv1 = Glib::filename_to_utf8 ( argv[iArg] ); if( outputDirectory ){ options.savePathFolder = outputPath; options.saveUsePathTemplate = false; } if (outputType == "jpg") { options.saveFormat.format = outputType; options.saveFormat.jpegQuality = compression; } else if (outputType == "tif") { options.saveFormat.format = outputType; } else if (outputType == "png") { options.saveFormat.format = outputType; } break; } } if( !argv1.empty() ) return 1; if( !inputFiles.size() ) return 2; rtengine::procparams::ProcParams params,paramsRaw,paramsImg, *currentParams; if( !sideProcParams ){ if( processingParams.length()>0 ) params.load ( processingParams ); else{ paramsRaw.load(options.profilePath+"/"+options.defProfRaw+paramFileExtension); paramsImg.load(options.profilePath+"/"+options.defProfImg+paramFileExtension); } } for( size_t iFile=0; iFile< inputFiles.size(); iFile++){ Glib::ustring inputFile = inputFiles[iFile]; std::cout << "Processing: " << inputFile << std::endl; rtengine::InitialImage* ii=NULL; rtengine::ProcessingJob* job =NULL; int errorCode; bool isRaw=false; Glib::ustring outputFile; if( outputType.empty() ) outputType = "jpg"; if( outputPath.empty() ){ Glib::ustring s = inputFile; Glib::ustring::size_type ext= s.find_last_of('.'); outputFile = s.substr(0,ext)+ "." + outputType; }else if( outputDirectory ){ Glib::ustring s = Glib::path_get_basename( inputFile ); Glib::ustring::size_type ext= s.find_last_of('.'); outputFile = outputPath + "/" + s.substr(0,ext) + "." + outputType; }else{ Glib::ustring s = outputPath; Glib::ustring::size_type ext= s.find_last_of('.'); outputFile = s.substr(0,ext) + "." + outputType; } if( inputFile == outputFile){ std::cerr << "Cannot overwrite:" << inputFile << std::endl; continue; } if( !overwriteFiles && safe_file_test( outputFile , Glib::FILE_TEST_EXISTS ) ){ std::cerr << outputFile <<" already exists: use -Y option to overwrite:" << std::endl; continue; } // Load the image ii = rtengine::InitialImage::load ( inputFile, true, &errorCode, NULL ); if (ii) isRaw=true; else ii = rtengine::InitialImage::load ( inputFile , false, &errorCode, NULL ); if (!ii) { errors++; std::cerr << "Error loading file:"<< inputFile << std::endl; continue; } if( sideProcParams ){ Glib::ustring sideProcessingParams = inputFile + paramFileExtension; if( !safe_file_test( sideProcessingParams, Glib::FILE_TEST_EXISTS ) || params.load ( sideProcessingParams )){ if( useDefaultIfAbsent ){ currentParams = isRaw? ¶msRaw: ¶msImg; }else{ delete ii; errors++; std::cerr << "Error loading processing params:"<< sideProcessingParams << std::endl; continue; } }else currentParams = ¶ms; }else if( processingParams.length()>0 ){ currentParams = ¶ms; }else if(isRaw ){ currentParams = ¶msRaw; }else{ currentParams = ¶msImg; } job = rtengine::ProcessingJob::create (ii, *currentParams); if( !job ){ errors++; std::cerr << "Error creating processing for:"<< inputFile << std::endl; ii->decreaseRef(); continue; } // Process image rtengine::IImage16* resultImage = rtengine::processImage (job, errorCode, NULL, options.tunnelMetaData); if( !resultImage ){ errors++; std::cerr << "Error processing:"<< inputFile << std::endl; rtengine::ProcessingJob::destroy( job ); continue; } // save image to disk if( outputType=="jpg" ) errorCode = resultImage->saveAsJPEG( outputFile, compression ); else if( outputType=="tif" ) errorCode = resultImage->saveAsTIFF( outputFile, bits, compression==0 ); else if( outputType=="png" ) errorCode = resultImage->saveAsPNG( outputFile,compression, bits ); else errorCode = resultImage->saveToFile (outputFile); if(errorCode){ errors++; std::cerr << "Error saving to:"<< outputFile << std::endl; }else{ if( copyParamsFile ){ Glib::ustring outputProcessingParams = outputFile + paramFileExtension; currentParams->save( outputProcessingParams ); } } ii->decreaseRef(); resultImage->free(); } return errors>0?-2:0; }