Jay Link Об авторе: Джею Линку немногим более двадцати лет, он живет в г. Спрингфилд, шт. Иллинойс. Помимо Linux, он увлекается лазанием по горам и полетами. Является администратором InterLink BBS (некоммерческий Internet-провайдер). В общем потоке жизни умудряется находить время, чтобы делать работу за деньги.
|
Если вы ищете простой графический пакет для разработки приложений под Linux, то можете прекратить поиски. Библиотека SVGAlib является простейшим способом создания графических приложений, без всего этого вздора, окружающего X Window System. Даже элементарных навыков программирования на C достаточно для использования SVGAlib!
Ниже приведены несколько примеров программ на C.
Итак, SVGAlib является библиотекой внешних функций и используется с языком С. Язык C сам по себе, может работать только в "текстовом режиме". Это связано с тем, что графические функции специфичны и не могут переноситься с одной компьютерной платформы на другую. Графические подпрограммы и функции, созданные для одной операционной системы должны быть полностью переписаны, если вы хотите, чтобы ваша программа работала в другой операционной среде. Например, графические программы для DOS или Windows не могут использоваться под Linux'ом.
Для работы с графикой в среде Linux необходимо использовать набор внешних функций, специально разработанных для Linux. SVGAlib и является таким набором.
|
При использовании функций SVGAlib, сервер не нужен. SVGAlib - это просто библиотека функций, вызываемых из C-программ (аналогично всем другим библиотекам расположенным в каталогах /lib и /usr/lib). Если библиотека SVGAlib установлена правильно, можно ни о чем не беспокоиться. И наконец SVGAlib не оказывает воздействия на остальные виртуальные терминалы, т.е. с одного терминала вы можете запустить графическое приложение, в то время как другой будет работать в обычном текстовом режиме.
И все же, несмотря на указанные проблемы библиотека SVGAlib позволяет быстрее и проще создавать приложения и ее использование оправданно во многих ситуациях.
#include <stdio.h> #include <vga.h> int main(void) { vga_init(); vga_setmode(5); vga_setcolor(4); vga_drawpixel(10,10); sleep(5); vga_setmode(0); exit(0); }
Программа рисует на экране точку (пиксел) красного цвета. Через пять секунд консоль переводится в обычный текстовый режим и программа завершается.
Обратите внимание на первый оператор: vga_init(). С его помощью программа получает статус root (если установлен соответствующий бит) и инициализирует библиотеку SVGAlib. Следующая строка содержит функцию vga_setmode(5), т.е. устанавливается 5-й режим VGA адаптера (320x200x256). В этом режиме графическая сетка экрана имеет размеры 320 точек (пикселов) по горизонтали и 200 точек по вертикали с цветовой гаммой в 256 цветов. В качестве альтернативы можно использовать форму vga_setmode(G320x200x256). Оба вызова этой функции эквивалентны. Следующая функция: vga_setcolor(4), устанавливает в качестве текущего цвета красный цвет. Можно использовать любое значение в диапазоне от 0 до 255. Некоторые функции допускают использование большего количества цветов, но в данном примере мы будем использовать этот. И, наконец, функция: vga_drawpixel(10,10) рисует красную точку в позиции экрана 10, 10. На самом деле это одиннадцатая точка вправо от левой границы и вниз, от верхней границы экрана. Именно одиннадцатая, а не десятая, т.к. отсчет координат начинается с нуля. Точка с координатами 0,0 соответствует верхней левой границе экрана. Функция vga_setmode(0) возвращает VGA адаптер в текстовый режим (аналог - vga_setmode(text)). Помните, что при завершении программы всегда необходимо восстанавливать текстовый режим. В противном случае у вас будут проблемы.
Для компиляции программы используйте gcc. При этом необходимо указать, что будет использоваться библиотека SVGAlib (команда компилятора: -lvga ). Я рекомендую оптимизировать объектный код при помощи команды: -O3 , это высший уровень оптимизации. Командная строка компиляции будет выглядеть так (предполагается, что исходный текст программы находится в файле sample.c):
gcc -O3 -o sample sample.c -lvgaЧтобы программу могли запускать простые пользователи, необходимо установить бит смены пользователя:
chmod u+s sampleА теперь запустим программу:
sample <или имя программы по вашему выбору>Полный перечень функций SVGAlib приведен в man-руководстве. Мы не будем рассматривать их подробно. Вместо этого рассмотрим еще один пример, в котором используется подмножество функций SVGAlib - vgagl.
Напечатайте "man vgagl", и вы узнаете, что vgagl это "графическая библиотека на базе SVGAlib, функции которой работают на уровне буферов кадров VGA адаптера. Это ускоряет работу программы". В целом функции этой библиотеки обладают более широкими фозможностями, например основные графические примитивы рисуются при помощи вызова одной функции.
Следующий пример использует функции библиотеки vgagl. В результате работы программы на экране рисуется картинка с градиентом синего цвета, т.е. верх экрана - светло-голубого цвета и этот оттенок плавно изменяется до темно-синего в низу экрана. Главным отличием от предыдущего примеря является то, что процесс рисования не отображается на экране. Вся картинка формируется на невидимом "виртуальном" экране и физически отображается только после того, как будет полностью готова. Это устраняет мерцание экрана, а само приложение выглядит более пофессионально.
Программа компилируется следующим образом:
gcc -O3 -o gradient gradient.c -lvgagl -lvgaОбратите внимание что указание на библиотеку vgagl (-lvgagl) стоит перед командой (-lvga). Т.е. компилятор в поисках имен функций сначала будет просматривать библиотеку vgagl, а из библиотеки vga будут взяты только недостающие функции. Не забудьте и об установке бита смены пользователя: chmod u+s .
Программа выглядит так: Загрузить текст
#include <stdio.h> #include <stdlib.h> #include <vga.h> #include <vgagl.h> GraphicsContext *physicalscreen; GraphicsContext *virtualscreen; int main(void) { int i, j, b, y, c; vga_init(); vga_setmode(5); gl_setcontextvga(5); gl_setcontextvgavirtual(5); physicalscreen = gl_allocatecontext(); gl_getcontext(physicalscreen); virtualscreen = gl_allocatecontext(); gl_getcontext(virtualscreen); y = 0; c = 0; gl_setpalettecolor(c, 0, 0, 0); c++; for (i = 0; i < 64; i++) { b = 63 - i; gl_setpalettecolor(c, 0, 0, b); for (j = 0; j < 3; j++) { gl_hline(0, y, 319, c); y++; } c++; } gl_copyscreen(physicalscreen); getchar(); gl_clearscreen(0); vga_setmode(0); exit(0); }
Код начинается с установки ссылок на графический контекст:
GraphicsContext *physicalscreen GraphicsContext *virtualscreenЗатем объявляются необходимые переменные и устанавливается режим VGA адаптера (функция vga-setmode()). Мы будем использовать тот же режим, что и в предыдущем примере (G320x200x256).
В инициализации нуждаются и физический и "виртуальный" экраны. Текущий контекст экранов следует сохранить в соответствующих переменных:
gl_setcontextvga(5) gl_setcontextvgavirtual(5) physicalscreen = gl_allocatecontext() gl_getcontext(physicalscreen) virtualscreen = gl_allocatecontext() gl_getcontext(virtualscreen)
Функция gl_setpalettecolor() задает 64 оттенка синего цвета. Нарисуем на экране по 3 линии каждого оттенка. Всего получится 192 линии. Оставшиеся 8 линий в любом случае будут черными и мы не будем их рисовать.
После подготовки картинки скопируем содержимое виртуального (текущего) экрана на физический экран используя функцию gl_copyscreen(physicalscreen).
На этот раз пользователь сам может решить, сколько он хочет смотреть на картинку, т.к. функция getchar() приостанавливает работу программы до тех пор, пока пользователь не нажмет любую клавишу. Затем мы очищаем экран (функция gl_clearscreen(0)) и восстанавливаем текстовый режим: vga_setmode(0).
Полный список функций библиотеки SVGAlib можно посмотреть на man-страницах "man svgalib" и "man vgagl". Кроме этого по каждой функции имеются отдельные описания. С помощью этого описания вы сможете достаточно свободно создавать собственные приложения. Демо программы есть и в описании библиотек на man-страницах.
Если ваша библиотека не полна, или что-то не работает, советую вам загрузить последнюю версию SVGAlib с официальных сайтов sunsite.unc.edu каталог: pub/Linux/libs/graphics или tsx-11.mit.edu каталог: pub/linux/sources/libs. На момент написания этой статьи библиотека имела версию 1.3.0.
И, наконец, дистрибутив Slackware, по непонятным причинам имеет тенденцию устанавливать SVGAlib в неправильном каталоге. Проблема решается загрузкой библиотеки с сайтов Sunsite или MIT и последующей инсталляцией.
This website is maintained by Miguel Angel Sepulveda © Jay Link 1998 LinuxFocus 1998 |