12.1 カラーマップ

GRPH1 の出力プリミティブのうち, トーンプリミティブ以外はすべて線分で構 成されています. 線分の属性のうち, ラインインデクスには色の情報が含まれ ています. また, トーンプリミティブには, トーンパターン番号という属性が あり, やはり色の情報が含まれています.

GRPH1 で描かれる線分のラインインデクスは3桁の整数(nnm)で指定します. 線の太さと色の両方が変えられるようなシステムでは, 上位2桁 (nn=0〜99)が色番号, 下位1桁(m=0〜9)が線の太さを表します. (こ れまでの章では, 下位1桁だけを使ってきました.) 色番号は, 1から5までは標 準的に, 1: 白または黒(フォアグラウンド), 2: 赤, 3: 緑, 4: 青, 5: 黄, と決められていますが, それより大きな番号に関しては カラーマップファイ ルの定義によります.

カラーマップファイルとは, 色番号と実際の色を対応づけるデータファイルで あって, 内部変数 'CLRMAP' が示すファイルです. 標準的なライブラリ においては, X 用として .x11, PS 用として .psx のサフィック スをつけると, それらが優先的に検索されます. 色はRGBの強さで指定されて おり, それらの値の範囲は0から65535(16bit)です. 機種によってはこれだけ の階調が表現できない場合もありますが, 適当な階調に読み変えますから, 異 なるシステムでもこのファイルはそのまま有効です.

トーンパターン番号には色の情報とパターンの情報が両方含まれており, 5桁 の整数(nnlll)で指定します. 上位2桁が上に述べた色番号, 下位3桁がパター ン番号です. パターン番号は第3.5節で説明しましたが, パター ン番号として999を指定するとべたぬりとなります.

次の COLOR1 プログラムは, カラーマップのサンプルテーブルを作るプ ログラムです. 38行めでトーンパターン番号を代入していますように, 100色 を描き出します. このように1つの作図では高々100色しかつかえませんが, カ ラーマップファイルを取り替えるとさまざまな色が使えます. dcl-x.x/demo/grph2/rakuraku/color/ にも何種類かのカラーマップファイル を置いています. これをカレントディレクトリにコピーしてカラー描画の実行 ファイルを実行すると, コピーしたカラーマップが使われるようになります. 例えば, それぞれのRGBの値を大きめにシフトさせるとパステルカラー調のカ ラーマップとなります.

      PROGRAM COLOR1

      PARAMETER( NP=4, NT=10 )
      PARAMETER( DD=0.07, DS=0.003 )
      PARAMETER( DX=DD+DS*2, DY=1.0/NT )

      REAL      XBOX(NP), YBOX(NP)
      CHARACTER CHR*5

      DATA      XBOX/ 0., 1., 1., 0. /
      DATA      YBOX/ 0., 0., 1., 1. /

      WRITE(*,*) ' WORKSTATION ID (I) ? ; '
      CALL SGPWSN
      READ (*,*) IWS

      CALL GLISET( 'MAXMSG', 300 )

      CALL SGOPN( -ABS(IWS) )

      CALL SGLSET( 'LFULL' , .TRUE. )
      CALL SLRAT( 0.85, 1. )
      CALL SLMGN( 0., 0., 0.05, 0.1 )
      CALL SLSTTL( 'TEST OF COLORMAP', 'T', 0., -0.5, 0.025, 1 )

      CALL SGFRM
      CALL SGSWND( 0., 1., 0., 1. )
      CALL SGSTRN( 1 )

      CALL SGSTXS( 0.01 )
      CALL SGSTXC( 1 )
      DO 10 J=0,9
      DO 10 I=0,9
        X1 = DX*I     + DS + (1-DX*NT)/2
        Y1 = DY*(9-J) + DS
        X2 = X1 + DD
        Y2 = Y1 + DD
        ITPAT = (I+J*10)*1000 + 999

        CALL SGSVPT( X1, X2, Y1, Y2 )
        CALL SGSTRF

        CALL SLPVPR( 1 )
        CALL SGSTNP( ITPAT )
        CALL SGTNU( NP, XBOX, YBOX )
        WRITE(CHR,'(I5)') ITPAT
        CALL SGTXV( X2, Y2+(DY-DD)/2, CHR )
   10 CONTINUE

        CALL SGCLS

        END
PROGRAM COLOR1