あまつぶ

1.9 2:30 【タンジェリン?】

 画像サイズの変更で%での指定や縦横比を固定した変更を可能にしてみた。あまり使わないかも知れないけど多少は便利になったはず。なんかこのあたりの機能を追加していると256色に限定しないでフルカラーの絵なんかも扱えるといいなぁなんて思ってしまうけど……(笑)。
 また、細かいところでオプション+カーソルキーで選択範囲を8ドットずつ動かす機能を追加。同じような感じで明るい色や暗い色を選ぶのにオプション+カーソルで2段階変更するというのを考えたけどそれはあんまりいらないかな?
 それからコピー&ペーストの際にリージョン情報を保持するためにPicCommentを使ってみているのだけどどうもうまくいかない。コメントを追加するところまではできたつもりなんだけど取り出しが……。サンプルのソースを参考にコメントを処理するルーチンを作ってそれをcommentProcに設定してDrawPicture、、これでできると思ったのだけどこれがなかなかうまくいかなかった。commentProcの指定なんかが間違っているんだろうと思ってしばらく原因がわからなかったのだが、結局はリージョンを調べる前にPictureを消してしまっていたのと(おいおい)、リージョンに変換するハンドルの名前を間違っていたことが原因だった。我ながらしょうもないミスの連続……。
 次はリージョンの回転、、の前にMDEFを作るつもり。作ったことがないものを作るというのはなんだか緊張するなぁ。LDEFとかだったら以前に作ったものをコピーしてきていじるだけなんだけど(笑)。

 そういえば、色違いのiMacが出るらしい。ぱっと見た感じではどれもいまいちぱっとしないなぁという感想。色的には前のものの方が好きかもしれない。どっちかというともっと淡い感じの色の方がいいなぁ。あと、クロックもできれば300MHzくらいがよかったかも。関係ないけど、新しいやつのブルーベリー、ストロベリー、ライム、グレープってのはわかるけど「タンジェリン」ってのはなんなんだろう。ことえりも変換できないし(new iMacについてくることえりでは変換できたりするのかしら)。どれがどの色に対応しているのか……はシステム構成を見るとわかるみたい。ふむ。それによるとタンジェリンはオレンジ色だ。なんかの柑橘類かなと思いつつ辞書をひいてみると、「tangerine」というのを発見。これかな。「タンジェリン、ぽんかん」って書いてある。ふむ、ぽんかんか。
 それよりまあ、前のが128,000円で買えるということの方がちょっと気になったりする。こたつとかにも置けそうだし(あんまり似合わないとは思いつつ)冬はうれしいかもしれない(笑)。一応LANもあるしファイルの移動なんかも楽にできそうだし……。とはいえまあ、買わないと思うけど。

 漢字Talk7を標準でインストールするとシステムフォルダの容量はなんと5.8M。FirstClassのサーバになっているPowerBookのシステムフォルダは4.8M。減らせば減らせるもんだ。G3の方の8.5.1のシステムフォルダは200M以上。かなり肥大化したもんだなぁ……。使用メモリにしてもPowerBookの方はシステムが2.5Mくらいしか使ってないし(総メモリ8Mだけど)。今後どうなるのかわかんないけど、どうなるのかねぇ……。

 おそらく次回はMuscat 1.0b1のこと、それからコードリソースを呼ぶ方法についてかな。コードリソースの方はちょっとサンプルプログラムを書くつもりなのでちょっとかかるかも。ま、方法はわかっているのでちゃんと動くかどうかチェックするくらいだけど。
 3:30 【コードリソースを呼ぶ】

 予定通りコードリソースを呼ぶ話。まずは68kコードでの話。ppcではたぶんRoutineDescriptorを作ってやる形になるかと思うけどちょっとよくわからない。また機会があれば触れるかも知れないが。
 まずは、サンプルコード。

