리눅스포커스 1998년 11월호: 쉬운 그래픽: SVGAlib 초보가이드 Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Jay Link
글쓴이 소개:

필자에게 편지쓰기

쉬운 그래픽: SVGAlib 초보가이드

[Ilustration]

리눅스시스템에서 간단한 그래픽패키지를 찾고 있습니까? 만약 그렇다면 더 볼 필요도 없습니다. SVGAlib는 간단한 그래픽 응용프로그램을 만드는 간단한 방법과 X윈도우 시스템의 장황한 부분을 없애줍니다. 만약 여러분이 C에서 기본적인 프로그래밍 수준이라면 SVGAlib를사용하세요.


인터넷익스플로어에서 가장 이상하게 보입니다.(넷스케이프 4.5이상버젼을 사용하세요.)

SVGAlib는 무엇인가

SVGAlib는 리눅스를 위한 저수준의 그래픽 라이브러리이다. 그래픽의 지원을 제공하는 것이 아니라 C프로그래밍의 기능을 확장시켜주는 것이다.

물론 C로 짜여진 그래픽 프로그램은 아주 많다.

그렇다. 그러나 그런 프로그램들은 외부 라이브러리 함수들에 의존한다. C 자체로는 단지 텍스트만 사용할 수 있다. 모든 그래픽 관련 함수들은 시스템에 의존적이며 포팅이 불가능하게 되는 것은 이때문이다. 불행하게도 한 운영체계를 위해 만들어진 그래픽 루틴들은 모두 새로 제작되지 않을 경우는 다른 시스템에서 동작하지 않을수 있다. 예를 들어 처음부터 DOS나 Windows에서 만들어진 그래픽 함수들은 리눅스에서는 쓸모없는 것이다.

리눅스상에서 C로 그래픽 함수들을 짜기 위해서, 리눅스에 알맞는 외부 함수들을 사용하는 것이 필요하다. SVGAlib는 그러한 함수들의 모음중 하나이다.

단지 SVGAlib는 C 프로그램에 의해 호출되어지는 바이너리 C 함수들이다.

SVGAlib는 X Windows시스템과 어떻게 다른가?

X 윈도우 시스템(XFree86)은 실제로 서버이다. 이 서버는 X상의 어떤 응용 프로그램을 사용하는 것들보다 우선적으로 시작된다. 더군다나 X 서버는 당연히 시스템에 집중적이어서 (예를 들면 X는 여러분의 자원을 계속 요구할 수도 있다.) 사용자가 가상 터미널(ALT 1-6)을 이용하지 못하게 할것이다.

그러나 SVGAlib는 X 윈도우를 실행하는 것처럼 실행이전에 다른것을 필요로 하지 않는다. SVGAlib는 단지 C 프로그램에 의해 호출되는 다른 모든 라이브러리들(/lib과 /usr/lib)과 같은 바이너리 C 라이브러리이다.결국 SVGAlib는 하등의 준비가 필요없다. 만약 SVGAlib가 적절히 인스톨되어있다면 보통의 유저들은 그 존재조차도 알지 못할 것이다. 결과적으로 SVGAlib는 각각의 가상터미널에 영향을 미치지 않고, 평상시처럼 다양한 어플리케이션을 실행할 수 있도록 해준다. 하나의 터미널에서는 텍스트를 사용하고, 다른 터미널에서는 그래픽을 이용할 수도 있다.

단점

X 윈도우 시스템은 (다양한 플랫폼에서 사용되어지듯이) 시스템에 독립적이기때문에 SVGAlib 로 만들어진 것보다 X 윈도우용 응용 프로그램이 훨씬 더 많다. 단지 리눅스만이 SVGAlib를 사용한다. 또한 잘못 만들어진 SVGAlib 응용프로그램은 콘솔을 이상하게 만들어버려 결국 재부팅을 해야만 할 수도 있다. 결국 SVGALIB로 만들어진 그래픽을 사용할 경우 두개의 콘솔상에서 이리저리 바삐 왔다갔다하면 안된다. 그렇지 않으면 화면에 충돌이 일어나서 다시 재부팅을 해야할 것이다.

SVGAlib가 보안상 위험이 있다는 것은 옛날말이다. SVGAlib를 사용하는 프로그램이 setuid가 root가 되어 실행되지만 실행된 다음 곧바로 특권을 포기하게 된다. 보안에 대해서는 신경쓸 필요가 없다.

요약해서, 앞서 언급한 문제점들이 있음에도 불구하고 SVGAlib의 속도와 사용상의 용이성은 많은 상황에서 매력적이다. 특히 화면에 마음대로 그려보고싶을 경우는 더욱 그럴 것이다.

예제들

SVGAlib를 사용하기 위해, C 프로그램에서 다음을 참조시켜야 한다. 단지 #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);
}

이 프로그램은 화면상의 빨간 색 점을 그릴 것이다. 5초 후에 콘솔을 텍스트 모드로 바꾼 다음, 프로그램은 종료된다.

