我制作了一个程序,在用Haskell编写的GTK程序的基础上绘制一些矢量图形。
我将我的程序升级到gi-gtk库,以取代Gtk2Hs,以受益于Gtk3;当我看到关于如何使用cairo和/或图解在Gtk窗口中绘图的教程/示例时,同时需要gi-开罗和开罗 (来自Gtk2Hs)。
举个例子,我可以看到:
import GI.Gtk
import qualified GI.Cairo (Context(..))
import qualified Graphics.Rendering.Cairo as Cairo
import qualified Graphics.Rendering.Cairo.Internal as Cairo (Render(runRender))
import qualified Graphics.Rendering.Cairo.Types as Cairo (Cairo(Cairo))我不明白为什么GI.Cairo (gi-开罗)和Graphics.Rendering.Cairo (开罗)必须同时导入。
GI.Cairo 的目标是取代 Graphics.Rendering.Cairo 还是完成 ??
Graphics.Rendering.Cairo 是否仍在更新,还是使用另一个库是个好主意?
有关这两个库的任何信息/解释都将是有用的
发布于 2022-04-24 13:32:17
TL;DR:认为基于GTK2HS的任何东西都是不推荐的。用gi-前缀代替。
最初有GTK2HS库,它是一个手工编写的绑定到GTK (我想,不确定的细节)。
这项工作的一部分是绑定到开罗图书馆。Cairo函数都使用一个Cairo上下文对象作为参数,该参数用于携带状态,如当前的颜色和线条样式。Haskell绑定在Render新类型中使用Reader包装这一点,因此不必担心上下文对象。
但是,维护这一点很慢,而且很难理解,而且还有一种明显的更好的方法: GTK内置了对源代码中嵌入的元数据提供的其他语言绑定的支持。因此,完全可以自动生成所有GTK绑定,并将其扩展到使用GTK元数据系统的其他库。这就是gi-gtk及其亲属所做的。
不幸的是,开罗不是那样工作的。它不包括实际绘图API的GTK元数据,因此接口没有任何用处。
在过去的一段时间里,唯一的解决办法是手动搭建一个用来弥合gtk家族和GTK2HS Cairo库之间的差距的工具,但现在不再是这样了。现在有一个完整的解决方案:
gi-cairo-render库,本质上与旧的GTK2HS库相同,但使用的是上下文对象的gi-cairo版本。gi-cairo-connector库使您可以在需要显式Cairo上下文对象的函数和在Render monad中工作的函数之间切换。使用Pango绘制文本通常需要一个明确的Cairo上下文。Pango库有自己的上下文对象(令人困惑的是,这两种类型都称为Context,您必须导入它们,限定它们以消除歧义)。您可以使用createContext从Cairo上下文中获取Pango上下文,要在Render操作中这样做,必须使用连接器函数之一从呈现monad中提取当前上下文。
您引用的代码使用的是旧的手动工具;在Cairo绑定的Render版本中,runRender和runRender内部函数在Cairo上下文中被使用。如果您查看调用这些函数的代码,您可能会看到它使用指针执行一些不安全的操作,以在GI.Cairo.Context类型和Graphics.Rendering.Cairo.Types.Cairo上下文类型之间强制执行,这两个类型都指向遮罩下的相同内容。
https://stackoverflow.com/questions/71974861
复制相似问题