ビル・アトキンソンとQuickDraw リージョンについて思いを巡らせた高3の夏

iOSの開発をしているのでiPadでも買うべきところですが、Kindle4が安かったのでつい買ってしまいました。軽いし文字も読みやすいので、読書にはいい端末です。

さて、Jobsの伝記が発売になったので、早速Kindleで購入して読んでいます。iOSで読むのが本当はいいのでしょうけど。

Lisa/Mac開発のくだりになって、ビル・アトキンソンとQuickDrawとりわけリージョンの話がちょっと出てきました。簡単に言うと、コンピュータの画面上の一部の領域を、矩形に限らず円や任意の形で指定できるという機能です。ドロープログラムで、一部の領域をマウスで選択して動かしたりできますね?あるいは、上のウィンドウで隠された下にあるウインドウの、画面に出ている部分はただの四角ではなくL字型だったりしますね?そういう様々な形を扱うことができるのがリージョンです。

高校生の頃、OS-9/68000を使っていましたが、ウインドウシステムはどうも貧弱で使い勝手の悪いものでした。その頃(1988頃)にはすでにMacでマルチウインドウは高い水準で実現されていました。Macでどういう風になっているのか、MacのToolbox (OSに相当するような、GUIの基本ルーチン)の解説書を、連日地元のK書店に立ち読みに行きました(1万円以上する本で、何巻かに分かれていた記憶が)。

その時、上記の「リージョン」というのがあるのを知りました。今普通にそれを実現しようとすれば、マスクに相当する白黒のビットマップを作るところでしょうか。ただ、当時のマシンのメモリは非常に限られていました。仮に512x512のビットマップをモノクロで作ると、32KBytesになります。また、リージョンは仮想座標系の中で拡大できるので、32000x32000とかになりえます。1MBytes以下のメモリしか積んでいなかった当時のマシンでは、ビットマップで実装するのは無理でした。

しばらくパソコンを封印していましたが、どのようにすればリージョンが実装できるのか、自分なりに考えてみました・・・

不定形のようなリージョンでも、どこかのy座標について見てみると、つまり水平の赤線との交点で見てみると、赤線はリージョンの中に出たり入ったりします。交点の座標を記録しておけば(この場合4個),赤線の上の任意の点について、リージョンの内部にあるか外部にあるかは簡単に判定できます(x座標の値が1つ目の交点以下なら「外」、1つ目と2つ目の交点の座標の間なら「中」、2つ目と3つ目の交点の間なら「外」、・・・)。これだと、交点の座標だけ記憶すればいいので、ランレングス圧縮と似たような効果があって記憶容量はずいぶん少なくできます。

受験生だったので実装したりはしなかったし、これを始めると何ヶ月もかかってしまったでしょう・・・

表題のビル・アトキンソンの話ですが、ふと思い立って検索してみると、QuickDrawのソースコードは公開されているのでした。

Computer History Museum – MacPaint and QuickDraw source code

68000のアセンブリ言語を読むのは15年ぶりでしょうか。68Kのアセンブリ言語は、Cを読むのと殆ど変わりません。なんでこんなに良いCPUが廃れてしまったのか・・・

さて、Regionの実装は、ほぼ高校生の時に予想したとおりでした。アセンブラでこれほど綺麗なソースはすごいです。アップルが、その後PowerPCに移行してもここだけは68Kアセンブラのままだったそうな。

いろんなルーチンがある中でInsetRgnというルーチンがあり、あるリージョンのxピクセル分内側に縮小したリージョンを作るというものですが、これは実装方法がよくわかりませんでした。

ソースコードを読んでみると、まず横方向には、僕の書いた図で点1を右に、点2を左に、点3を右に、点4を左に・・・と動かすことで、領域を縮小するようです。これはわかります。縦方向はどうするのかというと、なんとX/Y座標をスワップして、更にもう一度横方向にInsetしているのでした・・・ビル・アトキンソンすごいな。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中