2024年3月23日土曜日

GIMP 2.99.19 Python おかえり Foggify

公式では 未だ ですが、
Nightly では Python の Foggify が帰って来ました!。  :)
GIMP の 其の辺り を少し書いて見ますね。
そう、そろそろ、Python Scripts も ウォームアップ しないと、ね。


実は、GIMP の gitlab.gnome を見ていて、
そろそろ、Python Scripts に手を入れ出す頃合いかな?、と思っていたのですが、
Nightly の Windows Installer と 公式同梱用 Script (foggify.py) との間で、
整合が取れず、Nightly での更新待ち だったのです。
つまり、最新の foggify.py のみを導入しても、
GIMP 本体 が ある時期 を越さ無いと 正常に機能し無かったのです。
最近、漸く、環境が整って来た印象を持っています。
少し、書いて見ますね。

GIMP は 3.0 に向かって、色絡みの根本的な見直しを行っています。
独自色クラス GimpRGB から、
GEGL(Generic Graphical Library) の色採用へと移行 だったかな?。
其れが原因で、動いていたものが動か無い状況にありました。
でも、最近、大きな峠は越した気がしています。

foggify.py に手が入って fix となったのが、2月25日頃。
commit 7e6dc23a に依って、問題解決に至ったのですが、
同時期に GIMP 本体にも修正が加えられた筈です。
しかし、他との絡みもあって、なかなか、Nightly が出て来なかったのです。
そう、Nightly 待ち だった訳です。

  Commit の comment を引用

Since the color space invasion, GimpRGB
properties do not create widgets anymore.
For Python plug-ins, we need to add
GeglColor properties as GObjects with
GeglColor value types as a workaround.
This patch does this and updates the
Foggify plug-in with the new datatype.

今回の1週間前辺りから、Nightly も順調になった様で、
そろそろ覗いて見るか! となりました。

実際に、該当最新 Nightly を動かすと、Foggify は正常稼働します。




参考迄に、GIMP 2.99.10 の頃の Script と、2.99.19 (現時点最新)のものとを比較しました。
個人的には、GIMP 2.99.10 辺り迄は 対応可能 だったのですが、
其れ以降、思う様にならなかったので、どう変わったかが見たかったのです。
所謂、.patch を GNU の diff.exe ver 2.8,7.1605 から 生成したので、変更点をご覧下さい。

--- E:¥GIMP¥GIMP3_Scripting¥Foggify_GIMP29910.py 2022-08-24 00:42:54.239299400 +0900
+++ E:¥GIMP¥GIMP3_Scripting¥foggify_GIMP29919_20240318.py 2024-03-18 09:33:50.000000000 +0900
@@ -21,2 +21,4 @@ gi.require_version('GimpUi', '3.0')
 from gi.repository import GimpUi
+gi.require_version('Gegl', '0.4')
+from gi.repository import Gegl
 from gi.repository import GObject
@@ -27,9 +29,18 @@ import sys
 
-import gettext
-_ = gettext.gettext
 def N_(message): return message
+def _(message): return GLib.dgettext(None, message)
 
-def foggify(procedure, run_mode, image, n_drawables, drawables, args, data):
-    config = procedure.create_config()
-    config.begin_run(image, run_mode, args)
+def foggify(procedure, run_mode, image, n_drawables, drawables, config, data):
+    Gegl.init(None)
+
+    _color = Gegl.Color.new("black")
+    _color.set_rgba(0.94, 0, 0, 1.0)
+
+    # Work around not being able to set default color by only setting it
+    # when color in our config is None. This won't help when resetting to
+    # factory default. This also fixes a critical when running without
+    # changing the color away from None.
+    color = config.get_property('color')
+    if color is None:
+        config.set_property('color', _color)
 
@@ -37,2 +48,3 @@ def foggify(procedure, run_mode, image,
         GimpUi.init('python-fu-foggify')
+
         dialog = GimpUi.ProcedureDialog(procedure=procedure, config=config)
@@ -41,3 +53,2 @@ def foggify(procedure, run_mode, image,
             dialog.destroy()
-            config.end_run(Gimp.PDBStatusType.CANCEL)
             return procedure.new_return_values(Gimp.PDBStatusType.CANCEL, GLib.Error())
@@ -75,9 +86,10 @@ def foggify(procedure, run_mode, image,
         # add some clouds to the layer
-        Gimp.get_pdb().run_procedure('plug-in-plasma', [
-            GObject.Value(Gimp.RunMode, Gimp.RunMode.NONINTERACTIVE),
-            GObject.Value(Gimp.Image, image),
-            GObject.Value(Gimp.Drawable, mask),
-            GObject.Value(GObject.TYPE_INT, int(time.time())),
-            GObject.Value(GObject.TYPE_DOUBLE, turbulence),
-        ])
+        pdb_proc   = Gimp.get_pdb().lookup_procedure('plug-in-plasma')
+        pdb_config = pdb_proc.create_config()
+        pdb_config.set_property('run-mode', Gimp.RunMode.NONINTERACTIVE)
+        pdb_config.set_property('image', image)
+        pdb_config.set_property('drawable', mask)
+        pdb_config.set_property('seed', int(time.time()))
+        pdb_config.set_property('turbulence', turbulence)
+        pdb_proc.run(pdb_config)
 
@@ -92,9 +104,4 @@ def foggify(procedure, run_mode, image,
 
-    config.end_run(Gimp.PDBStatusType.SUCCESS)
-
     return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())
 
-_color = Gimp.RGB()
-_color.set(240.0, 0, 0)
-
 class Foggify (Gimp.PlugIn):
@@ -122,3 +129,3 @@ class Foggify (Gimp.PlugIn):
     # as it should be the better syntax.
-    color = GObject.Property(type =Gimp.RGB, default=_color,
+    color = GObject.Property(type =Gegl.Color, default=None,
                              nick =_("_Fog color"),
@@ -127,6 +134,6 @@ class Foggify (Gimp.PlugIn):
     ## GimpPlugIn virtual methods ##
-    def do_query_procedures(self):
-        self.set_translation_domain("gimp30-python",
-                                    Gio.file_new_for_path(Gimp.locale_directory()))
+    def do_set_i18n(self, procname):
+        return True, 'gimp30-python', None
 
+    def do_query_procedures(self):
         return [ 'python-fu-foggify' ]
@@ -140,6 +147,6 @@ class Foggify (Gimp.PlugIn):
                                         Gimp.ProcedureSensitivityMask.DRAWABLES)
-        procedure.set_documentation (N_("Add a layer of fog"),
-                                     "Adds a layer of fog to the image.",
+        procedure.set_documentation (_("Add a layer of fog"),
+                                     _("Adds a layer of fog to the image."),
                                      name)
-        procedure.set_menu_label(N_("_Fog..."))
+        procedure.set_menu_label(_("_Fog..."))
         procedure.set_attribution("James Henstridge",



0 件のコメント:

コメントを投稿