00001
00070 #ifndef INC_SPATMOD_IMAGETARGETFILE_H
00071 #define INC_SPATMOD_IMAGETARGETFILE_H
00072
00073 #ifndef INC_SPATMOD_IMAGETARGET_H
00074 #include <spatmod/imagetarget.h>
00075 #endif
00076
00077 #ifndef INC_SPATMOD_IMAGEFORMAT_H
00078 #include <spatmod/imageformat.h>
00079 #endif
00080
00081 #ifndef INC_MI32_FILEPATH_H
00082 #include <mi32/filepath.h>
00083 #endif
00084
00085 #ifndef INC_MI32_RECT_H
00086 #include <mi32/rect.h>
00087 #endif
00088
00089 #ifndef INC_MI32_DELEGATE_H
00090 #include <mi32/delegate.h>
00091 #endif
00092
00093 class STATUSCONTEXT;
00094
00095 namespace SPATMOD {
00096 namespace IMAGE {
00097
00098
00099
00101 class TARGET_FILE : public TARGET {
00102 public:
00103
00105 enum GEOFORMATS {
00106 GEOFORMAT_None = 0x0000,
00107 GEOFORMAT_ArcWorld = 0x0001,
00108 GEOFORMAT_KML = 0x0002,
00109 GEOFORMAT_AUX = 0x0004,
00110 GEOFORMAT_ALL = 0x00FF,
00111 GEOFORMAT_ForceKML = 0x8000
00112 };
00113
00115 class TILEPARMS {
00116 public:
00117
00119 TILEPARMS ();
00120
00124 typedef fastdelegate::FastDelegate<ERRVALUE(INT32 TileColumn, INT32 TileRow, FILEPATH&, const LRECT2D& extent)> DELEGATE_ONTILEADD;
00125
00129 void SetAutoTrim (
00130 bool AutoTrim = true
00131 ) { m_AutoTrim = AutoTrim; }
00132
00134 void SetDelegateOnTileAdd (
00135 DELEGATE_ONTILEADD delegate
00136 ) { m_DelegateOnTileAdd = delegate; }
00137
00139 void SetDelegateOnTileEnd (
00140 DELEGATE_ERRVALUE_NOPARMS delegate
00141 ) { m_DelegateOnTileEnd = delegate; }
00142
00143 void SetTileDimensions (
00144 double ColumnsPerTile,
00145 double RowsPerTile
00146 ) { m_ColumnsPerTile = ColumnsPerTile; m_RowsPerTile = RowsPerTile; }
00147
00148 private:
00149 #ifndef GENERATING_DOXYGEN_OUTPUT
00150
00151 DELEGATE_ONTILEADD m_DelegateOnTileAdd;
00152 DELEGATE_ERRVALUE_NOPARMS m_DelegateOnTileEnd;
00153 bool m_AutoTrim;
00154 double m_ColumnsPerTile;
00155 double m_RowsPerTile;
00156
00157 friend class IMAGE::TARGET_FILE;
00158 #endif // GENERATING_DOXYGEN_OUTPUT
00159 };
00160
00163 TARGET_FILE (
00164 STAGE *pInputStage,
00165 const FILEPATH& filepath,
00166 GEOFORMATS GeoFormats = GEOFORMAT_None
00167 );
00168
00171 TARGET_FILE (
00172 STAGE *pInputStage,
00173 GEOFORMATS GeoFormats = GEOFORMAT_None
00174 );
00175
00177 virtual ~TARGET_FILE ();
00178
00182 void* DetachBuffer (
00183 ) { return (v_DetachBuffer()); }
00184
00187 const void* GetBuffer (
00188 ) const { return (v_GetBuffer()); }
00189
00192 INT64 GetBufferSize (
00193 ) const { return (v_GetBufferSize()); }
00194
00196 const FILEPATH& GetFilePath (
00197 ) const { return (m_filepath); }
00198
00200 GEOFORMATS GetGeoFormats (
00201 ) const { return (m_GeoFormats); }
00202
00204 bool IsOneTilePerFile (
00205 ) const { return (m_IsOneTilePerFile); }
00206
00211 bool QueryGeoFormat (
00212 GEOFORMATS GeoFormat,
00213 MISTRING& message
00214 ) const;
00215
00218 void SetTileParms (
00219 const TILEPARMS& TileParms
00220 );
00221
00222 protected:
00223
00227 ERRVALUE WriteGeoFormats ();
00228
00229 private:
00230 #ifndef GENERATING_DOXYGEN_OUTPUT
00231
00232 FILEPATH m_filepath;
00233 GEOFORMATS m_GeoFormats;
00234 bool m_IsOneTilePerFile;
00235 bool m_DidTileBegin;
00236 TILEPARMS m_TileParms;
00237 LRECT2D m_CurTileExtents;
00238 STATUSCONTEXT *m_pStatusContext;
00239
00244 ERRVALUE NotifyTileAdd (
00245 INT32 TileColumn,
00246 INT32 TileRow,
00247 FILEPATH& filepath,
00248 LRECT2D& extents
00249 );
00250
00253 ERRVALUE NotifyTileEnd (
00254 );
00255
00259 ERRVALUE WriteGeoFormats (
00260 const FILEPATH& filepath,
00261 const LRECT2D& extent
00262 ) const;
00263
00264 ERRVALUE WriteGeoArcWorld (const FILEPATH& filepath, const DRECT2D& extent) const;
00265 ERRVALUE WriteGeoKML (const FILEPATH& filepath, const DRECT2D& extent) const;
00266
00267
00268 TARGET_FILE (const TARGET_FILE&);
00269 TARGET_FILE& operator= (const TARGET_FILE&);
00270 #endif // GENERATING_DOXYGEN_OUTPUT
00271
00272
00273
00276 virtual void* v_DetachBuffer (
00277 );
00278
00281 virtual ERRVALUE v_FillTileRows (
00282 INT32 NumColumns,
00283 INT32 NumRows
00284 ) = 0;
00285
00288 virtual const void* v_GetBuffer (
00289 ) const;
00290
00292 virtual INT64 v_GetBufferSize (
00293 ) const;
00294
00296 ERRVALUE v_PushSubSection (const SECTION& SubSection, const BUFFER& buffer);
00297
00300 virtual ERRVALUE v_TileBegin (
00301 const FILEPATH& FilePath,
00302 const LRECT2D& Extents
00303 ) = 0;
00304
00307 virtual ERRVALUE v_TileEnd (
00308 ) = 0;
00309
00311 virtual ERRVALUE v_WriteSubSection (
00312 const SECTION& SubSection,
00313 const BUFFER& buffer
00314 ) = 0;
00315
00316 };
00317
00318 #ifndef GENERATING_DOXYGEN_OUTPUT
00319 DEFINE_ENUM_OP_BITWISE(TARGET_FILE::GEOFORMATS);
00320 #endif
00321
00322
00323
00325 class FACTORY_TARGET_FILE {
00326 public:
00327
00329 virtual ~FACTORY_TARGET_FILE ();
00330
00332 FACTORY_TARGET_FILE * Clone (
00333 ) const { return (v_Clone()); }
00334
00336 TARGET_FILE * ConstructTarget (
00337 STAGE *pInputStage,
00338 const FILEPATH& filepath
00339 ) const { return (v_ConstructTarget(pInputStage,filepath,m_GeoFormats)); }
00340
00342 TARGET_FILE * ConstructTarget (
00343 STAGE *pInputStage,
00344 const FILEPATH& filepath,
00345 TARGET_FILE::GEOFORMATS GeoFormats
00346 ) const { return (v_ConstructTarget(pInputStage,filepath,GeoFormats)); }
00347
00349 FORMAT::SPEC GetFormatSpec (
00350 ) const { return (m_FormatSpec); }
00351
00353 void SetGeoFormats (
00354 TARGET_FILE::GEOFORMATS GeoFormats
00355 ) { m_GeoFormats = GeoFormats; }
00356
00357 protected:
00358
00360 explicit FACTORY_TARGET_FILE (FORMAT::SPEC FormatSpec);
00361
00363 FACTORY_TARGET_FILE (const FACTORY_TARGET_FILE& rhs);
00364
00365 private:
00366 #ifndef GENERATING_DOXYGEN_OUTPUT
00367 FORMAT::SPEC m_FormatSpec;
00368 TARGET_FILE::GEOFORMATS m_GeoFormats;
00369
00370
00371 FACTORY_TARGET_FILE& operator= (const FACTORY_TARGET_FILE& rhs);
00372 #endif
00373
00375 virtual FACTORY_TARGET_FILE * v_Clone () const = 0;
00376
00378 virtual TARGET_FILE * v_ConstructTarget (
00379 STAGE *pInputStage,
00380 const FILEPATH& filepath,
00381 TARGET_FILE::GEOFORMATS GeoFormats
00382 ) const = 0;
00383
00384 };
00385
00386
00387 }
00388 }
00389
00390 #endif // INC_SPATMOD_IMAGETARGETFILE_H