对2D引擎的绘图表面封装

在实际项目中,尤其对嵌入式项目一旦涉及到GUI,大家或许会直接采用LVGL、Qt以及其他可以支持项目的2D引擎进行设计和开发。但在很多情况下,LVGL和Qt等开发工具并不适合项目开展。主要原因包括:团队技术对该开发环境熟悉的程度、开发环境和客户具体的实际需求、代码灵活性以及自主程度的高低等因素决定。由于本次项目并不是专门定制一款特殊的软件产品交付给客户,而是一款可以具备二次开发能力且可以自由选择渲染引擎的2D开发组件。因此,在面对封装严密的LVGL和Qt明显不太合适。同时,客户要求需要重新设计显示逻辑,如果采用LVGL或Qt将会付出更多且更大的工作量。并严格要求上层逻辑代码(包括使用的库)尽量和下层进行分离,仅能通过调用方式完成接口设计,而不能在上层逻辑中显示地使用第三方库或头文件的痕迹。因此,通过项目组分析,应该设计一组作为中间转换的引擎,通过动态库的方式,提供给上层应用。

对于2D引擎绘图表面,通过对当前众多2D引擎进行了全面且细致的分析后,基本可以发现所有2D引擎绘图表面应该具备的基本信息和特征,主要包括:

1、表面的格式,应该至少支持256色、16真彩、24真彩和32真彩;

2、表面的长、宽以及每行像素计算和保存;

3、表面数据的存储地址;

4、和其他2D绘图表面的转换等;

根据以上分析,项目小组进行了初步构建:

以上结构体看着比较简单,但全面考虑了透明度、透明色、敏感度,裁剪、以及映射到屏幕上的明暗度等。结构体中的matrix对应的就是表面的内存,也就是绘图区域。其中的from标记,表示内存区域是自生成还是来源于外部空间。这个值决定了在释放空间时的基本动作,如果from为1,表示该内存不应由改表面函数进行释放管理。为了更好的为后续提供绘制函数提供支撑,提供了rect矩形功能支持、颜色支持、格式支持以及点和尺寸的支持。提供的功能主要包括:

为了配合项目能顺利完成任务,在我们提供的封装中还提供了两个对cairo和SDL表面的互转函数:

cairo和surface互转:

SDL和surface互转:

但注意的是,在互转中没有考虑alpha、colorkey、cliprect这几个参数的传递和转移问题,需要根据项目需求进行定制和添加,以满足自定义项目的实际需要。

在使用上述提供的转换函数时,需要安装cairo和SDL库(SDL1和SDL2)都可以,直接使用gcc编译器进行编译即可(可编译到项目中,也可以编译成动态库,根据实际需要)。具体定义和实现,可以参考:https://download.csdn.net/download/kingoverliu/89646578

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值