diff --git a/Utilities/otbossim/include/ossim/base/ossimCallback1.h b/Utilities/otbossim/include/ossim/base/ossimCallback1.h new file mode 100644 index 0000000000000000000000000000000000000000..37690c5e8cbc76664e827dab4b72edd3da4c5519 --- /dev/null +++ b/Utilities/otbossim/include/ossim/base/ossimCallback1.h @@ -0,0 +1,80 @@ +//---------------------------------------------------------------------------- +// +// File: ossimCallback1wRet.h +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +// Author: David Burken +// +// Description: +// +// Simple templated callback class that takes a single parameter(argument) "P1" +// with void return. +// +// See link for more detail description: +// http://www.tutok.sk/fastgl/callback.html +// +//---------------------------------------------------------------------------- +// $Id$ + +#ifndef ossimCallback1_HEADER +#define ossimCallback1_HEADER 1 + +/** + * @class ossimCallback1 + * + * Usage example, note template params can be anything: + * + * Caller interface to register callback: + * + * @code + * void registerCallback(ossimCallback1<const ossimFilename&>* cb); + * @endcode + * + * Callee creation of call back mechanism: + * + * @code + * class ProcessFileCB: public ossimCallback1<const ossimFilename&> + * { + * public: + * ProcessFileCB( + * ossimImageElevationDatabase* obj, + * void (ossimImageElevationDatabase::*func)(const ossimFilename&)) + * : + * m_obj(obj), + * m_func(func) + * {} + * + * virtual void operator()(const ossimFilename& file) const + * { + * ( m_obj->*m_func)(file); + * } + * + * private: + * ossimImageElevationDatabase* m_obj; + * void (ossimImageElevationDatabase::*m_func)(const ossimFilename& file); + * }; + * @endcode + * + * Making/registering a callback. + * + * @code + * ossimFileWalker* fw = new ossimFileWalker(); + * + * ossimCallback1wRet<const ossimFilename&>* cb = + * new ProcessFileCB(this, &ossimImageElevationDatabase::processFile); + * + * fw->registerProcessFileCallback(cb); + * + * @endcode + */ +template <class P1> class ossimCallback1 +{ +public: + ossimCallback1(){} + virtual void operator()(P1 p1) const = 0; +}; + +#endif /* #ifndef ossimCallback1_HEADER */ diff --git a/Utilities/otbossim/include/ossim/base/ossimColumnVector3d.h b/Utilities/otbossim/include/ossim/base/ossimColumnVector3d.h index 7cda6fce75fd9ba3fd5dfa722b80cb3837a7d7ca..52bde060648542830d41696defc28b7d2740af3c 100644 --- a/Utilities/otbossim/include/ossim/base/ossimColumnVector3d.h +++ b/Utilities/otbossim/include/ossim/base/ossimColumnVector3d.h @@ -8,7 +8,7 @@ // coordinate. // //******************************************************************* -// $Id: ossimColumnVector3d.h 20039 2011-09-06 14:58:16Z oscarkramer $ +// $Id: ossimColumnVector3d.h 20074 2011-09-08 16:16:27Z gpotts $ #ifndef ossimColumnVector3d_HEADER #define ossimColumnVector3d_HEADER #include <ossim/base/ossimConstants.h> @@ -45,10 +45,21 @@ public: data[1] = rhs.data[1]; data[2] = rhs.data[2]; } - - ossimColumnVector3d(const NEWMAT::ColumnVector& rhs) + + explicit ossimColumnVector3d(const NEWMAT::ColumnVector& rhs) { - *this = rhs; + if ( (rhs.Ncols() == 1) && (rhs.Nrows() > 2) ) + { + data[0] = rhs[0]; + data[1] = rhs[1]; + data[2] = rhs[2]; + } + else + { + data[0]=0; + data[1]=0; + data[2]=0; + } } const ossimColumnVector3d& operator=(const NEWMAT::ColumnVector& rhs) diff --git a/Utilities/otbossim/include/ossim/base/ossimEllipsoid.h b/Utilities/otbossim/include/ossim/base/ossimEllipsoid.h index 0630fcd6bb2f1e17f0b743c2ec09daacbaefc733..3e94063544ef36b010f6cd89a9bb4adc8d9dfad2 100644 --- a/Utilities/otbossim/include/ossim/base/ossimEllipsoid.h +++ b/Utilities/otbossim/include/ossim/base/ossimEllipsoid.h @@ -52,7 +52,7 @@ public: const double &minor_axis); ossimEllipsoid(); - ~ossimEllipsoid(){}; + virtual ~ossimEllipsoid(){}; /*! * ACCESS METHOD... diff --git a/Utilities/otbossim/include/ossim/base/ossimFilename.h b/Utilities/otbossim/include/ossim/base/ossimFilename.h index ce8ba94c38b53f12b25ba323a4922508a56a68ce..04de672fa3ca3c660bb59316945504ad26942943 100644 --- a/Utilities/otbossim/include/ossim/base/ossimFilename.h +++ b/Utilities/otbossim/include/ossim/base/ossimFilename.h @@ -9,7 +9,7 @@ // Description: This class provides manipulation of filenames. // //************************************************************************* -// $Id: ossimFilename.h 19798 2011-06-30 15:34:43Z dburken $ +// $Id: ossimFilename.h 20094 2011-09-14 14:15:12Z dburken $ #ifndef ossimFilename_HEADER #define ossimFilename_HEADER @@ -182,9 +182,12 @@ public: int perm=0775)const; /*! - * Removes pathname from filesystem if supported by platform. - * Return true on success, false on error. - * If supported will set errno and output equivalent string if one occurs. + * @brief Removes pathname from filesystem if supported by platform. + * + * If pathname is a directory it will only be removed if empty. If supported + * will set errno and output equivalent string if one occurs. + * + * @return true on success, false on error. */ static bool remove(const ossimFilename& pathname); diff --git a/Utilities/otbossim/include/ossim/base/ossimGzStream.h b/Utilities/otbossim/include/ossim/base/ossimGzStream.h index f338cbb0d6a2027eae5926a1f57440f2d9201a73..133c827a198cdbb7db481f6acc31ad2bc9c97d8d 100644 --- a/Utilities/otbossim/include/ossim/base/ossimGzStream.h +++ b/Utilities/otbossim/include/ossim/base/ossimGzStream.h @@ -19,7 +19,7 @@ // // File : gzstream.h // Revision : $Revision: 13050 $ -// Revision_date : $Date: 2008-06-20 02:07:35 +0800 (Fri, 20 Jun 2008) $ +// Revision_date : $Date: 2008-06-19 20:07:35 +0200 (jeu., 19 juin 2008) $ // Author(s) : Deepak Bandyopadhyay, Lutz Kettner // // Standard streambuf implementation following Nicolai Josuttis, "The diff --git a/Utilities/otbossim/include/ossim/base/ossimKeywordlist.h b/Utilities/otbossim/include/ossim/base/ossimKeywordlist.h index 8122c5df33c9530ae3832587a2e59a9bc4a13160..7591650cbb86a0eb029a66c2acaec6966c8e4932 100644 --- a/Utilities/otbossim/include/ossim/base/ossimKeywordlist.h +++ b/Utilities/otbossim/include/ossim/base/ossimKeywordlist.h @@ -7,7 +7,7 @@ // Description: This class provides capabilities for keywordlists. // //******************************************************************** -// $Id: ossimKeywordlist.h 19692 2011-05-31 16:55:47Z dburken $ +// $Id: ossimKeywordlist.h 20069 2011-09-07 18:46:58Z dburken $ #ifndef ossimKeywordlist_HEADER #define ossimKeywordlist_HEADER 1 @@ -256,9 +256,9 @@ public: int precision = 15); /*! - * find methods + * @brief Find methods that take std::string(s). * Searches the map for key(/prefix) and returns the resulting value - * or a null string if the key was not found. + * or an empty string if the key was not found. */ std::string findKey(const std::string& key) const; std::string findKey(const std::string& prefix, diff --git a/Utilities/otbossim/include/ossim/elevation/ossimElevManager.h b/Utilities/otbossim/include/ossim/elevation/ossimElevManager.h index 49b81eebad12fe757af82af254381446d8efb1a9..2b4a08719ffafab4bc128089e24adfe42f3fdce3 100644 --- a/Utilities/otbossim/include/ossim/elevation/ossimElevManager.h +++ b/Utilities/otbossim/include/ossim/elevation/ossimElevManager.h @@ -21,6 +21,7 @@ #define ossimElevManager_HEADER #include <vector> #include <ossim/base/ossimConstants.h> +#include <ossim/base/ossimVisitor.h> #include <ossim/elevation/ossimElevSource.h> #include <ossim/elevation/ossimElevationDatabase.h> #include <OpenThreads/ReadWriteMutex> @@ -28,6 +29,21 @@ class OSSIM_DLL ossimElevManager : public ossimElevSource { public: typedef std::vector<ossimRefPtr<ossimElevationDatabase> > ElevationDatabaseListType; + + class ConnectionStringVisitor : public ossimVisitor + { + public: + ConnectionStringVisitor(const ossimString& value):m_connectionString(value){} + virtual ossimRefPtr<ossimVisitor> dup()const{return new ConnectionStringVisitor(*this);} + const ossimString& getConnectionString()const{return m_connectionString;} + virtual void visit(ossimObject* obj); + ossimElevationDatabase* getElevationDatabase(){return m_database.get();} + + protected: + ossimString m_connectionString; + ossimRefPtr<ossimElevationDatabase> m_database; + }; + virtual ~ossimElevManager(); /** @@ -58,6 +74,7 @@ public: std::cout << "ossimElevManager::pointHasCoverage(): NOT IMPLEMENTED AND SHOULD NOT BE USED AT THIS LEVEL!!!\n"; return 1.0; } + ossim_uint32 getNumberOfElevationDatabases()const { return (ossim_uint32)m_elevationDatabaseList.size(); @@ -111,6 +128,8 @@ public: virtual bool loadState(const ossimKeywordlist& kwl, const char* prefix=0); + virtual void accept(ossimVisitor& visitor); + protected: ossimElevManager(); void loadStandardElevationPaths(); diff --git a/Utilities/otbossim/include/ossim/elevation/ossimImageElevationDatabase.h b/Utilities/otbossim/include/ossim/elevation/ossimImageElevationDatabase.h index e215d5b051e6e269ba3f6f85da851b843b940e07..9c3a0f09dcc78f8fe6bfa4e6a5f849dfc7accac6 100644 --- a/Utilities/otbossim/include/ossim/elevation/ossimImageElevationDatabase.h +++ b/Utilities/otbossim/include/ossim/elevation/ossimImageElevationDatabase.h @@ -17,13 +17,11 @@ #define ossimImageElevationDatabase_HEADER 1 #include <ossim/elevation/ossimElevationDatabase.h> - #include <ossim/base/ossimConstants.h> #include <ossim/base/ossimFilename.h> #include <ossim/base/ossimGrect.h> #include <ossim/base/ossimRefPtr.h> #include <ossim/base/ossimRtti.h> - #include <map> class ossimString; @@ -124,15 +122,8 @@ public: * the ossimFileWalker, e.g. don't recurse, stop altogether. * * @param file to process. - * - * @param recurseFlag Is set by this method indicating to caller should - * continue to recurse directories. Typically set to false for directory - * based images like an RPF a.toc. - * - * @return true Indicates caller should continue to walk files/directories, - * false indicates caller should stop. */ - bool processFile(const ossimFilename& file, bool& recurseFlag); + void processFile(const ossimFilename& file); protected: /** @@ -194,8 +185,8 @@ private: const ossimImageElevationDatabase& operator=(const ossimImageElevationDatabase& rhs); std::map<ossim_uint64, ossimImageElevationFileEntry> m_entryMap; - ossim_uint64 m_lastMapKey; - ossim_uint64 m_lastAccessedId; + ossim_uint64 m_lastMapKey; + ossim_uint64 m_lastAccessedId; TYPE_DATA }; diff --git a/Utilities/otbossim/include/ossim/elevation/ossimTiledElevationDatabase.h b/Utilities/otbossim/include/ossim/elevation/ossimTiledElevationDatabase.h index 1f9227c40aba50cd1f4955075b2ce897d6958d00..5c33c019890ec360141862028a59367a8075b12e 100644 --- a/Utilities/otbossim/include/ossim/elevation/ossimTiledElevationDatabase.h +++ b/Utilities/otbossim/include/ossim/elevation/ossimTiledElevationDatabase.h @@ -26,6 +26,7 @@ class ossimDblGrid; class ossimFilename; +class ossimFileWalker; class ossimImageData; class ossimImageGeometry; class ossimImageHandler; @@ -126,15 +127,8 @@ public: * the ossimFileWalker, e.g. don't recurse, stop altogether. * * @param file to process. - * - * @param recurseFlag Is set by this method indicating to caller should - * continue to recurse directories. Typically set to false for directory - * based images like an RPF a.toc. - * - * @return true Indicates caller should continue to walk files/directories, - * false indicates caller should stop. */ - bool processFile(const ossimFilename& file, bool& recurseFlag); + void processFile(const ossimFilename& file); protected: /** Protected destructor as this is derived from ossimRefenced. */ @@ -218,6 +212,8 @@ private: ossimGrect m_entryListRect; ossimGrect m_mappedRect; // Requested expanded to even post boundary. + ossimFileWalker* m_fileWalker; + TYPE_DATA }; diff --git a/Utilities/otbossim/include/ossim/imaging/ossimImageGeometry.h b/Utilities/otbossim/include/ossim/imaging/ossimImageGeometry.h index 87becd5c0dab2edca789ec6596416db1260871b5..ce80ea8313d55bbd9ee30e743656ef2c26a2d3b5 100644 --- a/Utilities/otbossim/include/ossim/imaging/ossimImageGeometry.h +++ b/Utilities/otbossim/include/ossim/imaging/ossimImageGeometry.h @@ -122,6 +122,11 @@ public: //! information. If no DEM is available, the results will be incorrect or inaccurate. bool localToWorld(const ossimDpt& local_pt, ossimGpt& world_pt) const; + //! Exposes the 3D projection from image to world coordinates given a constant height above + //! ellipsoid. The caller should verify that a valid projection exists before calling this + //! method. Returns TRUE if a valid ground point is available in the ground_pt argument. + bool localToWorld(const ossimDpt& local_pt, const double& h_ellipsoid, ossimGpt& world_pt) const; + //! Exposes the 3D world-to-local image coordinate reverse projection. The caller should verify //! that a valid projection exists before calling this method. Returns TRUE if a valid image //! point is available in the local_pt argument. diff --git a/Utilities/otbossim/include/ossim/imaging/ossimImageToPlaneNormalFilter.h b/Utilities/otbossim/include/ossim/imaging/ossimImageToPlaneNormalFilter.h index ed33f31a350a70ab956607cfcdf96960c64b9ef5..4de7145ebc8215041890c5bf9acd55338a6c0b31 100644 --- a/Utilities/otbossim/include/ossim/imaging/ossimImageToPlaneNormalFilter.h +++ b/Utilities/otbossim/include/ossim/imaging/ossimImageToPlaneNormalFilter.h @@ -8,7 +8,7 @@ // Author: Garrett Potts // //************************************************************************* -// $Id: ossimImageToPlaneNormalFilter.h 13382 2008-08-04 18:53:26Z gpotts $ +// $Id: ossimImageToPlaneNormalFilter.h 20078 2011-09-09 12:25:50Z gpotts $ #ifndef ossimImageToPlaneNormalFilter_HEADER #define ossimImageToPlaneNormalFilter_HEADER #include <ossim/imaging/ossimImageSourceFilter.h> @@ -54,11 +54,13 @@ public: protected: ossimRefPtr<ossimImageData> theTile; ossimRefPtr<ossimImageData> theBlankTile; - + ossimIrect theInputBounds; bool theTrackScaleFlag; double theXScale; double theYScale; double theSmoothnessFactor; + + void initializeTile(); virtual void computeNormals(ossimRefPtr<ossimImageData>& inputTile, ossimRefPtr<ossimImageData>& outputTile); diff --git a/Utilities/otbossim/include/ossim/imaging/ossimTiling.h b/Utilities/otbossim/include/ossim/imaging/ossimTiling.h index 0d9cb34d123e0fa1b6a80487c8e707e7c0cc0066..21acd7715456ed5ffe76035262b0d01fd4549bec 100644 --- a/Utilities/otbossim/include/ossim/imaging/ossimTiling.h +++ b/Utilities/otbossim/include/ossim/imaging/ossimTiling.h @@ -10,7 +10,7 @@ // Description: implementation for image generator // //************************************************************************* -// $Id: ossimTiling.h 13135 2008-07-06 14:47:46Z dburken $ +// $Id: ossimTiling.h 20103 2011-09-17 16:10:42Z dburken $ #ifndef ossimTiling_HEADER #define ossimTiling_HEADER #include <ossim/base/ossimObject.h> @@ -178,6 +178,12 @@ protected: ossim_int64 theTotalVerticalTiles; ossim_int64 theTotalTiles; ossimString theTileNameMask; + + /** + * This flags the code to shift the tie point so that the edge of the pixel + * falls on the tile boundary. default=false + */ + bool theEdgeToEdgeFlag; bool validate()const; bool isAngularUnit(ossimUnitType unitType)const; diff --git a/Utilities/otbossim/include/ossim/kbool/graph.h b/Utilities/otbossim/include/ossim/kbool/graph.h index 7c51be019aece3bd2efe22536b6a95751500697c..4aaf038a3e150104b3459a79feea0406bada4c2c 100644 --- a/Utilities/otbossim/include/ossim/kbool/graph.h +++ b/Utilities/otbossim/include/ossim/kbool/graph.h @@ -8,7 +8,7 @@ RCS-ID: $Id: graph.h 9094 2006-06-13 19:12:40Z dburken $ */ -/* @@(#) $Source$ $Revision: 9094 $ $Date: 2006-06-14 03:12:40 +0800 (Wed, 14 Jun 2006) $ */ +/* @@(#) $Source$ $Revision: 9094 $ $Date: 2006-06-13 21:12:40 +0200 (mar., 13 juin 2006) $ */ /* Program GRAPH.H diff --git a/Utilities/otbossim/include/ossim/kbool/graphlst.h b/Utilities/otbossim/include/ossim/kbool/graphlst.h index 51976ebe6bc0362576a9bcbff5b986ab871d5093..16a718ed3ff4e29642c4208075fbc872bd605335 100644 --- a/Utilities/otbossim/include/ossim/kbool/graphlst.h +++ b/Utilities/otbossim/include/ossim/kbool/graphlst.h @@ -8,7 +8,7 @@ RCS-ID: $Id: graphlst.h 9094 2006-06-13 19:12:40Z dburken $ */ -/* @@(#) $Source$ $Revision: 9094 $ $Date: 2006-06-14 03:12:40 +0800 (Wed, 14 Jun 2006) $ */ +/* @@(#) $Source$ $Revision: 9094 $ $Date: 2006-06-13 21:12:40 +0200 (mar., 13 juin 2006) $ */ /* Program GRAPHLST.H diff --git a/Utilities/otbossim/include/ossim/kbool/lpoint.h b/Utilities/otbossim/include/ossim/kbool/lpoint.h index 441fcd916431a083c2a638b18dcb65929b041513..b14ed831477f45ea5eb6a507bb9239fbef9786a4 100644 --- a/Utilities/otbossim/include/ossim/kbool/lpoint.h +++ b/Utilities/otbossim/include/ossim/kbool/lpoint.h @@ -8,7 +8,7 @@ RCS-ID: $Id: lpoint.h 9094 2006-06-13 19:12:40Z dburken $ */ -/* @@(#) $Source$ $Revision: 9094 $ $Date: 2006-06-14 03:12:40 +0800 (Wed, 14 Jun 2006) $ */ +/* @@(#) $Source$ $Revision: 9094 $ $Date: 2006-06-13 21:12:40 +0200 (mar., 13 juin 2006) $ */ /* Program LPOINT.H diff --git a/Utilities/otbossim/include/ossim/parallel/ossimJobMultiThreadQueue.h b/Utilities/otbossim/include/ossim/parallel/ossimJobMultiThreadQueue.h index 27e61fc423fa92d724345cbca8cbb77195c21444..43c08d0bde443c54214adb96872f403b08653ff0 100644 --- a/Utilities/otbossim/include/ossim/parallel/ossimJobMultiThreadQueue.h +++ b/Utilities/otbossim/include/ossim/parallel/ossimJobMultiThreadQueue.h @@ -12,6 +12,7 @@ public: const ossimJobQueue* getJobQueue()const; void setQueue(ossimJobQueue* q); void setNumberOfThreads(ossim_uint32 nThreads); + ossim_uint32 getNumberOfThreads() const; ossim_uint32 numberOfBusyThreads()const; bool areAllThreadsBusy()const; diff --git a/Utilities/otbossim/include/ossim/projection/ossimRS1SarModel.h b/Utilities/otbossim/include/ossim/projection/ossimRS1SarModel.h index 1cea8ef7fed410b59c2286acebe2a4cb74a6f472..534760c7bc311b9251ac581071641aabf802954a 100644 --- a/Utilities/otbossim/include/ossim/projection/ossimRS1SarModel.h +++ b/Utilities/otbossim/include/ossim/projection/ossimRS1SarModel.h @@ -35,8 +35,6 @@ class ossimRS1SarModel : public ossimSensorModel public: ossimRS1SarModel(); ossimRS1SarModel(const ossimFilename& imageDir); - ossimRS1SarModel(const ossimKeywordlist& geom_kwl); - ossimRS1SarModel(const ossimRS1SarModel& copy_this); virtual ~ossimRS1SarModel(); @@ -70,15 +68,20 @@ public: //! Returns true if successful. virtual bool loadState(const ossimKeywordlist& kwl, const char* prefix=NULL); - //! Establishes geographic 3D point given image line, sample and MSL elevation. + //! Establishes geographic 3D point given image line, sample and ellipsoid height. virtual void lineSampleHeightToWorld(const ossimDpt& imagePt, - const double& heightMSL, + const double& heightAboveEllipsoid, ossimGpt& worldPt) const; //! Given an image point, returns a ray originating at some arbitrarily high //! point (in this model at the sensor position) and pointing towards the target. virtual void imagingRay(const ossimDpt& image_point, ossimEcefRay& image_ray) const; + inline virtual bool useForward() const { return false; } //!image to ground faster + + //! Returns pointer to a new instance, copy of this. + virtual ossimObject* dup() const { return 0; } // TBR + protected: void setImagingMode(char* modeStr); void initFromCeos(const ossimFilename& dataDir); diff --git a/Utilities/otbossim/include/ossim/projection/ossimSensorModel.h b/Utilities/otbossim/include/ossim/projection/ossimSensorModel.h index 945c1af5e54729e8353290282f172eec241bd907..cb66fe2766673d50ce3f3fd3012a234bea89d19d 100644 --- a/Utilities/otbossim/include/ossim/projection/ossimSensorModel.h +++ b/Utilities/otbossim/include/ossim/projection/ossimSensorModel.h @@ -25,7 +25,7 @@ // LIMITATIONS: None. // //***************************************************************************** -// $Id: ossimSensorModel.h 19180 2011-03-22 17:36:33Z oscarkramer $ +// $Id: ossimSensorModel.h 20075 2011-09-08 16:44:03Z gpotts $ #ifndef ossimSensorModel_HEADER #define ossimSensorModel_HEADER @@ -116,10 +116,10 @@ public: /*! * METHOD: lineSampleHeightToWorld * This is the pure virtual that performs the actual work of projecting - * the image point to the given elevation above MSL. + * the image point to the given elevation above Ellipsoid. */ virtual void lineSampleHeightToWorld(const ossimDpt& lineSampPt, - const double& heightAboveMSL, + const double& heightEllipsoid, ossimGpt& worldPt) const = 0; /*! * METHOD: imagingRay(image_point, &ossimEcefRay) diff --git a/Utilities/otbossim/include/ossim/support_data/ossimNmeaMessageSequencer.h b/Utilities/otbossim/include/ossim/support_data/ossimNmeaMessageSequencer.h new file mode 100644 index 0000000000000000000000000000000000000000..37bb387f8f082a5a6b0c068160c13e72e7d6952a --- /dev/null +++ b/Utilities/otbossim/include/ossim/support_data/ossimNmeaMessageSequencer.h @@ -0,0 +1,27 @@ +#ifndef ossimNmeaMessageSequencer_HEADER +#define ossimNmeaMessageSequencer_HEADER +#include <ossim/support_data/ossimNmeaMessage.h> +#include <ossim/base/ossimFilename.h> +#include <string> + +class OSSIM_DLL ossimNmeaMessageSequencer +{ +public: + ossimNmeaMessageSequencer(); + ossimNmeaMessageSequencer(const ossimFilename& file); + ossimNmeaMessageSequencer(const std::string& str); + ~ossimNmeaMessageSequencer(); + + void initialize(const ossimFilename& file); + void initialize(const std::string& str); + + bool next(ossimNmeaMessage& msg); + + void reset(); + bool valid()const; + +protected: + void destroy(); + std::istream* m_inputStream; +}; +#endif diff --git a/Utilities/otbossim/include/ossim/util/ossimFileWalker.h b/Utilities/otbossim/include/ossim/util/ossimFileWalker.h index 0ccb884a2e54cca3efcaa575f0b5bf3ed07f8b49..77e76728119f35bfd85068bba94e7d05e0a5ad2b 100644 --- a/Utilities/otbossim/include/ossim/util/ossimFileWalker.h +++ b/Utilities/otbossim/include/ossim/util/ossimFileWalker.h @@ -8,7 +8,7 @@ // // Author: David Burken // -// Description: See description for class below. +// Description: See description for class below. // //---------------------------------------------------------------------------- // $Id$ @@ -16,8 +16,12 @@ #ifndef ossimFileWalker_HEADER #define ossimFileWalker_HEADER 1 -#include <ossim/base/ossimCallback2wRet.h> +#include <ossim/base/ossimCallback1.h> #include <ossim/base/ossimConstants.h> +#include <ossim/base/ossimFilename.h> +#include <ossim/parallel/ossimJob.h> +#include <ossim/parallel/ossimJobMultiThreadQueue.h> +#include <OpenThreads/Mutex> #include <string> #include <vector> @@ -27,15 +31,17 @@ class ossimFilename; * @class ossimFileWalker * * Utility class to walk through directories and get a list of files to - * process file. Mechanisms are in place to filter files and to call back - * to a processFile method. Requires a callback method to process files from - * the user. Callback is set via registerProcessFileCallback method. + * process. For each file found the callback is excecuted. Mechanisms are in + * place to filter files and to call back to a processFile method. This + * requires a callback method to process files from the user. The callback is + * set via registerProcessFileCallback method. Internally the processFile + * calls are placed in a job queue. * * Typical usage (snip from ossimTiledElevationDatabase): * * ossimFileWalker* fw = new ossimFileWalker(); * fw->initializeDefaultFilterList(); - * ossimCallback2wRet<const ossimFilename&, bool&, bool>* cb = + * ossimCallback1<const ossimFilename&, bool&, bool>* cb = * new ProcessFileCB(this, &ossimTiledElevationDatabase::processFile); * fw->registerProcessFileCallback(cb); * fw->walk(f); @@ -46,8 +52,41 @@ public: /** default constructor */ ossimFileWalker(); - - void walk(const ossimFilename& root) const; + + /** destructor */ + ~ossimFileWalker(); + + /** + * @brief Takes an array of files. + * + * For each file in array: If files is a directory, it will walk it. Files + * found in walk or files(not directories) in the array will be processed + * via a job queue. + * + * Files are filter prior to the callback execution. The filtering is to + * eliminate sending unwanted files to the callback. There is a default + * filter table. This can be edited by calling the non-const + * getFilteredExtensions method. + * + * Each callback is placed in a threaded job queue. So users should ensure + * their callback is thread safe. + */ + void walk(const std::vector<ossimFilename>& files); + + /** + * @brief This will walk "root" and execute a callback for each file found. + * + * Files are filter prior to the callback execution. The filtering is to + * eliminate sending unwanted files to the callback. There is a default + * filter table. This can be edited by calling the non-const + * getFilteredExtensions method. + * + * Each callback is placed in a threaded job queue. So users should ensure + * their callback is thread safe. + */ + void walk(const ossimFilename& root); + + // void walk(const ossimFilename& root); /** * @brief Registers callback method to process a file. @@ -55,11 +94,8 @@ public: * @param cb Callback to register. * * @see m_processFileCallBackPtr for documentation on template interface. - * - * @param bool Return flag, true for continue, false for stop. - */ - void registerProcessFileCallback(ossimCallback2wRet<const ossimFilename&, bool&, bool>* cb); + void registerProcessFileCallback(ossimCallback1<const ossimFilename&>* cb); /** @return The list of filtered out files. */ const std::vector<std::string>& getFilteredExtensions() const; @@ -67,6 +103,9 @@ public: /** * @brief Non const method to allow access for * adding or deleting extensions from the list. + * + * The list is used by the private isFiltered method to avoid trying to + * process unwanted files. */ std::vector<std::string>& getFilteredExtensions(); @@ -75,11 +114,72 @@ public: * file names. */ void initializeDefaultFilterList(); + + /** + * @brief Sets recurse flag. + * + * If set to true this stops recursing of the + * current directory. Defaulted to true in the constructor. + * Typically used to indicate the directory being processed holds a + * directory based image, e.g. RPF data. + * + * @param flag True to recurse, false to stop recursion of current + * directory. + */ + void setRecurseFlag(bool flag); + + /** + * @brief If set to true this stops files walking (aborts). + * @param flag True to abort current "walk". + */ + void setAbortFlag(bool flag); + + /** @brief Sets the max number of threads(jobs) to run at one time. */ + void setNumberOfThreads(ossim_uint32 nThreads); private: - - /** @return If true walking should continue; else, break. */ - bool walkDir(const ossimFilename& dir) const; + + /** @brief Private ossimJob class. */ + class ossimFileWalkerJob : public ossimJob + { + public: + /** + * @brief Constructor that takes callback and file. + * @param cb Callback to method to process a file. + * @param file The file to process. + */ + ossimFileWalkerJob(ossimCallback1<const ossimFilename&>* cb, + const ossimFilename& file); + /** + * @brief Defines pure virtual ossimJob::start. + * + * This executes the call to m_processFileCallBackPtr. + */ + virtual void start(); + + private: + ossimCallback1<const ossimFilename&>* m_processFileCallBackPtr; + ossimFilename m_file; + + }; // End: class ossimFileWalkerJob + + /** @brief Private ossimJobCallback class. */ + class ossimFileWalkerJobCallback : public ossimJobCallback + { + public: + ossimFileWalkerJobCallback(); + virtual void started(ossimJob* job); + virtual void finished(ossimJob* job); + virtual void canceled(ossimJob* job); + }; + + /** + * @brief Processes files in directory. + * + * If a file in the directory is itself a directory this will do a recursive + * call to itself. Individual files are processed in a job queue... + */ + void walkDir(const ossimFilename& dir); /** * @brief Convenience method for file walker code to check file to see is @@ -97,22 +197,18 @@ private: * @return true if file is a dot file. */ bool isDotFile(const ossimFilename& f) const; - + /** * @brief Callback to method to process a file. * * @param const ossimFilename& First parameter(argument) file to process. - * - * @param bool& Recurse flag Indicates should continue to recurse - * directories. Typically set to false for directory based images like an - * RPF a.toc. - * - * @param bool Return flag, true for continue, false for stop. */ - ossimCallback2wRet<const ossimFilename&, bool&, bool>* m_processFileCallBackPtr; - - std::vector<std::string> m_filteredExtensions; - + ossimCallback1<const ossimFilename&>* m_processFileCallBackPtr; + ossimRefPtr<ossimJobMultiThreadQueue> m_jobQueue; + std::vector<std::string> m_filteredExtensions; + bool m_recurseFlag; + bool m_abortFlag; + OpenThreads::Mutex m_mutex; }; #endif /* #ifndef ossimFileWalker_HEADER */ diff --git a/Utilities/otbossim/include/ossim/util/ossimImageUtil.h b/Utilities/otbossim/include/ossim/util/ossimImageUtil.h new file mode 100644 index 0000000000000000000000000000000000000000..9bed38d14b65722df35b221165e88219af81cc59 --- /dev/null +++ b/Utilities/otbossim/include/ossim/util/ossimImageUtil.h @@ -0,0 +1,176 @@ +//---------------------------------------------------------------------------- +// File: ossimImageUtil.h +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +// Author: David Burken +// +// Description: ossimImageUtil +// +// See class descriptions below for more. +// +//---------------------------------------------------------------------------- +// $Id$ + +#ifndef ossimImageUtil_HEADER +#define ossimImageUtil_HEADER 1 + +#include <ossim/base/ossimConstants.h> +#include <ossim/base/ossimKeywordlist.h> +#include <ossim/base/ossimPropertyInterface.h> +#include <ossim/base/ossimReferenced.h> +#include <ossim/base/ossimRefPtr.h> +#include <ossim/imaging/ossimImageHandler.h> +#include <ossim/imaging/ossimOverviewBuilderBase.h> +#include <OpenThreads/Mutex> +#include <ostream> + +class ossimArgumentParser; +class ossimFileWalker; +class ossimGpt; + +/** + * @brief ossimImageUtil class. + * + * Utility class for processing image recursively. This is for doing things like: + * + * building overview, histograms, compute min/max, extract vertices. + */ +class OSSIM_DLL ossimImageUtil : public ossimReferenced +{ +public: + + /** default constructor */ + ossimImageUtil(); + + /** virtual destructor */ + virtual ~ossimImageUtil(); + + /** + * @brief Adds application arguments to the argument parser. + * @param ap Parser to add to. + */ + void addArguments(ossimArgumentParser& ap); + + /** + * @brief Initial method. + * + * Typically called from application prior to execute. This parses + * all options and put in keyword list m_kwl. + * + * @param ap Arg parser to initialize from. + * @return true, indicating process should continue with execute. + * @note A throw with an error message of "usage" is used to get out when + * a usage is printed. + */ + bool initialize(ossimArgumentParser& ap); + + /** + * @brief execute method. + * + * Performs the actual dump of information. This executes any options + * set including image operations, i.e. -i -p --dno and so on. + * + * @note Throws ossimException on error. + */ + void execute(); + + /** + * @brief ProcessFile method. + * + * This method is linked to the ossimFileWalker::walk method via a callback + * mechanism. It is called by the ossimFileWalk (caller). In turn this + * class (callee) calls ossimFileWalker::setRecurseFlag and + * ossimFileWalker::setAbortFlag to control the waking process. + * + * @param file to process. + */ + void processFile(const ossimFilename& file); + +private: + + void createOverview(ossimRefPtr<ossimImageHandler>& ih, + bool& consumedHistogramOptions, + bool& consumedCmmOptions); + + void createOverview(ossimRefPtr<ossimImageHandler>& ih, + ossimRefPtr<ossimOverviewBuilderBase>& ob, + ossim_uint32 entry, + bool useEntryIndex, + bool& consumedHistogramOptions); + + void createHistogram(ossimRefPtr<ossimImageHandler>& ih); + + void createHistogram(ossimRefPtr<ossimImageHandler>& ih, + ossim_uint32 entry, + bool useEntryIndex); + + + /** @brief Initializes arg parser and outputs usage. */ + void usage(ossimArgumentParser& ap); + + void outputOverviewWriterTypes() const; + + /** + * @return true if file is a directory based image and the stager should go + * on to next directory; false if stager should continue with directory. + */ + bool isDirectoryBasedImage(const ossimImageHandler* ih) const; + + /** @return true if CREATE_OVERVIEWS_KW is found and set to true. */ + bool createOverviews() const; + + /** @return true if REBUILD_OVERVIEWS_KW is found and set to true. */ + bool rebuildOverviews() const; + + /** @return true if SCAN_MIN_MAX_KW is found and set to true. */ + bool scanForMinMax() const; + + /** @return true if SCAN_MIN_MAX_NULL_KW is found and set to true. */ + bool scanForMinMaxNull() const; + + /** + * @brief Initializes type from OVERVIEW_TYPE_KW or sets to default + * ossim_tiff_box if not found. + */ + void getOverviewType(std::string& type) const; + + /** @brief set reader or writer properties based on cast of pi. */ + void setProps(ossimPropertyInterface* pi) const; + + /** + * @return Overview stop dimension or 0 if OVERVIEW_STOP_DIM_KW is not + * found. + */ + ossim_uint32 getOverviewStopDimension() const; + + /** @return true if CREATE_HISTOGRAM_KW is found and set to true. */ + bool createHistogram() const; + + /** @return true if CREATE_HISTOGRAM_FAST_KW is found and set to true. */ + bool createHistogramFast() const; + + /** @return true if CREATE_HISTOGRAM_R0_KW is found and set to true. */ + bool createHistogramR0() const; + + /** @return true if any of the histogram options are set. */ + bool hasHistogramOption() const; + + /** @return Histogram mode or OSSIM_HISTO_MODE_UNKNOWN if not set. */ + ossimHistogramMode getHistogramMode() const; + + /** + * @return Threads to use. Defaults to 1 if THREADS_KW is not found. + */ + ossim_uint32 getNumberOfThreads() const; + + /** Holds all options passed into intialize except writer props. */ + ossimRefPtr<ossimKeywordlist> m_kwl; + + ossimFileWalker* m_fileWalker; + OpenThreads::Mutex m_mutex; +}; + +#endif /* #ifndef ossimImageUtil_HEADER */ diff --git a/Utilities/otbossim/src/ossim/CMakeLists.txt b/Utilities/otbossim/src/ossim/CMakeLists.txt index 40b79c176e1b5b03b7dad5bf5fd0032eb151f541..abc0a965984bf9c61ae06a280e93768de5999130 100644 --- a/Utilities/otbossim/src/ossim/CMakeLists.txt +++ b/Utilities/otbossim/src/ossim/CMakeLists.txt @@ -44,6 +44,7 @@ FILE(GLOB ossim_vec_HDRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT FILE(GLOB ossim_video_HDRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/../../include/ossim/video/*.h") FILE(GLOB ossim_vpfutil_HDRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/../../include/ossim/vpfutil/*.h") +MESSAGE( "${ossim_HDRS}" ) SET(OSSIM_HEADER_FILES ${ossim_HDRS} ${ossim_base_HDRS} ${ossim_elevation_HDRS} ${ossim_font_HDRS} ${ossim_imaging_HDRS} ${ossim_init_HDRS} ${ossim_kbool_HDRS} @@ -109,8 +110,8 @@ OSSIM_LINK_LIBRARY(${LIB_NAME} COMPONENT_NAME ossim TYPE ${OSSIM_USER_DEFINED_DYNAMIC_OR_STATIC} LIBRARIES ${ossimDependentLibs} -# HEADERS "${OSSIM_HEADER_FILES}" -# PUBLIC_HEADERS "${ossim_HDRS}" + HEADERS "${OSSIM_HEADER_FILES}" + PUBLIC_HEADERS "${ossim_HDRS}" SOURCE_FILES "${ossim_SRCS}" INSTALL_LIB VERSION_SYMLINKS INSTALL_HEADERS) diff --git a/Utilities/otbossim/src/ossim/base/ossimDatumFactory.inc b/Utilities/otbossim/src/ossim/base/ossimDatumFactory.inc index 0c2a304aa677eb5edc0a33b1f043a942705d58f9..60babb19e30a4ca01a1fe607d425d80460a848c2 100644 --- a/Utilities/otbossim/src/ossim/base/ossimDatumFactory.inc +++ b/Utilities/otbossim/src/ossim/base/ossimDatumFactory.inc @@ -46,7 +46,7 @@ public: }; #define NUMBER_OF_SEVEN_PARAM_DATUMS 2 -#define NUMBER_OF_THREE_PARAM_DATUMS 229 +#define NUMBER_OF_THREE_PARAM_DATUMS 226 static ossimThreeParamDatumType threeParamDatum[] = { {"ADI-A", "ADINDAN, Ethiopia", "CD", 3, 3, 3, 26, 50, -3, 25, -165, -11, 206}, @@ -276,7 +276,6 @@ static ossimThreeParamDatumType threeParamDatum[] = { {"WGE", "World Geodetic System 1984", "WE", 0, 0, 0, -180.0, 180.0, -90, 90, 0, 0, 0}, {"YAC", "YACARE, Uruguay", "IN", -1, -1, -1, -65, -47, -40, -25, -155, 171, 37}, {"ZAN", "ZANDERIJ, Suriname", "IN", 5, 5, 8, -76, -47, -10, 20, -265, 120, -358}, -{"WE-EPSG-3857", "Ploppy", "PV", 0, 0, 0, -180.0, 180.0, -85, 85, 0, 0, 0}, {"6055", "Popular Visualisation", "7059", 0, 0, 0, -180.0, 180.0, -85, 85, 0, 0, 0}, {"", "", "", 0, 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0} }; diff --git a/Utilities/otbossim/src/ossim/base/ossimDirectory.cpp b/Utilities/otbossim/src/ossim/base/ossimDirectory.cpp index 18b98ba5d611fe4ff226005858fe08acceddffae..17e17e95a3cad2b14720ac9e48a51e8566a2651e 100644 --- a/Utilities/otbossim/src/ossim/base/ossimDirectory.cpp +++ b/Utilities/otbossim/src/ossim/base/ossimDirectory.cpp @@ -10,7 +10,7 @@ // Description: A brief description of the contents of the file. // //************************************************************************* -// $Id: ossimDirectory.cpp 14776 2009-06-25 14:34:06Z dburken $ +// $Id: ossimDirectory.cpp 20092 2011-09-12 19:09:17Z dburken $ #include <cstring> /* for strncasecmp */ #include <iostream> @@ -153,10 +153,10 @@ bool ossimDirectory::getNext(ossimFilename &filename) const bool ossimDirectory::fileMatched(ossimFilename &filename) const { - bool matches=false; + bool matches = false; - // don't return "." and ".." unless asked for - if ( (filename == "..") || (filename == ".") ) + // Don't return "." and ".." unless asked for. + if ( (filename.file() == "..") || (filename.file() == ".") ) { if (theFlags & ossimDirectory::OSSIM_DIR_DOTDOT) { @@ -171,17 +171,13 @@ bool ossimDirectory::fileMatched(ossimFilename &filename) const { matches = true; } - else - { - matches = false; - } return matches; } bool ossimDirectory::isOpened() const { - return theDirectoryName.isDir(); + return theDirectoryName.isDir(); //return theData != 0; } diff --git a/Utilities/otbossim/src/ossim/base/ossimFilename.cpp b/Utilities/otbossim/src/ossim/base/ossimFilename.cpp index 9c2eaed1ffaf1866b3ef1112fcc436c7463343bc..925e1bef4b3e350de1b9fa4981f9e2fd1f44809b 100644 --- a/Utilities/otbossim/src/ossim/base/ossimFilename.cpp +++ b/Utilities/otbossim/src/ossim/base/ossimFilename.cpp @@ -7,7 +7,7 @@ // Description: This class provides manipulation of filenames. // //************************************************************************* -// $Id: ossimFilename.cpp 19798 2011-06-30 15:34:43Z dburken $ +// $Id: ossimFilename.cpp 20096 2011-09-14 16:44:20Z dburken $ #include <ossim/ossimConfig.h> /* to pick up platform defines */ @@ -76,38 +76,37 @@ public: }; ossimFileHandle(const ossimString& filename, OpenMode mode) - { - m_hFile = ::CreateFile - ( - filename.c_str(), // name - mode == Read ? GENERIC_READ // access mask - : GENERIC_WRITE, - FILE_SHARE_READ | // sharing mode - FILE_SHARE_WRITE, // (allow everything) - NULL, // no secutity attr - OPEN_EXISTING, // creation disposition - 0, // no flags - NULL // no template file - ); + { + m_hFile = ::CreateFile( + filename.c_str(), // name + mode == Read ? GENERIC_READ // access mask + : GENERIC_WRITE, + FILE_SHARE_READ | // sharing mode + FILE_SHARE_WRITE, // (allow everything) + NULL, // no secutity attr + OPEN_EXISTING, // creation disposition + 0, // no flags + NULL // no template file + ); - if ( m_hFile == INVALID_HANDLE_VALUE ) - { + if ( m_hFile == INVALID_HANDLE_VALUE ) + { // wxLogSysError(_("Failed to open '%s' for %s"), // filename.c_str(), // mode == Read ? _("reading") : _("writing")); - } } + } ~ossimFileHandle() + { + if ( m_hFile != INVALID_HANDLE_VALUE ) { - if ( m_hFile != INVALID_HANDLE_VALUE ) + if ( !::CloseHandle(m_hFile) ) { - if ( !::CloseHandle(m_hFile) ) - { // wxLogSysError(_("Failed to close file handle")); - } } } + } // return true only if the file could be opened successfully bool isOk() const { return m_hFile != INVALID_HANDLE_VALUE; } @@ -294,7 +293,11 @@ void ossimFilename::convertForwardToBackSlashes() bool ossimFilename::setTimes(ossimLocalTm* accessTime, ossimLocalTm* modTime, +#if defined(_WIN32) ossimLocalTm* createTime)const +#else + ossimLocalTm* /* createTime */ )const +#endif { #if defined(_WIN32) if(isDir()) @@ -1092,23 +1095,30 @@ bool ossimFilename::createDirectory( bool recurseFlag, bool ossimFilename::remove(const ossimFilename& pathname) { bool result = true; + #if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) || \ defined(__GNUWIN32__) || defined(_MSC_VER) - - if(::remove(pathname.c_str()) != 0) + + // Note: not sure if these work on all of the above flavors. drb - 14 Sep. 2011. + if(pathname.isDir()) { - result = false; + // Note this only removes empty directories. + result = ( RemoveDirectory( pathname.c_str() ) != 0 ); } -#else + else + { + result = ( DeleteFile( pathname.c_str() ) != 0 ); + } +#else /* Unix flavor from unistd.h. */ if(pathname.isDir()) { - result = (rmdir(pathname) >=0); + result = ( rmdir( pathname.c_str() ) == 0 ); } - else if (unlink(pathname.c_str()) < 0) + else { - result = false; + result = ( unlink( pathname.c_str() ) == 0 ); } -#endif /* HAVE_UNISTD_H */ +#endif return result; } diff --git a/Utilities/otbossim/src/ossim/base/ossimGeoidManager.cpp b/Utilities/otbossim/src/ossim/base/ossimGeoidManager.cpp index d4f7cfd1e5b28206bd08b15c4a01fc85ad5565d2..0f12804c36b5468a7e5b9be8c2890f4ae3ce00fc 100644 --- a/Utilities/otbossim/src/ossim/base/ossimGeoidManager.cpp +++ b/Utilities/otbossim/src/ossim/base/ossimGeoidManager.cpp @@ -10,7 +10,7 @@ // LIMITATIONS: None. // //***************************************************************************** -// $Id: ossimGeoidManager.cpp 16139 2009-12-18 18:37:07Z gpotts $ +// $Id: ossimGeoidManager.cpp 20096 2011-09-14 16:44:20Z dburken $ #include <ossim/base/ossimCommon.h> #include <ossim/base/ossimGeoidManager.h> @@ -166,8 +166,7 @@ bool ossimGeoidManager::loadState(const ossimKeywordlist& kwl, geoidGrid1996 = geoidGrid1996.dirCat("egm96.grd"); } - bool addedGeoid1996Grid = false; - if(geoidGrid1996.exists()) + if( geoidGrid1996.exists() ) { ossimRefPtr<ossimGeoid> geoid = new ossimGeoidEgm96(geoidGrid1996); if (geoid->getErrorStatus() == ossimErrorCodes::OSSIM_OK) @@ -179,7 +178,6 @@ bool ossimGeoidManager::loadState(const ossimKeywordlist& kwl, << "\nAdded geoid egm 96: " << geoidGrid1996.c_str() << "\n"; } - addedGeoid1996Grid = true; addGeoid(geoid.get()); } else diff --git a/Utilities/otbossim/src/ossim/base/ossimGpt.cpp b/Utilities/otbossim/src/ossim/base/ossimGpt.cpp index 1d982d8f515a13a8ac070a0b665d85201770355d..1c58e5743f589ce790c0d0a6e4d8f13d111054c4 100644 --- a/Utilities/otbossim/src/ossim/base/ossimGpt.cpp +++ b/Utilities/otbossim/src/ossim/base/ossimGpt.cpp @@ -9,7 +9,7 @@ // LATITUDE AND LONGITUDE VALUES ARE IN DEGREES. // //******************************************************************* -// $Id: ossimGpt.cpp 19900 2011-08-04 14:19:57Z dburken $ +// $Id: ossimGpt.cpp 20105 2011-09-21 17:50:35Z dburken $ #include <ossim/base/ossimGpt.h> #include <ossim/base/ossimEcefPoint.h> @@ -28,9 +28,12 @@ std::ostream& ossimGpt::print(std::ostream& os, ossim_uint32 precision) const { // Capture the original flags. std::ios_base::fmtflags f = os.flags(); - - os << setiosflags(ios::fixed) << setprecision(precision); - os << "( "; + + // Set the new precision capturing old. + std::streamsize oldPrecision = os.precision(precision); + + os << setiosflags(ios::fixed) + << "( "; if(isLatNan()) { @@ -60,8 +63,9 @@ std::ostream& ossimGpt::print(std::ostream& os, ossim_uint32 precision) const os << (theDatum?theDatum->code().c_str():"") << " )"; - // Reset flags. + // Reset flags and precision. os.setf(f); + os.precision(oldPrecision); return os; } diff --git a/Utilities/otbossim/src/ossim/base/ossimGzStream.cpp b/Utilities/otbossim/src/ossim/base/ossimGzStream.cpp index fccd52b6a076bb97945f4b31231797dd45612292..b98da3d5373a72da7f9a16543446b4fb4450b211 100644 --- a/Utilities/otbossim/src/ossim/base/ossimGzStream.cpp +++ b/Utilities/otbossim/src/ossim/base/ossimGzStream.cpp @@ -19,7 +19,7 @@ // // File : gzstream.C // Revision : $Revision: 17195 $ -// Revision_date : $Date: 2010-04-24 01:32:18 +0800 (Sat, 24 Apr 2010) $ +// Revision_date : $Date: 2010-04-23 19:32:18 +0200 (ven., 23 avril 2010) $ // Author(s) : Deepak Bandyopadhyay, Lutz Kettner // // Standard streambuf implementation following Nicolai Josuttis, "The diff --git a/Utilities/otbossim/src/ossim/base/ossimIpt.cpp b/Utilities/otbossim/src/ossim/base/ossimIpt.cpp index 9dfde6fd69f30184bc7b20b348a6c0a119c2a664..f1ca7d8b2bbfc29c1302c1cb28545c6f2ee3f1ae 100644 --- a/Utilities/otbossim/src/ossim/base/ossimIpt.cpp +++ b/Utilities/otbossim/src/ossim/base/ossimIpt.cpp @@ -10,7 +10,7 @@ // Contains class definitions for ipt. // //******************************************************************* -// $Id: ossimIpt.cpp 19793 2011-06-30 13:26:56Z gpotts $ +// $Id: ossimIpt.cpp 20070 2011-09-07 18:48:35Z dburken $ #include <iostream> #include <sstream> @@ -258,7 +258,7 @@ std::istream& operator>>(std::istream& is, ossimIpt &pt) return is; } -bool ossimIpt::isEqualTo(const ossimIpt& rhs, ossimCompareType compareType)const +bool ossimIpt::isEqualTo(const ossimIpt& rhs, ossimCompareType /* compareType */)const { return ((x==rhs.x)&& (y==rhs.y)); diff --git a/Utilities/otbossim/src/ossim/base/ossimLagrangeInterpolator.cpp b/Utilities/otbossim/src/ossim/base/ossimLagrangeInterpolator.cpp index a1622e104280ee6205599558f2dc218ad03fb219..2c773560cb1eb915f71f59b679ef8ce400c6a7c1 100644 --- a/Utilities/otbossim/src/ossim/base/ossimLagrangeInterpolator.cpp +++ b/Utilities/otbossim/src/ossim/base/ossimLagrangeInterpolator.cpp @@ -127,7 +127,7 @@ ostream& operator << (ostream& stream, const ossimLagrangeInterpolator& interpol << " " << interpolator.theTeeArray.size() << " " << interpolator.theNumElements << endl; - for (int i=0; i<interpolator.theTeeArray.size(); i++) + for (ossim_uint32 i=0; i<interpolator.theTeeArray.size(); ++i) { stream << setprecision(20); stream << interpolator.theTeeArray[i] << " " diff --git a/Utilities/otbossim/src/ossim/base/ossimObject.cpp b/Utilities/otbossim/src/ossim/base/ossimObject.cpp index 89fa908d526e81943de46bda740a5a673ef4e86f..60843e6adf3cf7637ec45d9e9723da6d820225ae 100644 --- a/Utilities/otbossim/src/ossim/base/ossimObject.cpp +++ b/Utilities/otbossim/src/ossim/base/ossimObject.cpp @@ -8,7 +8,7 @@ // Author: Garrett Potts // //************************************************************************* -// $Id: ossimObject.cpp 19857 2011-07-21 18:42:15Z gpotts $ +// $Id: ossimObject.cpp 20070 2011-09-07 18:48:35Z dburken $ #include <ossim/base/ossimObject.h> #include <ossim/base/ossimKeywordNames.h> #include <ossim/base/ossimKeywordlist.h> @@ -103,7 +103,7 @@ bool ossimObject::saveState(ossimKeywordlist& kwl, return true; } -bool ossimObject::isEqualTo(const ossimObject& obj, ossimCompareType compareType)const +bool ossimObject::isEqualTo(const ossimObject& obj, ossimCompareType /* compareType */)const { return (getClassName() == obj.getClassName()); } diff --git a/Utilities/otbossim/src/ossim/base/ossimWgs72Datum.cpp b/Utilities/otbossim/src/ossim/base/ossimWgs72Datum.cpp index 76f931bd52ccf73f247f0382bde4c5d8cf83ce19..baa0b6fcd0f1af0f2ff910243333e5936cef3103 100644 --- a/Utilities/otbossim/src/ossim/base/ossimWgs72Datum.cpp +++ b/Utilities/otbossim/src/ossim/base/ossimWgs72Datum.cpp @@ -10,7 +10,7 @@ // instance of a Wgs72Ellipsoid and set the initial defaults for // that are specific to a Wgs72Datum //******************************************************************* -// $Id: ossimWgs72Datum.cpp 19795 2011-06-30 15:04:48Z gpotts $ +// $Id: ossimWgs72Datum.cpp 20096 2011-09-14 16:44:20Z dburken $ #include <iostream> using namespace std; @@ -157,7 +157,6 @@ ossimGpt ossimWgs72Datum::shiftFromWgs84(const ossimGpt &aPt)const double WGS84_a; /* Semi-major axis of WGS84 ellipsoid */ double WGS84_f; /* Flattening of WGS84 ellipsoid */ double WGS72_a; /* Semi-major axis of WGS72 ellipsoid */ - double WGS72_b; /* Semi-minor axis of WGS72 ellipsoid */ double WGS72_f; /* Flattening of WGS72 ellipsoid */ double da; /* WGS72_a - WGS84_a */ double df; /* WGS72_f - WGS84_f */ @@ -179,7 +178,6 @@ ossimGpt ossimWgs72Datum::shiftFromWgs84(const ossimGpt &aPt)const WGS84_a = wgs84Ellipsoid->a(); WGS84_f = wgs84Ellipsoid->flattening(); WGS72_a = wgs72Ellipsoid->a(); - WGS72_b = wgs72Ellipsoid->b(); WGS72_f = wgs72Ellipsoid->flattening(); da = WGS72_a - WGS84_a; diff --git a/Utilities/otbossim/src/ossim/elevation/ossimElevManager.cpp b/Utilities/otbossim/src/ossim/elevation/ossimElevManager.cpp index 6de6fec219b31330ca7f046856f2cebf33a64646..d973192bf6ed7e42eb3039e5189f3b9f6567a205 100644 --- a/Utilities/otbossim/src/ossim/elevation/ossimElevManager.cpp +++ b/Utilities/otbossim/src/ossim/elevation/ossimElevManager.cpp @@ -19,11 +19,12 @@ // Initial coding. //< //************************************************************************** -// $Id: ossimElevManager.cpp 19444 2011-04-25 18:20:59Z dburken $ +// $Id: ossimElevManager.cpp 20109 2011-09-23 12:51:28Z gpotts $ #include <algorithm> #include <ossim/elevation/ossimElevManager.h> #include <ossim/base/ossimEnvironmentUtility.h> +#include <ossim/elevation/ossimElevationDatabase.h> #include <ossim/base/ossimDirectory.h> #include <ossim/base/ossimTrace.h> #include <ossim/base/ossimGeoidManager.h> @@ -33,6 +34,23 @@ ossimElevManager* ossimElevManager::m_instance = 0; static ossimTrace traceDebug("ossimElevManager:debug"); +void ossimElevManager::ConnectionStringVisitor::visit(ossimObject* obj) +{ + if(!hasVisited(obj)) + { + ossimElevationDatabase* databsase = dynamic_cast<ossimElevationDatabase*>(obj); + if(databsase) + { + if(m_connectionString == databsase->getConnectionString()) + { + m_database = databsase; + m_stopTraversalFlag = true; + } + } + } +} + + ossimElevManager* ossimElevManager::instance() { if (!m_instance) @@ -67,7 +85,7 @@ double ossimElevManager::getHeightAboveEllipsoid(const ossimGpt& gpt) double result = ossim::nan(); ossim_uint32 idx = 0; { - OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex); + // OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex); for(;(idx < m_elevationDatabaseList.size())&&ossim::isnan(result); ++idx) { result = m_elevationDatabaseList[idx]->getHeightAboveEllipsoid(gpt); @@ -96,7 +114,7 @@ double ossimElevManager::getHeightAboveMSL(const ossimGpt& gpt) } double result = ossim::nan(); { - OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex); + // OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex); ossim_uint32 idx = 0; for(;(idx < m_elevationDatabaseList.size())&&ossim::isnan(result); ++idx) @@ -199,12 +217,20 @@ void ossimElevManager::getOpenCellList(std::vector<ossimFilename>& list) const void ossimElevManager::clear() { - OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex); + //OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex); m_elevationDatabaseList.clear(); } +void ossimElevManager::accept(ossimVisitor& visitor) +{ + for(ossim_uint32 idx = 0; ((idx < m_elevationDatabaseList.size())&&!visitor.stopTraversal()); ++idx) + { + m_elevationDatabaseList[idx]->accept(visitor); + } +} + bool ossimElevManager::saveState(ossimKeywordlist& kwl, const char* prefix) const { @@ -310,7 +336,7 @@ void ossimElevManager::addDatabase(ossimElevationDatabase* database) { if(!database) return; ossimRefPtr<ossimElevationDatabase> tempDb = database; - OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex); + // OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex); if(std::find(m_elevationDatabaseList.begin(), m_elevationDatabaseList.end(), database) == m_elevationDatabaseList.end()) diff --git a/Utilities/otbossim/src/ossim/elevation/ossimImageElevationDatabase.cpp b/Utilities/otbossim/src/ossim/elevation/ossimImageElevationDatabase.cpp index 609b09528406b4ddded0f3db54168ea735f95bf8..60b4ee1109d37716ed844b5bac35568342f855fb 100644 --- a/Utilities/otbossim/src/ossim/elevation/ossimImageElevationDatabase.cpp +++ b/Utilities/otbossim/src/ossim/elevation/ossimImageElevationDatabase.cpp @@ -14,14 +14,12 @@ // $Id$ #include <ossim/elevation/ossimImageElevationDatabase.h> - -#include <ossim/base/ossimCallback2wRet.h> +#include <ossim/base/ossimCallback1.h> #include <ossim/base/ossimDpt.h> #include <ossim/base/ossimString.h> #include <ossim/base/ossimTrace.h> #include <ossim/elevation/ossimImageElevationHandler.h> #include <ossim/util/ossimFileWalker.h> - #include <cmath> static ossimTrace traceDebug(ossimString("ossimImageElevationDatabase:debug")); @@ -34,25 +32,25 @@ RTTI_DEF1(ossimImageElevationDatabase, "ossimImageElevationDatabase", ossimEleva // // Placed here as it is unique to this class. //--- -class ProcessFileCB: public ossimCallback2wRet<const ossimFilename&, bool&, bool> +class ProcessFileCB: public ossimCallback1<const ossimFilename&> { public: ProcessFileCB( ossimImageElevationDatabase* obj, - bool (ossimImageElevationDatabase::*func)(const ossimFilename&, bool&)) + void (ossimImageElevationDatabase::*func)(const ossimFilename&)) : m_obj(obj), m_func(func) {} - virtual bool operator()(const ossimFilename& file, bool& flag) const + virtual void operator()(const ossimFilename& file) const { - return ( m_obj->*m_func)(file, flag); + (m_obj->*m_func)(file); } private: ossimImageElevationDatabase* m_obj; - bool (ossimImageElevationDatabase::*m_func)(const ossimFilename& file, bool& flag); + void (ossimImageElevationDatabase::*m_func)(const ossimFilename& file); }; ossimImageElevationDatabase::ossimImageElevationDatabase() @@ -164,7 +162,18 @@ ossimRefPtr<ossimElevCellHandler> ossimImageElevationDatabase::createCell( ossimNotify(ossimNotifyLevel_WARN) << "ossimImageElevationDatabase::createCell WARN:\nCould not open: " << (*i).second.m_file << "\nRemoving file from map!" << std::endl; - m_entryMap.erase(i); + + // Get a copy of the iterator to delet. + std::map<ossim_uint64, ossimImageElevationFileEntry>::iterator badIter = i; + + ++i; // Go to next image. + + // Must put lock around erase. + m_cacheMapMutex.lock(); + m_entryMap.erase(badIter); + m_cacheMapMutex.unlock(); + + continue; // Skip the rest of this loop. } } @@ -203,6 +212,7 @@ ossimRefPtr<ossimElevCellHandler> ossimImageElevationDatabase::createCell( ++i; } + return result; } @@ -312,8 +322,7 @@ bool ossimImageElevationDatabase::pointHasCoverage(const ossimGpt& gpt) const } ++i; } - - return false; + return result; } double ossimImageElevationDatabase::getAccuracyLE90(const ossimGpt& /* gpt */) const @@ -363,8 +372,7 @@ bool ossimImageElevationDatabase::saveState(ossimKeywordlist& kwl, const char* p return ossimElevationDatabase::saveState(kwl, prefix); } -bool ossimImageElevationDatabase::processFile(const ossimFilename& file, - bool& recurseFlag) +void ossimImageElevationDatabase::processFile(const ossimFilename& file) { static const char M[] = "ossimImageElevationDatabase::processFile"; if(traceDebug()) @@ -373,21 +381,14 @@ bool ossimImageElevationDatabase::processFile(const ossimFilename& file, << M << " entered...\n" << "file: " << file << "\n"; } - // Set the flags for the walker. - bool continueFlag = true; - recurseFlag = true; - // Add the file. - m_entryMap.insert( std::make_pair(m_lastMapKey++, ossimImageElevationFileEntry(file)) ); - + if(traceDebug()) { - ossimNotify(ossimNotifyLevel_DEBUG) - << M << " recurseNoMoreFlag=" << recurseFlag - << " continueFlag=" << continueFlag << "\n"; - } - return continueFlag; + // Since ossimFileWalker is threaded output the file so we know which job exited. + ossimNotify(ossimNotifyLevel_DEBUG) << M << "\nfile: " << file << "\nexited...\n"; + } } void ossimImageElevationDatabase::loadFileMap() @@ -397,7 +398,7 @@ void ossimImageElevationDatabase::loadFileMap() // Create a file walker which will find files we can load from the connection string. ossimFileWalker* fw = new ossimFileWalker(); fw->initializeDefaultFilterList(); - ossimCallback2wRet<const ossimFilename&, bool&, bool>* cb = + ossimCallback1<const ossimFilename&>* cb = new ProcessFileCB(this, &ossimImageElevationDatabase::processFile); fw->registerProcessFileCallback(cb); diff --git a/Utilities/otbossim/src/ossim/elevation/ossimTiledElevationDatabase.cpp b/Utilities/otbossim/src/ossim/elevation/ossimTiledElevationDatabase.cpp index e0befaf9bb39038b2ebb926a731eb8ff7bdbde3e..bca0a46819e4eb871d2e2f7bf739daba8eb3d71b 100644 --- a/Utilities/otbossim/src/ossim/elevation/ossimTiledElevationDatabase.cpp +++ b/Utilities/otbossim/src/ossim/elevation/ossimTiledElevationDatabase.cpp @@ -15,7 +15,7 @@ #include <ossim/elevation/ossimTiledElevationDatabase.h> -#include <ossim/base/ossimCallback2wRet.h> +#include <ossim/base/ossimCallback1.h> #include <ossim/base/ossimDblGrid.h> #include <ossim/base/ossimDirectory.h> #include <ossim/base/ossimDpt.h> @@ -44,25 +44,25 @@ RTTI_DEF1(ossimTiledElevationDatabase, "ossimTiledElevationDatabase", ossimEleva // // Placed here as it is unique to this class. //--- -class ProcessFileCB: public ossimCallback2wRet<const ossimFilename&, bool&, bool> +class ProcessFileCB: public ossimCallback1<const ossimFilename&> { public: ProcessFileCB( ossimTiledElevationDatabase* obj, - bool (ossimTiledElevationDatabase::*func)(const ossimFilename&, bool&)) + void (ossimTiledElevationDatabase::*func)(const ossimFilename&)) : m_obj(obj), m_func(func) {} - virtual bool operator()(const ossimFilename& file, bool& flag) const + virtual void operator()(const ossimFilename& file) const { - return ( m_obj->*m_func)(file, flag); + (m_obj->*m_func)(file); } private: ossimTiledElevationDatabase* m_obj; - bool (ossimTiledElevationDatabase::*m_func)(const ossimFilename& file, bool& flag); + void (ossimTiledElevationDatabase::*m_func)(const ossimFilename& file); }; ossimTiledElevationDatabase::ossimTiledElevationDatabase() @@ -72,7 +72,8 @@ ossimTiledElevationDatabase::ossimTiledElevationDatabase() m_grid(0), m_referenceProj(0), m_requestedRect(), - m_entryListRect() + m_entryListRect(), + m_fileWalker(0) { m_requestedRect.makeNan(); m_entryListRect.makeNan(); @@ -157,8 +158,7 @@ void ossimTiledElevationDatabase::mapRegion(const ossimGrect& region) if ( m_connectionString.size() ) { // Put these outside the try block so we can delete if exception thrown. - ossimFileWalker* fw = 0; - ossimCallback2wRet<const ossimFilename&, bool&, bool>* cb = 0; + ossimCallback1<const ossimFilename&>* cb = 0; // Wrap in try catch block as excptions can be thrown under the hood. try @@ -169,11 +169,11 @@ void ossimTiledElevationDatabase::mapRegion(const ossimGrect& region) if ( f.exists() ) { // Walk the directory - fw = new ossimFileWalker(); - fw->initializeDefaultFilterList(); + m_fileWalker = new ossimFileWalker(); + m_fileWalker->initializeDefaultFilterList(); cb = new ProcessFileCB(this, &ossimTiledElevationDatabase::processFile); - fw->registerProcessFileCallback(cb); - fw->walk(f); + m_fileWalker->registerProcessFileCallback(cb); + m_fileWalker->walk(f); mapRegion(); } @@ -192,10 +192,10 @@ void ossimTiledElevationDatabase::mapRegion(const ossimGrect& region) } // cleanup: - if ( fw ) + if ( m_fileWalker ) { - delete fw; - fw = 0; + delete m_fileWalker; + m_fileWalker = 0; } if ( cb ) { @@ -210,8 +210,7 @@ void ossimTiledElevationDatabase::mapRegion(const ossimGrect& region) } } -bool ossimTiledElevationDatabase::processFile(const ossimFilename& file, - bool& recurseFlag) +void ossimTiledElevationDatabase::processFile(const ossimFilename& file) { static const char M[] = "ossimTiledElevationDatabase::processFile"; if(traceDebug()) @@ -219,13 +218,15 @@ bool ossimTiledElevationDatabase::processFile(const ossimFilename& file, ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered...\n" << "file: " << file << "\n"; } - bool continueFlag = true; ossimRefPtr<ossimSingleImageChain> sic = new ossimSingleImageChain(); if ( sic->open(file, false) ) // False for do not open overviews. { - // Set the directory walker flag. - recurseFlag = !(isDirectoryBasedImage(sic->getImageHandler())); + if ( isDirectoryBasedImage( sic->getImageHandler() ) ) + { + // Tell the walker not to recurse this directory. + m_fileWalker->setRecurseFlag(false); + } ossimRefPtr<ossimImageHandler> ih = sic->getImageHandler(); if ( ih.valid() && (m_requestedRect.isLonLatNan() == false) ) @@ -293,7 +294,11 @@ bool ossimTiledElevationDatabase::processFile(const ossimFilename& file, ossimTiledElevationEntry entry(boundingRect, sic); addEntry(entry); - continueFlag = m_requestedRect.completely_within(m_entryListRect); + // Once the requested rect is filled abort the file walk. + if ( m_requestedRect.completely_within( m_entryListRect ) ) + { + m_fileWalker->setAbortFlag(true); + } } } } @@ -305,15 +310,12 @@ bool ossimTiledElevationDatabase::processFile(const ossimFilename& file, throw ossimException(errMsg); } } - + if(traceDebug()) { - ossimNotify(ossimNotifyLevel_DEBUG) - << M << " recurseFlag=" << recurseFlag - << " continueFlag=" << continueFlag << "\n"; - } - - return continueFlag; + // Since ossimFileWalker is threaded output the file so we know which job exited. + ossimNotify(ossimNotifyLevel_DEBUG) << M << "\nfile: " << file << "\nexited...\n"; + } } void ossimTiledElevationDatabase::addEntry(const ossimTiledElevationEntry& entry) diff --git a/Utilities/otbossim/src/ossim/font/ossimFreeTypeFont.cpp b/Utilities/otbossim/src/ossim/font/ossimFreeTypeFont.cpp index e61d02293c05d1eb74169465a60cf32fc4cd31cd..d9a60fa2918b1e6edf0c25cac46405606e6300e6 100644 --- a/Utilities/otbossim/src/ossim/font/ossimFreeTypeFont.cpp +++ b/Utilities/otbossim/src/ossim/font/ossimFreeTypeFont.cpp @@ -6,7 +6,7 @@ // Author: Garrett Potts // //******************************************************************** -// $Id: ossimFreeTypeFont.cpp 17108 2010-04-15 21:08:06Z dburken $ +// $Id: ossimFreeTypeFont.cpp 20070 2011-09-07 18:48:35Z dburken $ // ossimFreeTypeFont.h should be load prior to checking for OSSIM_HAS_FREETYPE. #include <ossim/font/ossimFreeTypeFont.h> @@ -169,8 +169,8 @@ void ossimFreeTypeFont::layoutGlyphs(const ossimString& s ) int n; FT_Vector origin; FT_Pos origin_x = 0; - FT_UInt load_flags; - FT_UInt num_grays; + // FT_UInt load_flags; + // FT_UInt num_grays; FT_UInt prev_index = 0; FT_UInt num_glyphs = (FT_UInt)s.size(); int error = 0; @@ -185,9 +185,9 @@ void ossimFreeTypeFont::layoutGlyphs(const ossimString& s ) int hasKerning = FT_HAS_KERNING(theFontFace); - load_flags = FT_LOAD_DEFAULT; + // load_flags = FT_LOAD_DEFAULT; + // num_grays = 256; - num_grays = 256; const char* c = s.c_str(); for ( n = 0; n < (int)num_glyphs; n++) { diff --git a/Utilities/otbossim/src/ossim/imaging/ossimBumpShadeTileSource.cpp b/Utilities/otbossim/src/ossim/imaging/ossimBumpShadeTileSource.cpp index 8277cb6a07aa6eeb82030986fda187a1f27b27b3..a426c6e9dabf630b0e3b4f63d2af3879d5b6c481 100644 --- a/Utilities/otbossim/src/ossim/imaging/ossimBumpShadeTileSource.cpp +++ b/Utilities/otbossim/src/ossim/imaging/ossimBumpShadeTileSource.cpp @@ -8,7 +8,7 @@ // Author: Garrett Potts // //************************************************************************* -// $Id: ossimBumpShadeTileSource.cpp 19970 2011-08-17 00:35:10Z gpotts $ +// $Id: ossimBumpShadeTileSource.cpp 20079 2011-09-09 12:27:42Z gpotts $ #include <ossim/imaging/ossimBumpShadeTileSource.h> #include <ossim/imaging/ossimImageDataFactory.h> @@ -284,7 +284,7 @@ void ossimBumpShadeTileSource::computeLightDirection() { NEWMAT::Matrix m = ossimMatrix3x3::createRotationMatrix(m_lightSourceElevationAngle, 0.0, - m_lightSourceAzimuthAngle); + -m_lightSourceAzimuthAngle); // make positive rotation clockwise for azimuth NEWMAT::ColumnVector v(3); v[0] = 0; v[1] = 1; diff --git a/Utilities/otbossim/src/ossim/imaging/ossimImageGeometry.cpp b/Utilities/otbossim/src/ossim/imaging/ossimImageGeometry.cpp index f354a7b17551d7b7ea7d4b48f039f5e39a5150b9..22c113b6059d0eb642ef330f51a3a051eca06b4d 100644 --- a/Utilities/otbossim/src/ossim/imaging/ossimImageGeometry.cpp +++ b/Utilities/otbossim/src/ossim/imaging/ossimImageGeometry.cpp @@ -171,20 +171,45 @@ void ossimImageGeometry::worldToRn(const ossimGpt& wpt, //************************************************************************************************** bool ossimImageGeometry::localToWorld(const ossimDpt& local_pt, ossimGpt& world_pt) const { - //! Return a NAN point of no projection is defined: - if (!m_projection.valid()) - { - world_pt.makeNan(); - return false; - } + //! Return a NAN point of no projection is defined: + if (!m_projection.valid()) + { + world_pt.makeNan(); + return false; + } + + // First transform local pixel to full-image pixel: + ossimDpt full_image_pt; + rnToFull(local_pt, m_targetRrds, full_image_pt); - // First transform local pixel to full-image pixel: - ossimDpt full_image_pt; - rnToFull(local_pt, m_targetRrds, full_image_pt); + // Perform projection to world coordinates: + m_projection->lineSampleToWorld(full_image_pt, world_pt); + return true; +} - // Perform projection to world coordinates: - m_projection->lineSampleToWorld(full_image_pt, world_pt); - return true; +//************************************************************************************************** +//! Exposes the 3D projection from image to world coordinates given a constant height above +//! ellipsoid. The caller should verify that a valid projection exists before calling this +//! method. Returns TRUE if a valid ground point is available in the ground_pt argument. +//************************************************************************************************** +bool ossimImageGeometry::localToWorld(const ossimDpt& local_pt, + const double& h_ellipsoid, + ossimGpt& world_pt) const +{ + //! Return a NAN point of no projection is defined: + if (!m_projection.valid()) + { + world_pt.makeNan(); + return false; + } + + // First transform local pixel to full-image pixel: + ossimDpt full_image_pt; + rnToFull(local_pt, m_targetRrds, full_image_pt); + + // Perform projection to world coordinates: + m_projection->lineSampleHeightToWorld(full_image_pt, h_ellipsoid, world_pt); + return true; } //************************************************************************************************** diff --git a/Utilities/otbossim/src/ossim/imaging/ossimImageToPlaneNormalFilter.cpp b/Utilities/otbossim/src/ossim/imaging/ossimImageToPlaneNormalFilter.cpp index ce4fea7e546df984fe9d8cf1b67d17c0bd9af3f8..bc106b8a529f18e6f6d09056d5cc9dbbe78b62ca 100644 --- a/Utilities/otbossim/src/ossim/imaging/ossimImageToPlaneNormalFilter.cpp +++ b/Utilities/otbossim/src/ossim/imaging/ossimImageToPlaneNormalFilter.cpp @@ -8,7 +8,7 @@ // Author: Garrett Potts // //************************************************************************* -// $Id: ossimImageToPlaneNormalFilter.cpp 19198 2011-03-23 16:23:06Z dburken $ +// $Id: ossimImageToPlaneNormalFilter.cpp 20078 2011-09-09 12:25:50Z gpotts $ #include <ossim/imaging/ossimImageToPlaneNormalFilter.h> #include <ossim/imaging/ossimImageDataFactory.h> #include <ossim/projection/ossimProjectionFactoryRegistry.h> @@ -75,6 +75,14 @@ ossimRefPtr<ossimImageData> ossimImageToPlaneNormalFilter::getTile( if(!input||(input->getDataObjectStatus()==OSSIM_EMPTY)||!input->getBuf()) { + if(tileRect.completely_within(theInputBounds)) + { + initializeTile(); + theTile->validate(); + theTile->setImageRectangle(tileRect); + return theTile.get(); + } + return theBlankTile; } @@ -104,11 +112,22 @@ ossimRefPtr<ossimImageData> ossimImageToPlaneNormalFilter::getTile( return theTile; } +void ossimImageToPlaneNormalFilter::initializeTile() +{ + double* x = static_cast<double*>(theTile->getBuf(0)); + double* y = static_cast<double*>(theTile->getBuf(1)); + double* z = static_cast<double*>(theTile->getBuf(2)); + + if(x) std::fill(x, x+theTile->getSizePerBand(), 0.0); + if(y) std::fill(y, y+theTile->getSizePerBand(), 0.0); + if(z) std::fill(z, z+theTile->getSizePerBand(), 1.0); +} void ossimImageToPlaneNormalFilter::initialize() { if(theInputConnection) { + theInputBounds = theInputConnection->getBoundingRect(); theTile = ossimImageDataFactory::instance()->create(this, this); theBlankTile = (ossimImageData*)(theTile->dup()); theTile->initialize(); @@ -380,7 +399,8 @@ double ossimImageToPlaneNormalFilter::getSmoothnessFactor()const void ossimImageToPlaneNormalFilter::setProperty(ossimRefPtr<ossimProperty> property) { ossimString name = property->getName(); - if(name == "smoothnessFactor") + if((name == "smoothnessFactor")|| + (name == "gain")) { theSmoothnessFactor = property->valueToString().toDouble(); initialize(); @@ -408,9 +428,10 @@ void ossimImageToPlaneNormalFilter::setProperty(ossimRefPtr<ossimProperty> prope ossimRefPtr<ossimProperty> ossimImageToPlaneNormalFilter::getProperty(const ossimString& name)const { - if(name == "smoothnessFactor") + if((name == "smoothnessFactor")|| + (name == "gain")) { - ossimNumericProperty* prop = new ossimNumericProperty(name, ossimString::toString(theSmoothnessFactor), .0001, 40); + ossimNumericProperty* prop = new ossimNumericProperty("gain", ossimString::toString(theSmoothnessFactor), .0001, 40); prop->setCacheRefreshBit(); return prop; } @@ -439,7 +460,7 @@ ossimRefPtr<ossimProperty> ossimImageToPlaneNormalFilter::getProperty(const ossi void ossimImageToPlaneNormalFilter::getPropertyNames(std::vector<ossimString>& propertyNames)const { ossimImageSourceFilter::getPropertyNames(propertyNames); - propertyNames.push_back("smoothnessFactor"); + propertyNames.push_back("gain"); propertyNames.push_back("xscale"); propertyNames.push_back("yscale"); propertyNames.push_back("autoTrackScaleFlag"); diff --git a/Utilities/otbossim/src/ossim/imaging/ossimNitf20Writer.cpp b/Utilities/otbossim/src/ossim/imaging/ossimNitf20Writer.cpp index 72c393092d459ca6e78ffd2acc2af26cea8dd9e2..507e1461d4b6e51829e0c2663bfae955063b0418 100644 --- a/Utilities/otbossim/src/ossim/imaging/ossimNitf20Writer.cpp +++ b/Utilities/otbossim/src/ossim/imaging/ossimNitf20Writer.cpp @@ -510,7 +510,7 @@ bool ossimNitf20Writer::writeBlockBandSequential() int imageHeaderEnd = theOutputStream->tellp(); int imageHeaderSize = imageHeaderEnd - imageHeaderStart; - ossimIpt ul = rect.ul(); + // ossimIpt ul = rect.ul(); ossimRefPtr<ossimImageData> data = theInputConnection->getNextTile(); ossim_uint64 tileNumber = 0; ossimEndian endian; diff --git a/Utilities/otbossim/src/ossim/imaging/ossimNitfTileSource.cpp b/Utilities/otbossim/src/ossim/imaging/ossimNitfTileSource.cpp index ffbdbfb0d5d4b66ad9259997495a8afcde28356f..cddc0968bf5c196e20ae0ac526fa76b02459988b 100644 --- a/Utilities/otbossim/src/ossim/imaging/ossimNitfTileSource.cpp +++ b/Utilities/otbossim/src/ossim/imaging/ossimNitfTileSource.cpp @@ -39,11 +39,6 @@ #include <ossim/support_data/ossimNitfStdidcTag.h> #include <ossim/support_data/ossimNitfVqCompressionHeader.h> - -#if defined(JPEG_DUAL_MODE_8_12) -#undef JPEG_DUAL_MODE_8_12 -#endif - #if defined(JPEG_DUAL_MODE_8_12) #include <ossim/imaging/ossimNitfTileSource_12.h> #endif diff --git a/Utilities/otbossim/src/ossim/imaging/ossimNitfTileSource_12.cpp b/Utilities/otbossim/src/ossim/imaging/ossimNitfTileSource_12.cpp index b6b882deac91249505e66ed5c610598b708e6371..55be3030c6bbb450d7035e91fc4a1a7acdf8db6f 100644 --- a/Utilities/otbossim/src/ossim/imaging/ossimNitfTileSource_12.cpp +++ b/Utilities/otbossim/src/ossim/imaging/ossimNitfTileSource_12.cpp @@ -16,10 +16,6 @@ //#if defined(JPEG_DUAL_MODE_8_12) #include <fstream> -#if defined(JPEG_DUAL_MODE_8_12) -#undef JPEG_DUAL_MODE_8_12 -#endif - #if defined(JPEG_DUAL_MODE_8_12) #include <jpeg12/jpeglib.h> diff --git a/Utilities/otbossim/src/ossim/imaging/ossimSFIMFusion.cpp b/Utilities/otbossim/src/ossim/imaging/ossimSFIMFusion.cpp index 0ab86a323a65804f24e91ab2b00effb21ee69869..c63979a9a300910a16146830f257b12f652c2dc1 100644 --- a/Utilities/otbossim/src/ossim/imaging/ossimSFIMFusion.cpp +++ b/Utilities/otbossim/src/ossim/imaging/ossimSFIMFusion.cpp @@ -6,7 +6,7 @@ // Author: Garrett Potts // //******************************************************************* -// $Id: ossimSFIMFusion.cpp 19860 2011-07-22 12:23:23Z gpotts $ +// $Id: ossimSFIMFusion.cpp 20061 2011-09-07 16:46:16Z gpotts $ #include <ossim/imaging/ossimSFIMFusion.h> #include <ossim/matrix/newmat.h> #include <ossim/matrix/newmatio.h> @@ -206,10 +206,10 @@ void ossimSFIMFusion::initialize() theIntensityConnection->getObject())); theHighPassFilter->connectMyInputTo(0, PTR_CAST(ossimConnectableObject, theIntensityConnection->getObject())); + adjustableParametersChanged(); setFilters(); theLowPassFilter->initialize(); theHighPassFilter->initialize(); - if(theAutoAdjustScales) { if(theInputConnection && theIntensityConnection) @@ -345,21 +345,27 @@ ossimRefPtr<ossimProperty> ossimSFIMFusion::getProperty(const ossimString& name) { if(name == "low_pass_kernel_width") { - return new ossimNumericProperty(name, + ossimNumericProperty* prop = new ossimNumericProperty(name, ossimString::toString(computeParameterOffset(LOW_PASS_WIDTH_OFFSET)), getParameterCenter(LOW_PASS_WIDTH_OFFSET)-getParameterSigma(LOW_PASS_WIDTH_OFFSET), getParameterCenter(LOW_PASS_WIDTH_OFFSET)+getParameterSigma(LOW_PASS_WIDTH_OFFSET)); + prop->setCacheRefreshBit(); + return prop; } else if(name == "high_pass_gain") { - return new ossimNumericProperty(name, + ossimNumericProperty* prop = new ossimNumericProperty(name, ossimString::toString(computeParameterOffset(HIGH_PASS_GAIN_OFFSET)), getParameterCenter(HIGH_PASS_GAIN_OFFSET)-getParameterSigma(HIGH_PASS_GAIN_OFFSET), getParameterCenter(HIGH_PASS_GAIN_OFFSET)+getParameterSigma(HIGH_PASS_GAIN_OFFSET)); + prop->setCacheRefreshBit(); + return prop; } else if(name=="auto_adjust_scales") { - return new ossimBooleanProperty(name,theAutoAdjustScales); + ossimBooleanProperty* prop = new ossimBooleanProperty(name,theAutoAdjustScales); + prop->setCacheRefreshBit(); + return prop; } return ossimFusionCombiner::getProperty(name); diff --git a/Utilities/otbossim/src/ossim/imaging/ossimTiffOverviewBuilder.cpp b/Utilities/otbossim/src/ossim/imaging/ossimTiffOverviewBuilder.cpp index a572d81e7b3df1f66d7e04347ed6199bd5ea6fe9..7863739fe42a57856297684f496ccde6e9e9707d 100644 --- a/Utilities/otbossim/src/ossim/imaging/ossimTiffOverviewBuilder.cpp +++ b/Utilities/otbossim/src/ossim/imaging/ossimTiffOverviewBuilder.cpp @@ -11,7 +11,7 @@ // Contains class definition for TiffOverviewBuilder // //******************************************************************* -// $Id: ossimTiffOverviewBuilder.cpp 19724 2011-06-06 21:07:15Z dburken $ +// $Id: ossimTiffOverviewBuilder.cpp 20099 2011-09-15 16:04:12Z oscarkramer $ #include <algorithm> /* for std::fill */ // #include <cstring> @@ -54,7 +54,7 @@ static ossimTrace traceDebug("ossimTiffOverviewBuilder:degug"); static const char COPY_ALL_KW[] = "copy_all_flag"; #ifdef OSSIM_ID_ENABLED -static const char OSSIM_ID[] = "$Id: ossimTiffOverviewBuilder.cpp 19724 2011-06-06 21:07:15Z dburken $"; +static const char OSSIM_ID[] = "$Id: ossimTiffOverviewBuilder.cpp 20099 2011-09-15 16:04:12Z oscarkramer $"; #endif @@ -346,7 +346,8 @@ bool ossimTiffOverviewBuilder::execute() // Since the overview file is being opened here, need to set its handler's starting res // level where the original image file left off. This is usually R1 since the original file // only has R0, but the original file may have more than R0: - ih->setStartingResLevel( m_imageHandler->getNumberOfDecimationLevels()); + if (!m_copyAllFlag) + ih->setStartingResLevel( m_imageHandler->getNumberOfDecimationLevels()); } // If mask is to be generated, need to notify both the writer and the reader of new @@ -357,7 +358,7 @@ bool ossimTiffOverviewBuilder::execute() m_maskWriter->connectMyInputTo(ih.get()); } - if ( !writeRn( ih.get(), tif, i, (i==startingResLevel) ) ) + if ( !writeRn( ih.get(), tif, i, (i==startingResLevel)&&(!m_copyAllFlag) ) ) { // Set the error... ossimSetError(getClassName(), diff --git a/Utilities/otbossim/src/ossim/imaging/ossimTiling.cpp b/Utilities/otbossim/src/ossim/imaging/ossimTiling.cpp index 8fffd48895875e0a8cc844d3cc2102c7a0aa0759..8b35f7c01a3460f91580b6bef3f509b4694b8cc2 100644 --- a/Utilities/otbossim/src/ossim/imaging/ossimTiling.cpp +++ b/Utilities/otbossim/src/ossim/imaging/ossimTiling.cpp @@ -10,7 +10,7 @@ // Description: implementation for image generator // //************************************************************************* -// $Id: ossimTiling.cpp 17170 2010-04-20 13:51:55Z gpotts $ +// $Id: ossimTiling.cpp 20103 2011-09-17 16:10:42Z dburken $ #include <sstream> #include <iomanip> @@ -40,7 +40,8 @@ ossimTiling::ossimTiling() theTotalHorizontalTiles(0), theTotalVerticalTiles(0), theTotalTiles(0), - theTileNameMask() + theTileNameMask(), + theEdgeToEdgeFlag(false) { } @@ -233,16 +234,37 @@ bool ossimTiling::next(ossimRefPtr<ossimMapProjection>& resultProjection, if(theMapProjection->isGeographic()) { - theMapProjection->setUlTiePoints( - ossimGpt(origin.lat, - origin.lon, - 0.0, - theMapProjection->origin().datum())); + if ( theEdgeToEdgeFlag ) + { + theMapProjection->setUlTiePoints( + ossimGpt( origin.lat - (deltaPerPixel.y/2.0), + origin.lon + (deltaPerPixel.x/2.0), + 0.0, + theMapProjection->origin().datum()) ); + } + else + { + theMapProjection->setUlTiePoints( + ossimGpt(origin.lat, + origin.lon, + 0.0, + theMapProjection->origin().datum())); + + } theMapProjection->setDecimalDegreesPerPixel(deltaPerPixel); } else { - theMapProjection->setUlTiePoints(ossimDpt(origin.x, origin.y)); + if ( theEdgeToEdgeFlag ) + { + theMapProjection->setUlTiePoints( + ossimDpt( origin.x + (deltaPerPixel.x/2.0), + origin.y - (deltaPerPixel.y/2.0) ) ); + } + else + { + theMapProjection->setUlTiePoints(ossimDpt(origin.x, origin.y)); + } theMapProjection->setMetersPerPixel(deltaPerPixel); } resultingBounds = ossimIrect(-(ossim_int32)thePaddingSizeInPixels.x, @@ -725,6 +747,12 @@ bool ossimTiling::saveState(ossimKeywordlist& kwl, theNumberOfBytesPerPixelPerBand, true); } + + kwl.add(prefix, + "edge_to_edge", + ossimString::toString(theEdgeToEdgeFlag), + true); + return true; } @@ -866,7 +894,12 @@ bool ossimTiling::loadState(const ossimKeywordlist& kwl, theDeltaType = ossimTilingDeltaType_PER_PIXEL; } } - + + lookup = kwl.find(prefix, "edge_to_edge"); + if ( lookup ) + { + theEdgeToEdgeFlag = ossimString::toBool(lookup); + } if (traceDebug()) { @@ -893,7 +926,9 @@ std::ostream& ossimTiling::print(std::ostream& out) const << "\ntheOutputSizeInBytes: " << theOutputSizeInBytes << "\ntheNumberOfBands: " << theNumberOfBands << "\ntheNumberOfBytesPerPixelPerBand: " << - theNumberOfBytesPerPixelPerBand << endl; + theNumberOfBytesPerPixelPerBand + << "\ntheEdgeToEdgeFlag: " << theEdgeToEdgeFlag + << "\n"; if (theMapProjection.valid()) { diff --git a/Utilities/otbossim/src/ossim/parallel/ossimJob.cpp b/Utilities/otbossim/src/ossim/parallel/ossimJob.cpp index a77cc9deccefcdeca55ef42b5177ed5cfba6836a..f1da80dd13f44615b26f0088a120ec3c92ed1e04 100644 --- a/Utilities/otbossim/src/ossim/parallel/ossimJob.cpp +++ b/Utilities/otbossim/src/ossim/parallel/ossimJob.cpp @@ -16,16 +16,18 @@ void ossimJob::setState(int value, bool on) newState = ((newState & ~value)&ossimJob_ALL); } - int oldState = 0; + int oldState = 0; + int currentState = 0; ossimRefPtr<ossimJobCallback> callback; + bool stateChangedFlag = false; { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_jobMutex); - stateChangedFlag = newState != m_state; oldState = m_state; m_state = static_cast<State>(newState); + currentState = m_state; callback = m_callback.get(); } @@ -34,22 +36,22 @@ void ossimJob::setState(int value, bool on) if(callback.valid()) { if(!(oldState&ossimJob_READY)&& - (m_state&ossimJob_READY)) + (currentState&ossimJob_READY)) { callback->ready(this); } else if(!(oldState&ossimJob_RUNNING)&& - (m_state&ossimJob_RUNNING)) + (currentState&ossimJob_RUNNING)) { callback->started(this); } else if(!(oldState&ossimJob_CANCEL)&& - (m_state&ossimJob_CANCEL)) + (currentState&ossimJob_CANCEL)) { callback->canceled(this); } else if(!(oldState&ossimJob_FINISHED)&& - (m_state&ossimJob_FINISHED)) + (currentState&ossimJob_FINISHED)) { callback->finished(this); } diff --git a/Utilities/otbossim/src/ossim/parallel/ossimJobMultiThreadQueue.cpp b/Utilities/otbossim/src/ossim/parallel/ossimJobMultiThreadQueue.cpp index ec312480d9642b1493328bfb2541a8818335041d..9c92a7143cf4775871a7e86938fcfb651b1cab47 100644 --- a/Utilities/otbossim/src/ossim/parallel/ossimJobMultiThreadQueue.cpp +++ b/Utilities/otbossim/src/ossim/parallel/ossimJobMultiThreadQueue.cpp @@ -53,6 +53,12 @@ void ossimJobMultiThreadQueue::setNumberOfThreads(ossim_uint32 nThreads) } } +ossim_uint32 ossimJobMultiThreadQueue::getNumberOfThreads() const +{ + OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_mutex); + return static_cast<ossim_uint32>( m_threadQueueList.size() ); +} + ossim_uint32 ossimJobMultiThreadQueue::numberOfBusyThreads()const { ossim_uint32 result = 0; diff --git a/Utilities/otbossim/src/ossim/projection/ossimLlxyProjection.cpp b/Utilities/otbossim/src/ossim/projection/ossimLlxyProjection.cpp index 2dd4c5af96c090f33b63a12ecbefd6c53e9c047f..056cae4e33191b3a128e5eb2782d7bb88618a2ff 100644 --- a/Utilities/otbossim/src/ossim/projection/ossimLlxyProjection.cpp +++ b/Utilities/otbossim/src/ossim/projection/ossimLlxyProjection.cpp @@ -11,7 +11,7 @@ // longitude to x / y" projection. // //******************************************************************* -// $Id: ossimLlxyProjection.cpp 19882 2011-07-30 17:45:20Z dburken $ +// $Id: ossimLlxyProjection.cpp 20060 2011-09-07 12:33:46Z gpotts $ #include <ossim/projection/ossimLlxyProjection.h> #include <ossim/elevation/ossimElevManager.h> @@ -147,8 +147,9 @@ void ossimLlxyProjection::worldToLineSample(const ossimGpt& worldPoint, void ossimLlxyProjection::lineSampleToWorld(const ossimDpt& lineSampPt, ossimGpt& worldPt) const { + worldPt.makeNan(); // Start with the origin. This will keep the origin's datum. - worldPt = theUlGpt; + worldPt.datum(theOrigin.datum()); double lat = theUlGpt.latd() - (lineSampPt.line * theDegreesPerPixel.y); double lon = theUlGpt.lond() + (lineSampPt.samp * theDegreesPerPixel.x); diff --git a/Utilities/otbossim/src/ossim/projection/ossimRS1SarModel.cpp b/Utilities/otbossim/src/ossim/projection/ossimRS1SarModel.cpp index 01b2af8a13eb71eb2fcdb73e741c4bcdd919908f..01858649ec4e30974b2fff1104e911255de68659 100644 --- a/Utilities/otbossim/src/ossim/projection/ossimRS1SarModel.cpp +++ b/Utilities/otbossim/src/ossim/projection/ossimRS1SarModel.cpp @@ -42,13 +42,19 @@ static const double EARTH_ANGULAR_VELOCITY = 7.2921151467e-05; // radians/sec static const char* IMAGING_MODE_ID[] = {"UNKNOWN", "SCN", "SCW", "SGC", "SGF", "SGX", "SLC", "SPG", "SSG","RAW","ERS"}; +//****************************************************************************** +// Default. +//****************************************************************************** +ossimRS1SarModel::ossimRS1SarModel() +: theCeosData (0), + theImagingMode (UNKNOWN_MODE) +{ + setErrorStatus(); +} //****************************************************************************** -// CONSTRUCTOR: ossimRS1SarModel(const ossimFilename& imageDir) -// // Takes a ossimFilename& directory containing support data, initializes the model, // and writes out the initial geometry file. -// //****************************************************************************** ossimRS1SarModel::ossimRS1SarModel(const ossimFilename& imageFile) : @@ -58,15 +64,17 @@ ossimRS1SarModel::ossimRS1SarModel(const ossimFilename& imageFile) static const char MODULE[] = "Constructor ossimRS1SarModel(ossimFilename)"; if (traceDebug()) CLOG << "entering..." << endl; + clearErrorStatus(); + // Parse the CEOS data files: ossimFilename dataDirName (imageFile.path()); initFromCeos(dataDirName); - - if (theImagingMode == UNKNOWN_MODE) + if(getErrorStatus() != ossimErrorCodes::OSSIM_OK) { - if (traceDebug()) CLOG << "returning with error..." << endl; return; } + if (theImagingMode == UNKNOWN_MODE) + return; // Parse the image data file for the local ORPs interpolator: if ((theImagingMode == SCN) || (theImagingMode == SCW)) @@ -99,6 +107,7 @@ ossimRS1SarModel::~ossimRS1SarModel() bool ossimRS1SarModel::loadState(const ossimKeywordlist& kwl, const char* prefix) { // NOT YET IMPLEMENTED + setErrorStatus(); return false; } @@ -108,6 +117,7 @@ bool ossimRS1SarModel::loadState(const ossimKeywordlist& kwl, const char* prefix bool ossimRS1SarModel::saveState(ossimKeywordlist& kwl, const char* prefix) const { // NOT YET IMPLEMENTED + setErrorStatus(); return false; } @@ -213,16 +223,17 @@ void ossimRS1SarModel::imagingRay(const ossimDpt& image_point, ossimEcefRay& ima default: CLOG << "ERROR: Invalid imaging mode encountered." << endl; + setErrorStatus(); } } -//****************************************************************************** -// PUBLIC METHOD: ossimRS1SarModel::phiLambda(image_point, height, is_inside_image) +//************************************************************************************************* +// PUBLIC METHOD: ossimRS1SarModel::lineSampleHeightToWorld(image_point, height, is_inside_image) // // Performs image to ground projection. -//****************************************************************************** +//************************************************************************************************* void ossimRS1SarModel::lineSampleHeightToWorld(const ossimDpt& image_point, - const double& heightMSL, + const double& height_ellip, ossimGpt& worldPt) const { static const char MODULE[] = "ossimRS1SarModel::lineSampleHeightToWorld()"; @@ -233,26 +244,7 @@ void ossimRS1SarModel::lineSampleHeightToWorld(const ossimDpt& image_point, ossimEcefRay imaging_ray; imagingRay(image_point, imaging_ray); - - // Convert MSL height to Ellipsoid height and do intersection: - worldPt = imaging_ray.intersectAboveEarthEllipsoid(0.0); - double hgt_ell = 0.0; - double delta_hgt; - int num_iters = 0; - ossimElevManager* emgr = ossimElevManager::instance(); - do - { - delta_hgt = heightMSL - worldPt.heightMSL(); - hgt_ell += delta_hgt; - worldPt = imaging_ray.intersectAboveEarthEllipsoid(hgt_ell); - ++num_iters; - } while ((fabs(delta_hgt) > MAX_ELEV_DIFF) && (num_iters < MAX_NUM_ITERS)); - - if (num_iters == MAX_NUM_ITERS) - { - ossimNotify(ossimNotifyLevel_WARN)<<MODULE<<" Exceeded max allowed number of iterations " - "solving for range arc intersection with elevation. Result may be incorrect."<<endl; - } + worldPt = imaging_ray.intersectAboveEarthEllipsoid(height_ellip); if (traceDebug()) CLOG << "returning..." << endl; } @@ -353,6 +345,7 @@ void ossimRS1SarModel::initFromCeos(const ossimFilename& fname) // Instantiate a CeosData object: theCeosData = new ossimCeosData(fname); + if(theCeosData->errorStatus() != ossimErrorCodes::OSSIM_OK) return; const dataset_sum_rec* dsr = theCeosData->dataSetSumRec(); const proc_parm_rec* ppr = theCeosData->procParmRec(); char buf[1024]; @@ -379,6 +372,7 @@ void ossimRS1SarModel::initFromCeos(const ossimFilename& fname) CLOG << "ERROR: Direction Flag: " << dsr->asc_des << " not supported" << endl; theDirectionFlag = UNKNOWN_DIRECTION; + setErrorStatus(); if (traceDebug()) CLOG << "returning with error..." << endl; return; } @@ -449,6 +443,7 @@ void ossimRS1SarModel::initFromCeos(const ossimFilename& fname) { CLOG << " ERROR:\n\tCannot open CEOS image file: " << theCeosData->imageFile() << endl; + setErrorStatus(); return; } fseek(fptr, 0, SEEK_END); @@ -763,6 +758,7 @@ void ossimRS1SarModel::establishOrpInterp() { CLOG << "ERROR: Could not open data file <" << theCeosData->imageFile() << ">" << endl; + setErrorStatus(); return; } fseek(fptr, theCeosData->imopDescRec()->desc.length, SEEK_SET); @@ -795,6 +791,7 @@ void ossimRS1SarModel::establishOrpInterp() CLOG << "\n\tERROR: Synchronization error reading image file. " << "Expected line number " << line_number+1 << " but read line number " << prefix.line_num << "." << endl; + setErrorStatus(); return; } @@ -961,6 +958,7 @@ void ossimRS1SarModel::establishOrpGrid() { CLOG << "ERROR: Could not open data file <" << theCeosData->imageFile() << ">" << endl; + setErrorStatus(); return; } fseek(fptr, theCeosData->imopDescRec()->desc.length, SEEK_SET); @@ -998,6 +996,7 @@ void ossimRS1SarModel::establishOrpGrid() CLOG << "\n\tERROR: Synchronization error reading image file. " << "Expected line number " << line_number+1 << " but read line number " << prefix.line_num << "." << endl; + setErrorStatus(); return; } diff --git a/Utilities/otbossim/src/ossim/projection/ossimSensorModelFactory.cpp b/Utilities/otbossim/src/ossim/projection/ossimSensorModelFactory.cpp index 628da6dd0226ad969e522051d8a9cfd4c004f489..1367a6ff949996f71cb759bd7032cb7c9af347d9 100644 --- a/Utilities/otbossim/src/ossim/projection/ossimSensorModelFactory.cpp +++ b/Utilities/otbossim/src/ossim/projection/ossimSensorModelFactory.cpp @@ -11,7 +11,7 @@ // Contains implementation of class ossimSensorModelFactory // //***************************************************************************** -// $Id: ossimSensorModelFactory.cpp 19682 2011-05-31 14:21:20Z dburken $ +// $Id: ossimSensorModelFactory.cpp 20089 2011-09-09 17:32:31Z gpotts $ #include <fstream> #include <algorithm> #include <ossim/projection/ossimSensorModelFactory.h> @@ -43,6 +43,7 @@ static ossimTrace traceDebug = ossimTrace("ossimSensorModelFactory:debug"); #include <ossim/projection/ossimSpot5Model.h> #include <ossim/projection/ossimBuckeyeSensor.h> #include <ossim/projection/ossimSarModel.h> +#include <ossim/projection/ossimRS1SarModel.h> #include <ossim/support_data/ossimSpotDimapSupportData.h> #include <ossim/projection/ossimNitfMapModel.h> #include <ossim/projection/ossimFcsiModel.h> @@ -187,16 +188,18 @@ ossimSensorModelFactory::createProjection(const ossimString &name) const { return new ossimApplanixEcefModel; } - if(name == STATIC_TYPE_NAME(ossimSpot5Model)) { return new ossimSpot5Model; } - if(name == STATIC_TYPE_NAME(ossimSarModel)) { return new ossimSarModel; } + if(name == STATIC_TYPE_NAME(ossimRS1SarModel)) + { + return new ossimRS1SarModel; + } //*** // ADD_MODEL: (Please leave this comment for the next programmer) @@ -245,6 +248,7 @@ ossimSensorModelFactory::getTypeNameList(std::vector<ossimString>& typeList) typeList.push_back(STATIC_TYPE_NAME(ossimFcsiModel)); typeList.push_back(STATIC_TYPE_NAME(ossimSpot5Model)); typeList.push_back(STATIC_TYPE_NAME(ossimSarModel)); + typeList.push_back(STATIC_TYPE_NAME(ossimRS1SarModel)); typeList.push_back(STATIC_TYPE_NAME(ossimBuckeyeSensor)); typeList.push_back(STATIC_TYPE_NAME(ossimSkyBoxLearSensor)); @@ -443,8 +447,14 @@ ossimProjection* ossimSensorModelFactory::createProjection( } model = 0; } - model = 0; + model = new ossimRS1SarModel(filename); + if(model->getErrorStatus()!= ossimErrorCodes::OSSIM_OK) + { + return model.release(); + } + model = 0; + ossimFilename spot5Test = geomFile; if(!spot5Test.exists()) { @@ -480,6 +490,7 @@ ossimProjection* ossimSensorModelFactory::createProjection( } model = 0; } + return model.release(); } diff --git a/Utilities/otbossim/src/ossim/support_data/ossimCeosData.cpp b/Utilities/otbossim/src/ossim/support_data/ossimCeosData.cpp index 446729cd88dd829249cbfcc401d5c90b2d4f647b..92a9c83afb7b61f22f1463cdcec1f0a1028d0b76 100644 --- a/Utilities/otbossim/src/ossim/support_data/ossimCeosData.cpp +++ b/Utilities/otbossim/src/ossim/support_data/ossimCeosData.cpp @@ -1073,8 +1073,11 @@ void ossimCeosData::loadCeosRecords() FILE* fptr = fopen(theVolDirFileName.chars(), "r"); if (!fptr) { - CLOG << " ERROR:\n\tCannot open CEOS Volume Directory file: " - << theVolDirFileName << endl; + if(traceDebug()) + { + CLOG << " ERROR:\n\tCannot open CEOS Volume Directory file: " + << theVolDirFileName << endl; + } theErrorStatus = ERROR; return; } @@ -1097,8 +1100,11 @@ void ossimCeosData::loadCeosRecords() fptr = fopen(theLeaderFileName.chars(), "r"); if (!fptr) { - CLOG << " ERROR:\n\tCannot open CEOS Leader file: " - << theLeaderFileName << endl; + if(traceDebug()) + { + CLOG << " ERROR:\n\tCannot open CEOS Leader file: " + << theLeaderFileName << endl; + } theErrorStatus = ERROR; return; } diff --git a/Utilities/otbossim/src/ossim/support_data/ossimNmeaMessageSequencer.cpp b/Utilities/otbossim/src/ossim/support_data/ossimNmeaMessageSequencer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b188f9d9c302c483d10fe533c07a241d9e18f23e --- /dev/null +++ b/Utilities/otbossim/src/ossim/support_data/ossimNmeaMessageSequencer.cpp @@ -0,0 +1,86 @@ +#include <ossim/support_data/ossimNmeaMessageSequencer.h> +#include <fstream> +#include <sstream> + +ossimNmeaMessageSequencer::ossimNmeaMessageSequencer() +:m_inputStream(0) +{ + +} + +ossimNmeaMessageSequencer::ossimNmeaMessageSequencer(const ossimFilename& file) +:m_inputStream(0) +{ + initialize(file); +} + +ossimNmeaMessageSequencer::ossimNmeaMessageSequencer(const std::string& str) +:m_inputStream(0) +{ + initialize(str); +} + + +ossimNmeaMessageSequencer::~ossimNmeaMessageSequencer() +{ + destroy(); +} + +void ossimNmeaMessageSequencer::initialize(const ossimFilename& file) +{ + destroy(); + m_inputStream = new std::ifstream(file.c_str()); +} + +void ossimNmeaMessageSequencer::initialize(const std::string& str) +{ + destroy(); + m_inputStream = new std::istringstream(str); +} + +void ossimNmeaMessageSequencer::destroy() +{ + if(m_inputStream) + { + delete m_inputStream; + m_inputStream = 0; + } +} + +bool ossimNmeaMessageSequencer::next(ossimNmeaMessage& msg) +{ + bool result = false; + + try { + msg.reset(); + msg.parseMessage(*m_inputStream); + result = true; + } + catch (...) + { + result = false; + } + + return result; +} + +bool ossimNmeaMessageSequencer::valid()const +{ + bool result = false; + + if(m_inputStream) + { + result = m_inputStream->good(); + } + + return result; +} + +void ossimNmeaMessageSequencer::reset() +{ + if(m_inputStream) + { + m_inputStream->clear(); + m_inputStream->seekg(0); + } +} diff --git a/Utilities/otbossim/src/ossim/util/ossimFileWalker.cpp b/Utilities/otbossim/src/ossim/util/ossimFileWalker.cpp index 22a1b438cccfa154baa924cdedaa4344d9789df7..24eb011eeca393fe22961372c05821bfca6df950 100644 --- a/Utilities/otbossim/src/ossim/util/ossimFileWalker.cpp +++ b/Utilities/otbossim/src/ossim/util/ossimFileWalker.cpp @@ -18,50 +18,160 @@ #include <ossim/util/ossimFileWalker.h> #include <ossim/base/ossimDirectory.h> -#include <ossim/base/ossimFilename.h> #include <ossim/base/ossimTrace.h> +#include <ossim/parallel/ossimJobQueue.h> +#include <OpenThreads/Thread> static ossimTrace traceDebug(ossimString("ossimFileWalker:debug")); ossimFileWalker::ossimFileWalker() : m_processFileCallBackPtr(0), - m_filteredExtensions(0) + m_jobQueue(new ossimJobMultiThreadQueue(new ossimJobQueue(), 1)), + m_filteredExtensions(0), + m_recurseFlag(true), + m_abortFlag(false), + m_mutex() { } -void ossimFileWalker::walk(const ossimFilename& root) const +ossimFileWalker::~ossimFileWalker() +{ + m_jobQueue = 0; // Not a leak, ref pointer. +} + +void ossimFileWalker::walk(const std::vector<ossimFilename>& files) { static const char M[] = "ossimFileWalker::walk"; if(traceDebug()) { - ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered root=" << root << "\n"; + ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered\n"; } - ossimFilename rootFile = root.expand(); - if ( rootFile.size() && rootFile.exists() ) + + if ( files.size() ) { - if (rootFile.isDir()) + std::vector<ossimFilename>::const_iterator i = files.begin(); + while ( i != files.end() ) { - walkDir(rootFile); + // Must have call back set at this point. + if ( !m_abortFlag && m_processFileCallBackPtr ) + { + ossimFilename file = (*i).expand(); + if ( file.size() && file.exists() ) + { + if ( file.isDir() ) // Directory: + { + walkDir(file); + } + else // File: + { + if ( isFiltered(file) == false ) + { + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) + << "Making the job for: " << (*i) << std::endl; + } + + // Make the job: + ossimRefPtr<ossimFileWalkerJob> job = + new ossimFileWalkerJob( m_processFileCallBackPtr, file ); + + job->setName( ossimString( file.string() ) ); + + job->setCallback( new ossimFileWalkerJobCallback() ); + + // Set the state to ready: + job->ready(); + + // Add job to the queue: + m_jobQueue->getJobQueue()->add( job.get() ); + + m_mutex.lock(); + if ( m_abortFlag ) + { + // Clear out the queue. + m_jobQueue->getJobQueue()->clear(); + + break; // Callee set our abort flag so break out of loop. + } + m_mutex.unlock(); + } + } + } + } + + ++i; + + } // while ( i != files.end() ) + + // FOREVER loop until all jobs are completed. + while (1) + { + if ( OpenThreads::Thread::microSleep(250) == 0 ) + { + if ( m_jobQueue->hasJobsToProcess() == false ) + { + break; + } + } } - else + + } // if ( files.size() ) + + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " exiting...\n"; + } +} + +void ossimFileWalker::walk(const ossimFilename& root) +{ + static const char M[] = "ossimFileWalker::walk"; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered root=" << root << "\n"; + } + + // Must have call back set at this point. + if ( !m_abortFlag && m_processFileCallBackPtr ) + { + ossimFilename rootFile = root.expand(); + if ( rootFile.size() && rootFile.exists() ) { - if ( isFiltered(rootFile) == false ) + if ( rootFile.isDir() ) { - bool recurseFlag; // Not used here but needed for call. - if ( m_processFileCallBackPtr ) + walkDir(rootFile); + + // FOREVER loop until all jobs are completed. + while (1) { - m_processFileCallBackPtr->operator()(rootFile, recurseFlag); + if ( OpenThreads::Thread::microSleep(250) == 0 ) + { + if ( m_jobQueue->hasJobsToProcess() == false ) + { + break; + } + } } } - } + else + { + // Single file no job queue needed. + if ( isFiltered(rootFile) == false ) + { + m_processFileCallBackPtr->operator()(rootFile); + } + } + } } + if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << M << " exiting...\n"; } } -bool ossimFileWalker::walkDir(const ossimFilename& dir) const +void ossimFileWalker::walkDir(const ossimFilename& dir) { static const char M[] = "ossimFileWalker::walkDir"; if(traceDebug()) @@ -70,18 +180,21 @@ bool ossimFileWalker::walkDir(const ossimFilename& dir) const << M << " entered...\n" << "processing dir: " << dir << "\n"; } - bool continueWalkFlag = true; - // List of directories in this directory... std::vector<ossimFilename> dirs; // List of files in this directory... std::vector<ossimFilename> files; - + + m_mutex.lock(); ossimDirectory d; - if ( d.open(dir) ) + bool ossimDirectoryStatus = d.open(dir); + m_mutex.unlock(); + + if ( ossimDirectoryStatus ) { // Loop to get the list of files and directories in this directory. + m_mutex.lock(); ossimFilename f; if ( d.getFirst(f) ) { @@ -101,49 +214,79 @@ bool ossimFileWalker::walkDir(const ossimFilename& dir) const d.getNext(f); } } - - // Process files first before recursing. - + m_mutex.unlock(); + //--- - // recurse is set by processFileCallback indicates recursion should stop if false. - // This typically is set false for a directory based image like a RPF a.toc. + // Process files first before recursing directories. If a file is a directory base image, + // e.g. RPF, then the callee should call ossimFileWalker::setRecurseFlag to false to + // stop us from going into sub directories. //--- - bool recurseFlag = true; - std::vector<ossimFilename>::const_iterator i = files.begin(); while (i != files.end()) { - if ( m_processFileCallBackPtr ) + if(traceDebug()) { - continueWalkFlag = m_processFileCallBackPtr->operator()(*i, recurseFlag); + ossimNotify(ossimNotifyLevel_DEBUG) << "Making the job for: " << (*i) << std::endl; } - if (continueWalkFlag == false) break; // Callee is finished... + // Make the job: + ossimRefPtr<ossimFileWalkerJob> job = + new ossimFileWalkerJob( m_processFileCallBackPtr, (*i) ); + + job->setName( ossimString( (*i).string() ) ); + + job->setCallback( new ossimFileWalkerJobCallback() ); + + // Set the state to ready: + job->ready(); + + // Add job to the queue: + m_jobQueue->getJobQueue()->add( job.get() ); + + m_mutex.lock(); + if ( m_abortFlag ) + { + // Clear out the queue. + m_jobQueue->getJobQueue()->clear(); + + break; // Callee set our abort flag so break out of loop. + } + m_mutex.unlock(); ++i; } - - if ( continueWalkFlag && recurseFlag ) + + m_mutex.lock(); + if ( !m_abortFlag && m_recurseFlag ) { // Process sub directories... i = dirs.begin(); while (i != dirs.end()) { - continueWalkFlag = walkDir( (*i) ); - - if ( continueWalkFlag == false ) break; // Callee is finished... - + m_mutex.unlock(); + walkDir( (*i) ); + m_mutex.lock(); + + if ( m_abortFlag ) + { + break; // Callee set our abort flag so break out of loop. + } ++i; } } - } + m_mutex.unlock(); + + } // if ( ossimDirectoryOpenStatus ) + + // Reset the m_recurseFlag. + m_mutex.lock(); + m_recurseFlag = true; + m_mutex.unlock(); if(traceDebug()) { - ossimNotify(ossimNotifyLevel_DEBUG) - << M << " continueWalkFlag=" << continueWalkFlag<< " exited...\n"; + ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n"; } - return continueWalkFlag; } bool ossimFileWalker::isFiltered(const ossimFilename& file) const @@ -155,6 +298,10 @@ bool ossimFileWalker::isFiltered(const ossimFilename& file) const { result = true; } + else if ( file[file.size()-1] == '~' ) + { + result = true; + } else { std::string ext = file.ext().downcase().c_str(); @@ -239,27 +386,94 @@ std::vector<std::string>& ossimFileWalker::getFilteredExtensions() void ossimFileWalker::initializeDefaultFilterList() { + m_mutex.lock(); + // Common extensions to filter out, most common first. m_filteredExtensions.push_back(std::string("ovr")); m_filteredExtensions.push_back(std::string("omd")); m_filteredExtensions.push_back(std::string("his")); - m_filteredExtensions.push_back(std::string("aux")); m_filteredExtensions.push_back(std::string("geom")); + + // The rest alphabetical. + m_filteredExtensions.push_back(std::string("aux")); + m_filteredExtensions.push_back(std::string("dbf")); m_filteredExtensions.push_back(std::string("jpw")); + m_filteredExtensions.push_back(std::string("kwl")); + m_filteredExtensions.push_back(std::string("out")); + m_filteredExtensions.push_back(std::string("prj")); + m_filteredExtensions.push_back(std::string("save")); m_filteredExtensions.push_back(std::string("sdw")); - m_filteredExtensions.push_back(std::string("tfw")); + m_filteredExtensions.push_back(std::string("shx")); m_filteredExtensions.push_back(std::string("spec")); m_filteredExtensions.push_back(std::string("statistics")); + m_filteredExtensions.push_back(std::string("tfw")); + m_filteredExtensions.push_back(std::string("tmp")); m_filteredExtensions.push_back(std::string("txt")); - m_filteredExtensions.push_back(std::string("dbf")); - m_filteredExtensions.push_back(std::string("shx")); + m_mutex.unlock(); +} - +void ossimFileWalker::setRecurseFlag(bool flag) +{ + m_mutex.lock(); + m_recurseFlag = flag; + m_mutex.unlock(); +} + +void ossimFileWalker::setAbortFlag(bool flag) +{ + m_mutex.lock(); + m_abortFlag = flag; + m_mutex.unlock(); +} + +void ossimFileWalker::setNumberOfThreads(ossim_uint32 nThreads) +{ + m_mutex.lock(); + m_jobQueue->setNumberOfThreads(nThreads); + m_mutex.unlock(); } void ossimFileWalker::registerProcessFileCallback( - ossimCallback2wRet<const ossimFilename&, bool&, bool>* cb) + ossimCallback1<const ossimFilename&>* cb) { + m_mutex.lock(); m_processFileCallBackPtr = cb; + m_mutex.unlock(); +} + +ossimFileWalker::ossimFileWalkerJob::ossimFileWalkerJob( + ossimCallback1<const ossimFilename&>* cb, + const ossimFilename& file) + : m_processFileCallBackPtr(cb), + m_file(file) +{ +} + +void ossimFileWalker::ossimFileWalkerJob::start() +{ + if ( m_processFileCallBackPtr && m_file.size() ) + { + m_processFileCallBackPtr->operator()(m_file); + } +} + +ossimFileWalker::ossimFileWalkerJobCallback::ossimFileWalkerJobCallback() + : ossimJobCallback() +{ +} + +void ossimFileWalker::ossimFileWalkerJobCallback::started(ossimJob* job) +{ + ossimJobCallback::started(job); +} + +void ossimFileWalker::ossimFileWalkerJobCallback::finished(ossimJob* job) +{ + ossimJobCallback::finished(job); +} + +void ossimFileWalker::ossimFileWalkerJobCallback::canceled(ossimJob* job) +{ + ossimJobCallback::canceled(job); } diff --git a/Utilities/otbossim/src/ossim/util/ossimImageUtil.cpp b/Utilities/otbossim/src/ossim/util/ossimImageUtil.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b2d26ef3c4bc6ac77d737109994ae870abfb5338 --- /dev/null +++ b/Utilities/otbossim/src/ossim/util/ossimImageUtil.cpp @@ -0,0 +1,1074 @@ +//---------------------------------------------------------------------------- +// File: ossimImageUtil.cpp +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +// Author: David Burken +// +// Description: ossimImageUtil class definition +// +// Utility class for processing image recursively. This is for doing things like: +// building overview, histograms, compute min/max, extract vertices. +// +//---------------------------------------------------------------------------- +// $Id$ + +#include <ossim/util/ossimImageUtil.h> +#include <ossim/base/ossimArgumentParser.h> +#include <ossim/base/ossimApplicationUsage.h> +#include <ossim/base/ossimCallback1.h> +#include <ossim/base/ossimContainerProperty.h> +#include <ossim/base/ossimDatum.h> +#include <ossim/base/ossimDatumFactoryRegistry.h> +#include <ossim/base/ossimDrect.h> +#include <ossim/base/ossimObjectFactoryRegistry.h> +#include <ossim/base/ossimEllipsoid.h> +#include <ossim/base/ossimException.h> +#include <ossim/base/ossimFilename.h> +#include <ossim/base/ossimGeoidManager.h> +#include <ossim/base/ossimGpt.h> +#include <ossim/init/ossimInit.h> +#include <ossim/base/ossimNotify.h> +#include <ossim/base/ossimPreferences.h> +#include <ossim/base/ossimProperty.h> +#include <ossim/base/ossimPropertyInterface.h> +#include <ossim/base/ossimStdOutProgress.h> +#include <ossim/base/ossimString.h> +#include <ossim/base/ossimStringProperty.h> +#include <ossim/base/ossimTrace.h> +#include <ossim/base/ossimXmlDocument.h> +#include <ossim/elevation/ossimElevManager.h> +#include <ossim/imaging/ossimFilterResampler.h> +#include <ossim/imaging/ossimHistogramWriter.h> +#include <ossim/imaging/ossimImageGeometry.h> +#include <ossim/imaging/ossimImageHandlerRegistry.h> +#include <ossim/imaging/ossimImageHistogramSource.h> +#include <ossim/imaging/ossimImageWriterFactoryRegistry.h> +#include <ossim/imaging/ossimOverviewBuilderFactoryRegistry.h> +#include <ossim/init/ossimInit.h> +#include <ossim/plugin/ossimSharedPluginRegistry.h> +#include <ossim/projection/ossimProjectionFactoryRegistry.h> +#include <ossim/support_data/ossimSupportFilesList.h> +#include <ossim/util/ossimFileWalker.h> + +#include <iomanip> +#include <string> +#include <vector> + +static std::string COPY_ALL_FLAG_KW = "copy_all_flag"; +static std::string CREATE_HISTOGRAM_KW = "create_histogram"; +static std::string CREATE_HISTOGRAM_FAST_KW = "create_histogram_fast"; +static std::string CREATE_HISTOGRAM_R0_KW = "create_histogram_r0"; +static std::string CREATE_OVERVIEWS_KW = "create_overviews"; +static std::string FILE_KW = "file"; +static std::string OUTPUT_DIRECTORY_KW = "output_directory"; +static std::string OVERVIEW_STOP_DIM_KW = "overview_stop_dimension"; +static std::string OVERVIEW_TYPE_KW = "overview_type"; +static std::string READER_PROP_KW = "reader_prop"; +static std::string REBUILD_OVERVIEWS_KW = "rebuild_overviews"; +static std::string SCAN_MIN_MAX_KW = "scan_for_min_max"; +static std::string SCAN_MIN_MAX_NULL_KW = "scan_for_min_max_null"; +static std::string THREADS_KW = "threads"; +static std::string TILE_SIZE_KW = "tile_size"; +static std::string TRUE_KW = "true"; +static std::string WRITER_PROP_KW = "writer_prop"; + +//--- +// Call back class to register with ossimFileWalker for call to +// ossimImageUtil::processFile +// +// Placed here as it is unique to this class. +//--- +class ProcessFileCB: public ossimCallback1<const ossimFilename&> +{ +public: + ProcessFileCB( + ossimImageUtil* obj, + void (ossimImageUtil::*func)(const ossimFilename&)) + : + m_obj(obj), + m_func(func) + {} + + virtual void operator()(const ossimFilename& file) const + { + (m_obj->*m_func)(file); + } + +private: + ossimImageUtil* m_obj; + void (ossimImageUtil::*m_func)(const ossimFilename& file); +}; + + +// Static trace for debugging. Use -T ossimImageUtil to turn on. +static ossimTrace traceDebug = ossimTrace("ossimImageUtil:debug"); + +ossimImageUtil::ossimImageUtil() + : + m_kwl( new ossimKeywordlist() ), + m_fileWalker(0), + m_mutex() +{ +} + +ossimImageUtil::~ossimImageUtil() +{ + if ( m_fileWalker ) + { + delete m_fileWalker; + m_fileWalker = 0; + } +} + +void ossimImageUtil::addArguments(ossimArgumentParser& ap) +{ + // Set the general usage: + ossimApplicationUsage* au = ap.getApplicationUsage(); + ossimString usageString = ap.getApplicationName(); + usageString += " [options] <file-or-directory-to-walk>"; + au->setCommandLineUsage(usageString); + + // Set the command line options: + au->addCommandLineOption("-a or --include-fullres", "Copy full res dataset to overview file as well as building reduced res sets. Option only valid with tiff overview builder. Requires -o option."); + + au->addCommandLineOption("--compression-quality", "Compression quality for TIFF JPEG takes values from 0 to 100, where 100 is best. For J2K plugin, numerically_lossless, visually_lossless, lossy"); + + au->addCommandLineOption("--compression-type", "Compression type can be: NONE, JPEG, PACKBITS, or DEFLATE"); + + au->addCommandLineOption("--create-histogram", "Computes full histogram alongside overview."); + + au->addCommandLineOption("--create-histogram-fast", "Computes a histogram in fast mode which samples partial tiles."); + + au->addCommandLineOption("--create-histogram-r0", "Forces create-histogram code to compute a histogram using r0 instead of the starting resolution for the overview builder. Can require a separate pass of R0 layer if the base image has built in overviews."); + + au->addCommandLineOption("-d", "<output_directory> Write overview to output directory specified."); + + au->addCommandLineOption("-h", "Display this information"); + + au->addCommandLineOption("--list-entries", "Lists the entries within the image"); + + au->addCommandLineOption("-o", "Creates overviews. (default=ossim_tiff_box)"); + + au->addCommandLineOption("--ot", "<overview_type> Overview type. see list at bottom for valid types. (default=ossim_tiff_box)"); + + au->addCommandLineOption("-r or --rebuild", "Rebuild overviews even if they are already present."); + + au->addCommandLineOption("--reader-prop", "Adds a property to send to the reader. format is name=value"); + + au->addCommandLineOption("-s", "Stop dimension for overviews. This controls how \nmany layers will be built. If set to 64 then the builder will stop when height and width for current level are less than or equal to 64. Note a default can be set in the ossim preferences file by setting the keyword \"overview_stop_dimension\"."); + + au->addCommandLineOption("--tile-size", "<size> Defines the tile size for overview builder. Tiff option only. Must be a multiple of 16. Size will be used in both x and y directions. Note a default can be set in your ossim preferences file by setting the key \"tile_size\"."); + + au->addCommandLineOption("--threads", "<threads> The number of threads to use. (default=1) Note a default can be set in your ossim preferences file by setting the key \"ossim_threads\"."); + + au->addCommandLineOption("--scanForMinMax", "Turns on min, max scanning when reading tiles. This option assumes the null is known."); + + au->addCommandLineOption("--scanForMinMaxNull", "Turns on min, max, null scanning when reading tiles. This option tries to find a null value which is useful for float data."); + + au->addCommandLineOption("--writer-prop", "Adds a property to send to the writer. format is name=value"); + +} // void ossimImageUtil::addArguments(ossimArgumentParser& ap) + +bool ossimImageUtil::initialize(ossimArgumentParser& ap) +{ + static const char M[] = "ossimImageUtil::initialize(ossimArgumentParser&)"; + if ( traceDebug() ) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered...\n"; + } + + bool result = true; + + if ( (ap.argc() == 1) || ap.read("-h") || ap.read("--help") ) + { + usage(ap); + + // continue_after_init to false + result = false; + } + else + { + //--- + // Start with clean options keyword list. + //--- + m_kwl->clear(); + + while ( 1 ) // While forever loop... + { + // Used throughout below: + std::string ts1; + ossimArgumentParser::ossimParameter sp1(ts1); + std::string ts2; + ossimArgumentParser::ossimParameter sp2(ts2); + ossim_uint32 readerPropKeyIndex = 0; + ossim_uint32 writerPropKeyIndex = 0; + + if (ap.read("-a") || ap.read("--include-fullres")) + { + ossimString key = WRITER_PROP_KW; + key += ossimString::toString(writerPropKeyIndex++); + std::string value = COPY_ALL_FLAG_KW; + value += "true"; + m_kwl->addPair( key.string(), value ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if(ap.read("--compression-quality", sp1)) + { + if (ts1.size()) + { + ossimString key = WRITER_PROP_KW; + key += ossimString::toString(writerPropKeyIndex++); + std::string value = ossimKeywordNames::COMPRESSION_QUALITY_KW; + value += "="; + value += ts1; + m_kwl->addPair( key.string(), value ); + } + if ( ap.argc() < 2 ) + { + break; + } + } + + if(ap.read("--compression-type", sp1)) + { + ossimString key = WRITER_PROP_KW; + key += ossimString::toString(writerPropKeyIndex++); + std::string value = ossimKeywordNames::COMPRESSION_TYPE_KW; + value += "="; + value += ts1; + m_kwl->addPair( key.string(), value ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if( ap.read("--create-histogram")) + { + m_kwl->addPair( CREATE_HISTOGRAM_KW, TRUE_KW ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if( ap.read("--create-histogram-fast")) + { + m_kwl->addPair( CREATE_HISTOGRAM_FAST_KW, TRUE_KW ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if( ap.read("--create-histogram-r0")) + { + m_kwl->addPair( CREATE_HISTOGRAM_R0_KW, TRUE_KW ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if( ap.read("-d", sp1) ) + { + m_kwl->addPair( OUTPUT_DIRECTORY_KW, ts1 ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if( ap.read("-o") ) + { + m_kwl->addPair( CREATE_OVERVIEWS_KW, TRUE_KW ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if( ap.read("--ot", sp1) ) + { + m_kwl->addPair( OVERVIEW_TYPE_KW, ts1 ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if(ap.read("-r") || ap.read("--rebuild")) + { + m_kwl->addPair( REBUILD_OVERVIEWS_KW, TRUE_KW ); + if ( ap.argc() < 2 ) + { + break; + } + } + + while(ap.read("--reader-prop", sp1)) + { + if (ts1.size()) + { + ossimString key = READER_PROP_KW; + key += ossimString::toString(readerPropKeyIndex++); + m_kwl->addPair( key.string(), ts1 ); + } + } + if ( ap.argc() < 2 ) + { + break; + } + + if( ap.read("--scanForMinMax" ) ) + { + m_kwl->addPair( SCAN_MIN_MAX_KW, TRUE_KW ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if( ap.read("--scanForMinMaxNull" ) ) + { + m_kwl->addPair( SCAN_MIN_MAX_NULL_KW, TRUE_KW ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if( ap.read("-s", sp1) ) + { + m_kwl->addPair( OVERVIEW_STOP_DIM_KW, ts1 ); + if ( ap.argc() < 2 ) + { + break; + } + } + + if ( ap.read("-tile-size", sp1)) + { + ossim_int32 tileSize = ossimString(ts1).toInt32(); + if ((tileSize % 16) == 0) + { + m_kwl->addPair( TILE_SIZE_KW, ts1 ); + } + else + { + ossimNotify(ossimNotifyLevel_NOTICE) + << M << " NOTICE:" + << "\nTile width must be a multiple of 16!" + << std::endl; + } + if ( ap.argc() < 2 ) + { + break; + } + } + + if( ap.read("--threads", sp1) ) + { + m_kwl->addPair( THREADS_KW, ts1 ); + if ( ap.argc() < 2 ) + { + break; + } + } + + while(ap.read("--writer-prop", sp1)) + { + if (ts1.size()) + { + ossimString key = WRITER_PROP_KW; + key += ossimString::toString(writerPropKeyIndex++); + m_kwl->addPair( key.string(), ts1 ); + } + } + if ( ap.argc() < 2 ) + { + break; + } + + // End of arg parsing. + ap.reportRemainingOptionsAsUnrecognized(); + if ( ap.errors() ) + { + ap.writeErrorMessages(ossimNotify(ossimNotifyLevel_NOTICE)); + std::string errMsg = "Unknown option..."; + throw ossimException(errMsg); + } + + break; // Break from while forever. + + } // End while (forever) loop. + + } // not usage + + if(ap.argc() > 1) + { + for (ossim_int32 i = 0; i < (ap.argc()-1); ++i) + { + ossimString kw = "file"; + kw += ossimString::toString(i); + std::string value = ap[i+1]; + m_kwl->addPair(kw.string(), value, true); + } + } + else + { + usage(ap); + result = false; + } + + if ( traceDebug() ) + { + ossimNotify(ossimNotifyLevel_DEBUG) + << "m_kwl:\n" << *(m_kwl.get()) << "\n" + << M << " exit result = " << (result?"true":"false") + << "\n"; + } + + return result; +} + +void ossimImageUtil::execute() +{ + static const char M[] = "ossimImageUtil::execute()"; + + if ( traceDebug() ) + { + ossimNotify(ossimNotifyLevel_DEBUG) + << M << " entered...\n"; + } + + if ( !m_fileWalker ) + { + m_fileWalker = new ossimFileWalker(); + } + + // Get the number of "file*" keywords. + ossim_uint32 fileCount = m_kwl->numberOf("file"); + + if ( fileCount ) + { + m_fileWalker->initializeDefaultFilterList(); + + m_fileWalker->setNumberOfThreads( getNumberOfThreads() ); + + ossimCallback1<const ossimFilename&>* cb = + new ProcessFileCB(this, &ossimImageUtil::processFile); + + m_fileWalker->registerProcessFileCallback(cb); + + // Wrap in try catch block as excptions can be thrown under the hood. + try + { + // Get the list of files passed to us: + std::vector<ossimFilename> files; + ossim_uint32 processedFiles = 0;; + ossim_uint32 i = 0; + while ( processedFiles < fileCount ) + { + ossimString kw = FILE_KW; + kw += ossimString::toString(i); + std::string lookup = m_kwl->findKey( kw.string() ); + if ( lookup.size() ) + { + files.push_back( ossimFilename(lookup) ); + ++processedFiles; + } + + ++i; + if ( i > (fileCount + 100) ) break; + } + + // Process the files: + m_fileWalker->walk( files ); + } + catch (const ossimException& e) + { + ossimNotify(ossimNotifyLevel_WARN) + << "Caught exception: " << e.what() << endl; + } + + // cleanup: + if ( cb ) + { + delete cb; + cb = 0; + } + + } // if ( fileCount ) + + if ( traceDebug() ) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n"; + } +} + +//--- +// This method is called back by the ossimFileWalker::walk method for each file it finds that it +// deems can be processed. +//--- +void ossimImageUtil::processFile(const ossimFilename& file) +{ + static const char M[] = "ossimImageUtil::processFile"; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) + << M << " entered...\n" << "file: " << file << "\n"; + } + + m_mutex.lock(); + ossimRefPtr<ossimImageHandler> ih = + ossimImageHandlerRegistry::instance()->open(file, true, true); + m_mutex.unlock(); + + if ( ih.valid() ) + { + if ( isDirectoryBasedImage( ih.get() ) ) + { + // Tell the walker not to recurse this directory. + m_mutex.lock(); + m_fileWalker->setRecurseFlag(false); + m_mutex.unlock(); + } + + // Set any reader props: + ossimPropertyInterface* pi = dynamic_cast<ossimPropertyInterface*>(ih.get()); + if ( pi ) setProps(pi); + + bool consumedHistogramOptions = false; + bool consumedCmmOptionsOptions = false; + + if ( createOverviews() ) + { + // Skip shape files... + if ( ih->getClassName() != "ossimOgrGdalTileSource" ) + { + createOverview(ih, consumedHistogramOptions, consumedCmmOptionsOptions); + } + } + + // Build stand alone histogram. Note the overview sequencer may have computed for us. + if ( hasHistogramOption() && !consumedHistogramOptions) + { + createHistogram( ih ); + } + } + else + { + ossimNotify(ossimNotifyLevel_WARN) << M << "\nCould not open: " << file << std::endl; + } + + if(traceDebug()) + { + // Since ossimFileWalker is threaded output the file so we know which job exited. + ossimNotify(ossimNotifyLevel_DEBUG) << M << "\nfile: " << file << "\nexited...\n"; + } +} + +// Create overview for image: +void ossimImageUtil::createOverview(ossimRefPtr<ossimImageHandler>& ih, + bool& consumedHistogramOptions, + bool& /* consumedCmmOptions */) +{ + static const char M[] = "ossimImageUtil::createOverview #1"; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered...\n"; + } + + if ( ih.valid() ) + { + // Get the entry list: + std::vector<ossim_uint32> entryList; + ih->getEntryList(entryList); + + bool useEntryIndex = false; + if ( entryList.size() ) + { + if ( (entryList.size() > 1) || (entryList[0] != 0) ) useEntryIndex = true; + } + + // Create the overview builder: + ossimString overviewType; + getOverviewType(overviewType.string()); + ossimRefPtr<ossimOverviewBuilderBase> ob = + ossimOverviewBuilderFactoryRegistry::instance()->createBuilder(overviewType); + if ( ob.valid() ) + { + // Set up any overview builder options that don't involve histograms. + ossimPropertyInterface* pi = dynamic_cast<ossimPropertyInterface*>( ob.get() ); + if ( pi ) setProps(pi); + + ossim_uint32 stopDimension = getOverviewStopDimension(); + if ( stopDimension ) ob->setOverviewStopDimension(stopDimension); + + ob->setScanForMinMax( scanForMinMax() ); + + ob->setScanForMinMaxNull( scanForMinMaxNull() ); + + for(ossim_uint32 idx = 0; idx < entryList.size(); ++idx) + { + createOverview(ih, ob, entryList[idx], useEntryIndex, consumedHistogramOptions); + } + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << "ERROR:\nCould not create builder for: "<< overviewType << std::endl; + outputOverviewWriterTypes(); + } + } + + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n"; + } +} + +// Create overview for entry: +void ossimImageUtil::createOverview(ossimRefPtr<ossimImageHandler>& ih, + ossimRefPtr<ossimOverviewBuilderBase>& ob, + ossim_uint32 entry, + bool useEntryIndex, + bool& consumedHistogramOptions) +{ + static const char M[] = "ossimImageUtil::createOverview #2"; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered...\n"; + } + + if ( ih.valid() && ob.valid() ) + { + ossimFilename outputFile = + ih->getFilenameWithThisExtension(ossimString(".ovr"), useEntryIndex); + + if ( rebuildOverviews() ) + { + ih->closeOverview(); + if ( outputFile.exists() ) + { + outputFile.remove(); + } + } + + //--- + // Set create histogram code... + // + // Notes: + // 1) Must put this logic after any removal of external overview file. + // + // 2) Base file could have built in overviews, e.g. jp2 files. So the sequensor could + // start at R6 even if there is no external overview file. + // + // 3) If user want the histogram from R0 the overview builder can do as long as + // ossimImageHandler::getNumberOfDecimationLevels returns 1. If we are starting + // overview building at R6 then we must do the create histogram in a separate path. + //--- + ossimHistogramMode histoMode = OSSIM_HISTO_MODE_UNKNOWN; + if ( createHistogram() || + ( createHistogramR0() && ( ih->getNumberOfDecimationLevels() == 1 ) ) ) + { + histoMode = OSSIM_HISTO_MODE_NORMAL; + } + else if ( createHistogramFast() ) + { + histoMode = OSSIM_HISTO_MODE_FAST; + } + + if ( histoMode != OSSIM_HISTO_MODE_UNKNOWN ) + { + consumedHistogramOptions = true; + ob->setHistogramMode(histoMode); + } + + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << "Histogram mode: " << histoMode << "\n"; + } + + ossimNotify(ossimNotifyLevel_NOTICE) + << "Creating overviews for file: " << ih->getFilename() << std::endl; + + if (useEntryIndex) + { + ih->setCurrentEntry(entry); + + ossimNotify(ossimNotifyLevel_NOTICE) << "entry number: "<< entry << std::endl; + } + + ob->setOutputFile(outputFile); + ob->setInputSource(ih.get()); + + // Create the overview for this entry in this file: + if ( ob->execute() == false ) + { + ossimNotify(ossimNotifyLevel_WARN) + << "Error returned creating overviews for file: " << ih->getFilename() << std::endl; + } + } + + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n"; + } +} + +void ossimImageUtil::createHistogram(ossimRefPtr<ossimImageHandler>& ih) +{ + static const char M[] = "ossimImageUtil::createHistogram #1"; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered...\n"; + } + + if ( ih.valid() ) + { + // Get the entry list: + std::vector<ossim_uint32> entryList; + ih->getEntryList(entryList); + + bool useEntryIndex = false; + if ( entryList.size() ) + { + if ( (entryList.size() > 1) || (entryList[0] != 0) ) useEntryIndex = true; + } + + for(ossim_uint32 idx = 0; idx < entryList.size(); ++idx) + { + createHistogram(ih, entryList[idx], useEntryIndex); + } + } + + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n"; + } +} + +// Create histogram for entry: +void ossimImageUtil::createHistogram(ossimRefPtr<ossimImageHandler>& ih, + ossim_uint32 entry, + bool useEntryIndex) +{ + static const char M[] = "ossimImageUtil::createHistogram #2"; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered...\n"; + } + + if ( ih.valid() ) + { + ossimNotify(ossimNotifyLevel_NOTICE) + << "Computing histogram for file: " << ih->getFilename() << std::endl; + + if (useEntryIndex) + { + ih->setCurrentEntry(entry); + ossimNotify(ossimNotifyLevel_NOTICE) << "entry number: "<< entry << std::endl; + } + + ossimFilename outputFile = + ih->getFilenameWithThisExtension(ossimString(".his"), useEntryIndex); + + ossimRefPtr<ossimImageHistogramSource> histoSource = new ossimImageHistogramSource; + ossimRefPtr<ossimHistogramWriter> writer = new ossimHistogramWriter; + + histoSource->setMaxNumberOfRLevels(1); // Currently hard coded... + +#if 0 /* TODO tmp drb */ + if( !ossim::isnan(histoMin) ) + { + histoSource->setMinValueOverride(histoMin); + } + + if( !ossim::isnan(histoMax) ) + { + histoSource->setMaxValueOverride(histoMax); + } + + if(histoBins > 0) + { + histoSource->setNumberOfBinsOverride(histoBins); + } +#endif + + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << "Histogram mode: " << getHistogramMode() << "\n"; + } + + // Connect histogram source to image handler. + histoSource->setComputationMode( getHistogramMode() ); + histoSource->connectMyInputTo(0, ih.get() ); + histoSource->enableSource(); + + // Connect writer to histogram source. + writer->connectMyInputTo(0, histoSource.get()); + writer->setFilename(outputFile); + theStdOutProgress.setFlushStreamFlag(true); + writer->addListener(&theStdOutProgress); + + // Compute... + writer->execute(); + + writer=0; + + } // if ( ih.valid() ) + + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n"; + } +} + +void ossimImageUtil::usage(ossimArgumentParser& ap) +{ + // Add global usage options. + ossimInit::instance()->addOptions(ap); + + // Set app name. + ap.getApplicationUsage()->setApplicationName(ap.getApplicationName()); + + // Add options. + addArguments(ap); + + // Write usage. + ap.getApplicationUsage()->write(ossimNotify(ossimNotifyLevel_INFO)); + + ossimNotify(ossimNotifyLevel_INFO) + << " examples:\n\n" + << std::endl; + + outputOverviewWriterTypes(); +} + +// Private method: +void ossimImageUtil::outputOverviewWriterTypes() const +{ + ossimNotify(ossimNotifyLevel_NOTICE) + << "\nValid overview types: " << std::endl; + + std::vector<ossimString> outputType; + + ossimOverviewBuilderFactoryRegistry::instance()->getTypeNameList(outputType); + std::copy(outputType.begin(), + outputType.end(), + std::ostream_iterator<ossimString>(ossimNotify(ossimNotifyLevel_NOTICE), "\t\n")); +} + +// Private method: +bool ossimImageUtil::isDirectoryBasedImage(const ossimImageHandler* ih) const +{ + bool result = false; + if ( ih ) + { + // Get the image handler name. + ossimString imageHandlerName = ih->getClassName(); + if ( (imageHandlerName == "ossimAdrgTileSource") || + (imageHandlerName == "ossimCibCadrgTileSource") ) + { + result = true; + } + } + return result; +} + +// Private method: +bool ossimImageUtil::createOverviews() const +{ + bool result = false; + std::string lookup = m_kwl->findKey( CREATE_OVERVIEWS_KW ); + if ( lookup.size() ) + { + result = ossimString(lookup).toBool(); + } + return result; +} + +bool ossimImageUtil::rebuildOverviews() const +{ + bool result = false; + std::string lookup = m_kwl->findKey( REBUILD_OVERVIEWS_KW ); + if ( lookup.size() ) + { + result = ossimString(lookup).toBool(); + } + return result; +} + +bool ossimImageUtil::scanForMinMax() const +{ + bool result = false; + std::string lookup = m_kwl->findKey( SCAN_MIN_MAX_KW ); + if ( lookup.size() ) + { + result = ossimString(lookup).toBool(); + } + return result; +} + +bool ossimImageUtil::scanForMinMaxNull() const +{ + bool result = false; + std::string lookup = m_kwl->findKey( SCAN_MIN_MAX_NULL_KW ); + if ( lookup.size() ) + { + result = ossimString(lookup).toBool(); + } + return result; +} + +void ossimImageUtil::getOverviewType(std::string& type) const +{ + std::string lookup = m_kwl->findKey(OVERVIEW_TYPE_KW); + if ( lookup.size() ) + { + type = lookup; + } + else + { + type = "ossim_tiff_box"; // default + } +} + +// +void ossimImageUtil::setProps(ossimPropertyInterface* pi) const +{ + if ( pi ) + { + ossimString baseKey; + if ( dynamic_cast<ossimImageHandler*>(pi) ) + { + baseKey = READER_PROP_KW; + } + else + { + baseKey = WRITER_PROP_KW; + } + + ossim_uint32 propCount = m_kwl->numberOf( baseKey.c_str() ); + if ( propCount ) + { + ossim_uint32 foundProps = 0; + ossim_int32 index = 0; + + // (propCount+100) is to allow for holes like reader_prop0, reader_prop2... + while ( (foundProps < propCount) && (index < (propCount+100) ) ) + { + ossimString key = baseKey; + key += ossimString::toString(index); + std::string lookup = m_kwl->findKey( key.string() ); + if ( lookup.size() ) + { + ossimString value = lookup; + std::vector<ossimString> v = value.split("="); + if (v.size() == 2) + { + ossimString propertyName = v[0]; + ossimString propertyValue = v[1]; + ossimRefPtr<ossimProperty> p = + new ossimStringProperty(propertyName, propertyValue); + pi->setProperty( p ); + } + ++foundProps; + } + ++index; + } + } + } +} + +ossim_uint32 ossimImageUtil::getOverviewStopDimension() const +{ + ossim_uint32 result = 0; + std::string lookup = m_kwl->findKey( OVERVIEW_STOP_DIM_KW ); + if ( lookup.size() ) + { + result = ossimString(lookup).toUInt32(); + } + return result; +} + +bool ossimImageUtil::createHistogram() const +{ + bool result = false; + std::string lookup = m_kwl->findKey( CREATE_HISTOGRAM_KW ); + if ( lookup.size() ) + { + result = ossimString(lookup).toBool(); + } + return result; +} + +bool ossimImageUtil::createHistogramFast() const +{ + bool result = false; + std::string lookup = m_kwl->findKey( CREATE_HISTOGRAM_FAST_KW ); + if ( lookup.size() ) + { + result = ossimString(lookup).toBool(); + } + return result; +} + +bool ossimImageUtil::createHistogramR0() const +{ bool result = false; + std::string lookup = m_kwl->findKey( CREATE_HISTOGRAM_R0_KW ); + if ( lookup.size() ) + { + result = ossimString(lookup).toBool(); + } + return result; +} + +bool ossimImageUtil::hasHistogramOption() const +{ + return ( createHistogram() || createHistogramFast() || createHistogramR0() ); +} + +ossimHistogramMode ossimImageUtil::getHistogramMode() const +{ + ossimHistogramMode result = OSSIM_HISTO_MODE_UNKNOWN; + if ( createHistogram() || createHistogramR0() ) + { + result = OSSIM_HISTO_MODE_NORMAL; + } + else if ( createHistogramFast() ) + { + result = OSSIM_HISTO_MODE_FAST; + } + return result; +} + +ossim_uint32 ossimImageUtil::getNumberOfThreads() const +{ + ossim_uint32 result = 1; + std::string lookup = m_kwl->findKey( THREADS_KW ); + if ( lookup.size() ) + { + result = ossimString(lookup).toUInt32(); + } + else + { + // Look in ossim preferences if keyword is not set above. + const char* str = ossimPreferences::instance()->findPreference("ossim_threads"); + if ( str ) + { + result = ossimString(str).toUInt32(); + } + } + return result; +} + diff --git a/Utilities/otbossim/src/ossim/version-config.cpp b/Utilities/otbossim/src/ossim/version-config.cpp index 9c5e5b6cf31d2fb6e6004f7e779f5fad0264ab3a..5f6c3e3169d6ef33c1e55fd5bcb77927190f3f1d 100644 --- a/Utilities/otbossim/src/ossim/version-config.cpp +++ b/Utilities/otbossim/src/ossim/version-config.cpp @@ -55,6 +55,7 @@ int main(int argc, char* argv[]) std::string releaseVersion = "0"; std::string::size_type pos1 = std::string::npos; std::string::size_type pos2 = std::string::npos; + std::string::size_type pos3 = std::string::npos; pos1 = versionNumber.find(".", 0); if(pos1 != std::string::npos) diff --git a/Utilities/otbossim/src/ossim/video/ossimVideoImageSource.cpp b/Utilities/otbossim/src/ossim/video/ossimVideoImageSource.cpp index 0c7eb2188a7e3056290ecf32208abe572a73ba53..780ee506f64d24f3c2606ea19f1726557bac3d40 100644 --- a/Utilities/otbossim/src/ossim/video/ossimVideoImageSource.cpp +++ b/Utilities/otbossim/src/ossim/video/ossimVideoImageSource.cpp @@ -29,8 +29,8 @@ ossimVideoImageSource::ossimVideoImageSource() //! Constructor used when accessing a common video object (versus instantiating a new video for //! each frame. //************************************************************************************************* -ossimVideoImageSource::ossimVideoImageSource(ossimVideoSource* video, - const double& frame_time_seconds) +ossimVideoImageSource::ossimVideoImageSource(ossimVideoSource* /* video */, + const double& frame_time_seconds) : m_frameTime (-1.0) { initialize();