%表題   らくらくDCL
%
%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%\Dchapter{カラーグラフィクス}
\Dchapterhead
\label{c:color}

いろいろな色が思う存分に使えたらグラフィクスの表現力は格段に増します.
GRPH1 の出力プリミティブはすべてカラー対応していますから, ちょっとした
プログラムの追加・変更でカラーグラフィクスが可能です.

%-----------------------------------------------------------------------
\section{カラーマップ}

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

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

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

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

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

複数のカラーマップを用意して, 利用するファイルを番号で指定することもできます.
現在利用できるカラーマップ(とその番号)は以下の通りです.
\begin{verbatim}
 01: dcl_original
 02: black-orange-yellow-white
 03: black-blue-cyan-white
 04: blue-cyan-white-yellow-red
 05: gray_scale
 06: pastel_rainbow
 07: black-rainbow-black
 08: white-yellow-red
 09: white-blue-black
 10: short_green_original
 11: black-rainbow-white
 12: pink-rainbow-pink
 13: short_green_rainbow
 14: blue-white-red
 15: Octave:jet
 16: Octave:hsv
 17: Octave:hot
 18: Octave:cool
 19: Octave:spring
 20: Octave:summer
 21: Octave:autumn
 22: Octave:winter
 23: Octave:gray
 24: Octave:bone
 25: Octave:copper
 26: Octave:pink
 27: IDV:Basic->Blues
 28: IDV:Basic->Bright38
 29: IDV:Basic->Precip
 30: IDV:Basic->Relative_humidity
 31: IDV:Basic->Temperature
 32: IDV:Basic->VisAD
 33: IDV:Basic->Wind_comps
 34: IDV:Basic->Windspeed
 35: IDV:Basic->PressureMSL
 36: IDV:Radar->ATD->ATD-Scook
 37: IDV:Radar->ATD->ATD-Reflectivity
 38: IDV:Radar->ATD->ATD-Velocity
 39: IDV:Radar->ATD->ATD-Wild
 40: IDV:Radar->DbZ
 41: IDV:Radar->DbZ(NWS)
 42: IDV:Radar->Base_Reflectivity_(24)
 43: IDV:Radar->TOPO_MDR_Composite
 44: IDV:Radar->small_colormaps
 45: IDV:Satellite->Light_Gray_scale
 46: IDV:Satellite->TOPO_Sat_Composite
 47: IDV:Satellite->Water_Vapor_(Gray)
 48: IDV:Satellite->Visible_Fog
 49: IDV:Misc->Topography_Bathymetry
 50: IDV:Misc->Topographic
 51: IDV:Misc->Topography_Bathymetry-2
 52: NCL:hotres
 53: NCL:ncview_default
 54: NCL:rainbow+white+gray
 55: NCL:rainbow
 56: NCL:WhViBlGrYeOrRe
 57: NCL:ViBlGrWhYeOrRe
 58: NCL:WhViBlGrYeOrReWh
 59: NCL:WhBlGrYeRe
 60: NCL:BlAqGrYeOrRe
 61: NCL:BlAqGrYeOrReVi200
 62: NCL:BlGrYeOrReVi200
 63: NCL:BkBlAqGrYeOrReViWh200
 64: NCL:tbrAvg1
 65: NCL:BlWhRe
 66: NCL:WhBlReWh
 67: NCL:BlRe
 68: NCL:GreenYellow
 69: NCL:helix
 70: NCL:helix1
 71: NCL:3gauss
 72: NCL:small_colormaps_1
 73: NCL:small_colormaps_2
 74: NCL:small_colormaps_3
 75: NCL:small_colormaps_4
 76: cpt-city_cb:small_colormaps_1
 77: cpt-city_cb:small_colormaps_2
 78: cpt-city_cb:small_colormaps_3
\end{verbatim}


なお, このリストは $BINDIR/dclcmap ($BINDIR については, Mkinclude 参照)
で表示できます. カラーマップの番号は, swpack が管理する内部変数
'ICLRMAP' で変更できます(デフォルトは1). たとえば, カラーマップを表示
するプログラム \$BINDIR/dclclr がありますが,

	% dclclr -sw_iclrmap=6

などとすると, 06: pastel\_rainbow のカラーマップを用います.

プログラムの中では, SGOPN を呼ぶ前に, カラーマップの番号を変更するサブ
ルーチン SGSCMN を以下のように呼びます.

	CALL SGSCMN(6)

これは, 以下と等価です. (デフォルト以外のカラーマップを利用するには,
最初に1度カラーマップのリストを SWCMLL によって読み込む必要があります.
また, SWISTX を呼んでいるので, 上記した例のように, 実行時にコマンドラ
イン等から値の変更が可能です. )

	CALL SWCMLL
	CALL SWISTX('ICLRMAP',6)

プログラムの例は

\Dproginput{color/test09.f}

を見てください.

また, カラーマップの0番目と1番目を読み変えることで, バックグラウンドと
フォアグラウンドカラーを入れ換えることができるようになりました. これは,
swpack が管理する内部変数 'LFGBG' を .true. にすることで実現できます.
(デフォルトは .false.) たとえば,

	% dclclr -sw_iclrmap=6 -sw_lfgbg=.true.

としてみてください.





\Dproginput{color/color1.f}


%-----------------------------------------------------------------------
\section{カラーライン}

ポリライン, ポリマーカー, テキストなどの線分による出力プリミティブは,
個別にラインインデクスを指定することができましたから, それぞれ, フルに
3桁の値で指定すると, カラーのライン, マーカー, テキストとなります. ま
た, GRPH2 の各パッケージも, 用いられている線分のラインインデクスに関す
る内部変数を変更できるようになっていますから, 容易にカラー化できます.
次の {\tt COLOR2} プログラムで, カラー線画の実例を見てみましょう.
\vspace{1em}

{\tt UZpGET/UZpSET} ルーチンで座標軸関連の内部変数の管理を行ないますが,
そのなかの {\tt 'INDEXT1'}, {\tt 'INDEXT2'}, {\tt 'INDEXL1'}, {\tt
'INDEXL2'} がラインインデクスの設定に関するものです. {\tt 'INDEXT1'}
と {\tt 'INDEXT2'} は座標軸および目盛を描く線分の, {\tt 'INDEXL1'} と
{\tt 'INDEXL2'} はラベルおよびタイトルの文字を描く線分のラインインデク
スを指定する内部変数です. 最後が {\tt '1'} のほうが小さめの目盛やラベ
ル, タイトルを描く時に用いられ, {\tt '2'} のほうは大きめのものを描く時
に用いられます.
\vspace{1em}

この例では, 標準のカラーマップを用いた時, 目盛は淡青で描き, 小さめの文
字は濃青で, 大きめの文字は紫で描きます. 太さは, 小さめの目盛は細線で,
それ以外はやや太くなります.
\vspace{1em}

折れ線を{\tt SGPLU} ルーチンで描くのですが, そのラインインデクスは
{\tt SGSPLI} ルーチンで 24, 赤色の太い線と指定しています.

\Dproginput{color/color2.f}


%-----------------------------------------------------------------------
\section{カラートーン}

{\tt COLOR3} プログラムはトーンプリミティブを用いたカラー塗り分けの例
です. 第\ref{s:u2d2_w}節の{\tt U2D7} プログラムではパターンだけで塗り分けていたのを,
ここでは色で塗り分けて見ましょう. {\tt DO 20} のループでトーンパターン
番号を各レベルに割り当てています. トーン番号が30999から85999までの56色
(濃青から, 緑, 黄, 橙, 赤まで)です. 下3桁を999としてべたぬりを指定して
います. コンターは引かずに, トーンバーを右側につけています. ハードフィ
ル(初期値)でぬりつぶしますから, 各ルーチンを呼ぶ順番に気をつける必要が
あります.

\Dproginput{color/color3.f}
