Кроссплатформенная графика с использованием cairo

Библиотека векторной графики для обеспечения согласованного вывода изображений

Написанная с нуля для создания изображений, идентично отображающихся на мониторе и принтере, полностью кроссплатформенная библиотека cairo становится ведущим игроком в области графики на Linux®. Cairo управляет 2D-графикой GNOME, GTK+, Pango и многих других приложений.

Эли М Доу, инженер-программист, IBM

Эли М. Доу - инженер-программист IBM Test and Integration Center for Linux в Паукипси, штат Нью-Йорк, США. Он получил степень бакалавра в области информатики и психологии и степень магистра в области информатики в Университете Кларксона. Он окончил Институт открытого исходного кода Кларксона. В область его интересов лежат рабочий стол GNOME, взаимодействие человека с компьютером, виртуализация и программирование систем под Linux. Он является соавтором руководства IBM Linux для IBM System z9 и IBM zSeries.



14.02.2008

Преимущества использования cairo

Библиотека Cairo — это свободное программное обеспечение для работы с векторной графикой, поддерживающее множество выходных форматов. Cairo может использоваться на большом количестве платформ, таких как Linux, BSD, Microsoft® Windows® и OS X (также разрабатываются версии для BeOS и OS2). Вывод изображений в Linux может выполняться с помощью системы X Window, Quartz, в формате буфера изображения или в контексте OpenGL. Кроме того, cairo позволяет формировать графическое изображение в PostScript или PDF для высококачественной печати. В идеале пользователи cairo должны получать при печати изображения, практически идентичные изображениям на мониторе.

В этой статье рассказывается о том, что такое библиотека cairo и чем она может быть полезна при разработке приложений. Пример, приведенный в данной статье, создает изображение логотипа IBM в форматах pdf, ps, png, svg и в окне gtk.

При проектировании cairo существенное внимание уделялось тому, чтобы реализовать поддержку идентичного вывода настолько, насколько это вообще возможно. Такая согласованность вывода изображения очень хорошо подходит для программирования средств разработки графического интерфейса пользователя и разработки кроссплатформенных приложений. Возможность применения одной и той же библиотеки для печати изображения с экрана с высоким разрешением и рисования имеет очевидные преимущества.

Кроме того, на каждой поддерживаемой платформе cairo старается интеллектуально использовать аппаратное и программное обеспечение. Сочетание высококачественной векторной графики и высокой производительности делает cairo одной из наиболее эффективных современных графических систем для UNIX®.

Cairo написана на языке программирования C, но имеет привязки к большинству других распространенных языков. Возможности выбранного для разработки языка C способствуют созданию новых привязок, одновременно обеспечивая высокую производительность при запуске на родной платформе. Также заслуживает особого упоминания привязка к языку Python, которая делает возможным быстрое создание прототипов, а также снижает порог необходимых знаний для тех, кто изучает API рисования в cairo.

Сравнение векторного и растрового метода вывода изображений

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

Изображение, нарисованное при помощи растрового метода, теряет качество и четкость при увеличении. Часто изображения выглядят нечеткими или размытыми, подобно тому, как выглядит вблизи изображение на экране проектора или большого телевизора. На расстоянии изображение может выглядеть ясным, но при его приближении можно увидеть набор отдельных точек. Такая потеря качества неизбежна, поскольку никак нельзя определить, что именно должно находиться между заранее определенными пикселами.

Компьютерные системы и архитектуры рисования существуют уже давно, и cairo позаимствовала многое из ранних моделей PostScript и PDF. Cairo моделирует подход PostScript и Portable Document Format (PDF) в том, что все они используют математические выражения для создания изображений. Алгебраическое описание изображения позволяет в любое время воссоздать все изображение или его часть, вычислив математические выражения в необходимой области. Алгебраическое описание изображения выражается в терминах точек, кривых и прямых линий (в том числе векторов, что и дало название системам векторной графики).

Поскольку математическое выражение можно вычислять заново при перерисовке изображений или его частей, то не происходит потерь в разрешающей способности при увеличении, масштабировании или преобразовании изображений. Однако у векторного подхода есть и свои ограничения. Например, в некоторых случаях масштабирование векторного изображения при чрезвычайно большом (настолько большом, что большинству пользователей оно никогда не требуется) увеличении может вызвать появление артефактов. При большом увеличении некоторые линии могут быть нарисованы неверно из-за погрешностей в вычислениях. При уменьшении некоторые линии могут стать невидимыми или слаборазличимыми.

Дополнительным преимуществом векторной природы cairo является то, что векторные изображения, как правило, невелики по размеру. Это происходит потому, что относительно большое количество информации можно закодировать в относительно небольшом уравнении. Достоинство векторного изображения заключается и в относительной простоте. Бремя фактического преобразования точек, прямых и связанных с ними уравнений в целое изображение возложено на графическую библиотеку.

Уравнения, описывающие кривые векторных изображений, известны как Кривые Безье — линии, названные в честь математика Пьера Безье. Кривая Безье состоит по крайней мере из двух якорных точек и еще одной или более дополнительных точек между ними, называемых метками-манипуляторами. Перемещая метку-манипулятор, можно изменять форму кривой. Каждый, кто когда-либо пользовался программами Photoshop или GIMP, знает, о чем идет речь. Однако окончательный формат сохраненного рисунка при использовании этих программ может быть растровым! В зависимости от формата выходного файла в нем будет сохранена информация о контуре Безье или этот контур будет преобразован в растровое изображение и сохранен в растровом виде.

На момент написания этой статьи cairo имеет привязки к языкам программирования C++, Ruby, Perl, Java™, .Net/mono и другим. Разные привязки находятся на разных стадиях развития, подробнее об этом можно узнать на домашней странице проекта cairo (ссылка находится в разделе Ресурсы). На данный момент чаще и шире всего в сообществе свободного программного обеспечения используются привязки к Python и C++.

Как уже говорилось ранее, ряд графических инструментов предоставляет привязки, которые еще больше упрощают разработку на cairo. Версии Gtk+ после 2.8 полностью поддерживают cairo, при этом cairo была выбрана основной графической системой для поддержки будущими версиями GTK. Кроме того, начинается реализация поддержки cairo для вывода графики в таких графических инструментах, как GNUstep и FLTK.

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


Для чего нужна новая графическая модель?

Откровенно говоря, на мой взгляд, существующие системы с открытым исходным кодом обладают рядом существенных недостатков. Библиотека xprint, имея преимущества единого API экрана и печати, рассчитана, в основном, на запуск в виде отдельного серверного процесса и имеет плохой набор API. В libgnomeprint есть раздельные модели печати и создания изображений, но разделение API печати и создания изображений приводит к различиям в изображениях, выводимых на экран и на печать.

Разработчики библиотеки cairo учли опыт своих предшественников и с самого начала проектирования разрабатывали единый API.


Целевые форматы cairo

Cairo может предоставлять графику в следующих выходных форматах:

  • X Window System (с использованием расширения Render, если оно доступно)
  • OpenGL (с использованием glitz)
  • Изображения в оперативной памяти (пиксельные буферы и тому подобное)
  • PostScript (подходит для печати)
  • Файлы PDF (Portable Document Format)
  • SVG (масштабируемая векторная графика)

Не все выходные форматы изображения равноправны. Хотя cairo и стремится создать идентичные изображения на выходе различных интерфейсов, у каждого из них есть собственные преимущества. Например, выходной буфер формата PDF использует векторную графику везде, где это возможно (используя изображения только тогда, когда это обязательно), тогда как интерфейс PostScript генерирует одно большое изображение на страницу.

Модель рендеринга, представленная в cairo, создана под влиянием многих существовавших ранее технологий. Cairo имеет понятия контуров, линий и заливки, заимствованные из PostScript, а реализацию Porter-Duff-комбинирования изображений — из формата PDF и расширений для формирования изображения в современных реализациях X Server. Кроме того, в cairo поддерживаются отсечения, маски и градиенты.


Применения cairo

Очень многие влиятельные открытые проекты уже перешли на использование cairo, и сегодня cairo является крупнейшим игроком в области графики для Linux. Вот некоторые из наиболее популярных проектов, которые уже используют cairo:

  • Gtk+ — всеми любимый кроссплатформенный графический инструментарий
  • Pango — свободная библиотека для верстки и рендеринга текста, с акцентом на интернационализацию
  • Gnome — свободная графическая среда рабочего стола
  • Mozilla — кроссплатформенная инфраструктура Web-браузера, на которой базируется Firefox
  • OpenOffice.org — свободный набор офисных приложений, сравнимый по функциональности с Microsoft Office

Концепция рисования в cairo

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

Обычно первое, что делает живописец – выбирает, на чем рисовать. В физическом мире художник может использовать бумагу, ткань или даже стену. При использовании cairo также необходимо выбрать пустой носитель. Для рисования нужно создать контекст cairo, который является основным объектом. Из этого контекста можно выбрать целевую поверхность, такую как файл PostScript, документ формата PDF или экранное изображение. Тем самым программист выбирает, на чем собирается рисовать изображение.

Следующая задача живописца — выбор кисти. Живописец может проводить много времени за выбором кистей по размеру и толщине. В cairo также есть понятие типа кисти, выраженное через ширину линии. Различные размеры кисти дают линии различной толщины.

Теперь, в отличие от художника, рисующего в реальном мире, пользователю cairo необходимо определиться с точными координатами. Художнику достаточно прикоснуться кистью к бумаге, но компьютеру надо знать координаты x и y, чтобы знать, где поместить цифровую "краску".

После того как мы сообщили cairo о кисти и положении, из которого начинается рисование, нужно представить, как будет выглядеть линия. Простые рисунки могут состоять из отрезков прямых, но можно (подобно настоящему художнику) рисовать кривые и дуги.

Наконец, необходимо определиться, где линия должна закончиться. Это снова делается с помощью задания пары координат (x, y).

Дополнительно может потребоваться "раскрасить" нарисованные объекты. В терминологии cairo это называется заполнением. Для каждой из операций, описанных выше, в cairo есть непосредственная реализация API. Некоторые из этих API будут описаны ниже.

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

Хотя GIMP или Photoshop позволяют выполнять многие из этих же действий, необходимо помнить, что cairo является совершенно другим инструментом: cairo — это программное средство рисования. GIMP и Photoshop используют инструменты, подобные cairo, "за кулисами" для реализации рисования. При рисовании с помощью этих инструментов пользователь автоматически задает с помощью мыши координатные точки и тип инструмента, например, рамку, и выбирает перо и стиль линии через графический интерфейс. Как можно увидеть в коде примера (см. раздел Загрузка), cairo требует более явного взаимодействия вида "с шириной линии 1 провести дугу радиуса 10 вокруг центральной точки в положении z".


Терминология cairo

Обсуждая любые технологии, важно использовать правильную терминологию. Терминология API в cairo делится на три категории: основные термины рисования, термины поверхностей и термины, связанные со шрифтами (дополнительную информацию можно найти по ссылкам в разделе Ресурсы).

Прежде всего в cairo имеется контекст рисования, соответствующий движениям кисти художника по холсту, если следовать вышеприведенной аналогии. Контекст имеет тип cairo_t и необходим для вывода изображения. Типичными действиями, выполняемыми над контекстом, являются рисование форм Безье, линий и кривых. Последовательность таких криволинейных фигур и связанных с ними данных в Cairo называется контуром. Эти контуры могут быть нарисованы, а затем заштрихованы или залиты.

Координаты преобразуются в контуры с помощью очень простого API. Этот API хорош тем, что он освобождает от необходимости думать о сложных матрицах преобразований, обычно обсуждаемых в линейной алгебре и на курсах и в учебниках графики. Операции рисования, реализованные в cairo, могут быть подвергнуты любым аффинным преобразованиям. Эти преобразования дают инструментальные средства для сдвига, масштабирования и вращения рисунка или его частей. Каждый контур рисуется по определяющим точкам. Таким образом, cairo отображает изображения, соединяя заданные точки. Пример этого мы увидим позже.

Теперь расскажем о различных типах поверхностей в cairo. В cairo существует несколько видов поверхностей, привязанных к целевому формату вывода для данного рисунка. Поверхность в cairo — это то, на чем создается рисунок. В частности, имеются поверхности для изображений (в буфере в оперативной памяти), для OpenGL (через поверхность glitz), для PDF и PostScript поверхности — для вывода документов, для платформенно-зависимого рисования — через Win32 и XLib. Каждая из этих поверхностей выводится из основного типа поверхности — cairo_surface_t.

Шаблоном в cairo называется то, из чего можно читать, что используется как источник или маска операции рисования. Шаблоны в cairo могут быть сплошными, основанными на поверхностях и даже градиентными.

До сих пор мы обсуждали только проведение контуров. Но простые контуры позволяют получить лишь достаточно неинтересные рисунки, состоящие из линий. Фактически, простое проведение линий — только одна из пяти основных операций рисования в cairo. Вот эти пять операций:

  • cairo_stroke
  • cairo_fill
  • cairo_show_text/cairo_show_glyphs
  • cairo_paint
  • cairo_mask

Хотя простое рисование линий может быть удобным, оно недостаточно выразительно для рисования достаточно сложных объектов – например, шрифтов. У cairo есть базовый класс для шрифтов, названный cairo_font_face_t. Cairo понимает масштабированные шрифты, которые содержат кэшированные метрики для конкретных размеров шрифтов. Вдобавок поддерживается ряд опций шрифта, предписывающих, как данный шрифт должен отображаться. Обычно в cairo используются шрифты Freetype на UNIX и Win32 на платформах Windows.


Пример приложения на cairo

Я написал с помощью cairo код, изображающий логотип IBM. Код можно загрузить из раздела Загрузки. При выполнении этого кода на экран выводится следующее:

Рисунок 1. Логотип IBM, созданный с помощью cairo
Логотип IBM, созданный с помощью cairo

В коде особое внимание нужно обратить на строку cairo_stroke (cr), которая появляется после того, как были нарисованы буквы, но прежде, чем добавляется значок зарегистрированного товарного знака. Cairo не будет ничего рисовать без указания стиля линии, и случайное невключение стиля является типичной ошибкой новичков.


Система версий cairo

Выпускаемые версии cairo нумеруются так же, как и ядра Linux: выпуски с нечетным номером — это экспериментальные версии для разработки, которые не подходят для людей «со слабыми нервами» и производственных систем. Код четных выпусков тщательно полируется: в выпуске 1.0 особое внимание было сосредоточено на том, чтобы предоставить API для пользователей и выводить высококачественные изображения. API версии 1.2 был сосредоточен на завершении ряда менее разработанных интерфейсов, в то время как в текущей серии 1.4 сделано многое по оптимизации и добавлению новых функциональных возможностей.

Разработчики cairo предоставляют хорошие фрагменты кода, демонстрирующие использование различных наборов API cairo (подробнее см. ссылки на примеры в разделе Ресурсы). Так что не стоит ждать следующей версии cairo — можно загрузить текущую версию и испытать ее в действии!


Загрузка

ОписаниеИмяРазмер
Cairo code to draw IBM logocairo-example.tar20KB

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=289451
ArticleTitle=Кроссплатформенная графика с использованием cairo
publish-date=02142008