📄 line.cpp
字号:
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 + -