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

📄 gfx_osi.c

📁 IBM source for pallas/vulcan/vesta
💻 C
📖 第 1 页 / 共 4 页
字号:
    {        PDEBUG("CLUT8\n");        __gfx_osi_g2d_fillblt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,            uWidth, uHeight, uFillColor);    }    else if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_ARGB_8888)    {        PDEBUG("ARGB8888\n");        __gfx_osi_g2d_fillblt32(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,            uWidth, uHeight, uFillColor);    }    else     {        BYTE y,u,v;        gfx_osi_rgb2ycbcr((uFillColor>>16)&0xff, (uFillColor>>8)&0xff, (uFillColor)&0xff,  &y, &u, &v);        PDEBUG("Color = Y %02x, U %02x, V %02x\n",  y,u,v);        switch(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig))        {        case G2D_AYCBCR422:                 PDEBUG(" Alpha = %08x\n", pDes->plane[2].pBuffer);            __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                uWidth, uHeight, uFillColor>>24);   // a        case G2D_YCBCR422:            PDEBUG(" Y = %08x\n", pDes->plane[0].pBuffer);            __gfx_osi_g2d_fillblt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                uWidth, uHeight, y);            PDEBUG(" UV = %08x\n", pDes->plane[1].pBuffer);            __gfx_osi_g2d_fillblt_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY,                uWidth, uHeight, ((UINT)u<<8)|v);            break;        case G2D_AYCBCR420:            PDEBUG(" Alpha = %08x\n", pDes->plane[2].pBuffer);            __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                uWidth, uHeight, uFillColor>>24);   // a        case G2D_YCBCR420:          // des is 420            PDEBUG(" Y = %08x\n", pDes->plane[0].pBuffer);            __gfx_osi_g2d_fillblt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                uWidth, uHeight, y); // y            PDEBUG(" UV = %08x\n", pDes->plane[1].pBuffer);            __gfx_osi_g2d_fillblt_uv(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY/2,                uWidth, uHeight/2, ((UINT)u<<8)|v);            break;        default:            rtn = -1;             break;        }    }    return rtn;}INT gfx_osi_advancedFillBLT(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY,            UINT uWidth, UINT uHeight, UINT32 uFillColor, /* formatted in the dest format color if rgb, index if clut */            GFX_SURFACE_T  *pMask, INT nMaskX, INT nMaskY,            GFX_ROP_CODE_T ROP, char transparencyEnable,    //             UINT32 uBackGroundColor, char enablePixelBitMask, UINT32 uPixelBitMask){    INT rtn = 0;    if(!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(pDes->plane[0].uPixelJustify, (UINT *)&nDesX, &uWidth);    if(pMask)    {        if(gfx_osi_ClipExtBLTRect(&pMask->bound, &pDes->clip,                                 &nMaskX, &nMaskY, &nDesX, &nDesY,  &uWidth, &uHeight, NULL,NULL))        {            PDEBUG("No overlapping rect is found!\n");            return 0;       // just done        }        PDEBUGE("MaskX = %d, Y = %d, W = %d, H= %d\n", nMaskX, nMaskY, uWidth, uHeight);    }    else    // no mask    {        if(gfx_osi_ClipExtRect(&pDes->clip,                                 &nDesX, &nDesY, &uWidth, &uHeight))        {            return 0;       // that's it        }        return gfx_osi_fillBLT(pDes, nDesX, nDesY, uWidth, uHeight, uFillColor);    }    if(!transparencyEnable)    {        if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_CLUT1)        {            PDEBUG("CLUT1\n");            return -1;        }        else if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_CLUT8)        {            PDEBUG("CLUT8\n");            __gfx_osi_g2d_bitblt_1_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                uWidth, uHeight, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                uFillColor, uBackGroundColor);        }        else if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_ARGB_8888)        {            PDEBUG("ARGB8888\n");            __gfx_osi_g2d_bitblt_1_32(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                uWidth, uHeight, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                uFillColor, uBackGroundColor);        }        else        {            BYTE y,u,v, yb, ub, vb;            gfx_osi_rgb2ycbcr((uFillColor>>16)&0xff, (uFillColor>>8)&0xff, (uFillColor)&0xff,  &y, &u, &v);            gfx_osi_rgb2ycbcr((uBackGroundColor>>16)&0xff, (uBackGroundColor>>8)&0xff, (uBackGroundColor)&0xff,  &yb, &ub, &vb);            switch(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig))            {            case G2D_AYCBCR422:                     PDEBUG(" Alpha = %08x\n", pDes->plane[2].pBuffer);                __gfx_osi_g2d_bitblt_1_8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer,                     pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                     (uFillColor>>24)&0xff, (uBackGroundColor>>24)&0xff);            case G2D_YCBCR422:                PDEBUG(" Y = %08x\n", pDes->plane[0].pBuffer);                __gfx_osi_g2d_bitblt_1_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer,                     pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                    y, yb);                PDEBUG(" UV = %08x\n", pDes->plane[1].pBuffer);                __gfx_osi_g2d_bitblt_1_8(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer,                     pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                    ((UINT)u<<8) | v, ((UINT)ub<<8) | vb);                break;            case G2D_AYCBCR420:                PDEBUG(" Alpha = %08x\n", pDes->plane[2].pBuffer);                __gfx_osi_g2d_bitblt_1_8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer,                     pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                    (uFillColor>>24)&0xff, (uBackGroundColor>>24)&0xff);            case G2D_YCBCR420:          // des is 420                PDEBUG(" Y = %08x\n", pDes->plane[0].pBuffer);                __gfx_osi_g2d_bitblt_1_8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer,                     pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                    y, yb);                PDEBUG(" UV = %08x\n", pDes->plane[1].pBuffer);                __gfx_osi_g2d_bitblt_1_8(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY/2,                    uWidth, uHeight/2, pMask->plane[0].pBuffer,                     pMask->plane[0].uBytePerLine*2, nMaskX, nMaskY/2,                    ((UINT)u<<8) | v, ((UINT)ub<<8) | vb);                break;            default:                rtn = -1;                break;            }        }    }    else    // transparent    {        if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_CLUT1)        {            PDEBUG("CLUT1\n");            return -1;        }        else if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_CLUT8)        {            PDEBUG("CLUT8\n");            __gfx_osi_g2d_maskflt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                uWidth, uHeight, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine, nMaskX, nMaskY, uFillColor);        }        else if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_ARGB_8888)        {            PDEBUG("ARGB8888\n");            __gfx_osi_g2d_maskflt32(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                uWidth, uHeight, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine, nMaskX, nMaskY, uFillColor);        }        else        {            BYTE y,u,v;            gfx_osi_rgb2ycbcr((uFillColor>>16)&0xff, (uFillColor>>8)&0xff, (uFillColor)&0xff,  &y, &u, &v);            switch(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig))            {            case G2D_AYCBCR422:                     PDEBUG(" Alpha = %08x\n", pDes->plane[2].pBuffer);                __gfx_osi_g2d_maskflt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                     (uFillColor>>24)&0xff);            case G2D_YCBCR422:                PDEBUG(" Y = %08x\n", pDes->plane[0].pBuffer);                __gfx_osi_g2d_maskflt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                     y);                PDEBUG(" UV = %08x\n", pDes->plane[1].pBuffer);                __gfx_osi_g2d_maskflt8(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                     ((UINT)u<<8) | v);                break;            case G2D_AYCBCR420:                PDEBUG(" Alpha = %08x\n", pDes->plane[2].pBuffer);                __gfx_osi_g2d_maskflt8(pDes->plane[2].pBuffer,  pDes->plane[2].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                     (uFillColor>>24)&0xff);            case G2D_YCBCR420:          // des is 420                PDEBUG(" Y = %08x\n", pDes->plane[0].pBuffer);                __gfx_osi_g2d_maskflt8(pDes->plane[0].pBuffer,  pDes->plane[0].uBytePerLine, nDesX, nDesY,                    uWidth, uHeight, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine, nMaskX, nMaskY,                     y);                PDEBUG(" UV = %08x\n", pDes->plane[1].pBuffer);                __gfx_osi_g2d_maskflt8(pDes->plane[1].pBuffer,  pDes->plane[1].uBytePerLine, nDesX, nDesY/2,                    uWidth, uHeight/2, pMask->plane[0].pBuffer, pMask->plane[0].uBytePerLine*2, nMaskX, nMaskY/2,                     ((UINT)u<<8) | v);                break;            default:                rtn = -1;                break;            }        }    }    return rtn;}INT gfx_osi_blend(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY,                UINT uWidth, UINT uHeight,                GFX_SURFACE_T *pSrc, INT nSrcX, INT nSrcY,                ALPHA_BLEND_SELECT *pBlendSelect){    INT rtn = 0;    if(!gfx_osi_pSurface_valid(pSrc) || !gfx_osi_pSurface_valid(pDes))    {        PDEBUG("invalid surface!\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    }    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 = &bs;            bs.blendInputSelect = GFX_BLEND_ALPHA_FROM_SOURCE;            bs.globalAlphaValue = 255;            bs.storedAlphaSelect = GFX_DEST_ALPHA_FROM_DESTINATION;        }        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_SOURCE:        default:            psrca = pSrc->plane[0].pBuffer + nSrcY*pSrc->plane[0].uBytePerLine + (nSrcX<<2);            bplsrca = pSrc->plane[0].uBytePerLine;            incsrca = 4;            break;                }        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_advancedBlend(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY,                UINT uWidth, UINT uHeight,                GFX_SURFACE_T *pSrc, INT nSrcX, INT nSrcY,                GFX_SURFACE_T *pAlpha, INT nAlphaX, INT nAlphaY,                ALPHA_BLEND_SELECT *pBlendSelect){    INT rtn = 0, xadj, yadj;    if(!gfx_osi_pSurface_valid(pSrc) || !gfx_osi_pSurface_valid(pDes))    {        PDEBUG("invalid surface!\n");        return -1;    }    if(pAlpha && (!gfx_osi_pSurface_alloc(pAlpha)        || G2D_CLUT8 != GET_GFX_SURFACE_DATA_TYPE(pAlpha->uPlaneConfig)))    {        PDEBUG("invalid alpha surface!\n");        return -1;    }    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

⌨️ 快捷键说明

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