MacPaintとPICTフォーマット

f:id:juangotoh:20171031091702g:plain
 初代Macintoshに同梱されたMacPaintは、その後のビットマップペイントソフトの共通祖先となったと言っていい、偉大な影響力を誇った。左にツールパレットを配置し、中央にドキュメントウィンドウ。ツールパレットをクリックすれば鉛筆やブラシ、塗りつぶしバケツが切り換えられる。このあたり前のフォーマットを作ったのがこのソフトだ。これ以前のものは、例えばろくなパレットがなく、キーボードの特定のキーでツールを切り替えるなど、直感的とはいえない操作性のものが多かったのだ。ただ、初期MacPaintは、メインウインドウは一つだけで、動かすこともできない、ただの背景みたいな動作だっだりして、メモリが128KBしかなかった当時の妥協の産物でもあったりする。スクロールバーもなく、ハンドツールでスクロールする。画像も576×720ピクセルモノクロ固定だったりする。

 このMacPaintが作成する画像ファイルは、MacPaint形式と呼ばれる。構造としては、

  • 4バイトのバージョン
  • 8*38バイトの塗りつぶしパターン
  • 202バイト空き(将来の拡張用)

 という512バイトのヘッダーがあり、その後に圧縮したビットマップが並ぶ。塗りつぶしパターンは、画像の表示には必要ない。MacPaintの画面下部に並ぶパターンパレットに入れるためのもので、8バイトで一つのパターンが定義され(8×8ドットモノクロ)、それが38個並んでいる。なお、バージョン番号が0であれば、デフォルトパターンを使用することになっていたので、カスタムパターンが不要ならヘッダー512バイトを0で埋めればよい。
 画像本体は、1ライン576ピクセル=72バイトずつPackBits圧縮されてこれが720ライン分書き込まれている。PackBitsは、シンプルなランレングス圧縮の形式で、同じデータ(バイト単位)が続かない部分はバイト数をマイナスにして生データを並べている。バイト数は8ビットなのでsignedにすると127バイト以下しか扱えないが、MacPaint形式画像の1ラインは72バイト固定なので問題なく使える。このPackBits圧縮/展開ルーチンはQuickDraw APIに含まれていたので、これを呼び出すだけでよかった。

 MacPaintのインパクトは大きかったので、初期Macintoshにおいて、この形式は標準画像ファイルフォーマットに近い扱いだった。実装も簡単だったし。しかし、あまりにシンプルで固定化されたフォーマットのため、応用が効かず、数年で廃れていく。モノクロで画像サイズ固定だもんなあ。AppleがMacPaintの同梱をやめてしまったのも痛かった。

 さて、MacPaintと同様、MacDrawというソフトが初代Macには同梱されていた。
f:id:juangotoh:20171031101026p:plain
 こちらはベクター形式のツールで、保存形式はPICTファイル。これはMacの画面描画命令をそのまま記録したものだ。まずOpenPictureという命令を実行し、その後画面に好きなように描画する。最後にClosePictureという命令を実行すると、OpenPicture以降に実行された描画命令が記録されたメモリブロックが確定する。これをPictHandleというが、DrawPicture命令にこのPictHandleを渡せばいつでも記録した描画を再生してくれる。なお、ベクター系の命令ばかりではなく、ビットマップ転送命令も記録できるため、あらかじめウィンドウに描かれたビットマップがあったとして、OpenPictureしてすでにあるビットマップを自分自身に転送してClosePictureすれば、ビットマップそのものを記録可能だ。したがって、描画に時間がかかる複雑な画像や、MacPaint形式の画像を読み込んだものを、「自分自身に転送」して、PICT形式に変換できた。

 つまりPICT形式ならベクターもラスターも両方扱えたのだ。また、描画命令を記録するという性質上、OSのアップデートで新たな描画命令が追加されても、プログラムの変更なくそのまま使用可能な場面が多かった。実際、最初はPackBitsしかなかったビットマップ圧縮アルゴリズムも、QuickTimeの追加によって、JPEG他様々なコーデックが使用可能になっていった。

 なお、PICTデータはOS内部で自在に使われていたが、MacDrawが作ったファイル形式は、MacPaintと同様、ファイル先頭に512バイトのヘッダがあり、その後にPictHandleの中身を書き出したものだったため、これを読みこんで画面に表示するためには、頭512バイトをスキップする必要があったし、後のMacDraw以外のアプリケーションがPICTファイルを書き出す際は冒頭512バイトを0で埋めるのが基本になった。PICTデータとか、PICTハンドルというときは、頭からPICTの命令セットが入っているものだが、PICTファイルというと512バイトのヘッダがついているものになるので、若干注意が必要だ。

 PICT形式は大変便利だったため、Mac上で完全に画像ファイルの標準形式になっていった。しかし、その描画は変化していくMacOSに依存し、規格で範囲が定まるものではなかったため、他機種で再現するのは難しく、機種を超えて広く使われる形式にはならなかった。JPEG圧縮したPICTファイルなんてものは、他機種で見ることができない。だったら最初からJFIF形式にしたほうがいいだろう。やがて、MacOSがNeXT由来のOSXになって、Classic系のAPIが徐々にフェードアウトしていき、Mac上でも使う人がいなくなっていく。

 MacPaintやMacDrawが登場したのは1984年。まだJPEGもGIFもTIFFも存在していなかった。業界共通の画像フォーマットがなかった時代だから、Appleは画像フォーマットも作成せざるを得なかったのだ。


 なお、WindowsにはWMFという、MacのPICTみたいにGDIの命令を並べたファイル形式があるのだが、発表が1990年代に入ってからで、すでにその他の画像フォーマットが広く使われていたためが、さっぱり普及しなかった。