Emre Demiralp 차 례: 서론그림 그리기글쓰기색칠하기더 궁금하다면.. |
자바로하는 프로그래밍 1부
"한낱 겨라도 쌓아두면 언젠간 쓰게 된다" Introduction포스트스크립트에 대해 연재할 기사 중 첫번째입니다. 여기서는 이 언어에 대해 하나하나 자세히 설명하지는 않을 것이고 다만 포스트스크립트가 문서를 작성하는 데 쓸 만한 언어라는 걸 막 발견한 사람에게 충분한 자료를 제공해 주려 합니다. 우리가 포스트스크립트에 대해 기술 논문이나 교재, 또는 훌륭한 설명서 같은 걸 쓰려는 건 아니지만 포스트스크립트에 관해 필요한 정보는 충분히 제공할 것입니다. 포스트스크립트의 주된 개념은 22년 전에 에반스 서덜랜드 컴퓨터사(Evans & Sutherland Computer Corporation)의 존 개프니(John Gaffney)에 의해 시작되었습니다. 처음에는 "디자인 시스템"이라고 했었는데, 아도비사(Adobe Systems Incorporated)가 포스트스크립트라는 이름으로 플랫폼과 장비에 독립적인 페이지 디자인 툴로 발전시켰습니다. 아도비사는 척 게쉬케(Chuck Geschke)와 존 와녹(John Warnock)이 82년에 세웠습니다. 게쉬케와 와녹은 이 언어를 새롭게 디자인하고 구현하였고 더그 브로츠(Doug Brotz), 빌리 팩스턴(Billi Paxton), 에드 태프트(Ed Taft)도 많은 도움을 주었습니다. 비록 대다수의 개인 사용자가 포스트스크립트를 직접 사용하지는 않지만, 포스트스크립트는 이제 문서 작성을 위한 주요 툴 중 하나로 자리잡고 있습니다. 포스트스크립트의 기능은 상당히 뛰어난데, 이 막강한 기능을 배우기 귀찮아 하는 많은 사용자들이 WISIWIG에 기반한 사용자중심의 다른 툴을 선호하고 있습니다. 하지만 실은 많은 WISIWIG 툴들이 문서 관리나 프린팅 같은 다른 작업과의 교신에 포스트스크립트 파일 포맷을 사용하고 있습니다. 이런 면에서, 포스트스크립트는 드로잉, 컬러링, 이미지 프로세싱, 컬러 세퍼레이션, 시뮬레이션, 애니매이션 등과 관련된 컴퓨터 작업에서 비록 드러나지는 않지만 강력한 지원자로서 우리의 오랜 친구처럼 살아 있는 것입니다. 한편 여러분이 프로그래밍을 위해 포스트스크립트의 구조를 공부해 보면 그다지 어렵지 않다는 걸 알게 될 것입니다. 포스트스크립트 명령은 인터프리터를 통해 수행됩니다. 인터프리터 소프트웨어 중에 인터넷 공개 도메인에서 공짜로 얻을 수 있는 유명한 프로그램이 있습니다. 바로 알라딘 엔터프라이즈(Aladdin Enterprise)사의 고스트스크립트(ghostscript)입니다. 같은 회사에서 나온 그래픽 인터페이스의 고스트뷰(ghostview)라는 것도 있습니다. GNU 버전의 고스트스크립트도 있습니다. 고스트스크립트는 모든 리눅스 플랫폼에서 사용할 수 있고, 대부분의 배포판에서 기본적으로 설치됩니다. 여기서는 고스트스크립트와 고스트스크립트의 특정 구조, 속성 등을 사용합니다. 물론 다른 인터프리터로도 샘플 프로그램을 돌릴 수 있습니다. X 윈도우 서버를 띄우고 xterm 윈도우를 열어보세요. 고스트스크립트를 사용하려면 실행명령을 수행한 다음에 나타나는 명령 프롬프트에 각각의 명령어나 여러 명령어 묶음을 입력하면 됩니다. Initializing... done. Ghostscript 2.6.2 (4/19/95) Copyright (C)
1990-1995 Aladdin Enterprises, Menlo Park, CA. All rights reserved. Ghostscript
comes with NO WARRANTY: see the file COPYING for details. 위의 명령 프롬프트와 함께 빈 윈도우가 하나 뜰 것입니다. 고스트스크립트를 끝내려면 GS> 프롬프트에 'quit' 명령어를 입력하면 됩니다. EOF(Ctrl-D)를 입력해도 됩니다. 고스트스크립트는 명령어를 화일에서 읽어서도 실행할 수 있습니다. 예를 들어 sample.ps라는 화일을 열어봅시다. 실행될 모든 명령어가 이 화일 안에 들어 있습니다. 그래서 이 화일의 내용을 '포스트스크립트 프로그램'이라고 부를 수 있습니다. xterm 윈도우의 셸 프롬프트에서 gs sample.ps 라는 명령을 입력하면 고스트스크립트가 이 화일 내용 전체나 또는 각각의 명령어들을 차례로 실행하고 고스트스크립트 윈도우에 결과 화면이 나타나게 됩니다(프로그램이 뭔가 나타나는 일을 할 경우. 포스트스크립트는 수학적 계산이나 스택 연산 등의 다른 목적으로도 쓸 수 있지만 그 내용은 다음에 다루겠습니다). 결과가 한 페이지 이상일 경우 고스트스크립트는 페이지를 보여주고 showpage 프롬프트가 나타나서 엔터 키를 쳐 주면 다음 페이지를 보여줍니다. 포스트스크립트는 역 폴리쉬 기법(Reverse Polish Notation)을 사용합니다
(HP 포켓 계산기와 같은 방식입니다). 다시 말하면 파라미터들이 명령어 앞에
오는 방식입니다. 명령어는 공백으로 구분합니다. 포스트스크립트는 데이타 처리와
명령어 실행에 스택을 사용합니다. 오퍼랜드(operand) 스택, 사전 스택, 실행
스택, 그래픽 상태 스택 등의 4가지가 있습니다. 오퍼랜드 스택에는 모든 포스트
스크립트 객체들이 들어가는데, 포스트스크립트 객체란 포스트스크립트
연산자의 피연산자(오퍼랜드)나 연산의 결과가 해당됩니다. 간단한 숫자
계산으로 예를 들겠습니다. 20 30 add 10 sub 의 결과는 40입니다. '20 30 add' 를 수행하면 50이 되고 sub가 이 50에서 10을 빼 40이 되는 것입니다. mul(곱하기), div(나누기)도 같은 방식으로 수행됩니다. '='은 오퍼랜드 스택에서 객체 하나를 꺼내어 그 값에 해당하는 글자를 표준 출력 화일로 보내고 줄바꿈을 합니다. '=='도 비슷한데 다만 pop 명령은 오퍼랜드 스택의 맨 위에 있는 놈을 빼내 버립니다. 스택에 대해서는 이 시리즈 중의 다음 기사에서 더 자세히 다루겠습니다. 포스트스크립트로 그림 그리기포스트스크립트로 그림을 그리려면 우선 그릴 페이지의 기하학적 구조부터 생각해야합니다. 포스트스크립트에서 페이지상의 점의 위치는 72분의 1인치 단위인 픽셀로 표현됩니다. 사각 페이지의 왼쪽 아래의 좌표가 (0,0)이고 수평, 수직 크기는 레터용지 기준으로 각각 612, 792입니다. 다른 종이 크기에 대해서는 각각 다음과 같습니다. note for 540 x 720 또는 각각은 고스트스크립트 명령어입니다. 'a4' 명령을 주면 위의 크기대로 작업 공간을 재조정합니다. 용지크기 정의는 초기화 화일인 gs_statd.ps에 들어있습니다. 슬렉웨어에서는 /usr/lib/ghostscript 디렉토리에 있습니다. 이 화일 내용을 고치거나 추가해서 원하는 크기를 정의할 수 있습니다. 나중에 이 기사 시리즈 중에 다룹니다. 여기서는 letter를 기본용지로 하겠습니다. 그림을 그리기 위해 원하는 용지 크기를 정한 다음에는 커서를 시작 위치로 옮깁니다. x y moveto 명령을 입력하면 됩니다. x와 y는 커서가 위치하게 될 가로, 세로 좌표입니다. 숫자로만 써야 되고 단위는 픽셀(pixel)입니다. 이미 아시다시피 포스트스크립트의 동작구조는 C나 포트란과는 다릅니다. 맨 뒤에 있는 moveto가 행동을 일으키는 명 령어인 것이지요. 즉 x, y로 표시된 위치로 커서를 옮기는 명령어입니다. 포스트스크립트가 스택을 사용하기 때문에 x, y 파라미터는 일단 차례로 스택에 들어갑니다. 그 다음에 moveto 명령어가 스택에 들어가면 앞의 두 항목을 파라미터로 취합니다. 이런 문법형태는 C나 포트란 언어에 익숙한 사람들에게는 색다를 것입니다. 그래서 지금까지 이 부분에 중점을 두고 설명을 해 왔습니다. 결론적으로, 파라미터를 가지는 명령어들은 파라미터 뒤에 와야 합니다. 이제 그림을 그려봅시다. 일단 간단한 직선부터 그려보지요. xx yy lineto 명령을 입력하면 됩니다. xx, yy는 직선의 끝부분을 나타냅니다. 시작점은 현재 커서의 위치인 x, y입니다. 그래서 이 명령으로 (x, y)에서 (xx, yy)까지의 직선이 그려집니다. 하지만 진짜 선은 경로를 정의하는 newpath와 stroke 명령을 필요로 합니다. 이제는 사각형을 그리는 포스트스크립트 프로그램을 작성해 보겠습니다. 지금까지 배운 걸 써먹으면 되는데요.
newpath 이런 내용을 sample1.ps 화일에 저장합니다. 한 줄에 한 명력씩 작성했지만, 반드시 그래야만 하는 것은 아니고, 각 명령을 빈 칸으로 띄고 전부 한 줄로 작성해도 됩니다. 포스트스크립트도 다른 프로그래밍 언어처럼 주석을 달 수 있습니다. 퍼센트 기호(%) 뒤에 오는 내용은 인터프리터가 전부 주석으로 처리합니다.
newpath 이제 X 윈도우 프롬프트에서 gs sample.ps라는 명령을 입력하면 고스트스크립트 윈도우가 뜨고 그리려는 사각형이 나타납니다. 뭔가를 그릴 때마다 매번 gs 인터프리터를 띄울 필요 없이 (sample.ps) run이라고 입력하면 GS> 프롬프트를 통해 수행하는 것과 같은 효과를 냅니다. stroke 명령은 인터프리터에게 그림을 그리게 합니다. 위의 프로그램의 경우에 고스트스크립트 윈도우에는 가로 세로가 각각 200, 150 포인트인 사각형이 나타납니다. 직선이 수직선, 수평선만 되는 것은 아닙니다. 아무 방향으로나 가능합니다. 고스트스크립트로 결과를 보면 알겠지만, 이 프로그램은 삼각형을 만듭니다. moveto, lineto 명령을 사용하면 꺽은 선으로 구성되는 어떤 모양이든 만들 수 있습니다. 꺽은 선 그림을 그리는 데 사용되는 두가지 명령이 더 있습니다. rmoveto와 rlineto인데, 파라미터 2개를 필요로 하고, 다음과 같이 사용됩니다. x y rmoveto 여기서 x, y는 각 작업의 시작점과 끝점의 가로, 세로 거리입니다. rmoveto와 rlineto의 'r'은 'relative(상대적)'을 의미합니다. 첫번 명령은 현재 위치에서 커서를 오른쪽으로 x 단위만큼, 위쪽으로 y 단위만큼 옮깁니다. 둘째 명령은 첫째와 비슷하지만 단지 위치만 옮기는 게 아니라 커서를 옮기면서 거기까지 선을 그립니다. 이 두 명령은 참조형 명령으로서 시작 위치가 참조점으로서 파라미터로 주어집니다. 위의 모든 예제들은 선 두께로 기본값(1 픽셀)을 사용했습니다. 프로그램 어느 곳에서든 선 두께를 지정할 수 있습니다. x setlinewidth 명령을 입력하면 됩니다. x는 픽셀 단위의 선 두께를 나타냅니다. 선 두께를 지정하는 다음 명령이 올 때까지 유효합니다. 한 프로그램 안에서 선 두께를 지정하는 횟수에는 제한이 없습니다. 포스트스크립트에서 그릴 수 있는 것이 직선만 있는 게 아닙니다. 원호도 가능합니다. x y r a b arc 명령을 사용하면 됩니다. x, y, r, a, b는 각각 원호의 중심의 x, y 좌표, 원호의 반지름, 원호의 중심에서 시작점, 끝점을 지나는 직선과 x축의 양의 부분과의 각도를 나타냅니다. 각도는 반시계 방향으로 측정합니다. 원호의 시작점이 현재 커서의 위치가 아니면, 현재점(커서의 위치)과 원호의 시작점 사이에 직선이 그려집니다. 이해를 위해 다음 프로그램을 수행해 보십시오.
이런 선이 그려지는 걸 막으려면 커서를 원호의 시작점에 옮겨 놓는 게 필요합니다. 하지만 이런 걸 막을 수 있는 또 다른 방법이 있습니다. 현재 위치를 무시하는 것입니다. 즉 패스를 시작할 때 아무 파라미터도 갖질 않는 것입니다. 커서의 위치에 아무런 설정값도 없게 하는 것이지요. 일단 그리기가 시작되면 그 패스의 마지막 점이 현재 위치가 됩니다. newpath 명령은 커서 위치에 할당된 값을 지우고 그리기가 새로 시작하는 점부터 시작하는 것처럼 만듭니다. 위의 프로그램의 5번째 줄을 newpath 명령으로 바꾸고 수행하면 원래 그림에서 직선만 없어진 그림이 나타나게 됩니다. newpath 명령을 수행하면 새로운 패스가 시작됩니다. 현재 패스는 비우고 현재 패스에 항목들을 추가하는 명령을 수행하면서 패스가 만들어져 갑니다. arc 명령으로 완전한 원도 그릴 수 있습니다. 시작 각도와 끝 각도를 각각 0과 360으로 주면 됩니다. newpath 명령 후 이 명령을 수행하면 완전한 원이 됩니다. arc 명령은 타원도 그릴 수 있습니다. 크기 조절 항목을 사용하면 되는데요, x y scale 명령으로 가로축, 세로축의 크기를 조절할 수 있습니다. x와 y는 각각 가로, 세로 조절값입니다. 값이 1이면 아무 변화도 없습니다. 크기 조절의 효과는 다른 크기 조절 명령이 올 때까지 유효합니다. 다음 크기 조절 명령은 먼저번 명령을 대체하는 것이 아니라 먼저번 명령과 합쳐지게 됩니다. 먼저번 조절값이 x1, y1이고 다음 조절값이 x2, y2라고 가정하면 둘을 합친다는 것은 조절값이 x1*y1, x2*y2가 된다는 것입니다. 이 부분을 주의해야 하는데요, 일부 패스가 용지 범위 밖으로 나가는 등의 원치 않는 결과가 생길 수도 있습니다. 포스트스크립트에서는 크기 조절값이 아무 것도 없는 게 기본값입니다. 다음 프로그램을 sample4.ps에 저장해 놓고 수행해 보면 크기 조절의 예를 볼 수 있습니다. 3 setlinewidth 결과를 보면 알겠지만, 크기 조절은 크기 뿐만 아니라 선의 두께에도 영향을 미칩니다. 위 프로그램으로 그린 원과 타원의 선 두께가 다른 이유가 바로 이것입니다. 포스트스크립트에는 원호를 그리는 명령이 2개 더 있습니다. arcn은 arc와 다 똑같고 그리는 방향만 다릅니다. arcn은 원호를 시계방향으로 그립니다. 세 번째 원호 그리기 명령은 주어진 두 선분과 끝점에서 접하는 둥근 원호를 그립니다. x1 y1 x2 y2 r arcto xt1 yt1 xt2 yt2 이런 식으로 수행됩니다. 여기서 x0, y0, x1, y1과 x1, y1, x2, y2는 두 접선을 나타내고 r은 원호의 반지름이며 xt1, yt1, xt2, yt2는 원호의 가로 세로 좌표입니다. 새로 시작한 패스가 아니거나 현재 점이 원호의 시작점과 일치하지 않으면 현재 점과 원호의 시작점을 잇는 선이 패스에 추가됩니다. 그리기 수행 후에 현재 점은 xt2, yt2가 됩니다. 포스트스크립트에는 베지에 알고리즘에 기반한 명령으로 점을 찍을 때 주어진 데이터를 내삽, 외삽하는 데 효과적으로 쓸 수 있는 명령도 있습니다. curveto 명령인데, 주어진 데이터를 내삽, 외삽해서 점을 구성하는 데 사용합니다. x1 y1 x2 y2 x3 y3 curveto 형태로 쓰고, 현재점(x0, y0)에서 곡선을 시작합니다. 시작점에서 x0, y0와 x1, y1 사이의 선분에 접하고, x3, y3 위치에서 끝나며, x2, y2와 x3, y3 사이의 선분에 접합니다. 이 네 점들은 모두 달라야하고 이 네 점에 의해 곡선의 모양이 결정됩니다 포스트스크립트의 글쓰기 도구포스트스크립트에는 탁상출판에서 표준 글꼴로 쓰이는 여러 글꼴이 있습니다. 게다가 글꼴을 만드는 도구들도 있는데, 글꼴을 사용할 수 있는 사전 스택을 정의하는 방식으로 사용합니다. 예제 프로그램을 봅시다. /Times-Roman findfont 프로그램을 보면 알겠지만 findfont 명령은 원하는 글꼴 구조에 접근하는 데 쓰입니다. 글꼴 이름은 / 로 시작하고 findfont 명령의 앞에 파라미터로 주게 됩니다 (/ 가 나오면 인터프리터는 뒤의 값을 '그대로' 스택에 넣습니다). 나중에 스택에 대해 자세히 다룰 때 이 부분을 좀 더 자세히 얘기하겠습니다. findfont로 글꼴을 선택한 다음에는 scalefont 명령으로 크기를 정합니다. 크기를 정하는 값은 이 명령 앞에 숫자 파라미터로 주면 됩니다. 글꼴의 크기를 정하고 나면 setfont 명령으로 이제부터 프로그램 안에서 이 글꼴을 쓸 수 있게 준비시킵니다. 위치 파라미터와 moveto 명령으로 커서를 옮기고서 앞뒤에 괄호로 싸인 글자들을 show 명령의 파라미터로 줍니다. 이제 showpage 명령을 수행하면 글자를 표시하는 모든 과정이 끝나게 됩니다. 위의 프로그램은 같은 글자에 대해 다른 글꼴과 크기로 다른 위치에 나타나게 하였습니다. 포스트스크립트에서 사용할 수 있는 글꼴의 수는 사용중인 리눅스 시스템의 트리구조상에서 글꼴이 있는 위치를 찾아 보면 알 수 있습니다. 글자들은 직선이나 곡선, 또는 여러 다른 형태를 따라 정렬시킬 수 있습니다. 그래서 원칙적으로는 어떤 형태로든 글자를 배열할 수 있습니다. 디자인에 달린 것이지요. 포스트스크립트에서 색칠하기와 색상의 사용포스트스크립트 언어에는 그림에 색을 칠해서 컬러풀한 그림을 만드는 몇가지 도구들이 있습니다. 우선 색을 정하는 명령부터 보겠습니다. 포스트스크립트에서는 색깔에 대한 별다른 명령이 없으면 검정색이 기본 색깔입니다. 그래서 앞의 그림들이 전부 흑백이었던 것이지요. 색깔있는 출력물을 위해 색상을 정하는 명령이 세 가지가 있습니다. 첫째는 RGB 방식 기반 명령입니다. 이 방식에서는 각 색상이 빨강(red), 초록(green), 파랑(blue)의 세 가지 기본 색으로 구성되어 있다고 봅니다. 각 구성요소들은 0에서 256 사이의 값을 가질 수 있고, 이 값들이 농도 파라미터가 됩니다. 농도 파라미터는 십진수로 소수점 세자리까지 가질 수 있습니다. 예를 들면 111.223처럼요. 결국 다음과 같은 형태로 명령을 수행하게 됩니다. x y z setrgbcolor 여기서 x, y, z는 각각 빨강, 초록, 파랑에 해당하는 농도 파라미터이고 setrgbcolor가 명령어입니다. 이런 형식으로 1 0 0 setrgbcolor라고 명령을 주면 빨강색이 되고, 0 1 0 setrgbcolor라고 명령을 주면 초록색이 됩니다. 세 파라미터 모두 1로 주면 검정색이 됩니다. 색상 설정 명령은 다음 색상 설정 명령이 오기 전까지 모든 그리기, 색칠하기에 영향을 미칩니다. 색상 설정 명령이 수행되면 이전 색상 설정 명령은 완전히 무시되고 새로운 설정이 모든 면에 영향을 미칩니다. 색상 설정 명령의 사용 횟수에는 제한이 없습니다. 색상 설정 명령을 적절히 사용하면 원하는 그림을 얼마든지 그릴 수 있습니다. 예술은 당신 하기 나름입니다. 두 번째 색상 설정 방식은 네 가지 색상 요소를 기반으로 하는 cmyk 방식입니다. 네 가지 기본 색은 시안(cyan, 청록), 마젠타(magenta, 심홍), 노랑(yellow), 검정(black)입니다. 최종 색상은 0부터 1 사이의 값을 갖는 각 색상의 농도 파라미터로서 결정됩니다. 다음과 같은 명령 형태를 갖게 됩니다. w x y z setcmykcolor 여기서 w, x, y, z는 각각 시안, 마젠타, 노랑, 검정의 농도 파라미터를 나타냅니다. 십진 소수값도 농도 파라미터로 쓸 수 있습니다. 이 명령 역시 다음 명령이 올 때까지 모두에 영향을 끼칩니다. 다음 명령이 오면 앞의 설정을 없애고 새로 설정하게 되구요. 명령 사용 횟수에도 제한이 없습니다. 세 번째 명령은 다음과 같이 사용합니다. x y z sethsbcolor 여기서 x, y, z는 각각 색상의 세 가지 다른 속성에 대한 농도 파라미터를 나타냅니다. x는 빛의 스펙트럼 상에서 색의 위치를 결정하는 색상(hue)이고, y는 채도(saturation), z는 명도(brightness)입니다. 다룰 속성이 스펙트럼 상에서의 색의 위치나 명도, 채도 등일 때는 이런 형태가 유용합니다. HSB 색상에 대해 더 알고 싶은 분은 리눅스에 있는 xfig의 사용법을 찾아보세요. 포스트스크립트의 색칠 명령 중에서 제일 중요한 것은 fill과 closepath입니다. 다음의 프로그램을 sample6.ps에 저장하고 수행해 보면 뭐가 중요한지를 확실히 알 수 있습니다. 1 1 0 0 setcmykcolor 여기서 closepath 명령은 아직 완성되지 않은 패스에 대해 두 끝점을 직선으로 연결해서 패스를 닫는 일을 하고, fill 명령은 닫힌 패스의 안쪽을 현재 색상으로 칠하는 일을 합니다. 포스트스크립트에서는 다음과 같은 형태로 회색조를 표현할 수도 있습니다. x setgray 여기서 x는 회색조의 농도이고 검정색을 나타내는 0에서 흰색을 나타내는 1까지의 값을 가집니다. 다음의 프로그램을 sample7.ps에 저장하고 수행해 보면 저절로 설명이 될 것입니다. 0.2 setgray 이 강의를 끝마치면서 한 가지 당부하고 싶은 것은, 포스트스크립트가 아주 흥미롭다고 느꼈다면 좀 더 복잡하고 폭넓은 프로그램을 만들어 보라는 것입니다. 이 시리즈의 다음 기사에서는 포스트스크립트 언어를 좀 더 깊이 다루겠습니다. 이 강의에 대해 질문이나 충고할 게 있으시면 언제든지 보내주십시오. 다음 기사에 그것들을 충분히 반영하도록 하겠습니다. 저자는 이 기사를 작성하고 제출하는 데 조언을 줌으로써 많은 도움을 준 올리버 띨만(Oliver Thilmann)에게 감사함을 전합니다. 원문은 영어로 쓰여졌습니다.
|
본 웹사이트는 Miguel Angel Sepulveda씨에 의해 관리됩니다. © Emre Demiralp 1998 LinuxFocus 1998 |