static void beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); BezierShape *bez = &beziergon->bezier; BezPoint *points; int n; points = &bez->bezier.points[0]; n = bez->bezier.num_points; renderer_ops->set_linewidth(renderer, beziergon->line_width); renderer_ops->set_linestyle(renderer, beziergon->line_style); renderer_ops->set_dashlength(renderer, beziergon->dashlength); renderer_ops->set_linejoin(renderer, beziergon->line_join); renderer_ops->set_linecaps(renderer, LINECAPS_BUTT); if (beziergon->show_background) renderer_ops->fill_bezier(renderer, points, n, &beziergon->inner_color); renderer_ops->draw_bezier(renderer, points, n, &beziergon->line_color); /* these lines should only be displayed when object is selected. * Unfortunately the draw function is not aware of the selected * state. This is a compromise until I fix this properly. */ if (renderer->is_interactive && dia_object_is_selected((DiaObject*)beziergon)) { bezier_draw_control_lines (beziergon->bezier.bezier.num_points, beziergon->bezier.bezier.points, renderer); } }
/*! * \brief Object drawing to the given renderer * * \memberof _StdPath */ static void stdpath_draw(StdPath *stdpath, DiaRenderer *renderer) { DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer, stdpath->line_width); DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, stdpath->line_style, stdpath->dashlength); DIA_RENDERER_GET_CLASS (renderer)->set_linejoin(renderer, stdpath->line_join); DIA_RENDERER_GET_CLASS (renderer)->set_linecaps(renderer, stdpath->line_caps); if (DIA_RENDERER_GET_CLASS (renderer)->is_capable_to(renderer, RENDER_HOLES)) { if (stdpath->stroke_or_fill & PDO_FILL) { Color fill = stdpath->fill_color; if (stdpath->pattern) { dia_pattern_get_fallback_color (stdpath->pattern, &fill); if (DIA_RENDERER_GET_CLASS (renderer)->is_capable_to(renderer, RENDER_PATTERN)) DIA_RENDERER_GET_CLASS (renderer)->set_pattern (renderer, stdpath->pattern); } if (stdpath->stroke_or_fill & PDO_STROKE) /* also stroke -> combine */ DIA_RENDERER_GET_CLASS (renderer)->draw_beziergon(renderer, stdpath->points, stdpath->num_points, &fill, &stdpath->line_color); else DIA_RENDERER_GET_CLASS (renderer)->draw_beziergon(renderer, stdpath->points, stdpath->num_points, &fill, NULL); if (DIA_RENDERER_GET_CLASS (renderer)->is_capable_to(renderer, RENDER_PATTERN)) DIA_RENDERER_GET_CLASS (renderer)->set_pattern (renderer, NULL); } if (stdpath->stroke_or_fill == PDO_STROKE) /* stroke only */ DIA_RENDERER_GET_CLASS (renderer)->draw_bezier(renderer, stdpath->points, stdpath->num_points, &stdpath->line_color); } else { /* step-wise approach */ /* if it wouldn't RENDER_HOLES it presumably also wouldn't RENDER_PATTERN ... */ if (stdpath->stroke_or_fill & PDO_FILL) { Color fill = stdpath->fill_color; if (stdpath->pattern) dia_pattern_get_fallback_color (stdpath->pattern, &fill); bezier_render_fill (renderer, stdpath->points, stdpath->num_points, &fill); } if (stdpath->stroke_or_fill & PDO_STROKE) bezier_render_stroke (renderer, stdpath->points, stdpath->num_points, &stdpath->line_color); } if (stdpath->show_control_lines) bezier_draw_control_lines (stdpath->num_points, stdpath->points, renderer); }
static void bezierline_draw(Bezierline *bezierline, DiaRenderer *renderer) { Point gap_points[4]; /* two first and two last bez points */ BezierConn *bez = &bezierline->bez; DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); renderer_ops->set_linewidth(renderer, bezierline->line_width); renderer_ops->set_linestyle(renderer, bezierline->line_style, bezierline->dashlength); renderer_ops->set_linejoin(renderer, bezierline->line_join); renderer_ops->set_linecaps(renderer, bezierline->line_caps); if (connpoint_is_autogap(bez->object.handles[0]->connected_to) || connpoint_is_autogap(bez->object.handles[3*(bez->bezier.num_points-1)]->connected_to) || bezierline->absolute_start_gap || bezierline->absolute_end_gap) { compute_gap_points(bezierline,gap_points); exchange_bez_gap_points(bez,gap_points); renderer_ops->draw_bezier_with_arrows(renderer, bez->bezier.points, bez->bezier.num_points, bezierline->line_width, &bezierline->line_color, &bezierline->start_arrow, &bezierline->end_arrow); exchange_bez_gap_points(bez,gap_points); } else { renderer_ops->draw_bezier_with_arrows(renderer, bez->bezier.points, bez->bezier.num_points, bezierline->line_width, &bezierline->line_color, &bezierline->start_arrow, &bezierline->end_arrow); } #if 0 renderer_ops->draw_bezier(renderer, bez->bezier.points, bez->bezier.num_points, &bezierline->line_color); if (bezierline->start_arrow.type != ARROW_NONE) { arrow_draw(renderer, bezierline->start_arrow.type, &bez->bezier.points[0].p1, &bez->bezier.points[1].p1, bezierline->start_arrow.length, bezierline->start_arrow.width, bezierline->line_width, &bezierline->line_color, &color_white); } if (bezierline->end_arrow.type != ARROW_NONE) { arrow_draw(renderer, bezierline->end_arrow.type, &bez->bezier.points[bez->bezier.num_points-1].p3, &bez->bezier.points[bez->bezier.num_points-1].p2, bezierline->end_arrow.length, bezierline->end_arrow.width, bezierline->line_width, &bezierline->line_color, &color_white); } #endif /* Only display lines while selected. Calling dia_object_is_selected() * every time may take a little long. Some time can be saved by storing * whether the object is currently selected in bezierline_select, and * only checking while selected. But we'll do that if needed. */ if (renderer->is_interactive && dia_object_is_selected(&bezierline->bez.object)) { bezier_draw_control_lines(bezierline->bez.bezier.num_points, bezierline->bez.bezier.points, renderer); } }