SUBMENU

dviout for Windowsの印刷

基本的な仕組み

MS-DOS時代にはdvioutとdviprtという二つのソフトがありました。前者は画面表示用で、機種ごとに用意されていました。後期では一部のWindows用のグラフィックカードに対応したものもありました。dviprtはプリンタ印刷用のもので、基本的にはキヤノンとEPSONのレーザープリンタ用でした。

レーザープリンタはページプリンタとも呼ばれますが、プリンタに送る印刷データがページとして完成したときに印刷されます。それまではページのどこに何を書こうが、下から文字を書こうが好き勝手です。その他のほとんどのプリンタはラインプリンタと呼ばれ、データは行単位で送られ、行ごとに印刷されます。ページの下のほうのデータは後から送られ、すでに印刷が終わった行にあとから何かを印刷することはできません。DVIファイルはページ記述を行なう言語であり、文字配置などが上から下へと順に並んでいる保証はありません。従って、ラインプリンタに印刷するにはdviprtが内部にページのイメージを作成し、それを出力する必要があります。ここでページのイメージといっているものについて少しだけ説明をします。
説明の簡単化のために白黒だけを考えます。すると、すべての印刷物はページプリンタであろうと、ラインプリンタであろうと、結局は黒い点はどこであるかということに還元されます。300dpiのプリンタの場合、A4用紙は約20cm x 30cmほどの大きさです。つまり8in x 12inほどですから、大体2400 x 3600ほどの点で構成されています。この点の情報がページのイメージと呼ばれるものです。蛇足ですが点の個数8640000個に白か黒を表す1ビットが必要ですから1080000バイトとなり、300dpiではA4一枚の点のデータは約1Mバイトとなります。ちなみに600dpiでは4MBです。

dviout for Windowsは、場合によっては意外なようですが、dviprtを元に開発されています。しかもMS-DOS版ではなくUNIX版です。まずはこの理由から開始します。

UNIX版を用いているのは32bit化、機種非依存化を進めやすい、アセンブリ言語が用いられていないなどが理由で、ここでの本質ではありません。dviprtは実は作成したページのイメージをプリンタではなく、ディスク上の画像ファイルとして出力する機能を持っていました。画像ファイルの種類にはいくつかありますが、Windowsに対応するために最も便利なものはBMP形式と呼ばれる形式です。ディスク上に保管される形式には様々なものがありますが、Windowsが画面に画像を出力するためには最終的には前述のページイメージと同様に、各点ごとの色のデータがそのままはいっている形式でなければならず、それがBMP形式と呼ばれるものです。

dviout for Windowsは、DVIファイルに記述されている内容を翻訳して、BMP形式に変換し、それを画面に表示するためのソフトウェアです。画面表示したものは印刷にも用いられます。この両者を簡便化するために、dviout for Windowsは画面表示に対しても印刷用のページのイメージをそのまま用います。但しそれは内部に作成されるだけなのが通常であり、実際に画面に出力する前に縮小されます。その縮小のときに灰色などをうまく用いて文字がなめらかに見えるように工夫を行なっています。一般には16段階の灰色が使用されており、そのためには点1つにつき4ビットの情報が必要です。そのためデータ量が4倍に増えますが、同時に縮小もされているので、さほどメモリは必要ではありません。マウスの右クリックで表示される「拡大画面」は実は無縮小でこの内部イメージが一部分だけ切り出されているのです。

さて、ここまで準備できればdviout for Windowsが印刷を行なうのはそれほど難しいことではありません。作成してある内部イメージをそのままプリンタに出力するだけです。つまり、この時点でのdviout for Windowsの印刷機能は、画像表示ソフトがデジタルカメラの画像を印刷するのと全く同じことです。しかしあらかじめプリンタのもっている解像度に合わせてデータを作成しているので、プリンタに出力するときに荒くなってしまったりすることはありません。逆にデータの1つ1つの点とプリンタが出力できる点が1対1に対応するように出力するので、解像度がプリンタにあっていないと大きく出力されたり小さく出力されたりすることになってしまいます。

プリンタドライバ

さて、ここまでは単純なことのように見えますが、それでも1つ重大な点について説明しておかなければなりません。それはプリンタドライバと呼ばれるソフトウェアの存在です。Windowsでは、プリンタを新しく購入し、プリンタドライバを導入すると、どのソフトウェアからでも同じ操作でそのプリンタに出力することができます。これは一見すると大変不思議なことに見えます。プリンタを構成している機械を操作するための方法は各メーカによって異なり、また同一メーカであっても能力が全く違うからです。この違いを吸収するのがプリンタドライバというわけですが、一方においてソフトウェアはプリンタドライバを意識して作成されているわけではありません。

実はこれがWindowsの最も優れた点の1つだったのですが、Windowsにおいてはプリンタなどへの出力はすべてデバイス非依存(Device Independent)な形式で行なわれます。このデバイス非依存言語はWMF(Windows Meta File)と呼ばれています。ソフトウェアは印刷を行なうとき、このWMFを作成します。もっとも、実はWMFの作成自体もWindowsが代行してくれるので、ソフトウェアは画面に出力するのと全く同じことをするだけで済んでしまいますが。とにかくソフトウェアがWMFを出力すると、そのデバイス非依存言語をプリンタドライバと呼ばれるソフトウェアが各プリンタに応じた制御方式に翻訳し、それぞれのプリンタに送られるというわけです。たとえソフトウェアがあらかじめプリンタの出力できる解像度に合わせたBMPファイルを用意し、その点情報通りに印刷することを期待していたとしても、プリンタドライバがそのプリンタに応じた介入を行なうことが可能です。特に画像データはプリンタのインクの特性などに応じてかなり修正を加えなければきれいにでません。dviout for WindowsはBMPファイルを用意して出力を行なうわけですが、プリンタドライバの一般的な変更を受ける可能性があります。画像データが実は文字として読まれる文書であるということは、実際にはかなりまれなことです。そのためたとえばプリンタドライバが黒色を強調するように細工した結果文字が太く出力されてしまうという結果を生み出すような加工を行なう可能性もあるのです。当然一般的・平均的にはこの種の細工によってそのプリンタの特性に応じて最も優れた出力結果として得られることの方が多いはずですが、場合によっては意に添わない出力になることも起こりうるということです。

「dviprt機能」による印刷

dviout for WindowsではMS-DOS版のdviprtの機能がそのまま受け継がれています。これは、プリンタドライバを一切介入させず、独自にもっているプリンタそれぞれの制御方式の情報を使って、プリンタを直接制御するというものです。

ページプリンタの場合、キヤノンとEPSONについては組み込まれています。これらを使うときにはかなり特殊な動作を行ない、(和文)TrueTypeフォントのデータを一切使用せずにプリンタが内蔵している和文フォントを使ったりします。また、PKフォントのデータも可能な限り、そして最大効率になるようにプリンタにダウンロードし、あらかじめプリンタに内蔵されていたフォントのように扱います。

それ以外の場合には定義ファイル(cfgファイル)というものを用います。これはdviout for Windowsが内部に作成したページのイメージを上から順に翻訳してプリンタに送るものです。あまり意味がないように感じられることもありますが、プリンタドライバを介さないという最大の特徴があります。つまり前述したようなプリンタドライバの介入がありません。元のデータは同じものですから、dviprt機能による出力結果と、Windowsによる出力結果が食い違った場合には、プリンタドライバによる介入によってそうなったということです。たとえば、文字が太く出力されるなどの現象が典型的です。但し、現在ではこのモードで印刷されることはやや少ないので、短絡的に結論を出すのは危険です。

カラー出力の問題点

ここで少し話が脱線するように見えますが、実は以降の説明にとって欠くことのできない機能について説明をしておきます。それは、カラー出力です。カラー画像を出力することはもちろん、文字に色を付けるということも同じことです。

前述したように、dviout for Windowsは内部においてプリンタに出力するデータをそのまま確保しています。A4用紙の場合、白黒では約1MBが必要だったということも述べました。さて、これが1677万色(自然色)というようなカラーに拡張されたときに何が起こるか考えてみましょう。1677万色の色の情報を保持するためには1つの点につき24ビット(3バイト)の情報が必要ですが、実は種々の理由から32ビット(4バイト)が必要です。つまり、必要となるデータ量は32倍になります。内部に確保するページのイメージはもちろん、縮小した画面表示用のイメージでも同じです。

現在ではA4用紙1枚につき32MBというデータ量をさほど大きいと感じない人もいるかもしれません。600dpiだった場合にはこれは4倍に増えますので約128MBということですが、これでも自分のコンピュータは耐えられるという人もいるでしょう。たとえコンピュータに256MBのメモリが載っていて耐えられる人であっても、データ量が増えるということはそれだけ処理内容も増えるということですから速度も激しく低下します。誰でもが思うようにこれは大変無駄なことです。

そこで、dvioutではカラーが必要な場所は、内部に持っているページイメージには追加しないことになりました。ページイメージを作成するとき、色が付いていると、その場所をとばして白紙のままにしておきます。そして、別の記憶領域にその部分だけ作成します。そうして実際に画面に出力するときにはそれを合成します。これによる問題点はもちろん、画面表示という縮小された状態では、縮小時の丸め誤差が存在するということです。あとで合成するときに最大で1ドット、上下にずれることがあります。しかしそれは画面表示の縮小時だけに起こる問題です。

では、印刷のときにはどうするのでしょうか。やはり色の付いた部分をとばして作成したBMPを印刷するように指示します。しかしそこで印刷のデータ終了とするのではなく、カラーの部分をさらに出力するように順に指示していきます。こうしてプリンタドライバがそれを合成して出力するように依頼するというわけです。

色つきの文字ではなくて画像の場合も大体同じです。白黒の画像の場合(またはカラー画像でも白黒で出力するよう指示した場合)、dviout for Windowsはそれを最初のページイメージに埋め込んでしまいます。カラー画像の場合はそうはいきませんから、やはり合成の手法を用いるというわけです。しかしカラー画像の場合には縮小だけで大変な処理量となるおそれがあるので、EPSの場合には縮小したイメージを最初に作ってしまいます。そして、右クリックによる拡大表示の場合にはその縮小されたイメージを拡大して表示するというわけです。

