━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ libpcd v0.20 簡易リファレンス Copyright 1999 Igarashi ──────────────────────────────────── ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0. はじめに ────────────────────────────────────  libpcd はまだまだ発展途上のライブラリです。今後、予告なしに仕様が変更 される可能性もあります。すみません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1. PCDINFO 型変数 ────────────────────────────────────  libpcd では、PhotoCD 画像ファイルへのアクセスは常に PCDINFO 型変数を介 して行われます。  PCDINFO 型変数の構造は以下のようになっています。メンバはいずれも参照の みにとどめ、書き込みは行わないでください。 typedef struct { FILE *fp; /* ファイルハンドル */ short reso; /* 解像度 */ unsigned short width; /* 画像の幅 */ unsigned short height; /* 画像の幅 */ unsigned short xsize; /* 画像を表示したときの幅 */ unsigned short ysize; /* 画像を表示したときの高さ */ unsigned short rot; /* 回転情報 */ unsigned char *YCCbuf; /* YCC リード用バッファへのポインタ */ unsigned short readline; /* 読み終えたライン数 */ } PCDINFO; ● fp  ファイルハンドルです。 ● reso  解像度を表す数値です。pcd_open() で指定した値が保存されていま す。 PCD_OVERVIEW16 PCD_OVERVIEW4 PCD_BASE PCD_4BASE PCD_16BASE PCD_64BASE ● width  画像の幅です。 ● height  画像の高さです。必ず width > height です。例えば PCD_BASE が対 象の場合、以下のようになります。 width = 768 height = 512 ● xsize  通常は width と同じ値ですが、縦位置の画像の場合は height と同 じ値が入ります。 ● ysize  通常は height と同じ値ですが、縦位置の画像の場合は width と同 じ値が入ります。 ● rot  回転情報を表す数値です。 0 回転なし 1 90 度回転(縦位置) 2 180 度回転 3 270 度回転(縦位置) ● YCCbuf  YCC リード用バッファへのポインタです。 ● readline  読み終えたライン数。pcd_*_oneline() が内部で使用します。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2. マクロリファレンス ──────────────────────────────────── ● pcd_width( PCDINFO *pcdinfo )  pcdinfo->width を得ます。 ● pcd_height( PCDINFO *pcdinfo )  pcdinfo->height を得ます。 ● pcd_xsize( PCDINFO *pcdinfo )  pcdinfo->xsize を得ます。 ● pcd_ysize( PCDINFO *pcdinfo )  pcdinfo->ysize を得ます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3. 関数リファレンス ──────────────────────────────────── ● pcd_open() 用途 PhotoCD 画像ファイルのオープン 書式 #include "libpcd.h" int pcd_open( PCDINFO *pcdinfo, short reso, char *filename ); 解説  filename で指定したファイルをオープンし、pcdinfo を初期化しま す。filename に NULL を指定すると、画像ファイルが標準入力から読 み込まれるように設定します。 filename が NULL でない場合、 filename は fopen() にそのまま渡され、バイナリモードでオープンし ます。  reso は解像度です。ただし、libpcd の現バージョンでは PCD_16BASE / PCD_64BASE の指定はできません。 PCD_OVERVIEW16 /* 192*128 */ /* ( 1/16BASE ) */ PCD_OVERVIEW4 /* 384*256 */ /* ( 1/4BASE ) */ PCD_BASE /* 768*512 */ PCD_4BASE /* 1536*1024 */ PCD_16BASE /* 3072*2048 */ PCD_64BASE /* 6144*4096 */ /* PRO-PhotoCD */  また、pcd_open() は内部で malloc() をコールし、YCC データ読み 込み用のメモリブロックを確保します。 戻り値  正常終了した場合は 0 を、エラーが発生した場合は 1 を返します。 エラーが発生した場合、グローバル変数 pcd_errno を設定します。 注意  回転情報を読み取って、pcdinfo->rot を設定しますが、回転情報が 格納されているファイル \PHOTO_CD\INFO.PCD は使用せず、画像ファイ ル中の回転情報を使用します。 ──────────────────────────────────── ● pcd_close() 用途 PhotoCD 画像ファイルのクローズ 書式 #include "libpcd.h" void pcd_close( PCDINFO *pcdinfo ); 解説  pcd_open() でオープンした PhotoCD 画像ファイルをクローズし、 pcd_open() が確保したメモリブロックを解放します。ただし、 pcd_open() で filename に NULL を指定した場合は、ファイルのクロー ズは行われません。 戻り値 戻り値はありません。 注意  pcd_open() で pcdinfo が初期化されていない状態で pcd_close() をコールしないでください。 ──────────────────────────────────── ● pcd_error() 用途 エラーメッセージの表示 書式 #include "libpcd.h" void pcd_error( void ); 解説  グローバル変数 pcd_errno の値に応じて、libpcd で発生したエラー メッセージを標準エラー出力へ出力します。 戻り値 戻り値はありません。 ──────────────────────────────────── ● pcd_torgb() ● pcd_tobgr() 用途 データをすべて読み込み、RGB データに変換して出力 書式 #include "libpcd.h" int pcd_torgb( PCDINFO *pcdinfo, unsigned char *dest, int flag ); int pcd_tobgr( PCDINFO *pcdinfo, unsigned char *dest, int flag ); 解説  画像ファイルからデータをすべて読み込み、YCC → RGB 変換し、 dest で示されるバッファに、 pcd_torgb() R, G, B, R, G, B, ... pcd_tobgr() B, G, R, B, G, R, ... の形式で出力します。RGB 1 組で 1 ピクセルのデータを表します。R / G / B はそれぞれ 1 バイトのデータで、0 〜 255 の値を持ちます。  flag に 0 以外の値を指定すると、画像ファイル中の回転情報を無視 します。 戻り値  正常終了した場合は 0 を、エラーが発生した場合は 1 を返します。 エラーが発生した場合、グローバル変数 pcd_errno を設定します。 注意  バッファ dest に必要なサイズは以下の通りです。バッファサイズの チェックは行わないので、サイズ不足に注意してください。 PCD_OVERVIEW16 192*128*3 = 73728 bytes PCD_OVERVIEW4 384*256*3 = 294912 bytes PCD_BASE 768*512*3 = 1179648 bytes PCD_4BASE 1536*1024*3 = 4718592 bytes PCD_16BASE 3072*2048*3 = 18874368 bytes PCD_64BASE 6144*4096*3 = 75497472 bytes ──────────────────────────────────── ● pcd_togrbi() 用途 データをすべて読み込み、GRBI データに変換して出力 書式 #include "libpcd.h" int pcd_togrbi( PCDINFO *pcdinfo, unsigned short *dest, int flag ); 解説  画像ファイルからデータをすべて読み込み、YCC → RGB 変換し、 dest で示されるバッファに、 GRBI, GRBI, ... の形式で出力します。GRBI で 1 ピクセルのデータを表し、 2 バイト の領域を使用します。R / G / B はそれぞれ 5 ビットのデータで、0 〜 31 の値を持ちます。また、輝度ビット I は常にリセットされます。  flag に 0 以外の値を指定すると、画像ファイル中の回転情報を無視 します。 戻り値  正常終了した場合は 0 を、エラーが発生した場合は 1 を返します。 エラーが発生した場合、グローバル変数 pcd_errno を設定します。 注意  バッファ dest に必要なサイズは以下の通りです。バッファサイズの チェックは行わないので、サイズ不足に注意してください。 PCD_OVERVIEW16 192*128*2 = 49152 bytes PCD_OVERVIEW4 384*256*2 = 196608 bytes PCD_BASE 768*512*2 = 786432 bytes PCD_4BASE 1536*1024*2 = 3145728 bytes PCD_16BASE 3072*2048*2 = 12582912 bytes PCD_64BASE 6144*4096*2 = 50331648 bytes  dest は偶数アドレスに整合されていなければなりません。 ──────────────────────────────────── ● pcd_torgb_oneline() ● pcd_tobgr_oneline() 用途 データを 1 ライン分読み込み、RGB / BGR データに変換して出力 書式 #include "libpcd.h" int pcd_torgb_oneline( PCDINFO *pcdinfo, unsigned char *dest ); int pcd_tobgr_oneline( PCDINFO *pcdinfo, unsigned char *dest ); 解説  画像ファイルからデータを 1 ライン分読み込み、YCC → RGB 変換し、 dest で示されるバッファに、 pcd_torgb_oneline() R, G, B, R, G, B, ... pcd_tobgr_oneline() B, G, R, B, G, R, ... の形式で出力します。RGB 1 組で 1 ピクセルのデータを表します。R / G / B はそれぞれ 1 バイトのデータで、0 〜 255 の値を持ちます。  画像ファイル中の回転情報に関係なく、画像の長い辺にそってデータ を読み込みます。つまり、pcdinfo->width ピクセル分のデータが読み 込まれます。  画像データをすべて読み込むには、pcd_torgb_oneline() / pcd_tobgr_oneline() を pcdinfo->height 回コールする必要がありま す。 戻り値  正常終了した場合は 0 を、エラーが発生した場合は 1 を返します。 エラーが発生した場合、グローバル変数 pcd_errno を設定します。 注意  バッファ dest に必要なサイズは以下の通りです。バッファサイズの チェックは行わないので、サイズ不足に注意してください。 PCD_OVERVIEW16 192*3 = 576 bytes PCD_OVERVIEW4 384*3 = 1152 bytes PCD_BASE 768*3 = 2304 bytes PCD_4BASE 1536*3 = 4608 bytes PCD_16BASE 3072*3 = 9216 bytes PCD_64BASE 6144*3 = 18432 bytes ──────────────────────────────────── ● pcd_togrbi_oneline() 用途 データを 1 ライン分読み込み、GRBI データに変換して出力 書式 #include "libpcd.h" int pcd_torgb_oneline( PCDINFO *pcdinfo, unsigned char *dest ); int pcd_tobgr_oneline( PCDINFO *pcdinfo, unsigned char *dest ); 解説  画像ファイルからデータを 1 ライン分読み込み、YCC → RGB 変換し、 dest で示されるバッファに、 GRBI, GRBI, ... の形式で出力します。GRBI で 1 ピクセルのデータを表し、 2 バイト の領域を使用します。R / G / B はそれぞれ 5 ビットのデータで、0 〜 31 の値を持ちます。また、輝度ビット I は常にリセットされます。  画像ファイル中の回転情報に関係なく、画像の長い辺にそってデータ を読み込みます。つまり、pcdinfo->width ピクセル分のデータが読み 込まれます。  画像データをすべて読み込むには、pcd_togrbi_oneline() を pcdinfo->height 回コールする必要があります。 戻り値  正常終了した場合は 0 を、エラーが発生した場合は 1 を返します。 エラーが発生した場合、グローバル変数 pcd_errno を設定します。 注意  バッファ dest に必要なサイズは以下の通りです。バッファサイズの チェックは行わないので、サイズ不足に注意してください。 PCD_OVERVIEW16 192*2 = 384 bytes PCD_OVERVIEW4 384*2 = 768 bytes PCD_BASE 768*2 = 1536 bytes PCD_4BASE 1536*2 = 3072 bytes PCD_16BASE 3072*2 = 6144 bytes PCD_64BASE 6144*2 = 12288 bytes  dest は偶数アドレスに整合されていなければなりません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4. 使用例 ────────────────────────────────────  pcd_torgb() / pcd_tobgr() / pcd_togrbi() の基本的な使い方は以下の通り です。 PCDINFO *pcdinfo; pcd_open( &pcdinfo, PCD_BASE, "IMG0001.PCD" ); buffer = malloc( pcd_width( &pcdinfo ) * pcd_height( &pcdinfo ) * RGB_PIXELSIZE ); pcd_torgb( &pcdinfo, buffer, flag ); : buffer の内容をあれこれする : pcd_close( &pcdinfo ); /* クローズ */ ────────────────────────────────────  pcd_torgb_oneline() / pcd_tobgr_oneline() / pcd_togrbi_oneline() の基 本的な使い方は以下の通りです。 PCDINFO *pcdinfo; pcd_open( &pcdinfo, PCD_BASE, "IMG0001.PCD" ); buffer = malloc( pcd_width( &pcdinfo ) * RGB_PIXELSIZE ); for ( i = 0; i < pcd_height( &pcd ); i++ ) { pcd_torgb_oneline( &pcdinfo, buffer ); : buffer の内容をあれこれする : } pcd_close( &pcdinfo ); /* クローズ */