[gimp] app: fix preview for multi-layer transform.



commit 131cdf0f1c99725f191d63da729ae60837ac04e0
Author: Jehan <jehan girinstud io>
Date:   Wed Oct 12 17:46:24 2022 +0200

    app: fix preview for multi-layer transform.
    
    Though it was working in the "Composited preview" case, it was only showing one
    of the multiple layers being transformed in the basic case.

 app/tools/gimptransformgridtool.c | 65 ++++++++++++++++++++++++++-------------
 app/tools/gimptransformgridtool.h |  2 +-
 2 files changed, 44 insertions(+), 23 deletions(-)
---
diff --git a/app/tools/gimptransformgridtool.c b/app/tools/gimptransformgridtool.c
index 550387e59b..997cf6a64b 100644
--- a/app/tools/gimptransformgridtool.c
+++ b/app/tools/gimptransformgridtool.c
@@ -692,7 +692,7 @@ gimp_transform_grid_tool_options_notify (GimpTool         *tool,
   else if (! strcmp (pspec->name, "show-preview") ||
            ! strcmp (pspec->name, "composited-preview"))
     {
-      if (tg_tool->preview)
+      if (tg_tool->previews)
         {
           GimpDisplay *display;
           GList       *objects;
@@ -752,31 +752,38 @@ gimp_transform_grid_tool_draw (GimpDrawTool *draw_tool)
   if (tr_options->type == GIMP_TRANSFORM_TYPE_LAYER ||
       tr_options->type == GIMP_TRANSFORM_TYPE_IMAGE)
     {
-      GimpPickable *pickable;
+      GList *pickables = NULL;
+      GList *iter;
 
       if (tr_options->type == GIMP_TRANSFORM_TYPE_IMAGE)
         {
           if (! shell->show_all)
-            pickable = GIMP_PICKABLE (image);
+            pickables = g_list_prepend (pickables, image);
           else
-            pickable = GIMP_PICKABLE (gimp_image_get_projection (image));
+            pickables = g_list_prepend (pickables, gimp_image_get_projection (image));
         }
       else
         {
-          /* TODO */
-          pickable = GIMP_PICKABLE (tool->drawables->data);
+          for (iter = tool->drawables; iter; iter = iter->next)
+            pickables = g_list_prepend (pickables, iter->data);
         }
 
-      tg_tool->preview =
-        gimp_draw_tool_add_transform_preview (draw_tool,
-                                              pickable,
-                                              &matrix,
-                                              tr_tool->x1,
-                                              tr_tool->y1,
-                                              tr_tool->x2,
-                                              tr_tool->y2);
-      g_object_add_weak_pointer (G_OBJECT (tg_tool->preview),
-                                 (gpointer) &tg_tool->preview);
+      for (iter = pickables; iter; iter = iter->next)
+        {
+          GimpCanvasItem *preview;
+
+          preview = gimp_draw_tool_add_transform_preview (draw_tool,
+                                                          GIMP_PICKABLE (iter->data),
+                                                          &matrix,
+                                                          tr_tool->x1,
+                                                          tr_tool->y1,
+                                                          tr_tool->x2,
+                                                          tr_tool->y2);
+          tg_tool->previews = g_list_prepend (tg_tool->previews, preview);
+          g_object_add_weak_pointer (G_OBJECT (tg_tool->previews->data),
+                                     (gpointer) &tg_tool->previews->data);
+        }
+      g_list_free (pickables);
     }
 
   if (tr_options->type == GIMP_TRANSFORM_TYPE_SELECTION)
@@ -1154,6 +1161,7 @@ gimp_transform_grid_tool_halt (GimpTransformGridTool *tg_tool)
   GimpTool                 *tool       = GIMP_TOOL (tg_tool);
   GimpTransformTool        *tr_tool    = GIMP_TRANSFORM_TOOL (tg_tool);
   GimpTransformGridOptions *tg_options = GIMP_TRANSFORM_GRID_TOOL_GET_OPTIONS (tg_tool);
+  GList                    *iter;
 
   if (gimp_draw_tool_is_active (GIMP_DRAW_TOOL (tg_tool)))
     gimp_draw_tool_stop (GIMP_DRAW_TOOL (tg_tool));
@@ -1164,6 +1172,13 @@ gimp_transform_grid_tool_halt (GimpTransformGridTool *tg_tool)
   g_clear_pointer (&tg_tool->filters, g_hash_table_unref);
   g_clear_pointer (&tg_tool->preview_drawables, g_list_free);
 
+  for (iter = tg_tool->previews; iter; iter = iter->next)
+    {
+      if (iter->data)
+        g_object_unref (iter->data);
+    }
+  g_clear_pointer (&tg_tool->previews, g_list_free);
+
   if (tg_tool->gui)
     gimp_tool_gui_hide (tg_tool->gui);
 
@@ -1562,6 +1577,7 @@ gimp_transform_grid_tool_update_preview (GimpTransformGridTool *tg_tool)
   GimpTransformTool        *tr_tool    = GIMP_TRANSFORM_TOOL (tg_tool);
   GimpTransformOptions     *tr_options = GIMP_TRANSFORM_TOOL_GET_OPTIONS (tg_tool);
   GimpTransformGridOptions *tg_options = GIMP_TRANSFORM_GRID_TOOL_GET_OPTIONS (tg_tool);
+  GList                    *iter;
   gint                      i;
 
   if (! tool->display)
@@ -1696,26 +1712,31 @@ gimp_transform_grid_tool_update_preview (GimpTransformGridTool *tg_tool)
       g_clear_pointer (&tg_tool->preview_drawables, g_list_free);
     }
 
-  if (tg_tool->preview)
+  for (iter = tg_tool->previews; iter; iter = iter->next)
     {
+      GimpCanvasItem *preview = iter->data;
+
+      if (preview == NULL)
+        continue;
+
       if (tg_options->show_preview                                &&
           ! gimp_transform_grid_tool_composited_preview (tg_tool) &&
           tr_tool->transform_valid)
         {
-          gimp_canvas_item_begin_change (tg_tool->preview);
-          gimp_canvas_item_set_visible (tg_tool->preview, TRUE);
+          gimp_canvas_item_begin_change (preview);
+          gimp_canvas_item_set_visible (preview, TRUE);
           g_object_set (
-            tg_tool->preview,
+            preview,
             "transform", &tr_tool->transform,
             "clip",      gimp_item_get_clip (GIMP_ITEM (tool->drawables->data),
                                              tr_options->clip),
             "opacity",   tg_options->preview_opacity,
             NULL);
-          gimp_canvas_item_end_change (tg_tool->preview);
+          gimp_canvas_item_end_change (preview);
         }
       else
         {
-          gimp_canvas_item_set_visible (tg_tool->preview, FALSE);
+          gimp_canvas_item_set_visible (preview, FALSE);
         }
     }
 
diff --git a/app/tools/gimptransformgridtool.h b/app/tools/gimptransformgridtool.h
index 79ec263c08..e3311ec678 100644
--- a/app/tools/gimptransformgridtool.h
+++ b/app/tools/gimptransformgridtool.h
@@ -61,7 +61,7 @@ struct _GimpTransformGridTool
 
   GimpToolWidget     *widget;
   GimpToolWidget     *grab_widget;
-  GimpCanvasItem     *preview;
+  GList              *previews;
   GimpCanvasItem     *boundary_in;
   GimpCanvasItem     *boundary_out;
   GPtrArray          *strokes;


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