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

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

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

Несколько графических драйверов

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


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

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

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

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


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

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

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


Масштабируемые шрифты


В дополнение к поддержке растровых шрифтов, Photon также
предлагает масштабируемые шрифты. Эти шрифты могут масштабироваться
практически с любым размером точки и использовать технологию
сглаживания (16 оттенков) для четкого и ясного отображения на экране
с любым разрешением.

Масштабируемые шрифты в Photon поддерживаются быстродействующим
сервером шрифтов, который загружает описания шрифтов, хранящиеся в
сжатом виде в файлах *.pfr (Portable Font Resource, ресурсы
переносимых шрифтов), и затем приводит вид символов в соответствие с
любым размером точки и разрешением. Стоит отметить, что формат PFR
обеспечивает более чем в два раза лучшее сжатие по сравнению с
PostScript шрифтами.


Наборы шрифтов

Основной латинский набор


Основной латинский (Core Latin) набор шрифтов
Photon (latin1.pfr), который охватывает два набора
символов стандарта Unicode, Basic Latin (U+0000 - U+007F)
и Latin-1 Supplement (U+0080 - U+00FF), включает следующие
масштабируемые шрифты:

  • Dutch;
  • Dutch Bold;
  • Dutch Italic;
  • Dutch Bold Italic;
  • Swiss;
  • Swiss Bold;
  • Swiss Italic;
  • Swiss Bold Italic;
  • Courier;
  • Courier Bold;
  • Courier Italic;
  • Courier Bold Italic.

Расширенный латинский набор


Расширенный латинский (Extended Latin) набор
(latinx.pfr) охватывает наборы символов Unicode Latin
Extended-A
(U+0100 - U+017F) и Latin Extended-B (U+0180 -
U+0217) и включает следующие шрифты:

  • Dutch;
  • Dutch Bold;
  • Dutch Italic (генерируется алгоритмически);
  • Dutch Bold Italic (генерируется алгоритмически);
  • Swiss;
  • Swiss Bold;
  • Swiss Italic (генерируется алгоритмически);
  • Swiss Bold Italic (генерируется алгоритмически).

Поддерживаемые языки

Имея в своем распоряжении Основной латинский набор (latin1.pfr),
разработчик может поддерживать множество языков, включая:

Датский;

Голландский;

Английский;

Финский;

Фламандский;

Французский;

Немецкий;

Гавайский;

Исландский;

Индонезийский;

Ирландский;

Итальянский;

Норвежский;

Португальский;

Испанский;

Суахили;

Шведский.

Расширенный набор (latinx.pfr) позволяет дополнительно поддерживать:


Африканский;

Баскский;

Каталонский;

Хорватский;

Чешский;

Эсперанто;

Эстонский;

Гренландский;

Венгерский;

Латышский;

Литовский;

Мальтийский;

Польский;

Румынский;

Словацкий;

Турецкий;

Валлийский.

Дополнительные языковые пакеты

Для Photon предлагаются несколько дополнительных
пакетов для поддержки национальных языков:

  • Японский;
  • Китайский;
  • Корейский;
  • Кириллица.



Многоязычная поддержка Unicode


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

Unicode основывается на наборе символов ASCII, но использует
16-битную кодировку для полной поддержки многоязычного текста. Нет
никакой необходимости прибегать к escape-последовательностям или
управляющим кодам для задания любого символа любого языка. Заметьте,
что кодировка Unicode обрабатывает все символы - алфавитные,
идеограммы, специальные символы - абсолютно одинаковым образом.

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

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

Вот некоторые основные характеристики UTF-8:

  • Unicode-символы от U+0000 до U+007E (набор ASCII) отображаются
    в UTF-8-байты от 00 до 7E (ASCII-значения);
  • ASCII-значения не встречаются иным образом в UTF-8,
    обеспечивая полную совместимость с файловыми системами, которые
    анализируют ASCII-байты;
  • UTF-8 упрощает преобразование в Unicode-текст и из него;
  • Первый байт указывает количество байт в многобайтной
    последовательности, обеспечивая эффективный разбор;
  • Можно легко найти начало символа из любого места в потоке
    байт, так как для этого необходимо перебрать не более четырех байт, а
    начальный байт легко определить. Например:

    isInitialByte = ((byte & 0xC0) != 0x80);



  • UTF-8 достаточно компактен, имея в виду количество
    байт, используемых для кодировки.

Системная библиотека включает ряд функций
преобразования:







