📄 gfx_osi_engine.c
字号:
} 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 + -