dia r4044 - in trunk: lib objects/standard



Author: hans
Date: Sun May 25 12:54:48 2008
New Revision: 4044
URL: http://svn.gnome.org/viewvc/dia?rev=4044&view=rev

Log:
2008-05-18  Hans Breuer  <hans breuer org>

	Attempts to fix bug #534275
	* lib/diagdkrenderer.c(draw_fill_rounded_rect) : attempt to make
	arc drawing for radius<line_width less backend specific. 
	* objects/standard/box.c objects/standard/polyline.c 
	  objects/standard/zigzagline.c : 
	set LINEJOIN_ROUND when rendering "rounded" (with radius>0)



Modified:
   trunk/lib/beziershape.c
   trunk/lib/diagdkrenderer.c
   trunk/objects/standard/box.c
   trunk/objects/standard/polyline.c
   trunk/objects/standard/zigzagline.c

Modified: trunk/lib/beziershape.c
==============================================================================
--- trunk/lib/beziershape.c	(original)
+++ trunk/lib/beziershape.c	Sun May 25 12:54:48 2008
@@ -44,7 +44,7 @@
    # of connections = 2*(numpoints-1) + 1 (main point)
    For historical reasons, the main point is the last cp.
  */
-struct PointChange {
+struct BezPointChange {
   ObjectChange obj_change;
 
   enum change_type type;
@@ -245,6 +245,7 @@
 
   closest = 0;
   last = bezier->points[0].p1;
+  /* the first point is just move-to so there is no need to consider p2,p3 of it */
   for (i = 1; i < bezier->numpoints; i++) {
     real new_dist = distance_bez_seg_point(&last, &bezier->points[i].p1,
 			&bezier->points[i].p2, &bezier->points[i].p3,
@@ -462,15 +463,21 @@
   ConnectionPoint *old_cp1, *old_cp2;
   BezPoint old_point;
   BezCornerType old_ctype;
+  int next = pos+1;
 
   g_assert(pos > 0);
   g_assert(bezier->numpoints > 2);
   g_assert(pos < bezier->numpoints);
 
+  if (pos == bezier->numpoints - 1)
+    next = 1;
+
   old_handle1 = bezier->object.handles[3*pos-3];
   old_handle2 = bezier->object.handles[3*pos-2];
   old_handle3 = bezier->object.handles[3*pos-1];
   old_point = bezier->points[pos];
+  /* remember the old contro point of following bezpoint */
+  old_point.p1 = bezier->points[next].p1;
   old_ctype = bezier->corner_types[pos];
 
   old_cp1 = bezier->object.connections[2*pos-2];
@@ -1008,7 +1015,7 @@
 }
 
 static void
-beziershape_point_change_free(struct PointChange *change)
+beziershape_point_change_free(struct BezPointChange *change)
 {
   if ( (change->type==TYPE_ADD_POINT && !change->applied) ||
        (change->type==TYPE_REMOVE_POINT && change->applied) ){
@@ -1026,7 +1033,7 @@
 }
 
 static void
-beziershape_point_change_apply(struct PointChange *change, DiaObject *obj)
+beziershape_point_change_apply(struct BezPointChange *change, DiaObject *obj)
 {
   change->applied = 1;
   switch (change->type) {
@@ -1046,7 +1053,7 @@
 }
 
 static void
-beziershape_point_change_revert(struct PointChange *change, DiaObject *obj)
+beziershape_point_change_revert(struct BezPointChange *change, DiaObject *obj)
 {
   switch (change->type) {
   case TYPE_ADD_POINT:
@@ -1070,9 +1077,9 @@
 				Handle *handle3,
 				ConnectionPoint *cp1, ConnectionPoint *cp2)
 {
-  struct PointChange *change;
+  struct BezPointChange *change;
 
-  change = g_new(struct PointChange, 1);
+  change = g_new(struct BezPointChange, 1);
 
   change->obj_change.apply =
     (ObjectChangeApplyFunc)beziershape_point_change_apply;

Modified: trunk/lib/diagdkrenderer.c
==============================================================================
--- trunk/lib/diagdkrenderer.c	(original)
+++ trunk/lib/diagdkrenderer.c	Sun May 25 12:54:48 2008
@@ -966,6 +966,7 @@
   GdkGC *gc = renderer->gc;
   GdkColor gdkcolor;
   gint top, bottom, left, right, r, d;
+  gint offset = 0; /* to compensate for a radius smaller than line_width */
 
   dia_transform_coords(renderer->transform, 
                        ul_corner->x, ul_corner->y, &left, &top);
@@ -982,27 +983,44 @@
     r = (bottom-top)/2;
 
   d = r<<1;
+  /* line_width is already scaled */
+  if (renderer->line_width > d)
+    offset = (renderer->line_width + 1) / 2;
 
   renderer_color_convert(renderer, color, &gdkcolor);
   gdk_gc_set_foreground(gc, &gdkcolor);
 
   if (d > 0) {
-    gdk_draw_arc(renderer->pixmap, gc, fill, left, top, d, d, 90<<6, 90<<6);
-    gdk_draw_arc(renderer->pixmap, gc, fill, right-d, top, d, d, 0<<6, 90<<6);
-    gdk_draw_arc(renderer->pixmap, gc, fill, right-d, bottom-d, d, d, 270<<6, 90<<6);
-    gdk_draw_arc(renderer->pixmap, gc, fill, left, bottom-d, d, d, 180<<6, 90<<6);
+    if (offset > 0) {
+      /* avoid windowing system defined arc artifacts drawing by some adjustments  */
+      gdk_gc_set_line_attributes(renderer->gc, 
+                                 r, renderer->line_style, 
+				 renderer->cap_style, renderer->join_style);
+      gdk_draw_arc(renderer->pixmap, gc, TRUE, left-offset, top-offset, d, d, 90<<6, 90<<6);
+      gdk_draw_arc(renderer->pixmap, gc, TRUE, right-d+offset, top-offset, d, d, 0<<6, 90<<6);
+      gdk_draw_arc(renderer->pixmap, gc, TRUE, right-d+offset, bottom-d+offset, d, d, 270<<6, 90<<6);
+      gdk_draw_arc(renderer->pixmap, gc, TRUE, left-offset, bottom-d+offset, d, d, 180<<6, 90<<6);
+      gdk_gc_set_line_attributes(renderer->gc, 
+                                 renderer->line_width, renderer->line_style, 
+				 renderer->cap_style, renderer->join_style);
+    } else {
+      gdk_draw_arc(renderer->pixmap, gc, fill, left, top, d, d, 90<<6, 90<<6);
+      gdk_draw_arc(renderer->pixmap, gc, fill, right-d, top, d, d, 0<<6, 90<<6);
+      gdk_draw_arc(renderer->pixmap, gc, fill, right-d, bottom-d, d, d, 270<<6, 90<<6);
+      gdk_draw_arc(renderer->pixmap, gc, fill, left, bottom-d, d, d, 180<<6, 90<<6);
+    }
   }
 
   if (fill) {
     gdk_draw_rectangle (renderer->pixmap, renderer->gc, TRUE, 
-                        left+r, top, right-left-d, bottom-top);
+                        left+r-offset, top, right-left-d+offset, bottom-top);
     gdk_draw_rectangle (renderer->pixmap, renderer->gc, TRUE, 
-                        left, top+r, right-left, bottom-top-d);
+                        left, top+r-offset, right-left, bottom-top-d+offset);
   } else {
-    gdk_draw_line(renderer->pixmap, gc, left+r, top, right-r, top);
-    gdk_draw_line(renderer->pixmap, gc, right, top+r, right, bottom-r);
-    gdk_draw_line(renderer->pixmap, gc, right-r, bottom, left+r-1, bottom);
-    gdk_draw_line(renderer->pixmap, gc, left, bottom-r, left, top+r-1);
+    gdk_draw_line(renderer->pixmap, gc, left+r-offset, top, right-r+offset, top);
+    gdk_draw_line(renderer->pixmap, gc, right, top+r-offset, right, bottom-r+offset);
+    gdk_draw_line(renderer->pixmap, gc, right-r+offset, bottom, left+r-1-offset, bottom);
+    gdk_draw_line(renderer->pixmap, gc, left, bottom-r+offset, left, top+r-1-offset);
   }
 }
 static void 

Modified: trunk/objects/standard/box.c
==============================================================================
--- trunk/objects/standard/box.c	(original)
+++ trunk/objects/standard/box.c	Sun May 25 12:54:48 2008
@@ -316,7 +316,10 @@
   renderer_ops->set_linewidth(renderer, box->border_width);
   renderer_ops->set_linestyle(renderer, box->line_style);
   renderer_ops->set_dashlength(renderer, box->dashlength);
-  renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
+  if (box->corner_radius > 0)
+    renderer_ops->set_linejoin(renderer, LINEJOIN_ROUND);
+  else
+    renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   if (box->show_background) {
     renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);

Modified: trunk/objects/standard/polyline.c
==============================================================================
--- trunk/objects/standard/polyline.c	(original)
+++ trunk/objects/standard/polyline.c	Sun May 25 12:54:48 2008
@@ -300,7 +300,10 @@
   renderer_ops->set_linewidth(renderer, polyline->line_width);
   renderer_ops->set_linestyle(renderer, polyline->line_style);
   renderer_ops->set_dashlength(renderer, polyline->dashlength);
-  renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
+  if (polyline->corner_radius > 0.0)
+    renderer_ops->set_linejoin(renderer, LINEJOIN_ROUND);
+  else
+    renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   polyline_calculate_gap_endpoints(polyline, gap_endpoints);

Modified: trunk/objects/standard/zigzagline.c
==============================================================================
--- trunk/objects/standard/zigzagline.c	(original)
+++ trunk/objects/standard/zigzagline.c	Sun May 25 12:54:48 2008
@@ -224,7 +224,10 @@
   renderer_ops->set_linewidth(renderer, zigzagline->line_width);
   renderer_ops->set_linestyle(renderer, zigzagline->line_style);
   renderer_ops->set_dashlength(renderer, zigzagline->dashlength);
-  renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
+  if (zigzagline->corner_radius > 0)
+    renderer_ops->set_linejoin(renderer, LINEJOIN_ROUND);
+  else
+    renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   renderer_ops->draw_rounded_polyline_with_arrows(renderer,



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