CImage封装gdiplus的初始化和引用计数

来源:互联网 发布:ubuntu sudo在哪里 编辑:程序博客网 时间:2024/05/16 19:30

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

 

CImage内部封装了一个变量  

static CInitGDIPlus s_initGDIPlus;

 

该变量实现了对gdiplus的初始化和销毁,基于引用计数的方式,实现了多个CImage实例的共享gdiplus的生命周期。

 

class CInitGDIPlus

{

public:

      CInitGDIPlus() throw();

      ~CInitGDIPlus() throw();

 

      bool Init() throw();

      void ReleaseGDIPlus() throw();

      void IncreaseCImageCount() throw();

      void DecreaseCImageCount() throw();

 

private:

      ULONG_PTR m_dwToken;

      CRITICAL_SECTION m_sect;

      LONG m_nCImageObjects;

};

inline CImage::CInitGDIPlus::CInitGDIPlus() throw() :

      m_dwToken( 0 ), m_nCImageObjects( 0 )

{

      __try

      {

           InitializeCriticalSection(&m_sect);

      }

      __except( STATUS_NO_MEMORY == GetExceptionCode() )

      {

           AtlThrow( E_OUTOFMEMORY );

      }

}

 

inline CImage::CInitGDIPlus::~CInitGDIPlus() throw()

{

      ReleaseGDIPlus();

      DeleteCriticalSection(&m_sect);

}

 

inline bool CImage::CInitGDIPlus::Init() throw()

{

      EnterCriticalSection(&m_sect);

      bool fRet = true;

      if( m_dwToken == 0 )

      {

           Gdiplus::GdiplusStartupInput input;

           Gdiplus::GdiplusStartupOutput output;

           Gdiplus::Status status = Gdiplus::GdiplusStartup( &m_dwToken, &input, &output );

           if( status != Gdiplus::Ok )

                 fRet = false;

      }

      LeaveCriticalSection(&m_sect);

      return fRet;

}

 

inline void CImage::CInitGDIPlus::ReleaseGDIPlus() throw()

{

      EnterCriticalSection(&m_sect);

      if( m_dwToken != 0 )

      {

           Gdiplus::GdiplusShutdown( m_dwToken );

      }

      m_dwToken = 0;

      LeaveCriticalSection(&m_sect);

}

 

inline void CImage::CInitGDIPlus::IncreaseCImageCount() throw()

{

      EnterCriticalSection(&m_sect);

      m_nCImageObjects++;

      LeaveCriticalSection(&m_sect);

}

 

inline void CImage::CInitGDIPlus::DecreaseCImageCount() throw()

{

      EnterCriticalSection(&m_sect);

      if( --m_nCImageObjects == 0 )

           ReleaseGDIPlus();

      LeaveCriticalSection(&m_sect);

}


 

0 0
原创粉丝点击