Журнал LinuxFormat - перейти на главную

LXF71:Cairo

Материал из Linuxformat
Перейти к: навигация, поиск

что такое… CAIRO?

Вообще-то это векторная графическая библиотека, которая перевернет наши представления о том, как Linux-приложения осуществляют вывод на экран, но Ричард Драммонд расскажет вам все в деталях

Расскажите мне о Каире.

С радостью. Каир — столица Египта, самый крупный город на ближнем Востоке, построенный неподалеку от руин древнего Мемфиса…

Да, очень впечатляюще. Я имел в виду Каиро (Cairo), открытый проект. Он ведь как-то связан с X Window System?

Ах, да! Cairo — новый двумерный графический инструментарий, разработанный, в основном, сотрудником Red Hat карлом Вортом (Carl Worth) и легендарным X-хакером кейтом Пакардом (Keith Packard). Вы правы — изначально он был ориентирован на использование X-клиентами. Исходной задачей разработчиков было предоставить X-приложениям профессиональную систему для отрисовки, конкурирующую с Apple Quartz 2D для Mac OS X. С тех пор, однако, Cairo превратился в кросс-платформенный продукт. Cairo, как и Quartz 2D, использует экранную модель, сходную с PDF 1.4.

где-то я все это уже слышал… тогда оно, по-моему, называлось Xr/Xc.

Да, именно так. Часть Xr в этом названии обязана своим появлением расширению the X Rendering Extension или Render, которое, по мере возможностей, использовалось для отрисовки и альфа-смешения (полупрозрачности). Если сервер не поддерживал расширение Render, применялась часть Xc, которая выполняла все нужные действия на стороне клиента. Позже Xr превратилась в Cairo, а Xc вошла в состав библиотеки для управления пиксельными регионами libpixman, которая необходима для работы Cairo.

А зачем понадобилось менять имя?

По двум причинам. Первая: изменение имени иллюстрирует расширение целей проекта — теперь он ориентируется не только на X-приложения. В данный момент Cairo можно использовать для вывода Quartz 2D, Windows GDI и OpenGL, а также PostScript, PDF и PNG. Во-вторых, слово «Cairo» гораздо легче произнести.

Быть может, в этом имени есть какой-нибудь тайный смысл?

По словам карла Ворта, такое имя было выбрано потому, что Египет был колыбелью письменности.

А разве не Месопотамия?

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

Вы сказали, что Cairo использует X Rendering Extension. Объясните, что это значит и почему это так важно.

Ну, как вы, вероятно, знаете, система X Window System допускает наращивание функционала посредством дополнительных расширений. Одним из них является Render, который был разработан для замены устаревшей экранной модели X. Render предоставляет все функции, необходимые современным приложениям: альфасмешение, субпиксельное позиционирование и сглаживание шрифтов.

Если Render действительно делает все это, то зачем тогда нужен Cairo?

Трудность состоит в том, что Render — очень низкоуровневое решение. Он реализует несколько базовых примитивов: треугольники, трапеции и изображения. Это упрощает жизнь людей, пишущих драйвера устройств для X. Поддержка аппаратного ускорения в Render также не вызывает проблем, поскольку он делает как раз то, что умеют современные графические чипсеты. Однако, нарисовать при помощи Render что-то высокоуровневое - весьма трудоемкая и сложная задача, и здесь на помощь приходит Cairo. О на берет на себя всю рутину — разбивает нужные вам фигуры на примитивы, с которыми умеет работать Render.

Постойте-постойте! Переносимость, аппаратное ускорение… Это же OpenGL получается!

Действительно, у Cairo и OpenGL много общего. Оба инструментария кросс-платформенные, оба поддерживают аппаратное ускорение. Отличие состоит в том, что OpenGL предназначен для работы с трехмерными объектами, тогда как Cairo фокусируется на двумерных и не зависит от устройства отображения. К роме того, они используют различные экранные модели. OpenGL умеет выводить точки, линии и многоугольники, а Cairo оперирует замкнутыми путями из прямых линий и кривых Б езье, которые можно залить.

Хмм… Что такое «кривая Безье»?.

