[dia] standard: further optimization of DiaRenderer calls



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, 
-                                 &center,
-                                 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, 
+                               &center,
+                               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,
+                               &center,
+                               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, 
-                         &center,
-                         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]