以下、本発明における一実施形態について図面を参照して詳細に説明する。
[本実施形態の概要]
本実施形態では、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の制御下にある環境を指す。インタプリタ310、レンダラー311、CMM(Color Management Module)312は、通常は外部記憶装置204に保存されているが、ユーザ、OS、あるいは別のプログラムから実行が指示されると、OSの制御によりRAM202に読み込まれ、実行可能な状態となる。302は外部記憶装置204に保存されているSVG文書ファイルであり、インタプリタ310を含むプログラムはOSの機能を利用してSVG文書ファイル302の内容を読み書きすることが可能である。
303はRAM202に格納される中間コードデータであり、インタプリタ310、レンダラー311を含むプログラムは同じくOSの機能を利用して中間コードデータ303の内容を読み書きすることが可能である。304はRAM202に格納されるビットマップデータであり、レンダラー311を含むプログラムは同じくOSの機能を利用してビットマップデータ304の内容を読み書きすることが可能である。
309はRAM202に格納される設定で、レンダリング前カラーマッチングを行なうかレンダリング後カラーマッチングを行なうかを指定するものである。インタプリタ310はSVG文書ファイル302から中間コードデータ303への変換を行なうが、この変換動作は両言語の仕様から機械的に決定できるものである。したがって、本実施形態ではインタプリタ310の動作について詳述はせず、変換内容の提示のみ行なう。また、インタプリタ310はこの変換の際、カラーマッチング設定309を参照し、設定内容を中間コードデータ303に記述する。レンダラーは中間コードデータ303からビットマップデータ304を作成し、ネットワーク103を経由してプリンタ313のコントローラ314に送信する。この際、カラーマッチングのためにCMM312の機能を利用する。
CMM312は必要なカラーマッチングを行なうため、SVG文書ファイル302および中間コードデータ303の入力カラースペースを表わす入力プロファイル305、レンダラー311のレンダリングカラースペースを表わすレンダリングプロファイル306、プリンタ313のデバイスカラースペースを表わすプリンタプロファイル307、カラーマッチング時のマッチング方法を指定するレンダリングインテント308を入力として使用する。
CMMは通常OSの一部あるいはOSによって利用可能なライブラリとして提供され、プログラムからはその機能を利用するのみであるので、本実施形態ではCMM312の動作について詳述はせず、その機能と利用例のみ示す。
313はプリンタ102のブロック境界を表わす。コントローラ314はRAM209に格納され、常に実行可能な状態にあるプログラムである。コントローラ314はネットワークインタフェース210を通じてレンダラー311からビットマップデータ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、14、17行目はコメント要素である。コメント要素の内容もSVG文書のレンダリングには使用されない。
8〜13行目はグラデーションをレンダリングするためのSVGペイントサーバの定義である。この定義により、以降のレンダリング要素のfill属性またはstroke属性から“SampleGradient”という名前でURI参照可能になる。ここでは、開始点において“R(赤)=FFH、G(緑)=0、B(青)=0”、終了点において“R(赤)=FFH、G(緑)=FFH、B(青)=66H”のグラデーションを定義している。
14〜15行目はグラデーションの矩形をレンダリングするための<rect>要素である。左上座標の値はユーザ座標系において(30,30)を指定し、幅と高さの値はユーザ座標系においてそれぞれ120と80を指定している。矩形内部の塗りつぶしは“SampleGradient”グラデーション、矩形の外形線の色は“blue”(青色)、外形線の幅はユーザ座標系において2と指定している。
16〜17行目は半透明の円をレンダリングするための<circle>要素である。中心座標の値はユーザ座標系において(90,140)を指定し、半径の値はユーザ座標系において50を指定している。円内部の塗りつぶしの色は“R(赤)=33H、G(緑)=FFH、B(青)=33Hで”不透明度(アルファ値)が0.7、円の外形線の色は“blue”(青色)、外形線の幅はユーザ座標系において2と指定している。
16行目はルート要素としての<svg>要素の終了タグであり、4〜5行目の開始タグに対応するものである。
図5に示したSVG文書ファイルをレンダリングした例を図6に示す。501が14〜15行目の<rect>要素に対応するグラデーションの矩形、502が16〜17行目の<circle>要素に対応する半透明の円である。503はSVG文書全体の外接矩形を示している。外接矩形503のサイズは幅21.0cm、高さ29.7cmである。縦横の破線、破線交点の円、破線交点付近の座標値表示は、ポイントとなる座標の座標値を図示するためのものであり、実際のレンダリングには含まれない。
[中間コード]
次に、図7〜図8を参照して、本実施形態で使用する中間コードについて説明する。
図7は、本実施形態で使用する中間コードの仕様を示す図である。
601はレンダリング命令を表わすオペコードであり、数字で指定する。本実施形態では9種類のオペコードを定義している。オペコードは1バイト整数として中間コードデータ303に格納される。
602はオペコードを人間が識別しやすくするためのニーモニックである。ニーモニックは中間コードの内容をダンプして示すような場合にのみ使用し、中間コードデータ303には含まれない。
603はオペコードに対する引数を表わすオペランドである。オペランドの数とその意味はオペコードによって異なる。オペランドは2バイト浮動小数点数として中間コードデータ303に格納される。
本実施形態で使用する中間コードでは、単位系としてmmのみを使用する。オペランドに座標や長さを指定する場合は、すべてmmに換算した値を指定する。座標値はページ左上を原点とする絶対値で、X(横方向)(mm)とY(縦方向)(mm)の組で表わす。オペランドに色を指定する場合はRGB(赤・緑・青)あるいはRGBA(赤・緑・青・アルファ値)で表わし、R(赤)、G(緑)、B(青)、A(アルファ値)の値をそれぞれ0.0〜1.0の範囲で指定する。RGBで色が指定された場合は、アルファ値を1.0として扱う。
オペコード0(ニーモニックPageStart)はページの開始を表わす。オペランドはページの幅W(mm)とページの高さH(mm)、およびレンダリング前カラーマッチングを行なうかレンダリング後カラーマッチングを行なうかのフラグFである。Fが0の場合はレンダリング前カラーマッチングを表わし、Fが1の場合はレンダリング後カラーマッチングを表わす。
オペコード1(ニーモニックPageEnd)はページの終了を表わす。オペランドはない。
オペコード2(ニーモニックFill)は単色による塗りつぶしの色の指定である。Fillで指定する塗りつぶしは以降のレンダリング命令すべてに適用される。オペランドは塗りつぶしの色RGBAである。
オペコード3(ニーモニックGradLinear)は線形グラデーションによる塗りつぶしの指定である。線形グラデーションはグラデーションベクトルで指定する。オペランドはグラデーションベクトルの開始座標X1、Y1と終了座標X2、Y2、開始色R1G1B1、終了色R2G2B2である。図6の501に示したグラデーションの場合、グラデーションベクトルは開始座標(30,30)、終了座標(150,30)となる。色はFFHで除算することで0.0〜1.0に正規化し、開始色(1.0,0.0,0.0)、終了色(1.0,1.0,0.4)となる。塗りつぶしの際、グラデーションベクトルは向きと直角方向に平行移動して使用される。したがって、開始座標と終了座標は、(30,110)と(150,110)、(30,200)と(150,200)など、向きと直角方向に平行移動したものなら何を用いても構わない。また、開始座標よりも前に塗りつぶしが必要になった場合、開始色を使用する。同じく、終了座標よりも後に塗りつぶしが必要になった場合、終了色を使用する。501のグラデーションの場合、前記のグラデーションベクトルに対しては、X<30における塗りつぶしには開始色(0.0,1.0,1.0)が使用され、X>150における塗りつぶしには終了色(1.0,1.0,0.4)が使用される。FillあるいはGradLinearで指定する塗りつぶしのうち、最後に指定された方が以降のレンダリング命令すべてに適用される。
オペコード4(ニーモニックStroke)は外形線の指定である。Strokeで指定する外形線は以降のレンダリング命令すべてに適用される。オペランドは外形線の色RGBと、外形線の幅W(mm)である。本実施形態では外形線の色をRGBで指定するので、アルファ値は前述のとおり1.0として扱う。
オペコード5(ニーモニックPathStart)はパスの開始を表わす。オペランドはない。
オペコード6(ニーモニックPathEnd)はパスの終了を表わす。オペランドはクローズフラグFであり、“1”が指定された場合はパスの終了位置から開始位置まで直線をレンダリングすることで、パスを閉じることを表わす。“0”が指定された場合は何もしない。
オペコード7(ニーモニックPathMoveTo)はパスのレンダリング位置の移動を表わす。PathStart命令とPathEnd命令の間でのみ有効である。PathMoveToはレンダリング位置を移動するだけで、実際のレンダリングは行なわない。オペランドは移動位置座標X、Yである。
オペコード8(ニーモニックPathLineTo)はパスの現在位置からオペランドで指定された位置まで直線をレンダリングする。PathStart命令とPathEnd命令の間でのみ有効である。オペランドは直線終端座標X、Yである。
オペコード9(ニーモニックPathArc)はパスの現在位置から円弧をレンダリングする。PathStart命令とPathEnd命令の間でのみ有効である。PathArcは常に時計回り方向に円弧をレンダリングする。オペランドは円弧中心座標X、Yおよび円弧の長さDである。円弧の長さDは角度(°)で指定する。
図8は、図5に示した内容のSVG文書ファイル302をインタプリタ310が変換した中間コードデータ303の内容を示す図である。中間コードデータ303は1バイト整数のオペコードと2バイト浮動小数点数のオペランドのみが格納されたバイナリデータであるが、図8に示すのはそれを人間が識別しやすくするためにダンプ表示し、ニーモニックも付記したものである。
1行目はページ開始命令で、オペランドでページの幅と高さを210.0mmと297.0mmに指定している。また、レンダリング前カラーマッチングを行なうかレンダリング後カラーマッチングを行なうかも指定されている。ここでは1.0、すなわちレンダリング後カラーマッチングが指定されている。これは図5の<svg>要素の開始タグおよび図4の設定309に相当する。長さ指定をcmからmmに換算している。
2行目は以降のレンダリングに使用する線形グラデーションによる塗りつぶし命令で、オペランドでグラデーションベクトルを開始座標(30.0mm,30.0mm)、終了座標(150.0mm,30.0mm)、開始色(R,G,B)=(1.0,0.0,0.0)、終了色(R,G,B)=(1.0,1.0,0.4)に指定している。図5のグラデーション定義および<rect>要素のfill属性からのURL参照に相当する。グラデーションベクトルの開始座標と終了座標を矩形の開始位置と終了位置から計算するとともに、色指定を0.0〜1.0に正規化している。
3行目は以降のレンダリングに使用する外形線命令で、オペランドで外形線の色を青色、すなわち(R,G,B)=(0.0,0.0,1.0)に指定し、線幅を2.0mmに指定している。図5の<rect>要素および<circle>要素のstroke属性およびstroke−width属性に相当する。ここでは文字列表記の色指定からRGB表記に変換するとともに、長さ指定をユーザ座標系からmmに換算している。
4〜9行目は矩形のレンダリングを行なう命令群である。5行目のレンダリング位置移動命令、6〜8行目の直線レンダリング命令、9行目のパス終了命令の各オペランドの指定によって、座標(30.0mm,30.0mm)→(150.0mm,30.0mm)→(150.0mm,110.0mm)→(30.0mm,110.0mm)→(30.0mm,30.0mm)を直線で結ぶ閉パスがレンダリングされる。矩形内部は2行目の命令により線形グラデーションで塗りつぶされ、外形線は3行目の命令により青色かつ線幅2mmでレンダリングされる。図5の<rect>要素および図6のレンダリング結果501に相当する。座標指定をユーザ座標系からmmに換算している。
10行目は以降のレンダリングに使用する塗りつぶし命令で、オペランドで塗りつぶしの色を(R,G,B,A)=(0.2,1.0,0.2,0.7)に指定している。図5の<circle>要素のfillおよびfill−opacity属性に相当する。色指定を0.0〜1.0に正規化している。
11〜14行目は円のレンダリングを行なう命令群である。12行目のレンダリング位置移動命令および13行目の円弧レンダリング命令によって、座標(90.0mm,140.0mm)を中心とし、座標(90.0mm,90.0mm)から始まる、角度360.0度の円がレンダリングされる。円内部は10行目の命令により(R,G,B,A)=(0.2,1.0,0.2,0.7)の単色で塗りつぶされ、外形線は3行目の命令により青色かつ線幅2mmでレンダリングされる。図5の<circle>要素および図6のレンダリング結果502に相当する。座標指定や長さ指定をユーザ座標系からmmに換算している。
15行目はページ終了命令である。オペランドはない。図5の<svg>要素の終了タグに相当する。
[CMMの機能]
次に、本実施形態で使用するCMM312のカラーマッチング機能について説明する。 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が表現する色域に収まっていることが前提である。
[レンダラーの動作概要]
次に、図9〜図10を参照して、レンダラー311の動作の概要について説明する。
図9〜図10はレンダラー311が中間コードデータ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)はRGB表記の色の各要素と線幅(ピクセル)を表わす。初期値は(0.0,0.0,0.0,1)、すなわち黒色・線幅1ピクセルである。gradはレンダリング命令に適用される線形グラデーション塗りつぶしに使用するグラデーションベクトルを保持する変数で、(x1,y1)と(x2,y2)はそれぞれ開始点と終了点の座標値(ピクセル)、(r1,g1,b1)と(r2,g2,b2)はそれぞれ開始点と終了点の色をRGB表記で表わす。初期値はない。paintは塗りつぶしに単色fillを使うか線形グラデーションgradを使うかを決める変数で、値としてfillまたはgradを保持する。初期値はfillである。
ステップS803は中間コードデータdlcから次のオペコードとオペランドを取得する処理である。取得したオペコードとオペランドをそれぞれ変数opとoperandに格納する。
ステップS804、S806、S809、S811、S813、S815、S818、S825、S827、S829は、オペコードopの種別を判定し、それぞれのオペコードに応じて適切な処理を行なう。
ステップS804でオペコードopが0(ニーモニックPageStart)であればステップS805に進む。それ以外の場合はステップS806に進む。
ステップS805は種々の初期化処理を行なう。まず、inputProfは入力プロファイル305の内容を保持する変数である。printerProfはプリンタプロファイル307の内容を保持する変数である。intentはレンダリングインテント308の内容を保持する変数である。これらの変数は本ステップの以降の処理において使用する。bmpはビットマップデータ304を格納するための変数である。ここでbmpの要素wはビットマップデータの幅(ピクセル)を表わす。オペランドoperandのページ幅W(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度resを乗算する。bmpの要素hはビットマップデータの高さ(ピクセル)を表わす。オペランドoperandのページの高さH(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度resを乗算する。bmpの要素resはプリンタ313の出力解像度をPPM(Pixels Per Millimeter)で表わす。
bmpの要素pdefはレンダリング前カラーマッチングを行なうかレンダリングカラーマッチングを行なうかを格納する。オペランドoperandのフラグFが1ならば値としてpostを保持し、それ以外の場合は値としてpreを保持する。
bmpの要素data[]はビットマップデータを格納する配列で、大きさは横w(ピクセル)、縦h(ピクセル)である。data[]の各要素(r,g,b,a)は各ピクセルの色をRGBA表記で表わす。data[]の各要素の値は現在のfillの値、すなわち完全不透明(アルファ値1.0)の白色で初期化される。この際、変数pdefの値がpreならば、すなわちレンダリング前カラーマッチングが指定されていれば、CMM.gm機能を利用して、fillの値を入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)に、レンダリングインテントintentで圧縮した値を格納する。bmpの要素pre_or_post[]はビットマップの各ピクセルに対して、レンダリング前カラーマッチングを行なったか、レンダリング後カラーマッチングを行なったかを格納する配列で、大きさは配列data[]と同じである。レンダリング前カラーマッチングを行なった場合は値としてpreを保持し、レンダリング後カラーマッチングを行なった場合は値としてpostを保持する。初期値は変数pdefの値である。処理が終了すればステップS803に戻る。
ステップS806でオペコードopが1(ニーモニックPageEnd)であればステップS807でプリンタ出力の定義済み処理を呼び出し、ステップS808で終了する。それ以外の場合はステップS809に進む。なお、プリンタ出力の定義済み処理については図15を参照して後述する。
ステップS809でオペコードopが2(ニーモニックFill)であればステップS810に進む。それ以外の場合はステップS811に進む。
ステップS810は変数fillの更新処理である。オペランドoperandで指定された色(R,G,B,A)を変数fillの各要素(r,g,b,a)に格納する。また、以降の塗りつぶしに単色を使うよう、変数paintを値fillに設定する。処理が終了すればステップS803に戻る。
ステップS811でオペコードopが3(ニーモニックGradLinear)であればステップS812に進む。それ以外の場合はステップS813に進む。
ステップS812は変数gradの更新処理である。オペランドoperandで指定されたグラデーションベクトル(X1,Y1,X2,Y2,R1,G1,B1,R2,G2,B2)を変数gradの各要素(x1,y1,x2,y2,r1,g1,b1,r2,g2,b2)に格納する。また、以降の塗りつぶしにグラデーションを使うよう、変数paintを値gradに設定する。処理が終了すればステップS803に戻る。
ステップS813でオペコードopが3(ニーモニックStroke)であればステップS814に進む。それ以外の場合はステップS815に進む。
ステップS814は変数strokeの更新処理である。オペランドoperandで指定された色(R,G,B)と線幅(W)を変数strokeの各要素(r,g,b,w)に格納する。この際、オペランドの単位系(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度bmp.resを乗算する。処理が終了すればステップS803に戻る。
ステップS815でオペコードopが4(ニーモニックPathStart)であればステップS816に進む。それ以外の場合はS817からステップS818に進む。
ステップS816はパスレンダリング用の変数path[]とcursorの準備処理である。path[]はパスの座標値を格納する配列である。path[]の各要素(x,y)はピクセル単位で表わした座標値である。cursorはパスの現在のレンダリング位置を格納する変数で、要素(x,y)は同じくピクセルで表わした座標値である。処理が終了すればステップS803に戻る。
ステップS818でオペコードopが5(ニーモニックPathEnd)であればステップS819に進む。それ以外の場合はステップS825に進む。
ステップS819はオペランドoperandのフラグFが1かどうかの判定処理である。1であればステップS820に進み、それ以外の場合はステップS821に進む。
ステップS820は閉パスのレンダリング処理である。変数dlcの現在の読み込み位置に、オペコード8(ニーモニックPathLineTo)を挿入する。オペランドは現在のパスの開始位置であるpath[0]であるが、ビットマップの単位系(ピクセル)からオペランドの単位系(mm)に変換するために、出力解像度bmp.resで除算する。また、再度パスの終了処理を行なうため、オペコード5(ニーモニックPathEnd)も挿入する。今度は閉パスのレンダリング処理は必要ないので、オペランドは0とする。処理が終了すればS831からステップS803に戻る。
ステップS821はパスの塗りつぶしが必要かどうかを判定する処理である。パスの現在のレンダリング位置を表わす変数cursorの値と、パスの開始位置である変数path[0]の値とを比較し、等しければ閉パスなので塗りつぶしが必要であると判定し、ステップS822に進む。それ以外の場合はS831からステップS803に戻る。
ステップS822は塗りつぶしとして単色を使うかグラデーションを使うかを判定する処理である。変数paintの値がfillであれば単色塗りつぶしであると判定し、ステップS823に進む。それ以外の場合はグラデーション塗りつぶしとしてステップS824に進む。
ステップS823はパス単色塗りつぶしの定義済み処理を呼び出す処理である。パス単色塗りつぶしの定義済み処理については図11を参照して後述する。
ステップS824はパスグラデーションの定義済み処理を呼び出す処理である。パスグラデーションの定義済み処理については図13〜図14を参照して後述する。
ステップS825でオペコードopが7(ニーモニックPathMoveTo)であればステップS826に進む。それ以外の場合はステップS827に進む。
ステップS826はパスの現在のレンダリング位置を表わす変数の更新処理である。オペランドoperandで指定された座標値(X,Y)を変数cursorの各要素(x,y)に格納する。この際、オペランドの単位系(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度bmp.resを乗算する。処理が終了すればS831からステップS803に戻る。
ステップS827でオペコードopが8(ニーモニックPathLineTo)であればステップS828に進む。それ以外の場合はステップS829に進む。
ステップS828はビットマップデータbmpに直線をレンダリングする処理である。開始点はパスの現在のレンダリング位置であるcursor(x,y)である。終了点はオペランドoperandで指定された座標値(X,Y)であるが、オペランドの単位系(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度bmp.resを乗算する。外形線は変数strokeの色(RGB)と線幅(ピクセル)を使用する。レンダリングした直線の各座標値(ピクセル)を変数path[]に追加し、最後に追加した座標値(直線終了点)を変数cursorに格納する。処理が終了すればS831からステップS803に戻る。
ステップS829でオペコードopが8(ニーモニックPathArcTo)であればステップS830に進む。それ以外の場合は図7に示した中間コード仕様に存在しないので、処理をスキップしてS831からステップS803に戻る。
ステップS830はビットマップデータbmpに円弧をレンダリングする処理である。開始点はパスの現在のレンダリング位置であるcursor(x,y)である。中心点はオペランドoperandで指定された座標値(X,Y)であるが、オペランドの単位系(mm)をビットマップの単位系(ピクセル)に変換するために、出力解像度bmp.resを乗算する。角度はオペランドoperandで指定された角度D(°)である。外形線は変数strokeの色(RGB)と線幅(ピクセル)を使用する。レンダリングした円弧の各座標値(ピクセル)を変数path[]に追加し、最後に追加した座標値を変数cursorに格納する。処理が終了すればS831からステップS803に戻る。
[パスの塗りつぶし]
次に、図11を参照して、パス塗りつぶしの動作について説明する。
図11は、パスの塗りつぶしを行なう定義済み処理の動作を示すフローチャートである。本定義済み処理は図10に示すフローチャートのステップS823から呼び出される。
ステップS901はパス塗りつぶし動作の開始である。bmp、path、fillは本定義済み処理呼び出し時の引数である。引数bmpは、図9〜図10において、ステップS805で初期化し、ステップS823、S824、S828、S830で更新した変数bmpと同じ値を有する。引数pathは、図9〜図10において、ステップS816で初期化し、ステップS828およびステップS830で更新した変数pathと同じ値を有する。引数fillは、図9において、ステップS802で初期化し、ステップS810で更新した変数fillと同じ値を有する。
ステップS902は変数の初期化処理である。coordはビットマップデータbmp.data[]を左上から右下に向かってスキャンする際の座標値を保持する変数で、(x,y)はピクセル単位の座標値を表わす。初期値は(0,0)で、ビットマップデータbmp.dataの左上を表わす。図11に示したフローチャートは変数coordをループ変数とするループ処理になっている。
ステップS903は変数coordが表わす座標値が変数pathが表わすパス内かどうかを判定する処理である。ステップS821で変数pathが閉パスと判断された場合のみステップS823で本処理が呼び出されるので、変数pathが表わすパスは必ず閉パスであり、任意の座標値についてパス内かどうかを判定することができる。パス内と判定された場合はステップS904に進む。パス内でない場合はステップS907に進む。
ステップS904は変数fillが表わす色のアルファ値が1.0(完全不透明)かどうかを判定する処理である。アルファ値が1.0(完全不透明)であればアルファブレンドは必要ないと判断し、ステップS905に進む。アルファ値が1.0以外(透明)であればアルファブレンドの必要があると判断し、ステップS906に進む。
ステップS905は変数fillのアルファ値が1.0(完全不透明)の場合の塗りつぶし処理である。アルファブレンドは必要ないので、ビットマップデータbmp.data[]の座標位置coordの色を、変数fillが表わす色で置き換える。
ステップS906は変数fillのアルファ値が1.0以外(透明)の場合に、アルファブレンドの定義済み処理を呼び出す処理である。アルファブレンドの定義済み処理は、戻り値として、アルファブレンド後の色(RGBA)と、レンダリング前カラーマッチングを行なったかレンダリング後カラーマッチングを行なったかのフラグ(preまたはpost)とを返すので、ビットマップデータbmp.data[]およびフラグbmp.pre_or_post[]の座標位置coordの値をそれぞれ戻り値で置き換える。アルファブレンドの定義済み処理については図12を参照して後述する。
ステップ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[]およびフラグbmp.pre_or_post[]が更新される。
[アルファブレンド]
次に、図12を参照して、アルファブレンドレンダリングの動作について説明する。
図12は、アルファブレンドを行なう定義済み処理の動作を示すフローチャートである。本定義済み処理は図11に示すフローチャートのステップS906から呼び出される。
ステップS1001はアルファブレンドの開始である。color1、color2、pre_os_postは本定義済み処理呼び出し時の引数である。引数color1は、図9のステップ805で初期化し、図11のステップS905、ステップS906その他で更新したビットマップデータbmp.data[]の任意の座標における色の値である。引数color2は、図9のステップS802で初期化し、ステップS810で更新した変数fillの色の値である。引数pre_or_postは、図9のステップS805で初期化し、図11のステップS906、図13のステップS1110で更新された変数bmp.pre_or_post[]の任意の座標におけるフラグの値である。
ステップS1002は変数の初期化処理である。returnは戻り値を保持する変数で、要素(r,g,b,a)はRGBA表記の色の各要素を表わす。要素pre_or_postはレンダリング前カラーマッチングを行なったか、レンダリング後カラーマッチングを行なったかを表わし、値としてpreまたはpostを保持する。inputProfは入力プロファイル305の内容を保持する変数である。printerProfはプリンタプロファイル307の内容を保持する変数である。intentはレンダリングインテント308の内容を保持する変数である。
ステップS1003は引数pre_or_postの値を判定する処理である。引数pre_or_postの値がpreであればステップS1004に進む。それ以外の場合はステップS1005に進む。
ステップS1004はレンダリング前カラーマッチングを行なう場合のレンダリング処理である。まず、CMM312のCMM.gm機能を利用して、引数color2の値を入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)に、レンダリングインテントintentで圧縮し、結果を再び変数color2に格納する。引数pre_or_postの値がpreであれば、その座標におけるビットマップデータはすでに色域圧縮が行なわれているので、引数color1について処理は必要ない。次に、color1の値と圧縮後のcolor2の値とでブレンド処理を行ない、結果を変数return(r,g,b,a)に格納する。最後に、変数return.pre_or_postに値preを格納する。ブレンド処理は、color1の値(r,g,b,a)とcolor2の値(r,g,b,a)とから、以下の式により計算される。
return.r=color1.r×color1.a×(1−color2.a)+color2.r×color2.a
return.g=color1.g×color1.a×(1−color2.a)+color2.g×color2.a
return.b=color1.b×color1.a×(1−color2.a)+color2.b×color2.a
return.a=color1.a×(1−color2.a)+color2.a
ステップS1005はレンダリング後カラーマッチングを行なう場合のレンダリング処理である。引数color1の値と引数color2の値とでブレンド処理を行ない、結果を変数return(r,g,b,a)に格納し、変数return.pre_or_postに値postを格納する。ブレンド処理はステップS1004と同様である。
ステップS1006は終了である。変数returnの値を戻り値として返す。
[パスグラデーション]
次に、図13〜図14を参照して、パスグラデーションレンダリングの動作について説明する。
図13は、パスのグラデーション処理を行なう定義済み処理の動作を示すフローチャートである。本定義済み処理は図10に示すフローチャートのステップS824から呼び出される。
ステップS1101はパスグラデーション動作の開始である。bmp、path、gradは本定義済み処理呼び出し時の引数である。引数bmpは、図9〜図10において、ステップS805で初期化し、ステップS823、S824、S828、S830で更新した変数bmpと同じ値を有する。引数pathは、図9〜図10において、ステップS816で初期化し、ステップS828およびステップS830で更新した変数pathと同じ値を有する。引数gradは、図9において、ステップS802で準備し、ステップS812で更新した変数gradと同じ値を有する。
ステップS1102は変数の初期化処理である。coordはビットマップデータbmp.data[]を左上から右下に向かってスキャンする際の座標値を保持する変数で、(x,y)はピクセル単位の座標値を表わす。初期値は(0,0)で、ビットマップデータbmp.dataの左上を表わす。図13に示したフローチャートは変数coordをループ変数とするループ処理になっている。inputProfは入力プロファイル305の内容を保持する変数である。printerProfはプリンタプロファイル307の内容を保持する変数である。intentはレンダリングインテント308の内容を保持する変数である。変数c1、c2は、CMM.gm機能を利用して、引数color1、color2を入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)に、レンダリングインテントintentで圧縮した色値を格納する。
ステップS1103は変数coordが表わす座標値が変数pathが表わすパス内かどうかを判定する処理である。ステップS821で変数pathが閉パスと判断された場合のみステップS824で本処理が呼び出されるので、変数pathが表わすパスは必ず閉パスであり、任意の座標値についてパス内かどうかを判定することができる。パス内と判定された場合はステップS1104に進む。パス内でない場合はステップS1111に進む。
ステップS1104は変数coordが表わす座標値におけるグラデーションの色値を求めるための準備処理である。ステップS1104では図14に示す値a、b、cからratioを計算し、それぞれの変数に格納する。
ここで、図14を参照して、値a、b、c、ratioについて説明する。図14は、引数gradが表わすグラデーションベクトルの開始位置、開始色、終了位置、終了色、および変数coordが表わす座標位置、グラデーション色の関係を示す。1201がグラデーションベクトルの開始位置を表わす。1202がグラデーションベクトルの終了位置を表わす。1203が変数coordの位置を表わす。1204は開始位置1201と終了位置1202の距離である。これを
とする。1205は開始位置1201と変数coordの位置1203の距離である。これを
とする。1206は終了位置1202と変数coordの位置1203の距離である。これを
とする。グラデーションベクトルは向きと直角方向に平行移動して使用されるので、変数coordの位置におけるグラデーションの色は開始色から1207に示す距離だけ終了色方向に進んだ位置にある。ここで、距離1207である
を上記距離1204で除算した値を
とする。この時、1208に示すようにratioが0未満であれば、変数coordの位置1203は開始位置1201よりも前(図では左側)に位置する。1209に示すようにratioが0〜1の範囲であれば、変数coordの位置1203は開始位置1201と終了位置1203との間に位置する。1210に示すようにraitoが1より大きければ、変数coordの位置1203は終了位置1202よりも後(図では右側)に位置する。
ステップS1105は変数ratioが0未満かどうかの判定処理である。0未満であればステップS1106に進む。それ以外はステップS1107に進む。
ステップS1106は変数coordが表わす位置が変数gradが表わすグラデーションベクトルよりも前に位置する場合に、変数coordの位置におけるグラデーションの色値colorとして、グラデーションベクトルの開始色c1を設定する処理である。
ステップS1107は、変数ratioが1より大きいかどうかの判定処理である。1より大きければステップS1108に進む。それ以外はステップS1109に進む。
ステップS1108は変数coordが表わす位置が変数gradが表わすグラデーションベクトルよりも後に位置する場合に、変数coordの位置におけるグラデーションの色値colorとして、グラデーションベクトルの終了色c2を設定する処理である。
ステップS1109は変数coordが表わす位置が変数gradが表わすグラデーションベクトル内に位置する場合に、変数coordの位置におけるグラデーションの色値colorを計算する処理である。本ステップにおいては変数ratioは0〜1の値を取り、これはグラデーションベクトルの開始色c1から終了色c2までの距離を1とした場合の、c1からcolorまでの距離を示す。したがって、colorは以下の式により計算される。
color=(c2−c1)×ratio+c1
ステップS1110は引数bmpの更新処理である。ビットマップデータbmp.data[]およびフラグbmp.pre_or_post[]の座標位置coordの値をそれぞれ変数colorの値とpreとで置き換える。
ステップS1111〜S1114はループ処理である。
ステップS1111は変数coordの横方向の値coord.xを1加算する処理である。
ステップS1112は変数coordの横方向の値coord.xがビットマップデータの横方向の大きさbmp.wと等しくなったかどうかの判定処理である。等しければステップS1113に進み、等しくなければステップS1103に戻る。
ステップS1113は、変数coordの横方向の値coord.xを0に初期化し、変数coordの縦方向の値coord.yを1加算する処理である。
ステップS1114は変数coordの縦方向の値coord.yがビットマップデータの縦方向の大きさbmp.hと等しくなったかどうかの判定処理である。等しければステップS1115に進み、等しくなければステップS1103に戻る。
ステップS1115は終了である。本定義済み処理の戻り値はないが、引数bmpで渡したビットマップデータbmp.data[]およびフラグbmp.pre_or_post[]が更新される。
[プリンタ出力]
最後に、図15を参照して、プリンタ出力の動作について説明する。
図15は、プリンタ出力を行なう定義済み処理の動作を示すフローチャートである。本定義済み処理は、図9に示すフローチャートのステップS807から呼び出される。
ステップS1301は開始である。引数bmpは図9〜図10において、ステップS805で初期化し、ステップS823、S824、S828、S830でレンダリングされた変数bmpと同じ値を有する。
ステップS1302は変数の初期化処理である。coordはビットマップデータbmp.dataを左上から右下に向かってスキャンする際の座標値を保持する変数で、(x,y)はピクセル単位の座標値を表わす。図15に示したフローチャートは主に変数coordをループ変数とするループ処理で構成される。inputProfは入力プロファイル305の内容を保持する変数である。printerProfはプリンタプロファイル307の内容を保持する変数である。intentはレンダリングインテント308の内容を保持する変数である。outputbmp[]はプリンタ出力用のビットマップデータを保持する配列で、大きさはbmp.data[]と同じである。
ステップS1303は変数coordが指す座標値のビットマップデータとpreまたはpostの値をbmp.data[]とbmp.pre_or_post[]から取得する処理である。取得した値をそれぞれ変数dataとpre_or_postに格納する。
ステップS1304は変数pre_or_postが値preかどうかの判定処理である。この判定が真になる場合、該ピクセルにおける色値はすでにプリンタ313の色域に圧縮されている。その場合はステップS1306に進む。それ以外の場合はステップS1305に進む。
ステップS1305はCMM312のCMM.gm機能を利用して、ピクセルデータを入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)にレンダリングインテントintentで圧縮する処理である。結果は変数dataに上書きする。
ステップS1306では、変数dataの色値はすでにプリンタ313の色域(printerProfが表現)に圧縮されているので、CMM312のCMM.cc機能を利用して、入力色域(inputProfが表現)からプリンタ313の色域(printerProfが表現)に変換する処理である。結果はプリンタ出力用ビットマップデータoutputbmp[]の変数coordが指す座標位置に格納する。
ステップS1307〜S1310はループ処理である。
ステップS1307は変数coordの横方向の値coord.xを1加算する処理である。
ステップS1308は変数coordの横方向の値coord.xがビットマップデータの横方向の大きさbmp.wと等しくなったかどうかの判定処理である。等しければステップS1309に進み、等しくなければステップS1303に戻る。
ステップS1309は変数coordの縦方向の値coord.yを1加算する処理である。
ステップS1310は変数coordの縦方向の値coord.yがビットマップデータの縦方向の大きさbmp.hと等しくなったかどうかの判定処理である。等しければステップS1311に進み、等しくなければステップS1303に戻る。
ステップS1311はプリンタ出力用ビットマップデータoutputbmp[]を作成し終わったので、プリンタ313のコントローラ314に送信する処理である。プリンタ313は受信したビットマップデータをRAM209にビットマップデータ315として格納し、プリンタエンジン212をビットマップデータ315にしたがって制御して出力を行なう。
ステップS1312は終了である。戻り値はない。
[その他の実施形態]
上記実施形態では中間コードデータをクライアント101でレンダリングしたが、クライアント101からプリンタ103に中間コードデータを送信することで、レンダリングはプリンタ103で行なうようにしてもよい。
また上記実施形態では入力プロファイルが表現する入力色域(カラースペース)でレンダリングを行なったが、レンダリングプロファイル306が表現するレンダリング色域(カラースペース)でレンダリングしてもよいし、プリンタプロファイル307が表現するプリンタ色域(カラースペース)でレンダリングするようにしてもよい。
また上記実施形態ではPDLとしてSVG 1.1を使用したが、もちろんこれに限るものではなく、SVGのその他のバージョン、あるいは中間コードに変換可能なものであれば任意のPDLを使用することが可能である。
また上記実施形態では1ページの表示・印刷を行なう例を示したが、PDLが複数ページに対応するものであれば、中間コード、ビューワプログラム、コントローラをそれに対応させてもよい。
また上記実施形態ではSVG文書につき一つの入力プロファイルとレンダリングインテントを使用したが、SVG文書内に存在するオブジェクトの種類ごと、たとえばイメージ、グラフィックス、テキストオブジェクトごとに入力プロファイルとレンダリングインテントを指定できるようにしてもよい。さらに、個々のオブジェクトごとに入力プロファイルとレンダリングインテントを指定できるようにするシステムも考えられる。
また上記実施形態ではグラデーションとして線形グラデーションのみを使用したが、これ以外にも、放射型グラデーションを始めとする任意のグラデーションに対応可能である。また、グラデーションベクトルより前や後についてはそれぞれグラデーションの開始色と終了色を使用するとしたが、これ以外にも、グラデーションベクトルを繰り返して使ったり、端点で折り返して使ったりする手法がある。
また図1においてPCとプリンタはネットワーク接続されるとしたが、これ以外の接続形態であってもよく、たとえばPCとプリンタが直接接続されていたり、あるいはメモリカードやCDなどのメディアを通じてデータを受け渡しするような形態であっても、本発明の実施を妨げるものではない。
また図2においてプログラムはRAM202に格納されるとしたが、これに限るものではなく、他の実施形態においてはプログラムを外部記憶装置204から読み込んで実行するようにしてもよいし、ネットワークインタフェース203を介して受信して実行するようにしてもよい。また、図2には示していないが、ROM等の読み出し専用の内部記憶部から読み込んで実行するようにしてもよい。また、キーボード206やポインティングデバイス207の代わりに、あるいはそれらに加えて、音声入力等の他の入力装置を備えることもできる。また、ディスプレイ205、キーボード206、ポインティングデバイス207を他のコンピュータ装置と共有する場合も考えられる。
また図4において中間コードデータ303、ビットマップデータ304、315はRAMに保持したが、これ以外に、ファイルやデータベースその他の永続記憶に保存してもよい。また、同じPDL文書に対する中間コードデータはキャッシュしておいて、次回以降の処理に利用する形態も考えられる。
また図7において中間コードの仕様を示したが、使用可能な中間コードはこの仕様に限定されるものではない。たとえば単位系はmm以外の任意の単位系またはその組み合わせであってもよい。パスにはベジエ曲線、楕円弧、その他の数学的に表現可能な任意のパスを記述できるようにしてもよい。塗りは単色と線形グラデーションだけではなくブラシ、イメージ、放射型グラデーション等の複雑な塗りを行なえるようにしてもよい。色はRGB、RGBA以外にカラープロファイルによる指定、デバイスカラーによる指定、特色の指定なども行なえるようにしてもよい。また、オペコードとして1バイト整数、オペランドとして2バイト浮動小数点数を使うことも単なる一例であって、他のエンコード方法を使用しても構わない。あるいは、中間コードをプリンタ103に送信する形態においては、プリンタ103が解釈可能なPDLを用いても構わない。
また図11、図13において汎用的アルゴリズムを使用してビットマップ全体をスキャンし、各座標が引数pathが表現するパスに含まれるかどうかを判定したが、これ以外に、引数pathが表現するパスに含まれる座標をあらかじめ抽出し、それらの座標に対してレンダリングを行なったり、グラデーションについてはグラデーションベクトルの色値をあらかじめ計算しておいて、それをパス内に繰り返し適用する方法など、より効率の良い手法を採ったとしても、本発明は一般性を失わない。
なお、本発明は、前述した実施形態の機能を実現するソフトウェアのプログラムを、システムあるいは装置に直接あるいは遠隔から供給し、そのシステムあるいは装置のコンピュータがその供給されたプログラムコードを読み出して実行することによっても達成され得る。その場合、プログラムの機能を有していれば、その形態はプログラムである必要はない。
従って、本発明の機能処理をコンピュータで実現するために、そのコンピュータにインストールされるプログラムコード自体およびそのプログラムを格納した記憶媒体も本発明を構成することになる。つまり、本発明の特許請求の範囲には、本発明の機能処理を実現するためのコンピュータプログラム自体、およびそのプログラムを格納した記憶媒体も含まれる。
その場合、プログラムの機能を有していれば、オブジェクトコード、インタプリタにより実行されるプログラム、OSに供給するスクリプトデータ等、プログラムの形態を問わない。
プログラムを供給するための記憶媒体としては、例えば、フレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、MO、CD−ROM、CD−R、CD−RW、磁気テープ、不揮発性のメモリカード、ROM、DVD(DVD−ROM、DVD−R)などがある。
その他、プログラムの供給方法としては、クライアントコンピュータのブラウザを用いてインターネットのホームページに接続し、そのホームページから本発明のコンピュータプログラムそのもの、もしくは圧縮され自動インストール機能を含むファイルをハードディスク等の記憶媒体にダウンロードすることによっても供給できる。また、本発明のプログラムを構成するプログラムコードを複数のファイルに分割し、それぞれのファイルを異なるホームページからダウンロードすることによっても実現可能である。つまり、本発明の機能処理をコンピュータで実現するためのプログラムファイルを複数のユーザに対してダウンロードさせるWebサーバも、本発明の請求の範囲に含まれるものである。
また、本発明のプログラムを暗号化してCD−ROM等の記憶媒体に格納してユーザに配布し、所定の条件をクリアしたユーザに対し、インターネットを介してホームページから暗号化を解く鍵情報をダウンロードさせ、その鍵情報を使用することにより暗号化されたプログラムを実行してコンピュータにインストールさせて実現することも可能である。
また、コンピュータが、読み出したプログラムを実行することによって、前述した実施形態の機能が実現される他、そのプログラムの指示に基づき、コンピュータ上で稼動しているOSなどが、実際の処理の一部または全部を行ない、その処理によっても前述した実施形態の機能が実現され得る。
さらに、記憶媒体から読み出されたプログラムが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書き込まれた後、そのプログラムの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるCPUなどが実際の処理の一部または全部を行ない、その処理によっても前述した実施形態の機能が実現される。