brushrnd.cpp
来自「linux下的一款播放器」· C++ 代码 · 共 538 行 · 第 1/2 页
CPP
538 行
STDMETHODIMP CBrushRenderer::GetWindowSize(REF(HXxSize) rSize){ rSize.cx = 1; rSize.cy = 1; return HXR_OK;}STDMETHODIMP CBrushRenderer::IsMouseOverActiveLink(INT16 x, INT16 y, REF(BOOL) rbActive, REF(IHXBuffer*) rpLink){ HX_RESULT retVal = HXR_OK; rbActive = FALSE; return retVal;}STDMETHODIMP CBrushRenderer::RMASurfaceUpdate(IHXVideoSurface* pSurface){ HX_RESULT retVal = HXR_FAIL; if (pSurface && m_pHeader && !m_bNullBrush) { retVal = SetupBuffer(); if (SUCCEEDED(retVal)) { // Set up the src and dst rect HXxRect rSrcRect = {0, 0, m_pHeader->biWidth, m_pHeader->biHeight}; HXxRect rDstRect = rSrcRect; // Blit to the video surface retVal = pSurface->Blt(m_pucBuffer, m_pHeader, rDstRect, rSrcRect); } } return retVal;}STDMETHODIMP CBrushRenderer::HandleClick(INT16 x, INT16 y){ return HXR_OK;}STDMETHODIMP CBrushRenderer::SetPropertyULONG32(const char* pName, ULONG32 ulVal){ HX_RESULT retVal = HXR_OK; if (pName) { // Clear the flag BOOL bChromaKeyUpdate = FALSE; // Switch based on property name if (!strcmp(pName, "color")) { // Preserve the current alpha from the // color and set the color from ulVal m_ulColor = (m_ulColor & 0xFF000000) | (ulVal & 0x00FFFFFF); } else if (!strcmp(pName, "mediaOpacity") || !strcmp(pName, "backgroundOpacity")) { // Cap the opacity if (ulVal > 255) ulVal = 255; // Update the color m_ulColor = (m_ulColor & 0x00FFFFFF) | (((255 - ulVal) << 24) & 0xFF000000); } else if (!strcmp(pName, "chromaKey")) { // Save the value m_ulChromaKey = ulVal; m_bChromaKeySpecified = TRUE; // We do need to update the color bChromaKeyUpdate = TRUE; } else if (!strcmp(pName, "chromaKeyTolerance")) { // Save the value m_ulChromaKeyTolerance = ulVal & 0x00FFFFFF; // If we have a chroma key already specified, then update if (m_bChromaKeySpecified) { bChromaKeyUpdate = TRUE; } } else if (!strcmp(pName, "chromaKeyOpacity")) { // Cap the value if (ulVal > 255) ulVal = 255; // Save the value m_ulChromaKeyOpacity = ulVal; // If we have a chroma key already specified, then update if (m_bChromaKeySpecified) { bChromaKeyUpdate = TRUE; } } // If we need to update the color because of // chroma key changes, then do it now if (bChromaKeyUpdate && DoesChromaKeyMatch(m_ulColor, m_ulChromaKey, m_ulChromaKeyTolerance)) { // Update the color m_ulColor = (m_ulColor & 0x00FFFFFF) | (((255 - m_ulChromaKeyOpacity) << 24) & 0xFF000000); } // Now pass this on to our base class retVal = CRNBaseRenderer::SetPropertyULONG32(pName, ulVal); } else { retVal = HXR_FAIL; } return retVal;}HX_RESULT STDAPICALLTYPE CBrushRenderer::HXCreateInstance(IUnknown** ppIUnknown){ HX_RESULT retVal = HXR_FAIL; if (ppIUnknown) { // Create the object CBrushRenderer* pObj = new CBrushRenderer(); if (pObj) { // QI for IUnknown retVal = pObj->QueryInterface(IID_IUnknown, (void**) ppIUnknown); } } return retVal;}HX_RESULT STDAPICALLTYPE CBrushRenderer::CanUnload2(){ return ((CHXBaseCountingObject::ObjectsActive() > 0) ? HXR_FAIL : HXR_OK );}HX_RESULT CBrushRenderer::RMASurfaceUpdate2(IHXSubRectVideoSurface* pSurface, HXxRect* pExtents, HXxBoxRegion* pDirtyRegion){ HX_RESULT retVal = HXR_FAIL; if (pSurface && m_pHeader && !m_bNullBrush) { retVal = SetupBuffer(); if (SUCCEEDED(retVal)) { retVal = pSurface->BltSubRects(m_pucBuffer, m_pHeader, pDirtyRegion, pDirtyRegion, 1.0,1.0 ); } } return retVal;}void CBrushRenderer::_AttachSite(){ if (m_pSite) { // Subscribe to the sub rect messages, HX_SURFACE_UPDATE2. IHXSubRectSite* pSubRectSite = NULL; m_pSite->QueryInterface(IID_IHXSubRectSite, (void**) &pSubRectSite); if (pSubRectSite) { // If so, since IHXSubRectSite inheirits from IHXSite, lets // just swap the pointers and sign up for the service. HX_RELEASE(m_pSite); m_pSite = pSubRectSite; pSubRectSite->SendSubRectMessages(TRUE); } }}HX_RESULT CBrushRenderer::SetupBuffer(){ HX_RESULT retVal = HXR_FAIL; if (m_pSite && m_pHeader) { // Get the site's current size HXxSize cSize = {0, 0}; m_pSite->GetSize(cSize); // Make sure the site has non-zero dimensions if (cSize.cx > 0 && cSize.cy > 0) { // Do we need to allocate a buffer? BOOL bAllocated = FALSE; if (!m_pucBuffer || m_pHeader->biWidth != cSize.cx || m_pHeader->biHeight != cSize.cy) { UINT32 ulNumBytes = (UINT32) cSize.cx * cSize.cy * 4; HX_VECTOR_DELETE(m_pucBuffer); m_pucBuffer = new BYTE [ulNumBytes]; if (m_pucBuffer) { m_pHeader->biWidth = cSize.cx; m_pHeader->biHeight = cSize.cy; m_pHeader->biSizeImage = ulNumBytes; bAllocated = TRUE; } } if (m_pucBuffer) { // Do we need to fill in the color? if (bAllocated || m_ulLastColor != m_ulColor) { // Fill in the buffer UINT32 ulNumPix = (UINT32) cSize.cx * cSize.cy; UINT32* pPix = (UINT32*) m_pucBuffer; while (ulNumPix--) { *pPix++ = m_ulColor; } // Save this color m_ulLastColor = m_ulColor; // Set the bitmap info header compression m_pHeader->biCompression = (m_ulColor & 0xFF000000 ? HX_ARGB : HX_RGB); } // Clear the return value retVal = HXR_OK; } } } return retVal;}STDMETHODIMP CBrushRenderer::GetName(REF(const char*) rpszName){ rpszName = (const char*) m_pszName; return HXR_OK;}STDMETHODIMP CBrushRenderer::GetDescription(REF(const char*) rpszDescription){ rpszDescription = (const char*) m_pszDescription; return HXR_OK;}STDMETHODIMP CBrushRenderer::GetMimeTypes(REF(const char**) rppszMimeType){ rppszMimeType = (const char**) m_ppszMimeType; return HXR_OK;}STDMETHODIMP_(UINT32) CBrushRenderer::GetPluginVersion(){ return TARVER_ULONG32_VERSION;}STDMETHODIMP_(UINT32) CBrushRenderer::GetInitialGranularity(){ return 200;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?