[gimp/gimp-2-10] app: in GimpPaintTool, sync brush-outline coords while painting



commit aeff2852164953273bdbc85e7575fcb35c6aaf1e
Author: Ell <ell_se yahoo com>
Date:   Fri Jun 8 03:14:17 2018 -0400

    app: in GimpPaintTool, sync brush-outline coords while painting
    
    Add GimpPaintTool::paint_[xy] members, and periodically assign the
    paint core's current coords to them in
    gimp_paint_tool_paint_timeout(), while the main thread and the
    paint thread are synchronized, during painting.
    
    In gimp_paint_tool_draw(), fetch the current coords for the brush
    outline from the above members during painting, instead of directly
    from the paint core, to avoid a race condition with the paint
    thread, so that we always use the correct coordinates at the time
    the paint buffer was flushed back to the drawable.
    
    (cherry picked from commit 5c17d2a43b18a73ffe0af751d616390a0f00e45e)

 app/tools/gimppainttool-paint.c | 11 +++++--
 app/tools/gimppainttool.c       | 65 +++++++++++++++++++++++------------------
 app/tools/gimppainttool.h       |  3 ++
 3 files changed, 49 insertions(+), 30 deletions(-)
---
diff --git a/app/tools/gimppainttool-paint.c b/app/tools/gimppainttool-paint.c
index 96754ff710..aec08b86e9 100644
--- a/app/tools/gimppainttool-paint.c
+++ b/app/tools/gimppainttool-paint.c
@@ -158,13 +158,17 @@ gimp_paint_tool_paint_thread (gpointer data)
 static gboolean
 gimp_paint_tool_paint_timeout (GimpPaintTool *paint_tool)
 {
-  GimpDrawable *drawable = paint_tool->drawable;
-  gboolean      update;
+  GimpPaintCore *core     = paint_tool->core;
+  GimpDrawable  *drawable = paint_tool->drawable;
+  gboolean       update;
 
   paint_timeout_pending = TRUE;
 
   g_mutex_lock (&paint_mutex);
 
+  paint_tool->paint_x = core->cur_coords.x;
+  paint_tool->paint_y = core->cur_coords.y;
+
   update = gimp_drawable_flush_paint (drawable);
 
   if (update && GIMP_PAINT_TOOL_GET_CLASS (paint_tool)->paint_flush)
@@ -248,6 +252,9 @@ gimp_paint_tool_paint_start (GimpPaintTool     *paint_tool,
   curr_coords.x -= off_x;
   curr_coords.y -= off_y;
 
+  paint_tool->paint_x = curr_coords.x;
+  paint_tool->paint_y = curr_coords.y;
+
   /*  If we use a separate paint thread, enter paint mode before starting the
    *  paint core
    */
diff --git a/app/tools/gimppainttool.c b/app/tools/gimppainttool.c
index 757d113b9a..40a2541e68 100644
--- a/app/tools/gimppainttool.c
+++ b/app/tools/gimppainttool.c
@@ -643,46 +643,55 @@ gimp_paint_tool_draw (GimpDrawTool *draw_tool)
       GimpDrawable   *drawable   = gimp_image_get_active_drawable (image);
       GimpCanvasItem *outline    = NULL;
       gboolean        line_drawn = FALSE;
-      gdouble         last_x, last_y;
       gdouble         cur_x, cur_y;
       gint            off_x, off_y;
 
       gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
 
-      last_x = core->last_coords.x + off_x;
-      last_y = core->last_coords.y + off_y;
-      cur_x  = core->cur_coords.x + off_x;
-      cur_y  = core->cur_coords.y + off_y;
-
-      if (paint_tool->draw_line &&
-          ! gimp_tool_control_is_active (GIMP_TOOL (draw_tool)->control))
+      if (gimp_paint_tool_paint_is_active (paint_tool))
+        {
+          cur_x = paint_tool->paint_x + off_x;
+          cur_y = paint_tool->paint_y + off_y;
+        }
+      else
         {
-          GimpCanvasGroup *group;
+          cur_x = core->cur_coords.x + off_x;
+          cur_y = core->cur_coords.y + off_y;
 
-          group = gimp_draw_tool_add_stroke_group (draw_tool);
-          gimp_draw_tool_push_group (draw_tool, group);
+          if (paint_tool->draw_line &&
+              ! gimp_tool_control_is_active (GIMP_TOOL (draw_tool)->control))
+            {
+              GimpCanvasGroup *group;
+              gdouble          last_x, last_y;
 
-          gimp_draw_tool_add_handle (draw_tool,
-                                     GIMP_HANDLE_CIRCLE,
-                                     last_x, last_y,
-                                     GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                     GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                     GIMP_HANDLE_ANCHOR_CENTER);
+              last_x = core->last_coords.x + off_x;
+              last_y = core->last_coords.y + off_y;
 
-          gimp_draw_tool_add_line (draw_tool,
-                                   last_x, last_y,
-                                   cur_x, cur_y);
+              group = gimp_draw_tool_add_stroke_group (draw_tool);
+              gimp_draw_tool_push_group (draw_tool, group);
 
-          gimp_draw_tool_add_handle (draw_tool,
-                                     GIMP_HANDLE_CIRCLE,
-                                     cur_x, cur_y,
-                                     GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                     GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                     GIMP_HANDLE_ANCHOR_CENTER);
+              gimp_draw_tool_add_handle (draw_tool,
+                                         GIMP_HANDLE_CIRCLE,
+                                         last_x, last_y,
+                                         GIMP_TOOL_HANDLE_SIZE_CIRCLE,
+                                         GIMP_TOOL_HANDLE_SIZE_CIRCLE,
+                                         GIMP_HANDLE_ANCHOR_CENTER);
 
-          gimp_draw_tool_pop_group (draw_tool);
+              gimp_draw_tool_add_line (draw_tool,
+                                       last_x, last_y,
+                                       cur_x, cur_y);
 
-          line_drawn = TRUE;
+              gimp_draw_tool_add_handle (draw_tool,
+                                         GIMP_HANDLE_CIRCLE,
+                                         cur_x, cur_y,
+                                         GIMP_TOOL_HANDLE_SIZE_CIRCLE,
+                                         GIMP_TOOL_HANDLE_SIZE_CIRCLE,
+                                         GIMP_HANDLE_ANCHOR_CENTER);
+
+              gimp_draw_tool_pop_group (draw_tool);
+
+              line_drawn = TRUE;
+            }
         }
 
       gimp_paint_tool_set_draw_fallback (paint_tool, FALSE, 0.0);
diff --git a/app/tools/gimppainttool.h b/app/tools/gimppainttool.h
index d38d504cb9..8b63f8d408 100644
--- a/app/tools/gimppainttool.h
+++ b/app/tools/gimppainttool.h
@@ -59,6 +59,9 @@ struct _GimpPaintTool
 
   GimpDisplay   *display;
   GimpDrawable  *drawable;
+
+  gdouble        paint_x;
+  gdouble        paint_y;
 };
 
 struct _GimpPaintToolClass


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