Imagelib:イメージ図書館

imagelib(すなわちイメージ図書館)はデコードおよびイメージのディスプレイ原因です。 ハイ・レベルの展望から、imagelibは、供給されたURLを読むことに起因するデータの流れを使用して、デコードされたイメージのインメモリ表現を生成します。 純粋にクロス・プラットフォーム・コードから成る芯imagelibは次のサービスを提供します: 芯imagelib機能性のリストがイメージ(つまりモニターかプリンタ上の描くピクセル)の実際のディスプレイを含まないことに注意してください。 論理上、このコードはimagelibの一部であるべきです、しかし、歴史上の決定の結果、イメージ・ディスプレイ・コードは他のプラットフォーム特定のディスプレイでよく混合されます、フロント・エンド( それがどこで率いられるか 参照、以下に)の各々中でコード化する。


歴史

2.x 追加レート適応性のあるプログレッシブJPEG(PJPEG)および生き生きしたGIF支援。 さらに、カスタム・パレット支援は、ウインドウズ(8ビットのハードウェア・パレットはそれの中で表示されたイメージに一致した)のために加算しました。
3.x ジャバスクリプトからのイメージのジャバスクリプトを抑制されたロードを許可する小銭。
4.x より清潔なAPIのために部分的に書き直されたImagelib。 スケジュール圧力の結果として、カスタム・パレット支援は無効になりました。


それはどう作動しますか

レイアウトは、得るリクエストを出します、/、イメージ図書館用のクライアントとしてイメージURLを表示します。 例えば、リクエストは、HTMLタグ<img src=foo.gif>から来ることができました。あるいは、「視界イメージ(View Image)」は要求します。

イメージ図書館は、イメージ・リクエストがどう元来生成されたか注意しません。 それは、それがプロセスに対して十分に持つまでそれをバッファーして、指定されるすべてのデータ流れからデータを受理します。

イメージ図書館の主要な入り口は関数IL_GetImage()です。 レイアウトは、ns/lib/レイアウト/layimage.cの中のlo_GetImage()によってIL_GetImageを呼びます。 IL_GetImage()は、IL_ImageReqと呼ばれるデータ構造を返します。 同じイメージの多数の要請は同じhtmlページになされるかもしれませんが、ユニークなIL_ImageReqハンドルはすべてのリクエストのために生成されます。

これは、イメージが各リクエストのためにデコードされるに違いないことを意味しません。 単一のイメージURLはページの用いられている無数の回かもしれません。 以前にデコードされたイメージおよび分類されたイメージのキャッシュは維持されます。また、各イメージの情報はimage_containerと呼ばれるデータ構造で維持されます。 イメージ・リクエストが出される場合、imagelibは一致するimage_containerを見つけるためにキャッシュによって探索します。 それが一致するコンテナーを見つける場合、それは以前にデコードされたデータを使用します。 そうでなければ、それはイメージ・データをデコードし、将来の使用のためのイメージ・キャッシュに加えられる新しいイメージ・コンテナーを作成します。

イメージ・オブザーバーはイメージ・リクエストのために作成されます。 オブザーバーは下記のような、image_requestステータスおよび状態をモニターするように設計されたメカニズムです:
- イメージの進行
- イメージpixmapは更新されました。
- イメージはデコードし終えました。
- イメージ/アニメーションの構造はデコードし終えました。
- キャッシュに入れられたイメージはデコードを完成しました。
- イメージ・リクエストは破壊されました。また、オブザーバー・リストは掃除の準備ができます。

イメージのヘッダーが読まれており、イメージの自然な次元および目標次元が理解される後、それがラインの価値のデータを持つまで、イメージ図書館はデコードします。 デコードされたデータは、目標イメージ・サイズにサイズ変更されます。 透明マスクが存在する場合、マスクはさらに目標イメージ・サイズにサイズ変更されます。 いかなる変形も目標色深さと一致する必要があった、さらにここに生じます。

イメージlibaryはラインによってブロックによってではなくイメージに対処します。 フロント・エンド・ディスプレイの準備ができているラインは関数IL_DisplaySubImage()経由で、フロント・エンドに送られます。

イメージがデコードし終えたことをオブザーバーが悟る場合、掃除する、生じることができます。 清潔、を上へ、しかしながら、ページがアンロードされるまで、生じません。 1位、イメージ・リクエストが破壊されます。 イメージ・コンテナーが破壊されます。 イメージ・グループ・コンテナーは最後に破壊され、イメージ構造がすべて解放されると保証します。


主要なデータ構造

各イメージについては、イメージ・コンテナーが各減圧されたかまたは分類されたイメージのために作成されます:
il_container_struct(ns/モジュール/libimg/src/if.hの中の)

クライアント(レイアウト)がイメージを表示してくれるようにイメージ図書館に依頼するごとに、新しいイメージ・リクエストハンドルはIL_GetImage()によって生成されます:

IL_ImageReq(ns/モジュール/libimg/src/if.hの中の)

image_struct:
IL_Image_struct(ns/モジュール/libimg/src/il.hの中の)



新しいイメージ・フォーマットを加える方法

イメージ図書館はイメージ・デコーダ用にインターフェースを提供するために関数テーブル(すなわちvtables)を使用します。 5つの機能は、イメージ図書館の残りへの各イメージ・フォーマット・デコーダ用にインターフェースを提供します。 これらの機能は次のとおりです:


ファイルif.cの中の関数il_first_write()は始めます、その、vtable、またそれを付ける、に、その、新しいイメージ用のimage_container。 最初に、それはデータ流れに新しく作成されたイメージ・コンテナーを関連させます。 イメージ・フォーマット・タイプを決定した後に、それはそのイメージ・タイプのために仮想テーブルに5つの機能を帰します。



/*例:*/
スイッチ(ic>-タイプ)
{
ケースIL_GIF:
init=il_gif_init;
ic>-書き込み=il_gif_write;
ic>-=il_gif_completeを完成する;
ic>-write_ready=il_gif_write_ready;
ic>-中断=il_gif_abort;
壊れます;

ケースIL_JPEG:
init=il_jpeg_init;
ic>-書き込み=il_jpeg_write;
ic>-中断=il_jpeg_abort;
ic>-=il_jpeg_completeを完成する;
壊れます;



デフォルト:
ILTRACE(1(「il」:無視する未知のイメージ・タイプ(%d)(ic):―タイプ>));
MK_IMAGE_LOSSAGEを返します;
}
/*終了例*/



それが率いられる場合

このセクションは、イメージ図書館の将来のdevlopmentのための指示について記述します。

モジュール化

今ちょうど、多くの超過手荷物(失敗する機能用の無関係なヘッダーファイル、未使用のコンポーネントおよび使い残りの包含)のないimagelibを使用して、単純なスタンド・アロンのイメージ・ビューアーを建造することは可能ではありません。 imagelibは他のナビゲーターほとんど図書館より外部コンポーネントへの抽象的なインターフェースを定義するために関数テーブル(C++話しぶりの中のvtables)をより大きく利用しますが、この仕事は不完全です; 困難なコード化された参照(例えばNET_GetURL())を使用して、呼ばれるimagelibに外部、少数の機能がまだあります。 例えば、スタンド・アロンのビューアー・プログラム内に、あるいはナビゲーター内に含まれるためにコンポーネントとしてimagelibを使用することができるように、外部機能へのそのような裸の言及がすべて削除されるべきです。

imagelibが使用するvtableな類似のインターフェースは、JMC(ネットスケープで内部にしばらくの間使用されましたが、そのイントロダクションの直後に放棄されたコンポーネント化スキーム)を使用して、現在インプリメントされます。 それが構造プロセスに多くの不必要な複雑さを加えて、JMCツールが今後支援されないだろうとともに、JMCのいかなる使用も消去されるべきです。 理想的には、新しいimagelibインターフェースは移動されるべきです、次世代pluginで開始されているCOM状のコンポーネント化スキーム、5.0にコード化します。

わきに、核心(クロス・プラットフォームimagelib機能性)をモジュール化する問題から、個別の問題があります、スクリーン上のイメージ・ピクセルを現実に引く、プラットフォーム特定のコードは、現在各プラットフォーム内に存します、フロントエンド、例えば、ウインドウズのためのコードはns/cmd/winfeディレクトリーの中にあります。 (さらにポストスクリプトがあります、ポストスクリプト・プリンタ上の魔法使いの印刷には「フロントエンドの。」)。 このコードは、多少各platformsの在来の小型装置およびクラスと無料で絡み合った傾向があります。 このイメージを引くコードは分離され、imagelib(「md」は立っています、のために、依存の依存する)の内の「md」ディレクトリーに置かれるべきです。 再び、最終ゴールは、imagelib開発を合理化するためにimagelibおよび小さな接着剤コードだけを使用して、3つのプラットフォームの各々用にスタンド・アロンのイメージ・ビューアーを建造することです。

イメージplugins

特別のイメージ・フォーマットのための総括的なimagelibコードとデコーダの間のインターフェースは、比較的単純なインターフェースです。 イメージ・デコーダをモジュール化し、ダイナミックに、ブラウザーpluginsが今日扱われるのとほとんど同じ方法でそれらをロードすることは可能に違いありません。 これは、第3のパーティーが<IMG>タグによって扱われるかもしれない新しいイメージ・フォーマットを加えることを可能にするでしょう。 これらのイメージpluginsは、色空間変換のようなimagelibサービスの利点、キャッシュに入れること、およびディスプレイをとることができました。その結果、pluginは生のイメージをデコードするコードを単に供給する必要がある。 それらのディスプレイのためにプラットフォーム特定のAPIを使用する、既存のpluginsと異なり、イメージplugin APIは合理的なコード化する慣習を仮定して、そのようにクロス・プラットフォームになるでしょう、これらのpluginsは、各プラットフォーム用に単に再コンパイルされる必要があるでしょう。

アイコンの特殊扱いの除去

イメージ・アイコンとしてのある有名なURLの使用は最も初期のウェブ・ブラウザによってデファクト・スタンダードとして確立されました、例えば、ディレクトリー・リストのために。 ある未知の理由のために、これらのアイコンはプラットフォーム特定のアイコン記憶装置を使用して、imagelibと完全に離れていたコードおよび各々内のディスプレイ・コードによってナビゲーター中でインプリメントされました、フロントエンド。 ある標準の圧縮したイメージformaを使用しかつ、正確に任意の外部イメージと同じ方法でimagelibによってデコードされて、クロス・プラットフォームファイル内にこれらのアイコンを格納することができなかったという理由はありません。 これは、imagelibの内の、および特に個々のフロント・エンドの内の多くの特別の場合、両方のコードを除去するでしょう。 それはさらに単純化するでしょう、新しいプラットフォームへのナビゲーターを運ぶこと、また各プラットフォームが(プラットフォーム特定)圧縮されていないフォーマットに現在アイコンを格納するので、メモリ消費を縮小します。

よりよいパレット・コントロール

X11の上に、パレット中の任意の既存の色に適合することは可能に違いありません。 既存のバージョンでは、navが、RGB色の規則的な格子を割り付けることを試みます(「色立方体」)。 しかしながら、立方体の8つの「買い占め」色、立方体内部中の色の任意のよく分配されたセットと結合した、ディザリングの合理的なレベルを提供するべきです。

理想的には、216-色立方体を割り付けるべきである、しかしそれが可能でない場合...

縮小されたメモリ使用

イメージがスクリーン上で目に見えても目に見えなくても、HTMLページのイメージがすべてデコードされた形式中のメモリに格納されるに違いないことは現在のimagelibの制限です。 例えば、ページが10の512x512ピクセル・イメージで、24ビットのディスプレイを備えたシステムに表示される場合、たとえ1つだけが一度に表示されるかもしれなくても、メモリの7.5メガバイトはメモリにデコードされたイメージを格納するために要求されます。 この制限は、厳しいメモリ制約を持つ傾向があるシステム上で特に、通常痛くなりえます、マックおよびWin16マシン。

はるかによいシステムは、低いメモリ状況に遭遇する場合は常に、呼ばれるimagelibへエントリーポイントを露出するでしょう。 このコードは、最近表示されていないか、スクリーン上で目に見えないイメージに対するpixmap記憶力を除去することを試みるでしょう。 たとえイメージpixmapが廃棄されても、それを改造するのに必要な情報をすべて維持することができるかもしれません、つまりイメージの出所URL、イメージ次元など リクエストが除去されたイメージを表示するためになされた場合、imagelibは再度それを取って来て、それを再デコードするでしょう。

ガンマ修正

同一のRGB(Identical RGB)価値は、異なるディスプレイ装置上で異なって再生されます。 ハードウェア/ソフトウェアCLUT、DAC非線形、モニター発光体の差、モニター・ガンマなどの差により、同じイメージは、ウインドウズ箱あるいはSGIワークステーションよりマック上で非常に異なっているように見えるかもしれません。 これらの違いの説明で最も偉大な罪人はシステム・ガンマです。
著作権(C)の1998年の ネットスケープ・コミュニケーションズ