📄 wbmprend.cpp
字号:
} } } } HX_RELEASE(pBuffer); } return retVal;}STDMETHODIMP CWBMPRenderer::OnTimeSyncOffset(UINT32 ulTime){ // We should force a redraw ONLY on the first time sync after the image // has finished decoding if (m_bFirstDraw) { // Redraw our data by damaging the entire area of our data HXxSize size; m_pSite->GetSize(size); HXxRect damageRect = {0, 0, size.cx, size.cy}; m_pSite->DamageRect(damageRect); m_pSite->ForceRedraw(); // Clear the first draw flag m_bFirstDraw = FALSE; } return HXR_OK;}STDMETHODIMP CWBMPRenderer::GetWindowSize(REF(HXxSize) rSize){ rSize.cx = m_ulImageWidth; rSize.cy = m_ulImageHeight; return HXR_OK;}STDMETHODIMP CWBMPRenderer::IsMouseOverActiveLink(INT16 x, INT16 y, REF(BOOL) rbActive, REF(IHXBuffer*) rpLink){ HX_RESULT retVal = HXR_OK; // We are NOT over a link rbActive = FALSE; return retVal;}STDMETHODIMP CWBMPRenderer::RMASurfaceUpdate(IHXVideoSurface* pSurface){ if (pSurface && m_pSite && m_pDisplayImage) { // Get the size of the site HXxSize size; m_pSite->GetSize(size); // Set up the dst rect HXxRect rDestRect = { 0, 0, size.cx, size.cy}; // Set up the src rect HXxRect rSrcRect = { 0, 0, m_pDisplayImage->GetWidth(), m_pDisplayImage->GetHeight() }; // Set the values in the bitmap info header HXBitmapInfoHeader cHeader; cHeader.biSize = 40; cHeader.biWidth = m_pDisplayImage->GetWidth(); cHeader.biHeight = m_pDisplayImage->GetHeight(); cHeader.biPlanes = 1; cHeader.biBitCount = 32; cHeader.biCompression = HX_RGB; cHeader.biSizeImage = 0; cHeader.biXPelsPerMeter = 0; cHeader.biYPelsPerMeter = 0; cHeader.biClrUsed = 0; cHeader.biClrImportant = 0; cHeader.rcolor = 0; cHeader.gcolor = 0; cHeader.bcolor = 0; // Get the image store IHXBuffer* pBuffer = NULL; m_pDisplayImage->GetImageStore(&pBuffer); if (pBuffer) { // Blit to the video surface pSurface->Blt(pBuffer->GetBuffer(), &cHeader, rDestRect, rSrcRect); } HX_RELEASE(pBuffer); } return HXR_OK;}STDMETHODIMP CWBMPRenderer::HandleClick(INT16 x, INT16 y){ return HXR_OK;}HX_RESULT STDAPICALLTYPE CWBMPRenderer::HXCreateInstance(IUnknown** ppIUnknown){ HX_RESULT retVal = HXR_OK; if (ppIUnknown) { // Set default *ppIUnknown = NULL; // Create the object CWBMPRenderer *pObj = new CWBMPRenderer(); if (pObj) { // QI for IUnknown retVal = pObj->QueryInterface(IID_IUnknown, (void**) ppIUnknown); } else { retVal = HXR_OUTOFMEMORY; } if (FAILED(retVal)) { HX_DELETE(pObj); } } else { retVal = HXR_FAIL; } return HXR_OK;}HX_RESULT CWBMPRenderer::RMASurfaceUpdate2(IHXSubRectVideoSurface* pSurface, HXxRect* pExtents, HXxBoxRegion* pDirtyRegion ){ if (pSurface && m_pSite && m_pDisplayImage) { // Get the size of the site HXxSize size; m_pSite->GetSize(size); //Scale dirty rects. float fx = (float)m_pDisplayImage->GetWidth()/(float)size.cx; float fy = (float)m_pDisplayImage->GetHeight()/(float)size.cy; //Go through each rect in the dirty region and scale it to //generate the src rects. HXBOX* pSrcRects = new HXBOX[pDirtyRegion->numRects]; for( int i=0 ; i<pDirtyRegion->numRects; i++ ) { pSrcRects[i].x1 = (float)pDirtyRegion->rects[i].x1*fx+.5; pSrcRects[i].x2 = (float)pDirtyRegion->rects[i].x2*fx+.5; pSrcRects[i].y1 = (float)pDirtyRegion->rects[i].y1*fy+.5; pSrcRects[i].y2 = (float)pDirtyRegion->rects[i].y2*fy+.5; } //Set up Src region. HXxBoxRegion srcRegion; srcRegion.numRects = pDirtyRegion->numRects; srcRegion.rects = pSrcRects; // Set the values in the bitmap info header HXBitmapInfoHeader cHeader; cHeader.biSize = 40; cHeader.biWidth = m_pDisplayImage->GetWidth(); cHeader.biHeight = m_pDisplayImage->GetHeight(); cHeader.biPlanes = 1; cHeader.biBitCount = 32; cHeader.biCompression = HX_RGB; cHeader.biSizeImage = 0; cHeader.biXPelsPerMeter = 0; cHeader.biYPelsPerMeter = 0; cHeader.biClrUsed = 0; cHeader.biClrImportant = 0; cHeader.rcolor = 0; cHeader.gcolor = 0; cHeader.bcolor = 0; // Get the image store IHXBuffer* pBuffer = NULL; m_pDisplayImage->GetImageStore(&pBuffer); if (pBuffer) { // Blit to the video surface pSurface->BltSubRects(pBuffer->GetBuffer(), &cHeader, pDirtyRegion, &srcRegion, 1.0/fx, 1.0/fy); } HX_RELEASE(pBuffer); HX_VECTOR_DELETE(pSrcRects); } return HXR_OK;}void CWBMPRenderer::_AttachSite(){ //Lets 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); }}STDMETHODIMP CWBMPRenderer::GetName(REF(const char*) rpszName){ rpszName = (const char*) m_pszName; return HXR_OK;}STDMETHODIMP CWBMPRenderer::GetDescription(REF(const char*) rpszDescription){ rpszDescription = (const char*) m_pszDescription; return HXR_OK;}STDMETHODIMP CWBMPRenderer::GetMimeTypes(REF(const char**) rppszMimeType){ rppszMimeType = (const char**) m_ppszMimeType; return HXR_OK;}STDMETHODIMP_(UINT32) CWBMPRenderer::GetPluginVersion(){ return TARVER_ULONG32_VERSION;}STDMETHODIMP_(UINT32) CWBMPRenderer::GetInitialGranularity(){ return 200;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -