2005: 2006: 2007: 2008: 2009: 2010: 2011: 2012: 2013: Jan (84) Feb (83) Mar (36) Apr (15) May (250) Jun (81) Jul (29) Aug (62) Sep (22) Oct (13) Nov (62) Dec (30) Jan (67) Feb (68) Mar (149) Apr (51) May (8) Jun (23) Jul (87) Aug (132) Sep (9) Oct (1) Nov (22) Dec (163) Jan (74) Feb (71) Mar (2) Apr (121) May (57) Jun (168) Jul (151) Aug (73) Sep (4) Oct (91) Nov (30) Dec (38) Jan (178) Feb (159) Mar (49) Apr (65) May (43) Jun (56) Jul (99) Aug (132) Sep (71) Oct (57) Nov (42) Dec (11) Jan (40) Feb (74) Mar (80) Apr (45) May (86) Jun (76) Jul (160) Aug (170) Sep (227) Oct (161) Nov (49) Dec (108) Jan (108) Feb (82) Mar (62) Apr (33) May (60) Jun (38) Jul (46) Aug (69) Sep (157) Oct (123) Nov (130) Dec (154) Jan (138) Feb (112) Mar (128) Apr (4) May (86) Jun (81) Jul (128) Aug (98) Sep (69) Oct (32) Nov (50) Dec (41) Jan (10) Feb (6) Mar (17) Apr (10) May (67) Jun (57) Jul (41) Aug (54) Sep (17) Oct (15) Nov (34) Dec (45) Jan (62) Feb (47) Mar (71) Apr (25) May (11) Jun Jul Aug Sep (57) Oct Nov (1) Dec
S M T W T F S
1 2 3

4 5 6 7 8 9 10
(1) (6) (1) (1)
11 12 13 14 15 16 17
(1) (1) (1) (2) (5) (3) (1)
18 19 20 21 22 23 24
(2) (1) (2)   (2) (3) (2)
25 26 27 28 29 30 31
(1) (1) (1) (2) (3) (3)
 hugin-cvs deleted-77506-tracker Nested Flat Threaded Ultimate Show 25 Show 50 Show 75 Show 100
 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: [OSX] typo corrected From: - 2010-07-29 20:39 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/c5c9bb0923a3 changeset: 4172:c5c9bb0923a3 user: harryvanderwolf date: Thu Jul 29 22:39:07 2010 +0200 description: [OSX] typo corrected diffstat: CMakeLists.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff -r 27b53a38eb7e -r c5c9bb0923a3 CMakeLists.txt --- a/CMakeLists.txt Thu Jul 29 19:51:17 2010 +0200 +++ b/CMakeLists.txt Thu Jul 29 22:39:07 2010 +0200 @@ -337,7 +337,7 @@ SET(INSTALL_OSX_BUNDLE_DIR /Applications/MacPorts CACHE DOCSTRING "Install directory Hugin and HuginStitchProject application bundles") ELSE(CMAKE_INSTALL_PREFIX STREQUAL "/opt/local") # fink or other custom system. - SET(INSTALL_OSX_BUNDLE_DIR ${CMAKE_INSTALL_PREFIX}/Application CACHE DOCSTRING "Install directory Hugin and HuginStitchProject application bundles") + SET(INSTALL_OSX_BUNDLE_DIR${CMAKE_INSTALL_PREFIX}/Applications CACHE DOCSTRING "Install directory Hugin and HuginStitchProject application bundles") ENDIF(CMAKE_INSTALL_PREFIX STREQUAL "/opt/local") MESSAGE("*** Will install application bundles in ${INSTALL_OSX_BUNDLE_DIR}, set INSTALL_OSX_BUNDLE_DIR to change the location") ENDIF (NOT MAC_SELF_CONTAINED_BUNDLE)   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: [OSX] neccessary adjustment for cmake ... From: - 2010-07-29 18:04 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/27b53a38eb7e changeset: 4171:27b53a38eb7e user: harryvanderwolf date: Thu Jul 29 19:51:17 2010 +0200 description: [OSX] neccessary adjustment for cmake compilation diffstat: CMakeLists.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (11 lines): diff -r 31fdaa8ffc2c -r 27b53a38eb7e CMakeLists.txt --- a/CMakeLists.txt Wed Jul 28 17:23:49 2010 +0200 +++ b/CMakeLists.txt Thu Jul 29 19:51:17 2010 +0200 @@ -424,6 +424,7 @@ SET (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flat_namespace -undefined suppress" ) SET (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -flat_namespace -undefined suppress" ) SET (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -flat_namespace -undefined suppress" ) + SET (CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib" ) IF (${CMAKE_BUILD_TYPE} STREQUAL "Release") SET (CMAKE_C_FLAGS_RELEASE:STRING " $CMAKE_C_FLAGS_RELEASE ") SET (CMAKE_CXX_FLAGS_RELEASE:STRING "$CMAKE_CXX_FLAGS_RELEASE ") 

 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Ported the make-pipe execution functio... From: - 2010-07-29 17:31 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/d9da0f5f77d7 changeset: 4170:d9da0f5f77d7 user: Florian Achleitner date: Thu Jul 29 19:30:36 2010 +0200 description: Ported the make-pipe execution function to native windows api. The testers run on windows now, but they still miss tools they invoke (touch, cp, echo..) Remove Filename, obsolete. diffstat: src/hugin_base/makefilelib/CMakeLists.txt | 13 +- src/hugin_base/makefilelib/Filename.cpp | 29 ---- src/hugin_base/makefilelib/Filename.h | 33 ----- src/hugin_base/makefilelib/test_util_win32.cpp | 147 +++++++++++++++++++++++++ 4 files changed, 157 insertions(+), 65 deletions(-) diffs (258 lines): diff -r 08eea48ddb18 -r d9da0f5f77d7 src/hugin_base/makefilelib/CMakeLists.txt --- a/src/hugin_base/makefilelib/CMakeLists.txt Wed Jul 28 10:29:09 2010 +0200 +++ b/src/hugin_base/makefilelib/CMakeLists.txt Thu Jul 29 19:30:36 2010 +0200 @@ -1,9 +1,12 @@ SET(MAKEFILELIB_SRC Comment.cpp MakefileItem.cpp Variable.cpp VariableRef.cpp - Filename.cpp Makefile.cpp Rule.cpp VariableDef.cpp AutoVariable.cpp Conditional.cpp) -SET(MAKEFILELIB_HEADER Comment.h Makefile.h Rule.h Variable.h Filename.h + Makefile.cpp Rule.cpp VariableDef.cpp AutoVariable.cpp Conditional.cpp) +SET(MAKEFILELIB_HEADER Comment.h Makefile.h Rule.h Variable.h MakefileItem.h VariableDef.h VariableRef.h AutoVariable.h Newline.h Conditional.h char_type.h StringAdapter.h) +# use -Wall not on Windows, there are thousands of pointless padding warnings. +IF(NOT WIN32) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") +ENDIF(NOT WIN32) IF (${HUGIN_SHARED_LIBS}) add_library(makefilelib SHARED ${MAKEFILELIB_SRC}${MAKEFILELIB_HEADER}) @@ -21,7 +24,11 @@ target_link_libraries(makefilelib ${Boost_LIBRARIES}) # test_util +IF(WIN32) +add_library(test_util STATIC test_util_win32.cpp test_util.h) +ELSE(WIN32) add_library(test_util STATIC test_util.cpp test_util.h) +ENDIF(WIN32) # tester executable add_executable(test_simple main.cpp) @@ -31,4 +38,4 @@ target_link_libraries(test_filenames test_util makefilelib${Boost_LIBRARIES}) add_executable(test_makefilelib test_makefilelib.cpp) -target_link_libraries(test_makefilelib test_util makefilelib ${Boost_LIBRARIES}) \ No newline at end of file +target_link_libraries(test_makefilelib test_util makefilelib${Boost_LIBRARIES}) diff -r 08eea48ddb18 -r d9da0f5f77d7 src/hugin_base/makefilelib/Filename.cpp --- a/src/hugin_base/makefilelib/Filename.cpp Wed Jul 28 10:29:09 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/** - * @file Filename.cpp - * @brief - * Created on: May 25, 2010 - * @author Florian Achleitner - */ - -#include "Filename.h" - -namespace makefile -{ - -Filename::Filename() -{ - // TODO Auto-generated constructor stub - -} - -Filename::~Filename() -{ - // TODO Auto-generated destructor stub -} - -string Filename::toString() -{ - -} - -} diff -r 08eea48ddb18 -r d9da0f5f77d7 src/hugin_base/makefilelib/Filename.h --- a/src/hugin_base/makefilelib/Filename.h Wed Jul 28 10:29:09 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/** - * @file Filename.h - * @brief - * Created on: May 25, 2010 - * @author Florian Achleitner - */ - -#ifndef FILENAME_H_ -#define FILENAME_H_ - -/** - * - */ -#include "MakefileItem.h" - -namespace makefile -{ - -/** - * Encapsulates a filename handling platform specific issues like allowed characters. - */ -class Filename: public makefile::MakefileItem -{ -public: - Filename(); - virtual ~Filename(); - - virtual string toString(); -}; - -} - -#endif /* FILENAME_H_ */ diff -r 08eea48ddb18 -r d9da0f5f77d7 src/hugin_base/makefilelib/test_util_win32.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin_base/makefilelib/test_util_win32.cpp Thu Jul 29 19:30:36 2010 +0200 @@ -0,0 +1,147 @@ +/** + * @file test_util_win32.cpp + * @brief Useful functions for testers. This is the WIN32 Version. + * It uses black WIN32-API magic to to the same as the original. + * Created on: Jul 27, 2010 + * @author Florian Achleitner + */ + +#include +#include +#include +#include +#include +#include "Makefile.h" +#include "test_util.h" + +#include +#include + +#include +#include +#include + +using namespace makefile; +namespace fs = boost::filesystem; +namespace io = boost::iostreams; + +namespace makefile { namespace tester { +/** + * Executes make with capturing stderr and stdout and feeding the makefile via stdin. + * This is the WIN32 Version. + * It uses black WIN32-API magic to to the same as the original. + * @param argv as required by execvp (execvp takes a NULL-terminated array of null-terminated strings.) See manpage. + * @param makeoutbuf stdout of make goes here. + * @param makeerrbuf stderr of make goes here. + * @return return value of make. Uses macros to extract the value from wait(). See man wait. + */ +int exec_make(std::stringbuf& makeoutbuf, std::stringbuf& makeerrbuf) +{ + // store 2 HANDLE per pipe {read, write} + HANDLE hmakein_rd = NULL; + HANDLE hmakein_wr = NULL; + HANDLE hmakeout_rd = NULL; + HANDLE hmakeout_wr = NULL; + HANDLE hmakeerr_rd = NULL; + HANDLE hmakeerr_wr = NULL; + + // this is taken from an example in msdn + SECURITY_ATTRIBUTES sa; + sa.nLength = sizeof(SECURITY_ATTRIBUTES); // seems that windows doesn't know it's own structs ;) + sa.bInheritHandle = true; + sa.lpSecurityDescriptor = NULL; + + if( !CreatePipe(&hmakeout_rd, &hmakeout_wr, &sa, 0) || // create pipes + !CreatePipe(&hmakein_rd, &hmakein_wr, &sa, 0) || + !CreatePipe(&hmakeerr_rd, &hmakeerr_wr, &sa, 0) || + !SetHandleInformation(hmakeout_rd, HANDLE_FLAG_INHERIT, 0) || // and set inheritance handle information + !SetHandleInformation(hmakein_wr, HANDLE_FLAG_INHERIT, 0) || + !SetHandleInformation(hmakeerr_rd, HANDLE_FLAG_INHERIT, 0)) + { + std::cerr << "CreatePipe() failed." << std::endl; + return -1; + } + + + // parent creates child + PROCESS_INFORMATION pi; + STARTUPINFO si; + + // Set up members of the PROCESS_INFORMATION structure. + + ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) ); + + // Set up members of the STARTUPINFO structure. + // This structure specifies the STDIN and STDOUT handles for redirection. + + ZeroMemory( &si, sizeof(STARTUPINFO) ); + si.cb = sizeof(STARTUPINFO); + si.hStdError = hmakeerr_wr; + si.hStdOutput = hmakeout_wr; + si.hStdInput = hmakein_rd; + si.dwFlags |= STARTF_USESTDHANDLES; + + // Create the child process. + + if( !CreateProcess(NULL, + "make -f-", // command line + NULL, // process security attributes + NULL, // primary thread security attributes + TRUE, // handles are inherited + 0, // creation flags + NULL, // use parent's environment + NULL, // use parent's current directory + &si, // STARTUPINFO pointer + &pi)) // receives PROCESS_INFORMATION + { + std::cerr << "CreateProcess failed" << std::endl; + return -1; + } + // Important, close unused pipe ends. + CloseHandle(hmakeout_wr); + CloseHandle(hmakeerr_wr); + CloseHandle(hmakein_rd); + + + // boost gives us a way to use those pipes in C++ style. + // the code_converter allows wchar mode Makefile to be written to a char-pipe +#ifdef USE_WCHAR + io::stream< io::code_converter > makein(fdmakein[1]); +#else + io::stream makein(hmakein_wr); +#endif + io::stream makeout(hmakeout_rd); + io::stream makeerr(hmakeerr_rd); + + // Write the makefile to make's stdin + Makefile::getSingleton().writeMakefile(makein); + Makefile::getSingleton().clean(); + makein.close(); + + makeout.get(makeoutbuf, '\0'); // delimiter \0 should read until eof. + makeerr.get(makeerrbuf, '\0'); + + WaitForSingleObject(pi.hProcess, INFINITE); + DWORD status; + GetExitCodeProcess(pi.hProcess, &status); + return status; +} + +bool Test::run() +{ + int status = exec_make(makeoutbuf, makeerrbuf); + + std::cout << std::setw(30) << std::left << name; + if(eval()) + { + std::cout << "PASS" << std::endl; + return true; + } + std::cout << "FAIL" << std::endl; + std::cout << "ret: " << status << std::endl; + std::cout << "out: " << makeoutbuf.str() << std::endl; + std::cout << "cmp: " << goodout << std::endl; + std::cout << "err: " << makeerrbuf.str() << std::endl; + return false; +} +}} 

 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Fixes possible bug in 5e631cee4cc5 From: - 2010-07-28 15:24 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/31fdaa8ffc2c changeset: 4169:31fdaa8ffc2c user: tmodes date: Wed Jul 28 17:23:49 2010 +0200 description: Fixes possible bug in 5e631cee4cc5 (It's not sure, that the constants ID_SHOW_PANEL_IMAGES ... ID_SHOW_PANEL_PANORAMA are consecutive. They can have random values.) diffstat: src/hugin1/hugin/MainFrame.cpp | 26 +++++++++++++++++++++++++- 1 files changed, 25 insertions(+), 1 deletions(-) diffs (36 lines): diff -r 5e631cee4cc5 -r 31fdaa8ffc2c src/hugin1/hugin/MainFrame.cpp --- a/src/hugin1/hugin/MainFrame.cpp Tue Jul 27 23:27:25 2010 +0200 +++ b/src/hugin1/hugin/MainFrame.cpp Wed Jul 28 17:23:49 2010 +0200 @@ -1087,7 +1087,31 @@ void MainFrame::OnShowPanel(wxCommandEvent & e) { - m_notebook->SetSelection(e.GetId()-XRCID("ID_SHOW_PANEL_ASSISTANT")); + if(e.GetId()==XRCID("ID_SHOW_PANEL_IMAGES")) + m_notebook->SetSelection(1); + else + if(e.GetId()==XRCID("ID_SHOW_PANEL_LENS")) + m_notebook->SetSelection(2); + else + if(e.GetId()==XRCID("ID_SHOW_PANEL_CROP")) + m_notebook->SetSelection(3); + else + if(e.GetId()==XRCID("ID_SHOW_PANEL_MASK")) + m_notebook->SetSelection(4); + else + if(e.GetId()==XRCID("ID_SHOW_PANEL_CP_EDITOR")) + m_notebook->SetSelection(5); + else + if(e.GetId()==XRCID("ID_SHOW_PANEL_OPTIMIZER")) + m_notebook->SetSelection(6); + else + if(e.GetId()==XRCID("ID_SHOW_PANEL_OPTIMIZER_PHOTOMETRIC")) + m_notebook->SetSelection(7); + else + if(e.GetId()==XRCID("ID_SHOW_PANEL_PANORAMA")) + m_notebook->SetSelection(8); + else + m_notebook->SetSelection(0); } 

 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: 5 new changesets From: - 2010-07-28 14:27 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/40d2c64e8f3a changeset: 4164:40d2c64e8f3a user: Florian Achleitner date: Tue Jul 27 12:22:58 2010 +0200 description: - Extract make exec with makefile input via a pipe and use it in test_filename --> double speed - capture stderr too details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/2fcd5c5ccfc2 changeset: 4165:2fcd5c5ccfc2 user: Florian Achleitner date: Tue Jul 27 12:32:05 2010 +0200 description: add docu details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/bbbcff39b7ba changeset: 4166:bbbcff39b7ba user: Florian Achleitner date: Tue Jul 27 22:37:31 2010 +0200 description: - make test_util wchar compatible - extend tester details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/e32b21d40e63 changeset: 4167:e32b21d40e63 user: Florian Achleitner date: Wed Jul 28 09:15:55 2010 +0200 description: C++ify tester to overcome design problems. details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/08eea48ddb18 changeset: 4168:08eea48ddb18 user: Florian Achleitner date: Wed Jul 28 10:29:09 2010 +0200 description: add TestConditional diffstat: src/hugin_base/makefilelib/CMakeLists.txt | 7 +- src/hugin_base/makefilelib/test_filenames.cpp | 34 ++- src/hugin_base/makefilelib/test_makefilelib.cpp | 170 +++++++++++++++-------- src/hugin_base/makefilelib/test_util.cpp | 117 ++++++++++++++++ src/hugin_base/makefilelib/test_util.h | 48 ++++++ 5 files changed, 300 insertions(+), 76 deletions(-) diffs (truncated from 515 to 500 lines): diff -r d735217f801b -r 08eea48ddb18 src/hugin_base/makefilelib/CMakeLists.txt --- a/src/hugin_base/makefilelib/CMakeLists.txt Tue Jul 27 00:04:46 2010 +0200 +++ b/src/hugin_base/makefilelib/CMakeLists.txt Wed Jul 28 10:29:09 2010 +0200 @@ -20,14 +20,15 @@ # additional libs target_link_libraries(makefilelib ${Boost_LIBRARIES}) - +# test_util +add_library(test_util STATIC test_util.cpp test_util.h) # tester executable add_executable(test_simple main.cpp) target_link_libraries(test_simple makefilelib) add_executable(test_filenames test_filenames.cpp) -target_link_libraries(test_filenames makefilelib${Boost_LIBRARIES}) +target_link_libraries(test_filenames test_util makefilelib ${Boost_LIBRARIES}) add_executable(test_makefilelib test_makefilelib.cpp) -target_link_libraries(test_makefilelib makefilelib${Boost_LIBRARIES}) \ No newline at end of file +target_link_libraries(test_makefilelib test_util makefilelib ${Boost_LIBRARIES}) \ No newline at end of file diff -r d735217f801b -r 08eea48ddb18 src/hugin_base/makefilelib/test_filenames.cpp --- a/src/hugin_base/makefilelib/test_filenames.cpp Tue Jul 27 00:04:46 2010 +0200 +++ b/src/hugin_base/makefilelib/test_filenames.cpp Wed Jul 28 10:29:09 2010 +0200 @@ -21,11 +21,14 @@ #include "Conditional.h" #include "StringAdapter.h" +#include "test_util.h" + #include #include #include using namespace makefile; +using namespace makefile::tester; namespace fs = boost::filesystem; #ifdef USE_WCHAR @@ -36,6 +39,8 @@ ostream& cerr = std::cerr; #endif +#define START 0x20 + /** * Prints the tested characters. * @param out @@ -60,7 +65,7 @@ { std::vector miss; char_type c[] = cstr("X.1"); - for(*c = 0x20; static_cast(*c) < limit; (*c)++) + for(*c = START; static_cast(*c) < limit; (*c)++) { path filename(c); ofstream file(dir / filename); @@ -92,10 +97,9 @@ const path makefile(cstr("makefile")); std::vector miss; char_type c[] = cstr("X.1"); - for(*c = 0x20; static_cast(*c) < limit; (*c)++) + for(*c = START; static_cast(*c) < limit; (*c)++) { path filename(c); - ofstream makefilefile(dir / makefile); // If the filename cannot be stored in a Variable, theres no chance to bring it through. try { @@ -107,19 +111,22 @@ mffilename.getDef().add(); touch.add(); - makefile::Makefile::getSingleton().writeMakefile(makefilefile); - makefile::Makefile::clean(); - makefilefile.close(); string dirstring = dir.string(); - std::string command("cd " + StringAdapter(dirstring) + " && make"); - int makeerr = std::system(command.c_str()); + const char* argv[] = {"make", ("-C" + StringAdapter(dirstring)).c_str(), "-f-", NULL}; + std::stringbuf makeout, makeerr; + int ret = exec_make(argv, makeout, makeerr); - if(makeerr) - std::cerr << "make returned " << makeerr << std::endl; + + if(ret) + { + std::cerr << "make returned " << ret << std::endl; + std::cout << makeout.str(); + std::cerr << makeerr.str(); + } } catch(std::exception& e) { - std::cerr << "Variable exception: " << e.what() << "*c = " << static_cast(*c) << std::endl; + std::cerr << "Variable exception: " << e.what() << std::endl; } if(!fs::exists(dir / filename)) @@ -159,7 +166,7 @@ }else{ limit = std::atoi(argv[1]); } - std::cout << "Creating " << static_cast(limit) << " files in" << std::endl; + std::cout << "Creating " << static_cast(limit) - START << " files in" << std::endl; path basepath(fs::initial_path() / cstr("chartest_direct")); path basepathmake(fs::initial_path() / cstr("chartest_make")); @@ -177,11 +184,12 @@ cout << cstr("Direct: Missing files ") << miss_direct.size() << std::endl; for(std::vector::iterator i = miss_direct.begin(); i != miss_direct.end(); i++) cout << i->string() << cstr('\n'); - + cout << std::endl; std::vector miss_make = createfiles_make(basepathmake, limit); cout << cstr("Make: Missing files ") << miss_make.size() << std::endl; for(std::vector::iterator i = miss_make.begin(); i != miss_make.end(); i++) cout << i->string() << cstr('\n'); + cout << std::endl; return 0; } diff -r d735217f801b -r 08eea48ddb18 src/hugin_base/makefilelib/test_makefilelib.cpp --- a/src/hugin_base/makefilelib/test_makefilelib.cpp Tue Jul 27 00:04:46 2010 +0200 +++ b/src/hugin_base/makefilelib/test_makefilelib.cpp Wed Jul 28 10:29:09 2010 +0200 @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include "Comment.h" #include "Variable.h" #include "VariableDef.h" @@ -22,6 +22,8 @@ #include "Conditional.h" #include "StringAdapter.h" +#include "test_util.h" + #include #include @@ -29,6 +31,8 @@ namespace fs = boost::filesystem; namespace io = boost::iostreams; +namespace makefile { namespace tester { + #ifdef USE_WCHAR ostream& cout = std::wcout; ostream& cerr = std::wcerr; @@ -37,80 +41,126 @@ ostream& cerr = std::cerr; #endif -bool run(const char* testname, const char* goodout) +struct TestComment : public Test { - // store 2 fd {read, write} - int fdmakein[2]; - int fdmakeout[2]; - if(pipe(fdmakein) || pipe(fdmakeout)) + Comment comment; + TestComment() + :Test("Comment", ""), + comment(cstr("First line")) { - std::cerr << "pipe() failed." << std::endl; - return false; + comment.appendLine(cstr("second line")); + comment.appendLine(cstr("third line\nfourth\r line")); + comment.add(); } - std::stringbuf makeoutbuf; +}; - if(fork()) - { // parent - close(fdmakein[0]); - close(fdmakeout[1]); +struct TestRule : public Test +{ + Rule rule, rule2; - io::stream makein(fdmakein[1]); - io::stream makeout(fdmakeout[0]); - // Write the makefile to make's stdin - Makefile::getSingleton().writeMakefile(makein); - Makefile::getSingleton().clean(); - makein.close(); - makeout.get(makeoutbuf, '\0'); // delimiter \0 should read until eof. - wait(NULL); + TestRule() + :Test("Rule", "cp 1.in 1.out\ncp 2.in 2.out\nHello Make\n") + { + rule.addTarget(cstr("all")); + rule.addPrereq(cstr("1.out")); + rule.addPrereq(cstr("2.out")); + rule.addCommand(cstr("@echo Hello Make")); + rule.add(); + rule2.addTarget(cstr("%.out")); + rule2.addPrereq(cstr("%.in")); + rule2.addCommand(cstr("cp$*.in @")); + rule2.add(); - } else { // child - close(fdmakein[1]); - close(fdmakeout[0]); - // replace stdin and stdout - if(dup2(fdmakein[0], 0) == -1 || dup2(fdmakeout[1], 1) == -1) - { - std::cerr << "Failed to switch std stream" << std::endl; - exit(-1); - } - - // execvp takes a NULL-terminated array of null-terminated strings. cool ;) - const char* const argv[] = {"make", "-f-", (char*) NULL}; - execvp(argv[0], (char* const*)argv); + std::ofstream in1("1.in"); in1.close(); + std::ofstream in2("2.in"); in2.close(); } - // Compare output - std::cout << "make says: " << makeoutbuf.str() << std::endl; - std::cout << testname << " "; - if(std::string(goodout) == makeoutbuf.str()) + bool precond() { - std::cout << "PASS" << std::endl; - return true; + return fs::exists("1.out") && fs::exists("2.out"); } - std::cout << "FAIL" << std::endl; - return false; + ~TestRule() + { + fs::remove("1.in"); fs::remove("2.in"); fs::remove("1.out"); fs::remove("2.out"); + } +}; + +struct TestConditional : public Test +{ + Variable var1, var2, var3, ifvar1, ifvar2, ifvar3, ifvar4, elsevar1, elsevar2, elsevar3, elsevar4; + ConditionalDEF cdef1, cdef2; + ConditionalEQ ceq1, ceq2; + Rule rule; + TestConditional() + :Test("Conditional", + "Results:\n" + "cond1 is true\n" + "cond2 is false\n" + "cond3 is true\n" + "cond4 is false\n"), + var1(cstr("VAR1"), cstr("equal")), + var2(cstr("VAR2"), cstr("equal")), + var3(cstr("VAR3"), cstr("nequal")), + ifvar1(cstr("TESTVAR1"), cstr("cond1 is true")), + ifvar2(cstr("TESTVAR2"), cstr("cond2 is true")), + ifvar3(cstr("TESTVAR3"), cstr("cond3 is true")), + ifvar4(cstr("TESTVAR4"), cstr("cond4 is true")), + elsevar1(ifvar1.getName(), cstr("cond1 is false")), + elsevar2(ifvar2.getName(), cstr("cond2 is false")), + elsevar3(ifvar3.getName(), cstr("cond3 is false")), + elsevar4(ifvar4.getName(), cstr("cond4 is false")), + cdef1(var1.getName()), + cdef2(cstr("THISISNOTDEFINED")), + ceq1(var1.getRef(), var2.getRef()), + ceq2(var1.getRef(), var3.getRef()) + { + var1.getDef().add(); + var2.getDef().add(); + var3.getDef().add(); + rule.addTarget(cstr("all")); + rule.addCommand(cstr("@echo Results:")); + rule.addCommand(cstr("@echo ") + ifvar1.getRef().toString()); + rule.addCommand(cstr("@echo ") + ifvar2.getRef().toString()); + rule.addCommand(cstr("@echo ") + ifvar3.getRef().toString()); + rule.addCommand(cstr("@echo ") + ifvar4.getRef().toString()); + + cdef1.addToIf(ifvar1.getDef()); + cdef1.addToElse(elsevar1.getDef()); + cdef2.addToIf(ifvar2.getDef()); + cdef2.addToElse(elsevar2.getDef()); + + ceq1.addToIf(ifvar3.getDef()); + ceq1.addToElse(elsevar3.getDef()); + ceq2.addToIf(ifvar4.getDef()); + ceq2.addToElse(elsevar4.getDef()); + + cdef1.add(); + cdef2.add(); + ceq1.add(); + ceq2.add(); + rule.add(); + +// ofstream mf("test.mk"); +// Makefile::getSingleton().writeMakefile(mf); + } +}; + +void do_test(bool& result, Test* test) +{ + result &= test->run(); + delete test; } -bool test_Comment() -{ - Comment comment(cstr("First line")); - comment.appendLine(cstr("second line")); - comment.appendLine(cstr("third line\nfourth\r line")); - comment.add(); - return run("Comment", ""); -} +}} // namespace +using namespace makefile::tester; -bool test_Rule() -{ - Rule rule; - rule.addTarget(cstr("all")); - rule.addCommand(cstr("@echo Hello Make")); - rule.add(); - return run("Rule", "Hello Make\n"); -} int main(int argc, char *argv[]) { bool result = true; - result &= test_Comment(); - result &= test_Rule(); + do_test(result, new TestComment); + do_test(result, new TestRule); + do_test(result, new TestConditional); return !result; // return 0 on success (= !true) } + + diff -r d735217f801b -r 08eea48ddb18 src/hugin_base/makefilelib/test_util.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin_base/makefilelib/test_util.cpp Wed Jul 28 10:29:09 2010 +0200 @@ -0,0 +1,117 @@ +/** + * @file test_util.cpp + * @brief Useful functions for testers. + * Created on: Jul 27, 2010 + * @author Florian Achleitner + */ + +#include +#include +#include +#include +#include +#include +#include "Makefile.h" +#include "test_util.h" + +#include +#include +#include + +using namespace makefile; +namespace fs = boost::filesystem; +namespace io = boost::iostreams; + +namespace makefile { namespace tester { +/** + * Executes make with capturing stderr and stdout and feeding the makefile via stdin. + * @param argv as required by execvp (execvp takes a NULL-terminated array of null-terminated strings.) See manpage. + * @param makeoutbuf stdout of make goes here. + * @param makeerrbuf stderr of make goes here. + * @return return value of make. Uses macros to extract the value from wait(). See man wait. + */ +int exec_make(const char* const argv[], std::stringbuf& makeoutbuf, std::stringbuf& makeerrbuf) +{ + // store 2 fd per pipe {read, write} + int fdmakein[2]; + int fdmakeout[2]; + int fdmakeerr[2]; + if(pipe(fdmakein) || pipe(fdmakeout) || pipe(fdmakeerr)) + { + std::cerr << "pipe() failed." << std::endl; + return false; + } + + + if(fork()) + { // parent + close(fdmakein[0]); + close(fdmakeout[1]); + close(fdmakeerr[1]); + + // boost gives us a way to use those pipes in C++ style. + // the code_converter allows wchar mode Makefile to be written to a char-pipe +#ifdef USE_WCHAR + io::stream< io::code_converter > makein(fdmakein[1]); +#else + io::stream makein(fdmakein[1]); +#endif + io::stream makeout(fdmakeout[0]); + io::stream makeerr(fdmakeerr[0]); + + // Write the makefile to make's stdin + Makefile::getSingleton().writeMakefile(makein); + Makefile::getSingleton().clean(); + makein.close(); + + makeout.get(makeoutbuf, '\0'); // delimiter \0 should read until eof. + makeerr.get(makeerrbuf, '\0'); + + int status; + wait(&status); // status contains return value an some other flags + if(WIFEXITED(status)) // that can be evaluated by these macros (man wait) + { + return WEXITSTATUS(status); + } + // If WIFEXITED is false, something complicated happened (signal etc..). + std::cerr << "Command terminated abnormally. status=" << std::hex << status << std::endl; + return status; + + + } else { // child + close(fdmakein[1]); + close(fdmakeout[0]); + close(fdmakeerr[0]); + // replace stdin and stdout + if(dup2(fdmakein[0], 0) == -1 || dup2(fdmakeout[1], 1) == -1 || dup2(fdmakeerr[1], 2) == -1) + { + std::cerr << "Failed to switch std stream" << std::endl; + exit(-1); + } + + // execvp takes a NULL-terminated array of null-terminated strings. cool ;) + // like this const char* const argv[] = {"make", "-f-", (char*) NULL}; + execvp(argv[0], (char* const*)argv); + return -1; // exec should never return + } +} + +bool Test::run() +{ + const char* argv[] = {"make", "-f-", NULL}; + int status = exec_make(argv, makeoutbuf, makeerrbuf); + + std::cout << std::setw(30) << std::left << name; + if(eval()) + { + std::cout << "PASS" << std::endl; + return true; + } + std::cout << "FAIL" << std::endl; + std::cout << "ret: " << status << std::endl; + std::cout << "out: " << makeoutbuf.str() << std::endl; + std::cout << "cmp: " << goodout << std::endl; + std::cout << "err: " << makeerrbuf.str() << std::endl; + return false; +} +}} diff -r d735217f801b -r 08eea48ddb18 src/hugin_base/makefilelib/test_util.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin_base/makefilelib/test_util.h Wed Jul 28 10:29:09 2010 +0200 @@ -0,0 +1,48 @@ +/** + * @file test_util.h + * @brief Prototype only. + * Created on: Jul 27, 2010 + * @author Florian Achleitner + */ + +#ifndef TEST_UTIL_H_ +#define TEST_UTIL_H_ + +namespace makefile { namespace tester { +int exec_make(const char* const argv[], std::stringbuf& makeoutbuf, std::stringbuf& makeerrbuf); + +/** + * Base class for tests; + */ +class Test +{ + /// store makes output + std::stringbuf makeoutbuf, makeerrbuf; + /// Test's name + const char* name; + /// Output on stdout if test passes. + const char* goodout; + bool result; +public: + /// Prepare the MakefileItems + Test(const char* name_, const char* goodout_) + :name(name_), goodout(goodout_), result(false) {} + /// Eventual cleanup + virtual ~Test() {} + /// Execute the test + virtual bool run();   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Add menuitems Show panel ... with sho... From: - 2010-07-27 21:46 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/5e631cee4cc5 changeset: 4163:5e631cee4cc5 user: Vaclav Cerny date: Tue Jul 27 23:27:25 2010 +0200 description: Add menuitems Show panel ... with shortcut diffstat: src/hugin1/hugin/MainFrame.cpp | 20 ++++++++++++++++ src/hugin1/hugin/MainFrame.h | 1 + src/hugin1/hugin/xrc/main_menu.xrc | 46 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 0 deletions(-) diffs (104 lines): diff -r 2fc209cbb6ee -r 5e631cee4cc5 src/hugin1/hugin/MainFrame.cpp --- a/src/hugin1/hugin/MainFrame.cpp Sat Jul 24 15:56:19 2010 +0200 +++ b/src/hugin1/hugin/MainFrame.cpp Tue Jul 27 23:27:25 2010 +0200 @@ -171,6 +171,19 @@ EVT_MENU(XRCID("ID_CP_TABLE"), MainFrame::OnShowCPFrame) EVT_BUTTON(XRCID("ID_CP_TABLE"),MainFrame::OnShowCPFrame) + + EVT_MENU(XRCID("ID_SHOW_PANEL_ASSISTANT"), MainFrame::OnShowPanel) + EVT_MENU(XRCID("ID_SHOW_PANEL_IMAGES"), MainFrame::OnShowPanel) + EVT_MENU(XRCID("ID_SHOW_PANEL_LENS"), MainFrame::OnShowPanel) + EVT_MENU(XRCID("ID_SHOW_PANEL_CROP"), MainFrame::OnShowPanel) + EVT_MENU(XRCID("ID_SHOW_PANEL_MASK"), MainFrame::OnShowPanel) + EVT_MENU(XRCID("ID_SHOW_PANEL_CP_EDITOR"), MainFrame::OnShowPanel) + EVT_MENU(XRCID("ID_SHOW_PANEL_OPTIMIZER"), MainFrame::OnShowPanel) + EVT_MENU(XRCID("ID_SHOW_PANEL_OPTIMIZER_PHOTOMETRIC"), MainFrame::OnShowPanel) + EVT_MENU(XRCID("ID_SHOW_PANEL_PANORAMA"), MainFrame::OnShowPanel) + + + EVT_MENU(XRCID("action_add_images"), MainFrame::OnAddImages) EVT_BUTTON(XRCID("action_add_images"), MainFrame::OnAddImages) @@ -1071,6 +1084,13 @@ wxLaunchDefaultBrowser(wxT("http://sourceforge.net/project/project_donations.php?group_id=77506")); } + +void MainFrame::OnShowPanel(wxCommandEvent & e) +{ + m_notebook->SetSelection(e.GetId()-XRCID("ID_SHOW_PANEL_ASSISTANT")); +} + + void MainFrame::OnAbout(wxCommandEvent & e) { AboutDialog dlg(this); diff -r 2fc209cbb6ee -r 5e631cee4cc5 src/hugin1/hugin/MainFrame.h --- a/src/hugin1/hugin/MainFrame.h Sat Jul 24 15:56:19 2010 +0200 +++ b/src/hugin1/hugin/MainFrame.h Tue Jul 27 23:27:25 2010 +0200 @@ -201,6 +201,7 @@ void DisplayHelp(wxString section); void OnShowDonate(wxCommandEvent &e); + void OnShowPanel(wxCommandEvent &e); // update progress display bool displayProgress(); diff -r 2fc209cbb6ee -r 5e631cee4cc5 src/hugin1/hugin/xrc/main_menu.xrc --- a/src/hugin1/hugin/xrc/main_menu.xrc Sat Jul 24 15:56:19 2010 +0200 +++ b/src/hugin1/hugin/xrc/main_menu.xrc Tue Jul 27 23:27:25 2010 +0200 @@ -114,6 +114,52 @@ Ctrl-shift-p Show the OpenGL preview window +  [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: 2 new changesets From: - 2010-07-22 22:33 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/ac59be554ab8 changeset: 4147:ac59be554ab8 user: Bruno Postle date: Thu Jul 22 23:27:01 2010 +0100 description: New pages from wiki details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/36d225248e33 changeset: 4148:36d225248e33 user: Bruno Postle date: Thu Jul 22 23:32:49 2010 +0100 description: Update manual from wiki diffstat: src/hugin1/hugin/xrc/data/help_en_EN/197px-Field-of-view.svg.png | 0 src/hugin1/hugin/xrc/data/help_en_EN/360px-Pantheon-150x100-rect-panini.jpg | 0 src/hugin1/hugin/xrc/data/help_en_EN/Autooptimiser.html | 3 +- src/hugin1/hugin/xrc/data/help_en_EN/Autopano-sift-C.html | 3 +- src/hugin1/hugin/xrc/data/help_en_EN/Chromatic_aberration.html | 2 +- src/hugin1/hugin/xrc/data/help_en_EN/DSLR_spherical_resolution.html | 22 +- src/hugin1/hugin/xrc/data/help_en_EN/Enfuse.html | 2 + src/hugin1/hugin/xrc/data/help_en_EN/Field_of_View.html | 5 +- src/hugin1/hugin/xrc/data/help_en_EN/HDR_workflow_with_hugin.html | 10 +- src/hugin1/hugin/xrc/data/help_en_EN/Horizontal_control_points.html | 5 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin.html | 6 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Camera_and_Lens_tab.html | 4 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Control_Points_tab.html | 8 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_FAQ.html | 9 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Fast_Preview_window.html | 9 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Images_tab.html | 4 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Mask_tab.html | 6 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Optimizer_tab.html | 26 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Parameters_for_Control_Point_Detectors_dialog.html | 22 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Preferences.html | 4 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Reset_Values_window.html | 158 +++++++++ src/hugin1/hugin/xrc/data/help_en_EN/Hugin_translation_guide.html | 61 +-- src/hugin1/hugin/xrc/data/help_en_EN/Pano_modify.html | 171 ++++++++++ src/hugin1/hugin/xrc/data/help_en_EN/Panorama_scripting_in_a_nutshell.html | 21 +- src/hugin1/hugin/xrc/data/help_en_EN/Pitch.html | 2 +- src/hugin1/hugin/xrc/data/help_en_EN/Projections.html | 2 +- src/hugin1/hugin/xrc/data/help_en_EN/Pto_merge.html | 158 +++++++++ src/hugin1/hugin/xrc/data/help_en_EN/SmartBlend.html | 3 +- src/hugin1/hugin/xrc/data/help_en_EN/Straight_line_control_points.html | 8 +- src/hugin1/hugin/xrc/data/help_en_EN/Swing_rod.html | 1 + src/hugin1/hugin/xrc/data/help_en_EN/The_General_Panini_Projection.html | 135 +------ src/hugin1/hugin/xrc/data/help_en_EN/Vertical_control_points.html | 4 +- src/hugin1/hugin/xrc/data/help_en_EN/Wavy_distortion.html | 3 +- src/hugin1/hugin/xrc/data/help_en_EN/Yaw.html | 2 +- src/hugin1/hugin/xrc/data/help_en_EN/pages.txt | 3 + 35 files changed, 663 insertions(+), 219 deletions(-) diffs (truncated from 1455 to 500 lines): diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/197px-Field-of-view.svg.png Binary file src/hugin1/hugin/xrc/data/help_en_EN/197px-Field-of-view.svg.png has changed diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/360px-Pantheon-150x100-rect-panini.jpg Binary file src/hugin1/hugin/xrc/data/help_en_EN/360px-Pantheon-150x100-rect-panini.jpg has changed diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Autooptimiser.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Autooptimiser.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Autooptimiser.html Thu Jul 22 23:32:49 2010 +0100 @@ -4,7 +4,7 @@ - + @@ -57,6 +57,7 @@ • auto-align mode will pick an optimisation scheme suited to the distribution of control points in the project so there is no need to specify parameters to optimise. • autooptimiser can adjust the panorama field of view, dimensions and projection to suit the input images. • the field of view of input images can be specified, this is useful as the project files created by autopano and autopano-sift don't specify the field of view of the input photos. + • autooptimiser can also perform photometric optimisation. Depending on the input images it selects automaticly these photometric parameters (exposure, white balance, vignetting, camera response curve) which should be optimised. • diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Autopano-sift-C.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Autopano-sift-C.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Autopano-sift-C.html Thu Jul 22 23:32:49 2010 +0100 @@ -43,9 +43,10 @@ - autopano-sift-C is a C port of the C# software autopano-sift. It is somewhat faster and doesn't require a C# runtime - Installing the mono C# runtime on OS X has proved to be problematic on some systems. + autopano-sift-C can be used to find control points in overlapping image pairs and is a C port of the C# software autopano-sift. It is somewhat faster and doesn't require a C# runtime - Installing the mono C# runtime on OS X has proved to be problematic on some systems. Additionally, autopano-sift-C has experimental modifications to perform feature identification in conformal image space, this helps with wide angle or fisheye Projection photographs. autopano-sift-C is available from the hugin project and can only be used within hugin as an optional installation due to patent issues: the use of the Scale-invariant feature transform algorithm is restricted by US Patent 6,711,293, awarded March 23, 2004 to the University of British Columbia. + The current version 2.5.1 (autopano-sift-C-2.5.1) is available since the release of hugin 0.7 in October 2008. Installation on Mac OS X On Mac OS X, autopano-sift-c can be installed via MacPorts: diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Chromatic_aberration.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Chromatic_aberration.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Chromatic_aberration.html Thu Jul 22 23:32:49 2010 +0100 @@ -143,7 +143,7 @@ (switch on GIF animation to see the different channels in the right image) As you can see part of the image details move but part doesn't (the blade of grass in the center). If you minimize the fringes there will be new fringes or even double details with different color: - This weird kind of colored fringes is definitely not lens CA. I can only think of some effects with the microlenses Nikon placed in front of each sensor pixel, but this is wild guess. + This weird kind of colored fringes is definitely not lens CA. I can only think of some effects of bayer interpolation, but this is wild guess. How to correct In many cases it would be enough to adjust the size of the color channels to correct for TCA. However, correction might not always be satisfactory even if it is of the true tCA type. This might have different causes: diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/DSLR_spherical_resolution.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/DSLR_spherical_resolution.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/DSLR_spherical_resolution.html Thu Jul 22 23:32:49 2010 +0100 @@ -63,9 +63,9 @@ In the Fisheye Projection an angular distance from the optical axis maps to a linear distance on the sensor. The mapping is determined by the focal length (the following numbers are approximations, since real fisheyes almost never resemble the ideal fisheye mapping): • 5.6mm focal length 11.4Â°/mm - • 8mm focal length 7.2Â°/mm - • 10.5mm focal length 5.5Â°/mm - • 16mm focal length 3.6Â°/mm + • 8mm focal length 8Â°/mm + • 10.5mm focal length 6Â°/mm + • 16mm focal length 4Â°/mm Pixel density To deduce the pixel resolution obtainable by a certain sensor/lens combination we should know the density in pixels/mm of the respective sensor. The pixel density can be calculated roughly from the Megapixels (better would be actual pixel size) and the sensor size. For the three major groups and some typical Megapixel sizes: @@ -90,14 +90,14 @@ Pano sizes From the above values we can easily calculate some sample panorama resolutions. The table gives some rounded values for the maximum pixel size of an equirectangular: - FourThirds MP - - - - 6 8 10 12 -APS-C MP - - 6 8 10 12 - - -Full size MP 6 8 12 16 21 - - - -pixel/mm 80 100 120 140 160 180 200 230 -f=5.6mm size 2520 3150 3780 4420 5050 5680 6300 7260 -f=8mm size 4000 5000 6000 7000 8000 9000 10000 11500 -f=10.5mm size 5200 6500 7900 9200 10500 11800 13100 15000 -f=16mm size 8000 10000 12000 14000 16000 18000 20000 23000 + FourThirds MP - - - - 6 8 10 12 +APS-C MP - - 6 8 10 12 - - +Full size MP 6 8 12 16 21 - - - +pixel/mm 80 100 120 140 160 180 200 230 +f=5.6mm size 2520 3150 3780 4420 5050 5680 6300 7260 +f=8mm size 3600 4500 5400 6300 7200 8100 9000 10350 +f=10.5mm size 4800 6000 7200 8400 9600 10800 12000 13800 +f=16mm size 7200 9000 10800 12600 14400 16200 18000 20700 The formula for an exact calculation is --Erik Krause 22:11, 21 August 2007 (CEST) diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Enfuse.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Enfuse.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Enfuse.html Thu Jul 22 23:32:49 2010 +0100 @@ -204,6 +204,8 @@ • PTGui Pro since version 7.7 has a built in image fusion tool which features the exposure criterion only but has extended adjustment possibilities. + • LR/Enfuse is a Lightroom plugin for blending exposures directly from within Lightroom using Enfuse. It works on Mac and PC. Get it from http://photographers-toolbox.com/products/lrenfuse.php + Linux • KImageFuser by Harry van der Wolf is an enfuse/align_image_stack Gui for Linux (free GPL V3). It has a preview function and batch options. It is written in the graphical script environment kommander and can run on any linux platform. Dependencies are: kdewebdev-3.5.9 or newer, enfuse, align_image_stack (from Hugin), convert (ImageMagick). Not a dependendency but highly recommended: Exiftool to be able to copy all relevant exif data (ImageDescription, Make, Model, Artist, WhitePoint, Copyright, GPS:all, DateTimeOriginal, CreateDate, UserComment, ColorSpace, OwnerName, SerialNumber, all IPTC, all JFIF, XResolution, YResolution, ResolutionUnit, Lens, FocalLengthIn35mmFormat and FocalLength) to the new image. All dependencies are available in the main linux distributions. Note also that at least one KDE theme should be available like e.g. the famous (and default) "bluecurve" theme. KImageFuser has also been added to the Hugin svn in it's own project KImageFuser tree. diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Field_of_View.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Field_of_View.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Field_of_View.html Thu Jul 22 23:32:49 2010 +0100 @@ -46,7 +46,10 @@ The angle of view of a photograph or camera is a measure of the proportion of a scene included in the image. Simply said: How many degrees of view are included in an image. A typical fixed lens camera might have an angle of view of 50Â°, a fisheye lens can have an angle of view greater than 180Â° and a full equirectangular or cylindrical panorama would have an angle of view of 360Â°. Most people speak of field of view when in fact they mean angle of view. Field of view is the distance covered by a projection at a certain distance. So if an image exactly shows a 2 meter wide object at 1 meter distance, then the field of view is 2 meter (and the angle of view is 90Â°). -Angle of view is also known as angle of coverage. From here on and on the rest of the wiki we will only speak of field of view (although we should speak of angle of view). +Angle of view is also known as angle of coverage. + + + From here on and on the rest of the wiki we will only speak of field of view (although we should speak of angle of view). Field of view is often abbreviated as FoV. Usually field of view refers to the horizontal field of view (hFoV) of an image. Some applications make use of the vertical field of view (vFoV) which can be calculated from the Aspect Ratio of the image: For rectilinear images: diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/HDR_workflow_with_hugin.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/HDR_workflow_with_hugin.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/HDR_workflow_with_hugin.html Thu Jul 22 23:32:49 2010 +0100 @@ -64,13 +64,13 @@ Quick and easy technique - The rest of this tutorial describes generating high quality output using command-line -tools. However it is now possible to complete the workflow entirely with GUI tools, -something like this: + The rest of this tutorial describes generating high quality output using command-line tools. However it is now possible to complete the workflow entirely with GUI tools, something like this: 1. Take bracketed shots of your scene. - 2. Merge bracketed shots to HDR with qtpfsgui, pick either RBGE radiance .hdr output or 32bit floating-point TIFF. - 3. Stitch the panorama with hugin and enblend. + 4. Open bracketed images in Hugin. Align - let's say - the middle exposures together and set the stacks in the Images tab. + 1. If your stacks don't align (shot hand-held, sloppy panohead, etc.), set some control points inside stacks and align them too. + + 5. Stitch the panorama with hugin and enblend to HDR file. 6. Optionally tonemap the result with qtpfsgui. Laborious and difficult technique diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Horizontal_control_points.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Horizontal_control_points.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Horizontal_control_points.html Thu Jul 22 23:32:49 2010 +0100 @@ -46,8 +46,9 @@ The panorama tools optimizer understands various different schemes for aligning photos using control points: -Normal points are t0 points, horizontal control points are t1 points and -vertical control points are t2 points. +Normal points are t0 points, horizontal control points are t1 points, +vertical control points are t2 points, +and straight line control points are t3, t4, etc... points. The main use of horizontal control points is to change the perspective of the output panorama such that the marked structures are horizontal in the output projection. In a multi image panorama this is only possible if the optimization of Roll and Pitch is allowed for all images and of Yaw for all but the anchor image. You set horizontal control points on a horizontal structure apart from each other. However, be careful in a cylindrical or equirectangular panorama not to set them 180Â° apart, since this won't level the horizon. Please note that all real world horizontal lines only stay horizontal in rectilinear projection. In cylindrical, equirectangular and fisheye projections only the horizon itself stays horizontal. diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin.html Thu Jul 22 23:32:49 2010 +0100 @@ -76,6 +76,10 @@ • celeste_standalone removes cloud-like control points from project files. • PTBatcherGUI a GUI queue manager for stitching multiple hugin projects. • PTBatcher command-line access to the hugin Batch Processor stitching queue. + • deghosting_mask Creates mask for removing ghosting in bracketed images + • pano_modify Change output parameters of project file + • pano_trafo Transform image coordinates + • pto_merge Merges two or more Hugin project files • panoglview OpenGL panorama viewer stored in sourceforge SVN alongside hugin which must be built separately. • autopano-sift-C version of autopano-sift written in C, also needs to be built separately. • @@ -97,7 +101,7 @@ • Hugin Preview window • Hugin Fast Preview window • Hugin Control Points table - • Hugin Reset Values window + • Hugin Reset Values window • Hugin Keyboard shortcuts • Development diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Camera_and_Lens_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Camera_and_Lens_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Camera_and_Lens_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -63,7 +63,7 @@ Geometric The Panorama Tools lens correction model has enough parameters to model most photographic images, these parameters can be set manually here in the hugin Camera and Lens tab or calculated automatically in the hugin Optimizer tab. - Note that any or all of these parameters can be changed back to good defaults in the Hugin Reset Values window reached by clicking the Reset... button. + Note that any or all of these parameters can be changed back to good defaults in the Hugin Reset Values window reached by clicking the Reset... button. Lens The most important parameters are the Horizontal field of view and the Lens type. Hugin supports the following projections in input images: @@ -94,7 +94,7 @@ Photometric hugin models the photometric parameters of a lens/camera combination in a similar way to the lens correction model for Geometric parameters. These parameters can be set manually here in the hugin Camera and Lens tab or calculated automatically in the hugin Exposure tab. - Note that any or all of these parameters can be changed back to good defaults in the Hugin Reset Values window reached by clicking the Reset... button. + Note that any or all of these parameters can be changed back to good defaults in the Hugin Reset Values window reached by clicking the Reset... button. Exposure and Color Exposure (EV), EV stands for Exposure Value, setting it to 0 (zero) will diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Control_Points_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Control_Points_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Control_Points_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -59,9 +59,7 @@ auto add adds the control point as soon as both points have been specified. If the images are zoomed out (fit to window), the first click zooms to a temporary 100% view to give you the chance to refine your selection. Note that only the second click will trigger the auto estimate. - Often it is hard to select the corresponding point exactly. -However, the control points should be as accurate as possible, for good results. -Once a point pair has been roughly selected, the fine tune function of hugin can be used to estimate the corresponding point up to one tenth of a pixel. + For good results, the control points should be as accurate as possible. However, it is often tedious to select a particular point exactly, and it may be helpful to use the arrow keys (left, right, up, and down) to nudge the selection point in various directions pixel-by-pixel (users of X11 may need to ensure that a particular image pane has the focus by placing the mouse cursor within its bounds). Once a point pair has been roughly selected, the fine tune function of hugin can be used to estimate the corresponding point up to one tenth of a pixel. The keyboard short cut for the fine tune function is the f key. Fine tune only search in a small neighbourhood of the currently selected points. The size of this neighbourhood can be controlled by opening the Hugin Preferences panel and setting the Local area search width. @@ -115,13 +113,13 @@ Key Function • a add a new point that has been selected in both images, and the auto add is switched off. - • cursor keys scroll image under the mouse cursor - • shift + cursor keys scroll both images at the same time • f fine tune currently selected control point pair. Same as the Fine Tune button • g experimental control point generation algorithm. • Del Remove currently selected control point. • 0 Zoom out to full view. • 1 100% view. + • arrow keys nudge a selection point or selected control point around pixel-by-pixel. + • shift + arrow keys scroll both images at the same time. Mouse function Function diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_FAQ.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_FAQ.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_FAQ.html Thu Jul 22 23:32:49 2010 +0100 @@ -46,9 +46,16 @@ Common error messages enblend: no input files specified - There are no input images relevant to the output 'panorama' so hugin had nothing to do, probably because all the input images are outside the panorama 'frame'. Open the Hugin Preview window or Hugin Fast Preview window to adjust the view and/or crop. + There are no input images relevant to the output 'panorama' so hugin had nothing to do, probably because all the input images are outside the panorama 'frame' or disabled. Open the Hugin Preview window or Hugin Fast Preview window to adjust the view, enable some images inside the panorama frame and/or adjust the crop. Note also that hugin versions up to and including 2009.2.0 allow you to draw an inverted crop frame where the top is below the bottom, this is easy to see in the Preview window as the entire panorama is 'greyed'. A crop frame drawn like this will result in an empty panorama and the above error message. + enblend: excessive overlap detected + This is an error new to enblend-4.0. Photos that nearly entirely overlap won't blend very well, enblend now fails instead of attempting to blend them. There are various workarounds: + + • Follow the error message and remove the suggested image from the set, you probably don't need it to complete the panorama. + • Switch back to enblend-3.2. + • Hugin will merge stacked images before blending if you select 'Exposure fusion' in the Hugin Stitcher tab. This error will go away, but Hugin will take a very different approach to variable exposure between photos. + enblend: error writing to image swap file enblend needs a lot of memory and uses its own swap routine to store picture data on the disk, this message indicates that you have run out of disk space. The data is stored in the system temp folder which is specified by TMP, TEMP or TMPDIR environment variables, note that this temp folder may be on a different physical disk to your photos and panorama output. diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Fast_Preview_window.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Fast_Preview_window.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Fast_Preview_window.html Thu Jul 22 23:32:49 2010 +0100 @@ -66,8 +66,7 @@ Enables full photometric correction. When turned on, this will cause significant delay when changing photometric parameters. It also takes a while to turn on and off. However, with it enabled you get much better representation of the colours in the output. With it turned off, you get correction only for exposure and white balance. With it turned on, you also get vignetting and colour response correction. The Hugin Preview window does all these things by default, so you may wish to use that instead. Show control points - When this tool is turned on, all Control points are drawn as lines; red indicates 'normal' control points and blue indicates horizontal control points, vertical control points or straight line control points. - Long red lines indicate a bad alignment or unoptimized images, short red lines or 'dots' indicate a good alignment between control points. Horizontal and vertical control points should be perpendicular in the panorama. + When this tool is turned on, all Control points are drawn as lines with crosses at each end. Green, yellow, orange, and red lines and their crosses indicate 'normal' control points. A red control point is misaligned (the ends of the line are father apart), and a green control point is well aligned (the ends of the line are almost in the same position). Blue indicates horizontal control points, vertical control points or straight line control points. Blend mode The normal blend mode will draw the images as a stack. The difference blend mode will do the same, except the image under the mouse pointer will be subtracted from the rest of the stack. Use this to determine if the alignment went well: where you can see edges in the subtracted image, these edges are misaligned. Be warned that this isn't fully accurate, the other preview has a better difference mode. @@ -107,6 +106,12 @@ If the panorama contains unconnected components, they will move individually. + Drag mode + This determines what parameters that are changed when the images are dragged. + + • Normal - When dragged left-right, the yaw parameter is changed and when dragged up-down the pitch parameter is changed. I.e. the camera is tilted in the yaw and pitch angles. + • Mosaic - When dragged left-right, X parameter is changed and when dragged up-down the Y parameter is changed. I.e. the camera is moved in the X and Y dimensions. + Center This button horizontally pans the output, changing the yaw of the remapped images so they fit to the centre of the output frame. This is useful if there is a lot of black space on the left or right of the output. This also performs a Fit, equivalent to the next button. Note that centering a Rectilinear Projection or Fisheye Projection panorama will change the perspective, this may be unwanted. diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Images_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Images_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Images_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -57,11 +57,13 @@ Using Clean control points button, hugin will try to find and remove outlying control points using statistical methods. Image orientation - In the Image Orientation section, the position of the selected images in the final panorama can be specified by yaw, pitch and roll angle (in degrees). The Reset button will reset all angles to zero. This is useful if the optimizer could not determine the image orientation well and got stuck with a suboptimal result. It is possible to select multiple images at the same time. Changes in orientation will be applied to all selected images. + In the Image Orientation section, the position of the selected images in the final panorama can be specified by yaw, pitch and roll angle (in degrees); and the X, Y, and Z translation parameters. The Reset button will reset all angles and translations to zero. This is useful if the optimizer could not determine the image orientation well and got stuck with a suboptimal result. It is possible to select multiple images at the same time. Changes in orientation will be applied to all selected images. Note that it is also possible to reset Image Orientation along with other parameters using the Reset... button on the Hugin Camera and Lens tab. Select Anchor this image for position to indicate that a particular image shouldn't move when optimising with the hugin Optimizer tab. Only one image can be the anchor, and by default this is the first image in the project. + Image orientation can be linked between a group of images if they are already aligned. For example, if they form a bracketed set shot on a sturdy tripod. To do this, select all the images in the stack, and press the New stack button. You can also move images into an existing stack without selecting all the other images in the stack: press Change stack... and enter the stack number you want the selected images to join. The stack number of each image is given in the table. + If your images form approximately aligned stacks, you can create stacks as usual, select all the images and then uncheck Link by the image orientation. Approximately aligned stacks are common when you shoot bracketed sets handheld, or in windy conditions with a light tripod. Hugin will remember that the images form a stack, but does not force the image orientation and translation to be the same across the stack. This is useful for specifying stacks when you have a Panorama with Stacks control point detector configuration before control point generation. You do not have to manually mark approximately aligned stacks in other circumstances, however. Exposure Selecting Anchor this image for exposure will indicate that a particular image should be used as diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Mask_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Mask_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Mask_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -63,7 +63,7 @@ Deleting a mask You can delete the active mask by the delete mask button. The active mask is also deleted by -pressing the delete key when all or none point of the current mask are selected. +pressing the delete key when all or none points of the current mask are selected. Select mask There are 3 ways to select a mask @@ -82,10 +82,10 @@ If you want to move the whole mask, drag the mask with right mouse button. (You have to start dragging inside the polygon.) Adding points - You can add a new point to the mask polygon by click with left mouse button while holding down the ctrl key on a line segment. Until you release the left mouse button you can also direclty move the newly created point. + You can add a new point to the mask polygon by click with left mouse button while holding down the ctrl key on a line segment. Until you release the left mouse button you can also directly move the newly created point. Deleting points - You can delete a single point of the active polygon by a right mouse click while holding ctrl key on a point. To delete multiply points drag a rectangle/rubberband with the right mouse button and pressed ctrl key around the points, which should be deleted. When you press the delete key the selected points are deleted. + You can delete a single point of the active polygon by a right mouse click while holding ctrl key on a point. To delete multiple points drag a rectangle/rubberband with the right mouse button and pressed ctrl key around the points, which should be deleted. When you press the delete key the selected points are deleted. Attention: When the remaining polygon consists of less than tree points, the delete operation is canceled. diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Optimizer_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Optimizer_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Optimizer_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -48,7 +48,8 @@ So to align photos you need some control points, a general rule is that optimising more parameters requires more control points. Quick Optimizer - Use the Optimize combo box to pick one of several pre-set optimisation schemes, then click the Optimize now! button to calculate the best available fit. One valid technique is to try each optimisation scheme in turn, starting at the top, until you are satisfied with the results. + Use the Optimize combo box to pick one of several pre-set optimisation schemes, then click the Optimize now! button to calculate the best available fit. For a spherical panorama, which is where each image is taken from the same position, you should not optimise translation. For a linear panorama, where you take pictures from different locations of the same flat surface, you must optimise translation. + One valid technique is to try each optimisation scheme in turn, starting at the top, and skipping the ones with translation if you are making a spherical panorama, until you are satisfied with the results. The Optimisation result tells you how good the alignment is, large control point error distances indicate one of several things: • Some control points are in the wrong place, look at the list in the hugin Control Points table and identify points with large distances and check they are set properly. @@ -73,28 +74,43 @@ Note that to align any pair of photos, there should be at least two pairs of control points connecting them. Positions (y,p,r) - This is exactly the same as the incremental setting above except that all parameters are optimised at once, this may confuse the optimiser if the images are not already roughly in the right place. Don't use this setting. + This is exactly the same as the incremental setting above except that the parameters are optimised at once, this may confuse the optimiser if the images are not already roughly in the right place. Don't use this setting. + + Positions and Translations (y,p,r,x,y,z) + This will optimise image orientation and the translation you get when moving the camera for a linear panorama. This is great for stitching images of the same flat surface taken from different places, for example when you couldn't fit a painting or the front of a building into one picture. Again it isn't ideal if the lens information such as the field of view is wrong. Positions and View (y,p,r,v) This is the same as optimising Positions except that the lens Field of View is optimised too - Use this if you don't trust the Field of View calculated from the photo's EXIF data. Note that for this too work you need at least three well-spaced pairs of control points between any pair of photos. With a 360 degree panorama it is usually beneficial to optimise the Field of View, even if you have already calibrated this beforehand. + Positions, Translation and View (y,p,r,x,y,z,v) + This is similar to Positions and Translations, except you can use it when you don't trust the Field of View from the EXIF data. + Positions and Barrel Distortion (y,p,r,b) - This is the same as optimising Positions except that an attempt is made to discover the lens barrel distortion at the same time. Only the b parameter of the full lens correction model is varied by this optimisation scheme, as this is a reasonable approximation of the distortion of a typical lens. + This is the same as optimising Positions except that an attempt is made to discover the lens barrel distortion at the same time. Only the b parameter of the full lens correction model is varied by this optimisation scheme, as this is a reasonable approximation of the distortion of a typical lens. You should trust the field of view if you use this. Again you need at least three well-placed pairs of control points between any pair of photos. Positions, View and Barrel (y,p,r,v,b) As the name suggests this optimises positions, Field of View and barrel distortion all at once. + Positions, Translation, View and Barrel (y,p,r,x,y,z,b,b) + This is useful when you are optimising a linear panorama, don't trust the field of view, and want to correct barrel distortion. + + Everything without translation + This optimises image orientation and all geometric parameters in the full lens correction model. It includes more lens distortion parameters. The x shift and y shift (d and e) parameters account for the centre of the projection not being in the centre of the image. This is quite common, and gets very bad if an image is the cropped corner of another image. + You will need many control points, the more the better, and preferably a full spherical panorama (360 by 180 degrees) to get the best correction. You should also use a calibrated panoramic head. If the control points are bad (either there are not enough or some are in the wrong place), or your images were not taken around the no-parallax point, this could produce bizarre results. + However, if you do this well, you will accurately perform lens calibration. You can save and reuse this lens information on the Camera and Lens tab. + Everything - Selecting Everything optimises every parameter in the full lens correction model, this will produce bizarre results unless you are using a calibrated panoramic head and lots of control points (the more points the better) - This is one way to perform lens calibration. + Selecting Everything really optimises everything, including the translation parameters. You will need a huge number of control points to do this successfully. The Custom parameters below The pre-set optimisation options are useful for most situations, but often it is necessary to switch to Custom parameters. For example, when shooting hand-held panoramas, some of the position variation between shots can be resolved by using different d and e Image Center Shift parameters for each shot. Select The Custom parameters below and pick the d and e parameters for optimisation. Note that by default, lens settings are shared for all photos in the project, go to the hugin Camera and Lens tab and uncheck the link box for any you want to have different values in each photo. + Similarly, the translation parameters could be used to correct a wonky shot. However, they were meant for linear panoramas which expand to infinite distance at 180 degrees field of view, so you must make sure any images with non-zero translation (X, Y, or Z parameters) are in the middle of the panorama (y and p should all be around zero, and the field of view shouldn't be large enough to make them expand more than 180 degrees). This can be used to patch in the floor after you have removed the tripod that was obscuring it. You can take a shot of the floor where the tripod was at an angle (therefore you can avoid casting a shadow on the image in most cases). You can then optimise X,Y,Z on only this image. However, the floor must be flat for this to work, and this shot must be in the middle of the panorama. You can make down the middle by rotating the panorama on either of the previews. Image Orientation - The Image Orientation section shows the photo number and roll, pitch and yaw rotation/orientation values for all input photos (in parenthesis), the check mark indicates parameters that will be optimised. + The Image Orientation section shows the photo number and roll, pitch and yaw rotation/orientation values for all input photos (in parenthesis), and the X, Y, and Z translation parameters. The check mark indicates parameters that will be optimised. The translation parameters should all be 0 on a spherical panorama. Lens Parameters The Lens Parameters section shows the lens number and the lens correction model parameters (in parenthesis) for each of the distinct lenses in the project. Only parameters that are linked in the hugin Camera and Lens tab are shown in parenthesis. diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Parameters_for_Control_Point_Detectors_dialog.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Parameters_for_Control_Point_Detectors_dialog.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Parameters_for_Control_Point_Detectors_dialog.html Thu Jul 22 23:32:49 2010 +0100 @@ -4,7 +4,7 @@ - + @@ -47,19 +47,19 @@ Description - You should give your parameter set a meaningful name, because this name is shown in the GUI on the Hugin Images tab. + You should give your parameter-set a meaningful name, because this name is shown in the GUI on the Hugin Images tab. Type All images at once With this setting all images are transferred at once to the control point detector. This was the default setting of Hugin versions before 2010.2. Autopano (by A. Jenny) - This is the same procedure like All images at once with some modifications for using autopano by Alexandre Jenny (only Windows and Linux, there is no MacOS version). + This is the same procedure as All images at once with some modifications for using autopano by Alexandre Jenny (only Windows and Linux, there is no MacOS version). Panorama with stacks - This setting is indented for panoramas with stacks. In a first step it selects the image with the median exposure of every stack. Then it tries to match these median exposured images. After this step all image stacks should be connected. - Then it tries to connect the images of every stack by using the program given under Detector for stacks. - When your panorama does not contains stacks, it's does the same as All images at once. + This setting is intended for panoramas with stacks. In the first step it selects the image with the median exposure of every stack. Then it tries to match these median exposed images. After this step all image stacks should be connected. + Then it tries to connect the images of every stack by using the program given under Detector for stacks. + When your panorama does not contain stacks, it's does the same as All images at once. Multi-row panorama As the name implies this setting is for multi-row panoramas. But it works also for single row panoramas. @@ -67,24 +67,24 @@ The following steps are executed: 1.) Try to connect all consecutive images. The result will be a project with one or more groups of connected images. With luck each of these groups will correspond with a row of the panorama. 2.) Then take the first and last images from each group and match them all together in one go. With luck there will be a single group of connected images in the project. - If you selected Try to connect all overlapping images on the Advanced tab, it tries to connect all overlapping images. This happens only, if the steps above were sucessful. Then following step are executed: + If you selected Try to connect all overlapping images on the Advanced tab, it tries to connect all overlapping images. This happens only if the steps above were successful. Only then the following steps are executed: 3.) Optimize panorama (it optimizes only yaw and pitch) to get a rough position of all images. 4.) Now try to link all overlapping images which are not yet connected. Multi-row panorama with stacks - This setting combines Panorama with stacks and Multi-row panorama. It works like Panorama with stacks, but for connecting the median exposured images it uses the algorithm descriped under Multi-row panorama. + This setting combines Panorama with stacks and Multi-row panorama. It works like Panorama with stacks, but for connecting the median exposed images it uses the algorithm described under Multi-row panorama. Prealigned panorama This setting works only if the rough positions of the images are defined in the project. It tries to link all overlapping images. - If the advanced option Work only on image pairs without control points is selected (default), it skips all image pairs which are already connected by control points. Otherwise it creates also control points for already connected images. + If the advanced option Work only on image pairs without control points is selected (default), it skips all image pairs which are already connected by Control points. Otherwise it creates also control points for already connected images. Programs On the notebook you can give the paths and parameters for the individual programs. Detector Here you can give the program name (inclusive path) and the parameters for the control point detector. -You can use a one step setup. In this you invoke the control point detector with a list of image files and it returns a project file with the founded control points. -A further speed up of the detection phase (especially for the multi-row panorama settings) can be achieved by using the two-step detectors approach. Currently only autopano-sift-C and panomaticlib support this approach. In this case you have two separate program: a feature descriptor and a feature matcher. The feature descriptor extract the features from the images and stores a keyfile in the temp directory. Then the feature matcher reads these keyfiles and try to match overlapping images. At the end of the detection phase the temporary keyfiles are deleted. +You can use a one-step setup. In this you invoke the control point detector with a list of image files and it returns a project file with the found control points. +A further speed up of the detection phase (especially for the multi-row panorama settings) can be achieved by using the two-step detectors approach. Currently only autopano-sift-C and panomaticlib support this approach. In this case you have two separate programs: a feature descriptor and a feature matcher. The feature descriptor extracts the features from the images and stores a keyfile in the temp directory. Then the feature matcher reads these keyfiles and tries to match overlapping images. At the end of the detection phase the temporary keyfiles are deleted. You have to give the program name and arguments for both programs. A big speed up can be achieved for the multi-row and prealigned settings. Detector for stacks diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Preferences.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Preferences.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Preferences.html Thu Jul 22 23:32:49 2010 +0100 @@ -145,13 +145,13 @@ Stitching In the final stitching process nona reprojects and distorts images to fit, enblend takes these images as individual TIFF files and merges them using sophisticated seam positioning and blending and/or Exposure fusion into -a single finished TIFF file. +a single finished image file. Important note: The settings here are the defaults for new projects, change settings for the current project in the Hugin Stitcher tab. Nona Here you can set the Default interpolator used during stitching. Interpolation is a quality setting, but the default of Poly3 (Bicubic) is good for most purposes. You are unlikely to notice any difference between interpolators other than that Nearest neighbor is fast but very low quality. You can Create cropped images by default, these Cropped TIFF images will speed up stitching, but some image editors do not process the offsets correctly. - Use GPU for remapping will activate experimental nona code to remap images using the shading language of the Graphics Processing Unit in modern video hardware . + Use GPU for remapping will activate experimental nona code to remap images using the shading language of the Graphics Processing Unit in modern video hardware. However not all projections and the translation parameters are not yet supported by this experimental code. In this case nona will automatic switch back to CPU calculation. Enblend The Use alternative Enblend program option allows you to use other tools with a similar interface diff -r fba464a0344b -r 36d225248e33 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Reset_Values_window.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Reset_Values_window.html Thu Jul 22 23:32:49 2010 +0100 @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + Hugin Reset Values window - PanoTools.org Wiki + + + + + + + + + + + + + + + +   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: 2 new changesets From: - 2010-07-22 22:55 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/014cdfa994d2 changeset: 4149:014cdfa994d2 user: Bruno Postle date: Thu Jul 22 23:27:01 2010 +0100 description: New pages from wiki details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/f408e18d7ed7 changeset: 4150:f408e18d7ed7 user: Bruno Postle date: Thu Jul 22 23:32:49 2010 +0100 description: Update manual from wiki diffstat: src/hugin1/hugin/xrc/data/help_en_EN/Autooptimiser.html | 3 +- src/hugin1/hugin/xrc/data/help_en_EN/Autopano-sift-C.html | 3 +- src/hugin1/hugin/xrc/data/help_en_EN/Chromatic_aberration.html | 2 +- src/hugin1/hugin/xrc/data/help_en_EN/DSLR_spherical_resolution.html | 22 +- src/hugin1/hugin/xrc/data/help_en_EN/Enfuse.html | 2 + src/hugin1/hugin/xrc/data/help_en_EN/Field_of_View.html | 5 +- src/hugin1/hugin/xrc/data/help_en_EN/HDR_workflow_with_hugin.html | 10 +- src/hugin1/hugin/xrc/data/help_en_EN/Horizontal_control_points.html | 5 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin.html | 6 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Camera_and_Lens_tab.html | 4 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Control_Points_tab.html | 8 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_FAQ.html | 9 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Fast_Preview_window.html | 9 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Images_tab.html | 4 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Mask_tab.html | 6 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Optimizer_tab.html | 26 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Parameters_for_Control_Point_Detectors_dialog.html | 22 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Preferences.html | 4 +- src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Reset_Values_window.html | 158 +++++++++ src/hugin1/hugin/xrc/data/help_en_EN/Hugin_translation_guide.html | 61 +-- src/hugin1/hugin/xrc/data/help_en_EN/Pano_modify.html | 171 ++++++++++ src/hugin1/hugin/xrc/data/help_en_EN/Panorama_scripting_in_a_nutshell.html | 21 +- src/hugin1/hugin/xrc/data/help_en_EN/Pitch.html | 2 +- src/hugin1/hugin/xrc/data/help_en_EN/Projections.html | 2 +- src/hugin1/hugin/xrc/data/help_en_EN/Pto_merge.html | 158 +++++++++ src/hugin1/hugin/xrc/data/help_en_EN/SmartBlend.html | 3 +- src/hugin1/hugin/xrc/data/help_en_EN/Straight_line_control_points.html | 8 +- src/hugin1/hugin/xrc/data/help_en_EN/Swing_rod.html | 1 + src/hugin1/hugin/xrc/data/help_en_EN/The_General_Panini_Projection.html | 135 +------ src/hugin1/hugin/xrc/data/help_en_EN/Vertical_control_points.html | 4 +- src/hugin1/hugin/xrc/data/help_en_EN/Wavy_distortion.html | 3 +- src/hugin1/hugin/xrc/data/help_en_EN/Yaw.html | 2 +- src/hugin1/hugin/xrc/data/help_en_EN/pages.txt | 3 + 33 files changed, 663 insertions(+), 219 deletions(-) diffs (truncated from 1451 to 500 lines): diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Autooptimiser.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Autooptimiser.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Autooptimiser.html Thu Jul 22 23:32:49 2010 +0100 @@ -4,7 +4,7 @@ - + @@ -57,6 +57,7 @@ • auto-align mode will pick an optimisation scheme suited to the distribution of control points in the project so there is no need to specify parameters to optimise. • autooptimiser can adjust the panorama field of view, dimensions and projection to suit the input images. • the field of view of input images can be specified, this is useful as the project files created by autopano and autopano-sift don't specify the field of view of the input photos. + • autooptimiser can also perform photometric optimisation. Depending on the input images it selects automaticly these photometric parameters (exposure, white balance, vignetting, camera response curve) which should be optimised. • diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Autopano-sift-C.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Autopano-sift-C.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Autopano-sift-C.html Thu Jul 22 23:32:49 2010 +0100 @@ -43,9 +43,10 @@ - autopano-sift-C is a C port of the C# software autopano-sift. It is somewhat faster and doesn't require a C# runtime - Installing the mono C# runtime on OS X has proved to be problematic on some systems. + autopano-sift-C can be used to find control points in overlapping image pairs and is a C port of the C# software autopano-sift. It is somewhat faster and doesn't require a C# runtime - Installing the mono C# runtime on OS X has proved to be problematic on some systems. Additionally, autopano-sift-C has experimental modifications to perform feature identification in conformal image space, this helps with wide angle or fisheye Projection photographs. autopano-sift-C is available from the hugin project and can only be used within hugin as an optional installation due to patent issues: the use of the Scale-invariant feature transform algorithm is restricted by US Patent 6,711,293, awarded March 23, 2004 to the University of British Columbia. + The current version 2.5.1 (autopano-sift-C-2.5.1) is available since the release of hugin 0.7 in October 2008. Installation on Mac OS X On Mac OS X, autopano-sift-c can be installed via MacPorts: diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Chromatic_aberration.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Chromatic_aberration.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Chromatic_aberration.html Thu Jul 22 23:32:49 2010 +0100 @@ -143,7 +143,7 @@ (switch on GIF animation to see the different channels in the right image) As you can see part of the image details move but part doesn't (the blade of grass in the center). If you minimize the fringes there will be new fringes or even double details with different color: - This weird kind of colored fringes is definitely not lens CA. I can only think of some effects with the microlenses Nikon placed in front of each sensor pixel, but this is wild guess. + This weird kind of colored fringes is definitely not lens CA. I can only think of some effects of bayer interpolation, but this is wild guess. How to correct In many cases it would be enough to adjust the size of the color channels to correct for TCA. However, correction might not always be satisfactory even if it is of the true tCA type. This might have different causes: diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/DSLR_spherical_resolution.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/DSLR_spherical_resolution.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/DSLR_spherical_resolution.html Thu Jul 22 23:32:49 2010 +0100 @@ -63,9 +63,9 @@ In the Fisheye Projection an angular distance from the optical axis maps to a linear distance on the sensor. The mapping is determined by the focal length (the following numbers are approximations, since real fisheyes almost never resemble the ideal fisheye mapping): • 5.6mm focal length 11.4Â°/mm - • 8mm focal length 7.2Â°/mm - • 10.5mm focal length 5.5Â°/mm - • 16mm focal length 3.6Â°/mm + • 8mm focal length 8Â°/mm + • 10.5mm focal length 6Â°/mm + • 16mm focal length 4Â°/mm Pixel density To deduce the pixel resolution obtainable by a certain sensor/lens combination we should know the density in pixels/mm of the respective sensor. The pixel density can be calculated roughly from the Megapixels (better would be actual pixel size) and the sensor size. For the three major groups and some typical Megapixel sizes: @@ -90,14 +90,14 @@ Pano sizes From the above values we can easily calculate some sample panorama resolutions. The table gives some rounded values for the maximum pixel size of an equirectangular: - FourThirds MP - - - - 6 8 10 12 -APS-C MP - - 6 8 10 12 - - -Full size MP 6 8 12 16 21 - - - -pixel/mm 80 100 120 140 160 180 200 230 -f=5.6mm size 2520 3150 3780 4420 5050 5680 6300 7260 -f=8mm size 4000 5000 6000 7000 8000 9000 10000 11500 -f=10.5mm size 5200 6500 7900 9200 10500 11800 13100 15000 -f=16mm size 8000 10000 12000 14000 16000 18000 20000 23000 + FourThirds MP - - - - 6 8 10 12 +APS-C MP - - 6 8 10 12 - - +Full size MP 6 8 12 16 21 - - - +pixel/mm 80 100 120 140 160 180 200 230 +f=5.6mm size 2520 3150 3780 4420 5050 5680 6300 7260 +f=8mm size 3600 4500 5400 6300 7200 8100 9000 10350 +f=10.5mm size 4800 6000 7200 8400 9600 10800 12000 13800 +f=16mm size 7200 9000 10800 12600 14400 16200 18000 20700 The formula for an exact calculation is --Erik Krause 22:11, 21 August 2007 (CEST) diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Enfuse.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Enfuse.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Enfuse.html Thu Jul 22 23:32:49 2010 +0100 @@ -204,6 +204,8 @@ • PTGui Pro since version 7.7 has a built in image fusion tool which features the exposure criterion only but has extended adjustment possibilities. + • LR/Enfuse is a Lightroom plugin for blending exposures directly from within Lightroom using Enfuse. It works on Mac and PC. Get it from http://photographers-toolbox.com/products/lrenfuse.php + Linux • KImageFuser by Harry van der Wolf is an enfuse/align_image_stack Gui for Linux (free GPL V3). It has a preview function and batch options. It is written in the graphical script environment kommander and can run on any linux platform. Dependencies are: kdewebdev-3.5.9 or newer, enfuse, align_image_stack (from Hugin), convert (ImageMagick). Not a dependendency but highly recommended: Exiftool to be able to copy all relevant exif data (ImageDescription, Make, Model, Artist, WhitePoint, Copyright, GPS:all, DateTimeOriginal, CreateDate, UserComment, ColorSpace, OwnerName, SerialNumber, all IPTC, all JFIF, XResolution, YResolution, ResolutionUnit, Lens, FocalLengthIn35mmFormat and FocalLength) to the new image. All dependencies are available in the main linux distributions. Note also that at least one KDE theme should be available like e.g. the famous (and default) "bluecurve" theme. KImageFuser has also been added to the Hugin svn in it's own project KImageFuser tree. diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Field_of_View.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Field_of_View.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Field_of_View.html Thu Jul 22 23:32:49 2010 +0100 @@ -46,7 +46,10 @@ The angle of view of a photograph or camera is a measure of the proportion of a scene included in the image. Simply said: How many degrees of view are included in an image. A typical fixed lens camera might have an angle of view of 50Â°, a fisheye lens can have an angle of view greater than 180Â° and a full equirectangular or cylindrical panorama would have an angle of view of 360Â°. Most people speak of field of view when in fact they mean angle of view. Field of view is the distance covered by a projection at a certain distance. So if an image exactly shows a 2 meter wide object at 1 meter distance, then the field of view is 2 meter (and the angle of view is 90Â°). -Angle of view is also known as angle of coverage. From here on and on the rest of the wiki we will only speak of field of view (although we should speak of angle of view). +Angle of view is also known as angle of coverage. + + + From here on and on the rest of the wiki we will only speak of field of view (although we should speak of angle of view). Field of view is often abbreviated as FoV. Usually field of view refers to the horizontal field of view (hFoV) of an image. Some applications make use of the vertical field of view (vFoV) which can be calculated from the Aspect Ratio of the image: For rectilinear images: diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/HDR_workflow_with_hugin.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/HDR_workflow_with_hugin.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/HDR_workflow_with_hugin.html Thu Jul 22 23:32:49 2010 +0100 @@ -64,13 +64,13 @@ Quick and easy technique - The rest of this tutorial describes generating high quality output using command-line -tools. However it is now possible to complete the workflow entirely with GUI tools, -something like this: + The rest of this tutorial describes generating high quality output using command-line tools. However it is now possible to complete the workflow entirely with GUI tools, something like this: 1. Take bracketed shots of your scene. - 2. Merge bracketed shots to HDR with qtpfsgui, pick either RBGE radiance .hdr output or 32bit floating-point TIFF. - 3. Stitch the panorama with hugin and enblend. + 4. Open bracketed images in Hugin. Align - let's say - the middle exposures together and set the stacks in the Images tab. + 1. If your stacks don't align (shot hand-held, sloppy panohead, etc.), set some control points inside stacks and align them too. + + 5. Stitch the panorama with hugin and enblend to HDR file. 6. Optionally tonemap the result with qtpfsgui. Laborious and difficult technique diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Horizontal_control_points.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Horizontal_control_points.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Horizontal_control_points.html Thu Jul 22 23:32:49 2010 +0100 @@ -46,8 +46,9 @@ The panorama tools optimizer understands various different schemes for aligning photos using control points: -Normal points are t0 points, horizontal control points are t1 points and -vertical control points are t2 points. +Normal points are t0 points, horizontal control points are t1 points, +vertical control points are t2 points, +and straight line control points are t3, t4, etc... points. The main use of horizontal control points is to change the perspective of the output panorama such that the marked structures are horizontal in the output projection. In a multi image panorama this is only possible if the optimization of Roll and Pitch is allowed for all images and of Yaw for all but the anchor image. You set horizontal control points on a horizontal structure apart from each other. However, be careful in a cylindrical or equirectangular panorama not to set them 180Â° apart, since this won't level the horizon. Please note that all real world horizontal lines only stay horizontal in rectilinear projection. In cylindrical, equirectangular and fisheye projections only the horizon itself stays horizontal. diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin.html Thu Jul 22 23:32:49 2010 +0100 @@ -76,6 +76,10 @@ • celeste_standalone removes cloud-like control points from project files. • PTBatcherGUI a GUI queue manager for stitching multiple hugin projects. • PTBatcher command-line access to the hugin Batch Processor stitching queue. + • deghosting_mask Creates mask for removing ghosting in bracketed images + • pano_modify Change output parameters of project file + • pano_trafo Transform image coordinates + • pto_merge Merges two or more Hugin project files • panoglview OpenGL panorama viewer stored in sourceforge SVN alongside hugin which must be built separately. • autopano-sift-C version of autopano-sift written in C, also needs to be built separately. • @@ -97,7 +101,7 @@ • Hugin Preview window • Hugin Fast Preview window • Hugin Control Points table - • Hugin Reset Values window + • Hugin Reset Values window • Hugin Keyboard shortcuts • Development diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Camera_and_Lens_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Camera_and_Lens_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Camera_and_Lens_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -63,7 +63,7 @@ Geometric The Panorama Tools lens correction model has enough parameters to model most photographic images, these parameters can be set manually here in the hugin Camera and Lens tab or calculated automatically in the hugin Optimizer tab. - Note that any or all of these parameters can be changed back to good defaults in the Hugin Reset Values window reached by clicking the Reset... button. + Note that any or all of these parameters can be changed back to good defaults in the Hugin Reset Values window reached by clicking the Reset... button. Lens The most important parameters are the Horizontal field of view and the Lens type. Hugin supports the following projections in input images: @@ -94,7 +94,7 @@ Photometric hugin models the photometric parameters of a lens/camera combination in a similar way to the lens correction model for Geometric parameters. These parameters can be set manually here in the hugin Camera and Lens tab or calculated automatically in the hugin Exposure tab. - Note that any or all of these parameters can be changed back to good defaults in the Hugin Reset Values window reached by clicking the Reset... button. + Note that any or all of these parameters can be changed back to good defaults in the Hugin Reset Values window reached by clicking the Reset... button. Exposure and Color Exposure (EV), EV stands for Exposure Value, setting it to 0 (zero) will diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Control_Points_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Control_Points_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Control_Points_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -59,9 +59,7 @@ auto add adds the control point as soon as both points have been specified. If the images are zoomed out (fit to window), the first click zooms to a temporary 100% view to give you the chance to refine your selection. Note that only the second click will trigger the auto estimate. - Often it is hard to select the corresponding point exactly. -However, the control points should be as accurate as possible, for good results. -Once a point pair has been roughly selected, the fine tune function of hugin can be used to estimate the corresponding point up to one tenth of a pixel. + For good results, the control points should be as accurate as possible. However, it is often tedious to select a particular point exactly, and it may be helpful to use the arrow keys (left, right, up, and down) to nudge the selection point in various directions pixel-by-pixel (users of X11 may need to ensure that a particular image pane has the focus by placing the mouse cursor within its bounds). Once a point pair has been roughly selected, the fine tune function of hugin can be used to estimate the corresponding point up to one tenth of a pixel. The keyboard short cut for the fine tune function is the f key. Fine tune only search in a small neighbourhood of the currently selected points. The size of this neighbourhood can be controlled by opening the Hugin Preferences panel and setting the Local area search width. @@ -115,13 +113,13 @@ Key Function • a add a new point that has been selected in both images, and the auto add is switched off. - • cursor keys scroll image under the mouse cursor - • shift + cursor keys scroll both images at the same time • f fine tune currently selected control point pair. Same as the Fine Tune button • g experimental control point generation algorithm. • Del Remove currently selected control point. • 0 Zoom out to full view. • 1 100% view. + • arrow keys nudge a selection point or selected control point around pixel-by-pixel. + • shift + arrow keys scroll both images at the same time. Mouse function Function diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_FAQ.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_FAQ.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_FAQ.html Thu Jul 22 23:32:49 2010 +0100 @@ -46,9 +46,16 @@ Common error messages enblend: no input files specified - There are no input images relevant to the output 'panorama' so hugin had nothing to do, probably because all the input images are outside the panorama 'frame'. Open the Hugin Preview window or Hugin Fast Preview window to adjust the view and/or crop. + There are no input images relevant to the output 'panorama' so hugin had nothing to do, probably because all the input images are outside the panorama 'frame' or disabled. Open the Hugin Preview window or Hugin Fast Preview window to adjust the view, enable some images inside the panorama frame and/or adjust the crop. Note also that hugin versions up to and including 2009.2.0 allow you to draw an inverted crop frame where the top is below the bottom, this is easy to see in the Preview window as the entire panorama is 'greyed'. A crop frame drawn like this will result in an empty panorama and the above error message. + enblend: excessive overlap detected + This is an error new to enblend-4.0. Photos that nearly entirely overlap won't blend very well, enblend now fails instead of attempting to blend them. There are various workarounds: + + • Follow the error message and remove the suggested image from the set, you probably don't need it to complete the panorama. + • Switch back to enblend-3.2. + • Hugin will merge stacked images before blending if you select 'Exposure fusion' in the Hugin Stitcher tab. This error will go away, but Hugin will take a very different approach to variable exposure between photos. + enblend: error writing to image swap file enblend needs a lot of memory and uses its own swap routine to store picture data on the disk, this message indicates that you have run out of disk space. The data is stored in the system temp folder which is specified by TMP, TEMP or TMPDIR environment variables, note that this temp folder may be on a different physical disk to your photos and panorama output. diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Fast_Preview_window.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Fast_Preview_window.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Fast_Preview_window.html Thu Jul 22 23:32:49 2010 +0100 @@ -66,8 +66,7 @@ Enables full photometric correction. When turned on, this will cause significant delay when changing photometric parameters. It also takes a while to turn on and off. However, with it enabled you get much better representation of the colours in the output. With it turned off, you get correction only for exposure and white balance. With it turned on, you also get vignetting and colour response correction. The Hugin Preview window does all these things by default, so you may wish to use that instead. Show control points - When this tool is turned on, all Control points are drawn as lines; red indicates 'normal' control points and blue indicates horizontal control points, vertical control points or straight line control points. - Long red lines indicate a bad alignment or unoptimized images, short red lines or 'dots' indicate a good alignment between control points. Horizontal and vertical control points should be perpendicular in the panorama. + When this tool is turned on, all Control points are drawn as lines with crosses at each end. Green, yellow, orange, and red lines and their crosses indicate 'normal' control points. A red control point is misaligned (the ends of the line are father apart), and a green control point is well aligned (the ends of the line are almost in the same position). Blue indicates horizontal control points, vertical control points or straight line control points. Blend mode The normal blend mode will draw the images as a stack. The difference blend mode will do the same, except the image under the mouse pointer will be subtracted from the rest of the stack. Use this to determine if the alignment went well: where you can see edges in the subtracted image, these edges are misaligned. Be warned that this isn't fully accurate, the other preview has a better difference mode. @@ -107,6 +106,12 @@ If the panorama contains unconnected components, they will move individually. + Drag mode + This determines what parameters that are changed when the images are dragged. + + • Normal - When dragged left-right, the yaw parameter is changed and when dragged up-down the pitch parameter is changed. I.e. the camera is tilted in the yaw and pitch angles. + • Mosaic - When dragged left-right, X parameter is changed and when dragged up-down the Y parameter is changed. I.e. the camera is moved in the X and Y dimensions. + Center This button horizontally pans the output, changing the yaw of the remapped images so they fit to the centre of the output frame. This is useful if there is a lot of black space on the left or right of the output. This also performs a Fit, equivalent to the next button. Note that centering a Rectilinear Projection or Fisheye Projection panorama will change the perspective, this may be unwanted. diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Images_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Images_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Images_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -57,11 +57,13 @@ Using Clean control points button, hugin will try to find and remove outlying control points using statistical methods. Image orientation - In the Image Orientation section, the position of the selected images in the final panorama can be specified by yaw, pitch and roll angle (in degrees). The Reset button will reset all angles to zero. This is useful if the optimizer could not determine the image orientation well and got stuck with a suboptimal result. It is possible to select multiple images at the same time. Changes in orientation will be applied to all selected images. + In the Image Orientation section, the position of the selected images in the final panorama can be specified by yaw, pitch and roll angle (in degrees); and the X, Y, and Z translation parameters. The Reset button will reset all angles and translations to zero. This is useful if the optimizer could not determine the image orientation well and got stuck with a suboptimal result. It is possible to select multiple images at the same time. Changes in orientation will be applied to all selected images. Note that it is also possible to reset Image Orientation along with other parameters using the Reset... button on the Hugin Camera and Lens tab. Select Anchor this image for position to indicate that a particular image shouldn't move when optimising with the hugin Optimizer tab. Only one image can be the anchor, and by default this is the first image in the project. + Image orientation can be linked between a group of images if they are already aligned. For example, if they form a bracketed set shot on a sturdy tripod. To do this, select all the images in the stack, and press the New stack button. You can also move images into an existing stack without selecting all the other images in the stack: press Change stack... and enter the stack number you want the selected images to join. The stack number of each image is given in the table. + If your images form approximately aligned stacks, you can create stacks as usual, select all the images and then uncheck Link by the image orientation. Approximately aligned stacks are common when you shoot bracketed sets handheld, or in windy conditions with a light tripod. Hugin will remember that the images form a stack, but does not force the image orientation and translation to be the same across the stack. This is useful for specifying stacks when you have a Panorama with Stacks control point detector configuration before control point generation. You do not have to manually mark approximately aligned stacks in other circumstances, however. Exposure Selecting Anchor this image for exposure will indicate that a particular image should be used as diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Mask_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Mask_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Mask_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -63,7 +63,7 @@ Deleting a mask You can delete the active mask by the delete mask button. The active mask is also deleted by -pressing the delete key when all or none point of the current mask are selected. +pressing the delete key when all or none points of the current mask are selected. Select mask There are 3 ways to select a mask @@ -82,10 +82,10 @@ If you want to move the whole mask, drag the mask with right mouse button. (You have to start dragging inside the polygon.) Adding points - You can add a new point to the mask polygon by click with left mouse button while holding down the ctrl key on a line segment. Until you release the left mouse button you can also direclty move the newly created point. + You can add a new point to the mask polygon by click with left mouse button while holding down the ctrl key on a line segment. Until you release the left mouse button you can also directly move the newly created point. Deleting points - You can delete a single point of the active polygon by a right mouse click while holding ctrl key on a point. To delete multiply points drag a rectangle/rubberband with the right mouse button and pressed ctrl key around the points, which should be deleted. When you press the delete key the selected points are deleted. + You can delete a single point of the active polygon by a right mouse click while holding ctrl key on a point. To delete multiple points drag a rectangle/rubberband with the right mouse button and pressed ctrl key around the points, which should be deleted. When you press the delete key the selected points are deleted. Attention: When the remaining polygon consists of less than tree points, the delete operation is canceled. diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Optimizer_tab.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Optimizer_tab.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Optimizer_tab.html Thu Jul 22 23:32:49 2010 +0100 @@ -48,7 +48,8 @@ So to align photos you need some control points, a general rule is that optimising more parameters requires more control points. Quick Optimizer - Use the Optimize combo box to pick one of several pre-set optimisation schemes, then click the Optimize now! button to calculate the best available fit. One valid technique is to try each optimisation scheme in turn, starting at the top, until you are satisfied with the results. + Use the Optimize combo box to pick one of several pre-set optimisation schemes, then click the Optimize now! button to calculate the best available fit. For a spherical panorama, which is where each image is taken from the same position, you should not optimise translation. For a linear panorama, where you take pictures from different locations of the same flat surface, you must optimise translation. + One valid technique is to try each optimisation scheme in turn, starting at the top, and skipping the ones with translation if you are making a spherical panorama, until you are satisfied with the results. The Optimisation result tells you how good the alignment is, large control point error distances indicate one of several things: • Some control points are in the wrong place, look at the list in the hugin Control Points table and identify points with large distances and check they are set properly. @@ -73,28 +74,43 @@ Note that to align any pair of photos, there should be at least two pairs of control points connecting them. Positions (y,p,r) - This is exactly the same as the incremental setting above except that all parameters are optimised at once, this may confuse the optimiser if the images are not already roughly in the right place. Don't use this setting. + This is exactly the same as the incremental setting above except that the parameters are optimised at once, this may confuse the optimiser if the images are not already roughly in the right place. Don't use this setting. + + Positions and Translations (y,p,r,x,y,z) + This will optimise image orientation and the translation you get when moving the camera for a linear panorama. This is great for stitching images of the same flat surface taken from different places, for example when you couldn't fit a painting or the front of a building into one picture. Again it isn't ideal if the lens information such as the field of view is wrong. Positions and View (y,p,r,v) This is the same as optimising Positions except that the lens Field of View is optimised too - Use this if you don't trust the Field of View calculated from the photo's EXIF data. Note that for this too work you need at least three well-spaced pairs of control points between any pair of photos. With a 360 degree panorama it is usually beneficial to optimise the Field of View, even if you have already calibrated this beforehand. + Positions, Translation and View (y,p,r,x,y,z,v) + This is similar to Positions and Translations, except you can use it when you don't trust the Field of View from the EXIF data. + Positions and Barrel Distortion (y,p,r,b) - This is the same as optimising Positions except that an attempt is made to discover the lens barrel distortion at the same time. Only the b parameter of the full lens correction model is varied by this optimisation scheme, as this is a reasonable approximation of the distortion of a typical lens. + This is the same as optimising Positions except that an attempt is made to discover the lens barrel distortion at the same time. Only the b parameter of the full lens correction model is varied by this optimisation scheme, as this is a reasonable approximation of the distortion of a typical lens. You should trust the field of view if you use this. Again you need at least three well-placed pairs of control points between any pair of photos. Positions, View and Barrel (y,p,r,v,b) As the name suggests this optimises positions, Field of View and barrel distortion all at once. + Positions, Translation, View and Barrel (y,p,r,x,y,z,b,b) + This is useful when you are optimising a linear panorama, don't trust the field of view, and want to correct barrel distortion. + + Everything without translation + This optimises image orientation and all geometric parameters in the full lens correction model. It includes more lens distortion parameters. The x shift and y shift (d and e) parameters account for the centre of the projection not being in the centre of the image. This is quite common, and gets very bad if an image is the cropped corner of another image. + You will need many control points, the more the better, and preferably a full spherical panorama (360 by 180 degrees) to get the best correction. You should also use a calibrated panoramic head. If the control points are bad (either there are not enough or some are in the wrong place), or your images were not taken around the no-parallax point, this could produce bizarre results. + However, if you do this well, you will accurately perform lens calibration. You can save and reuse this lens information on the Camera and Lens tab. + Everything - Selecting Everything optimises every parameter in the full lens correction model, this will produce bizarre results unless you are using a calibrated panoramic head and lots of control points (the more points the better) - This is one way to perform lens calibration. + Selecting Everything really optimises everything, including the translation parameters. You will need a huge number of control points to do this successfully. The Custom parameters below The pre-set optimisation options are useful for most situations, but often it is necessary to switch to Custom parameters. For example, when shooting hand-held panoramas, some of the position variation between shots can be resolved by using different d and e Image Center Shift parameters for each shot. Select The Custom parameters below and pick the d and e parameters for optimisation. Note that by default, lens settings are shared for all photos in the project, go to the hugin Camera and Lens tab and uncheck the link box for any you want to have different values in each photo. + Similarly, the translation parameters could be used to correct a wonky shot. However, they were meant for linear panoramas which expand to infinite distance at 180 degrees field of view, so you must make sure any images with non-zero translation (X, Y, or Z parameters) are in the middle of the panorama (y and p should all be around zero, and the field of view shouldn't be large enough to make them expand more than 180 degrees). This can be used to patch in the floor after you have removed the tripod that was obscuring it. You can take a shot of the floor where the tripod was at an angle (therefore you can avoid casting a shadow on the image in most cases). You can then optimise X,Y,Z on only this image. However, the floor must be flat for this to work, and this shot must be in the middle of the panorama. You can make down the middle by rotating the panorama on either of the previews. Image Orientation - The Image Orientation section shows the photo number and roll, pitch and yaw rotation/orientation values for all input photos (in parenthesis), the check mark indicates parameters that will be optimised. + The Image Orientation section shows the photo number and roll, pitch and yaw rotation/orientation values for all input photos (in parenthesis), and the X, Y, and Z translation parameters. The check mark indicates parameters that will be optimised. The translation parameters should all be 0 on a spherical panorama. Lens Parameters The Lens Parameters section shows the lens number and the lens correction model parameters (in parenthesis) for each of the distinct lenses in the project. Only parameters that are linked in the hugin Camera and Lens tab are shown in parenthesis. diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Parameters_for_Control_Point_Detectors_dialog.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Parameters_for_Control_Point_Detectors_dialog.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Parameters_for_Control_Point_Detectors_dialog.html Thu Jul 22 23:32:49 2010 +0100 @@ -4,7 +4,7 @@ - + @@ -47,19 +47,19 @@ Description - You should give your parameter set a meaningful name, because this name is shown in the GUI on the Hugin Images tab. + You should give your parameter-set a meaningful name, because this name is shown in the GUI on the Hugin Images tab. Type All images at once With this setting all images are transferred at once to the control point detector. This was the default setting of Hugin versions before 2010.2. Autopano (by A. Jenny) - This is the same procedure like All images at once with some modifications for using autopano by Alexandre Jenny (only Windows and Linux, there is no MacOS version). + This is the same procedure as All images at once with some modifications for using autopano by Alexandre Jenny (only Windows and Linux, there is no MacOS version). Panorama with stacks - This setting is indented for panoramas with stacks. In a first step it selects the image with the median exposure of every stack. Then it tries to match these median exposured images. After this step all image stacks should be connected. - Then it tries to connect the images of every stack by using the program given under Detector for stacks. - When your panorama does not contains stacks, it's does the same as All images at once. + This setting is intended for panoramas with stacks. In the first step it selects the image with the median exposure of every stack. Then it tries to match these median exposed images. After this step all image stacks should be connected. + Then it tries to connect the images of every stack by using the program given under Detector for stacks. + When your panorama does not contain stacks, it's does the same as All images at once. Multi-row panorama As the name implies this setting is for multi-row panoramas. But it works also for single row panoramas. @@ -67,24 +67,24 @@ The following steps are executed: 1.) Try to connect all consecutive images. The result will be a project with one or more groups of connected images. With luck each of these groups will correspond with a row of the panorama. 2.) Then take the first and last images from each group and match them all together in one go. With luck there will be a single group of connected images in the project. - If you selected Try to connect all overlapping images on the Advanced tab, it tries to connect all overlapping images. This happens only, if the steps above were sucessful. Then following step are executed: + If you selected Try to connect all overlapping images on the Advanced tab, it tries to connect all overlapping images. This happens only if the steps above were successful. Only then the following steps are executed: 3.) Optimize panorama (it optimizes only yaw and pitch) to get a rough position of all images. 4.) Now try to link all overlapping images which are not yet connected. Multi-row panorama with stacks - This setting combines Panorama with stacks and Multi-row panorama. It works like Panorama with stacks, but for connecting the median exposured images it uses the algorithm descriped under Multi-row panorama. + This setting combines Panorama with stacks and Multi-row panorama. It works like Panorama with stacks, but for connecting the median exposed images it uses the algorithm described under Multi-row panorama. Prealigned panorama This setting works only if the rough positions of the images are defined in the project. It tries to link all overlapping images. - If the advanced option Work only on image pairs without control points is selected (default), it skips all image pairs which are already connected by control points. Otherwise it creates also control points for already connected images. + If the advanced option Work only on image pairs without control points is selected (default), it skips all image pairs which are already connected by Control points. Otherwise it creates also control points for already connected images. Programs On the notebook you can give the paths and parameters for the individual programs. Detector Here you can give the program name (inclusive path) and the parameters for the control point detector. -You can use a one step setup. In this you invoke the control point detector with a list of image files and it returns a project file with the founded control points. -A further speed up of the detection phase (especially for the multi-row panorama settings) can be achieved by using the two-step detectors approach. Currently only autopano-sift-C and panomaticlib support this approach. In this case you have two separate program: a feature descriptor and a feature matcher. The feature descriptor extract the features from the images and stores a keyfile in the temp directory. Then the feature matcher reads these keyfiles and try to match overlapping images. At the end of the detection phase the temporary keyfiles are deleted. +You can use a one-step setup. In this you invoke the control point detector with a list of image files and it returns a project file with the found control points. +A further speed up of the detection phase (especially for the multi-row panorama settings) can be achieved by using the two-step detectors approach. Currently only autopano-sift-C and panomaticlib support this approach. In this case you have two separate programs: a feature descriptor and a feature matcher. The feature descriptor extracts the features from the images and stores a keyfile in the temp directory. Then the feature matcher reads these keyfiles and tries to match overlapping images. At the end of the detection phase the temporary keyfiles are deleted. You have to give the program name and arguments for both programs. A big speed up can be achieved for the multi-row and prealigned settings. Detector for stacks diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Preferences.html --- a/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Preferences.html Sun Jul 18 23:01:56 2010 +0100 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Preferences.html Thu Jul 22 23:32:49 2010 +0100 @@ -145,13 +145,13 @@ Stitching In the final stitching process nona reprojects and distorts images to fit, enblend takes these images as individual TIFF files and merges them using sophisticated seam positioning and blending and/or Exposure fusion into -a single finished TIFF file. +a single finished image file. Important note: The settings here are the defaults for new projects, change settings for the current project in the Hugin Stitcher tab. Nona Here you can set the Default interpolator used during stitching. Interpolation is a quality setting, but the default of Poly3 (Bicubic) is good for most purposes. You are unlikely to notice any difference between interpolators other than that Nearest neighbor is fast but very low quality. You can Create cropped images by default, these Cropped TIFF images will speed up stitching, but some image editors do not process the offsets correctly. - Use GPU for remapping will activate experimental nona code to remap images using the shading language of the Graphics Processing Unit in modern video hardware . + Use GPU for remapping will activate experimental nona code to remap images using the shading language of the Graphics Processing Unit in modern video hardware. However not all projections and the translation parameters are not yet supported by this experimental code. In this case nona will automatic switch back to CPU calculation. Enblend The Use alternative Enblend program option allows you to use other tools with a similar interface diff -r 87026235e9ca -r f408e18d7ed7 src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Reset_Values_window.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin1/hugin/xrc/data/help_en_EN/Hugin_Reset_Values_window.html Thu Jul 22 23:32:49 2010 +0100 @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + Hugin Reset Values window - PanoTools.org Wiki + + + + + + + + + + + + + + + + + + + +   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: 2 new changesets From: - 2010-07-24 13:58 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/6e072258d951 changeset: 4157:6e072258d951 user: Andreas Metzler date: Sat Jul 24 15:56:19 2010 +0200 description: Added version checking for libpano13 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/2fc209cbb6ee changeset: 4158:2fc209cbb6ee user: Andreas Metzler date: Sat Jul 24 15:56:19 2010 +0200 description: Added version checking for libpano13 (transplanted from 6e072258d9510951f49c37962332c682cc78d9ac) diffstat: CMakeLists.txt | 4 +- CMakeModules/FindPANO13.cmake | 62 +- ChangeLog | 130 - doc/releases/hugin-2010.2.0_beta1.txt | 2444 ---------- mac/copyExtraTools.sh | 2 +- src/hugin1/hugin/xrc/data/help_en_EN/197px-Field-of-view.svg.png | 0 src/hugin1/hugin/xrc/data/help_en_EN/360px-Pantheon-150x100-rect-panini.jpg | 0 7 files changed, 54 insertions(+), 2588 deletions(-) diffs (truncated from 2693 to 500 lines): diff -r 3143279c500b -r 2fc209cbb6ee CMakeLists.txt --- a/CMakeLists.txt Fri Jul 23 22:30:18 2010 +0200 +++ b/CMakeLists.txt Sat Jul 24 15:56:19 2010 +0200 @@ -16,7 +16,7 @@ # version set(V_MAJOR 2010) -set(V_MINOR 2) +set(V_MINOR 3) set(V_PATCH 0) # @@ -209,7 +209,7 @@ ## Panotools ## -FIND_PACKAGE(PANO13) +FIND_PACKAGE(PANO13 2.9.17 REQUIRED) IF(PANO13_FOUND) SET(PANO_LIBRARIES{PANO13_LIBRARIES}) diff -r 3143279c500b -r 2fc209cbb6ee CMakeModules/FindPANO13.cmake --- a/CMakeModules/FindPANO13.cmake Fri Jul 23 22:30:18 2010 +0200 +++ b/CMakeModules/FindPANO13.cmake Sat Jul 24 15:56:19 2010 +0200 @@ -32,16 +32,56 @@ IF(PANO13_INCLUDE_DIR) IF(PANO13_LIBRARIES) - SET( PANO13_FOUND "YES" ) - FIND_LIBRARY( PANO13_DEBUG_LIBRARIES - NAMES Panotools pano13d pano13 - PATHS /usr/lib /usr/local/lib - "${PANO13_INCLUDE_DIR}/pano13/Debug LIB CMD" - "${PANO13_INCLUDE_DIR}/pano13/Debug CMD/Win32" - ${PANO13_INCLUDE_DIR}/pano13/Debug -${SOURCE_BASE_DIR}/pano13/lib - ${SOURCE_BASE_DIR}/pano13 - ) + FILE(STRINGS "${PANO13_INCLUDE_DIR}/pano13/version.h" PANO13_VERSION_H REGEX "#define VERSION") + STRING(REGEX REPLACE ".*#define +VERSION +\"([.0-9]+).*" "\\1" PANO13_VERSION "${PANO13_VERSION_H}") + STRING(REGEX REPLACE "([^.]+)\\.([^.]+)\\.([^.]+)" "\\1" PANO13_VERSION_MAJOR "${PANO13_VERSION}") + STRING(REGEX REPLACE "([^.]+)\\.([^.]+)\\.([^.]+)" "\\2" PANO13_VERSION_MINOR "${PANO13_VERSION}") + STRING(REGEX REPLACE "([^.]+)\\.([^.]+)\\.([^.]+)" "\\3" PANO13_VERSION_PATCH "${PANO13_VERSION}") + # version comparison stuff. Very ugly for multiple reasons: + # + VERSION_GREATER is not available in cmake 2.6.0. + # + cmake does not allow combining AND with OR like in e.g. + # "if(2 LESS 3 AND (3 LESS 4 OR 5 LESS 6))". + # + At least cmake 2.6.0 does not set PANO13_FIND_VERSION_* to 0 by default. + IF(NOT DEFINED PANO13_FIND_VERSION_MAJOR OR "${PANO13_VERSION_MAJOR}" GREATER "${PANO13_FIND_VERSION_MAJOR}") + SET( PANO13_FOUND "YES" ) + ELSEIF("${PANO13_VERSION_MAJOR}" EQUAL "${PANO13_FIND_VERSION_MAJOR}") + IF(NOT DEFINED PANO13_FIND_VERSION_MINOR OR "${PANO13_VERSION_MINOR}" GREATER "${PANO13_FIND_VERSION_MINOR}") + SET( PANO13_FOUND "YES" ) + ELSEIF("${PANO13_VERSION_MINOR}" EQUAL "${PANO13_FIND_VERSION_MINOR}") + IF(NOT DEFINED PANO13_FIND_VERSION_PATCH OR NOT "${PANO13_VERSION_PATCH}" LESS "${PANO13_FIND_VERSION_PATCH}") + SET( PANO13_FOUND "YES" ) + ENDIF() + ENDIF() + ENDIF() ENDIF(PANO13_LIBRARIES) ENDIF(PANO13_INCLUDE_DIR) - + +IF(PANO13_FOUND) + SET(PANO13_VERSION_COUNT 3) + IF(NOT PANO13_FIND_QUIETLY) + MESSAGE(STATUS "libpano13 version: ${PANO13_VERSION} major${PANO13_VERSION_MAJOR} minor ${PANO13_VERSION_MINOR} patch${PANO13_VERSION_PATCH}") + ENDIF(NOT PANO13_FIND_QUIETLY) + FIND_LIBRARY( PANO13_DEBUG_LIBRARIES + NAMES Panotools pano13d pano13 + PATHS /usr/lib /usr/local/lib + "${PANO13_INCLUDE_DIR}/pano13/Debug LIB CMD" + "${PANO13_INCLUDE_DIR}/pano13/Debug CMD/Win32" + ${PANO13_INCLUDE_DIR}/pano13/Debug +${SOURCE_BASE_DIR}/pano13/lib + ${SOURCE_BASE_DIR}/pano13 + ) +ELSE(PANO13_FOUND) + IF(PANO13_FIND_REQUIRED) + IF(PANO13_VERSION) + MESSAGE(FATAL_ERROR "libpano13 version:${PANO13_FIND_VERSION} required, ${PANO13_VERSION} found") + ELSE(PANO13_VERSION) + MESSAGE(FATAL_ERROR "libpano13 not found") + ENDIF(PANO13_VERSION) + ELSE(PANO13_FIND_REQUIRED) + IF(PANO13_VERSION) + MESSAGE(STATUS "libpano13 version:${PANO13_FIND_VERSION} required, ${PANO13_VERSION} found") + ELSE(PANO13_VERSION) + MESSAGE(STATUS "libpano13 not found") + ENDIF(PANO13_VERSION) + ENDIF(PANO13_FIND_REQUIRED) +ENDIF(PANO13_FOUND) diff -r 3143279c500b -r 2fc209cbb6ee ChangeLog --- a/ChangeLog Fri Jul 23 22:30:18 2010 +0200 +++ b/ChangeLog Sat Jul 24 15:56:19 2010 +0200 @@ -1,133 +1,3 @@ -2010-07-15 James Legg - - * src/hugin1/hugin/ViewState.cpp: - Fix bug where fast preview interactions could disconnect image's - lenses introduced in 66f626bf15aa. - [32dc50543204] [tip] - -2010-07-15 tmodes - - * CMakeModules/win_bundle.cmake: - Added missing files to install target for windows - [a94c74257dc7] - -2010-07-13 tmodes - - * src/hugin_base/panodata/Panorama.cpp: - Fixes an issue with positive masks and fisheye images - [497b2b9fb40f] - -2010-07-07 Bruno Postle - - * ChangeLog, doc/releases/hugin-2010.2.0_beta1.txt: - Unfinished announcement for a 2010.2.0_beta1 release - [7e19d5bea985] - -2010-06-29 Kornel Benko - - * CMakeLists.txt, ChangeLog, admin/update_tarball.sh, doc/batch- - processing/README.batch, doc/releases/hugin-0.8.0.txt, - doc/releases/hugin-0.8.0_rc1.txt, doc/releases/hugin-0.8.0_rc2.txt, - doc/releases/hugin-0.8.0_rc3.txt, doc/releases/hugin-0.8.0_rc4.txt, - doc/releases/hugin-0.8.0_rc5.txt, doc/releases/hugin-2009.4.0.txt, - doc/releases/hugin-2009.4.0_rc3.txt, doc/releases/hugin- - 2010.0.0.txt, doc/releases/hugin-2010.0.0_rc1.txt, - src/hugin1/hugin/ViewState.cpp, src/hugin1/hugin/wxPanoCommand.cpp, - src/hugin_base/algorithms/basic/CalculateOverlap.cpp, src/hugin_base - /algorithms/panorama_makefile/PanoramaMakefileExport.cpp: - Enable creation of ChangeLog from build-dir - [f9fc675ab021] - -2010-07-07 Bruno Postle - - * ChangeLog: - Update ChangeLog file - [2b6dba1d7651] - -2010-06-28 Bruno Postle - - * CMakeLists.txt: - Set minor version to 2 for stable branch - [58c0c6a4f777] - -2010-06-28 harryvanderwolf - - * mac/Hugin.xcodeproj/project.pbxproj: - [OSX] Change version stamp to only hexadecimal part - [9fa03ec044ad] - -2010-06-28 Bruno Postle - - * src/translations/zh_TW.po: - Updated Traditional Chinese translation (Rick Langford) - [d017edd0161f] - - * src/translations/hu.po: - Updated Hungarian translation #3021348 (HÃ¶ss Lajos) - [8ce1c813f7a1] - -2010-06-28 Terry Duell - - * ChangeLog, authors.txt: - Update authors.txt - [38ed0587798b] - -2010-06-28 Bruno Postle - - * CMakeLists.txt: - Set minor version to 2 for stable branch - [58c0c6a4f777] - -2010-06-28 harryvanderwolf - - * mac/Hugin.xcodeproj/project.pbxproj: - [OSX] Change version stamp to only hexadecimal part - [9fa03ec044ad] - -2010-06-28 Bruno Postle - - * src/translations/zh_TW.po: - Updated Traditional Chinese translation (Rick Langford) - [d017edd0161f] - - * src/translations/hu.po: - Updated Hungarian translation #3021348 (HÃ¶ss Lajos) - [8ce1c813f7a1] - -2010-06-28 Terry Duell - - * ChangeLog, authors.txt: - Update authors.txt - [38ed0587798b] - -2010-06-28 Bruno Postle - - * CMakeLists.txt: - Set minor version to 2 for stable branch - [58c0c6a4f777] - -2010-06-28 harryvanderwolf - - * mac/Hugin.xcodeproj/project.pbxproj: - [OSX] Change version stamp to only hexadecimal part - [9fa03ec044ad] - -2010-06-28 Bruno Postle - - * src/translations/zh_TW.po: - Updated Traditional Chinese translation (Rick Langford) - [d017edd0161f] - - * src/translations/hu.po: - Updated Hungarian translation #3021348 (HÃ¶ss Lajos) - [8ce1c813f7a1] - -2010-06-28 Terry Duell - - * ChangeLog, authors.txt: - Update authors.txt - [38ed0587798b] - 2010-06-27 Terry Duell * CMakeLists.txt: diff -r 3143279c500b -r 2fc209cbb6ee doc/releases/hugin-2010.2.0_beta1.txt --- a/doc/releases/hugin-2010.2.0_beta1.txt Fri Jul 23 22:30:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2444 +0,0 @@ -Hugin is a Panorama stitcher and more. A powerful software package -for creating and processing panoramic images. - -A hugin-2010.2.0_beta1 (beta 1) tarball is available here: -https://sourceforge.net/projects/hugin/files/hugin-2010.2_beta/ - -This is a beta release for testing, i.e. The final release is likely to have -further bugfixes, help/manual and translation updates. - -More information about this release can be found in the full ChangeLog below -and the unfinished release notes: -http://hugin.sourceforge.net/releases/2010.2.0/ - -Summary of major changes since 2010.0.0: - -* New Layout tab in the Hugin Fast Preview window, shows an undirected graph view -of the control point connections within the current project. - -* New Mask tab in the Hugin main window, allows you to add and edit 'exclude' -and 'include' masks for each photo, this replaces previous techniques -involving editing alpha channels. - -* Mosaic mode. Hugin now supports optimisation of X, Y & Z positions of -cameras, this allows you to assemble a panorama of a planar object such as a -mural with photos taken from different positions. - -* Linked bracketing. Previously photos within a bracketed set needed to -connected by control points, it is now possible to tell Hugin that photos -share a position in a way analagous to the existing system for sharing lens -parameters. - -* Control point generator modes. Previously only a single control point -generator could be used at any one time. Hugin now has support for -combinations of panoramas and bracketed stacks, stacks that are already linked -with the linked bracketing feature, multi-row heuristics including support for -bracketed stacks, and for panoramas that are already roughly laid out in the -preview. - -* New equisolid, orthographic and stereographic lenses are supported, requires -libpano13-2.9.17_beta2 or later. - -* General Pannini projection is now fully suppoprted. - -* Migration to Mercurial. Hugin has switched from Subversion to Mercurial for -source control. This 2010.2.0 release is being stabilised in the '2010.2' -branch in mercurial. - -* New CLI tools. pano_trafo for querying control point transformations, -pto_merge to merge project files, and pano_modify to change output -parameters of project files. autooptimiser now has a photometric optimisation -mode. - -* libpano13-2.7.17 is required, note that this is still in beta itself. - -* Lots of bugfixes, translation updates and build system changes. - -See README, ChangeLog and INSTALL_cmake for more information. - -SHA1SUM: -5f1dc68bf928ec84c9f91a3fc28545ccfbd44ac4 hugin-2010.2.0_beta1.tar.gz - -This release is equivalent to hg branch 2010.2 -r 4138:69545ba63586 - -A detailed ChangeLog of every commit since 2010.0.0 follows: - -2010-07-15 James Legg - - * src/hugin1/hugin/ViewState.cpp: - Fix bug where fast preview interactions could disconnect image's - lenses introduced in 66f626bf15aa. - [32dc50543204] [tip] - -2010-07-15 tmodes - - * CMakeModules/win_bundle.cmake: - Added missing files to install target for windows - [a94c74257dc7] - -2010-07-13 tmodes - - * src/hugin_base/panodata/Panorama.cpp: - Fixes an issue with positive masks and fisheye images - [497b2b9fb40f] - -2010-07-07 Bruno Postle - - * ChangeLog, doc/releases/hugin-2010.2.0_beta1.txt: - Unfinished announcement for a 2010.2.0_beta1 release - [7e19d5bea985] - -2010-06-29 Kornel Benko - - * CMakeLists.txt, ChangeLog, admin/update_tarball.sh, doc/batch- - processing/README.batch, doc/releases/hugin-0.8.0.txt, - doc/releases/hugin-0.8.0_rc1.txt, doc/releases/hugin-0.8.0_rc2.txt, - doc/releases/hugin-0.8.0_rc3.txt, doc/releases/hugin-0.8.0_rc4.txt, - doc/releases/hugin-0.8.0_rc5.txt, doc/releases/hugin-2009.4.0.txt, - doc/releases/hugin-2009.4.0_rc3.txt, doc/releases/hugin- - 2010.0.0.txt, doc/releases/hugin-2010.0.0_rc1.txt, - src/hugin1/hugin/ViewState.cpp, src/hugin1/hugin/wxPanoCommand.cpp, - src/hugin_base/algorithms/basic/CalculateOverlap.cpp, src/hugin_base - /algorithms/panorama_makefile/PanoramaMakefileExport.cpp: - Enable creation of ChangeLog from build-dir - [f9fc675ab021] - -2010-07-07 Bruno Postle - - * ChangeLog: - Update ChangeLog file - [2b6dba1d7651] - -2010-06-28 Bruno Postle - - * CMakeLists.txt: - Set minor version to 2 for stable branch - [58c0c6a4f777] - -2010-06-28 harryvanderwolf - - * mac/Hugin.xcodeproj/project.pbxproj: - [OSX] Change version stamp to only hexadecimal part - [9fa03ec044ad] - -2010-06-28 Bruno Postle - - * src/translations/zh_TW.po: - Updated Traditional Chinese translation (Rick Langford) - [d017edd0161f] - - * src/translations/hu.po: - Updated Hungarian translation #3021348 (HÃ¶ss Lajos) - [8ce1c813f7a1] - -2010-06-28 Terry Duell - - * ChangeLog, authors.txt: - Update authors.txt - [38ed0587798b] - -2010-06-27 Terry Duell - - * CMakeLists.txt: - change CMakeLists.txt to produce Hg log file when UPDATE_CHANGELOG=1 - switch is used - [a7c760281f3c] [tip] - -2010-06-25 harryvanderwolf - - * mac/Hugin.xcodeproj/project.pbxproj, mac/complete-bundle.sh, - mac/copyExtraTools.sh, mac/copyTools.sh: - [OSX] Considerable change of design of the XCode project to - facilitate building of 32bit vs. 32/64 bit vs. 64bit and other - architecures from one project out of multiple folders. This wasn't - possible with the original project as it completely ruined the - internal library paths. Copies of binaries and libraries are now - done via scripts. - [9f9f7edf27f3] - -2010-06-24 harryvanderwolf - - * mac/ExternalPrograms/scripts/boost.sh, - mac/ExternalPrograms/scripts/enblend.sh, - mac/ExternalPrograms/scripts/gettext.sh, - mac/ExternalPrograms/scripts/gnumake.sh, - mac/ExternalPrograms/scripts/ilmbase.sh, - mac/ExternalPrograms/scripts/lcms.sh, - mac/ExternalPrograms/scripts/libexiv2.sh, - mac/ExternalPrograms/scripts/libexpat.sh, - mac/ExternalPrograms/scripts/libglew.sh, - mac/ExternalPrograms/scripts/libiconv.sh, - mac/ExternalPrograms/scripts/libjpeg.sh, - mac/ExternalPrograms/scripts/libpng.sh, - mac/ExternalPrograms/scripts/libtiff.sh, - mac/ExternalPrograms/scripts/libxmi.sh, - mac/ExternalPrograms/scripts/openexr16.sh, - mac/ExternalPrograms/scripts/pano13.sh, - mac/ExternalPrograms/scripts/wxmac28.sh, - mac/Hugin.xcodeproj/project.pbxproj, mac/complete-bundle.sh, - mac/copyTools.sh: - [OSX]correct panotools script; build basic error checking in all - build scripts - [347aa1e2b72e] - -2010-06-20 tmodes - - * CMakeLists.txt: - Set correctly man path for NetBSD - [bc6fc8081244] - - * CMakeModules/FindExiv2.cmake, CMakeModules/FindJPEG.cmake, - CMakeModules/FindPNG.cmake, CMakeModules/FindTIFF.cmake, - CMakeModules/win_bundle.cmake: - Updated some FindLib to current versions (Exiv2, Jpeg, LibPNG, - LibTiff) - [8754cf65a790] - - * CMakeLists.txt: - Added missing Boost::date_time to CMake - [364b9cc77e77] - - * src/hugin_base/algorithms/control_points/APSIFTFeatureExtractor.cpp, - src/hugin_base/algorithms/control_points/APSIFTFeatureExtractor.h, - src/hugin_base/algorithms/control_points/FeatureExtractor.cpp, - src/hugin_base/algorithms/control_points/FeatureExtractor.h, - src/hugin_base/algorithms/control_points/FeatureExtractorZoran.h, - src/hugin_base/algorithms/control_points/FeatureMatcher.cpp, - src/hugin_base/algorithms/control_points/FeatureMatcher.h: - Removed unused files - [a2c5e21aeb66] - - * src/hugin1/hugin/config_defaults.h: - Fixes an issue when a config would be empty because of missing - symbol "unix" - [60c1f12ed9a6] - -2010-06-18 tmodes - - * src/hugin_base/algorithms/nona/ComputeImageROI.cpp: - Fixes wrong mask when image has circular crop - [ec3e84ebd1f1] - -2010-06-17 Juha Helminen - - * src/translations/fi.po: - Finnish translation addition - [9175c6d673a1] - -2010-06-16 tmodes - - * src/hugin_base/algorithms/basic/CalculateOptimalScale.cpp: - Make calculate optimal scale aware of translation parameters - [d1ea284f28bc] - - * src/hugin_base/algorithms/basic/StraightenPanorama.h: - Don't straighten panorama, if translation parameters are non-zero - [0ef86753d88c] - -2010-06-13 tmodes - - * src/hugin_base/algorithms/nona/CenterHorizontally.cpp: - Don't try to center panorama by yaw shift if translation parameters - are non-zero - [9a29b3a656c7] - -2010-06-12 tmodes - - * src/tools/nona.cpp: - Added more range checks to nona. - [8541d997e02b] - - * src/tools/nona.cpp: - Don't use GPU calculation if translation parameters are non-zero. - [d55a954b9ac4] - -2010-06-11 James Legg - - * merge - [a6704b2bb525] - - * src/hugin1/hugin/PreviewLayoutLinesTool.cpp: - Hide layout lines that connect to an inactive image. - [b7aa801a08bf] - -2010-06-08 tmodes - - * src/hugin_base/panodata/Mask.cpp, src/hugin_base/panodata/Mask.h, - src/hugin_base/panodata/Panorama.cpp:   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: 2 new changesets From: - 2010-07-26 22:05 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/69510b352032 changeset: 4161:69510b352032 user: Florian Achleitner date: Mon Jul 26 23:40:57 2010 +0200 description: - start feature tester - pulls in another boost lib details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/d735217f801b changeset: 4162:d735217f801b user: Florian Achleitner date: Tue Jul 27 00:04:46 2010 +0200 description: fix bug with limits because of signed types in filename tester diffstat: CMakeLists.txt | 2 +- src/hugin_base/makefilelib/CMakeLists.txt | 9 +- src/hugin_base/makefilelib/char_type.h | 4 +- src/hugin_base/makefilelib/test_filenames.cpp | 16 +-- src/hugin_base/makefilelib/test_makefilelib.cpp | 116 ++++++++++++++++++++++++ 5 files changed, 132 insertions(+), 15 deletions(-) diffs (234 lines): diff -r 54f7a287c206 -r d735217f801b CMakeLists.txt --- a/CMakeLists.txt Sun Jul 25 10:02:29 2010 +0200 +++ b/CMakeLists.txt Tue Jul 27 00:04:46 2010 +0200 @@ -232,7 +232,7 @@ set(BOOST_ROOT${SOURCE_BASE_DIR}/boost${Boost_root_suffix}) endif(NOT BOOST_ROOT AND NOT$ENV{BOOST_ROOT} STREQUAL "") ENDIF(WIN32) -FIND_PACKAGE(Boost COMPONENTS thread regex filesystem) +FIND_PACKAGE(Boost COMPONENTS thread regex filesystem iostreams) IF (NOT Boost_FOUND) MESSAGE(FATAL_ERROR "boost not found. Bad BOOST_ROOT? On windows, try editing Boost_root_suffix") ENDIF (NOT Boost_FOUND) diff -r 54f7a287c206 -r d735217f801b src/hugin_base/makefilelib/CMakeLists.txt --- a/src/hugin_base/makefilelib/CMakeLists.txt Sun Jul 25 10:02:29 2010 +0200 +++ b/src/hugin_base/makefilelib/CMakeLists.txt Tue Jul 27 00:04:46 2010 +0200 @@ -23,8 +23,11 @@ # tester executable -add_executable(test_makefilelib main.cpp) -target_link_libraries(test_makefilelib makefilelib) +add_executable(test_simple main.cpp) +target_link_libraries(test_simple makefilelib) add_executable(test_filenames test_filenames.cpp) -target_link_libraries(test_filenames makefilelib ${Boost_LIBRARIES}) \ No newline at end of file +target_link_libraries(test_filenames makefilelib${Boost_LIBRARIES}) + +add_executable(test_makefilelib test_makefilelib.cpp) +target_link_libraries(test_makefilelib makefilelib ${Boost_LIBRARIES}) \ No newline at end of file diff -r 54f7a287c206 -r d735217f801b src/hugin_base/makefilelib/char_type.h --- a/src/hugin_base/makefilelib/char_type.h Sun Jul 25 10:02:29 2010 +0200 +++ b/src/hugin_base/makefilelib/char_type.h Tue Jul 27 00:04:46 2010 +0200 @@ -22,14 +22,16 @@ #include #include -#define USE_WCHAR +//#define USE_WCHAR namespace makefile { #ifdef USE_WCHAR typedef wchar_t char_type; + typedef unsigned wchar_t uchar_type; #else typedef char char_type; + typedef unsigned char uchar_type; #endif /// streams, use the extended fstream versions from boost::filesystem. diff -r 54f7a287c206 -r d735217f801b src/hugin_base/makefilelib/test_filenames.cpp --- a/src/hugin_base/makefilelib/test_filenames.cpp Sun Jul 25 10:02:29 2010 +0200 +++ b/src/hugin_base/makefilelib/test_filenames.cpp Tue Jul 27 00:04:46 2010 +0200 @@ -25,10 +25,6 @@ #include #include -#ifndef USE_WCHAR -#warning "The filename tester doesn't make much sense without wide characters." -#endif - using namespace makefile; namespace fs = boost::filesystem; @@ -60,11 +56,11 @@ * @param limit Upper limit for filenames * @return Filenames that couldn't be found after creation. */ -std::vector createfiles_direct(const path dir, char_type limit) +std::vector createfiles_direct(const path dir, uchar_type limit) { std::vector miss; char_type c[] = cstr("X.1"); - for(*c = 0x20; *c < limit; (*c)++) + for(*c = 0x20; static_cast(*c) < limit; (*c)++) { path filename(c); ofstream file(dir / filename); @@ -91,12 +87,12 @@ * @param limit Upper limit for filenames * @return Filenames that couldn't be found after creation. */ -std::vector createfiles_make(const path dir, char_type limit) +std::vector createfiles_make(const path dir, uchar_type limit) { const path makefile(cstr("makefile")); std::vector miss; char_type c[] = cstr("X.1"); - for(*c = 0x20; *c < limit; (*c)++) + for(*c = 0x20; static_cast(*c) < limit; (*c)++) { path filename(c); ofstream makefilefile(dir / makefile); @@ -155,7 +151,7 @@ // set the environments locale. std::locale::global(std::locale("")); - char_type limit; + uchar_type limit; if(argc != 2) { std::cerr << "Specify a limit as first argument" << std::endl; @@ -163,7 +159,7 @@ }else{ limit = std::atoi(argv[1]); } - std::cout << "Creating " << static_cast(limit) << " files in" << std::endl; + std::cout << "Creating " << static_cast(limit) << " files in" << std::endl; path basepath(fs::initial_path() / cstr("chartest_direct")); path basepathmake(fs::initial_path() / cstr("chartest_make")); diff -r 54f7a287c206 -r d735217f801b src/hugin_base/makefilelib/test_makefilelib.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin_base/makefilelib/test_makefilelib.cpp Tue Jul 27 00:04:46 2010 +0200 @@ -0,0 +1,116 @@ +/** + * @file test_makefilelib.cpp + * @brief Tests all features of the lib. + * Created on: Jul 24, 2010 + * @author Florian Achleitner + */ + +#include "char_type.h" +#include +#include +#include +#include +#include "Comment.h" +#include "Variable.h" +#include "VariableDef.h" +#include "VariableRef.h" +#include "MakefileItem.h" +#include "Makefile.h" +#include "AutoVariable.h" +#include "Newline.h" +#include "Rule.h" +#include "Conditional.h" +#include "StringAdapter.h" + +#include +#include + +using namespace makefile; +namespace fs = boost::filesystem; +namespace io = boost::iostreams; + +#ifdef USE_WCHAR +ostream& cout = std::wcout; +ostream& cerr = std::wcerr; +#else +ostream& cout = std::cout; +ostream& cerr = std::cerr; +#endif + +bool run(const char* testname, const char* goodout) +{ + // store 2 fd {read, write} + int fdmakein[2]; + int fdmakeout[2]; + if(pipe(fdmakein) || pipe(fdmakeout)) + { + std::cerr << "pipe() failed." << std::endl; + return false; + } + std::stringbuf makeoutbuf; + + if(fork()) + { // parent + close(fdmakein[0]); + close(fdmakeout[1]); + + io::stream makein(fdmakein[1]); + io::stream makeout(fdmakeout[0]); + // Write the makefile to make's stdin + Makefile::getSingleton().writeMakefile(makein); + Makefile::getSingleton().clean(); + makein.close(); + makeout.get(makeoutbuf, '\0'); // delimiter \0 should read until eof. + wait(NULL); + + + } else { // child + close(fdmakein[1]); + close(fdmakeout[0]); + // replace stdin and stdout + if(dup2(fdmakein[0], 0) == -1 || dup2(fdmakeout[1], 1) == -1) + { + std::cerr << "Failed to switch std stream" << std::endl; + exit(-1); + } + + // execvp takes a NULL-terminated array of null-terminated strings. cool ;) + const char* const argv[] = {"make", "-f-", (char*) NULL}; + execvp(argv[0], (char* const*)argv); + } + + // Compare output + std::cout << "make says: " << makeoutbuf.str() << std::endl; + std::cout << testname << " "; + if(std::string(goodout) == makeoutbuf.str()) + { + std::cout << "PASS" << std::endl; + return true; + } + std::cout << "FAIL" << std::endl; + return false; +} +bool test_Comment() +{ + Comment comment(cstr("First line")); + comment.appendLine(cstr("second line")); + comment.appendLine(cstr("third line\nfourth\r line")); + comment.add(); + return run("Comment", ""); +} + +bool test_Rule() +{ + Rule rule; + rule.addTarget(cstr("all")); + rule.addCommand(cstr("@echo Hello Make")); + rule.add(); + return run("Rule", "Hello Make\n"); +} +int main(int argc, char *argv[]) +{ + bool result = true; + result &= test_Comment(); + result &= test_Rule(); + return !result; // return 0 on success (= !true) +}   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Fix typo in WIN32 part From: - 2010-07-25 08:03 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/54f7a287c206 changeset: 4160:54f7a287c206 user: Florian Achleitner date: Sun Jul 25 10:02:29 2010 +0200 description: Fix typo in WIN32 part diffstat: src/hugin_base/makefilelib/Makefile.cpp | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff -r 4af48b084a2a -r 54f7a287c206 src/hugin_base/makefilelib/Makefile.cpp --- a/src/hugin_base/makefilelib/Makefile.cpp Sat Jul 24 17:40:52 2010 +0200 +++ b/src/hugin_base/makefilelib/Makefile.cpp Sun Jul 25 10:02:29 2010 +0200 @@ -64,7 +64,7 @@ toescape.assign(cstr("(\\$[^\$$])|(\\\$$|(\\#)")); // uses a nice regex feature "recursive expressions" for doing it all in one (subexpression) cascade. output.assign(cstr("(?1\\$$&)(?2/)(?3\\\\&)")); - return string(cstr("\"") + boost::regex_replace(in, toescape, output, boost::match_default | boost::format_all) + cstr("\""); + return string(cstr("\"") + boost::regex_replace(in, toescape, output, boost::match_default | boost::format_all) + cstr("\"")); #else // because parenthesis are replaced too, the first pattern detects variable references and passes them unchanged. toescape.assign(cstr("(\\\$$[^\$$]+\\))|(\\)|([\\\\ \\~\"\\|\\'\\\\{\\}\$\$\$$\$$\\*\\#\\:\\=])"));   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Finish filename tester and summarize t... From: - 2010-07-24 15:41 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/4af48b084a2a changeset: 4159:4af48b084a2a user: Florian Achleitner date: Sat Jul 24 17:40:52 2010 +0200 description: Finish filename tester and summarize the info from emails. diffstat: src/hugin_base/makefilelib/test_filenames.cpp | 104 ++++++++++++++++++------- src/hugin_base/makefilelib/unicode.dox | 25 ++++++ 2 files changed, 98 insertions(+), 31 deletions(-) diffs (192 lines): diff -r 218a13048178 -r 4af48b084a2a src/hugin_base/makefilelib/test_filenames.cpp --- a/src/hugin_base/makefilelib/test_filenames.cpp Sat Jul 24 00:04:54 2010 +0200 +++ b/src/hugin_base/makefilelib/test_filenames.cpp Sat Jul 24 17:40:52 2010 +0200 @@ -25,6 +25,10 @@ #include #include +#ifndef USE_WCHAR +#warning "The filename tester doesn't make much sense without wide characters." +#endif + using namespace makefile; namespace fs = boost::filesystem; @@ -36,6 +40,11 @@ ostream& cerr = std::cerr; #endif +/** + * Prints the tested characters. + * @param out + * @param limit + */ void printchars(ostream& out, wchar_t limit) { char_type c; @@ -45,7 +54,12 @@ } } - +/** + * Tries to create files with names from 0x20 to limit using boost::filesystem. + * @param dir + * @param limit Upper limit for filenames + * @return Filenames that couldn't be found after creation. + */ std::vector createfiles_direct(const path dir, char_type limit) { std::vector miss; @@ -62,7 +76,21 @@ } return miss; } +/** + * Tries to create files with names from 0x20 to limit by calling make. + * It first writes a makefile of this structure: +@verbatim +FILENAME=X.1 +all : +@touch (FILENAME) +@endverbatim + * Afterwards make is called with system() and creates the file by executing touch. + * + * @param dir + * @param limit Upper limit for filenames + * @return Filenames that couldn't be found after creation. + */ std::vector createfiles_make(const path dir, char_type limit) { const path makefile(cstr("makefile")); @@ -73,23 +101,30 @@ path filename(c); ofstream makefilefile(dir / makefile); - makefile::Variable mffilename(cstr("FILENAME"), (dir / filename).string(), makefile::Makefile::SHELL); - makefile::Rule touch; - touch.addTarget(cstr("all")); - touch.addCommand(cstr("@touch ") + mffilename.getRef().toString()); + // If the filename cannot be stored in a Variable, theres no chance to bring it through. + try { + makefile::Variable mffilename(cstr("FILENAME"), (dir / filename).string(), makefile::Makefile::SHELL); - mffilename.getDef().add(); - touch.add(); - makefile::Makefile::getSingleton().writeMakefile(makefilefile); - makefile::Makefile::clean(); - makefilefile.close(); + makefile::Rule touch; + touch.addTarget(cstr("all")); + touch.addCommand(cstr("@touch ") + mffilename.getRef().toString()); - string dirstring = dir.string(); - std::string command("cd " + StringAdapter(dirstring) + " && make"); - int makeerr = std::system(command.c_str()); + mffilename.getDef().add(); + touch.add(); + makefile::Makefile::getSingleton().writeMakefile(makefilefile); + makefile::Makefile::clean(); + makefilefile.close(); - if(makeerr) - std::cerr << "make returned " << makeerr << std::endl; + string dirstring = dir.string(); + std::string command("cd " + StringAdapter(dirstring) + " && make"); + int makeerr = std::system(command.c_str()); + + if(makeerr) + std::cerr << "make returned " << makeerr << std::endl; + } + catch(std::exception& e) { + std::cerr << "Variable exception: " << e.what() << "*c = " << static_cast(*c) << std::endl; + } if(!fs::exists(dir / filename)) { @@ -98,6 +133,22 @@ } return miss; } +/** + * Removes and recreates the output directories. + * @param dir + * @return 0 on success, 1 on error. + */ +int cleandir(path dir) +{ + if(fs::is_directory(dir)) + fs::remove_all(dir); + if(!fs::create_directories(dir)) + { + cerr << cstr("Error creating directory ") << dir.string() << std::endl; + return 1; + } + return 0; +} int main(int argc, char *argv[]) { @@ -112,25 +163,16 @@ }else{ limit = std::atoi(argv[1]); } - std::cout << "Creating " << static_cast(limit) << " files, twice." << std::endl; + std::cout << "Creating " << static_cast(limit) << " files in" << std::endl; - path basepath(cstr("/tmp/chartest_direct")); - path basepathmake(cstr("/tmp/chartest_make")); + path basepath(fs::initial_path() / cstr("chartest_direct")); + path basepathmake(fs::initial_path() / cstr("chartest_make")); - if(fs::is_directory(basepath)) - fs::remove_all(basepath); - if(!fs::create_directories(basepath)) - { - cerr << cstr("Error creating directory ") << basepath.string() << std::endl; + cout << basepath.string() << std::endl; + cout << basepathmake.string() << std::endl; + + if(cleandir(basepath) || cleandir(basepathmake)) return 1; - } - if(fs::is_directory(basepathmake)) - fs::remove_all(basepathmake); - if(!fs::create_directories(basepathmake)) - { - cerr << cstr("Error creating directory ") << basepathmake.string() << std::endl; - return 1; - } // ofstream outfile(basepath / cstr("tf.out")); // printchars(outfile, limit); diff -r 218a13048178 -r 4af48b084a2a src/hugin_base/makefilelib/unicode.dox --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin_base/makefilelib/unicode.dox Sat Jul 24 17:40:52 2010 +0200 @@ -0,0 +1,25 @@ +/** \page unicode About unicode and filename + +It's important to support a defined range of possible characters in filenames, as it is up to the user to assign names to his image files. + +This is a rather hairy topic, because C++ is not good in handling characters bigger than a byte and there are major differences between platforms (windows and linux). + +\section facts Some Facts +- C/C++ standard only specifies that a char is 8 bit and a wide character called wchar_t is wider than that. In fact on Microsoft it's 16bit, on gcc 32bit. +With gcc you can store UTF32 character is a wchar_t, which are constant length, while on windows, it would be kind of truncated UTF32, because UTF16 is variable length. But note, that char or wchar_t doesn't say anything about the encoding. + +- On modern Linux UTF8 is used normally. UTF8 is ASCII compatible (on the lower 7bit) and variably uses up to 4 bytes per character. The usage depends on the locale. It's normally set to de_DE.utf8 for example. With this setting all char strings are interpreted as UTF8. Therefore it's perfect to use char and std::string (instead of std::wstring) to store any unicode glyph. But byte counting methods like strlen or std::string::length() may not return exact values. +Filenames are also UTF8, so sticking with char is ok and consumes only a quarter of memory compared to wstring. +- It's important to set the locale in your program. It defaults to "C" which only supports ASCII. For C++ std::locale::global(std::locale("")) sets the locale to the system environemt's. Note that the C function setlocale() doesn't affect C++ streams. But changing std::locale::global calls setlocale. To apply a specific locale to a stream use mystream.imbue(mylocale). + +- On newer Windows they use their 16bit wchar_t internally (because they have to deal with lots of legacy software), so it doesn't save memory to use char, and if you use char, it depends on the windows localized version you have, how char strings are converted by the win api. + +- NTFS stores filenames (according to @ref http://en.wikipedia.org/wiki/NTFS [wikipedia]) in 16bit words, and doesn't care about the encoding. The windows api has two calls one for with char and with wchar_t, that is hidden by some macro, normally. +If you use the char api calls, the current codepage is used. + +- Unicodes most important characters are in the first 16bit, called the BMP, basic multilingual plane. It holds virtually all useful characters. If we can handle all these characters, that should be more than enough. + +- The filename tester tries creating files systematically. + +@author Florian Achleitner +*/   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: 4 new changesets From: - 2010-07-20 15:33 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/010acf1baffb changeset: 4143:010acf1baffb user: Florian Achleitner date: Fri Jul 16 18:10:07 2010 +0200 description: Lot of tryout about locales added details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/de53d98e8d9d changeset: 4144:de53d98e8d9d user: Florian Achleitner date: Mon Jul 19 14:38:34 2010 +0200 description: - add Boost filesystems in global CMakeLists - start filename tester details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/cead664f3eff changeset: 4145:cead664f3eff user: Florian Achleitner date: Tue Jul 20 17:16:39 2010 +0200 description: Warning, broken commit Mission Unicode: Make the makefilelib unicode aware and make this easily changeable (very tough). - extract all char dependant types into a single header (char_type.h) to allow choosing between char and wchar_t on one point. - this breaks a lot of stuff, like literal strings because C++ seems not to be made for this. - cout doesn't work with wchar_t, so main.cpp is still broken if USE_WCHAR is defined. - the rest compiles, don't know if it links and works. details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/45e5b3a71d32 changeset: 4146:45e5b3a71d32 user: Florian Achleitner date: Tue Jul 20 17:22:01 2010 +0200 description: Runs with wchars now! - Simple temporary fix for main.cpp, writing to a file instead of cout diffstat: CMakeLists.txt | 2 +- src/hugin_base/makefilelib/AutoVariable.cpp | 2 +- src/hugin_base/makefilelib/AutoVariable.h | 4 +- src/hugin_base/makefilelib/CMakeLists.txt | 3 + src/hugin_base/makefilelib/Comment.cpp | 11 +- src/hugin_base/makefilelib/Comment.h | 15 +- src/hugin_base/makefilelib/Conditional.cpp | 12 +- src/hugin_base/makefilelib/Conditional.h | 36 +++--- src/hugin_base/makefilelib/Filename.cpp | 2 +- src/hugin_base/makefilelib/Filename.h | 2 +- src/hugin_base/makefilelib/Makefile.cpp | 30 ++-- src/hugin_base/makefilelib/Makefile.h | 6 +- src/hugin_base/makefilelib/MakefileItem.cpp | 2 +- src/hugin_base/makefilelib/MakefileItem.h | 11 +- src/hugin_base/makefilelib/Newline.h | 6 +- src/hugin_base/makefilelib/Rule.cpp | 16 +- src/hugin_base/makefilelib/Rule.h | 14 +- src/hugin_base/makefilelib/Variable.cpp | 9 +- src/hugin_base/makefilelib/Variable.h | 13 +- src/hugin_base/makefilelib/VariableDef.cpp | 4 +- src/hugin_base/makefilelib/VariableDef.h | 2 +- src/hugin_base/makefilelib/VariableRef.cpp | 4 +- src/hugin_base/makefilelib/VariableRef.h | 2 +- src/hugin_base/makefilelib/char_type.h | 64 +++++++++++ src/hugin_base/makefilelib/main.cpp | 140 +++++++++++++------------- src/hugin_base/makefilelib/test_filenames.cpp | 105 +++++++++++++++++++ src/hugin_base/makefilelib/unicode.cpp | 40 ++++++- 27 files changed, 376 insertions(+), 181 deletions(-) diffs (truncated from 1174 to 500 lines): diff -r 213688c4d94c -r 45e5b3a71d32 CMakeLists.txt --- a/CMakeLists.txt Wed Jul 14 21:52:40 2010 +0200 +++ b/CMakeLists.txt Tue Jul 20 17:22:01 2010 +0200 @@ -232,7 +232,7 @@ set(BOOST_ROOT {SOURCE_BASE_DIR}/boost{Boost_root_suffix}) endif(NOT BOOST_ROOT AND NOT ENV{BOOST_ROOT} STREQUAL "") ENDIF(WIN32) -FIND_PACKAGE(Boost COMPONENTS thread regex) +FIND_PACKAGE(Boost COMPONENTS thread regex filesystem) IF (NOT Boost_FOUND) MESSAGE(FATAL_ERROR "boost not found. Bad BOOST_ROOT? On windows, try editing Boost_root_suffix") ENDIF (NOT Boost_FOUND) diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/AutoVariable.cpp --- a/src/hugin_base/makefilelib/AutoVariable.cpp Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/AutoVariable.cpp Tue Jul 20 17:22:01 2010 +0200 @@ -15,7 +15,7 @@ return 0; } -std::string AutoVariable::getValue() +string AutoVariable::getValue() { throw(std::runtime_error("AutoVariables have no predefined value.")); } diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/AutoVariable.h --- a/src/hugin_base/makefilelib/AutoVariable.h Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/AutoVariable.h Tue Jul 20 17:22:01 2010 +0200 @@ -24,7 +24,7 @@ /// Automatic Variables have special names, so we omit checking. virtual int checkStrings(); public: - AutoVariable(std::string name) + AutoVariable(string name) : Variable(name) { checkStrings(); @@ -33,7 +33,7 @@ {}; /// Has no value, exception. - virtual std::string getValue(); + virtual string getValue(); /// Has no definition, exception. virtual VariableDef& getDef(); diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/CMakeLists.txt --- a/src/hugin_base/makefilelib/CMakeLists.txt Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/CMakeLists.txt Tue Jul 20 17:22:01 2010 +0200 @@ -25,3 +25,6 @@ # tester executable add_executable(test_makefilelib main.cpp) target_link_libraries(test_makefilelib makefilelib) + +add_executable(test_filenames test_filenames.cpp) +target_link_libraries(test_filenames makefilelib {Boost_LIBRARIES}) \ No newline at end of file diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Comment.cpp --- a/src/hugin_base/makefilelib/Comment.cpp Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Comment.cpp Tue Jul 20 17:22:01 2010 +0200 @@ -6,20 +6,17 @@ */ #include "Comment.h" -#include - -using namespace std; namespace makefile { -static const string prefix("\n# "); +static const string prefix(cstr("\n# ")); /// \todo strip disallowed characters. -std::string Comment::toString() +string Comment::toString() { - static const boost::regex newline("\\R"); - return string(prefix + boost::regex_replace(text, newline, prefix) + '\n'); + static const regex newline(cstr("\\R")); + return string(prefix + boost::regex_replace(text, newline, prefix) + cstr('\n')); } } diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Comment.h --- a/src/hugin_base/makefilelib/Comment.h Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Comment.h Tue Jul 20 17:22:01 2010 +0200 @@ -9,7 +9,6 @@ #define COMMENT_H_ #include "MakefileItem.h" -#include namespace makefile { @@ -20,32 +19,32 @@ */ class Comment : public MakefileItem { - std::string text; + string text; public: Comment() {} - Comment(std::string s) : text(s) {} + Comment(string s) : text(s) {} virtual ~Comment() { } - std::string& getText() + string& getText() { return text; } - void setText(const std::string& s) + void setText(const string& s) { text = s; } - void appendLine(const std::string& line) + void appendLine(const string& line) { - text.append("\n"); + text.append(cstr("\n")); text.append(line); } - virtual std::string toString(); + virtual string toString(); }; } diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Conditional.cpp --- a/src/hugin_base/makefilelib/Conditional.cpp Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Conditional.cpp Tue Jul 20 17:22:01 2010 +0200 @@ -10,23 +10,23 @@ namespace makefile { -std::string Conditional::toString() +string Conditional::toString() { - std::string str = printif(); + string str = printif(); std::vector::iterator i; for(i = ifblock.begin(); i != ifblock.end(); i++) str.append((*i)->toString()); - str.append("\n"); + str.append(cstr("\n")); // only if else block has contents. if(!elseblock.empty()) { - str.append("else\n"); + str.append(cstr("else\n")); for(i = elseblock.begin(); i != elseblock.end(); i++) str.append((*i)->toString()); - str.append("\n"); + str.append(cstr("\n")); } - str.append("endif\n"); + str.append(cstr("endif\n")); return str; } diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Conditional.h --- a/src/hugin_base/makefilelib/Conditional.h Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Conditional.h Tue Jul 20 17:22:01 2010 +0200 @@ -31,7 +31,7 @@ class Conditional: public makefile::MakefileItem { /// Output the header line, like ifeq (arg1, arg2). - virtual std::string printif()=0; + virtual string printif()=0; /// MakefileItem active if the condition is true. std::vector ifblock; /// MakefileItem in the else block. The else-block is ommited if this is empty. @@ -51,18 +51,18 @@ elseblock.push_back(&item); } - virtual std::string toString(); + virtual string toString(); }; class ConditionalEQ: public makefile::Conditional { - std::string arg1, arg2; - virtual std::string printif() + string arg1, arg2; + virtual string printif() { - return "ifeq (" + arg1 + "," + arg2 + ")\n"; + return cstr("ifeq (") + arg1 + cstr(",") + arg2 + cstr(")\n"); } public: - ConditionalEQ(std::string arg1_, std::string arg2_) + ConditionalEQ(string arg1_, string arg2_) :arg1(arg1_), arg2(arg2_) {} virtual ~ConditionalEQ() @@ -72,13 +72,13 @@ class ConditionalNEQ: public makefile::Conditional { - std::string arg1, arg2; - virtual std::string printif() + string arg1, arg2; + virtual string printif() { - return "ifneq (" + arg1 + "," + arg2 + ")\n"; + return cstr("ifneq (") + arg1 + cstr(",") + arg2 + cstr(")\n"); } public: - ConditionalNEQ(std::string arg1_, std::string arg2_) + ConditionalNEQ(string arg1_, string arg2_) :arg1(arg1_), arg2(arg2_) {} virtual ~ConditionalNEQ() @@ -88,13 +88,13 @@ class ConditionalDEF: public makefile::Conditional { - std::string varname; - virtual std::string printif() + string varname; + virtual string printif() { - return "ifdef " + varname + "\n"; + return cstr("ifdef ") + varname + cstr("\n"); } public: - ConditionalDEF(std::string varname_) + ConditionalDEF(string varname_) :varname(varname_) {} virtual ~ConditionalDEF() @@ -104,13 +104,13 @@ class ConditionalNDEF: public makefile::Conditional { - std::string varname; - virtual std::string printif() + string varname; + virtual string printif() { - return "ifndef " + varname + "\n"; + return cstr("ifndef ") + varname + cstr("\n"); } public: - ConditionalNDEF(std::string varname_) + ConditionalNDEF(string varname_) :varname(varname_) {} virtual ~ConditionalNDEF() diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Filename.cpp --- a/src/hugin_base/makefilelib/Filename.cpp Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Filename.cpp Tue Jul 20 17:22:01 2010 +0200 @@ -21,7 +21,7 @@ // TODO Auto-generated destructor stub } -std::string Filename::toString() +string Filename::toString() { } diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Filename.h --- a/src/hugin_base/makefilelib/Filename.h Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Filename.h Tue Jul 20 17:22:01 2010 +0200 @@ -25,7 +25,7 @@ Filename(); virtual ~Filename(); - virtual std::string toString(); + virtual string toString(); }; } diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Makefile.cpp --- a/src/hugin_base/makefilelib/Makefile.cpp Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Makefile.cpp Tue Jul 20 17:22:01 2010 +0200 @@ -7,9 +7,7 @@ #include "Makefile.h" #include "MakefileItem.h" -#include -using namespace std; namespace makefile { @@ -55,45 +53,45 @@ * @param mode switch. * @return A new string containing the processed content. */ -std::string Makefile::quote(const std::string& in, Makefile::QuoteMode mode) +string Makefile::quote(const string& in, Makefile::QuoteMode mode) { - boost::regex toescape; - std::string output; + regex toescape; + string output; switch(mode) { case Makefile::SHELL: #ifdef WIN32 - toescape.assign("(\\[^\$$])|(\\\$$|(\\#)"); + toescape.assign(cstr("(\\[^\$$])|(\\\$$|(\\#)")); // uses a nice regex feature "recursive expressions" for doing it all in one (subexpression) cascade. - output.assign("(?1\\$$&)(?2/)(?3\\\\$&)"); - return std::string("\"") + boost::regex_replace(in, toescape, output, boost::match_default | boost::format_all) + "\""; + output.assign(cstr("(?1\\$$&)(?2/)(?3\\\\&)")); + return string(cstr("\"") + boost::regex_replace(in, toescape, output, boost::match_default | boost::format_all) + cstr("\""); #else // because parenthesis are replaced too, the first pattern detects variable references and passes them unchanged. - toescape.assign("(\\\$$[^\$$]+\\))|(\\)|([\\\\ \\~\"\\|\\'\\\\{\\}\$\$\$$\$$\\*\\#\\:\\=])"); - output.assign("(?1&)(?2\\\\\\$$&)(?3\\\\$&)"); + toescape.assign(cstr("(\\$\$$[^\$$]+\\))|(\\$)|([\\\\ \\~\"\\|\\'\\\\{\\}\$\$\$$\$$\\*\\#\\:\\=])")); + output.assign(cstr("(?1$&)(?2\\\\\\$$&)(?3\\\\&)")); return boost::regex_replace(in, toescape, output, boost::match_default | boost::format_all); #endif break; case Makefile::MAKE: #ifdef WIN32 - toescape.assign("(\\[^\\(])|([ \\#\\=])"); - output.assign("(?1\\$$&)(?2\\\\$&)"); + toescape.assign(cstr("(\\$[^\\(])|([ \\#\\=])")); + output.assign(cstr("(?1\\$$&)(?2\\\\&)")); return boost::regex_replace(in, toescape, output, boost::match_default | boost::format_all); #else // do not replace if followed by a (. To allow variable references. - toescape.assign("(\\[^\\(])|([ \\#\\:\\=])"); - output.assign("(?1\\$$&)(?2\\\\$&)"); + toescape.assign(cstr("(\\$[^\\(])|([ \\#\\:\\=])")); + output.assign(cstr("(?1\\$$&)(?2\\\\$&)")); return boost::regex_replace(in, toescape, output, boost::match_default | boost::format_all); #endif break; default: - return std::string(in); + return string(in); } } int Makefile::writeMakefile(ostream& out) { - for(vector::iterator i = items.begin(); i != items.end(); i++) + for(std::vector::iterator i = items.begin(); i != items.end(); i++) { out << **i; } diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Makefile.h --- a/src/hugin_base/makefilelib/Makefile.h Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Makefile.h Tue Jul 20 17:22:01 2010 +0200 @@ -8,7 +8,7 @@ #ifndef MAKEFILE_H_ #define MAKEFILE_H_ -#include +#include "char_type.h" #include #include @@ -37,7 +37,7 @@ * Selects quoting modes. */ enum QuoteMode {MAKE, SHELL, NONE}; - static std::string quote(const std::string& in, Makefile::QuoteMode mode); + static string quote(const string& in, Makefile::QuoteMode mode); /** @@ -72,7 +72,7 @@ * @param out ostream to write the Makefile to. * @return */ - int writeMakefile(std::ostream& out); + int writeMakefile(ostream& out); }; } diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/MakefileItem.cpp --- a/src/hugin_base/makefilelib/MakefileItem.cpp Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/MakefileItem.cpp Tue Jul 20 17:22:01 2010 +0200 @@ -10,7 +10,7 @@ namespace makefile { -std::ostream& operator<<(std::ostream& stream, MakefileItem& item) +ostream& operator<<(ostream& stream, MakefileItem& item) { item.print(stream); return stream; diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/MakefileItem.h --- a/src/hugin_base/makefilelib/MakefileItem.h Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/MakefileItem.h Tue Jul 20 17:22:01 2010 +0200 @@ -10,9 +10,6 @@ #include "Makefile.h" -#include -#include - namespace makefile { @@ -39,14 +36,14 @@ } /// @return A string representation of the MakefileItem. - virtual std::string toString()=0; + virtual string toString()=0; /// Write the items representation to an ostream in a makefile compatible way. - void print(std::ostream& os) + void print(ostream& os) { os << toString(); } /// Allow casts to string, very nice! - operator std::string() + operator string() { return toString(); } @@ -60,7 +57,7 @@ }; /// Allows writing to ostreams. -std::ostream& operator<<(std::ostream& stream, MakefileItem& item); +ostream& operator<<(ostream& stream, MakefileItem& item); } diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Newline.h --- a/src/hugin_base/makefilelib/Newline.h Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Newline.h Tue Jul 20 17:22:01 2010 +0200 @@ -28,11 +28,11 @@ virtual ~Newline() {} - virtual std::string toString() + virtual string toString() { - std::string n; + string n; for(int i=0; i::iterator i; + string str(cstr("\n")); + std::vector::iterator i; for(i = targets.begin(); i != targets.end(); i++) { - str.append(*i + " "); + str.append(*i + cstr(" ")); } - str.append(": "); + str.append(cstr(": ")); for(i = prerequisites.begin(); i != prerequisites.end(); i++) { - str.append(*i + " "); + str.append(*i + cstr(" ")); } - str.append("\n"); + str.append(cstr("\n")); for(i = commands.begin(); i != commands.end(); i++) { - str.append("\t" +*i + "\n"); + str.append(cstr("\t") +*i + cstr("\n")); } return str; diff -r 213688c4d94c -r 45e5b3a71d32 src/hugin_base/makefilelib/Rule.h --- a/src/hugin_base/makefilelib/Rule.h Wed Jul 14 21:52:40 2010 +0200 +++ b/src/hugin_base/makefilelib/Rule.h Tue Jul 20 17:22:01 2010 +0200 @@ -21,9 +21,9 @@ */ class Rule : public MakefileItem { - std::vector targets; 

 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: 4 new changesets From: - 2010-07-23 22:05 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/adcffab95362 changeset: 4153:adcffab95362 user: Florian Achleitner date: Fri Jul 23 14:48:01 2010 +0200 description: add StringAdapter and use it details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/e0047496a2f6 changeset: 4154:e0047496a2f6 user: Florian Achleitner date: Fri Jul 23 14:57:28 2010 +0200 description: fine tuning details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/462f7c47db2c changeset: 4155:462f7c47db2c user: Florian Achleitner date: Fri Jul 23 23:35:14 2010 +0200 description: filename tester basically working. details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/218a13048178 changeset: 4156:218a13048178 user: Florian Achleitner date: Sat Jul 24 00:04:54 2010 +0200 description: - improve filename tester - and StringAdapter diffstat: src/hugin_base/makefilelib/CMakeLists.txt | 2 +- src/hugin_base/makefilelib/StringAdapter.h | 56 +++++++++++++++++ src/hugin_base/makefilelib/Variable.cpp | 5 +- src/hugin_base/makefilelib/main.cpp | 7 +- src/hugin_base/makefilelib/test_filenames.cpp | 86 ++++++++++++++++++++------ 5 files changed, 131 insertions(+), 25 deletions(-) diffs (274 lines): diff -r 45e5b3a71d32 -r 218a13048178 src/hugin_base/makefilelib/CMakeLists.txt --- a/src/hugin_base/makefilelib/CMakeLists.txt Tue Jul 20 17:22:01 2010 +0200 +++ b/src/hugin_base/makefilelib/CMakeLists.txt Sat Jul 24 00:04:54 2010 +0200 @@ -1,7 +1,7 @@ SET(MAKEFILELIB_SRC Comment.cpp MakefileItem.cpp Variable.cpp VariableRef.cpp Filename.cpp Makefile.cpp Rule.cpp VariableDef.cpp AutoVariable.cpp Conditional.cpp) SET(MAKEFILELIB_HEADER Comment.h Makefile.h Rule.h Variable.h Filename.h - MakefileItem.h VariableDef.h VariableRef.h AutoVariable.h Newline.h Conditional.h) + MakefileItem.h VariableDef.h VariableRef.h AutoVariable.h Newline.h Conditional.h char_type.h StringAdapter.h) set(CMAKE_CXX_FLAGS "{CMAKE_CXX_FLAGS} -Wall") diff -r 45e5b3a71d32 -r 218a13048178 src/hugin_base/makefilelib/StringAdapter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin_base/makefilelib/StringAdapter.h Sat Jul 24 00:04:54 2010 +0200 @@ -0,0 +1,56 @@ +/** + * @file StringAdapter.h + * @brief + * Created on: Jul 23, 2010 + * @author Florian Achleitner + */ + +#ifndef STRINGADAPTER_H_ +#define STRINGADAPTER_H_ + +#include +#include + + +namespace makefile +{ +/** + * Adapts a string of wide or narrow characters to a narrow character std::string. + * It uses the narrow method of standard iostreams, it doesn't do any code conversion. + * It's purpose is to allow exception texts to contain wide strings, regardless of + * USE_WCHAR. + */ +class StringAdapter : public std::string +{ + void use_narrow(const wchar_t* ws) + { + std::ostringstream ostr; + for(const wchar_t* i = ws; *i; i++) + { + ostr.put(ostr.narrow(*i, '?')); + } + assign(ostr.str()); + } +public: + StringAdapter(std::wstring& ws) + { + use_narrow(ws.c_str()); + } + StringAdapter(const std::string& s) + : std::string(s) + {} + StringAdapter(const wchar_t* ws) + { + use_narrow(ws); + } + StringAdapter(const char* s) + : std::string(s) + {} + virtual ~StringAdapter() + { + } +}; + +} + +#endif /* STRINGADAPTER_H_ */ diff -r 45e5b3a71d32 -r 218a13048178 src/hugin_base/makefilelib/Variable.cpp --- a/src/hugin_base/makefilelib/Variable.cpp Tue Jul 20 17:22:01 2010 +0200 +++ b/src/hugin_base/makefilelib/Variable.cpp Sat Jul 24 00:04:54 2010 +0200 @@ -6,6 +6,7 @@ */ #include "Variable.h" +#include "StringAdapter.h" #include @@ -21,7 +22,7 @@ { static const regex validname(cstr("\\w+")); if( !boost::regex_match(name, validname)) - throw std::invalid_argument("Bad Variable name: " /*+ name*/); ///< @todo Need converter! + throw std::invalid_argument("Bad Variable name: " + StringAdapter(name)); } /** @@ -32,6 +33,6 @@ { static const regex invalid(cstr("\\R")); if(boost::regex_search(value, invalid)) - throw std::invalid_argument("Bad Variable value: " /*+ value*/); ///< @todo Need converter! + throw std::invalid_argument("Bad Variable value: " + StringAdapter(value)); } } diff -r 45e5b3a71d32 -r 218a13048178 src/hugin_base/makefilelib/main.cpp --- a/src/hugin_base/makefilelib/main.cpp Tue Jul 20 17:22:01 2010 +0200 +++ b/src/hugin_base/makefilelib/main.cpp Sat Jul 24 00:04:54 2010 +0200 @@ -17,12 +17,17 @@ #include "Newline.h" #include "Rule.h" #include "Conditional.h" +#include "StringAdapter.h" #include using namespace makefile; -ofstream out("output"); +#ifdef USE_WCHAR +ostream& out = std::wcout; +#else +ostream& out = std::cout; +#endif int tryall() { diff -r 45e5b3a71d32 -r 218a13048178 src/hugin_base/makefilelib/test_filenames.cpp --- a/src/hugin_base/makefilelib/test_filenames.cpp Tue Jul 20 17:22:01 2010 +0200 +++ b/src/hugin_base/makefilelib/test_filenames.cpp Sat Jul 24 00:04:54 2010 +0200 @@ -19,13 +19,23 @@ #include "Newline.h" #include "Rule.h" #include "Conditional.h" +#include "StringAdapter.h" #include #include +#include using namespace makefile; namespace fs = boost::filesystem; +#ifdef USE_WCHAR +ostream& cout = std::wcout; +ostream& cerr = std::wcerr; +#else +ostream& cout = std::cout; +ostream& cerr = std::cerr; +#endif + void printchars(ostream& out, wchar_t limit) { char_type c; @@ -36,9 +46,9 @@ } -int createfiles_direct(const path dir, char_type limit) +std::vector createfiles_direct(const path dir, char_type limit) { - int err = 0; + std::vector miss; char_type c[] = cstr("X.1"); for(*c = 0x20; *c < limit; (*c)++) { @@ -47,38 +57,46 @@ file.close(); if(!fs::exists(dir / filename)) { - err++; + miss.push_back(filename); } } - return err; + return miss; } -int createfiles_make(const path dir, char_type limit) +std::vector createfiles_make(const path dir, char_type limit) { const path makefile(cstr("makefile")); - int err = 0; -#if 0 - wchar_t c[] = L"X.1"; + std::vector miss; + char_type c[] = cstr("X.1"); for(*c = 0x20; *c < limit; (*c)++) { path filename(c); ofstream makefilefile(dir / makefile); - makefile::Variable mffilename("FILENAME", (dir / filename).string()); + makefile::Variable mffilename(cstr("FILENAME"), (dir / filename).string(), makefile::Makefile::SHELL); makefile::Rule touch; - touch.addTarget(mffilename.getRef()); - touch.addCommand("touch " + mffilename.getRef()); + touch.addTarget(cstr("all")); + touch.addCommand(cstr("@touch ") + mffilename.getRef().toString()); + mffilename.getDef().add(); + touch.add(); makefile::Makefile::getSingleton().writeMakefile(makefilefile); makefile::Makefile::clean(); + makefilefile.close(); + + string dirstring = dir.string(); + std::string command("cd " + StringAdapter(dirstring) + " && make"); + int makeerr = std::system(command.c_str()); + + if(makeerr) + std::cerr << "make returned " << makeerr << std::endl; if(!fs::exists(dir / filename)) { - err++; + miss.push_back(filename); } } -#endif - return err; + return miss; } int main(int argc, char *argv[]) @@ -86,20 +104,46 @@ // set the environments locale. std::locale::global(std::locale("")); - const char_type limit = 1024; - path basepath(cstr("/tmp/chartest")); + char_type limit; + if(argc != 2) + { + std::cerr << "Specify a limit as first argument" << std::endl; + return 1; + }else{ + limit = std::atoi(argv[1]); + } + std::cout << "Creating " << static_cast(limit) << " files, twice." << std::endl; + + path basepath(cstr("/tmp/chartest_direct")); + path basepathmake(cstr("/tmp/chartest_make")); if(fs::is_directory(basepath)) fs::remove_all(basepath); if(!fs::create_directories(basepath)) { - std::cerr << "Error creating directory " /*<< basepath.string()*/ << std::endl; + cerr << cstr("Error creating directory ") << basepath.string() << std::endl; + return 1; + } + if(fs::is_directory(basepathmake)) + fs::remove_all(basepathmake); + if(!fs::create_directories(basepathmake)) + { + cerr << cstr("Error creating directory ") << basepathmake.string() << std::endl; return 1; } - ofstream outfile(basepath / cstr("tf.out")); - printchars(outfile, limit); - int err = createfiles_direct(basepath, limit); - std::cout << "Missing files " << err << std::endl; +// ofstream outfile(basepath / cstr("tf.out")); +// printchars(outfile, limit); + + std::vector miss_direct = createfiles_direct(basepath, limit); + cout << cstr("Direct: Missing files ") << miss_direct.size() << std::endl; + for(std::vector::iterator i = miss_direct.begin(); i != miss_direct.end(); i++) + cout << i->string() << cstr('\n'); + + + std::vector miss_make = createfiles_make(basepathmake, limit); + cout << cstr("Make: Missing files ") << miss_make.size() << std::endl; + for(std::vector::iterator i = miss_make.begin(); i != miss_make.end(); i++) + cout << i->string() << cstr('\n'); return 0; }   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Reduce resolution for overlap detectio... From: - 2010-07-23 20:31 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/8cbe07845ccf changeset: 4151:8cbe07845ccf user: tmodes date: Fri Jul 23 22:30:18 2010 +0200 description: Reduce resolution for overlap detection in makefile generation (This should speed up of writing of makefile) diffstat: src/hugin_base/algorithms/panorama_makefile/PanoramaMakefileExport.cpp | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff -r f408e18d7ed7 -r 8cbe07845ccf src/hugin_base/algorithms/panorama_makefile/PanoramaMakefileExport.cpp --- a/src/hugin_base/algorithms/panorama_makefile/PanoramaMakefileExport.cpp Thu Jul 22 23:32:49 2010 +0100 +++ b/src/hugin_base/algorithms/panorama_makefile/PanoramaMakefileExport.cpp Fri Jul 23 22:30:18 2010 +0200 @@ -56,7 +56,7 @@ UIntSet stack; HuginBase::CalculateImageOverlap overlap(&pano); - overlap.calculate(50); // we are testing 50*50=2500 points + overlap.calculate(10); // we are testing 10*10=100 points do { unsigned srcImg = *(allImgs.begin()); stack.insert(srcImg);   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Reduce resolution for overlap detectio... From: - 2010-07-23 20:33 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/3143279c500b changeset: 4152:3143279c500b user: tmodes date: Fri Jul 23 22:30:18 2010 +0200 description: Reduce resolution for overlap detection in makefile generation (This should speed up of writing of makefile) (transplanted from 8cbe07845ccff07982bcf5981d5a26a08e4e4999) diffstat: src/hugin_base/algorithms/panorama_makefile/PanoramaMakefileExport.cpp | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff -r 36d225248e33 -r 3143279c500b src/hugin_base/algorithms/panorama_makefile/PanoramaMakefileExport.cpp --- a/src/hugin_base/algorithms/panorama_makefile/PanoramaMakefileExport.cpp Thu Jul 22 23:32:49 2010 +0100 +++ b/src/hugin_base/algorithms/panorama_makefile/PanoramaMakefileExport.cpp Fri Jul 23 22:30:18 2010 +0200 @@ -56,7 +56,7 @@ UIntSet stack; HuginBase::CalculateImageOverlap overlap(&pano); - overlap.calculate(50); // we are testing 50*50=2500 points + overlap.calculate(10); // we are testing 10*10=100 points do { unsigned srcImg = *(allImgs.begin()); stack.insert(srcImg);   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin-web: First draft of 2010.2.0 release an... From: - 2010-07-20 21:43 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin-web/hgrepo/h/hu/hugin/hugin-web/rev/740b71a3eb2c changeset: 173:740b71a3eb2c user: Bruno Postle date: Tue Jul 20 22:43:43 2010 +0100 description: First draft of 2010.2.0 release announcement diffstat: releases/2010.2.0/en.shtml | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) diffs (37 lines): diff -r e99945367770 -r 740b71a3eb2c releases/2010.2.0/en.shtml --- a/releases/2010.2.0/en.shtml Tue Jul 20 00:43:24 2010 +0100 +++ b/releases/2010.2.0/en.shtml Tue Jul 20 22:43:43 2010 +0100 @@ -88,11 +88,18 @@ instead of all possible combinations of photos — This speeds things up and reduces the chances of false matches. - New lens types supported + New lens types + + Hugin supports photos taken with a wide range of 'normal' and fisheye lenses, +and can fine-tune for variation of distortion from these standard types. With +this release support has been added for orthographic, +stereographic and equisolid lenses. Migration to Mercurial - Summer of Code news + Development of Hugin sourcecode has switched from Subversion to +Mercurial to better support parallel development and to reduce +dependency on Sourceforge infrastructure. Languages @@ -100,9 +107,10 @@ Other improvements - WRITEME. New CLI tools, General Pannini + This release has the usual bugfixes, adds minor features, and provides some +more command-line tools for scripting panorama projects. - + Control point generators Hugin doesn't yet ship with a 'Patent Free' control point   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin-web: Notes on Control point detector modes From: - 2010-07-19 23:43 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin-web/hgrepo/h/hu/hugin/hugin-web/rev/e99945367770 changeset: 172:e99945367770 user: Bruno Postle date: Tue Jul 20 00:43:24 2010 +0100 description: Notes on Control point detector modes diffstat: releases/2010.2.0/en.shtml | 18 +++++++++++++++++- 1 files changed, 17 insertions(+), 1 deletions(-) diffs (28 lines): diff -r 04faa4611525 -r e99945367770 releases/2010.2.0/en.shtml --- a/releases/2010.2.0/en.shtml Sun Jul 18 00:05:33 2010 +0100 +++ b/releases/2010.2.0/en.shtml Tue Jul 20 00:43:24 2010 +0100 @@ -70,7 +70,23 @@ telling Hugin that photos in a bracketed stack are linked and share the same view. - Control point generator modes + Control point detector modes + + Hugin uses plugin tools called control point detectors to +automatically match features between photos. Previous versions of Hugin relied +on the detector entirely, but now Hugin can make intelligent detector choices +based on knowledge of the panorama. + + So Hugin can now match the photos in a multi-row panorama more efficiently +and with less error by breaking the job into separate tasks, panoramas +consisting of bracketed stacks can be automatically identified and Hugin will +switch to using appropriate matching tools. + + Another new feature is that panoramas can be approximately aligned by +dragging the photos around in the preview or using a template, the control +point detector can then be asked to only check overlapping pairs of photos +instead of all possible combinations of photos — This speeds things up +and reduces the chances of false matches. New lens types supported   [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Regenerate pano_trafo man page (Andrea... From: - 2010-07-18 22:02 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/87026235e9ca changeset: 4141:87026235e9ca user: Bruno Postle date: Sun Jul 18 23:01:56 2010 +0100 description: Regenerate pano_trafo man page (Andreas Metzler) diffstat: doc/pano_trafo.1 | 45 +++++++++++++++++++++++---------------------- 1 files changed, 23 insertions(+), 22 deletions(-) diffs (92 lines): diff -r 275fb96ee614 -r 87026235e9ca doc/pano_trafo.1 --- a/doc/pano_trafo.1 Thu Jul 15 20:05:00 2010 +0100 +++ b/doc/pano_trafo.1 Sun Jul 18 23:01:56 2010 +0100 @@ -1,7 +1,15 @@ -.\" Automatically generated by Pod::Man 2.1801 (Pod::Simple 3.05) +.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.14 .\" .\" Standard preamble: .\" ======================================================================== +.de Sh \" Subsection heading +.br +.if t .Sp +.ne 5 +.PP +\fB\\1\fR +.PP +.. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp @@ -17,11 +25,11 @@ .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left -.\" double quote, and \*(R" will give a right double quote. \*(C+ will -.\" give a nicer C++. Capital omega is used to do unbreakable dashes and -.\" therefore won't be available. \*(C and \*(C' expand to ' in nroff, -.\" nothing in troff, for use with C<>. -.tr \(*W- +.\" double quote, and \*(R" will give a right double quote. | will give a +.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to +.\" do unbreakable dashes and therefore won't be available. \*(C and \*(C' +.\" expand to ' in nroff, nothing in troff, for use with C<>. +.tr \(*W-|\(bv\*(Tr .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- @@ -40,25 +48,22 @@ . ds R" '' 'br\} .\" -.\" Escape single quotes in literal strings from groff's Unicode transform. -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' -.\" .\" If the F register is turned on, we'll generate index entries on stderr for -.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. -.ie \nF \{\ +.if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} -.el \{\ -. de IX -.. -.\} +.\" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.hy 0 +.if n .na .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. @@ -124,11 +129,7 @@ .\" ======================================================================== .\" .IX Title "PANO_TRAFO 1" -.TH PANO_TRAFO 1 "2010-01-04" "perl v5.10.0" "HUGIN" -.\" For nroff, turn off justification. Always turn off hyphenation; it makes -.\" way too many mistakes in technical documents. -.if n .ad l -.nh +.TH PANO_TRAFO 1 "2010-06-28" "perl v5.8.5" "HUGIN" .SH "NAME" pano_trafo \- Transform image coordinates. .SH "SYNOPSIS" @@ -136,7 +137,7 @@ \&\fBpano_trafo\fR [options] \fIpano.pto\fR \fIimage_number\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" -\&\fBcpclean\fR reads image coordiates (x y) from standard input and +\&\fBpano_trafo\fR reads image coordiates (x y) from standard input and prints the corresponding panorama coordinates to standard output. .SH "OPTIONS" .IX Header "OPTIONS" 

 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Regenerate pano_trafo man page (Andrea... From: - 2010-07-18 22:09 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/fba464a0344b changeset: 4142:fba464a0344b user: Bruno Postle date: Sun Jul 18 23:01:56 2010 +0100 description: Regenerate pano_trafo man page (Andreas Metzler) diffstat: doc/pano_trafo.1 | 45 +++++++++++++++++++++++---------------------- 1 files changed, 23 insertions(+), 22 deletions(-) diffs (92 lines): diff -r 90fbabef61e9 -r fba464a0344b doc/pano_trafo.1 --- a/doc/pano_trafo.1 Fri Jul 16 22:39:18 2010 +0100 +++ b/doc/pano_trafo.1 Sun Jul 18 23:01:56 2010 +0100 @@ -1,7 +1,15 @@ -.\" Automatically generated by Pod::Man 2.1801 (Pod::Simple 3.05) +.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.14 .\" .\" Standard preamble: .\" ======================================================================== +.de Sh \" Subsection heading +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp @@ -17,11 +25,11 @@ .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left -.\" double quote, and \*(R" will give a right double quote. \*(C+ will -.\" give a nicer C++. Capital omega is used to do unbreakable dashes and -.\" therefore won't be available. \*(C and \*(C' expand to ' in nroff, -.\" nothing in troff, for use with C<>. -.tr \(*W- +.\" double quote, and \*(R" will give a right double quote. | will give a +.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to +.\" do unbreakable dashes and therefore won't be available. \*(C and \*(C' +.\" expand to ' in nroff, nothing in troff, for use with C<>. +.tr \(*W-|\(bv\*(Tr .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- @@ -40,25 +48,22 @@ . ds R" '' 'br\} .\" -.\" Escape single quotes in literal strings from groff's Unicode transform. -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' -.\" .\" If the F register is turned on, we'll generate index entries on stderr for -.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. -.ie \nF \{\ +.if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\\$2" .. . nr % 0 . rr F .\} -.el \{\ -. de IX -.. -.\} +.\" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.hy 0 +.if n .na .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. @@ -124,11 +129,7 @@ .\" ======================================================================== .\" .IX Title "PANO_TRAFO 1" -.TH PANO_TRAFO 1 "2010-01-04" "perl v5.10.0" "HUGIN" -.\" For nroff, turn off justification. Always turn off hyphenation; it makes -.\" way too many mistakes in technical documents. -.if n .ad l -.nh +.TH PANO_TRAFO 1 "2010-06-28" "perl v5.8.5" "HUGIN" .SH "NAME" pano_trafo \- Transform image coordinates. .SH "SYNOPSIS" @@ -136,7 +137,7 @@ \&\fBpano_trafo\fR [options] \fIpano.pto\fR \fIimage_number\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" -\&\fBcpclean\fR reads image coordiates (x y) from standard input and +\&\fBpano_trafo\fR reads image coordiates (x y) from standard input and prints the corresponding panorama coordinates to standard output. .SH "OPTIONS" .IX Header "OPTIONS" 

 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin-web: 2 new changesets From: - 2010-07-17 23:05 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin-web/hgrepo/h/hu/hugin/hugin-web/rev/a5243dc2b535 changeset: 170:a5243dc2b535 user: Bruno Postle date: Sun Jul 18 00:04:22 2010 +0100 description: Fix link to French screencast details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin-web/hgrepo/h/hu/hugin/hugin-web/rev/04faa4611525 changeset: 171:04faa4611525 user: Bruno Postle date: Sun Jul 18 00:05:33 2010 +0100 description: Some more release notes diffstat: releases/2010.2.0/en.shtml | 19 ++++++++++++++++++- tutorials/index.shtml | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diffs (50 lines): diff -r a606668f55fc -r 04faa4611525 releases/2010.2.0/en.shtml --- a/releases/2010.2.0/en.shtml Sat Jul 17 00:31:44 2010 +0100 +++ b/releases/2010.2.0/en.shtml Sun Jul 18 00:05:33 2010 +0100 @@ -51,8 +51,25 @@

Mosaics

+

For a stitched panorama you shoot photos in different directions but from a +single location, Hugin will happily assemble these into a complete scene. Now +Hugin has an alternative mosaic mode — You can take photos of a +planar object such as a floor, painting, or mural from any position, direction +or angle, and Hugin will stitch them seamlessly just as it does with a normal +panorama.

+

+

Hugin allows you to shoot exposure bracketed photos and panoramas, it will +automatically combine them with exposure fusion or HDR +merging into a single image that has the best areas of each photo in the +stack. Hugin uses the same alignment process as with panoramas so even +hand-held bracketing works perfectly.

+ +

Photographers who use quality tripods can now skip this alignment stage by +telling Hugin that photos in a bracketed stack are linked and share the same +view.

+

Control point generator modes

New lens types supported

@@ -91,7 +108,7 @@

For users compiling from source: note that the minimum version of wxWidgets supported is now 2.7.0, libpano13 needs to be at least -2.9.17, and that Hugin now requires GLEW the OpenGL Extension Wrangler +2.9.17, and that Hugin requires GLEW the OpenGL Extension Wrangler Library, freeglut the OpenGL utility toolkit, and libGLU the OpenGL utility library.

diff -r a606668f55fc -r 04faa4611525 tutorials/index.shtml --- a/tutorials/index.shtml Sat Jul 17 00:31:44 2010 +0100 +++ b/tutorials/index.shtml Sun Jul 18 00:05:33 2010 +0100 @@ -211,7 +211,7 @@ points de contrôle 'verticaux' pour corriger la distortion en 'barrel' de l'optique, et retirer l'effet de perspective.

-

Panorama en 3 clics !

+

Panorama en 3 clics !

Tutoriel video expliquant l'installation d'Hugin et l'assemblage de plusieurs photos sur mac OS X.



 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin-web: A bit more for the 2010.2.0 releas... From: - 2010-07-16 23:31 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin-web/hgrepo/h/hu/hugin/hugin-web/rev/a606668f55fc changeset: 169:a606668f55fc user: Bruno Postle date: Sat Jul 17 00:31:44 2010 +0100 description: A bit more for the 2010.2.0 release notes diffstat: releases/2010.2.0/en.shtml | 27 +++++++++++++++++++++++---- 1 files changed, 23 insertions(+), 4 deletions(-) diffs (58 lines): diff -r 0caee73e3491 -r a606668f55fc releases/2010.2.0/en.shtml --- a/releases/2010.2.0/en.shtml Sun Jun 06 21:16:22 2010 -0400 +++ b/releases/2010.2.0/en.shtml Sat Jul 17 00:31:44 2010 +0100 @@ -28,7 +28,26 @@

Layout mode

-

+

The Hugin Fast Preview window visualises your panorama and lets you +change the project by dragging and clicking. This release introduces an extra +mode for this preview that shows the entire project as a diagram with +colour-coded lines connecting each of the photographs.

+ +

Now with a glance you can see where the project is ok and where there are +problems if it isn't quite right. Just click on any connection and Hugin jumps +to the Control Points tab to edit that pair of photos.

+ +

+ +

Hugin uses multiresolution seam blending to join photos invisibly by +smoothing colours and brightness. Controlling the location of this seam is now +much easier with the new Mask tab, which instead of requiring you to +place the seam itself, lets you just indicate the areas of photos that you do +and don't want to be part of the finished panorama - The seam itself then gets +placed intelligently using the remaining overlapping areas.

+ +

Masks can be saved and reused in new projects, so objects that appear again +and again like tripod heads can be easily excluded.

Mosaics

@@ -36,7 +55,7 @@

Control point generator modes

-

New lenses supported

+

New lens types supported

Migration to Mercurial

@@ -48,7 +67,7 @@

Other improvements

-

WRITEME. New CLI tools

+

WRITEME. New CLI tools, General Pannini

@@ -60,7 +79,7 @@
• autopano-sift-C
• panomatic
• -
• panomatic
• +
• libpanomatic
• match-n-shift
• Autopano-SIFT
• Autopano freeware version
• 

 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: finish off beta1 release notes From: - 2010-07-16 22:07 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/90fbabef61e9 changeset: 4140:90fbabef61e9 user: Bruno Postle date: Fri Jul 16 22:39:18 2010 +0100 description: finish off beta1 release notes diffstat: doc/releases/hugin-2010.2.0_beta1.txt | 61 ++++++++++++++++++++++++++++++---- 1 files changed, 54 insertions(+), 7 deletions(-) diffs (88 lines): diff -r 69545ba63586 -r 90fbabef61e9 doc/releases/hugin-2010.2.0_beta1.txt --- a/doc/releases/hugin-2010.2.0_beta1.txt Fri Jul 16 00:04:13 2010 +0100 +++ b/doc/releases/hugin-2010.2.0_beta1.txt Fri Jul 16 22:39:18 2010 +0100 @@ -5,7 +5,7 @@ https://sourceforge.net/projects/hugin/files/hugin-2010.2_beta/ This is a beta release for testing, i.e. The final release is likely to have -further bugfixes, manual and translation updates. +further bugfixes, help/manual and translation updates. More information about this release can be found in the full ChangeLog below and the unfinished release notes: @@ -33,9 +33,10 @@ generator could be used at any one time. Hugin now has support for combinations of panoramas and bracketed stacks, stacks that are already linked with the linked bracketing feature, multi-row heuristics including support for -bracketed stacks, and panoramas that are already laid out in the preview. - -* New Equisolid, orthographic and stereographic lenses are supported, requires +bracketed stacks, and for panoramas that are already roughly laid out in the +preview. + +* New equisolid, orthographic and stereographic lenses are supported, requires libpano13-2.9.17_beta2 or later. * General Pannini projection is now fully suppoprted. @@ -56,12 +57,58 @@ See README, ChangeLog and INSTALL_cmake for more information. SHA1SUM: -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx hugin-2010.2.0_beta1.tar.gz - -This release is equivalent to hg branch 2010.2 -r xxxx.xxxxxxxxxxx +5f1dc68bf928ec84c9f91a3fc28545ccfbd44ac4 hugin-2010.2.0_beta1.tar.gz + +This release is equivalent to hg branch 2010.2 -r 4138:69545ba63586 A detailed ChangeLog of every commit since 2010.0.0 follows: +2010-07-15 James Legg + + * src/hugin1/hugin/ViewState.cpp: + Fix bug where fast preview interactions could disconnect image's + lenses introduced in 66f626bf15aa. + [32dc50543204] [tip] + +2010-07-15 tmodes + + * CMakeModules/win_bundle.cmake: + Added missing files to install target for windows + [a94c74257dc7] + +2010-07-13 tmodes + + * src/hugin_base/panodata/Panorama.cpp: + Fixes an issue with positive masks and fisheye images + [497b2b9fb40f] + +2010-07-07 Bruno Postle + + * ChangeLog, doc/releases/hugin-2010.2.0_beta1.txt: + Unfinished announcement for a 2010.2.0_beta1 release + [7e19d5bea985] + +2010-06-29 Kornel Benko + + * CMakeLists.txt, ChangeLog, admin/update_tarball.sh, doc/batch- + processing/README.batch, doc/releases/hugin-0.8.0.txt, + doc/releases/hugin-0.8.0_rc1.txt, doc/releases/hugin-0.8.0_rc2.txt, + doc/releases/hugin-0.8.0_rc3.txt, doc/releases/hugin-0.8.0_rc4.txt, + doc/releases/hugin-0.8.0_rc5.txt, doc/releases/hugin-2009.4.0.txt, + doc/releases/hugin-2009.4.0_rc3.txt, doc/releases/hugin- + 2010.0.0.txt, doc/releases/hugin-2010.0.0_rc1.txt, + src/hugin1/hugin/ViewState.cpp, src/hugin1/hugin/wxPanoCommand.cpp, + src/hugin_base/algorithms/basic/CalculateOverlap.cpp, src/hugin_base + /algorithms/panorama_makefile/PanoramaMakefileExport.cpp: + Enable creation of ChangeLog from build-dir + [f9fc675ab021] + +2010-07-07 Bruno Postle + + * ChangeLog: + Update ChangeLog file + [2b6dba1d7651] + 2010-06-28 Bruno Postle * CMakeLists.txt: 

 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: finished canvas and crop outline tool ... From: - 2010-07-16 10:16 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/e69fa0b7683e changeset: 4139:e69fa0b7683e user: dmakreshanski date: Fri Jul 16 12:16:35 2010 +0200 description: finished canvas and crop outline tool for the overview diffstat: src/hugin1/hugin/CMakeLists.txt | 4 +- src/hugin1/hugin/GLPreviewFrame.cpp | 4 + src/hugin1/hugin/GLPreviewFrame.h | 4 + src/hugin1/hugin/GLRenderer.cpp | 11 +- src/hugin1/hugin/MeshManager.cpp | 27 +- src/hugin1/hugin/MeshManager.h | 1 + src/hugin1/hugin/OverviewOutlinesTool.cpp | 435 ++++++++++++++++++++++++++++++ src/hugin1/hugin/OverviewOutlinesTool.h | 69 ++++ src/hugin1/hugin/PreviewCropTool.cpp | 15 + src/hugin1/hugin/ProjectionGridTool.cpp | 73 +++- 10 files changed, 603 insertions(+), 40 deletions(-) diffs (truncated from 829 to 500 lines): diff -r 86c4470b4cf6 -r e69fa0b7683e src/hugin1/hugin/CMakeLists.txt --- a/src/hugin1/hugin/CMakeLists.txt Wed Jul 14 12:13:05 2010 +0200 +++ b/src/hugin1/hugin/CMakeLists.txt Fri Jul 16 12:16:35 2010 +0200 @@ -31,7 +31,7 @@ LocalizedFileTipProvider.cpp wxPanoCommand.cpp AssistantPanel.cpp HFOVDialog.cpp TextureManager.cpp MeshRemapper.cpp VertexCoordRemapper.cpp TexCoordRemapper.cpp ChoosyRemapper.cpp MeshManager.cpp ViewState.cpp -OutputProjectionInfo.cpp ToolHelper.cpp Tool.cpp OverviewCameraTool.cpp ProjectionGridTool.cpp +OutputProjectionInfo.cpp ToolHelper.cpp Tool.cpp OverviewCameraTool.cpp ProjectionGridTool.cpp OverviewOutlinesTool.cpp PreviewCropTool.cpp PreviewDragTool.cpp PreviewIdentifyTool.cpp PreviewDifferenceTool.cpp PreviewPanoMaskTool.cpp PreviewControlPointTool.cpp GreatCircles.cpp AboutDialog.cpp LayoutRemapper.cpp PreviewLayoutLinesTool.cpp @@ -47,7 +47,7 @@ LocalizedFileTipProvider.h wxPanoCommand.h AssistantPanel.h HFOVDialog.h TextureManager.h MeshRemapper.h VertexCoordRemapper.h TexCoordRemapper.h ChoosyRemapper.h MeshManager.h ViewState.h -OutputProjectionInfo.h ToolHelper.h Tool.h OverviewCameraTool.h ProjectionGridTool.h +OutputProjectionInfo.h ToolHelper.h Tool.h OverviewCameraTool.h ProjectionGridTool.h OverviewOutlinesTool.h PreviewCropTool.h PreviewDragTool.h PreviewIdentifyTool.h PreviewDifferenceTool.h PreviewPanoMaskTool.h PreviewControlPointTool.h GreatCircles.h AboutDialog.h LayoutRemapper.h PreviewLayoutLinesTool.h diff -r 86c4470b4cf6 -r e69fa0b7683e src/hugin1/hugin/GLPreviewFrame.cpp --- a/src/hugin1/hugin/GLPreviewFrame.cpp Wed Jul 14 12:13:05 2010 +0200 +++ b/src/hugin1/hugin/GLPreviewFrame.cpp Fri Jul 16 12:16:35 2010 +0200 @@ -77,6 +77,7 @@ #include "ProjectionGridTool.h" #include "OverviewCameraTool.h" +#include "OverviewOutlinesTool.h" #include @@ -1417,6 +1418,7 @@ preview_projection_grid = new PreviewProjectionGridTool(preview_helper); preview_helper->ActivateTool(preview_projection_grid); + // activate tools that are always active. preview_helper->ActivateTool(pano_mask_tool); @@ -1435,6 +1437,8 @@ overview_identify_tool = new PreviewIdentifyTool(overview_helper, this); overview_projection_grid = new OverviewProjectionGridTool(overview_helper); overview_helper->ActivateTool(overview_projection_grid); + overview_outlines_tool = new OverviewOutlinesTool(overview_helper, m_GLPreview); + overview_helper->ActivateTool(overview_outlines_tool); } void GLPreviewFrame::OnIdentify(wxCommandEvent & e) diff -r 86c4470b4cf6 -r e69fa0b7683e src/hugin1/hugin/GLPreviewFrame.h --- a/src/hugin1/hugin/GLPreviewFrame.h Wed Jul 14 12:13:05 2010 +0200 +++ b/src/hugin1/hugin/GLPreviewFrame.h Fri Jul 16 12:16:35 2010 +0200 @@ -61,6 +61,8 @@ class OverviewProjectionGridTool; class PreviewProjectionGridTool; +class OverviewOutlinesTool; + class GLPreviewFrame; class GLwxAuiManager; @@ -308,6 +310,8 @@ OverviewDragTool *overview_drag_tool; OverviewCameraTool *overview_camera_tool; + OverviewOutlinesTool *overview_outlines_tool; + void TurnOffTools(std::set tools); void CleanButtonColours(); diff -r 86c4470b4cf6 -r e69fa0b7683e src/hugin1/hugin/GLRenderer.cpp --- a/src/hugin1/hugin/GLRenderer.cpp Wed Jul 14 12:13:05 2010 +0200 +++ b/src/hugin1/hugin/GLRenderer.cpp Fri Jul 16 12:16:35 2010 +0200 @@ -201,7 +201,8 @@ void GLOverviewRenderer::Redraw() { - + + glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); @@ -214,6 +215,9 @@ gluLookAt(R * cos(angy) * cos(angx), R * sin(angy), R * cos(angy) * sin(angx), 0, 0, 0, 0, 1, 0); + //for look from inside +// gluLookAt(0,0,0,R * cos(angy) * cos(angx), R * sin(angy), R * cos(angy) * sin(angx), 0, 1, 0); + // draw things under the preview images m_tool_helper->BeforeDrawImages(); // draw each active image. @@ -224,7 +228,7 @@ glColor3f(0.5,0.5,0.5); - double side = 5; + double side = 150; glBegin(GL_LINE_LOOP); glVertex3f(-side,side,0); @@ -238,7 +242,7 @@ glBegin(GL_LINES); glColor3f(1,0,0); - glVertex3f(0,0,0); + glVertex3f(-axis,0,0); glVertex3f(axis,0,0); glColor3f(0,1,0); @@ -256,6 +260,7 @@ glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); + ((OverviewToolHelper*)m_tool_helper)->BeforeDrawImagesBack(); m_tex_man->Begin(); diff -r 86c4470b4cf6 -r e69fa0b7683e src/hugin1/hugin/MeshManager.cpp --- a/src/hugin1/hugin/MeshManager.cpp Wed Jul 14 12:13:05 2010 +0200 +++ b/src/hugin1/hugin/MeshManager.cpp Fri Jul 16 12:16:35 2010 +0200 @@ -302,21 +302,28 @@ double th, ph; th = ((coords.vertex_c[x][y][0] / width) * hfov - hfov / 2.0); - ph = -((coords.vertex_c[x][y][1] / height) * vfov - vfov / 2.0); + ph = ((coords.vertex_c[x][y][1] / height) * vfov - vfov / 2.0); - th /= 180.0; - th *= M_PI; - ph /= 180.0; - ph *= M_PI; - - vertex_coords[x][y][0] = r * sin(th) * cos(ph); - vertex_coords[x][y][1] = r * sin(ph); - vertex_coords[x][y][2] = r * cos(th) * cos(ph); - + Convert( + vertex_coords[x][y][0], + vertex_coords[x][y][1], + vertex_coords[x][y][2], + th,-ph,r); } } } +void MeshManager::PanosphereOverviewMeshInfo::Coords3D::Convert(double &x, double &y, double &z, double th, double ph, double r) +{ + th /= 180.0; + th *= M_PI; + ph /= 180.0; + ph *= M_PI; + + x = r * sin(th) * cos(ph); + y = r * sin(ph); + z = r * cos(th) * cos(ph); +} void MeshManager::PanosphereOverviewMeshInfo::CompileList() { diff -r 86c4470b4cf6 -r e69fa0b7683e src/hugin1/hugin/MeshManager.h --- a/src/hugin1/hugin/MeshManager.h Wed Jul 14 12:13:05 2010 +0200 +++ b/src/hugin1/hugin/MeshManager.h Fri Jul 16 12:16:35 2010 +0200 @@ -116,6 +116,7 @@ Coords3D(const MeshRemapper::Coords & coords, VisualizationState * state); double tex_coords[2][2][2]; double vertex_coords[2][2][3]; + static void Convert(double &x, double &y, double &z, double th, double ph, double r); }; void CompileList(); diff -r 86c4470b4cf6 -r e69fa0b7683e src/hugin1/hugin/OverviewOutlinesTool.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin1/hugin/OverviewOutlinesTool.cpp Fri Jul 16 12:16:35 2010 +0200 @@ -0,0 +1,435 @@ + +#include +#ifdef __WXMAC__ +#include +#include +#else +#include +#include +#endif +#include + +#include "GLViewer.h" + +#include "OverviewOutlinesTool.h" + +OverviewOutlinesTool::OverviewOutlinesTool(OverviewToolHelper * helper, GLViewer * viewer) : OverviewTool(helper), preview(viewer), + display_list_number_canvas(glGenLists(1)), + display_list_number_crop(glGenLists(1)), + display_list_number_canvas_outline(glGenLists(1)), + display_list_number_crop_outline(glGenLists(1)), + dirty_meshes(true) +{ + helper->GetPanoramaPtr()->addObserver(this); +} + +OverviewOutlinesTool::~OverviewOutlinesTool() +{ + +} + +void OverviewOutlinesTool::panoramaChanged(HuginBase::PanoramaData &pano) +{ + + dirty_meshes = true; + helper->GetVisualizationStatePtr()->ForceRequireRedraw(); + +} + +void OverviewOutlinesTool::Activate() +{ + helper->NotifyMe(ToolHelper::MOUSE_MOVE, this); + ((ToolHelper*)helper)->NotifyMe(ToolHelper::DRAW_OVER_IMAGES, (Tool*)this); +} + +void OverviewOutlinesTool::MouseMoveEvent(double x, double y, wxMouseEvent & e) +{ +// std::cout << "outlines tool " << x << " " << y << std::endl; + double xp, yp; + HuginBase::PTools::Transform transform; + HuginBase::SrcPanoImage image; + image.setSize(vigra::Size2D(360,180)); + image.setHFOV(360); + image.setProjection(HuginBase::BaseSrcPanoImage::EQUIRECTANGULAR); + if (helper->GetPanoramaPtr()->getNrOfImages() > 0) { +// transform.createTransform(*helper->GetViewStatePtr()->GetSrcImage(0), *(helper->GetVisualizationStatePtr()->GetOptions())); + transform.createTransform(image, *(helper->GetVisualizationStatePtr()->GetOptions())); + transform.transformImgCoord(xp,yp,x,y); +// std::cout << "outlines tool " << xp << " " << yp << std::endl; + } +} + +struct Rec { + Rec(double left, double top, double right, double bottom) : left(left), top(top), right(right), bottom(bottom) {} + Rec() {} + double left; + double top; + double right; + double bottom; +}; + +//#define WIREFRAME + +void OverviewOutlinesTool::AfterDrawImagesEvent() +{ + + if (!preview->m_visualization_state) { + return; + } + + if (dirty_meshes) { + +// std::cout << "outlines after draw images\n"; + vigra::Rect2D rect = preview->m_visualization_state->GetVisibleArea(); + glNewList(display_list_number_canvas,GL_COMPILE); + DrawRect(rect.left(), rect.top(), rect.right(), rect.bottom(),false); + glEndList(); + glNewList(display_list_number_canvas_outline,GL_COMPILE); + DrawRect(rect.left(), rect.top(), rect.right(), rect.bottom(),true); + glEndList(); + + vigra::Rect2D roi = helper->GetViewStatePtr()->GetOptions()->getROI(); + glNewList(display_list_number_crop,GL_COMPILE); + DrawRect(roi.left(), roi.top(), roi.right(), roi.bottom(),false); + glEndList(); + glNewList(display_list_number_crop_outline,GL_COMPILE); + DrawRect(roi.left(), roi.top(), roi.right(), roi.bottom(),true); + glEndList(); + + dirty_meshes = false; + + std::cout << "outlines adi " << rect.left() << " " << rect.top() << " " << rect.right() << " " << rect.bottom() << std::endl; + std::cout << "outlines adi " << roi.left() << " " << roi.top() << " " << roi.right() << " " << roi.bottom() << std::endl; + } + + + double radius = ((PanosphereOverviewVisualizationState*)helper->GetVisualizationStatePtr())->getSphereRadius(); + + glDisable(GL_TEXTURE_2D); + + glEnable(GL_BLEND); + glBlendEquation(GL_FUNC_ADD); + + + glColor4f(0,0,0,0.25); + glBlendFunc(GL_ZERO, GL_SRC_ALPHA); + GLUquadric* grid = gluNewQuadric(); + gluSphere(grid, radius+1,40,20); + + glColor4f(1.0,1.0,1.0,1.0); + glBlendFunc(GL_DST_COLOR, GL_SRC_ALPHA); + glCallList(display_list_number_canvas); + +// std::cout << "outlines " << roi.left() << " " << roi.top() << " " << roi.right() << " " << roi.bottom() << std::endl; + + glBlendFunc(GL_DST_COLOR, GL_SRC_ALPHA); + glCallList(display_list_number_crop); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(0.6,0.6,0.6,0.5); + glCallList(display_list_number_canvas_outline); + glColor4f(0.6,0.6,0.6,0.8); + glCallList(display_list_number_crop_outline); + + glEnable(GL_TEXTURE_2D); + glDisable(GL_BLEND); +} + +void OverviewOutlinesTool::DrawRect(double left, double top, double right, double bottom, bool outline) +{ + + double safety = 1; + left += safety; + top += safety; + right -= safety; + bottom -= safety; + + HuginBase::PTools::Transform transform; + HuginBase::SrcPanoImage image; + image.setSize(vigra::Size2D(360,180)); + image.setHFOV(360); + image.setProjection(HuginBase::BaseSrcPanoImage::EQUIRECTANGULAR); + transform.createTransform(image, *(preview->m_visualization_state->GetOptions())); + + HuginBase::PanoramaOptions::ProjectionFormat proj = helper->GetViewStatePtr()->GetOptions()->getProjection(); + + double radius = ((PanosphereOverviewVisualizationState*)helper->GetVisualizationStatePtr())->getSphereRadius(); + + switch(proj) { + + case HuginBase::PanoramaOptions::SINUSOIDAL: + case HuginBase::PanoramaOptions::LAMBERT: + case HuginBase::PanoramaOptions::LAMBERT_AZIMUTHAL: + case HuginBase::PanoramaOptions::FULL_FRAME_FISHEYE: + case HuginBase::PanoramaOptions::ALBERS_EQUAL_AREA_CONIC: + case HuginBase::PanoramaOptions::ORTHOGRAPHIC: + case HuginBase::PanoramaOptions::EQUISOLID: + + + { + + float steps = 40; + + double x,y,xs,ys,xd,yd; + + double wstep = (float)(right - left) / steps; + double hstep = (float)(bottom - top) / steps; + + for(int w = 0 ; w < steps ; w++) { + for(int h = 0 ; h < steps ; h++) { + + if (outline) { + if (!(w == 0 || h == 0 || w == steps - 1 || steps - 1)) { + continue; + } + } + + Rect rec(left + w * wstep, top + h * hstep, left + (w+1) * wstep, top + (h+1)* hstep); + Rect tr = rec.transformImgCoord(&transform); + + double edge1 = (tr.val[0][0]-tr.val[1][0])*(tr.val[0][0]-tr.val[1][0]) + (tr.val[0][1]-tr.val[1][1])*(tr.val[0][1]-tr.val[1][1]); + double edge2 = (tr.val[1][0]-tr.val[2][0])*(tr.val[1][0]-tr.val[2][0]) + (tr.val[1][1]-tr.val[2][1])*(tr.val[1][1]-tr.val[2][1]); + double edge3 = (tr.val[2][0]-tr.val[3][0])*(tr.val[2][0]-tr.val[3][0]) + (tr.val[2][1]-tr.val[3][1])*(tr.val[2][1]-tr.val[3][1]); + double edge4 = (tr.val[3][0]-tr.val[0][0])*(tr.val[3][0]-tr.val[0][0]) + (tr.val[3][1]-tr.val[0][1])*(tr.val[3][1]-tr.val[0][1]); + + double maxlimit = (radius/2.0)*(radius/2.0); + if ( + proj == HuginBase::PanoramaOptions::SINUSOIDAL || + proj == HuginBase::PanoramaOptions::ALBERS_EQUAL_AREA_CONIC + ) + if (edge1 > maxlimit || edge2 > maxlimit || edge3 > maxlimit || edge4 > maxlimit) { + continue; + } + + if (outline) { + + glBegin(GL_LINES); + bool edges[4] = {false,false,false,false}; + if (w == 0) { + edges[0] = true; + } + if (w == steps - 1) { + edges[2] = true; + } + if (h == 0) { + edges[3] = true; + } + if (h == steps - 1) { + edges[1] = true; + } + for (int i = 0 ; i < 4 ; i++) { + if (edges[i]) { + for (int j = 0 ; j < 2 ; j++) { + int plus = i+j; + if (plus == 4) plus = 0; + double x,y,z; + double tx,ty; + tx = tr.val[plus][0]; + ty = tr.val[plus][1]; + ty = ty - 90; + tx = tx - 180; + ty *= -1; + MeshManager::PanosphereOverviewMeshInfo::Coords3D::Convert(x,y,z,tx,ty,radius); + glVertex3f(x,y,z); + } + } + } + glEnd(); + + } else { + + #ifdef WIREFRAME + glBegin(GL_LINE_LOOP); + #else + glBegin(GL_POLYGON); + #endif + for (int s = 0 ; s < 4 ; s++) { + double x,y,z; + double tx,ty; + tx = tr.val[s][0]; + ty = tr.val[s][1]; + ty = ty - 90; + tx = tx - 180; + ty *= -1; + MeshManager::PanosphereOverviewMeshInfo::Coords3D::Convert(x,y,z,tx,ty,radius); + glVertex3f(x,y,z); + } + glEnd(); + + } + + } + } + + } + + break; + + case HuginBase::PanoramaOptions::RECTILINEAR: + case HuginBase::PanoramaOptions::EQUIRECTANGULAR: + case HuginBase::PanoramaOptions::CYLINDRICAL: + case HuginBase::PanoramaOptions::STEREOGRAPHIC: + case HuginBase::PanoramaOptions::MERCATOR: + case HuginBase::PanoramaOptions::TRANSVERSE_MERCATOR: + case HuginBase::PanoramaOptions::MILLER_CYLINDRICAL: + case HuginBase::PanoramaOptions::PANINI: + case HuginBase::PanoramaOptions::EQUI_PANINI: + case HuginBase::PanoramaOptions::BIPLANE: + case HuginBase::PanoramaOptions::TRIPLANE: + case HuginBase::PanoramaOptions::GENERAL_PANINI: + case HuginBase::PanoramaOptions::ARCHITECTURAL: + + std::vector stack; + + stack.push_back(Rec(left,top,right,bottom)); + if (outline) { + stack.push_back(Rec(true, true, true, true)); + } + + while(stack.size() > 0) { + + Rec edge; + if (outline) { + edge = stack[stack.size() - 1]; + stack.pop_back(); + } + + Rec top_rec = stack[stack.size() - 1]; + stack.pop_back(); + + if (outline) { + if (!(edge.left || edge.top || edge.right || edge.bottom )) { + continue; + } + } + + Rect rect(top_rec.left, top_rec.top, top_rec.right, top_rec.bottom); + + Rect tr = rect.transformImgCoord(&transform); + + double xcs,ycs,xcd,ycd; + + double edge1 = (tr.val[0][0]-tr.val[1][0])*(tr.val[0][0]-tr.val[1][0]) + (tr.val[0][1]-tr.val[1][1])*(tr.val[0][1]-tr.val[1][1]); + double edge2 = (tr.val[1][0]-tr.val[2][0])*(tr.val[1][0]-tr.val[2][0]) + (tr.val[1][1]-tr.val[2][1])*(tr.val[1][1]-tr.val[2][1]); + double edge3 = (tr.val[2][0]-tr.val[3][0])*(tr.val[2][0]-tr.val[3][0]) + (tr.val[2][1]-tr.val[3][1])*(tr.val[2][1]-tr.val[3][1]); + double edge4 = (tr.val[3][0]-tr.val[0][0])*(tr.val[3][0]-tr.val[0][0]) + (tr.val[3][1]-tr.val[0][1])*(tr.val[3][1]-tr.val[0][1]); + +// std::cout << "outlines " << top_rec.left << " " << top_rec.top << " " << top_rec.right << " " << top_rec.bottom << std::endl; +// std::cout << "outlines " << edge1 << " " << edge2 << " " << edge3 << " " << edge4 << std::endl; + +// std::cout << "outlines " << tr.val[0][0] << " " << tr.val[0][1] << std::endl; +// std::cout << "outlines " << tr.val[1][0] << " " << tr.val[1][1] << std::endl; +// std::cout << "outlines " << tr.val[2][0] << " " << tr.val[2][1] << std::endl; +// std::cout << "outlines " << tr.val[3][0] << " " << tr.val[3][1] << std::endl; + 

 [Hugin-cvs] /hgrepo/h/hu/hugin/hugin: Update ChangeLog file From: - 2010-07-15 23:04 details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/69545ba63586 changeset: 4138:69545ba63586 user: Bruno Postle date: Fri Jul 16 00:04:13 2010 +0100 description: Update ChangeLog file diffstat: ChangeLog | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 46 insertions(+), 0 deletions(-) diffs (53 lines): diff -r 32dc50543204 -r 69545ba63586 ChangeLog --- a/ChangeLog Thu Jul 15 20:05:00 2010 +0100 +++ b/ChangeLog Fri Jul 16 00:04:13 2010 +0100 @@ -1,3 +1,49 @@ +2010-07-15 James Legg + + * src/hugin1/hugin/ViewState.cpp: + Fix bug where fast preview interactions could disconnect image's + lenses introduced in 66f626bf15aa. + [32dc50543204] [tip] + +2010-07-15 tmodes + + * CMakeModules/win_bundle.cmake: + Added missing files to install target for windows + [a94c74257dc7] + +2010-07-13 tmodes + + * src/hugin_base/panodata/Panorama.cpp: + Fixes an issue with positive masks and fisheye images + [497b2b9fb40f] + +2010-07-07 Bruno Postle + + * ChangeLog, doc/releases/hugin-2010.2.0_beta1.txt: + Unfinished announcement for a 2010.2.0_beta1 release + [7e19d5bea985] + +2010-06-29 Kornel Benko + + * CMakeLists.txt, ChangeLog, admin/update_tarball.sh, doc/batch- + processing/README.batch, doc/releases/hugin-0.8.0.txt, + doc/releases/hugin-0.8.0_rc1.txt, doc/releases/hugin-0.8.0_rc2.txt, + doc/releases/hugin-0.8.0_rc3.txt, doc/releases/hugin-0.8.0_rc4.txt, + doc/releases/hugin-0.8.0_rc5.txt, doc/releases/hugin-2009.4.0.txt, + doc/releases/hugin-2009.4.0_rc3.txt, doc/releases/hugin- + 2010.0.0.txt, doc/releases/hugin-2010.0.0_rc1.txt, + src/hugin1/hugin/ViewState.cpp, src/hugin1/hugin/wxPanoCommand.cpp, + src/hugin_base/algorithms/basic/CalculateOverlap.cpp, src/hugin_base + /algorithms/panorama_makefile/PanoramaMakefileExport.cpp: + Enable creation of ChangeLog from build-dir + [f9fc675ab021] + +2010-07-07 Bruno Postle + + * ChangeLog: + Update ChangeLog file + [2b6dba1d7651] + 2010-06-28 Bruno Postle * CMakeLists.txt: