[dia] Bug 587218 - endless loop with cairo
- From: Hans Breuer <hans src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [dia] Bug 587218 - endless loop with cairo
- Date: Sat, 5 Dec 2009 17:47:46 +0000 (UTC)
commit d47f096f810179451b3df962b88d946f7debeb84
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
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 8cd2b46..aa55d8c 100644
--- a/plug-ins/cairo/diacairo-renderer.c
+++ b/plug-ins/cairo/diacairo-renderer.c
@@ -171,22 +171,28 @@ is_capable_to (DiaRenderer *renderer, RenderCapability cap)
}
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)
@@ -291,6 +297,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]