В чем разница между библиотеками 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
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
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, которые оба указывают на одно и то же под капотом.

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