📄 minisurf.cpp
字号:
m_fpColorConverter = XINGtoRGB32;
#endif //HELIX_FEATURE_CC_YUY2out
#if defined (HELIX_FEATURE_CC_RGB565out)
if (nDstCID == CID_RGB565)
m_fpColorConverter = XINGtoRGB565;
#endif //HELIX_FEATURE_CC_RGB565out
m_nSrcPitch = 768;
break;
}
HX_ASSERT(m_fpColorConverter);
#if defined(HELIX_CONFIG_NOSTATICS)
SetSrcI420Colors (0, 0, 0, 0, GetColorData());
#else
SetSrcI420Colors (0, 0, 0, 0);
SetDestI420Colors (0, 0, 0, 0);
SetI420ChromaResamplingMode (0);
#endif
return m_fpColorConverter ? HXR_OK : HXR_FAIL;
}
/************************************************************************
* Method:
* IHXVideoSurface::Blt
*/
STDMETHODIMP CMiniBaseSurface::Blt(UCHAR* pSrcBuffer,
HXBitmapInfoHeader* pBitmapInfo,
REF(HXxRect) rDestRect,
REF(HXxRect) rSrcRect)
{
HX_RESULT hr = BeginOptimizedBlt(pBitmapInfo);
if (FAILED(hr))
{
return hr;
}
int nDstWidth = rDestRect.right - rDestRect.left;
int nDstHeight = rDestRect.bottom - rDestRect.top;
// ensure destination buffers are allocated, ensuring that we properly handle image stretching.
if(ScaleDuringRender(GetDstCID()))
{
hr = AllocateDestBuffers(pBitmapInfo->biWidth, pBitmapInfo->biHeight);
}
else
{
// we stretch during the transfer from source to dest
// buffer; dest buffer must be same size as dest rect.
hr = AllocateDestBuffers(nDstWidth, nDstHeight);
}
if(FAILED(hr))
{
return hr;
}
UCHAR* pDestBuffer = NULL;
LONG32 nDestPitch = 0;
HXxSize dstSize = m_dstBufSize;
hr = _LockDestBuffer(&pDestBuffer,
&nDestPitch,
m_nSrcCID,
dstSize);
if (FAILED(hr))
return hr;
HXxRect rcDst = rDestRect;
HXxRect rcSrc = rSrcRect;
// If the dest buffer dimensions do not match the dest rect,
// map the dest rect to the dest buffer for video transfer.
if ((m_dstBufSize.cx != nDstWidth) |
(m_dstBufSize.cy != nDstHeight))
{
rcDst.left = (rcDst.left*m_dstBufSize.cx) / nDstWidth;
rcDst.right = (rcDst.right*m_dstBufSize.cx) / nDstWidth;
rcDst.top = (rcDst.top*m_dstBufSize.cy) / nDstHeight;
rcDst.bottom = (rcDst.bottom*m_dstBufSize.cy) / nDstHeight;
}
hr = _TransferToDestBuffer(pSrcBuffer,
pBitmapInfo,
&rcSrc,
&rcDst,
pDestBuffer,
nDestPitch);
_UnlockDestBuffer(pDestBuffer);
if (SUCCEEDED(hr))
hr = _RenderDestBuffer(&rcDst, &rDestRect);
//Give the device a chance to keep the screen alive.
_KeepScreenAlive();
return hr;
}
/************************************************************************
* Method:
* IHXVideoSurface::OptimizedBlt
*/
STDMETHODIMP CMiniBaseSurface::OptimizedBlt(UCHAR* pSrcBuffer,
REF(HXxRect) rDestRect,
REF(HXxRect) rSrcRect)
{
return Blt(pSrcBuffer,
m_pOptimizedFormat,
rDestRect,
rSrcRect);
}
/************************************************************************
* Method:
* IHXVideoSurface::EndOptimizedBlt
*/
STDMETHODIMP CMiniBaseSurface::EndOptimizedBlt(void)
{
HX_RESULT hr = DestroyDestBuffers(m_nDstBuffers);
HX_DELETE(m_pOptimizedFormat);
m_nSrcCID = CID_UNKNOWN;
return hr;
}
/************************************************************************
* Method:
* IHXVideoSurface::GetOptimizedFormat
*/
STDMETHODIMP CMiniBaseSurface::GetOptimizedFormat(REF(HX_COMPRESSION_TYPE) ulType)
{
ulType = 0;
return HXR_OK;
}
/************************************************************************
* Method:
* IHXVideoSurface::GetPreferredFormat
*/
STDMETHODIMP CMiniBaseSurface::GetPreferredFormat(REF(HX_COMPRESSION_TYPE) ulType)
{
ulType = 0;
return HXR_OK;
}
HX_RESULT
CMiniBaseSurface::_TransferToDestBuffer(UCHAR* pSrcBuffer,
HXBitmapInfoHeader* pBitmapInfo,
HXxRect* prSrcRect,
HXxRect* prDstRect,
UCHAR* pDstBuffer,
LONG32 nDstPitch)
{
if (!m_fpColorConverter)
return HXR_FAIL;
int nRet = m_fpColorConverter( pDstBuffer,
m_dstBufSize.cx,
m_dstBufSize.cy,
nDstPitch,
prDstRect->left, prDstRect->top,
prDstRect->right-prDstRect->left,
prDstRect->bottom-prDstRect->top,
pSrcBuffer,
pBitmapInfo->biWidth,
pBitmapInfo->biHeight,
m_nSrcPitch,
prSrcRect->left, prSrcRect->top,
prSrcRect->right-prSrcRect->left,
prSrcRect->bottom-prSrcRect->top
#if defined(HELIX_CONFIG_NOSTATICS)
,GetColorData()
#endif
);
if (nRet < 0)
return HXR_FAIL;
else
return HXR_OK;
}
BOOL CMiniBaseSurface::ScaleDuringRender(int nCID)
{
// Our YUVtoYUV color converters do not scale so scaling
// must be done during rendering.
//
// Our XXXtoRGB do scaling
return (nCID == CID_DVPF) |
(nCID >= CID_I420 && nCID <= CID_UYVY);
}
HX_RESULT CMiniBaseSurface::AllocateDestBuffers(int nWidth,
int nHeight,
int nCount)
{
if (nWidth == m_dstBufSize.cx &&
nHeight == m_dstBufSize.cy &&
nCount == m_nDstBuffers)
{
return HXR_OK;
}
else
{
DestroyDestBuffers(m_nDstBuffers);
}
HX_RESULT hr = _CreateDestBuffer(m_nSrcCID, nWidth, nHeight, nCount);
if (HXR_OK == hr)
{
m_dstBufSize.cx = nWidth;
m_dstBufSize.cy = nHeight;
m_nDstBuffers = nCount;
}
return hr;
}
HX_RESULT CMiniBaseSurface::DestroyDestBuffers(int nCount)
{
HX_RESULT hr = HXR_OK;
if (m_dstBufSize.cx || m_dstBufSize.cy)
{
hr = _DestroyDestBuffer(m_nSrcCID, nCount);
memset(&m_dstBufSize, 0, sizeof(m_dstBufSize));
m_nDstBuffers = 0;
}
return hr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -