[gimp/gimp-2-8] Bug 771851 - Vertical ruler shows artifacts if the status bar isn't showing



commit c2d63da7d9f6a7fd5bf8d49444d41596402f2475
Author: Michael Natterer <mitch gimp org>
Date:   Thu Sep 22 23:03:53 2016 +0200

    Bug 771851 - Vertical ruler shows artifacts if the status bar isn't showing
    
    gimp_ruler_draw_pos(): when remembering the just drawn rectangle's
    position, don't just unconditionally overwrite the previous position's
    rectangle. Instead, if the previous position's rectangle has not been
    cleared yet (has a non-zero size), remember the union of old and new
    rectangle.
    
    Why this only happened to the vertical ruler with statusbar off is
    beyond my mind, it should have always produced artifacts.
    
    Unrelated: make sure the idle function is removed if we decide to
    immediately redraw in gimp_ruler_set_position().
    
    (cherry picked from commit e909b77969ea29c882ee38b622c4507e7302c705)

 libgimpwidgets/gimpruler.c |   25 +++++++++++++++++++++----
 1 files changed, 21 insertions(+), 4 deletions(-)
---
diff --git a/libgimpwidgets/gimpruler.c b/libgimpwidgets/gimpruler.c
index 305a6b3..c2758b3 100644
--- a/libgimpwidgets/gimpruler.c
+++ b/libgimpwidgets/gimpruler.c
@@ -659,6 +659,12 @@ gimp_ruler_set_position (GimpRuler *ruler,
           (ABS (xdiff) > IMMEDIATE_REDRAW_THRESHOLD ||
            ABS (ydiff) > IMMEDIATE_REDRAW_THRESHOLD))
         {
+          if (priv->pos_redraw_idle_id)
+            {
+              g_source_remove (priv->pos_redraw_idle_id);
+              priv->pos_redraw_idle_id = 0;
+            }
+
           gimp_ruler_queue_pos_redraw (ruler);
         }
       else if (! priv->pos_redraw_idle_id)
@@ -1279,15 +1285,16 @@ gimp_ruler_queue_pos_redraw (GimpRuler *ruler)
   GimpRulerPrivate  *priv = GIMP_RULER_GET_PRIVATE (ruler);
   const GdkRectangle rect = gimp_ruler_get_pos_rect (ruler, priv->position);
 
-  gtk_widget_queue_draw_area (GTK_WIDGET(ruler),
+  gtk_widget_queue_draw_area (GTK_WIDGET (ruler),
                               rect.x,
                               rect.y,
                               rect.width,
                               rect.height);
 
-  if (priv->last_pos_rect.width != 0 || priv->last_pos_rect.height != 0)
+  if (priv->last_pos_rect.width  != 0 &&
+      priv->last_pos_rect.height != 0)
     {
-      gtk_widget_queue_draw_area (GTK_WIDGET(ruler),
+      gtk_widget_queue_draw_area (GTK_WIDGET (ruler),
                                   priv->last_pos_rect.x,
                                   priv->last_pos_rect.y,
                                   priv->last_pos_rect.width,
@@ -1338,7 +1345,17 @@ gimp_ruler_draw_pos (GimpRuler *ruler, cairo_t *cr)
       cairo_fill (cr);
     }
 
-  priv->last_pos_rect = pos_rect;
+  if (priv->last_pos_rect.width  != 0 &&
+      priv->last_pos_rect.height != 0)
+    {
+      gdk_rectangle_union (&priv->last_pos_rect,
+                           &pos_rect,
+                           &priv->last_pos_rect);
+    }
+  else
+    {
+      priv->last_pos_rect = pos_rect;
+    }
 }
 
 static void


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