Apple Developer Connection
高度な検索
Member Login ログイン | ご入会 ADC連絡先

Technical Note TN2149
CUPSラスタプリントで16bpcデータを取得

Mac OS X version 10.2 (Jaguar) で、アップルはMac OS XにおけるプリントサポートのバックボーンとしてCUPSプリントシステムを配備しました。CUPSはラスタ出力デバイスをサポートするプリンタドライバを作成するための、簡単なプログラミングモデルを提供します。Jaguarに実装されたCUPSは、RGB、グレー、黒、およびCMYKなど、いくつかのCUPS色空間をサポートしていました。JaguarとMac OS X version 10.3 (Panther) では、要求される色空間に応じて、利用可能なピクセル深度として1bpcc (bits-per-color component) または8bpcc(cupsBitsPerColor値)がサポートされていました。テクニカルQ&A 1368には、各バージョンのMac OS Xに実装されたCUPSがサポートしている色空間とビット深度のテーブルが掲載されています。





Mac OS X version 10.4 (Tiger) から、CUPSプリントシステム用のラスタプリンタドライバを作成する際に、16bpccでビットマップラスタデータを受け取ることができるようになりました。より深いピクセルデータを扱うことで、色の忠実性と精度を向上させる機会が得られます。16bpc (bits-per-color) のサポートはCUPS色空間のCUPS_CSPACE_KCUPS_CSPACE_WCUPS_CSPACE_RGB、およびCUPS_CSPACE_CMYKで、cupsColorOrder値をCUPS_ORDER_CHUNKEDに設定した場合に限られます。

バイト順序(エンディアン)

1bpccおよび8bpccのラスタデータに関しては、各ピクセルの色成分データが1バイト以下のサイズであるため、特定色成分のデータのバイト順序は明白です。16bpcのデータに関しては、特定色成分のカラー値は2バイトで、バイト順序はネイティブのバイト順序になるように定義されています。すなわち、ビッグエンディアンのマシンで実行するときの16bpcのデータに関しては、各色成分値のバイト順序はビッグエンディアンです。リトルエンディアンのマシンで実行するときの16bpcのデータに関しては、各色成分値のバイト順序はリトルエンディアンです。この手法は16bpcのCUPSラスタデータを受け取ることを想定して、CUPSフィルタに渡されるデータを最高のパフォーマンスで最も簡単に処理します。ただし、16bpcのデータを処理するCUPSフィルタは、ラスタデータの出力元のアーキテクチャがフィルタのアーキテクチャと一致しているかどうかを調べる必要があります。

ラスタデータの出力元のアーキテクチャがラスタを処理するフィルタと同じであるかを調べるために、CUPSには簡単な方法が用意されています。cupsRasterOpen関数は、この確認に使用するsyncフィールドを含むcups_raster_t構造体を返します。この確認に関するコードはリスト1のようになります。

リスト1:エンディアンデータのスワップが必要かどうかの確認

bool isRasterEndianSwapNeeded(int in_fd) {
   bool swap16BitData = false;
    cups_raster_t *raster;
    // in_fdは、stdinなどからラスタを読み取る
    // ファイルの入力ファイル記述子。
    raster = cupsRasterOpen(in_fd, CUPS_RASTER_READ);
    if(raster->sync == CUPS_RASTER_REVSYNC)
      swap16BitData = true;
    return swap16BitData;
}

cupsRasterOpenから返されるcups_raster_tsyncフィールドがCUPS_RASTER_REVSYNCと等しい場合、ラスタデータを生成したフィルタのアーキテクチャとお使いのフィルタのアーキテクチャは異なるため、フィルタが取得する16ビットの整数データをスワップする必要があります。

先頭に戻る

16bpcデータの要求

16bpcのデータが必要なことを指定するために、デベロッパが使用できる方法が2つあります。どちらの方法が最適であるかは、データを受け取るドライバがTigerより前のバージョンで動作することを目的としているかどうかによって決まります。

Mac OS X 10.4以降のシステム専用

16bpcのラスタデータを受け取り、そのフォーマットをサポートするシステムでドライバを動作させることにのみ関心がある場合は、cupsBitsPerColor値として16を指定するだけです。そのための一般的な方法は、PPDファイルで*ColorModelキーワードの呼び出しコードで指定することです。たとえば、すでに8bpccを要求している場合、PPDファイルにはリスト2に示すような行があります。

リスト2:PPDファイルでcupsBitsPerColor値として8を指定

*ColorModel RGB/RGB Color:"<</cupsColorSpace 1/cupsColorOrder 0/cupsBitsPerColor 8>>setpagedevice"

これはCUPS_CSPACE_RGB色空間、チャンク方式のピクセル、および8bpccを指定します。つまり、色データのフォーマットは次のようになります。

RGBRGBRGB...

各カラー値は単一バイトで指定されます。

同じパラメータを16bpccで指定する場合は、PPDファイルで相当する行をリスト3に示すように変更します。

リスト3:PPDファイルでcupsBitsPerColor値として16を指定

*ColorModel RGB/RGB Color:"<</cupsColorSpace 1/cupsColorOrder 0/cupsBitsPerColor 16>>setpagedevice"

これはCUPS_CSPACE_RGB色空間、チャンク方式のピクセル、および16bpccを指定します。つまり、色データのフォーマットは次のようになります。

RGBRGBRGB...

各カラー値は、ホストのエンディアンフォーマットの2バイト整数値として指定されます。

この方法は簡単ですが、Tigerより前のバージョンのMac OS XまたはcupsBitsPerColor値として16をサポートしていない他のCUPSプリントサーバで実行すると失敗します。

先頭に戻る

他のシステムとの互換性

値が16のcupsBitsPerColorを使用しているCUPSラスタプリンタドライバは、Tigerより前のMac OS Xバージョンでは失敗します。Tiger以前のバージョンは、この色深度をサポートしていないためです。同様に、Tiger以外のほとんどのシステムのCUPSプリントサーバは、値が16のcupsBitsPerColorをサポートしていません。そのため、他のシステムとの互換性を維持したい場合は別の方法をとる必要があります。

ドライバで16bpccデータを優先することを指定できるように、cupsPreferredBitsPerColorキーが導入されました。このキーは、これをサポートしていないCUPSシステムには無視されます。このキーの一般的な使い方は、リスト4に示すように、PPDファイルで*ColorModeキーワードの呼び出しコードで指定することです。

リスト4:16bpcを優先することを指定しながら、Mac OS X 10.4より前のシステムでは8bpcとの互換性を維持

*ColorModel RGB/RGB Color:"
    <</cupsColorSpace 1/cupsColorOrder 0/cupsBitsPerColor 8
    /cupsPreferredBitsPerColor 16>>setpagedevice"
*End

cupsPreferredBitsPerColorキーを認識するシステムでは、これはCUPS_CSPACE_RGB色空間、チャンク方式のピクセル、および16bpccを指定します。つまり、色データのフォーマットは次のようになります。

RGBRGBRGB...

各カラー値は、ホストのエンディアンフォーマットの2バイト整数値として指定されます。cupsPreferredBitsPerColorキーをサポートしていないシステムでは、これは8bpccのデータを指定します。

cupsPreferredBitsPerColorキーを認識しないCUPSバージョンは、これを単に無視して、8bpcのラスタデータを供給します。このキーを認識し、16bpccのデータをサポートしているバージョンは、16bpccのラスタデータを供給します。

このようにデータ要求を指定するCUPSプリンタドライバは、各ページラスタの前にCUPSラスタヘッダ構造体を使用し、それらに提供されるラスタデータのフォーマットを判断する必要があります。このヘッダでheader.cupsBitsPerColor値を8に設定すると、ラスタデータが8bpcになります。つまり、システムは16bpcのデータを供給できません。ヘッダでheader.cupsBitsPerColor値を16に設定すると、ラスタデータは16bpccになります。

先頭に戻る

要約

Mac OS X v10.4以降では、CUPSラスタプリンタドライバへの16bpccデータの提供をサポートしています。深い色データを利用することで、一定の出力デバイスから優れた結果を得る可能性がもたらされます。深い色をサポートしていないCUPSとの互換性も維持しながら深い色データを要求できるため、1つのドライバを幅広いプラットフォームやOSバージョンに配備することができます。

先頭に戻る

ドキュメント改訂履歴

日付メモ
2005-08-24CUPSラスタプリントで16bpcデータを取得。

掲載日: 2005-08-24




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.