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

📄 gfx_osi.c

📁 IBM source for pallas/vulcan/vesta
💻 C
📖 第 1 页 / 共 4 页
字号:
INT gfx_osi_bitBLT(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY,                UINT uWidth, UINT uHeight,                GFX_SURFACE_T *pSrc,  INT nSrcX,  INT nSrcY,                ALPHA_SELECT *pAlphaSelect, char enableGammaCorrection){    INT rtn = 0;    if(!gfx_osi_pSurface_valid(pSrc) || !gfx_osi_pSurface_valid(pDes) ||       !IS_SURFACE_G2D_COMP(pSrc->uPlaneConfig) || !IS_SURFACE_G2D_COMP(pDes->uPlaneConfig))    {        PDEBUG("invalid surface!\n");        return -1;    }    gfx_osi_pixelJustify(pSrc->plane[0].uPixelJustify, (UINT *)&nSrcX, &uWidth);    gfx_osi_pixelJustify(pDes->plane[0].uPixelJustify, (UINT *)&nDesX, &uWidth);    if(gfx_osi_ClipExtBLTRect(&pSrc->bound, &pDes->clip,                             &nSrcX, &nSrcY, &nDesX, &nDesY,  &uWidth, &uHeight, NULL, NULL))    {        PDEBUG("No overlapping rect is found!\n");        return 0;       // just done    }    {        if(GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig) == G2D_CLUT1)        {            GFX_PALETTE_T yuvpal[2];            GFX_PALETTE_T *pPal;            pPal = __gfx_osi_g2d_select_palette(pSrc, pDes, yuvpal);            switch(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig))            {            case G2D_CLUT8:                __gfx_osi_g2d_bitblt_1_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, 1, 0);                break;            case G2D_AYCBCR422:                if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect)                    __gfx_osi_g2d_bitblt_1_8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal[1].a, pPal[0].a);  // a                else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect)                    __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pAlphaSelect->globalAlphaValue);  // a            case G2D_YCBCR422:                __gfx_osi_g2d_bitblt_1_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal[1].r, pPal[0].r);  // y                __gfx_osi_g2d_bitblt_1_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, ((UINT)pPal[1].g<<8) | pPal[1].b, ((UINT)pPal[0].g<<8) | pPal[0].b);  // uv                break;            case G2D_AYCBCR420:                if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect)                    __gfx_osi_g2d_bitblt_1_8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal[1].a, pPal[0].a);  // a                else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect)                    __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pAlphaSelect->globalAlphaValue);  // a            case G2D_YCBCR420:                __gfx_osi_g2d_bitblt_1_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal[1].r, pPal[0].r);  // y                __gfx_osi_g2d_bitblt_1_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY/2,                    uWidth, uHeight/2, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine*2, nSrcX, nSrcY/2, ((UINT)pPal[1].g<<8) | pPal[1].b, ((UINT)pPal[0].g<<8) | pPal[0].b);  // uv                break;            case G2D_ARGB_8888:                __gfx_osi_g2d_bitblt_1_32(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, *(UINT32 *)&pPal[1], *(UINT32 *)&pPal[0]);            default:                rtn = -1;                break;            }        }        else if(GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig) == G2D_CLUT8)        {            GFX_PALETTE_T yuvpal[256];            GFX_PALETTE_T *pPal;            pPal = __gfx_osi_g2d_select_palette(pSrc, pDes, yuvpal);            switch(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig))            {            case G2D_CLUT8:                __gfx_osi_g2d_bitblt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                break;            case G2D_AYCBCR422:                if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect)                    __gfx_osi_g2d_bitblt_clut_8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal, 0);  // a                else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect)                    __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pAlphaSelect->globalAlphaValue);  // a            case G2D_YCBCR422:                __gfx_osi_g2d_bitblt_clut_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal, 1);  // y                __gfx_osi_g2d_bitblt_clut_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal);  // uv                break;            case G2D_AYCBCR420:                if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect)                    __gfx_osi_g2d_bitblt_clut_8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal, 0);  // a                else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect)                    __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pAlphaSelect->globalAlphaValue);  // a            case G2D_YCBCR420:                __gfx_osi_g2d_bitblt_clut_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal, 1);  // y                __gfx_osi_g2d_bitblt_clut_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY/2,                    uWidth, uHeight/2, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine*2, nSrcX, nSrcY/2, pPal);  // uv                break;            case G2D_ARGB_8888:                __gfx_osi_g2d_bitblt_clut_32(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal);  // y                break;            default:                rtn = -1;                break;            }        }        else if(IS_GFX_SURFACE_CLUT(pDes->uPlaneConfig))        {            rtn = -1;        }        else    // we all are direct color modes        {            switch(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig))            {            case G2D_YCBCR422:      // des is 422            case G2D_AYCBCR422:                     switch(GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig))                {                case G2D_YCBCR422:      // src is 422                case G2D_AYCBCR422:                         // y first                    __gfx_osi_g2d_bitblt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                    // uv                    __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, nSrcX, nSrcY);                    break;                case G2D_YCBCR420:      // src is 420                case G2D_AYCBCR420:     // we should expand to 422                    // y first                    __gfx_osi_g2d_bitblt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                    // uv                    // even lines                    __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine*2, nDesX, nDesY/2,                        uWidth, uHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, nSrcX, nSrcY/2);                    // odd lines                    __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine*2, nDesX + pDes->plane[1].uBytePerLine, nDesY/2,                        uWidth, uHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, nSrcX, nSrcY/2);                    break;                case G2D_ARGB_8888: // src is argb8888                    __gfx_osi_g2d_bitblt_32_yuv422(pDes->plane[0].pBuffer, pDes->plane[1].pBuffer, pDes->plane[2].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                    break;                default:                    rtn = -1;                }                break;            case G2D_YCBCR420:          // des is 420            case G2D_AYCBCR420:                switch(GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig))                {                case G2D_YCBCR422:      // src is 422                case G2D_AYCBCR422:     // we need drop odd lines                    // y first                    __gfx_osi_g2d_bitblt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                    // uv                    __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY/2,                        uWidth, uHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine*2, nSrcX, nSrcY/2);                    break;                case G2D_YCBCR420:      // src is 420                case G2D_AYCBCR420:                         // y first                    __gfx_osi_g2d_bitblt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                    // uv                    __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY/2,                        uWidth, uHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, nSrcX, nSrcY/2);                    break;                case G2D_ARGB_8888: // src is argb8888                    __gfx_osi_g2d_bitblt_32_yuv420(pDes->plane[0].pBuffer, pDes->plane[1].pBuffer, pDes->plane[2].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                default:                    rtn = -1;                }                break;            case G2D_ARGB_8888:     // des is rgb 8888                switch(GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig))                {                case G2D_YCBCR422:      // src is 422                case G2D_AYCBCR422:     // we need drop odd lines                    __gfx_osi_g2d_bitblt_yuv422_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[1].pBuffer, pSrc->plane[2].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                    break;                case G2D_YCBCR420:      // src is 420                case G2D_AYCBCR420:                         __gfx_osi_g2d_bitblt_yuv420_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[1].pBuffer, pSrc->plane[2].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                    break;                case G2D_ARGB_8888: // src is argb8888                    __gfx_osi_g2d_bitblt_32(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY);                    break;                default:                    rtn = -1;                }                break;            default:                rtn = -1;            }            // a for yuv colors            switch(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig))            {            case G2D_AYCBCR422:     // dest has alpha            case G2D_AYCBCR420:                switch(GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig))                {                case G2D_YCBCR422:      // src has no alpha                case G2D_YCBCR420:                    if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect)                        __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                          uWidth, uHeight, 255);  // a                    else if(pAlphaSelect && GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect)                        __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                          uWidth, uHeight, pAlphaSelect->globalAlphaValue);  // a                    break;                case G2D_AYCBCR422:     // src has alpha                case G2D_AYCBCR420:                         if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect)                        __gfx_osi_g2d_bitblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                          uWidth, uHeight, pSrc->plane[2].pBuffer, pSrc->plane[2].uBytePerLine, nSrcX, nSrcY);                    else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect)                        __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                        uWidth, uHeight, pAlphaSelect->globalAlphaValue);  // a                    break;                }                break;            default: // no alpha at all                break;            }        }    }    return rtn;}INT gfx_osi_advancedBitBLT(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY,            UINT uWidth, UINT uHeight,            GFX_SURFACE_T *pSrc, INT nSrcX, INT nSrcY,            GFX_SURFACE_T  *pMask, INT nMaskX, INT nMaskY,            GFX_ROP_CODE_T ROP,            char enablePixelBitMask, UINT32 uPixelBitMask,            ALPHA_SELECT *pAlphaSelect){    INT rtn, xadj, yadj;    if(!gfx_osi_pSurface_valid(pSrc) || !gfx_osi_pSurface_valid(pDes))    {        PDEBUG("invalid surface!\n");        return -1;    }#if 0   // fixme: CLUT1 is not here    if(gfx_osi_pSurface_valid(pMask) && GET_GFX_SURFACE_DATA_TYPE(pMask->uPlaneConfig) !=  G2D_CLUT1)    {        PDEBUG("invalid mask surface!\n");        return -1;    }#endif    gfx_osi_pixelJustify(pSrc->plane[0].uPixelJustify, (UINT *)&nSrcX, &uWidth);    gfx_osi_pixelJustify(pDes->plane[0].uPixelJustify, (UINT *)&nDesX, &uWidth);    if(gfx_osi_ClipExtBLTRect(&pSrc->bound, &pDes->clip,                             &nSrcX, &nSrcY, &nDesX, &nDesY,  &uWidth, &uHeight, &xadj, &yadj))    {        PDEBUG("No overlapping rect is found!\n");        return 0;       // just done    }     // Fixme:  I don't know how to deal with too small a mask by default    // So I assume we clip also by mask bound    if(pMask)    {        UINT uMaskWidth, uMaskHeight;        INT nx, ny;        uMaskWidth = uWidth;        uMaskHeight = uHeight;        nMaskX += xadj;        nMaskY += yadj;        nx = nMaskX;        ny = nMaskY;        // check for pattern area        if(gfx_osi_ClipExtRect(&pMask->bound,            &nMaskX, &nMaskY, &uMaskWidth, &uMaskHeight))        {            PDEBUG("No overlapping mask rect is found!\n");            return -1;        }        else if(uMaskWidth < uWidth || uMaskHeight < uHeight)        {            uWidth = uMaskWidth;            uHeight = uMaskHeight;            nx = nMaskX - nx;            ny = nMaskY - ny;            nSrcX += nx;             nDesX += nx;             nSrcY += ny;             nDesY += ny;         }    }       rtn = -1;    return rtn;}INT gfx_osi_fillBLT(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY,            UINT uWidth, UINT uHeight, UINT32 uFillColor){    INT rtn = 0;    if(!gfx_osi_pSurface_valid(pDes))    {        PDEBUG("invalid surface!\n");        return -1;    }    gfx_osi_pixelJustify(pDes->plane[0].uPixelJustify, (UINT *)&nDesX, &uWidth);    if(gfx_osi_ClipExtRect(&pDes->clip,                             &nDesX, &nDesY, &uWidth, &uHeight))    {        PDEBUG("No in-clip rect is found!\n");        return 0;       // that's it    }    if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_CLUT1)    {        PDEBUG("CLUT1\n");        __gfx_osi_g2d_fillblt1(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,            uWidth, uHeight, uFillColor);    }    else if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_CLUT8)

⌨️ 快捷键说明

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