GFX Q&A
Q1:Gfx bitblit的dst xy坐标超过源图宽高时会失败
客户想要做图像数据搬移,用到gfx的bitblit函数,目标区域会申请一块较大画布,然后搬移到DstRect区域。
stSrc.eColorFmt = E_MI_GFX_FMT_RGB565; stSrc.u32Width = srcWidth; stSrc.u32Height = srcHeight; stSrc.u32Stride = stSrc.u32Width * 2; stSrc.phyAddr = stSrcPhy; stSrcRect.s32Xpos = 0; stSrcRect.s32Ypos = 0; stSrcRect.u32Width = stSrc.u32Width; stSrcRect.u32Height = stSrc.u32Height; //set blit alpha MI_GFX_Opt_t pstOpt; pstOpt.eSrcDfbBldOp = E_MI_GFX_DFB_BLD_ONE; pstOpt.eDstDfbBldOp = E_MI_GFX_DFB_BLD_ZERO; pstOpt.stClipRect.s32Xpos = 0; pstOpt.stClipRect.s32Ypos = 0; pstOpt.stClipRect.u32Width = stSrc.u32Width; pstOpt.stClipRect.u32Height = stSrc.u32Height; stDst.eColorFmt = E_MI_GFX_FMT_ARGB1555; stDst.u32Width = vinfo.xres; stDst.u32Height = vinfo.yres; stDst.u32Stride = stDst.u32Width * 2; stDst.phyAddr = finfo.smem_start; stDstRect.s32Xpos = stSrc.u32Width+1; //这里只要比src宽高大就会报错 stDstRect.s32Ypos = stSrc.u32Height; stDstRect.u32Width = dstWidth; stDstRect.u32Height = dstHeight;
这里是因为对clip参数理解有误,原以为clip是会在src区域crop一块内存;实际上clip是设置本次GFX操作目标区域的生效区域,区域外的不处理,所以clip和dst必须要有交集。
以上面demo为例,假如srcWidth=320,srcHeight=240,vinfo.xres=1024,vinfo.yres=768,dstWidth=640,dstHeight=360,则demo效果如下图所示:

clip和dstRect根本没有重合区域,所以BitBlit没有生效区域,从而导致失败。
修改如下就正常了,相当于clip区域和dstRect区域完全重合,所以BitBlit的区域都会生效;当然也可以不设置clip参数,默认clip区域即是等于目标区域。
pstOpt.stClipRect.s32Xpos = stSrc.u32Width+1; pstOpt.stClipRect.s32Ypos = stSrc.u32Height; pstOpt.stClipRect.u32Width = dstWidth; pstOpt.stClipRect.u32Height = dstHeight;
Q2:Gfx将ARGB8888转到ARGB1555格式,怎样强制输出alpha为1?
调用接口MI_S32 MI_GFX_GetARGB8888To1555AlphaThreshold(MI_GFX_DEV GfxDevId, MI_U8 *pu8ThresholdValue)
*pu8ThresholdValue代表ARGB8888数据的alpha阈值,范围0~255。
小于阈值,则转换后的ARGB1555数据 BIT(15)=0,否则BIT(15)=1。
所以如果要强制输出alpha为1,设置*pu8ThresholdValue=0即可。
Q3: GFX允许任意角度旋转吗?
GFX并不是支持任意角度的rotate的,只支持顺时针90/180/270,不支持任意角度. 并且旋转的区域只能是正方形切片。
如果旋转矩形区域,需要切成正方形区域,然后再切。