[gimp] app: fix autotools build.



commit f40dc40cbc49086054d4765e0950b4850f9762f7
Author: Jehan <jehan girinstud io>
Date:   Tue Nov 10 12:36:36 2020 +0100

    app: fix autotools build.
    
    My previous commit broke the autotools build. Apparently when using
    g_object_unref(), some C++ symbol leaked into libapppaint.a archive
    library, hence the main binaries (e.g. gimp-2.99) could not be linked
    without adding -lstdc++ flag:
    
    > /usr/bin/ld: paint/libapppaint.a(gimppaintcore-loops.o): undefined reference to symbol 
'__gxx_personality_v0@@CXXABI_1.3'
    > /usr/bin/ld: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command 
line
    
    Not exactly sure why using this GLib function in particular caused this,
    but let's just try another approach in order not to link the main binary
    with C++ standard lib.
    Instead let's manage all GeglOperation allocation in gimp-layer-modes.c
    by adding a gimp_layer_modes_exit() function and some static array for
    storing operation object of each layer mode.

 app/gegl/gimp-gegl.c                          |  1 +
 app/operations/gimp-operations.c              |  8 ++++
 app/operations/gimp-operations.h              |  1 +
 app/operations/layer-modes/gimp-layer-modes.c | 61 +++++++++++++++------------
 app/operations/layer-modes/gimp-layer-modes.h |  1 +
 app/paint/gimppaintcore-loops.cc              | 19 ++-------
 6 files changed, 49 insertions(+), 42 deletions(-)
---
diff --git a/app/gegl/gimp-gegl.c b/app/gegl/gimp-gegl.c
index 64046b607a..8dd13cec6c 100644
--- a/app/gegl/gimp-gegl.c
+++ b/app/gegl/gimp-gegl.c
@@ -104,6 +104,7 @@ gimp_gegl_exit (Gimp *gimp)
 {
   g_return_if_fail (GIMP_IS_GIMP (gimp));
 
+  gimp_operations_exit (gimp);
   gimp_parallel_exit (gimp);
 }
 
diff --git a/app/operations/gimp-operations.c b/app/operations/gimp-operations.c
index 7cb30fd2dd..96668a317d 100644
--- a/app/operations/gimp-operations.c
+++ b/app/operations/gimp-operations.c
@@ -223,3 +223,11 @@ gimp_operations_init (Gimp *gimp)
   set_settings_folder (GIMP_TYPE_LEVELS_CONFIG,
                        "levels");
 }
+
+void
+gimp_operations_exit (Gimp *gimp)
+{
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+
+  gimp_layer_modes_exit ();
+}
diff --git a/app/operations/gimp-operations.h b/app/operations/gimp-operations.h
index 6f2b222fd7..8e41e45241 100644
--- a/app/operations/gimp-operations.h
+++ b/app/operations/gimp-operations.h
@@ -22,6 +22,7 @@
 
 
 void   gimp_operations_init (Gimp *gimp);
+void   gimp_operations_exit (Gimp *gimp);
 
 
 #endif /* __GIMP_OPERATIONS_H__ */
diff --git a/app/operations/layer-modes/gimp-layer-modes.c b/app/operations/layer-modes/gimp-layer-modes.c
index 587e1c0b9c..4f4da5a825 100644
--- a/app/operations/layer-modes/gimp-layer-modes.c
+++ b/app/operations/layer-modes/gimp-layer-modes.c
@@ -1110,6 +1110,7 @@ static const GimpLayerMode layer_mode_groups[][2] =
   }
 };
 
+static GeglOperation *ops[G_N_ELEMENTS (layer_mode_infos)] = { 0 };
 
 /*  public functions  */
 
@@ -1124,6 +1125,15 @@ gimp_layer_modes_init (void)
     }
 }
 
+void
+gimp_layer_modes_exit (void)
+{
+  gint i;
+
+  for (i = 0; i < G_N_ELEMENTS (layer_mode_infos); i++)
+    g_clear_object (&ops[i]);
+}
+
 static const GimpLayerModeInfo *
 gimp_layer_mode_info (GimpLayerMode mode)
 {
@@ -1265,55 +1275,54 @@ gimp_layer_mode_get_operation_name (GimpLayerMode mode)
   return info->op_name;
 }
 
+/**
+ * gimp_layer_mode_get_operation:
+ * @mode:
+ *
+ * Returns: a #GeglOperation for @mode which may be reused and must not
+ *          be freed.
+ */
 GeglOperation *
 gimp_layer_mode_get_operation (GimpLayerMode mode)
 {
   const GimpLayerModeInfo *info = gimp_layer_mode_info (mode);
-  GeglNode                *node;
-  GeglOperation           *operation;
-
-  if (! info)
-    info = layer_mode_infos;
-
-  node = gegl_node_new_child (NULL,
-                              "operation", info->op_name,
-                              NULL);
-
-  operation = gegl_node_get_gegl_operation (node);
-  g_object_ref (operation);
-  g_object_unref (node);
+  const gchar             *op_name;
 
-  return operation;
-}
-
-GimpLayerModeFunc
-gimp_layer_mode_get_function (GimpLayerMode mode)
-{
-  const GimpLayerModeInfo  *info = gimp_layer_mode_info (mode);
-  static GimpLayerModeFunc  funcs[G_N_ELEMENTS (layer_mode_infos)];
+  op_name = gimp_layer_mode_get_operation_name (mode);
 
   if (! info)
     info = layer_mode_infos;
 
   mode = info - layer_mode_infos;
 
-  if (! funcs[mode])
+  if (! ops[mode])
     {
       GeglNode      *node;
       GeglOperation *operation;
 
       node = gegl_node_new_child (NULL,
-                                  "operation", info->op_name,
+                                  "operation", op_name,
                                   NULL);
 
       operation = gegl_node_get_gegl_operation (node);
 
-      funcs[mode] = GIMP_OPERATION_LAYER_MODE_GET_CLASS (operation)->process;
-
+      g_object_ref (operation);
       g_object_unref (node);
+
+      ops[mode] = operation;
     }
 
-  return funcs[mode];
+  return ops[mode];
+}
+
+GimpLayerModeFunc
+gimp_layer_mode_get_function (GimpLayerMode mode)
+{
+  GeglOperation *operation;
+
+  operation = gimp_layer_mode_get_operation (mode);
+
+  return GIMP_OPERATION_LAYER_MODE_GET_CLASS (operation)->process;
 }
 
 GimpLayerModeBlendFunc
diff --git a/app/operations/layer-modes/gimp-layer-modes.h b/app/operations/layer-modes/gimp-layer-modes.h
index c98a392c61..34ebf64d2e 100644
--- a/app/operations/layer-modes/gimp-layer-modes.h
+++ b/app/operations/layer-modes/gimp-layer-modes.h
@@ -24,6 +24,7 @@
 
 
 void                       gimp_layer_modes_init                      (void);
+void                       gimp_layer_modes_exit                      (void);
 
 gboolean                   gimp_layer_mode_is_legacy                  (GimpLayerMode           mode);
 
diff --git a/app/paint/gimppaintcore-loops.cc b/app/paint/gimppaintcore-loops.cc
index 8aec8ca8fe..664fe0476f 100644
--- a/app/paint/gimppaintcore-loops.cc
+++ b/app/paint/gimppaintcore-loops.cc
@@ -1876,13 +1876,12 @@ struct DoLayerBlend : Base
 
   static constexpr gint max_n_iterators = Base::max_n_iterators + 2;
 
-  const Babl                     *iterator_format;
-  GimpOperationLayerMode         *layer_mode = NULL;
-  const GimpPaintCoreLoopsParams *params;
+  const Babl             *iterator_format;
+  GimpOperationLayerMode *layer_mode = NULL;
 
   explicit
   DoLayerBlend (const GimpPaintCoreLoopsParams *params) :
-    Base (params), params(params)
+    Base (params)
   {
     layer_mode = GIMP_OPERATION_LAYER_MODE (gimp_layer_mode_get_operation (params->paint_mode));
     layer_mode->layer_mode      = params->paint_mode;
@@ -1902,18 +1901,6 @@ struct DoLayerBlend : Base
     g_return_if_fail (gimp_temp_buf_get_format (params->paint_buf) == iterator_format);
   }
 
-  DoLayerBlend (const DoLayerBlend &algorithm) :
-    Base (algorithm.params), params(algorithm.params)
-  {
-    layer_mode = GIMP_OPERATION_LAYER_MODE (g_object_ref (algorithm.layer_mode));
-    iterator_format = algorithm.iterator_format;
-  }
-
-  ~DoLayerBlend ()
-  {
-    g_clear_object (&layer_mode);
-  }
-
   template <class Derived>
   struct State : Base::template State<Derived>
   {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]