⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sa2video.cpp

📁 Xcale270Bsp包,wince平台
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				bounds.right = pParms->xStart + 1;
				bounds.bottom = pParms->yStart + 1;
				bounds.left = pParms->xStart - pParms->cPels;
				bounds.top = bounds.bottom - N_plus_1;
				break;
			case 5:
				bounds.right = pParms->xStart + 1;
				bounds.bottom = pParms->yStart + 1;
				bounds.top = pParms->yStart - pParms->cPels;
				bounds.left = bounds.right - N_plus_1;
				break;
			case 6:
				bounds.left = pParms->xStart;
				bounds.bottom = pParms->yStart + 1;
				bounds.top = pParms->yStart - pParms->cPels;
				bounds.right = bounds.left + N_plus_1;
				break;
			case 7:
				bounds.left = pParms->xStart;
				bounds.bottom = pParms->yStart + 1;
				bounds.right = pParms->xStart + pParms->cPels + 1;
				bounds.top = bounds.bottom - N_plus_1;
				break;
			default:
				DEBUGMSG(GPE_ZONE_ERROR,(TEXT("Invalid direction: %d\r\n"),pParms->iDir));
				return E_INVALIDARG;
		}
		DispDrvrDirtyRectDump((LPRECT)&bounds);
	}
	return code;
}
   
#undef SWAP
#define SWAP(a,b,type) { type tmp=a; a=b; b=tmp; }
int EmulatedBltFill16_C(WORD* pDst, WORD color, int width, int height, unsigned int step)
{
	int r, w;
	step >>= 1; //in 16-bit
	step -= width;
	for ( r = 0; r < height; r ++ ) {
		for ( w = 0; w < width; w ++ ) {
			*pDst++ = color;
		}
		pDst += step;
	}
	return 0;
}
extern "C" SCODE EmulatedBltFill16ASM(WORD* pDst, WORD color, int width, int height, unsigned int step);

SCODE	EmulatedBltSrcCopy0416( GPEBltParms *pParms );
SCODE	EmulatedBltSrcCopy0116( GPEBltParms *pParms );
SCODE	EmulatedBltSrcCopy0808( GPEBltParms *pParms );
SCODE	EmulatedBltSrcCopy0408( GPEBltParms *pParms );
SCODE	EmulatedBltSrcCopy0108( GPEBltParms *pParms );

__inline SCODE EmulatedBltFill16_Eml( GPEBltParms *pBltParms )
{
	DEBUGMSG(GPE_ZONE_BLT_HI,(TEXT("EmulatedBltFill16\r\n")));

    UINT32   iDstScanStride = pBltParms->pDst->Stride();
    BYTE    *pbDibBitsDst   = (BYTE *)pBltParms->pDst->Buffer();
    PRECTL   prcDst         = pBltParms->prclDst;
    DWORD    dwOnColorIndex = pBltParms->solidColor;
    int      iNumDstRows    = prcDst->bottom - prcDst->top;
    int      iNumDstCols    = prcDst->right  - prcDst->left;

    // Compute pointer to the starting rows in the dst bitmap
    WORD *pwDstScanLine = (WORD *)(pbDibBitsDst + prcDst->top * iDstScanStride + prcDst->left * 2);
    WORD  wColor = (WORD)dwOnColorIndex;

	EmulatedBltFill16ASM(pwDstScanLine, wColor, iNumDstCols, iNumDstRows, iDstScanStride);
	return S_OK;
}


#define BLOCK_OP(pbDst, pbSrc, cBytes)  memmove(pbDst, pbSrc, cBytes)
#define SCRCOPY_ASM

extern "C"	void EmulatedBltSrcCopy1616ASM(WORD* pwScanLineSrc, WORD *pwScanLineDst, int width, int height, UINT32 iScanStrideSrc, UINT32 iScanStrideDst);

#define _MM_OPT_ASM
#ifdef _MM_OPT_ASM
extern "C" 
{
	void Memmove1616_ASM_LE16(WORD* pSrc, WORD *pDst, int len) ;
	void Memmove1616_ASM_GT16(WORD* pSrc, WORD *pDst, int len) ;
} 

#else
#include "ebcopy1616.h" 
#endif
 
SCODE EmulatedBltSrcCopy1616_Eml( GPEBltParms *pBltParms )
{
    // Source-related info
    PRECTL   prcSrc         = pBltParms->prclSrc;
    UINT32   iScanStrideSrc = pBltParms->pSrc->Stride()/sizeof(WORD);
    WORD    *pwScanLineSrc  = (WORD *)pBltParms->pSrc->Buffer() +
                              prcSrc->top * iScanStrideSrc      +
                              prcSrc->left;

    // Dest-related info
    PRECTL   prcDst         = pBltParms->prclDst;
    UINT32   iScanStrideDst = pBltParms->pDst->Stride()/sizeof(WORD);
    WORD    *pwScanLineDst  = (WORD *)pBltParms->pDst->Buffer() +
                              prcDst->top * iScanStrideDst      +
                              prcDst->left;

    int cRows = prcDst->bottom - prcDst->top;
    int cCols = prcDst->right  - prcDst->left;

    // Make sure to copy source before overwriting.
    if (!pBltParms->yPositive)
    {
        // Scan from end of memory, and negate stride
        pwScanLineSrc += iScanStrideSrc * (cRows - 1);
        pwScanLineDst += iScanStrideDst * (cRows - 1);

        iScanStrideSrc = (UINT32)-(INT32)iScanStrideSrc;
        iScanStrideDst = (UINT32)-(INT32)iScanStrideDst;
    }

#ifdef	SCRCOPY_ASM
	
	EmulatedBltSrcCopy1616ASM(pwScanLineSrc, pwScanLineDst, cCols, cRows,
							iScanStrideSrc, iScanStrideDst);

#else
    //
    // Do the copy line by line.
    //
	//EmulatedBltSrcCopy1616_CO(pwScanLineSrc, pwScanLineDst, cCols, cRows,
	//						 iScanStrideSrc, iScanStrideDst, xPositive);
	
	
    for (int row = 0; row < cRows; row++)
    {
        //BLOCK_OP(pwScanLineDst, pwScanLineSrc, cCols*sizeof(WORD));
		if ( cCols < 8 ) {
#ifndef _MM_OPT_ASM
			Memmove1616_C_SIMPLE(pwScanLineSrc, pwScanLineDst, cCols);
#else
			Memmove1616_ASM_LE16(pwScanLineSrc, pwScanLineDst, cCols);
#endif
		} else {
#ifndef _MM_OPT_ASM
			Memmove1616_C(pwScanLineSrc, pwScanLineDst, cCols);
#else
			Memmove1616_ASM_GT16(pwScanLineSrc, pwScanLineDst, cCols);
#endif
		}
		
        pwScanLineSrc += iScanStrideSrc;
        pwScanLineDst += iScanStrideDst;
    }

#endif
        return S_OK;
}
#define SHIFT_ONE_MASK 0x7BEF
#define SHIFT_TWO_MASK 0x39E7

extern "C" void EmulatedBltText16ASM(BYTE* pSrcMask, WORD* pDstPixel, WORD color, int width, int height, unsigned int stepMask, unsigned int stepDst, int OffsetSrc);

