static void line_draw(Line *line, Renderer *renderer) { Point *endpoints; assert(line != NULL); assert(renderer != NULL); endpoints = &line->connection.endpoints[0]; renderer->ops->set_linewidth(renderer, line->line_width); renderer->ops->set_linestyle(renderer, line->line_style); renderer->ops->set_dashlength(renderer, line->dashlength); renderer->ops->set_linecaps(renderer, LINECAPS_BUTT); renderer->ops->draw_line(renderer, &endpoints[0], &endpoints[1], &line->line_color); if (line->start_arrow.type != ARROW_NONE) { arrow_draw(renderer, line->start_arrow.type, &endpoints[0], &endpoints[1], line->start_arrow.length, line->start_arrow.width, line->line_width, &line->line_color, &color_white); } if (line->end_arrow.type != ARROW_NONE) { arrow_draw(renderer, line->end_arrow.type, &endpoints[1], &endpoints[0], line->end_arrow.length, line->end_arrow.width, line->line_width, &line->line_color, &color_white); } }
static void constraint_draw(Constraint *constraint, Renderer *renderer) { Point *endpoints; assert(constraint != NULL); assert(renderer != NULL); endpoints = &constraint->connection.endpoints[0]; renderer->ops->set_linewidth(renderer, CONSTRAINT_WIDTH); renderer->ops->set_dashlength(renderer, CONSTRAINT_DASHLEN); renderer->ops->set_linestyle(renderer, LINESTYLE_DASHED); renderer->ops->set_linecaps(renderer, LINECAPS_BUTT); renderer->ops->draw_line(renderer, &endpoints[0], &endpoints[1], &color_black); arrow_draw(renderer, ARROW_LINES, &endpoints[1], &endpoints[0], CONSTRAINT_ARROWLEN, CONSTRAINT_ARROWWIDTH, CONSTRAINT_WIDTH, &color_black, &color_white); renderer->ops->set_font(renderer, constraint_font, CONSTRAINT_FONTHEIGHT); renderer->ops->draw_string(renderer, constraint->text, &constraint->text_pos, ALIGN_LEFT, &color_black); }
static void arc_draw(Arc *arc, DiaRenderer *renderer) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); OrthConn *orth = &arc->orth; Point *points; int n,i; points = &orth->points[0]; n = orth->numpoints; renderer_ops->set_linewidth(renderer, ARC_LINE_WIDTH); renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID); renderer_ops->set_linejoin(renderer, LINEJOIN_MITER); renderer_ops->set_linecaps(renderer, LINECAPS_BUTT); renderer_ops->draw_polyline(renderer, points, n, &color_black); if (arc->uparrow) { for (i=0;i<n-1; i++) { if ((points[i].y > points[i+1].y) && (ABS(points[i+1].y-points[i].y) > 5 * ARC_ARROW_LENGTH)) { /* Draw an arrow on the middle of the line */ Point m; m.x = points[i].x; /* == points[i+1].x */ m.y = .5 * (points[i].y + points[i+1].y) - (.5 * ARC_ARROW_LENGTH); arrow_draw(renderer, ARC_ARROW_TYPE, &m,&points[i], ARC_ARROW_LENGTH, ARC_ARROW_WIDTH, ARC_LINE_WIDTH, &color_black, &color_white); } } } }
static void bezierline_draw(Bezierline *bezierline, Renderer *renderer) { BezierConn *bez = &bezierline->bez; renderer->ops->set_linewidth(renderer, bezierline->line_width); renderer->ops->set_linestyle(renderer, bezierline->line_style); renderer->ops->set_dashlength(renderer, bezierline->dashlength); renderer->ops->set_linejoin(renderer, LINEJOIN_MITER); renderer->ops->set_linecaps(renderer, LINECAPS_BUTT); renderer->ops->draw_bezier(renderer, bez->points, bez->numpoints, &bezierline->line_color); if (bezierline->start_arrow.type != ARROW_NONE) { arrow_draw(renderer, bezierline->start_arrow.type, &bez->points[0].p1, &bez->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->points[bez->numpoints-1].p3, &bez->points[bez->numpoints-1].p2, bezierline->end_arrow.length, bezierline->end_arrow.width, bezierline->line_width, &bezierline->line_color, &color_white); } /* 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) bezierconn_draw_control_lines(&bezierline->bez, renderer); }
static void generalization_draw(Generalization *genlz, Renderer *renderer) { OrthConn *orth = &genlz->orth; Point *points; int n; Point pos; points = &orth->points[0]; n = orth->numpoints; renderer->ops->set_linewidth(renderer, GENERALIZATION_WIDTH); renderer->ops->set_linestyle(renderer, LINESTYLE_SOLID); renderer->ops->set_linejoin(renderer, LINEJOIN_MITER); renderer->ops->set_linecaps(renderer, LINECAPS_BUTT); renderer->ops->draw_polyline(renderer, points, n, &color_black); arrow_draw(renderer, ARROW_HOLLOW_TRIANGLE, &points[0], &points[1], GENERALIZATION_TRIANGLESIZE, GENERALIZATION_TRIANGLESIZE, GENERALIZATION_WIDTH, &color_black, &color_white); renderer->ops->set_font(renderer, genlz_font, GENERALIZATION_FONTHEIGHT); pos = genlz->text_pos; if (genlz->stereotype != NULL) { renderer->ops->draw_string(renderer, genlz->stereotype, &pos, genlz->text_align, &color_black); pos.y += GENERALIZATION_FONTHEIGHT; } if (genlz->name != NULL) { renderer->ops->draw_string(renderer, genlz->name, &pos, genlz->text_align, &color_black); } }
static void message_draw(Message *message, Renderer *renderer) { Point *endpoints, p1, p2, px; ArrowType arrow_type; int n1 = 1, n2 = 0; char *mname; assert(message != NULL); assert(renderer != NULL); if (message->type==MESSAGE_SEND) arrow_type = ARROW_HALF_HEAD; else if (message->type==MESSAGE_SIMPLE) arrow_type = ARROW_LINES; else arrow_type = ARROW_FILLED_TRIANGLE; endpoints = &message->connection.endpoints[0]; renderer->ops->set_linewidth(renderer, MESSAGE_WIDTH); renderer->ops->set_linecaps(renderer, LINECAPS_BUTT); if (message->type==MESSAGE_RECURSIVE) { n1 = 0; n2 = 1; } if (message->type==MESSAGE_RETURN) { renderer->ops->set_dashlength(renderer, MESSAGE_DASHLEN); renderer->ops->set_linestyle(renderer, LINESTYLE_DASHED); n1 = 0; n2 = 1; } else renderer->ops->set_linestyle(renderer, LINESTYLE_SOLID); p1 = endpoints[n1]; p2 = endpoints[n2]; if (message->type==MESSAGE_RECURSIVE) { px.x = p2.x; px.y = p1.y; renderer->ops->draw_line(renderer, &p1, &px, &color_black); renderer->ops->draw_line(renderer, &px, &p2, &color_black); p1.y = p2.y; } renderer->ops->draw_line(renderer, &p1, &p2, &color_black); arrow_draw(renderer, arrow_type, &p1, &p2, MESSAGE_ARROWLEN, MESSAGE_ARROWWIDTH, MESSAGE_WIDTH, &color_black, &color_white); renderer->ops->set_font(renderer, message_font, MESSAGE_FONTHEIGHT); if (message->type==MESSAGE_CREATE) mname = MESSAGE_CREATE_LABEL; else if (message->type==MESSAGE_DESTROY) mname = MESSAGE_DESTROY_LABEL; else mname = message->text; if (mname) renderer->ops->draw_string(renderer, mname, /*message->text,*/ &message->text_pos, ALIGN_CENTER, &color_black); }
static void arc_draw(Arc *arc, Renderer *renderer) { Point *endpoints; real width; assert(arc != NULL); assert(renderer != NULL); endpoints = &arc->connection.endpoints[0]; renderer->ops->set_linewidth(renderer, arc->line_width); renderer->ops->set_linestyle(renderer, arc->line_style); renderer->ops->set_dashlength(renderer, arc->dashlength); renderer->ops->set_linecaps(renderer, LINECAPS_BUTT); /* Special case when almost line: */ if (fabs(arc->curve_distance) <= 0.0001) { renderer->ops->draw_line(renderer, &endpoints[0], &endpoints[1], &arc->arc_color); return; } width = 2*arc->radius; renderer->ops->draw_arc(renderer, &arc->center, width, width, arc->angle1, arc->angle2, &arc->arc_color); if (arc->start_arrow.type != ARROW_NONE || arc->end_arrow.type != ARROW_NONE) { Point reversepoint, centervec; Point controlpoint0, controlpoint1; real len, len2; centervec = endpoints[0]; point_sub(¢ervec, &endpoints[1]); point_scale(¢ervec, 0.5); len = centervec.x*centervec.x+centervec.y*centervec.y; point_add(¢ervec, &endpoints[1]); /* Centervec should now be the midpoint between [0] and [1] */ reversepoint = centervec; point_sub(¢ervec, &arc->center); len2 = centervec.x*centervec.x+centervec.y*centervec.y; if (len2 != 0) { point_scale(¢ervec, 1/len2); } point_scale(¢ervec, len); point_add(&reversepoint, ¢ervec); controlpoint0 = controlpoint1 = reversepoint; len = arc->angle2-arc->angle1; if (len > 180 || (len < 0.0 && len > -180)) { centervec = endpoints[0]; point_sub(¢ervec, &reversepoint); point_add(&controlpoint0, ¢ervec); point_add(&controlpoint0, ¢ervec); centervec = endpoints[1]; point_sub(¢ervec, &reversepoint); point_add(&controlpoint1, ¢ervec); point_add(&controlpoint1, ¢ervec); } if (arc->start_arrow.type != ARROW_NONE) { arrow_draw(renderer, arc->start_arrow.type, &endpoints[0],&controlpoint0, arc->start_arrow.length, arc->start_arrow.width, arc->line_width, &arc->arc_color, &color_white); } if (arc->end_arrow.type != ARROW_NONE) { arrow_draw(renderer, arc->end_arrow.type, &endpoints[1], &controlpoint1, arc->end_arrow.length, arc->end_arrow.width, arc->line_width, &arc->arc_color, &color_white); } } }
void render(RenderStateFlags state) const { Matrix4 mat = matrix4_rotation_for_euler_xyz_degrees(m_angles); arrow_draw(m_origin, matrix4_transformed_direction(mat, Vector3(1, 0, 0)), matrix4_transformed_direction(mat, Vector3(0, 1, 0)), matrix4_transformed_direction(mat, Vector3(0, 0, 1))); }
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); } }