如何使用 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 中无法做到这一点。您基本上有两个选择:
- 强制 特定尺寸。您可以使用
withImageSurface
设置最大宽度和高度,并在生成的表面上进行所有绘图。任何超出范围的东西都会被扔在地板上。
- 计算大小。在渲染时,记下您执行的每个绘图操作的范围,并在进行时将它们组合起来。使您的渲染操作 return 调用方的组合范围。
diagrams
包选择了后者。
在开罗,你会使用录音界面。
- 创建一个记录表面。
- 将您的对象渲染到记录表面
- 调用 cairo_recording_surface_ink_extents() 获取边界框。
我正在使用 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 中无法做到这一点。您基本上有两个选择:
- 强制 特定尺寸。您可以使用
withImageSurface
设置最大宽度和高度,并在生成的表面上进行所有绘图。任何超出范围的东西都会被扔在地板上。 - 计算大小。在渲染时,记下您执行的每个绘图操作的范围,并在进行时将它们组合起来。使您的渲染操作 return 调用方的组合范围。
diagrams
包选择了后者。
在开罗,你会使用录音界面。
- 创建一个记录表面。
- 将您的对象渲染到记录表面
- 调用 cairo_recording_surface_ink_extents() 获取边界框。