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