00001
00061 #ifndef INC_SPATMOD_IMAGEBUFFER_H
00062 #define INC_SPATMOD_IMAGEBUFFER_H
00063
00064 #ifndef INC_SPATMOD_IMAGEPIXEL_H
00065 #include <spatmod/imagepixel.h>
00066 #endif
00067
00068 #ifndef INC_SPATMOD_LOGICALOP_H
00069 #include <spatmod/logicalop.h>
00070 #endif
00071
00072 namespace SPATMOD {
00073
00074 class DATABUFFER;
00075
00076 namespace IMAGE {
00077
00078 class SAMPLEITERATOR;
00079 class SAMPLEITERATOR_CONST;
00080
00081
00082
00084 class BUFFER {
00085 public:
00086
00087 enum COPYFLAGS {
00088 COPYFLAG_None = 0x0000,
00089 COPYFLAG_KeepValid = 0x0001,
00090 COPYFLAG_NoInvalid = 0x0002,
00091 };
00092
00095 BUFFER (
00096 );
00097
00100 BUFFER (
00101 const BUFFER& rhs
00102 );
00103
00105 ~BUFFER ();
00106
00109 BUFFER& operator= (
00110 const BUFFER& rhs
00111 );
00112
00114 ERRVALUE CheckRectangle (
00115 INT32 StartColumn,
00116 INT32 StartRow,
00117 UINT32 NumColumns,
00118 UINT32 NumRows
00119 ) const;
00120
00122 ERRVALUE CopyFrom (
00123 INT32 TgtMinColumn,
00124 INT32 TgtMinRow,
00125 const BUFFER& SrcBuffer,
00126 INT32 SrcMinColumn,
00127 INT32 SrcMinRow,
00128 UINT32 SrcNumColumns,
00129 UINT32 SrcNumRows
00130 );
00131
00138 ERRVALUE Create (
00139 const PIXEL& PixelProperties,
00140 UINT32 NumColumns,
00141 UINT32 NumRows,
00142 void **data = 0,
00143 UINT8 *validity = 0
00144 );
00145
00149 ERRVALUE Create (
00150 BUFFER& existing,
00151 INT32 ColOffset,
00152 INT32 RowOffset,
00153 UINT32 WinColumns,
00154 UINT32 WinRows
00155 );
00156
00160 ERRVALUE CreateSubset (
00161 BUFFER& existing,
00162 const UINT16 *SampleIdxs,
00163 UINT16 NumSamples,
00164 bool OwnValidity
00165 );
00166
00168 void Destroy (
00169 );
00170
00174 ERRVALUE ExportRowBIP (
00175 void *target,
00176 UINT32 row,
00177 UINT32 StartColumn = 0,
00178 UINT32 NumColumns = 0,
00179 bool SkipInvalid = false,
00180 const UINT16 *SampleTrans = 0,
00181 UINT16 NumSamplesTrans = 0,
00182 int OutputPixelBytes = 0
00183 ) const;
00184
00186 ERRVALUE ExportRowBIP (
00187 void *target,
00188 const PIXEL& nullpixel,
00189 UINT32 row,
00190 UINT32 StartColumn = 0,
00191 UINT32 NumColumns = 0
00192 ) const;
00193
00195 ERRVALUE GetIterator (
00196 SAMPLEITERATOR_CONST& iterator,
00197 UINT16 SampleNum,
00198 INT32 row,
00199 INT32 column = 0
00200 ) const;
00201
00203 ERRVALUE GetIterator (
00204 SAMPLEITERATOR& iterator,
00205 UINT16 SampleNum,
00206 INT32 row,
00207 INT32 column = 0
00208 );
00209
00211 UINT32 GetNumColumns (
00212 ) const { return (m_WinNumColumns); }
00213
00215 UINT32 GetNumRows (
00216 ) const { return (m_WinNumRows); }
00217
00219 UINT32 GetNumRowBytes (
00220 UINT16 SampleNum
00221 ) const { return (m_WinNumColumns * m_SampleBytes[SampleNum]); }
00222
00224 UINT32 GetNumSampleBytes (
00225 UINT16 SampleNum
00226 ) const { return (m_SampleBytes[SampleNum]); }
00227
00230 UINT16 GetNumSamples (
00231 ) const { return (m_PixelProperties.GetNumSamples()); }
00232
00234 const PIXEL& GetPixelProperties (
00235 ) const { return (m_PixelProperties); }
00236
00243 const void *GetPtrSample (
00244 UINT16 SampleNum,
00245 INT32 row,
00246 INT32 column = 0
00247 ) const;
00248
00255 void *GetPtrSample (
00256 UINT16 SampleNum,
00257 INT32 row,
00258 INT32 column = 0
00259 );
00260
00264 const void *GetPtrSampleFast (
00265 UINT16 SampleNum,
00266 INT32 row,
00267 INT32 column = 0
00268 ) const {
00269 #ifdef PTRS_ARE_64_BIT
00270 return (static_cast<const UINT8*>(m_TotSampleBase[SampleNum]) + (row + static_cast<INT64>(m_WinOffRow)) * static_cast<INT64>(m_RowBytes[SampleNum]) + (column + static_cast<INT64>(m_WinOffColumn)) * static_cast<INT64>(m_SampleBytes[SampleNum]));
00271 #else
00272 return (static_cast<const UINT8*>(m_TotSampleBase[SampleNum]) + (row + m_WinOffRow) * m_RowBytes[SampleNum] + (column + m_WinOffColumn) * m_SampleBytes[SampleNum]);
00273 #endif
00274 }
00275
00279 void *GetPtrSampleFast (
00280 UINT16 SampleNum,
00281 INT32 row,
00282 INT32 column = 0
00283 ) {
00284 #ifdef PTRS_ARE_64_BIT
00285 return (static_cast<UINT8*>(m_TotSampleBase[SampleNum]) + (row + static_cast<INT64>(m_WinOffRow)) * static_cast<INT64>(m_RowBytes[SampleNum]) + (column + static_cast<INT64>(m_WinOffColumn)) * static_cast<INT64>(m_SampleBytes[SampleNum]));
00286 #else
00287 return (static_cast<UINT8*>(m_TotSampleBase[SampleNum]) + (row + m_WinOffRow) * m_RowBytes[SampleNum] + (column + m_WinOffColumn) * m_SampleBytes[SampleNum]);
00288 #endif
00289 }
00290
00292 void ** GetPtrSamplesBase (
00293 ) { return (m_TotSampleBase); }
00294
00299 const UINT8 *GetPtrValidity (
00300 INT32 row,
00301 INT32 column = 0
00302 ) const;
00303
00308 UINT8 *GetPtrValidity (
00309 INT32 row,
00310 INT32 column = 0
00311 );
00312
00316 const UINT8 *GetPtrValidityFast (
00317 INT32 row,
00318 INT32 column = 0
00319 ) const { return (m_TotValidityBase + (row + m_WinOffRow) * m_TotNumColumns + column + m_WinOffColumn); }
00320
00324 UINT8 *GetPtrValidityFast (
00325 INT32 row,
00326 INT32 column = 0
00327 ) { return (m_TotValidityBase + (row + m_WinOffRow) * m_TotNumColumns + column + m_WinOffColumn); }
00328
00331 UINT32 GetTotalColumns (
00332 ) const { return (m_TotNumColumns); }
00333
00336 UINT32 GetTotalRows (
00337 ) const { return (m_TotNumRows); }
00338
00341 UINT32 GetTotalRowBytes (
00342 UINT16 SampleNum
00343 ) const { return (m_RowBytes[SampleNum]); }
00344
00347 UINT32 GetWindowColumn (
00348 ) const { return (m_WinOffColumn); }
00349
00352 UINT32 GetWindowRow (
00353 ) const { return (m_WinOffRow); }
00354
00356 ERRVALUE ImportRowBIP (
00357 const void *source,
00358 const UINT8 *validity,
00359 UINT32 row,
00360 UINT32 StartColumn = 0,
00361 UINT32 NumColumns = 0
00362 );
00363
00365 ERRVALUE ImportRowBIP (
00366 const void *source,
00367 const PIXEL& nullpixel,
00368 UINT32 row,
00369 UINT32 StartColumn = 0,
00370 UINT32 NumColumns = 0
00371 );
00372
00375 bool IsContiguous (
00376 ) const { return (m_IsContiguous); }
00377
00379 bool IsCreated (
00380 ) const;
00381
00383 ERRVALUE SetInvalid (
00384 INT32 StartColumn,
00385 INT32 StartRow,
00386 UINT32 NumColumns,
00387 UINT32 NumRows
00388 );
00389
00391 void SetValidityAll (
00392 bool validity
00393 );
00394
00398 ERRVALUE SetValidityLogical (
00399 LOGICALOP operation,
00400 const BUFFER& buffer
00401 );
00402
00404 void ShiftWindowFast (
00405 INT32 DeltaColumn,
00406 INT32 DeltaRow
00407 ) { m_WinOffColumn += DeltaColumn; m_WinOffRow += DeltaRow; }
00408
00409 private:
00410 #ifndef GENERATING_DOXYGEN_OUTPUT
00411
00412 DATABUFFER *m_pSampleBuffer;
00413 DATABUFFER *m_pValidityBuffer;
00414 void **m_TotSampleBase;
00415 UINT8 *m_TotValidityBase;
00416 UINT32 *m_SampleBytes;
00417 UINT32 *m_RowBytes;
00418 PIXEL m_PixelProperties;
00419 UINT32 m_TotNumRows;
00420 UINT32 m_TotNumColumns;
00421 UINT32 m_WinNumRows;
00422 UINT32 m_WinNumColumns;
00423 UINT32 m_WinOffRow;
00424 UINT32 m_WinOffColumn;
00425 bool m_IsContiguous;
00426
00427 void CopyRef (const BUFFER& rhs);
00428
00429 #endif // GENERATING_DOXYGEN_OUTPUT
00430 };
00431
00432 #ifndef GENERATING_DOXYGEN_OUTPUT
00433 DEFINE_ENUM_OP_BITWISE(BUFFER::COPYFLAGS);
00434 #endif
00435
00436
00437
00438 }
00439 }
00440
00441 #endif // INC_SPATMOD_IMAGEBUFFER_H