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