OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 13:46

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Cairo binding [Component Pascal]
СообщениеДобавлено: Среда, 27 Январь, 2010 16:33 

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

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


Вложения:
Cairo(cp).zip [18.05 КБ]
Скачиваний: 532
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Среда, 27 Январь, 2010 17:31 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Роман М. писал(а):
Жду конструктивной критики.
Префиксы cairo_ избыточны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Среда, 27 Январь, 2010 18:18 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Можно посмотреть подсистему Ogl c CPC. Там описан принцип именования и трансляции сишных типов. Может быть полезным.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Четверг, 28 Январь, 2010 13:44 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Как тогда быть с документацией? Если я изменю названия, то они будут отличаться от именований в соответствие с официальной документацией Cairo.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Четверг, 28 Январь, 2010 14:55 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Я за сохранение точного наименования функций, как во внешней библиотеке. И так путаницы в этих библиотеках хватает. Кроме того, напрямую их лучше не использовать, всё равно какую-то развязку надо писать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Четверг, 28 Январь, 2010 14:58 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
С некоторыми библиотеками бывает похлеще: функция оказывается на самом деле сишным макросом к другой функции. Причём таких макросов с разными названиями к одной функции с разными параметрами может быть с десяток...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Четверг, 28 Январь, 2010 15:27 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Роман М. писал(а):
Как тогда быть с документацией? Если я изменю названия, то они будут отличаться от именований в соответствие с официальной документацией Cairo.
Вот Вы в своей документации для "Cairo binding [Component Pascal]" и укажете как отличаются.

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

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


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

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Пятница, 29 Январь, 2010 21:23 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Димыч писал(а):
Так лучше делать в модуле-обвязке, который уже ближе к КП.
В интерфейсном надо оставлять так, как в оригинале.
Чтобы без путаницы.
Если пользоваться обвязкой. Которая единственнаяя использует интерф-й. Правильно Вас понял?

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


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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Четверг, 23 Июнь, 2011 05:13 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Роман М. писал(а):
Также работаю над созданием OO-обёртки над Cairo API, черновой вариант доступен на страничке http://romiras.gotdns.org/doku/cairo/oocairo

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Четверг, 23 Июнь, 2011 10:42 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Прошу прощения за поздний ответ.
Иван Денисов писал(а):
Возник только такой вопрос. У меня 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. Я давненько уже не занимался ею.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Среда, 30 Май, 2012 19:59 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Еще раз проверил все в Wine. Прекрасно работает. Тогда не все библиотеки установил оказывается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Воскресенье, 03 Июнь, 2012 17:46 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
На выходных занялся доработкой подсистемы 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 КБ]
Скачиваний: 503

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

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


Последний раз редактировалось Роман М. Воскресенье, 03 Июнь, 2012 22:46, всего редактировалось 1 раз.

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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Отлично! Для запуска из 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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Воскресенье, 03 Июнь, 2012 20:38 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Иван Денисов писал(а):
Отлично! Для запуска из 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 кто будет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Понедельник, 04 Июнь, 2012 01:19 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Простой пример для вывода примитива на поверхность 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 лучше отделить в отдельную тему.


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Согласен, вопросы нового HostPorts предлагаю обсуждать тут viewtopic.php?f=23&t=3980


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cairo binding [Component Pascal]
СообщениеДобавлено: Четверг, 27 Март, 2014 16:52 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Модули с обвязкой к библиотеке Cairo для Компонентного Паскаля можно найти в BitBucket: Library bindings

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


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Благодаря наличию привязки, которую сделал Роман, удалось сделать генератор дипломов для олимпиады школьников.

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

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

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


Вложения:
Комментарий к файлу: Пример кода для создания такого диплома
PdfGenExample.txt [373.58 КБ]
Скачиваний: 835
Комментарий к файлу: скриншот демонстрационного диплома
Безымянный.png
Безымянный.png [ 59 КБ | Просмотров: 16155 ]
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB