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

📄 line.cpp

📁 Sm501 VGA芯片wince下驱动代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                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_WINDOW_WIDTH),
                FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth) |
                FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, dstWidth)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_WINDOW_DESTINATION_BASE),
                ((SMISurf*) (pLineParms->pDst))->OffsetInVideoMemory()
                );
            INSERTCMD_LOADREG_D(cmd_ptr,   
                REG(DE_PITCH),
                FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth) |
                FIELD_INIT_VAL(DE_PITCH, SOURCE, dstWidth)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_SOURCE),
                FIELD_INIT_VAL(DE_SOURCE, X_K1, k1) |
                FIELD_INIT_VAL(DE_SOURCE, Y_K2, k2)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_DESTINATION),
                FIELD_INIT_VAL(DE_DESTINATION, X, x1) |
                FIELD_INIT_VAL(DE_DESTINATION, Y, y1)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_DIMENSION),
                FIELD_INIT_VAL(DE_DIMENSION, X, w) |
                FIELD_INIT_VAL(DE_DIMENSION, Y_ET, et)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_MONO_PATTERN_LOW),
                FIELD_INIT_VAL(DE_MONO_PATTERN_LOW, PATTERN, 0xFFFFFFFF)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_MONO_PATTERN_HIGH),
                FIELD_INIT_VAL(DE_MONO_PATTERN_HIGH, PATTERN, 0xFFFFFFFF)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_FOREGROUND),
                FIELD_INIT_VAL(DE_FOREGROUND, COLOR, pLineParms->solidColor)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_CONTROL), cmd
                );
            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("Bresenham Line\r\n");
            
#else
 			WaitForNotBusy();

			reg_SourceXY = ((((DWORD) k1) << 16) | (WORD)k2);
			reg_DestXY = ((((DWORD) x1) << 16) | (WORD)y1);
			reg_DimXY  = ((((DWORD) w) << 16) | (WORD)et);
			reg_FgColor     = pLineParms->solidColor;
			reg_RowPitch    = (dstWidth << 16) | dstWidth;
			reg_WindowWidth = (dstWidth << 16) | dstWidth;
			reg_PatternLow  = 0xFFFFFFFF;
			reg_PatternHigh = 0xFFFFFFFF;

			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*) (pLineParms->pDst))->OffsetInVideoMemory())) |
				0);


			reg_ROPCommand = cmd;
#endif //CMDLIST
			return(S_OK);
		}
		
		return	WrapLine(pLineParms);
	}

	static UCHAR MixToROP3[] =
	{
		0xFF,	// R2_WHITE
		0x00,	// R2_BLACK
		0x05,	// R2_NOTMERGEPEN
		0x0A,	// R2_MASKNOTPEN
		0x0F,	// R2_NOTCOPYPEN
		0x50,	// R2_MASKPENNOT
		0x55,	// R2_NOT
		0x5A,	// R2_XORPEN
		0x5F,	// R2_NOTMASKPEN
		0xA0,	// R2_MASKPEN
		0xA5,	// R2_NOTXORPEN
		0xAA,	// R2_NOP
		0xAF,	// R2_MERGENOTPEN
		0xF0,	// R2_COPYPEN
		0xF5,	// R2_MERGEPENNOT
		0xFA,	// R2_MERGEPEN
		0xFF	// R2_WHITE
	};

	cmd = 0x80000000L;
	switch (pLineParms->iDir)
	{
		case	3:
		case	4:
			cmd |= 0x08000000L; // Horizontal line. dir: Right to Left

			// fall through on purpose

		case	7:
		case	0:
			width = pLineParms->cPels;  // Horizontal line. dir: Left to Right
			break;

		case	5:
		case	6:
			// Vertical line. dir: bottom to top
			y1 -= pLineParms->cPels;
			y1++;

			// fall through on purpose

		case	1:
		case	2:
			cmd |= 0x04000000L;
			height = pLineParms->cPels;  // Vertical line. dir: top to bottom
			break;
	}
    
    int dstWidth = ((SMISurf*) (pLineParms->pDst))->AlignedWidth();
    