__inline SCODE EmulatedBltAlphaText16_Eml( GPEBltParms *pParms )
{
	DEBUGMSG(GPE_ZONE_BLT_HI,(TEXT("EmulatedBltAlphaText16\r\n")));

    UINT32      iDstScanStride  = pParms->pDst->Stride();
    BYTE       *pDibBitsDst     = (BYTE *)pParms->pDst->Buffer();
    UINT32      iSrcScanStride  = pParms->pMask->Stride();
    BYTE       *pDibBitsSrc     = (BYTE *)pParms->pMask->Buffer();
    PRECTL      prcSrc          = pParms->prclMask;
    PRECTL      prcDst          = pParms->prclDst;
    WORD        wOnColor[5];
    int         iNumDstRows;
    int         iNumDstCols;
    BYTE       *pbSrcScanLine;
    BYTE       *pbDstScanLine;
    BYTE       *pbSrc;
    WORD       *pwDstPixel;
    int         i;
    int         j;
    BOOL        bOdd;
    BYTE        bSrc;

    // Caller assures a well-ordered, non-empty rect
    // compute size of destination rect
    iNumDstCols = prcDst->right  - prcDst->left;
    iNumDstRows = prcDst->bottom - prcDst->top;

    // compute pointers to the starting rows in the src and dst bitmaps
    pbSrcScanLine = pDibBitsSrc + prcSrc->top * iSrcScanStride + (prcSrc->left >> 1);
    pbDstScanLine = pDibBitsDst + prcDst->top * iDstScanStride + prcDst->left * 2;
    
    // Create pixel values with 0/4, 1/4, 2/4, 3/4 and 4/4 of the solid brush color
    wOnColor[0] = 0;
    wOnColor[4] = (WORD)pParms->solidColor;
    wOnColor[2] = (wOnColor[4] >> 1 ) & SHIFT_ONE_MASK;
    wOnColor[1] = (wOnColor[4] >> 2 ) & SHIFT_TWO_MASK;
    wOnColor[3] = wOnColor[1] + wOnColor[2];


    for (i = 0; i < iNumDstRows; i++) 
    {
        // set up pointers to first bytes on src and dst scanlines
        pbSrc = pbSrcScanLine;
        pwDstPixel = (WORD *)pbDstScanLine;
        bOdd = prcSrc->left & 1;

        for (j = 0; j < iNumDstCols; j++ ) 
        {
            if (bOdd)
                bSrc = *pbSrc++ & 0xF;
            else
                bSrc = *pbSrc >> 4;
            
            bOdd = !bOdd;
            
            switch ( (bSrc + 1) >> 2 )  // src pixel in range 0...4
            {
            case 0:
                //      Leave destination untouched
                break;
            case 1:
                //      3/4 destination color and 1/4 brush color
                *pwDstPixel = ((*pwDstPixel >> 2) & SHIFT_TWO_MASK) 
                            + ((*pwDstPixel >> 1) & SHIFT_ONE_MASK) + wOnColor[1];
                break;
            case 2:
                //      1/2 destination color and 1/2 brush color
                *pwDstPixel = ((*pwDstPixel >> 1) & SHIFT_ONE_MASK) + wOnColor[2];
                break;
            case 3:
                //      1/4 destination color and 3/4 brush color
                *pwDstPixel = ((*pwDstPixel >> 2) & SHIFT_TWO_MASK) + wOnColor[3];
                break;
            case 4:
                //      Fill with solid brush color
                *pwDstPixel = wOnColor[4];
                break;
            default:
                DebugBreak();
            }
            
            pwDstPixel++;
        }

        // advance to next scanline
        pbSrcScanLine += iSrcScanStride;
        pbDstScanLine += iDstScanStride;
    }

	return S_OK;

}

__inline SCODE EmulatedBltText16_Eml( GPEBltParms *pParms )
{
	DEBUGMSG(GPE_ZONE_BLT_HI,(TEXT("EmulatedBltText16\r\n")));

    UINT32      iDstScanStride  = pParms->pDst->Stride();
    BYTE       *pDibBitsDst     = (BYTE *)pParms->pDst->Buffer();
    UINT32      iSrcScanStride  = pParms->pMask->Stride();
    BYTE       *pDibBitsSrc     = (BYTE *)pParms->pMask->Buffer();
    PRECTL      prcSrc          = pParms->prclMask;
    PRECTL      prcDst          = pParms->prclDst;
    unsigned int wOnColor        = (unsigned int)pParms->solidColor;

	int         iSrcBitOffset;
    int         iNumDstRows;
    int         iNumDstCols;
    BYTE       *pbSrcScanLine;
    BYTE       *pbDstScanLine;
    WORD       *pwDstPixel;

    // Caller assures a well-ordered, non-empty rect
    // compute size of destination rect
    iNumDstCols = prcDst->right  - prcDst->left;
    iNumDstRows = prcDst->bottom - prcDst->top;

    // compute pointers to the starting rows in the src and dst bitmaps
    pbSrcScanLine = pDibBitsSrc + prcSrc->top * iSrcScanStride + (prcSrc->left >> 3);
    iSrcBitOffset = prcSrc->left & 0x07;
    pbDstScanLine = pDibBitsDst + prcDst->top * iDstScanStride + prcDst->left * 2;
    
	pwDstPixel = (WORD *)pbDstScanLine;

	EmulatedBltText16ASM(pbSrcScanLine,pwDstPixel, wOnColor, iNumDstCols, iNumDstRows, iSrcScanStride, iDstScanStride, iSrcBitOffset);

	return S_OK;

}
			  
