« 08.30 20世紀少年 第3章 | ココ | 09.03 客をちゃんと見なさい »

2009年9月 2日

かちより帰りなむ  このエントリーを含むはてなブックマーク 

そんな風に帰りたくて帰ったわけではないのだが。…終電がなくなってしまったので仕方なく。

しかしながら、SVGをネイティブに扱えるFirefoxではすんなりうまく行く動作が、svgwebではできないのですよ。それがなんとも不甲斐なくて。svgwebのスクリプトと格闘しっぱなし。

まず、getCTM()が実は実装されていなかったことに検索して初めて気がつく。CTM(現在の座標変換マトリックス)が分からないと、要素の中心座標を計算できなくて、フォーカスするときに自動的に見えないところの要素を中心に移動させるとか出来ない。そのうえ、必要なときに座標変換の状態を取得できなくて、別の変数にとっておく必要がある。

そんで、getCTM()がだめならとtransformを使ってSVGTransformListとSVGTransform要素を引っ張り出そうとしてもtransform属性は実装されてなくて常に空。setAttribute("transform", "translate(x y)")とすると、設定はできるけど、取得が出来ない。

さらには、getBBox()が実装されてないので、要素の位置と広さが分からない。x, y, width, heightは実質取得することは不可能。属性として指定されていれば、指定されているものが取得できるけど、実体とは異なる可能性は大いにあるわけで、特に指定されていなければ、0になるし、%指定されていてもピクセルで取得できるとは限らない。

というわけで、座標変換系がことごとく未実装ということが判明してしまったので、どうしたものかと。

getCTM()は、getScreenCTM()が実装されていたので(これはマウスイベントを処理するために必要やったから「仕方なく」という感じやった)。自分のScreenCTMと、parentNodeのScreenCTMから計算することで実装することに(行列の積なんで、これは難なく)。((parentNode.getScreenCTM())^-1)(Me.getScreenCTM()) = Me.getCTM() ということで。

逆行列を計算する SVGMatrix#inverse() は実装されていたようで、できるやろう、と思ってたら、なんとSVGMatrix#multiply()が実装されていなかった。なんで? こっちの方が簡単やのに。

getBBox()は、頑張ってFlashの中を弄ればどうにかなるんやろうと思ったけど、svg.jsとsvg.htcだけではどうにもなりそうにないことが分かったので、諦めた。

まさか自分でsvgwebの実装をやることになるとは思いもせなんだ。お陰でよゐこ部が…。

By ただ at 01:30 カテゴリー ; 仕事関係

« 08.30 20世紀少年 第3章 | 09月の記事 | 09.03 客をちゃんと見なさい »




トラックバック

このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/1465