Руководство программиста в Photon (953920), страница 48
Текст из файла (страница 48)
PgDrawILine( 8, 8, 152, 60 );
PgSetStrokeColor( Pg_BLUE );
PgDrawILine( 8, 8, 152, 112 );
}
Линии, созданные примитивами рисования
Текст
В заисимости от Ваших потребностей можно использовать различные процедуры рисования текста:
PgDrawMultiTextArea() | Рисование в некой области многострочного текста |
PgDrawString(), PgDrawStringmx() | Рисование строки символов |
PgDrawText(), PgDrawTextmx() | Рисование текста |
PgDrawTextArea() | Рисование текста внутри некой области |
PgDrawTextChars() | Рисование заданного количества текстовых символов |
PgExtentMultiText() | Вычисление пространства, занимаемого многострочной текстовой строкой |
PgExtentText() | Вычисление пространства, занимаемого строкой текста |
Текст рисуется с использованием текущих значений текстовых атрибутов; более подробно см. в разделе "Текстовые атрибуты" выше. Если Вы устанавливаете flags в значение Pg_BACK_FILL, пространство, занимаемое текстом, заполняется в соответствии с текущими атрибутами заполнения (см. "Атрибуты заполнения"). Если Вы задали подчёркивание с помощью PgSetUnderline(), подчёркивание рисуется под текстом и вверху фоновой заливки.
Например, чтобы напечатать чёрный текст 18-пунктовым шрифтом Helvetica:
void DrawSimpleText( void ) {
char *s = "Hello World!";
PhPoint_t p = { 8, 30 };
char Helvetica18[MAX_FONT_TAG];
if (PfGenerateFontName("Helvetica", 0, 18, Helvetica18) == NULL) {
perror("Невозможно сгенерировать имя шрифта ");
}
else { PgSetFont( Helvetica18 ); }
PgSetTextColor( Pg_BLACK );
PgDrawText( s, strlen( s ), &p, 0 );
}
Чтобы напечатать чёрный текст на голубом фоне:
void DrawBackFillText( void ) {
char *s = "Hello World!";
PhPoint_t p = { 8, 30 };
char Helvetica18[MAX_FONT_TAG];
if (PfGenerateFontName("Helvetica", 0, 18, Helvetica18) == NULL) {
perror("Невозможно сгенерировать имя шрифта");
}
else { PgSetFont( Helvetica18 ); }
PgSetTextColor( Pg_BLACK );
PgSetFillColor( Pg_CYAN );
PgDrawText( s, strlen( s ), &p, Pg_BACK_FILL );
}
Чтобы напечатать чёрный текст с красным подчёркиванием:
void DrawUnderlineText( void ) {
char *s = "Hello World!";
PhPoint_t p = { 8, 30 };
char Helvetica18[MAX_FONT_TAG];
if (PfGenerateFontName("Helvetica", 0, 18, Helvetica18) == NULL) {
perror("Невозможно сгенерировать имя шрифта");
}
else { PgSetFont( Helvetica18 ); }
PgSetTextColor( Pg_BLACK );
PgSetUnderline( Pg_RED, Pg_TRANSPARENT, 0 );
PgDrawText( s, strlen( s ), &p, 0 );
PgSetUnderline( Pg_TRANSPARENT, Pg_TRANSPARENT, 0 );
}
Чтобы напечатать чёрный текст с красным подчёркиванием на голубом фоне:
void DrawBackFillUnderlineText( void ) {
char *s = "Hello World!";
PhPoint_t p = { 8, 30 };
char Helvetica18[MAX_FONT_TAG];
if (PfGenerateFontName("Helvetica", 0, 18, Helvetica18) == NULL) {
perror("Невозможно сгенерировать имя шрифта");
}
else { PgSetFont( Helvetica18 ); }
PgSetTextColor( Pg_BLACK );
PgSetFillColor( Pg_CYAN );
PgSetUnderline( Pg_RED, Pg_TRANSPARENT, 0 );
PgDrawText( s, strlen( s ), &p, Pg_BACK_FILL );
PgSetUnderline( Pg_TRANSPARENT, Pg_TRANSPARENT, 0 );
}
Тексты, созданные примитивами рисования
Побитовые образы (bitmaps)
Побитовые образы рисуются с использованием текущего состояния текста. Если Вы установили flags в Pg_BACK_FILL, пустые пиксели образа рисуются с использованием текущего состояния заполнения. Примитивами рисования для побитовых образов являются:
PgDrawBitmap(), PgDrawBitmapmx() Рисование побитового образа
PgDrawRepBitmap(), PgDrawRepBitmapmx() Рисование побитового образа несколько раз
В этом примере рисуется побитовый образ на прозрачном фоне:
void DrawSimpleBitmap( void ) {
PhPoint_t p = { 8, 8 };
PgSetTextColor( Pg_CELIDON );
PgDrawBitmap( TestBitmap, 0, &p, &TestBitmapSize, TestBitmapBPL, 0 );
}
Побитовый образ на прозрачном фоне
В этом примере рисуется побитовый образ на жёлтом фоне:
void DrawBackFillBitmap( void ) {
PhPoint_t p = { 8, 8 };
PgSetTextColor( Pg_CELIDON );
PgSetFillColor( Pg_YELLOW );
PgDrawBitmap( TestBitmap, Pg_BACK_FILL, &p, &TestBitmapSize, TestBitmapBPL, 0 );
}
Побитовый образ с затенённым фоном
Образы (images)
В этом разделе обсуждается:
-
Образы на основе палитры
-
Образы в непосредственных цветах
-
Образы в градиентных цветах
-
Создание образов
-
Кеширование образов
-
Прозрачность в образах
-
Отображение образов
-
Управление образами
-
Отключение образов
Photon'овский микроGUI поддерживает следующие основные типы образов:
-
В непосредственных цветах (direct color)
Состоит из:
-
данных образа – матрицы цветов (но необязательно типа PgColor_t). Каждый элемент в матрице является цветом пикселя.
Образы в непосредственных цветах имеют тип, начинающийся с Pg_IMAGE_DIRECT_
-
На основе палитры
Состоят из:
-
палитры – массива типа PgColor_t;
-
данных образа – матрицы, элементы которой являются смещениями в палитре.
Образы на основе палитры имеют тип, начинающийся с Pg_IMAGE_PALETTE_
-
В градиентных цветах
Цвета сгенерированы алгоритмически как градиент между двумя заданными цветами.
Вы можете определить любой образ через его размер пикселя [т.е. числом бит на пиксель – Прим. пер.], байтов на линию, данные образа и формат. Образ может быть сохранён в структуре типа PhImage_t (описанной в "Справочнике библиотечных функций Photon'а"). Область type этой структуры определяет тип образа.
Образы на основе палитры
Образы на основе палитры обеспечивают быстрый, компактный способ рисования образов. Перед тем как прорисовывать образ на основе палитры, Вы должны установить либо аппаратную, либо программную палитру, чтобы задать цвета образа. Установка аппаратной палитры изменяет физическую палитру. Весь набор цветов функции PgSetFillColor() выбирается из этой палитры. Другие процессы продолжают выбирать цвета из глобальной палитры Photon'овского микроGUI и могут выглядеть неверно. Когда Вы отключаете аппаратную палитру, остальные процессы возвращаются к нормальному отображению без перерисовки. Вы должны всегда отключать аппаратную палитру, когда Ваше окно теряет фокус.
Установка программной палитры позволяет Вам переопределить, какие цвета интерпретируются для данного рисуемого контекста без изменения физической палитры. Все цвета программной палитры отображаются на физическую палитру.
Если Ваша физическая палитра использует больше цветов, чем поддерживает Ваша графическая карта, некоторые цвета опускаются, и образ не будет выглядеть столь красиво.
Данные образа (байты или полубайты) являются индексом в текущей палитре. Например:
PgColor_t ImagePalette[256];
char *ImageData;
PhPoint_t ImageSize;
int ImageBPL;
void DrawYourImage( PhPoint_t pos ) {
PgSetPalette( ImagePalette, 0, 0, 256, Pg_PALSET_SOFT );
PgDrawImage( ImageData, Pg_IMAGE_PALETTE_BYTE, pos, ImageSize, ImageBPL, 0 );
}
Образы в непосредственных цветах
В образах в непосредственных цветах каждый пиксель может быть любого цвета. Но в сравнении с образами на основе палитры, данные образа имеют больший объём и образ, возможно, будет дольше прорисовываться. Вы можете выбирать между несколькими типами образов в непосредственных цветах, перечисленных в описании к PhImage_t в "Справочнике библиотечных функций Photon'а"; они отличаются размером пикселя образа и точностью цвета.
Образы в градиентных цветах
В образах в градиентных цветах цвета алгоритмически сгенерированы как градиент между двумя заданными цветами.
Создание образов
Чтобы создать структуру PhImage_t:
-
Вызовите функцию PhCreateImage()
или
-
Вызовите функцию PxLoadImage(), чтобы загрузить образ с диска
или
-
Вызовите функцию ApGetImageRes(), чтобы загрузить образ из базы данных виджетов PhAB'а
или
-
Получите значение ресурса Pt_ARG_LABEL_IMAGE виджета типа PtLabel или PtButton (поддерживаемые виджетовским Pt_ARG_LABEL_TYPE являются Pt_IMAGE или Pt_TEXT_IMAGE)
или
-
Выделите для него место в памяти и заполните члены образа вручную.
Лучше вызвать функцию PhCreateImage(), чем выделять память под структуру и заполнять её вручную. Функция PhCreateImage() не только предоставляет удобный способ настройки пустого образа, но также соблюдает ограничения, накладываемые графическими драйверами на выравнивание образа, и прочие вещи.
Кэширование образов
Члены image_tag и palette_tag структуры PhImage_t используются для кэширования образов при работе с удалёнными процессами через phrelay (см. "Справочник утилит QNX 6"), например, при использовании phindows.
Эти тэги являются контрольной суммой (CRS – т.е. полученной циклическим избыточным кодом) данных образа и палитры, и могут быть вычислены с помощью функций PtCRC() или PtCRCValue(). Если эти тэги являются ненулевыми, phindows и phditto кэшируют образы. Перед отсылкой образа phrelay отсылает его тэг. Если phindows обнаруживает тот же тэг в своём кэше, то использует образ из кэша. Эта схема уменьшает объём передаваемых данных.
-
Вам нет нужды заполнять тэги, если не надо сохранять образы в кэше. Например, установите тэги в 0, если Вы отображаете мультипликацию, отображая образы, и образы никогда не повторятся.
Функции PxLoadImage и ApGetImageRes() устанавливают тэги автоматически. PhAB генерирует тэги для всех образов, сгенерированных через него (например, в побитовом редакторе).
Прозрачность в образах
Если Вы хотите, чтобы часть какого-то обрааз была прозрачной, Вы можете:
-
использовать хроматический ключ
или
-
создать маску прозрачности для образа.
Хромоключ поддерживается в большей части аппаратного обеспечения, тогда как маски прозрачности всегда обеспечиваются в программном обеспечении.
Использование хромоключа
Чтобы сделать заданный цвет прозрачным в образе, используя, если это возможно, хромоключ, вызовите функцию PhMakeTransparent(), передав ей образ и RGB-цвет, который Вы хотите сделать прозрачным.
Использование маски прозрачности
Маска прозрачности хранится в члене mask_bm структуры PhImage_t. Она представляет из себя побитовый образ, соответствующий данным образа; каждый бит этого побитового образа представляет пиксель рисуемого образа:
Если бит равен: | Сответствующий пиксель является: |
0 | Прозрачным |
1 | Каким-то цветом, заданным в данных образа |
Член mask_bpl структуры PhImage_t задаёт число байтов на линию для маски прозрачности. Вы можете создать маску прозрачности, вызвав функцию PhMakeTransBitmap().
Если Вы используете функцию PxLoadImage() для загрузки прозрачного образа, установите флаг Px_TRANSPARENT в члене flags структуры PxMethods_t. Если Вы делаете это, функция автоматически делает образ прозрачным; Вам нет необходимости создавать маску прозрачности.
Отображение образов
Существуют различные пути отображения образов:
-
Если образ хранится в структуре PhImage_t, вызовите функцию PgDrawPhImage() или PgDrawPhImagemx(). Эти функции автоматически обрабатывают хромоключ, альфа-операции, появление ореола на изображении, прозрачность и всё такое прочее.
Чтобы прорисовывать образ периодически, вызовите функцию PgDrawRepPhImage() или PgDrawRepPhImagemx().
Чтобы прорисовать прямоугольный фрагмент образа, вызовите функцию PgDrawPhImageRectmx().
-
Если образ не хранится в структуре данных PhImage_t, вызовите функцию PgDrawImage() или PgDrawImagemx().
Чтобы прорисовать образ периодически, вызовите функцию PgDrawRepImage() или PgDrawRepImagemx().
-
Если образ не хранится в структуре PhImage_t и имеет маску прозрачности, вызовите функцию PgDrawTImage() или PgDrawTImagemx().
-
Установите ресурс Pt_ARG_LABEL_IMAGE для виджета PtLabel или PtButton (которые используют функцию PgDrawPhImagemx() внутренне). Ресурс Pt_ARG_LABEL_TYPE виджета должен быть установлен в Pt_IMAGE или в Pt_TEXT_IMAGE.
Версии mx этих функций размещают адрес образа в буфере рисования пространства данных Вашего приложения. Когда буфер рисования сбрасывается, весь образ копируется в графический драйвер. Не-mx'овские версии копируют сам образ в буфер рисования: