Оконное окружение Photon microGUI

Краткая характеристика и особенности реализации оконного окружения Photon microGUI

Микроядерный подход в оконном окружении
Трехмерное пространство событий
Регионы
События
Взаимодействие с графической подсистемой
Поддержка шрифтов
Unicode и поддержка мультиязычности
Поддержка анимации
Поддержка печати
Оконный менеджер
Резюме

Микроядерный подход в оконном окружении

Данная статья содержит краткое описание одного из оконных окружений ЗОСРВ «Нейтрино» — Photon microGUI.


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

Оконное окружение
Photon microGUI и Композитная оконная подсистема
Графическая подсистема
Состоит из нескольких тесно взаимосвязанных модулей, рассматриваемых в соответствующем разделе документации: Графическая подсистема ЗОСРВ «Нейтрино». Стоит, однако, отметить, что Композитная оконная подсистема гораздо теснее связана с графической подсистемой, чем Photon.

Для многих встраиваемых систем требуется пользовательский интерфейс, с помощью которого оператор может взаимодействовать с приложением и управлять производственными процессами. Типичным и естественным способом решения подобных задач является оконное окружение. При этом оконные окружения, которые применяются в настольных системах, имеют специфические требования к оборудованию и требуют достаточно много ресурсов памяти. К таким системам относится Композитная оконная подсистема ЗОСРВ «Нейтрино» и ее применение без развитых средств аппаратной акселерации графики не всегдя является обоснованным. Оконное окружение Photon является минималистичным, консервативным и не требовательным к ресурсам. Оно позволяет решать вопросы как обратной совместимости, так и решения интерфейсных задач в самых минималистичных встраиваемых системах, ценой, однако, не самых оптимальных с точки зрения использования графического оборудования проектных решений.

Микроядерная архитектура самой ЗОСРВ «Нейтрино» во многом находит свои отражения в оконном окружении Photon microGUI.

На основе использования штатных системных механизмов IPC структура пользовательского интерфейса была разработана в виде серверного процесса Photon (схожего по своей сути с микроядром ЗОСРВ) и группы приложений-клиентов. На первый взгляд может показаться, что Photon схож с классической "клиент-серверной" концепцией X-сервера (X Window System), но сам графический сервер имеет ограниченную функциональность, в то время как большая часть интерфейсных функций распределена между другими взаимодействующими процессами.

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

Для управления графическим итерфейсом сервер Photon создает трехмерное пространство событий (event space) и ограничивается только управлением регионами (region) этого пространства, их обрезкой и перенаправлением событий по мере их появления и пересечения регионов. Стоит отдельно отметить, что у события также имеется прямоугольная область, определяющая границы его действия, и которая может быть сопоставлена с границами регионов.

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

Ключевой абстракцией сервера Photon является пространство событий, которое другие процессы заполняют регионами. Посредством механизма IPC, клиентские процессы управляют собственными зарегистрированными регионами. За счет выбора подмножества исполняющихся компонентов, окружение Photon может быть масштабировано в соответствии с требованиями системы в диапазоне от ссистемы с крайне ограниченными ресурсами до уровня полновесной настольной системы.

Трехмерное пространство событий

Пространство событий, управляемое сервером Photon, можно представить в виде трехмерного пространства, осям X и Y которого соответствуют границы объектов и оконных событий, а по оси Z - очередность и их перекрытие. Наиболее "удаленным" является так называемый корневой регион (root region). Конечный пользователь "наблюдает" пространство событий спереди. Приложения помещают свои регионы между корневым регионом и пользовательским передним планом. Регионы используются для генерации и захвата различных типов событий в пределах данного пространства.

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

17_1.png
Рисунок 1. Регионы и пространство событий Photon

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

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

Регионы

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

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

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

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

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

События

Как и регионы, события бывают разных классов и имеют различные атрибуты. Событие определяется следующими параметрами:

В отличие от некоторых оконных систем, сервер Photon классифицирует операции ввода (мышь, клавиатура и т.д.) и вывода (рисование) в качестве событий. События могут генерироваться либо регионами, которые процессы поместили в пространство событий, либо самим сервером Photon. Типы событий определены для:

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

Процедура вырезания фрагментов из списка прямоугольных областей события

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

Рассмотрим процедуру вырезания фрагментов из списка прямоугольников на примере. Когда приложением генерируется событие рисования, список его прямоугольников включает однин прямоугольник, охватывающий весь регион приложения-владельца события. Если событие проходит через непрозрачный регион, который перекрывает верхний правый угол из события, список прямоугольников изменяется и в нем становится два прямоугольника, описывающих оставшиеся видимыми фрагменты. Эти прямоугольники называются тайлами (tiles). Когда событие рисования достигает региона, за который отвечает клиент графической подсистемы, в его списке остаются лишь видимые прямоугольники, которые характеризуют измененный контент приложения.

17_2.png
Рисунок 2. Вырезание непрозрачных регионов из события рисования

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

Взаимодействие с графической подсистемой

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