Не буду утомлять вас математическими деталями. В двух словах, кривая Б езье — это способ параметрического задания гладкой кривой. Положение точек параметрической кривой определяется значением одного параметра, обычно обозначаемого буквой t. Чем больше значений t вы возьмете, тем более гладкой будет выглядеть нарисованная кривая. В принципе, кривые Безье могут иметь любой порядок, хотя в компьютерной графике обычно используются квадратичные и кубические.

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

Довольно математики! До какой степени Cairo не зависим от устройства?

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

А разве X зависим от устройства?

X переносим, но это не значит, что он независим от устройства. Средства отображения X оперируют с пикселями и их значениями. Например, если вы хотите нарисовать отрезок прямой, то должны сообщить X координаты пикселей в ее начале и конце, а также их значения (цвет линии). Все перечисленное напрямую зависит от устройства отображения. Стоит изменить глубину цвета и экранное разрешение — и вам придется заново вычислять координаты и подбирать новое значение цвета.

Cairo гораздо более абстрактен. Чтобы изобразить отрезок прямой линии, вам достаточно нарисовать отрезок между точками A и B нужного вам цвета. Чувствуете? Здесь нет никаких пикселей. О ни появляются лишь в тот момент, когда математическая кривая растеризуется на экране монитора на основании выбранного вами масштаба и разрешения устройства. С цветом все обстоит аналогичным образом. Вы выбираете подходящую цветовую модель, а Cairo решает, каким образом следует представить нужные вам цвета на устройстве вывода.

По умолчанию Cairo использует масштаб «1 точка:1 пиксель», что хорошо подходит для приложений, которым не нужно точное отображение пикселей (например, для отрисовки виджетов пользовательского интерфейса), но вы можете выбрать любой другой масштаб.

Таким образом, Cairo — векторная и независимая от устройства система. В чем же ее отличие от PostScript?

Не будет большим преувеличением сказать, что модель отображения Cairo основана на PostScript, так что здесь вы найдете эквиваленты практически для всех операторов языка PostScript. На самом деле, модель Cairo ближе к PDF 1.4, поскольку в ней присутствует понятие полупрозрачности.

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

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

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

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

Представьте себе выгоды от использования Cairo для вывода виджетов пользовательского интерфейса. Для ваших кнопок и элементов управления будут доступны альфа-смешение, сглаживание. Для любителей заниматься визуальными темами Cairo открывает поистине безграничные перспективы. С практической точки зрения, применение Cairo для динамической отрисовки виджетов в экранном разрешении означает, что вам больше не придется хранить несколько копий элемента управления в виде пиксельной карты для каждого возможного разрешения.

Следует отметить, что Cairo — это не только геометрические фигуры и заливка. Это также вывод текста сглаженными шрифтами и преобразования (например, поворот и масштабирование) изображений. Правда, в момент написания настоящей статьи данный функционал еще не был завершен.

А Cairo не замедлит работу X-приложений? Все это не выглядит слишком легким.

Нет. Даже наоборот, с помощью Cairo в принципе можно добиться ускорения приложений, работающих со сложной графикой, поскольку стандартный X-протокол не поддерживает альфа-смешения, так что всю работу приходится выполнять на стороне клиента и передавать на сервер готовую картинку. Например, библиотека libart предлагает возможности, сходные с Cairo, но при этом работает на стороне клиента, что исключает возможность аппаратного ускорения, так что вся нагрузка приходится на CPU.

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

К счастью, Cairo может осуществлять вывод посредством OpenGL. Это делается через библиотеку glitz, предоставляющую API, сходный с Render. Т аким образом, для трехмерных ускорителей, имеющих драйвера DRI, Cairo будет использовать графическое ускорение. Вам потребуется сравнительно свежий X-сервер, включающий одну из последних версий библиотеки Mesa3D. Если вас волнует скорость, имейте в виду, что Cairo еще не оптимизирован, что неудивительно для столь молодого проекта (имя Cairo было выбрано в 2003 году).

Какие-то приложения уже используют Cairo? Посмотреть бы на него в деле…

Cairo пока не существует в виде стабильного релиза, и понятно, что его еще не используют производители ПО.

однако существует множество демо-примеров, иллюстрирующих его возможности. более того, некоторые ведущие open-source проекты уже объявили о намерении использовать Cairo.

Например?

Самым давним «соратником» Cairo является проект XSVG, разрабатывающий коллекцию утилит для работы с SVG в X и, по совместительству, являющийся «родиной» Xr/Xc. SVG — это основанный на XML формат для хранения векторных изображений, так что он является естественной сферой применения Cairo.

кроме этого, началась работа по использованию Cairo в «движке» SVG, встроенном в пакет Mozilla. Последние рабочие сборки Firefox уже используют данный инструментарий. Подробности можно найти по адресу: http://www.mozilla.org/projects/svg. В дальнейшем разработчики планируют перевести на Cairo и другие части Mozilla, ответственные за вывод.

были поставлены кое-какие эксперименты по использованию Cairo в OpenOffice.org. Естественными кандидатами здесь являются программы Draw и Impress.

Впрочем, не стоит замыкаться на приложениях. Waimea — первый оконный менеджер для X, использующий Cairo для отрисовки рамок. он был разработан Дэвидом ревменом (David Reveman), автором библиотеки glitz, которая, как вы помните, используется Cairo для работы с OpenGL. См. http://freedesktop.org/wiki/Software_2fwaimea.

Занятно, но есть ли какие-либо примеры использования Cairo в библиотеках для создания GUI?

Да. Проект GTK объявил о своем намерении использовать Cairo. такая возможность была включена в версию 2.8.0. Имеется несколько примеров, демонстрирующих использование Cairo из GTK, в том числе, «движок» визуальных тем, который применяет Cairo для векторной отрисовки виджетов, а также gtkcairo, «холст» (canvas), на котором можно рисовать с помощью операторов Cairo.

А что насчет Qt?

Qt 4.0 включает новую графическую подсистему (известную как Arthur), которая во многом сходна с Cairo и может использовать расширение Render в X. Arthur поддерживает множество инструментов рендеринга и вполне сможет работать и с Cairo.

Я разработчик. Какие языки программирования поддерживаются Cairo?

Любые, для которых существуют привязки (bindings). Сам Cairo написан на C и, естественно, вы можете использовать этот язык. Привязки для C++, Java, Python и Ruby находятся на различных стадиях разработки.

Я уже могу начинать использовать Cairo в своих приложениях?

Да, но учтите, что интерфейс прикладного программирования (API) Cairo сформирован не полностью, так что, к моменту выпуска версии 1.0 обратная совместимость может быть нарушена. Это уже случалось. Например, текущая CVS-версия (0.5.0) не может использоваться для сборки приложений, написанных для Cairo 0.4.0. Если вас это не смущает, Cairo вполне готов к использованию.

По какой лицензии распространяется Cairo?

По двойной: LGPL или Mozilla Public License (MPL). Это свободное По, но оно может использоваться вместе с проприетарным, если вы выполняете требования лицензии.

где я могу найти Cairo?

официальный сайт проекта расположен по адресу http://www.cairographics.org и поддерживается карлом Вортом. Здесь можно найти инструкцию, как выписать Cairo из CVS. Проект пока не предоставляет пакетов — ни двоичных, ни в исходных текстах. Из-за отсутствия стабильных релизов, Cairo не включается в дистрибутивы Linux, однако, вы можете найти данный инструментарий в дереве разработки вашего дистрибутива. Gentoo содержит Cairo 0.4.0, а Debian — 0.3.0, который уже не особенно актуален. Лучше всего выписать код из CVS и собрать Cairo самостоятельно. Это совсем не трудно.

А что насчет документации?

На сайте Cairo можно найти документацию, автоматически генерируемую на основе исходных текстов. однако, в ней не так уж много информации, и разработчики осведомлены о том, что она нуждается в улучшении. Учебников пока нет, однако, вы можете ознакомиться с презентацией кейта Пакарда (http://freedesktop.org/~keithp/tutorials/cairo/cairo-tutorial), которую он создал в 2003 году.

На самом деле, лучший способ познакомиться с Cairo — это изучить код, который его использует. обратите внимание на модуль cairo-demos в CVS-дереве проекта. Некоторые из программ были написаны для старых версий Cairo, однако, это один из лучших способов понять данный инструментарий. Списки рассылки Cairo (http://www.cairographics.org/lists) - подходящее место для общения с разработчиками и другими пользователями.

А когда выйдет Cairo 1.0?

когда он будет готов, разумеется!

Персональные инструменты
купить
подписаться
Яндекс.Метрика