モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

Mypaint 1.2.0 betaでインクからブラシに切り替えると妙ちくりんな線が描画される件

(追記あり)

(現在のupstreamのコードでは治っていますので、この修正は不要です)

後でバグレポートとか見なおして見ますが、まだ出てなかったら報告すべきですかね…

まず、インクツールストロークを描きます。

  1. チェックボタンを押してインクストロークを確定
  2. 直後にメニューでフリーハンド(=ブラシ)に切り替えます
  3. マウスをキャンバスに動かすと、妙な線が出ます。

という現象を発見しました。

つまりこうです。まず適当にストロークを描いて…

f:id:dothiko:20151215212400j:plain

ここで、右のチェックボタンを押して確定。そして、メニューに行って「編集」→「フリーハンド」を選びます。

その後キャンバスにカーソルが戻ると、突然出現だ!

f:id:dothiko:20151215212413j:plain

最後の部分からストロークと誤認されてるっぽい感じ。

なお言うまでもありませんが、もちろんオイラが弄っているエンバグしてるかもな素人改造版ではなく、ベータリリース版で試しています。

なお、何度か試した所、バケツ塗りツールでも同じ現象が稀に起きる模様…

インクツールを使いまくろうと思っているワタクシ的にはちょっと致命的だ!

なお、キーボードにインクツールを割り当てると(ワタクシはKキーにしております…calligraphy→発音が似てるK、的な意味で…)、kキーをもう一回押すと以前のツールに戻るっぽいです。それだと、この現象は起きないのでした。

そこでデバッガなどで追いまくってどうも起きなくなるようにするのを発見しました。 gui/document.pyの1837行目をなんだかgit pullで最新に追いつくと当然ながら場所がかわりますので… mode_flip_action_activated_cbメソッド内の以下のあたりを、このようにします。abrupt_start=True 引数指定を追加です。

        # If a mode object of this exact class is active, pop the stack.
        # Otherwise, instantiate and enter.
        if self.modes.top.__class__ is mode_class:
            self.modes.pop()
            flip_action.keyup_callback = lambda *a: None  # suppress repeats
        else:
            if issubclass(mode_class, gui.mode.OneshotDragMode):
                mode = mode_class(ignore_modifiers=True, temporary_activation=False)
            else:
                mode = mode_class(ignore_modifiers=True, abrupt_start=True) # <- change here like this. ココをこのように変更

2015/12/20 09:57:43 追記

上記のままだと塗りつぶしツールで例外出しますね。InteractionModeがコンストラクタを持たず、引数を受け付けないのが原因のよう… issubclassで見分けたほうがいいのか考えましたが、動けば良かろうなのだァァァァッ!というわけで、とりあえずコンストラクタを新設しておきました。

gui/mode.pyの以下のあたりです。

     #: switch to. If the iterable is empty, all modes are possible.
     permitted_switch_actions = ()
 
     def __init__(self,**kwds):
         # Workaround to force aburpt_start for all modes.
         pass

ただこうして副作用がどうなるのかは、今んところよくわかりません…

うーん、オイラのとこだけの現象だったら、ちょっと恥ずかしいな(^^;

ちなみにUbuntu Unityでもxfceでも発生しました。

2016/01/30 10:16:50 追記

上にも書きましたが現在のupstreamのコードでは治っていますので、上記の修正は不要です