📄 spfuncs.cpp
字号:
/***************************************************************************
* Name : spfuncs.cpp
* Title : MBX WinCE slaveport functions
* Author(s) : Imagination Technologies
* Created : 24th Oct 2003
*
* Copyright : 2003 by Imagination Technologies. All rights reserved.
* : No part of this software, either material or conceptual
* : may be copied or distributed, transmitted, transcribed,
* : stored in a retrieval system or translated into any
* : human or computer language in any form by any means,
* : electronic, mechanical, manual or other-wise, or
* : disclosed to third parties without the express written
* : permission of Imagination Technologies Limited, Unit 8,
* : HomePark Industrial Estate, King's Langley, Hertfordshire,
* : WD4 8LZ, U.K.
*
* Description : MBX WinCE slaveport functions.
*
* Platform : WinCE
*
* Modifications:-
* $Log: spfuncs.cpp $
*
*
****************************************************************************/
#include "precomp.h"
extern "C"
{
#include "dispperf.h"
}
static ULONG ulaBltDirn[2][2] = {{MBX2D_TEXTCOPY_BR2TL, MBX2D_TEXTCOPY_TR2BL},
{MBX2D_TEXTCOPY_BL2TR, MBX2D_TEXTCOPY_TL2BR}};
ULONG MBX::OverlapTest( GPEBltParms *pParms )
{
if (!m_bXPositive || !m_bYPositive)
{
if (!(pParms->bltFlags & BLT_TRANSPARENT))
{
/*
* HW bug Fix: The HW tries to optimise SRCCOPY
* but has a bug for SRCMOVE
*/
SlavePortWrite(MBX2D_CTRL_BH | MBX2D_SRCCK_CTRL);
SlavePortWrite( 0 );
SlavePortWrite( 0 );
}
}
return (ulaBltDirn[m_bXPositive][m_bYPositive]);
} /* OverlapTest */
BOOL MBX::SetDstSurf( GPEBltParms *pParms )
{
BOOL bRetVal = TRUE;
// has the DST surface address changed ?
// i.e. has the surface changed ?
//#ifdef CACHE_SURFACES // NOTE : Destination cannot be cached because SyncWithHost does a fill blt.
// if ( (pParms->pDst->Buffer() != m_s2DContext.pvDstLinAddr)
// && (pParms->pDst->Stride() != m_s2DContext.ulDstStride)
// && (pParms->pDst->Format() != m_s2DContext.ulDstFormat)
// )
// {
//#endif
#ifdef PDUMP
PDumpScript("-- DST surface attributes");
#endif
/* update DST surface attributes */
SlavePortWrite( MBX2D_DST_CTRL_BH
| EGPEFormatToDestHW[pParms->pDst->Format()]
| ((pParms->pDst->Stride()<<MBX2D_DST_STRIDE_SHIFT)
& MBX2D_DST_STRIDE_MASK));
SlavePortWrite( ((((MBXSurf*)pParms->pDst)->GetPhysAddr()
>> MBX2D_DST_ADDR_ALIGNSHIFT)
<< MBX2D_DST_ADDR_SHIFT)
& MBX2D_DST_ADDR_MASK);
return bRetVal;
} /* SetDstSurf type 1*/
BOOL MBX::SetDstSurf( GPELineParms *lineParams )
{
BOOL bRetVal = TRUE;
/* has the DST surface address changed? */
/* i.e. has the surface changed? */
#ifdef CACHE_SURFACES
if (lineParams->pDst->Buffer() != m_s2DContext.pvDstLinAddr)
{
#endif
#ifdef PDUMP
PDumpScript("-- DST surface attributes (line)");
#endif
/* update DST surface attributes */
SlavePortWrite(MBX2D_DST_CTRL_BH
| EGPEFormatToDestHW[lineParams->pDst->Format()]
| ((lineParams->pDst->Stride()<<MBX2D_DST_STRIDE_SHIFT) & MBX2D_DST_STRIDE_MASK));
SlavePortWrite(((((MBXSurf*)lineParams->pDst)->GetPhysAddr() >> MBX2D_DST_ADDR_ALIGNSHIFT) << MBX2D_DST_ADDR_SHIFT)
& MBX2D_DST_ADDR_MASK );
#ifdef CACHE_SURFACES
/* set-up details in the 2DContext */
m_s2DContext.pvDstLinAddr = lineParams->pDst->Buffer();
}
#endif
return bRetVal;
} /* SetDstSurf */
BOOL MBX::SetMBXPalette ( GPEBltParms *pParms,
EGPEFormat eSrcFormat,
PALETTE_TYPE ePalType
)
{
ULONG ulNumEntries;
ULONG *pulPalette, *pulDstPal;
EGPEFormat eDstFormat = pParms->pDst->Format();
ASSERT ((ePalType == eSrcPalette) || (ePalType == ePatPalette));
#ifdef PDUMP
PDumpScript("-- Set Palette");
#endif
if (pParms->pLookup)
{
pulPalette = pParms->pLookup;
}
else
{
return (TRUE); /* skip palette if ptr is NULL */
}
ulNumEntries = 1<<EGPEFormatToBpp[eSrcFormat];
ASSERT (m_sPaletteInfo.prgbqSrcPalette);
ASSERT (m_sPaletteInfo.prgbqPatPalette);
if (pParms->pConvert)
{
/* compute best match palette */
for (ULONG ulCnt = 0; ulCnt < ulNumEntries; ulCnt++)
{
pulPalette[ulCnt] = (pParms->pColorConverter->*(pParms->pConvert))( pulPalette[ulCnt] );
}
}
/* which palette to update? */
pulDstPal = (ULONG *)((ePalType == ePatPalette) ? m_sPaletteInfo.prgbqPatPalette
: m_sPaletteInfo.prgbqSrcPalette);
while(ulNumEntries--)
{
*pulDstPal++ = DestToABGR(eDstFormat, *pulPalette);
pulPalette++;
}
/* notify MBX that the palette has changed */
if (ePalType == ePatPalette)
{
SlavePortWrite(MBX2D_PAT_PAL_BH);
SlavePortWrite(m_sPaletteInfo.ulPatPalettePhys);
}
else
{
SlavePortWrite(MBX2D_SRC_PAL_BH);
SlavePortWrite(m_sPaletteInfo.ulSrcPalettePhys);
}
return (TRUE);
} /* SetMBXPalette */
/*****************************************************************************
FUNCTION : WriteDestRect
PURPOSE : Sends Dest rectangle info to slave port.
PARAMETERS : none
RETURN : nothing
*****************************************************************************/
VOID MBX::WriteDestRect (MBXSurf *pSurf, RECTL *prclDst)
{
#ifdef ROTATE_ENABLE
RECTL rclDst;
/* Write Destination rectangle to the Slave Port */
switch (m_ulBltRotationHw)
{
case MBX2D_TEXTROT_90DEGS:
rclDst.top = m_PhysDestWidth - prclDst->bottom;
rclDst.left = prclDst->left;
rclDst.bottom = m_PhysDestWidth - prclDst->top;
rclDst.right = prclDst->right;
break;
case MBX2D_TEXTROT_180DEGS:
rclDst.top = m_PhysDestHeight - prclDst->bottom;
rclDst.left = m_PhysDestWidth - prclDst->right;
rclDst.bottom = m_PhysDestHeight - prclDst->top;
rclDst.right = m_PhysDestWidth - prclDst->left;
break;
case MBX2D_TEXTROT_270DEGS:
rclDst.top = prclDst->top;
rclDst.left = m_PhysDestHeight - prclDst->right;
rclDst.bottom = prclDst->bottom;
rclDst.right = m_PhysDestHeight - prclDst->left;
break;
default:
/* Src and dst are the same OR no rotation */
switch (pSurf->Rotate())
{
case DMDO_90:
rclDst.left = prclDst->top;
rclDst.right = prclDst->bottom;
rclDst.top = m_nScreenHeightSave - prclDst->right;
rclDst.bottom = m_nScreenHeightSave - prclDst->left;
break;
case DMDO_180:
rclDst.left = m_nScreenWidthSave - prclDst->right;
rclDst.right = m_nScreenWidthSave - prclDst->left;
rclDst.top = m_nScreenHeightSave - prclDst->bottom;
rclDst.bottom = m_nScreenHeightSave - prclDst->top;
break;
case DMDO_270:
rclDst.left = m_nScreenWidthSave - prclDst->bottom;
rclDst.right = m_nScreenWidthSave - prclDst->top;
rclDst.top = prclDst->left;
rclDst.bottom = prclDst->right;
break;
default:
rclDst = *prclDst;
break;
}
break;
}
SlavePortWrite( ((SHORT)rclDst.top & MBX2D_DST_YSTART_MASK) |
(((SHORT)rclDst.left << MBX2D_DST_XSTART_SHIFT) & MBX2D_DST_XSTART_MASK) );
SlavePortWrite( ((SHORT)rclDst.bottom & MBX2D_DST_YEND_MASK) |
(((SHORT)rclDst.right << MBX2D_DST_XEND_SHIFT) & MBX2D_DST_XEND_MASK) );
#else
SlavePortWrite( ((SHORT)prclDst->top & MBX2D_DST_YSTART_MASK) |
(((SHORT)prclDst->left << MBX2D_DST_XSTART_SHIFT) & MBX2D_DST_XSTART_MASK) );
SlavePortWrite( ((SHORT)prclDst->bottom & MBX2D_DST_YEND_MASK) |
(((SHORT)prclDst->right << MBX2D_DST_XEND_SHIFT) & MBX2D_DST_XEND_MASK) );
#endif
}
/*****************************************************************************
FUNCTION : WriteClipRect
PURPOSE : Sends Dest rectangle info to slave port.
PARAMETERS : none
RETURN : nothing
*****************************************************************************/
VOID MBX::WriteClipRect (MBXSurf *pSurf, RECTL *prclClip)
{
#ifdef ROTATE_ENABLE
RECTL rclClip;
/* Write Destination rectangle to the Slave Port */
switch (m_ulBltRotationHw)
{
case MBX2D_TEXTROT_90DEGS:
rclClip.top = m_PhysDestWidth - prclClip->bottom;
rclClip.left = prclClip->left;
rclClip.bottom = m_PhysDestWidth - prclClip->top;
rclClip.right = prclClip->right;
break;
case MBX2D_TEXTROT_180DEGS:
rclClip.top = m_PhysDestHeight - prclClip->bottom;
rclClip.left = m_PhysDestWidth - prclClip->right;
rclClip.bottom = m_PhysDestHeight - prclClip->top;
rclClip.right = m_PhysDestWidth - prclClip->left;
break;
case MBX2D_TEXTROT_270DEGS:
rclClip.top = prclClip->top;
rclClip.left = m_PhysDestHeight - prclClip->right;
rclClip.bottom = prclClip->bottom;
rclClip.right = m_PhysDestHeight - prclClip->left;
break;
default:
/* Src and dst are the same OR no rotation */
switch (pSurf->Rotate())
{
case DMDO_90:
rclClip.left = prclClip->top;
rclClip.right = prclClip->bottom;
rclClip.top = m_nScreenHeightSave - prclClip->right;
rclClip.bottom = m_nScreenHeightSave - prclClip->left;
break;
case DMDO_180:
rclClip.left = m_nScreenWidthSave - prclClip->right;
rclClip.right = m_nScreenWidthSave - prclClip->left;
rclClip.top = m_nScreenHeightSave - prclClip->bottom;
rclClip.bottom = m_nScreenHeightSave - prclClip->top;
break;
case DMDO_270:
rclClip.left = m_nScreenWidthSave - prclClip->bottom;
rclClip.right = m_nScreenWidthSave - prclClip->top;
rclClip.top = prclClip->left;
rclClip.bottom = prclClip->right;
break;
default:
rclClip = *prclClip;
break;
}
break;
}
SlavePortWrite( MBX2D_CLIP_BH |
((1<<MBX2D_CLIPCOUNT_SHIFT) &
MBX2D_CLIPCOUNT_MASK) );
/* Write Clip rectangles to the slave port */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -