IDL/Data Type & Format

IDL의 폰트 체계 및 활용 [3] Device Font

이상우_IDL 2022. 9. 23. 13:47
728x90

IDL에서 그래픽 표출 작업을 하면서 그림과 함께 문자들을 표시하는 경우가 상당히 많습니다. 주로 알파벳, 숫자 및 각종 기호들을 표시하게 되는데요. 이 때 적용 가능한 폰트(Font)들의 종류도 꽤 많습니다. IDL에서 지원되는 폰트들의 체계를 보면 크게 다음과 같은 3종의 카테고리들로 나눠집니다.

 

1) 허쉬 벡터 폰트 (Hershey Vector Font)

2) 트루타입 폰트 (True Type Font)

3) 디바이스 폰트 (Device Font)

 

그래서 각 카테고리에 대하여 순차적으로 소개를 하고 있는데, 허쉬 벡터 폰트 및 트루타입 폰트 두 종류에 관해서는 관련 게시물을 이미 올린 바 있습니다. 그런데 관련 작업을 계속 하다보니 디바이스 폰트에 관한 소개도 바로 가능하게 준비가 되었습니다. 그래서 오늘은 그 세번째이자 마지막 순서로 디바이스 폰트에 관하여 소개해보도록 하겠습니다.

 

디바이스 폰트(Device Font)는 IDL 자체적으로 제공되는 폰트가 아니고 외부로부터 제공되는 폰트들을 의미합니다.  즉 IDL이 아닌 다른 소프트웨어들이 사용중인 폰트를 또는 IDL이 구동되고 있는 하드웨어 기기 자체적으로 제공되는 폰트들을 뜻하는데, IDL에서는 이러한 외부 폰트들도 불러와서 사용하는 것이 가능합니다. 예전에는 디바이스 폰트 대신 하드웨어 폰트(Hardware Font)라는 명칭으로 부르기도 했습니다. 그리고 디바이스 폰트는 그 특성상 가용한 폰트들의 종류가 사용자 및 기기에 따라 서로 다를 수 밖에 없다는 것이 중요한 포인트입니다. 즉 내가 사용 가능한 폰트라고 해서 다른 유저도 그 폰트를 사용할 수 있다는 보장은 없습니다. 어쨌든 나의 IDL에서 현재 사용 가능한 디바이스 폰트들의 전체 목록을 보고자 한다면 IDL의 커맨드 입력창에서 다음과 같은 방식으로 DEVICE 명령을 실행하면 됩니다.

 

IDL> DEVICE, GET_FONTNAMES=fonts, SET_FONT='*'

 

이러한 명령을 실행하면 fonts라는 배열을 돌려받게 되는데, 가용한 모든 디바이스 폰트들의 이름이 이 안에 저장됩니다. 따라서 다음과 같이 출력을 해보면 됩니다.

 

IDL> PRINT, fonts

 

그러면 아마 상당수의 폰트 이름들이 출력될 것이며 물론 그 갯수 및 종류는 사용자마다 차이가 날 것입니다. 어쨌든 이러한 폰트들은 IDL에서 디바이스 폰트로서 사용이 가능하다고 보면 됩니다. 제 경우는 총 404개의 폰트들이 가용한 것으로 확인되었는데, 간단한 반복형 구문을 사용하여 그 목록를 출력해볼 수 있습니다. 제 목록 중 앞부분 일부만 보면 다음과 같습니다.

 

IDL> FOR j = 0, N_ELEMENTS(fonts)-1 DO PRINT, fonts[j]
System
@System
Terminal
@Terminal
Fixedsys
@Fixedsys
Modern
Roman
Script
Courier
MS Serif
MS Sans Serif
Small Fonts
Big John
Arial

 

물론 앞서 언급했듯이 유저마다 그 목록은 서로 차이가 날 수밖에 없음을 유의해야 합니다. 디바이스 폰트는 DG 뿐 아니라 다른 그래픽 체계들(OG, NG)에서도 사용이 가능합니다. 각 그래픽 체계별로 디바이스 폰트를 사용하기 위한 설정법은 다음과 같습니다.

 

DG 체계 : 각 루틴별로 FONT 키워드의 값을 0로 설정하거나 시스템 변수인 !P.FONT의 값을 0로 설정

OG 체계 : IDLgrFont 클래스의 객체를 정의할 때 세부적으로 설정

NG 체계 : TEXT 함수 및 기타 그래픽 함수 내에서 세부적으로 설정

 

그러면 지금부터 DG 및 NG 체계에서 디바이스 폰트를 사용하는 방법을 소개해보도록 하겠습니다. 먼저 DG 체계 기반의 간단한 예제 플롯을 표출하면서 디바이스 폰트를 사용해봅시다. 이 예제에서는 Papyrus라는 폰트를 사용해보겠습니다. 만약 여러분의 IDL에서 이 Papyrus 폰트가 지원되지 않는다면, 지원되는 다른 디바이스 폰트를 선택하여 사용해보시기 바랍니다.

 

x = FINDGEN(91)
y = SQRT(x)*SIN(x*8*!DTOR)
DEVICE, DECOMPOSED=1
WINDOW, XSIZE=600, YSIZE=500
DEVICE, SET_FONT='Papyrus*Bold*48'
PLOT, x, y, XRANGE=[0, 90], TITLE='Title of My Plot', $
  XMARGIN=[8, 4], YMARGIN=[4, 5], $
  FONT=0, COLOR='000000'x, BACKGROUND='FFFFFF'x

 

DG 체계에서 디바이스 폰트를 사용하려면 반드시 먼저 DEVICE 명령을 사용하여 폰트에 관한 설정을 해줘야 합니다. 즉 위와 같이 SET_FONT 키워드에서 폰트의 이름 및 스타일을 지정해줘야 합니다. 여기서는 Papyrus 폰트를 볼드체 및 크기 48로 설정하였습니다. 그리고 PLOT 명령에서는 반드시 FONT 키워드를 사용하여 그 값을 0으로 설정해야 합니다. 이러한 과정을 거쳐야 DG 체계에서 디바이스 폰트를 정상적으로 사용할 수 있습니다. 결과는 다음 그림과 같습니다.

 

 

이와 같이 IDL 자체적으로는 지원하지 않는 다소 특이한 폰트를 디바이스 폰트로서 사용하는 것이 가능합니다. 이번에는 다음과 같이 Courier New 볼드체 폰트로 변경하여 표출해보겠습니다.

 

DEVICE, SET_FONT='Courier New*Bold*32'

 

그 결과는 다음 그림과 같습니다.

 

 

일단 DG 체계에서 디바이스 폰트를 사용하는 기본적인 방법은 대략 이와 같습니다. 그런데 DG 체계에서 디바이스 폰트를 사용하는데 있어서는 몇가지 제약이 있습니다. 우선 문자의 회전이 불가능합니다. 예를 들어 PLOT 명령에서 다음과 같이 X, Y 축에 타이틀 문자를 추가하고 다시 실행하여 결과를 보면 다음 그림과 같습니다.

 

PLOT, x, y, XRANGE=[0, 90], TITLE='Title of My Plot', $
  XMARGIN=[8, 4], YMARGIN=[4, 5], $

  XTITLE='X Data', YTITLE='Y Data', $
  FONT=0, COLOR='000000'x, BACKGROUND='FFFFFF'x

 

 

이 그림에서 Y축의 타이틀 문자인 'Y Data'를 보면 각 문자의 방향이 90도 회전되지 않고 여전히 수직으로 서있는 것이 보입니다. 통상적으로는 반시계 방향으로 90도 회전된 모습으로 표시되는 것이 정상이겠지만 그렇게 표시되지는 않는다는 것입니다. 또 다른 핸디캡은 첨자 등과 같은 특수 형식의 표기가 안된다는 것입니다. 즉 다음과 같이 전체 타이틀 문자에 대하여 !e 또는 !i를 적용하여 위첨자 또는 아래첨자를 표기하고자 시도해봅시다. 참고로 !e 및 !i는 허쉬 폰트 체계에서 첨자 표기를 할 때 사용하는 일종의 오퍼레이터와 같은 역할을 하며 트루타입 폰트에서도 사용이 가능합니다.

 

PLOT, x, y, XRANGE=[0, 90], TITLE='Title of My Plot!e11!i22', $
  XMARGIN=[8, 4], YMARGIN=[4, 5], $

  XTITLE='X Data', YTITLE='Y Data', $
  FONT=0, COLOR='000000'x, BACKGROUND='FFFFFF'x

 

여기서는 전체 타이틀 문자를 표기하는데 있어서 Title of My Plot 바로 뒤에 11 및 22라는 숫자를 각각 위첨자 및 아래첨자 형태로 표기하고자 시도하였는데, 결과 그림을 보면 전혀 적용되어있지 않은 것을 확인할 수 있습니다.

 

 

즉 DG 체계에서 이러한 방식으로 문자의 회전이 적용되도록 한다든지 또는 첨자를 표기하는 등의 동작들은 허쉬 벡터 폰트 또는 트루타입 폰트를 사용할 경우에는 아무 문제가 없지만 디바이스 폰트를 사용할 경우에는 제대로 반영되지 않습니다. 물론 앞선 예제에서 봤듯이 크기 조절 및 스타일 변경 등은 가능합니다. 결국 DG 체계에서 디바이스 폰트를 사용할 경우에는 이러한 한계점들이 있다는 것을 염두에 두어야 합니다. 따라서 문자의 회전이나 첨자의 표기 등이 필요할 경우에는 허쉬 또는 트루타입 폰트를 사용하는 것이 좋습니다.

 

이번에는 NG 체계에서 디바이스 폰트를 사용해봅시다. 앞서 DG 체계의 예제에서와 같은 데이터를 사용하여 비슷한 모습의 플롯을 표출하는 과정은 대략 다음과 같습니다.

 

