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