如何使用 cairo 检索对象的边界框

How to retrieve the bounding box of an object with cairo

我正在使用 Haskell cairo 绑定绘图,我想垂直对齐一些对象。为此,我需要知道这些对象的宽度(边界框或部分宽度)。

我试图通过这个技巧得到它:

(origx,origy) <- getCurrentPoint -- Get the origins coordinates
setSourceRGBA 0 0 0 0            -- Make the rest of the rendering transparent
renderMyObject                   -- Rendering the object
(endx,endy) <- getCurrentPoint   -- Get the final coordinates
let width = endx - origx         -- Get the width of the object
...
translate width 0                -- Positioning according to width 
setSourceRGB 1 0 0               -- Give the final color
renderMyObject                   -- Rendering the object

此方法的问题是,如果我在对象的渲染中进行颜色更改,并且宽度的计算不适用于所有对象,它就无法工作。

cairo 有没有办法在工作表面或虚拟表面上进行“幻影”渲染并检索 object/surface 的宽度和高度?

注意:我知道 diagrams 库允许这样做,但出于兼容性原因,我不能将它用于此项目。但是如果你知道图书馆是怎么做的,我很感兴趣。

cairo 中无法做到这一点。您基本上有两个选择:

  1. 强制 特定尺寸。您可以使用 withImageSurface 设置最大宽度和高度,并在生成的表面上进行所有绘图。任何超出范围的东西都会被扔在地板上。
  2. 计算大小。在渲染时,记下您执行的每个绘图操作的范围,并在进行时将它们组合起来。使您的渲染操作 return 调用方的组合范围。

diagrams 包选择了后者。

在开罗,你会使用录音界面。

  1. 创建一个记录表面。
  2. 将您的对象渲染到记录表面
  3. 调用 cairo_recording_surface_ink_extents() 获取边界框。