static void objet_draw(Objet *ob, DiaRenderer *renderer) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); Element *elem; real bw, x, y, w, h; Point p1, p2; int i; assert(ob != NULL); assert(renderer != NULL); elem = &ob->element; x = elem->corner.x; y = elem->corner.y; w = elem->width; h = elem->height; bw = (ob->is_active) ? OBJET_ACTIVEBORDERWIDTH: ob->line_width; renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID); renderer_ops->set_linewidth(renderer, bw); renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID); p1.x = x; p1.y = y; p2.x = x+w; p2.y = y+h; if (ob->is_multiple) { p1.x += OBJET_MARGIN_M(ob); p2.y -= OBJET_MARGIN_M(ob); renderer_ops->fill_rect(renderer, &p1, &p2, &ob->fill_color); renderer_ops->draw_rect(renderer, &p1, &p2, &ob->line_color); p1.x -= OBJET_MARGIN_M(ob); p1.y += OBJET_MARGIN_M(ob); p2.x -= OBJET_MARGIN_M(ob); p2.y += OBJET_MARGIN_M(ob); y += OBJET_MARGIN_M(ob); } renderer_ops->fill_rect(renderer, &p1, &p2, &ob->fill_color); renderer_ops->draw_rect(renderer, &p1, &p2, &ob->line_color); text_draw(ob->text, renderer); renderer_ops->set_font(renderer, ob->text->font, ob->text->height); if ((ob->st_stereotype != NULL) && (ob->st_stereotype[0] != '\0')) { renderer_ops->draw_string(renderer, ob->st_stereotype, &ob->st_pos, ALIGN_CENTER, &ob->text_attrs.color); } if ((ob->exstate != NULL) && (ob->exstate[0] != '\0')) { renderer_ops->draw_string(renderer, ob->exstate, &ob->ex_pos, ALIGN_CENTER, &ob->text_attrs.color); } /* Is there a better way to underline? */ p1.x = x + (w - text_get_max_width(ob->text))/2; p1.y = ob->text->position.y + text_get_descent(ob->text); p2.x = p1.x + text_get_max_width(ob->text); p2.y = p1.y; renderer_ops->set_linewidth(renderer, ob->line_width/2); for (i=0; i<ob->text->numlines; i++) { p1.x = x + (w - text_get_line_width(ob->text, i))/2; p2.x = p1.x + text_get_line_width(ob->text, i); renderer_ops->draw_line(renderer, &p1, &p2, &ob->text_attrs.color); p1.y = p2.y += ob->text->height; } if (ob->show_attributes) { p1.x = x; p2.x = x + w; p1.y = p2.y = ob->attributes->position.y - ob->attributes->ascent - OBJET_MARGIN_Y(ob); renderer_ops->set_linewidth(renderer, bw); renderer_ops->draw_line(renderer, &p1, &p2, &ob->line_color); text_draw(ob->attributes, renderer); } }
static void classicon_draw(Classicon *icon, DiaRenderer *renderer) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); Element *elem; real r, x, y, w; Point center, p1, p2; int i; assert(icon != NULL); assert(renderer != NULL); elem = &icon->element; x = elem->corner.x; y = elem->corner.y; w = elem->width; r = CLASSICON_RADIOUS; center.x = x + elem->width/2; center.y = y + r + CLASSICON_ARROW; if (icon->stereotype==CLASSICON_BOUNDARY) center.x += r/2.0; renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID); renderer_ops->set_linewidth(renderer, icon->line_width); renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0); renderer_ops->draw_ellipse(renderer, ¢er, 2*r, 2*r, &icon->fill_color, &icon->line_color); switch (icon->stereotype) { case CLASSICON_CONTROL: p1.x = center.x - r*0.258819045102521; p1.y = center.y-r*0.965925826289068; p2.x = p1.x + CLASSICON_ARROW; p2.y = p1.y + CLASSICON_ARROW/1.5; renderer_ops->draw_line(renderer, &p1, &p2, &icon->line_color); p2.x = p1.x + CLASSICON_ARROW; p2.y = p1.y - CLASSICON_ARROW/1.5; renderer_ops->draw_line(renderer, &p1, &p2, &icon->line_color); break; case CLASSICON_BOUNDARY: p1.x = center.x - r; p2.x = p1.x - r; p1.y = p2.y = center.y; renderer_ops->draw_line(renderer, &p1, &p2, &icon->line_color); p1.x = p2.x; p1.y = center.y - r; p2.y = center.y + r; renderer_ops->draw_line(renderer, &p1, &p2, &icon->line_color); break; case CLASSICON_ENTITY: p1.x = center.x - r; p2.x = center.x + r; p1.y = p2.y = center.y + r; renderer_ops->draw_line(renderer, &p1, &p2, &icon->line_color); break; } text_draw(icon->text, renderer); if (icon->is_object) { renderer_ops->set_linewidth(renderer, 0.01); if (icon->stereotype==CLASSICON_BOUNDARY) x += r/2.0; p1.y = p2.y = icon->text->position.y + text_get_descent(icon->text); for (i=0; i<icon->text->numlines; i++) { p1.x = x + (w - text_get_line_width(icon->text, i))/2; p2.x = p1.x + text_get_line_width(icon->text, i); renderer_ops->draw_line(renderer, &p1, &p2, &icon->line_color); p1.y = p2.y += icon->text->height; } } }