📄 line.cpp
字号:
//
// setup deltas for line drawing
//
switch( pParms->iDir )
{
case 0: iMajorD = 1; iMinorD = iStride; break;
case 1: iMinorD = 1; iMajorD = iStride; break;
case 2: iMinorD = -1; iMajorD = iStride; break;
case 3: iMajorD = -1; iMinorD = iStride; break;
case 4: iMajorD = -1; iMinorD = -iStride; break;
case 5: iMinorD = -1; iMajorD = -iStride; break;
case 6: iMinorD = 1; iMajorD = -iStride; break;
case 7: iMajorD = 1; iMinorD = -iStride; break;
default:
DEBUGMSG(CT69K_ZONE_ERROR,
(TEXT("--Invalid direction: %d\r\n"),pParms->iDir));
return E_INVALIDARG;
}
//
// setup start of line
//
PUCHAR pD = ((PUCHAR)pParms->pDst->Buffer())
+ pParms->yStart * iStride
+ pParms->xStart;
//
// handy shortcut for pen
//
P = (UCHAR) pParms->solidColor;
//
// set style to first pixel
//
ulStyle = (pParms->style >> pParms->styleState) |
(pParms->style <<(32-pParms->styleState));
//
// draw pixels...
// we could also add some special cases here for
// hor. and vertical lines, but the C&T chip will do it for us
INT nPels = pParms->cPels;
while (nPels--)
{
switch( rop2MarkSpace[ulStyle & 1] )
{
case 1: *pD = 0; break;
case 2: D = *pD; *pD = ~( P | D ); break;
case 3: D = *pD; *pD = ~P & D; break;
case 4: *pD = ~P; break;
case 5: D = *pD; *pD = P & ~D; break;
case 6: D = *pD; *pD = ~D; break;
case 7: D = *pD; *pD = P ^ D; break;
case 8: D = *pD; *pD = ~( P & D ); break;
case 9: D = *pD; *pD = P & D; break;
case 10: D = *pD; *pD = ~( P ^ D ); break;
case 11: /* *pD = D; */ break;
case 12: D = *pD; *pD = ~P | D; break;
case 13: *pD = P; break;
case 14: D = *pD; *pD = P | ~D; break;
case 15: D = *pD; *pD = P | D; break;
case 16: *pD = 0xff; break;
default:
DEBUGMSG(CT69K_ZONE_ERROR,
(TEXT("--Invalid rop2: %d\r\n"),
rop2MarkSpace[ulStyle & 1]));
return E_INVALIDARG;
}
pD += iMajorD;
//
// ror ulstyle
//
ulStyle = (ulStyle >> 1) |
(ulStyle << 31);
if( axstp )
{
if( accum < 0 )
{
DEBUGMSG(CT69K_ZONE_LINE,
(TEXT("--Straight accum=%d axstp=%d\r\n"),
accum,axstp));
accum += axstp;
}
else
{
DEBUGMSG(CT69K_ZONE_LINE,
(TEXT("--Diagonal accum=%d dgstp=%d\r\n"),
accum,dgstp));
pD += iMinorD;
accum += dgstp;
}
}
}
return S_OK;
}
//-----------------------------------------------------------------------
//
// CT69000::EmulatedLine16Bit
//
// simplified software version of 16 bit line drawing
//
//-----------------------------------------------------------------------
SCODE
CT69000::EmulatedLine16Bit(GPELineParms *pParms)
{
ASSERT( pParms->pDst->Format()==gpe16Bpp);
#if CURSORDEBUG
if (m_bBltEmulation>1)
return EmulatedLine(pParms);
#endif
LONG accum = (long)(pParms->dN) + pParms->llGamma;
LONG axstp = (long)(pParms->dN);
LONG dgstp = (long)(pParms->dN) - (long)(pParms->dM);
ULONG rop2MarkSpace[2];
rop2MarkSpace[0] = (UCHAR)(pParms->mix);
rop2MarkSpace[1] = (UCHAR)(pParms->mix >> 8);
INT iStride = pParms->pDst->Stride()/sizeof(WORD);
ULONG ulStyle;
INT iMajorD;
INT iMinorD;
WORD D;
WORD P;
DEBUGMSG(CT69K_ZONE_LINE,
(TEXT("CT69000::EmulatedLine16Bit\r\n")));
DEBUGMSG(CT69K_ZONE_LINE,
(TEXT("--Solid color 0x%08x\r\n"),pParms->solidColor));
DEBUGMSG(CT69K_ZONE_LINE,
(TEXT("--Start X=%d,Y=%d\r\n"),pParms->xStart,pParms->yStart));
DEBUGMSG(CT69K_ZONE_LINE,
(TEXT("--iDir:%d accum %d axstp %d dgstp %d\r\n"),
pParms->iDir,accum,axstp,dgstp));
DEBUGMSG(CT69K_ZONE_LINE,
(TEXT("--Mix: %04x Style: %08lx\r\n"),pParms->mix,pParms->style));
if( pParms->pDst->InVideoMemory() )
{
// If we have a pending blt and now attempt a software operation using
// video memory, the pipeline must be flushed.
WaitForNotBusy();
}
//
// setup deltas for line drawing
//
switch( pParms->iDir )
{
case 0: iMajorD = 1; iMinorD = iStride; break;
case 1: iMinorD = 1; iMajorD = iStride; break;
case 2: iMinorD = -1; iMajorD = iStride; break;
case 3: iMajorD = -1; iMinorD = iStride; break;
case 4: iMajorD = -1; iMinorD = -iStride; break;
case 5: iMinorD = -1; iMajorD = -iStride; break;
case 6: iMinorD = 1; iMajorD = -iStride; break;
case 7: iMajorD = 1; iMinorD = -iStride; break;
default:
DEBUGMSG(CT69K_ZONE_ERROR,
(TEXT("--Invalid direction: %d\r\n"),pParms->iDir));
return E_INVALIDARG;
}
//
// setup start of line
//
PWORD pD =((PWORD)pParms->pDst->Buffer())
+ pParms->yStart * iStride
+ pParms->xStart;
//
// handy shortcut for pen
//
P = (WORD) pParms->solidColor;
//
// set style to first pixel
//
ulStyle = (pParms->style >> pParms->styleState) |
(pParms->style <<(32-pParms->styleState));
//
// draw pixels...
//
INT nPels = pParms->cPels;
while (nPels--)
{
switch( rop2MarkSpace[ulStyle & 1] )
{
case 1: *pD = 0; break;
case 2: D = *pD; *pD = ~( P | D ); break;
case 3: D = *pD; *pD = ~P & D; break;
case 4: *pD = ~P; break;
case 5: D = *pD; *pD = P & ~D; break;
case 6: D = *pD; *pD = ~D; break;
case 7: D = *pD; *pD = P ^ D; break;
case 8: D = *pD; *pD = ~( P & D ); break;
case 9: D = *pD; *pD = P & D; break;
case 10: D = *pD; *pD = ~( P ^ D ); break;
case 11: /* *pD = D; */ break;
case 12: D = *pD; *pD = ~P | D; break;
case 13: *pD = P; break;
case 14: D = *pD; *pD = P | ~D; break;
case 15: D = *pD; *pD = P | D; break;
case 16: *pD = 0xffff; break;
default:
DEBUGMSG(CT69K_ZONE_ERROR,(TEXT("--Invalid rop2: %d\r\n"),rop2MarkSpace[ulStyle & 1]));
return E_INVALIDARG;
}
pD += iMajorD;
//
// ror ulstyle
//
ulStyle = (ulStyle >> 1) |
(ulStyle << 31);
if( axstp )
{
if( accum < 0 )
{
DEBUGMSG(CT69K_ZONE_LINE,
(TEXT("--Straight accum=%d axstp=%d\r\n"),accum,axstp));
accum += axstp;
}
else
{
DEBUGMSG(CT69K_ZONE_LINE,
(TEXT("--Diagonal accum=%d dgstp=%d\r\n"),accum,dgstp));
pD += iMinorD;
accum += dgstp;
}
}
}
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -