Quartz 2D の概要


Quartz 2D は、iOS 環境およびカーネル外のすべての Mac OS X アプリケーション環境からアクセス可能な 2 次元描画エンジンです。Quartz 2D アプリケーションプログラミングインターフェイス(API) を使用すると、パスに基づいた描画、透明度の設定、ペイント、シェーディング、陰影の描画、透明レイヤー、色管理、アンチエイリアスレンダリング、PDF 文書の生成、PDF メタデータなどにアクセスする機能を使用できます。可能であればいつでも、Quartz 2D はグラフィックスハードウェアの力を活用します。


Mac OS X では、Quartz 2D は Core Image、Core Video、OpenGL、および QuickTime といった他のすべてのグラフィックスおよびイメージングテクノロジーと連携できます。QuickTime 関数GraphicsImportCreateCGImage を使用して、QuickTime グラフィックスインポータから Quartz でイメージを作成することができます。詳細については、QuickTime Framework リファレンス を参照してください。Mac OS X で Quartz 2D と Core Image 間でデータを移動 では、イメージ処理をサポートするフレームワークである Core Image にイメージを提供する方法が説明されています。


同様に、iOS では、Quartz 2D は、Core Animation、OpenGL ES、UIKit クラスなど、利用可能なすべてのグラフィックスおよびアニメーション技術を使用して動作します。


ページ


Quartz 2D は、イメージングに ペインターのモデル を使用します。ペインターのモデルでは、連続する各描画操作は、しばしば ページ と呼ばれる出力"キャンバス" に"ペイント" のレイヤーを適用します。ページ上のペイントは、追加の描画操作でさらにペイントを重ね塗りすることによって変更できます。ページに描画されたオブジェクトは、ペイントを重ね塗りする以外は変更できません。このモデルでは、少数の強力なプリミティブから非常に洗練されたイメージを構築することができます。


図 1-1 に、ペインターのモデルの仕組みを示します。図の上部のイメージを取得するには、左の図形が最初に描画された後に、塗りつぶされた形が描画されます。塗りつぶされた形は、最初の形に重なり、最初の形の周囲を除くすべてを覆い隠します。図形の下部では、図形が逆の順序で描かれ、最初に塗りつぶした形が描かれています。ご覧のように、ペインターのモデルでは描画順序が重要です。




ページは実際の用紙(出力装置がプリンタの場合) です。それは、(出力デバイスが PDF ファイルであれば) 仮想紙であってもよいでしょう。それはビットマップ画像であってもよいでしょう。ページの正確な性質は、使用する特定のグラフィックスコンテキストによって異なります。


描画先:グラフィックスコンテキスト


グラフィックスコンテキスト は、Quartz が PDF ファイル、ビットマップ、ディスプレイ上のウィンドウなどの出力デバイスにイメージを描画するために使用する情報をカプセル化する不透明データ型(CGContextRef) です。グラフィックスコンテキスト内の情報は、グラフィックス描画パラメータと、ページ上のペイントのデバイス特有の表現とを含みます。Quartz のすべてのオブジェクトは、グラフィックスコンテキストに描画されるか、含まれます。


図 1-2 に示すように、グラフィックスコンテキストを描画先と考えることができます。Quartz を使用して描画する場合、デバイス固有のすべての特性は、使用する特定の型のグラフィックスコンテキスト内に含まれます。言い換えれば、Quartz 描画ルーチンの同じシーケンスに異なるグラフィックスコンテキストを提供するだけで、同じ画像を別のデバイスに描画することができます。デバイス固有の計算を行う必要はありません。Quartz はあなたのためにそれを行います。




これらのグラフィックスコンテキストはアプリケーションで使用できます。


Quartz 2D 不透明(Opaque) データ型


Quartz 2D API は、グラフィックスコンテキストに加えて、さまざまな不透明なデータ型を定義します。API は Core Graphics フレームワークの一部であるため、データ型とそれを操作するルーチンは CG プレフィックスを使用します。


Quartz 2D は、特定の描画出力を実現するためにアプリケーションが操作する不透明なデータ型からオブジェクトを作成します。図 1-3 に、Quartz 2D が提供する 3 つのオブジェクトに描画操作を適用したときに得られる結果の種類を示します。例えば:


Quartz 2D で利用できる不透明データ型には、以下のものがあります。


グラフィックス状態


Quartz は、現在のグラフィックス状態 のパラメータに従って描画操作の結果を変更します。グラフィックス状態には、描画ルーチンの引数として他に使用されるパラメータが含まれています。グラフィックスコンテキストに描画するルーチンは、グラフィックス状態を調べて、その結果のレンダリング方法を決定します。たとえば、塗りつぶしの色を設定する関数を呼び出すと、現在のグラフィックス状態に格納されている値が変更されます。現在のグラフィックス状態の他の一般的に使用される他の要素には、線の幅、現在位置、およびテキストのフォントサイズが含まれます。


グラフィックスコンテキストには、グラフィックス状態のスタックを含みます。Quartz がグラフィックスコンテキストを作成するとき、スタックは空です。グラフィックス状態を格納すると、Quartz は現在のグラフィックス状態のコピーをスタック上にプッシュします。グラフィックス状態を復元すると、Quartz はグラフィックス状態をスタックの一番上からポップします。ポップされた状態は、現在のグラフィックス状態になります。


現在のグラフィックス状態を格納するには、CGContextSaveGState 関数を使用して、現在のグラフィックス状態のコピーをスタック上にプッシュします。以前に格納したグラフィックス状態を復元するには、CGContextRestoreGState 関数を使用して、現在のグラフィックス状態をスタックの一番上にあるグラフィックス状態と置き換えます。


現在の描画環境のすべての側面がグラフィックス状態の要素であるわけではないことに注意してください。たとえば、現在のパスはグラフィックス状態の一部とはみなされないため、CGContextSaveGState 関数を呼び出しても格納されません。この関数を呼び出すときに格納されるグラフィックス状態パラメータを、表 1-1 にリストします。


Quartz 2D 座標系


座標系は、図 1-4 に示したように、ページ上に描画されたオブジェクトの位置とサイズを表すために使用される場所の範囲を定義します。グラフィックスの位置とサイズをユーザー空間座標系で指定するか、より簡単に ユーザー空間 を指定します。座標は浮動小数点値として定義されます。


異なるデバイスは、異なる基礎となるイメージ能力を有するため、グラフィックスの位置およびサイズはデバイスに依存しない方法で定義されなければなりません。例えば、スクリーン表示装置は 1 インチ当たり 96 ピクセル以下を表示でき、プリンタは 300 ピクセル/インチを表示することができます。デバイスレベル(この例では 96 ピクセルまたは 300 ピクセル) で座標系を定義すると、その空間に描画されたオブジェクトは、目に見える歪みなしに他のデバイスで再現することはできません。それらは大きすぎるか小さすぎるでしょう。


Quartz は、現在の変換マトリックス、つまり CTM を使用して、出力デバイス/デバイス空間の座標系にユーザー空間をマッピングする別の座標系でデバイスの独立性を実現します。行列 は、関連する方程式の集合を効率的に記述するために使用される数学的構成です。現在の変換行列は、アフィン変換 と呼ばれる特定の型の行列で、平行移動、回転、および スケーリング 操作(座標系を移動、回転、サイズ変更する計算) を適用して、ある座標空間から別の座標空間に点をマッピングします。


現在の変換行列には 2 次的な目的があります。オブジェクトの描画方法を変換することができます。たとえば、45 度回転した箱を描画するには、箱を描画する前にページの座標系(CTM) を回転させます。Quartz は、回転した座標系を使用して出力デバイスに描画します。


ユーザ空間内の点は座標系の対(x、y) で表され、x は水平軸(左右) に沿った位置を表し、y は垂直軸(上下) を表します。ユーザー座標空間の 原点 は、点(0,0) です。図 1-4 に示すように、原点はページの左下隅にあります。Quartz のデフォルトの座標系では、x 軸はページの左から右に移動するにつれて増加します。y 軸はページの下から上に向かって値が大きくなります。


