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

📄 gfx_osi.c

📁 IBM source for pallas/vulcan/vesta
💻 C
📖 第 1 页 / 共 4 页
字号:
    }     // 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(pAlpha)    {        UINT uAlphaWidth, uAlphaHeight;        INT nx, ny;        uAlphaWidth = uWidth;        uAlphaHeight = uHeight;        nAlphaX += xadj;        nAlphaY += yadj;        nx = nAlphaX;        ny = nAlphaY;        // check for pattern area        if(gfx_osi_ClipExtRect(&pAlpha->bound,            &nAlphaX, &nAlphaY, &uAlphaWidth, &uAlphaHeight))        {            PDEBUG("No overlapping mask rect is found!\n");            return -1;        }        else if(uAlphaWidth < uWidth || uAlphaHeight < uHeight)        {            uWidth = uAlphaWidth;            uHeight = uAlphaHeight;            nx = nAlphaX - nx;            ny = nAlphaY - ny;            nSrcX += nx;             nDesX += nx;             nSrcY += ny;             nDesY += ny;         }    }    if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) != G2D_ARGB_8888 || GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig) != G2D_ARGB_8888)    {        rtn = -1;    }    else    {        BYTE *psrca;        UINT bplsrca;        UINT incsrca;        ALPHA_BLEND_SELECT bs;        if(!pBlendSelect ||             (pBlendSelect->blendInputSelect == GFX_BLEND_ALPHA_FROM_PATTERN && !pAlpha)) // no alpha given        {            pBlendSelect = &bs;            bs.blendInputSelect = GFX_BLEND_ALPHA_FROM_SOURCE;            bs.globalAlphaValue = 255;            bs.storedAlphaSelect = GFX_DEST_ALPHA_FROM_DESTINATION;            PDEBUG("Alpha mask is not used\n");        }        switch(pBlendSelect->blendInputSelect)        {        case GFX_BLEND_ALPHA_FROM_GIVEN:            psrca = &pBlendSelect->globalAlphaValue;            bplsrca = 0;            incsrca = 0;            break;        case GFX_BLEND_ALPHA_FROM_DESTINATION:            psrca = pDes->plane[0].pBuffer + nDesY*pDes->plane[0].uBytePerLine + (nDesX<<2);            bplsrca = pDes->plane[0].uBytePerLine;            incsrca = 4;            break;        case GFX_BLEND_ALPHA_FROM_PATTERN:            psrca = pAlpha->plane[0].pBuffer + nAlphaY*pAlpha->plane[0].uBytePerLine + nAlphaX;            bplsrca = pAlpha->plane[0].uBytePerLine;            incsrca = 1;            break;        case GFX_BLEND_ALPHA_FROM_SOURCE:        default:            psrca = pSrc->plane[0].pBuffer + nSrcY*pSrc->plane[0].uBytePerLine + (nSrcX<<2);            bplsrca = pSrc->plane[0].uBytePerLine;            incsrca = 4;            break;                }        PDEBUGE("Alpha p = %08x, bpl=%d, inc=%d\n", psrca, bplsrca, incsrca);        switch(pBlendSelect->storedAlphaSelect)        {        case GFX_DEST_ALPHA_FROM_GIVEN:            __gfx_osi_g2d_blend32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight,                      pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY,                      psrca, bplsrca, incsrca, &pBlendSelect->globalAlphaValue, 0, 0);            break;        case GFX_DEST_ALPHA_FROM_SOURCE:            __gfx_osi_g2d_blend32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight,                      pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY,                      psrca, bplsrca, incsrca,                       pSrc->plane[0].pBuffer + nSrcY*pSrc->plane[0].uBytePerLine + (nSrcX<<2), pSrc->plane[0].uBytePerLine, 4);            break;        case GFX_DEST_ALPHA_FROM_DESTINATION:            __gfx_osi_g2d_blend32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight,                      pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY,                      psrca, bplsrca, incsrca,                       pDes->plane[0].pBuffer + nDesY*pDes->plane[0].uBytePerLine + (nDesX<<2), pDes->plane[0].uBytePerLine, 4);            break;        case GFX_DEST_ALPHA_FROM_BLEND:            __gfx_osi_g2d_blend32_a(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight,                      pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY,                      psrca, bplsrca, incsrca);            break;        }    }    return rtn;}INT gfx_osi_colorKey(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY,                UINT uWidth, UINT uHeight,                GFX_SURFACE_T *pSrc, INT nSrcX, INT nSrcY,                COLOR_KEY_SELECT *pColorKeySelect, ALPHA_SELECT *pAlphaSelect){    INT rtn;    if(!gfx_osi_pSurface_valid(pSrc) || !gfx_osi_pSurface_valid(pDes))    {        PDEBUG("invalid surface!\n");        return -1;    }    if(!pColorKeySelect)    {        PDEBUG("Color key is not specified!\n");        return -1;    }    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    }    rtn = -1;    return rtn;}INT gfx_osi_resize(GFX_SURFACE_T *pDes, UINT uDesX, UINT uDesY, UINT uDesWidth, UINT uDesHeight,            GFX_SURFACE_T *pSrc, UINT uSrcX, UINT uSrcY, UINT uSrcWidth, UINT uSrcHeight,            BYTE destAlpha, char enableGammaCorrection){    INT rtn = 0;    if(!gfx_osi_pSurface_valid(pSrc) || !gfx_osi_pSurface_valid(pDes))    {        PDEBUG("invalid surface!\n");        return -1;    }    gfx_osi_pixelJustify(pDes->plane[0].uPixelJustify, &uDesX, &uDesWidth);    gfx_osi_pixelJustify(pSrc->plane[0].uPixelJustify, &uSrcX, &uSrcWidth);    if(gfx_osi_ClipRect(pDes->plane[0].uAllocWidth, pDes->plane[0].uAllocHeight,                             uDesX, uDesY, &uDesWidth, &uDesHeight))    {        return 0;       // that's it    }    if(gfx_osi_ClipRect(pSrc->plane[0].uAllocWidth, pSrc->plane[0].uAllocHeight,                             uSrcX, uSrcY, &uSrcWidth, &uSrcHeight))    {        return 0;       // that's it    }    {        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_resize_nn8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                    uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);                break;            case G2D_AYCBCR422:                __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, uDesX, uDesY,                    uDesWidth, uDesHeight, destAlpha);  // a            case G2D_YCBCR422:                // y                __gfx_osi_g2d_resize_clut_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                    uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight, pPal, 1);                // uv                __gfx_osi_g2d_resize_clut_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, uDesX, uDesY,                    uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight, pPal);                break;            case G2D_AYCBCR420:                __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, uDesX, uDesY,                    uDesWidth, uDesHeight, destAlpha);  // a            case G2D_YCBCR420:                // y                __gfx_osi_g2d_resize_clut_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                    uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight, pPal, 1);                // uv                __gfx_osi_g2d_resize_clut_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, uDesX, uDesY/2,                    uDesWidth, uDesHeight/2, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight, pPal);                break;            case G2D_ARGB_8888:                __gfx_osi_g2d_resize_clut_32(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                    uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight, pPal);                break;            default:                rtn = -1;                break;            }        }        else if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_CLUT8 || IS_GFX_SURFACE_CLUT(pSrc->uPlaneConfig))        {            rtn = -1;        }        else    // we all are direct color modes        {            // uv            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#ifdef __G2D_FAST_RESIZE                    __gfx_osi_g2d_resize_nn8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);#else                    __gfx_osi_g2d_resize_bl8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);#endif                    // uv                    __gfx_osi_g2d_resize_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);                    break;                case G2D_YCBCR420:      // src is 420                case G2D_AYCBCR420:     // we should expand to 422                    // y first#ifdef __G2D_FAST_RESIZE                    __gfx_osi_g2d_resize_nn8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);#else                    __gfx_osi_g2d_resize_bl8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);#endif                    // uv                    __gfx_osi_g2d_resize_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, uSrcX, uSrcY/2, uSrcWidth, uSrcHeight/2);                    break;                case G2D_ARGB_8888:                    __gfx_osi_g2d_resize_32_yuv422(pDes->plane[0].pBuffer, pDes->plane[1].pBuffer, pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);                    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#ifdef __G2D_FAST_RESIZE                    __gfx_osi_g2d_resize_nn8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);#else                    __gfx_osi_g2d_resize_bl8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);#endif                    // uv                    __gfx_osi_g2d_resize_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, uDesX, uDesY/2,                        uDesWidth, uDesHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);                    break;                case G2D_YCBCR420:      // src is 420                case G2D_AYCBCR420:                         // y first#ifdef __G2D_FAST_RESIZE                    __gfx_osi_g2d_resize_nn8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);#else                    __gfx_osi_g2d_resize_bl8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);#endif                    // uv                    __gfx_osi_g2d_resize_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, uDesX, uDesY/2,                        uDesWidth, uDesHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, uSrcX, uSrcY/2, uSrcWidth, uSrcHeight/2);                    break;                case G2D_ARGB_8888:                    __gfx_osi_g2d_resize_32_yuv420(pDes->plane[0].pBuffer, pDes->plane[1].pBuffer, pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);                    break;                default:                    rtn = -1;                }                break;            case G2D_ARGB_8888: // des is argb8888                switch(GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig))                {                case G2D_YCBCR422:      // src is 422                case G2D_AYCBCR422:                         __gfx_osi_g2d_resize_yuv422_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[1].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight, destAlpha);                    break;                case G2D_YCBCR420:      // src is 420                case G2D_AYCBCR420:                         __gfx_osi_g2d_resize_yuv420_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[1].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight, destAlpha);                    break;                case G2D_ARGB_8888:                    __gfx_osi_g2d_resize_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, uDesX, uDesY,                        uDesWidth, uDesHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, uSrcX, uSrcY, uSrcWidth, uSrcHeight);                    break;                default:                    rtn = -1;                }                break;            default:                rtn = -1;            }            // a            switch(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig))            {            case G2D_AYCBCR422:     // dest has alpha            case G2D_AYCBCR420:                __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, uDesX, uDesY,                    uDesWidth, uDesHeight, destAlpha);  // a                break;            default: // no alpha at all                break;            }        }    }    return rtn;}

⌨️ 快捷键说明

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