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

📄 gfx_osi_engine.c

📁 IBM source for pallas/vulcan/vesta
💻 C
📖 第 1 页 / 共 3 页
字号:
        }        pdes += bpldes;    }}void __gfx_osi_g2d_resize_uv(BYTE *pdes,  INT bpldes, INT nDesX, INT nDesY,                UINT uDesWidth, UINT uDesHeight, BYTE *psrc, INT bplsrc, INT nSrcX,  INT nSrcY, UINT uSrcWidth, UINT uSrcHeight){    int x, y, xp, yp, wplsrc, wpldes, srcw, desw;    UINT16 *ps, *pd;    ps = (UINT16 *)(psrc + nSrcX + nSrcY*bplsrc);    pd = (UINT16 *)(pdes + nDesX + nDesY*bpldes);    wplsrc =  bplsrc>>1;    wpldes =  bpldes>>1;    srcw = uSrcWidth>>1;    desw = uDesWidth>>1;    for(y=0; y<uDesHeight; y++)     {        yp = (((y*uSrcHeight)<<8)/uDesHeight + 128)>>8;        yp *= wplsrc;        for(x=0; x<desw; x++)         {            xp = (((x*srcw)<<8)/desw + 128)>>8;  // on even pairs            pd[x] = ps[xp+yp];        }        pd += wpldes;    }}void __gfx_osi_g2d_resize_32(BYTE *pdes, INT bpldes, INT nDesX, INT nDesY,                UINT uDesWidth, UINT uDesHeight, BYTE *psrc, INT bplsrc, INT nSrcX,  INT nSrcY, UINT uSrcWidth, UINT uSrcHeight){    int x, y, xp, yp, ypx;    int xx, yy, dx, dy;    BYTE *pp;    UINT32 p00, p01, p10, p11;    psrc = psrc + (nSrcX<<2) + nSrcY*bplsrc;    pdes = pdes + (nDesX<<2) + nDesY*bpldes;    for(y=0; y<uDesHeight; y++)     {        UINT32 *pBuf = (UINT32 *)pdes;        yy = ((y*uSrcHeight)<<8)/uDesHeight;        yp = yy>>8;  dy = yy&0xff;        ypx = yp*bplsrc;        for(x=0; x<uDesWidth; x++)         {            xx = ((x*uSrcWidth)<<8)/uDesWidth;            xp = xx>>8; dx = xx&0xff;            pp = (psrc+(xp<<2)+ypx);            p00 = *(UINT32 *)pp;            if(xp+1 < uSrcWidth)            {                p10 = *(UINT32 *)(pp+4);                 if(yp+1 < uSrcHeight)                {                    p01 = *(UINT32 *)(pp+bplsrc);                    p11 = *(UINT32 *)(pp+bplsrc+4);                }                else                {                    p01 = p00;                    p11 = p10;                }            }            else            {                p10 = p00;                if(yp+1 < uSrcHeight)                {                    p01 = *(UINT32 *)(pp+bplsrc);                    p11 = p01;                }                else                {                    p01 = p00;                    p11 = p10;                }            }            {                UINT32 r,g,b,a;                {                    BYTE p00r, p01r, p10r, p11r;                    p00r = (p00>>16)&0xff;                    p01r = (p01>>16)&0xff;                    p10r = (p10>>16)&0xff;                    p11r = (p11>>16)&0xff;                    r = ((p11r*dx+p01r*(256-dx))*dy + (p10r*dx+p00r*(256-dx))*(256-dy))&0xff0000;                }                {                    BYTE p00g, p01g, p10g, p11g;                    p00g = (p00>> 8)&0xff;                    p01g = (p01>> 8)&0xff;                    p10g = (p10>> 8)&0xff;                    p11g = (p11>> 8)&0xff;                    g = (((p11g*dx+p01g*(256-dx))*dy + (p10g*dx+p00g*(256-dx))*(256-dy))>>8)&0xff00;                }                {                    BYTE p00b, p01b, p10b, p11b;                    p00b = (p00    )&0xff;                    p01b = (p01    )&0xff;                    p10b = (p10    )&0xff;                    p11b = (p11    )&0xff;                    b = (((p11b*dx+p01b*(256-dx))*dy + (p10b*dx+p00b*(256-dx))*(256-dy))>>16)&0xff;                }                {                    BYTE p00a, p01a, p10a, p11a;                    p00a = (p00>>24)&0xff;                    p01a = (p01>>24)&0xff;                    p10a = (p10>>24)&0xff;                    p11a = (p11>>24)&0xff;                    a = (((p11a*dx+p01a*(256-dx))*dy + (p10a*dx+p00a*(256-dx))*(256-dy))<<8)&0xff000000;                }                pBuf[x] = a | r | g | b;            }        }        pdes += bpldes;    }}void __gfx_osi_g2d_resize_32_yuv422(BYTE *pdesy, BYTE *pdesuv, INT bpldes, INT nDesX, INT nDesY,                UINT uDesWidth, UINT uDesHeight, BYTE *psrc, INT bplsrc, INT nSrcX,  INT nSrcY, UINT uSrcWidth, UINT uSrcHeight){    int x, y, xp, yp, ypx;    int xx, yy, dx, dy;    BYTE *pp;    UINT32 p00, p01, p10, p11;    psrc = psrc + (nSrcX<<2) + nSrcY*bplsrc;    pdesy = pdesy + nDesX + nDesY*bpldes;    pdesuv = pdesuv + nDesX + nDesY*bpldes;    for(y=0; y<uDesHeight; y++)     {        yy = ((y*uSrcHeight)<<8)/uDesHeight;        yp = yy>>8;  dy = yy&0xff;        ypx = yp*bplsrc;        for(x=0; x<uDesWidth; x++)         {            xx = ((x*uSrcWidth)<<8)/uDesWidth;            xp = xx>>8; dx = xx&0xff;            pp = (psrc+(xp<<2)+ypx);            p00 = *(UINT32 *)pp;            if(xp+1 < uSrcWidth)            {                p10 = *(UINT32 *)(pp+4);                 if(yp+1 < uSrcHeight)                {                    p01 = *(UINT32 *)(pp+bplsrc);                    p11 = *(UINT32 *)(pp+bplsrc+4);                }                else                {                    p01 = p00;                    p11 = p10;                }            }            else            {                p10 = p00;                if(yp+1 < uSrcHeight)                {                    p01 = *(UINT32 *)(pp+bplsrc);                    p11 = p01;                }                else                {                    p01 = p00;                    p11 = p10;                }            }            {                BYTE r,g,b, dummy;                {                    BYTE p00r, p01r, p10r, p11r;                    p00r = (p00>>16)&0xff;                    p01r = (p01>>16)&0xff;                    p10r = (p10>>16)&0xff;                    p11r = (p11>>16)&0xff;                    r = (BYTE)(((p11r*dx+p01r*(256-dx))*dy + (p10r*dx+p00r*(256-dx))*(256-dy))>>16);                }                {                    BYTE p00g, p01g, p10g, p11g;                    p00g = (p00>> 8)&0xff;                    p01g = (p01>> 8)&0xff;                    p10g = (p10>> 8)&0xff;                    p11g = (p11>> 8)&0xff;                    g = (BYTE)(((p11g*dx+p01g*(256-dx))*dy + (p10g*dx+p00g*(256-dx))*(256-dy))>>16);                }                {                    BYTE p00b, p01b, p10b, p11b;                    p00b = (p00    )&0xff;                    p01b = (p01    )&0xff;                    p10b = (p10    )&0xff;                    p11b = (p11    )&0xff;                    b = (BYTE)(((p11b*dx+p01b*(256-dx))*dy + (p10b*dx+p00b*(256-dx))*(256-dy))>>16);                }                if((x+nDesX)&1) // v                    gfx_osi_rgb2ycbcr(r,g,b, pdesy+x, &dummy, pdesuv+x);                else                    gfx_osi_rgb2ycbcr(r,g,b, pdesy+x, pdesuv+x, &dummy);            }        }        pdesy += bpldes;        pdesuv += bpldes;    }}void __gfx_osi_g2d_resize_32_yuv420(BYTE *pdesy, BYTE *pdesuv, INT bpldes, INT nDesX, INT nDesY,                UINT uDesWidth, UINT uDesHeight, BYTE *psrc, INT bplsrc, INT nSrcX,  INT nSrcY, UINT uSrcWidth, UINT uSrcHeight){    int x, y, xp, yp, ypx;    int xx, yy, dx, dy;    BYTE *pp;    UINT32 p00, p01, p10, p11;    psrc = psrc + (nSrcX<<2) + nSrcY*bplsrc;    pdesy = pdesy + nDesX + nDesY*bpldes;    pdesuv = pdesuv + nDesX + (nDesY/2)*bpldes;    for(y=0; y<uDesHeight; y++)     {        yy = ((y*uSrcHeight)<<8)/uDesHeight;        yp = yy>>8;  dy = yy&0xff;        ypx = yp*bplsrc;        for(x=0; x<uDesWidth; x++)         {            xx = ((x*uSrcWidth)<<8)/uDesWidth;            xp = xx>>8; dx = xx&0xff;            pp = (psrc+(xp<<2)+ypx);            p00 = *(UINT32 *)pp;            if(xp+1 < uSrcWidth)            {                p10 = *(UINT32 *)(pp+4);                 if(yp+1 < uSrcHeight)                {                    p01 = *(UINT32 *)(pp+bplsrc);                    p11 = *(UINT32 *)(pp+bplsrc+4);                }                else                {                    p01 = p00;                    p11 = p10;                }            }            else            {                p10 = p00;                if(yp+1 < uSrcHeight)                {                    p01 = *(UINT32 *)(pp+bplsrc);                    p11 = p01;                }                else                {                    p01 = p00;                    p11 = p10;                }            }            {                BYTE r,g,b, dummy;                {                    BYTE p00r, p01r, p10r, p11r;                    p00r = (p00>>16)&0xff;                    p01r = (p01>>16)&0xff;                    p10r = (p10>>16)&0xff;                    p11r = (p11>>16)&0xff;                    r = (BYTE)(((p11r*dx+p01r*(256-dx))*dy + (p10r*dx+p00r*(256-dx))*(256-dy))>>16);                }                {                    BYTE p00g, p01g, p10g, p11g;                    p00g = (p00>> 8)&0xff;                    p01g = (p01>> 8)&0xff;                    p10g = (p10>> 8)&0xff;                    p11g = (p11>> 8)&0xff;                    g = (BYTE)(((p11g*dx+p01g*(256-dx))*dy + (p10g*dx+p00g*(256-dx))*(256-dy))>>16);                }                {                    BYTE p00b, p01b, p10b, p11b;                    p00b = (p00    )&0xff;                    p01b = (p01    )&0xff;                    p10b = (p10    )&0xff;                    p11b = (p11    )&0xff;                    b = (BYTE)(((p11b*dx+p01b*(256-dx))*dy + (p10b*dx+p00b*(256-dx))*(256-dy))>>16);                }                if((x+nDesX)&1) // v                    gfx_osi_rgb2ycbcr(r,g,b, pdesy+x, &dummy, pdesuv+x);                else                    gfx_osi_rgb2ycbcr(r,g,b, pdesy+x, pdesuv+x, &dummy);            }        }        pdesy += bpldes;        if(y&1) pdesuv += bpldes;    }}void __gfx_osi_g2d_resize_yuv422_32(BYTE *pdes, INT bpldes, INT nDesX, INT nDesY,                UINT uDesWidth, UINT uDesHeight, BYTE *psrcy, BYTE *psrcuv, INT bplsrc, INT nSrcX,  INT nSrcY, UINT uSrcWidth, UINT uSrcHeight, BYTE a){    int x, y, xp, yp, ypx;    int xx, yy, dx, dy;    BYTE *pp;    BYTE p00, p01, p10, p11;    BYTE lum, u, v;    psrcy = psrcy + nSrcX + nSrcY*bplsrc;    psrcuv = psrcuv + nSrcX + nSrcY*bplsrc;    pdes = pdes + (nDesX<<2) + nDesY*bpldes;    for(y=0; y<uDesHeight; y++)     {        yy = ((y*uSrcHeight)<<8)/uDesHeight;        yp = yy>>8;  dy = yy&0xff;        ypx = yp*bplsrc;        for(x=0; x<uDesWidth; x++)         {            xx = ((x*uSrcWidth)<<8)/uDesWidth;            xp = xx>>8; dx = xx&0xff;            pp = (psrcy+xp+ypx);            p00 = *pp;            if((xp+nSrcX)&1) // odd x            {                u = *(psrcuv+xp+ypx-1);                v = *(psrcuv+xp+ypx);            }            else            {                u = *(psrcuv+xp+ypx);                v = *(psrcuv+xp+ypx+1);            }            if(xp+1 < uSrcWidth)            {                p10 = *(pp+1);                 if(yp+1 < uSrcHeight)                {                    p01 = *(pp+bplsrc);                    p11 = *(pp+bplsrc+1);                }                else                {                    p01 = p00;                    p11 = p10;                }            }            else            {                p10 = p00;                if(yp+1 < uSrcHeight)                {                    p01 = *(pp+bplsrc);                    p11 = p01;                }                else                {                    p01 = p00;                    p11 = p10;                }            }            lum = (BYTE)(((p11*dx+p01*(256-dx))*dy + (p10*dx+p00*(256-dx))*(256-dy))>>16);            gfx_osi_ycbcr2rgb(lum, u, v, pdes+(x<<2)+1, pdes+(x<<2)+2, pdes+(x<<2)+3);            pdes[x<<2] = a;        }        pdes += bpldes;    }}void __gfx_osi_g2d_resize_yuv420_32(BYTE *pdes, INT bpldes, INT nDesX, INT nDesY,                UINT uDesWidth, UINT uDesHeight, BYTE *psrcy, BYTE *psrcuv, INT bplsrc, INT nSrcX,  INT nSrcY, UINT uSrcWidth, UINT uSrcHeight, BYTE a){    int x, y, xp, yp, ypx, ypx1;    int xx, yy, dx, dy;    BYTE *pp;    BYTE p00, p01, p10, p11;    BYTE lum, u, v;    psrcy = psrcy + nSrcX + nSrcY*bplsrc;    psrcuv = psrcuv + nSrcX;    pdes = pdes + (nDesX<<2) + nDesY*bpldes;    for(y=0; y<uDesHeight; y++)     {        yy = ((y*uSrcHeight)<<8)/uDesHeight;        yp = yy>>8;  dy = yy&0xff;        ypx = yp*bplsrc;        ypx1 = (yp + nSrcY)/2*bplsrc;        for(x=0; x<uDesWidth; x++)         {            xx = ((x*uSrcWidth)<<8)/uDesWidth;            xp = xx>>8; dx = xx&0xff;            pp = (psrcy+xp+ypx);            p00 = *pp;            if((xp+nSrcX)&1) // odd x            {                u = *(psrcuv+xp+ypx1-1);                v = *(psrcuv+xp+ypx1);            }            else            {                u = *(psrcuv+xp+ypx1);                v = *(psrcuv+xp+ypx1+1);            }            if(xp+1 < uSrcWidth)            {                p10 = *(pp+1);                 if(yp+1 < uSrcHeight)                {                    p01 = *(pp+bplsrc);                    p11 = *(pp+bplsrc+1);                }                else                {                    p01 = p00;                    p11 = p10;                }            }            else            {                p10 = p00;                if(yp+1 < uSrcHeight)                {                    p01 = *(pp+bplsrc);                    p11 = p01;                }                else                {                    p01 = p00;                    p11 = p10;                }            }            lum = (BYTE)(((p11*dx+p01*(256-dx))*dy + (p10*dx+p00*(256-dx))*(256-dy))>>16);            gfx_osi_ycbcr2rgb(lum, u, v, pdes+(x<<2)+1, pdes+(x<<2)+2, pdes+(x<<2)+3);            pdes[x<<2] = a;        }        pdes += bpldes;    }}

⌨️ 快捷键说明

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