BOOL CPngImage::LoadFromBuffer (LPBYTE lpBuffer, UINT uiSize)
{
if (!afxGlobalData.bGDIPlusSupport)
{
return FALSE;
}
ASSERT(lpBuffer != NULL);
HGLOBAL hRes = ::GlobalAlloc (GMEM_MOVEABLE, uiSize);
if (hRes == NULL)
{
return FALSE;
}
IStream* pStream = NULL;
LPVOID lpResBuffer = ::GlobalLock (hRes);
ASSERT (lpResBuffer != NULL);
memcpy (lpResBuffer, lpBuffer, uiSize);
HRESULT hResult = ::CreateStreamOnHGlobal (hRes, TRUE, &pStream);
if (hResult != S_OK)
{
return FALSE;
}
if (CMFCToolBarImages::m_bMultiThreaded)
{
CMFCToolBarImages::m_CriticalSection.Lock ();
}
if (m_pImage == NULL)
{
m_pImage = new CImage;
ENSURE(m_pImage != NULL);
}
m_pImage->Load (pStream);
pStream->Release ();
BOOL bRes = Attach (m_pImage->Detach ());
if (CMFCToolBarImages::m_bMultiThreaded)
{
CMFCToolBarImages::m_CriticalSection.Unlock ();
}
return bRes;
}