やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GIMP python-fu API ソースコードが見つからない

 クローズド・コードなのか?

前回

知りたかった情報

 以下のようなgimpモジュールにあるクラス。

gimp.GroupLayer
gimp.Layer
gimp.Image

手順

sudo apt -y install gimp
sudo apt -y install gimp-python
dpkg -L gimp-python
/.
/usr
/usr/lib
/usr/lib/gimp
/usr/lib/gimp/2.0
/usr/lib/gimp/2.0/environ
/usr/lib/gimp/2.0/environ/pygimp.env
/usr/lib/gimp/2.0/interpreters
/usr/lib/gimp/2.0/interpreters/pygimp.interp
/usr/lib/gimp/2.0/plug-ins
/usr/lib/gimp/2.0/plug-ins/colorxhtml
/usr/lib/gimp/2.0/plug-ins/colorxhtml/colorxhtml.py
/usr/lib/gimp/2.0/plug-ins/file-openraster
/usr/lib/gimp/2.0/plug-ins/file-openraster/file-openraster.py
/usr/lib/gimp/2.0/plug-ins/foggify
/usr/lib/gimp/2.0/plug-ins/foggify/foggify.py
/usr/lib/gimp/2.0/plug-ins/gradients-save-as-css
/usr/lib/gimp/2.0/plug-ins/gradients-save-as-css/gradients-save-as-css.py
/usr/lib/gimp/2.0/plug-ins/histogram-export
/usr/lib/gimp/2.0/plug-ins/histogram-export/histogram-export.py
/usr/lib/gimp/2.0/plug-ins/palette-offset
/usr/lib/gimp/2.0/plug-ins/palette-offset/palette-offset.py
/usr/lib/gimp/2.0/plug-ins/palette-sort
/usr/lib/gimp/2.0/plug-ins/palette-sort/palette-sort.py
/usr/lib/gimp/2.0/plug-ins/palette-to-gradient
/usr/lib/gimp/2.0/plug-ins/palette-to-gradient/palette-to-gradient.py
/usr/lib/gimp/2.0/plug-ins/py-slice
/usr/lib/gimp/2.0/plug-ins/py-slice/py-slice.py
/usr/lib/gimp/2.0/plug-ins/python-console
/usr/lib/gimp/2.0/plug-ins/python-console/pyconsole.py
/usr/lib/gimp/2.0/plug-ins/python-console/python-console.py
/usr/lib/gimp/2.0/plug-ins/python-eval
/usr/lib/gimp/2.0/plug-ins/python-eval/python-eval.py
/usr/lib/gimp/2.0/python
/usr/lib/gimp/2.0/python/_gimpenums.so
/usr/lib/gimp/2.0/python/_gimpui.so
/usr/lib/gimp/2.0/python/gimp.so
/usr/lib/gimp/2.0/python/gimpcolor.so
/usr/lib/gimp/2.0/python/gimpenums.py
/usr/lib/gimp/2.0/python/gimpfu.py
/usr/lib/gimp/2.0/python/gimpplugin.py
/usr/lib/gimp/2.0/python/gimpshelf.py
/usr/lib/gimp/2.0/python/gimpthumb.so
/usr/lib/gimp/2.0/python/gimpui.py
/usr/lib/gimp/2.0/python/pygimp-logo.png
/usr/share
/usr/share/doc
/usr/share/doc/gimp-python
/usr/share/doc/gimp-python/changelog.Debian.gz
/usr/share/doc/gimp-python/changelog.gz
/usr/share/doc/gimp-python/copyright
/usr/share/python
/usr/share/python/runtime.d
/usr/share/python/runtime.d/gimp-python.rtupdate

 gimp.soがそれと思われる。だが、.soはライブラリファイル。.pyならコードが見れたのに……。

/usr/lib/gimp/2.0/python/gimp.so

 gimpfu.pyfrom gimpfu import *して利用する。中身をみてみたら、pdbを作っているところがあった。

import gimp
import gimpcolor
from gimpenums import *
pdb = gimp.pdb

 やはりgimp.soがキモらしい。そいつのコードを見たい!

アセンブリ

objdump -d /usr/lib/gimp/2.0/python/gimp.so > /tmp/work/dump.txt
000070d8 <gimp_layer_group_new@plt>:
    70d8:   e28fc600    add ip, pc, #0, 12
    70dc:   e28cca27    add ip, ip, #159744 ; 0x27000
    70e0:   e5bcf888    ldr pc, [ip, #2184]!    ; 0x888

 逆アセンブリしてもPythonのクラスらしきものはなかった。soの中にあるのはすべてC言語の関数なのだろう。gimp.GroupLayerクラスはどこで定義されてるの?

 ほかの.pyコードもいくつか覗いてみたが見つからなかった。

GitHub

extern PyTypeObject PyGimpGroupLayer_Type;
#define pygimp_layer__group_check(v) (PyObject_TypeCheck(v, &PyGimpGroupLayer_Type))
PyObject *pygimp_group_layer_new(gint32 ID);

 たぶんC言語からPythonに使えるようにしている部分なのだとおもう。

 gimp.GroupLayerクラスを作り、それに対応する関数pygimp_group_layer_newを割り当てているのだろう。でもたしか実際に使って確認したらgimp.GroupLayer(親元gimp.Image, 自分の表示名)だったはず。

 で? gimp.GroupLayerのプロパティとかメソッドの引数はどうやったらわかるの?

所感

 APIがわからない。どうやって調べるの? 特にgimp.GroupLayer()についての情報がない。

 ソースコードは以下にあるが、そこのどこにpython-fuのgimp.GroupLayer()が定義されているのか。そもそも.soファイルしかないのか。

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux