From 236544b1ca681985b49c7ce4b46a8da78c751c7a Mon Sep 17 00:00:00 2001 From: Aurelien Bricier <aurelien.bricier@c-s.fr> Date: Mon, 26 Sep 2011 11:02:35 +0200 Subject: [PATCH] OSSIM: update ossim to r20113 --- .../include/ossim/base/ossimCallback1.h | 80 ++ .../include/ossim/base/ossimColumnVector3d.h | 19 +- .../include/ossim/base/ossimEllipsoid.h | 2 +- .../include/ossim/base/ossimFilename.h | 11 +- .../include/ossim/base/ossimGzStream.h | 2 +- .../include/ossim/base/ossimKeywordlist.h | 6 +- .../ossim/elevation/ossimElevManager.h | 19 + .../elevation/ossimImageElevationDatabase.h | 15 +- .../elevation/ossimTiledElevationDatabase.h | 12 +- .../ossim/imaging/ossimImageGeometry.h | 5 + .../imaging/ossimImageToPlaneNormalFilter.h | 6 +- .../include/ossim/imaging/ossimTiling.h | 8 +- .../otbossim/include/ossim/kbool/graph.h | 2 +- .../otbossim/include/ossim/kbool/graphlst.h | 2 +- .../otbossim/include/ossim/kbool/lpoint.h | 2 +- .../ossim/parallel/ossimJobMultiThreadQueue.h | 1 + .../ossim/projection/ossimRS1SarModel.h | 11 +- .../ossim/projection/ossimSensorModel.h | 6 +- .../support_data/ossimNmeaMessageSequencer.h | 27 + .../include/ossim/util/ossimFileWalker.h | 148 ++- .../include/ossim/util/ossimImageUtil.h | 176 +++ Utilities/otbossim/src/ossim/CMakeLists.txt | 5 +- .../src/ossim/base/ossimDatumFactory.inc | 3 +- .../src/ossim/base/ossimDirectory.cpp | 14 +- .../otbossim/src/ossim/base/ossimFilename.cpp | 68 +- .../src/ossim/base/ossimGeoidManager.cpp | 6 +- .../otbossim/src/ossim/base/ossimGpt.cpp | 14 +- .../otbossim/src/ossim/base/ossimGzStream.cpp | 2 +- .../otbossim/src/ossim/base/ossimIpt.cpp | 4 +- .../ossim/base/ossimLagrangeInterpolator.cpp | 2 +- .../otbossim/src/ossim/base/ossimObject.cpp | 4 +- .../src/ossim/base/ossimWgs72Datum.cpp | 4 +- .../src/ossim/elevation/ossimElevManager.cpp | 36 +- .../elevation/ossimImageElevationDatabase.cpp | 51 +- .../elevation/ossimTiledElevationDatabase.cpp | 60 +- .../src/ossim/font/ossimFreeTypeFont.cpp | 10 +- .../imaging/ossimBumpShadeTileSource.cpp | 4 +- .../src/ossim/imaging/ossimImageGeometry.cpp | 49 +- .../imaging/ossimImageToPlaneNormalFilter.cpp | 31 +- .../src/ossim/imaging/ossimNitf20Writer.cpp | 2 +- .../src/ossim/imaging/ossimNitfTileSource.cpp | 5 - .../ossim/imaging/ossimNitfTileSource_12.cpp | 4 - .../src/ossim/imaging/ossimSFIMFusion.cpp | 16 +- .../imaging/ossimTiffOverviewBuilder.cpp | 9 +- .../src/ossim/imaging/ossimTiling.cpp | 55 +- .../otbossim/src/ossim/parallel/ossimJob.cpp | 14 +- .../parallel/ossimJobMultiThreadQueue.cpp | 6 + .../ossim/projection/ossimLlxyProjection.cpp | 5 +- .../src/ossim/projection/ossimRS1SarModel.cpp | 59 +- .../projection/ossimSensorModelFactory.cpp | 19 +- .../src/ossim/support_data/ossimCeosData.cpp | 14 +- .../ossimNmeaMessageSequencer.cpp | 86 ++ .../src/ossim/util/ossimFileWalker.cpp | 304 ++++- .../src/ossim/util/ossimImageUtil.cpp | 1074 +++++++++++++++++ .../otbossim/src/ossim/version-config.cpp | 1 + .../src/ossim/video/ossimVideoImageSource.cpp | 4 +- 56 files changed, 2267 insertions(+), 337 deletions(-) create mode 100644 Utilities/otbossim/include/ossim/base/ossimCallback1.h create mode 100644 Utilities/otbossim/include/ossim/support_data/ossimNmeaMessageSequencer.h create mode 100644 Utilities/otbossim/include/ossim/util/ossimImageUtil.h create mode 100644 Utilities/otbossim/src/ossim/support_data/ossimNmeaMessageSequencer.cpp create mode 100644 Utilities/otbossim/src/ossim/util/ossimImageUtil.cpp diff --git a/Utilities/otbossim/include/ossim/base/ossimCallback1.h b/Utilities/otbossim/include/ossim/base/ossimCallback1.h new file mode 100644 index 0000000000..37690c5e8c --- /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 7cda6fce75..52bde06064 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 0630fcd6bb..3e94063544 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 ce8ba94c38..04de672fa3 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 f338cbb0d6..133c827a19 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 8122c5df33..7591650cbb 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 49b81eebad..2b4a08719f 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 e215d5b051..9c3a0f09dc 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 1f9227c40a..5c33c01989 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 87becd5c0d..ce80ea8313 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 ed33f31a35..4de7145ebc 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 0d9cb34d12..21acd77154 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 7c51be019a..4aaf038a3e 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 51976ebe6b..16a718ed3f 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 441fcd9164..b14ed83147 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 27e61fc423..43c08d0bde 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 1cea8ef7fe..534760c7bc 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 945c1af5e5..cb66fe2766 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 0000000000..37bb387f8f --- /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 0ccb884a2e..77e7672811 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 0000000000..9bed38d14b --- /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 40b79c176e..abc0a96598 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 0c2a304aa6..60babb19e3 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 18b98ba5d6..17e17e95a3 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 9c2eaed1ff..925e1bef4b 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 d4f7cfd1e5..0f12804c36 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 1d982d8f51..1c58e5743f 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 fccd52b6a0..b98da3d537 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 9dfde6fd69..f1ca7d8b2b 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 a1622e1042..2c773560cb 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 89fa908d52..60843e6adf 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 76f931bd52..baa0b6fcd0 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 6de6fec219..d973192bf6 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 609b095284..60b4ee1109 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 e0befaf9bb..bca0a46819 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 e61d02293c..d9a60fa291 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 8277cb6a07..a426c6e9da 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 f354a7b175..22c113b605 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 ce4fea7e54..bc106b8a52 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 72c393092d..507e1461d4 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 ffbdbfb0d5..cddc0968bf 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 b6b882deac..55be3030c6 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 0ab86a323a..c63979a9a3 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 a572d81e7b..7863739fe4 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 8fffd48895..8b35f7c01a 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 a77cc9decc..f1da80dd13 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 ec312480d9..9c92a7143c 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 2dd4c5af96..056cae4e33 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 01b2af8a13..01858649ec 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 628da6dd02..1367a6ff94 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 446729cd88..92a9c83afb 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 0000000000..b188f9d9c3 --- /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 22a1b438cc..24eb011eec 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 0000000000..b2d26ef3c4 --- /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 9c5e5b6cf3..5f6c3e3169 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 0c7eb2188a..780ee506f6 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(); -- GitLab