首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gi-cairo和cairo图书馆有什么区别?

gi-cairo和cairo图书馆有什么区别?
EN

Stack Overflow用户
提问于 2022-04-22 21:33:08
回答 1查看 152关注 0票数 1

我制作了一个程序,在用Haskell编写的GTK程序的基础上绘制一些矢量图形。

我将我的程序升级到gi-gtk库,以取代Gtk2Hs,以受益于Gtk3;当我看到关于如何使用cairo和/或图解在Gtk窗口中绘图的教程/示例时,同时需要gi-开罗开罗 (来自Gtk2Hs)。

举个例子,我可以看到:

代码语言:javascript
复制
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 是否仍在更新,还是使用另一个库是个好主意?

有关这两个库的任何信息/解释都将是有用的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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版本中,runRenderrunRender内部函数在Cairo上下文中被使用。如果您查看调用这些函数的代码,您可能会看到它使用指针执行一些不安全的操作,以在GI.Cairo.Context类型和Graphics.Rendering.Cairo.Types.Cairo上下文类型之间强制执行,这两个类型都指向遮罩下的相同内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71974861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档