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

📄 pxa255_lcd.cpp

📁 老外的一个开源项目
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    case 5:
        bounds.right = pParms->xStart + 1;
        bounds.bottom = pParms->yStart + 1;
        bounds.top = pParms->yStart - pParms->cPels;
        bounds.left = bounds.right - N_plus_1;
        break;
    case 6:
        bounds.left = pParms->xStart;
        bounds.bottom = pParms->yStart + 1;
        bounds.top = pParms->yStart - pParms->cPels;
        bounds.right = bounds.left + N_plus_1;
        break;
    case 7:
        bounds.left = pParms->xStart;
        bounds.bottom = pParms->yStart + 1;
        bounds.right = pParms->xStart + pParms->cPels + 1;
        bounds.top = bounds.bottom - N_plus_1;
        break;
    default:
        DEBUGMSG(GPE_ZONE_ERROR,(TEXT("Invalid direction: %d\r\n"),pParms->iDir));
        return (E_INVALIDARG);
    }


    DispDrvrDirtyRectDump((LPRECT)&bounds);

    return (code);
}

#undef SWAP
#define SWAP(a,b,type) { type tmp=a; a=b; b=tmp; }
int EmulatedBltFill16_C(WORD* pDst, WORD color, int width, int height, unsigned int step)
{
    int r, w;
    step >>= 1; //in 16-bit
    step -= width;
    for ( r = 0; r < height; r ++ )
    {
        for ( w = 0; w < width; w ++ )
        {
            *pDst++ = color;
        }
        pDst += step;
    }
    return (0);
}
extern "C" SCODE EmulatedBltFill16ASM(WORD* pDst, WORD color, int width, int height, unsigned int step);

SCODE   EmulatedBltSrcCopy0416( GPEBltParms *pParms );
SCODE   EmulatedBltSrcCopy0116( GPEBltParms *pParms );
SCODE   EmulatedBltSrcCopy0808( GPEBltParms *pParms );
SCODE   EmulatedBltSrcCopy0408( GPEBltParms *pParms );
SCODE   EmulatedBltSrcCopy0108( GPEBltParms *pParms );

__inline SCODE EmulatedBltFill16_Eml( GPEBltParms *pBltParms )
{
    DEBUGMSG(GPE_ZONE_BLT_HI,(TEXT("EmulatedBltFill16\r\n")));

    UINT32   iDstScanStride = pBltParms->pDst->Stride();
    BYTE    *pbDibBitsDst   = (BYTE *)pBltParms->pDst->Buffer();
    PRECTL   prcDst         = pBltParms->prclDst;
    DWORD    dwOnColorIndex = pBltParms->solidColor;
    int      iNumDstRows    = prcDst->bottom - prcDst->top;
    int      iNumDstCols    = prcDst->right  - prcDst->left;

    // Compute pointer to the starting rows in the dst bitmap
    WORD *pwDstScanLine = (WORD *)(pbDibBitsDst + prcDst->top * iDstScanStride + prcDst->left * 2);
    WORD  wColor = (WORD)dwOnColorIndex;

    EmulatedBltFill16ASM(pwDstScanLine, wColor, iNumDstCols, iNumDstRows, iDstScanStride);
    return (S_OK);
}


#define BLOCK_OP(pbDst, pbSrc, cBytes)  memmove(pbDst, pbSrc, cBytes)
#define SCRCOPY_ASM

extern "C"  void EmulatedBltSrcCopy1616ASM(WORD* pwScanLineSrc, WORD *pwScanLineDst, int width, int height, UINT32 iScanStrideSrc, UINT32 iScanStrideDst);

#define _MM_OPT_ASM
#ifdef _MM_OPT_ASM
extern "C" 
{
    void Memmove1616_ASM_LE16(WORD* pSrc, WORD *pDst, int len) ;
    void Memmove1616_ASM_GT16(WORD* pSrc, WORD *pDst, int len) ;
} 

