You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Cairo创建由多个矩形组成的裁剪区域?

如何用Cairo创建多矩形裁剪区域

首先明确:你不能直接通过创建cairo_rectangle_list_t来设置裁剪区域。这个类型和cairo_copy_clip_rectangle_list()函数的作用是获取当前裁剪区域的矩形近似表示,而非用来定义裁剪区域——Cairo的裁剪系统基于路径操作,不直接接收矩形列表作为输入。

要创建由多个(甚至重叠)矩形组成的裁剪区域,正确做法是逐个将矩形添加到当前路径,再通过裁剪操作合并它们:

具体操作步骤

  • 调用cairo_save()保存当前状态(可选但推荐,方便后续恢复裁剪区域)
  • 用cairo_new_path()清空当前路径(避免残留路径干扰)
  • 逐个调用cairo_rectangle()添加需要的裁剪矩形(每个矩形对应一次调用)
  • 调用cairo_clip():该函数会将当前路径与现有裁剪区域取交集,由于所有矩形都在同一个路径中,最终裁剪区域就是这些矩形的并集
  • 若后续还要添加更多裁剪矩形,可使用cairo_clip_preserve(),它会保留当前路径,方便继续操作

代码示例

#include <cairo.h>

int main() {
    cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 400, 400);
    cairo_t *cr = cairo_create(surface);

    // 保存初始绘图状态
    cairo_save();

    // 构建包含两个重叠矩形的路径
    cairo_new_path();
    cairo_rectangle(cr, 50, 50, 200, 200);  // 第一个矩形
    cairo_rectangle(cr, 150, 150, 200, 200); // 第二个重叠矩形
    cairo_clip(); // 应用裁剪,最终裁剪区域为两个矩形的并集

    // 绘制测试内容(仅裁剪区域内的部分会显示)
    cairo_set_source_rgb(cr, 1, 0, 0);
    cairo_paint(cr);

    // 恢复初始状态,取消裁剪
    cairo_restore();

    // 保存结果到图片
    cairo_surface_write_to_png(surface, "multi_rect_clip.png");

    // 清理资源
    cairo_destroy(cr);
    cairo_surface_destroy(surface);
    return 0;
}

补充说明

  • 若需要多个矩形的交集而非并集,可先添加第一个矩形并调用cairo_clip(),再添加第二个矩形再次调用cairo_clip()——每次clip操作都会和现有裁剪区域取交集。
  • cairo_copy_clip_rectangle_list()返回的矩形列表是Cairo对当前裁剪区域的轴对齐矩形近似,主要用于绘制优化,而非设置裁剪区域。

内容的提问来源于stack exchange,提问作者Carlo Wood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:23:23