DrawingArea:区域外的填充区域

DrawingArea: fill area outside a region

我已遵循 this gtkmm tutorial 如何绘制形状并用颜色填充它们(例如,透明背景上的红色圆盘)。从这个例子中,我还能够导出另一个蓝底红盘的例子。

但是,我真正需要的是一个蓝色背景的透明光盘,可以填充所有内容减去光盘区域,它应该保持透明。

所以对于 cairo,通常的工作流程是:

  1. 创建表面
  2. 画一个形状(例如画一个圆)
  3. 把圆填满,变成圆盘。

我需要一些工作流来实现这样的事情:

  1. 创建表面
  2. 画一个形状(例如画一个圆)
  3. 填充圆圈外的区域,这样我就有了中间有透明"hole"的彩色背景。

我在网上对此做了一些研究,但所有示例似乎都假设我们想要填充形状的内部区域(我必须承认这更典型)。

我该怎么做?

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

恕我直言,'Draw outside the circle' 的功能对于图形框架来说很复杂。如果你画的不止一个圆圈外填充也可能会产生歧义。

因为后来绘制的图形放置'on'以前绘制的图形。所需要的是在绘制其他形状之前绘制一个矩形以填充整个图形上下文。在某些框架中,这被定义为 clear with the background color

工作流程如下:
1. 创建曲面。
2.用圆圈外的颜色绘制背景。
3. 绘制用特定颜色填充的圆圈,例如白.
结果,圆圈将覆盖背景。

如果非要先画圆,请搜索Flood Fill Algorithm,它是用来画图的。然而,在屏幕上绘制时,实现屏幕像素和播放此类算法是不必要且昂贵的。


我发现 Example Application: Creating a Clock with Cairo 在您提供的本书的后面部分。 这似乎有帮助。

画出你的圆并画出一个包含所有可见区域的矩形。将 cairo 填充规则设置为 even/odd。充满。完成。

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)