SCODE SA2Video::Line(GPELineParms *pLineParms,EGPEPhase phase)
{
	if(phase == gpeSingle || phase == gpePrepare) 
	{
		if(pLineParms->pDst != m_pPrimarySurface)
			pLineParms->pLine = EmulatedLine;
		else
			pLineParms->pLine = (SCODE (GPE::*)(struct GPELineParms *))WrappedEmulatedLine;
	}
	return S_OK;
}

#undef SWAP
#define SWAP(type,a,b) { type tmp; tmp=a; a=b; b=tmp; }

SCODE SA2Video::WrappedEmulatedBlt(GPEBltParms *pParms)
{

	SCODE code;
	RECT bounds;
	
	if ( !( (pParms->bltFlags & (BLT_TRANSPARENT | BLT_STRETCH)) || (pParms->pLookup) || (pParms->pConvert) ) )
	{		
		if ( pParms->rop4 == 0xcccc )  {
			
			if ( EGPEFormatToBpp[pParms->pDst->Format()] == 16 ) {
				if ( EGPEFormatToBpp[pParms->pSrc->Format()] == 16 ) {
					code = EmulatedBltSrcCopy1616_Eml( pParms );
					goto contd;
				} 
			}
			
		}
		// prclDst is now properly ordered
		else if ( pParms->rop4 == 0xf0f0 ) {
			if ( EGPEFormatToBpp[pParms->pDst->Format()] == 16 ) {
				if (pParms->solidColor != -1) {	// must be a solid colored brush
					 code = EmulatedBltFill16_Eml( pParms );
					 goto contd;
				}
			} 
		}
		
		else if( (pParms->rop4 == 0xaaf0) && ( EGPEFormatToBpp[pParms->pDst->Format()] == 16 ) ) {
			
			if (pParms->solidColor != -1)
			{
				if (pParms->pMask->Format() == gpe1Bpp)
				{
					code = EmulatedBltText16_Eml(pParms);
					goto contd;
				}
				else if (pParms->pMask->Format() == gpe4Bpp)
				{
					code = EmulatedBltAlphaText16_Eml(pParms);
					goto contd;
				}
			}
		}
		
		
	}

	code = EmulatedBlt(pParms);	// Draw to the framebuffer	
	if(FAILED(code))
		return code;

contd:

	if (bDoRotation)
	{
		bounds.left		= pParms->prclDst->left;
		bounds.top		= pParms->prclDst->top;
		bounds.right	= pParms->prclDst->right;
		bounds.bottom	= pParms->prclDst->bottom;

		if(bounds.left > bounds.right) {
			SWAP(int,bounds.left,bounds.right)
		}
		if( bounds.top > bounds.bottom) {
			SWAP(int,bounds.top,bounds.bottom)
		}

		if (bounds.top == bounds.bottom-1)
		{	
			if ( !( (pParms->bltFlags & (BLT_TRANSPARENT | BLT_STRETCH)) || (pParms->pLookup) || (pParms->pConvert) ) )
			{
				if ( pParms->rop4 == 0xf0f0 ) {
					if ( EGPEFormatToBpp[pParms->pDst->Format()] == 16 ) {
						if (pParms->solidColor != -1) {	// must be a solid colored brush
							if (!gDrawCursorFlag) {
								DispDrvrDirtyRectDump2((LPRECT)&bounds,pParms->solidColor);
								return S_OK;
							}
						}
					}
				}
			}
		}

		if ( !( (pParms->bltFlags & (BLT_TRANSPARENT | BLT_STRETCH)) || (pParms->pLookup) || (pParms->pConvert) ) )
		{
			if ( pParms->rop4 == 0xf0f0 ) {
				if ( EGPEFormatToBpp[pParms->pDst->Format()] == 16 ) {
					if (pParms->solidColor != -1) {	// must be a solid colored brush
						DispDrvrDirtyRectDump_rectfill((LPRECT)&bounds,pParms->solidColor);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -