📄 gfx_osi.c
字号:
INT gfx_osi_bitBLT(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY, UINT uWidth, UINT uHeight, GFX_SURFACE_T *pSrc, INT nSrcX, INT nSrcY, ALPHA_SELECT *pAlphaSelect, char enableGammaCorrection){ INT rtn = 0; if(!gfx_osi_pSurface_valid(pSrc) || !gfx_osi_pSurface_valid(pDes) || !IS_SURFACE_G2D_COMP(pSrc->uPlaneConfig) || !IS_SURFACE_G2D_COMP(pDes->uPlaneConfig)) { PDEBUG("invalid surface!\n"); return -1; } gfx_osi_pixelJustify(pSrc->plane[0].uPixelJustify, (UINT *)&nSrcX, &uWidth); gfx_osi_pixelJustify(pDes->plane[0].uPixelJustify, (UINT *)&nDesX, &uWidth); 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(pSrc->uPlaneConfig) == G2D_CLUT1) { GFX_PALETTE_T yuvpal[2]; 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_bitblt_1_8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, 1, 0); break; case G2D_AYCBCR422: if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_bitblt_1_8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal[1].a, pPal[0].a); // a else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pAlphaSelect->globalAlphaValue); // a case G2D_YCBCR422: __gfx_osi_g2d_bitblt_1_8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal[1].r, pPal[0].r); // y __gfx_osi_g2d_bitblt_1_uv(pDes->plane[1].pBuffer, pDes->plane[1].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, ((UINT)pPal[1].g<<8) | pPal[1].b, ((UINT)pPal[0].g<<8) | pPal[0].b); // uv break; case G2D_AYCBCR420: if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_bitblt_1_8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal[1].a, pPal[0].a); // a else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pAlphaSelect->globalAlphaValue); // a case G2D_YCBCR420: __gfx_osi_g2d_bitblt_1_8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal[1].r, pPal[0].r); // y __gfx_osi_g2d_bitblt_1_uv(pDes->plane[1].pBuffer, pDes->plane[1].uBytePerLine, nDesX, nDesY/2, uWidth, uHeight/2, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine*2, nSrcX, nSrcY/2, ((UINT)pPal[1].g<<8) | pPal[1].b, ((UINT)pPal[0].g<<8) | pPal[0].b); // uv break; case G2D_ARGB_8888: __gfx_osi_g2d_bitblt_1_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, *(UINT32 *)&pPal[1], *(UINT32 *)&pPal[0]); default: rtn = -1; break; } } else 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_bitblt8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); break; case G2D_AYCBCR422: if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_bitblt_clut_8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal, 0); // a else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pAlphaSelect->globalAlphaValue); // a case G2D_YCBCR422: __gfx_osi_g2d_bitblt_clut_8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal, 1); // y __gfx_osi_g2d_bitblt_clut_uv(pDes->plane[1].pBuffer, pDes->plane[1].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal); // uv break; case G2D_AYCBCR420: if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_bitblt_clut_8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal, 0); // a else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pAlphaSelect->globalAlphaValue); // a case G2D_YCBCR420: __gfx_osi_g2d_bitblt_clut_8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal, 1); // y __gfx_osi_g2d_bitblt_clut_uv(pDes->plane[1].pBuffer, pDes->plane[1].uBytePerLine, nDesX, nDesY/2, uWidth, uHeight/2, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine*2, nSrcX, nSrcY/2, pPal); // uv break; case G2D_ARGB_8888: __gfx_osi_g2d_bitblt_clut_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY, pPal); // y break; default: rtn = -1; break; } } else if(IS_GFX_SURFACE_CLUT(pDes->uPlaneConfig)) { rtn = -1; } else // we all are direct color modes { 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 __gfx_osi_g2d_bitblt8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); // uv __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer, pDes->plane[1].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, nSrcX, nSrcY); break; case G2D_YCBCR420: // src is 420 case G2D_AYCBCR420: // we should expand to 422 // y first __gfx_osi_g2d_bitblt8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); // uv // even lines __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer, pDes->plane[1].uBytePerLine*2, nDesX, nDesY/2, uWidth, uHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, nSrcX, nSrcY/2); // odd lines __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer, pDes->plane[1].uBytePerLine*2, nDesX + pDes->plane[1].uBytePerLine, nDesY/2, uWidth, uHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, nSrcX, nSrcY/2); break; case G2D_ARGB_8888: // src is argb8888 __gfx_osi_g2d_bitblt_32_yuv422(pDes->plane[0].pBuffer, pDes->plane[1].pBuffer, pDes->plane[2].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); 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 __gfx_osi_g2d_bitblt8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); // uv __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer, pDes->plane[1].uBytePerLine, nDesX, nDesY/2, uWidth, uHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine*2, nSrcX, nSrcY/2); break; case G2D_YCBCR420: // src is 420 case G2D_AYCBCR420: // y first __gfx_osi_g2d_bitblt8(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); // uv __gfx_osi_g2d_bitblt8(pDes->plane[1].pBuffer, pDes->plane[1].uBytePerLine, nDesX, nDesY/2, uWidth, uHeight/2, pSrc->plane[1].pBuffer, pSrc->plane[1].uBytePerLine, nSrcX, nSrcY/2); break; case G2D_ARGB_8888: // src is argb8888 __gfx_osi_g2d_bitblt_32_yuv420(pDes->plane[0].pBuffer, pDes->plane[1].pBuffer, pDes->plane[2].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); default: rtn = -1; } break; case G2D_ARGB_8888: // des is rgb 8888 switch(GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig)) { case G2D_YCBCR422: // src is 422 case G2D_AYCBCR422: // we need drop odd lines __gfx_osi_g2d_bitblt_yuv422_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[1].pBuffer, pSrc->plane[2].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); break; case G2D_YCBCR420: // src is 420 case G2D_AYCBCR420: __gfx_osi_g2d_bitblt_yuv420_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[1].pBuffer, pSrc->plane[2].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); break; case G2D_ARGB_8888: // src is argb8888 __gfx_osi_g2d_bitblt_32(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[0].pBuffer, pSrc->plane[0].uBytePerLine, nSrcX, nSrcY); break; default: rtn = -1; } break; default: rtn = -1; } // a for yuv colors switch(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig)) { case G2D_AYCBCR422: // dest has alpha case G2D_AYCBCR420: switch(GET_GFX_SURFACE_DATA_TYPE(pSrc->uPlaneConfig)) { case G2D_YCBCR422: // src has no alpha case G2D_YCBCR420: if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, 255); // a else if(pAlphaSelect && GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pAlphaSelect->globalAlphaValue); // a break; case G2D_AYCBCR422: // src has alpha case G2D_AYCBCR420: if(!pAlphaSelect || GFX_DEST_ALPHA_FROM_SOURCE == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_bitblt8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pSrc->plane[2].pBuffer, pSrc->plane[2].uBytePerLine, nSrcX, nSrcY); else if(GFX_DEST_ALPHA_FROM_GIVEN == pAlphaSelect->storedAlphaSelect) __gfx_osi_g2d_fillblt8(pDes->plane[2].pBuffer, pDes->plane[2].uBytePerLine, nDesX, nDesY, uWidth, uHeight, pAlphaSelect->globalAlphaValue); // a break; } break; default: // no alpha at all break; } } } return rtn;}INT gfx_osi_advancedBitBLT(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY, UINT uWidth, UINT uHeight, GFX_SURFACE_T *pSrc, INT nSrcX, INT nSrcY, GFX_SURFACE_T *pMask, INT nMaskX, INT nMaskY, GFX_ROP_CODE_T ROP, char enablePixelBitMask, UINT32 uPixelBitMask, ALPHA_SELECT *pAlphaSelect){ INT rtn, xadj, yadj; if(!gfx_osi_pSurface_valid(pSrc) || !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(pSrc->plane[0].uPixelJustify, (UINT *)&nSrcX, &uWidth); gfx_osi_pixelJustify(pDes->plane[0].uPixelJustify, (UINT *)&nDesX, &uWidth); 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 } // 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(pMask) { UINT uMaskWidth, uMaskHeight; INT nx, ny; uMaskWidth = uWidth; uMaskHeight = uHeight; nMaskX += xadj; nMaskY += yadj; nx = nMaskX; ny = nMaskY; // check for pattern area if(gfx_osi_ClipExtRect(&pMask->bound, &nMaskX, &nMaskY, &uMaskWidth, &uMaskHeight)) { PDEBUG("No overlapping mask rect is found!\n"); return -1; } else if(uMaskWidth < uWidth || uMaskHeight < uHeight) { uWidth = uMaskWidth; uHeight = uMaskHeight; nx = nMaskX - nx; ny = nMaskY - ny; nSrcX += nx; nDesX += nx; nSrcY += ny; nDesY += ny; } } rtn = -1; return rtn;}INT gfx_osi_fillBLT(GFX_SURFACE_T *pDes, INT nDesX, INT nDesY, UINT uWidth, UINT uHeight, UINT32 uFillColor){ INT rtn = 0; if(!gfx_osi_pSurface_valid(pDes)) { PDEBUG("invalid surface!\n"); return -1; } gfx_osi_pixelJustify(pDes->plane[0].uPixelJustify, (UINT *)&nDesX, &uWidth); if(gfx_osi_ClipExtRect(&pDes->clip, &nDesX, &nDesY, &uWidth, &uHeight)) { PDEBUG("No in-clip rect is found!\n"); return 0; // that's it } if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_CLUT1) { PDEBUG("CLUT1\n"); __gfx_osi_g2d_fillblt1(pDes->plane[0].pBuffer, pDes->plane[0].uBytePerLine, nDesX, nDesY, uWidth, uHeight, uFillColor); } else if(GET_GFX_SURFACE_DATA_TYPE(pDes->uPlaneConfig) == G2D_CLUT8)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -