00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <windows.h>
00011 #include <vector>
00012 using namespace std;
00013
00014
00015 namespace NSPipeline
00016 {
00017 class TImageARGB;
00018 class TImageRGB;
00019 class TImageGray;
00020
00021 class TImageSetReal;
00022 class TImageSetManager;
00023 class TFrameReal;
00024 };
00025
00026 namespace NSSimpleUnit
00027 {
00028 class TImageRGBResult;
00029 }
00030
00031 #ifndef _PIPELINE_IMAGE_HH_
00032 #define _PIPELINE_IMAGE_HH_
00033
00034 #include "pipeline/ImageAbstract.h"
00035 #include "pipeline/CriticalSection.h"
00036
00037 namespace NSPipeline
00038 {
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 class TImageARGB : public TImage
00055 {
00056 friend class TImageSetReal;
00057
00058
00059 public:
00060 virtual EnumImageType GetImageType(void) const;
00061 virtual DWORD GetPixelSize(void) const;
00062
00063 virtual DWORD GetWidth(void) const;
00064 virtual DWORD GetHeight(void) const;
00065 virtual DWORD GetPitch(void) const;
00066
00067 virtual DWORD GetDataSize(void) const;
00068 virtual const void* GetData(void) const;
00069
00070
00071 private:
00072 virtual ~TImageARGB(void);
00073
00074
00075 public:
00076 void* GetDataWrite(void);
00077 void FromGray( const TImageGray * image );
00078 void FromRGB( const TImageRGB * image );
00079
00080 bool IsRectInside( DWORD x, DWORD y, DWORD width, DWORD height ) const;
00081 void CopyFrom( const TImageARGB * src, DWORD x, DWORD y, DWORD width, DWORD height);
00082
00083
00084 private:
00085 TImageARGB(DWORD width, DWORD height);
00086
00087
00088 private:
00089 TImageARGB( const TImageARGB & orig );
00090 void operator=( const TImageARGB & orig );
00091
00092
00093 private:
00094 unsigned char* m_data;
00095
00096 DWORD m_width;
00097 DWORD m_height;
00098 };
00099
00100
00101
00102
00103 inline EnumImageType TImageARGB::GetImageType(void) const
00104 {
00105 return ENUM_IMAGETYPE_ARGB;
00106 }
00107
00108
00109
00110
00111 inline void* TImageARGB::GetDataWrite(void)
00112 {
00113 return m_data;
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 inline bool TImageARGB::IsRectInside( DWORD x, DWORD y, DWORD width, DWORD height ) const
00125 {
00126 return
00127 ( x + width ) <= ( m_width ) &&
00128 ( y + height ) <= ( m_height );
00129 }
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 class TImageRGB : public TImage
00149 {
00150 friend class TImageSetReal;
00151 friend class NSSimpleUnit::TImageRGBResult;
00152
00153
00154 public:
00155 virtual EnumImageType GetImageType(void) const;
00156 virtual DWORD GetPixelSize(void) const;
00157
00158 virtual DWORD GetWidth(void) const;
00159 virtual DWORD GetHeight(void) const;
00160 virtual DWORD GetPitch(void) const;
00161
00162 virtual DWORD GetDataSize(void) const;
00163 virtual const void* GetData(void) const;
00164
00165
00166 private:
00167 virtual ~TImageRGB(void);
00168
00169
00170 public:
00171 void* GetDataWrite(void);
00172 void FromGray( const TImageGray * image );
00173 void FromARGB( const TImageARGB * image );
00174
00175 bool IsRectInside( DWORD x, DWORD y, DWORD width, DWORD height ) const;
00176 void CopyFrom( const TImageRGB * src, DWORD x, DWORD y, DWORD width, DWORD height);
00177
00178
00179 private:
00180 TImageRGB(DWORD width, DWORD height);
00181
00182
00183 private:
00184 TImageRGB( const TImageRGB & orig );
00185 void operator=( const TImageRGB & orig );
00186
00187
00188 private:
00189 unsigned char* m_data;
00190
00191 DWORD m_width;
00192 DWORD m_height;
00193 };
00194
00195
00196
00197
00198 inline EnumImageType TImageRGB::GetImageType(void) const
00199 {
00200 return ENUM_IMAGETYPE_RGB;
00201 }
00202
00203
00204
00205
00206 inline void* TImageRGB::GetDataWrite(void)
00207 {
00208 return m_data;
00209 }
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219 inline bool TImageRGB::IsRectInside( DWORD x, DWORD y, DWORD width, DWORD height ) const
00220 {
00221 return
00222 ( x + width ) <= ( m_width ) &&
00223 ( y + height ) <= ( m_height );
00224 }
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 class TImageGray : public TImage
00243 {
00244 friend class TImageSetReal;
00245
00246
00247 public:
00248 virtual EnumImageType GetImageType(void) const;
00249 virtual DWORD GetPixelSize(void) const;
00250
00251 virtual DWORD GetWidth(void) const;
00252 virtual DWORD GetHeight(void) const;
00253 virtual DWORD GetPitch(void) const;
00254
00255 virtual DWORD GetDataSize(void) const;
00256 virtual const void* GetData(void) const;
00257
00258
00259 private:
00260 virtual ~TImageGray(void);
00261
00262
00263 public:
00264 void* GetDataWrite(void);
00265 void FromARGB( const TImageARGB * image );
00266 void FromRGB( const TImageRGB * image );
00267
00268 bool IsRectInside( DWORD x, DWORD y, DWORD width, DWORD height ) const;
00269 void CopyFrom( const TImageGray * src, DWORD x, DWORD y, DWORD width, DWORD height);
00270
00271
00272 private:
00273 TImageGray(DWORD width, DWORD height);
00274
00275
00276 private:
00277 TImageGray( const TImageGray & orig );
00278 void operator=( const TImageGray & orig );
00279
00280
00281 private:
00282 unsigned char* m_data;
00283
00284 DWORD m_width;
00285 DWORD m_height;
00286 };
00287
00288
00289
00290
00291 inline EnumImageType TImageGray::GetImageType(void) const
00292 {
00293 return ENUM_IMAGETYPE_GRAY;
00294 }
00295
00296
00297
00298
00299 inline void* TImageGray::GetDataWrite(void)
00300 {
00301 return m_data;
00302 }
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 inline bool TImageGray::IsRectInside( DWORD x, DWORD y, DWORD width, DWORD height ) const
00313 {
00314 return
00315 ( x + width ) <= ( m_width ) &&
00316 ( y + height ) <= ( m_height );
00317 }
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331 class TImageSetReal : public TImageSet
00332 {
00333 friend class TImageSetManager;
00334 friend class TFrameReal;
00335
00336
00337 public:
00338 virtual const TImage* GetARGB(void) const;
00339 virtual const TImage* GetGray(void) const;
00340 virtual const TImage* GetRGB(void) const;
00341
00342
00343 private:
00344 virtual ~TImageSetReal(void);
00345
00346
00347 public:
00348 TImageARGB* GetARGBWrite(void) const;
00349 TImageGray* GetGrayWrite(void) const;
00350 TImageRGB* GetRGBWrite(void) const;
00351
00352
00353 private:
00354 TImageSetReal(TImageSetManager * manager, DWORD id, DWORD width, DWORD height);
00355
00356 DWORD GetID(void) const;
00357 TImageSetManager* GetManager(void);
00358
00359
00360 private:
00361 TImageSetReal( const TImageSetReal & orig );
00362 void operator=( const TImageSetReal & orig );
00363
00364
00365 private:
00366 TImageARGB* m_image_ARGB;
00367 TImageGray* m_image_gray;
00368 TImageRGB* m_image_RGB;
00369
00370 TImageSetManager* m_manager;
00371 DWORD m_managerID;
00372
00373 };
00374
00375
00376
00377
00378 inline TImageARGB* TImageSetReal::GetARGBWrite(void) const
00379 {
00380 return m_image_ARGB;
00381 }
00382
00383
00384
00385
00386 inline TImageGray* TImageSetReal::GetGrayWrite(void) const
00387 {
00388 return m_image_gray;
00389 }
00390
00391
00392
00393
00394 inline TImageRGB* TImageSetReal::GetRGBWrite(void) const
00395 {
00396 return m_image_RGB;
00397 }
00398
00399
00400
00401
00402 inline DWORD TImageSetReal::GetID(void) const
00403 {
00404 return m_managerID;
00405 }
00406
00407
00408
00409
00410 inline TImageSetManager* TImageSetReal::GetManager(void)
00411 {
00412 return m_manager;
00413 }
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433 class TImageSetManager
00434 {
00435
00436 public:
00437 TImageSetManager( DWORD width, DWORD height, DWORD initSize );
00438 ~TImageSetManager(void);
00439
00440 TImageSetReal* GetImageSet(void);
00441 void ReleaseImageSet(const TImageSetReal * img);
00442
00443
00444 private:
00445 TImageSetManager( const TImageSetManager & orig );
00446 void operator=( const TImageSetManager & orig );
00447
00448
00449 private:
00450 TCriticalSection m_critical;
00451
00452 DWORD m_width;
00453 DWORD m_height;
00454
00455 vector<TImageSetReal*> m_imageSets;
00456 vector<BOOL> m_imgFlags;
00457
00458
00459 };
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477 class TFrameReal : public TFrame
00478 {
00479
00480 public:
00481 virtual const TImageSet* GetImageSet(void) const;
00482
00483 virtual const TTimeStamp & GetTimestamp(void) const;
00484
00485 virtual void AddRefs(void);
00486 virtual void Release(void);
00487 virtual DWORD GetRefs(void) const;
00488
00489 virtual DWORD AddLock(void);
00490 virtual DWORD ReleaseLock(void);
00491 virtual DWORD GetLockCount(void) const;
00492
00493
00494 private:
00495 virtual ~TFrameReal(void);
00496
00497
00498 public:
00499 static TFrameReal* Create( TImageSetReal * images );
00500
00501
00502 private:
00503 TFrameReal( const TFrameReal & orig );
00504 void operator=( const TFrameReal & orig );
00505
00506
00507 private:
00508 TFrameReal( TImageSetReal * images );
00509
00510
00511 private:
00512 DWORD m_refs;
00513 DWORD m_locks;
00514 TCriticalSection m_critSection;
00515 TCriticalSection m_critSection2;
00516
00517 TTimeStamp m_time;
00518 TImageSetReal* m_image;
00519 };
00520
00521
00522
00523
00524
00525 inline TFrameReal* TFrameReal::Create( TImageSetReal * images )
00526 {
00527 return new TFrameReal( images );
00528 }
00529
00530
00531
00532
00533
00534
00535
00536 };
00537 using namespace NSPipeline;
00538
00539 #endif