[dia] standard: further optimization of DiaRenderer calls
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] standard: further optimization of DiaRenderer calls
- Date: Sun, 8 Jun 2014 08:59:53 +0000 (UTC)
commit 20bb37b0013e56992b7720024e85cf5c0f1be0a4
Author: Hans Breuer <hans breuer org>
Date: Fri May 9 23:17:09 2014 +0200
standard: further optimization of DiaRenderer calls
- "Standard - Arc" uses draw_arc for the simple case to avoid
impreciseness caused by gap calculations
- "Standard - Box", "Standard - Ellipse" need only once call, even
with pattern fill active
objects/standard/arc.c | 26 ++++++++++++++++++--------
objects/standard/box.c | 28 ++++++++++++++--------------
objects/standard/ellipse.c | 30 ++++++++++++++----------------
3 files changed, 46 insertions(+), 38 deletions(-)
---
diff --git a/objects/standard/arc.c b/objects/standard/arc.c
index dd2258e..14392b0 100644
--- a/objects/standard/arc.c
+++ b/objects/standard/arc.c
@@ -626,14 +626,24 @@ arc_draw(Arc *arc, DiaRenderer *renderer)
return;
}
- renderer_ops->draw_arc_with_arrows(renderer,
- &gaptmp[0],
- &gaptmp[1],
- &gaptmp[2],
- arc->line_width,
- &arc->arc_color,
- &arc->start_arrow,
- &arc->end_arrow);
+ if ( arc->start_arrow.type == ARROW_NONE
+ && arc->end_arrow.type == ARROW_NONE
+ && !start_cp && !end_cp) {
+ /* avoid all the calculation errors and use what whe have */
+ renderer_ops->draw_arc(renderer, &arc->center_handle.pos,
+ arc->radius*2.0, arc->radius*2.0,
+ arc->angle1, arc->angle2,
+ &arc->arc_color);
+ } else {
+ renderer_ops->draw_arc_with_arrows(renderer,
+ &gaptmp[0],
+ &gaptmp[1],
+ &gaptmp[2],
+ arc->line_width,
+ &arc->arc_color,
+ &arc->start_arrow,
+ &arc->end_arrow);
+ }
if (renderer->is_interactive &&
dia_object_is_selected(&arc->connection.object)) {
/* draw the central angle */
diff --git a/objects/standard/box.c b/objects/standard/box.c
index a3ec7aa..172ea55 100644
--- a/objects/standard/box.c
+++ b/objects/standard/box.c
@@ -318,6 +318,7 @@ box_draw(Box *box, DiaRenderer *renderer)
renderer_ops->set_linejoin(renderer, LINEJOIN_ROUND);
else
renderer_ops->set_linejoin(renderer, box->line_join);
+ renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
if (box->show_background) {
Color fill = box->inner_color;
@@ -331,29 +332,28 @@ box_draw(Box *box, DiaRenderer *renderer)
if (box->corner_radius > 0) {
renderer_ops->draw_rounded_rect (renderer,
&elem->corner, &lr_corner,
- &fill, NULL,
+ &fill, &box->border_color,
box->corner_radius);
} else {
renderer_ops->draw_rect(renderer,
&elem->corner,
&lr_corner,
- &fill, NULL);
+ &fill, &box->border_color);
}
if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
renderer_ops->set_pattern (renderer, NULL);
- }
-
- if (box->corner_radius > 0) {
- renderer_ops->draw_rounded_rect (renderer,
- &elem->corner, &lr_corner,
- NULL, &box->border_color,
- box->corner_radius);
} else {
- renderer_ops->draw_rect(renderer,
- &elem->corner,
- &lr_corner,
- NULL,
- &box->border_color);
+ if (box->corner_radius > 0) {
+ renderer_ops->draw_rounded_rect (renderer,
+ &elem->corner, &lr_corner,
+ NULL, &box->border_color,
+ box->corner_radius);
+ } else {
+ renderer_ops->draw_rect (renderer,
+ &elem->corner,
+ &lr_corner,
+ NULL, &box->border_color);
+ }
}
}
diff --git a/objects/standard/ellipse.c b/objects/standard/ellipse.c
index 475ba26..7f2e692 100644
--- a/objects/standard/ellipse.c
+++ b/objects/standard/ellipse.c
@@ -308,6 +308,9 @@ ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer)
center.x = elem->corner.x + elem->width/2;
center.y = elem->corner.y + elem->height/2;
+ renderer_ops->set_linewidth(renderer, ellipse->border_width);
+ renderer_ops->set_linestyle(renderer, ellipse->line_style);
+ renderer_ops->set_dashlength(renderer, ellipse->dashlength);
if (ellipse->show_background) {
Color fill = ellipse->inner_color;
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
@@ -315,24 +318,19 @@ ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer)
dia_pattern_get_fallback_color (ellipse->pattern, &fill);
if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
renderer_ops->set_pattern (renderer, ellipse->pattern);
- /* still two calls with pattern */
- renderer_ops->draw_ellipse (renderer,
- ¢er,
- elem->width, elem->height,
- &fill, NULL);
- if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
- renderer_ops->set_pattern (renderer, NULL);
}
+ renderer_ops->draw_ellipse (renderer,
+ ¢er,
+ elem->width, elem->height,
+ &fill, &ellipse->border_color);
+ if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
+ renderer_ops->set_pattern (renderer, NULL);
+ } else {
+ renderer_ops->draw_ellipse (renderer,
+ ¢er,
+ elem->width, elem->height,
+ NULL, &ellipse->border_color);
}
-
- renderer_ops->set_linewidth(renderer, ellipse->border_width);
- renderer_ops->set_linestyle(renderer, ellipse->line_style);
- renderer_ops->set_dashlength(renderer, ellipse->dashlength);
- renderer_ops->draw_ellipse(renderer,
- ¢er,
- elem->width, elem->height,
- (ellipse->show_background && !ellipse->pattern) ? &ellipse->inner_color : NULL,
- &ellipse->border_color);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]