绘制复杂的图形
LCUI 实现了一些图形 API 用于解决组件的背景、边框和阴影的绘制问题。它们都依赖绘制上下文且都支持局部区域绘制,使得 LCUI 能够利用脏矩形机制和 OpenMP 并行渲染来提升渲染性能。
绘制背景
背景绘制参数被定义为LCUI_Background
结构体类型的对象,由 Background_Paint()
函数负责绘制。在下 面的例子中,我们将画布中的区域 (200, 100, 400, 30)
作为背景区域,由于我们要让背景区域被完整绘制出来,所以又将该区域作为绘制区域。需要注意的是,背景区域和绘制都共用同一个原点,只有这两个区域相重叠部分才会被绘制出来。
#include <LCUI.h>
#include <LCUI/graph.h>
#include <LCUI/image.h>
#include <LCUI/painter.h>
int main(void)
{
LCUI_Graph canvas;
LCUI_Color gray = RGB(240, 240, 240);
LCUI_Color green = RGB(102, 204, 0);
LCUI_Rect rect = { 200, 100, 400, 300 };
LCUI_Background bg = { 0 };
LCUI_PaintContext paint;
Graph_Init(&canvas);
Graph_Create(&canvas, 800, 600);
Graph_FillRect(&canvas, gray, NULL, FALSE);
// 设置背景色
bg.color = green;
// 创建绘制上下文
paint = LCUIPainter_Begin(&canvas, &rect);
// 绘制背景
Background_Paint(&bg, &rect, paint);
LCUI_WritePNGFile("test_paint_background_color.png", &canvas);
LCUIPainter_End(paint);
Graph_Free(&canvas);
return 0;
}
运行结果:
使用背景图
如果只是填充颜色的话,直接用 Graph_FillRect()
会更简单些,Background_Paint()
的核心功能是对背景图的处理,填充背景色只是它在绘制背景图前的一项准备工作。接下来我们通过加载背景图然后设置背景参数中的 image
和 size
成员变量来将背景图绘制到背景区域内:
#include <LCUI.h>
#include <LCUI/graph.h>
#include <LCUI/image.h>
#include <LCUI/painter.h>
int main(void)
{
LCUI_Graph canvas;
LCUI_Graph image;
LCUI_Color gray = RGB(240, 240, 240);
LCUI_Color green = RGB(102, 204, 0);
LCUI_Rect rect = { 200, 100, 400, 300 };
LCUI_Background bg = { 0 };
LCUI_PaintContext paint;
Graph_Init(&canvas);
Graph_Init(&image);
Graph_Create(&canvas, 800, 600);
Graph_FillRect(&canvas, gray, NULL, FALSE);
// 读取背景图片
if (LCUI_ReadImageFile("test_image_reader.png", &image) != 0) {
return -1;
}
// 设置背景色
bg.color = green;
// 设置背景图
bg.image = ℑ
bg.size.width = image.width;
bg.size.height = image.height;
// 创建绘制上下文
paint = LCUIPainter_Begin(&canvas, &rect);
// 绘制背景
Background_Paint(&bg, &rect, paint);
LCUI_WritePNGFile("test_paint_background_image.png", &canvas);
LCUIPainter_End(paint);
Graph_Free(&image);
Graph_Free(&canvas);
return 0;
}
运行结果: