2017-03-29 6 views
2

スクリプト・フーを経由してGIMPモジュールに配列を渡す

私はScheme Script-Fu interfaceを使用してGIMPのプラグインに整数の配列を渡すためにしようとしています。私は、次の内容のmain.cという名前のソースコードファイルがあります:私は、Debian 9ボックスでこれをやっている最小限の実施例は、

sudo apt install libgimp2.0-dev 
gcc `gimptool-2.0 --cflags --libs` main.c 
gimptool-2.0 --install-bin ./a.out 

:私は次のようにGIMPのプラグインとしてファイルをコンパイルしてインストールし

#include <libgimp/gimp.h> 
#include <stdlib.h> 
#include <stdio.h> 

static void query (void); 

static void run (
    const gchar *name, 
    gint nparams, 
    const GimpParam *param, 
    gint *nreturn_vals, 
    GimpParam **return_vals 
); 

const GimpPlugInInfo PLUG_IN_INFO = { 
    NULL, /* init_proc */ 
    NULL, /* quit_proc */ 
    query, /* query_proc */ 
    run, /* run_proc */ 
}; 

MAIN() 

static void query (void) 
{ 
    static GimpParamDef args[] = { 
    { 
     GIMP_PDB_INT32, 
     "run-mode", 
     "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }" 
    }, 
    { 
     GIMP_PDB_INT8ARRAY, 
     "an array", 
     "" 
     "an array" 
     } 
    }; 

    gimp_install_procedure (
     "my-test-plugin", 
     "My test plug-in", 
     "Description", 
     "Jane Doe <[email protected]>", 
     "Copyright (C) Jane Doe\n" 
     "http://foo.bar", 
     "2017", 
     g_strconcat("My test plug-in", "...", NULL), 
     "RGB*, GRAY*", 
     GIMP_PLUGIN, 
     G_N_ELEMENTS (args), 
     0, 
     args, 
     NULL 
    ); 
} 

static void run (
    const gchar *name, 
    gint nparams, 
    const GimpParam *param, 
    gint *nreturn_vals, 
    GimpParam **return_vals) 
{ 
    static GimpParam value; 
    value.type = GIMP_PDB_STATUS; 
    value.data.d_status = GIMP_PDB_SUCCESS; 
    *nreturn_vals = 1; 
    *return_vals = &value; 

    FILE* out = fopen("mylog.log", "w"); 
    fprintf(out, "Parameter #0:\t%d\nParameter #1:\t", param[0].data.d_int32); 
    for (int i = 0; i < 16; ++i) 
     fprintf(out, "%d ", param[1].data.d_int8array[i]); 
    fprintf(out, "\n"); 
    fclose(out); 
} 

を。 私はスクリプト-Fuのインターフェイスを使用してプラグインを実行しよう:

(my-test-plugin 1 #(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)) 

Calling the plugin via Script-Fu

mylog.logという名前のファイルは、以下の内容で作成されます:次のようであるのに対し

Parameter #0: 1 
Parameter #1: 1 0 0 0 0 0 0 0 64 201 246 126 174 85 0 0 

予想されるコンテンツ:

Parameter #0: 1 
Parameter #1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 

実世界のバージョン

Scheme Script-Fu interfaceを使用してthe gimp-plugin-morphop GIMP pluginを使用しようとしています。私は、GUIを使用すると、プラグインは期待通りに動作します:

Hit-or-Miss via GUI #1 Hit-or-Miss via GUI #1

しかし、私は次のスクリプト-Fuのスクリプトを使用する場合:

(plug-in-morphop RUN-NONINTERACTIVE 1 2 6 7 
    #(-1 -1 -1 -1 -1 -1 -1 
    -1 1 -1 -1 -1 1 -1 
    -1 -1 0 0 0 -1 -1 
    -1 -1 0 0 0 -1 -1 
    -1 -1 0 0 0 -1 -1 
    -1 1 -1 -1 -1 1 -1 
    -1 -1 -1 -1 -1 -1 -1) 24 2) 

プラグインが期待される結果を生成しません。 :

Hit-or-Miss via Script-Fu #1 Hit-or-Miss via Script-Fu #1

予想通り

