以下、本発明における一実施形態について図面を参照して詳細に説明する。
[本実施形態の概要]
本実施形態では、PDLとしてSVG 1.1を使用する。SVG 1.1の仕様はSVG 1.1 Specification(http://www.w3.org/TR/SVG11/)に示されている。ユーザPC(クライアント)において、 SVG(Scaleable Vector Graphic)文書ファイルをインタプリタが中間コードデータに変換する。続いて、レンダラーが中間コードデータをビットマップデータに変換するが、この際、レンダリング前カラーマッチングとレンダリング後カラーマッチングの精度を測定し、精度の高いほうを選択する。この選択結果は保存しておいて、本レンダリングセッションに限らず以降のレンダリングで使用できるようにする。プリンタはビットマップデータを使用して出力を行ない、印刷結果を得る。
[全体構成]
まず、図1を参照して本実施形態の全体構成を説明する。
101はユーザが操作を行なうクライアントPCであり、ネットワークインタフェースを経由してネットワーク103に接続されている。102はネットワーク経由で印刷指示を受け付けるプリンタであり、同じくネットワークインタフェースを経由してネットワーク103に接続されている。PC101はネットワーク103を通じてプリンタ102に印刷指示を送信することが可能である。
[コンピュータ装置およびプリンタの構成]
次に、図2と図3を参照して、本実施形態で使用するコンピュータ装置およびプリンタの構成について説明する。
図2は、クライアント101の構成の一例を示すブロック図である。201はRAM202に格納されている制御プログラムに従って本装置全体の制御を行なうCPUである。202はCPU201が実行する本装置の制御プログラムや、文書画像等のデータを格納するRAM等の内部記憶部である。203はCPU201の制御の下にネットワークとの接続を行なってデータ等を送受信するネットワークインタフェースである。204はデータを保存する磁気ディスク等の外部記憶装置である。205はディスプレイ、206はキーボード、207はマウス等のポインティングデバイスである。RAM202に格納されているプログラムは、同じくRAM202に格納されているOS(Operating System)の機能を必要に応じて使用し、RAM202に一時記憶するデータの内容を読み書きしたり、外部記憶装置 204上でデータを読み書きしたり、ネットワークインタフェースを通じてデータの送受信を行なったり、キーボード206やポインティングデバイス207からの入力を受け取ったり、ディスプレイ205に表示を行なったりすることで、所定の動作を行なう。
図3は、プリンタ102の構成の一例を示すブロック図である。208、209、210、211は図2の201、202、203、204に示したのと同じくそれぞれCPU、RAM、ネットワークインタフェース、外部記憶装置である。212は印刷を行なうプリンタエンジンである。RAM209に格納されているプログラムは、ネットワークインタフェース210を通じて受信した印刷指示にしたがって、プリンタエンジン212を制御して印刷を行なう。その際、RAM209に一時記憶するデータの内容を読み書きしたり、外部記憶装置211上でデータを読み書きしたりすることができる。
[全体のブロック図]
次に、図4を参照して、本実施形態で使用するコンピュータ装置内のブロック構成について説明する。
図4は、物理的に図1のような構成を取るクライアント101、プリンタ102、ネットワーク103において、本実施形態の動作に主として関わる論理ブロック、すなわちプログラムモジュール、ファイルエンティティ、メモリデータ、および通信経路の構成を示すブロック図である。
301はクライアント101のブロック境界を表わし、ここではOSの制御下にある環境を指す。インタプリタ309、レンダラー310、CMM(Color Management Module)311は、通常は外部記憶装置204に保存されているが、ユーザ、OS、あるいは別のプログラムから実行が指示されると、OSの制御によりRAM202に読み込まれ、実行可能な状態となる。302は外部記憶装置204に保存されているSVG文書ファイルであり、インタプリタ309を含むプログラムはOSの機能を利用してSVG文書ファイル302の内容を読み書きすることが可能である。
303はRAM202に格納される中間コードデータであり、インタプリタ309、レンダラー310を含むプログラムは同じくOSの機能を利用して中間コードデータ303の内容を読み書きすることが可能である。304はRAM202に格納されるビットマップデータであり、レンダラー310を含むプログラムは同じくOSの機能を利用してビットマップデータ304の内容を読み書きすることが可能である。
インタプリタ309はSVG文書ファイル302から中間コードデータ303への変換を行なうが、この変換動作は両言語の仕様から機械的に決定できるものである。したがって、本実施形態ではインタプリタ309の動作について詳述はせず、変換内容の提示のみ行なう。レンダラーは中間コードデータ303からビットマップデータ304を作成し、ネットワーク103を経由してプリンタ313のコントローラ314に送信する。この際、カラーマッチングのためにCMM311の機能を利用する。
CMM311は必要なカラーマッチングを行なうため、SVG文書ファイル302および中間コードデータ303の入力カラースペースを表わす入力プロファイル305、レンダラー310のレンダリングカラースペースを表わすレンダリングプロファイル306、プリンタ313のデバイスカラースペースを表わすプリンタプロファイル307、カラーマッチング時のマッチング方法を指定するレンダリングインテント308を入力として使用する。
CMMは通常OSの一部あるいはOSによって利用可能なライブラリとして提供され、プログラムからはその機能を利用するのみであるので、本実施形態ではCMM311の動作について詳述はせず、その機能と利用例のみ示す。312は外部記憶装置204上にデータベースプログラム(図示しない)が構成した検証結果DBである。レンダラー310を含むプログラムはデータベースドライバ(図示しない)の機能を利用して、検証結果DB312の内容を読み書き可能である。
313はプリンタ102のブロック境界を表わす。コントローラ314はRAM209に格納され、常に実行可能な状態にあるプログラムである。コントローラ314はネットワークインタフェース210を通じてレンダラー310からビットマップデータ304を受信すると、RAM209にビットマップデータ315として格納し、その情報にしたがってプリンタエンジン212を制御して印刷を行なう。
[SVG文書ファイル]
次に、図5〜図6を参照して、本実施形態で使用するSVG文書ファイルについて説明する。
図5は、本実施形態で使用するSVG文書ファイル302の内容を示す図である。
1行目はXML宣言(XML Declaration)であり、本SVG文書ファイルがXML 1.0仕様にしたがって記述されていることを示す。
2〜3行目は文書型宣言(Document Type Declaration)であり、外部サブセットとしてSVG 1.1の文書型定義(Document Type Definition;DTD)を参照している。
4〜5行目はルート要素としての <svg> 要素の開始タグである。<svg> 要素の幅・高さとしてそれぞれ21.0cmと29.7cm(A4サイズ)、ユーザ座標系として(0、0)−(210、297)を指定しているほか、SVG名前空間と、準拠するSVGのバージョン番号を指定している。
6行目は <desc> 要素であり、本SVG文書ファイルについての説明を記述する。<desc> 要素の内容はSVG文書のレンダリングには使用されない。
7、10、13行目はコメント要素である。コメント要素の内容もSVG文書のレンダリングには使用されない。
8〜9行目は一つ目の円をレンダリングするための<circle>要素である。中心座標の値はユーザ座標系において(80、80)を指定し、半径の値はユーザ座標系において50を指定している。円内部の塗りつぶしの色は“yellow”(黄色)で不透明度(アルファ値)が0.7、円の外形線の色は“blue”(青色)、外形線の幅はユーザ座標系において2と指定している。
11〜12行目は二つ目の円をレンダリングするための<circle>要素である。中心座標の値はユーザ座標系において(140、80)を指定し、半径の値はユーザ座標系において50を指定している。円内部の塗りつぶしの色は“red”(赤色)で不透明度(アルファ値)が0.5、円の外形線の色は“blue”(青色)、外形線の幅はユーザ座標系において2と指定している。
14〜15行目は三つ目の円をレンダリングするための<circle>要素である。中心座標の値はユーザ座標系において(110、130)を指定し、半径の値はユーザ座標系において50を指定している。円内部の塗りつぶしの色は“green”(緑色)で不透明度(アルファ値)が0.3、円の外形線の色は“blue”(青色)、外形線の幅はユーザ座標系において2と指定している。
16行目はルート要素としての<svg>要素の終了タグであり、4〜5行目の開始タグに対応するものである。
図5に示したSVG文書ファイルをレンダリングした例を図6に示す。501が8〜9行目の<circle> 要に対応する一つ目の円、502が11〜12行目の<circle>要素に対応する二つ目の円、503が14〜15行目の<circle>要素に対応する三つ目の円である。504はSVG文書全体の外接矩形を示している。外接矩形504のサイズは幅21.0cm、高さ29.7cmである。縦横の破線、破線交点の円、破線交点付近の座標値表示は、ポイントとなる座標の座標値を図示するためのものであり、実際のレンダリングには含まれない。
[中間コード]
次に、図7〜8を参照して、本実施形態で使用する中間コードについて説明する。
図7は、本実施形態で使用する中間コードの仕様を示す図である。
601はレンダリング命令を表わすオペコードであり、数字で指定する。本実施形態では9種類のオペコードを定義している。オペコードは1バイト整数として中間コードデータ303に格納される。
602はオペコードを人間が識別しやすくするためのニーモニックである。ニーモニックは中間コードの内容をダンプして示すような場合にのみ使用し、中間コードデータ303には含まれない。
603はオペコードに対する引数を表わすオペランドである。オペランドの数とその意味はオペコードによって異なる。オペランドは2バイト浮動小数点数として中間コードデータ303に格納される。
本実施形態で使用する中間コードでは、単位系としてmmのみを使用する。オペランドに座標や長さを指定する場合は、すべてmmに換算した値を指定する。座標値はページ左上を原点とする絶対値で表わす。オペランドに色を指定する場合はRGB(赤・緑・青)あるいはRGBA(赤・緑・青・アルファ値)で表わし、R(赤)、G(緑)、B(青)、A(アルファ値)の値をそれぞれ0.0〜1.0の範囲で指定する。RGBによる色の指定では、アルファ値を1.0として扱う。
オペコード0(ニーモニックPageStart)はページの開始を表わす。オペランドはページの幅W(mm)とページの高さH(mm)である。
オペコード1(ニーモニックPageEnd)はページの終了を表わす。オペランドはない。
オペコード2(ニーモニックFill)は塗りつぶしの色の指定である。Fillで指定する塗りつぶしは以降のレンダリング命令すべてに適用される。オペランドは塗りつぶしの色RGBAである。
オペコード3(ニーモニックStroke)は外形線の指定である。Strokeで指定する外形線は以降のレンダリング命令すべてに適用される。オペランドは外形線の色RGBと、外形線の幅W(mm)である。本実施形態では外形線の色を暗黙的にアルファ値1.0とする。
オペコード4(ニーモニックPathStart)はパスの開始を表わす。オペランドはない。
オペコード5(ニーモニックPathEnd)はパスの終了を表わす。オペランドはクローズフラグFであり、“1”が指定された場合はパスの終了位置から開始位置まで直線をレンダリングすることで、パスを閉じることを表わす。“0”が指定された場合は何もしない。
オペコード6(ニーモニックPathMoveTo)はパスのレンダリング位置の移動を表わす。PathStart命令とPathEnd命令の間でのみ有効である。PathMoveToはレンダリング位置を移動するだけで、実際のレンダリングは行なわない。オペランドは移動位置座標をX(横方向)(mm)とY(縦方向)(mm)の値で指定する。
オペコード7(ニーモニックPathLineTo)はパスの現在位置からオペランドで指定された位置まで直線をレンダリングする。PathStart命令とPathEnd命令の間でのみ有効である。オペランドは直線終端座標をX(横方向)(mm)とY(縦方向)(mm)の値で指定する。
オペコード8(ニーモニックPathArc)はパスの現在位置から円弧をレンダリングする。PathStart命令とPathEnd命令の間でのみ有効である。PathArcは常に時計回り方向に円弧をレンダリングする。オペランドは円弧中心座標のX(横方向)(mm)とY(縦方向)(mm)の値、および、円弧の長さ(角度D(°)で指定する)である。
図8は、図5に示した内容のSVG文書ファイル302をインタプリタ309が変換した中間コードデータ303の内容を示す図である。中間コードデータ303は1バイト整数のオペコードと2バイト浮動小数点数のオペランドのみが格納されたバイナリデータであるが、図8に示すのはそれを人間が識別しやすくするためにダンプ表示し、ニーモニックも付記したものである。
1行目はページ開始命令で、オペランドでページの幅と高さを210.0mmと297.0mmに指定している。図5の<svg>要素の開始タグに相当し、長さ指定をcmからmmに換算している。
2行目は以降のレンダリングに使用する塗りつぶし命令で、オペランドで塗りつぶしの色を黄色・アルファ値0.7、すなわち(R,G,B,A)=(1.0,1.0,0.0,0.7)に指定している。図5の一つ目の<circle>要素のfillおよびfill−opacity属性に相当し、文字列表記の色指定と数値表記の不透明度からRGBA表記に変換している。
3行目は以降のレンダリングに使用する外形線命令で、オペランドで外形線の色を青色、すなわち(R,G,B)=(0.0,0.0,1.0)に指定し、線幅を2.0mmに指定している。図5の三つの<circle>要素のstroke属性およびstroke−width属性に相当し、文字列表記の色指定からRGB表記に変換するとともに、長さ指定をユーザ座標系からmmに換算している。
4〜7行目は円のレンダリングを行なう命令群である。5行目のレンダリング位置移動命令および6行目の円弧レンダリング命令によって、座標(80.0mm,80.0mm)を中心とし、座標(80.0mm,30.0mm)から始まる、角度360.0度の円がレンダリングされる。円内部は2行目の命令により黄色・アルファ値0.7で塗りつぶされ、外形線は3行目の命令により青色かつ線幅2mmでレンダリングされる。図5の一つ目の<circle>要素および図6のレンダリング結果501に相当し、座標指定や長さ指定をユーザ座標系からmmに換算している。
8行目は以降の塗りつぶしに使用する塗りつぶし命令で、オペランドで塗りつぶしの色を赤色・アルファ値0.5、すなわち(R,G,B,A)=(1.0,0.0,0.0,0.5)に指定している。図5の二つ目の<circle>要素のfillおよびfill−opacity属性に相当し、文字列表記の色指定と数値表記の不透明度からRGBA表記に変換している。
9〜12行目は円のレンダリングを行なう命令群である。10行目のレンダリング位置移動命令および11行目の円弧レンダリング命令によって、座標(140.0mm,80.0mm)を中心とし、座標(140.0mm,30.0mm)から始まる、角度360.0度の円がレンダリングされる。円内部は8行目の命令により赤色・アルファ値0.5で塗りつぶされ、外形線は3行目の命令により青色かつ線幅2mmでレンダリングされる。図5の二つ目の<circle>要素および図6のレンダリング結果502に相当し、座標指定や長さ指定をユーザ座標系からmmに換算している。
13行目は以降の塗りつぶしに使用する塗りつぶし命令で、オペランドで塗りつぶしの色を緑色・アルファ値0.3、すなわち(R,G,B,A)=(0.0,1.0,0.0,0.3)に指定している。図5の三つ目の<circle>要素のfillおよびfill−opacity属性に相当し、文字列表記の色指定と数値表記の不透明度からRGBA表記に変換している。
14〜17行目は円のレンダリングを行なう命令群である。15行目のレンダリング位置移動命令および16行目の円弧レンダリング命令によって、座標(110.0mm,130.0mm)を中心とし、座標(110.0mm,80.0mm)から始まる、角度360.0度の円がレンダリングされる。円内部は13行目の命令により緑色・アルファ値0.3で塗りつぶされ、外形線は3行目の命令により青色かつ線幅2mmでレンダリングされる。図5の三つ目の<circle>要素および図6のレンダリング結果503に相当し、座標指定や長さ指定をユーザ座標系からmmに換算している。
[レンダラーの動作概要]
次に、図9〜図10を参照して、レンダラー310の動作の概要について説明する。
図9〜図10はレンダラー310が中間コードデータ303をレンダリングしてビットマップデータ304を作成し、プリンタ313のコントローラ314に送信する動作を示すフローチャートである。
ステップS801は動作の開始である。
ステップS802は変数の初期化処理である。SVG文書ファイル302を変換した中間コードデータ303を変数dlcに読み込む。fillはレンダリング命令に適用される塗りつぶしに使用する色を保持する変数で、(r,g,b,a)はRGBA表記の色の各要素を表わす。初期値は(1.0,1.0,1.0,1.0)、すなわち完全不透明(アルファ値1.0)の白色である。strokeはレンダリング命令に適用される外形線に使用する色と線幅を保持する変数で、(r,g,b,w)はRGA表記の色の各要素と線幅(ピクセル)を表わす。初期値は(0.0,0.0,0.0,1)、すなわち黒色・線幅1ピクセルである。
ステップS803は中間コードデータdlcから次のオペコードとオペランドを取得する処理である。取得したオペコードとオペランドをそれぞれ変数opとoperandに格納する。
ステップS804、S806、S809、S811、S813、S816、S821、S823、S825は、オペコードopの種別を判定し、それぞれのオペコードに応じて適切な処理を行なえるようにしている。
ステップS804でオペコードopが0(ニーモニックPageStart)であればステップS805に進む。それ以外の場合はステップS806に進む。
ステップS805はビットマップデータ304を格納するための変数bmpの準備処理である。ここでbmpの要素wはビットマップデータの幅(ピクセル)を表わす。オペランドoperandのページ幅W(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度resを乗算する。bmpの要素hはビットマップデータの高さ(ピクセル)を表わす。オペランドoperandのページの高さH(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度resを乗算する。bmpの要素resはプリンタ313の出力解像度をPPM(Pixels Per Millimeter)で表わす。
bmpの要素data[]はビットマップデータを格納する配列で、大きさは横w(ピクセル),縦h(ピクセル)である。data[]の各要素(r,g,b,a)は各ピクセルの色をRGBA表記で表わす。data[]の各要素の値は現在のfillの値、すなわち完全不透明(アルファ値1.0)の白色で初期化される。bmpの要素pre_or_post[]はビットマップの各ピクセルに対して、レンダリング前カラーマッチングを行なったか、レンダリング後カラーマッチングを行なったかを格納する配列で、大きさは配列data[]と同じである。レンダリング前カラーマッチングを行なった場合は値としてpreを保持し、レンダリング後カラーマッチングを行なった場合は値としてpostを保持する。初期値はpostである。処理が終了すればステップS803に戻る。
ステップS806でオペコードopが1(ニーモニックPageEnd)であればステップS807でプリンタ出力の定義済み処理を呼び出し、ステップS808で終了する。それ以外の場合はステップS809に進む。なお、プリンタ出力の定義済み処理については図14を参照して後述する。
ステップS809でオペコードopが2(ニーモニックFill)であればステップS810に進む。それ以外の場合はステップS811に進む。
ステップS810は変数fillの更新処理である。オペランドoperandで指定された色(R,G,B,A)を変数fillの各要素(r,g,b,a)に格納する。処理が終了すればステップS803に戻る。
ステップS811でオペコードopが3(ニーモニックStroke)であればステップS812に進む。それ以外の場合はステップS813に進む。
ステップS812は変数strokeの更新処理である。オペランドoperandで指定された色(R,G,B)と線幅(W)を変数strokeの各要素(r,g,b,w)に格納する。この際、オペランドの単位系(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度bmp.resを乗算する。処理が終了すればステップS803に戻る。
ステップS813でオペコードopが4(ニーモニックPathStart)であればステップS814に進む。それ以外の場合はS815からステップS816に進む。
ステップS814はパスレンダリング用の変数path[]とcursorの準備処理である。path[]はパスの座標値を格納する配列である。path[]の各要素(x,y)はピクセル単位で表わした座標値である。cursorはパスの現在のレンダリング位置を格納する変数で、要素(x,y)は同じくピクセルで表わした座標値である。処理が終了すればステップS803に戻る。
ステップS816でオペコードopが5(ニーモニックPathEnd)であればステップS817に進む。それ以外の場合はステップS821に進む。
ステップS817はオペランドoperandが1かどうかの判定処理である。1であればステップS818に進み、それ以外の場合はステップS819に進む。
ステップS818は閉パスのレンダリング処理である。変数dlcの現在の読み込み位置に、オペコード7(ニーモニックPathLineTo)を挿入する。オペランドは現在のパスの開始位置であるpath[0]であるが、ビットマップの単位系(ピクセル)からオペランドの単位系(mm)に変換するために、出力解像度bmp.resで除算する。また、再度パスの終了処理を行なうため、オペコード5(ニーモニックPathEnd)も挿入する。今度は閉パスのレンダリング処理は必要ないので、オペランドは0とする。処理が終了すればS827からステップS803に戻る。
ステップS819はパスの塗りつぶしが必要かどうかを判定する処理である。パスの現在のレンダリング位置を表わす変数cursorの値と、パスの開始位置である変数path[0] の値とを比較し、等しければ閉パスなので塗りつぶしが必要であると判定し、ステップS820に進む。それ以外の場合はS827からステップS803に戻る。
ステップS820はパスの塗りつぶしの定義済み処理を呼び出す処理である。このパスの塗りつぶしの定義済み処理については図11を参照して後述する。
ステップS821でオペコードopが6(ニーモニックPathMoveTo)であればステップS822に進む。それ以外の場合はステップS823に進む。
ステップS822はパスの現在のレンダリング位置を表わす変数の更新処理である。オペランドoperandで指定された座標値(X,Y)を変数cursorの各要素(x,y)に格納する。この際、オペランドの単位系(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度bmp.resを乗算する。処理が終了すればS827からステップS803に戻る。
ステップS823でオペコードopが7(ニーモニックPathLineTo)であればステップS824に進む。それ以外の場合はステップS825に進む。
ステップS824はビットマップデータbmpに直線をレンダリングする処理である。開始点はパスの現在のレンダリング位置であるcursor(x,y)である。終了点はオペランドoperandで指定された座標値(X, Y)であるが、オペランドの単位系(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度bmp.resを乗算する。外形線は変数strokeの色(RGB)と線幅(ピクセル)を使用する。レンダリングした直線の各座標値(ピクセル)を変数path[] に追加し、最後に追加した座標値(直線終了点)を変数cursorに格納する。処理が終了すればS827からステップS803に戻る。
ステップS825でオペコードopが8(ニーモニックPathArcTo)であればステップS826に進む。それ以外の場合は図7に示した中間コード仕様に存在しないので、処理をスキップしてS827からステップS803に戻る。
ステップS826はビットマップデータbmpに円弧をレンダリングする処理である。開始点はパスの現在のレンダリング位置であるcursor(x,y)である。中心点はオペランドoperandで指定された座標値(X, Y)であるが、オペランドの単位系(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度bmp.resを乗算する。角度はオペランドoperandで指定された角度D(°)である。外形線は変数strokeの色(RGB)と線幅(ピクセル)を使用する。レンダリングした円弧の各座標値(ピクセル)を変数path[]に追加し、最後に追加した座標値を変数cursorに格納する。処理が終了すればS827からステップS803に戻る。
レンダラー310の動作の一例については図8および図15、図16を参照して後述する。
[パスの塗りつぶし]
次に、図11を参照して、パス塗りつぶしの動作について説明する。
図11は、パスの塗りつぶしを行なう定義済み処理の動作を示すフローチャートである。本定義済み処理は図9に示すフローチャートのステップS820から呼び出される。
ステップS901はパス塗りつぶし動作の開始である。bmp、path、fillは本定義済み処理呼び出し時の引数である。引数bmpは、図9〜図10において、ステップS805で初期化し、ステップS820、S824、S826で更新した変数bmpと同じ値を有する。引数pathは、図9〜図10において、ステップS814で初期化し、ステップS824およびステップS825で更新した変数pathと同じ値を有する。引数fillは、図9〜図10において、ステップS802で初期化し、ステップS810で更新した変数fillと同じ値を有する。
ステップS902は変数の初期化処理である。coordはビットマップデータbmp.data[]を左上から右下に向かってスキャンする際の座標値を保持する変数で、(x,y)はピクセル単位の座標値を表わす。初期値は(0,0)で、ビットマップデータbmp.dataの左上を表わす。図11に示したフローチャートは変数coordをループ変数とするループ処理になっている。
ステップS903は変数coordが表わす座標値が変数pathが表わすパス内かどうかを判定する処理である。ステップS819で変数pathが閉パスと判断された場合のみステップS820で本処理が呼び出されるので、変数pathが表わすパスは必ず閉パスであり、任意の座標値についてパス内かどうかを判定することができる。パス内と判定された場合はステップS904に進む。パス内でない場合はステップS908に進む。
ステップS904は変数fillが表わす色のアルファ値が1.0(完全不透明)かどうかを判定する処理である。アルファ値が1.0(完全不透明)であればアルファブレンドは必要ないと判断し、ステップS905に進む。アルファ値が1.0以外(透明)であればアルファブレンドの必要があると判断し、ステップS907に進む。
ステップS905は変数fillのアルファ値が1.0(完全不透明)の場合の塗りつぶし処理である。アルファブレンドは必要ないので、ビットマップデータbmp.data[]の座標位置coordの色を、変数fillが表わす色で置き換える。
ステップS906は変数fillのアルファ値が1.0以外(透明)の場合に、アルファブレンドの定義済み処理を呼び出す処理である。アルファブレンドの定義済み処理は、戻り値として、アルファブレンド後の色(RGBA)と、レンダリング前カラーマッチングを行なったかレンダリング後カラーマッチングを行なったかのフラグ(preまたはpost)とを返すので、ビットマップデータbmp.data[]およびフラグbmp.pre_or_post[]の、座標位置coordの値をそれぞれ戻り値で置き換える。アルファブレンドの定義済み処理については図12〜図13を参照して後述する。
ステップS907〜S910はループ処理である。
ステップS907は変数coordの横方向の値coord.xを1加算する処理である。
ステップS908は変数coordの横方向の値coord.xがビットマップデータの横方向の大きさbmp.wと等しくなったかどうかの判定処理である。等しければステップS909に進み、等しくなければステップS903に戻る。
ステップS909は、変数coordの横方向の値coord.xを0に初期化し、変数coordの縦方向の値coord.yを1加算する処理である。
ステップS910は変数coordの縦方向の値coord.yがビットマップデータの縦方向の大きさbmp.hと等しくなったかどうかの判定処理である。等しければステップS911に進み、等しくなければステップS903に戻る。
ステップS911は終了である。本定義済み処理の戻り値はないが、引数bmpで渡したビットマップデータbmp.data[]が更新される。
[アルファブレンド]
次に、図12〜図13を参照して、アルファブレンドの動作について説明する。
図12は、検証結果DB312の構成を示す図である。
1001は検証結果DB312の各レコードを構成する列を示す。
1002は各列に格納されるデータを示す。
1003、1004の各列はアルファブレンドの対象となる色をRGBA表記で格納する。
1005、1006、1007の各列はそれぞれレンダラー310がCMM311を利用する際の入力プロファイル305、レンダリングプロファイル306、プリンタプロファイル307、レンダリングインテント308を識別するIDを格納する。
1008の列はアルファブレンドの結果の色をRGBA表記で格納する。
1009の列はレンダリング前カラーマッチングを行なったかレンダリング後カラーマッチングを行なったかをpreまたはpostの値で格納する。
図13は,アルファブレンドを行なう定義済み処理の動作を示すフローチャートである。
本定義済み処理は図11に示すフローチャートのステップS906から呼び出される。本定義済み処理ではCMM311のカラーマッチング機能として、CMM.gm、CMM.cc、CMM.labの3つの機能を利用する。
CMM.gmは色域圧縮(gamut mapping)を行なう。引数(color、prof1、prof2、intent)は色指定color、プロファイルprof1、プロファイルprof2、レンダリングインテントintentである。機能はprof1が表現する色域の色colorをprof2が表現する色域の色にintentにしたがって圧縮し、prof1が表現する色域の色として返す。
CMM.ccは色域変換(color conversion)を行なう。引数(color、prof1、prof2)は色指定color、プロファイルprof1、プロファイルprof2である。機能はprof1が表現する色域の色colorをprof2が表現する色域の色に圧縮せずに変換し、prof2が表現する色域の色として返す。colorで指定する色はprof2が表現する色域に収まっていることが前提である。
CMM.labはL*a*b*値への変換を行なう。L*a*b*色空間はCIE(Commission Internationale I’Eelairagel;国際照明委員会)が1976年に定めた均等色空間であり、明度指数L*とクロマティクネス指数a*およびb*で表わす。引数(color、prof)は色指定colorとプロファイルprofである。機能はprofが表現する色域の色colorをL*a*b*値に変換して返す。
ステップS1101はアルファブレンドの開始である。color1、color2は本定義済み処理呼び出し時の引数である。引数color1は、図9〜図10のステップ805で初期化し、図11のステップS905、ステップS906その他で更新したビットマップデータbmp.data[] の任意の座標における色の値である。引数color2は、図9〜図10のステップS802で初期化し、ステップS810で更新した変数fillの色の値である。
ステップS1102は変数の初期化処理である。returnは戻り値を保持する変数で、要素(r、g、b、a)はRGBA表記の色の各要素を表わす。要素pre_or_postはレンダリング前カラーマッチングを行なったか、レンダリング後カラーマッチングを行なったかを保持する変数で、値としてpreまたはpostを保持する。inputProfは入力プロファイル305の内容を保持する変数である。printerProfはプリンタプロファイル307の内容を保持する変数である。intentはレンダリングインテント308の内容を保持する変数である。
ステップS1103は検証結果DB312に検証結果が登録されているかどうかを検索する処理である。図12に構成を示した検証結果DBに対して、変数color1、変数color2、変数inputProf、変数printerProf、変数intentを引数として登録レコードを検索する。color1が列1003、color2が列1004、inputProfが列1005、printerProfが列1006、intentが列1007にそれぞれ一致するレコードが見つかると、見つかったレコードの列1008の値と列1009の値をそれぞれ変数returnの(r、g、b、a)と(pre_or_post)に格納する。ステップS1103ではレコードが見つかったかどうかを判定し、見つかった場合はそのままステップS1112に進んで処理を終了する。見つからなかった場合はステップS1104に進む。
ステップS1104はレンダリング前カラーマッチングを行なった場合のL*a*b*値を求める処理である。まず、CMM311のCMM.gm機能を利用して、引数color1の値と引数color2の値を入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)にレンダリングインテントintentで圧縮し、結果をそれぞれ変数preInput1とpreInput2に格納する。次に、変数preInput1の値と変数preInput2の値とでブレンド処理を行ない、結果を変数preRenderに格納する。ブレンド処理は、preInput1の値(r、g、b、a)とpreInput2の値(r、g、b、a)とから、以下の式により計算される。
preRender.r=preInput1.r×preInput1.a+preInput2.r×preInput2.a×(1−preInput1.a)
preRender.g=preInput1.g×preInput1.a+preInput2.g×preInput2.a×(1−preInput1.a)
preRender.b=preInput1.b×preInput1.a+preInput2.b×preInput2.a×(1−preInput1.a)
preRender.a=preInput1.a+preInput2.a×(1−preInput1.a)
最後に、CMM311のCMM.cc機能を利用して、ブレンド結果preRenderの値を入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)に変換して変数prePrinterに格納し、CMM 311のCMM.lab機能を利用して、prePrinterの値をL*a*b*値に変換して変数preLabに格納する。
ステップS105はレンダリング後カラーマッチングを行なった場合のL*a*b*値を求める処理である。まず、引数color1の値と引数color2の値とでブレンド処理を行ない、結果を変数postRenderに格納する。ブレンド処理は、ステップS1104と同様に、color1の値(r、g、b、a)とcolor2の値(r、g、b、a)とから、以下の式により計算される。
preRender.r=color1.r×color1.a+color2.r×color2.a×(1−color1.a)
preRender.g=color1.g×color1.a+color2.g×color2.a×(1−color1.a)
preRender.b=color1.b×color1.a+color2.b×color2.a×(1−color1.a)
preRender.a=color1.a+color2.a×(1−color1.a)
次に、CMM311のCMM.gm機能を利用して、ブレンド結果preRenderの値を入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)に、レンダリングインテントintentで圧縮し、結果を変数postInputに格納する。最後に、CMM311のCMM.cc機能を利用して、ブレンド結果postInputの値を入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)に変換して変数postPrinterに格納し、CMM311のCMM.lab機能を利用して、postPrinterの値をL*a*b*値に変換して変数postLabに格納する。
ステップS1106は入力色域(inputProfが表現)における理論的なL*a*b*値を求める処理である。まず、引数color1の値と引数color2の値とでブレンド処理を行ない、結果を変数tRenderに格納する。ブレンド処理はステップS1105と同じである。次に、CMM311のCMM.lab機能を利用して、ブレンド結果tRenderの値をL*a*b*値に変換して変数tLabに格納する。
ステップS1107はL*a*b*値preLabとtLab、postLabとtLabのCIE L*a*b*色差(CIE 1976)を求める処理である。preLabとtLabの色差ΔEpreおよびpostLabとtLabの色差ΔEpostは、preLabの値(L*、a*、b*)、postLabの値(L*、a*、b*)、tLabの値(L*、a*、b*)から、以下の式により計算される。
ΔEpre 2=(preLab.L*−tLab.L*)2+(preLab.L*−tLab.L*)2+(preLab.L*−tLab.L*)2
ΔEpost 2=(postLab.L*−tLab.L*)2+(postLab.L*−tLab.L*)2+(postLab.L*−tLab.L*)2
計算結果をそれぞれ変数deltaE_preとdeltaE_postに格納する。
ステップS1108は色差deltaE_preとdeltaE_postを比較する処理である。変数deltaE_preの値の方が小さければステップS1109に進み、それ以外の場合はステップS1110に進む。
ステップS1109はレンダリング前カラーマッチングを行なった方が理論値に近かった場合(すなわち、ステップS1108における比較によりdeltaE_pre<deltaE_postの場合)の処理である。変数returnの(r、g、b、a)に入力色域(inputProfが表現)におけるレンダリング結果を保持するpreRenderの値を格納し、変数returnの(pre_or_post)には値preを格納する。
ステップS1110はレンダリング後カラーマッチングを行なった方が理論値に近かった場合(すなわち、ステップS1108における比較によりdeltaE_pre≧deltaE_postの場合)の処理である。変数returnの(r、g、b、a)に入力色域(inputProfが表現)におけるレンダリング結果を保持するpostRenderの値を格納し、変数returnの(pre_or_post)には値postを格納する。
ステップS1111は検証結果DB312に検証結果を登録する処理である。図12に構成を示した検証結果DBに対して、変数color1、変数color2、変数inputProf、変数printerProf、変数intent、変数returnを引数としてレコードを登録する。color1が列1003、color2が列1004、inputProfが列1005、printerProfが列1006、intentが列1007、return(r、g、b、a)が列1008、return(pre_or_post)が列1009に、それぞれ登録される。
ステップS1112は終了である。変数returnの値を戻り値として返す。
[プリンタ出力]
次に、図14を参照して、プリンタ出力の動作について説明する。
図14は、プリンタ出力を行なう定義済み処理の動作を示すフローチャートである。本定義済み処理は図9に示すフローチャートのステップS807から呼び出される。
ステップS1201は本定義済み処理の開始である。引数bmpは図9〜図10において、ステップS805で初期化し、ステップS820、S824、S826でレンダリングされた変数bmpと同じ値を有する。
ステップS1202は変数の初期化処理である。coordはビットマップデータbmp.dataを左上から右下に向かってスキャンする際の座標値を保持する変数で、(x、y)はピクセル単位の座標値を表わす。図14に示したフローチャートは主に変数coordをループ変数とするループ処理で構成される。inputProfは入力プロファイル305の内容を保持する変数である。printerProfはプリンタプロファイル307の内容を保持する変数である。intentはレンダリングインテント308の内容を保持する変数である。outputbmp[]はプリンタ出力用のビットマップデータを保持する配列で、大きさはbmp.data[]と同じである。
ステップS1203は変数coordが指す座標値のビットマップデータとpreまたはpostの値をbmp.data[]とbmp.pre_or_post[]から取得する処理である。取得した値をそれぞれ変数dataとpre_or_postに格納する。
ステップS1204は変数pre_or_postが値preかどうかの判定処理である。変数bmp.pre_or_post[]は、ステップS805で値postに初期化された後、該ピクセルにアルファブレンドレンダリングが行なわれた場合はステップS906で値preまたはpostが格納され、それ以外のレンダリングの場合は何も値が格納されない。このため、ここで判定が真になるのは、該ピクセルにレンダリング前カラーマッチングでアルファブレンドレンダリングが行なわれた場合に限られる。その場合はステップS1206に進む。それ以外の場合はステップS1205に進む。
ステップS1205はCMM311のCMM.gm機能を利用して、ピクセルデータを入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)にレンダリングインテントintentで圧縮する処理である。結果は変数dataに上書きする。
ステップS1206では、変数dataの色値はすでにプリンタ313の色域(printerProfが表現)に圧縮されているので、CMM311のCMM.cc機能を利用して、入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)に変換する処理である。結果はプリンタ出力用ビットマップデータoutputbmp[]の変数coordが指す座標位置に格納する。
ステップS1207〜S1210はループ処理である。
ステップS1207は変数coordの横方向の値coord.xを1加算する処理である。
ステップS1208は変数coordの横方向の値coord.xがビットマップデータの横方向の大きさbmp.wと等しくなったかどうかの判定処理である。等しければステップS1209に進み、等しくなければステップS1203に戻る。
ステップS1209は変数coordの縦方向の値coord.yを1加算する処理である。
ステップS1210は変数coordの縦方向の値coord.yがビットマップデータの縦方向の大きさbmp.hと等しくなったかどうかの判定処理である。等しければステップS1211に進み、等しくなければステップS1203に戻る。
ステップS1211はプリンタ出力用ビットマップデータoutputbmp[]を作成し終わったので、プリンタ313のコントローラ314に送信する処理である。プリンタ313は受信したビットマップデータをRAM209にビットマップデータ315として格納し、プリンタエンジン212をビットマップデータ315にしたがって制御して出力を行なう。
ステップS1212は終了である。戻り値はない。
[レンダラーの動作例]
最後に、図15〜図16を参照して、レンダラー310の動作の一例について、図8に示した中間コードデータを使用して説明する。
図15〜図16は、レンダラー310が図8に示した中間コードデータを図9〜図10、図11、図13に示したフローチャートにしたがってレンダリングする様子を示した図である。
中間コードデータはステップS802で変数dlcに読み込まれる。変数fillはfill(r、g、b、a)=(1.0、1.0、1.0、1.0)で初期化される。変数strokeはstroke(r、g、b、w)=(0.0、0.0、0.0、1)で初期化される。
dlcの1つ目のオペコード(PageStart)では、ステップS804〜S805で変数bmpが初期化される。ここではプリンタの解像度を300DPI(Dots Per Inch)とすると、1インチ=25.4mmとして、11.811 PPMとなるので、bmp.w=210.0×11.811=2480.31≒2480(小数点以下切り捨て)、bmp.h=297.0×11.811=3507.867≒3507(小数点以下切り捨て)、bmp.res=11.811(PPM)となる。また、bmp.data[]とbmp.pre_or_post[]の両配列の大きさは2480×3507=8444856となる。bmp.data[]はステップS802で初期化されたfill(r、g、b、a)=(1.0、1.0、1.0、1.0)で初期化される。pre_or_post[] はpostで初期化される。
dlcの2つ目のオペコード(Fill)では、ステップS809〜S810で変数fillが更新される。ここではflll(r、g、b、a)=(1.0、1.0、0.0、0.7)となる。
dlcの3つ目のオペコード(Stroke)では、ステップS811〜S812で変数strokeが更新される。ここで、線幅にはオペランドの2.0に解像度bmp.resを乗算するので、2.0×11.811=23.622≒23(小数点以下切り捨て)となり、stroke(r、g、b、w)=(0.0、0.0、1.0、23)となる。
dlcの4つ目のオペコード(PathStart)では、ステップS813〜S814で変数path[]とcursorが初期化される。ここではオペランドに依存した処理は行なわれないので、cursor(x、y)=(0、0)である。
dlcの5つ目のオペコード(PathMoveTo)では、ステップS821〜S822で変数cursorが更新される。座標値には解像度bmp.resを乗算するので、cursor.x=80.0×11.811=944.88≒944(小数点以下切り捨て)、cursor.y=30.0×11.811=354.33≒354(小数点以下切り捨て)となる。
dlcの6つ目のオペコード(PathArc)では、円弧1301がレンダリングされる。開始点1302は変数cursorの現在の値である(944、354)である。中心点1303はオペランドの(80.0、80.0)に解像度bmp.resを乗算するので、80.0×11.811=944.88≒944(小数点以下切り捨て)より(944、 944)となり、角度はオペランドにより360°となる。外形線は変数strokeの現在の値である青色、線幅23ピクセルである。開始点1302から時計回りに1301に沿って開始点1302に戻る外形線の各座標が変数path[]に追加される。
dlcの7つ目のオペコード(PathEnd)では、オペランドが1ではないことからステップS818の処理は行なわれないが、path[]に保持されている開始点と終了点がともに1302に示す(944、354)であることからステップS819で閉パスと判定され、ステップS820でパス塗りつぶし定義済み処理(図11)が呼び出される。
このパス塗りつぶし処理ではビットマップデータの各ピクセル座標がpath[] 内部かどうかを判定し、path[] 内部ならばfillで塗りつぶす処理が行なわれる。すなわち、外形線1301の内部の点について、変数fillの現在の値である(r、g、b、a)=(1.0、1.0、0.0、0.7)で塗りつぶされる。アルファ値が1.0ではないのでステップS906でアルファブレンド定義済み処理(図13)が呼び出される。
ステップS1103で検証結果DBにレコードが見つからなかったとすると、ステップS1104〜S1111のアルファブレンド処理が行なわれる。ここではbmp.data[] の初期化値(1.0、1.0、1.0、1.0)とfill(1.0、1.0、0.0、0.7)でブレンド処理が行なわれる。ブレンド前カラーマッチングかブレンド後カラーマッチングのどちらが選択されるかは入力プロファイル305、プリンタプロファイル307、レンダリングインテント308の内容に依存するが、ここではレンダリング前カラーマッチングが選択されたとする。また、ブレンド結果については、外形線1301の内部の点について、ビットマップデータbmp.data[]の値が(0.9、0.2、0.2、1.0)、pre_or_post[]の値がpreになったとする。この時点での様子を図15に示す。
dlcの8つ目のオペコード(Fill)では、ステップS809〜S810で変数fillが更新される。ここではflll(r、g、b、a)=(1.0、0.0、0.0、05)となる。
dlcの9つ目のオペコード(PathStart)では、ステップS813〜S814で変数path[]とcursorが初期化される。ここではオペランドに依存した処理は行なわれないので、cursor(x、y)=(0、0)である。
dlcの10個めのオペコード(PathMoveTo)では、ステップS821〜S822で変数cursorが更新される。座標値には解像度bmp.resを乗算するので、cursor.x=140.0×11.811=1653.54≒1653(小数点以下切り捨て)、cursor.y=30.0×11.811=354.33≒354(小数点以下切り捨て)となる。
dlcの11個めのオペコード(PathArc)では、円弧1304がレンダリングされる。開始点1305は変数cursorの現在の値である(1653、354)である。中心点1306はオペランドの(14.0、 80.0)に解像度bmp.resを乗算するので、140.0×11.811=1653.54≒1653(小数点以下切り捨て)、80.0×11.811=944.88≒944(小数点以下切り捨て)より(1653、 944)となり、角度はオペランドにより360°となる。外形線は変数strokeの現在の値である青色、線幅23ピクセルである。開始点1305から時計回りに1304に沿って開始点1305に戻る外形線の各座標が変数path[]に追加される。
dlcの12個目のオペコード(PathEnd)では、オペランドが1ではないことからステップS818の処理は行なわれないが、path[]に保持されている開始点と終了点がともに1305に示す(1653、354)であることからステップS819で閉パスと判定され、ステップS820でパス塗りつぶし定義済み処理(図11)が呼び出される。
このパス塗りつぶし処理ではビットマップデータの各ピクセル座標がpath[]内部かどうかを判定し、path[]内部ならばfillで塗りつぶす処理が行なわれる。すなわち、外形線1304の内部の点について、変数fillの現在の値である(r、g、b、a)=(1.0、0.0、0.0、05)で塗りつぶされる。アルファ値が1.0ではないのでステップS906でアルファブレンド定義済み処理(図13)が呼び出される。
ここでもステップS1103で検証結果DBにレコードが見つからなかったとすると、S1104〜S1111のアルファブレンド処理が行なわれる。円弧1301の外形線と重なっている領域1308についてはbmp.data[]の値(0.0、0.0、1.0、1.0)とfill(1.0、0.0、0.0、0.5)でブレンド処理が行なわれる。円弧1301の内部と重なっている領域1307についてはbmp.data[]の値(0.9、0.2、0.2、1.0)とfill(1.0、0.0、0.0、0.5)でブレンド処理が行なわれる。
それ以外の領域1306についてはbmp.data[]の初期化値(1.0、1.0、1.0、1.0)とfill(1.0、0.0、0.0、0.7)でブレンド処理が行なわれる。ブレンド前カラーマッチングかブレンド後カラーマッチングのどちらが選択されるかは入力プロファイル305、プリンタプロファイル307、レンダリングインテント308の内容に依存するが、ここではすべてレンダリング後カラーマッチングが選択されたとする。
ブレンド結果については、円弧1301の外形線と重なっている領域1308についてビットマップデータbmp.data[]の値が(0.5、0.0、0.5、1.0)、円弧1301の内部と重なっている領域1307についてビットマップデータbmp.data[]の値が(0.95、0.1、0.1、1.0)、それ以外の領域についてはbmp.data[]の値が(1.0、0.5、0.5、 1.0)となる。pre_or_post[]の値はすべてpostである。この時点での様子を図16に示す。
以降、dlcの13個目〜17個めのオペコードについても同様の処理が行なわれる。
18個めのオペコード(PageEnd)では、ステップS807でプリンタ出力定義済み処理(図14)が呼び出される。
この時点でbmp.pre_or_post[]の値がpreであるピクセル、たとえば円弧1301内部で他の円弧と重なっていない領域については、ステップS1205でプリンタの色域に圧縮が行なわれる。次に、すべてのピクセルについてステップS1206でプリンタの色域に変換が行なわれる。こうして用意されたプリンタ出力用ビットマップがステップS1211でプリンタ313のコントローラ314に送信され、最終的な出力を得る。
[その他の実施形態]
上記実施形態では中間コードデータをクライアント101でレンダリングしたが、クライアント101からプリンタ103に中間コードデータを送信することで、レンダリングはプリンタ103で行なうようにしてもよい。
また上記実施形態では入力プロファイル305が表現する入力色域(カラースペース)でレンダリングを行なったが、レンダリングプロファイル306が表現するレンダリング色域(カラースペース)でレンダリングしてもよいし、プリンタプロファイル307が表現するプリンタ色域(カラースペース)でレンダリングするようにしてもよい。
また上記実施形態ではPDLとしてSVG 1.1を使用したが、もちろんこれに限るものではなく、SVGのその他のバージョン、あるいは前述の中間コードに変換可能なものであれば任意のPDLを使用することが可能である。
また上記実施形態では1ページの表示・印刷を行なう例を示したが、PDLが複数ページに対応するものであれば、中間コード、ビューワプログラム、コントローラをそれに対応させてもよい。
また上記実施形態ではSVG文書につき一つの入力プロファイルとレンダリングインテントを使用したが、SVG文書内に存在するオブジェクトの種類ごと、たとえばイメージ、グラフィックス、テキストオブジェクトごとに入力プロファイルとレンダリングインテントを指定できるようにしてもよい。さらに、個々のオブジェクトごとに入力プロファイルとレンダリングインテントを指定できるようにするシステムも考えられる。
また図1においてPCとプリンタはネットワーク接続されるとしたが、これ以外の接続形態であってもよく、たとえばPCとプリンタが直接接続されていても、あるいはメモリカードやCDなどのメディアを通じてデータを受け渡しするような形態であっても、本発明の実施を妨げるものではない。
また図2においてプログラムはRAM 202に格納されるとしたが、これに限るものではなく、他の実施形態においてはプログラムを外部記憶装置204から読み込んで実行するようにしてもよいし、ネットワークインタフェース203を介して受信して実行するようにしてもよい。また、図2には示していないが、ROM等の読み出し専用の内部記憶部から読み込んで実行するようにしてもよい。また、キーボード206やポインティングデバイス207の代わりに、あるいはそれらに加えて、音声入力等の他の入力装置を備えることもできる。また、ディスプレイ205、キーボード206、ポインティングデバイス207を他のコンピュータ装置と共有する場合も考えられる。
また図4において中間コードデータ303、ビットマップデータ304、315をRAMに保持したが、これ以外に、ファイルやデータベースその他の永続記憶に保存してもよい。また、同じPDL文書に対する中間コードデータはキャッシュしておいて、次回以降の処理に利用する形態も考えられる。
また図7において中間コードの仕様を示したが、使用可能な中間コードはこの仕様に限定されるものではない。たとえば単位系はmm以外の任意の単位系またはその組み合わせであってもよい。パスにはベジエ曲線、楕円弧、その他の数学的に表現可能な任意のパスを記述できるようにしてもよい。Fillは単色ではなくブラシ、イメージ、グラデーション等の複雑な塗りを行なえるようにしてもよい。色はRGB、RGBA以外にカラープロファイルによる指定、デバイスカラーによる指定、特色の指定なども行なえるようにしてもよい。また、オペコードとして1バイト整数、オペランドとして2バイト浮動小数点数を使うことも単なる一例であって、他のエンコード方法を使用しても構わない。あるいは、中間コードをプリンタ103に送信する形態においては、プリンタ103が解釈可能なPDLを用いても構わない。
また図11において汎用的アルゴリズムを使用してビットマップ全体をスキャンし、各座標が引数pathが表現するパスに含まれるかどうかを判定したが、これ以外に、引数pathが表現するパスに含まれる座標をあらかじめ抽出し、それらの座標に対してレンダリングを行なう方法も考えられる。
また図13において色差としてCIE L*a*b*色差(CIE 1976)を使用したが、それ以外の色差、たとえばCIE ΔE94(CIE 1994)やCIE ΔE2000(CIE 2000)等を用いてもよい。
なお、本発明は、前述した実施形態の機能を実現するソフトウェアのプログラムを、システムあるいは装置に直接あるいは遠隔から供給し、そのシステムあるいは装置のコンピュータがその供給されたプログラムコードを読み出して実行することによっても達成され得る。その場合、プログラムの機能を有していれば、その形態はプログラムである必要はない。
従って、本発明の機能処理をコンピュータで実現するために、そのコンピュータにインストールされるプログラムコード自体およびそのプログラムを格納した記憶媒体も本発明を構成することになる。つまり、本発明の特許請求の範囲には、本発明の機能処理を実現するためのコンピュータプログラム自体、およびそのプログラムを格納した記憶媒体も含まれる。
その場合、プログラムの機能を有していれば、オブジェクトコード、インタプリタにより実行されるプログラム、OSに供給するスクリプトデータ等、プログラムの形態を問わない。
プログラムを供給するための記憶媒体としては、例えば、フレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、MO、CD−ROM、CD−R、CD−RW、磁気テープ、不揮発性のメモリカード、ROM、DVD(DVD−ROM、DVD−R)などがある。
その他、プログラムの供給方法としては、クライアントコンピュータのブラウザを用いてインターネットのホームページに接続し、そのホームページから本発明のコンピュータプログラムそのもの、もしくは圧縮され自動インストール機能を含むファイルをハードディスク等の記憶媒体にダウンロードすることによっても供給できる。また、本発明のプログラムを構成するプログラムコードを複数のファイルに分割し、それぞれのファイルを異なるホームページからダウンロードすることによっても実現可能である。つまり、本発明の機能処理をコンピュータで実現するためのプログラムファイルを複数のユーザに対してダウンロードさせるWebサーバも、本発明の請求の範囲に含まれるものである。
また、本発明のプログラムを暗号化してCD−ROM等の記憶媒体に格納してユーザに配布し、所定の条件をクリアしたユーザに対し、インターネットを介してホームページから暗号化を解く鍵情報をダウンロードさせ、その鍵情報を使用することにより暗号化されたプログラムを実行してコンピュータにインストールさせて実現することも可能である。
また、コンピュータが、読み出したプログラムを実行することによって、前述した実施形態の機能が実現される他、そのプログラムの指示に基づき、コンピュータ上で稼動しているOSなどが、実際の処理の一部または全部を行ない、その処理によっても前述した実施形態の機能が実現され得る。
さらに、記憶媒体から読み出されたプログラムが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書き込まれた後、そのプログラムの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるCPUなどが実際の処理の一部または全部を行ない、その処理によっても前述した実施形態の機能が実現される。