Поскольку API рисования Photon группирует запросы на рисование в пакеты, генерируемые в виде отдельных событий рисования. Таким образом, каждое событие рисования содержит список визуализируемых графических примитивов. Как было показано ранее, в момент достижения событием "драйверного" региона, ассоциированный список прямоугольников (соответствующих операциям рисования) будет содержать лишь видимые области, подлежание визуализации. Задача io-graphics состоит в том, чтобы преобразовать этот список в визуальное представление посредством доступного графического оборудования. Таким образом, каждое событие содержит значительный объем работ (пакет работ).

Стоит отметить, что клиент графической подсистемы не использует механизмы IPC для взаимодействия с оборудованием, а обращается к нему напрмую посредством интерфейсной библиотеки графической подсистемы.

Одновременное использование нескольких графических драйверов

Фактически, драйверный регион помещается в пространство событий сервера Photon, следовательно, таких регионов может быть несколько – по числу графических драйверов и соответствующих контролеров. Они могут как размещаться рядом друг с другом, описывая множество дисплеев, так и накладываться друг на друга различными способами. Так как графический сервер Photon обладает сетевой прозрачностью, присущей ЗОСРВ «Нейтрино», приложения и драйверы могут выполняться на любом узле, что позволяет расширять графическое пространство до пределов физических мониторов множества компьютеров в сети. Благодаря наложению драйверных регионов события рисования могут быть визуализированы одновременно на множестве дисплеев, подключенных к разным устройствам.

Благодаря этой возможности появляется возможность создания многих довольно интересных приложений. Например, перетаскивание окон приложений между мониторами на разных физических машинах. Кроме того, встраиваемые системы без средств визуализации могут экспортировать графический интерфейс на узел в сети Qnet, который такими средствами обладает. Еще один вариант — совместная работа группы операторов с программной системой с графическим интерфейсом.

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

Цветовая модель

Цвета рендеринга, поддерживаемые сервером Photon, определяются 24-битной системой цветопередачи RGB (8 битов на каждый из цветов: красный, зеленый и синий), что дает в сумме 16 777 216 оттенков. В зависимости от фактических характеристик графического оборудования, драйвер либо отобразит изображение с 24-битным цветом непосредственно в периферию, либо преобразует его в цветовое пространство конкретного графического оборудования с потерей цветности.

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

Поддержка шрифтов

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

В состав сервера Photon входит некоторый ограниченный набор шрифтов TrueType. Другие шрифты этого стандартного типа распространены и их можно найти в различных источниках.

Штриховые шрифты

В оконном окружении Photon также применяются штриховые шрифты. Эти высокоскоростные шрифты идеально подходят для сред с ограниченными ресурсами памяти. Например, полный комплект китайского традиционного шрифта, включающего более 13 000 символов занимает до 8 Мбайт в обычных настольных системах, тогда как штриховая версия того же самого шрифта не более 500 Кб.

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

Unicode и поддержка мультиязычности

Сервер Photon имеет многоязыковую поддержку. В соответствии со стандартом Unicode (ISO/IEC 10646), оконное окружение Photon обеспечивает возможность создавать приложения, способные поддерживать основные языки и алфавиты мира.

Стандарт Unicode основан на наборе символов ASCII, но использует 16-битную (или 32-битную) кодировку для полной многоязыковой поддержки. В результате нет необходимости применять escape-последовательности или управляющих кодах при выводе любого символа на любом языке. Кодировка Unicode также удобна тем, что все символы — алфавитные, иероглифы или знаковые — рассматриваются в ней одинаковым образом.

Кодировка UTF-8

Преобразование UTF-8 (для 8-битной формы), которое ранее называлось UTF-2, было разработано для применения символьных данных стандарта Unicode в 8-битных UNIX-средах.

Перечислим основные характеристики кодировки UTF-8:

Поддержка анимации

Оконное окружение Photon обеспечивает анимацию без мерцания благодаря использованию offscreen-видеопамяти (видео память, которая не отображается на экране напрямую). Например, специальный виджет-контейнер PtOSContainer создает выделенный offscreen-контекст для рисования изображений. Контейнер PtOSContainer использует достаточно большой блок видеопамяти, чтобы поместить в него изображение размером с канву (canvas). Более подробные сведения о виджетах можно найти в статье Обзор библиотеки виджетов.

Клиент графической подсистемы в оконном окружении Photon также в максимальной степени использует offscreen-память для достижения более высокого качества анимированных изображений. Кроме того, графические драйверы поддерживают такие технологии, как полупрозрачное рисование (смешивание с alpha-каналом), замещения выбранного цвета в изображении (chroma-ключ) и др.

Слои

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

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

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

Поддержка печати

Оконное окружение Photon имеет встроенную поддержку печати в различных форматах:

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

Оконный менеджер

Благодаря собственному оконному менеджеру (Photon Window Manager, PWM), оконное окружение Photon в некоторых аспектах соответствует полнофункциональному пользовательскому интерфейсу настольного класса. Оконный менеджер является совершенно необязательным компонентом и может быть отключен в большинстве встраиваемых систем. Он позволяет пользователю управлять экранными окнами приложения: изменять их размер и перемещать с помощью устройств ввода, декорировать окна (рамки окон, системное меню окна и кнопки управления окном) и управлять их состоянием (сворачивание в пиктограмму, разворачивание и т.п.).

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

Резюме

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




Предыдущий раздел: перейти