QuickDraw は、クラシック Mac OSの中核をなす2Dグラフィックスライブラリと、それに関連するアプリケーション プログラミング インターフェイス(API) でした。これは、当初Bill AtkinsonとAndy Hertzfeldによって書かれました。[1] QuickDraw はMac OS Xのライブラリの一部としてまだ存在していましたが、より現代的なQuartzグラフィックス システムに大部分取って代わられました。Mac OS X Tiger では、QuickDraw は正式に非推奨となりました。Mac OS X Leopard では、QuickDraw を使用するアプリケーションは、追加された 64 ビット サポートを利用できません。OS X Mountain Lionでは、 QuickDrawヘッダーサポートがオペレーティング システムから削除されました。QuickDraw を使用するアプリケーションは、OS X Mountain Lion から macOS High Sierra まで引き続き実行できますが、現在のバージョンの Xcode と macOS SDK には、そのようなプログラムをコンパイルするためのヘッダー ファイルが含まれていません。
QuickDrawの原理
QuickDraw は、1980 年代初期のApple Lisaの LisaGrafを基盤とし、初期のAppleシステムのPascalベースのインターフェイスと開発環境によく適合するように設計されました。また、QuickDraw はラスター グラフィックスシステムであり、ピクセルをグラフィック情報の基本単位として定義します。これは、グラフィックス プリミティブが数学的に定義され、ディスプレイ解像度に応じてラスター化されるベクターグラフィックス システムとは対照的です。ただし、ラスター システムに必要な処理能力ははるかに少なく、QuickDraw が開発された当時はこれが主流のパラダイムでした。
QuickDraw は、グラフィックス ポート(GrafPort) という重要なデータ構造を定義しました。これは、グラフィックスを描画できる論理描画領域です。GrafPort に対応する最も明白な画面上の「オブジェクト」はウィンドウですが、デスクトップ ビュー全体が GrafPort になる可能性があり、画面外のポートも存在する可能性があります。
GrafPort は座標系を定義しました。QuickDraw では、これは 16ビットの解像度を持ち、65,536 の一意の垂直位置と水平位置を提供します。これらは、左端 (または上端) の -32,767 から右端 (または下端) の +32,767 まで番号が付けられます。ウィンドウは通常、そのコンテンツ領域の左上隅が、関連付けられた GrafPort の 0,0 に位置するように設定されます。ウィンドウのコンテンツ領域には、ウィンドウのフレーム、ドロップ シャドウ、またはタイトル バー (ある場合) は含まれません。
QuickDraw 座標は、ピクセル位置間の 極細の線を参照します。実際のピクセルは、座標のすぐ右下のスペースに描画されます。これにより、プログラマーは、 off-by-one エラーによって発生するグラフィックの不具合を回避しやすくなります。
Macintosh ではピクセルは正方形で、GrafPort のデフォルトの解像度は 1 インチあたり 72 ピクセルでした。これは、印刷業界で確立された 1 インチあたり 72ポイントの慣例に合わせて選択されました。
QuickDraw には、スケーリングおよびマッピング機能も多数含まれていました。
QuickDraw はプロセスごとに多数のグローバル変数を保持しており、その主なものは現在のポートです。すべての操作が「現在のポート」に関係していたため、当初は API が簡素化されていましたが、OS が開発されるにつれて、このグローバル状態の使用により、マルチスレッドやプリエンプティブ マルチタスクなどの最新の設計手法と QuickDraw を統合することが非常に困難になりました。これらの問題を解決するために、Carbon API (Mac OS 9 と Mac OS X のブリッジ) は、一部のルーチンに追加のパラメータを追加し、スレッド情報の (不透明な) 保存と新しい (ポーリングされない) イベント構造を可能にしました。
グラフィックスプリミティブ
従来の Mac OS 画面に表示されるものはすべて QuickDraw によって描画されますが、ライブラリ自体は非常に低レベルです。描画できる基本的なオブジェクトは次のとおりです。
- ライン
- 長方形
- 角が丸い(楕円形)長方形
- 楕円(円と楕円を含む)
- 円弧(およびくさび形)、円形と楕円形
- 多角形(線で結ばれた点のリストから構築された任意の閉じた形状)
- 領域(任意のピクセルのセット - 以下を参照)
- ビットマップとピックスマップ
- 文章
これらのオブジェクト (テキストを除く) はそれぞれ、「ペン」を使用して描画できます。ペンは任意の長方形の寸法、パターン、または色を持つことができます。ペンは長方形で軸に揃っているため、対角線は水平または垂直の線よりも太くなります。図形は、任意のパターンまたは色を使用して、塗りつぶしたり、枠を付けて描画できます。塗りつぶされた円弧はくさび形を形成します。テキストは、インストールされている任意のフォントで、さまざまなスタイルのバリエーションで、任意のサイズと色で描画できます。選択したフォントの保存方法に応じて、テキストはさまざまな方法で拡大縮小できます。TrueTypeフォントは任意のサイズにスムーズに拡大縮小されますが、ビットマップ フォントは通常、適切に拡大縮小されません。
QuickDraw の重要な機能は、転送モードのサポートでした。転送モードは、転送先のピクセル値がその前の値および描画されるオブジェクトの色とどのように関連するかを制御します。
ペンとテキスト描画の属性セットは GrafPort に関連付けられています。
リージョンは QuickDraw の重要なデータ構造です。リージョンは、ビットマップのような任意のピクセル セットを定義しますが、圧縮された形式で、複雑な方法で非常に迅速に操作できます。リージョンは、結合 (和)、減算 (差)、およびXOR して他のリージョンを形成できます。リージョンは、GrafPort 内でクリッピングに使用したり、他の図形のように塗りつぶしたり、フレームを付けて描画したりできます。一連のフレーム付き図形と接続された線を組み合わせて、リージョンにすることができます。リージョンは、連続したピクセル セットで構成されている必要はありません。切断されたリージョンも可能であり、一般的です。リージョンを使用すると強力なグラフィック操作が可能になりますが、現在の実装では最大リージョン データ ストレージ サイズが 16 ビット値に制限されているため、汎用の描画構成ツールとしては実用的ではなく、高解像度での実用も制限されます。リージョンは、QuickDraw の残りの部分を支え、複数の重なり合うウィンドウの実装に不可欠な任意の図形へのクリッピングを可能にします。Bill Atkinson によって発明されたリージョンは、Apple によって別の発明として特許を取得しました。[1]
領域は、(最初の作成後に)領域を開き、さまざまな QuickDraw 図形を描画し、領域を閉じることによって指定されます。QuickDraw コマンドが実行されると、隠しルーチンによって領域が構築されます。ビットマップを領域に変換することもでき、領域をグラフィックス ポートに「ペイント」または「塗りつぶす」ことによって、領域からビットマップを作成することもできます。
領域の内部構造は、格納長と境界矩形以外では不明瞭です。Apple が公開した文書はありませんが、メカニズムは特許で概説されています。領域は、垂直圧縮と水平圧縮の両方を使用して実装されます。領域は、一連の水平走査線 (「ラスター」)として格納され、各走査線には垂直座標と、それに続く水平反転座標のリストが含まれます。各反転ポイントは、その後のすべてのポイントの領域への包含を切り替えるものと考えることができます。最初のポイントで領域がオンになり、2 番目のポイントでオフになります。各ラインを差分的に格納することで、さらに圧縮が実現されます。各ラインには、反転ポイントの完全なセットではなく、前のラインとの差分のみが含まれます。最後に、隣接する同一の走査線は、単にスキップするだけで効率的にエンコードされます。このようにして、よく使用される領域 (角の丸い矩形) が効率的にエンコードされ、領域の構成や画像のクリッピングなどの複雑な操作を、大規模なプロセッサ サイクルや大量のメモリを必要とせずに実行できます。 (QuickDraw コードを実行する元のシステムでは、8 メガヘルツのクロック レートで動作するプロセッサが使用され、システムには書き込み可能なメモリが 128 キロバイトしかありませんでした。)
領域は特定の方向にバインドされているため、領域を 90 度回転するには、構造の詳細なリバース エンジニアリングと広範なコーディングの両方が必要になります。一般的な回転は、元のソース境界記述を回転して新しい領域を作成するだけの場合と比べて非現実的です。ただし、API には、ビットマップとの間の変換ルーチンが含まれています。(ビットマップは、よく知られた方法を使用して回転することもできますが、選択した角度、操作に使用できるストレージとプロセッサ サイクル、およびアルゴリズムの複雑さに応じて、さまざまな程度の画像劣化が発生します。)
Apple は最近 ( Carbon APIで)、いくつかのプログラム コンパイル オプションの下で、領域を不透明な構造として定義しました。
より高度な操作
QuickDraw への一連のグラフィックス呼び出しは、 Pictureと呼ばれる構造体に記録できます。これはメモリに保存され、いつでも「再生」してグラフィックス シーケンスを再現できます。再生時に、画像は新しい座標に配置されるか、ビットマップの拡大縮小で一般的に発生する解像度の低下なしに拡大縮小されます。画像は、Apple PICT形式を定義する形式でディスクに保存できます。
BitMap (またはカラー画像の場合は PixMap) 全体を、スケーリングとクリッピングを行いながら、ある GrafPort から別の GrafPort にコピーできます。関数名にちなんでblittingまたはCopyBitsと呼ばれるこの操作は、Mac 上のほとんどのアニメーションやスプライトのような効果の基礎となります。
QuickDraw は、GrafPort 内でスクロールを実装するように設計された同様のブリッティング機能を提供します。ポート内のイメージは、スケーリングせずに新しい場所に移動できます (ただし、必要に応じてクリッピングします)。
各グラフィックス プリミティブ操作は、 GrafPort に格納されている一連の関数ポインタであるStdProcs を通じてベクトル化されます。この限定された多態性により、個々の操作をカスタム関数でオーバーライドまたは置換することができ、プリンタドライバがグラフィックス コマンドをインターセプトして適切なプリンタ操作に変換できるようになります。このようにして、QuickDraw はPostScriptを使用してレンダリングできます。この事実により、 Macintosh はデスクトップ パブリッシングを事実上発明することができました。
サブクラスと同様に、Window データ構造は関連付けられた GrafPort から始まるため、基本的にウィンドウはどの GrafPort でも交換可能になります。これは便利ですが、完全なウィンドウを期待する API にオフスクリーン グラフィックス ポートを渡す誤ったコードを簡単に記述できます。
歴史
QuickDraw は、 Apple Lisa開発の一環として Lisa Graf として誕生しました。Macintosh では、最初は簡略化されていましたが、後に拡張されました。当初、QuickDraw GrafPorts は、1 ビット深度 (1 ピクセルあたり 1 ビット)、つまり白黒のみをサポートしていました。これは、512×342 ピクセルの固定サイズを持つ初期の Macintosh の内蔵画面に適していました。粗雑な平面モデルを使用して限られた色数をサポートしたため、QuickDraw は、マルチカラー リボンを使用する一部の種類のドット マトリックス プリンタを駆動できましたが、この機能をサポートするアプリケーションはほとんどありませんでした。
1987年に発売されたMacintosh IIは、コンピュータ、モニター、キーボードがすべて独立した、より一般的な3ボックスデザインとして設計されていました。モニターが独立していて、オリジナルのMacよりも大きかったため、ビデオアーキテクチャは必然的に変更する必要がありました。さらに、Mac IIはMacintoshを白黒からフルカラーへと移行させました。Apple社はまた、このとき、業界で初めて、複数のモニターにまたがるシームレスなデスクトップをサポートすることを決定しました。こうして、オリジナルのQuickDrawの重要な拡張であるColor QuickDrawが作成されました。当時、Bill AtkinsonはHyperCardで忙しかったため、Color QuickDrawの開発はErnie Beernink(当時まだ23歳)によって行われました。[2] Apple社のDave AllenもDave Fungの功績を認めています。[3]オリジナルのアーキテクチャには拡張性に対する備えがあまりありませんでしたが、一連のハックを使用して、Appleの開発者は、カラーの追加と新しいビデオアーキテクチャを、開発者とエンドユーザーの両方にとって事実上シームレスなものにすることができました。
カラー QuickDraw では、接続された各ビデオ カード/モニターを表す GDevices、カラーを処理するための新しいカラー GrafPort (CGrafPort) 構造、およびピクセルあたり複数のビット数を持つ画像用の BitMap の代わりに PixMap など、新しいデータ構造が導入されました。ここで使用されている互換性のためのハックの 1 つは、新しい構造が古いものとまったく同じサイズで、ほとんどのデータ メンバーが同じ場所にあるが、BitMap フィールドの代わりにカラー構造へのハンドルとポインターが追加されていることです。rowBytes フィールドの上位 2 ビットは、GrafPortと CGrafPort を区別するためのフラグとして使用されるようになりました (古いスタイルの GrafPort では、これらのビットを設定するほど広い BitMap は実現不可能であったため、これらのビットは常に 0 でした)。これらの上位 2 ビットの使用は、後に QuickDraw で再び問題になりました。32 ビット PixMap の最大行幅が 4,095 に制限され、高解像度のグラフィックス作業で問題になったためです。その後の開発 (Mac OS 8.5/Carbon) ではこの制限はなくなりましたが、完全な下位互換性はありませんでした。Color QuickDraw には、インデックス付きビデオ デバイスでの色の調停を管理するパレット マネージャも追加されました。ほとんどのグラフィックス プリミティブ操作は変更されず (ただしカラーで動作します)、白黒 API の新しいカラー バージョンが追加されました。
当初、Color QuickDraw は 1、2、4、8 ビットのビデオ カードでのみ動作可能で、当時はそれがすべてでした。しかし、その後すぐに 24 ビットのビデオ カード (いわゆるトゥルー カラー) が登場し、QuickDraw は再び更新され、ピクセルあたり最大 32 ビット (実際には 24 ビットで 8 ビットは未使用) のカラー データ (「32 ビット QuickDraw」) をサポートするようになりました。ただし、アーキテクチャは常にこれを許可していたため、新しい API は必要ありませんでした。カラー データ構造自体は、1、2、4、8、15、24 ビットの色深度を許可し、それぞれ 2、4、16、256、32,768、16,777,216 色、または 4、16、256 のグレー スケールを実現しました。 QuickDraw は、実際のビデオ ハードウェアで使用可能な色深度への色の再サンプリングや、オフスクリーン イメージ バッファ間の転送を管理します。これには、オプションでイメージを低い深度にディザリングして画質を向上させることも含まれます。プログラマーがインデックス付きビデオ デバイスで使用するための最適なカラー パレットを生成できるように、一連の色サンプリング ユーティリティも追加されました。
QuickDraw のアーキテクチャでは、GrafPort とそれに関連する BitMap または PixMap を「オフスクリーン」で作成することが常に可能でした。つまり、グラフィックスをメモリ内で合成しても、画面に直接表示されなくなるのです。QuickDraw のブリッティング関数 CopyBits を使用すると、これらのオフスクリーン ポートと画面の間でピクセルを転送できます。このようなオフスクリーン合成は、ゲームやグラフィックスを多用するアプリケーションで主力となっています。ただし、32 ビット QuickDraw が登場するまでは、このようなオフスクリーン ワールドは、アプリケーション内でプログラマが手動で作成して設定する必要がありました。これには、3 つ以上の独立したかなり複雑なデータ構造 (CGrafPort、PixMap、GDevice、およびインデックス付きデバイスの場合はカラー ルックアップ テーブルとその逆) が関係していたため、エラーが発生しやすかったのです。32 ビット QuickDraw では、これを処理するための OS サポートが追加され、「オフスクリーン グラフィックス ワールド」または GWorld が追加されました。 GWorld のビデオ バッファ (PixMap) は、メイン メモリに保存することも、ビデオ RAM の未使用部分に保存することもできます。その場合、メイン メモリ バスを介して大量のピクセル データを転送する必要がなくなるため、画面へのコピー速度を最適化できます。
QuickTimeの登場により、QuickDraw はJPEGなどの圧縮ラスター データを処理できるようになりました。QuickTime Image Compression Manager は QuickDraw と密接に統合されました。特に、イメージ解凍呼び出しは完全な QuickDraw 描画呼び出しであり、画像が記録されている場合は、圧縮データが画像の一部として保存され、後で画像が描画されるときに表示されます。Image Compression Manager は、 ColorSyncカラー マッチング との統合も追加しました。
その後、新しいプロセッサ アーキテクチャ ( PowerPC ) に最適化するためのバックエンドの変更を除けば、QuickDraw はクラシック Mac OS の残りの寿命を通じてほとんど変更されませんでした。QuickDraw GXとQuickDraw 3D はQuickDraw の名前を共有し、QuickDraw PixMap および画像データ構造と相互運用できましたが、それ以外の機能は完全に独立していました。
Mac OS X では、QuickDraw はCarbon APIの一部になりました。2005 年に Mac OS X 10.4 がリリースされ、QuickDraw は正式に廃止されました。
2010年にMacPaint 1.3のソースコードがコンピュータ歴史博物館を通じて公開され、[4]、 QuickDrawのソースコードの歴史的バージョンも利用可能になりました。[5]
参照
参考文献
- ^ 「Folklore: -2000 行のコード」。folklore.org。
- ^ Levy, Steven (1987 年 5 月)。「The Making of the Macintosh II」。Macworld。サンフランシスコ: PCW Communications。pp. 55–63。ISSN 0741-8647。2024年7月 31 日閲覧。p. 60:
23 歳の Ernie Beernik [sic] が、QuickDraw グラフィックス ルーチンを巧みに作り直し、色に対応させました。
- ^ Allen, Dan (1988年夏)。「HyperCardプログラミング入門」。Dr . Dobb's Macintosh Special。pp . 56–74。ISSN 1044-789X 。 2024年8月2日閲覧。p. 64:ただし、Billは当時HyperCardに関わっていたため、Mac IIに搭載されているColor QuickDrawには関わっていません。Ernie Beernink
とDave FungがColor QuickDrawを担当しました。
- ^ 「MacPaint および QuickDraw ソースコード」。コンピュータ歴史博物館。2010 年 7 月 20 日。
- ^ Hesseldahl, Erik (2010-07-20). 「Apple が MacPaint のソースコードをコンピュータ歴史博物館に寄贈」. businessweek.com. 2012-02-09 時点のオリジナルよりアーカイブ。2014-08-23閲覧。
外部リンク
- Apple Computer, Inc. Imaging With QuickDraw (PDF)。2013-05-17 にオリジナル(PDF)からアーカイブ。2018-03-09に取得。- developer.apple.com からのオリジナルの QuickDraw ドキュメント
- Apple Computer, Inc. QuickDraw Reference (Legacy) (PDF)。2014-04-18 にオリジナル(PDF)からアーカイブ。2018-03-09に取得。- developer.apple.com からの QuickDraw ドキュメント
- QuickDraw - developer.apple.com の QuickDraw リソースのリスト
- Folklore.org: Macintosh Stories: Round Rects Are Everywhere!、1981 年 5 月、QuickDraw の作成に関するストーリー
- MacPaint と QuickDraw のソースコード、コンピュータ歴史博物館
- -2000行のコード