技術によっては、Quartz が使用するものとは異なるデフォルトの座標系を使用してグラフィックスコンテキストを設定するものがあります。Quartz に対して、そのような座標系は 変更された座標系 であり、いくつかの Quartz 描画操作を実行するときに補償されなければなりません。最も一般的な変更された座標系は、原点をコンテキストの左上隅に置き、y 軸をページの下端に向けるよう変更します。使用されるこの特定の座標系が表示される少ない場所は、次のとおりです。


UIKit が修正された座標系を持つ Quartz 描画コンテキストを返す理由は、UIKit が異なるデフォルトの座標規約を使用するためです。作成した Quartz コンテキストに変換を適用して、その変換規則に一致するようにします。アプリケーションが同じ描画ルーチンを使用して UIView オブジェクトと PDF グラフィックスコンテキスト(Quartz によって作成され、デフォルトの座標系を使用する) の両方に描画したい場合は、PDF グラフィックスコンテキストが、同じ変更された座標系を受け取るように適用しなければなりません。これを行うには、原点を PDF コンテキストの左上隅に変換し、y 座標を -1 でスケールする変換を適用します。

スケーリング変換を使用して y 座標を無効にすると、Quartz 描画のいくつかの規則が変更されます。たとえば、CGContextDrawImage を呼び出してイメージをコンテキストに描画すると、イメージは目的先に描画されるときに変換によって変更されます。同様に、パス描画ルーチンは、弧が デフォルト の座標系で時計回りまたは反時計回りのどちらの方向に描かれるかを指定するパラメータを受け取ります。座標系が変更された場合、イメージが鏡に反映されたかのように、結果も変更されます。図 1-5 では、同じパラメータを Quartz に渡すと、デフォルトの座標系での時計回りの弧が得られ、y 座標が変換によって無視された後に反時計回りの弧が得られます。


    図 1-5 座標系を変更すると、鏡像が作成されます。


    flipped_coordinates

アプリケーションには、変換が適用されているコンテキストに対して行うすべての Quartz 呼び出しを調整する責任があります。たとえば、イメージまたは PDF をグラフィックスコンテキストに正しく描画するには、アプリケーションはグラフィックスコンテキストの CTM を一時的に調整する必要があります。iOS では、UIImage オブジェクトを使用して作成した CGImage オブジェクトを包み込むと、CTM を変更する必要はありません。UIImage オブジェクトは、UIKit によって適用された、変更された座標系を自動的に補正します。


重要: 上記の説明は、iOS 上で Quartz を直接対象とするアプリケーションを書く予定がある場合、理解するのは必須ですが、それだけでは不十分です。iOS 3.2 以降では、UIKit がアプリケーションの描画コンテキストを作成するときに、UIKit のデフォルトの規則に一致するようにコンテキストをさらに変更します。特に、CTM の影響を受けないパターンや陰影は、それらの規則が UIKit の座標系と一致するように別々に調整されます。この場合、アプリケーションが UIKit によって提供されるコンテキストの動作に一致するように Quartz によって作成されたコンテキストを変更するために使用できる CTM と同等のメカニズムはありません。アプリケーションは、どのようなコンテキストを描画しているのかを認識し、コンテキストの期待に合わせて動作を調整する必要があります。

メモリー管理:オブジェクトの所有権


Quartz は、オブジェクトが参照カウントされる Core Foundation メモリ管理モデルを使用します。作成されると、Core Foundation オブジェクトは参照カウント 1 で開始されます。オブジェクトを保持する関数を呼び出して参照カウントを増分し、オブジェクトを解放する関数を呼び出して参照カウントを減分します。参照カウントが 0 に減分されると、オブジェクトは解放されます。このモデルは、オブジェクトが他のオブジェクトへの参照を安全に共有できるようにします。


心に留めておくべきいくつかの簡単なルールがあります:


  • オブジェクトを作成またはコピーする場合、オブジェクトを所有しているため、オブジェクトを解放しなければなりません。つまり、一般に、名前に"Create" または"Copy" という単語を含む関数からオブジェクトを取得する場合は、そのオブジェクトの用事が終了したときにそのオブジェクトを解放しなければなりません。それ以外の場合は、メモリリークが発生します。
  • 名前に"Create" または"Copy" という単語を含まない関数からオブジェクトを取得した場合は、そのオブジェクトへの参照を所有しておらず、解放してはいけません。オブジェクトは将来、ある時点で所有者によって解放されます。
  • あなたがオブジェクトを所有しておらず、オブジェクトを保持しておく必要がある場合は、オブジェクトを保持して解放しなければなりません。オブジェクトに固有の Quartz 2D 関数を使用して、そのオブジェクトを保持および解放します。たとえば、CGColorspace オブジェクトへの参照を受け取った場合は、CGColorSpaceRetain および CGColorSpaceRelease 関数を使用して、必要に応じてオブジェクトを保持および解放します。また、Core Foundation の関数 CFRetainCFRelease を使用することもできますが、これらの関数に NULL を渡さないように注意しなければなりません。

前の章 次の章



目次
Xcode 10 の新機能

  • 前書き
  • 誰がこの文書を読むべきか?
    この文書の構成
  • Quartz 2D の概要
  • ページ
    描画先:グラフィックスコンテキスト
    Quartz 2D 不透明(Opaque) データ型
    グラフィックス状態
    Quartz 2D 座標系
    メモリー管理:オブジェクトの所有権
  • グラフィックスコンテキスト
  • iOS のビューグラフィックスコンテキストに描画する
    Mac OS X でのウィンドウグラフィックスコンテキストの作成
    PDF グラフィックスコンテキストの作成
  • ビットマップグラフィックスコンテキストの作成
  • サポートされるピクセル形式
    アンチエイリアス
    印刷用のグラフィックスコンテキストの取得
  • パス
  • パスの作成とパスの描画
  • ビルディングブロック
  • パスの作成
  • パスのペイント (Painting a Path)
  • ブレンドモードの設定
  • パスをクリップする
  • 色と色空間
  • 色と色空間について
    アルファ値
    色空間の作成
    色の設定と作成
    レンダリングインテントの設定
  • 変換
  • Quartz 変換関数について
    現在の変換配列の変更
    アフィン変換の作成
    アフィン変換の評価
    ユーザをデバイス空間変換に導く
    配列の背後の数学
  • パターン
  • パターンの構造
    色付きパターンとステンシル(無色の) パターン
    タイル張り
    パターンの仕組み
  • 色付きパターンのペイント
  • ステンシルパターンのペイント
  • 陰影
  • 陰影の仕組み
    コンテキストに基づいて変化する陰影描画規則
    陰影を用いたペイント
  • グラデーション
  • 軸方向および放射状グラデーションの例
    CGShading と CGGradient オブジェクトの比較
    グラデーションの端を超えて色を拡張
    CGGradient オブジェクトの使用
  • CGShading オブジェクトの使用
  • CGShading オブジェクトを使用して軸方向のグラデーションをペイント
  • CGShading オブジェクトを使用して放射状グラデーションをペイント
  • 以下も見よ
  • 透過レイヤー
  • 透過レイヤーの仕組み
    透過レイヤーへのペイント
  • Quartz 2D でのデータ管理
  • Quartz 2D へのデータの移動
    Quartz 2D からのデータの移動
    Mac OS X で Quartz 2D と Core Image 間でデータを移動
  • ビットマップイメージとイメージマスク
  • ビットマップイメージとイメージマスクについて
    ビットマップイメージ情報
  • イメージの作成
  • イメージマスクの作成
  • イメージをマスクする
  • イメージにブレンドモードを使用
  • Core Graphics のレイヤー描画
  • レイヤー描画のしくみ
  • レイヤーを使った描画
  • 複数の CGLayer オブジェクトを使用して旗を描画する例
  • PDF 文書の作成、表示、および変換
  • PDF を開いて表示
    PDF ページの変換を作成する
    PDF ファイルの作成
    リンクの追加
    PDF コンテンツの保護
  • PDF 文書の解析
  • PDF 文書の構造の検査
  • PDF コンテンツの解析
  • PostScript 変換
  • 呼び出し関数を書く
    呼び出し関数構造体を埋める
    PostScript 変換オブジェクトの作成
    データプロバイダおよびデータコンシューマオブジェクトの作成
    変換の実行
    テキスト
    用語集
    文書改訂履歴












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)