dia r4044 - in trunk: lib objects/standard
- From: hans svn gnome org
- To: svn-commits-list gnome org
- Subject: dia r4044 - in trunk: lib objects/standard
- Date: Sun, 25 May 2008 12:54:48 +0000 (UTC)
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]