Cairo

Cairo
Логотип программы Cairo
Тип графическая библиотека[вд] и библиотека функций
Разработчики Кит Паккард, Карл Ворт[вд], Behdad Esfahbod[вд][2] и Chris Wilson[d]
Написана на Си[3]
Операционные системы GNU/Linux, Windows, macOS и Unix-подобная операционная система
Последняя версия
Репозиторий gitlab.freedesktop.org/c…
Лицензия Mozilla Public License 1.1[вд][4] и LGPL-2.1[вд][4]
Сайт cairographics.org (англ.)
Логотип Викисклада Медиафайлы на Викискладе

Cairo — программная библиотека для отрисовки векторной графики с открытым исходным кодом. Включает в себя аппаратно-независимый прикладной программный интерфейс для разработчиков программного обеспечения. Cairo предоставляет графические примитивы для отрисовки двумерных изображений посредством разнообразных бекендов. Когда есть возможность, Cairo использует аппаратное ускорение.

Существует официальное предложение по стандартизации в языке C++ прикладного программного интерфейса отрисовки двумерной графики на основе библиотеки Cairo[5].

Программная архитектура

Привязки к языкам

Любая библиотека, написанная на одном языке программирования, может использоваться и на другом, если реализовано т. н. связывание языков программирования[англ.] этой библиотеки к новому языку. Cairo имеет широкий диапазон привязок к разным языкам программирования: C++, C# и другим языкам, отвечающим требованиям стандарта CLI. Также есть привязки Cairo к языкам Delphi, Factor, Haskell, Lua, Perl, PHP, Python, Ruby, Scheme, Smalltalk и другим[6].

Привязки к инструментам

Поскольку Cairo является лишь библиотекой для отрисовки, она способна принести ощутимую пользу при интеграции с инструментами построения графических пользовательских интерфейсов:

  • FLTK имеет полноценную поддержку Cairo (при компиляции FLTK необходимо указать опцию «--enable-cairo»).
  • GNUstep использует Cairo в качестве основного бекенда на не Windows-системах[7].
  • GTK+ полностью поддерживает Cairo. Начиная с 2005 года с версии 2.8, GTK+ использует Cairo для отрисовки большинства графических управляющих элементов. Начиная с версии 3.0 GTK+ все элементы рисует через Cairo.
  • Cairo способна напрямую обращаться к библиотеке SDL[8].

Доступные бекенды

Cairo оперирует с абстракцией surface (поверхность). Поверхность — это то, на чём рисует Cairo. За этой поверхностью могут скрываться разнообразные бекенды, которые могут передавать результат работы Cairo в X Window System, Xlib и XCB, Win32 GDI, OS X Quartz Compositor, BeOS, OS/2, контексты OpenGL (напрямую[9] и через glitz), локальный буфер изображений, PNG-файлы, PDF, PostScript, DirectFB и SVG-файлы.

Существуют и другие бекенды, представляющие собой графический прикладной программный интерфейс: OpenVG[10], Qt[11], Skia[англ.][12], и Direct2D[13].

Модель отрисовки

Модель отрисовки Cairo

Модель отрисовки Cairo включает в себя три этапа:

  1. Сначала создаётся маска, которая состоит из векторных примитивов или форм. Например, круги, квадраты, кривые Безье, TrueType шрифты и т. д.
  2. Затем должен быть определён так называемый источник, который может быть цветом, цветовым градиентом, битовой картой или векторным изображением. Далее из окрашенных частей источника производится вырезание посредством заданной маски.
  3. Затем результат передаётся на поверхность, которую подхватывает соответствующий бекенд.

Такая модель отрисовки фундаментально отличается от подхода к построению изображений, принятому в SVG.

Пример

SVG-изображение, сгенерированное указанным примером

Довольно сложный графический вариант популярного «Привет, мир!» может быть реализован с помощью Cairo, к примеру, следующим образом:

#include <cairo-svg.h>

