|
From: KUBO T. <ku...@ji...> - 2002-08-01 19:59:11
|
久保@茅ヶ崎市です。
Masao Mutoh <mu...@hi...> writes:
> 文字列をGdk::Imageにして自前でaffine変換かますとかでしょうか。
> あるいはCVS版のGnomeCanvasを使えばできるのかな....。
Gnome::CanvasItem#affine_relative, Gnome::CanvasItem#affine_absolute
があるので、affine 変換で使用する Float の配列を自前で用意できれば不可
能ではないです。しかし、不可能でないからといって、現実的かどうかは疑問
ですけど。あと、Gnome::CanvasText の回転・拡大・縮小は、AntiAlias モー
ドのときのみ有効です。非 AntiAlias モードのときは並行移動のみ可能で、
回転・拡大・縮小は無効のようです。
# AnitAlias モードは 非 AnitAlias モードと比べて不安定ですけど。(^^;)
手許には、libart_lgpl/art_affine.h の関数を実装した GnomeCanvas の
affine 変換対応版があります。パッチを出したいけど、ちょっと迷っている
ところが数点。
・ruby の配列か? それ用のクラスか?
Cレベルでは affine 変換のデータは double[6] としてしか使用してなくて、
それ用の構造体を定義してない。double[6] ならば、ruby レベルでは
Float の配列としてもあつかえる。
ruby の API 的には、それ用のクラスがあったのが良いけど、C レベルの
API とのストレートにマッピングすることを考えると、Float の配列をその
まま扱う手もあるのではないかと。
・クラスの名前
私のパッチではモジュール Art を用意して、Art::Affine というクラスを
定義しているのだが、名前がそれで良いのかどうか。
Cレベルの API の名前から自然に類推するには、Art::Affine が良いんだろ
うけど、libart_lgpl/*.h の関数の中で、Ruby/Gnome から直接使用するの
は affine 変換程度でしょう。たったひとつのクラスのために Art という
モジュール名を使っても良いのか?
Gnome の中で affine 変換を使っているのは GnomeCanvas のみなので、
Gnome::CanvasAffine でも別に問題ない。ちょっと C レベルの名前からの
類推が困難。
・ArtPoint を用意するかどうか。
art_affine_point という API は引数に ArtPoint という構造体を渡すので、
C と直接のマッピングをさせるのなら、Art::Point というクラスを用意して、
Art::Point.new(x, y) -> anArt::Point
Art::Point#x -> aFloat
Art::Point#y -> aFloat
Art::Affine#point(anArt::Point) -> anArt::Point
をするのが自然でしょう。しかし、Art::Point は、Art::Affine#point の
引数・戻り値としてしか使い途がない。それなら Art::Point は定義さず、
Art::Affine#point(aFloat, aFloat) -> aFloat, aFloat
でも良いのではないかと。
現状の API では、
singleton methods
Art::Affine.new(anArray_of_Float) -> anArt::Affine
Art::Affine.identity() -> anArt::Affine
Art::Affine.scale(x, y) -> anArt::Affine
Art::Affine.rotate(theta) -> anArt::Affine
Art::Affine.shear(theta) -> anArt::Affine
Art::Affine.translate(theta) -> anArt::Affine
instance methods
Art::Affine#point(aFloat, aFloat) -> aFloat, aFloat
Art::Affine#invert() -> anArt::Affine
Art::Affine#invert!() -> anArt::Affine
Art::Affine#flip(x, y) -> anArt::Affine
Art::Affine#flip!(x, y) -> anArt::Affine
Art::Affine#to_s -> aString
Art::Affine#to_a -> anArray_of_Float
Art::Affine#expansion() -> aFloat
Art::Affine#rectiliner() -> true or false
Gnome::CanvasItem#affine_relative(anArt::Affine) -> nil
(引数の種類を anArray_of_Float から、anArt::Affine へ変更)
Gnome::CanvasItem#affine_absolute(anArt::Affine) -> nil
(引数の種類を anArray_of_Float から、anArt::Affine へ変更)
Gnome::CanvasItem#i2c_affine() -> anArt::Affine
Gnome::CanvasItem#i2w_affine() -> anArt::Affine
Gnome::Canvas#w2c_affine() -> anArt::Affine
(TYPO Gnome::Canvas#w2c_affline を削除)
operators
Art::Affine#*(anArt::Affine) -> anArt::Affine
Art::Affine#==(anArt::Affine) -> true or false
となっています。
つまり affine 変換用のクラス Art::Affine を用意して、ArtPoint 用のクラ
スは用意してません。
まあ、とりあえず明日(8/2)の夜にでも現状のままパッチを作ります。
では、再見
--
神奈川県茅ヶ崎市在住 久保 健洋
email: ku...@ji...
web: http://www.jiubao.org
GnuPG fingerprint = 5F7B C8EF CA16 57D0 FDE1 9F47 C001 1F93 AC08 2262
|