#else
    #include "ebcopy1616.h" 
#endif

SCODE EmulatedBltSrcCopy1616_Eml( GPEBltParms *pBltParms )
{
    // Source-related info
    PRECTL   prcSrc         = pBltParms->prclSrc;
    UINT32   iScanStrideSrc = pBltParms->pSrc->Stride()/sizeof(WORD);
    WORD    *pwScanLineSrc  = (WORD *)pBltParms->pSrc->Buffer() +
                              prcSrc->top * iScanStrideSrc      +
                              prcSrc->left;

    // Dest-related info
    PRECTL   prcDst         = pBltParms->prclDst;
    UINT32   iScanStrideDst = pBltParms->pDst->Stride()/sizeof(WORD);
    WORD    *pwScanLineDst  = (WORD *)pBltParms->pDst->Buffer() +
                              prcDst->top * iScanStrideDst      +
                              prcDst->left;

    int cRows = prcDst->bottom - prcDst->top;
    int cCols = prcDst->right  - prcDst->left;

    // Make sure to copy source before overwriting.
    if (!pBltParms->yPositive)
    {
        // Scan from end of memory, and negate stride
        pwScanLineSrc += iScanStrideSrc * (cRows - 1);
        pwScanLineDst += iScanStrideDst * (cRows - 1);

        iScanStrideSrc = (UINT32)-(INT32)iScanStrideSrc;
        iScanStrideDst = (UINT32)-(INT32)iScanStrideDst;
    }

#ifdef	SCRCOPY_ASM

    EmulatedBltSrcCopy1616ASM(pwScanLineSrc, pwScanLineDst, cCols, cRows,
                              iScanStrideSrc, iScanStrideDst);

#else

    //
    // Do the copy line by line.
    //
    //EmulatedBltSrcCopy1616_CO(pwScanLineSrc, pwScanLineDst, cCols, cRows,
    //						 iScanStrideSrc, iScanStrideDst, xPositive);


    for (int row = 0; row < cRows; row++)
    {
        //BLOCK_OP(pwScanLineDst, pwScanLineSrc, cCols*sizeof(WORD));
        if ( cCols < 8 )
        {
#ifndef _MM_OPT_ASM
            Memmove1616_C_SIMPLE(pwScanLineSrc, pwScanLineDst, cCols);
#else
            Memmove1616_ASM_LE16(pwScanLineSrc, pwScanLineDst, cCols);
#endif
        }
        else
        {
#ifndef _MM_OPT_ASM
            Memmove1616_C(pwScanLineSrc, pwScanLineDst, cCols);
#else
            Memmove1616_ASM_GT16(pwScanLineSrc, pwScanLineDst, cCols);
#endif
        }

        pwScanLineSrc += iScanStrideSrc;
        pwScanLineDst += iScanStrideDst;
    }

#endif
    return (S_OK);
}
#define SHIFT_ONE_MASK 0x7BEF
#define SHIFT_TWO_MASK 0x39E7

extern "C" void EmulatedBltText16ASM(BYTE* pSrcMask, WORD* pDstPixel, WORD color, int width, int height, unsigned int stepMask, unsigned int stepDst, int OffsetSrc);

