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

📄 blt.cpp

📁 SM501基于ARMV4/ARMV4I平台
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	ULONG xWidth, xDelta;
    LONG  xStep, xStepSign;
    BOOL bStepChange;

	if (pBltParms->xPositive && pBltParms->yPositive)
	{
		ulDir = TOP_TO_BOTTOM;
	}
	else
	{
		xSrc += xDim - 1;
		ySrc += yDim - 1;
		xDst += xDim - 1;
		yDst += yDim - 1;
		ulDir = BOTTOM_TO_TOP;
	}

/* Comment out the 24 Bit support.
	// Note: SM910 hardware requires some parameter multiple by 3 in 24 bpp
	// mode, they are: source row pitch, dest row pitch, src x, src y,
	// dest x, dest y, dim x (not dim y)
	if (ppdev->ulBitCount == 24)
	{
		xSrc *= 3;
		xDst *= 3;
		xDim *= 3;

		// SM910 bug: in 24 BPP when direction is bottom to up, source x and
		// y add 2
		if (ulDir == BOTTOM_TO_TOP)
		{
			xSrc += 2;
			xDst += 2;
		}
	}
*/
	if (pBltParms->bltFlags & BLT_TRANSPARENT)
	{

		color = pBltParms->solidColor;
		if (pBltParms->pLookup)
			color = (pBltParms->pLookup)[color];
		if (pBltParms->pConvert)
			color = (pBltParms->pColorConverter->*(pBltParms->pConvert))(color);

		dwTransp = TRANSPARENCY_ENABLE
			| SRC_CONTROL_TRANSP
			| MATCH_PIXEL_TRANSP;
	}

	if (((pBltParms->rop4 & 0xFF) != 0xcc) &&
		((xDim*(m_nScreenBpp/8)) >= 192) )
	{ // 720 and 820 hw bugs.
		// engine has garbage when width over 192 bytes
		// cut to 192 bytes pre rect.
	   	xWidth = 192/(m_nScreenBpp/8);

		xStep = xWidth;     // default value without overlap.
		xStepSign = 1;
		bStepChange = 0;

		// if there is overlap in rectangle, make sure they are not cover each
		// other when split into small rectangle.
		if (ulDir == TOP_TO_BOTTOM)
		{
			if (xSrc<xDst)
			{
				//
				//         +-------s--+
				//         | D        |
				//     +-------s--+   |
				//     |   |      |   |
				//     |   |      |   |
				//     |   +------|---+
				//     | S        |
				//     +----------+
				//
				xDelta = (xDst-xSrc)*(m_nScreenBpp/8);
  				if (xDelta < xWidth)
					xWidth = xDelta;
				xStep = -(LONG)xWidth;
				xDst = xDst + xDim - xWidth;
				xSrc = xSrc + xDim - xWidth;
				xStepSign = -1;    // going backward
				bStepChange = 1;
			}
			else
			{
				//
				//     s----------+
				//     | D        |
				//     |   s----------+
				//     |   | S    |   |
				//     |   |      |   |
				//     +---|------+   |
				//         |          |
				//         +----------+
				//
				xStep = xWidth;
			}
		}
		else   // bottom to top
		{
			if (xSrc>xDst)
			{
				//         +----------+
				//         | S        |
				//     +----------+   |
				//     |   |      |   |
				//     |   |      |   |
				//     |   +--s---|---+
				//     | D        |
				//     +--s-------+
				//
				xDelta = (xSrc - xDst)*(m_nScreenBpp/8);
				if (xDelta < xWidth)
					xWidth = xDelta;
				xDst = xDst - xDim + xWidth;
				xSrc = xSrc - xDim + xWidth;
				xStep = xWidth;
				bStepChange = 1;
			}
			else
			{
                //     +----------+
                //     | S        |
                //     |   +----------+
                //     |   | D    |   |
                //     |   |      |   |
                //     +---|------+   |
                //         |          |
                //         +----------+
                //
                xStep = -(long)xWidth;
                xStepSign = -1;
            }
        }
        
        while(1)
        {		
            //			BITBLT((xDst << 16) | yDst, (xSrc << 16) | ySrc, (xWidth << 16) | yDim,
            //					0x80000000 | ulDir | ulRop);
            {
#ifdef CMDLIST
                VALIDATE_SLOT(cmd_ptr, 24);
                
                INSERTCMD_STATUS(cmd_ptr,
                    FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
                    FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
                    FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
                    FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
                    FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
                    FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
                    FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
                    FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
                    FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
                    FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
                    FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
                    FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
                    );
                INSERTCMD_LOADREG_D(cmd_ptr,   
                    REG(DE_PITCH),
                    FIELD_INIT_VAL(DE_PITCH, DESTINATION, wDst) |
                    FIELD_INIT_VAL(DE_PITCH, SOURCE, wSrc)
                    );
                if (pBltParms->bltFlags & BLT_TRANSPARENT)
                {
                    INSERTCMD_LOADREG_D(cmd_ptr,
                        REG(DE_COLOR_COMPARE),
                        FIELD_INIT_VAL(DE_COLOR_COMPARE, COLOR, color)
                        );
                }
                
                INSERTCMD_LOADREG_D(cmd_ptr, 
                    REG(DE_WINDOW_WIDTH),
                    FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, wDst) |
                    FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, wSrc)
                    );
                INSERTCMD_LOADREG_D(cmd_ptr,
                    REG(DE_WINDOW_SOURCE_BASE),
                    ((SMISurf*) (pBltParms->pSrc))->OffsetInVideoMemory()
                    );
                INSERTCMD_LOADREG_D(cmd_ptr,
                    REG(DE_WINDOW_DESTINATION_BASE),
                    ((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
                    );
                INSERTCMD_LOADREG_D(cmd_ptr,
                    REG(DE_SOURCE),
                    FIELD_INIT_VAL(DE_SOURCE, X_K1, xSrc) |
                    FIELD_INIT_VAL(DE_SOURCE, Y_K2, ySrc)
                    );
                INSERTCMD_LOADREG_D(cmd_ptr,
                    REG(DE_DESTINATION),
                    FIELD_INIT_VAL(DE_DESTINATION, X, xDst) |
                    FIELD_INIT_VAL(DE_DESTINATION, Y, yDst)
                    );
                INSERTCMD_LOADREG_D(cmd_ptr,
                    REG(DE_DIMENSION),
                    FIELD_INIT_VAL(DE_DIMENSION, X, xWidth) |
                    FIELD_INIT_VAL(DE_DIMENSION, Y_ET, yDim)
                    );
                INSERTCMD_LOADREG_D(cmd_ptr,
                    REG(DE_CONTROL),
                    FIELD_INIT(DE_CONTROL, STATUS, START) |
                    FIELD_INIT(DE_CONTROL, UPDATE_DESTINATION_X, DISABLE) |
                    FIELD_INIT(DE_CONTROL, QUICK_START, DISABLE) |
                    FIELD_INIT(DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
                    FIELD_INIT(DE_CONTROL, HOST, COLOR) |
                    FIELD_INIT(DE_CONTROL, COMMAND, BITBLT) |
                    FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP3) |
                    FIELD_INIT(DE_CONTROL, TRANSPARANCY, DISABLE) |
                    ulDir |
                    dwTransp |
                    FIELD_INIT_VAL(DE_CONTROL, ROP, (pBltParms->rop4 & 0xFF))
                    );
                INSERTCMD_FINISH(cmd_ptr, 0);
                
                STOP_CI();
                WAIT_CI_STOP();
                
                INSERTCMD_NOP(last_finish_ptr);
                
                last_finish_ptr = cmd_ptr - CMD_STRIDE_DWORD;
                
                FLUSH_CMD();

                START_CI("CMDList BitBlt\r\n");
                
#else //------- CMDLIST --------	
				WaitForNotBusy();
				reg_SourceXY = (xSrc << 16) | ySrc;
				reg_DestXY   = (xDst << 16) | yDst;
				reg_DimXY    = (xWidth << 16) | yDim;
				reg_RowPitch    = (wDst << 16) | wSrc;
				reg_WindowWidth = (wDst << 16) | wSrc;
				if (pBltParms->bltFlags & BLT_TRANSPARENT)
					reg_ColorCmp   = color;

				POKE_32(DE_WINDOW_SOURCE_BASE,
					FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
					FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, ADDRESS, 
						VgxSurfAddr(((SMISurf*) (pBltParms->pSrc))->OffsetInVideoMemory())) |
					0);

				POKE_32(DE_WINDOW_DESTINATION_BASE,
					FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
					FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS, 
						VgxSurfAddr(((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory())) |
					0);


				reg_ROPCommand = (pBltParms->rop4 & 0xFF)
					| CMD_BITBLT
					| ulDir
					| dwTransp
					| START_DRAWING_ENGINE;
#endif //CMDLIST
			}

			xDim-=xWidth;
			if((long)xDim <= 0)
                break;
            if(xWidth>(ULONG)xDim)
            {
                xWidth=xDim;
                if (bStepChange)
                {
                    xStep=(LONG)xWidth*xStepSign;
                }
            }
            xSrc+=xStep;
            xDst+=xStep;
        }
    }
    else
    {
#ifdef CMDLIST
        VALIDATE_SLOT(cmd_ptr, 24);
        
        INSERTCMD_STATUS(cmd_ptr,
            FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
            FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
            FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
            FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
            FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
            FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
            FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
            FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
            FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
            FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
            FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
            FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
            );
        INSERTCMD_LOADREG_D(cmd_ptr,   
            REG(DE_PITCH),
            FIELD_INIT_VAL(DE_PITCH, DESTINATION, wDst) |
            FIELD_INIT_VAL(DE_PITCH, SOURCE, wSrc)
            );
        if (pBltParms->bltFlags & BLT_TRANSPARENT)
        {
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_COLOR_COMPARE),
                FIELD_INIT_VAL(DE_COLOR_COMPARE, COLOR, color)
                );
        }
        
        INSERTCMD_LOADREG_D(cmd_ptr, 
            REG(DE_WINDOW_WIDTH),
            FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, wDst) |
            FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, wSrc)
            );
        INSERTCMD_LOADREG_D(cmd_ptr,
            REG(DE_WINDOW_SOURCE_BASE),
            ((SMISurf*) (pBltParms->pSrc))->OffsetInVideoMemory()
            );
        INSERTCMD_LOADREG_D(cmd_ptr,
            REG(DE_WINDOW_DESTINATION_BASE),
            ((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
            );
        INSERTCMD_LOADREG_D(cmd_ptr,
            REG(DE_SOURCE),
            FIELD_INIT_VAL(DE_SOURCE, X_K1, xSrc) |
            FIELD_INIT_VAL(DE_SOURCE, Y_K2, ySrc)
            );
        INSERTCMD_LOADREG_D(cmd_ptr,
            REG(DE_DESTINATION),
            FIELD_INIT_VAL(DE_DESTINATION, X, xDst) |
            FIELD_INIT_VAL(DE_DESTINATION, Y, yDst)
            );
        INSERTCMD_LOADREG_D(cmd_ptr,
            REG(DE_DIMENSION),
            FIELD_INIT_VAL(DE_DIMENSION, X, xDim) |
            FIELD_INIT_VAL(DE_DIMENSION, Y_ET, yDim)
            );
        INSERTCMD_LOADREG_D(cmd_ptr,
            REG(DE_CONTROL),
            FIELD_INIT(DE_CONTROL, STATUS, START) |
            FIELD_INIT(DE_CONTROL, UPDATE_DESTINATION_X, DISABLE) |
            FIELD_INIT(DE_CONTROL, QUICK_START, DISABLE) |
            FIELD_INIT(DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
            FIELD_INIT(DE_CONTROL, HOST, COLOR) |
            FIELD_INIT(DE_CONTROL, COMMAND, BITBLT) |
            FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP3) |
            FIELD_INIT(DE_CONTROL, TRANSPARANCY, DISABLE) |
            ulDir |
            dwTransp |
            FIELD_INIT_VAL(DE_CONTROL, ROP, (pBltParms->rop4 & 0xFF))
            );
        INSERTCMD_FINISH(cmd_ptr, 0);
        
        STOP_CI();
        WAIT_CI_STOP();
        
        INSERTCMD_NOP(last_finish_ptr);
        
        last_finish_ptr = cmd_ptr - CMD_STRIDE_DWORD;
        
        FLUSH_CMD();

        START_CI("CMDList SrcCopy\r\n");
        
#else //------- CMDLIST --------	
        WaitForNotBusy();
        reg_SourceXY = (xSrc << 16) | ySrc;
		reg_DestXY   = (xDst << 16) | yDst;
		reg_DimXY    = (xDim << 16) | yDim;
		reg_RowPitch    = (wDst << 16) | wSrc;
		reg_WindowWidth = (wDst << 16) | wSrc;
		if (pBltParms->bltFlags & BLT_TRANSPARENT)
			reg_ColorCmp   = color;
		
		POKE_32(DE_WINDOW_SOURCE_BASE,
			FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
			FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, ADDRESS, 
				VgxSurfAddr(((SMISurf*) (pBltParms->pSrc))->OffsetInVideoMemory())) |
			0);

		POKE_32(DE_WINDOW_DESTINATION_BASE,
			FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
			FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS, 
				VgxSurfAddr(((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory())) |
			0);


		reg_ROPCommand = (pBltParms->rop4 & 0xFF)
			| CMD_BITBLT
			| ulDir
			| dwTransp
			| START_DRAWING_ENGINE;
#endif //CMDLIST
	}

	return (S_OK);
}

⌨️ 快捷键说明

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