diff --git a/CMakeLists.txt b/CMakeLists.txt index f1b0d6002bd3cb3fd1b8996baec47d89dfa730fd..c31d605bd28213d887e01e20bb954b5bdd8c0342 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -392,6 +392,17 @@ endif() # Provide an option for generating documentation. add_subdirectory(Utilities/Doxygen) +#---------------------------------------------------------------------- +# Provide a target to generate the SuperBuild archive (only for Unix) +if(UNIX) + add_custom_target(SuperBuild-archive + COMMAND ./SuperbuildDownloadList.sh + ${OTB_BINARY_DIR}/Download + ${OTB_BINARY_DIR} + WORKING_DIRECTORY ${OTB_SOURCE_DIR}/Utilities/Maintenance + ) +endif() + # TODO cleanup # Create target to download data from the OTBData group. This must come after # all tests have been added that reference the group, so we put it last. diff --git a/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h b/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h index 528144e916d3c06135cdb501bd37487718c5042d..7e51a0c79178a1e1e0489cd45eb0c797e6311343 100644 --- a/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h +++ b/Modules/Adapters/OSSIMAdapters/include/otbDEMHandler.h @@ -107,9 +107,29 @@ public: /** return true if the directoty contain DEM */ virtual bool IsValidDEMDirectory(const char* DEMDirectory); - /** Open geoid file. */ - virtual void OpenGeoidFile(const char* geoidFile); - virtual void OpenGeoidFile(const std::string& geoidFile); + /** + * \brief Open geoid file given its filename or throw an exception + * if geoid-file could not be loaded. + * + * \param geoidFile The filename of the geoid-file. + * + * \return <code>true</code> if geoid file has been changed or + * <code>false</code> if geod-file have been set before and could + * not be changed. + */ + virtual bool OpenGeoidFile(const char* geoidFile); + + /** + * \brief Open geoid file given its filename or throw an exception + * if geoid-file could not be loaded. + * + * \param geoidFile The filename of the geoid-file. + * + * \return <code>true</code> if geoid file has been changed or + * <code>false</code> if geod-file have been set before and could + * not be changed. + */ + virtual bool OpenGeoidFile(const std::string& geoidFile); /** Compute the height above MSL(Mean Sea Level) of a geographic point. */ virtual double GetHeightAboveMSL(double lon, double lat) const; @@ -125,6 +145,11 @@ public: /** Set the default height above ellipsoid in case no information is available*/ double GetDefaultHeightAboveEllipsoid() const; + /** + * \return The number of elevation databases in the + * <code>ossimElevManager</code>. + */ + unsigned int GetDEMCount() const; /** Get DEM directory */ std::string GetDEMDirectory(unsigned int idx = 0) const; @@ -132,14 +157,18 @@ public: /** Get Goid file */ std::string GetGeoidFile() const; + /** + * \brief Remove all the ossimElevationDatabases from the + * <code>ossimElevManager</code>. + */ + void ClearDEMs(); + protected: DEMHandler(); virtual ~DEMHandler() {} void PrintSelf(std::ostream& os, itk::Indent indent) const; - ossimElevManager* m_ElevManager; - // Ossim does not allow to retrieve the geoid file path // We therefore must keep it on our side std::string m_GeoidFile; diff --git a/Modules/Adapters/OSSIMAdapters/src/otbDEMHandler.cxx b/Modules/Adapters/OSSIMAdapters/src/otbDEMHandler.cxx index 79b352417c22648288dc5a537bf99707a5f24a09..71b94952260fdcba5b6ed9f65a784976b1eaa3e1 100644 --- a/Modules/Adapters/OSSIMAdapters/src/otbDEMHandler.cxx +++ b/Modules/Adapters/OSSIMAdapters/src/otbDEMHandler.cxx @@ -18,6 +18,8 @@ #include "otbDEMHandler.h" #include "otbMacro.h" +#include <cassert> + #include "ossim/elevation/ossimElevManager.h" #include "ossim/base/ossimGeoidManager.h" #include "ossim/base/ossimFilename.h" @@ -49,23 +51,25 @@ DEMHandler::Pointer DEMHandler::Instance() DEMHandler ::DEMHandler() : - m_ElevManager(ossimElevManager::instance()), m_GeoidFile(""), m_DefaultHeightAboveEllipsoid(0) { - m_ElevManager->setDefaultHeightAboveEllipsoid(m_DefaultHeightAboveEllipsoid); + assert( ossimElevManager::instance()!=NULL ); + + ossimElevManager::instance()->setDefaultHeightAboveEllipsoid(m_DefaultHeightAboveEllipsoid); // Force geoid fallback - m_ElevManager->setUseGeoidIfNullFlag(true); + ossimElevManager::instance()->setUseGeoidIfNullFlag(true); } void DEMHandler ::OpenDEMDirectory(const char* DEMDirectory) { - ossimFilename ossimDEMDir; - ossimDEMDir = ossimFilename(DEMDirectory); + assert( ossimElevManager::instance()!=NULL ); + + ossimFilename ossimDEMDir( DEMDirectory ); - if (!m_ElevManager->loadElevationPath(ossimDEMDir)) + if (!ossimElevManager::instance()->loadElevationPath(ossimDEMDir)) { // In ossim elevation database factory code, the // ossimImageElevationDatabase is explicitly disabled by a #if 0 @@ -82,11 +86,22 @@ DEMHandler else { otbMsgDevMacro(<< "DEM directory contains general elevation image files: " << ossimDEMDir); - m_ElevManager->addDatabase(imageElevationDatabase.get()); + ossimElevManager::instance()->addDatabase(imageElevationDatabase.get()); } } } + +void +DEMHandler +::ClearDEMs() +{ + assert( ossimElevManager::instance()!=NULL ); + + ossimElevManager::instance()->clear(); +} + + void DEMHandler ::OpenDEMDirectory(const std::string& DEMDirectory) @@ -98,8 +113,10 @@ bool DEMHandler ::IsValidDEMDirectory(const char* DEMDirectory) { + assert( ossimElevManager::instance()!=NULL ); + //Try to load elevation source - bool result = m_ElevManager->loadElevationPath(DEMDirectory); + bool result = ossimElevManager::instance()->loadElevationPath(DEMDirectory); if (!result) { @@ -111,7 +128,7 @@ DEMHandler return result; } -void +bool DEMHandler ::OpenGeoidFile(const char* geoidFile) { @@ -131,22 +148,31 @@ DEMHandler // The previous flag will be ignored if // defaultHeightAboveEllipsoid is not NaN - m_ElevManager->setDefaultHeightAboveEllipsoid(ossim::nan()); + assert( ossimElevManager::instance()!=NULL ); + ossimElevManager::instance()->setDefaultHeightAboveEllipsoid(ossim::nan()); + + return true; } else { otbMsgDevMacro(<< "Failure opening geoid"); geoidPtr.release(); + + itkExceptionMacro( << "Failed to open geoid file: '" << geoidFile << "'" ); + + return false; } } + + return false; } -void +bool DEMHandler ::OpenGeoidFile(const std::string& geoidFile) { - OpenGeoidFile(geoidFile.c_str()); + return OpenGeoidFile(geoidFile.c_str()); } double @@ -155,9 +181,14 @@ DEMHandler { double height; ossimGpt ossimWorldPoint; + ossimWorldPoint.lon = lon; ossimWorldPoint.lat = lat; - height = m_ElevManager->getHeightAboveMSL(ossimWorldPoint); + + assert( ossimElevManager::instance()!=NULL ); + + height = ossimElevManager::instance()->getHeightAboveMSL(ossimWorldPoint); + return height; } @@ -174,9 +205,13 @@ DEMHandler { double height; ossimGpt ossimWorldPoint; + ossimWorldPoint.lon = lon; ossimWorldPoint.lat = lat; - height = m_ElevManager->getHeightAboveEllipsoid(ossimWorldPoint); + + assert( ossimElevManager::instance()!=NULL ); + + height = ossimElevManager::instance()->getHeightAboveEllipsoid(ossimWorldPoint); return height; } @@ -195,7 +230,10 @@ DEMHandler // Ossim does not allow to retrieve the default height above // ellipsoid We therefore must keep it on our side m_DefaultHeightAboveEllipsoid = h; - m_ElevManager->setDefaultHeightAboveEllipsoid(h); + + assert( ossimElevManager::instance()!=NULL ); + + ossimElevManager::instance()->setDefaultHeightAboveEllipsoid(h); } double @@ -207,13 +245,24 @@ DEMHandler return m_DefaultHeightAboveEllipsoid; } +unsigned int +DEMHandler +::GetDEMCount() const +{ + assert( ossimElevManager::instance()!=NULL ); + + return ossimElevManager::instance()->getNumberOfElevationDatabases(); +} + std::string DEMHandler::GetDEMDirectory(unsigned int idx) const { std::string demDir = ""; - if(m_ElevManager->getNumberOfElevationDatabases() > 0) + if(ossimElevManager::instance()->getNumberOfElevationDatabases() > 0) { - demDir = m_ElevManager->getElevationDatabase(idx)->getConnectionString().string(); + assert( ossimElevManager::instance()!=NULL ); + + demDir = ossimElevManager::instance()->getElevationDatabase(idx)->getConnectionString().string(); } return demDir; } diff --git a/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx b/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx index 0a0309e5f3dba0a46c02262d9a6529903f4fd798..98d873885e84be567549957fb78fa6985d72e2ee 100644 --- a/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx +++ b/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx @@ -139,41 +139,51 @@ bool ImageKeywordlist:: convertToGDALRPC(GDALRPCInfo &rpc) const { - ossimKeywordlist geom_kwl; - - this->convertToOSSIMKeywordlist(geom_kwl); - - if( geom_kwl.hasKey("polynomial_format")) //RK - { - ossimRefPtr<ossimRpcModel> rpcModel = new ossimRpcModel; - if (rpcModel->loadState(geom_kwl)) - { - ossimRpcModel::rpcModelStruct ossimRpcStruct; - rpcModel->getRpcParameters(ossimRpcStruct); + /* ossimRpcModel::loadState() actually expects certain keyword values to be + * present in the keywordlist. So We check a single keyword value + * (polynomial_format) first. Even though it is not enough to ensure a valid + * ossimRpcModel by checking for presence of one single key but atleast we + * are sure about not to create an ossimRpcModel. + * + * The current mechanism creates ossimRpcModel instance, calls loadState() + * and fails. The below check for 'polynomial_format' save us from creating + * an ossimRpcModel which will be invalid if the 'polynomial_format' is not + * present. + */ + if( m_Keywordlist.find("polynomial_format") != m_Keywordlist.end() ) + { + ossimKeywordlist geom_kwl; + this->convertToOSSIMKeywordlist(geom_kwl); - if (ossimRpcStruct.type == 'B') + ossimRefPtr<ossimRpcModel> rpcModel = new ossimRpcModel; + if (rpcModel->loadState(geom_kwl)) { - rpc.dfSAMP_OFF = ossimRpcStruct.sampOffset; - rpc.dfLINE_OFF = ossimRpcStruct.lineOffset; - rpc.dfSAMP_SCALE = ossimRpcStruct.sampScale; - rpc.dfLINE_SCALE = ossimRpcStruct.lineScale; - rpc.dfLAT_OFF = ossimRpcStruct.latOffset; - rpc.dfLONG_OFF = ossimRpcStruct.lonOffset; - rpc.dfHEIGHT_OFF = ossimRpcStruct.hgtOffset; - rpc.dfLAT_SCALE = ossimRpcStruct.latScale; - rpc.dfLONG_SCALE = ossimRpcStruct.lonScale; - rpc.dfHEIGHT_SCALE = ossimRpcStruct.hgtScale; - - memcpy(rpc.adfLINE_NUM_COEFF, ossimRpcStruct.lineNumCoef, sizeof(double) * 20); - memcpy(rpc.adfLINE_DEN_COEFF, ossimRpcStruct.lineDenCoef, sizeof(double) * 20); - memcpy(rpc.adfSAMP_NUM_COEFF, ossimRpcStruct.sampNumCoef, sizeof(double) * 20); - memcpy(rpc.adfSAMP_DEN_COEFF, ossimRpcStruct.sampDenCoef, sizeof(double) * 20); - - return true; + ossimRpcModel::rpcModelStruct ossimRpcStruct; + rpcModel->getRpcParameters(ossimRpcStruct); + + if (ossimRpcStruct.type == 'B') + { + rpc.dfSAMP_OFF = ossimRpcStruct.sampOffset; + rpc.dfLINE_OFF = ossimRpcStruct.lineOffset; + rpc.dfSAMP_SCALE = ossimRpcStruct.sampScale; + rpc.dfLINE_SCALE = ossimRpcStruct.lineScale; + rpc.dfLAT_OFF = ossimRpcStruct.latOffset; + rpc.dfLONG_OFF = ossimRpcStruct.lonOffset; + rpc.dfHEIGHT_OFF = ossimRpcStruct.hgtOffset; + rpc.dfLAT_SCALE = ossimRpcStruct.latScale; + rpc.dfLONG_SCALE = ossimRpcStruct.lonScale; + rpc.dfHEIGHT_SCALE = ossimRpcStruct.hgtScale; + + memcpy(rpc.adfLINE_NUM_COEFF, ossimRpcStruct.lineNumCoef, sizeof(double) * 20); + memcpy(rpc.adfLINE_DEN_COEFF, ossimRpcStruct.lineDenCoef, sizeof(double) * 20); + memcpy(rpc.adfSAMP_NUM_COEFF, ossimRpcStruct.sampNumCoef, sizeof(double) * 20); + memcpy(rpc.adfSAMP_DEN_COEFF, ossimRpcStruct.sampDenCoef, sizeof(double) * 20); + + return true; + } } - } - } - return false; + } + return false; } void diff --git a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt index d11608709f0552643a238bb01042453df869e9d2..42440cd9a65cea1d85f0099a6ba1760664f64e8e 100644 --- a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt +++ b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt @@ -441,6 +441,7 @@ otb_add_test(NAME uaTvDEMHandler_AboveEllipsoid_SRTM_BadGeoid COMMAND otbOSSIMAd 339.513 0.001 ) +set_property(TEST uaTvDEMHandler_AboveEllipsoid_SRTM_BadGeoid PROPERTY WILL_FAIL true) otb_add_test(NAME uaTvDEMHandler_AboveMSL_SRTM_NoGeoid_NoData COMMAND otbOSSIMAdaptersTestDriver otbDEMHandlerTest diff --git a/Modules/Adapters/OSSIMAdapters/test/otbDEMHandlerTest.cxx b/Modules/Adapters/OSSIMAdapters/test/otbDEMHandlerTest.cxx index 9987db6a5bcd5cd74ac0793cd8e5b0aaea5261f2..09ab37cf7c098c990a0668f176099eda0109ab94 100644 --- a/Modules/Adapters/OSSIMAdapters/test/otbDEMHandlerTest.cxx +++ b/Modules/Adapters/OSSIMAdapters/test/otbDEMHandlerTest.cxx @@ -59,7 +59,19 @@ int otbDEMHandlerTest(int argc, char * argv[]) if(geoid != "no") { - demHandler->OpenGeoidFile(geoid); + try + { + demHandler->OpenGeoidFile(geoid); + } + catch( const std::exception & exception ) + { + std::cout + << "Exception thrown while opening geod-file '" << geoid << "':" << std::endl + << exception.what(); + + fail = true; + } + std::cout<<"GetGeoidFile() = "<<demHandler->GetGeoidFile()<<std::endl; } diff --git a/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx b/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx index 9595466d47d0a1bb66768e6d241a8c26f8341f88..ef5b28192b5d1f658327d89fa9b8a0b0ec403610 100644 --- a/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx +++ b/Modules/Core/Common/include/otbImageRegionAdaptativeSplitter.txx @@ -112,8 +112,8 @@ ImageRegionAdaptativeSplitter<VImageDimension> // First, we need to get which tiles are covered by ROI firstTileCovered[0] = m_ImageRegion.GetIndex()[0] / m_TileHint[0]; firstTileCovered[1] = m_ImageRegion.GetIndex()[1] / m_TileHint[1]; - tilesPerDim[0] = (m_ImageRegion.GetIndex()[0] + m_ImageRegion.GetSize()[0] -1 + m_TileHint[0] -1) / m_TileHint[0] - firstTileCovered[0]; - tilesPerDim[1] = (m_ImageRegion.GetIndex()[1] + m_ImageRegion.GetSize()[1] -1 + m_TileHint[1] -1) / m_TileHint[1] - firstTileCovered[1]; + tilesPerDim[0] = (m_ImageRegion.GetIndex()[0] + m_ImageRegion.GetSize()[0] + m_TileHint[0] -1) / m_TileHint[0] - firstTileCovered[0]; + tilesPerDim[1] = (m_ImageRegion.GetIndex()[1] + m_ImageRegion.GetSize()[1] + m_TileHint[1] -1) / m_TileHint[1] - firstTileCovered[1]; unsigned int totalTiles = tilesPerDim[0] * tilesPerDim[1]; @@ -186,7 +186,9 @@ ImageRegionAdaptativeSplitter<VImageDimension> unsigned int i = 1; - while(totalTiles * (divideTiles[0] * divideTiles[1]) < m_RequestedNumberOfSplits) + // Exit condition if divideTiles=m_TileHint (i.e. no more subdivision available) + while(totalTiles * (divideTiles[0] * divideTiles[1]) < m_RequestedNumberOfSplits + && (divideTiles[0] < m_TileHint[0] || divideTiles[1] < m_TileHint[1])) { if(divideTiles[i] < m_TileHint[i]) { @@ -200,6 +202,8 @@ ImageRegionAdaptativeSplitter<VImageDimension> splitSize[0] = (m_TileHint[0] + divideTiles[0] - 1)/ divideTiles[0]; splitSize[1] = (m_TileHint[1] + divideTiles[1] - 1)/ divideTiles[1]; + RegionType tileHintRegion; + tileHintRegion.SetSize(m_TileHint); // Fill the tiling scheme for(unsigned int tiley = 0; tiley < tilesPerDim[1]; ++tiley) { @@ -219,13 +223,21 @@ ImageRegionAdaptativeSplitter<VImageDimension> newSplit.SetIndex(newSplitIndex); newSplit.SetSize(splitSize); + tileHintRegion.SetIndex(0, tilex * m_TileHint[0]); + tileHintRegion.SetIndex(1, tiley * m_TileHint[1]); + bool cropped = newSplit.Crop(m_ImageRegion); // If newSplit could not be cropped, it means that it is // outside m_ImageRegion. In this case we ignore it. if(cropped) { - m_StreamVector.push_back(newSplit); + // check that the split stays inside its tile + cropped = newSplit.Crop(tileHintRegion); + if (cropped) + { + m_StreamVector.push_back(newSplit); + } } } } diff --git a/Modules/Core/Common/test/CMakeLists.txt b/Modules/Core/Common/test/CMakeLists.txt index 40f89e72aeb1144f9fc5c7166c32aaef6d62870b..c40b6a289fdce16ec39937f9db531dbe9d61a38c 100644 --- a/Modules/Core/Common/test/CMakeLists.txt +++ b/Modules/Core/Common/test/CMakeLists.txt @@ -96,6 +96,18 @@ otb_add_test(NAME coTvImageRegionAdaptativeSplitterShiftedROISmallStream COMMAND ${TEMP}/coTvImageRegionAdaptativeSplitterShiftedROISmallStreamOutput.txt ) +otb_add_test(NAME coTvImageRegionAdaptativeSplitterMissingLine COMMAND otbCommonTestDriver + otbImageRegionAdaptativeSplitter + 0 0 1000 1000 1000 1 37 + ${TEMP}/coTvImageRegionAdaptativeSplitterMissingLine.txt + ) + +otb_add_test(NAME coTvImageRegionAdaptativeSplitterDivideBlock COMMAND otbCommonTestDriver + otbImageRegionAdaptativeSplitter + 0 0 10 10 5 5 36 + ${TEMP}/coTvImageRegionAdaptativeSplitterDivideBlock.txt + ) + otb_add_test(NAME coTuRGBAPixelConverter COMMAND otbCommonTestDriver otbRGBAPixelConverterNew ) diff --git a/Modules/Core/Common/test/otbImageRegionAdaptativeSplitter.cxx b/Modules/Core/Common/test/otbImageRegionAdaptativeSplitter.cxx index 638993505239432d2926178eff637ca2b94c6720..66cc0ae45d7159fe3f84b945cdbaf2edf2a903bb 100644 --- a/Modules/Core/Common/test/otbImageRegionAdaptativeSplitter.cxx +++ b/Modules/Core/Common/test/otbImageRegionAdaptativeSplitter.cxx @@ -59,16 +59,63 @@ int otbImageRegionAdaptativeSplitter(int itkNotUsed(argc), char * argv[]) unsigned int nbSplits = splitter->GetNumberOfSplits(region, requestedNbSplits); + std::vector<RegionType> splits; outfile<<splitter<<std::endl; outfile<<"Split map: "<<std::endl; for(unsigned int i = 0; i < nbSplits; ++i) { - outfile<<"Split "<<i<<": "<<splitter->GetSplit(i, requestedNbSplits, region); + RegionType tmpRegion = splitter->GetSplit(i, requestedNbSplits, region); + splits.push_back(tmpRegion); + outfile<<"Split "<<i<<": "<<tmpRegion; } outfile.close(); + // Basic consistency check on split map + if (requestedNbSplits != nbSplits) + { + std::cout << "Wrong number of splits : got "<<nbSplits<<" , expected "<<requestedNbSplits<< std::endl; + } + IndexType tmpIndex; + for (unsigned int i=regionIndex[0] ; i<(regionIndex[0]+regionSize[0]) ; ++i) + { + for (unsigned int j=regionIndex[1] ; j<(regionIndex[1]+regionSize[1]) ; ++j) + { + tmpIndex[0] = i; + tmpIndex[1] = j; + unsigned int count = 0; + for (unsigned int k=0 ; k<nbSplits ; ++k ) + { + if (splits[k].IsInside(tmpIndex)) + { + count++; + } + } + if (count == 0) + { + std::cout << "Index ["<<i<<","<<j<<"] is missing in split map" << std::endl; + return EXIT_FAILURE; + } + if (count > 1) + { + std::cout << "Index ["<<i<<","<<j<<"] occurs more than once in the split map" << std::endl; + return EXIT_FAILURE; + } + } + } + + unsigned int pixelInSplit = 0; + for (unsigned int k=0 ; k<nbSplits ; ++k ) + { + pixelInSplit += splits[k].GetSize(0) * splits[k].GetSize(1); + } + if (pixelInSplit != regionSize[0]*regionSize[1]) + { + std::cout << "Wrong number of pixels in split : got "<<pixelInSplit << " , expected "<< regionSize[0]*regionSize[1] << std::endl; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; } diff --git a/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx b/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx index 4bd558f4a9589795edaac72e023f28d1e67f737a..db371582435603f927fdd60004275ee41ed9e28e 100644 --- a/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx +++ b/Modules/Filtering/ImageManipulation/test/otbChangeNoDataValueFilter.cxx @@ -70,12 +70,12 @@ int otbChangeNoDataValueFilter(int itkNotUsed(argc),char * itkNotUsed(argv) []) for(it.GoToBegin();!it.IsAtEnd();++it,++count) { - if (count%2 == 0 and it.Get()!=-20.) + if (count%2 == 0 && it.Get()!=-20.) { std::cerr<<"Pixel should have new no-data value"<<std::endl; failed = true; } - else if(count%2 == 1 and it.Get()!=10.) + else if(count%2 == 1 && it.Get()!=10.) { std::cerr<<"Pixel value should be unchanged"<<std::endl; failed = true; diff --git a/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx b/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx index 109a2ec7d44c4ad2ff420337613260d64ba66b8a..d5c2b4283635847be4947e15791e785ec1924d9d 100644 --- a/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx +++ b/Modules/Filtering/ImageManipulation/test/otbImageToNoDataMaskFilter.cxx @@ -69,12 +69,12 @@ int otbImageToNoDataMaskFilter(int itkNotUsed(argc),char * itkNotUsed(argv) []) for(it.GoToBegin();!it.IsAtEnd();++it,++count) { - if (count%2 == 0 and it.Get()!=0) + if (count%2 == 0 && it.Get()!=0) { std::cerr<<"Pixel should be masked"<<std::endl; failed = true; } - else if(count%2 == 1 and it.Get()!=255) + else if(count%2 == 1 && it.Get()!=255) { std::cerr<<"Pixel should not be masked"<<std::endl; failed = true; diff --git a/Utilities/Maintenance/SuperbuildDownloadList.sh b/Utilities/Maintenance/SuperbuildDownloadList.sh index e0cc7033b1933fc5d8943747184a249d51d01f5c..2cb32210b12d8d28a5c985047956271ad4e970e2 100755 --- a/Utilities/Maintenance/SuperbuildDownloadList.sh +++ b/Utilities/Maintenance/SuperbuildDownloadList.sh @@ -1,2 +1,62 @@ #/bin/bash -grep -h -E "^[^#]*\"https?://.*(\.tar\.gz|\.tar\.bz2|\.tgz|\.tar\.xz|\.zip|export=download).*\"" ../../SuperBuild/CMake/*.cmake | grep -o -E "https?://[^\"]*" | sed "s/\/download$//" | sort | uniq + +if [ $# -eq 2 ]; then +DOWNLOAD_DIR=$(readlink -f $1) +OUTPUT_DIR=$(readlink -f $2) +else +echo 'Usage: '$0' <download_directory> <archive_output_directory>' +exit 1 +fi + +SB_CMAKE_DIR_REL=$(dirname $0)/../../SuperBuild/CMake +SB_CMAKE_DIR=$(readlink -f ${SB_CMAKE_DIR_REL}) + +DOWNLOAD_LIST=$(grep -h -E "^[^#]*\"https?://.*(\.tar\.gz|\.tar\.bz2|\.tgz|\.tar\.xz|\.zip|export=download).*\"" ${SB_CMAKE_DIR}/*.cmake | grep -o -E "https?://[^\"]*" | sed "s/\/\(download\)\?$//" | sort | uniq) + +DOWNLOAD_NAMES= + +mkdir -p ${DOWNLOAD_DIR} +cd ${DOWNLOAD_DIR} + +echo "Start downloads..." + +for url in ${DOWNLOAD_LIST}; do + # clean log file + echo "" >download.log + + file_name=$(echo "${url}" | grep -o -E "[^\/]+$") + docs_google=$(echo "${file_name}" | grep -F "export=download") + if [ "${docs_google}" = "" ]; then + echo "Download ${file_name}..." + wget -N ${url} -o download.log + else + # look into the original file for a valid download name + file_name=$(grep -h -A 3 -B 3 -F "${url}" ${SB_CMAKE_DIR}/*.cmake | grep -E "^[^#]*DOWNLOAD_NAME" | grep -o -E "[^ ]*\.(tar\.gz|tar\.bz2|tar\.xz|zip)" | uniq) + if [ -z "$file_name" ]; then + echo "Can't find correct filename for url ${url} : skip download" + else + echo "Download ${file_name}..." + wget -O ${file_name} ${url} -o download.log + fi + fi + + download_errors=$(grep "ERROR" download.log) + if [ "$download_errors" != "" ]; then + echo "=== Error downloading ${file_name} ===" + cat download.log + else + if [ "$file_name" != "" ]; then + DOWNLOAD_NAMES="${DOWNLOAD_NAMES} ${file_name}" + fi + fi +done + +rm download.log + +echo "Create archive..." + +cd ${OUTPUT_DIR} +tar -cjf SuperBuild-archives.tar.bz2 -C ${DOWNLOAD_DIR} ${DOWNLOAD_NAMES} + +echo "Compute md5sum..." +md5sum SuperBuild-archives.tar.bz2 >SuperBuild-archives.md5