あまつぶ

11.16 【続RGBColorとインデックス】

 IconPartyのPNG読み込みに関して。11.13にフルカラーの場合にうまく読み込めないから自分で補正……と書いたが、そのルーチンでインタレース指定されたイメージを正しく読み込めていなかった。次のバージョンでなんとかする予定。

 かなり前のバージョンからあった、保存ダイアログでファイル名の選択表示がおかしくなってしまうバグをようやく修正できた。アクティベートハンドラを書いてうまく処理してやればいけるだろうということはすぐに思ったのだが、アピアランス関係のルーチンを呼んでみてもテキストエディットを直接いじってもなにも効果がなく、結局、ファイル名の部分を書き直してやる(UpdateDialog())だけでうまくいくことがわかった。
 アピアランスを使用できる環境であればNavigation Servicesを使うようにすればこんな小細工をしなくてもいいのだろうけど、ま、気分の問題か。

 9.5に書いたRGBColorとインデックスを変換するルーチンに関して。QuickDraw.hを見ていたらまさにそのルーチンが存在することを発見(^^;;; それぞれ、Color2Index()とIndex2Color()だ。カレントポートのカラーテーブルを参照して求めてくれるらしい。パレット内に存在しない色についても近い色のインデックスを求めてくれるし、これは便利だ。自分で作る前にちゃんと確認すべきであった。むむ。
 そんなわけでこれを使って画面の任意の位置から色を得るルーチンを作成。スポイトのダブルクリックかメニューからの選択によって呼び出され、マウスカーソルが指している場所の色がリアルタイムでブレンドパレット上に表示される。本当はカラーパレットのハイライト表示も変えようかなと思ったのだけどややこしいのでやめ。
 画面の色を求めるのはLMGetWMgrPort()で画面のポートを得てそれをカレントポートにした状態でGetCPixel()を呼ぶだけ。その後上記の2つのルーチンを使ってパレット内の色に変換してやれば終わり。
 通常のイベントルーチンでは例えばデスクトップをクリックすればFinderに移ってしまうからまずい。イベントマスクをいじってOSイベントを無視するようにすればいけるかなと思ったらどうもマウスダウンイベントが来た時に切り替えられているらしい。マウスダウンイベントを無視するようにすれば切り替わらなくなるけど今度はクリックされたイベントを得ることができない。ということは、イベント処理ルーチンにしないで地道にGetMouse()とButton()でマウス位置を調べた方が簡単だ。ループから抜ける時にFlushEvents()を呼んでおくことを忘れずに。

 もうひとつ。これも古くからあるバグだが、ルーラ表示時に一部が残ってしまうことがあるというもの。つけたはいいけど自分では全く使っていないこともあってバグだらけだ。今回まとめて修正してやろうと思ったのだが修正しなければいけない箇所が多すぎてなかなかはかどらない。いっそこの機能自体をなくしてしまってもいいような気がするが、どうだろう。ルーラを使っている人ってどのくらいいるのかなぁ(現在のバグだらけの状態では使い物にならないから誰も使ってないかも知れないけど)。

 これら以外に、見つかっていて修正できていないバグは今のところない。この感じなら思ったより早い時期に正式版にできそうな感じだけど「このバグまだ直ってないぞ」ってのがあったらどんどん報告してほしい。報告のあったバグはすべてメモしてあるつもりだけど忘れているものがあるかも知れないし。また、これまで報告していなかったけど実は……ってのも歓迎。

 PNGの読み書きのことがだいたいわかったので、QT-QもQuickTimeなしでPNGを読み書きできるようにするつもり。JPEGについてもやってみようと思う。次のバージョンはいくつか見つかっているバグも直しつつ2.1b1くらいかな。IconPartyがもう少しまとまってから手をつける予定なのですぐにってわけじゃないけど。

 そういやDownload ASCIIにおともだち帳エディタとかIconPartyとか置いてもらってるけどバージョンが古いままだな。変更するのってどうやってやるんかな。「新しいバージョンを出しました。ここからダウンロードできます」ってメールすれば変更してくれるんだろうか。そもそもどこにメールすればいいのかもよくわからんけど。んー。

久々の「今日のToolbox」。今回からどのヘッダファイルで定義されているかを書くことにしよう。とりあえず、Universal Interfaces 3.2(+updater)での話。 前回は99.2.17らしい。

pascal long	Color2Index(const RGBColor *myColor);
カレントポートのカラーテーブル上でのインデックスを得る。
カラーテーブルに存在しない場合はそれに近い色のインデックスが得られる。
返り値	インデックス。
myColor	インデックスを調べたい色。
#include	<QuickDraw.h>
pascal void	Index2Color(long index,RGBColor *aColor);
カレントポートの指定されたインデックスの色を得る。
返り値	なし。
index	調べたい色のインデックス。
aColor	インデックスから得られた色が返る。
#include	<QuickDraw.h>
pascal GrafPtr	LMGetWMgrPort(void);
ウィンドウマネージャのポート(デスクトップのポート)を得る。
機能的にはGetMgrPort()、GetCMgrPort()と同じ。
返り値	デスクトップのポート。
#include	<LowMem.h>


to November 13, 1999 ↑ to November index → to November 19, 1999