📄 pxgifrnd.cpp
字号:
else { retVal = HXR_UNEXPECTED; } return retVal;}STDMETHODIMP CGIFRenderer::OnPause(UINT32 ulTimeBeforePause){ MLOG_MISC(m_pErrorMessages, "0x%08x::OnPause(%lu)\n", this, ulTimeBeforePause); // Set the paused flag m_bPaused = TRUE; return HXR_OK;}STDMETHODIMP CGIFRenderer::OnBuffering(UINT32 ulReason, UINT16 usPercentComplete){ MLOG_MISC(m_pErrorMessages, "0x%08x::OnBuffering(%lu,%u)\n", this, ulReason, usPercentComplete); return HXR_OK;}STDMETHODIMP CGIFRenderer::OnEndofPackets(){ MLOG_MISC(m_pErrorMessages, "0x%08x::OnEndofPackets()\n", this); return HXR_OK;}STDMETHODIMP CGIFRenderer::EndStream(){ MLOG_MISC(m_pErrorMessages, "0x%08x::EndStream()\n", this); // We're finished with the stream, but we may have // more rendering to do HX_RELEASE(m_pStream); return HXR_OK;}STDMETHODIMP CGIFRenderer::AttachSite(IHXSite *pSite){ MLOG_MISC(m_pErrorMessages, "0x%08x::AttachSite(0x%08x)\n", this, pSite); // Check for input error if (pSite == NULL) { return HXR_INVALID_PARAMETER; } // Check to see if we alredy have a site interface if (m_pMISUSSite) { return HXR_UNEXPECTED; } // Save a copy of the IHXSite interface m_pMISUSSite = pSite; m_pMISUSSite->AddRef(); // Fill in the size m_cSize.cx = m_ulWidth; m_cSize.cy = m_ulHeight; // Tell the site of our size m_pMISUSSite->SetSize(m_cSize); // Lets see if we have a new site that supports sub rects. IHXSubRectSite* pSubRectSite = NULL; if(HXR_OK == m_pMISUSSite->QueryInterface(IID_IHXSubRectSite, (void**)&pSubRectSite)) { //If so, since IHXSubRectSite inheirits from IHXSite, lets just //swap the pointers and sign up for the service. HX_RELEASE(m_pMISUSSite); m_pMISUSSite = pSubRectSite; pSubRectSite->SendSubRectMessages(TRUE); // Set the flag m_bCanBltSubRects = TRUE; } // Set the site attached flag m_bSiteAttached = TRUE; return HXR_OK;}STDMETHODIMP CGIFRenderer::DetachSite(){ MLOG_MISC(m_pErrorMessages, "0x%08x::DetachSite()\n", this); if (m_pCallback) { if (m_pCallback->IsCallbackPending()) { m_pCallback->RemovePendingCallback(); } } if (m_pClientAdviseSink) { m_pClientAdviseSink->Close(); } // Release the callback // XXXMEH - MUST DO THIS HERE or we'll have circular // dependency and leak CGIFRenderers HX_RELEASE(m_pCallback); // Release our site interface HX_RELEASE(m_pMISUSSite); // We're done with these... if (m_pMISUS) { m_pMISUS->ReleaseSingleSiteUser(); } HX_RELEASE(m_pMISUS); // Clear the site attached flag m_bSiteAttached = FALSE; return HXR_OK;}STDMETHODIMP_(BOOL) CGIFRenderer::NeedsWindowedSites(){ return FALSE;}STDMETHODIMP CGIFRenderer::InitializeStatistics(UINT32 ulRegistryID){ MLOG_MISC(m_pErrorMessages, "0x%08x::InitializeStatistics(%lu)\n", this, ulRegistryID); // Add our renderer name to the HXRegistry IHXRegistry *pRegistry = NULL; HX_RESULT retVal = m_pContext->QueryInterface(IID_IHXRegistry, (void **) &pRegistry); if (retVal == HXR_OK) { // Get the current registry key name IHXBuffer *pszRegistryName = NULL; retVal = pRegistry->GetPropName(ulRegistryID, pszRegistryName); if (retVal == HXR_OK) { // Create an IHXBuffer to hold the name IHXBuffer* pValue = NULL; if (m_pCommonClassFactory) { IUnknown* pUnknown = NULL; m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pUnknown); if (pUnknown) { pUnknown->QueryInterface(IID_IHXBuffer, (void**)&pValue); HX_RELEASE(pUnknown); } } if (!pValue) { HX_RELEASE(pszRegistryName); HX_RELEASE(pRegistry); return HXR_OUTOFMEMORY; } pValue->AddRef(); // Create the key name char szRegistryEntry[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */ SafeSprintf(szRegistryEntry, MAX_DISPLAY_NAME, "%s.name", pszRegistryName->GetBuffer()); // Set the key value retVal = pValue->Set((const BYTE*) m_pszName, strlen(m_pszName) + 1); if (retVal != HXR_OK) { HX_RELEASE(pValue); HX_RELEASE(pszRegistryName); HX_RELEASE(pRegistry); return retVal; } // Add the key/value pair to the registry pRegistry->AddStr(szRegistryEntry, pValue); HX_RELEASE(pValue); HX_RELEASE(pszRegistryName); } HX_RELEASE(pRegistry); } return retVal;}STDMETHODIMP CGIFRenderer::UpdateStatistics(){ MLOG_MISC(m_pErrorMessages, "0x%08x::UpdateStatistics()\n", this); return HXR_OK;}STDMETHODIMP CGIFRenderer::SetPropertyULONG32(const char* pName, ULONG32 ulVal){ HX_RESULT retVal = HXR_FAIL; if (m_pValues) { // Clear the update needed flag BOOL bUpdateNeeded = FALSE; if (!strcmp(pName, "backgroundOpacity")) { if (ulVal > 255) ulVal = 255; if (ulVal != m_ulBackgroundOpacity) bUpdateNeeded = TRUE; m_ulBackgroundOpacity = ulVal; } else if (!strcmp(pName, "mediaOpacity")) { if (ulVal > 255) ulVal = 255; if (ulVal != m_ulMediaOpacity) bUpdateNeeded = TRUE; m_ulMediaOpacity = ulVal; } else if (!strcmp(pName, "chromaKey")) { if (ulVal != m_ulMediaChromaKey) bUpdateNeeded = TRUE; m_ulMediaChromaKey = ulVal; m_bMediaChromaKeySpecified = TRUE; } else if (!strcmp(pName, "chromaKeyTolerance")) { if (ulVal != m_ulMediaChromaKeyTolerance) bUpdateNeeded = TRUE; m_ulMediaChromaKeyTolerance = ulVal; } else if (!strcmp(pName, "chromaKeyOpacity")) { if (ulVal != m_ulMediaChromaKeyOpacity) bUpdateNeeded = TRUE; m_ulMediaChromaKeyOpacity = ulVal; } // Did any values change? if (bUpdateNeeded) { // If we have not seen our first time sync yet, then // there is no need to update the buffer, since the first // copy has not been done yet if (!m_bFirstTimeSync && m_pGIFCodec) { // Compute the current frame we are on (note that // m_ulCurImg contains the index of the NEXT frame // that we are about to draw UINT32 ulCurFrame = (m_ulCurImg > 0 ? m_ulCurImg - 1 : 0); // Update the buffer // XXXMEH - optimization for later. In some cases if we // just changed the media opacity, then it may not be necessary // to start back at the beginning and rebuild the frame buffer // from the first frame. m_pGIFCodec->GetRGBImageEx(-1, ulCurFrame, m_pOutputBuffer->GetBuffer(), m_pGIFCodec->GetLogicalScreenWidth(), m_pGIFCodec->GetLogicalScreenHeight(), m_ulPadWidth, m_ulBytesPerPixel, m_bRowsInverted, m_bRGBOrdering, m_ulBackgroundColor, (m_ulMediaOpacity == 255 ? FALSE : TRUE), m_ulMediaOpacity, m_bMediaChromaKeySpecified, m_ulMediaChromaKey, m_ulMediaChromaKeyTolerance, m_ulMediaChromaKeyOpacity); // XXXMEH - do dumb assignment for now. We should later check // chroma key to find if any colors were actually encountered. if (m_ulBackgroundOpacity < 255 || m_ulMediaOpacity < 255 || m_bMediaChromaKeySpecified) { m_bUsesAlphaChannel = TRUE; } } } retVal = m_pValues->SetPropertyULONG32(pName, ulVal); } return retVal;}STDMETHODIMP CGIFRenderer::GetPropertyULONG32(const char* pName, REF(ULONG32) rulVal){ HX_RESULT retVal = HXR_FAIL; if (m_pValues) { retVal = m_pValues->GetPropertyULONG32(pName, rulVal); } return retVal;}STDMETHODIMP CGIFRenderer::GetFirstPropertyULONG32(REF(const char*) rpName, REF(ULONG32) rulVal){ HX_RESULT retVal = HXR_FAIL; if (m_pValues) { retVal = m_pValues->GetFirstPropertyULONG32(rpName, rulVal); } return retVal;}STDMETHODIMP CGIFRenderer::GetNextPropertyULONG32(REF(const char*) rpName, REF(ULONG32) rulVal){ HX_RESULT retVal = HXR_FAIL; if (m_pValues) { retVal = m_pValues->GetNextPropertyULONG32(rpName, rulVal); } return retVal;}STDMETHODIMP CGIFRenderer::SetPropertyBuffer(const char* pName, IHXBuffer* pVal){ HX_RESULT retVal = HXR_FAIL; if (m_pValues) { retVal = m_pValues->SetPropertyBuffer(pName, pVal); } return retVal;}STDMETHODIMP CGIFRenderer::GetPropertyBuffer(const char* pName, REF(IHXBuffer*) rpVal){ HX_RESULT retVal = HXR_FAIL; if (m_pValues) { retVal = m_pValues->GetPropertyBuffer(pName, rpVal); } return retVal;}STDMETHODIMP CGIFRenderer::GetFirstPropertyBuffer(REF(const char*) rpName, REF(IHXBuffer*) rpVal){ HX_RESULT retVal = HXR_FAIL; if (m_pValues) { retVal = m_pValues->GetFirstPropertyBuffer(rpName, rpVal); } return retVal;}STDMETHODIMP CGIFRenderer::GetNextPropertyBuffer(REF(const char*) rpName, REF(IHXBuffer*) rpVal){ HX_RESULT retVal = HXR_FAIL; if (m_pValues) { retVal = m_pValues->GetNextPropertyBuffer(rpName, rpVal); } return retVal;}STDMETHODIMP CGIFRenderer::SetPropertyCString(const char* pName, IHXBuffer* pVal){ HX_RESULT retVal = HXR_FAIL; if (m_pValues) { // Check for the default SMIL namespace BOOL bUpdateNeeded = FALSE; if (!strcmp(pName, "SMILDefaultNamespace")) { if (m_ulBackgroundOpacity != 0) { bUpdateNeeded = TRUE; } m_ulBackgroundOpacity = 0; // Update the background color UINT32 ulBgAlpha = 255 - m_ulBackgroundOpacity; m_ulBackgroundColor = (m_ulBackgroundColor & 0x00FFFFFF) |
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -