[dia/dia-0-97] Bug 587218 - endless loop with cairo



commit ab4928417cda0d6139a1077cc9d3b51dc27c7eba
Author: Hans Breuer <hans breuer org>
Date:   Sat Dec 5 11:42:47 2009 +0100

    Bug 587218 - endless loop with cairo
    
    The change ensures a minimum line width of one device unit to be
    given to cairo. Also the minimum dash length is limited as a
    workaround for cairo version before 1.10, see:
    https://bugs.freedesktop.org/show_bug.cgi?id=24702
    (cherry picked from commit d47f096f810179451b3df962b88d946f7debeb84)

 plug-ins/cairo/diacairo-renderer.c |   29 +++++++++++++++++++----------
 1 files changed, 19 insertions(+), 10 deletions(-)
---
diff --git a/plug-ins/cairo/diacairo-renderer.c b/plug-ins/cairo/diacairo-renderer.c
index 1ab5cbf..9976bd6 100644
--- a/plug-ins/cairo/diacairo-renderer.c
+++ b/plug-ins/cairo/diacairo-renderer.c
@@ -161,22 +161,28 @@ end_render(DiaRenderer *self)
 }
 
 static void
+ensure_minimum_one_device_unit(DiaCairoRenderer *renderer, real *value)
+{
+  double ax = 1., ay = 1.;
+
+  cairo_device_to_user_distance (renderer->cr, &ax, &ay);
+
+  ax = MAX(ax, ay);
+  if (*value < ax)
+      *value = ax;
+}
+
+static void
 set_linewidth(DiaRenderer *self, real linewidth)
 {  
   DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self);
 
   DIAG_NOTE(g_message("set_linewidth %f", linewidth));
 
-  /* make hairline? */
-  if (linewidth == 0.0) {
-    double ax = 0.0, ay = 0.0;
-    double bx = 1.0, by = 0.0;    
-    
-    cairo_device_to_user_distance (renderer->cr, &ax, &ay);
-    cairo_device_to_user_distance (renderer->cr, &bx, &by);
-    
-    linewidth = sqrt ((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
-  }
+  /* make hairline? Everythnig below one device unit get the same width,
+   * otherwise 0.0 may end up thicker than 0.0+epsilon
+   */
+  ensure_minimum_one_device_unit(renderer, &linewidth);
 
   cairo_set_line_width (renderer->cr, linewidth);
   DIAG_STATE(renderer->cr)
@@ -281,6 +287,9 @@ set_dashlength(DiaRenderer *self, real length)
 
   DIAG_NOTE(g_message("set_dashlength %f", length));
 
+  /* this call does not make sense, the value is certainly bigger
+   * than one device unit. But the side-effect seems to end the endless loop */
+  ensure_minimum_one_device_unit(renderer, &length);
   renderer->dash_length = length;
 }
 



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