2

Cocoa に Quartz-2D 参照 (色、塗りつぶしパターン、グラデーション、および影を記述する) を含むオブジェクトがあります。NSCodingオブジェクトにプロトコルを実装したいので、これらの不透明な Quartz-2D 構造をシリアル化する必要があります。

可能な解決策は次のとおりです。

  • 必要なときにいつでもデータ構造を最初からセットアップできるようにする、オブジェクトの一連のプロパティを定義します。これらは簡単にシリアル化できます。例:赤、緑、青、およびアルファの 4 つの float を格納してから、 を使用しますCGColorCreate短所:情報の重複により、潜在的な一貫性と (これまでのところマイナーな) スペース消費の問題。コンポーネントが変更されるたびに Quartz 構造を再作成するプロパティ セッターを手動で記述する必要があります。それは私のコードを大幅に肥大化させます。

  • Quartz 関数を使用してプロパティを読み取ります。例:色に使用CGColorGetComponentsします。短所:色には効果があるようです。しかし、他の構造には同等の機能がないため、グラデーション、シェーディング、シャドウなどに対してこれがどのように機能するかわかりません.

  • 生の不透明な構造からプロパティを直接読み取ります。欠点:ドキュメントにあるように、構造は不透明であると想定されています。そのため、内部で何かが変更された場合、私のコードは壊れます。(Apple がそのような機能を提供することになった場合、そのような機能を提供しなかったことは確かCGColorGetComponentsです。) さらに、CGFunctionRef内部の a のようなものは、CGShadingRef本当にトラブルを求めているでしょう。

Quartz 構造をシリアライズするためのベストプラクティスは何ですか?

4

1 に答える 1

6

答えは、クラスごとにかなり異なります。

  • CGImage : CGImageDestination を使用して TIFF ファイルを作成します。TIFFRepresentation(NSImageのメソッドと同等です。)
  • CGPath:パスの要素を PostScript コードなどとして記述するために使用できるアプライヤー関数を記述します。単純なインタープリターを作成して、別の方向に進みます。
  • CGColorSpace: ICC 表現をエクスポートできます。
  • CGColor:説明したとおりですが、色空間を含めることを忘れないでください。
  • CGLayer: Convoluted: ビットマップ コンテキストを作成し、レイヤーをそこに描画し、コンテキストのイメージをダンプしてから、それをシリアル化します。
  • CGFont:ほとんどのアプリケーションではこの名前で十分です。もしあなたが本当に凝っているのであれば (つまり、バリエーション機能を使用している場合)、フォントのバリエーション辞書を含めたいと思うでしょう。CGFont にはフォント サイズがなく、CGContext では設定したフォント サイズを取得できないため、フォント サイズに関する知識を別に維持する必要があります。
  • CGPDFDocument:一見すると、CGPDFObjects はすべて不変のように見えるため、元の PDF データまたは取得元の URL をアーカイブするだけです。
  • CGGradient、CGPattern、CGShading、およびその他のほとんどのクラス: うん、うんざりだ。オブジェクトを作成したすべての情報を個別に維持する必要があります。
于 2010-10-16T22:13:41.397 に答える