x = FINDGEN(91)
y = SQRT(x)*SIN(x*8*!DTOR)
win = WINDOW(DIMENSIONS=[600, 500]*mf, /NO_TOOLBAR)
p = PLOT(x, y, XRANGE=[0, 90], TITLE='Title of My Plot', $
  FONT_NAME='Papyrus', FONT_STYLE='Bold', FONT_SIZE=16, /CURRENT)

 

여기서는 Papyrus 볼드체 폰트를 적용하였고 크기는 16으로 설정하였습니다. 그런데 PLOT 함수의 내용을 잘 보면 디바이스 폰트를 사용한다고 해서 특별히 다른 추가적인 설정이 정의되어 있지는 않습니다. 그냥 FONT_NAME 속성을 Papyrus로 설정하고 그 외 FONT_STYLE 및 FONT_SIZE를 적절히 설정해준 것 뿐입니다. 즉 이전 게시물에서 트루타입 폰트의 경우와 마찬가지로 NG 체계에서는 폰트를 사용할 때 그 폰트가 트루타입이냐 디바이스냐를 구분해주는 것은 필요없고 그냥 사용하고자 하는 폰트의 이름을 지정해주면 됩니다. 어쨌든 이 내용을 실행해보면 결과는 다음 그림과 같습니다.

 

 

이와 같이 디바이스 폰트인 Papyrus가 NG 체계에서도 정확히 적용된 것을 볼 수 있습니다. 그런데 디바이스 폰트를 사용하는데 있어서 DG 체계에서와 달리 NG 체계에서는 문자의 회전이나 첨자 표기 등이 모두 가능합니다. 즉 앞서 DG 체계의 예제에서는 불가능했던 부분들을 다음과 같이 적용해봅시다.

 

p = PLOT(x, y, XRANGE=[0, 90], TITLE='Title of My Plot!e11!i22', $

  XTITLE='X Data', YTITLE='Y Data', $
  FONT_NAME='Courier New', FONT_STYLE='Bold', FONT_SIZE=12, /CURRENT)

 

이와 같이 Courier New 폰트를 사용하면서 X, Y 축의 타이틀 문자 및 첨자 표기 등을 한꺼번에 적용해보면 결과는 다음 그림과 같습니다.

 

 

이 그림을 보면 Y 축 타이틀 문자의 회전 및 첨자 표기 등이 정상적으로 구현되었음을 확인할 수 있습니다. 사실 이쯤되면 왜 NG에서는 다 되는데 DG에서는 그런 핸디캡들이 존재하는가에 대한 의문이 생길 수 있습니다. 제가 기억하는 바에 의하면 DG 체계에서 하드웨어(디바이스) 폰트를 사용할 경우에는 원래 그래왔습니다. 그런데 나중에 도입된 NG 체계에서는 그러한 제약이 없어진 것으로 보입니다. 어쨌든 디바이스 폰트를 사용해보다보면 그 존재를 미처 알지못했던 특이한 폰트들도 자주 보입니다. 예를 들면 제 컴퓨터에서는 "Broadway"라는 폰트가 보이는데 실제로 적용해본 그림은 다음과 같습니다.

 

 

그리고 "Mistral"이라는 폰트도 있는데 그 모습은 다음 그림과 같습니다.

 

 

그리고 가용한 디바이스 폰트들의 목록을 보다보면 한글 폰트들도 있습니다. 제 경우도 "굴림", "HY견고딕", "휴먼옛체" 등등이 목록에 존재하는 것을 확인할 수 있었는데요. 그렇지만 이렇게 디바이스 폰트로서 존재하는 한글 폰트들은 정상적으로 적용되지는 않는 것 같습니다. 제가 테스트해본 바로는 그냥 깨진 문자들로 표시되거나 문자가 아예 표시되지 않았습니다. 따라서 그래픽 내에 한글을 삽입하는 것은 예전에 제가 관련게시물을 통하여 소개했듯이 NG 체계에서 트루타입 한글 폰트를 추가하는 방법으로만 가능하다고 보시면 됩니다.

 

디바이스 폰트를 DG 및 NG 체계에서 사용하는 방법에 관한 소개는 이 정도면 충분할 것 같습니다. 앞서 언급했듯이 디바이스 폰트의 사용에 있어서는 IDL이 구동되는 기기 및 OS 등에 따라 다른 상황이 될 수 있음을 염두에 두어야 합니다. 따라서 유저가 특정한 머신에서 혼자 작업할 경우에는 별 문제가 없겠지만, 혹시나 머신이 다른 유저들끼리 작업을 공유해야할 경우에는 사용에 있어서 신중을 기할 필요가 있습니다. 또한 사용 가능한 범위에 있어서 DG 및 NG 체계 사이의 차이가 존재한다는 것도 염두에 두어야 하겠습니다.

 

그러면 IDL의 폰트 체계에 관한 3회에 걸친 연재 게시물은 여기서 마무리하도록 하겠습니다.

LIST