Функция:Описание:
mblen()Длина многобайтной строки в символах
mbtowc()Преобразовать многобайтный символ в двухбайтный символ
mbstowcs()Преобразовать многобайтную строку в двухбайтную строку
wctomb()Преобразовать двухбайтный символ в его многобайтное представление
wcstombs()Преобразовать строку двухбайтных символов в многобайтную строку


В дополнение к перечисленным выше функциям, разработчики могут также
воспользоваться собственной библиотекой Photon, функциями
PxTranslate, которые выполнят различные преобразования
наборов символов в/из UTF-8.


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


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

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



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


Photon предусматривает встроенную поддержку печати с выводом на
различные устройства, включая:

  • файлы битовых карт;

  • PostScript;

  • Hewlett-Packard PCL;

  • Epson ESC/P2;

  • Canon;

  • Lexmark.


  • Photon также содержит виджет/диалог выбора принтера, облегчая
    печать из приложений.



    Менеджер окон Photon


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

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


    Библиотека виджетов


    Photon предлагает библиотеку компонентов, называемых виджетами,-
    объектов, способных, в основном, автоматически управлять своим
    поведением без непосредственного программирования. В результате,
    завершенное приложение может быть быстро собрано из виджетов, с
    последующей привязкой C-кода к соответствующим callback-функциям
    виджетов. Photon Application Builder (PhAB), который является частью
    системы разработки Photon, поддерживает широкую палитру виджетов в
    визуальной среде разработки.


    Photon предлагает широкий спектр виджетов:

    • базовые виджеты (например, кнопка);
    • виджеты-контейнеры (например, окно);
    • сложные виджеты (например, HTML-виджет).

    Базовые виджеты

    Виджет Ярлык (PtLabel)




    fig: i/label.gif




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

    Виджет Кнопка (PtButton)




    fig: i/button.gif




    Кнопки являются неотъемлемым компонентом любой оконной оболочки.
    Обычно они имеют выпуклый вид, который при нажатии сменяется на
    утопленный, визуально отражая выбор кнопки. В дополнение к
    визуальному отражению состояния, при выборе кнопки автоматически
    вызывается определенная приложением callback-функция.

    Виджеты Текстовый ввод (PtText, PtMultiText)




    fig: i/text.gif




    Photon предлагает два виджета текстового ввода:

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

    Виджеты Кнопка с фиксацией (PtToggleButton, PtOnOffButton)




    fig: i/toggle.gif




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


    Графические виджеты (PtArc, PtPixel, PtRectangle,
    PtLine, PtPolygon, PtEllipse, PtBezier,
    PtGrid)




    fig: i/graphic.gif




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

    Виджет Полоса прокрутки (PtScrollbar)




    fig: i/scrollb.gif




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

    Виджет Разделитель (PtSeparator)




    fig: i/separate.gif




    Данный виджет используется для разделения двух или более
    областей, придавая лучший внешний вид. Разделитель может быть
    настроен в соответствии с различными стилями и видами.

    Виджет Движок (PtSlider)




    fig: i/slider.gif




    Движок отличается от полосы прокрутки тем, что полоса прокрутки
    определяет интервал, в то время как движок задает единственное
    значение. Виджет Движок предусматривает большой список настраиваемых
    атрибутов.

    Виджет Таймер (PtTimer)


    Виджет Таймер существенно упрощает использование таймера. Этот
    виджет не отображается визуально - он просто определяет
    callback-функцию, вызываемую всякий раз при срабатывании таймера.
    Приложение может устанавливать значение таймера и, по выбору,
    интервал повторения.

    Виджеты Графическое изображение (PtBitmap, PtLabel,
    PtButton)




    fig: i/bitmap_cards.gif




    Photon поддерживает все основные форматы графических файлов, что
    позволяет импортировать изображения и показывать их внутри виджетов.
    Многие виджеты Photon непосредственно поддерживают отображение
    графики - наиболее используемыми являются PtButton, для
    создания панелей кнопок, и PtLabel, для показа изображений.

    Виджет Индикатор хода процесса (RtProgress)




    fig: i/progress.gif




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

    Виджет Сообщение (PtMessage)




    fig: i/message.gif




    Всплывающие сообщения и предупреждения типичны для оконной
    среды. Photon предусматривает очень удобный виджет диалога, который
    показывает сообщение, и до 3 кнопок для ответа пользователя. Имеется
    также полезная функция вызова модального диалога
    (PtAskQuestion()), основанная на данном виджете.

    Числовые виджеты (PtNumericInteger, PtNumericFloat)




    fig: i/numericfloat.gif




    PtNumericInteger позволяет пользователю задать
    целочисленное значение в пределах между установленными минимальной и
    максимальной величинами. PtNumericFloat позволяет ввести
    число с плавающей точкой.

    Виджет PtUpDown (стрелки вверх/вниз) позволяет
    пользователю увеличивать или уменьшать число на заданную величину.


    Виджеты-контейнеры

    Виджеты Окно и Пиктограмма (PtWindow, PtIcon)




    fig: i/icon.gif




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

    Виджеты Пиктограммы тесно связаны с окнами и показываются в
    папках Photon Desktop Manager и на панели задач PWM.

    Виджет Панель (PtPane)




    fig: i/pane.gif




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

    Виджет Группа (PtGroup)




    fig: i/group.gif




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

    Виджет Область прокрутки (PtScrollArea)




    fig: i/scrolla.gif




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

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

    Виджет Фон (PtBkgd)




    fig: i/bkgd_earth.gif




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

    Сложные виджеты

    Виджеты Меню (PtMenu, PtMenuBar, PtMenuButton)




    fig: i/menu.gif




    Photon предусматривает все необходимое для организации меню.
    Виджет PtMenuBar упрощает создание стандартной линейки меню.
    Виджет PtMenu обрабатывает отображение всплывающего меню,
    нажатие-перемещение-отпускание (мыши), указание и нажатие, ввод с
    клавиатуры и выбор пунктов меню. Виджет PtMenuButton
    используется для создания отдельных пунктов меню.

    Виджет Список (PtList)




    fig: i/list.gif




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

    Виджет Разворачиваемый список (PtComboBox)




    fig: i/combobox.gif




    Разворачиваемый список совмещает виджет PtText (для
    ввода текста) с кнопкой для отображения виджета PtList. При
    выборе пользователем элемента списка, виджет Текст автоматически
    обновляется в соответствии с текущим выбором. Разворачиваемый список
    очень полезен в для отображения списка в ограниченном пространстве.
    Диалоги и контейнеры занимают значительно меньше места на экране, что
    особенно важно для встроенных приложений.

    Виджет Дерево (PtTree)




    fig: i/tree.gif




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

    В число приложений Photon, использующих деревья, входят:
    Файл-Менеджер (показ каталога), PhAB (иерархия виджетов), vsin
    (список процессов) и многие другие.

    Виджеты Терминал (PtTty, PtTerminal)




    fig: i/ttyterm.gif




    Благодаря этому виджету есть возможность поместить текстовую
    консоль в свое приложение. Виджет Терминал создает текстовый
    терминал и управляет им.

    Более того - он обеспечивает полную функциональность
    "cut-and-paste" и быстрый вызов справки путем выделения текста внутри
    виджета.

    Виджет Делитель (PtDivider)




    fig: i/divider.gif




    Этот виджет осуществляет управление дочерними виджетами
    уникальным образом. Если поместить два или более виджета внутрь
    виджета PtDivider, то он автоматически создает небольшие
    разделители между дочерними виджетами. Передвигая эти разделители,
    пользователь может изменять размеры дочерних виджетов. Это очень
    удобно, в частности, для создания списков со столбцами изменяемой
    ширины. Фактически, если поместить виджет PtDivider
    внутрь PtList, это автоматически превратит простой список в
    список с множественными столбцами изменяемой ширины.

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



    Виджет Тренд (RtTrend)




    fig: i/trend_fixed.gif




    Системы реального времени часто требуют отображения графических
    трендов состояния процесса. Виджет RtTrend
    поддерживает отображение нескольких трендов одновременно.

    Виджет Измерительный прибор (RtMeter)




    fig: i/rtmeter.gif




    Виджет RtMeter имеет вид полукруга с рисками,
    отмечающими 1/3, 1/2 и 2/3 длины дуги. Стрелка может перемещаться с
    помощью мыши или клавиатуры или программно. Однократное нажатие
    кнопки мыши перемещает стрелку в текущую позицию курсора; при нажатии
    и последующем перемещении мыши ("drag") стрелка следует за курсором.

    Диалог выбора шрифта (PtFontSel)




    fig: i/fontsel.gif




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


    Виджет Выбор файла (PtFileSel)




    fig: i/filesel.gif




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


    Диалог настройки печати (PtPrintSel)




    fig: i/printsel.gif




    Виджет PtPrintSel позволяет пользователю выбрать принтер
    и произвести необходимую настройку параметров печати. Пользователь
    может задать диапазон страниц для вывода на печать и количество
    копий.


    Виджет HTML (PtHtml)




    fig: i/html.gif




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

    Создание новых виджетов

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



    Резюме


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

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