#ifdef CMDLIST
    VALIDATE_SLOT(cmd_ptr, 22);
    
    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_WINDOW_WIDTH),
        FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth) |
        FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, dstWidth)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_WINDOW_DESTINATION_BASE),
        ((SMISurf*) (pLineParms->pDst))->OffsetInVideoMemory()
        );
    INSERTCMD_LOADREG_D(cmd_ptr,   
        REG(DE_PITCH),
        FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth) |
        FIELD_INIT_VAL(DE_PITCH, SOURCE, dstWidth)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_DESTINATION),
        FIELD_INIT_VAL(DE_DESTINATION, X, x1) |
        FIELD_INIT_VAL(DE_DESTINATION, Y, y1)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_DIMENSION),
        FIELD_INIT_VAL(DE_DIMENSION, X, width) |
        FIELD_INIT_VAL(DE_DIMENSION, Y_ET, height)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_MONO_PATTERN_LOW),
        FIELD_INIT_VAL(DE_MONO_PATTERN_LOW, PATTERN, 0xFFFFFFFF)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_MONO_PATTERN_HIGH),
        FIELD_INIT_VAL(DE_MONO_PATTERN_HIGH, PATTERN, 0xFFFFFFFF)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_FOREGROUND),
        FIELD_INIT_VAL(DE_FOREGROUND, COLOR, pLineParms->solidColor)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_CONTROL), cmd | MixToROP3[pLineParms->mix & 0xF]
        );
    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 HV Line\r\n");

#else  //CMDLIST
	WaitForNotBusy();

	reg_DestXY = (x1 << 16) | y1;
	reg_DimXY  = (width << 16) | height;
	reg_FgColor     = pLineParms->solidColor;
	reg_RowPitch    = (dstWidth << 16) | dstWidth;
	reg_WindowWidth = (dstWidth << 16) | dstWidth;
	reg_PatternLow  = 0xFFFFFFFF;
	reg_PatternHigh = 0xFFFFFFFF;

	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*) (pLineParms->pDst))->OffsetInVideoMemory())) |
		0);


	reg_ROPCommand = cmd | MixToROP3[pLineParms->mix & 0xF];
#endif  //CMDLIST

	return(S_OK);
}


void SMI::RotateLineParms(GPELineParms * pParms)
{
#ifdef ROTATION_ENABLE
	long lTmp;
	switch (m_iRotate)
	{
	case DMDO_90:
        lTmp = pParms->xStart;
        pParms->xStart = pParms->yStart;
        pParms->yStart = (m_nScreenHeightSave - 1) - lTmp;
        pParms->iDir = (pParms->iDir - 2) < 0 ? (pParms->iDir + 6) : (pParms->iDir - 2);
        break;
	
    case DMDO_180:
        pParms->xStart = (m_nScreenWidthSave - 1) - pParms->xStart;
        pParms->yStart = (m_nScreenHeightSave - 1) - pParms->yStart;
        pParms->iDir = (pParms->iDir - 4) < 0 ? (pParms->iDir + 4) : (pParms->iDir - 4);
        break;
	
    case DMDO_270:
        lTmp = pParms->xStart;
        pParms->xStart = (m_nScreenWidthSave - 1) - pParms->yStart;
        pParms->yStart = lTmp;
        pParms->iDir = (pParms->iDir - 6) < 0 ? (pParms->iDir + 2) : (pParms->iDir - 6);
        break;
	
    default:
	 	break;
	}
#endif
	return;
}

SCODE SMI::Line(GPELineParms *pLineParms, EGPEPhase phase)
{
	DEBUGMSG(GPE_ZONE_LINE, (TEXT("SMI::Line - phase %d\r\n"), phase));

	// Make sure 2D Engine is on and the current power state is appropriate
	POWER_HOOK(2D, VGXPowerMinimal);

	if ( (phase == gpeSingle) || (phase == gpePrepare) )
	{
        DispPerfStart (ROP_LINE);
		pLineParms->pLine = (SCODE (GPE::*)(struct GPELineParms *)) &SMI::WrapLine;
#ifdef ROTATION_ENABLE
        if ((m_iRotate) && (pLineParms->pDst == m_pPrimarySurface)) 	// only rotate if it is primary surface
        {
            RotateLineParms(pLineParms);
        }
#endif
		if (pLineParms->pDst->InVideoMemory() && (pLineParms->mix == 0x0d0d) && !pLineParms->style)
		{
			DispPerfType(DISPPERF_ACCEL_HARDWARE);
			pLineParms->pLine = (SCODE (GPE::*)(struct GPELineParms *)) &SMI::HwLine;
		}
	}
	else if (phase == gpeComplete)
	{
		DispPerfEnd (0);
		SetClip(NULL, 0);
	}

	return(S_OK);
}

⌨️ 快捷键说明

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