int main(int argc, char **argv) {

    cairo_t *cr;
    cairo_surface_t *surface;
    cairo_pattern_t *pattern;
    int x,y;

    surface = (cairo_surface_t *)cairo_svg_surface_create("Cairo_example.svg", 110.0, 110.0);
    cr = cairo_create(surface);

    /* Рисуем квадратики на заднем фоне */
    for (x=0; x<10; x++)
       for (y=0; y<10; y++)
           cairo_rectangle(cr, x*10.0, y*10.0, 5, 5);

    pattern = cairo_pattern_create_radial(50, 50, 5, 50, 50, 50);
    cairo_pattern_add_color_stop_rgb(pattern, 0, 0.75, 0.15, 0.99);
    cairo_pattern_add_color_stop_rgb(pattern, 0.9, 1, 1, 1);

    cairo_set_source(cr, pattern);
    cairo_fill(cr);

    /* Отрисовка переднего фона */
    cairo_set_font_size (cr, 15);
    cairo_select_font_face (cr, "Georgia", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    cairo_set_source_rgb (cr, 0, 0, 0);

    cairo_move_to(cr, 10, 25);
    cairo_show_text(cr, "Привет,");

    cairo_move_to(cr, 10, 55);
    cairo_show_text(cr, "Википедия!");

    cairo_destroy (cr);
    cairo_surface_destroy (surface);
    return 0;
}

Использование

Cairo популярен в сообществе opensource, так как обеспечивает переносимость и качественную отрисовку двумерных изображений.

  • GTK+ полностью поддерживает Cairo. Начиная с 2005 года с версии 2.8, GTK+ использует Cairo для отрисовки большинства графических управляющих элементов. Начиная с версии 3.0 GTK+ вообще всё рисует через Cairo.
  • Проект Mono[14], включая Moonlight[15], использует Cairo.
  • Проект Mozilla задействует Cairo в браузерном движке Gecko[16]. В Firefox 52 от него отошли в пользу Direct2D (Windows 10) и Skia (более низкие), но он всё ещё поддерживается, если переключиться на него через расширенные настройки. Начиная с Firefox 66 поддержка удалена полностью[17].
  • Фреймворк WebKit использует Cairo для рендеринга в GTK+ и EFL-порты. Cairo-поддержка также добавлена для рендеринга SVG-графики и для содержимого тега <canvas>.
  • Библиотека Poppler использует Cairo для ренедера PDF-документов. Cairo используется для построения сглаженных векторных графиков и прозрачных объектов.
  • Векторный графический редактор Inkscape использует Cairo.
  • Операционная система MorphOS 2.5 использует Cairo.
  • Операционная система AmigaOS 4.1 поддерживает разделяемую объектную библиотеку Cairo (libcairo.so) в инсталляции по умолчанию.
  • Редактор шрифтов FontForge по умолчанию использует Cairo с середины октября 2008 года.
  • Язык программирования R способен выводить графику в PDF, PostScript и SVG форматы используя Cairo.
  • Gnuplot 4.4 используется Cairo для рендеринга в PDF и PNG[18].
  • Веб-обозреватель PlayStation 3 использует Cairo, начиная с системного обновления версии 4.10.
  • Synfig 0.64 теперь опционально поддерживает рендеринг изображений через Cairo.
  • Программа мониторинга и визуализации производительности компьютерной системы Graphite[англ.] способна рендерить графики через Cairo.
  • Платформа 1С:Предприятие 8.3 начиная с версии 8.3.16 использует Cairo для отрисовки[19].

История

Кит Паккард и Карл Ворт основали проект Cairo для использования в среде X Window System[20]. Вначале (по крайней мере до 2003 года) проект назывался Xr или Xr/Xc. Название было изменено с той целью, чтобы подчеркнуть идею переносимости библиотеки с возможностью доступа к произвольному серверу дисплея[англ.], не привязанному только лишь к X Window System[21].

Имя Cairo произошло от оригинального имени Xr, интерпретируемого буквами греческого алфавита χ and ρ[22].

См. также

  • Display PostScript[англ.]
  • Skia Graphics Engine[англ.]
  • Starling Framework[англ.]
  • WebGL

Примечания

  1. cairo-1.18.0 — 2023.
  2. https://gitlab.freedesktop.org/cairo/cairo/-/graphs/master
  3. The cairo Open Source Project on Open Hub: Languages Page — 2006.
  4. 1 2 https://web.archive.org/web/20180224092509/https://www.cairographics.org/
  5. Michael B. McLaughlin; Herb Sutter, Jason Zink.: A Proposal to Add 2D Graphics Rendering and Display to C++ Revision 2  (неопр.). Open Standards (3 июля 2014). Дата обращения: 12 сентября 2014. Архивировано 12 сентября 2014 года.
  6. Cairo Language Bindings  (неопр.). Дата обращения: 16 апреля 2014. Архивировано 17 мая 2011 года.
  7. Fedor, Adam User Defaults Summary for GNUstep Backend  (неопр.) (29 сентября 2011). Дата обращения: 3 ноября 2014. Архивировано 26 марта 2014 года.
  8. Cairo - SDL  (неопр.) (17 февраля 2009). Дата обращения: 3 ноября 2014. Архивировано 2 октября 2014 года.
  9. Chris Wilson. New OpenGL backend merged  (неопр.) (22 июля 2009). Дата обращения: 12 февраля 2010. Архивировано 24 июля 2011 года.
  10. Øyvind Kolås. Announcing OpenVG backend  (неопр.) (24 января 2008). Дата обращения: 12 февраля 2010. Архивировано 16 апреля 2009 года.
  11. Vladimir Vukićević. Well Isn’t That Qt  (неопр.) (6 мая 2008). Дата обращения: 12 февраля 2010. Архивировано из оригинала 9 апреля 2010 года.
  12. Chris Wilson. Cool Stuff  (неопр.) (31 августа 2009). Дата обращения: 12 февраля 2010. Архивировано 24 июля 2011 года.
  13. Bas Schouten. Direct2D: Hardware Rendering a Browser  (неопр.) (22 ноября 2009). Дата обращения: 12 февраля 2010. Архивировано 10 февраля 2010 года.
  14. Mono - Drawing  (неопр.). Дата обращения: 27 декабря 2009. Архивировано 2 января 2010 года.
  15. Moonlight Notes  (неопр.). Дата обращения: 27 декабря 2009. Архивировано 2 января 2010 года.
  16. Gecko 1.9 Roadmap  (неопр.). Дата обращения: 27 декабря 2009. Архивировано 25 июля 2008 года.
  17. Remove cairo D2D backend  (неопр.). Дата обращения: 9 января 2019. Архивировано 9 января 2019 года.
  18. Gnuplot version 4.4.0 announcement  (неопр.). Gnuplot homepage. Дата обращения: 22 февраля 2011. Архивировано из оригинала 14 мая 2011 года.
  19. V8Update  (неопр.). dl03.1c.ru. Дата обращения: 9 ноября 2019. Архивировано 9 ноября 2019 года.
  20. Xr: Cross-device Rendering for Vector Graphics  (неопр.). Дата обращения: 8 июня 2009. Архивировано 14 июня 2009 года.
  21. Mailing list thread about the Cairo name change  (неопр.). Дата обращения: 8 июня 2009. Архивировано 24 июля 2011 года.
  22. Mailing list thread about the cairo name change  (неопр.). Дата обращения: 2 декабря 2006. Архивировано 25 июня 2013 года.

Ссылки на внешние источники

  • Медиафайлы на Викискладе
  • cairographics.org — официальный сайт Cairo
  • Проект Cairo на сайте GitHub — CFFI-based Cairo bindings for Python
  • Cairo API reference manual  (неопр.).
  • Cairo here, there and everywhere  (неопр.). Linux.Ars. Ars Technica.
  • Cross-platform graphics with cairo  (неопр.).
  • Comparison of PHP image libraries  (неопр.).
  • The Cairo graphics tutorial  (неопр.).
Перейти к шаблону «Freedesktop.org»
Проекты на freedesktop.org
Компоненты
Библиотеки
Фреймворки
Встречи