위에 기술한 프로그램의 첫 문장인 vga_init()에 주목해 보자. 이것은 root 권한의 상태를 포기하고 SVGAlib 라이브러리를 초기화 시킨다. 두번째 라인인 vga_setmode(5)는 화면을 320X200X256인 mode 5로 설정한다. 즉 화면을 가로로는 320개, 세로로는 200개의 픽셀을 가지는 256칼라를 지원하는 격자형태로 만든다. 이것은 vga_setmode(G320x200x256)과 동일한 기능을 한다. 다른 표현들도 가능하다. 다음 문장인 vga_setcolor(4)는 현 색상을 빨강으로 만든다. 0에서 256까지, 어떤 수로도 선택할 수 있다. 다른 명령들에 의해 더 많은 색상들도 가능하지만, 우리는 이러한 예들의 기본적인 색상만을 사용한다. 마지막으로 좌표 10, 10에 한 점을 칠해보자. 그곳은 화면 왼쪽의 경계선의 오른쪽으로 11번째고 아래로 11째의 공간이 된다. 좌표의 격자점은 0에서 시작하기 때문에 11이 아니라 10이다. 좌표 0,0은 좌측의 상단에 있다. vga_setmode(0)는 스크린을 텍스트 모드로 돌려준다. vga_setmode(text)vga_setmode(0)보다는 더 개성적이다. 프로그램의 후미에 이 과정을 항상 해두는 것이 좋다. 그렇지 않으면 프로그램이 다른 사용자들의 정상적인 사용을 방해할 것이다.

이 코드를 컴파일하기 위해, 일반적인 gcc컴파일러를 사용하자. -lvga 커맨드를 사용하여, SVGAlib를 링크시키는 것이 필요하다. 마지막으로, 가장 좋은 수준의 최적화를 위해 -O3커맨드를 사용하길 바란다.:

gcc -O3 -o sample sample.c -lvga

그리고 나서, 루트의 권한을 가지지 않는 계정사용자들도 사용할 수 있게 다음과 같이 명령을 내린다.:

chmod u+s

실행하려면 다음과 같이 입력한다:

sample     <또는 사용자가 붙인 이름>

SVGAlib 명령의 완벽한 집합들은 SVGAlib 매뉴얼 페이지로 문서화되어 있다. 여기서 모든 것들을 살펴보지는 않는다. 그 대신에 더욱 빠른 SVGAlib 함수들의 집합들을 사용하여, 우리의 두번째 예제를 작성해보려고 한다.: vgagl.

"man vgagl"이라고 쳐보자. 그러면 vgagl은 "SVGAlib를 기초로 하는 빠른 프레임 버퍼 수준의 그래픽 라이브러리이다."라고 되어 있다. 기본적으로 사용자에게 하나의 문장만으로도 형상을 그릴수 있을 정도의 좀 더 나은 그래픽 함수들을 제공하게 될 것이다.

아래는 vgagl을 사용한 프로그램인데, 몇몇의 인스톨 프로그램들이 사용하는 파란 빛을 내는 화면으로 만들어 줄 것이다. 이것은 화면의 상단에서 밝은 파랑색으로 시작되어, 서서히 어두워지면서 밑으로 옮겨짐과 동시에 없어질 것이다. 처음 프로그램과 다르게 동작하는 것중의 하나가 보이지 않는 "가상의" 화면에서 그려주는 작업을 실행한다는 것이다. 그래서 모든 행들이 다 그려지면, 최종적으로 만들어진 그림들을 하나의 "물리적인" 화면에 단번에 옮기게 된다. 이런 것들은 화면의 떨림을 방지하고 사용자가 만든 어플리케이션들을 보다 더 전문가적으로 보이게 한다. 나는 가상의 화면이란 "배우"들이 공연을 하고 있는 동안 "분장사"들이 열심히 꾸미고 있는 "분장실"과 같다고 생각한다.

컴파일을 하려면 다음과 같이 입력한다.:

gcc -O3 -o gradient gradient.c -lvgagl -lvga

-lvgagl이 -lvga의 앞에 온다는 것을 주목하자. 그 라이브러리를 사용하기 위해 vgagl을 참조하려면 이렇게 하는 것은 필수적이다.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_setmode()를 사용한다. 그다음 콘텍스트들을 변수들로 저장한다.우리는 앞에서와 같이 5번 모드(G320320x200x256)를 사용한다.

먼저 보여지는 "실제"화면과 보여지지 않는 "가상"화면을 모두 초기화시킬 필요가 있다. 그리고 우리는 그 다음 컨텍스트를 변수로 저장한다.:

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 svgalib"와 "man vgagl"를 입력하면 볼 수 있다. 또한 각각의 함수들도 하나의 매뉴얼 페이지를 가지고 있다. 여기에 소개한 것을 읽고난 후에는, 비교적 쉽게 여러분의 프로그램속에 새로운 명령을 삽입할수 있게 될 것이다. 또한 배웠던 바와 같이, SVGAlib와 같이 설치되어 있는 예제 프로그램들을 가지게 될 것이다.

/libs/graphics나 tsx-11.mit.edu의 pub/linux/sources/libs에서 SVGAlib의 최신버젼을 구할 수 있다. 이 기사를 쓰고 있는 동안의 이 프로그램의 버전은 1.3.0이다.

마지막으로 슬랙웨어 배포본은 좋긴 하지만, SVGAlib를 잘못된 디렉토리에 설치하기도 한다. Sunsite나 MIT로부터 새로운 SVGAlib를 받아서 인스톨을 하면 그런 현상을 고칠 수 있다.


1차번역:정영대/2차번역:이주호


본 웹싸이트는 Miguel Angel Sepulveda가 관리합니다.
© Jay Link 1998
리눅스포커스 1998