Technote 1093
QuickDraw GX 'rdip' Resources: The Number of the Beast
目次
'rdip' リソース - 何ができるのか
定義
一般セットアップ情報 (上位ビット)
プレーン
要約
|
QuickDraw GX のラスタプリファレンス ('rdip') リソースを使用すると、ラスタプリンタドライバのデベロッパはプリンタによるイメージのレンダリング方法を細かく制御することができます。しかも、レンダリングツールそのものを書く必要はありません。しかし、参考文献が少ないため、このリソースの最適な使い方について多くのデベロッパが混乱しているのも事実です。このTECHNOTE では、次のテーマについて説明します。
| ● |
'rdip' に含まれるプレーンフラグと、他のフィールドへのそれらの影響 |
| ● |
その場で 'rdip' にパッチを当てる方法 |
| ● |
それぞれのプレーンをまとめてレンダリングする方法 |
この TECHNOTE を最大限に利用するためには、"IW-Half-Dither" サンプルコードを参考にすることを強くお勧めします。このサンプルコードは、「Developer CD series: Tool Chest Edition」に収録されています。また、Apple のデベロッパ Web サイト (ftp://ftpdev.info.apple.com/Developer_Services/Sample_Code/QuickDraw_GX/IW-Half-Dither/)でも入手できます。
この TECHNOTE は、主として、QuickDraw GX ラスタプリンタドライバに 'rdip' リソースを利用しようとしているデベロッパ向けに書かれています。この TECHNOTE では、CMYK プリンタに適合したサンプルを使っています。 |
'rdip' リソース - 何ができるのか
"ラスタプリファレンス" または 'rdip' リソースを使用すると、QuickDraw
GX がラスタベースのプリンタでイメージをレンダリングする方法を制御することができます。このリソースにはいくつかのフラグが用意されており、これらを正しくセットアップすれば、ディザまたはハーフトーンイメージのいずれかを選択できます。このリソースは、QuickDraw
GX の内部レンダリングエンジンを制御するために使用できます。
このリソースに含まれるさまざまなパラメータは、「Inside
Macintosh: QuickDraw GX Printing Extensions and Drivers」の 6-66
ページから 6-72 ページで解説されています。ただし、Inside Macintosh のこのセクションでは、各パラメータについて一通りの説明は加えられていますが、それぞれのパラメータが他のパラメータとどのように相互に関連しているかについてはまったく触れられていません。以下に、この構造体の定義を示します。定義の中では、gxRasterPrefsRec
という関連するデータ構造体で使用されている名前が使われています。
このデータ構造体は一見非常に複雑に見えますが、実際には一般セットアップ情報とプレーン情報という
2 つのセクションに分けることができます。各プレーン情報の値は、ハーフトーン処理とディザ処理のどちらを選択するかによって異なります。それぞれのプレーンは、QuickDraw
GX によって生成され、個別にレンダリングされると見なすことができます。一般に、ディザイメージは
1 つのプレーン内で作成されますが、ハーフトーンイメージには 4 つのプレーンが必要です。1
つのプレーン内でハーフトーンイメージを作成しようとすると、黒色が正しく処理されません。4
つのプレーンを使用するもう 1 つの利点は、角度を自由に変えられるということです。
定義
ラスタプリファレンス ('rdip') リソース (gxRasterPrefsType
型) は、ラスタドライバに対するレンダリングオプションを制御します。このリソースは、すべてのラスタプリンタドライバに必要です。
次に、ラスタプリファレンスの構造を示します。
'rdip'データ型
renderOptions gxRasterRenderOptions を含む long
hImageRes Fixed
vImageRes Fixed
minBandSize short
maxBandSize short
ramPercentage Fixed
ramSlop long
depth short
numPlanes short
プレーンセットアップ配列
planeOptions gxRasterPlaneOptions を含む long
angle Fixed
frequency Fixed
method gxDotType
tinting gxTintType
dotColor gxColor
backgroundColor gxColor
tintSpace gxColorSpace
planeSpace gxColorSpace
planeSet カラーセットまたはこのデータ構造体に含まれる gxColorSet のリソース ID
planeProfile カラー特性またはこのデータ構造体に含まれる gxColorProfile のリソース ID
一般セットアップ情報 (上位ビット)
● renderOptions: このパラメータを使って、レンダリングの方法を制御することができます。一般に、デフォルトの値である
gxDefaultRaster を使います。これにより、デフォルトのオプションを使ってイメージがレンダリングされ、転送モードが解決
(Resolve) されて、すべてのプレーンが同時にレンダリングされます。ただし、この設定が適切でないこともあります。
次のプレーンを印刷する前に、あるプレーンのレンダリングと印刷をまとめて行わなければならないこともあります。この場合は、gxOnePlaneAtATime
を使います。出力する必要のあるあらゆるプレーンに対して 1 つのプレーンレコードを指定することが必要になります。詳細については、この
TECHNOTE の「各プレーンをまとめて印刷する」のセクションを参照してください。
対象となるプリンタがすべてのデータの送信を必要とする場合は (黒色の領域も) 、gxSendAllBands
を使います。
gxDontResolveTransferModes は、対象となる 32 ビットデバイスがより高速な転送を行うことができるように、GX
の Resolving 転送モードを停止するために使います。転送モードの詳細については、「Inside
Macintosh: QuickDraw GX Objects」の5-11
ページを参照してください。大部分のアプリケーションでは、GX が自動的に最適な設定を行います。
|
定数
|
値
|
gxDefaultRaster |
0
|
gxDontResolveTransferModes |
0x01
|
gxRenderInReverse |
0x02
|
gxOnePlaneAtATime |
0x04
|
gxSendAllBands |
0x08
|
● hImageRes、vImageRes: これらは対象となるラスタデバイスの水平および垂直方向の解像度を表す固定小数点数です。たとえば、144
dpi のデバイスに対しては 0x00900000 を使います。
● minBandSize: これは生成される各バンドの最小の高さをピクセル単位で表します。
● maxBandSize: これは生成される各バンドの最大の高さをピクセル単位で表します。このパラメータに
0 を指定すると、ページ全体が生成されます。
● ramPercentage、ramSlop: これら 2 つの値は、どの程度の一時メモリが使用可能であるかを計算するために使います。RamSlop
は、他のアプリケーション (つまり、Finder とシステム) のために確保しておく使用可能な最小の一時メモリ容量です。RamPercentage
は、残されているメモリ容量の何 % を使用するかを指定します。計算式は次のようになります。
((使用可能なメモリ容量 - ramSlop) * ramPercentage)
この計算式の結果は、最小のバンドサイズの倍数に丸められます。たとえば、他のアプリケーションのために
100K のメモリを確保し、残ったメモリ容量の半分を使用する場合は、ramPercentage
に 0x00008000、ramSlop に 0x00019000 を使います。これらの値は、ドライバが十分な一時メモリを使ってそれなりの速度でイメージのレンダリングを行い、かつシステムをそれほど圧迫しないように設定する必要があります。
● depth: イメージングに使用するプレーン当たりのピクセル数です。
● numPlanes: フォローするプレーンの数です。通常、このパラメータの値は
1 または 4 になります。1 はディザレンダリングに対応し、4 はハーフトーンレンダリングに対応します。
プレーン
プレーンオプション
生成する各プレーンについて、プレーン情報を指定する必要があります (リソースのこの部分は
gxPlaneSetupRec データ構造体と同じです)。通常、ディザレンダリングを行うには
1 つのプレーンを生成し、ハーフトーンレンダリングを行うには 4 つのプレーンを生成します。
● planeOptions: このパラメータは次の値をとります。
|
定数
|
値
|
gxDefaultOffscreen |
0
|
gxDontSetHalftone |
1
|
gxDotTypeIsDitherLevel |
2
|
各プレーンに対するその他のパラメータの値は、ハーフトーンイメージまたはディザイメージのどちらを選択するかによって異なります。
ディザリングに対応するプレーンの値
ディザプレーンに使用する値のサンプルについては、「Inside
Macintosh: QuickDraw GX Printing Extensions and Drivers」の 3-63
ページを参照してください。ディザイメージの場合、大部分のフィールドは未使用のままにしておきます
(つまり無視されます)。QuickDraw GX のディザリングの概要については、「Inside
Macintosh: QuickDraw GX Objects」の 7-10
ページから 7-13 ページを参照してください。
● planeOptions: このパラメータは 3 に設定してください (gxDontSetHalftone
+ gxDotTypeIsDitherLevel)。gxDontSetHalftone はディザイメージの作成を
QuickDraw GX に指示し、gxDotTypeIsDitherLevel はディザレベルに対して、planeHalftone
に含まれる method パラメータを使用することを QuickDraw GX に指示します。
● planeHalftone: このパラメータは gxHalftone データ構造体を含み、ディザリングを行うとき、その大部分が使用されません。ただし、planeOptions
で gxDotTypeIsDitherLevel 定数を使用している場合は、ディザレベルを設定するために
method の値が使用されます。
angle: |
未使用 (0 に設定)。 |
frequency: |
未使用 (0 に設定)。 |
method: |
ディザレベルに使用される。 |
tinting: |
未使用 (gxLuminanceTint に設定)。 |
dotColor: |
未使用 (gxRGBSpace, gxNoProfile, 0x0000, 0x0000, 0x0000, 0x0000 に設定)。 |
backgroundColor: |
未使用 (gxRGBSpace, gxNoProfile, 0x0000, 0x0000, 0x0000, 0x0000 に設定)。 |
tintSpace: |
未使用 (gxRGBSpace に設定)。 |
● planeSpace: これはプレーンのカラースペースです。一般に、このパラメータには
gxIndexedSpace を設定し、次のパラメータで、カラースペースに対するリソース
ID またはカラースペース構造体を指定します。
● planeSet: カラースペースに対するリソース ID またはカラースペース構造体です。
● planeProfile: プレーンのカラー特性です。カラー特性がない場合は、このパラメータに
gxNoProfile を設定できます。
ハーフトーンレンダリングに対応するプレーンの値
ここでは、CMYK プリンタでのハーフトーンイメージの生成を取り扱います。
この処理を最適に行うには、4 つのプレーンをそれぞれ個別にレンダリングする必要があります。QuickDraw
GX のハーフトーンレンダリングの概要については、「Inside
Macintosh: QuickDraw GX Objects」の 7-13
から 7-17 を参照してください。
● planeOptions: このパラメータは 0 ( gxDefaultOffscreen
) に設定してください。他の 2 つの定数はディザリングに使用します。
● planeHalftone:
angle: このパラメータでは、ドットの見かけ上の方向を度単位で指定します。これは固定小数点数です。たとえば、15
度を指定するには、0x000F0000 を使います。
frequency: このパラメータは、1 インチ当たりのセル数を単位としたフォントのサイズです。これは固定小数点数です。たとえば、1
インチ当たり 45 セルに設定するには、0x002D0000 を使います。
method: このパラメータはドットの形状を定義します。
|
定数
|
値
|
gxRoundDot |
1
|
gxSpiralDot |
2
|
gxSquareDot |
3
|
gxLineDot |
4
|
gxEllipticDot |
5
|
gxTriangleDot |
6
|
gxDispersedDot |
7
|
tinting: このパラメータは現在のパスに関連し、CMYK に対して、次の値が割り当てられます。
|
定数
|
値
|
?/TD>
|
| gxComponent1Tint |
4
|
シアンパス |
| gxComponent2Tint |
5
|
マゼンタパス |
| gxComponent3Tint |
6
|
イエローパス |
| gxComponent4Tint |
7
|
ブラックパス |
dotColor: このパラメータには黒色のドットを設定します。これ以外の色を指定すると、イメージが正常にレンダリングされない原因となります。
gxRGBSpace, gxNoProfile, 0x0000, 0x0000, 0x0000, 0x0000
backgroundColor: プリンタのバックグラウンドカラーは通常白色であるため
(つまり用紙の色)、このパラメータには白色のドットを設定します。
gxRGBSpace, gxNoProfile, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF
tintSpace: このパラメータにはプレーンのカラースペースを設定します。CMYK
の場合は gxCMYKSpace に設定します。
● planeSpace: これはプレーンのオリジナルカラースペースです。ハーフトーンの場合、このパラメータは
gxNoSpace に設定します。
● planeSet: カラースペースが必要ないときは nil に設定します。
● planeProfile: このパラメータは gxNoProfile に設定します。
ImageWriter II でハーフトーンレンダリングを行うための
'rdip' リソースのサンプル
→サンプルコードの表示
その場でラスタプリファレンスにパッチを当てる
ドライバによるイメージのレンダリング方法を変更したい場合があります。たとえば、デフォルトの
angle と frequency を使ってハーフトーンイメージのレンダリングを行うとモアレが発生することがあります。この場合、パラメータの設定値をわずかに変更することで問題を解決できます。ただし、単純に
'rdip' にパッチを当てるだけでは GX ドライバのレンダリング方法を変更することはできません。
この処理を実行するには、ユニバーサルイメージメッセージ GXSetupImageData
をオーバーライドして、このメッセージに渡すデータに変更を加えます。このメッセージを使用すると、任意の種類のプリンタ
(ラスタ、PostScript またはベクタプリンタ) に関するレンダリング情報を変更することができます。このメッセージに渡すデータの種類は、対象となるドライバの種類によって異なります。また、このメッセージを呼び出すことそのものには意味はありません。情報が必ずしも読み込まれるわけではないということです。このため、オーバーライドで最初に行うべきことはメッセージを送り出すことです。そうすればデフォルトの値が読み込まれます。ラスタドライバの場合は、gxRasterImageDataHdl
が渡されます。
OSErr My_GXSetupImageData ( gxRasterImageDataHdl hImageData )
{
OSErr anErr;
anErr = Forward_GXSetupImageData ( hImageData );
nrequire ( anErr, Forward_GXSetupImageData );
//
// ここでパッチを当てる
//
// 一般セットアップ情報 (上位ビット) は
// 次のようにアクセスできる:
//
// (*hImageData)->theSetup.xxxxxxx
//
// 各プレーンの情報は次のようにアクセスできる
//
// (*hImageData)->theSetup.planeSetup[0].xxxxxxx
//
Forward_GXSetupImageData:
return anErr;
}
イメージがハーフトーンまたはディザのどちらでレンダリングされる場合にも、任意の数のパラメータを変更することができます。この処理のサンプルについては、"IW-Half-Dither" サンプルコードを参照してください。
各プレーンをまとめて印刷する
一部のプリンタでは、それぞれのプレーンのレンダリングと印刷を同時に行う必要があります
(たとえば、印刷ヘッドが 1 つしかなく、しかもインクの交換に時間のかかるプリンタ)。
この処理を実行する 1 つの方法として、レンダリングオプションに含まれる gxOnePlaneAtATime
オプションを使用することができます。この方法では、指定したプレーンごとにすべてのラスタデータが一度に送信されます。ただし、この方法が混乱のもとになる場合もあります。たとえば、指定した
4 つのプレーンを含む 'rdip' リソースがあるとします。一見 GXRasterPackageBitmap()
メッセージが 4 回呼び出されるように思われるかもしれません。しかし、これは誤りで、実際には
16 回呼び出されることになります。つまり、4 つのプレーンの各プレーンについて 1 回ずつという計算です。
この問題を回避するためいくつかの方法が用意されています。最も簡単だと思われる方法は、GXRasterPackageBitmap()
メッセージから不必要なプレーンを排除することです。現在印刷中のプレーンを追跡するカウンタをグローバル構造体にセットアップし、さらにレンダリングオプションに含まれる
gxSendAllBands オプションを使用する必要があります。
グローバル構造体 pGlobals とプレーンパラメータ currentPlane を呼び出すことになります。GXRenderPage()
メッセージは次のようになります。
OSErr My_GXRenderPage ( gxFormat theFormat,
gxShape thePage,
gxPageInfoRecord *pageInfo,
gxRasterImageDataHdl imageInfo)
{
......
pGlobals->currentPlane = 0;
......
}
これにより、各プレーンがレンダリングされる前に、currentPlane カウンタの値が確実に
0 に設定されます。
プレーンカウンタの値は GXRasterPackageBitmap() メッセージの中でインクリメントされます。ページの上端にいて、先頭のバンドを印刷しようとしているかどうかがチェックされます。もしそうであれば、ヘッドの色を
currentPlane の色に変更する必要があります。一方、先頭のプレーンを印刷していない場合は、ヘッドをページの上端に戻す必要があります。
OSErr My_GXRasterPackageBitmap (
gxRasterPackageBitmapRec *pPackage,
Ptr buffer, // データはここ + bufferPos に行く
unsigned long *bufferPos, // どの程度のバッファがすでに
// いっぱいになっているか
gxRasterImageDataHdl hImageData) // プライベートイメージデータ
{
......
......
if ( (pPackage->startRaster == 0)
&& (pPackage->colorBand == 1 ) )
{
pGlobals->currentPlane++;
// ヘッドの色を変更する
// また、currentPlane が > 1 の場合は、ヘッドを元に戻すためのコードを詰め込む
}
......
このオーバーライドでは不必要なデータを排除する必要もあります。この処理を行うには、単純にそのデータを印刷しないようにします。
// このカラーバンドを印刷する必要があるかどうか確認する
if ( pPackage->colorBand == pGlobals->currentPlane)
{
// これでラスタ情報がプリンタに送信される
......
}
要約
'rdip' リソースは、QuickDraw GX プリンタドライバのデベロッパにとって非常に役に立ちます。'rdip'
を使用すると、自分でレンダリングツールを書くことなく、イメージのレンダリング方法を細かく制御することができます。しかし、この非常に柔軟な機能とは引き替えに、このリソースは非常に複雑なデータ構造体であり、目的の効果をあげるためには何度かの実験を行わなければならないこともあります。この
TECHNOTE が GX テクノロジーを最大限に活かしたドライバを書くための一助になれば幸いです。
参考文献
|