OSErr CallCodeResource(void)
{
	pascal void (*theEntryPoint)(void);
	OSErr	err;
	Handle	theCodeResource;
	
	/* コードリソースをメモリに読み込む。ここではFKEYのid=8を指定 */
	theCodeResource=GetResource('FKEY',8);
	err=ResError();
	if (err!=noErr) return err;
	
	/* 読み込んだリソースを独立のハンドルにし、高位のアドレスに固定 */
	DetachResource(theCodeResource);
	HLockHi(theCodeResource);
	
	/* コードリソースの実行アドレスを得る */
	theEntryPoint=(void *)StripAddress(*theCodeResource);
	
	/* コードリソースを呼ぶ */
	theEntryPoint();
	
	/* ハンドルを片付ける */
	HUnlock(theCodeResource);
	DisposeHandle(theCodeResource);
	
	return noErr;
}


こんなソースを書いた。やることはFKEYのID=8を呼び出すというもの。たったそれだけ。うちではID=8にWebColor_FKEYを入れてあるのでカラーピッカーが出てきて……という感じ。
 では上から順に解説。一番上に「pascal void (*theEntryPoint)(void);」なんてのがいきなりあって混乱するかも知れないが、これは要するに「引数なし、返り値なしの関数へのポインタ」の宣言だ。「関数へのポインタ」ってなんだ?と思うかも知れないが、要は関数の入っているアドレスを示すもので、この内容を変更すれば実行する関数を変更することができるわけ。ここでは読み込んだコードリソースを呼ぶためにこのポインタを使用する。このあたりはちょっとわかりにくいかと思うけど、Cの入門書なんかをよく読むとわかるかと思う(というぼくは読んだことがないので知らないけど(苦笑))。
 まず、コードをメモリに読み込む。リソースマネージャを使ったことがないとなにをやっているのかわからないかも知れないが、要するにここではFKEYリソースのID=8をメモリに読み込んでいるわけ。theCodeResourceというハンドルが示すアドレスにリソースの内容が読み込まれる。ResError()は直前に実行されたリソースマネージャの関数でエラーが起こっているかどうかをチェックし、エラーが起こっていれば(リソースが正しく読み込まれなければ)エラーを返して終わり。
 読み込めたら、それをリソースとは関係ない独立のハンドルにする(DetachResource)。このあたりもリソースマネージャのことがわからないと謎な部分かも知れないが、ここではまあ「おまじない」みたいなものだと思ってもいい。それから、邪魔にならないようにできるだけ高位のアドレスに移動してロックする。ロックするのは、実行中にアドレスが変わってしまっては困るから。高位のアドレスに移動するのは、メモリの断片化をできるだけ防ぐため。
 次にStripAddressという関数を呼んで実際に実行すべきアドレスを得る。コードリソースの頭には実行するプログラムではない「ヘッダ」と呼ばれる部分があるからこの部分を読み飛ばす(正確にはちょっと違うような気もするが、まあやっていることは同じこと)。これでtheEntryPointに呼ぶべきアドレスが得られる。
 で、呼ぶ。FKEYは引数も返り値も持たないので最初に定義した形になるだけ。もっと複雑なものであっても方法は同じこと。
 実行が終わったら確保したメモリを解放して終わり。と、たったこれだけ。わかりにくいのは一番最初の「関数へのポインタ」くらいで、あとはリソースマネージャとメモリマネージャがわかっていれば問題ないはず。
 未確認だがppcの場合はtheEntryPointにアドレスを得るところまでは同じで、呼び出し部分でCallUniversalProcを使うだけだと思う。procInfoを作るのも必要だけど。

 実は、IconPartyでプラグインみたいなものを作れるようにしようかなと思っていて、そこでこれが使えそうかなとか考えているわけ。最初は「Photoshopプラグインが使えるようにしよう」とかとんでもないことを考えてSDKのダウンロードまでしていたんだけど、とりあえずは独自形式でいいから使えるようにしたいなと思う。今までに作ったアンチエイリアスなんかもプラグインにしてしまえばそこだけちょっといじりたい時なんかも楽な気がするし。作り方を公開すれば、自分で作るのが面倒な部分は誰かが作ってくれる可能性もあるし……(笑)。

 なんか長くなってしまったのでMuscatの話は、次回。

to January 8, 1999 ↑ to January index → to January 10, 1999