HomeMapIndexSearchNewsArchivesLinksAbout LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Jay Link
Об авторе: Джею Линку немногим более двадцати лет, он живет в г. Спрингфилд, шт. Иллинойс. Помимо Linux, он увлекается лазанием по горам и полетами. Является администратором  InterLink BBS (некоммерческий Internet-провайдер). В общем потоке жизни умудряется находить время, чтобы делать работу за деньги. 

Напишите автору

Графика - это просто! SVGAlib, руководство для начинающих

[Ilustration]

Если вы ищете простой графический пакет для разработки приложений под Linux, то можете прекратить поиски. Библиотека SVGAlib является простейшим способом создания графических приложений, без всего этого вздора, окружающего X Window System. Даже элементарных навыков программирования на C достаточно для использования SVGAlib!


Worst viewed with Internet Explorer (try Netscape 4.5 it is better) 

Что такое SVGAlib?

SVGAlib это низкоуровневая графическая библиотека для Linux. Она расширяет возможности языка C, который, как известно, не имеет встроенных средств  для создания графических приложений.

Ниже приведены несколько примеров программ на C.

Итак, SVGAlib является библиотекой внешних функций и используется с языком С. Язык C сам по себе, может работать  только в "текстовом режиме". Это связано с тем, что графические функции специфичны и не могут переноситься с одной компьютерной платформы на другую. Графические подпрограммы и функции, созданные для одной операционной системы должны быть полностью переписаны, если вы хотите, чтобы ваша программа работала в другой операционной среде. Например, графические программы для DOS или Windows не могут использоваться под Linux'ом.

Для работы с графикой в среде Linux необходимо использовать набор внешних функций, специально разработанных для Linux. SVGAlib и является таким набором.
 
SVGAlib это просто библиотека функций языка C вызываемых из C-программ 

Чем отличается SVGAlib от X Window System?

X Window System (XFree86) - это сервер. Сервер должен быть запущен прежде, чем к нему сможет обратиться любое из X-приложений. X-сервер потребляет много системных ресурсов и лишает вас возможности использовать виртуальные терминалы (Alt 1-6).

При использовании функций SVGAlib, сервер не нужен. SVGAlib  - это просто библиотека функций, вызываемых из C-программ (аналогично всем другим библиотекам расположенным в каталогах /lib и /usr/lib). Если библиотека SVGAlib установлена правильно, можно ни о чем не беспокоиться. И наконец SVGAlib не оказывает воздействия на остальные виртуальные терминалы, т.е. с одного терминала вы можете запустить графическое приложение, в то время как другой будет работать в обычном текстовом режиме.

Некоторые недостатки

Для X Windows разработано несравненно больше приложений, чем с использованием SVGAlib, поскольку X Window System является кросс-платформенной (т.е. приложения не требуют изменений при переносе из одной реализации UNIX в другую). SVGAlib имеется только для Linux. Неграмотное использование SVGAlib в приложениях может "подвесить" консоль так, что придется перезагружаться. Также не стоит быстро и часто переключаться между виртуальными терминалами, если с них запущены графические приложения. Есть риск "повиснуть".
Существует миф, будто использование SVGAlib создает проблемы с безопасностью. На самом деле программы, использующие SVGAlib запускаются с установленным битом смены пользователя (т.е. в момент исполнения приобретают права root), но эта привилегия заканчивается одновременно с выполнением программы. Поэтому мы не будем на этом останавливаться.

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

Примеры

Чтобы использовать SVGAlib, необходимо сообщить об этом компилятору. Для этого вставьте оператор #include <vga.h> в текст программы. Вот один из простйших примеров программы 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);
}
gradient

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

Обратите внимание на первый оператор: 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);
}
Эта программа требует включения #include <vgagl.h>.

Код начинается с установки ссылок на графический контекст:

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_setcontext(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 и последующей инсталляцией.


Submitted in English.
Перевод на русский язык А. Васильев
This website is maintained by Miguel Angel Sepulveda
© Jay Link 1998
LinuxFocus 1998