__inline SCODE EmulatedBltAlphaText16_Eml( GPEBltParms *pParms )
{
    DEBUGMSG(GPE_ZONE_BLT_HI,(TEXT("EmulatedBltAlphaText16\r\n")));

    UINT32      iDstScanStride  = pParms->pDst->Stride();
    BYTE       *pDibBitsDst     = (BYTE *)pParms->pDst->Buffer();
    UINT32      iSrcScanStride  = pParms->pMask->Stride();
    BYTE       *pDibBitsSrc     = (BYTE *)pParms->pMask->Buffer();
    PRECTL      prcSrc          = pParms->prclMask;
    PRECTL      prcDst          = pParms->prclDst;
    WORD        wOnColor[5];
    int         iNumDstRows;
    int         iNumDstCols;
    BYTE       *pbSrcScanLine;
    BYTE       *pbDstScanLine;
    BYTE       *pbSrc;
    WORD       *pwDstPixel;
    int         i;
    int         j;
    BOOL        bOdd;
    BYTE        bSrc;

    // Caller assures a well-ordered, non-empty rect
    // compute size of destination rect
    iNumDstCols = prcDst->right  - prcDst->left;
    iNumDstRows = prcDst->bottom - prcDst->top;

    // compute pointers to the starting rows in the src and dst bitmaps
    pbSrcScanLine = pDibBitsSrc + prcSrc->top * iSrcScanStride + (prcSrc->left >> 1);
    pbDstScanLine = pDibBitsDst + prcDst->top * iDstScanStride + prcDst->left * 2;

    // Create pixel values with 0/4, 1/4, 2/4, 3/4 and 4/4 of the solid brush color
    wOnColor[0] = 0;
    wOnColor[4] = (WORD)pParms->solidColor;
    wOnColor[2] = (wOnColor[4] >> 1 ) & SHIFT_ONE_MASK;
    wOnColor[1] = (wOnColor[4] >> 2 ) & SHIFT_TWO_MASK;
    wOnColor[3] = wOnColor[1] + wOnColor[2];


    for (i = 0; i < iNumDstRows; i++)
    {
        // set up pointers to first bytes on src and dst scanlines
        pbSrc = pbSrcScanLine;
        pwDstPixel = (WORD *)pbDstScanLine;
        bOdd = prcSrc->left & 1;

        for (j = 0; j < iNumDstCols; j++ )
        {
            if (bOdd)
                bSrc = *pbSrc++ & 0xF;
            else
                bSrc = *pbSrc >> 4;

            bOdd = !bOdd;

            switch ( (bSrc + 1) >> 2 )  // src pixel in range 0...4
            {
            case 0:
                //      Leave destination untouched
                break;
            case 1:
                //      3/4 destination color and 1/4 brush color
                *pwDstPixel = ((*pwDstPixel >> 2) & SHIFT_TWO_MASK) 
                              + ((*pwDstPixel >> 1) & SHIFT_ONE_MASK) + wOnColor[1];
                break;
            case 2:
                //      1/2 destination color and 1/2 brush color
                *pwDstPixel = ((*pwDstPixel >> 1) & SHIFT_ONE_MASK) + wOnColor[2];
                break;
            case 3:
                //      1/4 destination color and 3/4 brush color
                *pwDstPixel = ((*pwDstPixel >> 2) & SHIFT_TWO_MASK) + wOnColor[3];
                break;
            case 4:
                //      Fill with solid brush color
                *pwDstPixel = wOnColor[4];
                break;
            default:
                DebugBreak();
            }

            pwDstPixel++;
        }

        // advance to next scanline
        pbSrcScanLine += iSrcScanStride;
        pbDstScanLine += iDstScanStride;
    }

    return (S_OK);

}

__inline SCODE EmulatedBltText16_Eml( GPEBltParms *pParms )
{
    DEBUGMSG(GPE_ZONE_BLT_HI,(TEXT("EmulatedBltText16\r\n")));

    UINT32      iDstScanStride  = pParms->pDst->Stride();
    BYTE       *pDibBitsDst     = (BYTE *)pParms->pDst->Buffer();
    UINT32      iSrcScanStride  = pParms->pMask->Stride();
    BYTE       *pDibBitsSrc     = (BYTE *)pParms->pMask->Buffer();
    PRECTL      prcSrc          = pParms->prclMask;
    PRECTL      prcDst          = pParms->prclDst;
    unsigned int wOnColor        = (unsigned int)pParms->solidColor;

    int         iSrcBitOffset;
    int         iNumDstRows;
    int         iNumDstCols;
    BYTE       *pbSrcScanLine;
    BYTE       *pbDstScanLine;
    WORD       *pwDstPixel;

    // Caller assures a well-ordered, non-empty rect
    // compute size of destination rect
    iNumDstCols = prcDst->right  - prcDst->left;
    iNumDstRows = prcDst->bottom - prcDst->top;

    // compute pointers to the starting rows in the src and dst bitmaps
    pbSrcScanLine = pDibBitsSrc + prcSrc->top * iSrcScanStride + (prcSrc->left >> 3);
    iSrcBitOffset = prcSrc->left & 0x07;
    pbDstScanLine = pDibBitsDst + prcDst->top * iDstScanStride + prcDst->left * 2;

    pwDstPixel = (WORD *)pbDstScanLine;

    EmulatedBltText16ASM(pbSrcScanLine,pwDstPixel, wOnColor, iNumDstCols, iNumDstRows, iSrcScanStride, iDstScanStride, iSrcBitOffset);

    return (S_OK);

}

SCODE SA2Video::Line(GPELineParms *pLineParms,EGPEPhase phase)
{
    if (phase == gpeSingle || phase == gpePrepare)
    {
#ifdef DO_DISPPERF
        DispPerfStart(ROP_LINE);
#endif
        if (pLineParms->pDst != m_pPrimarySurface)
            pLineParms->pLine = &GPE::EmulatedLine;
        else
            pLineParms->pLine = (SCODE (GPE::*)(struct GPELineParms *))&SA2Video::WrappedEmulatedLine;
    }
#ifdef DO_DISPPERF
    else if (phase == gpeComplete)
    {
        DispPerfEnd(0);
    }
#endif
    return (S_OK);
}

#undef SWAP
#define SWAP(type,a,b) { type tmp; tmp=a; a=b; b=tmp; }

SCODE SA2Video::WrappedEmulatedBlt(GPEBltParms *pParms)
{

    SCODE code;
    // Now, calculate the dirty-rect to refresh to the actual hardware
    RECT bounds;



    if ( !( (pParms->bltFlags & (BLT_TRANSPARENT | BLT_STRETCH | BLT_ALPHABLEND)) || (pParms->pLookup) || (pParms->pConvert) ) )
    {
        if ( pParms->rop4 == 0xcccc )
        {

            if ( EGPEFormatToBpp[pParms->pDst->Format()] == 16 )
            {
                if ( EGPEFormatToBpp[pParms->pSrc->Format()] == 16 )
                {
                    code = EmulatedBltSrcCopy1616_Eml( pParms );
                    goto contd;
                }
            }

        }
        // prclDst is now properly ordered
        else if ( pParms->rop4 == 0xf0f0 )
        {
            if ( EGPEFormatToBpp[pParms->pDst->Format()] == 16 )
            {
                if (pParms->solidColor != -1)
                { // must be a solid colored brush
                    code = EmulatedBltFill16_Eml( pParms );
                    goto contd;
                }
            }
        }

        else if ( (pParms->rop4 == 0xaaf0) && ( EGPEFormatToBpp[pParms->pDst->Format()] == 16 ) )
        {

            if (pParms->solidColor != -1)
            {
                if (pParms->pMask->Format() == gpe1Bpp)
                {
                    code = EmulatedBltText16_Eml(pParms);
                    goto contd;
                }
                else if (pParms->pMask->Format() == gpe4Bpp)
                {
                    code = EmulatedBltAlphaText16_Eml(pParms);
                    goto contd;
                }
            }
        }


    }

    code = EmulatedBlt(pParms); // Draw to the backup framebuffer	

    contd:

    bounds.left     = pParms->prclDst->left;
    bounds.top      = pParms->prclDst->top;
    bounds.right    = pParms->prclDst->right;
    bounds.bottom   = pParms->prclDst->bottom;

⌨️ 快捷键说明

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