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

📄 line.cpp

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 CPP
📖 第 1 页 / 共 2 页
字号:

    //
    //  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 + -