フィルタ

ラスタ図形作画演算子のソースとして用いられるデータに対して, 特に伸長などの,特殊なデータ変換を実行することは,しばしば有用である。 SPDLでは,このようなデータ変換をフィルタという形で提供する。 フィルタの重要な特質は,それらを重ねることができる,言い換えれば, パイプライン化できることである。パイプライン化されたフィルタ間は, ストリームオブジェクトの形で接続することができる。 この節では,フィルタの意味,ストリームオブジェクト,この規格で規定する標準フィルタ,及び新たな ストリームオブジェクトを形成し,フィルタをパイプライン化するための, Filter演算子を示す。

フィルタのモデル

; this is not a Data Source Resource), parameters for the filter to be used (if necessary), and the name of the filter. The Filter operator returns a filtered StreamObject that can be used as an operand to subsequent executions of the Filter operator or to other operators (see ). ]]> フィルタを利用するには,文書中でFilter演算子を用いる。 この演算子は,オペランドとしてデータソース(データソースの解説については, 31.1.1参照。ただし,これは,データソース資源ではないので注意するこ と。),並びに(必要であれば)フィルタで用いるパラメタ,及びフィルタの名前を とる。 Filter演算子は,フィルタされたストリームオブジェクトを返し,これが 引き続くFilter演算子の実行や,他の演算子(28.参照)の オペランドとして使われる。

フィルタに対するデータソース

フィルタされたストリームオブジェクトが演算子によってアクセスされる場合, そのストリームオブジェクトが対応づけられているフィルタのパイプライン の中の最初のデータソースがデータとしてアクセスされる。 そのデータは,パイプライン化されたすべてのフィルタを順番に通り, 結果のフィルタされたデータは,そのストリームオブジェクトにアクセスする 演算子に渡される。

ストリームオブジェクト,手続き,及びオクテット列の,三つの型のデータが フィルタのデータソースとなりうる. 31.1.1.1から31.1.1.3まででは,これらがそれぞれ,フィルタのデータソースとして どのように使われるかを述べる。

ストリームオブジェクト

フィルタのデータソースとして文書中にもっとも多く現れるのは, ストリームオブジェクトであると考えられる。 ストリームオブジェクトは,次の二つの何れかの方法で得られる。

from one filter can be the input to another filter. ]]> フィルタによって定義されるデータ変換の出力としてFilter演算子から 返されるストリームオブジェクトは,次に続くFilter演算子を実行するための オペランドとして用いることができるから, フィルタは,パイプライン化できる。 このようにして,一つのフィルタの出力を別のフィルタの入力とすることができる。

手続き

フィルタに対するデータソースは,手続きであってもよい。 フィルタは,変換するための次のデータが必要になったときに手続きを呼び出す。 手続きは,任意個のデータのオクテットを含むオクテット列に対する参照である, オクテット列参照型の値を(オペランドスタック上に)返すものとする。 これに対して,フィルタは,このオクテット列参照をスタックから降ろして, その内容をフィルタの入力として用いる。

); any leftover data in the final OctetString is discarded. The Procedure can return an OctetStringReference to an OctetString of length 0 to indicate that no more data is available. ]]> この処理は,フィルタがそのデータ終了条件(31.1.2参照)に出会うまで 繰り返され,最後のオクテット列の中で残されたデータは捨てられる。 手続きは,もはや利用できるデータが無いことを示すために,長さ 0 の オクテット列に対するオクテット列参照を返すことができる。 End-of-Data|データ終了|n|S 31.1.2|t

フィルタの実装においては, 手続きからその参照が返されたデータソースのオクテット列中の すべてのオクテットを,フィルタが次のデータを取得する目的で 手続きを再度呼び出す前に使うか又はそれらを安全に格納するものとする。 これによって,手続き側では,1個のオクテット列をバッファとして割り当てておき, 毎回,内容の異なる同一のオクテット列に対する参照を返すことができる。

オクテット列

), it ignores the remainder of the OctetString; otherwise, it continues until it has exhausted the contents of the OctetString. ]]> フィルタに対するデータソースがオクテット列である場合, フィルタは,単にその内容を復号すべきデータとして用いる。 フィルタがそのデータ終了条件(31.1.2参照)に出会うとそのオクテット列の 残りの部分を無視し,そうでない場合には,オクテット列の内容を使いきるまで 処理を続ける。

データの終了

. ]]> フィルタがデータに対するフィルタを継続できない状態に到達する場合があり, これをデータ終了(EOD)条件と呼ぶ。 多くのフィルタは,読み込んでいるデータの中に符号化されたEODマーカを検出 することができる. ただし,このマーカの形態は,そのフィルタに依存する。 まれには,符号化されたデータ中の明示的なマーカの代わりに, オクテットの総数又は行数のような予め決まった情報に基づいた EOD条件もある。各フィルタの EOD条件については,31.2でフィルタごとに規定する。

フィルタ識別子

構造中でパラメタ化される色空間オブジェクトとは異なり,フィルタは, 内容中において,その実現値が生成される時点で パラメタ化される。 フィルタは,プログラムの制御下において,Filter演算子を実行することに よってパラメタ化される。 このため,あらかじめ定義されたフィルタ資源を,内容中にお いて異なるパラメタの集合と共に何度も再利用することができる。 フィルタ識別子は, 資源宣言によってあらかじめフィルタ資源に結び付けられた内部資源識別子 の値をオペランドとして,FindResource 演算子を実行することによって取得する。 below ]]> FindResource 演算子によって返される結果は,オクテット列参照とする。 これは,Filterに対する公開識別子(ISO/IEC 9070に定めるとおり)の 正規文字列を含むオクテット列に対する参照である。 この規格で定めるフィルタについては,規格の名称は"ISO/IEC 10180"とし, そのオブジェクト名は31.2の個々のフィルタの記述の中で規定する。

標準フィルタ

次の31.2.1から31.2.6まででは,この規格で規定される標準フィルタの意味,名前, 及びパラメタを示す。幾つかのフィルタ(例えば,CCITTFAXDecode)のアルゴリズム については,正式に規格化されているが,その他のフィルタ(例えば,ASCII85Decode) のアルゴリズムについては,コンピュータ業界で広く用いられている実質的標準に 基づいている。 この規格に適合した実装において,この規格に定められていないフィルタを 追加してもよい。

ASCIIHexDecode

フィルタASCIIHexDecodeのオブジェクト名は,Filter::ASCIIHexDecodeとする。 フィルタ ASCIIHexDecode には,必要なパラメタがない。このフィルタは, ASCII符号化されたオクテットの対を復号して, 2進データを生成する。 ASCII符号化された16進数字(0-9,及びA-F又は a-f) の各対に対して,このフィルタでは,最初の数をオクテットの上位4ビットの 16進値として,2番目の数を下位4ビットの16進値として解釈し, 入力における2個のオクテットごとに出力において1個のオクテットを生成する。 indicates EOD. Any other characters will cause RaiseError to be invoked with DataError as its operand. ]]> すべての空白文字(空白,タブ,復帰,改行,書式送り及びヌル)は, 無視される。ASCII文字">"は,EODを表す。 その他の文字が入力に現れると,DataErrorをオペランドとして RaiseErrorが実行される。

フィルタが奇数番目の16進数字を読み込んだところで EOD に出会うと, フィルタは,0 をもう一つ読み込んだものとして振る舞う。

ASCII85Decode

フィルタASCII85Decodeのオブジェクト名は,Filter::ASCII85Decodeとする。 フィルタ ASCII85Decode には,必要なパラメタがない。 このフィルタは,基数85でASCII符号化されたデータを復号して, 2進データを生成する。 入力データにおける5オクテットに対して 4オクテットの2進データが生成される。 入力データは,次のとおりに符号化される。

b1 b2 b3 b4) and the encoded 5-tuple is (c1 c2 c3 c4 c5), then the relation between them is ]]> 2進データのオクテットは,四つ組(4個からなるグループ)毎に符号化される。 それぞれの四つ組は,ASCII符号文字の五つ組を生成するために用いられる。 いま,2進の四つ組が(b1 b2 b3 b4), かつ符号化された五つ組が(c1 c2 c3 c4 c5) とすると,それらの間には,次の関係が成立する。 (b1 × 2563) + (b2 × 2562) + (b3 × 256) + b4 = (c1 × 854) + (c2 × 853) + (c3 × 852) + (c4 × 85) + c5

つまり,2進データの4オクテットを 256進数として解釈し,それを 85進数に変換する。この結果の 5桁の数字(c1 c2 c3 c4 c5)のそれぞれに, 文字"!"のASCIIコードである 33を加えることで ASCII文字に変換される。 このようにして"!"から"u"までの範囲のASCII文字が用いられ,"!"が0を, "u"が84を表す。 特別な場合として,5けたすべてが0であるときには,"!!!!!"の代わりに1個の 文字"z"で表す。

すべての空白文字(スペース,タブ,復帰,改行,書式送り,及びヌル)は, 無視される。 " and the filter will reach EOD. Any other characters will cause RaiseError to be invoked with DataError as its operand. Also, any character sequences that represent impossible combinations in the ASCII base-85 encoding will cause RaiseError to be invoked with IOError as its operand. ]]> フィルタが入力において文字"˜"に出会った場合, その次の文字は,">"とし,そのときフィルタはEODに到達する。 その他の文字が入力に現れると,DataErrorをオペランドとして RaiseErrorが実行される。 さらに,基数85のASCII符号化を表現する上であり得ない文字の組合せが入力に現れた場合には, IOErrorをオペランドとしてRaiseErrorが実行される。

LZWDecode

オブジェクト名Filter::LZWDecodeは,フィルタ LZWDecoder のために 予約されている。 of the TIFF 6.0 Specification, dated June 3, 1992 available from Adobe Corporation, Seattle, Washington. The encoded data format and the decoding algorithm are as specified in that Section. The code 257 indicates EOD. ]]> LZWDecodeフィルタには,必要なパラメタがない。 このフィルタは,1992年 6月 3日付けの TIFF 6.0 規格 (米国ワシントン州シアトルのアドビ社から入手可能)の13.に記された復号法を提供する。 符号化されたデータのフォーマット及びその復号方法は,そこに記述されている。 コード257がEODを表す。

RunLengthDecode

フィルタRunLengthDecodeのオブジェクト名は,Filter::RunLengthDecodeとする。 フィルタRunLengthDecodeには,必要なパラメタはない。 このフィルタは,ラン長符号化形式のデータを復号する。 符号化されたデータは, ランの並びから構成され,このランは,長さを表す1個のオクテットと, それに続く 1個以上 128個以下のデータのオクテットとから構成される。 長さオクテットの値が0以上127以下の場合,それに続く長さ+1 (1以上128以下)個のオクテットがそのままフィルタの出力にコピーされる。 長さが129以上255以下の場合,それに続く1個のオクテットが 257-長さ(2以上128以下)回繰り返して出力される。 ラン長が128であるとき,EODを表す。

CCITTFaxDecode

フィルタCCITTFaxDecodeのオブジェクト名は,Filter::CCITTFaxDecodeとする。 フィルタCCITTFaxDecodeは,Filter演算子に辞書の形式で渡される 幾つかのパラメタを必要とする。 このフィルタは,CCITT Blue Book, Vol VII.3 (1988) における 勧告T.4及びT.6に示されるグループ3及びグループ4の両方の符号化方法を扱う。 符号化されたデータのフォーマット,及び復号のアルゴリズムは,これらの 勧告の中で示されている。フィルタが不正に符号化されたデータに 出会った場合,DataErrorをオペランドとしてRaiseErrorが 実行される。 この場合,フィルタは,エラー訂正も再同期も行わない。 EODを示す形式は,辞書中のRowsキーの値によって決定される。 SPDLにおける勧告T.4及びT.6の扱いは,データの復号に限定されている。 SPDLは,実際のファクシミリ装置間で通信するために必要な,初期接続及び ハンドシェークのプロトコルを含まない。 このフィルタは,ファクシミリ用の2階調のサンプルラスタ図形画像を SPDL文書に効率的に取り込むことを可能にすることを目的とする。

次の31.2.4.1から31.2.4.7まででは,CCITTFaxDecodeフィルタに対するFilter 演算子に渡される辞書参照オペランドで参照される辞書中のパラメタ群に ついて規定する。

K

任意選択のキーと値との対<K: 整数>は,ソースデータを符号化するのに 用いられた符号化手法を指定する。負の値は,純粋な2次元符号化(グループ4)を表し, 0 は,純粋な1次元符号化(グループ3, 1-D)を,正の値は,1次元及び2次元の混合符号化 (グループ3, 2-D)を表す。 辞書中にキーKが存在しない場合,フィルタが用いる無指定時値は,0 とする。

EndOfLine

任意選択のキーと値との対<EndOfLine: 論理値>は,データの各行の 先頭に行終了のビットパターンを付けてソースデータが符号化されているか どうかを指定する。 辞書中にキーEndOfLineが存在しない場合,フィルタが用いる無指定時値は, 偽とする。

EncodedByteAlign

任意選択のキーと値との対 <EncodedByteAlign: 論理値>は, データの各行がオクテット境界から始まることを保証するため, 各データ行の先頭に必要な数だけ余分な0のビットを付加して ソースデータが符号化されているかどうかを指定する。 EncodedByteAlignが真のとき,ソースデータの中に余分な 0 の ビットがある。辞書中にキーEncodedByteAlignが存在しない場合, フィルタが用いる無指定時値は,偽とする。

Columns

任意選択のキーと値との対<Columns: 非負整数>は,ラスタ図形画像の幅を ピクセル単位で指定する。辞書中にキーColumnが存在しない場合, フィルタが用いる無指定時値は,1728とする。

Rows

任意選択のキーと値との対<Rows: 非負整数>は,ラスタ図形画像の高さを スキャンライン単位で指定する。 このパラメタが 0 の場合,ラスタ図形画像の高さは,あらかじめ定められておらず, 符号化されたデータは,ブロック終了のビットパターン,又はフィルタの データソースのEOD条件によって終わるものとする。 辞書中にキーRowsが存在しない場合,フィルタが用いる無指定時値は, 0とする。

EndOfBlock

任意選択のキーと値との対 <EndOfBlock: 論理値>は,ソースデータに おいて符号化されたデータの後にブロック終了ビットパターンが付与されているか 否かを指定する。EndOfBlockの値が真であるとき,Rowsパラメタは, 無効になる。 辞書中にキーEndOfBlockが存在しない場合,フィルタが用いる無指定時値は, 真とする。

ブロック終了パターンは,Kパラメタに応じて, CCITTのend-of-facsimile-block (EOFB)又はreturn-to-control (RTC)のいずれか 適切な方となる。

BlackIs1

任意選択のキーと値との対 <BlackIs1: 論理値>が真であるとき, 値が1であるビットが黒のピクセル,値が0であるビットが白のピクセルであると 解釈される。 辞書中にキーBlackIs1の項目が存在しない場合,フィルタが用いる 無指定時値は,偽とする。

NullDecode

フィルタ NullDecode のオブジェクト名は,Filter::NullDecodeとする。 フィルタ NullDecode は,データの変換を行わない.すなわち,フィルタの出力は, その入力と等価とする。このフィルタは,EODマーカの検出を必要としないことから, 任意のデータソース(手続き又はオクテット列)を容易にデータソース として扱うことが可能となる。

フィルタNullDecodeは,次の2個のパラメタをとる。

  • <EODstring: オクテット列参照>
  • <EODcount: 非負整数> これらによってフィルタがEODを認識するための条件を指定する。 EODcountの値が正(かつ,EODstringの長さが非零)のとき, フィルタは,ちょうどEODcount個のEODstringのインスタンスに出会うまで データを通し,しかる後にEODに到達する。 出現したすべてのEODstringも,そのまま通される。

    EODcountが0 (かつ,EODstringの長さが非零)のとき, EODstringの最初の出現によってEODに達する。 この場合,EODstringは,フィルタに消費され,フィルタを通ることはない。

    いずれの場合にも,重なり合ったEODstringは, 認識されない。例えば,入力EODstring EODstringは,長さ0であってもよい。このような場合, EODcountが正であれば,フィルタは,単に任意のデータのEODcount個のオクテット を出力に通す。 EODcountの値が0の場合には,EODマーカの検出が無効となり, フィルタは,EODに到達することがなくなる。 これは,主として,手続き又はオクテット列をデータソースとして 用いる場合に有用である。

    演算子

    . In addition to these operator-specific exceptions, there are generic exceptions which may be raised during the interpretation of almost any operator. These generic exceptions and their semantics are described in . ]]> Filter演算子及びその意味に関する規定は,演算子を解釈した結果 として内容例外を発生させうる条件についての規定を含む。 内容例外及び例外処理は,36.で規定する。 これら演算子固有の例外に加えて,ほとんどどの演算子の解釈時にも 発生しうる共通的な例外もある。 これらの共通例外及びその意味は,36.6.2 で規定する。

    Filter

    ]]> Filter 演算子は,次に示す2個以上のオペランドをとる。

  • <<n: 非負整数/,>
  • <1: 非負整数/,>
  • <0: 非負整数/,>
  • < Filter 演算子は,次の1個の結果を返す。
  • <> ここで,filteridentifierは,フィルタを識別する正規文字列形式の 公開オブジェクト識別子を含むオクテット列に対する参照とし, この参照は,FindResource 演算子の実行によって取得される。 さらに,datasourceは,filteridentifierに対する適切な符号化が なされた入力データのソース, そして,それらの間に入るパラメタがあれば,その数及び形態は, filteridentifierに依存する。 結果は,Filter 演算子に対するfilteridentifierの値及びその他の パラメタに従ってフィルタを通された,新たに生成されたストリーム オブジェクトとする。 この規格で定義される標準フィルタ及びそのパラメタがあれば, それらは31.2に規定する。

    filteridentifierが実装で知られているフィルタを識別しないとき, UndefinedKeyをオペランドとしてRaiseErrorが実行されるものとする。 さらに,filteridentifierFindResource演算子の実行を通して得られた オクテット列参照でないとき,UndefinedResourceをオペランドとして RaiseErrorが実行されるものとする。