如果文本重叠,开罗测试

时间:2009-10-19 18:44:26

标签: drawing cairo

使用Cairo,我会在随机位置放置一些文字,我需要知道它们是否与先前绘制的任意形状重叠。我可以剪切到前面图纸的路径,如果发生任何剪裁,则意味着存在重叠。但是,开罗似乎没有任何功能来判断是否确实发生了剪辑。

有没有办法轻松完成我想要的东西?我想我只是想知道两个形状是否相交。

4 个答案:

答案 0 :(得分:3)

根据您希望获得的质量,您可以使用cairo_stroke_extentscairo_fill_extentscairo_text_extents来处理边界框。

更好的方法是仅计算文本的边界框,并使用cairo_in_fillcairo_in_stroke检查最后一条路径的四个角。最大误差是从单个字形的形状到其边界框的距离,但这可能足以达到您的目的。

最后一个选项是展平文本并检查上一步中的任何一个点。

答案 1 :(得分:2)

我什么也没看到 - 至少,没什么简单的 - 如果没有什么我也不会感到惊讶。 Cairo的目标是光栅化矢量绘图操作,而不是交叉测试。

但是,如果我要查看两段文字是否重叠,这就是我要做的事情:

  1. 选择一个适合我的开罗后端 测试环境 - 例如Xlib等 - 并使用我的屏幕外表面 可以用来做一个像素的像素 分析
  2. 以100%alpha格式绘制纯蓝色的第一段文字。
  3. 以50%alpha的纯红色绘制第二段文字。
  4. 扫描表面以查找红色和蓝色均为非零的像素。
  5. 它相当蛮力,但它甚至可以应对抗锯齿。我之前用XK上的GTK做了类似的事情(出于不同的目的),间接使用了Cairo。

    如果您不想这样做,并且Cairo不提供API,您可以添加一个。那可能很难;在此之前你可能想和Carl Worth谈谈。

答案 2 :(得分:1)

我通过使用Qt代替渲染来解决问题。它似乎对不同的路径操作有相当广泛的支持,并支持PDF和SVG输出。

答案 3 :(得分:0)

我有一个几乎相同的情况,我认为有办法做到这一点。

我的问题是找出文本边界框是否与表面上绘制的一组复杂线条(可能是平滑的)相交。这是目前的瓶颈,快速交叉处理可以将sw加速100倍。谁知道呢。

无论如何,多亏了ntd提到的cairo_in_stroke,我开始扭转这个问题。事情就是这样。

cairo_in_stroke本身只告诉

  

“给定点是否在内部   受a影响的区域   给出了cairo_stroke()操作   当前路径和描边参数“

这很没用。除非我们将线宽暂时放得太宽以至于路径开始增加区域。

  1. 将线宽设置为边界框高度的一半(让我们称之为X)
  2. 测试位置X,2X,......从两侧进入边界框,直到它们在中心相遇
  3. 测试区域不是精确的边界框,而是重叠的圆形重叠链。如果您想要安全起见,添加线宽将确保永远不会触及边界框。

    我会报告我是否有这种方法来实际操作(以及它变得多快)。