(Application) DCLのPSファイルのトーンを結合する2

Rubyのスクリプトではありませんが、堀之内さんから許可をいただけたので投稿いたします。

(5/22) ライセンスを決め、ソースファイルに反映させました。プログラム自体は前と同じです。

dptm2 (dclpstonemerge2) の概要

作者:野本 理裕

ソースファイル:dptm2_v100a.tar.gz

ライセンス:BSD 2-Clause

dclpstonemergeと同様に、DCLのuetoneなどで描いたPSファイルのトーンを結合します。 画面上でのトーン割れ防止・ファイルサイズ縮小・描画の高速化などの効果があります。 C言語で書かれているため、コンパイルが必要です。

1からの変更点

  • 結合アルゴリズム
    • 地図投影を含む全ての座標に対応
    • 1色をひとつの複合パスで保存。単連結でない(穴あきの)図形に切れ目を入れない
  • 複数のPSファイルを結合する、線を太くするなどの付加機能あり

使用方法

準備

gcc用のMakefileを添付していますので、それを用いてコンパイルできます。

ホームディレクトリにソースコードの圧縮ファイルを保存した場合、以下の$に続くコマンドを実行します。

$ tar zxf ~/dptm2_v100a.tar.gz
$ cd dptm2_v100a/
$ ls
LICENSE.txt  Makefile  dptm2.c  dptm2.h  dspmsg.c  files.c  flags.c  memctrl.c  misc.c  psio.c
$ make

するとディレクトリ内に実行ファイルdptm2ができます。適当な場所に移して、パスを通すなどしてください。

■ 使い方を見る

$ dptm2 -h

■ ファイルを変換してみる

DCLのデモプログラム demo/rakuraku/color/color3.f による図を変換してみます。RubyDCLでの作成例を示します(パスは適宜変えてください)。

$ ruby  ~/ruby-dcl-1.6.2/demo/rakuraku/color/color3.rb  2
 *** MESSAGE (SWDOPN) ***  GRPH1 : STARTED / IWS =  2.
 *** WARNING (STSWTR) ***  WORKSTATION VIEWPORT WAS MODIFIED.
 *** MESSAGE (SWPCLS) ***  GRPH1 : PAGE =   1 COMPLETED.
 *** MESSAGE (SWDCLS) ***  GRPH1 : TERMINATED.

これで dcl.ps ができました。

dptm2の基本的な使用方法は、引数にファイル名を書くだけです。

$ dptm2 dcl.ps
$ ls -l *.ps
-rw-r--r-- 1 user group 250959  5月 16 22:47 dcl.ps
-rw-r--r-- 1 user group  74047  5月 16 22:57 dcl_1.ps

元のファイル名に番号が付加された、dcl_1.psというファイルができます。この例ではサイズが1/3以下に減っています。

■ 複数のPSファイルを一度に変換する

$ dptm2 dcl_a.ps dcl_b.ps dcl_c.ps

複数のファイル名を指定すると(ワイルドカード可)、それぞれに上と同じ処理をします。Windowsでは、実行ファイルにドラッグ&ドロップしてもOKです。

■ 複数のPSファイルを連結する(標準入出力を使用)

$ cat dcl_a.ps dcl_b.ps dcl_c.ps | dptm2 > dcl_cat.ps

ファイル名を指定しないと、パイプラインモードで動作します。PSファイルのヘッダやフッタを調整してひとつのファイルにまとめています。単独ファイルでも、出力ファイル名を指定する場合はこのような方法を利用してください。

■ 線を太くする(オプションの例)

$ dptm2 -W dcl.ps

-Wp/qなどと数字を指定すると、y=px+qと太さを調整できます(x, yはDCLのindex)。デフォルトはy=2x+2です。

各種オプションはハイフンで始まり、ファイル名と区別されます。現在存在するオプションは以下の通りです。

  • -T : トーン結合(小文字で指定してOFFにするため)
  • -W : 線の太さ変更
  • -B : 背景の白い四角を除去
  • -L : 変換のログを表示
  • -H/-h : 使い方を表示
  • -V/-v : バージョン情報

アルゴリズム

PSファイルのコメント %%Begin SZTN 〜 %%End SZTN を単位として処理します。

  1. 全てのパスを連結リストの形で読み込む
  2. 頂点の座標でソートする(次の工程を高速化する工夫)
  3. 重なる線分を見つけたらパスを組み替える(多角形の結合)
  4. 不要な頂点を削除する
  5. 連結リストをひとつの複合パスとして書き出す

本プログラムはDCL-5.3.4.2のデモプログラムで動作確認しています。普通のdcl.psを仮定して処理しているため、dclpsfontなど他の処理を行ったものは正しく動作しない可能性があります。

既知の問題

プログラムの動作は保証できません。変換直後の絵はもちろんのこと、論文などに貼り付けた最終的な絵も正しいか確認してください。

  • 変換したPSファイルをIllustratorでEPS化してWordに貼ると、たまに穴が塗りつぶされる(発生条件不明。TeXでは発生しない様子)
  • ...

不具合があった場合、教えていただけると幸いです。(対応できるかは分かりませんが)

更新日時:2013/05/22 02:18:02
キーワード:[DCL] [PostScript] [割れ] [C言語]
参照: