📄 pxcgifff.cpp
字号:
} } } return bRet;}STDMETHODIMP CRealPixGIFFileFormatCodec::ParseImage(IHXBuffer* pBuffer, REF(UINT32) rulNumPackets, REF(IHXValues*) rpParam, REF(UINT32) rulSessionHandle){ HX_RESULT retVal = HXR_FAIL; if (pBuffer && m_pMapManager) { // Compute the maximum number of packets - since we will free up any unused memory // later, we will compute the absolute upper bound for the number of packets - the // number of GIF blocks in the image file. This is an upper bound since we don't // subdivide the file except at GIF block boundaries. UINT32 ulMaxNumPackets = CGIFCodec::GetMaxNumPackets(pBuffer->GetBuffer(), pBuffer->GetSize()); // Create a PXParseSession object PXParseSession* pSession = new PXParseSession(); if (pSession) { // AddRef the object pSession->AddRef(); // Init the size retVal = pSession->InitSize(ulMaxNumPackets); if (SUCCEEDED(retVal)) { // Parse the image, putting buffers into the session object HXxSize rImageDim; retVal = ParseBuffer(pBuffer, pSession, rImageDim); if (SUCCEEDED(retVal)) { // Now we can reduce our size to the number of packets we actually have retVal = pSession->SetSize(pSession->GetNumPackets()); if (SUCCEEDED(retVal)) { // Add the session to the map retVal = m_pMapManager->AddEntry((void*) pSession, rulSessionHandle); if (SUCCEEDED(retVal)) { // AddRef the session now that it's in the map pSession->AddRef(); // Create an IHXValues object IHXValues* pParam = NULL; retVal = m_pCommonClassFactory->CreateInstance(CLSID_IHXValues, (void**) &pParam); if (SUCCEEDED(retVal)) { // Set properties in the IHXValues pParam->SetPropertyULONG32("MaxPacketSize", pSession->GetMaxPacketSize()); pParam->SetPropertyULONG32("MinPacketSize", pSession->GetMinPacketSize()); pParam->SetPropertyULONG32("TotalBytes", pSession->GetTotalBytes()); pParam->SetPropertyULONG32("TotalReqBytes", pSession->GetTotalRequiredBytes()); pParam->SetPropertyULONG32("TotalNonReqBytes", pSession->GetTotalNonRequiredBytes()); pParam->SetPropertyULONG32("ImageWidth", (UINT32) rImageDim.cx); pParam->SetPropertyULONG32("ImageHeight", (UINT32) rImageDim.cy); // Set the outgoing parameters rulNumPackets = pSession->GetNumPackets(); HX_RELEASE(rpParam); rpParam = pParam; rpParam->AddRef(); } HX_RELEASE(pParam); } } } } } else { retVal = HXR_OUTOFMEMORY; } HX_RELEASE(pSession); } else { retVal = HXR_INVALID_PARAMETER; } return retVal;}STDMETHODIMP CRealPixGIFFileFormatCodec::GetImagePacket(UINT32 ulSessionHandle, UINT32 ulPacketNum, REF(IHXBuffer*) rpPacketBuffer, REF(IHXBuffer*) rpOpaquePacketData, REF(BOOL) rbRequired){ HX_RESULT retVal = HXR_FAIL; if (m_pMapManager) { PXParseSession* pSession = NULL; retVal = m_pMapManager->GetEntry(ulSessionHandle, (void**) &pSession); if (SUCCEEDED(retVal)) { retVal = pSession->GetPacket(ulPacketNum, rpPacketBuffer, rpOpaquePacketData, rbRequired); } } return retVal;}STDMETHODIMP CRealPixGIFFileFormatCodec::ReleaseImage(UINT32 ulSessionHandle){ HX_RESULT retVal = HXR_FAIL; if (m_pMapManager) { PXParseSession* pSession = NULL; retVal = m_pMapManager->DeleteEntry(ulSessionHandle, (void**) &pSession); HX_RELEASE(pSession); } return retVal;}HX_RESULT STDAPICALLTYPE CRealPixGIFFileFormatCodec::HXCreateInstance(IUnknown** ppIUnknown){ HX_RESULT retVal = HXR_OK; if (ppIUnknown) { // Create file format codec CRealPixGIFFileFormatCodec* pCodec = new CRealPixGIFFileFormatCodec(); if (pCodec) { // QI for IUnknown retVal = pCodec->QueryInterface(IID_IUnknown, (void**) ppIUnknown); } else { retVal = HXR_OUTOFMEMORY; } if (FAILED(retVal)) { HX_DELETE(pCodec); } } else { retVal = HXR_FAIL; } return retVal;}STDMETHODIMP CRealPixGIFFileFormatCodec::ParseBuffer(IHXBuffer* pBuffer, PXParseSession* pSession, REF(HXxSize) rImageDim){ HX_RESULT retVal = HXR_OK; if (pBuffer && pSession) { // Create a new CGIFCodec object CGIFCodec* pCodec = NULL; retVal = CGIFCodec::CreateObject(&pCodec); if (SUCCEEDED(retVal)) { // AddRef the object pCodec->AddRef(); // Initialize the codec for parsing retVal = pCodec->InitParseWireFormat(pBuffer->GetBuffer(), pBuffer->GetSize()); if (SUCCEEDED(retVal)) { UINT32 ulSeqNum = 0; BOOL bFirst = TRUE; while (SUCCEEDED(retVal) && !pCodec->ParseFinished()) { UINT32 ulSize = 0; retVal = pCodec->GetPacketBufferLength(ulSize); if (SUCCEEDED(retVal)) { // Create an IHXBuffer IHXBuffer* pData = NULL; retVal = m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void**) &pData); if (SUCCEEDED(retVal)) { // Set its size retVal = pData->SetSize(ulSize); if (SUCCEEDED(retVal)) { BOOL bFirst = FALSE; retVal = pCodec->GetPacketBuffer(pData->GetBuffer(), pData->GetSize(), bFirst); if (SUCCEEDED(retVal)) { // Create an opaque data buffer IHXBuffer* pOpaque = NULL; retVal = m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void**) &pOpaque); if (SUCCEEDED(retVal)) { retVal = pOpaque->SetSize(8); if (SUCCEEDED(retVal)) { UINT32 ulFlags = (bFirst ? 1 : 0); BYTE* pBuf = pOpaque->GetBuffer(); Pack32(pBuf, ulSeqNum); Pack32(pBuf, ulFlags); // Add the buffers to the session retVal = pSession->AddPacket(pData, pOpaque, bFirst); if (SUCCEEDED(retVal)) { ulSeqNum++; } } } HX_RELEASE(pOpaque); } } } HX_RELEASE(pData); } } } } HX_RELEASE(pCodec); } else { retVal = HXR_INVALID_PARAMETER; } return retVal;}void CRealPixGIFFileFormatCodec::ReleaseAllSessions(){ if (m_pMapManager) { UINT32 ulHandle = 0; PXParseSession* pSession = NULL; HX_RESULT retVal = m_pMapManager->GetFirstEntry(ulHandle, (void**) &pSession); while (SUCCEEDED(retVal)) { HX_RELEASE(pSession); retVal = m_pMapManager->GetNextEntry(ulHandle, (void**) &pSession); } m_pMapManager->DeleteAllEntries(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -