ImageResStruct.h

Go to the documentation of this file.
00001 /*
00002 *
00003 *       This file contains structures that store pointer to image
00004 *       and also information about used area in rectangle.
00005 *       Structures has reference counting.
00006 *
00007 *       There is also manager for this objects.
00008 *
00009 *       Author:
00010 *                       Tomas Mrkvicka
00011 *                       xmrkvi03@stud.fit.vutbr.cz
00012 *
00013 */
00014 
00015 #include <vector>
00016 using namespace std;
00017 
00018 #include <windows.h>
00019 
00020 //FORWARD DECLARATIONS
00021 namespace NSSimpleUnit
00022 {
00023         class TImageRGBResult;
00024         class TImageRGBResultManager;
00025 };
00026 
00027 #ifndef _SIMPLEUNIT_IMAGERESSTRUCT_HH_
00028 #define _SIMPLEUNIT_IMAGERESSTRUCT_HH_
00029 
00030 #include "pipeline/UnitTypes.h"
00031 #include "pipeline/Image.h"
00032 
00033 namespace NSSimpleUnit
00034 {
00035 
00036 ////////////////////////////////////////////////////////////////////////////////
00037 ////////////////////////////////////////////////////////////////////////////////
00038 ////////////////////////////////////////////////////////////////////////////////
00039 // TImageRGBResult
00040 
00041 /** Tato trida definuje objekt, ktery obsahuje ukazatel na obrazek
00042 *       typu TImageRGB a dale informace o platne casti obrazku typu TRT_Rect.
00043 *
00044 *       Trida obsahuje pocitadlo referenci.
00045 *
00046 *       Metody AddRefs() a Release() jsou synchronizovany pro vicenasobny pristup.
00047 *
00048 *       Objekt ze tridy lze vytvorit pouze pres manager TImageRGBResultManager.
00049 *
00050 *       Po dosazeni poctu referenci na 0 je objekt vracen zpet do manageru kde byl vytvoren.
00051 *
00052 *       Tato trida neni virtualni - je pouzivana pouze v ramci DLL jednotek a ty mohou
00053 *       exportovat z DLL napr. ukazatelen na TImage a TRT_Rect.
00054 */
00055 class TImageRGBResult
00056 {
00057 friend TImageRGBResultManager;
00058 
00059 //PUBLIC METHODS
00060 public:
00061         void                            AddRefs(void);
00062         void                            Release(void);
00063         DWORD                           GetRefs(void) const;
00064 
00065         const TImageRGB*        GetImage(void) const;
00066         const TRT_Rect*         GetRectangle(void) const;
00067 
00068         TImageRGB*                      GetImageWrite(void);
00069         void                            SetRectangle( const TRT_Rect & rect );
00070 
00071 //PRIVATE METHODS
00072 private:
00073                                                 TImageRGBResult( TImageRGBResultManager * manager, DWORD width, DWORD height );
00074                                                 ~TImageRGBResult( void );
00075 
00076         void                            Reset(void);
00077 
00078 //PRIVATE FAKE METHODS
00079 private:
00080                                                 TImageRGBResult( const TImageRGBResult & orig );        ///< falesny kopirovaci konstruktor
00081         void                            operator=( const TImageRGBResult & orig );                      ///< falesny prirazovaci operator
00082 
00083 //PRIVATE COMPONENTS
00084 private:
00085         DWORD                                           m_refs;         ///< pocet referenci na objekt
00086         TImageRGBResultManager*         m_manager;      ///< manager kde byl objekt vytvoren
00087 
00088         TCriticalSection                        m_cs;           ///< criticka sekce pro synchronizaci pristupu k poctu referenci
00089 
00090         TRT_Rect                                        m_rect;         ///< informace o platne casti obrazku
00091         TImageRGB*                                      m_image;        ///< ukazatel na obrazek        
00092 };
00093 //OK 2007-08-25 23:39:08 B04-315B\Tom
00094 
00095 /** Konstruktor.
00096 *
00097 *       Vytvori uvnitr obrazek se zadanymi rozmery.
00098 *
00099 *       Obdelnik je nastaven na celou velikost obrazku - tj. [0,0, width - 1, height - 1].
00100 *
00101 *       Pocet referenci je nastaven na 0.
00102 *
00103 *       \param  manager         [in] manager kde byl objekt vytvoren
00104 *       \param  width           [in] sirka obrazku v pixelech
00105 *       \param  height          [in] vyska obrazku v pixelech
00106 */
00107 inline TImageRGBResult::TImageRGBResult( 
00108         TImageRGBResultManager * manager,
00109         DWORD width,
00110         DWORD height 
00111         )
00112 {
00113         m_manager = manager;
00114 
00115         m_refs = 0;
00116 
00117         m_image = new TImageRGB( width, height );
00118 
00119         m_rect.left             = 0;
00120         m_rect.top              = 0;
00121         m_rect.right    = width - 1;
00122         m_rect.bottom   = height - 1;
00123 }
00124 //OK 2007-08-25 23:39:11 B04-315B\Tom
00125 
00126 /** Soukromy destruktor.
00127 *
00128 *       Muze byt volan pouze z manageru techto objektu
00129 */
00130 inline TImageRGBResult::~TImageRGBResult( void )
00131 {
00132         delete m_image;
00133         m_image = NULL; //TODO
00134 }
00135 //OK 2007-08-25 23:39:13 B04-315B\Tom
00136 
00137 /** Nastavi pocet referenci na 1 a velikost platneho
00138 *       obdelniku nn cely obraz.
00139 *
00140 *       Metoda je volana v manageru objektu pri vraceni objektu
00141 *       aplikaci. Tim je objekt uveden do stavu po vytvoreni
00142 */
00143 inline void TImageRGBResult::Reset(void)
00144 {
00145         m_refs = 1;
00146 
00147         m_rect.left             = 0;
00148         m_rect.top              = 0;
00149         m_rect.right    = m_image->GetWidth() - 1;
00150         m_rect.bottom   = m_image->GetHeight() - 1;
00151 }
00152 //OK 2007-08-25 23:39:17 B04-315B\Tom
00153 
00154 /** Vrati ukazatel na obrazek ulozeny v tomto objektu.
00155 */
00156 inline const TImageRGB* TImageRGBResult::GetImage(void) const
00157 {
00158         return m_image;
00159 }
00160 //OK 2007-08-25 23:39:20 B04-315B\Tom
00161 
00162 /** Vrati ukazatel na obdelnik urcujici platna data v tomto obrazku.
00163 */
00164 inline const TRT_Rect* TImageRGBResult::GetRectangle(void) const
00165 {
00166         return &m_rect;
00167 }
00168 //OK 2007-08-25 23:39:22 B04-315B\Tom
00169 
00170 /** Vrati ukazatel na obrazek ulozeny v tomto objektu.
00171 *
00172 *       Obrazek je mozne modifikovat.
00173 */
00174 inline TImageRGB* TImageRGBResult::GetImageWrite(void)
00175 {
00176         return m_image;
00177 }
00178 //OK 2007-08-25 23:39:24 B04-315B\Tom
00179 
00180 /** Nastavi obdelnik urcujici pouzitou cast obrazku.
00181 *
00182 *       \param  rect    [in] novy obdelnik
00183 */
00184 inline void TImageRGBResult::SetRectangle( const TRT_Rect & rect )
00185 {
00186         m_rect = rect;
00187 }
00188 //OK 2007-08-25 23:39:25 B04-315B\Tom
00189 
00190 /** Zvysi pocet referenci na objekt.
00191 *
00192 *       Metoda je synchronizovana pro vicenasobny pristup.
00193 */
00194 inline void TImageRGBResult::AddRefs(void)
00195 {
00196         m_cs.Enter();
00197                 m_refs++;
00198         m_cs.Leave();
00199 }
00200 //OK 2007-08-25 23:39:34 B04-315B\Tom
00201 
00202 /** Vrati pocet referenci na tento objekt.
00203 */
00204 inline DWORD TImageRGBResult::GetRefs(void) const
00205 {       
00206         return m_refs;
00207 }
00208 //OK 2007-08-25 23:39:37 B04-315B\Tom
00209 
00210 // TImageRGBResult
00211 ////////////////////////////////////////////////////////////////////////////////
00212 ////////////////////////////////////////////////////////////////////////////////
00213 ////////////////////////////////////////////////////////////////////////////////
00214 // TImageRGBResultManager
00215 
00216 /** Manager objektu typu TImageRGBResult.
00217 *
00218 *       Pred jeho znicenim musi byt z aplikace odstraneny vsechny objekty vytvorene
00219 *       timto managerem.
00220 *
00221 *       Metody GetObject() a InsertObject() jsou synchronizovany pro vicenasobny pristup.
00222 *
00223 *       Soukroma metoda InsertObject() vraci snimek zpatky do manageru. Je volana primo ze snimku
00224 *       v okmaziku, kdy dojde k uvolneni posledni reference snimku.
00225 */
00226 class TImageRGBResultManager
00227 {
00228 friend TImageRGBResult;
00229 
00230 //PUBLIC METHODS
00231 public:
00232                                                         TImageRGBResultManager( DWORD width, DWORD height, DWORD initSize);
00233                                                         ~TImageRGBResultManager( void );
00234 
00235         TImageRGBResult*                GetObject( void );
00236 
00237 //PRIVATE METHODS
00238 private:
00239         void                                    InsertObject( TImageRGBResult* image );
00240 
00241 //PRIVATE FAKE METHODS
00242 private:
00243                                                         TImageRGBResultManager( const TImageRGBResultManager & orig);   ///< falesny kopirovaci konstruktor
00244         void                                    operator=( const TImageRGBResultManager & orig );                               ///< falesny operator prirazeni
00245 
00246 //PRIVATE COMPONENTS
00247 private:
00248         DWORD                                                   m_width;                ///< sirka vytvarenych obrazku
00249         DWORD                                                   m_height;               ///< vyska vytvarenych obrazku
00250 
00251         int                                                             m_exportCount;  ///< pocet objektu vydanych timto managerem
00252                                                                                                         ///< do aplikace
00253 
00254         vector<TImageRGBResult*>                m_object;               ///< pole s objekty
00255 
00256         TCriticalSection                                m_cs;                   ///< criticka sekce pro soubezny pristup k
00257                                                                                                         ///< objektum
00258 };
00259 //OK 2007-08-25 23:41:30 B04-315B\Tom
00260 
00261 // TImageRGBResultManager
00262 ////////////////////////////////////////////////////////////////////////////////
00263 ////////////////////////////////////////////////////////////////////////////////
00264 ////////////////////////////////////////////////////////////////////////////////
00265 
00266 }; //END of NSSimpleUnit
00267 using namespace NSSimpleUnit;
00268 
00269 #endif

Generated on Sat Nov 17 16:23:26 2007 for Image Processing Pipeline by  doxygen 1.4.6-NO