00001
00060 #ifndef INC_SPATMOD_IMAGESECTION_H
00061 #define INC_SPATMOD_IMAGESECTION_H
00062
00063 #ifndef INC_SPATMOD_IMAGESPANS_H
00064 #include <spatmod/imagespans.h>
00065 #endif
00066
00067 #ifndef INC_MI32_MATH_H
00068 #include <mi32/math.h>
00069 #endif
00070
00071 struct DRECT2D;
00072 struct LRECT2D;
00073
00074 namespace SPATMOD {
00075 namespace IMAGE {
00076
00077 class BASE;
00078 class DIMENSIONS;
00079 class SECTION_ITERATOR;
00080
00081
00083 class SECTION {
00084 public:
00085
00087 enum POSITION {
00088 POSITION_Unknown = 0,
00089 POSITION_TileColumnFirst = 0x0001,
00090 POSITION_TileColumnInterior = 0x0002,
00091 POSITION_TileColumnLast = 0x0004,
00092 POSITION_TileRowFirst = 0x0010,
00093 POSITION_TileRowInterior = 0x0020,
00094 POSITION_TileRowLast = 0x0040,
00095 POSITION_StripFirst = 0x0100,
00096 POSITION_StripInterior = 0x0200,
00097 POSITION_StripLast = 0x0400,
00098 };
00099
00101 SECTION ();
00102
00105 SECTION (
00106 const BASE& image,
00107 double zoom = 1
00108 );
00109
00111 explicit SECTION (
00112 const DRECT2D& rect,
00113 double zoom = 1
00114 );
00115
00117 explicit SECTION (
00118 const LRECT2D& rect,
00119 double zoom = 1
00120 );
00121
00123 SECTION (
00124 double MinX,
00125 double MinY,
00126 double SizeX,
00127 double SizeY,
00128 double zoom = 1,
00129 POSITION position = POSITION_Unknown
00130 );
00131
00135 INT32 ComputeMaxColumn (
00136 ) const;
00137
00141 INT32 ComputeMaxRow (
00142 ) const;
00143
00147 INT32 ComputeMinColumn (
00148 ) const;
00149
00153 INT32 ComputeMinRow (
00154 ) const;
00155
00158 INT32 ComputeNumColumns (
00159 ) const;
00160
00163 INT32 ComputeNumRows (
00164 ) const;
00165
00167 void ComputeRect (
00168 LRECT2D& rect
00169 ) const;
00170
00172 MISTRING GetLogString (
00173 bool showzoom = true
00174 ) const;
00175
00178 double GetMaxX (
00179 ) const { return (m_MinX + m_SizeX); }
00180
00183 double GetMaxY (
00184 ) const { return (m_MinY + m_SizeY); }
00185
00187 double GetMinX (
00188 ) const { return (m_MinX); }
00189
00191 double GetMinY (
00192 ) const { return (m_MinY); }
00193
00195 POSITION GetPosition (
00196 ) const { return (m_Position); }
00197
00199 void GetRect (
00200 DRECT2D& rect
00201 ) const;
00202
00204 double GetSizeX (
00205 ) const { return (m_SizeX); }
00206
00208 double GetSizeY (
00209 ) const { return (m_SizeY); }
00210
00212 double GetZoom (
00213 ) const { return (m_Zoom); }
00214
00216 bool IsEqual (
00217 const SECTION& rhs
00218 ) const;
00219
00221 void SetMin (
00222 double MinX,
00223 double MinY
00224 ) { m_MinX = MinX; m_MinY = MinY; }
00225
00226 private:
00227 #ifndef GENERATING_DOXYGEN_OUTPUT
00228 double m_MinX;
00229 double m_MinY;
00230 double m_SizeX;
00231 double m_SizeY;
00232 double m_Zoom;
00233 POSITION m_Position;
00234 friend class SECTION_ITERATOR;
00235 #endif // GENERATING_DOXYGEN_OUTPUT
00236 };
00237
00238 #ifndef GENERATING_DOXYGEN_OUTPUT
00239 DEFINE_ENUM_OP_BITWISE(SECTION::POSITION);
00240 #endif
00241
00243 inline bool operator== (
00244 const SECTION& lhs,
00245 const SECTION& rhs
00246 ) { return (lhs.IsEqual(rhs)); }
00247
00249 inline bool operator!= (
00250 const SECTION& lhs,
00251 const SECTION& rhs
00252 ) { return (!lhs.IsEqual(rhs)); }
00253
00254
00255
00256
00264 class SECTION_ITERATOR {
00265 public:
00266
00268 SECTION_ITERATOR ();
00269
00271 ~SECTION_ITERATOR ();
00272
00274 const SECTION& operator* (
00275 ) const { return (m_CurSection); }
00276
00278 const SECTION* operator-> (
00279 ) const { return (&m_CurSection); }
00280
00282 SECTION_ITERATOR& operator++ (
00283 );
00284
00286 ERRVALUE Begin (
00287 const SECTION& TotalSection,
00288 double StripSizeY
00289 );
00290
00292 ERRVALUE Begin (
00293 const SECTION& TotalSection,
00294 const SPANS& SpansX,
00295 const SPANS& SpansY,
00296 double StripSizeY = 0,
00297 double FirstStripSizeY = 0
00298 );
00299
00301 ERRVALUE Begin (
00302 const SECTION& TotalSection,
00303 double StripSizeY,
00304 double InteriorTileSizeX,
00305 double InteriorTileSizeY,
00306 double FirstTileSizeX = 0,
00307 double FirstTileSizeY = 0,
00308 double LastTileSizeX = 0,
00309 double LastTileSizeY = 0,
00310 double FirstStripSizeY = 0
00311 );
00312
00315 ERRVALUE Begin (
00316 const SECTION& TotalSection,
00317 const BASE& Image,
00318 double StripSizeY = 0
00319 );
00320
00323 ERRVALUE Begin (
00324 const SECTION& TotalSection,
00325 const BASE& TargetImage,
00326 const BASE& SourceImage,
00327 double StripSizeY = 0
00328 );
00329
00331 void Begin (
00332 );
00333
00335 INT32 ComputeMaxSubSectionColumns (
00336 ) const;
00337
00339 INT32 ComputeMaxSubSectionRows (
00340 ) const;
00341
00343 double ComputeMaxSubSectionSizeX (
00344 ) const;
00345
00347 double ComputeMaxSubSectionSizeY (
00348 ) const;
00349
00351 INT32 ComputeNumIterations (
00352 ) const;
00353
00355 double GetFirstStripSizeY (
00356 ) const { return (m_FirstStripSizeY); }
00357
00359 double GetFirstTileSizeX (
00360 ) const { return (m_SpansX.GetSpanSizeFirst()); }
00361
00363 double GetFirstTileSizeY (
00364 ) const { return (m_SpansY.GetSpanSizeFirst()); }
00365
00367 double GetInteriorTileSizeX (
00368 ) const { return (m_SpansX.GetSpanSizeInterior()); }
00369
00371 double GetInteriorTileSizeY (
00372 ) const { return (m_SpansY.GetSpanSizeInterior()); }
00373
00375 double GetLastTileSizeX (
00376 ) const { return (m_SpansX.GetSpanSizeLast()); }
00377
00379 double GetLastTileSizeY (
00380 ) const { return (m_SpansY.GetSpanSizeLast()); }
00381
00383 double GetMinX () const
00384 { return (m_MinX); }
00385
00387 double GetMinY () const
00388 { return (m_MinY); }
00389
00391 UINT32 GetNumColumnsOfTiles (
00392 ) const { return (m_SpansX.GetNumSpans()); }
00393
00395 UINT32 GetNumRowsOfTiles (
00396 ) const { return (m_SpansY.GetNumSpans()); }
00397
00399 const SPANS& GetSpansX (
00400 ) const { return (m_SpansX); }
00401
00403 const SPANS& GetSpansY (
00404 ) const { return (m_SpansY); }
00405
00407 double GetStripSizeY (
00408 ) const { return (m_StripSizeY); }
00409
00411 const SECTION& GetTotalSection (
00412 ) const { return (m_TotSection); }
00413
00415 bool IsEnd (
00416 ) const { return (m_CurTileRow >= m_SpansY.GetNumSpans()); }
00417
00419 bool IsIrregular (
00420 ) const { return (m_IsIrregular); }
00421
00423 bool IsTileAligned (
00424 const DIMENSIONS& dimensions
00425 ) const;
00426
00430 void SetIrregular (
00431 const SECTION& TotalSection,
00432 UINT32 MaxColumns,
00433 UINT32 MaxRows
00434 );
00435
00436 private:
00437 #ifndef GENERATING_DOXYGEN_OUTPUT
00438 SECTION m_TotSection;
00439 SECTION m_CurSection;
00440 SPANS m_SpansX;
00441 SPANS m_SpansY;
00442 double m_MinX;
00443 double m_MinY;
00444 double m_StripSizeY;
00445 double m_FirstStripSizeY;
00446 double m_CurTileSizeY;
00447 UINT32 m_CurTileRow;
00448 UINT32 m_CurTileColumn;
00449 UINT32 m_CurTileNumStrips;
00450 UINT32 m_CurStripRow;
00451 bool m_IsIrregular;
00452
00453 void ComputeCurSection ();
00454 void ComputeCurTile ();
00455 void Setup (
00456 const SECTION& TotalSection,
00457 double StripSizeY,
00458 double InteriorTileSizeX,
00459 double InteriorTileSizeY,
00460 double FirstTileSizeX,
00461 double FirstTileSizeY
00462 );
00463 bool TestEfficiency (
00464 const BASE& TargetImage,
00465 const BASE& SourceImage,
00466 float& BestEfficiency,
00467 SECTION_ITERATOR& BestIterator
00468 ) const;
00469
00470 #endif // GENERATING_DOXYGEN_OUTPUT
00471
00472 };
00473
00474
00475
00476 }
00477 }
00478
00479 #endif // INC_SPATMOD_IMAGESECTION_H