TOKUNAGA Hiroyuki
tkng****@xem*****
2004年 12月 14日 (火) 15:10:19 JST
# すいません、いろいろ忙しく、問題を解決してからメールしようと思っていた らいつのまにか3ヶ月も時間が経ってしまいました…。 On Mon, 13 Sep 2004 00:36:44 -1000 (HST) Shiro Kawai <shiro****@lava*****> wrote: > お、面白そうなライブラリですね。 > > From: TOKUNAGA Hiroyuki <tkng****@xem*****> > Subject: [Gauche-devel-jp] Gauche-cairo 0.0.0 > Date: Mon, 13 Sep 2004 17:33:51 +0900 > > > * C側からの6つ以上の多値の返し方 > > > > cairo_matrix_get_affine (cairo_matrix_t matrix, double *a, double > > *b, double *c, double *d, double *tx, double *ty) という関数があって > > 、この関数は後ろの6つの引数で指定されたアドレスに数字を格納します。 > > Scheme側では多値を使って > > > > (receive (a b c d tx ty) (cairo-matrix-get-affine matrix) ... > > > > という形で使えるようにしたいと思うのですが、Scm_ValuesXは > > Scm_Values5までしか用意されていないようです。C側から6つ以上の多値を > > 返したいときはどうすれば良いのでしょうか? > > > > # コードをちょっとみた感じでは戻り値をlistにしてScm_Valuesに渡せば良 > > # いのかなと思えましたが、自信がないです。 > > はい。Scm_Values()を使って下さい。 > > もしパフォーマンスがクリティカルであるなら、このような場合は6要素の > f64vectorを返すような関数を別に作ることも考えられます。Scheme上で > doubleの値を扱う場合は、box/unboxが入るのでかなりオーバヘッドが > あるからです。呼び側がf64vectorを渡して結果を埋めるようにすると > 余分なアロケーションも避けられます。 > Gauche-glのAPIが参考になるかもしれません。 cairo-matrix-get-affineはそう頻繁に呼ばれる関数ではない(と思う)ので、 素直にScm_Valuesを使ってやることにしました。リストを作るところでやりかた がわからなかったので、結局SCM_LIST6, SCM_LIST7というマクロを定義してしま いました…。 > > * FILE構造体のScheme側での扱い方 > > > > cairo_surface_t * > > cairo_png_surface_create (FILE *file, cairo_format_t format, int > > width, int height); > > > > > > という関数があるのですが、対応するScheme側の関数をどうすればいいのか > > がわかりません。 > > Scm_PortFileNo(ScmPort*) を使うと、portがファイルに > 結びつけられている場合はそのファイルディスクリプタを得ることが > できます (portが文字列ポート等の場合は-1が返ります)。 > それに対して fdopen(3) する、というのが順当な方法だと思います。 > Scheme側からは、portを渡すようにしておけば良いんじゃないでしょうか。 > > 但し、元となるportがScheme側でGCされると、ファイルディスクリプタも > closeされてしまいます。ただ、元のC APIでもFILE*の有効期間はcaller > 任せですから、あまり問題にならないとは思いますが。 On Mon, 13 Sep 2004 00:45:52 -1000 (HST) Shiro Kawai <shiro****@lava*****> wrote: > From: Shiro Kawai <shiro****@lava*****> > Subject: [Gauche-devel-jp] Re: Gauche-cairo 0.0.0 > Date: Mon, 13 Sep 2004 00:36:44 -1000 (HST) > > > > * FILE構造体のScheme側での扱い方 > > > > Scm_PortFileNo(ScmPort*) を使うと、portがファイルに > > 結びつけられている場合はそのファイルディスクリプタを得ることが > > できます (portが文字列ポート等の場合は-1が返ります)。 > > それに対して fdopen(3) する、というのが順当な方法だと思います。 > > Scheme側からは、portを渡すようにしておけば良いんじゃないでしょうか。 > > あ、この方法には重要な注意点があります。 > ScmPortは自分自身でバッファリングを行っているので、Scheme側での > このportに対するI/OとFILE*レベルでのI/Oを混ぜて使うことは > 出来ません。 先に指摘されていたにもかかわらず、思いっきりはまってしまいました。 FILE*側でcacheされている分のデータをfflushしないままファイルディスクリプ タの方を閉じてしまって、データが途中で切れると言う現象にかなり悩まされま した。Cairo側でfflushするというまぬけなパッチを作ってCairoのMLに送ったり もしたのですが、リークを防ぐためには結局Gauche-cairo側でFILE構造体を管理 しないといけないですね。 これはちょっとめんどうなので、とりあえず次のリリースはまだきちんと管理 はしていないと思います。 他にもいくつか問題点を潰したので、今晩にでもGauche-cairo 0.1.0を出そう と思っています。 0.2.0:ファイル構造体を管理する 0.3.0:使えない関数を減らす 0.4.0:使えない関数をさらに減らす 0.5.0:ドキュメントを書く という風に進めていって、Cairo 1.0.0がリリースされたら(順調に行けば来 年の2月頃だそうです)、それにあわせて1.0.0をリリースするつもりです。 -- 徳永拓之 tkng****@xem***** http://kodou.net/