いずれにせよ、右クリックによる拡大表示のときには、カラー部分において特殊な追加処理が必要となるので、特にルーペウィンドウを移動させた場合などで若干動作がもたつくように感じられるときがあります。

パッチモードの導入

上述したカラー出力ができるようになると、すぐに白黒の印刷においても特殊な処理を可能とすることが可能であることが判明しました。実は通常の文書では、黒い部分というのは非常に少なく、平均5%ともいわれています。いったんBMP画像に変更して、そのBMPファイルを出力するように指示したとしますと、余白など全くの白の部分まで印刷するように指示するのと同じことです。プリンタドライバによっては白色であって印刷する必要のないことを認識するでしょうが、そうでないかもしれません。プリンタへデータを送信するというのはさほど高速なものではありませんから、ここに無駄が発生している可能性があります。

そこで、カラー印刷のときにカラー文字をあとから合成して出力したことを、黒色の文字に対しても適用するというアイディアが登場しました。最初抜けているところにあとから貼り込むというので、この印刷を行なう特殊なモードをパッチモードと呼んでいます。パッチワークといって、小さな布を張り合わせて作るものがありますが、それを想像すれば雰囲気がつかめると思います。

パッチモードでもそれぞれの文字を取り囲む四角形を大量に白紙に貼っていく作業ですから、実際のデータ量はさほど減りません。簡単なテストを行なった結果は下のようになりました。

normal patch
EPSON LP-8200PS2 (600dpi) 374KB 329KB
EPSON PM-700C (360dpi) 97KB 225KB

意外なことに、PM-700Cというカラーインクジェットプリンタではデータ量が増大するという結果になりました。これは、想像ですが、PM-700Cは写真などのデータが印刷されることが多いことを想定して、画像として印刷される場合にはデータを圧縮する機構が備わっているのだと思われます。一方パッチモードではデータは数多くの小片に分離され、それを合成していますので、圧縮の機構が使えないのだろうと想像されます。

LP-8200PS2というPostScriptレーザープリンタでは確かに減少しましたが、必ずしもデータ量を減らせるわけではなかったため、この方式は実際にはそれほど優れた方式とはいえませんでしたが、次に述べるモードを実装することにつながりました。

パッチ2モード

これはパッチモードをさらに改良したものです。パッチモードではあくまでも文字単位で画像を小片に分け、それを合成して出力していました。しかし、Windowsでは、Windowsが直接扱える形式に限って、文字を印刷する機能が備わっています。もちろんどのような方式であれ、最終的には百万もの点にどのように色を付けるかという情報にまで還元されて初めて印刷できるわけです。しかしながら、TrueTypeフォントを出力せよという指示は、WMFになってもまだそのままです。従って、プリンタドライバは印刷しようとしているのが画像ではなく文字であるということを認識することができます。そのため、プリンタに応じて文字を印刷するのに特化した機能を使うことができるかもしれません。

パッチ2モードでは、パッチモードと同様に文字を小片に分け、白紙上にそれをちりばめていくというようなデータ形成方式をとりますが、その小片はdviout for Windowsが作成するのではなく、Windowsのフォント出力機構を用いて文字を出力するように指示します。今までの方式では、dviout for WindowsはやはりWindowsのフォント出力機構を利用するのですが、画面表示をさせるのではなく、字形データだけを取得し、その描画はBMP形式を作成することでdviout for Windows自身が行なっていました。そのため、それを加工し、縮小などの細工を行なえたわけです。パッチ2モードではそのようなことはできません。

しかし、ある場所にある文字をおき、また別の場所に別の文字をおいてページを構成していくというような作業は、通常のワープロソフトなどが行なっている作業です。そのため、プリンタドライバはそのような文書に対してよく最適化されています。従って、印刷速度の大幅な向上が望めます。現代の多くのプリンタはそのような文書に対して特別高速に動作できるように細工してあるからです。

もちろん、TrueTypeフォントとして用意されていない文字についてはパッチモードとなりますので、プリンタドライバから見れば画像データがたくさん埋め込まれた文書に見えます。そのため、パッチ2モードで最大に高速化を図りたければ、すべての文字がTrueTypeフォントとして用意されている必要があります。また印刷結果も、画像に対しては特別な細工が行なわれることがあるので、PKフォント(画像として出力される)とTrueTypeフォントでは文字の太さが異なって出力されるなどのことがあります。

設定の場所

さて今まで述べてきたことは、dviout for Windowsのプロパティシートにおいて、[Graphic]-[Color specials]で行ないます。この理由はここに述べたように、この出力方式の違いはすべて、色つきの文字をどのようにして扱うかということの応用としてできているからです。ややわかりづらい設定方式ですが、アイディア自体が「黒い文字も色つきとして扱う」ということに根ざすのでそうなっています。

参考リンク

TrueTypeフォントを用いた印刷