2012年2月22日水曜日

OS X の画像クラス

OS X には多数の画像クラスがあります.

歴史的経緯として,初期の OS X には QuickDraw, QuickTime, Quartz 2D の三種類の画面描画APIがありましたが,現在は描画は Quartz 2D のCインタフェース (Core Graphics) と OpenGL 3D に絞られています.

QuickDraw は OS X の前身の Mac OS 9 との互換性のために残されていたAPIで,OS X Tiger (10.4) 以降は廃止されました.現在では QuickDraw の代わりに Core Graphics がその役目を果たしています.Core Graphics は Quartz 2D の一部です.

QuickTime はメディアプレイヤーの QuickTime Player で有名ですが,もともとは System 6 に搭載されたAPIで,描画サブシステムとしては QuickDraw を使っていました.その後何度も拡張され,QuickDraw を引きずったまま OS X へも移植されました.(OS X Jaguar (10.2) で描画は全て OpenGL を経由するようになり,QuickDraw も OpenGL 経由になりました.)

状況が大きく変わったのは OS X Tiger (10.4)  で,まず描画サブシステムが全面的に Core Video に置き換えられました.またAPIにも手が入れられ,Cインタフェースだった QuickTime に Objective-C インタフェースの QuickTime Kit (QTKit) が加わりました.その後 OS X Snow Leopard (10.6) では旧来の QuickTime からドラスティックに変更された QuickTime X が導入されました.このバージョンから QuickTime Player も QTKit 経由でファイルやストリーミングにアクセスするようになりました.さらに OS X Lion (10.7) では iOS 4.0 の AVFoundation が OS X にも導入され,QuickTime X のサブレイヤーとして使われるようになりました.(余談ですが iOS 5.0 の GLKit は OS X Mountain Lion (10.8) に導入されるようです.)

Quartz 2D のほうも単純ではありません.Quartz 2D というのは Core Graphics のマーケティング名と言われていますが,実際には Core Graphics には含まれない Cocoa のドローイングインタフェースも Quartz 2D に含めます.Cocoa は OS X のアプリケーションフレームワークですが,その中身は Foundation と AppKit の二つに分かれます.Foundation は Objective-C 版STLのようなもので,言語に無い文字列や動的配列などの基本的なデータ構造をライブラリ化したものです.AppKit のほうはアプリケーションに必要なユーザインタフェースやコントローラをライブラリ化したものです.

Foundation も AppKit も OS X のもうひとつの前身である NeXTSTEP から受け継がれたものですが,iOS 登場前後から画像の取り扱いについて変化が現れてきます.AppKit にはもともとベジエ曲線を描くAPIや画像クラス NSImage があるのですが,iOS では Cocoa に代わって Cocoa touch が採用され(AppKit が UIKit に置き換えられ),NSImage が無くなりました.このような事情もあり,OS X の側でもできるだけ AppKit の画像クラスではなく Core Graphics の画像クラスを使うように誘導されています.

Core Graphics で扱う画像クラス(ただしCインタフェースなので構造体)は CGImage という名前です.そのポインタである CGImageRef を今後頻繁に使うでしょう.OS X Leopard (10.6) では NSImage の中身である NSBitmapImageRep に CGImage を返す CGImage メソッドが追加されています.これを使えば NSImage から CGImage への移行は楽ですね.(逆方向は NSImage のコンストラクタ initWithCGImage: size: を使います.このコンストラクタも OS X Leopard (10.6) から導入されました.)

Core Video では画像を一時保存する場所をピクセルバッファ(CPU側),OpenGLテクスチャバッファ(GPU側)と呼んでいます.Core Video はCベースなので Objective-C クラスは提供されていませんが,それぞれ概念的には CVBuffer のサブクラスです(それぞれ CVImageBuffer と CVOpenGLTexture です).

また Core Image は独自の画像クラス CIImage を持っています.CIImage のコンストラクタには CGImage から CIImage を生成するものと,CVImageBuffer から CIImage を生成するものがあります.(他に任意のビットマップやURL先のファイルから CIImage を生成するコンストラクタもあります.)

いろいろ建てましがあって複雑になってしまったところをばっさり整理して,かつ複数のライブラリがお互い支え合うようにリンクしているところは,さすがアップルのソフトウェアデザインですね.

0 件のコメント:

コメントを投稿