В чем разница между библиотеками gi-cairo и cairo

Я делаю программу для рисования векторной графики поверх программы GTK, написанной на Haskell.

Я обновил свою программу до библиотеки ги-гтк вместо Gtk2H в пользу Gtk3, и когда я вижу учебник/пример о рисовании в окнах Gtk с помощью 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 (Ги-Каир) и Graphics.Rendering.Cairo (Каир) нужно импортировать одновременно.

GI.Cairo стремится заменить Graphics.Rendering.Cairo или дополнить его?

Graphics.Rendering.Cairo все еще обновляется или лучше использовать другую библиотеку?

Любая информация/объяснения об этих двух библиотеках будет полезна.

Я не знаю gi-cairo ситуации. Но Gtk2Hs прекрасно поддерживает gtk3 (через пакет gtk3 Haskell).

Daniel Wagner 23.04.2022 03:25

@ДэниелВагнер. Я не видел, чтобы было две версии gtk2hs : libghc-gtk-dev и libghc-gtk3-dev. Благодарю вас !

JeanJouX 23.04.2022 17:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TL;DR: считает все, что основано на GTK2HS, устаревшим. Вместо этого используйте вещи с префиксом gi-.

Изначально были Библиотеки GTK2HS, которые представляли собой вручную написанную привязку к GTK (думаю, не уверен в деталях).

Частью этих усилий была привязка к Каирская библиотека. Все функции Cairo принимают объект контекста Cairo в качестве аргумента, который используется для переноса состояния, такого как текущий цвет и стиль линии. Связывание Haskell оборачивает это, используя монаду Reader внутри нового типа Render, поэтому вам не нужно беспокоиться об объекте контекста.

Однако поддержание этого было медленным и мандраульным, и был очевидный лучший способ: GTK имеет встроенную поддержку других языковых привязок, предоставляемых метаданными, встроенными в исходный код. Таким образом, вполне возможно автоматически сгенерировать все привязки GTK, а также распространить это на другие библиотеки, использующие систему метаданных GTK. Это то, что делают gi-gtk и его родственники.

К сожалению, Каир так не работает. Он не включает метаданные GTK для фактического API рисования, поэтому gi-cairo интерфейс ни для чего не нужен.

Некоторое время единственным способом обойти это было ручное устранение разрыва между семейством gi-gtk и библиотекой GTK2HS Cairo, но больше нет. Теперь есть полное решение:

  • Библиотека gi-cairo-render, которая по сути такая же, как старая библиотека GTK2HS, но использует версию объекта контекста gi-cairo.

  • Связанная библиотека gi-cairo-connector, которая позволяет переключаться между функциями, требующими явного объекта контекста Cairo, и функциями, работающими в Render монаде.

Вам чаще всего нужен явный контекст Cairo для рисования текста с помощью Pango. В библиотеке Pango есть свой собственный объект Context (как ни странно, оба типа называются Context, и вы должны импортировать их квалифицированными для устранения неоднозначности). Вы получаете контекст Pango из контекста Cairo, используя createContext, и чтобы сделать это в середине действия Render, вы должны извлечь текущий контекст из монады Render, используя одну из функций Соединитель.

Код, который вы цитируете, использует старый ручной бодж; внутренние функции Render и runRender используются для доступа к контексту Cairo в версии привязки Cairo для GTK2HS. Если вы посмотрите на код, который вызывает эти функции, вы, вероятно, увидите, что он делает что-то небезопасное с указателями для принуждения между типом GI.Cairo.Context и типом контекста Graphics.Rendering.Cairo.Types.Cairo, которые оба указывают на одно и то же под капотом.

Другие вопросы по теме