-1 -1 -1 -1 -1 -1 -1 
-1 1 -1 -1 -1 1 -1 
-1 -1 0 0 0 -1 -1 
-1 -1 0 0 0 -1 -1 
-1 -1 0 0 0 -1 -1 
-1 1 -1 -1 -1 1 -1 
-1 -1 -1 -1 -1 -1 -1 

が、私は実際の違いは何であったか確認するためにプラグインを修正:GUIを通じてモジュールを使用した後

diff --git a/src/morphop-algorithms.c b/src/morphop-algorithms.c 
index b927ba3..9dff320 100644 
--- a/src/morphop-algorithms.c 
+++ b/src/morphop-algorithms.c 
@@ -166,7 +166,16 @@ void start_operation(GimpDrawable *drawable, GimpPreview *preview, MorphOpSettin 
       GimpPixelRgn src_rgn_c, dst_rgn_c; 
       guchar* src_preview_c = NULL, *dst_preview_c = NULL; 

+    FILE* log = fopen("morphop-operation.log", "w"); 
       int i, j; 
+    for(i = 0; i < STRELEM_DEFAULT_SIZE; i++) { 
+      for(j = 0; j < STRELEM_DEFAULT_SIZE; j++) { 
+        fprintf(log, "%d ", settings.element.matrix[i][j]); 
+      } 
+      fprintf(log, "\n"); 
+    } 
+    fclose(log); 
+ 
       // white structuring element 
       for(i = 0; i < STRELEM_DEFAULT_SIZE; i++) { 
         for(j = 0; j < STRELEM_DEFAULT_SIZE; j++) { 

morphop-operation.logファイルには、次のテキストが含まれています。各行の右端の6の整数起動時に毎回変わるランダムなゴミのように見える

-1 0 0 86 0 103 114 
-1 64 0 0 0 45 112 
-1 41 64 0 0 105 104 
-1 8 42 33 0 110 111 
-1 95 8 0 112 45 112 
-1 36 95 0 108 109 0 
-1 86 36 0 117 111 32 

:スクリプト-Fuのコードを実行した後、morphop-operation.logファイルには、次のテキストが含まれています。settings.element.matrixが既に受信アレイの内部表現であるので、私は直接受信アレイ表示するプラグイン少しさらに修飾:

:スクリプト・フー・コードを実行した後

diff --git a/src/morphop.c b/src/morphop.c 
index 3895770..cb814b6 100644 
--- a/src/morphop.c 
+++ b/src/morphop.c 
@@ -150,9 +150,16 @@ static void run (
           } 

           msettings.operator = param[3].data.d_int32; 
-        
+      
+        FILE* log = fopen("morphop-init.log", "w"); 
           int i; 
           for (i = 0; i < STRELEM_DEFAULT_SIZE * STRELEM_DEFAULT_SIZE; i++) { 
+          fprintf(log, "%d ", param[5].data.d_int8array[i]); 
+        } 
+        fprintf(log, "\n"); 
+        fclose(log); 
+ 
+        for (i = 0; i < STRELEM_DEFAULT_SIZE * STRELEM_DEFAULT_SIZE; i++) { 
             msettings.element.matrix[i % STRELEM_DEFAULT_SIZE][(int)ceil((i + 1.0)/STRELEM_DEFAULT_SIZE) - 1] = param[5].data.d_int8array[i]; 
           } 

morphop-init.logファイルには、次のテキストを含みますいくつかは、いくつかの実行間でその価値を維持するものの、第八を超え

255 255 255 255 255 255 255 0 64 169 248 158 193 85 0 0 64 170 248 158 193 85 0 0 33 0 0 0 0 0 0 0 112 108 117 103 45 105 110 45 109 111 114 112 104 111 112 0 32 

値は、ランダムなゴミのように見える:

255 255 255 255 255 255 255 0 64 89 10 89 79 86 0 0 64 90 10 89 79 86 0 0 33 0 0 0 0 0 0 0 112 108 117 103 45 105 110 45 109 111 114 112 104 111 112 0 32 
255 255 255 255 255 255 255 0 64 217 110 172 167 85 0 0 64 218 110 172 167 85 0 0 33 0 0 0 0 0 0 0 112 108 117 103 45 105 110 45 109 111 114 112 104 111 112 0 32 

私にとっては、これは、配列がプラグインが期待するものとは異なるフォーマットで渡されたことを意味します。 Script-Fuを介してGIMPプラグインに配列を渡すと、元の状態に保たれます。

+0

morphop-operation.logからの出力では可能ですか?行列転置?したがって、最初の列は元の最初の行として正しく渡され、その後はすべてゴミですか?たぶん、あなたのsccriptの行の終わりは、すべてを台無しにしていますか? ... (plug-in-morphop RUN-NONINTERACTIVE 1 2 6 7#(-1 -1 -1 -1 -1 -1 -1ここに -1 1 -1 -1 -1 1 -1ここに - 1 -1 0 0 0 -1 -1ここで -1 -1 0 0 0 -1 -1等 -1 -1 0 0 0 -1 -1 -1 -1 -1 -1 -1 - 1 -1 -1 -1 -1 -1 -1) – Ondrej

+0

(i)実際には、それは転置されます.2番目の差分の下の文を参照してください。 'msettings.element.matrix'配列は、入力行列 'param [5] .data.d_int8array'。(ii)いいえ、改行は結果に影響しません – Witiko

+0

これについてはどうなりますか?(プラグインモルフォプットRUN-NONINTERACTIVE 1 2 6 7# -1 -1 -1 -1 -1 -1] [-1 1 -1 -1 -1 1 -1] [-1 -1 0 0 0 -1 -1] [-1 -1 0 0 0 -1 -1] [-1 -1 0 0 0 -1 -1] [-1 1 -1 -1 -1 1 -1] [-1 -1 -1 -1 -1 -1 -1])24 2) – Ondrej

答えて

1

API内では、necessary to pass the size of the array before the arrayです。

$ cat mylog.log 
Parameter #0: 1 
Parameter #2: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 

そして、あなたはパラメータが暗黙的に長さよりもサイズを大きくすることによってリンクされていることを確認することができます:

--- /tmp/plugin.orig 2017-04-02 16:45:34.902108610 +0200 
+++ /tmp/plugin.c 2017-04-02 16:43:26.510105281 +0200 
@@ -30,6 +30,11 @@ 
     "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }" 
    }, 
    { 
+  GIMP_PDB_INT32, 
+  "array-size", 
+  "The array bellow" 
+ }, 
+ { 
     GIMP_PDB_INT8ARRAY, 
     "an array", 
     "" 
@@ -69,9 +74,9 @@ 
    *return_vals = &value; 

    FILE* out = fopen("mylog.log", "w"); 
- fprintf(out, "Parameter #0:\t%d\nParameter #1:\t", param[0].data.d_int32); 
+ fprintf(out, "Parameter #0:\t%d\nParameter #2:\t", param[0].data.d_int32); 
    for (int i = 0; i < 16; ++i) 
-  fprintf(out, "%d ", param[1].data.d_int8array[i]); 
+  fprintf(out, "%d ", param[2].data.d_int8array[i]); 
    fprintf(out, "\n"); 
    fclose(out); 
} 

その後:中

> (my-test-plugin 1 16 #(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)) 
(#t) 

結果

> (my-test-plugin 1 17 #(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)) 
Error: (: 1) INT8 vector (argument 3) for function my-test-plugin has 
size of 15 but expected size of 17 

(前のパラメータあなたの2つのテストで利用可能な配列の内容の量が異なっていることを説明しています)。

+0

確かに、それは問題のようです。ありがとうございました! にあるドキュメントは正確には役に立ちません(多くの場合、さまざまな型とメソッドの定義がリストされています)。より良いリソースがあるのか​​、libgimpコードベースに精通していると期待されるプラグイン開発者ですか? – Witiko

+0

@ウィッティコ嬉しかったです。統合/アクティブ/一般的なプロシージャの例は少し安全で、配列の前に冗長サイズのパラメータのような相関関係を常に表示する必要がありますが、試したもの以外の方法でこれらをデバッグするのはむしろ困難です。あなたがエラー(または何かをトレースしている)を強制するまで、コードを見つけることもやりにくいです。すなわち、私が問題を確認することを強制したエラーは、コードに最終的に私をもたらします:https://git.gnome.org/browse/gimp- tiny-fu/tree/tiny-fu/ts-wrapper.c#n914 – lossleader

+1

あなたは何を知っていますか?私もそのコードを見つけることができましたが、何らかの形で 'args [i-1] .data.d_int32'の部分は私をクリックしませんでした。 :-) – Witiko

関連する問題