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,不支持任意角度. 并且旋转的区域只能是正方形切片。

如果旋转矩形区域,需要切成正方形区域,然后再切。