Haikuのベクターアイコンが非常にコンパクトなのはなぜですか?

Haikuでは、ベクトルアイコンはとてもコンパクトですが、どのようにそうですか? おそらくある種のハックを期待するでしょうが、その秘密はHVIF(Haiku Vector Icon Format)が非常にシンプルであることです。 最も重要なことは、この形式はアイコン用に最適化されていることです。 この単純な仮定に同意すると、データ量を最適化するさまざまな方法がすぐに思いつきます。





座標



たとえば、アイコンの標準解像度を64x64ピクセルにします。 ベクトルパスの座標を整数にバインドすると便利です。 また、アイコンの境界を越えて座標を設定できると便利です。そのため、7ビットのみに収まる-32〜+95ピクセルの範囲を定義します。 座標が整数でない場合、または[-32、95]の範囲外の場合、8ビット目を使用して、範囲を[-128、192]に拡張する2バイトシーケンスを示し、小数の値に追加の精度が使用されます座標。



方法



また、ベクトルパスの全体的な形状の最適化について考えることも役立ちます。

HVIFは、コマンドを使用したパス、直線を使用したパス、曲線のみを使用したパスの3つの主なタイプを区別します。 曲線内のすべてのパスは、他の2つの形式のパスを表すことができますが、ジョークであるため、セグメントごとに最大6つの座標が必要になるため、大量のデータを保存する必要があります。 パスに多数の直線セクションまたは多数の水平線と垂直線が含まれる場合、コマンドをセグメントに関連付ける方が適切です。これにより、セグメントごとに必要な座標の数が大幅に削減されます。 SVG形式ではさらに多くのことを定義していますが、アイコンのすべてのニーズをカバーするパスに対応する4つの異なるコマンドをどのように見つけることができますか。 これは、水平線、垂直線、単なる直線および3次曲線です。 最初の2つは、1つの座標(XまたはY)のみを必要とします。これは、他の座標が前の点に関して変更されないためです。 任意の行には2つの座標が必要であり、曲線はすでに6です。パスの4つのエンコードされたコマンドは2ビットを受け取り、猶予を追加し、座標データとは別に書き込みます。 整数座標を持つ単純な長方形がどれだけのデータを受け取るか計算してみましょう:



HVIFは、最小限のデータを取得するためにコーディングするときに使用するコマンドを分析します。 たとえば、すべての曲線またはすべての線の場合、コマンドセクションを保存しても意味がありません。





ほとんどのアイコンオブジェクトは、「フラグ」用に追加の予約バイトでエンコードされます。これにより、ファイルに保存するアスペクトが決まります。 たとえば、図が変更されない場合、変換行列を保存しても意味がありません。 この場合、未使用のパラメーターの「空のラベル」は単に除外されます。



行列



変換マトリックスといえば、追加の対策を講じなければ、かなりのスペースを占有する可能性があることに留意してください。

HVIFは、変換に通常のアフィン行列を使用します。これは、高精度(24バイト)を考えない限り、通常6 double(48バイト)またはfloatを使用してエンコードされます。 ストレージアイコンをさらに削減するために(アイコンは精度を必要としないため)、HVIFは値ごとに3バイトのみを使用する独自の浮動小数点形式を使用します。 そのため、マトリックスに必要なボリュームは18バイトに削減されます。

多くの場合、フィギュアを移動するだけで、回転、刈り取り、拡大縮小は必要ありません。 この場合、パスの座標と同じ形式を使用して、オフセットのみを保存するのが理にかなっています。



スタイル



スタイルには、色とグラデーションの2種類があります。 セクションのスタイルは重要な位置を占める可能性があるため、このインジケータを減らすための手順がいくつかあります。 アルファチャネルを使用しない色またはグラデーションはアルファチャネルでエンコードされず、グレーは1バイトでエンコードされます。 どのタイプの色のコーディングも使用されるかは、特定のスタイルのフラグバイトによって決まります。 また、0%のオフセットと100%のオフセット(非常に一般的なタイプのグラデーション)の2色のグラデーション用の特別な形式もあり、色オフセットはエンコードされません。

HVIFデータは3つのセクションで構成されています。 最初はすべてのスタイルをエンコードし、2番目はすべての方法をエンコードし、最後はすべての形状をエンコードします。 スタイルとパスはHaikuアイコンでグローバルであるため、さまざまな形状で使用できます。 ただし、合計256個のスタイルまたは256個のパスを超えないようにする必要があります。 したがって、シェイプは、1バイトだけでそれらを参照できます。これは、グローバルリスト内のスタイルまたはパスのインデックスです。 シェイプには変換をアタッチすることもできます。たとえば、ストロークトランスフォーマーはパスをストロークに変換できます。 トランスを保管するために特別なものは発明されていません。

ご覧のとおり、HVIFを一般的なベクターグラフィックスに使用することはほとんど意味がありません。 この形式は、非常に特殊なタスクにのみ適しています。 しかし、前述のように、少なくとも作業環境の応答性の観点から、最終的にはこれらの問題を解決するのに役立ちます。 しかし、これはそれ自体では起こりません。 HVIFがどのように機能するかを知らずにアイコンを設計すると、そのアイコンに固有の潜在能力が失われます。 たとえば、ベクトルパスの座標が整数値ではない場合、またはパスが再利用されない場合(可能な場合)、アイコンは必要以上のスペースを占有する可能性があります。 これは、SVGアイコンがIcon-O-Maticにインポートされ、HVIFにそのまま保存される場合に特に当てはまりますが、これは良くありません。 アイコンから冗長または不要な情報を削除する作業はまだありませんが、今説明した情報により、Haikuのアイコンを作成するときに誰もが最適化手法を使用できるようになります。



All Articles