Чтение онлайн

на главную - закладки

Жанры

Программирование в X Window средствами Free Pascal

Семериков С. А.

Шрифт:

.

.

 end;

После того, как мы распределили желаемые цвета, мы можем использовать их, рисуя текст или графику. Для этого нам нужно установить эти цвета как передний план и цвет фона для некоторого GC (графического контекста), и затем используйте этот GC для рисования. Это делается с помощью функций XSetForeground и XSetBackground:

XSetForeground(display, my_gc, screen_color_1.pixel);

XSetForeground(display, my_gc, screen_color_2.pixel);

Само же рисование

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

1.2.5 Битовые и пиксельные карты

Xlib не имеет никаких средств для работы с популярными графическими форматами, такими как gif, jpeg или tiff. На программиста (или высокоуровневые графические библиотеки) оставлен перевод эти форматы изображений в форматы, с которыми знаком X сервер - битовыми и пиксельными картами.

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

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

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

Один из способов загрузки битового изображение из файла в память - включение файла побитового изображения в программу директивой #include препроцессора языка С.

Покажем, как можно получить доступ к файлу непосредственно:

var

 (* эта переменная будет содержать дескриптор новой пиксельной карты *)

 bitmap: TPixmap;

 (* эти переменные будут содержать размер загружаемой битовой карты *)

 bitmap_width, bitmap_height: word;

 (* эти
переменные будут содержать положение горячей точки загружаемой битовой карты *)

 hotspot_x, hotspot_y: integer;

 (* эта переменная будет содержать дескриптор корневого окна экрана, для которого мы хотим создать пиксельную карту *)

 root_win: TWindow;

 rc: longint;

 root_win:= XDefaultRootWindow(display);

(* загружаем битовую карту из файла "icon.bmp", создаем пиксельную карту, содержащую свои данные в сервере, и сохраняем ее дескриптор в переменной bitmap *)

 rc:= XReadBitmapFile(display, root_win, 'icon.bmp', @bitmap_width, @bitmap_height, @bitmap, @hotspot_x, @hotspot_y);

 (* проверяем, удалось ли создать пиксельную карту *)

 case (rc) of

 BitmapOpenFailed:

writeln('XReadBitmapFile - не могу открыть файл "icon.bmp"');

 BitmapFileInvalid:

writeln('XReadBitmapFile - файл "icon.bmp" не содержит корректного битового изображения.');

 BitmapNoMemory:

writeln('XReadBitmapFile - не хватает памяти.');

 BitmapSuccess:

(* битовая карта успешно загружена - что-то делаем с ней… *)

.

.

end;

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

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

(* Рисовать ранее загруженную битовую карту в заданном окне, в позиции x=100, y=50. Мы хотим скопировать всю битовую карту, поэтому указываем координаты x=0, y=0 для копирования с начала битового изображения и его полный размер *)

XCopyPlane(display, bitmap, win, gc, 0, 0, bitmap_width, bitmap_height, 100, 50, 1);

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

Поделиться:
Популярные книги

Рамакришна И Его Ученики

Ишервуд Кристофер
Детективы:
триллеры
6.25
рейтинг книги
Рамакришна И Его Ученики

История России. XX век. Как Россия шла к ХХ веку. От начала царствования Николая II до конца Гражданской войны (1894–1922). Том I

Зубов Андрей Борисович
История России. Новый взгляд
Научно-образовательная:
история
5.00
рейтинг книги
История России. XX век. Как Россия шла к ХХ веку. От начала царствования Николая II до конца Гражданской войны (1894–1922). Том I

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.75
рейтинг книги
Газлайтер. Том 15

Собрание пьес. Книга 1

Сологуб Фёдор Кузьмич
Драматургия:
драма
5.00
рейтинг книги
Собрание пьес. Книга 1

Железный поток. Морская душа. Зеленый луч

Серафимович Александр Серафимович
Библиотека мировой литературы для детей
Проза:
советская классическая проза
6.25
рейтинг книги
Железный поток. Морская душа. Зеленый луч

Ключ Времен

Прозоров Александр Дмитриевич
5. Ведун
Фантастика:
фэнтези
альтернативная история
8.56
рейтинг книги
Ключ Времен

Улав, сын Аудуна из Хествикена

Унсет Сигрид
1. Улав, сын Аудуна
Проза:
классическая проза
историческая проза
6.33
рейтинг книги
Улав, сын Аудуна из Хествикена

Каторга. Преступники

Дорошевич Влас Михайлович
1. Русская классика XX века
Проза:
русская классическая проза
6.25
рейтинг книги
Каторга. Преступники

Медведь и Дракон

Клэнси Том
10. Джек Райан
Детективы:
триллеры
5.75
рейтинг книги
Медведь и Дракон

Война: ускоренная жизнь

Сомов Константин Константинович
Проза:
военная проза
5.00
рейтинг книги
Война: ускоренная жизнь

Побережье цифрового мира

Инин Дмитрий
2. Негодяй Аллара
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Побережье цифрового мира

Я – Стрела. Трилогия

Суббота Светлана
Я - Стрела
Любовные романы:
любовно-фантастические романы
эро литература
6.82
рейтинг книги
Я – Стрела. Трилогия

Пограничная река

Каменистый Артем
1. Пограничная река
Фантастика:
научная фантастика
боевая фантастика
9.23
рейтинг книги
Пограничная река

Первый после бога

Ахманов Михаил Сергеевич
2. Зов из бездны
Фантастика:
научная фантастика
5.00
рейтинг книги
Первый после бога