DrawingArea:区域外的填充区域

时间:2018-05-11 00:35:48

标签: c++ c cairo gtkmm

关于如何绘制形状并用颜色填充它们(例如透明背景上的红色光盘)我遵循了this gtkmm tutorial。从这个例子中,我也能够在蓝色背景上得到另一个带红色光盘的例子。

然而,我真正需要的是一张透明光盘,背景为蓝色,填充所有减去光盘区域,这应保持透明。

因此,使用cairo,通常的工作流程是:

  1. 创建表面
  2. 绘制形状(例如画一个圆圈)
  3. 填充圆圈,使其成为光盘。
  4. 我需要一些能够实现这样的工作流程:

    1. 创建表面
    2. 绘制形状(例如画一个圆圈)
    3. 在圆圈外面填充区域,这样我的背景就会有一个带有透明“洞”的彩色背景。
    4. 我已在网上对此进行了一些研究,但所有例子似乎都假设我们想要填充形状的内部区域(我必须承认它更典型)。

      我怎么能这样做?

      P.S。我添加了C标签,因为我不介意你喜欢使用C(甚至是Python)。

1 个答案:

答案 0 :(得分:2)

绘制圆圈并绘制一个包含所有可见区域的矩形。将cairo填充规则设置为偶数/奇数。填。完成。

cairo_save(cr); // Save the state
cairo_arc(cr, 42, 42, 21, 0, 2*M_PI); // Draw circle
cairo_rectangle(cr, 0, 0, width, height); // Rectangle containing everything
cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
cairo_fill(cr);
cairo_restore(cr); // Restore default fill rule (optional; pairs with save above)