我制作了一個程式,在用 Haskell 撰寫的 GTK 程式之上繪制一些矢量圖形。
我將我的程式升級到gi-gtk庫以替換 Gtk2Hs 以受益于 Gtk3,當我看到有關使用 cairo 和/或圖表在 Gtk 視窗中繪圖的教程/示例時,需要gi-cairo和cairo(來自 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-cairo ) 和Graphics.Rendering.Cairo( cairo )。
GI.Cairo目標是替換Graphics.Rendering.Cairo還是完成?
仍在Graphics.Rendering.Cairo更新還是使用另一個庫是個好主意?
關于這兩個庫的任何資訊/解釋都會有所幫助
uj5u.com熱心網友回復:
TL;DR:將基于 GTK2HS 的任何內容視為已棄用。改用帶有gi-前綴的東西。
最初有GTK2HS 庫,它是手動撰寫的與 GTK 的系結(我認為,不確定細節)。
這項作業的一部分是系結到Cairo 庫。Cairo 函式都以 Cairo 背景關系物件作為引數,用于攜帶當前顏色和線條樣式等狀態。Haskell 系結使用新型別中的 Reader monad 將其包裝起來,Render因此您不必擔心背景關系物件。
然而,維護它是緩慢而繁瑣的,并且有一個明顯更好的方法:GTK 內置了對源代碼中嵌入的元資料提供的其他語言系結的支持。因此,完全可以自動生成所有 GTK 系結,并將其擴展到使用 GTK 元資料系統的其他庫。這就是gi-gtk它及其親屬所做的。
不幸的是,開羅不是那樣作業的。它不包含實際繪圖 API 的 GTK 元資料,因此該gi-cairo介面沒有任何用處。
有一段時間,解決這個問題的唯一方法是手動安裝,以彌合 gi-gtk 家族和 GTK2HS Cairo 庫之間的差距,但現在不再如此。現在有一個完整的解決方案:
該
gi-cairo-render庫與舊的 GTK2HS 庫基本相同,但使用的是 gi-cairo 版本的背景關系物件。關聯的庫允許您在需要顯式 Cairo 背景關系物件的函式和在monad
gi-cairo-connector中作業的函式之間切換。Render
你通常需要一個明確的 Cairo 背景關系來使用 Pango 繪制文本。Pango 庫有自己的 Context 物件(令人困惑的是,這兩種型別都被呼叫Context并且您必須匯入它們以消除歧義)。您可以使用從 Cairo 背景關系中獲取 Pango 背景關系createContext,并且要在操作中間執行此操作,您必須使用連接器函式Render之一從 Render monad 中提取當前背景關系。
您參考的代碼使用的是舊的手動邊框;在 GTK2HS 版本的 Cairo 系結中, theRender和runRenderinternal 函式用于獲取 Cairo 背景關系。GI.Cairo.Context如果您查看呼叫這些函式的代碼,您可能會看到它在使用指向型別和背景關系型別之間強制轉換的指標做一些不安全的事情Graphics.Rendering.Cairo.Types.Cairo,這兩者都指向同一事物。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/465877.html
