割と朝普通に起きたり。
なんとなくInkscapeいじり。閉領域の塗りつぶしを行う具体的な
方法が思いつかなかったり。ここで言う閉局塗りつぶしは、フリーハンド
線やベジェ曲線ツールで描いた閉局の塗りつぶしではなく、カリグラフィ
で描いた線画を着色する方法の事です。例えばFlashだとバケツツールを使って、
見た目が閉局になっている領域に沿ったポリゴンオブジェクトを生成した後、
ポリゴンオブジェクトの色を変えるという感じで行います。
ところがInkscapeにはこのバケツに該当するツールがどうにも見当たらない。
自力でフリーハンド
ツールやベジェツールを使って閉領域をトレスするしかないのかなぁ?
完全にパスで囲まれている絵であれば、次の様にするのはどうじゃろ?と
思ったり。
割と朝普通に起きたり。
wxDでOpenGLを使う続き。とりあえずマウスイベントを取ってみたり。
マウスキャプチャーは自力で行う必要があるようですが、概ね
GTK+と同じで、Eventクラスに記録されているメッセージを調べて
どう動くかを自分で決めるという感じ。最初、マウスキャプチャーを
使ったサンプルってのをWeb上でも見つけられなくて、結局、
WindowsAPIのSetCapture()という関数名をキーにして、
wxWidgetsのソースコードをgrepしまくって見つけたという感じ。
まぁでも、マウスキャプチャーを含めて、大体の操作は 基底クラスとなる
Windowクラスに入っている様なので、ここを押さえておけばやりたい事の
調べは付くという感じみたい。
ちょろりお出かけ。特に収穫無し。フリーフォントの本を買ってみただけ。
インターネットTVで見ていたエウレカセブンの最終回。途中かなり
おいてけぼりをくらいそうになりながら、どうにかついていってました。
一体どうなるんじゃろ?と思いながら見ていたのですが、最後はちょっと
消化不良気味だったかも。コーラリアンの設定とか、EVA風味漂っていたので
大丈夫か?とも思ったのですが、EVAと違って全く何だか判らない存在という
訳ではなかっただけに(あーでも、絶望病とか、最初から何で情勢が荒れた世界
だったのかとか よく判らなかったなぁ)、
で?どうなったの?ってのをもう少し具体的に描いてもらった方が
良かったかなぁという感じがしました。
みっちり寝て昼過ぎ起床。
TV観たりWebを巡回してぐうたら過ごしたり。
そういやMeadowのtoolsの中にEdiffモードなるものがあるのを知ったり。
二つのバッファやファイルの差分を並べて表示できるというモードです。
差分を見るツールと言えば、コマンドラインのsdiffをよく使う
のですが、マルチバイト文字や改行コードの都合で見づらい表示に
なってしまうのがイマイチでした。Ediffモードでは並べて見られる
のは勿論ですが、カラムの差分も色づけ表示されるので、スペル違い
のような小さな差分も簡単に見つけられるように思いました。
wxDでOpenGLを使う続き。色々ハマりながらどうにか表示だけはできてみたり。
マウスやキーボードのイベントは取り方がまだよく判ってなかったり。
でも、ウインドを小さくなる方向にサイズ変更すると、何故かペイントイベント
が発生しなかったり。そこでRefresh(false)メソッドをリサイズ処理の中で
必ず実行するようにした所、ウインドを小さくする場合でも再描画が行われる
ようになったのですが、サイズを大きくした時に激しくチラついたり。
そんな訳で、ウインドサイズを小さくするときだけRefresh(false)を実行
するようにして解決してみたり。でも美しく無いなぁ。
早くもなく遅くもなく。
スパイダーマン2を見てたら途中で寝てたり。
核融合実験とドクターオクトパスの機械の触手の必要性の関係が
イマイチよくわからなくて、「んんっ?」って感じでした。
結局最後まで観てないのでアレですが(ぉぃ;
MJは相変わらず見た目が老けてます。でも1982年生まれらしいので、
2002年公開のスパイダーマン1の時の高校生設定は(撮影期間を遡ったと
しても)リアルにそのままだったみたい。
早めに帰着。
wxDいじり。OpenGLを使ってみるテスト。でも、イベントコードが
Duitのそれと大分違うので書き換えだけで死亡。
インターネットTVで、前回の続きとなる
「
TVゲーム・ジェネレーション 〜8bitの魂〜」の最終回を見たり。
デバッグしたり最終調節したりと最後まで作って完成。
意外と高評価な感じでした。この番組の最終目的はゲームの面白さ
の真髄を探るという事でした。結論としては確かに面白いものには
なったが、それがどこからくるのかは 結局よく判らない。
ゲームを作るのは難しい。という感じでした。
でもそれは正しい結論なのかも。そして真髄に答えは無いのかも。
と思いました。
早くも無く遅くも無く。
wxDいじり。ちょろっといじって終了。
早くも無く遅くも無く。
wxDいじり。ほんの少し掴んだ気も。
気持ち早めに帰着。
wxWidgetsの2.8.3をビルドしていたので、ついでにCVS版のwxD-0.10を
checkoutしてみようかと思ったら、つい先日、wxDが0.10で正式にリリース
されていたり。少し手直しする必要がありましたが、基本的に見ているだけで
ビルドは完了。wxDのサンプルも
自前のテストコードもコンパイル&実行できたので、ビルドは問題無さそう。
でも、Bitmapクラスでメモリリークするのはやっぱりそのまま。
そんな訳でメモリリーク不具合を直してみたり。とりあえずOKそう。
で、再びwxDいじりに復帰。ImageクラスのLoadFileメソッドで各種画像ファイル
を読み込む事ができるのですが、それをいじる事ができないのに気づいたり。
Duitで言う所のPixbuf.getPixels()と同じ事ができればそれで
済むのですが、wxDには見当たらず。wxWidgetsでは、
wxImage::GetData()がそれに相当するみたいなので、
単にwxDでラップされていないだけの予感。んー、でもなんで?
しかたないので自分で追加してみたり。wxWidgetsのソースを見ても、単純に
ピクセルマップへのポインタを返しているだけもよう。D上では、得た
ポインタをずっと保持し続けずに、用事のある時にポインタを得て、
終わればそのまま放置という使い方で問題になる事はなさげ。
割と普通に起きたりみたり。でもぐうたら過ごして終了。
wxDメモリリーク追いかけ。
昨日見つけたm_refData->m_handleを::DeleteObject()して
いないように見える件を確認してみたり。そもそも、wxBitmapクラス
のデストラクタ実行時には既にm_refDataがNULLになっている
のですが、どこでこの参照カウンタを-1しているのかをどうしても
見つける事ができなかったり。あと、wxDのBitmapクラスのデストラクタ
も見てみたのですが、基底クラスであるwxObjectのDispose()メソッド
を実行しているだけで、これは単純にwxなオブジェクトを解放するだけ
に使われているようでした。
で、ややこしいのは次の点。そもそもm_refDataはwxObjectRefDataという
原始的な参照カウンタクラスを保持するメンバー変数です。ところが、wxBitmapでは
wxObjectRefDataを拡張した、wxBitmapRefDataというクラスを
メンバー変数 m_refData に保持しているのです。そして、m_handleは
拡張されたwxBitmapRefDataのメンバー変数にしか含んでいません。
つまり、wxBitmapクラスの中に限って言えば、m_refDataの実体は
wxBitmapRefDataなので、カウントが0になったらm_handleのオブジェクトも解放しなく
てはならないのですが、m_refData という変数名だけ見ると
(というか型宣言的にも)、wxObjectRefDataクラスのインスタンスなので、
参照カウンタだけ操作すれば良いように見えてしまうのです。
で、wxWidgetsとwxDのwxc/bitmap.cppの中に m_refData->m_handle
を::DeleteObject()するメソッドを追加して、wxDのBitmapクラスの
デストラクタの中から、追加したメソッドを実行するようにしてみました。
すると、メモリリークはおさまりました。ふぅ。
でも、これってバグなのかしら?wxWidgetsに対してwxcとwxDが被って
いるので、ラップのチョンボの可能性もありそうなのですが、
そこまで追いかけきれてません。
それにしても、wxWidgetsのbitmap.cppのコードは(他もそうなのかも知れませんが)
m_refData->m_handleにハンドラをセットするのはSetHBITMAP()という
メソッドでラップしているかと思いきや、refDataのメンバーを
直接いじったりしている所もあって、イマイチ記述に一貫性が
無いようにも思いました。まぁいいけど。
昼ごろ起床。
wxDメモリリーク追いかけ。
Win32APIの CreateDIBSection()を実行しているようなのですが、
それを削除する為の::DeleteObject()が実行されていないような気が。
でも、どこで::DeleteObject()が実行されるべきなのかイマイチ
よく判らず。
それにしても C++ って、DやJavaに比べて、なんか読みにくいなぁと
思ったり。
メソッドがクラス宣言の中に必ず入っているJavaやDと違って、
実体をどこにでも書けるようになっているせいか、
メソッドを探すのがものすごく大変。ヘッダファイルに
メソッドやメンバー変数が定義されている事もあって、両方を
同時に見ないと継承されたものなのかどうかも、ぱっと見でよく
判らないのもイマイチな感じがします。
wxBitmapクラスの中にはwxObjectクラスから継承されるm_refData
という参照カウンタのインスタンスを保持するメンバー変数があります。
この中のm_handleというメンバーにCreateDIBSection()で得られた
ハンドラを保持しているという事が判りました。で、問題は、
wxBitmapのデストラクタの中で、m_refDataを見てみると、NULL
になっており、既にどこかで解放されてしまっています。
m_refDataの中のm_handleを先に::DeleteObject()で解放した後に
参照カウンタの実体であるm_refDataをdeleteする必要があるかと
思うのですが、実際にそのような動きになっているのかどうかが
判らず。
wxObjectクラスのUnRef()という参照カウントを-1するメソッド
では、-1して参照カウントが0になると、m_refDataで保持される
カウンタクラスのインスタンスをdeleteしているのですが、
m_refData->m_handleは::DeleteObject()している様に見えない
ので、これだとメモリリークしてしまうような気がします。
気持ち早めに帰着。
wxDメモリリーク追いかけの続き。
最初の一回目のBitmapインスタンスは、実体削除されている
ようなのですが、二回目以降にインスタンス化したBitmapは
実体削除が全く行われない模様。その為リークが発生している
という予感。でも、参照カウンタを更新しているコードがイマイチ理解
できず(主にC++が読めないところに起因(^^;)。
早めに帰着。
気が付いたら寝てたり。
早めに帰着。
wxDのメモリリーク調査。wxWidgetsの中を眺めてみたり。
API仕様にはwxBitmapのデストラクタは存在するようですが、
実体は無い模様。wxBitmapクラスの内部で参照カウンタを
持っていて、参照無しになれば実体は無くなるようなのですが、
printfを入れて参照カウンタが0になる契機を眺めてみても、
イマイチ動きがよく判らず。
漠然とした勘ですが、DIBitmapを生成するばかりで解放して
いないような予感がしたりしなかったり。
早めに帰着。
wxDのメモリリークの調査。Fedoraでビルドしても同じか?
という事で、ソースを持っていってコンパイル&実行。
Segfaultでウインドすら開かず(T_T)。これまた全然違う
動かなさっぷり。strlen()がSegfaultをこいているようなの
ですが、libc内でシンボルがストリップされてて引数に
何が指定されているのかよく判らず。恐らくNULLを食って
死んでいるのだとは思いますが。
wxDのサンプルにHello.dというウインドを開いてステータスバーに
HelloWorldを表示するだけのプログラムがあるのですが、
それもSegfaultで動かなかったり。gdbでスタックダンプして
みると、同じような動かなさっぷりだったので、コード量の
少ない(約10行)Hello.dの方をいじって様子を見たり。
で、gdbで色々仕掛けてみるも
要領を得なかったので、そもそも思い通りに動いているの
かとprintf()文を途中に入れた所、何故か動くようになってみたり。
とほほ臭ぇ......。
WindowsでメモリリークするテストプログラムをHelloと同じ
要領で動くように直したところ、ウインドは開くようになったり。
で、topでプロセスを表示しながら、メモリリークする操作を
実際に行ってみたのですが、プロセスが成長するような事はなかったり.......
と思ったら、画面を受けていたCygwin-Xが突然落ちたり。
再度Cygwin-Xを立ち上げて、タスクマネージャで観察
しながらメモリリーク操作を行った所、
Cygwin-X(正確にはXWin.exe)がどんどん巨大化
している事が判ったり。そう来るか。
そこで、Fedoraのデスクトップでテストプログラムを起動して、
topで観察しながらメモリリーク操作を行ったところ、
今度はFedora上のXorgが凄い勢いで巨大化したり。
という訳で、Fedoraの方でもメモリリークは再現して
いる模様。Xサーバーからもらった何かしらの領域を
解放していないような動きになっているのが問題という
感じみたい。Windows版ではWin32APIを使った自前描画で
置き換えられているので、そこん所の区別が付かないと
いう事らしい。Win98だとリソースが凄い勢いで減って、
OSごとお亡くなりになるとかそんな感じになる所
なのかも。
で?どう直せば? そんな感じ(^^;
早くもなく遅くもなく。
wxDでのメモリリークの調査。Bitmapクラスから順に辿ってみたり。
行き着く先の基底クラスはwxObjectで、この中にデストラクタが
宣言されているという感じ。デバッグプリントを加えてみた
のですが、デストラクタは通っているもよう。
で、デストラクタの中でdtor()というメンバー関数を実行する
事で実体を削除する仕組みになってます。dtor()の中では
wxObject_dtor(IntPtr self)というC言語関数のブリッジを通して、
C++の deleteを実行する事で実体を削除しているという感じ。
コード上の動きは正しそう。
実体へのポインタを色々表示してみるも追いかけきれず。むーん。
朝わりと普通に起きて、ワンピースのアニメを観たり。
結構進み遅いなぁと思ったり。
そんな感じでぐうたら過ごして一日終了。
何気に見ていた「
世界の果てまでイッテQ!」で、
死海の水で漬物を漬けるとどうなるか?というのをやってたり。
普通に漬かるんじゃないの?と思いながら見ていたのですが、
実際に漬けてみると苦い漬物になってみたり。その理由は
死海の水は塩化マグネシウム(俗に言う「にがり」)成分が強い為、
苦い漬物になるとの事。で、豆腐を作る事にしたところ、
これが思いのほかうまくできたりして、へぇー と思ったり。
この番組、濡れたTシャツを戦闘機に吊るして飛ぶと乾くか?
(結果は 完全に乾くが風速が強すぎてボロボロになる)とか、
くだらないけど、答えられない感じの質問を、信じられない
手間をかけて検証した結果、意外と面白い答えになる時が
あるって感じが、うまくハマっていて、つい見てしまう
感じになっているように思います。
たまたまタスクマネージャを表示しながら、先日作ったwxDの
簡単な実験プログラムを動かしていた所、メモリリークしている
感じになっていたり。Bitmapのインスタンス生成を繰り返すと、
プロセスサイズがどんどん大きくなってしまう模様。
Dのラップ領域ではリークしていないと考えられます。
C++→Cのラップでデストラクタに問題があるのかも。
んー、でもこれって直せるのか?
昼過ぎ起床。
wxDいじり。なんとなく雰囲気が判ったり。
wxDのAPIリファレンスのページを見ながらいじってるのですが、
よく判らない所はwxWidgetsに行き着きます。でも、
wxWidgetsの日本語ドキュメントもこれまた思ったよりも少なくて、
判らずじまいのままになったり。結局、値を色々変えて反応を
見るという感じ。
早めに帰着。
インターネットTVで、「
TVゲーム・ジェネレーション 〜8bitの魂〜」
なる番組を観たり。ゲームの面白さの真髄を探る為、自分でゲームを
作ってみようという感じで始まった企画の番組です。で、実際に動かす
プラットフォームは「ファミコン」。企画から始まり、実際にエミュレータ
上で開発して、最後は実機で動作させるという感じで進んでます。
今回見たのは実機で動かす所で、既存のファミコンカセットの、最も
オーソドックスなタイプの基板からROMを外して、ソケット実装できる
ようにしたEP-ROMに製作したゲームを焼いて、動作させるというもの。
そういうのが得意な人がやってるのでは無く、ROMの正逆もイマイチ
区別が付かない感じの人がやってるので、「本当に動くんかいな?」
と思いながら見てたのですが、実機で画面がちゃんと出たときには、
思わず「スゲー」とTVに話かけてしまいました(^^;
それにしても、プログラムROMが32k、キャラクターROMが16kという感じ
で合計64kに足りない容量にゲーム1本入れるってのぁ、今では どだい
無理という気がしてなりません。だって、320x240x4byteのフルカラー
VRAM容量の、約6.25分の1 に全てが入っているのですよ?(^^;
で、「
ギコ猫でもわかるファミコンプログラミング」てなサイトを知ったり。
でも、エミュレータを使って動きを見て作ったという感じ。レジスタマップ
が系統的には書かれていない為、すごく判りにくいかも。
ゼロページとか懐かしいなぁ。
気持ち遅めに帰着。
wxDで画像表示の練習。適当なbyte配列をImageクラスでイメージバッファ
として保持するのですが、こいつを表示するには一度Bitmapクラスに
変換して表示バッファを作り、dc.DrawBitmapで表示する必要があるもよう。
で、byte配列を更新したとき、
Bitmapクラスである表示バッファに透過的に変更が反映されるのかと思いきや、
Imageクラスで生成したイメージバッファは、Bitmapクラスの
表示バッファを生成する際にコピーして保持されるようで、byte配列の変更を
反映するには毎回Bitmapクラスで表示バッファを生成しなおさなくては
ならないみたい。んー、なんだかオーバーヘッドが大きい気がしなくも
ありませんが、bitbltで表示バッファに転送していると思えば良い
のかしら?
気持ち早めに帰着。
いつの間にか寝ててそのまま朝まで爆睡。
早くもなく遅くもなく。
wxDで画像表示の練習。GTK+でいうところのPixbufに相当するものは
どうやって扱うのかよくわからず。
ありゃ、これぁ大変。更新の再開待ってます。
早めに帰着。
風邪気味で死亡。
割と早く起きたりするも、二度寝して昼ごろ起床。
買ったまままとまった時間が無くて観れてなかったファミ通WaveDVDを
みたり。DVDの方ではなくて雑誌の方に載ってた
「
こころが目覚める男たちの塗り絵DS 〜タミヤボックスアート〜
」
ってマジですか?ターゲット 狭っ!て気がしなくもありませんが、
キテますなぁ。どうでも良いですが、
リンクに使ったURL、otokonuri って.....(^^;
ちなみに公式ページは
こちららしい。まだ内容はあまり無い模様。
割と早く起きたりするも、二度寝して昼ごろ起床。
そういやインターネットTVの方で鋼の錬金術師の最終話を観た
のですが、今観てみると、劇場版の シャンバラを征く者 へのフリ
が色々入っていたのね というのを知ったり。
少し遅めに帰着。
溜池観たり。5億円の携帯番号って本当か?
早くもなく遅くもなく。
wxDのサンプルコードを眺めて終了。
早めに帰着。てか、帰りさむー。
TV観たりCG描いたりして終了。
そういや、遊戯王のアニメ。製作スタッフの名前に日本人が
ほぼ皆無というのに、最近はこんな感じなのかと思ってみたり。
でも、脚本まで日本人じゃないというのは初めて見たかも。
早くもなく遅くもなく。
dmdの1.010で、文字列からクラスオブジェクトを生成する
Object.factory(char[] classname)というメソッドが追加
されたらしい。
以前、
タイムチャートに合わせて敵キャラのインスタンスを
生成できると良いなぁと思った事がありましたが、
そういう事ができるようになるっぽい。GDCの追従が楽しみ
なのですが、いつ取り込まれるかは不明。
そういや、TV東京のWBSでイギリスだかのTV番組で日本を紹介
しているという話をしてました。その中のインタビューの中で
日本の「アニメ」、「マンガ」という単語に加えて「ヘンタイ」が
並んでいたり。番組上は華麗にスルーしてましたが、
こういうカテゴリ
という事だと判っている人ってどれだけ居るのだろう?
と思ってみました。
ちょろっと落描きするつもりが、意外と手間がかかってしまって
完成しない罠。
気持ち遅めに帰着。
Inkscapeで編集を試してみたり。
昼前に起床。
以前、GNU/Hurdって
どうなってんの?てのを調べた時、新しい文書も無くて、活動休止
状態だなぁと思ったのですが、最近調べてみたところ、インストールCD
なんかも用意されているようで、少し様子が変わっているなと思ったり。
そんな訳で、QEMUで動かないかしら?と思ってHurdのインストールを
試してみたり。
結論から言うと、TANEにはうまく動かす事ができませんでした。
ブートローダーを事前にインストールした後で、Linuxのext2
パーティションにインストールCDからbaseを展開するという手順
なのですが、ブートローダーであるGRUBを入れるのにフロッピーを
使う手順しか無く、その入れ方がよく判らなかったり。仕方ないので、
Fedoraを一度インストールする事でGRUBを入れて、その後で
Linuxパーティションに対してHurdをインストールするという方法
を使ってみました。Linuxカーネルが存在しないのでGRUBのプロンプト
で停止したのですが、そこからmachのカーネルを動作させることが
できなくて終了。
しかたないので、脈絡無く表紙絵を変えてみたり。文字入れに
Inkscapeを使おうかとも思ったけど、今回は見送り。影落とすの
とかサイズ変更とか、GIMPでやるとなかなかうまくいかないの
ですが、Inkscapeでやると非常に簡単なので、うまく使えないかなぁ
と思ったり。
そういや、GIMP2で文字の影をボカシフィルタを使って表現しようと
したのですが次のような感じでうまく作れなかったり。
フィルタ前の有効ピクセルが含まれている範囲が選択領域となって、
フィルタのかかる範囲が制限されているのですが、実際にボカすと最初の
範囲よりも広いエリアまでピクセルが広がります。ところが、選択範囲は
そのままのため、そこでボカした絵が切れてしまったり。これって仕様の
チョンボっぽい気がするのですが、良い回避方法があるのかしら?
そういや、足骨折したって本当?(>KOJIさん) 256℃に詳細求む。
TV東京深夜の新番組であるところの「シンボルず」。
みうらじゅんのヌー銅探索、バカすぎ(^^;; でも、実際に訳のわからない
銅像ってこんなに沢山あるんだというのは正直な感想。
そういや、昨日終わった竹山先生の、喝老人とか二乗の歌とか挟まって
いたけど、犬紙とかデスパンダもここで使っていくのかしら?