📄 videorendereroverlay3.cpp
字号:
/*
///////////////////////////////////////////////////////////////////////////////
// //
// Copyright (C) 2006-2008 Beijing, pengzhen (pengzhenxp@yahoo.com.cn) //
// //
///////////////////////////////////////////////////////////////////////////////
*/
BOOL MediaVideoRendererOverlay::SetDrawRect(HWND hwnd , int wHWCardNo )
{
if( hwnd ) m_hWnd = hwnd ;
m_iCurCardOverlayNo_Bak = m_iCurCardOverlayNo = wHWCardNo ;
//if( !( m_hWnd ) ) return FALSE ;
GetWindowRect(m_hWnd, &m_rdRect );
//if( m_bIsOverlayFlag )
{
Get_rdRect_op() ;
#ifdef __INSERT_FONT__
SetFontPos( ) ; //InvalidateFont() ;
#endif //__INSERT_FONT__
}
if( m_bIsOverlayFlag || m_bIsOverlayRGBFlag )
{
lpdd->RestoreAllSurfaces();
if( SUCCEEDED( lpddClipper->SetHWnd(0, m_hWnd) ) )
{
lpddsPrimary->SetClipper( lpddClipper );
}
if(m_bIsOverlayFlag) ConvertGDIColor( GetColorkey() ) ;
}
return TRUE ;
}
void MediaVideoRendererOverlay::Draw()
{
if( m_bIsOverlayFlag )
{
//m_pdd->RestoreAllSurfaces();
m_pddsOverlay->UpdateOverlay(NULL, m_pddsPrimary,
NULL, DDOVER_HIDE, NULL);
m_pdd->RestoreAllSurfaces();
}
}
void MediaVideoRendererOverlay::GetData( BYTE *dst, BYTE *src )
{
if( m_bIsOverlayRGBFlag )
{
if( m_vidWidth1 == m_pitch )
fast_memcpy( dst, (BYTE*)m_pSurfaceAddress, m_pitch * m_vidHeight ) ;
else
fast_memcpy1( dst, m_vidWidth1, (BYTE*)m_pSurfaceAddress, m_pitch, m_vidWidth1, m_vidHeight ) ;
}
else
{
fast_memcpy1( dst, m_vidWidth1, src, m_pitch, m_vidWidth1, m_vidHeight ) ;
}
}
void MediaVideoRendererOverlay::Draw(BYTE *src, BYTE* lpTextContext, int iTexWidth, int iTexHeight )
{
if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay,
&m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST )
{
m_pdd->RestoreAllSurfaces(); GetSurfaceAddress();
}
else
{
fast_mem_or( (BYTE*)src , m_vidWidth1 , lpTextContext, iTexWidth , iTexWidth , iTexHeight );
if( m_vidWidth1 == m_pitch )
fast_memcpy( (BYTE*)m_pSurfaceAddress, src , m_pitch * m_vidHeight ) ;
else
fast_memcpy1( (BYTE*)m_pSurfaceAddress, m_pitch, src , m_vidWidth1, m_vidWidth1, m_vidHeight ) ;
//if( lpTextContext )
//fast_mem_or( (BYTE*)m_pSurfaceAddress , m_pitch , lpTextContext, iTexWidth , iTexWidth , iTexHeight );
}
}
void MediaVideoRendererOverlay::Draw( BYTE* lpTextContext, int iTexWidth, int iTexHeight )
{
if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay,
&m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST )
{
m_pdd->RestoreAllSurfaces(); GetSurfaceAddress();
}
else
{
//if( lpTextContext )
fast_mem_or( (BYTE*)m_pSurfaceAddress , m_pitch , lpTextContext, iTexWidth , iTexWidth , iTexHeight );
}
}
void MediaVideoRendererOverlay::Draw( int iCurCardNo, BYTE** lpDPhyAdr )
{
if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay,
&m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST )
{
m_pdd->RestoreAllSurfaces(); GetSurfaceAddress(); *lpDPhyAdr = (BYTE*)m_pSurfacePhyAddress;
}
}
void MediaVideoRendererOverlay::Draw(int iCurCardNo , BYTE *dst, BYTE *src )
{
if( m_bIsOverlayRGBFlag )
{
if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay,
&m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST )
{
m_pdd->RestoreAllSurfaces(); GetSurfaceAddress();
}
else
{
if( m_vidWidth1 == m_pitch )
fast_memcpy( (BYTE*)m_pSurfaceAddress, src , m_pitch * m_vidHeight ) ;
else
fast_memcpy1( (BYTE*)m_pSurfaceAddress, m_pitch, src , m_vidWidth1, m_vidWidth1, m_vidHeight ) ;
}
}
else
{
fast_memcpy1( dst, m_pitch, src, m_vidWidth1, m_vidWidth1, m_vidHeight ) ;
if( iCurCardNo == m_iCurCardOverlayNo )
{
//m_pdd->RestoreAllSurfaces();
m_pddsOverlay->UpdateOverlay( &m_rsRect_op, m_pddsPrimary,
&m_rdRect_op, m_dwUpdateFlags, &m_ovfx );
}
}
}
void MediaVideoRendererOverlay::Draw( int iCurCardNo )
{
if( m_bIsOverlayRGBFlag )
{
if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay,
&m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST )
{
m_pdd->RestoreAllSurfaces(); GetSurfaceAddress();
}
}
else
{
if( iCurCardNo == m_iCurCardOverlayNo )
{
#ifdef __YUV420P__
if( ! GetSurfaceAddress( FALSE ) ) //YUV420 planar
{
m_pdd->RestoreAllSurfaces(); return ;
}
#else // !__YUV420P__
//m_pdd->RestoreAllSurfaces();
#endif //__YUV420P__
m_pddsOverlay->UpdateOverlay( &m_rsRect_op, m_pddsPrimary,
&m_rdRect_op, m_dwUpdateFlags, &m_ovfx );
}
}
}
#ifdef MPEG4D_API
void MediaVideoRendererOverlay::Draw(int iCurCardNo, dvp_ctx* lpVideoDec , pack_yuv420_function convert_yuv)
{
if( m_bIsOverlayRGBFlag )
{
if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay,
&m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST )
{
m_pdd->RestoreAllSurfaces(); GetSurfaceAddress();
}
else
{
if( convert_yuv )
convert_yuv( (unsigned char*)lpVideoDec->i420_y, lpVideoDec->width, \
(unsigned char*)lpVideoDec->i420_u, \
(unsigned char*)lpVideoDec->i420_v, (lpVideoDec->width>>1),\
(unsigned char*)m_pSurfaceAddress, lpVideoDec->width,lpVideoDec->height, m_pitch ) ;
}
}
else
{
if( iCurCardNo == m_iCurCardOverlayNo )
{
#ifdef __YUV420P__
if( ! GetSurfaceAddress( FALSE ) ) //YUV420 planar
{
m_pdd->RestoreAllSurfaces(); return ;
}
#else // !__YUV420P__
//m_pdd->RestoreAllSurfaces();
#endif //__YUV420P__
m_pddsOverlay->UpdateOverlay( &m_rsRect_op, m_pddsPrimary,
&m_rdRect_op, m_dwUpdateFlags, &m_ovfx );
}
}
}
#endif //MPEG4D_API
void MediaVideoRendererOverlay::GetDrawRect( )
{
int i , cy , cx ;
for ( i=0 ; i < m_iTotalCard ; i++)
{
cy = i / m_iCardNo_CX ;
cx = i - cy*m_iCardNo_CX ;
m_rsRect_bak[i].left = cx*m_vidWidth ;
m_rsRect_bak[i].top = cy*m_vidHeight ;
m_rsRect_bak[i].right = m_rsRect_bak[i].left+ m_vidWidth*m_iScroll_CX ;
m_rsRect_bak[i].bottom = m_rsRect_bak[i].top + m_vidHeight*m_iScroll_CY ;
}
}
#define Def_GetCurCardNo() (int)((lpPos.y/m_rdHei)*m_iCardNo_CY + lpPos.x/m_rdWid + m_iScrollPageNo_Bak)
WORD MediaVideoRendererOverlay::GetCurCardNo( POINT lpPos )
{
WORD wHWCardNo = Def_GetCurCardNo() ;
return ( wHWCardNo < m_iTotalCard ) ? wHWCardNo : 0 ;
}
WORD MediaVideoRendererOverlay::SetCurCardFullWin( POINT lpPos )
{
WORD wHWCardNo = Def_GetCurCardNo() ;
return SetCurCardFullWin1( wHWCardNo ) ;
}
WORD MediaVideoRendererOverlay::SetCurCardFullWin1( int wHWCardNo )
{
if( wHWCardNo >= m_iTotalCard ) return 0 ;
if( ( m_iScroll_CX == 1 ) & ( m_iScroll_CY == 1 ) ) return wHWCardNo ; // always full windows
m_iCurCardFullFlag = ! m_iCurCardFullFlag ;
if( m_iCurCardFullFlag )
{
m_iCurCardOverlayNo_Bak = m_iCurCardOverlayNo;
m_iCurCardOverlayNo = wHWCardNo - m_iScrollPageNo_Bak ;
int cy , cx ;
cy = wHWCardNo / m_iCardNo_CX ;
cx = wHWCardNo - cy*m_iCardNo_CX ;
m_rsRect_op.left = cx*m_vidWidth ;
m_rsRect_op.top = cy*m_vidHeight ;
m_rsRect_op.right = m_rsRect_op.left+ m_vidWidth ;
m_rsRect_op.bottom = m_rsRect_op.top + m_vidHeight ;
#ifdef __INSERT_FONT__
SetFontPos( ) ; InvalidateFont() ;
#endif //__INSERT_FONT__
}
else
{
m_iCurCardOverlayNo = m_iCurCardOverlayNo_Bak ;
m_rsRect_op = m_rsRect_bak[ m_iCurCardOverlayNo_Bak ] ;
#ifdef __INSERT_FONT__
SetFontPos( ) ; // InvalidateFont() ;
#endif //__INSERT_FONT__
}
return wHWCardNo ;
}
#ifdef __INSERT_FONT__
void MediaVideoRendererOverlay::InvalidateFont()
{
RECT lpRect={0};
lpRect.right = m_rdRect.right - m_rdRect.left ;
lpRect.bottom = m_rdRect.bottom - m_rdRect.top ;
if(m_hWnd) InvalidateRect(m_hWnd, &lpRect, FALSE );
}
void MediaVideoRendererOverlay::SetFontPos( )
{
int wid , hei ;
wid = ( m_rdRect.right - m_rdRect.left ) / m_iScroll_CX ;
hei = ( m_rdRect.bottom - m_rdRect.top ) / m_iScroll_CY;
memset(m_pFontView, 0 , sizeof(BOOL)*m_iTotalCard );
for ( int cy=0 ; cy < m_iScroll_CY ; cy++)
{
for ( int cx=0 ; cx < m_iScroll_CX ; cx++)
{
int i = cx + cy*m_iCardNo_CX + m_iScrollPageNo_Bak ;
if( m_iCurCardFullFlag )
{
m_pFontPos[i].x = 0 ;
m_pFontPos[i].y = 0 ;
}
else
{
m_pFontPos[i].x = cx*wid ;
m_pFontPos[i].y = cy*hei ;
}
m_pFontView[i] = (m_iCurCardFullFlag==FALSE) |
( (m_iCurCardFullFlag==TRUE) & (i ==m_iCurCardOverlayNo+m_iScrollPageNo_Bak) ) ;
}
}
}
void MediaVideoRendererOverlay::DrawText( int iCardNo ,
TCHAR* lpText , COLORREF dwTextColor )
{
if( !m_pFontView[iCardNo] ) return ;
HDC hDC ;
hDC = ::GetDC(m_hWnd) ;
SetBkColor( hDC, GetColorkey() );
SetTextColor( hDC, dwTextColor );
TextOut( hDC, m_pFontPos[iCardNo].x, m_pFontPos[iCardNo].y, lpText, strlen(lpText) );
ReleaseDC(m_hWnd, hDC );
}
#endif //__INSERT_FONT__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -