OberonCore
https://forum.oberoncore.ru/

Cairo binding [Component Pascal]
https://forum.oberoncore.ru/viewtopic.php?f=47&t=2289
Страница 1 из 2

Автор:  Роман М. [ Среда, 27 Январь, 2010 16:33 ]
Заголовок сообщения:  Cairo binding [Component Pascal]

Создал интерфейсный модуль для библиотеки двумерной графики Cairo.
В прикреплённом файле находятся интерфейсный модуль CairoApi и примеры программ.
Также работаю над созданием OO-обёртки над Cairo API, черновой вариант доступен на страничке http://romiras.gotdns.org/doku/cairo/oocairo

Жду конструктивной критики.

Вложения:
Cairo(cp).zip [18.05 КБ]
Скачиваний: 532

Автор:  Info21 [ Среда, 27 Январь, 2010 17:31 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Роман М. писал(а):
Жду конструктивной критики.
Префиксы cairo_ избыточны.

Автор:  Евгений Темиргалеев [ Среда, 27 Январь, 2010 18:18 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Можно посмотреть подсистему Ogl c CPC. Там описан принцип именования и трансляции сишных типов. Может быть полезным.

Префиксы там убраны у всего кроме макросов GL_... Если не ошибаюсь, в противном случае местами получались КП-е ключевые слова.

Автор:  Роман М. [ Четверг, 28 Январь, 2010 13:44 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Как тогда быть с документацией? Если я изменю названия, то они будут отличаться от именований в соответствие с официальной документацией Cairo.

Автор:  Борис Рюмшин [ Четверг, 28 Январь, 2010 14:55 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Я за сохранение точного наименования функций, как во внешней библиотеке. И так путаницы в этих библиотеках хватает. Кроме того, напрямую их лучше не использовать, всё равно какую-то развязку надо писать...

Автор:  Борис Рюмшин [ Четверг, 28 Январь, 2010 14:58 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

С некоторыми библиотеками бывает похлеще: функция оказывается на самом деле сишным макросом к другой функции. Причём таких макросов с разными названиями к одной функции с разными параметрами может быть с десяток...

Автор:  Евгений Темиргалеев [ Четверг, 28 Январь, 2010 15:27 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Роман М. писал(а):
Как тогда быть с документацией? Если я изменю названия, то они будут отличаться от именований в соответствие с официальной документацией Cairo.
Вот Вы в своей документации для "Cairo binding [Component Pascal]" и укажете как отличаются.

Вместо cario_xxx пишем Cario.xxx при импорте под псевдонимом.

P.S. Префиксы cario_ из-за отстуствия модулей в Си. В КП, как info21 уже говорил, избыточно.

Автор:  Димыч [ Пятница, 29 Январь, 2010 20:24 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Евгений Темиргалеев писал(а):
Роман М. писал(а):
Как тогда быть с документацией? Если я изменю названия, то они будут отличаться от именований в соответствие с официальной документацией Cairo.
Вот Вы в своей документации для "Cairo binding [Component Pascal]" и укажете как отличаются.

Вместо cario_xxx пишем Cario.xxx при импорте под псевдонимом.

P.S. Префиксы cario_ из-за отстуствия модулей в Си. В КП, как info21 уже говорил, избыточно.

Так лучше делать в модуле-обвязке, который уже ближе к КП.
В интерфейсном надо оставлять так, как в оригинале.
Чтобы без путаницы.

Автор:  Евгений Темиргалеев [ Пятница, 29 Январь, 2010 21:23 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Димыч писал(а):
Так лучше делать в модуле-обвязке, который уже ближе к КП.
В интерфейсном надо оставлять так, как в оригинале.
Чтобы без путаницы.
Если пользоваться обвязкой. Которая единственнаяя использует интерф-й. Правильно Вас понял?

Но если в таких модулях нет потребности -- оставлять с избыточностью? Говорю на примере Ogl и OglGlut. Там вроде не возникало...

Автор:  Иван Денисов [ Среда, 22 Июнь, 2011 19:06 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Роман, спасибо за привязку! Сегодня сгенерировал первый документ PDF с помощью нее.
Надеюсь сделать экспорт для своего графикопостроителя с помощью Cairo :)

Возник только такой вопрос. У меня libcairo-2.dll не грузится в BB1.6 из под Wine. Проверял с помощью вашего модуля TestLibLoad. В винде такая проблема была? В итоге запускал libcairo.so через Lin версию загрузчика.

Автор:  Александр Ильин [ Четверг, 23 Июнь, 2011 05:13 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Роман М. писал(а):
Также работаю над созданием OO-обёртки над Cairo API, черновой вариант доступен на страничке http://romiras.gotdns.org/doku/cairo/oocairo

Жду конструктивной критики.
404 No such domain

Автор:  Роман М. [ Четверг, 23 Июнь, 2011 10:42 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Прошу прощения за поздний ответ.
Иван Денисов писал(а):
Возник только такой вопрос. У меня libcairo-2.dll не грузится в BB1.6 из под Wine. Проверял с помощью вашего модуля TestLibLoad. В винде такая проблема была? В итоге запускал libcairo.so через Lin версию загрузчика.
У меня такой проблемы в Windows не возникало, а в Linux не проверял, насколько помню. Но я не помню какую версию я использовал и как она была именована. Могу позже дома взглянуть.

Александр Ильин писал(а):
Роман М. писал(а):
Также работаю над созданием OO-обёртки над Cairo API, черновой вариант доступен на страничке http://romiras.gotdns.org/doku/cairo/oocairo

Жду конструктивной критики.
404 No such domain

На данный момент страница теперь находится здесь: OOCairo.
Из-за того, что срок доменного имени на gotdns.org истёк, пришлось переводить ресурс на другой домен (dyndns.org) того же регистратора (а это произошло более полугода назад). Это мой домашний веб-сервер.

Однако самая последняя версия ОО-обёртки находится в хранилище SVN в OberonRevival: bbox-components. Я давненько уже не занимался ею.

Автор:  Иван Денисов [ Среда, 30 Май, 2012 19:59 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Еще раз проверил все в Wine. Прекрасно работает. Тогда не все библиотеки установил оказывается.

Автор:  Роман М. [ Воскресенье, 03 Июнь, 2012 17:46 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

На выходных занялся доработкой подсистемы Cairo для Блэкбокса. Хочу выпустить её под номером 1.2.

На основе класса CairoModels.Base строятся классы
CairoModels.Context (носитель)
CairoModels.Path (управляющий объект)
CairoModels.Surface (DocumentSurface, MemBufSurface, DrawableSurface)
CairoModels.Pattern (GradientPattern).

Суть сводится к попытке упрощения работы с библиотекой Cairo за счёт скрытия за ОО слоем с применением шаблона проектирования Carrier-Rider-Mapper.
После многих изменений не исключены какие-то неверные описания интерфейсов исходного API Cairo, поэтому просьба сообщать о таковых.
Имеются несколько примеров работы с ОО-обвязкой и без, с помощью native API.

Предварительно, выкладываю бета версию для ознакомления.
Вложение:
CairoBB-1.2b.zip [43.67 КБ]
Скачиваний: 505

Вложение:
Cairo1.6-Win32.zip [858.13 КБ]
Скачиваний: 513
(эти библиотеки необходимы для запуска)

Обновил набор необходимых библиотек в файле Cairo1.6-Win32.zip. Версии Cairo свыше 1.6.4 требуют более новых версий зависимостей, что ведёт к к увеличению размера развёртывания программы. Проверено в Windows XP + Wine/Linux.

Автор:  Иван Денисов [ Воскресенье, 03 Июнь, 2012 19:07 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Отлично! Для запуска из Wine получается только вот с таким пакетом библиотек.
Вложение:
cairoLibs.7z [978.01 КБ]
Скачиваний: 516


Все работает, но вот следующий вопрос возник.
Как рисовать Cairo в окне BB?

Пытался разобраться сам, но самое лучшее до чего додумался вот, но не рисует :(
Код:
PROCEDURE (rd: Rider) DrawOval* (l, t, r, b, s: INTEGER; col: Ports.Color);
      VAR
         res, h: INTEGER; p: Port; dc, oldb, oldp: WinApi.HANDLE; pt: WinApi.POINT; rect: WinApi.RECT;
         surface: CairoApi.Pcairo_surface_t;
          cr: CairoApi.Pcairo_t;
         res2: WinApi.BOOL;
   BEGIN
      ASSERT(rd.port # NIL, 100);
      p := rd.port; dc := p.dc;
      IF p.wnd = 0 THEN res := WinApi.SaveDC(dc)
      ELSE res := WinApi.SelectClipRgn(dc, 0);
      END;      
      res := WinApi.IntersectClipRect(dc, rd.l, rd.t, rd.r, rd.b);
      IF col = Ports.defaultColor THEN col := textCol END;
         
      dc := WinApi.BeginPaint(p.wnd, NIL);
      surface := CairoApi.cairo_win32_surface_create(dc);
      cr := CairoApi.cairo_create(surface);
      CairoApi.cairo_set_source_rgb (cr, 0, 0, 1);
      CairoApi.cairo_arc(cr, 10, 10, 20 / 4.0, 0.0, 2.0 * 3.14);
      CairoApi.cairo_destroy(cr);
      res2 := WinApi.EndPaint(p.wnd, NIL);
      
   END DrawOval;

Автор:  Роман М. [ Воскресенье, 03 Июнь, 2012 20:38 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Иван Денисов писал(а):
Отлично! Для запуска из Wine получается только вот с таким пакетом библиотек.
Вложение:
cairoLibs.7z


Все работает, но вот следующий вопрос возник.
Как рисовать Cairo в окне BB?

Пытался разобраться сам, но самое лучшее до чего додумался вот, но не рисует :(
Код:
PROCEDURE (rd: Rider) DrawOval* (l, t, r, b, s: INTEGER; col: Ports.Color);
      VAR
         res, h: INTEGER; p: Port; dc, oldb, oldp: WinApi.HANDLE; pt: WinApi.POINT; rect: WinApi.RECT;
         surface: CairoApi.Pcairo_surface_t;
          cr: CairoApi.Pcairo_t;
         res2: WinApi.BOOL;
   BEGIN
      ASSERT(rd.port # NIL, 100);
      p := rd.port; dc := p.dc;
      IF p.wnd = 0 THEN res := WinApi.SaveDC(dc)
      ELSE res := WinApi.SelectClipRgn(dc, 0);
      END;      
      res := WinApi.IntersectClipRect(dc, rd.l, rd.t, rd.r, rd.b);
      IF col = Ports.defaultColor THEN col := textCol END;
         
      dc := WinApi.BeginPaint(p.wnd, NIL);
      surface := CairoApi.cairo_win32_surface_create(dc);
      cr := CairoApi.cairo_create(surface);
      CairoApi.cairo_set_source_rgb (cr, 0, 0, 1);
      CairoApi.cairo_arc(cr, 10, 10, 20 / 4.0, 0.0, 2.0 * 3.14);
      CairoApi.cairo_destroy(cr);
      res2 := WinApi.EndPaint(p.wnd, NIL);
      
   END DrawOval;

Почти правильно. Как насчет операции отрисовки абриса на контекст, cairo_stroke? И заканчивать работу с surface кто будет?

Автор:  Роман М. [ Понедельник, 04 Июнь, 2012 01:19 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Простой пример для вывода примитива на поверхность GDI с Cairo на основе примера из справки ЧЯ:
Код:
MODULE PrivCairoWin32;
(* testing GDI output of Cairo library*)

   IMPORT S := SYSTEM, WinApi, C := LibsCairo, Cwin := LibsCairoWin32;

   CONST
      iconId = 1;

   VAR
      instance: WinApi.HINSTANCE;
      mainWnd: WinApi.HWND;

   PROCEDURE DrawObject (hdc: WinApi.HDC);
      CONST pi = 3.14159265;
      VAR ctx: C.cairo_t; surface: C.cairo_surface_t;
   BEGIN
      surface := Cwin.cairo_win32_surface_create(hdc);
      ctx := C.cairo_create(surface);
      C.cairo_set_source_rgb (ctx, 0, 0, 1);
      C.cairo_arc(ctx, 500, 300, 200.0, 0.0, 2.0 * pi);
      C.cairo_stroke(ctx);
      C.cairo_destroy(ctx);
      C.cairo_surface_destroy(surface);
   END DrawObject;
   
   PROCEDURE WndHandler (wnd, msg, wParam, lParam: INTEGER): INTEGER;
      VAR res: INTEGER; ps: WinApi.PAINTSTRUCT; dc: WinApi.HDC;
   BEGIN
      IF msg = WinApi.WM_DESTROY THEN
         WinApi.PostQuitMessage(0)
      ELSIF msg = WinApi.WM_PAINT THEN
         dc := WinApi.BeginPaint(wnd, ps);
         DrawObject (dc);
         res := WinApi.EndPaint(wnd, ps)
      ELSIF msg = WinApi.WM_CHAR THEN
         res := WinApi.Beep(800, 200)
      ELSE
         RETURN WinApi.DefWindowProc(wnd, msg, wParam, lParam)
      END;
      RETURN 0
   END WndHandler;

   PROCEDURE OpenWindow;
      VAR class: WinApi.WNDCLASS; res: INTEGER;
   BEGIN
      class.hCursor := WinApi.LoadCursor(0, S.VAL(WinApi.PtrSTR,
                                                         WinApi.IDC_ARROW));
      class.hIcon := WinApi.LoadIcon(instance, S.VAL(WinApi.PtrSTR, iconId));
      class.lpszMenuName := NIL;
      class.lpszClassName := "Simple";
      class.hbrBackground := WinApi.GetStockObject(WinApi.WHITE_BRUSH);
      class.style := WinApi.CS_VREDRAW + WinApi.CS_HREDRAW
                  (* + WinApi.CS_OWNDC + WinApi.CS_PARENTDC *);
      class.hInstance := instance;
      class.lpfnWndProc := WndHandler;
      class.cbClsExtra := 0;
      class.cbWndExtra := 0;
      res := WinApi.RegisterClass(class);
      mainWnd := WinApi.CreateWindowEx({}, "Simple", "Cairo GDI output demo",
                                          WinApi.WS_OVERLAPPEDWINDOW,
                                          WinApi.CW_USEDEFAULT, WinApi.CW_USEDEFAULT,
                                          WinApi.CW_USEDEFAULT, WinApi.CW_USEDEFAULT,
                                          0, 0, instance, 0);
      res := WinApi.ShowWindow(mainWnd, WinApi.SW_SHOWDEFAULT);
      res := WinApi.UpdateWindow(mainWnd);
   END OpenWindow;

   PROCEDURE MainLoop;
      VAR msg: WinApi.MSG; res: INTEGER;
   BEGIN
      WHILE WinApi.GetMessage(msg, 0, 0, 0) # 0 DO
         res := WinApi.TranslateMessage(msg);
         res := WinApi.DispatchMessage(msg);
      END;
      WinApi.ExitProcess(msg.wParam)
   END MainLoop;

BEGIN
   instance := WinApi.GetModuleHandle(NIL);
   OpenWindow;
   MainLoop
END PrivCairoWin32.

:!: DevLinker.LinkExe cairo2gdi.exe := PrivCairoWin32 ~

Вопрос про переписывание HostPorts с использованием сторонних библиотек типа Cairo лучше отделить в отдельную тему.

Автор:  Иван Денисов [ Понедельник, 04 Июнь, 2012 15:11 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Согласен, вопросы нового HostPorts предлагаю обсуждать тут viewtopic.php?f=23&t=3980

Автор:  Роман М. [ Четверг, 27 Март, 2014 16:52 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Модули с обвязкой к библиотеке Cairo для Компонентного Паскаля можно найти в BitBucket: Library bindings

На этой обвязке основана подсистема Cairo для BlackBox: Oberon-F-components/Cairo (GitHub)

Автор:  Иван Денисов [ Суббота, 24 Май, 2014 17:05 ]
Заголовок сообщения:  Re: Cairo binding [Component Pascal]

Благодаря наличию привязки, которую сделал Роман, удалось сделать генератор дипломов для олимпиады школьников.

На входе - документ Excel с данными об участниках и победителях, а на выходе - несколько сотен документов PDF.

Если у кого-то возникнет аналогичная задача, выкладываю пример кода. Для удобства размещения элементов, сделал обертку процедур рисования, которым можно передавать координаты из редактора Inkscape.

Для того, чтобы все работало, нужно наличие подсистем Ctl и Cairo, на компьютере должен быть установлен Excel. Для запуска демонстрационного модуля в системе должны быть шрифты KursivC и HeliosExtLightC.

Вложения:
Комментарий к файлу: Пример кода для создания такого диплома
PdfGenExample.txt [373.58 КБ]
Скачиваний: 835
Комментарий к файлу: скриншот демонстрационного диплома
Безымянный.png
Безымянный.png [ 59 КБ | Просмотров: 16231 ]

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/